
Open Scrantic은 1993년작 Windows 3.1 화면보호기 Johnny Castaway를 Rust로 다시 구현해 Windows, macOS, Linux에서 실행하는 오픈소스 프로젝트다. 프로그램은 무료지만 원본 화면보호기 파일은 직접 구해야 하며, 프로젝트에는 포함되지 않는다.
실행 방법과 필요한 파일
최신 릴리스에서 운영체제에 맞는 파일을 내려받는다.
| 시스템 | 파일 |
|---|---|
| Windows | open-scrantic-windows-x64.exe |
| macOS | open-scrantic-macos |
| Linux | open-scrantic-linux-x64 |
프로그램 파일을 원본 화면보호기 파일 세 개와 같은 폴더에 둔 뒤 실행한다. 기본적으로 창에서 열리며 Esc를 누르면 종료된다. 화면 전체로 실행하려면 --fullscreen 옵션을 사용한다.
필요한 원본 파일은 Windows 3.1용 Screen Antics: Johnny Castaway 설치본의 SCRANTIC.SCR, RESOURCE.MAP, RESOURCE.001이다. 파일의 크기와 용도는 다음과 같다.
| 파일 | 크기 | 용도 |
|---|---|---|
SCRANTIC.SCR | 295,952 | 원본 화면보호기 프로그램 |
RESOURCE.MAP | 1,461 | 화면보호기 리소스의 색인 |
RESOURCE.001 | 1,175,645 | 이미지와 애니메이션 스크립트 |
파일이 올바른 원본인지 확인하려면 SHA-256 해시를 비교한다.
| 파일 | SHA-256 |
|---|---|
SCRANTIC.SCR | 7811b526b36bba2f08326d7a680f2f063190b4278e5a36393fde5a02080b0262 |
RESOURCE.MAP | 3d9ec330aab96bbe5a44ce34f5945703862e82b195088590b7adfef5d7345da7 |
RESOURCE.001 | df9c2213f7c0abacf4e302cb53a476f9f220579c07ba350b167e351eed548eae |
macOS에서는 다음 명령으로 해시를 계산한다.
shasum -a 256 SCRANTIC.SCR RESOURCE.MAP RESOURCE.001
Linux에서는 sha256sum을 사용한다. Windows에서는 다음 명령을 파일마다 실행한다.
certutil -hashfile <file> SHA256
프로그램은 코드 서명이 되어 있지 않아 운영체제가 실행을 경고할 수 있다. Windows SmartScreen 경고 창에서는 ‘자세히’를 누른 뒤 ‘실행’을 선택한다. macOS에서는 폴더에서 터미널을 열고 다음 명령을 실행한 다음 프로그램을 연다.
chmod +x open-scrantic-macos && xattr -d com.apple.quarantine open-scrantic-macos
./open-scrantic-macos
Linux에서는 다음 명령으로 실행 권한을 부여하고 프로그램을 연다.
chmod +x open-scrantic-linux-x64
./open-scrantic-linux-x64
Linux에서 사운드 라이브러리가 없다는 오류가 나면 ALSA를 설치해야 한다. Debian과 Ubuntu에서는 패키지 이름이 libasound2다.
설정과 진행 상태
옵션과 이야기 진행 상태는 프로그램과 같은 폴더의 SCRANTIC.INI에 저장된다. 파일은 첫 실행 때 만들어지고 정상 종료할 때 다시 기록되므로, 편집하려면 프로그램을 먼저 종료해야 한다. 키 이름은 대소문자를 구분하지 않는다. 옵션 값은 0이 끔, 1이 켬이며 기본값은 모두 1이다.
| 키 | 끈 경우의 효과 |
|---|---|
Background | 섬과 바다 배경을 표시하지 않는다 |
Clouds | 하늘의 구름을 표시하지 않는다 |
Waves | 해안의 파도와 바다의 흰 물결을 표시하지 않는다 |
Sounds | 효과음을 음소거한다 |
처음부터 다시 시작하려면 SCRANTIC.INI를 삭제한다. 파일에 유효하지 않은 값이 들어 있으면 이야기 진행 상태를 포함해 기본값으로 바뀐다.
고급 설정인 이야기 상태는 프로그램이 관리한다. 특정 장이나 시간을 강제로 지정하려는 경우에만 직접 편집한다.
| 키 | 기본값 | 의미 |
|---|---|---|
NumDays | 0 | 하루의 이야기 장을 나타내며 범위는 1~11이다. 달력 날짜가 하루 바뀔 때마다 진행한다 |
Introduction | 0 | 다음에 보여줄 장이다. 값이 NumDays 이하일 때 해당 장이 재생된다 |
CurrentYear, CurrentMonth, CurrentDay | 0 | 마지막 실행 날짜이며 새 날이 됐는지 확인하는 데 쓴다 |
StartTime | 900 | 낮과 밤으로 나뉜 16개 반시간 구간의 시작 시각이며 HHMM 형식이다 |
범위를 벗어난 NumDays 값, 즉 2보다 작거나 11보다 큰 값은 다음 날짜 변경 때 이야기를 1장부터 다시 시작하게 한다.
구현과 제약
Open Scrantic은 Screen Antics: Johnny Castaway(Sierra/Dynamix, 1993)를 역공학해 다시 구현한 프로젝트다. 원본 Windows 3.1 화면보호기의 디스어셈블 결과를 바탕으로 만들었으며, 프로그램에는 엔진 로직만 들어 있다. 이미지와 소리 등 원본 자료는 저작권자의 권리로 보호되므로 사용자가 직접 제공해야 한다. 프로젝트는 실행할 때 그 자료를 읽지만 포함하거나 배포하지 않는다.
화면보호기 실행 파일의 알려진 문자열을 검사하므로 모든 빌드와 호환되는 것은 아니다. 다른 빌드의 SCRANTIC.SCR은 로더가 거부한다. 원본 설정 대화상자는 다시 구현하지 않았으며, 옵션은 SCRANTIC.INI에서 설정한다. 진행 상태도 이 파일에 저장된다.
프로젝트는 엔진 동작을 원본 디스어셈블 결과에 맞췄으며, 여기에는 원래의 16비트 산술과 난수 생성기도 포함된다. 복원한 파일 형식, 가상 머신 의미, 이야기 규칙, 타이밍과 전체 프레임을 다시 그리는 방식 등 원본과 의도적으로 다른 점은 엔진 문서에 기록했다.
개발자가 밝힌 바에 따르면 개발 과정 전반에서 생성형 AI를 사용했다. Claude Code(Anthropic)와 모델에 역공학 도구를 제공하는 REA: Reverse Engineer Anything을 함께 사용해 원본 SCRANTIC.SCR을 디스어셈블·디컴파일하고, 리소스 형식과 스크립트 의미를 복원했으며 Rust 코드와 테스트, 문서를 작성했다. 개발자가 작업을 지휘하고 AI 보조 결과를 검토·통합했으며, 동작을 원본 화면보호기와 대조했다고 프로젝트는 설명한다.
소스 빌드와 개발
소스에서 빌드하려면 rust-toolchain.toml에 고정된 Rust 1.99.1이 필요하다. Linux에서는 ALSA 헤더와 pkg-config도 설치해야 한다. Debian과 Ubuntu에서 필요한 패키지는 libasound2-dev pkg-config다.
cargo build --release
cp /path/to/install/{SCRANTIC.SCR,RESOURCE.MAP,RESOURCE.001} target/release/
target/release/open-scrantic
화면보호기 파일과 SCRANTIC.INI는 항상 실행 파일이 있는 디렉터리에서 읽는다.
| 옵션 | 동작 |
|---|---|
--fullscreen | 창 모드 대신 전체 화면으로 실행한다 |
-V, --version | 버전을 출력하고 종료한다 |
-h, --help | 사용법을 출력하고 종료한다 |
릴리스 빌드는 최적화와 이식성을 고려해 설정한다. fat LTO, 단일 코드 생성 단위, panic = "abort", 심볼 제거를 사용한다. 빌드한 컴퓨터에 맞춘 바이너리를 만들 수도 있지만, 이 바이너리는 오래된 CPU에서 실행되지 않을 수 있다.
RUSTFLAGS="-C target-cpu=native" cargo build --release
개발 중에는 세션 계획을 출력하도록 다음과 같이 실행할 수 있다.
OPEN_SCRANTIC_DEBUG=1 target/release/open-scrantic # prints each session's plan
cargo run --release --example snapshot -- /path/to/install /tmp/out 2000 100 1000 42 # headless PNG render
전체 데이터 흐름과 프레임 생성 방식은 아키텍처 문서에 설명돼 있다. 코드 구성은 다음과 같다.
src/assets/는 Dynamix 리소스 아카이브(RLE/LZW, BMP, SCR, PAL, TTM, ADS)와 NE 실행 파일(소리WAVESFXn및 데이터 세그먼트 테이블)을 읽는다.src/engine/은 TTM 가상 머신(ttm.rs), ADS 가상 머신과 장면 스케줄러(ads.rs), 섬과 주변 애니메이션(island.rs), 걷기 동작(walk.rs), 이야기 계획(mod.rs), 원본 난수 생성기(rng.rs), 그리기 기능(gfx.rs), INI 설정(config.rs)을 담당한다.src/main.rs는 창(winit과softbuffer), 시계와 입력을 처리하고src/audio.rs는 소리(rodio)를 처리한다.
전체 아키텍처 설명과 작업 규칙은 AGENTS.md에서 확인할 수 있다.
변경 사항을 보내기 전에 다음 명령을 실행해야 한다. Cargo.toml에서 경고를 오류로 처리하도록 설정했기 때문이다.
cargo clippy --all-targets
cargo fmt --check
OPEN_SCRANTIC_DATA=/path/to/install cargo test
커밋은 Conventional Commits 형식을 따른다. 화면보호기 자료를 커밋해서는 안 된다. 원본 로직을 더 이식할 때는 기존 코드처럼 주석에 원본 주소(seg10:1acb, DS:1756)를 적는다.
CI는 모든 풀 리퀘스트와 main 푸시에서 포맷, Clippy, Linux·macOS·Windows 릴리스 빌드를 검사한다. 릴리스는 Actions 탭의 Release 워크플로에서 수동으로 만든다. 이 과정은 마지막 태그 이후 Conventional Commits를 바탕으로 다음 버전을 정하고(git-cliff), 세 운영체제용 바이너리를 빌드해 VirusTotal로 검사한다. 이어 CHANGELOG.md를 갱신해 커밋하고 버전 태그를 만든 뒤, 바이너리와 SHA-256 체크섬을 GitHub 릴리스에 게시한다. 마지막 태그 이후 feat, fix, perf, refactor, docs에 해당하는 커밋이 없으면 릴리스를 게시하지 않는다.
라이선스와 법적 고지
소스 코드는 MIT License로 제공된다. Screen Antics: Johnny Castaway는 각 권리자(Sierra/Dynamix)의 상표이자 저작물이다. Open Scrantic은 이들과 제휴하거나 이들의 승인을 받은 프로젝트가 아닌 독립적인 비상업적 상호운용 프로젝트이며, 원본 화면보호기 자료를 포함하거나 배포하지 않는다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요