diff --git a/CityGame/CityGame.csproj b/CityGame/CityGame.csproj
index 7fedb76..b6308b8 100644
--- a/CityGame/CityGame.csproj
+++ b/CityGame/CityGame.csproj
@@ -18,6 +18,7 @@
+
diff --git a/CityGame/Classes/Entities/Car.cs b/CityGame/Classes/Entities/Car.cs
index 44c76fc..22769c3 100644
--- a/CityGame/Classes/Entities/Car.cs
+++ b/CityGame/Classes/Entities/Car.cs
@@ -7,6 +7,10 @@ using System.Diagnostics;
using System.Linq;
using OrpticonGameHelper;
using OrpticonGameHelper.Classes.Elements;
+using System.Threading;
+using AStar;
+using System.Threading.Tasks;
+using System.Collections.Concurrent;
namespace CityGame.Classes.Entities
{
@@ -37,10 +41,10 @@ namespace CityGame.Classes.Entities
}
public float Speed { get; set; } = 128;
float currentSpeed = 0;
- public static Dictionary OccupiedTilesFill = new Dictionary();
- public static Dictionary OccupiedTiles = new Dictionary();
- public static Dictionary OccupiedTilesFill2 = new Dictionary();
- public static Dictionary OccupiedTiles2 = new Dictionary();
+ public static ConcurrentDictionary OccupiedTilesFill = new ConcurrentDictionary();
+ public static ConcurrentDictionary OccupiedTiles = new ConcurrentDictionary();
+ public static ConcurrentDictionary OccupiedTilesFill2 = new ConcurrentDictionary();
+ public static ConcurrentDictionary OccupiedTiles2 = new ConcurrentDictionary();
protected string PNGFile = "NPCCar.png";
protected ColoredRectangle debugRect;
protected Tile lastTile;
@@ -96,8 +100,15 @@ namespace CityGame.Classes.Entities
private int curveMode;
private float curveModePixelDuration;
private int curveModeStartedAt;
-
- public override void Tick(long deltaTime)
+ private bool pathfindingInProgress;
+ private async Task CalculatePathAsync(Point start, Point target, PathFinder pathfinder)
+ {
+ return await Task.Run(() =>
+ {
+ return pathfinder.FindPath(start.Convert(), target.Convert()).Select(x => x.Convert()).ToArray();
+ });
+ }
+ public override async void Tick(long deltaTime)
{
//deltaTime /= 10;
//deltaTime *= 500;
@@ -119,15 +130,23 @@ namespace CityGame.Classes.Entities
else lights.ForEach(x => x.Visible = true);
if (Target is not null)
{
+ if (pathfindingInProgress) return;
//if(Object is not null) Object.ToolTip = Target.ToString();
- if (Path is null)
+ if (Path is null && !pathfindingInProgress)
{
+ pathfindingInProgress = true;
var pf = MainWindow.pathfinder;
if (grid == 2) pf = MainWindow.pathfinderDesperate;
- Path = pf.FindPath(Point.Convert(), new Point((int)(Target.X() / MainWindow.TileSize), (int)(Target.Y() / MainWindow.TileSize)).Convert()).Select(x => x.Convert()).ToArray();
+
+ Point start = Point;
+ Point target = new Point((int)(Target.X() / MainWindow.TileSize), (int)(Target.Y() / MainWindow.TileSize));
+
+ Path = await CalculatePathAsync(start, target, pf);
NextTarget = 0;
+ pathfindingInProgress = false;
}
if (new Point(Target.X() / 64, Target.Y() / 64) != Point) Move(this);
+ if (Path is null) return;
if (Path.Length == 0)
{
JourneyImpossible(this);
@@ -146,13 +165,13 @@ namespace CityGame.Classes.Entities
JourneyFinished(this);
if (Math.Round(Rotation) == 0 || Math.Round(Rotation) == 90)
{
- if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.Add(myTile, this);
- if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.Add(myTile, this);
+ if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.TryAdd(myTile, this);
+ if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.TryAdd(myTile, this);
}
if (Math.Round(Rotation) == 180 || Math.Round(Rotation) == 270)
{
- if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.Add(myTile, this);
- if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.Add(myTile, this);
+ if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.TryAdd(myTile, this);
+ if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.TryAdd(myTile, this);
}
return;
}
@@ -172,8 +191,8 @@ namespace CityGame.Classes.Entities
if (Math.Round(Rotation) == 0 || Math.Round(Rotation) == 90)
{
- if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.Add(myTile, this);
- if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.Add(myTile, this);
+ if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.TryAdd(myTile, this);
+ if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.TryAdd(myTile, this);
if (OccupiedTiles.ContainsKey(targetTile) && OccupiedTiles[targetTile] != this)
{
SpeedMulti = 0;
@@ -182,8 +201,8 @@ namespace CityGame.Classes.Entities
}
if (Math.Round(Rotation) == 180 || Math.Round(Rotation) == 270)
{
- if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.Add(myTile, this);
- if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.Add(myTile, this);
+ if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.TryAdd(myTile, this);
+ if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.TryAdd(myTile, this);
if (OccupiedTiles2.ContainsKey(targetTile) && OccupiedTiles2[targetTile] != this)
{
SpeedMulti = 0;
@@ -285,13 +304,13 @@ namespace CityGame.Classes.Entities
{
if (Math.Round(Rotation) == 0 || Math.Round(Rotation) == 90)
{
- if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.Add(myTile, this);
- if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.Add(myTile, this);
+ if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.TryAdd(myTile, this);
+ if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.TryAdd(myTile, this);
}
if (Math.Round(Rotation) == 180 || Math.Round(Rotation) == 270)
{
- if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.Add(myTile, this);
- if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.Add(myTile, this);
+ if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.TryAdd(myTile, this);
+ if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.TryAdd(myTile, this);
}
}
}
diff --git a/CityGame/Classes/Misc/StaticDataManager.cs b/CityGame/Classes/Misc/StaticDataManager.cs
new file mode 100644
index 0000000..f14cd24
--- /dev/null
+++ b/CityGame/Classes/Misc/StaticDataManager.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CityGame.Classes.Misc
+{
+ public class StaticData
+ {
+ protected object obj;
+ static List list = new List();
+ public static void Reset()
+ {
+ list.ForEach(x => x.obj = null);
+ }
+ }
+ public class StaticData : StaticData
+ {
+ public StaticData(T obj)
+ {
+ this.obj = obj;
+ }
+ public T Value { get => (T)obj; }
+ public static implicit operator StaticData(T obj)
+ {
+ return new StaticData(obj);
+ }
+ public static implicit operator T(StaticData d)
+ {
+ return d.Value;
+ }
+ }
+}
diff --git a/CityGame/Classes/Rendering/ImageConverter.cs b/CityGame/Classes/Rendering/ImageConverter.cs
deleted file mode 100644
index fb01a52..0000000
--- a/CityGame/Classes/Rendering/ImageConverter.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-
-namespace CityGame.Classes.Rendering
-{
- public class ImageConverter
- {
- public static void ChangeColor(string srcFile, string destFile, Dictionary conversions)
- {
- destFile = Environment.CurrentDirectory + "\\Resources\\" + destFile + ".png";
- //if (File.Exists(destFile)) return;
- srcFile = Environment.CurrentDirectory + "\\Resources\\" + srcFile + ".png";
- if (!File.Exists(srcFile)) return;
-
- Dictionary Conversions = conversions.Select(x => new KeyValuePair(System.Drawing.ColorTranslator.FromHtml(x.Key), System.Drawing.ColorTranslator.FromHtml(x.Value))).ToDictionary(x => x.Key, x => x.Value);
- System.Drawing.Bitmap bmp = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(srcFile);
- for (int x = 0; x < bmp.Width; x++)
- {
- for (int y = 0; y < bmp.Height; y++)
- {
- var color = bmp.GetPixel(x, y);
- if (Conversions.ContainsKey(color))
- {
- bmp.SetPixel(x, y, Conversions[color]);
- }
- }
- }
- bmp.Save(destFile);
- }
- }
-}
\ No newline at end of file
diff --git a/CityGame/MainWindow.cs b/CityGame/MainWindow.cs
index 70e5ecf..86da893 100644
--- a/CityGame/MainWindow.cs
+++ b/CityGame/MainWindow.cs
@@ -13,6 +13,7 @@ using System.Linq;
using OrpticonGameHelper;
using OrpticonGameHelper.Classes.Elements;
using static CityGame.Classes.Entities.Car;
+using OrpticonGameHelper.Classes.Misc;
namespace CityGame
{
@@ -190,6 +191,8 @@ namespace CityGame
int NPCCount = (int)Math.Ceiling(mapHeight * mapWidth / 100f);
//NPCCount = 1;
//NPCCount = 0;
+ //NPCCount /= 2;
+ //NPCCount *= 8;
random = new Random(seed);
@@ -533,9 +536,9 @@ namespace CityGame
Canvas.SetTop(entity.Object, entity.VisualY);
}
Car.OccupiedTiles = Car.OccupiedTilesFill;
- Car.OccupiedTilesFill = new Dictionary();
+ Car.OccupiedTilesFill = new System.Collections.Concurrent.ConcurrentDictionary();
Car.OccupiedTiles2 = Car.OccupiedTilesFill2;
- Car.OccupiedTilesFill2 = new Dictionary();
+ Car.OccupiedTilesFill2 = new System.Collections.Concurrent.ConcurrentDictionary();
}
}
}
\ No newline at end of file
diff --git a/CityGame/Program.cs b/CityGame/Program.cs
index 89bba1b..6ffe6d7 100644
--- a/CityGame/Program.cs
+++ b/CityGame/Program.cs
@@ -1,8 +1,10 @@
-namespace CityGame
+using CityGame.Classes.Menu;
+
+namespace CityGame
{
public class Program {
public static void Main() {
- var menu = new MainWindow();
+ var game = new MainWindow();
}
}
}
\ No newline at end of file