diff --git a/Assets/Scripts/Conductor.cs b/Assets/Scripts/Conductor.cs index 1acff611..ece56c33 100644 --- a/Assets/Scripts/Conductor.cs +++ b/Assets/Scripts/Conductor.cs @@ -46,7 +46,7 @@ namespace HeavenStudio // Current time of the song private double time; double dspTime; - double absTime, absTimeAdjust, lastAbsTime; + double absTime, absTimeAdjust; double dspSizeSeconds; double dspMargin = 128 / 44100.0; bool deferTimeKeeping = false; @@ -56,7 +56,7 @@ namespace HeavenStudio private double dspStart; private float dspStartTime => (float)dspStart; public double dspStartTimeAsDouble => dspStart; - DateTime startTime, lastMixTime; + DateTime startTime; //the beat we started at private double startPos; @@ -88,7 +88,6 @@ namespace HeavenStudio private float minigamePitch = 1f; public float SongPitch { get => isPaused ? 0f : (timelinePitch * minigamePitch); } public float TimelinePitch { get => timelinePitch; } - private float musicScheduledPitch = 1f; private double musicScheduledTime = 0; // volume modifier @@ -201,16 +200,15 @@ namespace HeavenStudio double musicStartDelay = -offset - startPos; if (musicStartDelay > 0) { - musicScheduledTime = dspTime + (musicStartDelay / timelinePitch) + 2*dspSizeSeconds; - dspStart = dspTime + 2*dspSizeSeconds; + musicScheduledTime = dspTime + (musicStartDelay / timelinePitch) + 2 * dspSizeSeconds; + dspStart = dspTime + 2 * dspSizeSeconds; } else { - musicScheduledTime = dspTime + 2*dspSizeSeconds; - dspStart = dspTime + 2*dspSizeSeconds; + musicScheduledTime = dspTime + 2 * dspSizeSeconds; + dspStart = dspTime + 2 * dspSizeSeconds; } musicSource.PlayScheduled(musicScheduledTime); - musicScheduledPitch = timelinePitch; musicSource.pitch = timelinePitch; Debug.Log($"playback scheduled for dsptime {dspStart}"); } @@ -221,7 +219,6 @@ namespace HeavenStudio startTime = DateTime.Now; absTimeAdjust = 0; - lastAbsTime = 0; deferTimeKeeping = musicSource.clip != null; isPlaying = true; @@ -242,7 +239,6 @@ namespace HeavenStudio absTimeAdjust = 0; dspStart = dsp; } - lastMixTime = DateTime.Now; } public void Pause() diff --git a/Assets/Scripts/EventCaller.cs b/Assets/Scripts/EventCaller.cs index 8460cf56..65426e95 100644 --- a/Assets/Scripts/EventCaller.cs +++ b/Assets/Scripts/EventCaller.cs @@ -8,6 +8,7 @@ namespace HeavenStudio { public class EventCaller : MonoBehaviour { + public GameManager gameManager { get; private set; } public Transform GamesHolder; public RiqEntity currentEntity = new RiqEntity(); public string currentSwitchGame; @@ -18,6 +19,7 @@ namespace HeavenStudio public Dictionary minigames = new(); + public Minigames.Minigame GetMinigame(string gameName) { if (!minigames.ContainsKey(gameName)) @@ -55,34 +57,14 @@ namespace HeavenStudio return GetGameAction(gameName, action).parameters.Find(c => c.propertyName == param); } - public void Init() + public void Init(GameManager mgr) { + gameManager = mgr; instance = this; currentEntity = new RiqEntity(); Minigames.Init(this); - - List minigamesInBeatmap = new List(); - for (int i = 0; i < GameManager.instance.Beatmap.Entities.Count; i++) - { - //go through every entity in the timeline and add the game that they're from to the minigamesInBeatmap list (ignore entities from FX only categories, i.e. Game Manager and Count-Ins) - Minigames.Minigame game = GetMinigame(GameManager.instance.Beatmap.Entities[i].datamodel.Split('/')[0]); - if (!minigamesInBeatmap.Contains(game) && !FXOnlyGames().Contains(game)) - { - minigamesInBeatmap.Add(game); - } - } - - for (int i = 0; i < minigamesInBeatmap.Count; i++) - { - // minigames[minigames.FindIndex(c => c.name == minigamesInBeatmap[i].name)].holder = Resources.Load($"Games/{minigamesInBeatmap[i].name}"); - } - } - - private void Update() - { - } public void CallEvent(RiqEntity entity, bool gameActive) @@ -128,30 +110,9 @@ namespace HeavenStudio } } - static bool StringStartsWith(string a, string b) - { - int aLen = a.Length; - int bLen = b.Length; - - int ap = 0; int bp = 0; - - while (ap < aLen && bp < bLen && a [ap] == b [bp]) - { - ap++; - bp++; - } - - return (bp == bLen); - } - - public static bool IsGameSwitch(RiqEntity entity) - { - return StringStartsWith(entity.datamodel, "gameManager/switchGame"); - } - public static List GetAllInGameManagerList(string gameName, string[] include) { - List temp1 = GameManager.instance.Beatmap.Entities.FindAll(c => c.datamodel.Split('/')[0] == gameName); + List temp1 = instance.gameManager.Beatmap.Entities.FindAll(c => c.datamodel.Split('/')[0] == gameName); List temp2 = new List(); foreach (string s in include) { @@ -162,7 +123,7 @@ namespace HeavenStudio public static List GetAllInGameManagerListExclude(string gameName, string[] exclude) { - List temp1 = GameManager.instance.Beatmap.Entities.FindAll(c => c.datamodel.Split('/')[0] == gameName); + List temp1 = instance.gameManager.Beatmap.Entities.FindAll(c => c.datamodel.Split('/')[0] == gameName); List temp2 = new List(); foreach (string s in exclude) { diff --git a/Assets/Scripts/GameInitializer.cs b/Assets/Scripts/GameInitializer.cs index eba226c0..18eff4d8 100644 --- a/Assets/Scripts/GameInitializer.cs +++ b/Assets/Scripts/GameInitializer.cs @@ -68,7 +68,7 @@ namespace HeavenStudio GameObject Games = new GameObject(); Games.name = "Games"; - gameManager.playMode = playOnStart; + gameManager.TogglePlayMode(playOnStart); gameManager.GamesHolder = Games; gameManager.CircleCursor = Cursor.transform.GetChild(0).GetComponent(); diff --git a/Assets/Scripts/GameManager.cs b/Assets/Scripts/GameManager.cs index 821d0124..007c4385 100644 --- a/Assets/Scripts/GameManager.cs +++ b/Assets/Scripts/GameManager.cs @@ -32,30 +32,31 @@ namespace HeavenStudio [NonSerialized] public Games.Global.Filter filter; [Header("Games")] - [NonSerialized] public string currentGame; Coroutine currentGameSwitchIE; - [Header("Properties")] - [NonSerialized] public string txt = null; - [NonSerialized] public string ext = null; - [NonSerialized] public int currentEvent, currentTempoEvent, currentVolumeEvent, currentSectionEvent, currentPreEvent, currentPreSwitch, currentPreSequence; - [NonSerialized] public double endBeat; - [NonSerialized] public float startOffset; - [NonSerialized] public bool playMode; - [NonSerialized] public double startBeat; - [NonSerialized] public GameObject currentGameO; - private Minigame _currentMinigame; - [NonSerialized] public bool autoplay; - [NonSerialized] public bool canInput = true; - [NonSerialized] public RiqEntity lastSection, currentSection; - [NonSerialized] public double nextSectionBeat; + + public string currentGame { get; private set; } + public GameObject minigameObj { get; private set; } + public Minigame minigame { get; private set; } + public RiqEntity lastSection { get; private set; } + public RiqEntity currentSection { get; private set; } + + public double endBeat { get; private set; } + public double startBeat { get; private set; } + + public double nextSectionBeat { get; private set; } public double SectionProgress { get; private set; } public float MarkerWeight { get; private set; } + public int MarkerCategory { get; private set; } + public bool playMode { get; private set; } + public bool autoplay { get; private set; } + public bool canInput { get; private set; } + public bool GameHasSplitColours { get @@ -138,7 +139,9 @@ namespace HeavenStudio eventCaller = this.gameObject.AddComponent(); eventCaller.GamesHolder = GamesHolder.transform; - eventCaller.Init(); + eventCaller.Init(this); + + canInput = true; // note: serialize this shit in the inspector // GameObject textbox = Instantiate(Resources.Load("Prefabs/Common/Textbox")); @@ -429,9 +432,10 @@ namespace HeavenStudio { if (currentPreSequence < Beatmap.Entities.Count && currentPreSequence >= 0) { - if (start >= preSequenceBeats[currentPreSequence]) + List entitiesInRange = ListPool.Get(); + while (currentPreSequence < preSequenceBeats.Count && start >= preSequenceBeats[currentPreSequence]) { - List entitiesInRange = ListPool.Get(); + entitiesInRange.Clear(); foreach (RiqEntity entity in Beatmap.Entities) { string[] entityDatamodel = entity.datamodel.Split('/'); @@ -449,14 +453,14 @@ namespace HeavenStudio var inf = GetGameInfo(gameName); if (inf != null && inf.usesAssetBundle && inf.AssetsLoaded && !inf.SequencesPreloaded) { - Debug.Log($"Preloading game {gameName}"); + Debug.Log($"Preparing game {gameName}"); PreloadGameSequences(gameName); } eventCaller.CallPreEvent(entity); currentPreSequence++; } - ListPool.Release(entitiesInRange); } + ListPool.Release(entitiesInRange); } } @@ -533,7 +537,7 @@ namespace HeavenStudio if (cond.songPositionInBeatsAsDouble >= Math.Ceiling(_playStartBeat) + _pulseTally) { - if (_currentMinigame != null) _currentMinigame.OnBeatPulse(Math.Ceiling(_playStartBeat) + _pulseTally); + if (minigame != null) minigame.OnBeatPulse(Math.Ceiling(_playStartBeat) + _pulseTally); onBeatPulse?.Invoke(Math.Ceiling(_playStartBeat) + _pulseTally); _pulseTally++; } @@ -545,12 +549,13 @@ namespace HeavenStudio if (currentEvent < Beatmap.Entities.Count && currentEvent >= 0) { - if (clampedBeat >= eventBeats[currentEvent]) + List entitiesInRange = ListPool.Get(); + List fxEntities = ListPool.Get(); + // allows for multiple events on the same beat to be executed on the same frame, so no more 1-frame delay + while (currentEvent < eventBeats.Count && clampedBeat >= eventBeats[currentEvent] && Conductor.instance.isPlaying) { - List entitiesInRange = ListPool.Get(); - List fxEntities = ListPool.Get(); - - // allows for multiple events on the same beat to be executed on the same frame, so no more 1-frame delay + fxEntities.Clear(); + entitiesInRange.Clear(); using (PooledObject> pool = ListPool.Get(out List currentBeatEntities)) { currentBeatEntities = Beatmap.Entities.FindAll(c => c.beat == eventBeats[currentEvent]); @@ -592,10 +597,9 @@ namespace HeavenStudio // Thank you to @shshwdr for bring this to my attention currentEvent++; } - - ListPool.Release(entitiesInRange); - ListPool.Release(fxEntities); } + ListPool.Release(entitiesInRange); + ListPool.Release(fxEntities); } if (currentSection == null) @@ -619,7 +623,7 @@ namespace HeavenStudio if (Conductor.instance.songPositionInBeatsAsDouble >= Math.Ceiling(_playStartBeat) + _latePulseTally) { - if (_currentMinigame != null) _currentMinigame.OnLateBeatPulse(Math.Ceiling(_playStartBeat) + _latePulseTally); + if (minigame != null) minigame.OnLateBeatPulse(Math.Ceiling(_playStartBeat) + _latePulseTally); onBeatPulse?.Invoke(Math.Ceiling(_playStartBeat) + _latePulseTally); _latePulseTally++; } @@ -630,6 +634,16 @@ namespace HeavenStudio canInput = inputs; } + public void ToggleAutoplay(bool auto) + { + autoplay = auto; + } + + public void TogglePlayMode(bool mode) + { + playMode = mode; + } + #region Play Events private double _playStartBeat = 0; @@ -701,7 +715,7 @@ namespace HeavenStudio { Conductor.instance.PlaySetup(beat); Minigame miniGame = null; - if (currentGameO != null && currentGameO.TryGetComponent(out miniGame)) + if (minigameObj != null && minigameObj.TryGetComponent(out miniGame)) { if (miniGame != null) { @@ -761,7 +775,7 @@ namespace HeavenStudio } Minigame miniGame; - if (currentGameO != null && currentGameO.TryGetComponent(out miniGame)) + if (minigameObj != null && minigameObj.TryGetComponent(out miniGame)) { if (miniGame != null) { @@ -1065,7 +1079,7 @@ namespace HeavenStudio SetGame(game, false); Minigame miniGame; - if (currentGameO != null && currentGameO.TryGetComponent(out miniGame)) + if (minigameObj != null && minigameObj.TryGetComponent(out miniGame)) { if (miniGame != null) { @@ -1095,19 +1109,19 @@ namespace HeavenStudio GameObject prefab = GetGame(game); if (prefab == null) return; - Destroy(currentGameO); - currentGameO = Instantiate(prefab); - if (currentGameO.TryGetComponent(out var minigame)) + Destroy(minigameObj); + minigameObj = Instantiate(prefab); + if (minigameObj.TryGetComponent(out var minigame)) { - _currentMinigame = minigame; + this.minigame = minigame; minigame.minigameName = game; minigame.gameManager = this; minigame.conductor = Conductor.instance; } - Vector3 originalScale = currentGameO.transform.localScale; - currentGameO.transform.parent = eventCaller.GamesHolder.transform; - currentGameO.transform.localScale = originalScale; - currentGameO.name = game; + Vector3 originalScale = minigameObj.transform.localScale; + minigameObj.transform.parent = eventCaller.GamesHolder.transform; + minigameObj.transform.localScale = originalScale; + minigameObj.name = game; SetCurrentGame(game, useMinigameColor); } diff --git a/Assets/Scripts/Games/DJSchool/DJSchool.cs b/Assets/Scripts/Games/DJSchool/DJSchool.cs index bb42062c..a860f025 100644 --- a/Assets/Scripts/Games/DJSchool/DJSchool.cs +++ b/Assets/Scripts/Games/DJSchool/DJSchool.cs @@ -166,11 +166,11 @@ namespace HeavenStudio.Games public override void OnBeatPulse(double beat) { if (!BeatIsInBopRegion(beat)) return; - if (student.isHolding) + if (student.isHolding && !student.swiping) { student.anim.DoScaledAnimationAsync("HoldBop", 0.5f); } - else if (!student.swiping && student.anim.IsAnimationNotPlaying()) + else if (student.anim.IsAnimationNotPlaying() && !student.swiping) { student.anim.DoScaledAnimationAsync("IdleBop", 0.5f); } @@ -217,16 +217,19 @@ namespace HeavenStudio.Games { student.UnHold(); shouldBeHolding = false; + ScoreMiss(); } else if(PlayerInput.GetIsAction(InputAction_FlickRelease) && !IsExpectingInputNow(InputAction_FlickRelease) && student.isHolding) //Flick during hold { student.OnFlickSwipe(); shouldBeHolding = false; + ScoreMiss(); } else if (!GameManager.instance.autoplay && shouldBeHolding && !PlayerInput.GetIsAction(InputAction_BasicPressing) && !IsExpectingInputNow(InputAction_FlickRelease)) { student.UnHold(); shouldBeHolding = false; + ScoreMiss(); } } @@ -249,11 +252,11 @@ namespace HeavenStudio.Games { new BeatAction.Action(beat + i, delegate { - if (student.isHolding) + if (student.isHolding && !student.swiping) { student.anim.DoScaledAnimationAsync("HoldBop", 0.5f); } - else if (!student.swiping && student.anim.IsAnimationNotPlaying()) + else if (student.anim.IsAnimationNotPlaying() && !student.swiping) { student.anim.DoScaledAnimationAsync("IdleBop", 0.5f); } @@ -469,27 +472,13 @@ namespace HeavenStudio.Games ScheduleInput(beat, timing, InputAction_FlickRelease, student.OnHitSwipe, student.OnMissSwipe, student.OnEmpty); } andStop = false; - - - - } - //void SetupCue(float beat, bool swipe) - //{ - // if (swipe) - // student.swipeBeat = beat; - // else - // student.holdBeat = beat; - - // student.eligible = true; - // student.ResetState(); - //} - public static void SoundFX(bool toggle) { Student.soundFX = toggle; } + public static void VoiceLines(double beat, int type) { string[] sounds; diff --git a/Assets/Scripts/Games/DJSchool/Student.cs b/Assets/Scripts/Games/DJSchool/Student.cs index ee1c0021..ef40ca06 100644 --- a/Assets/Scripts/Games/DJSchool/Student.cs +++ b/Assets/Scripts/Games/DJSchool/Student.cs @@ -169,23 +169,21 @@ namespace HeavenStudio.Games.Scripts_DJSchool public void OnHitSwipe(PlayerActionEvent caller, float beat) { game.shouldBeHolding = false; + isHolding = false; + swiping = true; + SoundByte.PlayOneShotGame("djSchool/recordSwipe"); + anim.Play("Swipe", 0, 0); if (beat >= 1f || beat <= -1f) missed = true; if (!missed) { - isHolding = false; - missed = false; shouldBeHolding = false; - SoundByte.PlayOneShotGame("djSchool/recordSwipe"); FlashFX(false); - swiping = true; BeatAction.New(this, new List() { - new BeatAction.Action(beat, delegate { anim.Play("Swipe", 0, 0); }), new BeatAction.Action(beat + 4f, delegate { swiping = false; }), }); - //anim.Play("Swipe", 0, 0); game.djYellowScript.ChangeHeadSprite(DJYellow.DJExpression.UpSecond); game.djYellowScript.Reverse(); game.smileBeat = caller.timer + caller.startBeat + 1f; @@ -199,13 +197,10 @@ namespace HeavenStudio.Games.Scripts_DJSchool else { OnMissSwipeForPlayerInput(caller.timer + caller.startBeat + 1); - SoundByte.PlayOneShotGame("djSchool/recordSwipe"); BeatAction.New(this, new List() { - new BeatAction.Action(beat, delegate { anim.Play("Swipe", 0, 0); }), new BeatAction.Action(beat + 4f, delegate { swiping = false; }), }); - //anim.Play("Swipe", 0, 0); tableAnim.speed = 1; tableAnim.DoScaledAnimationAsync("Student_Turntable_Swipe", 0.5f); @@ -304,7 +299,6 @@ namespace HeavenStudio.Games.Scripts_DJSchool } } - //Not sure but will do? private void OnDestroy() { diff --git a/Assets/Scripts/Games/KarateMan/KarateManJoe.cs b/Assets/Scripts/Games/KarateMan/KarateManJoe.cs index e05f8707..f19adda1 100644 --- a/Assets/Scripts/Games/KarateMan/KarateManJoe.cs +++ b/Assets/Scripts/Games/KarateMan/KarateManJoe.cs @@ -39,7 +39,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan double lastChargeTime = double.MinValue; double unPrepareTime = double.MinValue; double noNuriJabTime = double.MinValue; - bool canEmote = false; + bool canEmote = false, justPunched = false; public int wantFace = 0; public bool inSpecial @@ -137,7 +137,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan } } - if (PlayerInput.GetIsAction(KarateMan.InputAction_Press) && !inSpecial) + if (PlayerInput.GetIsAction(KarateMan.InputAction_Press) && !(inSpecial || justPunched)) { if (!KarateMan.instance.IsExpectingInputNow(KarateMan.InputAction_Press)) { @@ -204,7 +204,11 @@ namespace HeavenStudio.Games.Scripts_KarateMan } } } + } + void LateUpdate() + { + justPunched = false; } public void Bop() @@ -230,19 +234,6 @@ namespace HeavenStudio.Games.Scripts_KarateMan switch (forceHand) { - case 0: - if (cond.songPositionInBeatsAsDouble - lastPunchTime < 0.25f + (Minigame.JustLateTime() - 1f)) - { - lastPunchTime = double.MinValue; - anim.DoScaledAnimationAsync("Straight", 0.5f); - straight = true; - } - else - { - lastPunchTime = cond.songPositionInBeatsAsDouble; - anim.DoScaledAnimationAsync("Jab", 0.5f); - } - break; case 1: anim.DoScaledAnimationAsync("Jab", 0.5f); break; @@ -255,6 +246,19 @@ namespace HeavenStudio.Games.Scripts_KarateMan anim.DoNormalizedAnimation("JabNoNuri"); noNuriJabTime = cond.songPositionInBeatsAsDouble; break; + default: + if (cond.songPositionInBeatsAsDouble <= cond.GetBeatFromSongPos(lastPunchTime + Minigame.NgLateTime() - 1) + 0.25) + { + lastPunchTime = double.MinValue; + anim.DoScaledAnimationAsync("Straight", 0.5f); + straight = true; + } + else + { + lastPunchTime = cond.songPositionAsDouble; + anim.DoScaledAnimationAsync("Jab", 0.5f); + } + break; } if (touchCharge) { @@ -265,6 +269,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan { bop.startBeat = cond.songPositionInBeatsAsDouble + 0.5f; } + justPunched = true; return straight; //returns what hand was used to punch the object } diff --git a/Assets/Scripts/Games/KarateMan/KarateManPot.cs b/Assets/Scripts/Games/KarateMan/KarateManPot.cs index cf33afc9..5768680a 100644 --- a/Assets/Scripts/Games/KarateMan/KarateManPot.cs +++ b/Assets/Scripts/Games/KarateMan/KarateManPot.cs @@ -190,6 +190,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan case ItemType.ComboPot1: OnHit = KarateMan.instance.ScheduleInput(startBeat, 1f, KarateMan.InputAction_AltDown, ComboStartJustOrNg, ComboStartThrough, ComboStartOut, CanCombo); OnHitWrongAction = KarateMan.instance.ScheduleUserInput(startBeat, 1f, KarateMan.InputAction_Press, ComboStartWrongAction, ComboStartOut, ComboStartOut, CanHitWrong); + OnHitWrongAction.weight = 0; path = 1; break; case ItemType.ComboPot2: @@ -216,6 +217,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan case ItemType.KickBarrel: OnHit = KarateMan.instance.ScheduleInput(startBeat, 1f, KarateMan.InputAction_Press, KickChargeJustOrNg, ItemThrough, ItemOut, CanCombo); OnHitWrongAction = KarateMan.instance.ScheduleUserInput(startBeat, 1f, KarateMan.InputAction_AltDown, ItemWrongAction, ItemOut, ItemOut, CanComboWrong); + OnHitWrongAction.weight = 0; path = 1; comboId = -1; break; @@ -243,12 +245,14 @@ namespace HeavenStudio.Games.Scripts_KarateMan case ItemType.Bomb: OnHit = KarateMan.instance.ScheduleInput(startBeat, 1f, KarateMan.InputAction_Press, ItemJustOrNg, ItemThrough, ItemOut, CanHit); OnHitWrongAction = KarateMan.instance.ScheduleUserInput(startBeat, 1f, KarateMan.InputAction_AltDown, ItemWrongAction, ItemOut, ItemOut, CanHitWrong); + OnHitWrongAction.weight = 0; path = 1; comboId = -1; break; default: OnHit = KarateMan.instance.ScheduleInput(startBeat, 1f, KarateMan.InputAction_Press, ItemJustOrNg, ItemThrough, ItemOut, CanHit); OnHitWrongAction = KarateMan.instance.ScheduleUserInput(startBeat, 1f, KarateMan.InputAction_AltDown, ItemWrongAction, ItemOut, ItemOut, CanHitWrong); + OnHitWrongAction.weight = 0; path = 1; comboId = -1; break; @@ -832,6 +836,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan }), }); KarateMan.instance.Nori.DoThrough(); + KarateMan.instance.ScoreMiss(); } public void ItemOut(PlayerActionEvent caller) { } @@ -937,6 +942,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan { ItemHitEffect(straight); } + KarateMan.instance.ScoreMiss(); KarateMan.instance.Nori.DoThrough(); } diff --git a/Assets/Scripts/Games/Minigame.cs b/Assets/Scripts/Games/Minigame.cs index 5396b777..eafdc64b 100644 --- a/Assets/Scripts/Games/Minigame.cs +++ b/Assets/Scripts/Games/Minigame.cs @@ -198,42 +198,6 @@ namespace HeavenStudio.Games scheduledInputs.Remove(evt); } - //Get the scheduled input that should happen the **Soonest** - //Can return null if there's no scheduled inputs - // remark: need a check for specific button(s) - [Obsolete("Use GetClosestScheduledInput InputAction or InputAction category instead")] - public PlayerActionEvent GetClosestScheduledInput(InputType input = InputType.ANY) - { - PlayerActionEvent closest = null; - - foreach (PlayerActionEvent toCompare in scheduledInputs) - { - // ignore inputs that are for sequencing in autoplay - if (toCompare.autoplayOnly) continue; - - if (closest == null) - { - if (input == InputType.ANY || (toCompare.inputType & input) != 0) - closest = toCompare; - } - else - { - double t1 = closest.startBeat + closest.timer; - double t2 = toCompare.startBeat + toCompare.timer; - - // Debug.Log("t1=" + t1 + " -- t2=" + t2); - - if (t2 < t1) - { - if (input == InputType.ANY || (toCompare.inputType & input) != 0) - closest = toCompare; - } - } - } - - return closest; - } - public PlayerActionEvent GetClosestScheduledInput(int[] actionCats) { int catIdx = (int)PlayerInput.CurrentControlStyle; @@ -267,22 +231,6 @@ namespace HeavenStudio.Games return closest; } - public PlayerActionEvent GetClosestScheduledInput(PlayerInput.InputAction action) - { - return GetClosestScheduledInput(action.inputLockCategory); - } - - //Hasn't been tested yet. *Should* work. - //Can be used to detect if the user is expected to input something now or not - //Useful for strict call and responses games like Tambourine - [Obsolete("Use IsExpectingInputNow InputAction or InputAction category instead")] - public bool IsExpectingInputNow(InputType wantInput = InputType.ANY) - { - PlayerActionEvent input = GetClosestScheduledInput(wantInput); - if (input == null) return false; - return input.IsExpectingInputNow(); - } - public bool IsExpectingInputNow(int[] wantActionCategory) { PlayerActionEvent input = GetClosestScheduledInput(wantActionCategory); @@ -299,43 +247,43 @@ namespace HeavenStudio.Games public static double NgEarlyTime(float pitch = -1) { if (pitch < 0) - return 1f - ngEarlyTime; - return 1f - (ngEarlyTimeBase * pitch); + return 1 - ngEarlyTime; + return 1 - (ngEarlyTimeBase * pitch); } public static double JustEarlyTime(float pitch = -1) { if (pitch < 0) - return 1f - justEarlyTime; - return 1f - (justEarlyTimeBase * pitch); + return 1 - justEarlyTime; + return 1 - (justEarlyTimeBase * pitch); } public static double JustLateTime(float pitch = -1) { if (pitch < 0) - return 1f + justLateTime; - return 1f + (justLateTimeBase * pitch); + return 1 + justLateTime; + return 1 + (justLateTimeBase * pitch); } public static double NgLateTime(float pitch = -1) { if (pitch < 0) - return 1f + ngLateTime; - return 1f + (ngLateTimeBase * pitch); + return 1 + ngLateTime; + return 1 + (ngLateTimeBase * pitch); } public static double AceEarlyTime(float pitch = -1) { if (pitch < 0) - return 1f - aceEarlyTime; - return 1f - (aceEarlyTimeBase * pitch); + return 1 - aceEarlyTime; + return 1 - (aceEarlyTimeBase * pitch); } public static double AceLateTime(float pitch = -1) { if (pitch < 0) - return 1f + aceLateTime; - return 1f + (aceLateTimeBase * pitch); + return 1 + aceLateTime; + return 1 + (aceLateTimeBase * pitch); } public virtual void OnGameSwitch(double beat) diff --git a/Assets/Scripts/Games/PlayerActionEvent.cs b/Assets/Scripts/Games/PlayerActionEvent.cs index 8ea9eaba..d2fdbe56 100644 --- a/Assets/Scripts/Games/PlayerActionEvent.cs +++ b/Assets/Scripts/Games/PlayerActionEvent.cs @@ -42,8 +42,6 @@ namespace HeavenStudio.Games public bool noAutoplay = false; //Indicates if this PlayerActionEvent is recognized by the autoplay. /!\ Overrides autoPlayOnly /!\ - public InputType inputType; //The type of input. Check the InputType class to see a list of all of them - public bool perfectOnly = false; //Indicates that the input only recognize perfect inputs. public bool countsForAccuracy = true; //Indicates if the input counts for the accuracy or not. If set to false, it'll not be counted in the accuracy calculation @@ -160,11 +158,6 @@ namespace HeavenStudio.Games if (toCompare.InputAction != null && toCompare.InputAction.inputLockCategory[catIdx] != InputAction.inputLockCategory[catIdx]) continue; } - else - { - if ((toCompare.inputType & this.inputType) == 0) continue; - if (!toCompare.IsExpectingInputNow()) continue; - } double t1 = this.startBeat + this.timer; double t2 = toCompare.startBeat + toCompare.timer; diff --git a/Assets/Scripts/Games/PlayerActionEvent.cs.meta b/Assets/Scripts/Games/PlayerActionEvent.cs.meta index 62a52734..85e97d8c 100644 --- a/Assets/Scripts/Games/PlayerActionEvent.cs.meta +++ b/Assets/Scripts/Games/PlayerActionEvent.cs.meta @@ -4,7 +4,7 @@ MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] - executionOrder: 5 + executionOrder: -30 icon: {instanceID: 0} userData: assetBundleName: diff --git a/Assets/Scripts/Games/TossBoys/TossBoys.cs b/Assets/Scripts/Games/TossBoys/TossBoys.cs index fe5c003a..f85d28cc 100644 --- a/Assets/Scripts/Games/TossBoys/TossBoys.cs +++ b/Assets/Scripts/Games/TossBoys/TossBoys.cs @@ -177,29 +177,23 @@ namespace HeavenStudio.Games protected static bool IA_TouchNrm(out double dt) { return PlayerInput.GetTouchDown(InputController.ActionsTouch.Tap, out dt) - && (instance.currentReceiver is WhichTossKid.Akachan - || (instance.lastReceiver is WhichTossKid.Akachan or WhichTossKid.None - && instance.currentReceiver is WhichTossKid.None) - || (instance.IsExpectingInputNow(InputAction_Aka) - && !(instance.IsExpectingInputNow(InputAction_Ao) || instance.IsExpectingInputNow(InputAction_Kii)))); + && ((instance.currentReceiver is WhichTossKid.Akachan or WhichTossKid.None) + || instance.IsExpectingInputNow(InputAction_Aka)) + && !(instance.IsExpectingInputNow(InputAction_Ao) || instance.IsExpectingInputNow(InputAction_Kii)); } protected static bool IA_TouchDir(out double dt) { return PlayerInput.GetTouchDown(InputController.ActionsTouch.Tap, out dt) - && (instance.currentReceiver is WhichTossKid.Kiiyan - || (instance.lastReceiver is WhichTossKid.Kiiyan - && instance.currentReceiver is WhichTossKid.None) - || (instance.IsExpectingInputNow(InputAction_Kii) - && !(instance.IsExpectingInputNow(InputAction_Ao) || instance.IsExpectingInputNow(InputAction_Aka)))); + && ((instance.currentReceiver is WhichTossKid.Kiiyan) + || instance.IsExpectingInputNow(InputAction_Kii)) + && !(instance.IsExpectingInputNow(InputAction_Ao) || instance.IsExpectingInputNow(InputAction_Aka)); } protected static bool IA_TouchAlt(out double dt) { return PlayerInput.GetTouchDown(InputController.ActionsTouch.Tap, out dt) - && (instance.currentReceiver is WhichTossKid.Aokun - || (instance.lastReceiver is WhichTossKid.Aokun - && instance.currentReceiver is WhichTossKid.None) - || (instance.IsExpectingInputNow(InputAction_Ao) - && !(instance.IsExpectingInputNow(InputAction_Aka) || instance.IsExpectingInputNow(InputAction_Kii)))); + && ((instance.currentReceiver is WhichTossKid.Aokun) + || instance.IsExpectingInputNow(InputAction_Ao)) + && !(instance.IsExpectingInputNow(InputAction_Aka) || instance.IsExpectingInputNow(InputAction_Kii)); } protected static bool IA_BatonNrm(out double dt) diff --git a/Assets/Scripts/Games/TrickClass/TrickClass.cs b/Assets/Scripts/Games/TrickClass/TrickClass.cs index d05d7ad3..ef319e7a 100644 --- a/Assets/Scripts/Games/TrickClass/TrickClass.cs +++ b/Assets/Scripts/Games/TrickClass/TrickClass.cs @@ -29,8 +29,9 @@ namespace HeavenStudio.Games.Loaders { preFunction = delegate { - var e = eventCaller.currentEntity; - TrickClass.PreTossObject(e.beat, (int)e["obj"], e["nx"]); + EventCaller ec = eventCaller; + var e = ec.currentEntity; + TrickClass.PreTossObject(ec.gameManager, e.beat, (int)e["obj"], e["nx"]); }, defaultLength = 2, parameters = new List() @@ -46,7 +47,9 @@ namespace HeavenStudio.Games.Loaders { preFunction = delegate { - TrickClass.PreTossObject(eventCaller.currentEntity.beat, (int)TrickClass.TrickObjType.Plane); + EventCaller ec = eventCaller; + var e = ec.currentEntity; + TrickClass.PreTossObject(ec.gameManager, e.beat, (int)TrickClass.TrickObjType.Plane); }, defaultLength = 3, }, @@ -62,7 +65,9 @@ namespace HeavenStudio.Games.Loaders { preFunction = delegate { - TrickClass.PreTossObject(eventCaller.currentEntity.beat, (int)TrickClass.TrickObjType.Chair); + EventCaller ec = eventCaller; + var e = ec.currentEntity; + TrickClass.PreTossObject(ec.gameManager, e.beat, (int)TrickClass.TrickObjType.Chair); }, defaultLength = 2, hidden = true, @@ -71,7 +76,9 @@ namespace HeavenStudio.Games.Loaders { preFunction = delegate { - TrickClass.PreTossObject(eventCaller.currentEntity.beat, (int)TrickClass.TrickObjType.Phone, eventCaller.currentEntity["nx"]); + EventCaller ec = eventCaller; + var e = ec.currentEntity; + TrickClass.PreTossObject(ec.gameManager, e.beat, (int)TrickClass.TrickObjType.Phone, eventCaller.currentEntity["nx"]); }, defaultLength = 2, hidden = true, @@ -84,7 +91,9 @@ namespace HeavenStudio.Games.Loaders { preFunction = delegate { - TrickClass.PreTossObject(eventCaller.currentEntity.beat, (int)TrickClass.TrickObjType.Shock); + EventCaller ec = eventCaller; + var e = ec.currentEntity; + TrickClass.PreTossObject(ec.gameManager, e.beat, (int)TrickClass.TrickObjType.Shock); }, defaultLength = 2, hidden = true, @@ -283,23 +292,23 @@ namespace HeavenStudio.Games instance.showBubble = !instance.showBubble; } - public static void PreTossObject(double beat, int type, bool variant = false) + public static void PreTossObject(GameManager gm, double beat, int type, bool variant = false) { - if (GameManager.instance.currentGame == "trickClass") + if (gm.currentGame == "trickClass" && gm.minigameObj.TryGetComponent(out TrickClass tc)) { - BeatAction.New(instance, new List() + BeatAction.New(tc, new List() { new BeatAction.Action(beat - 1, delegate { - if (instance.showBubble == true) + if (tc.showBubble == true) { - instance.warnAnim.Play(variant ? instance.objWarnAnimVariant[type] : instance.objWarnAnim[type], 0, 0); + tc.warnAnim.Play(variant ? tc.objWarnAnimVariant[type] : tc.objWarnAnim[type], 0, 0); } }), new BeatAction.Action(beat, delegate { - instance.warnAnim.Play("NoPose", 0, 0); - instance.TossObject(beat, type, variant); + tc.warnAnim.Play("NoPose", 0, 0); + tc.TossObject(beat, type, variant); }) }); } diff --git a/Assets/Scripts/InputSystem/InputType.cs b/Assets/Scripts/InputSystem/InputType.cs deleted file mode 100644 index 3861636e..00000000 --- a/Assets/Scripts/InputSystem/InputType.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - - -namespace HeavenStudio -{ - [System.Flags] - public enum InputType : int { - // Shouldn't be used by minigame scripts - ANY = -1, - - //General - //------- - //Down - STANDARD_DOWN = 1<<0, - STANDARD_ALT_DOWN = 1<<1, - DIRECTION_DOWN = 1<<2, - //Up - STANDARD_UP = 1<<3, - STANDARD_ALT_UP = 1<<4, - DIRECTION_UP = 1<<5, - - //Specific - //-------- - //Down - DIRECTION_DOWN_DOWN = 1<<6, - DIRECTION_UP_DOWN = 1<<7, - DIRECTION_LEFT_DOWN = 1<<8, - DIRECTION_RIGHT_DOWN = 1<<9, - //Up - DIRECTION_DOWN_UP = 1<<10, - DIRECTION_UP_UP = 1<<11, - DIRECTION_LEFT_UP = 1<<12, - DIRECTION_RIGHT_UP = 1<<13 - } -} \ No newline at end of file diff --git a/Assets/Scripts/InputSystem/InputType.cs.meta b/Assets/Scripts/InputSystem/InputType.cs.meta deleted file mode 100644 index cf32f3aa..00000000 --- a/Assets/Scripts/InputSystem/InputType.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 25e3511c55cd2f540abe014bf39e626b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/LevelEditor/Editor.cs b/Assets/Scripts/LevelEditor/Editor.cs index 30fca09f..48a9d245 100644 --- a/Assets/Scripts/LevelEditor/Editor.cs +++ b/Assets/Scripts/LevelEditor/Editor.cs @@ -522,7 +522,7 @@ namespace HeavenStudio.Editor public void ToggleDebugCam() { - var game = GameManager.instance.currentGameO; + var game = GameManager.instance.minigameObj; if (game != null) { diff --git a/Assets/Scripts/LevelEditor/Timeline/Timeline.cs b/Assets/Scripts/LevelEditor/Timeline/Timeline.cs index 602e1f82..a3ca8889 100644 --- a/Assets/Scripts/LevelEditor/Timeline/Timeline.cs +++ b/Assets/Scripts/LevelEditor/Timeline/Timeline.cs @@ -353,12 +353,12 @@ namespace HeavenStudio.Editor.Track if (!GameManager.instance.autoplay) { AutoplayBTN.GetComponent().Play("Idle", 0, 0); - GameManager.instance.autoplay = true; + GameManager.instance.ToggleAutoplay(true); } else { AutoplayBTN.GetComponent().Play("Disabled", 0, 0); - GameManager.instance.autoplay = false; + GameManager.instance.ToggleAutoplay(false); } } diff --git a/Assets/Scripts/Minigames.cs b/Assets/Scripts/Minigames.cs index 98542264..969e36c5 100644 --- a/Assets/Scripts/Minigames.cs +++ b/Assets/Scripts/Minigames.cs @@ -497,7 +497,7 @@ namespace HeavenStudio if (!usesAssetBundle) return; if (bundleCommon != null) return; - AssetBundle bundle = await AssetBundle.LoadFromFileAsync(Path.Combine(Application.streamingAssetsPath, wantAssetBundle + "/common")).ToUniTask(); + AssetBundle bundle = await AssetBundle.LoadFromFileAsync(Path.Combine(Application.streamingAssetsPath, wantAssetBundle + "/common")).ToUniTask(timing: PlayerLoopTiming.PreLateUpdate); bundleCommon = bundle; commonLoaded = true; @@ -519,7 +519,7 @@ namespace HeavenStudio if (!usesAssetBundle) return; if (localeLoaded && bundleLocalized != null && currentLoadedLocale == defaultLocale) return; - AssetBundle bundle = await AssetBundle.LoadFromFileAsync(Path.Combine(Application.streamingAssetsPath, wantAssetBundle + "/locale." + defaultLocale)).ToUniTask(); + AssetBundle bundle = await AssetBundle.LoadFromFileAsync(Path.Combine(Application.streamingAssetsPath, wantAssetBundle + "/locale." + defaultLocale)).ToUniTask(timing: PlayerLoopTiming.PreLateUpdate); if (localeLoaded && bundleLocalized != null && currentLoadedLocale == defaultLocale) return; bundleLocalized = bundle; @@ -533,7 +533,7 @@ namespace HeavenStudio if (!commonLoaded) return; if (bundleCommon == null) return; - UnityEngine.Object asset = await bundleCommon.LoadAssetAsync(name).ToUniTask(); + UnityEngine.Object asset = await bundleCommon.LoadAssetAsync(name).ToUniTask(timing: PlayerLoopTiming.PreLateUpdate); loadedPrefab = asset as GameObject; // load sound sequences here for now diff --git a/Assets/Scripts/Util/BeatAction.cs b/Assets/Scripts/Util/BeatAction.cs index 2c6ef034..7ed80273 100644 --- a/Assets/Scripts/Util/BeatAction.cs +++ b/Assets/Scripts/Util/BeatAction.cs @@ -58,15 +58,19 @@ namespace HeavenStudio.Util if (behaviour == null || !(conductor.isPlaying || conductor.isPaused)) return; - try + while (conductor.songPositionInBeatsAsDouble >= actions[idx].beat) { - actions[idx].function.Invoke(); + try + { + actions[idx].function.Invoke(); + } + catch (System.Exception e) + { + Debug.LogError($"Exception thrown while executing BeatAction: {e}"); + } + idx++; + if (idx >= actions.Count) return; } - catch (System.Exception e) - { - Debug.LogError($"Exception thrown while executing BeatAction: {e}"); - } - idx++; } } } diff --git a/Assets/Scripts/Util/Sound.cs b/Assets/Scripts/Util/Sound.cs index 5084bdba..3ac3c44a 100644 --- a/Assets/Scripts/Util/Sound.cs +++ b/Assets/Scripts/Util/Sound.cs @@ -37,7 +37,7 @@ namespace HeavenStudio.Util bool queued = false; public bool available = true; - const double PREBAKE_TIME = 0.5; + const double PREBAKE_TIME = 0.25; private void Start() { diff --git a/ProjectSettings/SatorImaging.UnitySourceGenerator.Editor.ProjectSettingsData.asset b/ProjectSettings/SatorImaging.UnitySourceGenerator.Editor.ProjectSettingsData.asset index a7875bb4..9bd4b8b7 100644 --- a/ProjectSettings/SatorImaging.UnitySourceGenerator.Editor.ProjectSettingsData.asset +++ b/ProjectSettings/SatorImaging.UnitySourceGenerator.Editor.ProjectSettingsData.asset @@ -51,5 +51,12 @@ MonoBehaviour: - Assets/Scripts/UI/PauseMenu.cs - Assets/Scripts/Util/Sound.cs - Assets/Scripts/Conductor.cs + - Assets/Scripts/EventCaller.cs + - Assets/Scripts/Games/TrickClass/TrickClass.cs + - Assets/Scripts/GameInitializer.cs + - Assets/Scripts/LevelEditor/Timeline/Timeline.cs + - Assets/Scripts/Games/PlayerActionEvent.cs + - Assets/Scripts/Games/KarateMan/KarateManPot.cs + - Assets/Scripts/Games/DJSchool/DJSchool.cs PathsToSkipImportEvent: [] PathsToIgnoreOverwriteSettingOnAttribute: []