TL;DR

  • Halo: Combat Evolved의 Xbox 빌드 디컴파일을 바탕으로 Linux·Windows·Android 포트를 제공하며, 세 플랫폼에서 함께하는 최대 128명의 멀티플레이어를 지원함.
  • 포트는 bnunu/halo-1의 디컴파일을 기반으로 하며, 해당 프로젝트는 punpckhdq/halo의 포크임.
  • GitHub Actions가 커밋마다 빌드를 생성하고, 메인 브랜치에서 세 플랫폼 모두 통과한 빌드를 새 릴리스로 공개하며 최근 5개 릴리스를 보관함.
  • 게임 데이터는 포함되지 않으며, 사용자가 Xbox 디스크 이미지(.xiso 또는 .iso)를 지정하면 게임이 맵 파일을 추출함.
  • Xbox SDK 없이 Python과 ninja, 플랫폼별 도구를 사용해 빌드할 수 있으며, 릴리스·디버그 빌드와 최적화 설정을 제공함.

프로젝트 개요

  • 이 프로젝트는 Halo: Combat Evolved 디컴파일을 Linux, Windows, Android로 포팅한 것임.
  • 디컴파일 대상은 Xbox 빌드 2342(cachebeta.exe)이며, SHA-256은 4cc87b45f721270392a96f1674ed2b5cd4a7bb4355faeab4531d1cf1884d9520임.
  • 기반 프로젝트는 bnunu/halo-1이며, 이는 punpckhdq/halo의 포크임.

다운로드와 업데이트

  • GitHub Actions가 커밋마다 게임 빌드를 생성함. 최신 릴리스의 플랫폼별 빌드는 다음과 같음.
  • Linux: halo-linux-release.zip, halo-linux-debug.zip
  • Windows: halo-windows-release.zip, halo-windows-debug.zip
  • Android: halo-android-release.zip, halo-android-debug.zip
  • 플레이에는 릴리스 빌드를 사용함. 디버그 빌드는 첫 번째 어설션 실패에서 멈추고 로그에 내용을 기록하며, 문제를 찾고 보고할 때 사용함.
  • 게임은 시작할 때 새 릴리스를 확인하고 설치 여부를 물어보는 자체 업데이트 기능을 갖춤. 자세한 내용은 port/linux/README.md의 업데이트 항목에 있음.
  • 메인 브랜치에서 세 플랫폼 모두 통과한 각 빌드가 새 릴리스임. 릴리스 페이지에는 최근 5개 릴리스가 보관되며, 최신 빌드에 문제가 있으면 이전 빌드를 받을 수 있음.

게임 데이터

  • 포트에는 게임 데이터가 포함되지 않으므로 Halo: Combat Evolved의 Xbox 디스크 이미지(.xiso 또는 .iso)가 필요함. 게임의 모든 버전이 작동함.
  • 유럽(PAL) 버전의 맵은 더 느린 콘솔에 맞춰 제작됐으며, 포트는 두 버전 이용자가 함께 플레이할 수 있도록 PAL 맵을 북미(NTSC) 맵처럼 작동하게 변경함.
  • 게임을 처음 시작하면 디스크 이미지를 선택하라는 안내가 표시되고, 게임이 maps/ 폴더를 추출한 뒤 실행됨.
  • Linux와 Windows에서는 maps/가 실행 파일 옆에 생성됨. Android에서는 디스크 이미지를 휴대전화에 먼저 복사해야 하며, 앱이 자체 데이터 폴더에 maps/를 생성함. 자세한 내용은 port/android/README.md에 있음.

플랫폼

  • Linux: 32비트 x86 실행 파일, OpenGL 4.5, SDL3. 지침은 port/linux/README.md에 있음.
  • Windows: 32비트 x86 실행 파일, OpenGL 4.5, SDL3. 지침은 port/windows/README.md에 있음.
  • Android: arm64 앱, OpenGL ES 3, SDL3. 지침은 port/android/README.md에 있음.
  • Linux README에는 조작법, 설정, 멀티플레이어 기능도 안내돼 있으며, 이 기능은 플랫폼 간 거의 동일함.

멀티플레이어

  • 시스템 링크 게임을 로컬 네트워크와 인터넷에서 플레이할 수 있음.
  • 시스템 링크 게임은 최대 128대의 기기에서 128명까지 참여할 수 있음.
  • Linux, Windows, Android 기기가 한 게임에 함께 참여할 수 있음.
  • 초대 링크로 인터넷 게임에 참여할 수 있으며, 이 프로젝트의 서버는 필요하지 않음.
  • 새 네트워크 코드는 각 기기가 자신의 플레이어를 즉시 이동시키고 호스트가 게임의 결정을 내리는 방식임. 자세한 내용은 port/linux/NETCODE.md에 있음.

게임 빌드

  • Xbox SDK는 필요하지 않으며, 포트가 게임에서 사용하는 SDK 선언을 제공함. 관련 파일은 port/include/xdk에 있음.
  • 빌드 절차는 Python과 ninja 설치, 플랫폼별 도구 설치, 저장소 루트에서 python configure.py 실행, 플랫폼 대상 지정 빌드 순서임.
  • 플랫폼별 ninja 대상과 결과물은 다음과 같음.
  • ninja linux: build/linux/halo
  • Windows에서 ninja windows: build/windows/halo.exe 및 SDL3.dll
  • ninja android_apk: port/android/app/build/outputs/apk/debug/app-debug.apk
  • 대상을 지정하지 않고 ninja를 실행하면 현재 컴퓨터용 게임을 빌드함.
  • tools/ci_build.py는 GitHub Actions와 같은 빌드를 수행하며, 예를 들어 python tools/ci_build.py linux release를 실행함.

빌드 옵션

  • configure.py에 전달할 수 있는 옵션은 다음과 같음.
  • 옵션 없음: 디버그 빌드이며 어설션 실패 시 게임이 멈춤.
  • --release: 릴리스 빌드이며, 정식 게임과 마찬가지로 어설션을 검사하지 않음.
  • --portable: Linux와 Windows 빌드가 모든 x86-64 프로세서에서 작동하도록 함. 다른 사람에게 배포할 빌드에 사용함.
  • --lto=thin, --lto=off: 링크 시간 최적화를 줄여 링크 속도를 높임.
  • --pgo=off: 프로파일 기반 최적화를 사용하지 않음.
  • --pgo=train: 새 최적화 프로파일을 기록함. 자세한 내용은 최적화 프로파일 항목에 있음.
  • --portable을 지정하지 않으면 Linux와 Windows 빌드가 빌드에 사용한 프로세서의 명령어를 모두 사용함(-march=native). 이 빌드는 다른 컴퓨터에서 항상 시작되는 것은 아님.

최적화 프로파일

  • 빌드는 게임 프로파일을 사용해 코드를 최적화함.
  • Linux와 Android: pgo/halo_linux.profdata
  • Windows: pgo/halo_windows.profdata
  • 프로파일을 사용하려면 clang 22 이상이 필요하며, 이전 버전의 clang에서는 프로파일을 사용하지 않음.
  • 새 프로파일을 기록하려면 기존 프로파일을 삭제하고 python configure.py --pgo=train을 실행한 뒤 ninja linux 또는 ninja windows를 실행함.
  • 빌드는 메인 메뉴와 캠페인 각 레벨의 첫 1분을 실행하며, 절차는 약 15분 동안 진행됨. 게임 데이터가 assets/에 있어야 함.