포스트

문 앞에서 멈추는 법 — CQB 교리를 코드로

SRT 브리칭 분대 AI의 문 돌입을 실제 CQB(근접 전투) 교리에 맞춰 고친 과정. 크로스오버를 버리고 파이·리미티드 페네트레이션·엿보기로 바꾸고, 교리 문서를 만들어 규칙마다 코드와 테스트를 붙였다.

문 앞에서 멈추는 법 — CQB 교리를 코드로

한 줄 요약: 문을 열자마자 뛰어들던 분대를, 문밖에서 먼저 안을 확인하고 적이 없을 때만 들어가도록 바꿨습니다. 그리고 “분대는 이렇게 움직인다”는 교리 문서를 만들어, 규칙 하나마다 그 규칙을 구현한 코드와 확인하는 테스트를 적어 두었습니다.

개인적으로 즐기려고 만든 팬 게임입니다. 공개 배포는 하지 않습니다.

첫날의 돌입: X 자로 뛰어들기

첫 버전의 “열고 클리어”는 이랬습니다. 문을 열면 두 사람이 X 자로 엇갈려 방 양쪽 구석으로 뛰어듭니다(크로스오버). 영화에서 자주 보는 모습이지만, 직접 해 보니 문제가 있었습니다.

  • 문이 열리는 순간 방 안에 적이 있는지 모르는 채로 들어갑니다.
  • 두 사람이 문간에서 길을 가로질러 서로 부딪히고, 서로의 사선을 막습니다.

문밖에서 먼저 본다

네이버 블로그의 SWAT 4 「1인 CQB」 글을 참고해서 순서를 바꿨습니다.

  1. 문이 열리면(열든, 차든, 섬광탄이든, C2 폭파든) 바로 들어가지 않습니다.
  2. 문밖에서 반원을 그리며 천천히 돌면서 문 안을 한 조각씩 봅니다. 이것을 슬라이싱 더 파이(파이 자르기)라고 합니다. 이때 걷는 쪽이 아니라 문 안을 봅니다.
  3. 들어갈 방 안에 무장한 용의자가 일정 시간 동안 안 보여야 “없다”고 판단하고 들어갑니다.
  4. 쏘는 적이 보이면 들어가지 않고, 문밖에서 먼저 제압합니다.
  5. 들어갈 때는 X 자로 엇갈리지 않고, 파이를 끝낸 쪽 구석으로 꺾어 들어갑니다(버튼훅).

쏘지 않는 용의자만 보이면 파이를 계속 돌면서 항복을 외치고, 끝까지 반응이 없으면 체포하러 들어갑니다. 방 밖 멀리 있는 적은 돌입 판단에 넣지 않습니다.

테스트로 확인해 보니, 파이를 도는 동안 사키는 문 옆 +32~35픽셀에서 반대쪽 -36~-39픽셀까지 반원을 그리며 1.8초 동안 돌았고, 시선은 문 쪽에서 평균 0.02 rad(약 1°)밖에 벗어나지 않았습니다.

사람 수와 공간으로 방법을 고른다

그런데 파이는 혼자일 때 쓰는 방법입니다. 우리 분대는 미야코와 사키 둘입니다. 둘이 문 양쪽에 나눠 서 있는데 한 명이 반원을 돌면 다른 한 명의 앞을 지나가게 됩니다. 그래서 상황에 따라 세 가지 중 하나를 고르게 했습니다.

문밖에서 안을 확인하는 세 가지 방법 사 = 사키, 미 = 미야코. 파란 부분이 문 너머로 보이는 곳입니다.

상황방법동작
둘이 문 양쪽에 섬리미티드 페네트레이션각자 자기 쪽 문틀까지만 나가(몸은 거의 안 들어감) 맞은편 먼 구석 → 방 가운데를 봅니다. 두 시선이 엇갈립니다.
혼자슬라이싱 더 파이문밖 반원을 자기 쪽 끝에서 반대쪽 끝까지 돌며 봅니다.
혼자인데 반원에 설 자리가 없음엿보기스택 자리에서 몸만 문 쪽으로 기울여 봅니다.

“설 자리가 없다”는 기준도 정했습니다. 파이 반원 위 다섯 점(시작, ¼, ½, ¾, 끝) 중 설 수 있는 곳이 정해진 수보다 적으면 엿보기를 씁니다. 좁은 복도에서 문을 만났을 때가 그렇습니다.

둘이 리미티드 페네트레이션으로 서로 맞은편을 이미 봤다면, 들어갈 때는 문간에서 구석을 다시 확인하지 않고 동시에 각자 자기 쪽 구석으로 꺾어 들어갑니다.

진입은 언제나 팀으로

처음에는 사키에게 “열고 클리어”를 시키면 사키 혼자 들어갔습니다. 그런데 혼자 하는 진입은 CQB 교리에서 가장 피하는 일입니다. 그래서 규칙을 바꿨습니다.

  • 누구에게 진입 명령을 내리든, 쓰러지지 않은 팀원 전원이 그 문으로 갑니다.
  • 문을 열고 먼저 들어가는 포인트맨은 언제나 사키, 미야코는 뒤따르는 세컨드맨입니다.
  • 혼자 들어가는 것은 팀원이 부상으로 쓰러졌을 때뿐입니다.
  • 스택업(문 옆에 붙기)만은 고른 유닛 혼자 합니다. 다른 팀원이 이미 잡은 자리는 피합니다.

문 옆에 스택한 미야코와 사키 블랙마켓 창고의 문 옆에 붙은 미야코와 사키.

