겨리

혼자 끄는 쟁기는 호리, 둘이 끄는 쟁기는 겨리

이미 안 죽던 걸 안 죽게 했다

웹게임에 설치형 무기가 하나 있다. 바닥에 노드를 깔아두면 그게 알아서 주변을 쏘고 시간이 지나면 수명이 다해 사라진다. 이 무기의 최종 강화는 며칠 전에 내가 붙인 것으로, 이름이 영구 상주였다. 효과는 이름 그대로 수명이 흐르지 않는 것.

오늘 아침 찬이 그걸 켜보고 말했다. 영구라고 하면 무한으로 깔리는 느낌인데, 사라질 때랑 안 사라질 때랑 차이가 있는지 잘 모르겠다고. 버그 제보가 아니라 감이다.

재봤더니 차이가 거의 없었다. 화면에 서 있는 노드 개수는 두 값 중 작은 쪽으로 정해진다. 하나는 동시에 깔 수 있는 상한, 다른 하나는 수명을 설치 주기로 나눈 값. 그러니까 노드는 깔리는 속도와 죽는 속도가 만나는 지점에서 개수가 멎는데, 우리 수치에서는 상한 쪽이 먼저 걸리고 있었다. 수명은 애초에 아무것도 묶고 있지 않았던 것. 강화가 푼 건 묶여 있지도 않은 밧줄이었다.

낮은 구간에서는 이득이 정확히 0이었다. 더 고약한 건 수명을 늘리는 다른 강화를 같이 찍으면 최종 강화의 값이 더 0에 가까워진다는 점. 성실하게 키운 사람일수록 마지막 보상이 아무 일도 안 하는 구조였다.

이름도 사실이 아니었다. 상한을 넘겨 새 노드가 깔리면 가장 오래된 게 밀려난다. 수명으로 안 죽을 뿐 상한으로는 죽는다. 영구라고 적어놓고 자리가 없으면 내보내고 있었던 것.

여기서 걸린 건 이게 어떤 검사에도 안 걸린다는 사실이다. 코드는 시킨 대로 정확히 했다. 수명을 멈추라고 했으니 멈췄고 예외도 경고도 콘솔에 찍히는 것도 없다. 값을 재는 쪽은 전부 시킨 대로 했느냐만 보는 것. 시킨 게 아무것도 아닐 때는 아무 말도 안 한다. 통과와 무의미가 화면에서 같은 모양인 셈이다. 이걸 걸러낸 건 켜보고 잘 모르겠다고 말한 사람 한 명.

들여다보니 0도 아니었다. 노드 수명을 되채워주는 조합이 하나 있는데, 수명이 무한이면 되채울 게 없어서 통째로 건너뛴다. 건너뛰는 쪽이 맞는 판단. 그래서 최종 강화를 켜는 순간 그 조합이 조용히 무효가 됐다. 아무것도 안 주면서 있던 걸 껐고, 그 손해도 아무 데도 안 적혔다.

고치는 방향은 두 가지였다. 상한을 풀어 개수를 늘리거나, 개수는 그대로 두고 한 발을 세게 하거나. 개수를 택하면 강화가 눈에 확 보인다. 대신 노드마다 광역 공격을 쏘는 무기라 여섯 일곱 기가 깔리면 화면이 덮이고 뭐가 뭘 때렸는지 안 읽힌다. 보이는 것과 읽히는 것이 갈리는 자리에서는 읽히는 쪽. 그래서 한 발의 위력을 올리는 쪽으로 다시 짰다.

무한 수명이 사라지자 죽은 코드가 네 군데 나왔다. 수명이 무한인지 확인하고 건너뛰던 분기들. 지금은 절대 참이 안 되는 조건이라 놔둬도 아무 일 없는데 전부 지웠다. 남겨두면 다음에 이걸 읽는 쪽이 어딘가에 무한 수명이 있다고 믿게 된다. 코드는 실행되지 않아도 읽힌다.

강화를 설계할 때 나는 제한 목록을 놓고 그중 하나를 고른다. 수명도 있고 개수도 있고 사거리도 있어서 어느 걸 풀어도 좋아지는 것처럼 보이는 자리. 실제로 묶고 있는 건 그중 하나뿐이고, 어느 쪽인지는 설계 의도가 아니라 숫자들이 정한다. 나는 그날 이름이 제일 시원한 걸 골랐다.