베일스트라이크에 6번 무기로 스프레이를 넣었습니다. 보고 있는 면에 미리 저장해 둔 그림 한 장을 그립니다. 벽이든 바닥이든 컨테이너든 엄폐물이든, 맞은 그 면에 붙습니다. 피해도 총소리도 없고 한 목숨에 열 번입니다.

기능 자체는 간단해 보였습니다. 눈앞으로 광선을 하나 쏘고, 맞은 자리에 그림이 그려진 판을 하나 세우면 끝입니다. 실제로 혼자 하는 연습전은 그게 전부였습니다. 문제는 그 다음이었습니다.

장식이지만 화면에만 둘 수는 없습니다

낙서는 남이 봐야 낙서입니다. 나만 보이는 낙서는 낙서가 아니라 혼잣말입니다. 그래서 자국은 서버를 거쳐야 하는데, 이 게임의 서버는 원래 이동과 명중을 판정하는 곳입니다. 판정과 아무 상관이 없는 것을 거기에 얹어도 되는가가 첫 질문이었습니다.

정리한 규칙은 이렇습니다. 서버는 값이 말이 되는지만 보고 그대로 전합니다. 자국은 총알도 시야도 막지 않으므로 서버가 따로 계산할 것이 없고, 저장할 것도 없습니다. 그래서 늦게 오거나 아예 못 와도 판은 한 치도 달라지지 않습니다.

그래도 "말이 되는지" 는 봐야 합니다. 남이 보낸 좌표가 맵 밖이거나 NaN 이면, 다른 사람 화면에서 자국이 허공에 뜨거나 그리기가 통째로 멈춥니다. 좌표 범위, 법선의 길이, 그림 번호를 확인하고 하나라도 어긋나면 그 메시지를 버립니다.

화면의 탄약 칸은 믿을 수 없습니다

"한 목숨에 열 장" 은 화면에서 이미 세고 있습니다. 캔의 용량이 10이고 보급이 없으니, 열 번 뿌리면 더는 안 나갑니다.

그런데 그 숫자는 플레이어 컴퓨터 안에 있는 값입니다. 규칙을 화면에만 두면, 고쳐 보낸 클라이언트가 초당 수십 장을 뿌려 남의 화면을 도배할 수 있습니다. 그래서 서버도 셉니다 — 사람마다 한 목숨에 열 장, 되살아나면 다시 0부터입니다.

이것이 이 기능에서 가장 오래 생각한 부분입니다. 판정에 쓰이지 않는 장식이라도, 남의 화면에 무언가를 그리게 하는 순간 그것은 더 이상 순수한 장식이 아닙니다.

자국이 벽에 눕지 않게

눈으로는 잘 안 잡히는 실수가 둘 있었습니다.

하나. 맞은 면의 법선은 그 물체의 좌표계입니다. 광선이 알려 주는 법선을 그대로 쓰면, 45도로 돌려 놓은 컨테이너에 뿌린 자국이 엉뚱한 쪽을 보고 눕습니다. 세계 좌표로 바꿔야 벽을 정면으로 바라봅니다. 방향이 뒤집히면 자국이 벽 뒤에 붙어서 아예 안 보이는데, 화면에서는 그냥 "왜 안 그려지지?" 로만 보입니다.

둘. 벽에 딱 붙이면 지직거립니다. 같은 자리에 벽과 자국이 겹쳐 있으니 어느 쪽을 그릴지 매 프레임 다투는 것입니다. 3cm 띄우고 깊이 밀어내기를 걸어 해결했습니다.

그래서 이 계산만 따로 떼어 검사에 넣었습니다. 일곱 방향(위·아래·좌우·앞뒤·비스듬한 면)에서 자국이 그 면을 바라보는지, 기울여도 여전히 바라보는지, 법선이 빈 값이어도 NaN 이 안 나오는지를 봅니다. 브라우저를 띄우지 않고 확인할 수 있는 것은 여기까지이고, 나머지는 실제로 뿌려 봤습니다.

그림이 세로로 길어서 자국도 세로로 깁니다(1.2m × 1.8m). 정사각 판에 붙이면 그림이 눌려 납작해지므로, 판의 비율이 그림 비율과 어긋나지 않는지도 검사가 봅니다.

그 판에서만 남깁니다

자국은 그 판 동안만 남습니다. 지우는 자리가 셋입니다.

  • 새 판이 시작될 때 — 연습전은 판을 다시 차릴 때, 온라인은 서버가 "교전 개시" 를 알릴 때
  • 지형이 바뀔 때 — 붙어 있던 벽 자체가 없어지므로, 안 지우면 허공에 뜬 그림만 남습니다
  • 새로고침하면 당연히 사라집니다

서버가 저장하지 않으므로, 판 도중에 들어온 사람은 그 뒤에 뿌려진 것만 봅니다. 그리고 한 판 안에서도 48장이 넘으면 오래된 것부터 걷습니다 — 여덟 명이 열 장씩이면 80장이고, 그걸 다 그리면 그리기가 무거워집니다.

확인한 것

  • 계산 검사 6개 — 일곱 방향의 법선, 기울기, 빈 법선, 그림 번호 범위, 자국 비율
  • 브라우저에서 6개 — 그림 적재, 6번 선택, 뿌리면 자국이 남는가, 캔이 10에서 7로 주는가, 새 판에서 지워지는가
  • 로컬 대전 서버로 5개 — 서버가 되돌려 준 값의 법선 길이가 1.00 인가, 한 목숨 열 장 제한이 실제로 걸리는가

그림은 미리 저장해 둔 열 장 중 하나가 나옵니다. 스티커 풍의 인물 일러스트이고 실존 인물이 아니라 생성한 그림입니다. 파일을 같은 이름·같은 비율로 덮어쓰면 그대로 갈립니다.

/veilstrike/에서 바로 해 보실 수 있습니다. 6번을 들고 아무 벽에나 대고 쏘면 됩니다.