HeavenStudioPlus/Assets/Scripts/Games/CropStomp/Farmer.cs
AstrlJelly 8fb01142db
Crop Stomp Fix + Fork Lifter Animation Tweak (#588)
* fork lifter weird reset thingy fixed

* crop stomp code review

im gonna be fixing that weird bug where inputs aren't scheduled if crop stomp is the first game (or if you start on it) but first
some of the code in this is nearly two years old. it needed a lot of check-ups.

* oh okay that bug was really easy to fix

* convert animation playing to beat scaled playing

* crop stomp fix
2023-12-05 22:38:55 +00:00

148 lines
5.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HeavenStudio.Util;
using System;
namespace HeavenStudio.Games.Scripts_CropStomp
{
public class Farmer : MonoBehaviour
{
public double nextStompBeat;
private CropStomp game;
PlayerActionEvent stomp;
[SerializeField] private Transform collectedHolder;
[SerializeField] private GameObject plantLeftRef;
[SerializeField] private GameObject plantRightRef;
[SerializeField] private GameObject plantLastRef;
[SerializeField] private Sprite[] veggieSprites;
[SerializeField] private GameObject startPlant;
private List<GameObject> spawnedPlants = new List<GameObject>();
private int lastVeggieType;
[SerializeField] private float plantDistance = 0.5f;
[SerializeField] private float plantStartDistance = 0.1f;
[NonSerialized] public int plantThreshold = 8;
[NonSerialized] public int plantLimit = 80;
public static int collectedPlants = 0;
private void OnDestroy()
{
if (!Conductor.instance.isPlaying)
{
collectedPlants = 0;
UpdatePlants();
}
}
public void Init()
{
game = CropStomp.instance;
if (!Conductor.instance.isPlaying)
{
collectedPlants = 0;
}
UpdatePlants();
}
private void Update()
{
if (!game.isMarching)
return;
Conductor cond = Conductor.instance;
if (stomp == null && cond.isPlaying)
{
if (GameManager.instance.currentGame == "cropStomp")
{
stomp = game.ScheduleUserInput(nextStompBeat - 1f, 1f, CropStomp.InputAction_BasicPress, Just, Miss, Out);
stomp.countsForAccuracy = false;
}
}
if (PlayerInput.GetIsAction(CropStomp.InputAction_BasicPress) && !game.IsExpectingInputNow(CropStomp.InputAction_BasicPress))
{
game.bodyAnim.DoScaledAnimationAsync("Crouch", 0.5f);
}
}
public void CollectPlant(int veggieType)
{
if (collectedPlants > plantLimit) return;
if (collectedPlants <= plantLimit - plantThreshold) lastVeggieType = veggieType;
collectedPlants++;
UpdatePlants();
}
public void UpdatePlants()
{
startPlant.SetActive(collectedPlants >= plantThreshold);
if (spawnedPlants.Count > 0)
{
foreach (var plant in spawnedPlants) {
Destroy(plant);
}
spawnedPlants.Clear();
}
for (int i = 0; i <= collectedPlants - (plantThreshold * 2) && i <= plantLimit - (plantThreshold * 2); i += plantThreshold)
{
bool isLast = i == plantLimit - (plantThreshold * 2);
int realIndex = i / plantThreshold;
GameObject spawnedPlant;
if (isLast)
{
spawnedPlant = Instantiate(plantLastRef, collectedHolder);
spawnedPlant.GetComponent<SpriteRenderer>().sprite = veggieSprites[lastVeggieType];
} else {
spawnedPlant = Instantiate((realIndex % 2 == 0) ? plantRightRef : plantLeftRef, collectedHolder);
}
spawnedPlant.transform.localPosition = new Vector3(0, (realIndex * plantDistance) + plantStartDistance, 0);
spawnedPlant.GetComponent<SpriteRenderer>().sortingOrder = -realIndex - 2;
spawnedPlant.SetActive(true);
spawnedPlants.Add(spawnedPlant);
}
}
private void Just(PlayerActionEvent caller, float state)
{
// REMARK: does not count for performance
Stomp(state >= 1f || state <= -1f);
}
private void Miss(PlayerActionEvent caller)
{
if (GameManager.instance.currentGame != "cropStomp" || !game.isMarching) return;
// REMARK: does not count for performance
nextStompBeat += 2f;
stomp?.Disable();
stomp = game.ScheduleUserInput(nextStompBeat - 1f, 1f, CropStomp.InputAction_BasicPress, Just, Miss, Out);
stomp.countsForAccuracy = false;
}
private void Out(PlayerActionEvent caller) {}
void Stomp(bool ng)
{
if (GameManager.instance.currentGame != "cropStomp" || !game.isMarching) return;
if (ng) {
game.bodyAnim.DoScaledAnimationAsync("Crouch", 0.5f);
} else {
game.Stomp();
game.bodyAnim.DoScaledAnimationAsync("Stomp", 0.5f);
}
nextStompBeat += 2f;
stomp?.Disable();
stomp = game.ScheduleUserInput(nextStompBeat - 1f, 1f, CropStomp.InputAction_BasicPress, Just, Miss, Out);
stomp.countsForAccuracy = false;
}
}
}