merge with dev
BIN
Game1/Content/BarleyIcon.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
@ -13,6 +13,18 @@
|
|||||||
|
|
||||||
#---------------------------------- Content ---------------------------------#
|
#---------------------------------- Content ---------------------------------#
|
||||||
|
|
||||||
|
#begin BarleyIcon.png
|
||||||
|
/importer:TextureImporter
|
||||||
|
/processor:TextureProcessor
|
||||||
|
/processorParam:ColorKeyColor=255,0,255,255
|
||||||
|
/processorParam:ColorKeyEnabled=True
|
||||||
|
/processorParam:GenerateMipmaps=False
|
||||||
|
/processorParam:PremultiplyAlpha=True
|
||||||
|
/processorParam:ResizeToPowerOfTwo=False
|
||||||
|
/processorParam:MakeSquare=False
|
||||||
|
/processorParam:TextureFormat=Color
|
||||||
|
/build:BarleyIcon.png
|
||||||
|
|
||||||
#begin BerriesIcon.png
|
#begin BerriesIcon.png
|
||||||
/importer:TextureImporter
|
/importer:TextureImporter
|
||||||
/processor:TextureProcessor
|
/processor:TextureProcessor
|
||||||
@ -37,6 +49,18 @@
|
|||||||
/processorParam:TextureFormat=Color
|
/processorParam:TextureFormat=Color
|
||||||
/build:CarronIcon.png;CarrotIcon.png
|
/build:CarronIcon.png;CarrotIcon.png
|
||||||
|
|
||||||
|
#begin CottonIcon.png
|
||||||
|
/importer:TextureImporter
|
||||||
|
/processor:TextureProcessor
|
||||||
|
/processorParam:ColorKeyColor=255,0,255,255
|
||||||
|
/processorParam:ColorKeyEnabled=True
|
||||||
|
/processorParam:GenerateMipmaps=False
|
||||||
|
/processorParam:PremultiplyAlpha=True
|
||||||
|
/processorParam:ResizeToPowerOfTwo=False
|
||||||
|
/processorParam:MakeSquare=False
|
||||||
|
/processorParam:TextureFormat=Color
|
||||||
|
/build:CottonIcon.png
|
||||||
|
|
||||||
#begin Crop.png
|
#begin Crop.png
|
||||||
/importer:TextureImporter
|
/importer:TextureImporter
|
||||||
/processor:TextureProcessor
|
/processor:TextureProcessor
|
||||||
@ -56,6 +80,18 @@
|
|||||||
/processorParam:TextureFormat=Compressed
|
/processorParam:TextureFormat=Compressed
|
||||||
/build:Font.spritefont
|
/build:Font.spritefont
|
||||||
|
|
||||||
|
#begin GroundNutsIcon.png
|
||||||
|
/importer:TextureImporter
|
||||||
|
/processor:TextureProcessor
|
||||||
|
/processorParam:ColorKeyColor=255,0,255,255
|
||||||
|
/processorParam:ColorKeyEnabled=True
|
||||||
|
/processorParam:GenerateMipmaps=False
|
||||||
|
/processorParam:PremultiplyAlpha=True
|
||||||
|
/processorParam:ResizeToPowerOfTwo=False
|
||||||
|
/processorParam:MakeSquare=False
|
||||||
|
/processorParam:TextureFormat=Color
|
||||||
|
/build:GroundNutsIcon.png
|
||||||
|
|
||||||
#begin house.png
|
#begin house.png
|
||||||
/importer:TextureImporter
|
/importer:TextureImporter
|
||||||
/processor:TextureProcessor
|
/processor:TextureProcessor
|
||||||
@ -68,6 +104,18 @@
|
|||||||
/processorParam:TextureFormat=Color
|
/processorParam:TextureFormat=Color
|
||||||
/build:house.png
|
/build:house.png
|
||||||
|
|
||||||
|
#begin MaizeIcon.png
|
||||||
|
/importer:TextureImporter
|
||||||
|
/processor:TextureProcessor
|
||||||
|
/processorParam:ColorKeyColor=255,0,255,255
|
||||||
|
/processorParam:ColorKeyEnabled=True
|
||||||
|
/processorParam:GenerateMipmaps=False
|
||||||
|
/processorParam:PremultiplyAlpha=True
|
||||||
|
/processorParam:ResizeToPowerOfTwo=False
|
||||||
|
/processorParam:MakeSquare=False
|
||||||
|
/processorParam:TextureFormat=Color
|
||||||
|
/build:MaizeIcon.png
|
||||||
|
|
||||||
#begin Markers.png
|
#begin Markers.png
|
||||||
/importer:TextureImporter
|
/importer:TextureImporter
|
||||||
/processor:TextureProcessor
|
/processor:TextureProcessor
|
||||||
@ -80,6 +128,18 @@
|
|||||||
/processorParam:TextureFormat=Color
|
/processorParam:TextureFormat=Color
|
||||||
/build:Markers.png
|
/build:Markers.png
|
||||||
|
|
||||||
|
#begin MilletsIcon.png
|
||||||
|
/importer:TextureImporter
|
||||||
|
/processor:TextureProcessor
|
||||||
|
/processorParam:ColorKeyColor=255,0,255,255
|
||||||
|
/processorParam:ColorKeyEnabled=True
|
||||||
|
/processorParam:GenerateMipmaps=False
|
||||||
|
/processorParam:PremultiplyAlpha=True
|
||||||
|
/processorParam:ResizeToPowerOfTwo=False
|
||||||
|
/processorParam:MakeSquare=False
|
||||||
|
/processorParam:TextureFormat=Color
|
||||||
|
/build:MilletsIcon.png
|
||||||
|
|
||||||
#begin Mountain.png
|
#begin Mountain.png
|
||||||
/importer:TextureImporter
|
/importer:TextureImporter
|
||||||
/processor:TextureProcessor
|
/processor:TextureProcessor
|
||||||
@ -104,6 +164,18 @@
|
|||||||
/processorParam:TextureFormat=Color
|
/processorParam:TextureFormat=Color
|
||||||
/build:MouseCursor.png
|
/build:MouseCursor.png
|
||||||
|
|
||||||
|
#begin PaddyIcon.png
|
||||||
|
/importer:TextureImporter
|
||||||
|
/processor:TextureProcessor
|
||||||
|
/processorParam:ColorKeyColor=255,0,255,255
|
||||||
|
/processorParam:ColorKeyEnabled=True
|
||||||
|
/processorParam:GenerateMipmaps=False
|
||||||
|
/processorParam:PremultiplyAlpha=True
|
||||||
|
/processorParam:ResizeToPowerOfTwo=False
|
||||||
|
/processorParam:MakeSquare=False
|
||||||
|
/processorParam:TextureFormat=Color
|
||||||
|
/build:PaddyIcon.png
|
||||||
|
|
||||||
#begin Plantable.png
|
#begin Plantable.png
|
||||||
/importer:TextureImporter
|
/importer:TextureImporter
|
||||||
/processor:TextureProcessor
|
/processor:TextureProcessor
|
||||||
@ -152,6 +224,42 @@
|
|||||||
/processorParam:TextureFormat=Color
|
/processorParam:TextureFormat=Color
|
||||||
/build:ProgressionBarStatus.png
|
/build:ProgressionBarStatus.png
|
||||||
|
|
||||||
|
#begin PulsesIcon.png
|
||||||
|
/importer:TextureImporter
|
||||||
|
/processor:TextureProcessor
|
||||||
|
/processorParam:ColorKeyColor=255,0,255,255
|
||||||
|
/processorParam:ColorKeyEnabled=True
|
||||||
|
/processorParam:GenerateMipmaps=False
|
||||||
|
/processorParam:PremultiplyAlpha=True
|
||||||
|
/processorParam:ResizeToPowerOfTwo=False
|
||||||
|
/processorParam:MakeSquare=False
|
||||||
|
/processorParam:TextureFormat=Color
|
||||||
|
/build:PulsesIcon.png
|
||||||
|
|
||||||
|
#begin SeedOilIcon.png
|
||||||
|
/importer:TextureImporter
|
||||||
|
/processor:TextureProcessor
|
||||||
|
/processorParam:ColorKeyColor=255,0,255,255
|
||||||
|
/processorParam:ColorKeyEnabled=True
|
||||||
|
/processorParam:GenerateMipmaps=False
|
||||||
|
/processorParam:PremultiplyAlpha=True
|
||||||
|
/processorParam:ResizeToPowerOfTwo=False
|
||||||
|
/processorParam:MakeSquare=False
|
||||||
|
/processorParam:TextureFormat=Color
|
||||||
|
/build:SeedOilIcon.png
|
||||||
|
|
||||||
|
#begin SugarcaneIcon.png
|
||||||
|
/importer:TextureImporter
|
||||||
|
/processor:TextureProcessor
|
||||||
|
/processorParam:ColorKeyColor=255,0,255,255
|
||||||
|
/processorParam:ColorKeyEnabled=True
|
||||||
|
/processorParam:GenerateMipmaps=False
|
||||||
|
/processorParam:PremultiplyAlpha=True
|
||||||
|
/processorParam:ResizeToPowerOfTwo=False
|
||||||
|
/processorParam:MakeSquare=False
|
||||||
|
/processorParam:TextureFormat=Color
|
||||||
|
/build:SugarcaneIcon.png
|
||||||
|
|
||||||
#begin Tile.png
|
#begin Tile.png
|
||||||
/importer:TextureImporter
|
/importer:TextureImporter
|
||||||
/processor:TextureProcessor
|
/processor:TextureProcessor
|
||||||
@ -176,6 +284,18 @@
|
|||||||
/processorParam:TextureFormat=Color
|
/processorParam:TextureFormat=Color
|
||||||
/build:tileunplantable.png
|
/build:tileunplantable.png
|
||||||
|
|
||||||
|
#begin TobaccoIcon.png
|
||||||
|
/importer:TextureImporter
|
||||||
|
/processor:TextureProcessor
|
||||||
|
/processorParam:ColorKeyColor=255,0,255,255
|
||||||
|
/processorParam:ColorKeyEnabled=True
|
||||||
|
/processorParam:GenerateMipmaps=False
|
||||||
|
/processorParam:PremultiplyAlpha=True
|
||||||
|
/processorParam:ResizeToPowerOfTwo=False
|
||||||
|
/processorParam:MakeSquare=False
|
||||||
|
/processorParam:TextureFormat=Color
|
||||||
|
/build:TobaccoIcon.png
|
||||||
|
|
||||||
#begin Tractor.png
|
#begin Tractor.png
|
||||||
/importer:TextureImporter
|
/importer:TextureImporter
|
||||||
/processor:TextureProcessor
|
/processor:TextureProcessor
|
||||||
|
BIN
Game1/Content/CottonIcon.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
Game1/Content/GroundNutsIcon.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
Game1/Content/MaizeIcon.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
Game1/Content/MilletsIcon.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
Game1/Content/PaddyIcon.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
Game1/Content/PulsesIcon.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
Game1/Content/SeedOilIcon.png
Normal file
After Width: | Height: | Size: 631 B |
BIN
Game1/Content/SugarcaneIcon.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
Game1/Content/TobaccoIcon.png
Normal file
After Width: | Height: | Size: 747 B |
@ -14,7 +14,7 @@ namespace Game1
|
|||||||
SpriteBatch spriteBatch;
|
SpriteBatch spriteBatch;
|
||||||
SpriteFont Bold;
|
SpriteFont Bold;
|
||||||
private Texture2D[] tile = new Texture2D[5];
|
private Texture2D[] tile = new Texture2D[5];
|
||||||
private Texture2D[] Crops = new Texture2D[5];
|
private Texture2D[] Crops = new Texture2D[12];
|
||||||
private Texture2D tractor;
|
private Texture2D tractor;
|
||||||
private Texture2D house;
|
private Texture2D house;
|
||||||
private Texture2D markers;
|
private Texture2D markers;
|
||||||
@ -50,17 +50,18 @@ namespace Game1
|
|||||||
// TODO: Add your initialization logic here
|
// TODO: Add your initialization logic here
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
|
|
||||||
cropTypesNames[0] = "Barley";
|
cropTypesNames[0] = "None";
|
||||||
cropTypesNames[1] = "Cotton";
|
cropTypesNames[1] = "Barley";
|
||||||
cropTypesNames[2] = "Ground Nuts";
|
cropTypesNames[2] = "Cotton";
|
||||||
cropTypesNames[3] = "Maize";
|
cropTypesNames[3] = "Ground Nuts";
|
||||||
cropTypesNames[4] = "Millets";
|
cropTypesNames[4] = "Maize";
|
||||||
cropTypesNames[5] = "Oil Seeds";
|
cropTypesNames[5] = "Millets";
|
||||||
cropTypesNames[6] = "Paddy";
|
cropTypesNames[6] = "Oil Seeds";
|
||||||
cropTypesNames[7] = "Pulses";
|
cropTypesNames[7] = "Paddy";
|
||||||
cropTypesNames[8] = "Sugarcane";
|
cropTypesNames[8] = "Pulses";
|
||||||
cropTypesNames[9] = "Tobacco";
|
cropTypesNames[9] = "Sugarcane";
|
||||||
cropTypesNames[10] = "Wheat";
|
cropTypesNames[10] = "Tobacco";
|
||||||
|
cropTypesNames[11] = "Wheat";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -95,13 +96,25 @@ namespace Game1
|
|||||||
tile[0] = Content.Load<Texture2D>("Mountain");
|
tile[0] = Content.Load<Texture2D>("Mountain");
|
||||||
tile[1] = Content.Load<Texture2D>("tileunplantable");
|
tile[1] = Content.Load<Texture2D>("tileunplantable");
|
||||||
tile[2] = Content.Load<Texture2D>("Plantable");
|
tile[2] = Content.Load<Texture2D>("Plantable");
|
||||||
tile[3] = Content.Load<Texture2D>("Planted");
|
tile[3] = Content.Load<Texture2D>("Crop");
|
||||||
tile[4] = Content.Load<Texture2D>("Crop");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Crops[0] = Content.Load<Texture2D>("Markers");
|
||||||
|
Crops[1] = Content.Load<Texture2D>("BarleyIcon");
|
||||||
|
Crops[2] = Content.Load<Texture2D>("CottonIcon");
|
||||||
|
Crops[3] = Content.Load<Texture2D>("GroundNutsIcon");
|
||||||
|
Crops[4] = Content.Load<Texture2D>("MaizeIcon");
|
||||||
|
Crops[5] = Content.Load<Texture2D>("MilletsIcon");
|
||||||
|
Crops[6] = Content.Load<Texture2D>("SeedOilIcon");
|
||||||
|
Crops[7] = Content.Load<Texture2D>("PaddyIcon");
|
||||||
|
Crops[8] = Content.Load<Texture2D>("PulsesIcon");
|
||||||
|
Crops[9] = Content.Load<Texture2D>("SugarcaneIcon");
|
||||||
|
Crops[10] = Content.Load<Texture2D>("TobaccoIcon");
|
||||||
|
Crops[11] = Content.Load<Texture2D>("WheatIcon");
|
||||||
|
|
||||||
Crops[0] = Content.Load<Texture2D>("CarrotIcon");
|
|
||||||
Crops[1] = Content.Load<Texture2D>("WheatIcon");
|
|
||||||
Crops[2] = Content.Load<Texture2D>("BerriesIcon"); //Replace 2 and 3 with the new crop Textures
|
|
||||||
Crops[3] = Content.Load<Texture2D>("TreePlantationIcon");
|
|
||||||
|
|
||||||
ProgressionBar = Content.Load<Texture2D>("ProgressionBar");
|
ProgressionBar = Content.Load<Texture2D>("ProgressionBar");
|
||||||
ProgressionBarStatus = Content.Load<Texture2D>("ProgressionBarStatus");
|
ProgressionBarStatus = Content.Load<Texture2D>("ProgressionBarStatus");
|
||||||
@ -168,7 +181,7 @@ namespace Game1
|
|||||||
|
|
||||||
for (int i = 0; i < 5; i++)
|
for (int i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
spriteBatch.Draw(ProgressionBar, new Rectangle(i * 227, (int)(input.getSize().Y * (input.getTileSize() + input.getSpacing())), 5, 300), Color.White);
|
spriteBatch.Draw(ProgressionBar, new Rectangle(i * 227, (int)(input.getSize().Y * (input.getTileSize() + input.getSpacing())), 5, 295), Color.White);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 15; i++)
|
for (int i = 0; i < 15; i++)
|
||||||
{
|
{
|
||||||
@ -217,6 +230,9 @@ namespace Game1
|
|||||||
for (int j = 0; j < input.getSize().Y; j++)
|
for (int j = 0; j < input.getSize().Y; j++)
|
||||||
{
|
{
|
||||||
Rectangle tilePos = new Rectangle(i * (input.getSpacingTile()), j * (input.getSpacingTile()), input.getTileSize(), input.getTileSize());
|
Rectangle tilePos = new Rectangle(i * (input.getSpacingTile()), j * (input.getSpacingTile()), input.getTileSize(), input.getTileSize());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
spriteBatch.Draw(tile[tractorUnit.getFarm().getCrop(i, j).getStatus()], tilePos, Time.GetTimeOfDay());
|
spriteBatch.Draw(tile[tractorUnit.getFarm().getCrop(i, j).getStatus()], tilePos, Time.GetTimeOfDay());
|
||||||
if (tilePos.Intersects(mousePosition))
|
if (tilePos.Intersects(mousePosition))
|
||||||
{
|
{
|
||||||
@ -232,15 +248,22 @@ namespace Game1
|
|||||||
x = i;
|
x = i;
|
||||||
y = j;
|
y = j;
|
||||||
}
|
}
|
||||||
|
if (tractorUnit.getFarm().getCrop(i, j).getStatus() != 0 && tractorUnit.getFarm().getCrop(i, j).getStatus() != 1)
|
||||||
|
{
|
||||||
|
spriteBatch.Draw(Crops[tractorUnit.getFarm().getCrop(i, j).getCropType()], new Rectangle(i * input.getSpacingTile(), j * input.getSpacingTile(), input.getTileSize(), input.getTileSize()), Color.White);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ((tractorUnit.getFarm().getCrop(i, j).getStatus() == 4))
|
else
|
||||||
{
|
{
|
||||||
spriteBatch.Draw(ProgressionBar, new Rectangle(i * (input.getSpacingTile()) + input.getTileSize() - input.getTileSize() / 3, j * (input.getSpacingTile()), input.getTileSize() / 3, input.getTileSize()), Color.White);
|
if (tractorUnit.getFarm().getCrop(i, j).getStatus() != 0 && tractorUnit.getFarm().getCrop(i, j).getStatus() != 1)
|
||||||
spriteBatch.Draw(ProgressionBarStatus, new Rectangle(i * (input.getSpacingTile()) + input.getTileSize() - input.getTileSize() / 4, j * (input.getSpacingTile()) + input.getTileSize() / 3, input.getTileSize() / 4, tractorUnit.getFarm().getCrop(i, j).getCropTimerBar((input.getTileSize())) + 1), Color.White);
|
{
|
||||||
}
|
if ((tractorUnit.getFarm().getCrop(i, j).getStatus() == 3))
|
||||||
if (tractorUnit.getFarm().getCrop(i, j).getStatus() != 0 && tractorUnit.getFarm().getCrop(i, j).getStatus() != 1)
|
{
|
||||||
{
|
spriteBatch.Draw(ProgressionBar, new Rectangle(i * (input.getSpacingTile()) + input.getTileSize() - input.getTileSize() / 3, j * (input.getSpacingTile()), input.getTileSize() / 3, input.getTileSize()), Color.White);
|
||||||
spriteBatch.Draw(Crops[tractorUnit.getFarm().getCrop(i, j).getCropType()], new Rectangle(i * (input.getSpacingTile()) + input.getTileSize() - input.getTileSize() / 3, j * (input.getSpacingTile()), input.getTileSize() / 3, input.getTileSize() / 3), Color.White);
|
spriteBatch.Draw(ProgressionBarStatus, new Rectangle(i * (input.getSpacingTile()) + input.getTileSize() - input.getTileSize() / 4, j * (input.getSpacingTile()) + input.getTileSize() / 3, input.getTileSize() / 4, tractorUnit.getFarm().getCrop(i, j).getCropTimerBar((input.getTileSize())) + 1), Color.White);
|
||||||
|
}
|
||||||
|
spriteBatch.Draw(Crops[tractorUnit.getFarm().getCrop(i, j).getCropType()], new Rectangle((int)(i * (input.getSpacingTile()) + input.getTileSize() - input.getTileSize() / 2.5), j * (input.getSpacingTile()), (int)(input.getTileSize() / 2.5), input.getTileSize() / 3), Color.White);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,21 @@
|
|||||||
<TargetFrameworkProfile />
|
<TargetFrameworkProfile />
|
||||||
<NuGetPackageImportStamp>
|
<NuGetPackageImportStamp>
|
||||||
</NuGetPackageImportStamp>
|
</NuGetPackageImportStamp>
|
||||||
|
<PublishUrl>publish\</PublishUrl>
|
||||||
|
<Install>true</Install>
|
||||||
|
<InstallFrom>Disk</InstallFrom>
|
||||||
|
<UpdateEnabled>false</UpdateEnabled>
|
||||||
|
<UpdateMode>Foreground</UpdateMode>
|
||||||
|
<UpdateInterval>7</UpdateInterval>
|
||||||
|
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||||
|
<UpdatePeriodically>false</UpdatePeriodically>
|
||||||
|
<UpdateRequired>false</UpdateRequired>
|
||||||
|
<MapFileExtensions>true</MapFileExtensions>
|
||||||
|
<ApplicationRevision>0</ApplicationRevision>
|
||||||
|
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||||
|
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||||
|
<UseApplicationTrust>false</UseApplicationTrust>
|
||||||
|
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
@ -63,10 +78,15 @@
|
|||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
<Prefer32Bit>true</Prefer32Bit>
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Game1.cs" />
|
<Compile Include="Game1.cs" />
|
||||||
<Compile Include="Program.cs" />
|
<Compile Include="Program.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="Sources\Crops\CropType.cs" />
|
||||||
|
<Compile Include="Sources\Crops\CropTypesHolder.cs" />
|
||||||
<Compile Include="Sources\Crops\SoilProperties.cs" />
|
<Compile Include="Sources\Crops\SoilProperties.cs" />
|
||||||
<Compile Include="Sources\Objects\DayNightCycle.cs" />
|
<Compile Include="Sources\Objects\DayNightCycle.cs" />
|
||||||
<Compile Include="Sources\Objects\HandleRotation.cs" />
|
<Compile Include="Sources\Objects\HandleRotation.cs" />
|
||||||
@ -92,8 +112,9 @@
|
|||||||
<Compile Include="Sources\Pathing\A-Star\PathSaver\MinHeap.cs" />
|
<Compile Include="Sources\Pathing\A-Star\PathSaver\MinHeap.cs" />
|
||||||
<Compile Include="Sources\Pathing\A-Star\PathSaver\Nodes.cs" />
|
<Compile Include="Sources\Pathing\A-Star\PathSaver\Nodes.cs" />
|
||||||
<Compile Include="Sources\Pathing\A-Star\PathSaver\Path.cs" />
|
<Compile Include="Sources\Pathing\A-Star\PathSaver\Path.cs" />
|
||||||
<Compile Include="Sources\Pathing\A-Star\PathSaver\PriorityQueue.cs" />
|
|
||||||
<Compile Include="Sources\Controlls\Controller.cs" />
|
<Compile Include="Sources\Controlls\Controller.cs" />
|
||||||
|
<Compile Include="Sources\Pathing\PQEntry.cs" />
|
||||||
|
<Compile Include="Sources\Pathing\PriorityQueueC5.cs" />
|
||||||
<Compile Include="Sources\Smart\AI.cs" />
|
<Compile Include="Sources\Smart\AI.cs" />
|
||||||
<Compile Include="Sources\Smart\ScoreSystem.cs" />
|
<Compile Include="Sources\Smart\ScoreSystem.cs" />
|
||||||
<Compile Include="Sources\Smart\SmartTractor.cs" />
|
<Compile Include="Sources\Smart\SmartTractor.cs" />
|
||||||
@ -173,6 +194,9 @@
|
|||||||
</PackageReference>
|
</PackageReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="C5">
|
||||||
|
<Version>2.5.3</Version>
|
||||||
|
</PackageReference>
|
||||||
<PackageReference Include="LightGBM">
|
<PackageReference Include="LightGBM">
|
||||||
<Version>2.3.1</Version>
|
<Version>2.3.1</Version>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
@ -210,6 +234,18 @@
|
|||||||
<Version>4.11.0</Version>
|
<Version>4.11.0</Version>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<BootstrapperPackage Include=".NETFramework,Version=v4.6.1">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>Microsoft .NET Framework 4.6.1 %28x86 and x64%29</ProductName>
|
||||||
|
<Install>true</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||||
|
<Install>false</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<Import Project="$(MSBuildExtensionsPath)\MonoGame\v3.0\MonoGame.Content.Builder.targets" />
|
<Import Project="$(MSBuildExtensionsPath)\MonoGame\v3.0\MonoGame.Content.Builder.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
@ -59,7 +59,7 @@ class Controller
|
|||||||
public int controllSpeed(int Speed)
|
public int controllSpeed(int Speed)
|
||||||
{
|
{
|
||||||
KeyboardState state = Keyboard.GetState();
|
KeyboardState state = Keyboard.GetState();
|
||||||
if (state.IsKeyDown(Keys.Right))
|
if (state.IsKeyDown(Keys.Right) && Speed < 350)
|
||||||
{
|
{
|
||||||
Speed++;
|
Speed++;
|
||||||
}
|
}
|
||||||
|
31
Game1/Sources/Crops/CropType.cs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class CropTypes
|
||||||
|
{
|
||||||
|
|
||||||
|
public string[] soilType = new string[3];
|
||||||
|
public int[] Times = new int[3];
|
||||||
|
public float Temparature;
|
||||||
|
public float Humidity;
|
||||||
|
public float Moisture;
|
||||||
|
public float Nitrogen;
|
||||||
|
public float Potassium;
|
||||||
|
public float Phosphorous;
|
||||||
|
|
||||||
|
|
||||||
|
public CropTypes()
|
||||||
|
{
|
||||||
|
soilType = new string[3];
|
||||||
|
Times = new int[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
175
Game1/Sources/Crops/CropTypesHolder.cs
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
|
||||||
|
class CropTypesHolder
|
||||||
|
{
|
||||||
|
private CropTypes[] cropTypes = new CropTypes[12];
|
||||||
|
|
||||||
|
public void init()
|
||||||
|
{
|
||||||
|
// None
|
||||||
|
cropTypes[0] = new CropTypes();
|
||||||
|
cropTypes[0].soilType[0] = "None";
|
||||||
|
cropTypes[0].soilType[1] = null;
|
||||||
|
cropTypes[0].soilType[2] = null;
|
||||||
|
cropTypes[0].Temparature = 0f;
|
||||||
|
cropTypes[0].Humidity = 0f;
|
||||||
|
cropTypes[0].Moisture = 0f;
|
||||||
|
cropTypes[0].Nitrogen = 0f;
|
||||||
|
cropTypes[0].Potassium = 0f;
|
||||||
|
cropTypes[0].Phosphorous = 0f;
|
||||||
|
|
||||||
|
// Barley
|
||||||
|
cropTypes[1] = new CropTypes();
|
||||||
|
cropTypes[1].soilType[0] = "Sandy";
|
||||||
|
cropTypes[1].soilType[1] = null;
|
||||||
|
cropTypes[1].soilType[2] = null;
|
||||||
|
cropTypes[1].Temparature = 30.1f;
|
||||||
|
cropTypes[1].Humidity = 59.0f;
|
||||||
|
cropTypes[1].Moisture = 41.7f;
|
||||||
|
cropTypes[1].Nitrogen = 25 + 12.6f;
|
||||||
|
cropTypes[1].Potassium = 14 + 5.3f;
|
||||||
|
cropTypes[1].Phosphorous = 30 + 26.0f;
|
||||||
|
|
||||||
|
|
||||||
|
// Cotton
|
||||||
|
cropTypes[2] = new CropTypes();
|
||||||
|
cropTypes[2].soilType[0] = "Red";
|
||||||
|
cropTypes[2].Times[0] = 5;
|
||||||
|
cropTypes[2].soilType[1] = "Black";
|
||||||
|
cropTypes[2].Times[1] = 4;
|
||||||
|
cropTypes[2].soilType[2] = "Loamy";
|
||||||
|
cropTypes[2].Times[2] = 3;
|
||||||
|
cropTypes[2].Temparature = 30.4f;
|
||||||
|
cropTypes[2].Humidity = 59.6f;
|
||||||
|
cropTypes[2].Moisture = 63.2f;
|
||||||
|
cropTypes[2].Nitrogen = 25 + 16.4f;
|
||||||
|
cropTypes[2].Potassium = 14 + 3.3f;
|
||||||
|
cropTypes[2].Phosphorous = 30 + 23.8f;
|
||||||
|
|
||||||
|
// Ground Nuts
|
||||||
|
cropTypes[3] = new CropTypes();
|
||||||
|
cropTypes[3].soilType[0] = "Red";
|
||||||
|
cropTypes[3].soilType[1] = null;
|
||||||
|
cropTypes[3].soilType[2] = null;
|
||||||
|
cropTypes[3].Temparature = 30.1f;
|
||||||
|
cropTypes[3].Humidity = 59.1f;
|
||||||
|
cropTypes[3].Moisture = 33.1f;
|
||||||
|
cropTypes[3].Nitrogen = 25 + 23.3f;
|
||||||
|
cropTypes[3].Potassium = 14 + 2.0f;
|
||||||
|
cropTypes[3].Phosphorous = 30 + 21.6f;
|
||||||
|
|
||||||
|
|
||||||
|
// Maize
|
||||||
|
cropTypes[4] = new CropTypes();
|
||||||
|
cropTypes[4].soilType[0] = "Sandy";
|
||||||
|
cropTypes[4].soilType[1] = null;
|
||||||
|
cropTypes[4].soilType[2] = null;
|
||||||
|
cropTypes[4].Temparature = 29.0f;
|
||||||
|
cropTypes[4].Humidity = 57.3f;
|
||||||
|
cropTypes[4].Moisture = 42.2f;
|
||||||
|
cropTypes[4].Nitrogen = 25 + 18.3f;
|
||||||
|
cropTypes[4].Potassium = 14 + 5.7f;
|
||||||
|
cropTypes[4].Phosphorous = 30 + 18.7f;
|
||||||
|
|
||||||
|
// Millets
|
||||||
|
cropTypes[5] = new CropTypes();
|
||||||
|
cropTypes[5].soilType[0] = "Sandy";
|
||||||
|
cropTypes[5].Times[0] = 7;
|
||||||
|
cropTypes[5].soilType[1] = "Black";
|
||||||
|
cropTypes[5].Times[0] = 4;
|
||||||
|
cropTypes[5].soilType[2] = null;
|
||||||
|
cropTypes[5].Temparature = 29.5f;
|
||||||
|
cropTypes[5].Humidity = 57.3f;
|
||||||
|
cropTypes[5].Moisture = 38.5f;
|
||||||
|
cropTypes[5].Nitrogen = 25 + 23.2f;
|
||||||
|
cropTypes[5].Potassium = 14 + 0.1f;
|
||||||
|
cropTypes[5].Phosphorous = 30 + 14.4f;
|
||||||
|
|
||||||
|
//Oil Seeds
|
||||||
|
cropTypes[6] = new CropTypes();
|
||||||
|
cropTypes[6].soilType[0] = "Black";
|
||||||
|
cropTypes[6].soilType[1] = null;
|
||||||
|
cropTypes[6].soilType[2] = null;
|
||||||
|
cropTypes[6].Temparature = 30.3f;
|
||||||
|
cropTypes[6].Humidity = 59.1f;
|
||||||
|
cropTypes[6].Moisture = 32.1f;
|
||||||
|
cropTypes[6].Nitrogen = 25 + 19.0f;
|
||||||
|
cropTypes[6].Potassium = 14 + 2.3f;
|
||||||
|
cropTypes[6].Phosphorous = 30 + 17.3f;
|
||||||
|
|
||||||
|
//Paddys
|
||||||
|
cropTypes[7] = new CropTypes();
|
||||||
|
cropTypes[7].soilType[0] = "Clayey";
|
||||||
|
cropTypes[7].soilType[1] = null;
|
||||||
|
cropTypes[7].soilType[2] = null;
|
||||||
|
cropTypes[7].Temparature = 31.2f;
|
||||||
|
cropTypes[7].Humidity = 60.4f;
|
||||||
|
cropTypes[7].Moisture = 41.5f;
|
||||||
|
cropTypes[7].Nitrogen = 25 + 20.8f;
|
||||||
|
cropTypes[7].Potassium = 14 + 3.7f;
|
||||||
|
cropTypes[7].Phosphorous = 30 + 16.3f;
|
||||||
|
|
||||||
|
//Pulses
|
||||||
|
cropTypes[8] = new CropTypes();
|
||||||
|
cropTypes[8].soilType[0] = "Clayey";
|
||||||
|
cropTypes[8].soilType[1] = null;
|
||||||
|
cropTypes[8].soilType[2] = null;
|
||||||
|
cropTypes[8].Temparature = 27.8f;
|
||||||
|
cropTypes[8].Humidity = 54.9f;
|
||||||
|
cropTypes[8].Moisture = 34.1f;
|
||||||
|
cropTypes[8].Nitrogen = 25 + 18.4f;
|
||||||
|
cropTypes[8].Potassium = 14 + 4.2f;
|
||||||
|
cropTypes[8].Phosphorous = 30 + 17.5f;
|
||||||
|
|
||||||
|
//Sugarcane
|
||||||
|
cropTypes[9] = new CropTypes();
|
||||||
|
cropTypes[9].soilType[0] = "Loamy";
|
||||||
|
cropTypes[9].Times[0] = 9;
|
||||||
|
cropTypes[9].soilType[1] = "Black";
|
||||||
|
cropTypes[9].Times[0] = 4;
|
||||||
|
cropTypes[9].soilType[2] = null;
|
||||||
|
cropTypes[9].Temparature = 30.0f;
|
||||||
|
cropTypes[9].Humidity = 58.6f;
|
||||||
|
cropTypes[9].Moisture = 51.2f;
|
||||||
|
cropTypes[9].Nitrogen = 25 + 14.6f;
|
||||||
|
cropTypes[9].Potassium = 14 + 4.2f;
|
||||||
|
cropTypes[9].Phosphorous = 30 + 17.6f;
|
||||||
|
|
||||||
|
|
||||||
|
//Tobacco
|
||||||
|
cropTypes[10] = new CropTypes();
|
||||||
|
cropTypes[10].soilType[0] = "Red";
|
||||||
|
cropTypes[10].soilType[1] = null;
|
||||||
|
cropTypes[10].soilType[2] = null;
|
||||||
|
cropTypes[10].Temparature = 31.9f;
|
||||||
|
cropTypes[10].Humidity = 62.4f;
|
||||||
|
cropTypes[10].Moisture = 31.6f;
|
||||||
|
cropTypes[10].Nitrogen = 25 + 19.1f;
|
||||||
|
cropTypes[10].Potassium = 14 + 4.9f;
|
||||||
|
cropTypes[10].Phosphorous = 30 + 19.3f;
|
||||||
|
|
||||||
|
|
||||||
|
//Wheat
|
||||||
|
cropTypes[11] = new CropTypes();
|
||||||
|
cropTypes[11].soilType[0] = "Loamy";
|
||||||
|
cropTypes[11].soilType[1] = null;
|
||||||
|
cropTypes[11].soilType[2] = null;
|
||||||
|
cropTypes[11].Temparature = 33.1f;
|
||||||
|
cropTypes[11].Humidity = 63.8f;
|
||||||
|
cropTypes[11].Moisture = 50.0f;
|
||||||
|
cropTypes[11].Nitrogen = 25 + 23.3f;
|
||||||
|
cropTypes[11].Potassium = 14 + 2.9f;
|
||||||
|
cropTypes[11].Phosphorous = 30 + 14.4f;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public CropTypes getPresetCropTypes(int Index)
|
||||||
|
{
|
||||||
|
return cropTypes[Index];
|
||||||
|
}
|
||||||
|
}
|
@ -12,25 +12,45 @@ class Crops
|
|||||||
private int Status;
|
private int Status;
|
||||||
private int originalStatus;
|
private int originalStatus;
|
||||||
private int cropType = 0;
|
private int cropType = 0;
|
||||||
private int Timer = 1;
|
private float Timer = 1;
|
||||||
private int fullTimer;
|
private int UpdateCrop;
|
||||||
|
private float fullTimer;
|
||||||
private bool housePos = false;
|
private bool housePos = false;
|
||||||
private Vector2 Size;
|
private Vector2 Size;
|
||||||
|
private CropTypes DataSet;
|
||||||
SoilProperties soilProperties = new SoilProperties();
|
SoilProperties soilProperties = new SoilProperties();
|
||||||
|
private float ProductionRate;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void updateCrop(Vector2 newSize)
|
public void updateCrop(Vector2 newSize)
|
||||||
{
|
{
|
||||||
|
getProductionRate(DataSet);
|
||||||
if (Status == 4 && Timer != 1)
|
if (UpdateCrop == 60)
|
||||||
{
|
{
|
||||||
Timer--;
|
degradeSoil();
|
||||||
|
UpdateCrop = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Status == 3 && Timer != 1)
|
||||||
|
{
|
||||||
|
Timer = Timer - 1f * ProductionRate;
|
||||||
}
|
}
|
||||||
Size = newSize;
|
Size = newSize;
|
||||||
|
UpdateCrop++;
|
||||||
|
|
||||||
|
if (Timer < 1)
|
||||||
|
{
|
||||||
|
Timer = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getCropTimer()
|
public SoilProperties getSoilProperties()
|
||||||
|
{
|
||||||
|
return soilProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getCropTimer()
|
||||||
{
|
{
|
||||||
return Timer;
|
return Timer;
|
||||||
}
|
}
|
||||||
@ -47,8 +67,6 @@ class Crops
|
|||||||
soilProperties.setSoilProperties();
|
soilProperties.setSoilProperties();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Changes the time required for the crops to be harvestable
|
// Changes the time required for the crops to be harvestable
|
||||||
public void setCropTimer()
|
public void setCropTimer()
|
||||||
{
|
{
|
||||||
@ -84,7 +102,7 @@ class Crops
|
|||||||
{
|
{
|
||||||
return 8;
|
return 8;
|
||||||
}
|
}
|
||||||
else if (Status == 3) //crops
|
else
|
||||||
{
|
{
|
||||||
if (cropType == 0)
|
if (cropType == 0)
|
||||||
{
|
{
|
||||||
@ -103,36 +121,36 @@ class Crops
|
|||||||
return 50; //Fruit Trees
|
return 50; //Fruit Trees
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else //Harvestable Crops
|
}
|
||||||
|
|
||||||
|
public void degradeSoil()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (soilProperties.Nitrogen > 4.0f)
|
||||||
{
|
{
|
||||||
if (cropType == 0)
|
soilProperties.Nitrogen = soilProperties.Nitrogen - soilProperties.NitrogenDegradeRate;
|
||||||
{
|
|
||||||
return 30; //Carrots
|
|
||||||
}
|
|
||||||
else if (cropType == 1)
|
|
||||||
{
|
|
||||||
return 40; //Wheat
|
|
||||||
}
|
|
||||||
else if (cropType == 2)
|
|
||||||
{
|
|
||||||
return 50; //Berries
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return 100; //Fruit Trees
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (soilProperties.Phosphorous > 0.1f)
|
||||||
|
{
|
||||||
|
soilProperties.Phosphorous = soilProperties.Phosphorous - soilProperties.PhosphorousDegradeRate;
|
||||||
|
}
|
||||||
|
if (soilProperties.Potassium > 0.1f)
|
||||||
|
{
|
||||||
|
soilProperties.Potassium = soilProperties.Potassium - soilProperties.PotassiumDegradeRate;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void setCropType(int Type)
|
public void setCropType(int Type, CropTypes nCropType)
|
||||||
{
|
{
|
||||||
|
DataSet = nCropType;
|
||||||
cropType = Type;
|
cropType = Type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getStatus()
|
public int getStatus()
|
||||||
{
|
{
|
||||||
if (Status != 4)
|
if (Status != 3)
|
||||||
{
|
{
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -176,6 +194,44 @@ class Crops
|
|||||||
return housePos;
|
return housePos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public float getProductionRate(CropTypes Sample)
|
||||||
|
{
|
||||||
|
ProductionRate = 1;
|
||||||
|
float min = 1.0f;
|
||||||
|
if (DataSet != null)
|
||||||
|
{
|
||||||
|
ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Temperature, Sample.Temparature));
|
||||||
|
ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Moisture, Sample.Moisture));
|
||||||
|
ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Humidity, Sample.Humidity));
|
||||||
|
min = Math.Min(compareToDatset(soilProperties.Phosphorous, Sample.Phosphorous), Math.Min(compareToDatset(soilProperties.Potassium, Sample.Potassium), compareToDatset(soilProperties.Nitrogen, Sample.Nitrogen)));
|
||||||
|
ProductionRate = ProductionRate + (ProductionRate * min);
|
||||||
|
//ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Phosphorous, Sample.Phosphorous));
|
||||||
|
//ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Potassium, Sample.Potassium));
|
||||||
|
//ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Nitrogen, Sample.Nitrogen));
|
||||||
|
if (ProductionRate < 0)
|
||||||
|
{
|
||||||
|
ProductionRate = 0;
|
||||||
|
}
|
||||||
|
ProductionRate = ProductionRate / 10;
|
||||||
|
}
|
||||||
|
return ProductionRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float compareToDatset(float i, float j)
|
||||||
|
{
|
||||||
|
if (i < j)
|
||||||
|
{
|
||||||
|
return (i / j);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (j / i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void Inspect(int tileSize, int Spacing, SpriteFont Bold, SpriteBatch spriteBatch, string[] cropTypesNames)
|
public void Inspect(int tileSize, int Spacing, SpriteFont Bold, SpriteBatch spriteBatch, string[] cropTypesNames)
|
||||||
{
|
{
|
||||||
spriteBatch.Begin();
|
spriteBatch.Begin();
|
||||||
@ -196,17 +252,13 @@ class Crops
|
|||||||
spriteBatch.DrawString(Bold, "Tiletype: Soil", new Vector2(240, Size.Y * (tileSize + Spacing) + 42), Color.DarkBlue);
|
spriteBatch.DrawString(Bold, "Tiletype: Soil", new Vector2(240, Size.Y * (tileSize + Spacing) + 42), Color.DarkBlue);
|
||||||
}
|
}
|
||||||
else if (Status == 3)
|
else if (Status == 3)
|
||||||
{
|
|
||||||
spriteBatch.DrawString(Bold, "Tiletype: Planted", new Vector2(240, Size.Y * (tileSize + Spacing) + 42), Color.DarkBlue);
|
|
||||||
}
|
|
||||||
else if (Status == 4)
|
|
||||||
{
|
{
|
||||||
int x = (int)(((float)Timer / fullTimer) * 100);
|
int x = (int)(((float)Timer / fullTimer) * 100);
|
||||||
x = 100 - x;
|
x = 100 - x;
|
||||||
spriteBatch.DrawString(Bold, "Tiletype: Crop ", new Vector2(240, Size.Y * (tileSize + Spacing) + 42), Color.DarkBlue);
|
spriteBatch.DrawString(Bold, "Tiletype: Crop ", new Vector2(240, Size.Y * (tileSize + Spacing) + 42), Color.DarkBlue);
|
||||||
spriteBatch.DrawString(Bold, "Completion: " + x + "%", new Vector2(240, Size.Y * (tileSize + Spacing) + 82), Color.DarkBlue);
|
spriteBatch.DrawString(Bold, "Completion: " + x + "%", new Vector2(240, Size.Y * (tileSize + Spacing) + 82), Color.DarkBlue);
|
||||||
}
|
}
|
||||||
if (Status != 4)
|
if (Status != 3)
|
||||||
{
|
{
|
||||||
spriteBatch.DrawString(Bold, "-------------", new Vector2(240, Size.Y * (tileSize + Spacing) + 82), Color.DarkRed);
|
spriteBatch.DrawString(Bold, "-------------", new Vector2(240, Size.Y * (tileSize + Spacing) + 82), Color.DarkRed);
|
||||||
}
|
}
|
||||||
@ -219,13 +271,22 @@ class Crops
|
|||||||
spriteBatch.DrawString(Bold, "None", new Vector2(240, Size.Y * (tileSize + Spacing) + 62), Color.DarkBlue);
|
spriteBatch.DrawString(Bold, "None", new Vector2(240, Size.Y * (tileSize + Spacing) + 62), Color.DarkBlue);
|
||||||
}
|
}
|
||||||
spriteBatch.DrawString(Bold, "Soil Properties:", new Vector2(240, Size.Y * (tileSize + Spacing) + 122), Color.DarkRed);
|
spriteBatch.DrawString(Bold, "Soil Properties:", new Vector2(240, Size.Y * (tileSize + Spacing) + 122), Color.DarkRed);
|
||||||
spriteBatch.DrawString(Bold, "Soil Type: " + soilProperties.soilType, new Vector2(240, Size.Y * (tileSize + Spacing) + 142), Color.DarkBlue);
|
spriteBatch.DrawString(Bold, "Soil Type: ", new Vector2(240, Size.Y * (tileSize + Spacing) + 142), Color.DarkRed);
|
||||||
spriteBatch.DrawString(Bold, "Temparature: " + soilProperties.Temparature, new Vector2(240, Size.Y * (tileSize + Spacing) + 162), Color.DarkBlue);
|
spriteBatch.DrawString(Bold, soilProperties.soilType, new Vector2(370, Size.Y * (tileSize + Spacing) + 142), Color.DarkBlue);
|
||||||
spriteBatch.DrawString(Bold, "Moisture: " + soilProperties.Moisture, new Vector2(240, Size.Y * (tileSize + Spacing) + 182), Color.DarkBlue);
|
spriteBatch.DrawString(Bold, "Temparature: ", new Vector2(240, Size.Y * (tileSize + Spacing) + 162), Color.DarkRed);
|
||||||
spriteBatch.DrawString(Bold, "Humidity: " + soilProperties.Humidity, new Vector2(240, Size.Y * (tileSize + Spacing) + 202), Color.DarkBlue);
|
spriteBatch.DrawString(Bold, soilProperties.Temperature.ToString(), new Vector2(370, Size.Y * (tileSize + Spacing) + 162), Color.DarkBlue);
|
||||||
spriteBatch.DrawString(Bold, "Phosphorous: " + soilProperties.Phosphorous, new Vector2(240, Size.Y * (tileSize + Spacing) + 222), Color.DarkBlue);
|
spriteBatch.DrawString(Bold, "Moisture: ", new Vector2(240, Size.Y * (tileSize + Spacing) + 182), Color.DarkRed);
|
||||||
spriteBatch.DrawString(Bold, "Potassium: " + soilProperties.Potassium, new Vector2(240, Size.Y * (tileSize + Spacing) + 242), Color.DarkBlue);
|
spriteBatch.DrawString(Bold, soilProperties.Moisture.ToString(), new Vector2(370, Size.Y * (tileSize + Spacing) + 182), Color.DarkBlue);
|
||||||
spriteBatch.DrawString(Bold, "Nitrogen: " + soilProperties.Nitrogen, new Vector2(240, Size.Y * (tileSize + Spacing) + 262), Color.DarkBlue);
|
spriteBatch.DrawString(Bold, "Humidity: ", new Vector2(240, Size.Y * (tileSize + Spacing) + 202), Color.DarkRed);
|
||||||
|
spriteBatch.DrawString(Bold, soilProperties.Humidity.ToString(), new Vector2(370, Size.Y * (tileSize + Spacing) + 202), Color.DarkBlue);
|
||||||
|
spriteBatch.DrawString(Bold, "Phosphorous: ", new Vector2(240, Size.Y * (tileSize + Spacing) + 222), Color.DarkRed);
|
||||||
|
spriteBatch.DrawString(Bold, Math.Round(soilProperties.Phosphorous,1).ToString(), new Vector2(370, Size.Y * (tileSize + Spacing) + 222), Color.DarkBlue);
|
||||||
|
spriteBatch.DrawString(Bold, "Potassium: ", new Vector2(240, Size.Y * (tileSize + Spacing) + 242), Color.DarkRed);
|
||||||
|
spriteBatch.DrawString(Bold, Math.Round(soilProperties.Potassium, 1).ToString(), new Vector2(370, Size.Y * (tileSize + Spacing) + 242), Color.DarkBlue);
|
||||||
|
spriteBatch.DrawString(Bold, "Nitrogen: ", new Vector2(240, Size.Y * (tileSize + Spacing) + 262), Color.DarkRed);
|
||||||
|
spriteBatch.DrawString(Bold, Math.Round(soilProperties.Nitrogen, 1).ToString(), new Vector2(370, Size.Y * (tileSize + Spacing) + 262), Color.DarkBlue);
|
||||||
|
spriteBatch.DrawString(Bold, "Production Rate: ", new Vector2(240, Size.Y * (tileSize + Spacing) + 282), Color.DarkRed);
|
||||||
|
spriteBatch.DrawString(Bold, Math.Round((ProductionRate * 100), 1).ToString() + "%", new Vector2(370, Size.Y * (tileSize + Spacing) + 282), Color.DarkBlue);
|
||||||
spriteBatch.End();
|
spriteBatch.End();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,16 +10,19 @@ class Farm
|
|||||||
{
|
{
|
||||||
private Crops[,] crops;
|
private Crops[,] crops;
|
||||||
private Random r;
|
private Random r;
|
||||||
|
private CropTypesHolder PresetCrops = new CropTypesHolder();
|
||||||
|
private int Update;
|
||||||
|
|
||||||
|
|
||||||
//initializes the crops
|
//initializes the crops
|
||||||
public void init(Vector2 Size, Vector2 housepos)
|
public void init(Vector2 Size, Vector2 housepos)
|
||||||
{
|
{
|
||||||
|
PresetCrops.init();
|
||||||
r = new Random();
|
r = new Random();
|
||||||
crops = new Crops[100, 100];
|
crops = new Crops[100, 100];
|
||||||
for (int i = 0; i < Size.X; i++)
|
for (int i = 0; i < 99; i++)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < Size.Y; j++)
|
for (int j = 0; j < 99; j++)
|
||||||
{
|
{
|
||||||
int x = r.Next(0, 3);
|
int x = r.Next(0, 3);
|
||||||
if (x == 0)
|
if (x == 0)
|
||||||
@ -33,7 +36,8 @@ class Farm
|
|||||||
crops[i, j] = new Crops();
|
crops[i, j] = new Crops();
|
||||||
crops[i, j].setStatus(x);
|
crops[i, j].setStatus(x);
|
||||||
crops[i, j].setOriginalStatus();
|
crops[i, j].setOriginalStatus();
|
||||||
crops[i, j].setCropType(x = r.Next(0, 4));
|
x = r.Next(0, 12);
|
||||||
|
crops[i, j].setCropType(x, PresetCrops.getPresetCropTypes(x));
|
||||||
crops[i, j].init();
|
crops[i, j].init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -41,14 +45,20 @@ class Farm
|
|||||||
|
|
||||||
public void updateFarm(Vector2 Size)
|
public void updateFarm(Vector2 Size)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < Size.X; i++)
|
Update++;
|
||||||
|
if (Update == 30)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < Size.Y; j++)
|
for (int i = 0; i < Size.X; i++)
|
||||||
{
|
{
|
||||||
|
for (int j = 0; j < Size.Y; j++)
|
||||||
|
{
|
||||||
|
|
||||||
crops[i, j].updateCrop(Size);
|
crops[i, j].updateCrop(Size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Update = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Changes the properties of the tile when the tractor reaches this tile.
|
//Changes the properties of the tile when the tractor reaches this tile.
|
||||||
@ -56,7 +66,7 @@ class Farm
|
|||||||
{
|
{
|
||||||
int x = (int)xfloat;
|
int x = (int)xfloat;
|
||||||
int y = (int)yfloat;
|
int y = (int)yfloat;
|
||||||
if (crops[x, y].getStatus() >= 4)
|
if (crops[x, y].getStatus() >= 3)
|
||||||
{
|
{
|
||||||
crops[x, y].setStatus(2);
|
crops[x, y].setStatus(2);
|
||||||
}
|
}
|
||||||
@ -67,10 +77,6 @@ class Farm
|
|||||||
else if (crops[x, y].getStatus() == 2)
|
else if (crops[x, y].getStatus() == 2)
|
||||||
{
|
{
|
||||||
crops[x, y].setStatus(3);
|
crops[x, y].setStatus(3);
|
||||||
}
|
|
||||||
else if (crops[x, y].getStatus() == 3)
|
|
||||||
{
|
|
||||||
crops[x, y].setStatus(4);
|
|
||||||
crops[x, y].setCropTimer();
|
crops[x, y].setCropTimer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -85,22 +91,52 @@ class Farm
|
|||||||
return crops;
|
return crops;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateSize(Vector2 Size, int tileSize, int Spacing)
|
|
||||||
{
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)Size.X; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < (int)Size.Y; j++)
|
|
||||||
{
|
|
||||||
//crops[i, j].x = (tileSize + Spacing) * i;
|
|
||||||
//crops[i, j].y = (tileSize + Spacing) * j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNewHousePos(Vector2 pos, bool newState)
|
public void setNewHousePos(Vector2 pos, bool newState)
|
||||||
{
|
{
|
||||||
crops[(int)pos.X, (int)pos.Y].setHousePos(newState);
|
crops[(int)pos.X, (int)pos.Y].setHousePos(newState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CropTypes getPresetCropTypes(int Index)
|
||||||
|
{
|
||||||
|
return PresetCrops.getPresetCropTypes(Index - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCropType(int x, int y, int Type)
|
||||||
|
{
|
||||||
|
crops[x, y].setCropType(Type, PresetCrops.getPresetCropTypes(Type));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdatePreferedCrops(Vector2 Size)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Size.X; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < Size.X; j++)
|
||||||
|
{
|
||||||
|
int x = getHighestProductionRate(i, j);
|
||||||
|
crops[i,j].setCropType(x, PresetCrops.getPresetCropTypes(x));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getHighestProductionRate(int x, int y)
|
||||||
|
{
|
||||||
|
int i = 1, holderIndex = 0;
|
||||||
|
float holder = 0, SampleHolder = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
holder = getProductionRate(x, y, i);
|
||||||
|
if (SampleHolder < holder)
|
||||||
|
{
|
||||||
|
holderIndex = i;
|
||||||
|
SampleHolder = holder;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
} while (i < 12);
|
||||||
|
return holderIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getProductionRate(int x, int y, int Type)
|
||||||
|
{
|
||||||
|
return crops[x, y].getProductionRate(PresetCrops.getPresetCropTypes(Type));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,21 +11,45 @@ class SoilProperties
|
|||||||
|
|
||||||
|
|
||||||
public string soilType = "potato";
|
public string soilType = "potato";
|
||||||
public float Temparature;
|
public float Temperature;
|
||||||
public float Humidity;
|
public float Humidity;
|
||||||
public float Moisture;
|
public float Moisture;
|
||||||
public float Nitrogen;
|
public float Nitrogen;
|
||||||
public float Potassium;
|
public float Potassium;
|
||||||
public float Phosphorous;
|
public float Phosphorous;
|
||||||
|
public float NitrogenDegradeRate = 1.0f - (1.0f/55 * 40);
|
||||||
|
public float PotassiumDegradeRate = 1.0f - (1.0f/28 * 23);
|
||||||
|
public float PhosphorousDegradeRate = 1.0f - (1.0f/60 * 37);
|
||||||
|
|
||||||
public void setSoilProperties()
|
public void setSoilProperties()
|
||||||
{
|
{
|
||||||
Temparature = GetRandomNumber(22, 30);
|
int soilTypeRandomizer = r.Next(0, 1000);
|
||||||
Humidity = GetRandomNumber(1, 5);
|
if (soilTypeRandomizer < 210)
|
||||||
Moisture = GetRandomNumber(1, 10);
|
{
|
||||||
Nitrogen = GetRandomNumber(0.5 , 1);
|
soilType = "Loamy";
|
||||||
Potassium = GetRandomNumber(5, 20);
|
}
|
||||||
Phosphorous = GetRandomNumber(4, 50);
|
else if (soilTypeRandomizer < 400)
|
||||||
|
{
|
||||||
|
soilType = "Red";
|
||||||
|
}
|
||||||
|
else if (soilTypeRandomizer < 600)
|
||||||
|
{
|
||||||
|
soilType = "Black";
|
||||||
|
}
|
||||||
|
else if (soilTypeRandomizer < 800)
|
||||||
|
{
|
||||||
|
soilType = "Sandy";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
soilType = "Clayey";
|
||||||
|
}
|
||||||
|
Temperature = GetRandomNumber(22, 30);
|
||||||
|
Humidity = Temperature * GetRandomNumber(1.9, 2.1);
|
||||||
|
Moisture = GetRandomNumber(20, 70);
|
||||||
|
Nitrogen = GetRandomNumber(4 , 55);
|
||||||
|
Potassium = GetRandomNumber(0.01f, 28);
|
||||||
|
Phosphorous = GetRandomNumber(0.01f, 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
public float GetRandomNumber(double minimum, double maximum)
|
public float GetRandomNumber(double minimum, double maximum)
|
||||||
|
@ -12,7 +12,7 @@ class DayNightCycle
|
|||||||
private int dayTime = 0;
|
private int dayTime = 0;
|
||||||
private int lengthOfDay = 20000;
|
private int lengthOfDay = 20000;
|
||||||
private int lengthOfNight = 20000;
|
private int lengthOfNight = 20000;
|
||||||
private int Days;
|
private int Days = 1;
|
||||||
|
|
||||||
public void updateTime(int Speed)
|
public void updateTime(int Speed)
|
||||||
{
|
{
|
||||||
|
@ -37,7 +37,7 @@ class House
|
|||||||
housePos = new Rectangle((int)pos.X * (tileSize + Spacing), (int)pos.Y * (tileSize + Spacing), tileSize, tileSize);
|
housePos = new Rectangle((int)pos.X * (tileSize + Spacing), (int)pos.Y * (tileSize + Spacing), tileSize, tileSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Returns house Rectangle
|
||||||
public Rectangle GetRectangle()
|
public Rectangle GetRectangle()
|
||||||
{
|
{
|
||||||
return housePos;
|
return housePos;
|
||||||
|
@ -4,36 +4,40 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using Game1.Sources.ML;
|
using C5;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
class Astar
|
class Astar
|
||||||
{
|
{
|
||||||
|
|
||||||
private Vector2 tractorPos;
|
private Vector2 tractorPos;
|
||||||
private Vector2 housePos;
|
private Vector2 housePos;
|
||||||
private Crops[,] crops;
|
private static Crops[,] crops;
|
||||||
private Vector2 Size;
|
private Vector2 Size;
|
||||||
private PriorityQueue allPaths;
|
|
||||||
private Vector2 targetPos;
|
private Vector2 targetPos;
|
||||||
private int Rotation;
|
private int Rotation;
|
||||||
|
|
||||||
public void update(Crops[,] newCrops, Vector2 newSize, Vector2 newTractorPos, Vector2 newHousePos, Vector2 newtargetPos, int rotation)
|
public void update(Crops[,] newCrops, Vector2 newSize, Vector2 newTractorPos, Vector2 newHousePos, int rotation)
|
||||||
{
|
{
|
||||||
tractorPos = new Vector2((int)newTractorPos.X, (int)newTractorPos.Y);
|
tractorPos = new Vector2((int)newTractorPos.X, (int)newTractorPos.Y);
|
||||||
housePos = new Vector2((int)newHousePos.X, (int)newHousePos.Y);
|
housePos = new Vector2((int)newHousePos.X, (int)newHousePos.Y);
|
||||||
targetPos = newtargetPos;
|
|
||||||
crops = newCrops;
|
crops = newCrops;
|
||||||
Size = newSize;
|
Size = newSize;
|
||||||
Rotation = rotation;
|
Rotation = rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Nodes getOptimalPath()
|
public void update(Crops[,] newCrops, Vector2 newSize, Vector2 newTractorPos, Vector2 newHousePos, Vector2 newTargetPos, int rotation)
|
||||||
{
|
{
|
||||||
return allPaths.Peek();
|
tractorPos = new Vector2((int)newTractorPos.X, (int)newTractorPos.Y);
|
||||||
|
housePos = new Vector2((int)newHousePos.X, (int)newHousePos.Y);
|
||||||
|
crops = newCrops;
|
||||||
|
Size = newSize;
|
||||||
|
Rotation = rotation;
|
||||||
|
targetPos = newTargetPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get all adjacent nodes
|
// Get all adjacent nodes
|
||||||
private List<Nodes> GetAdjacentNodes(Vector2 currentPos)
|
public List<Nodes> GetAdjacentNodes(Vector2 currentPos)
|
||||||
{
|
{
|
||||||
var adjacentNodes = new List<Nodes>()
|
var adjacentNodes = new List<Nodes>()
|
||||||
|
|
||||||
@ -71,9 +75,9 @@ class Astar
|
|||||||
if (currDir == newDir)
|
if (currDir == newDir)
|
||||||
return 0;
|
return 0;
|
||||||
else if (Math.Abs(currDir - newDir) == 1 || Math.Abs(currDir - newDir) == 3)
|
else if (Math.Abs(currDir - newDir) == 1 || Math.Abs(currDir - newDir) == 3)
|
||||||
return 2;
|
return 20;
|
||||||
else if (Math.Abs(currDir - newDir) == 0 || Math.Abs(currDir - newDir) == 2)
|
else if (Math.Abs(currDir - newDir) == 0 || Math.Abs(currDir - newDir) == 2)
|
||||||
return 9;
|
return 900;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,19 +85,19 @@ class Astar
|
|||||||
public int ConvertRotation()
|
public int ConvertRotation()
|
||||||
{
|
{
|
||||||
int rotation = 0;
|
int rotation = 0;
|
||||||
if (Rotation == 180)
|
if (Rotation > 135 && Rotation < 225)
|
||||||
rotation = 0;
|
rotation = 0;
|
||||||
else if (Rotation == 270)
|
else if (Rotation > 225 && Rotation < 315)
|
||||||
rotation = 1;
|
rotation = 1;
|
||||||
else if (Rotation == 0)
|
else if (Rotation > 315 && Rotation < 45)
|
||||||
rotation = 2;
|
rotation = 2;
|
||||||
else if (Rotation == 90)
|
else if (Rotation > 45 && Rotation < 135)
|
||||||
rotation = -1;
|
rotation = -1;
|
||||||
return rotation;
|
return rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main function of A* algorithm
|
// Main function of A* algorithm
|
||||||
public Path FindPath()
|
public Path FindPath(bool flipArray)
|
||||||
{
|
{
|
||||||
int g = 0;
|
int g = 0;
|
||||||
int direction = ConvertRotation();
|
int direction = ConvertRotation();
|
||||||
@ -124,7 +128,6 @@ class Astar
|
|||||||
g = current.getG() + crops[(int)adjacentNode.getCords().X, (int)adjacentNode.getCords().Y].getCostOnMovement() + CalculateRotationCost(direction, adjacentNode.getDirection()); // calculate g - cost from start point
|
g = current.getG() + crops[(int)adjacentNode.getCords().X, (int)adjacentNode.getCords().Y].getCostOnMovement() + CalculateRotationCost(direction, adjacentNode.getDirection()); // calculate g - cost from start point
|
||||||
if (!(openList.Exists(adjacentNode.getCords()))) // if adjacent node is not on open list, add it
|
if (!(openList.Exists(adjacentNode.getCords()))) // if adjacent node is not on open list, add it
|
||||||
{
|
{
|
||||||
|
|
||||||
adjacentNode.setG(g);
|
adjacentNode.setG(g);
|
||||||
adjacentNode.setH(ComputeHScore(adjacentNode.getCords(), target.getCords()));
|
adjacentNode.setH(ComputeHScore(adjacentNode.getCords(), target.getCords()));
|
||||||
adjacentNode.calculateF();
|
adjacentNode.calculateF();
|
||||||
@ -150,10 +153,13 @@ class Astar
|
|||||||
path.AddNode(current);
|
path.AddNode(current);
|
||||||
current = current.getParent();
|
current = current.getParent();
|
||||||
}
|
}
|
||||||
path = path.FlipArray();
|
|
||||||
|
if (flipArray)
|
||||||
|
path = path.FlipArray();
|
||||||
|
|
||||||
openList.deleteHeap();
|
openList.deleteHeap();
|
||||||
closedList.deleteHeap();
|
closedList.deleteHeap();
|
||||||
|
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,8 +6,9 @@ using System.Threading.Tasks;
|
|||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework.Input;
|
using Microsoft.Xna.Framework.Input;
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
using C5;
|
||||||
|
|
||||||
class Nodes
|
class Nodes : IComparable<Nodes>, IEqualityComparer<Nodes>, IPriorityQueueHandle<Nodes>
|
||||||
{
|
{
|
||||||
private int F = 0;
|
private int F = 0;
|
||||||
private int G = 0;
|
private int G = 0;
|
||||||
@ -27,6 +28,12 @@ class Nodes
|
|||||||
Direction = direction;
|
Direction = direction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Nodes(int f, Vector2 coordinates)
|
||||||
|
{
|
||||||
|
Coordinates = coordinates;
|
||||||
|
F = f;
|
||||||
|
}
|
||||||
|
|
||||||
public Nodes(Nodes node)
|
public Nodes(Nodes node)
|
||||||
{
|
{
|
||||||
F = node.F;
|
F = node.F;
|
||||||
@ -94,4 +101,24 @@ class Nodes
|
|||||||
{
|
{
|
||||||
return Direction;
|
return Direction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int CompareTo(Nodes other)
|
||||||
|
{
|
||||||
|
if (this.F < other.F)
|
||||||
|
return -1;
|
||||||
|
else if (this.F > other.F)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Equals(Nodes source, Nodes other)
|
||||||
|
{
|
||||||
|
return (source.Coordinates.X == other.Coordinates.X && source.Coordinates.Y == other.Coordinates.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetHashCode(Nodes nodes)
|
||||||
|
{
|
||||||
|
return (nodes.Coordinates.GetHashCode());
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,88 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Microsoft.Xna.Framework;
|
|
||||||
using Microsoft.Xna.Framework.Input;
|
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
|
||||||
|
|
||||||
class PriorityQueue
|
|
||||||
{
|
|
||||||
public List<Nodes> list;
|
|
||||||
public int Count { get { return list.Count; } }
|
|
||||||
|
|
||||||
public PriorityQueue()
|
|
||||||
{
|
|
||||||
list = new List<Nodes>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public PriorityQueue(int count)
|
|
||||||
{
|
|
||||||
list = new List<Nodes>(count);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void Enqueue(Nodes x)
|
|
||||||
{
|
|
||||||
list.Add(x);
|
|
||||||
int i = Count - 1;
|
|
||||||
|
|
||||||
|
|
||||||
while (i > 0)
|
|
||||||
{
|
|
||||||
int p = (i - 1) / 2;
|
|
||||||
if (list[p].getF() <= x.getF()) break;
|
|
||||||
|
|
||||||
list[i] = list[p];
|
|
||||||
i = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Count > 0) list[i] = x;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dequeue()
|
|
||||||
{
|
|
||||||
Nodes min = Peek();
|
|
||||||
Nodes root = list[Count - 1];
|
|
||||||
list.RemoveAt(Count - 1);
|
|
||||||
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
while (i * 2 + 1 < Count)
|
|
||||||
{
|
|
||||||
int a = i * 2 + 1;
|
|
||||||
int b = i * 2 + 2;
|
|
||||||
int c = b < Count && list[b].getF() < list[a].getF() ? b : a;
|
|
||||||
|
|
||||||
if (list[c].getF() >= root.getF()) break;
|
|
||||||
list[i] = list[c];
|
|
||||||
i = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Count > 0) list[i] = root;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public Nodes Peek()
|
|
||||||
{
|
|
||||||
if (Count == 0) throw new InvalidOperationException("Queue is empty.");
|
|
||||||
return list[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
public Boolean Exists(Vector2 coordinates)
|
|
||||||
{
|
|
||||||
if (Count == 0)
|
|
||||||
return false;
|
|
||||||
foreach(Nodes node in list)
|
|
||||||
{
|
|
||||||
if (node.getCords() == coordinates)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void Clear()
|
|
||||||
{
|
|
||||||
list.Clear();
|
|
||||||
}
|
|
||||||
}
|
|
26
Game1/Sources/Pathing/PQEntry.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
|
||||||
|
|
||||||
|
public class PQEntry : IComparable<PQEntry>
|
||||||
|
{
|
||||||
|
public int Key { get; set; }
|
||||||
|
public Vector2 Coordinates { get; set; }
|
||||||
|
|
||||||
|
public int CompareTo(PQEntry other)
|
||||||
|
{
|
||||||
|
if (this.Key < other.Key)
|
||||||
|
return -1;
|
||||||
|
else if (this.Key > other.Key)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
49
Game1/Sources/Pathing/PriorityQueueC5.cs
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
using C5;
|
||||||
|
|
||||||
|
|
||||||
|
class PriorityQueueC5
|
||||||
|
{
|
||||||
|
|
||||||
|
private readonly Astar astar = new Astar();
|
||||||
|
private IPriorityQueue<PQEntry> queue = new IntervalHeap<PQEntry>();
|
||||||
|
|
||||||
|
public void AddToQueue(List<PQEntry> nodes)
|
||||||
|
{
|
||||||
|
foreach (PQEntry item in nodes)
|
||||||
|
{
|
||||||
|
PQEntry temp = new PQEntry
|
||||||
|
{
|
||||||
|
Key = item.Key,
|
||||||
|
Coordinates = item.Coordinates
|
||||||
|
};
|
||||||
|
queue.Add(temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddToQueue(int x, int y, int score)
|
||||||
|
{
|
||||||
|
PQEntry temp = new PQEntry
|
||||||
|
{
|
||||||
|
Key = score,
|
||||||
|
Coordinates = new Vector2(x, y)
|
||||||
|
};
|
||||||
|
queue.Add(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PQEntry DeleteMax()
|
||||||
|
{
|
||||||
|
return queue.DeleteMax();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddAll(List<PQEntry> entryList)
|
||||||
|
{
|
||||||
|
queue.AddAll(entryList);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -9,7 +9,6 @@ using Microsoft.Xna.Framework.Graphics;
|
|||||||
|
|
||||||
class AI
|
class AI
|
||||||
{
|
{
|
||||||
|
|
||||||
private Vector2 tractorPos;
|
private Vector2 tractorPos;
|
||||||
private Vector2 housePos;
|
private Vector2 housePos;
|
||||||
private Farm farm;
|
private Farm farm;
|
||||||
@ -17,9 +16,7 @@ class AI
|
|||||||
private Vector2 targetPos;
|
private Vector2 targetPos;
|
||||||
private Inventory inventory = new Inventory();
|
private Inventory inventory = new Inventory();
|
||||||
private int Rotation;
|
private int Rotation;
|
||||||
|
private Astar astar = new Astar();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private Random r = new Random();
|
private Random r = new Random();
|
||||||
|
|
||||||
@ -27,21 +24,9 @@ class AI
|
|||||||
public void init()
|
public void init()
|
||||||
{
|
{
|
||||||
inventory.initInventorySystem();
|
inventory.initInventorySystem();
|
||||||
inventory.addItem(1, 1);
|
|
||||||
inventory.addItem(1, 1);
|
|
||||||
inventory.addItem(3, 1);
|
|
||||||
inventory.addItem(5, 1);
|
|
||||||
inventory.addItem(7, 1);
|
|
||||||
inventory.addItem(7, 1);
|
|
||||||
inventory.addItem(10, 1);
|
|
||||||
inventory.addItem(10, 1);
|
|
||||||
inventory.useItem(10, 1);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void update(Farm newFarm, Vector2 newSize, Vector2 newTractorPos, Vector2 newHousePos, Vector2 newtargetPos, int rotation)
|
public void update(Farm newFarm, Vector2 newSize, Vector2 newTractorPos, Vector2 newHousePos, Vector2 newtargetPos, int rotation)
|
||||||
{
|
{
|
||||||
tractorPos = new Vector2((int)newTractorPos.X, (int)newTractorPos.Y);
|
tractorPos = new Vector2((int)newTractorPos.X, (int)newTractorPos.Y);
|
||||||
@ -50,6 +35,7 @@ class AI
|
|||||||
farm = newFarm;
|
farm = newFarm;
|
||||||
Size = newSize;
|
Size = newSize;
|
||||||
Rotation = rotation;
|
Rotation = rotation;
|
||||||
|
astar.update(farm.getCrops(), Size, tractorPos, housePos, rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -61,7 +47,40 @@ class AI
|
|||||||
|
|
||||||
public Vector2 newTarget()
|
public Vector2 newTarget()
|
||||||
{
|
{
|
||||||
return new Vector2(r.Next(0, (int)Size.X), r.Next(0, (int)Size.Y));
|
PriorityQueueC5 queue = new PriorityQueueC5();
|
||||||
|
int score = 0;
|
||||||
|
int count = 0;
|
||||||
|
int testsize = 2;
|
||||||
|
Vector2 newTarget;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < Size.X; x++)
|
||||||
|
for (int y = 0; y < Size.Y; y++)
|
||||||
|
{
|
||||||
|
if (farm.getCrop(x, y).getStatus() >= 2 && tractorPos != new Vector2(x, y))
|
||||||
|
{
|
||||||
|
score = calculateSoilScore(x, y);
|
||||||
|
queue.AddToQueue(x, y, score);
|
||||||
|
if (farm.getCrop(x, y).getCropTimer() == 1 || farm.getCrop(x, y).getStatus() == 2)
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count > 0)
|
||||||
|
break;
|
||||||
|
else if (tractorPos != housePos)
|
||||||
|
return newTarget = GetMaxFNode(testsize, queue);
|
||||||
|
|
||||||
|
/*
|
||||||
|
else if (tractorPos == housePos)
|
||||||
|
{
|
||||||
|
List<Nodes> temp = astar.GetAdjacentNodes(tractorPos);
|
||||||
|
return temp[0].getCords();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
newTarget = GetMinFNode(Math.Min(testsize, count), queue);
|
||||||
|
|
||||||
|
return newTarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Farm changeCropStatus()
|
public Farm changeCropStatus()
|
||||||
@ -69,6 +88,11 @@ class AI
|
|||||||
if (farm.getCrop((int)tractorPos.X, (int)tractorPos.Y).getCropTimer() == 1)
|
if (farm.getCrop((int)tractorPos.X, (int)tractorPos.Y).getCropTimer() == 1)
|
||||||
{
|
{
|
||||||
farm.setCropStatus(tractorPos.X, tractorPos.Y);
|
farm.setCropStatus(tractorPos.X, tractorPos.Y);
|
||||||
|
if (farm.getCrop((int)tractorPos.X, (int)tractorPos.Y).getStatus() == 2)
|
||||||
|
{
|
||||||
|
inventory.addItem(farm.getCrop((int)tractorPos.X, (int)tractorPos.Y).getCropType() - 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return farm;
|
return farm;
|
||||||
}
|
}
|
||||||
@ -77,4 +101,105 @@ class AI
|
|||||||
{
|
{
|
||||||
return inventory;
|
return inventory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int calculateSoilScore(int x, int y)
|
||||||
|
{
|
||||||
|
int score = 0;
|
||||||
|
int statusScore = 0;
|
||||||
|
int timerScore = 0;
|
||||||
|
int aproxDistance = (int)(Math.Abs(x - tractorPos.X) + Math.Abs(y - tractorPos.Y));
|
||||||
|
CropTypesHolder holder = new CropTypesHolder();
|
||||||
|
holder.init();
|
||||||
|
|
||||||
|
Crops crop = farm.getCrop(x, y);
|
||||||
|
SoilProperties soilP = crop.getSoilProperties();
|
||||||
|
int cropType = crop.getCropType();
|
||||||
|
CropTypes avgHold = holder.getPresetCropTypes(cropType);
|
||||||
|
|
||||||
|
if (crop.getStatus() == 2)
|
||||||
|
statusScore = 25;
|
||||||
|
else if (crop.getStatus() == 3)
|
||||||
|
statusScore = -100;
|
||||||
|
else
|
||||||
|
statusScore = 1;
|
||||||
|
|
||||||
|
if (crop.getCropTimer() == 1)
|
||||||
|
timerScore = 999;
|
||||||
|
else
|
||||||
|
statusScore = 0;
|
||||||
|
|
||||||
|
score = (int)(crop.getProductionRate(avgHold) * 10);
|
||||||
|
|
||||||
|
return score + (-aproxDistance * 5) + statusScore + timerScore;
|
||||||
|
}
|
||||||
|
|
||||||
|
private float norm(float min, float max, float val)
|
||||||
|
{
|
||||||
|
return ((val - min) / (max - min));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector2 GetMinFNode(int testSize, PriorityQueueC5 queue)
|
||||||
|
{
|
||||||
|
int index = 0;
|
||||||
|
int min = 9999;
|
||||||
|
Path path = new Path();
|
||||||
|
List<PQEntry> entryList = new List<PQEntry>();
|
||||||
|
for (int i = 0; i < testSize; i++)
|
||||||
|
{
|
||||||
|
entryList.Add(queue.DeleteMax());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < testSize; i++)
|
||||||
|
{
|
||||||
|
Nodes temp = new Nodes(entryList[i].Coordinates);
|
||||||
|
path = astar.FindPath(false);
|
||||||
|
Nodes tempF = new Nodes(path.getByIndex(0));
|
||||||
|
if (min > tempF.getF())
|
||||||
|
{
|
||||||
|
min = tempF.getF();
|
||||||
|
index = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PQEntry minEntry = entryList[index];
|
||||||
|
entryList.RemoveAt(index);
|
||||||
|
|
||||||
|
//add the non-minimum entries back to the queue.
|
||||||
|
queue.AddAll(entryList);
|
||||||
|
|
||||||
|
return minEntry.Coordinates;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector2 GetMaxFNode(int testSize, PriorityQueueC5 queue)
|
||||||
|
{
|
||||||
|
int index = 0;
|
||||||
|
int max = -9999;
|
||||||
|
Path path = new Path();
|
||||||
|
List<PQEntry> entryList = new List<PQEntry>();
|
||||||
|
for (int i = 0; i < testSize; i++)
|
||||||
|
{
|
||||||
|
entryList.Add(queue.DeleteMax());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < testSize; i++)
|
||||||
|
{
|
||||||
|
Nodes temp = new Nodes(entryList[i].Coordinates);
|
||||||
|
path = astar.FindPath(false);
|
||||||
|
Nodes tempF = new Nodes(path.getByIndex(0));
|
||||||
|
if (max < tempF.getF())
|
||||||
|
{
|
||||||
|
max = tempF.getF();
|
||||||
|
index = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PQEntry minEntry = entryList[index];
|
||||||
|
entryList.RemoveAt(index);
|
||||||
|
|
||||||
|
//add the non-minimum entries back to the queue.
|
||||||
|
queue.AddAll(entryList);
|
||||||
|
|
||||||
|
return minEntry.Coordinates;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,11 +17,13 @@ class SmartTractor
|
|||||||
public Path returnChoice()
|
public Path returnChoice()
|
||||||
{
|
{
|
||||||
ai.update(farm, Size, tractorPos / (tileSize + Spacing), housePos / (tileSize + Spacing), Target / (tileSize + Spacing), Rotation);
|
ai.update(farm, Size, tractorPos / (tileSize + Spacing), housePos / (tileSize + Spacing), Target / (tileSize + Spacing), Rotation);
|
||||||
|
farm.UpdatePreferedCrops(Size);
|
||||||
farm = ai.changeCropStatus();
|
farm = ai.changeCropStatus();
|
||||||
|
astar.update(farm.getCrops(), Size, tractorPos / (tileSize + Spacing), housePos / (tileSize + Spacing), Rotation);
|
||||||
getTargetPosition(ai.newTarget());
|
getTargetPosition(ai.newTarget());
|
||||||
astar.update(farm.getCrops(), Size, tractorPos / (tileSize + Spacing), housePos / (tileSize + Spacing), Target/(tileSize+Spacing), Rotation);
|
astar.update(farm.getCrops(), Size, tractorPos / (tileSize + Spacing), housePos / (tileSize + Spacing), Target / (tileSize + Spacing), Rotation);
|
||||||
|
|
||||||
return astar.FindPath();
|
return astar.FindPath(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|