BotStrikes

Desarrollo temprano Todavía no hay versión pública · FPS táctico 5v5 · PC

Novedades

Lo que cambió, medido

La bitácora pública del desarrollo. Sin fechas de lanzamiento y sin «pronto»: si algo no avanzó, esta página dice qué lo frenó.

Bitácora · último hito

Hito por hito, con su medición

Una entrada por hito verificado: qué cambió, la cifra con su escenario, el enlace a la evidencia y lo que se probó y se descartó, con la medición que lo descartó. Lo que todavía no está medido dice «pendiente», y lo que espera la prueba de una persona lo dice también. Ninguna fase se declara cerrada acá.

Cada entrada conserva las versiones, mediciones y pendientes de su fecha. Consulta el estado vigente antes de usar una cifra o instrucción histórica. Ver el estado vigente.

· F6 · ADR 0109 Una IA de fuera ya puede jugar la ronda entera

El juego se llama «humanos contra máquinas» y hasta ayer una máquina de fuera no podía cumplir el objetivo. Podía correr, apuntar y disparar; no podía plantar la bomba, porque dónde se puede plantar no viajaba por el protocolo. El bloque de la bomba mandaba la fase, el sitio una vez plantada, la mecha, quién la lleva —sólo a su bando— y su posición; las dos cajas de los sitios, no. El bot propio las recibía por la línea de comandos, y ése era el único dato que entraba fuera del canal público. Ahora viajan como todo lo demás. No es una concesión: es lo que una persona lee de la letra pintada sobre el arco del sitio en cuanto entra, y la regla que gobierna esto dice que una IA no recibe menos que una persona por el mismo canal. Van cuantizadas a decímetros —una caja mide diez metros de lado y la única pregunta que se le hace es «¿está mi pie dentro?»— así que las dos ocupan 26 bytes en vez de 50. Comprobado: diez bots lanzados sin una sola coordenada reciben los dos sitios y en 200 segundos llevan la bomba al sitio 14 veces.

  • Las dos cajas de los sitios viajan en el bloque de la bomba, para todos y en todos los snapshots
  • El bot de referencia deja de necesitar que le pasen coordenadas al arrancar
  • El peor caso 5v5 sube de 57.088 a 58.816 B/s contra un tope de 64.000: el margen baja de 6.912 a 5.184 y no se tocó ningún presupuesto

Por qué van en cada snapshot y no una vez al entrar El formato se lee entero y solo: cualquier snapshot se decodifica sin estado previo. Mandarlas una vez al entrar habría ahorrado bytes y habría dejado ciego a un bot que se conecta a mitad de ronda, que es justo cuando una persona entra y mira el arco.

Probado y descartado

  • Que cada bot se descargue el mapa y deduzca los sitiosEl mapa no viaja por el protocolo: sería pedirle a un tercero que interprete un archivo del juego para poder jugar.

· F6 · ADR 0108 Los demás llevaban un arma distinta de la tuya

En primera persona el juego dibuja el rifle del paquete comprado, de color arena. En tercera persona, el arma que lleva un cuerpo salía del kit libre y se pintaba de un solo color, porque el sombreador compartido no tiene un muestreador libre que gastar a veinte metros. Eran dos armas. Usar la misma malla no entra: el rifle de primera persona, sin las manos, son 72.885 triángulos contra los 1.974 que cuesta hoy el arma de un cuerpo, y diez cuerpos llevarían la escena poblada de 202.218 triángulos a más del cuádruple. Lo que sí entra es la silueta y la pintura. El modelo de mundo se construye remallando la superficie exterior del arma comprada —el paquete la modela también por dentro, porque en primera persona se abre y se ve— y reduciéndola hasta el mismo presupuesto que ya se gastaba: 1.974 triángulos el rifle, 3.820 la pistola, 1.752 el cuchillo. El color no se pierde: el atlas del archivo deja de ser una textura y pasa a ser la tabla de colores de sus vértices, uno por vértice, que devuelve la empuñadura oscura y el cañón negro sin gastar nada. La escena poblada sigue en 202.218 triángulos.

  • El cuerpo de un bot y el de otro jugador llevan tu arma, con tu silueta y tu pintura, por los mismos 1.974 triángulos
  • Dos escenas nuevas fotografían por primera vez la pistola y el cuchillo en la mano de un cuerpo; el banco de regresión pasa a 83 escenas
  • El arma se ve más clara que antes, porque la comprada es de color arena y la del kit era casi negra: contra el ocre del mapa es menos contraste, y eso lo mira una persona

