El pathfinding en Warman no puede usar un grafo 2D plano. El mapa no es un plano. Tiene acantilados, plataformas elevadas, rampas, puentes y agujeros. Un enemigo en el nivel superior no puede caminar hasta una unidad en el nivel inferior sin encontrar una rampa. El sistema de pathfinding necesita entender la altura.
La Cuadricula de Nodos
La cuadricula de nodos se construye a partir de los datos de terreno. Cada celda de terreno caminable se convierte en uno o mas nodos, dependiendo de cuantas capas de altura existen en esa posicion X/Z. Un puente crea dos nodos en la misma posicion 2D: uno en el nivel del suelo, otro a la altura del puente. Cada nodo almacena su posicion 3D, la referencia de superficie, y un flag de caminabilidad.
El conteo de capas se determina por el rango de altura de la capa de acantilados. Si el acantilado mas alto de una sala es de 4 unidades, la cuadricula tiene 5 capas posibles (Y=0 hasta Y=4). Las celdas no caminables no producen nodos. La cuadricula es dispersa: una sala de terreno de 30x30 con un nivel de altura produce unos 900 nodos, pero con multiples niveles eso puede ser 1800+.
Nodos de Rampa
Los nodos de rampa se insertan donde las rampas conectan diferentes niveles de altura. Cada nodo de rampa almacena una posicion Y interpolada entre los niveles de inicio y fin de la rampa. Esto permite a la IA subir y bajar suavemente. La velocidad de movimiento, colision con paredes y navegacion de rampas acaban siendo identicas a las de un jugador humano.
Superficies
Despues de construir la cuadricula, el sistema ejecuta una busqueda BFS desde cada nodo no visitado para identificar regiones conectadas. Cada region se convierte en una "superficie", un HashSet de nodos que son alcanzables entre si sin cambiar de nivel de altura (excepto a traves de rampas). Si dos unidades estan en la misma superficie, pueden alcanzarse mutuamente. Si estan en superficies diferentes, no pueden.
El A*
El A* en si es estandar: un Binary Heap para el conjunto abierto, un HashSet para el conjunto cerrado, heuristica Manhattan ajustada para movimiento diagonal. Los vecinos incluyen las 16 posiciones adyacentes: 8 horizontales (4 cardinales + 4 diagonales) y 8 verticales (las mismas 8 en la capa adyacente, si existe un nodo caminable ahi).
El movimiento diagonal tiene un check de colision adicional. Para moverse en diagonal (por ejemplo, noreste), ambas celdas cardinales adyacentes (norte Y este) deben ser caminables. La restriccion evita que las unidades corten esquinas a traves de las paredes.
El Agente de Movimiento
El AstarAgent toma un camino del sistema de pathfinding y lo sigue tick a tick. El agente se mueve hacia el siguiente waypoint a su velocidad de movimiento, con deteccion de colision contra el terreno usando el radio del colisionador de la unidad. Si una colision bloquea el movimiento directo, el agente intenta movimiento separado por ejes (primero solo X, luego solo Z) para permitir deslizamiento por las paredes.