홈 › 읽을거리 › 개발노트

군단 점령전 연타 배수문, 세 번 고쳐 맞춘 기록

개발노트 · 2026-10-08 · GamePool 편집팀

군단 점령전에 "연타 배수문"을 넣은 날, 가장 오래 붙잡고 있던 건 그래픽도 효과음도 아니고 숫자 세 개였습니다. 한 번 맞출 때 얼마나 오르는지, 놓치면 얼마나 빨리 내려가는지, 어디서 멈추는지입니다. 이 글은 2026년 10월 8일에 올라간 커밋 ("부서지는 벽·황금 배수문·연타 배수문·한쪽 벽 맵 변화 추가")와 현재 소스 public/games/mobpush/index.html 을 기준으로, 그 숫자가 어떻게 정해졌는지 적은 기록입니다. 최종 값은 소스에서 바로 확인되지만, 중간에 버린 두 번의 설정은 커밋으로 남아 있지 않아서 작업하며 기록해 둔 값을 그대로 옮겼다는 점을 먼저 밝혀 둡니다.

연타 배수문이 해결하려던 문제

군단 점령전의 기본 구조는 대포를 좌우로 끌며 병사를 쏘고, 길 위의 문을 지나게 해서 수를 불리는 것입니다. 1~2단계의 문은 꽤 너그럽습니다. 병사가 문 폭 안으로 들어오기만 하면 +N 이나 ×N 이 붙으니까요. 3단계부터 변화 요소를 넣으면서 "정확히 조준하는 사람이 더 많이 얻는 문"이 하나쯤 필요하다고 판단했습니다. 그래서 만든 것이 폭 2.8 짜리 좁은 황금 문입니다. 좋은 문의 폭이 4.2~5.4 사이에서 정해지는 것과 비교하면 절반 남짓이고, 좌우 왕복 속도는 3.6 + min(단계, 12) × 0.25 로 단계가 오를수록 빨라집니다. 1.5배에서 시작해 꾸준히 맞출수록 배수가 올라가고, 놓치면 내려가는 구조가 이 문의 전부입니다.

첫 번째 설정: 맞출 때마다 +0.1, 안 맞으면 초당 −0.55

처음에는 가장 단순하게 만들었습니다. 병사가 한 명 통과할 때마다 배수에 0.1 을 더하고, 아무도 못 맞추는 동안에는 초당 0.55 씩 깎는 방식입니다. 이 값으로 봇을 돌려 보니 문제가 바로 드러났습니다. 대포를 한 자리에 세워 두고 5초 동안 쏴도 배수가 ×1.5 에서 움직이지 않았습니다. 문이 좌우로 왔다 갔다 하니 고정 사격은 맞았다 놓쳤다를 반복하고, 놓친 시간 동안 깎이는 양이 맞춘 만큼의 상승을 계속 지워 버린 것입니다. 사후에 어림해 본 계산도 같은 이야기를 합니다. 문 폭 2.8 이 한쪽 끝에서 다른 끝(약 ±5.3)까지 왕복하므로 고정된 대포의 줄기가 문과 겹치는 시간은 전체의 4분의 1 안팎이고, 그 겹치는 순간에만 0.1 씩 쌓이는 셈입니다. 이래서는 배수가 보상으로 느껴지기 전에 사라집니다.

두 번째 설정: +0.2, −0.45 로 풀었더니 너무 쉬워졌다

반대로 올려 보았습니다. 적중당 +0.2, 감소는 초당 −0.45 로 바꾸고 상한은 ×6 으로 두었습니다. 이번에는 첫 적중 후 약 1초 만에 배수가 상한 ×6 에 붙어 버렸습니다. 병사는 초당 16~17 명(발사 속도 5.5 × 한 발에 3명) 정도 나가니, 한 번 문을 스치기만 해도 0.2 씩 수십 번이 쌓이는 건 당연한 결과였습니다. 이 설정에서는 정확한 조준이 필요 없었습니다. 한 번 걸리면 그 뒤로는 대충 문 근처만 쏘아도 6배가 유지되니, "좁고 빠른 문"이라는 설계 의도가 통째로 사라진 것입니다. 첫 설정은 보상이 너무 짜서 실패했고 두 번째 설정은 보상이 너무 커서 실패했습니다. 두 번의 실패에서 얻은 결론은 상승폭과 감소폭을 한꺼번에 움직이지 말고, "놓쳤을 때 곧바로 깎이지 않는 시간"이라는 세 번째 축을 만들어야 한다는 것이었습니다.

최종 설정: +0.05, 유예 0.5초, 초당 −0.7, 상한 ×5

