Saltar al contenido

La orden de fuga no tenía asesino

Temaspersecución, órdenes de ia, telemetría, medición

Llevo alrededor de una semana buscando a un asesino. El auto de fuga recibe la orden de huir, la orden termina antes de tiempo, el auto se detiene y nuestra telemetría imprime que la orden murió. Así que salí a buscar qué la estaba cancelando: un decorador (una de las condiciones que la IA del juego pone alrededor de sus comportamientos), otro sistema, alguna pieza de la IA del propio juego metiendo la mano. Descarté cuatro sospechosos midiéndolos y empecé a escribir el enganche que me permitiría preguntarle directamente al motor del juego qué sistema había sido.

En lugar de eso, volqué una sesión entera, seiscientas siete líneas, y la pregunta se desarmó. El motor del juego tiene siete maneras distintas de terminar una orden, y nuestra línea de log las imprimía todas igual. En esa sesión: cuatro fracasos, cuatro éxitos, dos interrupciones. Solo las dos últimas son alguien cancelando algo. Las interesantes son los éxitos, y nadie los estaba mirando, porque un éxito no suena a bug.

Llegan en pares, uno o dos segundos después de dar la orden. Una orden de alejarse que se da por cumplida dos segundos después solo puede significar una cosa: el destino estaba prácticamente donde el auto ya estaba parado. El comando llega, el motor del juego lo da por hecho, y el auto se queda sin ninguna orden, así que se detiene. Eso ya no es un misterio. Es el síntoma que el jugador lleva una semana describiendo: el auto que no acelera.

La otra mitad es por qué nadie le da una orden nueva. Hay una actualización que debería darle un destino nuevo cada cuatro segundos, y solo se dispara con una condición geométrica: el jugador tiene que estar delante del auto, dentro de un cono de unos setenta grados desde el capó. Perseguir a alguien es ir detrás. En cinco minutos de persecución, esa actualización tuvo unas setenta y cinco oportunidades de dar una orden nueva y usó cinco, ninguna después de que el auto se quedara atascado en un puente. El truco del propio jugador lo prueba desde el otro lado: se pone delante del auto, el ángulo cruza el umbral y el auto vuelve a arrancar.

Lo que menos me gusta es que un comentario de mi propio código predecía esto exactamente. Está escrito en el archivo como el riesgo de un cambio que había decidido no hacer: en una persecución el jugador va detrás, así que esto devuelve falso y nada se actualiza, sin log y sin síntoma hasta que alguien note que el auto no acelera. Archivé como trabajo futuro un peligro que ya estaba pasando todas las noches, en el camino que corre casi todo el tiempo.

La lección barata es sobre cómo se nombran las cosas. Nuestro log decía que la orden murió para un estado que significa que se cumplió, y esa sola palabra mandó una semana de trabajo detrás de la pregunta equivocada. Un log que nombra cosas tiene que nombrarlas bien, o es peor que no tener log: se equivoca con total seguridad, y tú le crees.

Nada de esto se arregla esta semana. La persecución está congelada por decisión: cómo se comporta el auto es una decisión de diseño, y no me toca tomarla solo mientras siga congelada. Así que lo que salió de la sesión es la medición, por escrito, y la persecución exactamente como estaba.