Porting my 1993 Amiga game to Godot, with an LLM reading the 68000 assembly
개요
1993년 작성된 Amiga 게임 "Babylonian Twins"의 68000 어셈블리 코드를 Claude Fable 5 LLM을 사용하여 Godot 엔진으로 포팅하는 과정을 상세히 기록한다.
주요 내용
- LLM을 활용한 Amiga 게임 포팅: 1993년 Amiga 500에서 68000 어셈블리로 작성된 게임 "Babylonian Twins"를 LLM(Claude Fable 5)의 도움을 받아 Godot 엔진으로 성공적으로 이식했다.
- 단계별 포팅 전략:
1. 안전한 요청: 2010년에 C++로 작성된 엔진을 Godot 4로 이전하는 작업을 수행했다.
2. 불공정한 요청: 원본 68000 어셈블리 코드를 Godot 4로 재구축했다.
3. 욕심나는 요청: 이식된 1993년 원본 게임을 현대적인 Godot 버전 내에서 두 번째 옵션으로 실행 가능하게 통합했다.
- LLM의 작업 방식: Claude Code 환경에서 LLM은 파일 편집, 어셈블러 실행, 게임 빌드, 실행 결과 분석 등 전 과정을 자동화했다. vasm을 사용하여 바이너리를 재구축하고 diff를 통해 원본과 일치하는지 확인했다.
- 원본 어셈블리 코드 분석:
* 도구 체인 재현: vasm을 사용하여 1993년 바이너리를 바이트 단위로 동일하게 재현했다.
* 어셈블러 차이점 극복: ASM-One과 vasm 간의 비호환성을 해결하기 위한 전처리 과정을 적용했다.
* 메모리 레이아웃 처리: org 명령어의 차이점과 메모리 스냅샷으로 인한 차이점을 분석하여 수정했다.
* 데이터 형식 복원: 레벨 데이터, 맵 셀 속성, 객체 테이블, 문 등 다양한 데이터 형식을 LLM이 코드를 분석하여 복원했다. 특히, 맵에는 없지만 런타임에 그려지는 문 데이터와 스카이 그라데이션, 스프라이트 시트의 모호성 등을 LLM이 정확하게 해석했다.
- 현대적인 엔진에서의 구현:
* C++ 엔진 이식: 34,000줄의 C++ 코드가 저녁 시간 내에 Godot 4로 성공적으로 이식되었으며, 플레이어의 움직임, 충돌, 물리, 카메라 등을 포함했다.
* 게임 플레이 일관성 유지: 2010년 iOS 빌드의 60 Hz 틱 레이트를 유지하여 가속도 곡선과 같은 게임플레이 요소를 원본과 동일하게 구현했다. Godot의 기본 CharacterBody2D 대신 원본의 커스텀 움직임 코드를 그대로 이식하여 느낌을 살렸다.
* 원본 게임 통합: 1993년 게임을 Godot 프로젝트 내에서 별도의 네임스페이스와 씬 호스트를 사용하여 게스트로 실행되도록 통합했다. Amiga 코드는 사용되지 않으며, 그래픽과 음악은 PNG, WAV, JSON으로 변환되고 행동은 GDScript로 재작성되었다.
- 발견된 오류 및 수정:
* 가드 버그: 원본에서는 특정 거리 내의 적만 공격했지만, 포팅 과정에서 거리 제한이 사라져 예상치 못한 공격이 발생하는 버그를 발견하고 수정했다.
* 숨겨진 아트워크: 문이 열리거나 벽이 무너질 때 드러나는 숨겨진 아트워크가 포팅 시 자동으로 노출되어 비밀 통로가 처음부터 드러나는 문제를 수정했다.
* 트램폴린 버그: 점프 버튼 입력 처리 방식의 차이로 인해 트램폴린 높이가 다르게 느껴지는 문제를 발견하고, 2010년 빌드의 TV-OS 호환성 워크어라운드를 재현하는 방식으로 해결했다.
* 출구 버그: 레벨 1의 출구 작동 방식에 대한 설명이 부족하여 플레이어가 게임을 완료하지 못하는 버그를 한 유저의 리뷰를 통해 발견하고 수정했다.
- 출시 및 배포:
* 원본 게임: itch.io에서 무료로 제공된다.
* Definitive Edition: iOS 및 Android에서 출시되었으며, Steam에서는 데모 버전이 제공되고 올 가을 정식 버전이 출시될 예정이다. Steam 버전에는 1993년 원본 게임이 포함되어 별도로 실행 가능하다.
* 출시 작업 자동화: LLM은 스크린샷, 미리보기 비디오, 스토어 텍스트, 아이콘 등을 생성하고 Steam, iOS, Android 스토어에 메타데이터를 업로드하는 과정을 자동화했다.
시사점
LLM의 코드 이해 및 복원 능력은 오래된 저수준 언어로 작성된 코드베이스를 현대 엔진으로 이식하는 복잡하고 시간이 많이 소요되는 작업을 혁신적으로 가속화할 수 있으며, 개발자가 핵심적인 의사결정과 미세 조정에 집중할 수 있도록 지원한다. 또한, 이러한 기술은 과거의 귀중한 게임 유산을 보존하고 새로운 세대에게 제공하는 데 중요한 역할을 할 수 있다.
댓글
GitHub Discussions