Přidány základy generování mapy (zatím pouze server-side, bez zrcadlení do clienta)

This commit is contained in:
Perry 2026-02-01 14:53:27 +01:00
parent 8a3267cc4b
commit 8801a7c919
6 changed files with 100 additions and 1 deletions

View file

@ -0,0 +1,47 @@
namespace FNAF_Server.Map;
public static class MapManager {
private static MapTile[,] map = new MapTile[5, 5];
private static Dictionary<(int x1, int y1), (int x2, int y2, int value)[]> halfConnectors = new(){
[(0, 0)] =[(1, 0, 1), (0, 1, 1)],
[(1, 0)] =[(2, 0, 1), (1, 1, 1)],
[(3, 0)] =[(2, 0, 1), (4, 0, 1), (3, 1, 1)],
[(4, 0)] =[(4, 1, 1)],
[(0, 1)] =[(1, 1, 1)],
[(1, 1)] =[(1, 2, 1)],
[(2, 1)] =[(2, 2, 1), (2, 0, 1)],
[(3, 1)] =[(3, 2, 1), (4, 1, 1)]
};
private static Dictionary<(int x1, int y1), (int x2, int y2, int value)[]> mainHallwayConnectors = new(){
[(0,2)] = [(1,2,1)],
[(1,2)] = [(2,2,1)],
[(2,2)] = [(3,2,1)],
[(3,2)] = [(4,2,1)]
};
public static void InitMap() { // TODO: make map size not hardcoded
for (int i = 0; i < 5; i++){
for (int j = 0; j < 2; j++){
map[i, j] = new MapTile(i * 5 + j, null); // TODO: implement ownership
}
map[i, 2] = new MapTile(i * 5 + 2, null);
for (int j = 3; j < 5; j++){
map[i, j] = new MapTile(i * 5 + j, null);
}
}
foreach (var con in mainHallwayConnectors){
map[con.Key.x1, con.Key.y1].AddConnectors(con.Value.Select(c => (map[c.x2, c.y2], TileConnector.ConnectorType.HALL, c.value)).ToArray());
}
foreach (var con in halfConnectors){
map[con.Key.x1, con.Key.y1].AddConnectors(con.Value.Select(c => (map[c.x2, c.y2], TileConnector.ConnectorType.HALL, c.value)).ToArray());
}
foreach (var con in halfConnectors){
map[4 - con.Key.x1, 4 - con.Key.y1].AddConnectors(con.Value.Select(c => (map[4 - c.x2, 4 - c.y2], TileConnector.ConnectorType.HALL, c.value)).ToArray());
}
}
}

View file

@ -0,0 +1,25 @@
namespace FNAF_Server.Map;
public class MapTile {
public int Id { get; private set; }
public ServerPlayer Owner { get; private set; }
public bool Lit { get; set; } = false;
private List<TileConnector> Connectors { get; set; } = new();
public MapTile(int id, ServerPlayer owner) {
Id = id;
Owner = owner;
}
public void AddConnector(MapTile tile, TileConnector.ConnectorType type, int value) {
Connectors.Add(new TileConnector(this, tile, type, value));
tile.Connectors.Add(new TileConnector(tile, this, type, value));
}
public void AddConnectors((MapTile tile, TileConnector.ConnectorType type, int value)[] connectors) =>
Array.ForEach(connectors, c => AddConnector(c.tile, c.type, c.value));
public override string ToString() => $"{PositionAsString} -> {string.Join(", ", Connectors.Select(c => c.Tiles.Item2.PositionAsString))}";
public string PositionAsString => $"[{Id / 5}, {Id % 5}]"; // for debug purposes
}

View file

@ -0,0 +1,18 @@
namespace FNAF_Server.Map;
public struct TileConnector(MapTile tile1, MapTile tile2, TileConnector.ConnectorType type, int value) {
public (MapTile, MapTile) Tiles { get; set; } = (tile1, tile2);
public ConnectorType Type { get; set; } = type;
public bool Blocked { get; set; } = false;
public int Value{ get; set; } = value;
public MapTile OtherTile(MapTile tile) => Tiles.Item1 == tile ? Tiles.Item2 : Tiles.Item1;
public override string ToString() => $"Con ({Tiles.Item1.PositionAsString} -> {Tiles.Item2.PositionAsString})";
public enum ConnectorType {
HALL,
DOOR,
VENT
}
}