Las dos capturas salían idénticas byte a byte, con el arma nueva y sin ella La primera versión se dio por buena porque la regresión visual no la veía. La causa inmediata era un nombre de archivo que el cliente no buscaba, pero debajo había un agujero real: el banco fotografiaba el arma en la mano sólo con el rifle, así que la pistola y el cuchillo de tercera persona no los dibujaba ninguna escena. Un modelo que nada fotografía se rompe sin que salte ninguna prueba, que es exactamente cómo se llegó a tener dos armas distintas sin enterarse.

Sin remallar antes de reducir, el cañón desaparecía entero El paquete comprado no modela una cáscara: modela el arma por dentro, y su superficie medía el doble de lo que mide un rifle por fuera. Colapsando eso directamente, las caras de dentro y las de fuera se mezclan: el cajón de mecanismos salía hecho un erizo de triángulos cruzados y los quince centímetros de cañón desaparecían, con el fogonazo saliendo de la nada. Reconstruir primero sólo la superficie exterior deja al reductor un trabajo que sí sabe hacer.

Probado y descartado

  • Llevar el atlas del arma comprada al mundo, que es lo que haría cualquieraUn muestreador más en el sombreador compartido costó 2,75 ms sin dibujar nada en esta tarjeta. El color por vértice da casi lo mismo por cero.

· F6 · ADR 0105 Las fachadas del mapa escondían a uno de los dos bandos

Los dos colores de bando se eligieron midiendo, para que ninguno sea más fácil de ver que el otro. Esa medida se hizo contra el mapa de pruebas, y el mapa competitivo nunca se midió con ella: cuando se midió, dio 27 % de desbalance contra un tope de 25, y en la zona central 38 %. La causa se atribuyó píxel a píxel y no era el color del bando sino el del mapa: unas fachadas ocres y terracota tan saturadas que el amarillo de un bando se apoyaba contra ellas y desaparecía. Oscurecerlas no servía —está medido, y además volvía la fachada más ocre—; lo que sirve es bajarles el croma a la mitad conservando la luminancia, así que la piedra sigue igual de clara al sol y ninguna fotografía se toca. El mapa queda en 14 % global y 3 % en la zona central.

  • El ocre y la terracota de las fachadas del mapa competitivo bajan a la mitad de croma, a igual luminancia
  • Las rutas laterales siguen en 37 % y ninguna paleta las arregla: ahí el culpable es una fotografía

La medida que decía que estaba bien miraba otro sitio El contrato automático mide los dos bandos contra el fondo del mapa de pruebas, que es el único cuyas capturas están versionadas. El mapa competitivo sólo existía como capturas de trabajo, así que una decisión de arte podía empeorar la equidad ahí y dejar la comprobación en verde. También se descartó un número cómodo: un clip anterior daba 8 % de desbalance, y resultó ser un artefacto del encuadre —miraba paredes oscuras de cerca—. Medido en campo abierto y al sol, el mismo encuadre da entre 26 y 58 %.

Probado y descartado

  • Oscurecer las fachadas un cuarto, que era la primera propuestaMedida, daba 26 % y seguía incumpliendo: se equivocaba por un factor de tres. Y tenía un efecto contrario al buscado, porque oscurecer sin tocar el croma vuelve la fachada más ocre. La variante que baja la luminancia además rompe una regla del documento de identidad —la superficie al sol tiene que ser lo más claro de la pantalla— y dejaba el muro por debajo del cielo, que es literalmente el defecto que ese documento describe como día nublado.

· F6 · ADR 0107 Los cuerpos daban el doble de pasos de los que les tocaba

La fase de una animación de marcha tiene que contar el suelo recorrido: si el cuerpo avanza despacio, los pasos son largos y pocos. En septiembre se decidió mover el umbral de trote dando por hecho que era así, y no lo era: el campo con la distancia existía desde entonces, con su comentario y su respaldo, pero ningún código de partida lo rellenaba —sólo lo hacían los tests y los bancos de medición—, así que el servidor caía siempre en el respaldo de reloj y la cadencia no dependía de la velocidad. Caminar daba 186 pasos por minuto a cualquier velocidad en vez de los 90 a los que se capturó la animación, y a 0,40 m/s, donde tocaban 25, seguía dando 186: siete veces de más. Es lo que se ve como un cuerpo que apenas avanza dando pasitos rápidos. Ahora la fase la lleva la distancia, y las cuatro marchas caen en la cadencia de su captura.

  • La fase de marcha, trote, esprint y agachado la lleva la distancia recorrida, no el reloj
  • Cuatro escenas nuevas fotografían la cadencia, incluida una a 0,40 m/s, que es donde el error era de siete veces

