Modo justo
Un cliente inyectado en el juego puede leer todo el mapa. El modo justo hace que el Bot solo vea lo que está en su visión, igual que un jugador humano y que las reglas de la Arena.
La capacidad de observación del proyecto nace de que “el cliente guarda el estado de todos los jugadores”: el snapshot contiene todas las unidades del mapa, incluidos los enemigos en la niebla. Es muy cómodo para depurar, pero injusto en una competición.
El modo justo hace que el SDK filtre según tu visión:
python tools/play.py --bot my_bot.py --fair
python -m openwar3 run my_bot.py --inst 5 --fair
from openwar3 import Game, run
g = Game(inst=5, fair=True) # usando Game directamente
run(MyBot, inst=5, fair=True) # o a través del ejecutor
Qué se filtra
| Contenido | En modo justo |
|---|---|
| Unidades | Todas las propias + las enemigas y neutrales que tu bando ve en ese momento |
| Objetos en el suelo | Solo los que están en la visión de tus unidades (la visión de día y de noche se calcula por separado, según la tabla de datos) |
| Tabla de producción | Solo los edificios visibles (no ves qué está entrenando el rival) |
| Eventos | Los tuyos; los visibles (o vistos en el último segundo); el daño que inflige tu bando |
De dónde sale la visión
- En el snapshot, cada unidad lleva una máscara de visibilidad: el bit p = el jugador p la ve en este momento (solo cuentan los jugadores 0 ~ 11 con unidades en el mapa; tus unidades siempre son visibles para ti).
u.visible_to(g.me())la lee directamente, sin espera. - Para cualquier punto:
g.visible(x, y)pregunta al motor (visible / niebla / máscara negra) por el carril rápido, y cada llamada tarda aproximadamente un fotograma. Si en un tick tienes que evaluar muchas unidades, usau.visible_to()del snapshot en vez de llamar ag.visible()una por una.
Memoria de enemigos: last_seen
Un jugador humano recuerda “hace un momento vi un grupo de jinetes de lobo por allí”. El SDK también lo recuerda por ti: en cada actualización del snapshot anota las unidades enemigas y los creeps que tu bando ve en ese momento (última posición, vida, hora); si los ve morir, los borra, y al cambiar de partida la memoria se vacía.
for u, t, age in g.last_seen(max_age=60): # enemigos vistos en los últimos 60 segundos de juego
print(u.type, u.x, u.y, f"hace {age:.0f} s")
heroes = [r for r in g.last_seen() if r[0].is_hero] # dónde estaban la última vez los héroes rivales
camps = g.last_seen(owner="creep") # creeps vistos
En modo justo, esta es tu única “fuente de información sobre el rival”, igual que para un jugador humano. En modo normal también se registra según la visión, así que puedes usar el mismo código.
Con qué número de jugador das órdenes
python tools/play.py --bot my_bot.py --player 1 --attach
--player N (o Game(player=N)) hace que el Bot dé órdenes como jugador N, y solo puede mandar las unidades del jugador N. Dos IA enfrentadas son simplemente dos canales como este en la misma partida.
En local, la justicia es un acuerdo, no una barrera de seguridad
En tu propia máquina no hay forma de impedir que un programa lea todo el mapa. --fair es una restricción que te impones tú; en una competición de verdad, la garantía la da el proceso árbitro de la Arena: el Bot nunca toca la memoria compartida, solo recibe las observaciones que el árbitro filtra por visión, solo puede enviar acciones y cada acción valida antes la propiedad de la unidad.
Por qué activarlo ya
- En la Arena las reglas serán exactamente estas; si escribes en modo justo ahora, luego no tendrás que cambiar ni una línea;
- Sin la información de todo el mapa descubres el nivel real de tu Bot (hoy el cerebro de referencia depende mucho de ella, por ejemplo del punto objetivo del capitán de la IA del juego; esto es justo una prueba de fuego);
- El reconocimiento, la memoria y el juicio que escribas en modo justo son las capacidades de IA que de verdad valen.