HOLLOW CROWN 무료 데모Free demo

개발기Devlog

이 게임은 Claude Opus 5.5가 코드로 만들었습니다. 사람은 방향을 정하고, 플레이해 보고, 고칠 곳을 말했습니다. 그 과정에서 내린 결정들을 적어 둡니다.This game was written in code by Claude Opus 5.5. A person set the direction, played it, and said what to fix. These are the decisions along the way.

1. 왜 브라우저 RTS인가1. Why a browser RTS

RTS는 설치와 계정이 진입 장벽입니다. 링크 하나로 바로 한 판을 할 수 있으면 친구에게 권하기도 쉽습니다. 그래서 목표를 "탭 하나에서 도는, 제대로 된 RTS"로 잡았습니다. Three.js로 그리고, 게임 규칙은 브라우저와 서버가 똑같이 돌릴 수 있는 순수 TypeScript로 썼습니다.

Installs and accounts are what keep people away from RTS games. If one link starts a match, it is also easy to hand to a friend. So the goal was “a proper RTS in a single tab”. Rendering is Three.js; the game rules are plain TypeScript that the browser and the server can both run.

2. 결정론 시뮬레이션과 1:1 대전2. A deterministic simulation and 1v1

게임 세계는 초당 20번 정해진 간격으로 계산됩니다. 같은 시작 상태에 같은 명령을 넣으면 어떤 컴퓨터에서도 결과가 비트 단위까지 같습니다. 난수도 시드에서만 뽑고, 부동소수점 순서도 고정했습니다.

그래서 대전은 게임 상태가 아니라 명령만 주고받습니다(락스텝). 방마다 Cloudflare Durable Object 하나가 명령을 모아 두 사람에게 같은 순서로 나눠 주고, 40틱마다 양쪽 상태의 해시를 비교해 어긋남을 잡습니다. 같은 원리로 리플레이는 "시작 설정 + 명령 목록"뿐이라 몇 KB면 됩니다.

The world is stepped 20 times a second at a fixed rate. Given the same start and the same commands, every computer reaches a bit-identical result: randomness comes only from a seed and the order of floating-point work is fixed.

So versus play exchanges commands only (lockstep). Each room is one Cloudflare Durable Object that collects commands and hands them to both players in the same order, comparing a hash of both states every 40 ticks to catch any drift. By the same logic a replay is just “setup + command list”, a few kilobytes.

3. 코드로 만든 3D 모델3. 3D models built from code

유닛 13종과 건물 17종은 손으로 모델링하지 않았습니다. Claude가 Blender용 파이썬 스크립트를 쓰고, Blender를 화면 없이 실행해 모델과 애니메이션을 뽑았습니다. 벽·지붕·탑·뼈 같은 부품 모음을 만들어 조립하고, 한 칸을 1미터로 실제 크기에 맞춰 짓습니다.

재질 이름이 곧 규칙입니다. Name~0.5처럼 이름 끝에 숫자를 붙이면 그 세기로 빛나고, Team으로 시작하면 주인의 색을 받습니다. 모델을 고칠 때 게임 코드는 건드리지 않아도 됩니다.

None of the 13 units or 17 buildings were modelled by hand. Claude wrote Python scripts for Blender and ran Blender headless to export the models and their animation. A kit of parts (walls, roofs, towers, bones) is assembled at true scale, one cell to one metre.

Material names carry the rules: a name ending in ~0.5 glows at that strength, and one starting with Team takes its owner’s colour. Changing a model never touches game code.

4. 코드로 합성한 소리4. Sound synthesized in code

칼이 갑옷에 부딪히는 소리, 뼈가 부서지는 소리, 화살이 박히는 소리는 녹음이 아닙니다. 짧은 충격음, 몸통의 울림, 부서지는 잡음, 금속·뼈·나무의 공명을 층층이 합성해 게임이 시작될 때 버퍼로 만들어 둡니다. 작은 홀의 잔향과 리미터를 거쳐 큰 전투에서도 소리가 뭉개지지 않게 했습니다.

배경 음악도 코드로 생성되고, 전투가 격해질수록 태고와 금관이 올라옵니다. 영웅 목소리만 AI 음성 합성(TTS)으로 만들었습니다.

A blade on plate, bone cracking, a bolt striking home: none of them are recordings. Each is layered from a short transient, a body resonance, a crunch of noise and metal, bone or wood modes, rendered into buffers when the game starts. A small hall reverb and a limiter keep a big battle from turning into mush.

The music is generated in code too, with taiko and brass rising as a fight heats up. Only the hero voices come from AI text-to-speech.

5. 수백 명이 싸워도 부드럽게5. Hundreds of soldiers, still smooth

같은 유닛은 인스턴싱으로 한 번에 그리고, 뼈대 애니메이션은 미리 텍스처로 구워 GPU가 직접 읽게 했습니다. 안개(전장의 시야)도 작은 텍스처 하나로 처리합니다. 양쪽 175기씩 맞붙는 시험 장면도 탭 하나에서 돌아갑니다.

Each unit type is drawn in one instanced call, and skeletal animation is baked into textures the GPU reads directly. Fog of war is a single small texture. Even the 175-a-side stress scene runs in a single tab.

6. 플레이 데이터로 고친 것들6. What player data changed

익명 플레이 기록(클릭 위치, 로딩 시간, 오류, 피드백)을 모아 보고 바로 고쳤습니다.

  • 첫날 휴대폰 방문자 전원이 1분 안에 떠났습니다. 우클릭이 없는 터치에서 명령을 못 내렸기 때문입니다. 그래서 휴대폰에서는 먼저 "PC로 링크 보내기"를 권하고, 탭으로 명령하는 터치 조작을 넣었습니다. 바로 다음 날, 휴대폰으로 들어온 사람이 링크를 PC로 보내 21분을 플레이했습니다.
  • 한 플레이어가 일꾼 하나를 뽑으려고 같은 키를 246번 눌렀습니다. Shift를 누르면 다섯 명을 한 번에 예약하게 했습니다.
  • 전투 중에 띄운 피드백 요청은 한 번도 눌리지 않았습니다. 요청을 결과 화면과 물결 사이의 쉬는 시간으로 옮겼습니다.

Anonymous play data (click positions, loading time, errors, feedback) was read and acted on right away.

  • On day one every phone visitor left within a minute: with no right-click, touch could not give orders. Phones now first offer “send the link to my computer”, and a tap-to-command touch mode was added. The next day a phone visitor sent the link across and played for 21 minutes on a Mac.
  • One player pressed the same key 246 times to train workers one by one. Shift now queues five at once.
  • Feedback prompts shown mid-battle were never answered. They moved to the result screen and the pause between waves.

▶ 무료 데모 플레이▶ Play the free demo