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); } } } }
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); }
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); }