openjutsu
영상에서 원클릭으로 인물 교체, ComfyUI·MiniMax H3 기반 오픈소스 로컬 힉스필드 겐주츠 대안, FLUX.3 Klein 재조명 지원
1998년 Pulse의 DOS 데모 ‘Tour’를 JavaScript로 이식, 실행 파일 역공학 및 엔진·x86 트릭 해설 포함
A JavaScript port of 'Tour', the 1998 DOS demo by Pulse (3rd at Assembly 98), reverse-engineered from its executable, with notes on the engine and the cleverest x86 tricks of the original code.
미디어Python · AssemblyGitHub @kassoulet온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A study port of "Tour" (Pulse / Pygmy Projects / Virtual Dreams, Assembly '98, 3rd place with 752 points), a DOS demo,
re-implemented in plain JavaScript for the browser and Node 22, with the reverse-engineering notes, tools and write-up.
It is the predecessor of the engine of 73 million seconds (see the sister project 73-Million-Seconds-by-Pulse).
Site (GitHub Pages): docs/ — player (demo.html), engine notes (index.html), the best asm tricks (writeup.html).
script.unr drives the demo (buffers + events run every frame in creation order, timed by the XM module position).
Effects: basic2d (palette, doubleimage, blend, fade, mapimage, blit), feedback (echo5, reebok), cellrd (Gray-Scott reaction-diffusion),
scene3d (software 3D: .exp/.lwe scenes, unrdisp, bomb, displace247), volumes (metaballs, plasma, marching cubes). 3D, 2D, volume and feedback effects were
verified against the original executable running in a CPU emulator (most of them bit-exact, see re/*.md).re/golden.py) and its frames are compared with the port's (tools/replay.mjs, tools/cmp-all.py):
mean error 1.2 / 255 per channel, 93.6 % of pixels within 8 levels over the 152 s of the demo (the JPEG decoder of the original differs from the browser's: that alone is a ~1 level floor).re/unpack_pmodew.py runs the PMODE/W loader (real mode → protected mode) in Unicorn to unpack TOUR.EXE; re/boot.py boots the unpacked original to its main loop;
re/harness.py calls any original function with custom buffers; tools/extract.py decodes TOUR.98 (dlz LZ, byte RLE, adaptive-Huffman LZ, BWT+MTF+Huffman).docs/ GitHub Pages site: index.html, demo.html, writeup.html, js/ (core, engine, assets, archive, fx/*), notes/*.html, assets/
re/ reverse-engineering notes (*.md), unpacker, emulator core (emucore.py), harness, golden-frame runner, differential tests (dt_*/)
tools/ extractor, renderers, comparison and test scripts
ENGINE.md the port's engine contract (was the brief for the parallel work)
TOUR.EXE TOUR.98 original demo files (unmodified)
cd docs && python3 -m http.server # http://localhost:8000/
python3 tools/mkraw.py # once (Pillow): build/raw for the node renderer
node tools/render.mjs 75 out.ppm # render the port at t = 75 s
node tools/test-engine.mjs; node tools/test-volumes.mjs; node tools/test-basic2d.mjs # self-checks
Reference (needs pip install unicorn capstone pillow numpy):
cd re && python3 boot.py # ~40 s, makes state.bin
python3 golden.py 0 153 0.033333 golden/full # the original's frames (EVERY=15 to keep one in 15; ~25 min)
cd .. && node tools/replay.mjs re/golden/full /tmp/replay && python3 tools/cmp-all.py re/golden/full /tmp/replay
Music clock: the player follows libopenmpt, so docs/assets/xm_times.json (made by tools/openmpt_times.py) gives the exact start time of every (order,row).
Demo, music and assets © Pulse, Pygmy Projects, Virtual Dreams (1998): camel, silver eagle, unreal, fndr, visualize, falcon. Music played with chiptune3 / libopenmpt. This port and the notes are non-commercial, for study.