본문 바로가기
alzy.kr
개발일지

재미있는 연출을 일주일 만에 뺀 날 — 금지를 주석이 아니라 타입에 적었다

타누비 데일리에는 그날 하루짜리 변주가 하나 얹힙니다. 그중 하나였던 땅거미를, 넣은 지 정확히 일주일 만에 뺐습니다. 고장이 나서가 아닙니다. 땅거미는 제가 그 시스템에 걸어 둔 규칙 — 변주는 오직 시드에서만 나올 것, 지형과 물리에는 손대지 않을 것, 점수에 보정을 넣지 않을 것 — 을 하나도 어기지 않았습니다. 다 지킨 상태로 뺐습니다. 이 글은 멀쩡히 돌아가는 기능을 "여기엔 과하다"는 이유만으로 빼기로 한 판단, 그리고 그 판단을 어디에 적어 두었는지에 대한 기록입니다. 저는 그것을 주석이 아니라 타입에 적었습니다. 지금 데일리에 변주가 몇 종이고 각각이 무엇을 하는지는 공략 쪽에 정리해 두었으니, 여기서는 왜 뺐는지만 다루겠습니다.

작성일: 2026-07-31

땅거미는 잘 만든 연출이었다

변주 자체는 그 일주일 전에 넣은 것입니다. "데일리를 매일의 의례로"라는 생각으로, 리셋까지 남은 시간이나 연속 출석 표시 같은 것들과 함께, 그날의 공기만 한 겹 갈아 끼우는 장치를 얹었습니다. 땅거미는 그 첫 얼굴들 사이에 있었습니다.

설계상의 조건은 전부 통과였습니다. 땅거미는 그리는 쪽만 건드리므로 판의 모양도 판정도 움직이지 않습니다. 생성된 판이 반드시 풀린다는 보장을 깨지 않습니다. 시드에서 나오니 같은 날 달리는 사람은 어디에 있든 같은 것을 뽑습니다. 점수 보정도 없습니다. 제가 변주라는 장치에 적어 두었던 조건 중에 땅거미가 어긴 것은 하나도 없었습니다.

보기에도 손맛이 있었습니다. 배지에는 전용 이모지와 이름이 있고, 세 언어 각각에 한 줄짜리 설명이 붙어 있습니다. 우리말로는 "시야가 좁아진다". 뽑은 순간 오늘이 특별하다는 걸 다른 어떤 것보다 분명히 알려주는 변주였습니다. 나중에 빼는 이유가 된 것도 바로 거기였습니다. 제 점검표는 합격이었고, 모자랐던 건 합격을 준 점검표 쪽이었습니다.

데일리에서만 자리가 틀렸다

소스에 남긴 이유는 짧은 한 줄입니다. 시야 제한이 데일리엔 과하다는 것이고, 저는 거기에 "오너 판단"이라고 분명히 적어 두었습니다. 계측에서 나온 결론이 아니기 때문입니다. 땅거미인 날에 사람들이 어떻게 놀았는지, 중간에 그만둔 사람이 늘었는지를 저는 세지 않았습니다. 그 변경이 들어간 날의 확인 작업도 타입 검사와 테스트, 빌드, 그리고 로그인 관련 실지 확인까지였고, 땅거미 전후로 플레이가 어떻게 달라졌는지를 잰 기록은 어디에도 없습니다.

그러면 무엇을 근거로 정했는가. 데일리와 캠페인의 성질 차이입니다. 캠페인의 판은 번호로 정해져 있어 어디에 무엇이 얹히는지 미리 알 수 있고, 같은 판을 몇 번이고 다시 달릴 수 있습니다. 데일리는 그 반대여서, 그날의 시드로 만들어진 한 장의 판을 모두가 처음 보는 상태로 달립니다. 정보를 줄이는 장치는 정보가 가장 부족한 자리에서 가장 무거워진다 — 이게 제 견해였습니다.

