FPS Arena는 매치를 헤드리스로 20초 돌려 놓고 초당 한 줄씩 상태를 찍는 스모크 테스트가 있습니다. 봇이 몇 명 살아 있는지, 몇 명이 움직였는지, 몇 명이 교전 중인지. 새 맵을 넣을 때마다 이걸 돌려 보고 초록이면 넘어갔습니다.

화물선 맵은 이렇게 나왔습니다.

[smoke] 20s  이동 7/7  교전 0  생존 7  |  발사 0  명중 0  점수 0:0

이동 7/7. 생존 7. 아무도 안 죽었고 모두가 걸어 다니고 있었습니다. 그리고 20초 동안 총알이 한 발도 안 나갔습니다.

초록불이 거짓말을 한 게 아니다

지표들은 정확했습니다. 봇 일곱이 다 살아 있는 것도, 다 스폰 지점에서 2m 넘게 움직인 것도 사실이었습니다. 문제는 제가 그걸로 "맵이 돌아간다"를 판정하고 있었다는 겁니다.

이동 7/7 은 "봇이 갈 수 있는 곳으로 간다"를 보장하지 않습니다. 3m 짜리 우리 안에서 왔다 갔다 해도 7/7 입니다.

진짜 물어봤어야 할 질문

그래서 스모크에 지표를 하나 더 넣었습니다. 사거리 안에 있는 적대 봇 쌍 중, 실제로 서로가 보이는 비율. 매초 재서 누적합니다.

for bot in _bots:
    for other in _bots:
        if not bot.is_hostile_to(other): continue
        if bot.global_position.distance_to(other.global_position) > SIGHT_RANGE: continue
        pairs += 1
        if bot._can_see(other):
            visible += 1
            continue
        # 안 보이면 무엇에 가로막혔는지도 같이 센다

결과:

서로 보이는 쌍
격납고388쌍 중 48
해변308쌍 중 128
화물선480쌍 중 0

480쌍 중 0. 이건 우연이 아닙니다.

가림 통계가 범인을 바로 짚어 줬습니다. 같은 물체 두 개가 시야의 절반 이상을 차지하고 있었습니다 — (8.0, 7.0, -12.0)(-7.0, 7.0, -12.0). 선미 쪽 컨테이너 두 짝이었습니다.

폭 12미터

화물선 갑판은 폭이 21m 밖에 안 됩니다. 그 좁은 갑판에 제가 세워 둔 것들:

  • 선교(브리지) — 폭 12m, 높이 4m, 선미 쪽 z = -15.5
  • 컨테이너 — 양옆 x = ±7.5, 선미 쪽 z = -12.5
  • 난간 — 양현 x = ±10.2

숫자를 늘어놓고 보면 명확합니다. 가운데는 선교(x -6~6)가 막고, 그 양옆 통로 (x 6.2~8.8)는 컨테이너가 막고, 그 바깥은 난간입니다. 선미에서 나가는 길이 하나도 없습니다.

홍팀은 z = -19.5 에 스폰합니다. 선교 바로 뒤입니다. 20초 내내 3m 폭의 주머니 안에서 걸어 다니고 있었던 겁니다 — 이동 7/7 을 찍으면서.

청팀은 멀쩡했습니다. 뱃머리 쪽은 가운데가 뚫려 있어서 자유롭게 나왔습니다. 그래서 이 고장은 한쪽 팀에만 일어났고, 그게 발견을 더 늦췄습니다.

고친 것은 숫자 하나

# 12.0 → 8.0
boxes.append(_box(Vector3(0, deck + 2.0, -15.5), Vector3(8.0, 4.0, 7.0), &"panel"))

선교를 8m 로 줄이니 선교와 컨테이너 사이에 2.2m 통로가 양쪽으로 열렸습니다. 에이전트 반지름 0.5m 를 빼도 1.2m 가 남아서 네비메시가 이어집니다.

발사0197
명중033
점수0:03:4
서로 보이는 쌍480 중 0372 중 58

배운 것

이 맵은 몇 주 동안 배포되어 있었습니다. 실행하면 열리고, 봇이 걸어 다니고, 크레인과 컨테이너가 멀쩡히 보입니다. 스크린샷도 잘 나옵니다. 그런데 뽑기로 화물선이 걸린 사람은 아무 일도 일어나지 않는 20초를 봤을 겁니다.

지표를 늘리는 게 답이 아니었습니다. 이동, 생존, 교전 은 이미 다 있었고 다 정확했습니다. 빠져 있던 건 "이 게임이 성립하려면 반드시 참이어야 하는 것" 을 직접 물어보는 지표였습니다. 총싸움 게임에서 그건 "적이 서로를 볼 수 있는가" 입니다.

살아 있는지, 움직이는지를 재는 건 쉽습니다. 어려운 건 이 게임을 게임이게 만드는 게 무엇인지 정하고, 그걸 직접 재는 겁니다.