둘이 같이 들어가니 이번에는 문간에서 부딪히는 문제가 생겼습니다. 그래서 세컨드맨은 포인트맨이 문선에서 방 안으로 1.5칸 들어간 뒤에야 따라 들어가고, 그동안은 자기 자리에서 문을 겨눕니다. 테스트에서 둘 사이 거리는 가장 가까울 때도 18픽셀 이상이었고, 문간을 가로지른 횟수는 0번이었습니다.

걷는 모습도 바꿨다

  • 분대원은 이제 총을 든 사격 자세로 걷습니다. 걷기 동작의 다리에 쏘기 동작의 상체를 붙인 그림을 새로 찍었습니다. 사키의 기관총이 머리 뒤를 향하던 것도 이때 고쳤습니다.
  • 빠르기는 Ready or Not의 기본 이동 속도 320 cm/s에 맞췄습니다. 게임에서 한 칸이 32픽셀, 약 1미터라서 초당 102픽셀입니다. 파이·진입·수색 중에는 그 절반으로 걷습니다.

복도

분대가 둘뿐이라, 아직 확보하지 않은 복도를 지날 때는 뒤따르는 사람이 미야코가 걷는 반대쪽(뒤)을 봅니다. 복도 칸을 충분히 봤고 그 안에 무장한 용의자가 없으면 “복도 확보”를 무전합니다. 적이 다시 보이면 확보가 풀립니다.

복도 확보 블랙마켓 창고 복도. 복도를 다 보고 나서 사키가 “복도 확보, 이상 없음!”을 외칩니다.

교리 문서를 만들다

규칙이 늘어나면서, 무엇이 왜 그렇게 움직이는지 코드만 봐서는 알기 어려워졌습니다. 그래서 교리 문서를 하나 만들었습니다. 편성, 팀 진입, 문밖 확인, 진입, 이동, 복도, 무전, ROE, 교전까지 절마다 규칙을 적고, 각 규칙 아래에 두 줄을 붙였습니다.

  • 코드: 그 규칙을 구현한 자리
  • 검증: 그 규칙을 확인하는 테스트와 그 결과 숫자

그리고 개발 규칙에 한 줄을 더했습니다. 교리를 바꿀 때는 이 문서부터 고치고, 그다음 코드와 테스트를 맞춘다. 이렇게 해 두니 “사키가 왜 여기서 안 들어가지?” 같은 질문에 문서의 한 절로 답할 수 있게 되었습니다.

영상에서 상황을 더하다

CQB 기초를 설명하는 유튜브 영상들의 자막을 정리해서, “이런 상황에서는 이렇게 들어간다”를 상황별로 문서에 더했습니다. 그중 세 가지는 코드로 옮겼습니다.

안에 적이 있는 걸 알 때 — 맨몸으로 들어가지 말고 도구부터 씁니다. 문밖 확인 중 쏘는 적이 0.8초 넘게 보이고 섬광탄이 남아 있으면, 확인을 멈추고 섬광탄을 던진 뒤 들어갑니다. 테스트에서는 리미티드 페네트레이션 0.78초 → 섬광탄 1.85초(섬광탄 2개 → 1개) → 진입 3.50초 순서로 움직였습니다.

가구가 코너로 가는 길을 막을 때 — 들어간 사람은 맡은 코너로 곧장 갑니다. 그런데 가구가 막으면 억지로 돌아가지 않고 그 자리에 멈춰 자기 구역을 지킵니다. 그러면 다음 사람이 그 코너를 넘겨받아 가구를 돌아 들어갑니다. 휴게실 캐비닛 장면에서 사키가 캐비닛 앞에 멈추고, 미야코가 그 코너를 넘겨받았습니다.

들어간 방 안에 닫힌 문이 또 있을 때 — 그 문 바로 앞에는 서지 않습니다. 문이 열리면 가장 먼저 맞는 자리이기 때문입니다. 진입 자리는 그 문에서 1.5칸 안을 고르지 않고, 세컨드맨은 수색하는 동안과 클리어 뒤에도 그 문을 겨눕니다. 테스트에서 진입 자리와 안쪽 문 사이는 가장 가까울 때 72픽셀(1.5칸 = 48픽셀보다 멂)이었습니다.

반대로 넣지 않은 것도 있습니다.

  • “확실하지 않으면 문 너머로 몇 발 쏜다”, 수류탄: SRT는 체포가 목적이고 안에 민간인이 있을 수 있어서 쓰지 않습니다.
  • X 자로 엇갈려 들어가는 크로스: 앞에서 버린 방식이라 문서에 “쓰지 않음”으로 적었습니다.
  • 손잡이 쪽에서 문 열기: 교리로는 맞지만, 지금 맵에는 문 손잡이가 어느 쪽인지 정보가 없어서 아직 못 넣었습니다.

버그는 그 자리에서 찍는다

마지막으로 F8 피드백 버튼을 만들었습니다. 해 보다가 이상한 걸 보면 F8을 누릅니다. 게임이 멈추고, 그 순간의 화면 사진과 함께 분대원 위치·체력·명령·그린 길·돌입 단계, 용의자와 민간인 상태, 최근 무전, 지난 20초 동안의 위치 기록이 저장됩니다. “아까 사키가 이상하게 움직였는데…”를 말로 설명하지 않아도 됩니다.

다음에는 영상에서 정리했지만 아직 코드에 없는 것들, 예를 들어 T 자 교차로를 둘이 함께 확인하기나 시간이 급할 때 빠르게 들어가는 다이내믹 진입을 넣어 볼 생각입니다.

다음 글: 위에서 찍은 그림에서 진짜 3D로

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.