4주간의 Astra 제한과 36시간의 /goal 끝에, 내 어린 시절 MMO를 브라우저에서 실행하다
Four weekly Astra limits and one 36-hour /goal later, my childhood MMO now runs in the browser
핵심 요약
Codex와 Astra를 활용해 17년 전 개발했던 MMO 게임을 브라우저 기반으로 성공적으로 재구축함.
- 게임 재구축 — 17년 전 개발한 MMO를 브라우저 환경으로 이식함
- Astra 활용 — /goal 기능을 통해 복잡한 시스템 연결을 이해시키고 재구축함
- 기술 스택 — TypeScript, Three.js, Linux, PostgreSQL을 사용하여 현대화함
- AI 동료 — AI 에이전트를 파티원으로 구현하여 전투와 퀘스트 조언을 제공함

17년 전, 내가 14살 때 'One Piece Online'이라는 Tales of Pirates 프리 서버를 운영했었음. 그때 그 게임을 진짜 좋아했는데, 바꾸고 싶거나 추가하고 싶은 건 존나 많은데 어떻게 만드는지 몰라서 손도 못 댔던 게 한두 개가 아니었거든.
Astra in Codex로 다시 이 작업을 시작하니까 기분이 참 묘하더라.
원래는 Windows Server 2003에서 돌아가는 C++ 기반이었고, 클라이언트도 윈도우 전용이었음. 지금은 원본 에셋이랑 핵심 메커니즘만 가져와서 기반으로 삼고, 내 입맛대로 설정이랑 게임 플레이를 싹 뜯어고치는 중임. 프로젝트 이름은 Corals라고 지었어.
여기까지 오느라 Astra 주간 사용 제한을 4주치나 꼴아박았는데, 사용량 초기화 덕분에 겨우겨우 버텼다.
제일 도움 됐던 건 /goal 명령어로 Astra한테 옛날 시스템들이 어떻게 맞물려 돌아가는지 파악할 시간을 준 거임. 메커니즘 하나를 다시 만들 때마다 클라이언트, 서버, 데이터베이스 사이의 연결 고리를 먼저 추적하게 시켰거든. 제일 길게 돌렸을 때는 36시간 동안 쉬지 않고 작업했음.
나한테 잘 먹혔던 방식은 각 목표마다 확실하게 확인할 수 있는 결과물을 정해주는 거였어. 시스템 재구축, 프로젝트 빌드, 브라우저 테스트, 로그 확인, 그리고 안 돌아가는 거 수정하기. 그냥 막연하게 "게임 현대화해줘"라고 하는 것보다 서버 재시작해도 캐릭터 데이터 유지되게 만드는 것처럼 구체적인 목표를 잡는 게 훨씬 효율적이더라.
그리고 프로젝트 규칙이랑 진행 상황 파일을 따로 만들어서 뭐가 바뀌었고, 뭐가 테스트 완료됐고, 뭐가 아직 박살 나 있는지 계속 기록했음. 그래야 다음 세션 때 끊긴 부분부터 바로 이어서 할 수 있으니까.
결과물은 이제 TypeScript/Three.js 브라우저 클라이언트, Linux 백엔드, PostgreSQL 조합으로 돌아감. 계정 생성, 캐릭터 저장, 게임 플레이까지 다 구현했지. 17년 만에 그 익숙한 장소들이 브라우저에서 돌아가는 걸 보니까 진짜 기분 묘하더라.
항해 시스템부터는 좀 본격적으로 뜯어고치기 시작했음. 원래 항해 시스템이 너무 단순해서 마음에 안 들었거든. 그래서 Open Ocean을 시작점으로 잡고 Astra랑 같이 물이랑 배 메커니즘을 싹 갈아엎었어. 앞으로도 이런 식으로 내가 어릴 때 게임하면서 아쉬웠던 부분들을 하나씩 채워 넣을 생각임.
뜻밖의 발견도 있었음. AI 동료랑 그룹 시스템 작업하다가 Astra가 XP 관련 문제를 추적했는데, 알고 보니 원본 C++ 코드 문제였더라. XP 분배 계산할 때 소수점을 정수로 처리하는 바람에 0.9가 0으로 날아가고 있었던 거임. 17년이 지나도 그 낡은 코드는 여전히 나한테 엿을 먹이더라고.
성능 최적화할 때도 테스트가 진짜 중요했음. 좋아 보인다고 적용했던 변경 사항들이 막상 측정해보면 아무 도움도 안 되는 경우가 많았거든. 포즈 캐시 하나는 오히려 오버헤드만 늘려서 바로 삭제했음. 에이전트가 자기가 한 변경 사항을 직접 검증하고, 아이디어가 실패하면 바로 보고하게 만든 게 작업 과정에서 진짜 꿀이었음.
그래도 내가 직접 게임을 계속 해봐야 했음. 테스트로는 비주얼 버그나 조작감 구린 거, 기술적으로는 돌아가는데 느낌이 좆같은 것들은 다 못 잡아내거든. 원본에서 뭘 살리고 뭘 버릴지 결정하는 건 결국 내 몫이었으니까.


