diff --git a/Assets/Scripts/Games/MonkeyWatch/MonkeyWatch.cs b/Assets/Scripts/Games/MonkeyWatch/MonkeyWatch.cs index 6926a40ab..b141eca79 100644 --- a/Assets/Scripts/Games/MonkeyWatch/MonkeyWatch.cs +++ b/Assets/Scripts/Games/MonkeyWatch/MonkeyWatch.cs @@ -15,6 +15,11 @@ namespace HeavenStudio.Games.Loaders { new GameAction("appear", "Monkeys Appear") { + function = delegate + { + var e = eventCaller.currentEntity; + MonkeyWatch.instance.MonkeysAppear(e.beat, e.length, e["value"], e.beat); + }, defaultLength = 2f, resizable = true, parameters = new List() @@ -136,6 +141,7 @@ namespace HeavenStudio.Games private double persistBeat = 0; private double theNextGameSwitchBeat = double.MaxValue; + private double clappingBeat = 0; public override void OnGameSwitch(double beat) { @@ -147,6 +153,7 @@ namespace HeavenStudio.Games { StartClapping(wantClap); } + PersistAppear(beat); bool IsClapBeat(double clapBeat) { @@ -160,6 +167,78 @@ namespace HeavenStudio.Games GetCameraMovements(beat, true); monkeyClockArrow.MoveToAngle(lastAngle); monkeyHandler.Init((int)(lastAngle / degreePerMonkey)); + PersistAppear(beat); + } + + private void PersistAppear(double beat) + { + var allEvents = EventCaller.GetAllInGameManagerList("monkeyWatch", new string[] { "appear" }).FindAll(x => x.beat + x["value"] > beat && x.beat < beat); + + foreach (var e in allEvents) + { + MonkeysAppear(e.beat, e.length, e["value"], beat); + } + } + + public void MonkeysAppear(double beat, float length, int repeatAmount, double gameSwitchBeat) + { + List actions = new(); + + double lastBeat = clappingBeat; + + int index = 0; + while (index < repeatAmount) + { + + if (IsPinkMonkeyAtBeat(lastBeat, out float pinkLength)) + { + for (int i = 0; i < pinkLength; i++) + { + if (index >= repeatAmount) break; + int realerIndex = index; + double realLastBeat = lastBeat; + actions.Add(new BeatAction.Action(beat + (index * length), delegate + { + monkeyHandler.SpawnMonkey(realLastBeat, true, beat + (realerIndex * length) < gameSwitchBeat); + })); + index++; + lastBeat += 1; + } + } + else if (IsCustomPinkMonkeyAtBeat(lastBeat, out float pinkCustomLength)) + { + var relevantPinks = FindCustomOffbeatMonkeysBetweenBeat(lastBeat, lastBeat + pinkCustomLength); + relevantPinks.Sort((x, y) => x.beat.CompareTo(y.beat)); + + for (int i = 0; i < relevantPinks.Count; i++) + { + if (index >= repeatAmount) break; + int jindex = i; + int realerIndex = index; + actions.Add(new BeatAction.Action(beat + (index * length), delegate + { + monkeyHandler.SpawnMonkey(relevantPinks[jindex].beat, true, beat + (realerIndex * length) < gameSwitchBeat); + })); + index++; + } + lastBeat += pinkCustomLength; + } + else + { + int realIndex = index; + double realLastBeat = lastBeat; + actions.Add(new BeatAction.Action(beat + (index * length), delegate + { + monkeyHandler.SpawnMonkey(realLastBeat, false, beat + (realIndex * length) < gameSwitchBeat); + })); + index++; + lastBeat += 2; + } + Debug.Log(index); + } + + actions.Sort((x, y) => x.beat.CompareTo(y.beat)); + BeatAction.New(instance.gameObject, actions); } #region clapping @@ -354,12 +433,14 @@ namespace HeavenStudio.Games overrideStartBeat = false; } lastAngle = startAngle; + clappingBeat = startClappingBeat; var pinkClappingEvents = EventCaller.GetAllInGameManagerList("monkeyWatch", new string[] { "off", "offStretch", "offInterval" }).FindAll(x => x.beat >= lastGameSwitchBeat && x.beat < nextGameSwitchBeat); if (pinkClappingEvents.Count > 0) { pinkClappingEvents.Sort((x, y) => x.beat.CompareTo(y.beat)); if (overrideStartBeat) startClappingBeat = pinkClappingEvents[0].beat; + clappingBeat = startClappingBeat; var relevantPinkClappingEvents = pinkClappingEvents.FindAll(x => (x.beat - startClappingBeat) % 2 == 0); relevantPinkClappingEvents.Sort((x, y) => x.beat.CompareTo(y.beat)); diff --git a/Assets/Scripts/Games/MonkeyWatch/WatchMonkeyHandler.cs b/Assets/Scripts/Games/MonkeyWatch/WatchMonkeyHandler.cs index b6752641f..0bf57d727 100644 --- a/Assets/Scripts/Games/MonkeyWatch/WatchMonkeyHandler.cs +++ b/Assets/Scripts/Games/MonkeyWatch/WatchMonkeyHandler.cs @@ -33,6 +33,7 @@ namespace HeavenStudio.Games.Scripts_MonkeyWatch public void Init(int minute) { startMinute = minute; + watchHoleIndex = startMinute; } private Transform GetNextAvailableWatchHole() {