mirror of
https://github.com/DerTyp7/harvestdale-unity.git
synced 2025-10-29 12:52:07 +01:00
147 lines
2.8 KiB
C#
147 lines
2.8 KiB
C#
// Contains logic for the field
|
|
// Checks if a plant is dead, growing or harvestable
|
|
// Determines what sprite to show
|
|
// Handles planting and harvesting
|
|
|
|
using UnityEngine;
|
|
|
|
public enum FieldState
|
|
{
|
|
EMPTY,
|
|
DEAD,
|
|
GROWING,
|
|
HARVESTABLE,
|
|
}
|
|
|
|
public class Field : Building
|
|
{
|
|
[Header("Children Objects")]
|
|
[SerializeField]
|
|
private SpriteRenderer cropSpriteRenderer;
|
|
|
|
[SerializeField]
|
|
private SpriteRenderer backgroundSpriteRenderer;
|
|
|
|
[SerializeField]
|
|
private GameObject fieldController;
|
|
|
|
[Header("Field Properties")]
|
|
[SerializeField]
|
|
private Crop crop;
|
|
|
|
private Vector2Int size;
|
|
private int daysSincePlanted;
|
|
private bool isWatered = false;
|
|
|
|
private FieldState state = FieldState.EMPTY;
|
|
|
|
public FieldState State
|
|
{
|
|
get { return state; }
|
|
}
|
|
|
|
public bool IsWatered
|
|
{
|
|
get { return isWatered; }
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
size = DeterminSize();
|
|
SetFieldControllerPosition();
|
|
fieldController.GetComponent<FieldController>().SetField(this);
|
|
|
|
TimeManager.OnDayChanged += DayInterval;
|
|
}
|
|
|
|
public override void OnPlace()
|
|
{
|
|
EmptyField();
|
|
}
|
|
|
|
private void SetFieldControllerPosition()
|
|
{
|
|
if (fieldController)
|
|
{
|
|
fieldController.transform.localPosition = new Vector3(size.x, size.y / 2, 0);
|
|
}
|
|
}
|
|
|
|
private Vector2Int DeterminSize()
|
|
{
|
|
return new Vector2Int(Mathf.FloorToInt(backgroundSpriteRenderer.size.x), Mathf.FloorToInt(backgroundSpriteRenderer.size.y));
|
|
}
|
|
|
|
private void SetSprite(Sprite sprite)
|
|
{
|
|
if (cropSpriteRenderer)
|
|
{
|
|
cropSpriteRenderer.sprite = sprite;
|
|
cropSpriteRenderer.drawMode = SpriteDrawMode.Tiled;
|
|
cropSpriteRenderer.size = size;
|
|
}
|
|
}
|
|
|
|
private void DayInterval()
|
|
{
|
|
if (state == FieldState.GROWING)
|
|
{
|
|
if (!isWatered)
|
|
state = FieldState.DEAD;
|
|
else
|
|
{
|
|
daysSincePlanted++;
|
|
if (daysSincePlanted >= crop.daysToGrow)
|
|
{
|
|
state = FieldState.HARVESTABLE;
|
|
}
|
|
SetSprite(crop.sprites[daysSincePlanted]);
|
|
}
|
|
}
|
|
}
|
|
|
|
#region Field controlling
|
|
public void Plant(Crop newCrop)
|
|
{
|
|
bool enoughItemsInInventory = FarmManager.Instance.CropInventory.RemoveExactAmount(newCrop, size.x * size.y);
|
|
if (enoughItemsInInventory)
|
|
{
|
|
daysSincePlanted = 0;
|
|
state = FieldState.GROWING;
|
|
crop = newCrop;
|
|
SetSprite(crop.sprites[0]);
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("Not enough items in inventory");
|
|
}
|
|
|
|
}
|
|
|
|
public void Harvest()
|
|
{
|
|
if (state == FieldState.HARVESTABLE)
|
|
{
|
|
FarmManager.Instance.HarvestInventory.Add(crop.harvest, size.x * size.y);
|
|
state = FieldState.EMPTY;
|
|
SetSprite(null);
|
|
}
|
|
}
|
|
|
|
public void Water()
|
|
{
|
|
isWatered = true;
|
|
}
|
|
|
|
public void UnWater()
|
|
{
|
|
isWatered = false;
|
|
}
|
|
|
|
public void EmptyField()
|
|
{
|
|
state = FieldState.EMPTY;
|
|
SetSprite(null);
|
|
}
|
|
#endregion
|
|
} |