public bool Equals(BoardGrid other) { for (int col = 0; col < this.GetColCount(); col++) { for (int row = 0; row < this.GetRowCount(); row++) { // This' properties Face face = this.GetFace(col, row); Vertex vertexL = this.GetVertex(col, row, VertexSpecifier.L); Vertex vertexR = this.GetVertex(col, row, VertexSpecifier.R); Edge edgeW = this.GetEdge(col, row, EdgeSpecifier.W); Edge edgeN = this.GetEdge(col, row, EdgeSpecifier.N); Edge edgeE = this.GetEdge(col, row, EdgeSpecifier.E); // Other's properties Face faceOther = other.GetFace(col, row); Vertex vertexLOther = other.GetVertex(col, row, VertexSpecifier.L); Vertex vertexROther = other.GetVertex(col, row, VertexSpecifier.R); Edge edgeWOther = other.GetEdge(col, row, EdgeSpecifier.W); Edge edgeNOther = other.GetEdge(col, row, EdgeSpecifier.N); Edge edgeEOther = other.GetEdge(col, row, EdgeSpecifier.E); // Comparing face if (face == null) { if (faceOther != null) { return(false); } } else { if (!face.Equals(faceOther)) { return(false); } } // Comparing vertices if (vertexL == null) { if (vertexLOther != null) { return(false); } } else { if (!vertexL.Equals(vertexLOther)) { return(false); } } if (vertexR == null) { if (vertexROther != null) { return(false); } } else { if (!vertexR.Equals(vertexROther)) { return(false); } } // Comparing edges if (edgeW == null) { if (edgeWOther != null) { return(false); } } else { if (!edgeW.Equals(edgeWOther)) { return(false); } } if (edgeN == null) { if (edgeNOther != null) { return(false); } } else { if (!edgeN.Equals(edgeNOther)) { return(false); } } if (edgeE == null) { if (edgeNOther != null) { return(false); } } else { if (!edgeE.Equals(edgeEOther)) { return(false); } } } } return(true); }
public static void WriteBoard(this NetworkWriter writer, BoardGrid boardGrid) { writer.WriteInt32(boardGrid.GetColCount()); writer.WriteInt32(boardGrid.GetRowCount()); for (int col = 0; col < boardGrid.GetColCount(); col++) { for (int row = 0; row < boardGrid.GetRowCount(); row++) { // Serialize col, row face Face face = boardGrid.GetFace(col, row); if (face == null) { writer.WriteBoolean(false); } else if (face.tile == null) { writer.WriteBoolean(true); writer.WriteBoolean(false); } else { writer.WriteBoolean(true); writer.WriteBoolean(true); writer.WriteInt32((int)face.tile.resourceType); writer.WriteInt32(face.tile.chanceValue); } // Serialize col, row vertices L and R Vertex vertexL = boardGrid.GetVertex(col, row, BoardGrid.VertexSpecifier.L); Vertex vertexR = boardGrid.GetVertex(col, row, BoardGrid.VertexSpecifier.R); if (vertexL == null) { writer.WriteBoolean(false); } else if (vertexL.settlement == null) { writer.WriteBoolean(true); writer.WriteBoolean(false); } else { writer.WriteBoolean(true); writer.WriteBoolean(true); writer.WriteString(vertexL.settlement.ownerId); writer.WriteBoolean(vertexL.settlement.isCity); } if (vertexR == null) { writer.WriteBoolean(false); } else if (vertexR.settlement == null) { writer.WriteBoolean(true); writer.WriteBoolean(false); } else { writer.WriteBoolean(true); writer.WriteBoolean(true); writer.WriteString(vertexR.settlement.ownerId); writer.WriteBoolean(vertexR.settlement.isCity); } // Serialize col, row edges W, N and E Edge edgeW = boardGrid.GetEdge(col, row, BoardGrid.EdgeSpecifier.W); Edge edgeN = boardGrid.GetEdge(col, row, BoardGrid.EdgeSpecifier.N); Edge edgeE = boardGrid.GetEdge(col, row, BoardGrid.EdgeSpecifier.E); if (edgeW == null) { writer.WriteBoolean(false); } else if (edgeW.road == null) { writer.WriteBoolean(true); writer.WriteBoolean(false); } else { writer.WriteBoolean(true); writer.WriteBoolean(true); writer.WriteString(edgeW.road.ownerId); } if (edgeN == null) { writer.WriteBoolean(false); } else if (edgeN.road == null) { writer.WriteBoolean(true); writer.WriteBoolean(false); } else { writer.WriteBoolean(true); writer.WriteBoolean(true); writer.WriteString(edgeN.road.ownerId); } if (edgeE == null) { writer.WriteBoolean(false); } else if (edgeE.road == null) { writer.WriteBoolean(true); writer.WriteBoolean(false); } else { writer.WriteBoolean(true); writer.WriteBoolean(true); writer.WriteString(edgeE.road.ownerId); } } } }
/** * Roads must be connected to a settlement or another road. */ public bool CanPlaceRoad(Player player, int col, int row, BoardGrid.EdgeSpecifier edgeSpec) { // Check if connected to a settlement of the same player bool validbuildingWithNoRoadsNearby = false; bool validbuildingNearby = false; List <Vertex> adjacentVertices = boardGrid.GetConnectedVerticesFromEdge(col, row, edgeSpec); foreach (Vertex vertex in adjacentVertices) { Settlement buildingObject = vertex.settlement; if (buildingObject != null) { if (buildingObject != null) { if (buildingObject.ownerId == player.GetId()) { validbuildingNearby = true; int[] vertexPos = boardGrid.GetVertexPosition(vertex); if (vertexPos != null) { List <Edge> edgesTemp = boardGrid.GetAdjacentEdgesFromVertex(vertexPos[0], vertexPos[1], (BoardGrid.VertexSpecifier)vertexPos[2]); int roadCount = 0; foreach (Edge edgeTemp in edgesTemp) { if (edgeTemp.road != null) { roadCount++; } } if (roadCount == 0) { validbuildingWithNoRoadsNearby = true; } } } } } } // Check if connected to a road of the same player bool validRoadNearby = false; List <Edge> adjacentEdges = boardGrid.GetConnectedEdgesFromEdge(col, row, edgeSpec); foreach (Edge adjacentEdge in adjacentEdges) { if (adjacentEdge.road != null) { if (adjacentEdge.road.ownerId == player.GetId()) { // Check that if the road is connected, that it is not interrupted by an enemy settlement int[] adjacentEdgeCoords = boardGrid.GetEdgeCoordinates(adjacentEdge); Vertex vertexBetweenRoads = boardGrid.GetVertexBetweenTwoConnectedEdges(col, row, edgeSpec, adjacentEdgeCoords[0], adjacentEdgeCoords[1], (BoardGrid.EdgeSpecifier)adjacentEdgeCoords[2]); if (vertexBetweenRoads.settlement != null) { if (vertexBetweenRoads.settlement.ownerId == player.GetId()) { validRoadNearby = true; } } else { validRoadNearby = true; } } } } // If it's the second turn, only let the player place next to the settlement with no road if (GameManager.Instance.GetTurnCycle() == 2 && !validbuildingWithNoRoadsNearby) { return(false); } if (!validRoadNearby && !validbuildingNearby) { return(false); } // Check if cost requirements met if (!player.CanAffordResourceTransaction(1, 0, 0, 1, 0) && player.freeRoads <= 0) { return(false); } // Check to see if tile is empty and have enough roads in store Edge edge = boardGrid.GetEdge(col, row, edgeSpec); if (edge.road == null && player.storeRoadNum > 0) { return(true); } else { return(false); } }
public static BoardGrid ReadBoard(NetworkReader reader) { int cols = reader.ReadInt32(); int rows = reader.ReadInt32(); BoardGrid boardGrid = new BoardGrid(cols, rows); for (int col = 0; col < cols; col++) { for (int row = 0; row < rows; row++) { // Face exists? bool faceExists = reader.ReadBoolean(); if (faceExists) { // Face col, row boardGrid.CreateFace(col, row); bool tileExists = reader.ReadBoolean(); if (tileExists) { boardGrid.GetFace(col, row).tile = new Tile(); boardGrid.GetFace(col, row).tile.resourceType = (ResourceType)reader.ReadInt32(); boardGrid.GetFace(col, row).tile.chanceValue = reader.ReadInt32(); } } // Vertex L exists? bool vertexLExists = reader.ReadBoolean(); if (vertexLExists) { boardGrid.CreateVertex(col, row, BoardGrid.VertexSpecifier.L); bool settlementExists = reader.ReadBoolean(); if (settlementExists) { boardGrid.GetVertex(col, row, BoardGrid.VertexSpecifier.L).settlement = new Settlement(); boardGrid.GetVertex(col, row, BoardGrid.VertexSpecifier.L).settlement.ownerId = reader.ReadString(); boardGrid.GetVertex(col, row, BoardGrid.VertexSpecifier.L).settlement.isCity = reader.ReadBoolean(); } } // Vertex R exists? bool vertexRExists = reader.ReadBoolean(); if (vertexRExists) { boardGrid.CreateVertex(col, row, BoardGrid.VertexSpecifier.R); bool settlementExists = reader.ReadBoolean(); if (settlementExists) { boardGrid.GetVertex(col, row, BoardGrid.VertexSpecifier.R).settlement = new Settlement(); boardGrid.GetVertex(col, row, BoardGrid.VertexSpecifier.R).settlement.ownerId = reader.ReadString(); boardGrid.GetVertex(col, row, BoardGrid.VertexSpecifier.R).settlement.isCity = reader.ReadBoolean(); } } // Edge W exists? bool edgeWExists = reader.ReadBoolean(); if (edgeWExists) { boardGrid.CreateEdge(col, row, BoardGrid.EdgeSpecifier.W); bool roadExists = reader.ReadBoolean(); if (roadExists) { boardGrid.GetEdge(col, row, BoardGrid.EdgeSpecifier.W).road = new Road(); boardGrid.GetEdge(col, row, BoardGrid.EdgeSpecifier.W).road.ownerId = reader.ReadString(); } } // Edge N exists? bool edgeNExists = reader.ReadBoolean(); if (edgeNExists) { boardGrid.CreateEdge(col, row, BoardGrid.EdgeSpecifier.N); bool roadExists = reader.ReadBoolean(); if (roadExists) { boardGrid.GetEdge(col, row, BoardGrid.EdgeSpecifier.N).road = new Road(); boardGrid.GetEdge(col, row, BoardGrid.EdgeSpecifier.N).road.ownerId = reader.ReadString(); } } // Edge E exists? bool edgeEExists = reader.ReadBoolean(); if (edgeEExists) { boardGrid.CreateEdge(col, row, BoardGrid.EdgeSpecifier.E); bool roadExists = reader.ReadBoolean(); if (roadExists) { boardGrid.GetEdge(col, row, BoardGrid.EdgeSpecifier.E).road = new Road(); boardGrid.GetEdge(col, row, BoardGrid.EdgeSpecifier.E).road.ownerId = reader.ReadString(); } } } } return(boardGrid); }