Na začátku hry se mapa na serveru synchronizuje s mapou u clienta. Rozšířen spritesheet monitoru o remote dveře. Přidána GlobalClassLib pro kód sdílený mezi clientem a serverem. Základ pro implementaci ovládání remote dveří.
This commit is contained in:
parent
8801a7c919
commit
7e6b3d724b
25 changed files with 374 additions and 67 deletions
|
|
@ -1,17 +1,19 @@
|
|||
using GlobalClassLib;
|
||||
|
||||
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, ConnectorType type)[]> halfConnectors = new(){
|
||||
[(0, 0)] =[(1, 0, 1, ConnectorType.HALL), (0, 1, 1, ConnectorType.DOOR_REMOTE)],
|
||||
[(1, 0)] =[(2, 0, 1, ConnectorType.DOOR_OFFICE), (1, 1, 1, ConnectorType.DOOR_REMOTE)],
|
||||
[(3, 0)] =[(2, 0, 1, ConnectorType.DOOR_OFFICE), (4, 0, 1, ConnectorType.HALL), (3, 1, 1, ConnectorType.DOOR_REMOTE)],
|
||||
[(4, 0)] =[(4, 1, 1, ConnectorType.DOOR_REMOTE)],
|
||||
[(0, 1)] =[(1, 1, 1, ConnectorType.HALL)],
|
||||
[(1, 1)] =[(1, 2, 1, ConnectorType.DOOR_REMOTE)],
|
||||
[(2, 1)] =[(2, 2, 1, ConnectorType.HALL), (2, 0, 1, ConnectorType.DOOR_OFFICE)],
|
||||
[(3, 1)] =[(3, 2, 1, ConnectorType.DOOR_REMOTE), (4, 1, 1, ConnectorType.HALL)]
|
||||
};
|
||||
|
||||
private static Dictionary<(int x1, int y1), (int x2, int y2, int value)[]> mainHallwayConnectors = new(){
|
||||
|
|
@ -24,24 +26,42 @@ public static class MapManager {
|
|||
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, j] = new MapTile(MapTile.CoordsToId(i, j), null); // TODO: implement ownership
|
||||
}
|
||||
map[i, 2] = new MapTile(i * 5 + 2, null);
|
||||
map[i, 2] = new MapTile(MapTile.CoordsToId(i, 2), null);
|
||||
for (int j = 3; j < 5; j++){
|
||||
map[i, j] = new MapTile(i * 5 + j, null);
|
||||
map[i, j] = new MapTile(MapTile.CoordsToId(i, 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());
|
||||
map[con.Key.x1, con.Key.y1].AddConnectors(con.Value.Select(c => new TileConnector(map[c.x2, c.y2], 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());
|
||||
map[con.Key.x1, con.Key.y1].AddConnectors(con.Value.Select(c => new TileConnector(map[c.x2, c.y2], c.type, 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());
|
||||
map[4 - con.Key.x1, 4 - con.Key.y1].AddConnectors(con.Value.Select(c => new TileConnector(map[4 - c.x2, 4 - c.y2], c.type, c.value)).ToArray());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static TileConnector[] GetAllConnectors() {
|
||||
List<TileConnector> connectors = new();
|
||||
|
||||
for (int i = 0; i < 5; i++){
|
||||
for (int j = 0; j < 5; j++){
|
||||
Array.ForEach(map[i, j].GetAllConnectors(), c => {
|
||||
if(c.Tiles.tile1.Id < c.Tiles.tile2.Id)
|
||||
connectors.Add(c);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return connectors.ToArray();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,25 +1,44 @@
|
|||
using System.Net.Security;
|
||||
using GlobalClassLib;
|
||||
|
||||
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;
|
||||
public class MapTile : GlobalMapTile<TileConnector, MapTile> {
|
||||
public ServerPlayer Owner{ get; private set; }
|
||||
|
||||
private List<TileConnector> Connectors { get; set; } = new();
|
||||
|
||||
public MapTile(int id, ServerPlayer owner) {
|
||||
Id = id;
|
||||
public MapTile(int id, ServerPlayer owner) : base(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
|
||||
// public int Id { get; private set; }
|
||||
// public ServerPlayer Owner { get; private set; }
|
||||
// public bool Lit { get; set; } = false;
|
||||
//
|
||||
// private List<TileConnector> connectors = 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}]"; // for debug purposes
|
||||
//
|
||||
// public TileConnector? GetConnector(int id) {
|
||||
// foreach (var con in connectors){
|
||||
// if (con.Tiles.Item2.Id == id) return con;
|
||||
// }
|
||||
//
|
||||
// return null;
|
||||
// }
|
||||
|
||||
}
|
||||
|
|
@ -1,18 +1,45 @@
|
|||
using GlobalClassLib;
|
||||
|
||||
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 class TileConnector : GlobalTileConnector<MapTile,TileConnector> {
|
||||
public int Value{ get; set; }
|
||||
public bool Blocked { get; set; }
|
||||
public TileConnector(MapTile tile1, MapTile tile2, ConnectorType type, int value) : base(tile1, tile2, type) {
|
||||
Value = 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
|
||||
public TileConnector(MapTile tile2, ConnectorType type, int value) : base(tile2, type) {
|
||||
Value = value;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// private readonly MapTile _tile1;
|
||||
// private readonly MapTile _tile2;
|
||||
//
|
||||
// public TileConnector(MapTile tile1, MapTile tile2, TileConnector.ConnectorType type, int value) {
|
||||
// _tile1 = tile1;
|
||||
// _tile2 = tile2;
|
||||
// Type = type;
|
||||
// Value = value;
|
||||
// }
|
||||
//
|
||||
// public (MapTile, MapTile) Tiles => (tile1: _tile1, tile2: _tile2);
|
||||
//
|
||||
// public ConnectorType Type { get; set; }
|
||||
// public bool Blocked { get; set; } = false;
|
||||
// public int Value{ get; set; }
|
||||
//
|
||||
// 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_REMOTE,
|
||||
// DOOR_OFFICE,
|
||||
// VENT
|
||||
// }
|
||||
|
||||
public override TileConnector Clone() => new(Tiles.tile1, Tiles.tile2, Type, Value);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue