Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        /// <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);
                }
            }
        }