public void Start() { var neighborCubePositions = HexHelper.GetOffsetClockwise(); for (var i = 0; i < 6; i++) { var wallObj = Walls[i]; var cubeOffsetPosition = neighborCubePositions[i]; var checkedCubeCoords = Node.CubeCoords + cubeOffsetPosition; var neighbor = Neighbors.SingleOrDefault(x => x.CubeCoords == checkedCubeCoords); var hasWall = neighbor == null; wallObj.SetActive(hasWall); } ExitMarker.SetActive(IsExit); }
public void CubeDrawLine_DifferentPoints_LineIsSolid(int sOffsetX, int sOffsetY, int offsetX, int offsetY) { // ARRANGE var startCubeCoords = HexHelper.ConvertToCube(sOffsetX, sOffsetY); var finishCubeCoords = HexHelper.ConvertToCube(offsetX, offsetY); // ACT var line = CubeCoordsHelper.CubeDrawLine(startCubeCoords, finishCubeCoords); // ASSERT foreach (var coord in line) { var sameCoords = line.Where(x => x == coord); sameCoords.Count().Should().Be(1); // Проверяем, что у каждой точки линии есть соседи, // т.е. нет изолированных разорванных точк. var neibourOffsets = HexHelper.GetOffsetClockwise(); var hasNeighbor = false; foreach (var neibourOffset in neibourOffsets) { var neighborCoord = coord + neibourOffset; var foundCoords = line.Where(x => x == neighborCoord); var hasNeighborInThisDirection = foundCoords.Any(); if (hasNeighborInThisDirection) { hasNeighbor = true; } } hasNeighbor.Should().Be(true); } }
public void Use(Agent agent, Globe globe, IDice dice) { globe.LocalitiesCells.TryGetValue(agent.Location, out var currentLocality); var highestBranchs = agent.Skills .Where(x => /*x.Key != BranchType.Politics &&*/ x.Value >= 1) .OrderBy(x => x.Value); if (!highestBranchs.Any()) { return; } var firstBranch = highestBranchs.First(); // Обнаружение свободных узлов для размещения населённого пункта. // Свободные узлы ишутся от текущей локации агента. TerrainCell freeLocaltion = null; var nextCoords = HexHelper.GetOffsetClockwise(); var agentCubeCoords = HexHelper.ConvertToCube(agent.Location.Coords.X, agent.Location.Coords.Y); for (var i = 0; i < nextCoords.Length; i++) { var scanCubeCoords = agentCubeCoords + nextCoords[i]; var scanOffsetCoords = HexHelper.ConvertToOffset(scanCubeCoords); var freeX = scanOffsetCoords.X; var freeY = scanOffsetCoords.Y; // Убеждаемся, что проверяемый узел находится в границах мира. var isPointInside = IsPointInsideWorld(freeX, freeY, globe.Terrain); if (!isPointInside) { continue; } // Проверка, есть ли в найденной локации населённые пункты. var freeLocaltion1 = globe.Terrain[freeX][freeY]; if (!globe.LocalitiesCells.TryGetValue(freeLocaltion1, out var freeCheckLocality)) { freeLocaltion = globe.Terrain[freeX][freeY]; } } if (freeLocaltion != null) { // Свободный узел был найден. // Тогда создаём здесь населённый пункт с доминирующей специаьностью агента. // Популяция нового нас.пункта минимальна. // Одна единица популяци из текущего нас.пункта снимается. // Считается, что часть жителей мигрировали для начала строительства нового нас.пункта. var localityName = globe.GetLocalityName(dice); var createdLocality = new Locality { Name = localityName, Branches = new Dictionary <BranchType, int> { { firstBranch.Key, 1 } }, Cell = freeLocaltion, Population = 1, Owner = currentLocality.Owner }; currentLocality.Population--; globe.Localities.Add(createdLocality); globe.LocalitiesCells[freeLocaltion] = createdLocality; globe.ScanResult.Free.Remove(freeLocaltion); } else { // Если не удалось найти свободный узел, // то агент перемещается в произвольный населённый пункт своего государства. TransportHelper.TransportAgentToRandomLocality(globe, dice, agent, currentLocality); } }
/// <summary>Возвращает узлы, напрямую соединённые с указанным узлом.</summary> /// <param name="node">Опорный узел, относительно которого выбираются соседние узлы.</param> /// <returns>Возвращает набор соседних узлов.</returns> public override IEnumerable <IMapNode> GetNext(IMapNode node) { var hexCurrent = (HexNode)node; var offsetCoords = new OffsetCoords(hexCurrent.OffsetX, hexCurrent.OffsetY); var segmentX = offsetCoords.X / _segmentSize; if (offsetCoords.X < 0) { segmentX--; } var segmentY = offsetCoords.Y / _segmentSize; if (offsetCoords.Y < 0) { segmentY--; } var localOffsetX = NormalizeNeighborCoord(offsetCoords.X % _segmentSize); var localOffsetY = NormalizeNeighborCoord(offsetCoords.Y % _segmentSize); var segmentKey = new SegmentKey(segmentX, segmentY); var matrix = _segmentDict[segmentKey]; var directions = HexHelper.GetOffsetClockwise(); var currentCubeCoords = HexHelper.ConvertToCube(localOffsetX, localOffsetY); for (var i = 0; i < 6; i++) { var dir = directions[i]; var neighborLocalCube = new CubeCoords(dir.X + currentCubeCoords.X, dir.Y + currentCubeCoords.Y, dir.Z + currentCubeCoords.Z); var neighborLocalOffset = HexHelper.ConvertToOffset(neighborLocalCube); var neighborSegmentX = segmentX; var neighborSegmentY = segmentY; if (neighborLocalOffset.X < 0) { neighborSegmentX--; } else if (neighborLocalOffset.X >= _segmentSize) { neighborSegmentX++; } if (neighborLocalOffset.Y < 0) { neighborSegmentY--; } else if (neighborLocalOffset.Y >= _segmentSize) { neighborSegmentY++; } IMapNode currentNeibour; if (neighborSegmentX == segmentX && neighborSegmentY == segmentY) { currentNeibour = matrix[neighborLocalOffset.X, neighborLocalOffset.Y]; if (currentNeibour == null) { continue; } yield return(currentNeibour); } } }