베일스트라이크에는 발소리가 진작부터 좌우로 갈려 있었습니다. 옆에서 누가 뛰면 그쪽에서 소리가 납니다.

그런데 총소리는 늘 화면 한가운데서 났습니다. 가장 급한 소리에만 방향이 없었던 셈입니다. 어디서 쏘는지 귀로 모르면 화면을 한 바퀴 돌려 찾아야 하는데, 교전 거리에서 그 시간이면 이미 죽습니다.

스테레오만으로는 앞뒤를 못 가릅니다

듣는 사람이 보는 방향과 소리가 난 자리, 이 둘에서 좌우와 앞뒤를 계산합니다. 좌우는 스테레오로 갈면 됩니다. 문제는 앞뒤입니다 — 정면 소리와 등 뒤 소리는 좌우가 둘 다 반반이라 스테레오만으로는 완전히 같습니다.

그래서 등 뒤 소리는 고역을 깎아 어둡게 만들었습니다. 실제 귀도 머리와 귓바퀴가 뒤에서 오는 높은 음을 가리기 때문에 뒤쪽이 둔하게 들립니다.

귀 대신 파형을 쟀습니다

소리는 눈으로 볼 수 없으니 오프라인으로 렌더해서 숫자로 확인했습니다.

소리가 난 방향왼쪽/오른쪽음색(밝기)
정면50 / 50.250
옆—.218
정오른쪽2 / 98—
비스듬히 오른쪽11 / 89—
정왼쪽98 / 2—
등 뒤50 / 50.191

등 뒤가 정면보다 23.6% 어둡습니다. 그리고 좌우도 한쪽 귀로 완전히 몰지는 않았습니다 — 100/0으로 만들면 헤드폰에서 소리가 귀에 달라붙어 거리감이 사라집니다.

좌우 부호는 뒤집혀도 티가 안 납니다

이 계산을 순수 함수로 떼어 검사에 걸어 둔 이유가 있습니다. 좌우 부호가 반대여도 앞뒤는 멀쩡하게 동작합니다.

소리가 오른쪽에서 나는데 왼쪽에서 들리면, 화면을 보며 놀 때는 "음향이 좀 이상한가" 정도로 지나갑니다. 앞뒤 구분과 거리감은 그대로니까요. 그래서 실제로 확인하지 않으면 반대로 만든 채로 배포됩니다.

저는 그 버그를 달고 출시한 적이 있습니다. 섬 탐험에서 걸어 다니는 조작의 좌우가 뒤집혀 있었습니다. 전진과 후진은 정상이었고, 그래서 손으로 몇 번 움직여 보는 것으로는 걸러지지 않았습니다. 카메라를 기준으로 화면 오른쪽을 구할 때 부호 하나가 반대였던 것뿐입니다.

앞뒤가 멀쩡하면 좌우는 검증되지 않습니다. 좌우를 쓰는 계산은 좌우를 따로 단언해야 합니다.

대전에서는 총소리가 아예 안 났습니다

방향을 넣고 나서야 드러난 것이 하나 더 있었습니다. 온라인 대전에서는 남의 총소리가 전혀 나지 않았습니다.

서버는 누가 어디서 쐈는지를 이미 보내고 있었고, 통신 처리도 그것을 받아 넘기고 있었습니다. 그런데 그 사건을 받는 쪽에 해당 가지가 없어서 조용히 버려지고 있었습니다. 오류도 경고도 나지 않습니다 — 모르는 사건을 무시하는 코드는 정상 동작이니까요.

같은 결의 이야기를 이 글에서도 적었습니다. 아무 소리도 내지 않는 실패가 크래시보다 오래 삽니다.

검사는 176개에서 182개가 됐습니다. /veilstrike/에서 헤드폰으로 들어 보시면 차이가 가장 잘 납니다.