Por qué pasó tres semanas sin que ningún test lo viera Los tests construían su propia entrada y sí rellenaban el campo de la distancia, así que medían la cadencia correcta y pasaban en verde. Lo único que no lo rellenaba era el código que corre en una partida. Un test que arma sus propios datos comprueba la fórmula, no que el programa le dé esos datos. Las escenas nuevas fotografían el cuerpo tal como lo dibuja una partida, que es donde estaba el defecto.

Probado y descartado

  • Dar por buena la premisa de una decisión anterior sin volver a comprobarlaLa decisión de septiembre movió un umbral porque la fase seguía la distancia, y lo dejó escrito. La nota de estado lo repitió. Ninguno de los dos mintió: los dos se apoyaron en una premisa que nadie midió, y el mismo defecto que esa decisión dice haber resuelto siguió en pie. Lo que lo cerró fue medir la cadencia real de las cuatro marchas, no releer el documento.

· F6 · ADR 0103 El contorno del compañero tapaba al compañero que sí se veía

Desde el ADR 0094 el cliente dibuja el contorno de un compañero a través de la pared, para saber dónde está alguien a quien no se ve. La regla que lo decidía pedía tres cosas —compañero, vivo y no uno mismo— y no pedía la cuarta: que estuviera tapado. A diez metros no se nota, porque la cáscara del contorno queda escondida detrás del propio cuerpo; a dos metros lo cubría entero, con el torso, los brazos, las manos y parte del casco borrados por una mancha sólida que tapaba el equipo y el arma. Lo que se aprobó fue saber dónde está un compañero al que no se ve, y a uno que se ve ya se lo ve: pintarlo encima no agregaba legibilidad, la quitaba. Ahora el contorno exige oclusión —sólo lo lleva el cuerpo que llega por el canal del compañero tapado— y el contrato quedó escrito en el test de legibilidad, que recorre la tabla entera de bandos dos veces, tapado y a la vista.

  • El contorno a través de la pared sólo se dibuja sobre un compañero tapado; al que está a la vista ya no se le pinta encima
  • La escena nueva «arena-contorno-companero» pone un compañero a la vista a dos metros junto a uno tapado, con la misma pose: el banco de regresión visual pasa de 76 a 77 escenas
  • La escena de rendimiento del mapa vestido volvió a medir lo que dice medir: al exigir oclusión había dejado de dibujar los cinco contornos del peor caso, así que sus cinco cuerpos llevan ahora la marca de tapados
  • Falta que el fundador lo juegue: es un defecto de lo que se ve y lo valida una persona, no una comparación de cuadros

El banco de regresión, escena por escena Ninguna de las 76 escenas del banco dibujaba ese contorno, así que una regresión que compara los cuadros byte a byte no tenía cómo verlo. La escena nueva pone un compañero a dos metros, a la vista y sin nada que lo tape, junto a uno tapado con la misma pose: si la condición vuelve a caerse, el de cerca se pinta entero y la comparación lo cuenta. El banco queda en 77 escenas.

Probado y descartado

  • Esperar que el banco de regresión visual encontrara este defectoNo lo encontró: lo encontró la grabación de un clip de juego, mirada cuadro por cuadro. El banco compara los cuadros byte a byte, pero de sus 76 escenas ninguna dibujaba un compañero a la vista, así que la condición equivocada no movía un solo píxel de ninguna referencia y pasaba en verde. El arreglo salió junto con la escena que faltaba, no de un test que ya estuviera escrito.
  • Dejar la escena de rendimiento como estaba después del arregloEsa escena existe para medir el peor caso aprobado, cinco compañeros tapados con su contorno, y al exigir oclusión pasó a dibujar cero: sus diez cuerpos estaban detrás del muro sintético, pero ninguno estaba marcado como tapado. La puerta de rendimiento habría seguido en verde midiendo un peor caso que ya no existía, así que los cinco cuerpos llevan ahora esa marca y la escena volvió a dibujar los cinco contornos.

· F1–F6 · ADR 0017 El hash coincidía en Clang porque lo decíamos, no porque se comprobara

