공정 모드
게임에 주입된 클라이언트는 맵 전체를 읽을 수 있습니다. 공정 모드는 Bot이 시야 안의 것만 보게 합니다. 사람 플레이어와 같고, 아레나 규칙과도 같습니다.
이 프로젝트의 관찰 능력은 “클라이언트가 모든 플레이어의 상태를 가지고 있다”는 데서 나옵니다. 스냅샷에는 전장의 안개 속 적을 포함해 맵 전체의 모든 유닛이 들어 있습니다. 디버깅에는 편리하지만 대전에서는 공정하지 않습니다.
공정 모드는 SDK가 여러분의 시야를 기준으로 필터링하게 합니다.
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) # Game을 직접 사용
run(MyBot, inst=5, fair=True) # 또는 러너에 맡기기
필터링되는 것
| 내용 | 공정 모드에서 |
|---|---|
| 유닛 | 아군 전체 + 지금 아군에게 보이는 적과 중립 유닛 |
| 바닥의 아이템 | 아군 유닛 시야 안의 것만(낮 / 밤 시야는 데이터 테이블에 따라 따로 계산) |
| 생산 테이블 | 보이는 건물만(상대가 무엇을 생산하는지 보이지 않음) |
| 이벤트 | 자신의 것, 보이는 것(또는 1초 안에 보였던 것), 아군이 입힌 피해 |
시야는 어디서 오는가
- 스냅샷의 모든 유닛에는 가시성 마스크가 붙어 있습니다. p번째 비트 = 플레이어 p가 지금 그 유닛을 볼 수 있음(필드에 유닛이 있는 0 ~ 11번만 계산하며, 자기 유닛은 자신에게 항상 보임).
u.visible_to(g.me())는 이 값을 바로 읽으므로 대기 시간이 없습니다. - 임의의 지점은
g.visible(x, y)로 엔진에 묻습니다(보임 / 전장의 안개 / 검은 마스크). 고속 레인을 거치므로 매번 약 1프레임이 걸립니다. 한 틱에 많은 유닛을 판단해야 한다면g.visible()을 하나씩 호출하지 말고 스냅샷의u.visible_to()를 쓰세요.
적에 대한 기억: last_seen
사람 플레이어는 “방금 저쪽에서 늑대 기수 부대를 봤다”는 것을 기억합니다. SDK도 대신 기억해 줍니다. 스냅샷을 새로 고칠 때마다 지금 아군에게 보이는 적과 크립 유닛을 기록하고(마지막 위치, 체력, 시각), 죽는 것을 보면 지우며, 게임이 바뀌면 비웁니다.
for u, t, age in g.last_seen(max_age=60): # 60게임초 안에 본 적
print(u.type, u.x, u.y, f"{age:.0f}s 전")
heroes = [r for r in g.last_seen() if r[0].is_hero] # 상대 영웅을 마지막으로 본 위치
camps = g.last_seen(owner="creep") # 본 적 있는 크립
공정 모드에서는 이것이 유일한 “상대 정보 출처”입니다. 사람 플레이어와 같습니다. 일반 모드에서도 시야 기준으로 기록하므로 같은 코드를 그대로 쓸 수 있습니다.
몇 번 플레이어로 지휘할지
python tools/play.py --bot my_bot.py --player 1 --attach
--player N(또는 Game(player=N))은 Bot이 N번 플레이어로서 지휘하게 하며, N번 플레이어의 유닛만 지휘할 수 있습니다. 두 AI를 대결시키려면 같은 게임에서 이런 채널을 두 개 열면 됩니다.
로컬 모드에서 공정성은 약속이지 보안 경계가 아닙니다
여러분의 컴퓨터에서는 프로그램이 맵 전체를 읽는 것을 막을 방법이 없습니다. --fair는 스스로에게 거는 제약입니다. 진짜 대전은 아레나의 심판 프로세스가 보장합니다. Bot은 공유 메모리에 절대 접근할 수 없고, 심판이 시야 기준으로 필터링한 관찰만 받으며, 행동만 제출할 수 있고, 모든 행동은 먼저 유닛 소유권을 검증받습니다.
지금 켜야 하는 이유
- 나중에 아레나에 올라가면 규칙이 바로 이렇습니다. 지금 공정 모드로 작성해 두면 그때 한 줄도 고칠 필요가 없습니다.
- 맵 전체 정보 없이 싸워 봐야 Bot의 실제 실력을 알 수 있습니다(레퍼런스 브레인은 현재 컴퓨터 부대장의 목표 지점처럼 맵 전체 정보에 크게 의존합니다. 좋은 검증 기회입니다).
- 공정 모드에서 작성한 정찰, 기억, 판단이야말로 진짜 가치 있는 AI 능력입니다.