지금 소스(index.html 의 병사가 문을 지나는 부분과 매 프레임 갱신하는 부분)에 들어 있는 값은 이렇습니다. 적중당 g.cv = min(5, g.cv + 0.05), 적중 직후 g.hitT = 0.5 로 감소를 0.5초 멈추고, hitT 가 0 이하일 때만 g.cv = max(1.5, g.cv - 0.7 × dt) 로 깎입니다. 시작 배수는 1.5, 바닥도 1.5, 천장은 5 입니다. 상승폭을 0.05 로 줄인 대신 유예를 둬서, 고정 사격처럼 간헐적으로 맞는 상황에서도 0.5초 안에 다음 병사가 닿으면 감소가 시작되지 않습니다. 놓치면 그때부터는 초당 0.7 로 꽤 빠르게 깎이므로 1초 쉬면 배수가 0.7 줄어듭니다. 이 조합을 봇 시뮬레이션으로 돌려 보니 배수가 2.8~5.0 사이에서 오르내렸습니다. 바닥(1.5)에 붙어 있지도, 천장(5)에 눌러붙지도 않고 조준에 따라 움직이는 구간이 생긴 것입니다.

배수가 소수일 때의 처리도 같은 커밋에서 정했습니다. 문을 지난 병사 한 명이 만드는 추가 병사 수는 e = cv - 1 에서 floor(e) 에 확률적으로 1 을 더한 값입니다. 배수 ×2.5 라면 병사 한 명당 최소 1명이 늘고, 절반의 확률로 1명이 더 늘어납니다. 배수 표시는 0.5 단위로 반올림해 "×3.5" 같은 형태로 보여 주고, 라벨이 바뀔 때 문 패널을 1.15배로 잠깐 부풀렸다가 되돌립니다. 숫자가 올라가는 것을 눈으로 느끼게 하려는 장치였습니다.

병사는 문까지 5초 걸린다: 조준 감각의 계산

연타 문을 조준하는 일이 어려운 진짜 이유는 폭이 좁아서만이 아닙니다. 병사 속도는 5.8(CFG.unitSpeed)이고 연타 문은 보통 z=29 에 있으니, 발사된 병사가 문에 닿기까지 약 29 ÷ 5.8 = 5.0초가 걸립니다. 지금 문이 있는 자리에 쏘면 병사가 도착했을 때 문은 이미 다른 곳에 있습니다. 문의 위상 속도는 sp ÷ 5.6 × 1.6 라디안이므로 3단계(sp=4.35)에서는 한 왕복 주기가 약 5.05초로 계산됩니다. 비행 시간 5.0초와 거의 같아서 3단계에서는 "지금 문이 있는 곳"에 쏘면 한 주기 뒤에 같은 위치로 돌아온 문과 만나게 되는 우연이 생깁니다. 12단계(sp=6.6)에서는 주기가 약 3.3초로 줄어 이 우연이 사라지고, 앞질러 쏘는 연습이 필요해집니다. 이 부분은 상수로 계산한 값이고 실제 플레이에서 병사가 옆으로 끌리는 움직임(seekSpeed 3.2)까지 더하면 어긋날 수 있어서, 공략 글(군단 점령전 공략)에서는 "문을 따라가며 쏜다" 정도로만 안내했습니다.

부서지는 벽: 내구도 공식과 대장의 손해

같은 커밋에서 연타 문과 함께 들어간 것이 부서지는 갈색 벽입니다. 내구도는 Math.round((14 + 단계 × 2.5) × 3) 입니다. 3단계는 (14 + 7.5) × 3 = 64.5 를 반올림해 65, 10단계는 39 × 3 = 117 입니다. 곱해지는 3 은 한 발에 병사가 3명씩 나오는 CFG.volley 값으로, 적 기지 체력이나 감산 문 수치에도 같은 배수가 곱해져 있어서 벽도 같은 눈금에 맞춘 것입니다. 기본 발사 속도 초당 16.5명으로 65를 깎으려면 약 3.9초가 듭니다. 병사가 벽에 닿으면 병사는 사라지고 내구도가 1 줄어드는데(hitWall 안의 w.hp -= u.big ? 8 : 1), 대장은 8 만 줄입니다. 대장은 병사 한 명과 같이 사라지면서 벽에는 8밖에 주지 못하니, 대장 게이지를 모아 둔 사람에게는 벽 쪽 발사를 피하라는 신호가 됩니다. 이 사실은 게임 안에서 따로 설명하지 않고 공략 글에 적어 두었습니다.

벽이 부서지면 뒤에 숨어 있던 황금 문(×5, 8단계부터 ×6)이 열립니다. 벽은 z=33, 황금 문은 z=38 에 있어서 벽을 부수는 동안 문은 hidden 상태로 병사 통과 판정에서 빠집니다. 그리고 하나 더 의식한 것은 적 유입량 계산입니다. 적은 "가장 좋은 문으로 계속 쐈을 때의 화력"에 비례해 흘러나오게 되어 있는데, 숨은 문과 연타 문은 이 계산에서 제외했습니다. 조건을 채워야만 쓸 수 있는 문을 기준에 넣으면, 문을 못 쓰는 사람에게는 밸런스가 한참 어려워지기 때문입니다.