El archivo de hashes fijados del proyecto y la página de evidencia afirman que un millón de pasos de simulación dan el mismo hash en tres builds: GCC optimizado, GCC con sanitizers y Clang. La verificación completa compilaba dos. Ahora compila las tres y compara los tres hashes en cada corrida, y si no encuentra Clang falla en vez de saltarse la pata. Las tres dan a59ca4f6e2299d88 en el corpus de movimiento y f7d2406fd5b56d4d en el de combate, con 72.863 disparos y 3.478 impactos. En el mismo movimiento se publicó el registro de la verificación completa del 24 sep 2026, que es de donde salen el tick, el ancho de banda y la escena de render que el sitio publica.

Nota editorial · : La constante del rig eliminada y las dos constantes de OpenGL eran casos distintos. El registro interno posterior del 27 de septiembre documenta que el árbol completo compiló con Clang después de eliminar las dos constantes de OpenGL. Se conserva aquí el diagnóstico del corte original; esta nota no acredita una compilación nueva del árbol actual.

  • Clang 21.1.8, GCC optimizado y GCC con sanitizers dan los mismos dos hashes que están fijados, a un millón de pasos cada uno
  • Si no hay Clang, la verificación completa falla: antes la pata se saltaba en silencio y la afirmación quedaba sin comprobar
  • El registro de esa verificación completa ya está publicado entre los registros en crudo, con las siete cifras del sitio que respalda y con lo que no respalda
  • El árbol entero todavía no compila con Clang: dos constantes duplicadas y sin usar en el código de OpenGL rompen la compilación con los avisos como errores. Las dos sondas de determinismo no arrastran render, así que la pata nueva corre igual; queda anotado en vez de tapado

Las tres patas, un millón de pasos cada una Movimiento a59ca4f6e2299d88 y combate f7d2406fd5b56d4d en GCC optimizado, GCC con sanitizers y Clang 21.1.8, con 72.863 disparos y 3.478 impactos en las tres. Los dos hashes son los que el archivo del proyecto tiene fijados y no se movieron.

Probado y descartado

  • Degradar el aviso de Clang con un envoltorio del compilador para que el árbol compilaraEl envoltorio existía sólo para que una constante sin usar dejara de romper la compilación. Medido antes de borrarla: esa constante no entraba en ninguna cuenta, porque las 18 poses del rig salen idénticas con su valor del árbol, con 0 y con 90 grados, con la misma huella en los tres casos, y la sección de código del objeto compilado es la misma antes y después de borrarla. Era código muerto: se borró y ya no hace falta ningún envoltorio.
  • Dar por cubierta con ese registro la escena poblada del mapa vestidoEl plan decía que el registro cubría las cuatro primeras filas del panel de presupuestos, y cubre tres y media: su puerta de render es el campo de tiro vacío, 4,1434 ms, y la escena poblada, 9,6242 ms contra 8,3333 de objetivo, es de un ADR del día siguiente. El registro lo dice en sus límites, y la lista de cifras sin registro publicado sigue teniendo entradas.
  • Publicar el log crudo de la verificación junto al registroLos registros publicados hasta hoy traen el archivo y el sha256 de su log, no el log, y ese criterio se mantiene: el log se pide por correo y ese sha256 sirve para comprobar que lo que llegue sea lo mismo con que se midió. Cambiarlo para un registro y no para los otros trece haría la carpeta menos legible, no más.

· F5 · ADR 0101, 0102 La pared se acuerda del disparo, y el cuerpo se para como un soldado

La marca de bala era un cubo de color plano de 1,8 cm que caducaba a los 10 s. Ahora es un quad con textura y alfa en el plano de la cara golpeada, con la luz horneada de esa misma pared, tres familias de material y cuatro formas cada una: 192 vivas, toda la ronda, y se borran al cambiar de ronda. En paralelo, la marcha se corrigió donde importa, en los datos de los dos rigs, y no bajando valores en el cliente.

Nota editorial · : La actualización de referencias visuales registrada en esta entrada no equivale a la aceptación humana del checkpoint H3. Esa validación sigue pendiente. Las cifras conservan el escenario y la fecha originales; no son mediciones nuevas.

  • El quad mide 6,0 cm y el cráter 1,8: el 1,8 era el tamaño del agujero y se estaba usando como el de toda la marca
  • Criterio de aceptación cumplido: treinta tiros a 40 cm dejan quince agujeros separados, sin el manchón que se había rechazado
  • Tobillo a tobillo de pie 35,5 → 29,0 cm y punta a punta 49,1 → 34,3, horneado en los dos rigs
  • Falta que una persona lo juegue y lo acepte: la postura y las marcas las valida el fundador (checkpoint H3)
  • El desplazamiento de peso de la pelvis de pie queda bloqueado por decisión humana: 0 mm de recorrido
