Una regata contrarreloj con boyas en Godot 4: cómo saber si pasas entre dos boyas
Once pasos de boyas en la laguna de Caleta y junto al islote, a remo y contra el reloj. Cómo se detecta que cruzas en orden y en el sentido bueno, y cómo se ponen medallas sin jugadores.

Con la barca ya en el agua, la laguna de Caleta Salobre pedía una carrera. La Regata de Caleta son once pasos de boyas, 761 m a remo entre la orilla, el islote de arena y mar adentro, contra el reloj.
No hace falta hablar con nadie: en la barca no hay botón de usar, así que el reloj empieza al cruzar la SALIDA a bordo y para en la META. Hay que pasar entre las dos boyas de cada paso, en orden. La bandera del paso que toca es dorada, la del siguiente blanca y las demás rojas. Si te bajas, se acaba el intento. Hay oro en 200 s, plata en 235 y un límite de 300; con el oro, un banderín en el bote. Un cartel en la orilla, junto al muelle, cuenta las reglas y tu récord.
Cómo está hecho
Cada paso es un punto del mundo y una dirección, la media entre de dónde vienes y adónde vas. Para saber si el tramo que acaba de recorrer el bote cruza el paso, basta con un producto escalar a cada lado y un punto de corte:
static func crosses(i: int, a: Vector2, b: Vector2) -> bool:
var center: Vector2 = GATES[i]
var axis := direction(i)
var da := (a - center).dot(axis)
var db := (b - center).dot(axis)
if da > 0.0 or db < 0.0 or is_equal_approx(da, db):
return false
var hit := a.lerp(b, -da / (db - da))
return hit.distance_to(center) < HALF
Si el bote estaba antes del paso (da negativo) y ahora está después (db positivo), se calcula dónde cruzó la línea, y vale si fue a menos de 6 m del centro: entre las boyas, que están a 12 m una de otra. Cruzar al revés o por fuera no cuenta.
El recorrido lo medí fuera del juego. Quería dar la vuelta al islote, pero por el suroeste un bajo de arena lo une a la orilla y no se puede rodear entero. Por eso la ida va pegada al islote y la vuelta, mar adentro. Cada paso y cada recta, con 3 m a cada lado, tienen más de 1 m de agua (el bote necesita 0,6), y una prueba lo vuelve a comprobar.
Las medallas no salen de jugadores. Un patrón automático que usa el mismo código de remar de la barca hace la vuelta en 175,4 s sin rozar el fondo (172,9 s con los fotogramas del motor). El oro está en 200 s, unos 25 s por encima.
Lo que salió mal
En la regata no quedó apuntado ningún fallo del juego, pero sí una prueba que costaba demasiado. La vuelta completa movía el mundo entero fotograma a fotograma y tardaba 56 s. Llamando directamente al mover de la barca, que es el mismo código, tarda 7 s. Lección para el resto: una prueba que espera a los fotogramas con toda la isla cargada es lenta.
Las mutaciones que la suite tuvo que detectar (y detectó): cruzar sin ir en la barca, bajarse sin que termine el intento, que el reloj corra con el menú abierto y que valga pasar por cualquier sitio. Con la regata, la suite llegó a 1049 comprobaciones correctas.
Lo que falta por comprobar
Sin probar en el móvil. Los tiempos de las medallas salen de un piloto automático, no de jugadores: puede que el oro sea fácil o imposible remando con el pulgar. La campana de cada paso se generó y se midió, pero no se ha escuchado.