다른 변주들과의 차이도 같은 선에서 설명됩니다. 저중력은 규칙을 바꾸므로 규칙을 익히면 상대할 수 있습니다. 안개는 보이는 것을 옅게 만들지만 보인다는 사실 자체를 가져가지는 않습니다. 땅거미만이 보는 행위 쪽을 덜어냅니다. 이미 외운 판에서 시야를 줄이면 기억력 시험이 되지만, 처음 보는 판에서 같은 일을 하면 배울 수 없는 어려움만 남습니다. 저는 그렇게 봤습니다. 제가 데일리에 상정한 것은 매일의 습관으로, 준비운동 없이 한 번 달리고 끝내는 놀이였습니다. 그렇게 상정한 자리에 그날만 유독 조심성을 더 요구하는 얼굴이 섞여 있는 건 어색합니다. 이것도 숫자가 아니라 제 판단입니다.

빼는 것과 지우는 것은 다르다

빼기로 한 다음에는 어디까지 뺄지를 정해야 했습니다. 결론은 데일리 추첨에서는 완전히 빼되, 그 밖에는 거의 아무것도 지우지 않는다는 것이었습니다. 캠페인 쪽 땅거미 이벤트는 이 변경에서 한 줄도 건드리지 않았습니다. 어둡게 하라는 지시 자체는 캠페인과 데일리가 함께 쓰는 하나의 깃발인데, 그것도 남겼습니다. 남겨 두고, 데일리 쪽에서만 다시는 세우지 못하게 했을 뿐입니다.

이렇게 한 이유는 "과하다"는 평가가 연출 자체가 아니라 놓인 자리를 향한 것이었기 때문입니다. 자리에 대한 판단이라면 고칠 것은 자리이지 만들어 둔 물건이 아닙니다. 번호로 예고되고 같은 판을 연습할 수 있는 캠페인은, 처음 보는 판이라는 조건 자체가 성립하지 않는 자리입니다. 땅거미는 거기서라면 과하지 않습니다.

하나 더, 틀렸을 때의 값 이야기도 있습니다. 어둡게 하는 깃발과 배지 이름은 캠페인 쪽이 지금도 쓰고 있어서 지울 이유가 없었고, 설명문은 이름과 같은 항목에 들어 있어 함께 남았습니다. 반년 뒤에 생각이 바뀌어 데일리에도 되돌리고 싶어졌을 때, 그것들이 남아 있으면 되돌리는 건 몇 줄입니다. 전부 지웠다면 다시 만드는 일이 됩니다. 판단의 근거가 계측이 아니라 제 견해인 이상, 그 견해가 빗나갔을 때의 값을 싸게 해 두는 것은 조건에 넣어야 할 항목이었습니다.

"쓰지 마세요"라고 적는 대신, 못 쓰게 만들었다

금지를 적어 둘 자리가 둘 있었습니다. 하나는 종류 목록에 땅거미를 남겨 둔 채 추첨 표에서만 빼고, 위에 "데일리에서는 쓰지 말 것"이라고 주의를 달아 두는 방식. 다른 하나는 종류 자체에서 땅거미를 지우는 방식입니다.

저는 뒤쪽을 골랐습니다. 고르자마자 빌드가 빨개지며 빼먹은 곳을 하나 짚어 주었습니다. 변주를 판에 얹는 함수 안에, 땅거미면 어둡게 한다는 분기가 아직 남아 있었던 겁니다. 주의를 다는 방식이었다면 그 한 줄은 한참 동안 거기 앉아 있었을 것입니다. 아무도 실수하지 않아서가 아니라, 아무도 보러 가지 않아서입니다.

그다음에 벌어진 일이 더 재미있었습니다. 배지의 이름과 이모지를 모아 둔 사전은 같은 종류 타입으로 키가 정해집니다. 종류에서 땅거미가 빠지자 사전에 땅거미 항목을 남겨 두는 것이 타입으로 통과하지 않게 됐습니다. 남기려면 키의 타입을 "데일리의 넷, 그리고 땅거미"라고 명시적으로 넓히는 수밖에 없습니다. 즉 컴파일러는 예외를 지우든지 예외를 소리 내어 적든지 둘 중 하나를 고르게 만든 셈입니다. 저는 적는 쪽을 골랐고, 그 자리에 이유도 함께 남겼습니다 — 캠페인 이벤트 표시가 이 사전을 그대로 재사용하니 어휘를 맞추려면 필요하다고. 화면 쪽 코드도 어두운 판일 때 이 사전의 땅거미 항목에서 이모지와 이름을 꺼내 씁니다.

