A minimalist 2D physics platformer inspired by Worms Armageddon's iconic Ninja Rope, built around the pure joy of a grappling rope. Swing, shorten/lengthen the rope, and chain momentum to climb an endless, procedurally generated chasm while a hazard rises from below. Aim to reach your personal best height.
- Open
index.htmlin a modern desktop browser; no build step required. - If your browser blocks local file access for assets, serve the folder with a static server:
- Python:
python3 -m http.server 8000then visithttp://localhost:8000 - Node (serve):
npx serve -p 8000then visithttp://localhost:8000
- Python:
- LMB (hold): Fire and hold rope; release to detach
- W: Shorten rope
- S: Lengthen rope
- A / D: Apply swing force (clockwise / counterclockwise)
- Menu: SPACE or ENTER to start
- Game Over: R or SPACE to restart; M or ESC to return to menu
- Logging: Press L during play to download a recent gameplay log (
rope_log_*.json)
- Focused core loop: Shoot, latch, swing, release, repeat
- Matter.js physics with rope constraint and swing forces
- Procedural infinite chasm with sparse, strategic platforms and optional ceilings
- Rising hazard that constantly pressures upward movement
- Score and high score stored locally via
localStorage - Pixel-art rendering with simple sprites and procedural textures on platforms
- In-game debug overlay with state, rope, streaming, and hazard info
- Language: Vanilla JavaScript (ES5/ES6)
- Rendering: HTML5 Canvas
- Physics:
matter-js@0.19.0(via CDN) - No build tooling: Single
index.htmlentrypoint with<script>tags
assets/ # Sprites (player, kunai, obstacle tiles)
css/ # Styles for centered layout and canvas
docu/Readme.md # Game design document (concept and mechanics)
js/ # Game modules (input, physics, rope, world, etc.)
index.html # Entry point (loads matter.js and game modules)
Key modules:
js/main.js— Game loop, state orchestration, module wiringjs/input.js— Mouse/keyboard input managerjs/physics.js— Matter.Engine setup and world helpersjs/player.js— Player body and statejs/rope.js— Rope attach/detach, length control (W/S), swing forces (A/D), pivot handlingjs/world.js— Procedural world generation, chunk streaming, platforms/ceilings/wallsjs/hazard.js— Rising hazard logic and visualsjs/scoring.js— Height-based scoring, high score persistencejs/camera.js— Upward-following camera with thresholdjs/renderer.js— All draw calls, sprites, rope rendering, UI and debug overlayjs/logger.js— Rolling gameplay log and JSON download onL
- Click the canvas once to ensure it has focus
- Press SPACE/ENTER to start
- Aim with the mouse and hold LMB to fire/hold the rope
- Use A/D to pump the swing; use W/S to shorten/lengthen the rope
- Release LMB at the apex to launch; reattach quickly to chain swings
- Avoid the rising hazard and climb as high as you can
- Rope max range:
maxRangeinjs/rope.js - Rope length change rate:
lengthChangeRateinjs/rope.js - Swing force:
swingForceinjs/rope.js - Hazard speed:
riseSpeedinjs/hazard.js(or callsetRiseSpeed()at runtime) - World generation density/spacing: see
generatePlatformsand related helpers injs/world.js - Chunk size:
chunkWidth,chunkHeightinjs/world.js
- Nothing happens on keypress: click the canvas to focus it
- Sprites not visible: ensure
assets/is present and served; check browser console for 404s - CDN blocked/offline: replace the Matter.js CDN in
index.htmlwith a local copy - High score not saving: confirm
localStorageis enabled in your browser/profile
- The design document lives in
docu/Readme.mdand outlines the vision, loop, and controls - Logs: press
Lin-game to download a recent rolling log of inputs, rope state, and nearby geometry - The renderer uses cached procedural textures for platforms/ceilings to reduce draw overhead
Issues and pull requests are welcome. For larger changes, please open an issue first to discuss scope.
- Inspired by the Ninja Rope from Worms Armageddon
- Physics powered by Matter.js