50P by namyunwoo | ★ favorite | 댓글 24개

포가튼 사가 (1997 한국 DOS RPG) 를 소스포팅 하기

동기

  • 30년 전, 초등학교 때 처음 산 패키지 게임이 포가튼 사가
  • 인생 첫 RPG, 자연스럽게 깊이 빠짐
  • 20년 넘게 잊고 살다가 아직도 사람들이 많이 플레이하고 있다는 사실 알게 됨
  • "이걸 멀티 플랫폼 게임으로 만들 수 없을까?"
  • 남아 있는 건 1997 PE32 실행파일 + 데이터 파일 뿐 (당연히 소스코드는 없음)

접근 방식

  • 원본 게임 재현 방법은 크게 두 가지
    • 스펙 기반 재해석 — 게임플레이 보고 비슷하게 다시 만들기
    • 원본 함수 단위 충실 복원 — 디컴파일된 코드를 그대로 포팅
  • 후자를 선택. 추측이 아닌 검증된 원본 동작을 따르기 위함
  • 원본은 1997 Windows MSVC

분석한 내용

원본 binary 디컴파일

  • Ghidra 12 로 PE32 처리. 937 함수 100% 디컴파일 성공
  • 51,799 줄의 pseudocode C

데이터 포맷 크래킹 (48 종, 모두 검증)

  • LZSS — 표준 + FAM 변형 (ring init 0x00, ref_offset 비트 배치 다름)
  • SPB — 256색 + RLE, 1,155 이미지
  • MOB — 캐릭터/NPC 애니메이션 2,699 프레임. 0xA4 header + RLE pixel + frame stride 20B
  • SCP — 바이트코드 VM, 128+ opcode, 6,026 entry, 43,036 대화문
  • FAM — 292개 맵, 5 layer (base / overlay / collision / ...)
  • DAT — CHAR / ITEM 290 종 / MAGIC / ABILITY / MONSTER
  • SAV — actor struct 0x2A4 (676B), party + inventory + global vars

사용자 입력 직접 검증

  • 세이브파일을 직접 파싱해 actor struct offset 검증
  • 이전 잘못된 매핑 (0x3C ATK→STR, 0x40 INT→TLT 등) 정정

만들어낸 내용

  • Lua 263 파일, 157,277 줄
  • 에셋 3,760 개
  • LÖVE 2D 11.5 데스크톱 빌드 + love.js (emscripten) 웹 빌드
  • 모바일 가상 조이스틱 + 한국어 IME 직접 구현
  • SharedArrayBuffer 활성화 (COOP/COEP via coi-serviceworker)
  • IndexedDB sav 영속화 (브라우저 환경)
  • 배포 채널 5종 — Web / iOS / Android / Windows / macOS

재현 범위

  • 타이틀 / 캐릭터 생성 / 필드 / 대화 / 상점 / 인벤토리 / 장비 / 함정 / DETECT·UNLOCK / 세이브 — 완료
  • 전투 시스템 — 진행 중

AI 도구 활용

  • GPT 5.5 의 /goal 기능 위주, Claude Code 는 보조 + 실시간 디버그

GPT 5.5 /goal 역할 — 디컴파일 분석 / 정정 누적

  • 원본 함수 cluster / call graph / opcode reference 자동화 분석
  • 데이터 포맷 deep dive (sav format, actor offset, FAM 구조 등)
  • 초기 자동 디코드본의 mislabel 정정 누적 (51,799 줄 정정본)

Claude Code 역할 — Lua 포팅 + 즉시 검증 사이클

  • 원본 함수 read → Lua 포팅 → verify.sh test 실행 (100+ test mode, 1,000+ assertion)
  • 브라우저 환경 디버그 (IDBFS / IME / SharedArrayBuffer 등)
  • 사용자 보고 받으면 디버그 → fix → dev 배포 → 검증 → live 배포 사이클

작업 기간

  • 약 1~3 개월

어떤 결과물인지

  • Play (브라우저): https://forgottensaga-classic.blogspot.com/2026/05/…
  • PC / 모바일 모두 동작. 모바일은 가상 조이스틱 + 한국어 IME 자체 구현
  • 원본 게임플레이 충실 재현 — Z 정렬, 팔레트 사이클, NPC 상태머신, SCP VM 등 원본 동작 1:1

댓글과 토론

제가 중학생때 그 당시에 흔하지않았던 "예약구매"를 한 친구가 있었는데 포가튼사가가 출시일자를 계속 지키 못해 저에게 푸념을 늘어놓던 녀석이 생각나네요.ㅋㅋ

2년 정도? 밀렸더랬죠 ㅎㅎ

낭만 터지네요. 멋진 프로젝트 응원합니다!

감사합니다 낭만 찾기 쉽지않네용

이름 안넣으면 히로 에이미로 자동지정 되었는데 그건 안되네요.
버그투성이 게임이였는데 포팅하면서 버그까지 충실히 포팅하신건지 궁금합니다

심지어 더 버그가 많을겁니다.. 조금씩 개선해보겠습니다.

감사합니다💪🏻

저도 요즘 초등학교 시절 재밌게 했던 고전게임을 웹을오 포팅하고 싶었는데 이런 글이 올라오네요. 동기나 분석한 내용에 대한 글을 어디서 가져와서 GeekNews에 뜨는지 궁금하네요

ㅎㅎ 제가 올렸으니까요

❤️고맙습니다

이름 잘못넣었는데 어떻게 지울 수 있나요? Esc 가상 버튼 안먹히고 키보드 백스페이스도 안먹혀서요. 두근두근 하네요

감사합니다 ㅜ
백스페이스 안먹는 버그를 해결 했습니다만. 전체 화면에서 esc 누르면 전체화면이 종료되버리는 문제는 아직 해결중입니다..

훌륭하십니다!

ㅎㅎ 작은 팬심입니다..

대단하십니다!

과찬이십니다 ㅎㅎ 😂

와 진짜 대단합니다.

감사해요~~👍🏻👍🏻

와 진짜 개쩐더

감사합니다 차근차근 완성도 올려볼께요

감사합니다. 감사합니다. 응원합니다.

응원해주셔서 고마워요!