Spire Story를 만든 다음, 심심해서 주말에 게임을 하나 더 만들어 봤습니다. 메이플스토리 캐릭터를 가지고 하는 타워 디펜스, Last Seal(마지막 봉인)입니다.

Spire Story를 만들어 본 경험도 있고, 이번 게임은 단순한 타워 디펜스라 별 어려움 없이 금방 만들 수 있을 거라고 생각했습니다.

실제로 게임 시스템을 붙이는 작업은 빠르게 끝났습니다. 그런데 레벨 디자인, 그중에서도 난이도 조절이 예상보다 훨씬 어려웠습니다. 조금만 낮추면 너무 쉽게 플레이할 수 있고, 조금만 올리면 게임을 파악하기도 전에 게임 오버가 됐습니다. 다른 것들은 금방 만들었는데, 난이도를 조절하는 데만 꼬박 이틀쯤 쓴 것 같습니다.

(역시 쉬운 건 없나 봅니다...)

보랏빛 봉인과 방어탑, 주황버섯과 달팽이를 배경으로 한 Last Seal 로고
게임 시작 화면에 사용한 Last Seal 타이틀 이미지.

메이플 캐릭터로 마지막 봉인을 지키기

Last Seal은 중앙에 있는 검은 마법사의 봉인을 지키는 생존형 액션 타워 디펜스입니다. 몬스터는 사방에서 몰려오고, 플레이어는 영웅 한 명을 직접 움직이면서 타워를 배치합니다. 영웅이 쓰러지거나 봉인이 무너지기 전까지 최대한 오래 버티는 것이 목표입니다.

봉인을 중심으로 일곱 개의 타워를 배치하고 달팽이와 버섯 등 몰려오는 몬스터를 막는 Last Seal 전투 화면
Verse8 배포 버전을 직접 플레이하며 캡처한 전투 장면. 중앙의 봉인을 지키며 여러 직업의 타워를 배치합니다.

영웅은 WASD로 움직이며 사거리 안의 적을 자동으로 공격합니다. 숫자 1~5로 전사, 마법사, 궁수, 도적, 해적 중 타워의 직업을 고른 뒤 원하는 위치를 클릭하면 타워가 세워집니다. 영웅과 타워는 경험치를 얻어 성장하고, 전직하면서 외형과 공격 방식이 바뀝니다. 영웅은 레벨업 과정에서 제시되는 세 장의 퍽 카드 중 하나를 골라 능력을 강화할 수도 있습니다.

한 판이 끝나면 생존 시간과 처치 기록에 따라 보상을 받고, 상점에서 영구 강화를 구매합니다. 한 판 안에서 성장하는 요소와 다음 판에 남는 성장 요소를 함께 넣었습니다.

구현 시 LLM은 클로드를 활용했습니다. Phaser 3가 맵과 캐릭터, 전투를 처리하고 React가 HUD, 상점, 전직 창과 퍽 선택 창을 그리도록 했습니다. TypeScript와 Vite를 사용했고, 기록과 영구 강화 상태는 브라우저의 localStorage에 저장하도록 했습니다.

조금만 바꿔도 너무 쉽거나 너무 어려웠다

가장 오래 붙잡은 부분은 적의 세기와 플레이어의 성장 속도를 맞추는 일이었습니다. 타워를 세우고 적을 공격하게 만드는 것까지는 금방 됐는데, 직접 플레이해 보니 수치를 조금 바꾸는 것만으로도 한 판의 난이도가 크게 달라졌습니다.

너무 어려우면 어떤 타워를 놓고 어떻게 싸워야 하는지 알아볼 틈이 없었습니다. 그렇다고 난이도를 낮추면 쉽게 버틸 수 있었습니다. 게임을 익힐 시간은 주면서, 익숙해진 뒤에도 방어를 신경 써야 하는 정도를 찾는 데 시간이 걸렸습니다.

조절할 대상도 적의 체력 하나로 끝나지 않았습니다. 적을 잡으면 골드와 경험치를 얻고, 그 자원으로 타워를 더 세우거나 전직시킵니다. 적이 나오는 속도, 처치 보상, 타워 성장 속도가 한 판 안에서 서로 영향을 줍니다.

레벨 10에서 투지, 질풍, 튼튼한 베이스 중 하나를 선택하는 Last Seal 퍽 카드 화면
레벨 10에 도달했을 때 나온 퍽 선택 화면. 영웅의 공격력과 이동속도, 봉인의 체력 중 무엇을 강화할지 고릅니다. Verse8 플레이 화면에서 선택 창 부분을 잘랐습니다.

초반에는 타워를 추가로 세울 여유부터 조정했습니다. 5월 16일 변경 전후의 코드를 비교하면 다음과 같습니다. 현재 설정이 아니라 당시 조정한 값입니다.

항목변경 전변경 후변화
시작 골드200250+25%
달팽이 처치 보상812+50%
봉인 최대 체력100150+50%
자쿰 체력35,00025,000약 −28.6%
자쿰의 봉인 피해2010−50%

시작 골드와 처치 보상은 타워를 더 세울 여유를 늘리고, 봉인의 체력과 보스 피해는 방어가 뚫렸을 때 버틸 여지를 바꿉니다. 같은 난이도 완화라도 서로 다른 부분을 조정한 셈입니다. 이 값들은 16d209c 커밋과 바로 이전 코드를 대조해 수집했습니다.

후반 조정은 반대 방향만으로 설명되지 않았습니다. 5월 25일에는 타워의 레벨당 공격력 증가율을 5%에서 3.5%로 낮췄습니다. 같은 직업·전직 단계의 기본 공격력을 기준으로 계산하면, 레벨 30의 성장 배율이 2.45배에서 2.015배로 줄어듭니다. 치명타와 퍽 등을 제외한 배율 계산으로는 약 17.8% 감소입니다.

