2020-04-08 20:04:31 +02:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Microsoft.Xna.Framework;
|
|
|
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
|
|
|
|
|
|
|
|
class Farm
|
|
|
|
|
{
|
|
|
|
|
private Crops[,] crops;
|
|
|
|
|
private Random r;
|
2020-05-06 22:37:04 +02:00
|
|
|
|
private CropTypesHolder PresetCrops = new CropTypesHolder();
|
2020-05-07 13:53:07 +02:00
|
|
|
|
private int Update;
|
2020-05-10 21:16:24 +02:00
|
|
|
|
private Astar astar = new Astar();
|
2020-05-11 01:16:01 +02:00
|
|
|
|
private PerlinNoise perlin = new PerlinNoise();
|
2020-05-23 20:37:11 +02:00
|
|
|
|
private Vector2 RainPosition;
|
|
|
|
|
private Vector2 WindSpeed;
|
|
|
|
|
private System.Drawing.Color[][] RainfallMap;
|
2020-05-11 01:16:01 +02:00
|
|
|
|
private float[][] whiteNoise;
|
|
|
|
|
private float[][] perlinNoise;
|
2020-05-23 20:37:11 +02:00
|
|
|
|
private int resetBitMap = 0;
|
2020-05-11 01:16:01 +02:00
|
|
|
|
|
2020-04-08 20:04:31 +02:00
|
|
|
|
|
2020-05-03 13:05:05 +02:00
|
|
|
|
//initializes the crops
|
2020-05-06 16:22:30 +02:00
|
|
|
|
public void init(Vector2 Size, Vector2 housepos)
|
2020-04-08 20:04:31 +02:00
|
|
|
|
{
|
2020-05-11 01:16:01 +02:00
|
|
|
|
whiteNoise = PerlinNoise.GenerateWhiteNoise(100, 100);
|
|
|
|
|
perlinNoise = PerlinNoise.GeneratePerlinNoise(whiteNoise, 1);
|
2020-05-06 22:37:04 +02:00
|
|
|
|
PresetCrops.init();
|
2020-04-08 20:04:31 +02:00
|
|
|
|
r = new Random();
|
2020-05-03 13:05:05 +02:00
|
|
|
|
crops = new Crops[100, 100];
|
2020-05-10 23:56:52 +02:00
|
|
|
|
int dirtCount = 0;
|
2020-05-07 21:46:33 +02:00
|
|
|
|
for (int i = 0; i < 99; i++)
|
2020-04-08 20:04:31 +02:00
|
|
|
|
{
|
2020-05-07 21:46:33 +02:00
|
|
|
|
for (int j = 0; j < 99; j++)
|
2020-04-08 20:04:31 +02:00
|
|
|
|
{
|
2020-05-11 01:16:01 +02:00
|
|
|
|
int x = 0;
|
2020-05-23 20:37:11 +02:00
|
|
|
|
|
2020-05-11 01:54:47 +02:00
|
|
|
|
if (perlinNoise[i][j] > 0 && perlinNoise[i][j] < 0.15f)
|
2020-05-11 01:16:01 +02:00
|
|
|
|
x = 0;
|
2020-05-11 01:54:47 +02:00
|
|
|
|
else if (perlinNoise[i][j] >= 0.15f && perlinNoise[i][j] < 0.8f)
|
2020-05-11 01:16:01 +02:00
|
|
|
|
x = 1;
|
2020-05-11 01:54:47 +02:00
|
|
|
|
else if (perlinNoise[i][j] >= 0.8f)
|
2020-05-11 01:16:01 +02:00
|
|
|
|
x = 2;
|
2020-04-08 20:04:31 +02:00
|
|
|
|
crops[i, j] = new Crops();
|
2020-05-05 16:27:45 +02:00
|
|
|
|
crops[i, j].setStatus(x);
|
|
|
|
|
crops[i, j].setOriginalStatus();
|
2020-05-07 20:06:34 +02:00
|
|
|
|
x = r.Next(0, 12);
|
2020-05-07 01:55:52 +02:00
|
|
|
|
crops[i, j].setCropType(x, PresetCrops.getPresetCropTypes(x));
|
2020-05-06 16:22:30 +02:00
|
|
|
|
crops[i, j].init();
|
2020-05-10 23:56:52 +02:00
|
|
|
|
|
|
|
|
|
if (crops[i, j].getStatus() == 2)
|
|
|
|
|
{
|
|
|
|
|
dirtCount++;
|
|
|
|
|
}
|
2020-04-08 20:04:31 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-05-10 21:16:24 +02:00
|
|
|
|
for (int i = 0; i < 99; i++)
|
|
|
|
|
{
|
|
|
|
|
for (int j = 0; j < 99; j++)
|
|
|
|
|
{
|
|
|
|
|
if (crops[i, j].getStatus() == 2)
|
|
|
|
|
{
|
|
|
|
|
if (!astar.isReachable(crops, new Vector2((int)i, (int)j), housepos))
|
|
|
|
|
{
|
2020-05-10 23:56:52 +02:00
|
|
|
|
//crops[i, j].setStatus(1);
|
2020-05-10 21:16:24 +02:00
|
|
|
|
dirtCount--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-05-11 00:04:59 +02:00
|
|
|
|
if (dirtCount != 0)
|
2020-05-10 21:16:24 +02:00
|
|
|
|
init(Size, housepos);
|
2020-05-23 20:37:11 +02:00
|
|
|
|
RainPosition.X = r.Next(0, 1900);
|
|
|
|
|
RainPosition.Y = r.Next(0, 1950);
|
|
|
|
|
WindSpeed.X = r.Next(-1, 1);
|
|
|
|
|
WindSpeed.Y = r.Next(-1, 1);
|
2020-05-23 20:55:38 +02:00
|
|
|
|
RainfallMap = PerlinNoise.LoadImage("C:/Users/Oskar/source/repos/PotatoPlanFinal/Game1/Content/Rainfall.png");
|
2020-04-08 20:04:31 +02:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-23 20:37:11 +02:00
|
|
|
|
public Rectangle getRainPosition(int TileSize, int x, int y)
|
|
|
|
|
{
|
|
|
|
|
return new Rectangle((int)(-TileSize * (RainPosition.X - Math.Truncate(RainPosition.X))) + TileSize * x, (int)(-TileSize * (RainPosition.Y - Math.Truncate(RainPosition.Y))) + TileSize * y, TileSize, TileSize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void updateFarm(Vector2 Size, int nDay)
|
2020-04-08 20:04:31 +02:00
|
|
|
|
{
|
2020-05-07 13:53:07 +02:00
|
|
|
|
Update++;
|
|
|
|
|
if (Update == 30)
|
2020-04-08 20:04:31 +02:00
|
|
|
|
{
|
2020-05-07 13:53:07 +02:00
|
|
|
|
for (int i = 0; i < Size.X; i++)
|
2020-04-08 20:04:31 +02:00
|
|
|
|
{
|
2020-05-07 13:53:07 +02:00
|
|
|
|
for (int j = 0; j < Size.Y; j++)
|
|
|
|
|
{
|
2020-05-06 16:22:30 +02:00
|
|
|
|
|
2020-05-23 20:37:11 +02:00
|
|
|
|
crops[i, j].updateCrop(Size, RainfallMap[(int)Math.Round(RainPosition.X) + i][(int)Math.Round(RainPosition.Y) + j].GetBrightness());
|
2020-05-07 13:53:07 +02:00
|
|
|
|
}
|
2020-04-08 20:04:31 +02:00
|
|
|
|
}
|
2020-05-23 20:37:11 +02:00
|
|
|
|
|
2020-05-07 13:53:07 +02:00
|
|
|
|
Update = 0;
|
2020-04-08 20:04:31 +02:00
|
|
|
|
}
|
2020-05-23 20:37:11 +02:00
|
|
|
|
updateRainMapPosition();
|
2020-04-08 20:04:31 +02:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-23 20:37:11 +02:00
|
|
|
|
|
2020-05-03 13:05:05 +02:00
|
|
|
|
//Changes the properties of the tile when the tractor reaches this tile.
|
2020-05-06 16:22:30 +02:00
|
|
|
|
public void setCropStatus(float xfloat, float yfloat)
|
2020-04-08 20:04:31 +02:00
|
|
|
|
{
|
2020-05-06 16:22:30 +02:00
|
|
|
|
int x = (int)xfloat;
|
|
|
|
|
int y = (int)yfloat;
|
2020-05-07 01:55:52 +02:00
|
|
|
|
if (crops[x, y].getStatus() >= 3)
|
2020-04-08 20:04:31 +02:00
|
|
|
|
{
|
2020-05-05 16:27:45 +02:00
|
|
|
|
crops[x, y].setStatus(2);
|
2020-04-08 20:04:31 +02:00
|
|
|
|
}
|
2020-05-05 16:27:45 +02:00
|
|
|
|
else if(crops[x, y].getStatus() == 0)
|
2020-04-08 20:04:31 +02:00
|
|
|
|
{
|
|
|
|
|
//do nothing
|
|
|
|
|
}
|
2020-05-05 16:27:45 +02:00
|
|
|
|
else if (crops[x, y].getStatus() == 2)
|
2020-04-08 20:04:31 +02:00
|
|
|
|
{
|
2020-05-10 01:38:08 +02:00
|
|
|
|
|
2020-05-05 16:27:45 +02:00
|
|
|
|
crops[x, y].setStatus(3);
|
|
|
|
|
crops[x, y].setCropTimer();
|
2020-05-03 13:05:05 +02:00
|
|
|
|
}
|
2020-04-08 20:04:31 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Crops getCrop(int x, int y)
|
|
|
|
|
{
|
|
|
|
|
return crops[x,y];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Crops[,] getCrops()
|
|
|
|
|
{
|
|
|
|
|
return crops;
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-23 20:37:11 +02:00
|
|
|
|
private void updateRainMapPosition()
|
|
|
|
|
{
|
|
|
|
|
float x = WindSpeed.X + (float)r.Next(-5, 5) / 3000;
|
|
|
|
|
float y = WindSpeed.Y + (float)r.Next(-5, 5) / 3000;
|
|
|
|
|
|
|
|
|
|
if (x < 0.02f && x > -0.02f)
|
|
|
|
|
{
|
|
|
|
|
WindSpeed.X = x;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (y < 0.02f && y > -0.02f)
|
|
|
|
|
{
|
|
|
|
|
WindSpeed.Y = y;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (WindSpeed.X > 0 && RainPosition.X < 1900)
|
|
|
|
|
{
|
|
|
|
|
RainPosition.X = RainPosition.X + WindSpeed.X;
|
|
|
|
|
}
|
|
|
|
|
else if (WindSpeed.X < 0 && RainPosition.X > 1)
|
|
|
|
|
{
|
|
|
|
|
RainPosition.X = RainPosition.X + WindSpeed.X;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (WindSpeed.Y > 0 && RainPosition.Y < 1900)
|
|
|
|
|
{
|
|
|
|
|
RainPosition.Y = RainPosition.Y + WindSpeed.Y;
|
|
|
|
|
}
|
|
|
|
|
else if (WindSpeed.Y < 0 && RainPosition.Y > 1)
|
|
|
|
|
{
|
|
|
|
|
RainPosition.Y = RainPosition.Y + WindSpeed.Y;
|
|
|
|
|
}
|
|
|
|
|
resetBitMap++;
|
|
|
|
|
if (resetBitMap == 20000)
|
|
|
|
|
{
|
|
|
|
|
RainPosition.X = r.Next(700, 1300);
|
|
|
|
|
RainPosition.Y = r.Next(700, 1300);
|
|
|
|
|
resetBitMap = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-05 16:27:45 +02:00
|
|
|
|
public void setNewHousePos(Vector2 pos, bool newState)
|
|
|
|
|
{
|
|
|
|
|
crops[(int)pos.X, (int)pos.Y].setHousePos(newState);
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-06 22:37:04 +02:00
|
|
|
|
public CropTypes getPresetCropTypes(int Index)
|
|
|
|
|
{
|
2020-05-07 20:06:34 +02:00
|
|
|
|
return PresetCrops.getPresetCropTypes(Index - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setCropType(int x, int y, int Type)
|
|
|
|
|
{
|
|
|
|
|
crops[x, y].setCropType(Type, PresetCrops.getPresetCropTypes(Type));
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-07 21:46:33 +02:00
|
|
|
|
public void UpdatePreferedCrops(Vector2 Size)
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < Size.X; i++)
|
|
|
|
|
{
|
|
|
|
|
for (int j = 0; j < Size.X; j++)
|
|
|
|
|
{
|
2020-05-10 19:21:52 +02:00
|
|
|
|
if (crops[i, j].getStatus() != 3)
|
|
|
|
|
{
|
|
|
|
|
int x = getHighestProductionRate(i, j);
|
|
|
|
|
crops[i, j].setCropType(x, PresetCrops.getPresetCropTypes(x));
|
|
|
|
|
}
|
2020-05-07 21:46:33 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int getHighestProductionRate(int x, int y)
|
2020-05-07 20:06:34 +02:00
|
|
|
|
{
|
2020-05-07 21:46:33 +02:00
|
|
|
|
int i = 1, holderIndex = 0;
|
|
|
|
|
float holder = 0, SampleHolder = 0;
|
2020-05-07 20:06:34 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
2020-05-07 21:46:33 +02:00
|
|
|
|
holder = getProductionRate(x, y, i);
|
|
|
|
|
if (SampleHolder < holder)
|
2020-05-07 20:06:34 +02:00
|
|
|
|
{
|
|
|
|
|
holderIndex = i;
|
2020-05-07 21:46:33 +02:00
|
|
|
|
SampleHolder = holder;
|
2020-05-07 20:06:34 +02:00
|
|
|
|
}
|
|
|
|
|
i++;
|
|
|
|
|
} while (i < 12);
|
|
|
|
|
return holderIndex;
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-23 20:37:11 +02:00
|
|
|
|
public Color getRainAmount(int x, int y)
|
|
|
|
|
{
|
|
|
|
|
if (RainfallMap[x + (int)Math.Round(RainPosition.X)][y + (int)Math.Round(RainPosition.Y)].GetBrightness() < 0.60f)
|
|
|
|
|
{
|
|
|
|
|
return Color.FromNonPremultiplied(255, 255, 255, 0);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return Color.FromNonPremultiplied(255, 255, 255, (int)(300 * RainfallMap[x + (int)Math.Round(RainPosition.X)][y + (int)Math.Round(RainPosition.Y)].GetBrightness()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-07 20:06:34 +02:00
|
|
|
|
public float getProductionRate(int x, int y, int Type)
|
|
|
|
|
{
|
|
|
|
|
return crops[x, y].getProductionRate(PresetCrops.getPresetCropTypes(Type));
|
2020-05-06 22:37:04 +02:00
|
|
|
|
}
|
2020-04-08 20:04:31 +02:00
|
|
|
|
}
|