Beispiel #1
0
        private void AddNextNode(MapPathNode nextNode)
        {
            if ((_bestPathes.Count > 0) && (nextNode.CellNumbers.Length > _bestPathes[0].CellNumbers.Length + 10))
            {
                return;
            }

            var cellNumber = nextNode.CellNumber;

            if (!_matrix.ContainsKey(cellNumber))
            {
                _matrix.Add(cellNumber, nextNode);
                _added = true;
            }
            else
            {
                var oldNode = _matrix[cellNumber];
                if (nextNode.CellNumbers.Length >= oldNode.CellNumbers.Length)
                {
                    if (nextNode.CompareTo(oldNode) == -1)
                    {
                        _matrix[cellNumber] = nextNode;
                        _added = true;
                    }
                }
            }

            if (_destinations.ContainsKey(nextNode.CellNumber))
            {
                if (_bestPathes.Count == 0)
                {
                    _bestPathes.Add(nextNode);
                }
                else
                {
                    var result = nextNode.CompareTo(_bestPathes[0]);
                    if (result <= 0)
                    {
                        if (result < 0)
                        {
                            _bestPathes.Clear();
                        }

                        _bestPathes.Add(nextNode);
                    }
                }
            }
        }
Beispiel #2
0
        public MapPathNode AddCell(string cellNumber, bool isGate, bool isTeleport)
        {
            if (Array.IndexOf(CellNumbers, cellNumber) >= 0)
            {
                return(null);
            }

            var cost  = Cost;
            var jumps = Jumps;

            Cell cell;

            if (!isGate && !isTeleport)
            {
                if (!Map.Cells.TryGetValue(CellNumber, out cell))
                {
                    return(null);
                }

                cost += cell.Cost;
                jumps++;
            }

            var hasTeleport = HasTeleport || isTeleport;

            if (!Map.Cells.TryGetValue(cellNumber, out cell))
            {
                return(null);
            }

            var maxBotLevel = Math.Max(BotLevel, cell.MaxBotLevel);
            var node        = new MapPathNode
            {
                CellNumbers = new string[CellNumbers.Length + 1],
                Costs       = new int[Costs.Length + 1],
            };

            Array.Copy(CellNumbers, node.CellNumbers, CellNumbers.Length);
            Array.Copy(Costs, node.Costs, Costs.Length);

            node.CellNumbers[CellNumbers.Length] = cellNumber;
            node.Costs[Costs.Length]             = cost;
            node.HasTeleport = hasTeleport;
            node.BotLevel    = maxBotLevel;
            node.Jumps       = jumps;
            return(node);
        }
Beispiel #3
0
        private void AddNextNode(MapPathNode nextNode)
        {
            for (var i = 0; i < _treeNext.Count; i++)
            {
                var index = Array.IndexOf(_treeNext[i].CellNumbers, nextNode.CellNumber);
                if (index >= 0)
                {
                    if (nextNode.Cost < _treeNext[i].Costs[index])
                    {
                        _treeNext[i] = nextNode;
                    }
                    else
                    {
                        return;
                    }
                }
            }

            _treeNext.Add(nextNode);
        }