gd-real-sim is a parity-focused Geometry Dash simulator for replaying click tapes against real level data. It parses levelstrings/save data, simulates at 240 Hz, reports completion/death outcomes, optionally emits traces/logs, and includes a built-in visualizer for inspecting path + hitboxes.
- Simulates GD gameplay physics with a deterministic fixed-step loop.
- Supports click tapes from inline bits, text files, or
SP240BINrecordings. - Produces structured outcomes (
completed,died,timeout) with trace frames. - Provides a visualizer for trajectory, object hitboxes, scrubber, and input/velocity bars.
High-level status is tracked in support_matrix.json.
- Working today
- 240 Hz simulation loop.
- Core mode/portal/pad/orb/collision pipelines.
- End-trigger completion detection.
- One-player dual portal behavior.
- Visualizer with camera controls and hitbox overlays.
- Known limitations
- Many mechanics are still partial parity (mode edge-cases, slope nuances, trigger interactions).
- Platformer mode is unsupported.
- Force blocks are unsupported.
- Two-player split controls are unsupported.
- Trigger families that mutate level state (move/toggle/rotate/spawn/collision/etc.) are not fully simulated.
For exact per-mechanic state (supported / partial / unsupported / no_op), read support_matrix.json.
src/lib.rs: crate exports.src/main.rs: CLI, output/log wiring, and visualizer.src/sim/mod.rs: public simulation API + orchestration + tests.src/sim/: simulation internals (included bymod.rs):support_checks.rsmode_physics.rsportals.rspads.rsorbs.rsground_bounds.rscollision_resolution.rsgeometry_helpers.rs
examples/: utility examples and assets.bitstring/: click-capture tools that produceSP240BINfiles for--clicks-bin.tests/real_port_contract.rs: integration contract tests.support_matrix.json: mechanic support/limitations document.
From gd-real-sim/:
cargo fmt
cargo check
cargo test -qShow CLI help:
cargo run -- --helpbitstring/ contains two capture paths:
get_bitstring.cpp+get_bitstring.exe: process-attached capture fromGeometryDash.exe; starts when player X movement begins.get_bitstring.py: audio-triggered capture via speaker loopback (or manual countdown mode).requirements.txt: Python deps forget_bitstring.py.
Both output the same binary format: SP240BIN (used by --clicks-bin).
You're gonna need to use cheat engine or some other memory scanning tool to at least get the address of the player x coordinate. You can also use the .py that captures audio to start the click pattern tracking as well, but then you may (likely will) have to play around with --tick-offset for gd-real-sim to align the sim and the click pattern.
Build C++ capture tool (if you need to rebuild the exe):
cl /std:c++17 /EHsc /O2 ^
bitstring\get_bitstring.cpp DashBot-3.0\HAPIH.cpp ^
/Fe:bitstring\get_bitstring.exe ^
/I DashBot-3.0Record with the C++ capture tool (default 240 Hz, 60s):
bitstring\get_bitstring.exe examples\opti\opti_click_pattern.binRecord with custom duration/hz and trigger tuning:
bitstring\get_bitstring.exe examples\opti\opti_click_pattern.bin ^
--duration 90 ^
--hz 240 ^
--x-trigger-max 500 ^
--min-step 0.5 ^
--max-step 7.0Record with direct memory addresses (if pointer chain drifts):
bitstring\get_bitstring.exe examples\opti\opti_click_pattern.bin ^
--x-addr 0x1C3545D688C ^
--y-addr 0x1C328E5F3E0Python recorder setup:
pip install -r bitstring/requirements.txtPython recorder (audio-triggered):
python bitstring/get_bitstring.py --output examples/opti/opti_click_pattern.bin --duration 90Python recorder without audio trigger:
python bitstring/get_bitstring.py --output examples/opti/opti_click_pattern.bin --duration 90 --no-audio-triggerSimulate with a local level save + named level + click bin:
cargo run -- \
--save "/path/to/CCLocalLevels.dat" \
--level "My Level Name" \
--clicks-bin "/path/to/clicks.bin"List levels inside a save file:
cargo run -- --save "/path/to/CCLocalLevels.dat" --list-levelsSimulate with inline levelstring + inline click bits:
cargo run -- \
--levelstring "..." \
--clicks "001100101..."Write compressed trace JSON and per-tick text log:
cargo run -- \
--save "/path/to/CCLocalLevels.dat" \
--level "My Level Name" \
--clicks-bin "/path/to/clicks.bin" \
--trace-out "trace.json.gz" \
--tick-log-out "ticks.log"Visualize a level with click tape:
cargo run -- \
--save "/path/to/CCLocalLevels.dat" \
--level "My Level Name" \
--clicks-bin "/path/to/clicks.bin" \
--visualizeVisualize with tick offset (alias: --tick-offset) and log output:
cargo run -- \
--save "/path/to/CCLocalLevels.dat" \
--level "My Level Name" \
--clicks-bin "/path/to/clicks.bin" \
--start-tick-offset -10 \
--tick-log-out "ticks.log" \
--visualizeVisualize when the source click tape was captured at non-240 Hz:
cargo run -- \
--save "/path/to/CCLocalLevels.dat" \
--level "My Level Name" \
--clicks-bin "/path/to/clicks.bin" \
--clicks-bin-hz 60 \
--visualizeVisualize with max tick cap and unsupported-policy report mode:
cargo run -- \
--save "/path/to/CCLocalLevels.dat" \
--level "My Level Name" \
--clicks-bin "/path/to/clicks.bin" \
--max-ticks 12000 \
--unsupported-policy report \
--visualizeEnable visualizer with --visualize. Controls:
Left/RightorA/D: horizontal scroll+/-or mouse wheel: zoomF: toggle follow-cubeHome/End: jump to first/last tick- Top-right S: settings button, open to toggle
- M: Toggle non-rotated hitbox visibility (hitbox that interacts with non-rotated objects)
- R: Toggle rotated hitbox visibility (hitbox that interacts with rotated objects)
- I: Toggle inner hitbox visibility (hitbox that determines fatal ceiling hits + side hits)
- T: Trace toggled hitboxes over each game tick
- C: Toggle click pattern through time viewer (top bar at bottom)
- V: Toggle y-velocity through time viewer (bottom bar at bottom)
- Drag top: seek by tick
- Right-mouse drag: pan camera
Esc: close
examples/opti/ contains:
opti_objects.txt: object slice reference for the Opti setup.opti_click_pattern.bin: click recording used for replay.run_visualizer.sh: convenience runner.
Run:
bash examples/opti/run_visualizer.sh "/path/to/CCLocalLevels.dat"Optional second arg overrides tick-log output path.