단계마다 돌아가는 변화 요소와 적 유입 10% 가산

3단계부터의 변화 요소는 ['B', 'C', 'S', 'BC'][(단계 - 3) % 4] 로 돌아갑니다. 3단계는 벽(B), 4단계는 연타 문(C), 5단계는 한쪽을 막는 벽(S), 6단계는 벽과 연타 문(BC) 순이고, 9단계 이후에는 연타 문이 자리에 따라 더 붙습니다. 변화 요소 글자 하나당 적 유입이 10%씩 늘어나도록 (1 + 0.1 × ext.length) 를 곱했습니다. 6단계처럼 두 요소가 겹치는 단계는 20% 늘어난 적을 상대하는 셈입니다. 한편 부서지는 벽이 있는 단계에서는 4단계 이상이어도 PUSH 블록을 2개가 아니라 1개만 세우고, 그 위치도 벽 반대쪽(-eside × 4)으로 잡았습니다. 벽 쪽 길목이 이미 붐비니 반대편은 비워 둔다는 배치입니다. 연타 문의 자리는 가운데에 긴 벽이 있거나 한쪽 막이 있는 맵에서 z=29 가 아니라 z=51 로 뒤로 물립니다. 51 ÷ 5.8 은 약 8.8초라서 이 경우 앞질러 쏘는 거리가 훨씬 길어집니다.

아직 마음에 걸리는 것

솔직히 정리하면 봇 시뮬레이션은 "고정 사격이 바닥에 붙지 않는다"와 "상한에 눌러붙지 않는다"를 확인했을 뿐, 사람의 손이 얼마나 재밌게 느끼는지는 보증하지 못합니다. 한 가지 더, 연타 문이 12단계에서 최고 속도에 이른 뒤에는 문 속도가 더 오르지 않기 때문에 후반 단계의 난이도는 적 유입과 벽 내구도에 맡겨져 있습니다. 손가락으로 대포를 끌며 5초 앞을 예측하는 일이 지나치게 어렵다는 반응이 나온다면, 천장 ×5 를 낮추기보다 감소 속도 0.7 쪽을 먼저 만지는 편이 낫다고 판단합니다. 천장은 보상의 크기이고 감소 속도는 실수의 값이라서, 어렵다는 불만에는 실수의 값을 깎는 쪽이 조준 보상이라는 설계를 덜 해치기 때문입니다.

이 글의 수치는 모두 mobpush/index.html 에서 g.charge, g.cv, g.hitT, hitWall, CFG 를 검색하면 확인할 수 있습니다. 더 이상 쓰이지 않는 +0.1/−0.55, +0.2/−0.45 의 두 설정만 소스에 남아 있지 않으며, 그 값과 관찰은 작업 기록에서 옮긴 것입니다.

관련 게임 플레이하기

다른 읽을거리

개발노트솔저 러쉬 개발 노트: 넓은 도로와 난이도 조정도로를 9에서 15로 넓히자 게이트 글씨가 늘어났고, 쉬워졌다는 의견에 체력 곡선과 무리 크기를 다시 맞춘 과정을 변경 전후 수치로 적었습니다.개발노트소리를 직접 합성하며 키운 값들: 긴장 연출과 발사음녹음 파일 없이 코드로 만든 효과음·배경음악 구조와, 레오니스의 긴장 연출·챔피언 울음, 군단 점령전 발사음을 키울 때 바꾼 숫자를 이력으로 정리했습니다.공략군단 점령전 공략: 문 배수와 대장 게이지 활용군단 점령전에서 병사를 폭발적으로 불리는 문 활용법, 벽·황금 문·연타 문 공략, 대장 게이지와 업그레이드 투자 순서까지 정리했습니다.공략솔저 러쉬 공략: 무기 해금, 타이어 탑, 문 선택솔저 러쉬의 무기 5종 해금 순서와 특징, 보급 상자 타이어 탑, 거대 적 대처, 게이트를 고르고 키우는 법을 게임 수치로 설명합니다.가이드터치 조작을 만들며 정한 임계값과 실패한 순서대포 드래그 1:1 환산, 스와이프 20~24픽셀, 블록 탭 회전, 알까기 선택 반경, 런너에서 숙이기보다 점프가 먼저 나가는 한계를 소스 수치로 정리했습니다.개발노트알까기에서 승리 소리가 끝없이 울린 이유게임이 끝난 뒤에도 승패 효과음이 반복되고 승리 횟수가 계속 오르던 알까기 버그를 settle() 흐름과 한 줄 수정, 같은 유형 점검 결과로 정리했습니다.