동시에 적 생성 간격도 바꿨습니다. 최소 간격은 400ms에서 150ms로 줄였지만, 그 간격까지 빨라지는 속도는 늦췄습니다. 글을 쓰면서 98a98eb 커밋 전후의 실제 생성 로직을 각각 실행해 보니, 초중반과 후반의 결과가 다르게 나왔습니다.

경과 시간 구간변경 전 생성 수변경 후 생성 수변화
3~4분101마리70마리약 −30.7%
5~6분150마리97마리약 −35.3%
7~8분155마리224마리약 +44.5%
9~10분150마리400마리약 +166.7%

이 표는 고정 난수 시드로 시작부터 10분까지 초당 60번 SpawnDirector.update()를 호출하고, 각 1분 구간에 나온 일반·정예 몬스터의 생성 명령을 센 결과입니다. 정해진 시각의 이벤트 생성은 포함하고 보스는 제외했습니다. 전투와 게임 오버는 실행하지 않았으므로 실제 이용자의 생존 기록이나 화면에 남아 있는 적의 수를 뜻하지는 않습니다. 시간은 일시정지를 제외한 한 판의 경과 시간을 기준으로 했습니다.

변경 후에는 5–6분 구간의 적이 줄었지만, 9–10분에는 약 2.67배가 생성됐습니다. 적이 가장 빠르게 나오는 시점도 약 4분 27초에서 8분 17초로 늦춰졌습니다. 초중반의 여유를 늘리면서 후반에는 더 많은 적이 몰려오게 바꾼 것입니다. 난이도를 높이거나 낮추는 것뿐 아니라, 어느 시점에 어려워질지도 조정해야 했습니다.

타워마다 선택할 이유도 필요했다

직업을 다섯 개 넣었다고 조합이 저절로 다양해지지는 않았습니다. 개발 중에는 해적 타워만 쌓는 선택을 줄이려고 직업별 역할도 다시 나눴습니다.

전사는 치명타와 기절, 마법사는 둔화와 지속 피해, 궁수는 관통과 긴 사거리, 도적은 체력이 얼마 남지 않은 적을 마무리하는 공격, 해적은 넉백을 중심으로 조정했습니다. 초반에 강했던 해적 타워의 사거리와 공격력도 낮췄습니다.

공격력만 비교하면 한 직업을 계속 배치하면 되지만, 적을 늦추거나 밀어내고 여러 마리를 관통하는 효과가 나뉘면 배치와 조합에서 고려할 것이 생깁니다. 난이도를 조절하는 동안 타워가 얼마나 강한지와 각 타워를 어디에 쓸지도 함께 손봤습니다.

다른 사람이 플레이하니 전직 흐름에서도 문제가 나왔다

5월 11일에는 첫 버전을 팀에 메이플 타워 디펜스라는 이름으로 공유했습니다. 동료들이 플레이하면서 전직할 시점을 놓쳤다는 이야기, 레벨 30 부근에서 성장이 멈춘 것처럼 보인다는 이야기, 전직 선택 화면이 불편하다는 이야기를 해줬습니다.

개발 중에는 영웅 전직에서도 비슷한 문제를 고쳤습니다. 레벨 30에 뜨는 2차 전직 창에서 ‘나중에 결정’을 누르면 다시 열 방법이 없었습니다. 전직 조건을 만족하고 아직 직업을 고르지 않았다면 HUD에 ‘2차 전직’ 버튼이 남도록 바꿨습니다. 레벨업으로 퍽 선택과 전직이 함께 발생할 때도 창을 겹쳐 띄우지 않고 차례대로 보여주도록 정리했습니다.

적이 강해서 진행하지 못하는 경우도 있지만, 성장할 수 있는데 그 방법을 놓치는 경우도 있었습니다. 전직 수치를 조절하는 일과 전직을 알아보고 선택하게 하는 일 모두 필요했습니다.

에셋 로딩과 게임 규칙도 다듬기

메이플 캐릭터의 몸, 의상, 무기와 동작별 프레임을 불러오는 과정도 정리했습니다. 초기에는 이미지를 CDN에서 개별적으로 가져왔는데, 작은 이미지들을 큰 이미지에 모으는 텍스처 아틀라스로 묶었습니다. 당시 약 1,200개의 개별 프레임 요청을 두 장의 아틀라스로 묶었고, 이후 에셋이 늘면서 여러 장으로 확장했습니다.

기존 텍스처 키를 유지하면서 아틀라스의 이미지 소스를 공유하도록 로더를 바꿨습니다. 이미지 수집과 캐시, 패킹, 누락 프레임 검사는 다른 프로젝트에서도 쓰도록 pack-atlas 스킬로 분리했습니다.

게임의 끝도 바뀌었습니다. 초기에는 자쿰을 처치하면 승리하는 구조였지만, 이후에는 보스가 반복해서 나타나는 무한 생존 방식으로 바꿨습니다. 그에 맞춰 승리 횟수와 최단 클리어 시간을 없애고, 봉인을 얼마나 오래 지켰는지 기록하도록 했습니다.

공개 페이지에 남은 숫자와 반응

공개 전까지 직접 플레이하며 버그를 점검했고, 2026년 6월 8일 Verse8 MSU Space가 열릴 때 Last Seal도 함께 공개했습니다.

글을 쓰며 확인한 Verse8 공개 페이지의 숫자는 다음과 같습니다. 2026년 9월 29일 13:35 GST(UTC+4) 기준입니다.

공개 지표표시값
플레이 카운터(▶)1,387
좋아요(Like)7개
댓글2개

지금도 Verse8에서 Last Seal을 플레이할 수 있습니다.