diff --git a/Assets/Scripts/Games/CropStomp/CropStomp.cs b/Assets/Scripts/Games/CropStomp/CropStomp.cs index f1bdf9628..27c49deb1 100644 --- a/Assets/Scripts/Games/CropStomp/CropStomp.cs +++ b/Assets/Scripts/Games/CropStomp/CropStomp.cs @@ -16,13 +16,13 @@ namespace HeavenStudio.Games.Loaders { new GameAction("start marching", "Start Marching") { - function = delegate { CropStomp.instance.StartMarching(eventCaller.currentEntity.beat); }, + function = delegate { CropStomp.instance.StartMarching(eventCaller.currentEntity.beat); }, defaultLength = 2f, inactiveFunction = delegate { CropStomp.MarchInactive(eventCaller.currentEntity.beat); } }, new GameAction("veggies", "Veggies") { - defaultLength = 4f, + defaultLength = 4f, resizable = true }, new GameAction("mole", "Mole") @@ -127,41 +127,142 @@ namespace HeavenStudio.Games { instance = this;// Finding grass sprite width for grass scrolling. farmer.Init(); - var grassSprite = grass.sprite; - var borderLeft = grassSprite.rect.xMin + grassSprite.border.x; - var borderRight = grassSprite.rect.xMax - grassSprite.border.z; - var borderWidthPixels = borderRight - borderLeft; - grassWidth = borderWidthPixels / grassSprite.pixelsPerUnit; + Sprite sprite = grass.sprite; + float borderLeft = sprite.rect.xMin + sprite.border.x; + float borderRight = sprite.rect.xMax - sprite.border.z; + float borderWidthPixels = borderRight - borderLeft; + grassWidth = borderWidthPixels / sprite.pixelsPerUnit; legsAnim.Play("LiftFront", 0, 1); // Start with leg up. + if (!Conductor.instance.isPlaying) { + OnGameSwitch(Conductor.instance.songPositionInBeatsAsDouble); + } + // Initialize vegetables. - var cond = Conductor.instance; - var entities = GameManager.instance.Beatmap.Entities; + // var cond = Conductor.instance; + // var entities = GameManager.instance.Beatmap.Entities; - double startBeat = cond.songPositionInBeatsAsDouble; + // double startBeat = cond.songPositionInBeatsAsDouble; + // double endBeat = double.MaxValue; + + // if (inactiveStart == -1f) + // { + // // Find the beat of the closest "start marching" event. + // var marchStarts = entities.FindAll(m => m.datamodel == "cropStomp/start marching"); + // for (int i = 0; i < marchStarts.Count; i++) + // { + // var sampleBeat = marchStarts[i].beat; + // if (cond.songPositionInBeatsAsDouble <= sampleBeat + 0.25f) // 0.25-beat buffer in case the start marching event is directly next to the game switch event. + // { + // startBeat = sampleBeat; + // break; + // } + // } + // } + // else + // { + // // Find the beat of the next step, assuming marching started at inactiveStart. + // int stepsPassed = 0; + + // while (inactiveStart + (stepsPassed * 2f) < cond.songPositionInBeatsAsDouble) + // { + // stepsPassed++; + + // if (stepsPassed > 1000) + // { + // Debug.Log("Loop broke!"); + // return; + // } + // } + + // startBeat = inactiveStart + (stepsPassed * 2f); + + // // Cue the marching proper to begin when applicable. + // BeatAction.New(this, new() { new(startBeat - 0.25f, delegate { StartMarching(startBeat); }) }); + + // inactiveStart = -1f; + // } + + // // find out when the next game switch (or remix end) happens + // var allEnds = EventCaller.GetAllInGameManagerList("gameManager", new string[] { "switchGame", "end" }); + // if (allEnds.Count == 0) + // { + // endBeat = double.MaxValue; + // } + // else + // { + // allEnds.Sort((x, y) => x.beat.CompareTo(y.beat)); + + // //get the beat of the closest end event + // foreach (var end in allEnds) + // { + // if (end.datamodel != "gameManager/end" && end.datamodel.Split(2) == "cropStomp") continue; + // if (end.beat > startBeat) + // { + // endBeat = end.beat; + // break; + // } + // } + // } + + // // Veggie and mole events. + // var vegEvents = entities.FindAll(v => v.datamodel == "cropStomp/veggies"); + // var moleEvents = entities.FindAll(m => m.datamodel == "cropStomp/mole"); + + // // Spawn veggies. + // for (int i = 0; i < vegEvents.Count; i++) + // { + // var vegBeat = vegEvents[i].beat; + // var vegLength = vegEvents[i].length; + + // // Only consider veggie events that aren't past the start point. + // if (startBeat <= vegBeat + vegLength) + // { + // int veggiesInEvent = Mathf.CeilToInt(vegLength + 1) / 2; + + // for (int b = 0; b < veggiesInEvent; b++) + // { + // var targetVeggieBeat = vegBeat + 2f * b; + // if (startBeat <= targetVeggieBeat && targetVeggieBeat < endBeat) + // { + // SpawnVeggie(targetVeggieBeat, startBeat, false); + // } + // } + // } + // } + + // // Spawn moles. + // for (int i = 0; i < moleEvents.Count; i++) + // { + // var moleBeat = moleEvents[i].beat; + + // if (startBeat <= moleBeat && moleBeat < endBeat) + // { + // SpawnVeggie(moleBeat, startBeat, true); + // } + // } + } + + List cuedMoleSounds = new List(); + + public override void OnGameSwitch(double beat) + { + double startBeat; double endBeat = double.MaxValue; - + var entities = GameManager.instance.Beatmap.Entities; if (inactiveStart == -1f) { // Find the beat of the closest "start marching" event. - var marchStarts = entities.FindAll(m => m.datamodel == "cropStomp/start marching"); - for (int i = 0; i < marchStarts.Count; i++) - { - var sampleBeat = marchStarts[i].beat; - if (cond.songPositionInBeatsAsDouble <= sampleBeat + 0.25f) // 0.25-beat buffer in case the start marching event is directly next to the game switch event. - { - startBeat = sampleBeat; - break; - } - } + var lastMarch = entities.Find(c => c.datamodel == "cropStomp/start marching" && beat <= c.beat); + startBeat = lastMarch?.beat ?? beat; } else { // Find the beat of the next step, assuming marching started at inactiveStart. int stepsPassed = 0; - while (inactiveStart + (stepsPassed * 2f) < cond.songPositionInBeatsAsDouble) + while (inactiveStart + (stepsPassed * 2f) < beat) { stepsPassed++; @@ -175,35 +276,14 @@ namespace HeavenStudio.Games startBeat = inactiveStart + (stepsPassed * 2f); // Cue the marching proper to begin when applicable. - BeatAction.New(this, new List() - { - new BeatAction.Action(startBeat - 0.25f, delegate { StartMarching(startBeat); }) - }); + BeatAction.New(this, new() { new(startBeat - 0.25f, delegate { StartMarching(startBeat); }) }); inactiveStart = -1f; } // find out when the next game switch (or remix end) happens - var allEnds = EventCaller.GetAllInGameManagerList("gameManager", new string[] { "switchGame", "end" }); - if (allEnds.Count == 0) - { - endBeat = double.MaxValue; - } - else - { - allEnds.Sort((x, y) => x.beat.CompareTo(y.beat)); - - //get the beat of the closest end event - foreach (var end in allEnds) - { - if (end.datamodel != "gameManager/end" && end.datamodel.Split(2) == "cropStomp") continue; - if (end.beat > startBeat) - { - endBeat = end.beat; - break; - } - } - } + var firstEnd = entities.Find(c => c.datamodel is "gameManager/switchGame/cropStomp" or "gameManager/end" && c.beat > startBeat); + endBeat = firstEnd?.beat ?? double.MaxValue; // Veggie and mole events. var vegEvents = entities.FindAll(v => v.datamodel == "cropStomp/veggies"); @@ -222,7 +302,7 @@ namespace HeavenStudio.Games for (int b = 0; b < veggiesInEvent; b++) { - var targetVeggieBeat = vegBeat + 2f * b; + var targetVeggieBeat = vegBeat + (2f * b); if (startBeat <= targetVeggieBeat && targetVeggieBeat < endBeat) { SpawnVeggie(targetVeggieBeat, startBeat, false); @@ -241,43 +321,33 @@ namespace HeavenStudio.Games SpawnVeggie(moleBeat, startBeat, true); } } - } - - List cuedMoleSounds = new List(); - - public override void OnGameSwitch(double beat) - { SetInitTresholds(beat); SetMarchEndBeat(beat); } public override void OnPlay(double beat) { - SetInitTresholds(beat); - SetMarchEndBeat(beat); + OnGameSwitch(beat); } private void SetMarchEndBeat(double beat) { - double nextEndBeat = double.MaxValue; var nextEnd = EventCaller.GetAllInGameManagerList("gameManager", new string[] { "switchGame", "end" }).Find(e => e.beat > beat); - if (nextEnd != null) nextEndBeat = nextEnd.beat; + double nextEndBeat = nextEnd?.beat ?? double.MaxValue; - var allEnds = EventCaller.GetAllInGameManagerList("cropStomp", new string[] { "end" }); - var tempEnds = allEnds.FindAll(x => x.beat >= beat && x.beat < nextEndBeat); - if (tempEnds.Count == 0) return; - - marchEndBeat = tempEnds[0].beat; - willNotHum = tempEnds[0]["mute"]; + var firstEnd = GameManager.instance.Beatmap.Entities.Find(c => c.datamodel == "cropStomp/end" && c.beat >= beat && c.beat < nextEndBeat); + if (firstEnd != null) { + marchEndBeat = firstEnd.beat; + willNotHum = firstEnd["mute"]; + } } public static void MoleSound(double beat) { - MultiSound.Play(new MultiSound.Sound[] - { - new MultiSound.Sound("cropStomp/moleNyeh", beat - 2, 1, 1, false, 0.134), - new MultiSound.Sound("cropStomp/moleHeh1", beat - 1.5, 1, 1, false, 0.05), - new MultiSound.Sound("cropStomp/moleHeh2", beat - 1, 1, 1, false, 0.061) + MultiSound.Play(new MultiSound.Sound[] { + new MultiSound.Sound("cropStomp/moleNyeh", beat - 2, offset: 0.134), + new MultiSound.Sound("cropStomp/moleHeh1", beat - 1.5, offset: 0.05), + new MultiSound.Sound("cropStomp/moleHeh2", beat - 1, offset: 0.061) }, forcePlay: true); } @@ -285,11 +355,9 @@ namespace HeavenStudio.Games { var cond = Conductor.instance; - if (!cond.isPlaying) + if (!cond.isPlaying || !isMarching) return; - if (!isMarching) - return; // Debug.Log(newBeat); bool cameraLocked = cond.songPositionInBeats >= marchEndBeat; @@ -357,12 +425,9 @@ namespace HeavenStudio.Games private void SetInitTresholds(double beat) { - var allCollects = EventCaller.GetAllInGameManagerList("cropStomp", new string[] { "plantCollect" }); - if (allCollects.Count == 0) return; - - var tempCollect = allCollects.FindLast(x => x.beat < beat); - if (tempCollect == null) return; - SetCollectThresholds(tempCollect["threshold"], tempCollect["limit"], tempCollect["force"], tempCollect["forceAmount"]); + var lastCollect = GameManager.instance.Beatmap.Entities.FindLast(c => c.datamodel == "cropStomp/plantCollect" && c.beat < beat); + if (lastCollect == null) return; + SetCollectThresholds(lastCollect["threshold"], lastCollect["limit"], lastCollect["force"], lastCollect["forceAmount"]); } public void CollectPlant(int veggieType) @@ -379,18 +444,17 @@ namespace HeavenStudio.Games if (!isStepping) { stepCount += 1; - var stepAnim = (stepCount % 2 != 0 ? "StepFront" : "StepBack"); + var stepAnim = (stepCount % 2 != 0) ? "StepFront" : "StepBack"; legsAnim.Play(stepAnim, 0, 0); isStepping = true; } - } // Lift. else { - var liftAnim = (stepCount % 2 != 0 ? "LiftBack" : "LiftFront"); + var liftAnim = (stepCount % 2 != 0) ? "LiftBack" : "LiftFront"; legsAnim.Play(liftAnim, 0, 0); var farmerPos = farmerTrans.localPosition; @@ -413,27 +477,28 @@ namespace HeavenStudio.Games public void Stomp() { // Don't increment step counter if autostep stepped already. - if (!isStepping) - stepCount += 1; + if (!isStepping) stepCount += 1; - var stompAnim = (stepCount % 2 != 0 ? "StompFront" : "StompBack"); + var stompAnim = (stepCount % 2 != 0) ? "StompFront" : "StompBack"; legsAnim.Play(stompAnim, 0, 0); SoundByte.PlayOneShotGame("cropStomp/stomp"); - if (shakeTween != null) - shakeTween.Kill(true); + if (shakeTween != null) shakeTween.Kill(true); - DOTween.Punch(() => GameCamera.additionalPosition, x => GameCamera.additionalPosition = x, new Vector3(0, 0.75f, 0), - Conductor.instance.pitchedSecPerBeat*0.5f, 18, 1f); + DOTween.Punch(() => + GameCamera.additionalPosition, + x => GameCamera.additionalPosition = x, + new Vector3(0, 0.75f, 0), Conductor.instance.pitchedSecPerBeat * 0.5f, 18, 1f + ); isStepping = true; } private void SpawnVeggie(double beat, double startBeat, bool isMole) { - var newVeggie = GameObject.Instantiate(isMole ? baseMole : baseVeggie, veggieHolder).GetComponent(); + var newVeggie = Instantiate(isMole ? baseMole : baseVeggie, veggieHolder).GetComponent(); newVeggie.targetBeat = beat; @@ -445,21 +510,16 @@ namespace HeavenStudio.Games public static void MarchInactive(double beat) { - if (GameManager.instance.currentGame == "cropStomp") //this function is only meant for making march sounds while the game is inactive - { - return; - } + if (GameManager.instance.currentGame == "cropStomp") return; inactiveStart = beat; RiqEntity gameSwitch = GameManager.instance.Beatmap.Entities.Find(c => c.beat >= beat && c.datamodel == "gameManager/switchGame/cropStomp"); - if (gameSwitch == null) - return; - int length = (int)Math.Ceiling((gameSwitch.beat - beat)/2); + if (gameSwitch == null) return; + int length = (int)Math.Ceiling((gameSwitch.beat - beat) / 2); MultiSound.Sound[] sounds = new MultiSound.Sound[length]; - for(int i = 0; i < length; i++) - { - sounds[i] = new MultiSound.Sound("cropStomp/hmm", beat + i*2); + for(int i = 0; i < length; i++) { + sounds[i] = new MultiSound.Sound("cropStomp/hmm", beat + (i * 2)); } - MultiSound.Play(sounds, forcePlay:true); + MultiSound.Play(sounds, forcePlay: true); } } } diff --git a/Assets/Scripts/Games/CropStomp/Farmer.cs b/Assets/Scripts/Games/CropStomp/Farmer.cs index cc2b33ca9..544b35768 100644 --- a/Assets/Scripts/Games/CropStomp/Farmer.cs +++ b/Assets/Scripts/Games/CropStomp/Farmer.cs @@ -87,8 +87,7 @@ namespace HeavenStudio.Games.Scripts_CropStomp startPlant.SetActive(collectedPlants >= plantThreshold); if (spawnedPlants.Count > 0) { - foreach (var plant in spawnedPlants) - { + foreach (var plant in spawnedPlants) { Destroy(plant); } spawnedPlants.Clear(); @@ -102,8 +101,9 @@ namespace HeavenStudio.Games.Scripts_CropStomp { spawnedPlant = Instantiate(plantLastRef, collectedHolder); spawnedPlant.GetComponent().sprite = veggieSprites[lastVeggieType]; + } else { + spawnedPlant = Instantiate((realIndex % 2 == 0) ? plantRightRef : plantLeftRef, collectedHolder); } - else spawnedPlant = Instantiate((realIndex % 2 == 0) ? plantRightRef : plantLeftRef, collectedHolder); spawnedPlant.transform.localPosition = new Vector3(0, (realIndex * plantDistance) + plantStartDistance, 0); spawnedPlant.GetComponent().sortingOrder = -realIndex - 2; spawnedPlant.SetActive(true); @@ -119,9 +119,8 @@ namespace HeavenStudio.Games.Scripts_CropStomp private void Miss(PlayerActionEvent caller) { - if (GameManager.instance.currentGame != "cropStomp") return; - if (!game.isMarching) - return; + if (GameManager.instance.currentGame != "cropStomp" || !game.isMarching) return; + // REMARK: does not count for performance nextStompBeat += 2f; stomp?.Disable(); @@ -133,18 +132,12 @@ namespace HeavenStudio.Games.Scripts_CropStomp void Stomp(bool ng) { - if (GameManager.instance.currentGame != "cropStomp") return; - if (!game.isMarching) - return; - if (ng) - { + if (GameManager.instance.currentGame != "cropStomp" || !game.isMarching) return; + if (ng) { game.bodyAnim.Play("Crouch", 0, 0); - } - else - { + } else { game.Stomp(); game.bodyAnim.Play("Stomp", 0, 0); - } nextStompBeat += 2f; stomp?.Disable(); diff --git a/Assets/Scripts/Games/CropStomp/Veggie.cs b/Assets/Scripts/Games/CropStomp/Veggie.cs index 56d6a4784..744b530cc 100644 --- a/Assets/Scripts/Games/CropStomp/Veggie.cs +++ b/Assets/Scripts/Games/CropStomp/Veggie.cs @@ -59,35 +59,21 @@ namespace HeavenStudio.Games.Scripts_CropStomp if (!game.isMarching) return; - // Veggie missed. Handle missed state. - if (veggieState == -1) + switch (veggieState) { - MissedUpdate(); - return; - } + case -1: MissedUpdate(); return; + // case 0: + case 2: PickedUpdate(); return; + case 1: + float airPosition = Conductor.instance.GetPositionFromBeat(stompedBeat, landBeat - stompedBeat); + veggieTrans.position = curve.GetPoint(Mathf.Clamp(airPosition, 0, 1)); - // Veggie picked. Handle picked state. - if (veggieState == 2) - { - PickedUpdate(); - return; - } - - var cond = Conductor.instance; - // In ground. - if (veggieState == 0) - { - } - // In air. - else if (veggieState == 1) - { - float airPosition = cond.GetPositionFromBeat(stompedBeat, landBeat - stompedBeat); - veggieTrans.position = curve.GetPoint(Mathf.Clamp(airPosition, 0, 1)); - - if (PlayerInput.GetIsAction(CropStomp.InputAction_FlickRelease) && !game.IsExpectingInputNow(CropStomp.InputAction_FlickRelease)) - { - pickEligible = false; - } + if (PlayerInput.GetIsAction(CropStomp.InputAction_FlickRelease) && !game.IsExpectingInputNow(CropStomp.InputAction_FlickRelease)) + { + pickEligible = false; + } + break; + // default: } } @@ -105,13 +91,13 @@ namespace HeavenStudio.Games.Scripts_CropStomp StompVeggie(false); } - private void StompMiss(PlayerActionEvent caller) + private void StompMiss(PlayerActionEvent caller) { veggieState = -1; caller.Disable(); } - private void Out(PlayerActionEvent caller) {} + private void Out(PlayerActionEvent caller) { } private void PickJust(PlayerActionEvent caller, float state) { @@ -131,13 +117,20 @@ namespace HeavenStudio.Games.Scripts_CropStomp curve.transform.localScale = Vector3.one; // Return curve to normal size in the case of mole curves. - var key1 = curve.KeyPoints[0]; - var key1Pos = key1.Position; - key1.Position = new Vector3(key1Pos.x, veggieTrans.position.y, key1Pos.z); + for (int i = 0; i < 2; i++) + { + var key = curve.KeyPoints[i]; + var keyPos = key.Position; + key.Position = new Vector3(keyPos.x, veggieTrans.position.y + (i * 2), keyPos.z); + } - var key2 = curve.KeyPoints[1]; - var key2Pos = key2.Position; - key2.Position = new Vector3(key2Pos.x, veggieTrans.position.y + 2f, key2Pos.z); + // var key1 = curve.KeyPoints[0]; + // var key1Pos = key1.Position; + // key1.Position = new Vector3(key1Pos.x, veggieTrans.position.y, key1Pos.z); + + // var key2 = curve.KeyPoints[1]; + // var key2Pos = key2.Position; + // key2.Position = new Vector3(key2Pos.x, veggieTrans.position.y + 2f, key2Pos.z); pickedBeat = Conductor.instance.songPositionInBeatsAsDouble; @@ -154,9 +147,8 @@ namespace HeavenStudio.Games.Scripts_CropStomp private void PickMiss(PlayerActionEvent caller) { veggieState = -1; - - if (!isMole) - SoundByte.PlayOneShotGame("cropStomp/veggieMiss"); + + if (!isMole) SoundByte.PlayOneShotGame("cropStomp/veggieMiss"); caller.Disable(); } @@ -223,6 +215,8 @@ namespace HeavenStudio.Games.Scripts_CropStomp } gotStomped = true; + Debug.Log("Stomped!"); + var cond = Conductor.instance; ParticleSystem spawnedHit = Instantiate(game.hitParticle, game.hitParticle.transform.parent); @@ -235,7 +229,7 @@ namespace HeavenStudio.Games.Scripts_CropStomp stompedBeat = cond.songPositionInBeatsAsDouble; - landBeat = targetBeat + (float)cond.SecsToBeats(Minigame.NgLateTime()-1, cond.GetBpmAtBeat(targetBeat)); + landBeat = targetBeat + (float)cond.SecsToBeats(Minigame.NgLateTime() - 1, cond.GetBpmAtBeat(targetBeat)); if (autoTriggered) {