openjutsu
One-click character swap for videos: an open-source, local Higgsfield Genjutsu alternative built on ComfyUI and MiniMax H3, with FLUX.3 Klein relighting.
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.
MediaPython · AssemblyGitHub @kassouletOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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.