자바스크립트로 PS2 게임을 만들 수 있다
(jslegenddev.substack.com)- AthenaEnv라는 오픈소스 환경을 통해 PlayStation 2에서 자바스크립트 코드 실행이 가능해짐
- 이 환경은 QuickJS 엔진을 내장해 자바스크립트를 해석하고, 렌더링·입력·사운드·파일 처리 등 게임 개발용 API를 제공
- 개발자는 main.js, athena.ini, athena.elf 등 기본 파일 구조만으로 게임을 작성하고, PCSX2 에뮬레이터에서 실행 가능
- 완성된 프로젝트는 .iso 파일로 패키징해 단일 파일 형태로 배포할 수 있으며, 이를 위해 zip→iso 변환 절차가 소개됨
- 레트로 콘솔 개발과 웹 기술의 결합을 보여주는 사례로, 자바스크립트 기반 게임 개발의 확장 가능성을 시사
AthenaEnv 프로젝트 개요
- AthenaEnv는 PS2용 자바스크립트 실행 환경으로, 전통적인 게임 엔진이 아닌 API 중심의 개발 환경 제공
- 내부적으로 QuickJS를 수정·내장해 자바스크립트 코드를 해석
- PS2 네이티브 프로그램(C로 작성)이 자바스크립트 코드를 실행하도록 구성
- 제공 API는 렌더링, 에셋 로딩, 입력 처리, 파일 입출력, 사운드 재생 등을 포함
- p5.js나 Raylib 수준의 추상화로, 충돌 감지나 씬 관리 등은 직접 구현 필요
PS2에서 자바스크립트 게임 실행 과정
- 실행에는 PCSX2 에뮬레이터가 사용되며, 설정에서 “Enable host filesystem” 옵션을 활성화해야 함
- 프로젝트 폴더에는 다음 파일이 포함됨
-
athena.elf: Athena 실행 파일 -
athena.ini: 진입점(main.js) 및 부트 로고 설정 등 구성 -
main.js,src/,assets/: 게임 코드 및 리소스
-
- 에뮬레이터에서
athena.elf를 실행하면 게임이 구동되며, 자바스크립트 코드 수정 후 리셋으로 즉시 반영 가능
.iso 파일 생성 절차
- 배포를 위해 프로젝트를 단일 ISO 이미지로 묶는 방법이 설명됨
- 필수 파일:
athena.elf,athena.ini,main.js,src/,ATHA_000.01,SYSTEM.CNF - 모든 파일을 선택해 zip으로 압축 후, mconverter.eu 사이트를 이용해 iso로 변환
- 변환 후에는 “Enable host filesystem” 설정 없이도 실행 가능
- 필수 파일:
- 변환 자동화를 위해 Python 기반 CLI 도구 GENISO(https://github.com/scottvr/GENISO)가 소개됨
- 외부 의존성 없이 zip을 iso로 변환 가능
Hello World 예제
- 기본 예제에서는 폰트와 이미지 로드, 게임 루프 구성, 스프라이트 애니메이션, 입력 처리, 텍스트 렌더링을 구현
-
Screen,Font,Image,Pads등 Athena 내장 모듈 사용 -
Screen.display()메서드로 프레임 단위 루프 실행 -
Pads.get(0)으로 컨트롤러 입력 감지 - 스프라이트의
startx,endx등 속성으로 프레임 단위 애니메이션 제어 -
font.print()로 FPS나 텍스트 출력
-
- 스프라이트 반전은 width에 음수값을 부여해 구현하며, 위치 보정을 위해 오프셋 계산 필요
3D 지원 및 향후 개발
- Athena는 2D와 3D 모두 지원하나, 3D 중심의 v4 버전이 개발 중
- 현재는 2D 중심 예제가 주를 이루며, 일부 3D 데모가 존재
- 공식 GitHub 저장소와 Discord 커뮤니티를 통해 코드와 지원 자료 제공
- Sonic Infinite Runner PS2 포트: https://github.com/DevWill-hub/Sonic-Infinite-Runner-PS2
- AthenaEnv: https://github.com/DanielSant0s/AthenaEnv
- Athena 템플릿: https://github.com/JSLegendDev/Athena-PS2-Template
결론
- AthenaEnv는 자바스크립트만으로 PS2 게임을 제작할 수 있는 혁신적 환경
- 웹 개발자도 레트로 콘솔용 게임 개발에 접근할 수 있게 하며,
자바스크립트 생태계의 확장성과 호환성을 보여주는 사례임
Hacker News 의견
-
Fabrice Bellard가 만든 프로젝트들이 정말 광범위한 영향력을 가지는 것 같음
QuickJS 덕분에 PS2 같은 오래된 시스템에서도 AthenaEnv를 통해 홈브류 부활이 가능해진 게 멋짐- 포토샵 실력이 거의 없어서 못 했지만, xkcd 2347 밈에 “Fabrice Bellard가 반쯤 잠든 상태에서 그냥 증명하려고 구현한 것”이라고 써넣고 싶었음
수많은 FOSS 프로젝트의 의존성 체인 어딘가에는 그의 코드가 들어 있음
- 포토샵 실력이 거의 없어서 못 했지만, xkcd 2347 밈에 “Fabrice Bellard가 반쯤 잠든 상태에서 그냥 증명하려고 구현한 것”이라고 써넣고 싶었음
-
글쓴이가 ZIP을 ISO로 변환하는 웹사이트 사용의 번거로움을 언급한 걸 보고, 외부 의존성 없는 크로스플랫폼 Python 스크립트를 직접 만들었음
ZIP2ISO.py에서 확인 가능함
ISO9660 스펙을 읽지 않고 Gemini3 Pro로 “vibe-coded”한 게 인상적이었음- mkisofs로도 같은 작업이 가능할 것 같음
-
AthenaEnv가 흥미로움. QuickJS를 JS 인터프리터로 쓰고 PS2의 네이티브 시스템 라이브러리를 감싸는 구조로 보임
현대 콘솔(Switch/2, PS5, Xbox)에서도 JS Canvas(WebGPU/WebGL) 게임을 배포할 수 있는 비슷한 프로젝트가 있을지 궁금함
콘솔 SDK는 NDA라 공개 정보가 거의 없고, 대부분의 게임은 Unreal이나 Unity를 사용함
PC나 모바일은 Electron이나 WebView로 쉽게 실행할 수 있어서 상대적으로 단순함- JS로 만든 게임 Cross Code가 콘솔로 포팅된 사례가 있음. 자세한 과정은 이 블로그 글에 정리되어 있음
- Nintendo 3DS와 Wii U SDK에는 웹 기술 기반의 Electron 유사 프레임워크가 있었지만 Switch에서는 중단된 것으로 기억함
Switch의 WebKit 브라우저 앱릿은 JIT이 비활성화되어 있어서 e-매뉴얼 같은 제한된 용도로만 쓰임
-
진짜 콘솔에서 실행하려면 ISO를 디스크로 구워야 하는지 궁금했음
- FreeDVDBoot와 결합하면 가능할 것 같음
- 메모리카드의 FreeMcBoot + USB 플래시 드라이브 조합이 인기 있는 방법임. 광학 드라이브 마모도 줄일 수 있음
- 디스크를 구워 실행하려면 콘솔 해킹이 필요하지만, USB로도 가능함. 단지 진짜 디스크 느낌을 위해 구워볼 수도 있음
- 물리 디스크 대신 광학 드라이브 모드를 쓰는 게 낫지 않겠냐는 의견도 있음
-
QuickJS를 이용한 비슷한 프로젝트로 Nintendo Switch용 nx.js가 있음
- 이 프로젝트는 현재 canvas2d만 지원하지만, 이론적으로 WebGPU나 WebGL 게임을 Switch로 변환하는 레이어를 만들 수 있을 것 같음
다만 v8/JIT 엔진에서 QuickJS로 바꾸면 성능 저하가 클 것임
- 이 프로젝트는 현재 canvas2d만 지원하지만, 이론적으로 WebGPU나 WebGL 게임을 Switch로 변환하는 레이어를 만들 수 있을 것 같음
-
이제 PS2조차 JavaScript의 손아귀에서 벗어날 수 없게 됨
-
AthenaEnv는 같은 개발자가 만든 Lua 기반 Enceladus의 후속 프로젝트임
게임뿐 아니라 홈브류 앱에도 많이 쓰이며, Enceladus에서는 RETROLauncher와 POPSLoader, Athena에서는 OSD-XMB 같은 예시가 있음 -
PS2용으로 웹 브라우저를 만들어 게임을 웹사이트로 여는 방식도 가능하지 않을까 생각함
- 하지만 Chrome의 최소 메모리 요구사항이 4GB라, PS2의 32MB RAM에 맞추려면 128분의 1로 축소해야 함
-
이런 걸 찾고 있었는데 정말 멋진 프로젝트라 고마움
-
사람들은 .gdscript나 Godot을 쓰지 않으려고 별짓을 다 함
- Godot을 좋아하지만 PS2에서는 실행이 불가능함
- 사실 Godot으로 빌드해서 PS2로 내보내는 건 단순한 일이 아님