some nondescript nonsense

This commit is contained in:
pan.codes 2023-05-14 20:01:21 +02:00
parent 59ae0bc41a
commit b52c26cdcd
6 changed files with 83 additions and 57 deletions

View file

@ -18,6 +18,7 @@
<PackageReference Include="NAudio" Version="2.1.0" /> <PackageReference Include="NAudio" Version="2.1.0" />
<PackageReference Include="NAudio.Lame" Version="2.0.1" /> <PackageReference Include="NAudio.Lame" Version="2.0.1" />
<PackageReference Include="SimplexNoise" Version="2.0.0" /> <PackageReference Include="SimplexNoise" Version="2.0.0" />
<PackageReference Include="System.Collections.Concurrent" Version="4.3.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -7,6 +7,10 @@ using System.Diagnostics;
using System.Linq; using System.Linq;
using OrpticonGameHelper; using OrpticonGameHelper;
using OrpticonGameHelper.Classes.Elements; using OrpticonGameHelper.Classes.Elements;
using System.Threading;
using AStar;
using System.Threading.Tasks;
using System.Collections.Concurrent;
namespace CityGame.Classes.Entities namespace CityGame.Classes.Entities
{ {
@ -37,10 +41,10 @@ namespace CityGame.Classes.Entities
} }
public float Speed { get; set; } = 128; public float Speed { get; set; } = 128;
float currentSpeed = 0; float currentSpeed = 0;
public static Dictionary<Tile, Car> OccupiedTilesFill = new Dictionary<Tile, Car>(); public static ConcurrentDictionary<Tile, Car> OccupiedTilesFill = new ConcurrentDictionary<Tile, Car>();
public static Dictionary<Tile, Car> OccupiedTiles = new Dictionary<Tile, Car>(); public static ConcurrentDictionary<Tile, Car> OccupiedTiles = new ConcurrentDictionary<Tile, Car>();
public static Dictionary<Tile, Car> OccupiedTilesFill2 = new Dictionary<Tile, Car>(); public static ConcurrentDictionary<Tile, Car> OccupiedTilesFill2 = new ConcurrentDictionary<Tile, Car>();
public static Dictionary<Tile, Car> OccupiedTiles2 = new Dictionary<Tile, Car>(); public static ConcurrentDictionary<Tile, Car> OccupiedTiles2 = new ConcurrentDictionary<Tile, Car>();
protected string PNGFile = "NPCCar.png"; protected string PNGFile = "NPCCar.png";
protected ColoredRectangle debugRect; protected ColoredRectangle debugRect;
protected Tile lastTile; protected Tile lastTile;
@ -96,8 +100,15 @@ namespace CityGame.Classes.Entities
private int curveMode; private int curveMode;
private float curveModePixelDuration; private float curveModePixelDuration;
private int curveModeStartedAt; private int curveModeStartedAt;
private bool pathfindingInProgress;
public override void Tick(long deltaTime) private async Task<Point[]> 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 /= 10;
//deltaTime *= 500; //deltaTime *= 500;
@ -119,15 +130,23 @@ namespace CityGame.Classes.Entities
else lights.ForEach(x => x.Visible = true); else lights.ForEach(x => x.Visible = true);
if (Target is not null) if (Target is not null)
{ {
if (pathfindingInProgress) return;
//if(Object is not null) Object.ToolTip = Target.ToString(); //if(Object is not null) Object.ToolTip = Target.ToString();
if (Path is null) if (Path is null && !pathfindingInProgress)
{ {
pathfindingInProgress = true;
var pf = MainWindow.pathfinder; var pf = MainWindow.pathfinder;
if (grid == 2) pf = MainWindow.pathfinderDesperate; 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; NextTarget = 0;
pathfindingInProgress = false;
} }
if (new Point(Target.X() / 64, Target.Y() / 64) != Point) Move(this); if (new Point(Target.X() / 64, Target.Y() / 64) != Point) Move(this);
if (Path is null) return;
if (Path.Length == 0) if (Path.Length == 0)
{ {
JourneyImpossible(this); JourneyImpossible(this);
@ -146,13 +165,13 @@ namespace CityGame.Classes.Entities
JourneyFinished(this); JourneyFinished(this);
if (Math.Round(Rotation) == 0 || Math.Round(Rotation) == 90) if (Math.Round(Rotation) == 0 || Math.Round(Rotation) == 90)
{ {
if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.Add(myTile, this); if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.TryAdd(myTile, this);
if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.Add(myTile, this); if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.TryAdd(myTile, this);
} }
if (Math.Round(Rotation) == 180 || Math.Round(Rotation) == 270) if (Math.Round(Rotation) == 180 || Math.Round(Rotation) == 270)
{ {
if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.Add(myTile, this); if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.TryAdd(myTile, this);
if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.Add(myTile, this); if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.TryAdd(myTile, this);
} }
return; return;
} }
@ -172,8 +191,8 @@ namespace CityGame.Classes.Entities
if (Math.Round(Rotation) == 0 || Math.Round(Rotation) == 90) if (Math.Round(Rotation) == 0 || Math.Round(Rotation) == 90)
{ {
if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.Add(myTile, this); if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.TryAdd(myTile, this);
if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.Add(myTile, this); if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.TryAdd(myTile, this);
if (OccupiedTiles.ContainsKey(targetTile) && OccupiedTiles[targetTile] != this) if (OccupiedTiles.ContainsKey(targetTile) && OccupiedTiles[targetTile] != this)
{ {
SpeedMulti = 0; SpeedMulti = 0;
@ -182,8 +201,8 @@ namespace CityGame.Classes.Entities
} }
if (Math.Round(Rotation) == 180 || Math.Round(Rotation) == 270) if (Math.Round(Rotation) == 180 || Math.Round(Rotation) == 270)
{ {
if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.Add(myTile, this); if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.TryAdd(myTile, this);
if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.Add(myTile, this); if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.TryAdd(myTile, this);
if (OccupiedTiles2.ContainsKey(targetTile) && OccupiedTiles2[targetTile] != this) if (OccupiedTiles2.ContainsKey(targetTile) && OccupiedTiles2[targetTile] != this)
{ {
SpeedMulti = 0; SpeedMulti = 0;
@ -285,13 +304,13 @@ namespace CityGame.Classes.Entities
{ {
if (Math.Round(Rotation) == 0 || Math.Round(Rotation) == 90) if (Math.Round(Rotation) == 0 || Math.Round(Rotation) == 90)
{ {
if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.Add(myTile, this); if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.TryAdd(myTile, this);
if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.Add(myTile, this); if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.TryAdd(myTile, this);
} }
if (Math.Round(Rotation) == 180 || Math.Round(Rotation) == 270) if (Math.Round(Rotation) == 180 || Math.Round(Rotation) == 270)
{ {
if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.Add(myTile, this); if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.TryAdd(myTile, this);
if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.Add(myTile, this); if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.TryAdd(myTile, this);
} }
} }
} }

View file

@ -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<StaticData> list = new List<StaticData>();
public static void Reset()
{
list.ForEach(x => x.obj = null);
}
}
public class StaticData<T> : StaticData
{
public StaticData(T obj)
{
this.obj = obj;
}
public T Value { get => (T)obj; }
public static implicit operator StaticData<T>(T obj)
{
return new StaticData<T>(obj);
}
public static implicit operator T(StaticData<T> d)
{
return d.Value;
}
}
}

View file

@ -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<string, string> conversions)
{
destFile = Environment.CurrentDirectory + "\\Resources\\" + destFile + ".png";
//if (File.Exists(destFile)) return;
srcFile = Environment.CurrentDirectory + "\\Resources\\" + srcFile + ".png";
if (!File.Exists(srcFile)) return;
Dictionary<System.Drawing.Color, System.Drawing.Color> Conversions = conversions.Select(x => new KeyValuePair<System.Drawing.Color, System.Drawing.Color>(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);
}
}
}

View file

@ -13,6 +13,7 @@ using System.Linq;
using OrpticonGameHelper; using OrpticonGameHelper;
using OrpticonGameHelper.Classes.Elements; using OrpticonGameHelper.Classes.Elements;
using static CityGame.Classes.Entities.Car; using static CityGame.Classes.Entities.Car;
using OrpticonGameHelper.Classes.Misc;
namespace CityGame namespace CityGame
{ {
@ -190,6 +191,8 @@ namespace CityGame
int NPCCount = (int)Math.Ceiling(mapHeight * mapWidth / 100f); int NPCCount = (int)Math.Ceiling(mapHeight * mapWidth / 100f);
//NPCCount = 1; //NPCCount = 1;
//NPCCount = 0; //NPCCount = 0;
//NPCCount /= 2;
//NPCCount *= 8;
random = new Random(seed); random = new Random(seed);
@ -533,9 +536,9 @@ namespace CityGame
Canvas.SetTop(entity.Object, entity.VisualY); Canvas.SetTop(entity.Object, entity.VisualY);
} }
Car.OccupiedTiles = Car.OccupiedTilesFill; Car.OccupiedTiles = Car.OccupiedTilesFill;
Car.OccupiedTilesFill = new Dictionary<Tile, Car>(); Car.OccupiedTilesFill = new System.Collections.Concurrent.ConcurrentDictionary<Tile, Car>();
Car.OccupiedTiles2 = Car.OccupiedTilesFill2; Car.OccupiedTiles2 = Car.OccupiedTilesFill2;
Car.OccupiedTilesFill2 = new Dictionary<Tile, Car>(); Car.OccupiedTilesFill2 = new System.Collections.Concurrent.ConcurrentDictionary<Tile, Car>();
} }
} }
} }

View file

@ -1,8 +1,10 @@
namespace CityGame using CityGame.Classes.Menu;
namespace CityGame
{ {
public class Program { public class Program {
public static void Main() { public static void Main() {
var menu = new MainWindow(); var game = new MainWindow();
} }
} }
} }