public override void CalculateDirection() { if ((mode == GhostMode.Chase || mode == GhostMode.Scatter) && mode != Game.ghostMode) { nextDirection = DirectionHelper.Opposite(direction); mode = Game.ghostMode; } else { double d = 0; if (nodeFrom.neighbors[direction] != null) { d = Helper.CalculateDistance(nodeFrom.x, nodeFrom.y, nodeFrom.neighbors[direction].node.x, nodeFrom.neighbors[direction].node.y); } if (Math.Abs(distance - d) < speed) { CalculateTarget(); double minDistance = -1; Node baseNode = nodeFrom; if (baseNode.neighbors[direction] != null) { baseNode = baseNode.neighbors[direction].node; } foreach (Direction key in baseNode.neighbors.Keys) { if (baseNode.neighbors[key] != null) { double distanceBetween = Helper.CalculateDistance(baseNode.neighbors[key].node.x, baseNode.neighbors[key].node.y, targetX, targetY); if ((distanceBetween < minDistance || minDistance == -1) && !DirectionHelper.IsOpposite(direction, key)) { minDistance = distanceBetween; nextDirection = key; } } } } } }