Coste del cuadro en el peor caso, tarjeta de referencia+0,09 ms / 8,3333

Divergencia entre el cuerpo dibujado y sus cajas de impacto de pie 6,17 → 2,91 cm y puntera 9,49 → 2,09: la justicia mejora con el horneado, no empeora

Probado y descartado

  • Meter el sampler de las marcas en el sombreador del mundoEl cuadro pasó de 1,97 a 4,72 ms sin dibujar una sola marca: ese programa va justo de registros en la tarjeta de referencia. Las calcomanías tienen su propio programa, y cualquier palanca que agregue un sampler al programa compartido hay que medirla aunque no dibuje nada.
  • Corregir la postura bajando tres valores del clienteDejaba el tobillo dibujado unos 5,4 cm por dentro del de las cajas de impacto, o sea el pie fuera de su caja. Horneado en los datos, la divergencia de pie baja de 6,17 a 2,91 cm.

· F6 · ADR 0099, 0100 El contrato del cable queda escrito, y el peor caso medía de menos

El servidor hablaba el protocolo 11 y la API de agentes 10, pero la documentación del cable llegaba a la 10 y declaraba 8 para la API. Ahora está escrita desde el código y no desde la bitácora: el bloque de la bomba con sus 18 bytes y sus reglas de quién sabe qué, la acción de usar, y el orden canónico completo del snapshot con el tamaño de cada bloque y quién recibe cada uno. Cada tamaño se comprobó codificando de verdad: un snapshot vacío mide 136 bytes.

  • El peor caso real de bajada 5v5, una IA viva bajo modelo motor, es de 795 bytes y 55.552 B/s con cabeceras, y no 54.400: quedan 8.448 B/s de margen contra el tope de 64.000
  • No hay regresión de presupuesto: era una cuenta que medía de menos, y el test fija ahora las dos familias de cifras, con objetivo y sin él
  • Lo que sí se quedó sin margen, y se anota en vez de taparse: el formato admite hasta dieciséis asientos, y ese caso daría 65.152 B/s con el bloque de la bomba, por encima del tope. Ofrecer una partida de dieciséis asientos con objetivo necesita antes una decisión escrita y una persona
Peor caso de bajada por cliente, 5v5 con objetivo55.552 B/s / 64.000

Probado y descartado

  • Subir el tope de ancho de banda para que la bomba entraraNo se subió ni se bajó nada: el tope sigue en 64.000 B/s. Lo que estaba mal era la cuenta, que no sumaba los 18 bytes de la bomba aunque viajan en todos los snapshots de una partida con objetivo.
  • Dejar el comentario de versión y la lista de pendientes como estabanEl comentario del encabezado decía 10 con la constante en 11, y la lista declaraba pendiente la adaptación de reloj entre máquinas, que está implementada y probada desde la v2. Las dos divergencias se corrigieron en el mismo cambio.

Entradas anteriores

FechaQué cambióCifraFase
El reloj de presentación dibuja donde apuntáscuadros bajo un tick 65,65 % → 20,91 %; congelados 0,93 % → 0,65 %F3b
El radar del género, sin regalar un solo enemigo13 bytes por compañero vivo, coste cero en el peor caso; espectar 17 bytesF6
Variedad de material en el mapa a coste cero, y el cielo deja de bandearpíxeles sin textura local 39,8 % → 32,6 % por +180 triángulos sobre 15.920, sin costeF5
La trazadora dejó de mentir, y el comando se aplica con un solo códigoel haz erraba 8,94 m corriendo; desacuerdos de comando 283 de 300 → 0F3b
«Cinta»: tres alturas de cobertura y una boca de servicio por sitio1.328 brushes, 0 caras en conflicto, recta más larga 36,2 m sobre un máximo de 40,0F5
El recorte por cámara cierra parte del hueco, y el presupuesto sigue sin entrarmedia 9,6097 → 9,3372 ms contra un objetivo de 8,3333: todavía 12,0 % arribaF5
Banda competitiva de combate, y escaleras que no dan saltoscoeficiente de armadura del rifle 0,5 → 0,75; salto del ojo por tick 15 → 5 cmF5
Partida por rondas con marcador, y el mapa de pruebas deja de ser una arenaprimero a 13, mitades de 12, ronda de 1:55; suelo abierto 35 % → 1 %F6