Un mod de mensajero en Godot: repartir paquetes entre cuatro pueblos, a pie o volando
Ocho paquetes encadenados entre las estafetas de los cuatro pueblos de Gotic. Hay propina si llegas a tiempo, pero el plazo está calculado para que andando no te dé.

Junto al arco de cada pueblo hay ahora un mostrador con paquetes, un cartel amarillo de CORREO y alguien atendiendo: Tolo en Brumacosta, Nel en Caleta Salobre, Ruth en Altomira y Gael en Vega de Poniente. Tolo te da el primer encargo, una red nueva para Sela. Al aceptarlo, el paquete aparece atado a tu espalda, el destino se marca en el mapa y el diario lleva la cuenta: «PAQUETE · una red nueva para Sela → Caleta Salobre · 227 m · 4/45 s».
La ruta encadena ocho paquetes, y cada uno sale de donde entregaste el anterior: pescado en salazón para la torre, un catalejo para Dalia, un barril de sidra para Lía, quesos de cabra para Bruno… Al terminar el octavo vuelve a empezar. El primer paquete te da un zurrón, a las cuatro entregas te ganas una capa y a las ocho el título de «correo mayor».
Cómo está hecho
La regla que da forma a todo el mod es la propina. Si llegas antes del límite, hay propina. Y el límite no es arbitrario: es la distancia en línea recta entre las dos estafetas, recorrida a 5 m/s.
# Límite para la propina: la distancia en línea recta entre las dos estafetas a TIP_SPEED.
func limit() -> float:
return desk_spot(current()["from"]).distance_to(desk_spot(current()["to"])) / TIP_SPEED
Lo hice así a propósito. La escoba es lo que más había gustado del juego y quería que repartir volando compensara. Una prueba recorre con física el primer paquete a pie por el camino, de Brumacosta a Caleta: 57,2 s, frente a un límite de 45 s. Corriendo por el camino no llegas; volando, sí (o con una infusión de Lía y atajando campo a través).
Volar tiene una condición: para entregar hay que bajar. La interacción común del juego no funciona desde el aire, y deliver() además se niega si el jugador va montado en algo. Antes de darlo por bueno quité esa guarda y vi fallar la prueba.
Otra decisión: el mensajero necesita los cuatro pueblos, todo o nada. Si apagas uno, se apaga el mensajero, y si enciendes el mensajero, se encienden los pueblos que faltan. Adaptar la ruta a los pueblos que haya (cancelar un paquete cuyo destino desaparece, por ejemplo) eran muchos más casos raros, y decidí no hacerlo.
Lo que salió mal
La prueba de «partida incoherente» guarda datos absurdos y comprueba que el juego no se rompe. Uno de ellos era "carrying": "sí", una cadena donde debería haber un sí/no. El código hacía data.get("carrying", false) == true, que parece inofensivo. Pero en GDScript, comparar una cadena con un booleano no devuelve false: es un ERROR del motor. Lo arreglé así:
var flag = data.get("carrying", false)
carrying = flag is bool and flag
Poco después arreglé lo mismo en la aldea y en los tres pueblos, que leían su bandera de «visitado» de la misma manera, y lo apunté en las lecciones del proyecto.
Al día siguiente llegó el inventario y el zurrón y la capa pasaron a ser objetos que solo se ven si los llevas puestos. El paquete, en cambio, no es un objeto: repartir no depende de lo que lleves encima.
Lo que falta por comprobar
Las 672 comprobaciones de esa ronda pasan, pero nadie ha jugado la ruta con dedos de verdad y no sé si la propina se siente justa o imposible. Tampoco hay FPS medidos en el móvil. Y el mensajero es hoy una ruta fija, sin fallos ni variedad. En el plan hay ideas apuntadas (un tablón con encargos cada día, paquetes frágiles o urgentes, postales con la cámara) que todavía no he construido. Esta captura costó 266 llamadas de dibujo.