← qminlab

FILE QL-004 / 게임 / 시행착오

딥홀드 시행착오

딥홀드는 장비도 레벨도 없이 세 번 맞으면 끝나는 하드코어 2.5D 도트 액션 게임이에요. 모든 공격에 예고를 넣어서, 죽으면 내 실수라고 느끼게 만드는 게 목표예요.

10월 15일 기획서를 쓰고 10일 동안 v0.1에서 v0.6.3까지 올렸어요. 기능을 넣을 때마다 밸런스 · 판정 · 파티 렉 · 서버가 차례로 문제가 됐어요. 버전마다 무엇이 어긋났고 다음 버전에서 어떻게 바꿨는지 적었어요.

10
일 (10.15 기획 → 10.24 v0.6.3)
28
번 태그 단 버전 (v0.2.0 ~ v0.6.3)
453
개 커밋
gen 11
지금 던전 규칙 번호

기록 기준

  1. v0.1

    규칙부터 만든 첫 빌드

    2026.10.15 ~ 10.16 · 개발 단계 M1 ~ M9

    무덤지기 거미왕 도트 그림
    v0.1에서 규칙부터 만든 보스 다섯 중 첫째, 무덤지기 거미왕 (지금 그림)

    시도

    기획서에 다섯 원칙(성장 없음 · 세 번 맞으면 끝 · 어렵게 · 억울하지 않게 · 같은 몬스터는 같은 패턴)과 몬스터 50종 · 보스 5종 · 경제 · 내 던전 규칙을 정리했어요. 그다음 화면 없이 도는 규칙 코어를 먼저 짜고, 몬스터 36종은 에이전트 4개가 나눠서 동시에 만들었어요. 보스 5종, 마을 · 소환 · 폐광산, 내 던전 편집기, 기록 검증 서버, 데스크톱 앱 포장까지 이어 붙였어요.

    부딪힌 문제

    • 서버를 Supabase 무료 플랜으로 시작했는데, 서버 함수가 요청 한 번에 CPU 2초까지만 돼서 기록 검증을 1만 5천 틱씩 잘라 여러 번에 나눠 돌려야 했어요.
    • 데스크톱 앱 포장은 작업 환경에서 npm에 접속할 수 없어서, 설정만 만들고 실행은 확인하지 못한 채 넘어갔어요.
    • 그림이 아직 없는 자리는 같은 크기의 단색 도형으로 대신했어요.

    아쉬운 점

    혼자 하는 원정의 뼈대는 섰지만 그림 · 소리 · 마을이 임시였고, 친구와 같이 할 방법이 없었어요.

    그래서 v0.2는 그림과 소리를 붙이고 마을과 광장을 새로 만들었어요.

  2. v0.2

    그림을 붙이고 친구에게 보내기

    2026.10.16 ~ 10.17 · 업데이트 2 ~ 5

    새로 그린 마을 "마지막 등불" 전경
    새 그림으로 다시 만든 마을 "마지막 등불". 마을 안에서도 베고 구를 수 있어요.

    시도

    그림 848장 · 효과음 · 음악을 연결하고, 기록관(도감) · 저주 · 유물 · 업적 250개 · 꾸미기 · 오늘의 심연을 넣었어요. 마을은 새 그림으로 다시 만들고 마을 안에서도 베고 구를 수 있게 했어요. 광장 · 채팅 · 감정 표현, 마을 창 UI v2, 경제와 폐광산 개편이 같이 들어갔어요. 깃허브 릴리스로 자동 업데이트를 붙이고, 배포처를 공개 저장소로 따로 떼어 코드 저장소를 비공개로 돌릴 준비를 했어요.

    부딪힌 문제

    • 옛 마을 그림과 새 마을 그림에 이름이 같은 애니메이션이 있어서 시험이 깨졌어요. → 옛 마을 그림은 아예 불러오지 않게 했어요.
    • 자동 빌드가 실패했어요. 빌드에 필요한 자동 생성 데이터가 저장소에 없었고, 릴리스를 만들기 전에 파일을 올리려다 오류가 났어요. → 생성 데이터를 넣고, 릴리스를 먼저 만든 뒤 파일을 올리게 바꿨어요.
    • 베는 도중에는 구르기를 쓸 수 없었어요. → 베기를 그 자리에서 끊고 구르는 평타 캔슬을 핵심 규칙으로 바꿔 넣었어요. 던전과 마을 모두요.

    아쉬운 점

    여전히 혼자 하는 게임이었고, 원정 규칙과 경제는 아직 대충 맞춘 숫자였어요.

    그래서 v0.3(업데이트 6)은 파티와 원정 규칙을 한꺼번에 다시 짰어요.

  3. v0.3

    업데이트 6: 같이 내려가기

    2026.10.17

    폐광산에서 곡괭이가 단단한 암반에 튕겨 나오는 장면
    "너무 단단해서 곡괭이가 튕겨 나온다." 한 방향으로만 캐는 자동 채굴을 막으려고 못 캐는 암반을 흩어 놓았어요.

    시도

    실시간 파티 · 같이 던전 · 친구 코드를 넣고, 원정 규칙(바이옴 · 보스층 · 사망 손실 · 보험 · 연습 · 랭킹 시즌 2)과 경제(제련소 · 괴 가격)를 다시 짰어요. 화면은 1080 해상도와 설정 창을 새로 만들고, 운영자 페이지 1단계를 열었어요.

    부딪힌 문제

    • 글자 크기를 3단계로 고를 수 있게 했더니 마을 창 · 입력창 곳곳에서 글이 넘치고 겹쳤어요. 크기 계산 시험을 만들어 겹침을 하나씩 고치다가 → 결국 글자 크기 대신 "UI 크기"로 바꿔서, 창 전체를 창 카메라로 한꺼번에 키우고 줄였어요. 긴 설명은 자르지 않고 휠로 넘겨 봐요. (v0.3.1)
    • 폐광산에서 한 방향으로 계속 캐기만 하는 자동 채굴이 가능했어요. → 위 갱도에 못 캐는 암반을 한 칸씩 흩어 놓았어요. 매크로 판정은 캐기 키를 누르고 뗄 때만 보게 고쳐서 오판정을 줄였어요.
    • 경제 숫자도 다시 맞췄어요. → 광물 수입을 1/3로 줄이고, 사망 손실은 1층 75%에서 층마다 낮아져 21층부터 50%가 되게 했어요. 판매가가 바뀐 몫은 처음 켤 때 한 번 보상했어요.
    • 저장 시험이 될 때도 있고 안 될 때도 있었어요. 서버 시작 기록이 시험 도구의 출력에 끼어들고 있었어요.

    아쉬운 점

    파티를 넣자 렉이 생겼는데, 어디서 느려지는지 잴 도구가 없었어요. 숫자를 바꿔도 실제로 어떻게 플레이되는지 볼 기록도 없었어요.

    그래서 v0.4는 재는 것부터 시작했어요. 플레이 기록, 렉 측정, 그리고 규칙 번호.

  4. v0.4

    재고, 기록하고, 되돌리기

    2026.10.17 ~ 10.19 · v0.4.0 ~ v0.4.11

    폐광산 깊은 갱도 입구
    깊은 갱도. 이곳의 광맥 숫자를 하루 사이에 네 번 바꿨어요.

    시도

    플레이 기록을 서버에 90일 남기고 운영자 페이지에 유저별 기록 · 통계를 붙였어요. 파티 렉 측정 화면(틱 · 빛 계산 · 입력 도착 지연)을 만들고, 결과가 달라지는 수정마다 던전 규칙 번호(gen)를 올리기 시작했어요. 숨은 방 · 빈 공간, 엠블럼 · 칭호, 쉬운 모드, 소환 확률 공개, 폐광산 좀벌레가 이때 들어갔어요.

    부딪힌 문제

    • 파티 렉: 동료 랜턴의 빛줄기 계산이 무거웠어요. → 빛줄기 120개를 40개로 줄이고, 안 움직이면 지난 결과를 다시 써요. 입력 지연은 판 도중 6~12틱 사이에서 자동으로 맞춰요.
    • 기록 검증이 파티 중계와 같은 줄에서 돌아서 검증하는 동안 파티가 멈칫했어요. → 검증을 따로 작업자 스레드로 떼어 냈어요. (v0.4.11)
    • 서버 설정 때문에 60분마다 웹소켓이 끊겼어요. → 판 도중 끊기면 9초 동안 자리를 잡아 두고, 다시 붙으면 같은 방 · 같은 틱에서 이어 가요.
    • 폐광산 깊은 갱도 광맥을 10% → 5% → 다시 10%로 바꿨다가, 결국 v0.4.1 방식으로 되돌리고 광맥 수만 36개에서 200개로 늘렸어요. 하루 사이에 네 번 바꿨어요.
    • 무너지는 바닥이 길을 끊고(gen 5), 던전 소품이 길을 막았어요(gen 6). 둘 다 생성 단계에서 길을 검사하게 고쳤어요.
    • 좀벌레를 공격 키로 톡 쳐서는 잘 안 맞았어요. → 한 번 휘두르면 끝까지 휘둘러 맞게 하고, 닿는 거리 · 휘두르는 각도 · 물린 뒤 멈춤을 두 번 다시 맞췄어요.
    • 랜턴 기름은 한 판 1병 · 하루 3병 한도, 1~3층 초반 사망 환급, 자동 충전 20분 · 2병 → 30분 · 5병으로 계속 손봤어요.

    아쉬운 점

    숫자를 바꾸고, 출시하고, 해 보고, 되돌리는 일이 반복됐어요.

    그래서 v0.5는 몬스터 · 보스 · 유물을 그 자리에서 바꿔 가며 시험하는 개발자 실험실부터 만들었어요.

  5. v0.5

    실험실, 그리고 용광로

    2026.10.19 · v0.5.0 ~ v0.5.4

    멈추지 않는 용광로의 새 그림들: 화구 · 경고등 · 쇳물 · 증기
    손질한 두 번째 보스, 멈추지 않는 용광로. 체력 36 · 열림당 3타.
    업적 엠블럼 크기 비교, 고치기 전과 후
    업적 엠블럼 크기를 다시 맞출 때 쓴 비교 그림 (v0.5.2)

    시도

    개발자 실험실에서 몬스터를 불러내고, 보스 페이즈를 고르고, 무적을 켜고, 유물을 바로 붙여 볼 수 있게 했어요. 유물 30종이 실제로 발동하는지는 자동으로 검사해요. 업적 점수 5단계와 고유 엠블럼, 스팀 빌드 준비, 경고 · 정지 화면이 들어갔어요. 두 번째 보스 "멈추지 않는 용광로"를 손질했어요. 체력은 50타에서 36타로, 화구가 열려도 3타까지만.

    부딪힌 문제

    • 용광로를 두 번째로 만나면 게임이 멈췄어요. 이미 지운 그림을 다시 쓰려고 해서였어요. → 한 시간 안에 v0.5.3으로 고쳤어요.
    • 냉각 밸브 예고가 다 차도 피해가 없었어요. → 다 차면 증기가 터져 1 피해를 줘요.
    • 과열 때 쇳물을 묶음으로 떨어뜨렸다가, 12개 연속 · 노리는 순서 · 고리 무작위로 다시 짰어요. (v0.5.4, gen 9)
    • 블록 깨지는 효과를 넣자 같은 종류의 다른 블록이 쪼그라들었어요. 폐광산 어둠에는 영웅을 따라다니는 가는 세로선이 생겼어요. → 어둠을 한 장으로 칠하고 빛 모양만 지우는 방식으로 바꿨어요.
    • 빌드할 때마다 충돌 데이터를 새로 만들었는데, 컴퓨터마다 결과가 달라 봇 길목이 막히고 건물 판정이 틀린 적이 있었어요. → 빌드는 저장소에 있는 값을 그대로 쓰고, 다시 만들기는 따로 명령으로 해요.

    아쉬운 점

    판정이 여전히 동그라미와 네모 어림이라, 보이는 곳을 쳐도 안 맞거나 예고 장판 밖에서 맞는 일이 있었어요.

    그래서 v0.6은 판정을 그림 모양 그대로 바꾸기로 했어요.

  6. v0.6.0

    그림대로 맞는다, 그리고 너무 어려워졌다

    2026.10.20 ~ 10.21

    판정을 그림 모양 그대로: 초록은 맞는 곳, 주황은 때리는 곳
    그림 모양 그대로의 판정. 초록은 맞는 곳, 주황은 때리는 곳이에요.
    같은 버전에서 마을 건물 충돌도 다시 만들었어요. 3D 모델을 높이별로 잘라 픽셀마다 앞뒤 순서를 정하는 과정 (5초).

    시도

    몬스터 · 보스 · 주인공 · 임팩트 그림에서 맞는 판과 때리는 판의 초안을 자동으로 뽑고, 손으로 칠한 것과 합쳐 게임 규칙에 넣었어요(gen 9). 예고가 있는 공격은 판을 예고 범위 안으로 잘랐어요. 사람처럼 보고 반응하고 실수하는 봇으로 1~25층을 원정시키는 도구도 만들었어요.

    부딪힌 문제

    • 같은 봇으로 손맛을 비교해 보니, 몬스터를 잡는 시간이 2~10배로 늘었어요. 1 · 2바이옴 일반 몬스터 18종 중 9종을 60초 안에 못 잡았고, 보스 셋은 4분 안에 못 이겼어요.
    • 원인은 주인공의 베기 판이었어요. 칼 그림만 따서 만든 판이라, 코드에서는 반지름 30px이던 닿는 거리가 15px 정도로 줄었고 정면(아래쪽)은 거의 닿지 않았어요. → 주인공 베기 판만 채택에서 빼고 예전 반원을 그대로 썼어요.
    • 기절 · 달라붙기 · 땅속처럼 닿아도 안 되는 상태에서도, 연출 그림 판이 겹치면 맞았어요. → 판은 모양만 정하고, 피해를 줄지는 늘 코드 규칙이 정하게 나눴어요.

    아쉬운 점

    두 번째 보스 용광로의 과열 공격이 정말 피할 수 있는 공격인지는 아직 아무도 재 보지 않았어요.

    그래서 v0.6.1은 용광로가 공정한지부터 쟀어요.

  7. v0.6.1

    봇으로 보스를 공정하게

    2026.10.22 ~ 10.23

    용광로 화구 열림 예고 장판, 고치기 전과 후
    같은 때 예고 장판도 매끈한 원에서 도트 데칼로 바꿨어요 (왼쪽 전, 오른쪽 후).

    시도

    쇳물이 떨어질 때마다 그 순간의 게임을 복제해서, 걷기와 구르기로 피해 없이 설 자리가 있는지 계산했어요. gen 9에서는 3,000번 중 26번이 피할 길이 없었어요. 쇳물 수를 줄이고 간격을 늘리고 동시에 뜨는 예고를 줄인 gen 10에서는 2,500번 중 0번이 됐어요.

    부딪힌 문제

    • 봇이 못 깨는 이유 1위는 화구가 열려도 0~1타로 끝나는 것(59%)이었어요. 마지막 밸브에서 화구까지 가는 데만 2.6~3.8초가 걸려서 4초 열림 중 1초쯤만 남았어요. → 열림을 5.5초로 늘리자 0~1타 열림이 32%에서 9%로 줄고, 회복약 없이 20판 중 2판을 깼어요.
    • 그러자 다음 병목은 증기였어요(20판 중 16판이 증기로 사망). → 증기 예고를 1.4초로 고정하고 밸브 자리를 다시 정했어요.
    • 화구 그림이 몸보다 커서 테두리와 경고등을 덮었어요. 이어서 용광로 그림을 새로 그리면서 판정도 새 그림에 맞게 다시 뽑았어요. 옛 기록은 옛 판 그대로예요.
    • 리플레이를 멈추거나 구간을 옮기면 음악 · 반복 소리 · 보스 페이즈가 어긋났어요. → 보기 전용 시계를 따로 두고, 곡은 진행 위치에서 이어 틀어요.

    아쉬운 점

    랜턴 기름은 v0.4부터 하루 한도 · 초반 사망 환급 · 충전 시간 변경으로 계속 덧대어져 있었어요.

    그리고 v0.6.2에서는 랜턴 기름을 아예 없앴어요.

  8. v0.6.2

    랜턴 기름 폐지

    2026.10.24 ~ 지금 · v0.6.2 ~ v0.6.3지금

    "기름이 있어서 역청이 단단하다" 말풍선이 뜬 폐광산
    "기름이 있어서 역청이 단단하다." v0.6.2에서 기름과 함께 없앤 규칙이에요.

    시도

    기름 재화, 자동 충전, 견습 원정, 하루 한도, 환급을 모두 걷어 냈어요(gen 11). 기름 샘은 보물 상자를 주는 "검은 샘"이 되고, 역청은 폐광산 광석 등급표에 합쳤어요. 그래도 gen 10 이하의 옛 리플레이는 옛 규칙 그대로 재생돼요. 확인용 세계 60개의 결과가 바꾸기 전과 똑같았어요. GitHub 아이디 이전에 맞춰 배포 주소도 옮기고, 리플레이는 한 판에 한 부만 저장해서 중복을 정리했어요.

다른 시행착오