베일스트라이크는 지금까지 봇 연습전이었습니다. 혼자 들어가 봇 넷을 제압하는 게임이라, 명중과 피해를 전부 브라우저가 정해도 아무 문제가 없었습니다. 속여 봐야 자기 기록만 이상해집니다.

사람을 붙이는 순간 그게 전부 무너집니다. 화면 속 숫자를 고친 사람이 이기는 게임은 대전이 아닙니다. 그래서 이번 작업의 대부분은 새 기능이 아니라 판정을 어디서 하느냐를 옮기는 일이었습니다.

게임은 이제 "무엇을 했다"만 보냅니다

지금 온라인 판에서 브라우저가 서버에 보내는 것은 둘뿐입니다.

  • 이 키를 눌렀다
  • 이 방향으로 쐈다

자리도 명중도 서버가 정합니다. 그런데 이러면 새 문제가 생깁니다. 내가 앞으로 걸을 때마다 서버 왕복을 기다리면 조작이 손에 붙지 않습니다.

그래서 내 몸은 미리 그립니다. 서버가 답하기 전에 내가 먼저 계산해서 움직여 두고, 서버 답이 오면 맞춰 봅니다. 여기서 중요한 건 양쪽이 같은 걸음 계산을 써야 한다는 것입니다. 조금이라도 다르면 서버 답이 올 때마다 화면이 뒤로 튑니다. 계산을 파일 하나로 떼어 브라우저와 서버가 같은 것을 읽게 했습니다(로컬 확인에서 되맞춤 0.0cm).

남의 몸은 반대로 0.1초 과거를 그립니다. 받은 즉시 놓으면 초당 스무 번 순간이동합니다. 조금 늦게, 대신 부드럽게 그리는 쪽이 눈에 낫습니다.

걸음 계산이 잘게 굴릴 때와 몰아서 굴릴 때 달랐습니다

실제로 조작해 재 보니 출발 0.2초 동안 속도가 세 프레임마다 30%씩 내려앉았습니다.

0.96 → 2.43 → 3.38 → 2.69 → 3.35 → 3.78 → 3.47

등속에서는 편차가 0이라, 달리는 내내가 아니라 움직이기 시작할 때만 나타났습니다.

원인은 거리를 재는 방식이었습니다. 지나간 거리를 "갱신한 속도 × 시간"으로 계산하고 있었는데, 이러면 큰 걸음 한 번과 작은 걸음 여러 번의 결과가 달라집니다. 화면은 프레임마다 잘게 굴리고 서버는 입력을 모아 한 번에 굴리니, 가속 구간에서 둘이 서로 다른 자리를 가리켰습니다.

지수 감쇠의 정확한 적분으로 바꿨습니다. 이 식은 시간을 어떻게 쪼개도 합이 같아서, 잘게 굴리든 몰아서 굴리든 같은 자리에 옵니다. 고친 뒤 가속 곡선에서 뒤로 물러나는 프레임이 0개가 됐고, 등속 편차는 0.0002 m/s입니다.

예전 방식은 실제보다 1.4배 이상 멀리 보내고 있었습니다. 혼자 할 때는 아무도 몰랐던 오차입니다 — 비교 대상이 없었으니까요.

여덟 명이 한 자리에서 태어나면 그 자리가 도살장입니다

싱글플레이의 등장 지점을 그대로 쓰면 안 됐습니다. 한 점 둘레에서 여덟이 태어나니 가만히 서 있기만 해도 1분에 네 번 죽었습니다.

세 가지를 함께 넣었습니다.

  • 맵마다 열세 곳으로 자리를 흩고, 가장 가까운 두 자리도 6.3m 이상 떨어뜨렸습니다
  • 되살아날 때는 살아 있는 적에게서 가장 먼 자리를 고릅니다. 팀전에서 같은 편은 위험으로 세지 않습니다
  • 갓 되살아난 1.5초는 무적입니다. 다만 쏘는 순간 스스로 풀립니다 — 무적으로 쏘고 다니는 일이 없어야 합니다

빈 방은 모드를 말하면 안 됩니다

방을 찾을 때 규칙 하나가 처음에 틀렸습니다.

새로 들어온 사람을 빈 방으로 보내면, 여덟 명이 여덟 방에 흩어져 각자 봇하고만 놉니다. 그래서 지금은 방 네 개를 훑어 사람이 가장 많은 방으로 보냅니다.

그리고 여기 함정이 하나 더 있었습니다. 아무도 없는 방은 자기 모드를 답하면 안 됩니다. 빈 방이 "나는 데스매치다"라고 답하면 팀전을 찾는 사람은 갈 곳이 없어집니다. 모드는 그 방의 첫 사람이 정합니다.

통합하면서 싱글플레이의 잠복 버그 둘이 나왔습니다

온라인을 붙이는 김에 화면 코드를 훑다가, 원래부터 있었지만 아무도 안 밟던 것 둘을 찾았습니다.

  • 시간 간격이 0인 프레임에서 "이동거리 ÷ 시간"이 숫자가 아닌 값이 되고, 그 값이 카메라 각도에 한 번 들어가면 영영 돌아오지 않습니다. 조준이 죽습니다
  • 시계가 뒤로 갈 때 시간 간격이 음수가 되어, 화면 효과가 사라지는 대신 커집니다

둘 다 온라인 때문에 생긴 게 아니라, 온라인 때문에 드러난 것입니다. 사람이 여덟 붙으면 프레임이 흔들리고, 흔들리면 평소에 안 나오던 값이 나옵니다.

지금 상태

시작 화면의 작전 방식에서 고르면 됩니다.

방식내용
구역 확보 · 생존전예전의 봇 연습전. 순위표가 따로 있습니다
온라인 8인 데스매치사람이 모자란 자리는 서버가 봇으로 채웁니다
온라인 4대4 팀전군복으로 편을 가릅니다. 아군 표시는 벽 너머로도 보이고, 적에게는 아무 표시도 없습니다

온라인 판은 봇 연습전 순위표에 넣지 않습니다. 같은 표에 섞으면 비교가 안 됩니다.

/veilstrike/에서 바로 들어가실 수 있습니다. 휴대폰에서도 됩니다.