결국 주석으로 적는 금지는 미래를 향한 부탁이고, 타입으로 적는 금지는 빌드가 매번 확인하는 조건입니다. 부탁은 낡지만 조건은 낡지 않습니다. 다만 이 타입이 보장하는 범위는 정확히 짚어 두겠습니다. 땅거미가 게임에서 사라진 것이 아닙니다. 어둡게 하는 깃발은 남아 있고 캠페인은 지금도 그것을 세웁니다. 타입이 단언할 수 있는 것은 그보다 좁습니다 — 데일리의 추첨은 땅거미를 만들 수 없고, 데일리 쪽 코드는 땅거미라는 값으로 분기조차 할 수 없다. 딱 거기까지입니다.

기능을 뺄 때의 기준으로 남은 것

테스트는 둘을 더했습니다. 하나는 오천 가지 시드와 날짜에서 만든 사백 가지 남짓한 시드로 추첨이 땅거미를 돌려주지 않는지 확인하는 것. 다른 하나는 남은 넷이 치우치지 않고 나오는지 보는 것입니다. 여기서 말을 조심하고 싶은데, 이 검사는 모든 시드를 시험한 것이 아닙니다. 어디까지나 표본입니다. 테스트 파일에도 제가 그렇게 적어 두었습니다 — 이건 타입이 주는 보장을 실행 시점에 한 번 더 확인하는 회귀 가드라고. 진짜 보장은 타입 쪽에 있고, 테스트는 그것이 나중에 슬그머니 풀리지 않았는지 지켜보는 역할입니다.

빼는 작업 자체는 놀랄 만큼 작았습니다. 추첨 표는 예전에 열 칸짜리 배열에 다섯 종류를 두 번씩 늘어놓은 것이었습니다. 위 주석에는 가중치를 준다고 적혀 있었는데 실제 배열은 전부 같은 횟수라 가중이 없었습니다. 그래서 한 종류를 빼도 비율을 다시 맞출 일이 없었고, 네 칸짜리 평평한 배열로 고쳐 쓰는 것으로 끝났습니다. 변수 이름은 지금도 가중치 표 그대로입니다. 이름만이 자기가 설명하던 내용보다 오래 살아남은 사례로 적어 둡니다.

이 건에서 손에 남은 기준을 넷으로 접어 둡니다. 고장이 아니라면 질문을 "잘 만들었는가"에서 "자리가 맞는가"로 바꿀 것. 뺄 때는 틀렸을 경우 되돌릴 수 있는 형태로 뺄 것. 결정을 내 기억이 아니라 기계에 맡길 것 — 주의문이 아니라 타입에, 다짐이 아니라 테스트에. 그리고 예외를 남긴다면 그 자리에 이유를 적을 것.

마지막으로 솔직한 부분을 적어 둡니다. 이 변경은 그날 커밋에서 가장 작은 항목이었습니다. 본론은 로그인 없이 어디까지 놀 수 있는지 선을 다시 긋는 쪽이었고, 땅거미 제거는 그 끝에 한 단락으로 붙어 있습니다. 이런 작은 항목일수록 설명되지 않은 채 사라집니다. 지난주까지 있던 연출이 말없이 안 나오게 되는 건, 밖에서 보면 오류와 거의 구별이 되지 않습니다. 데일리가 좋아졌다고 말할 수 있는 숫자를 저는 갖고 있지 않습니다. 세지 않았기 때문입니다. 가진 것은 무엇을 왜 뺐고 그 금지를 어디에 적었는지에 대한 기록뿐이고, 이 글은 그것을 놓아 두려고 썼습니다.

타누비(Tanubi)