Developed by Atharva Patil (p4inz-code) under Northbyte Studios.
Project Ascent is a 25-level 2D precision platformer built around responsive movement, fast retries, readable traversal, and a dark atmospheric Neon Ascent visual identity.
v0.12.1 — Surfaces, Checkpoints, Boss Timers
A full 25-level, 5-act campaign with a title screen, boss encounters on a visible countdown, mid-level checkpoints in the late acts, ice and sticky surfaces, save progression, a shared cyberpunk UI theme across every surface, player/accent colour personalisation, trauma-based camera shake, per-act visual identity, and procedural city silhouettes.
Offline-first: no accounts, no backend, no ads, and no network runtime. The only thing that ever touches the network is an optional update check, which the launcher performs over HTTPS with a required checksum.
PLAYER DOWNLOAD — no Godot, no source, no tools required.
- Go to the latest release.
- Download the
Project-Ascent-…-Windows.zipasset. - Extract the ZIP anywhere (all files must stay together in the same folder).
- Double-click
ProjectAscentLauncher.exe— notProjectAscent.exedirectly — and click Play.
If Windows SmartScreen warns about an unknown publisher, choose More info → Run anyway (the file is an unsigned standard Godot export).
| Action | Keyboard | Controller |
|---|---|---|
| Move left/right | A/D or Left/Right | Left stick X |
| Jump | Space or W | A / south button |
| Dash | Shift or J | X / west button |
| Spin (air mobility, brief i-frames) | Double-tap Jump | Double-tap A / south button |
| Slide | S / Ctrl / Down | B |
| Ground pound | Down + Jump (airborne) | B + A |
| Air dash | Dash while airborne | X |
| Wall run | Run into a wall with speed | — |
| Ledge grab | Automatic | — |
| Grapple | E / K | RB |
| Use ability | G / F | LB |
| Restart | R | Back / Select |
| Pause | Escape | Start |
| Show/hide controls | Tab or F1 | — |
- Responsive running with acceleration, deceleration, and air control
- Jumping with coyote time, jump buffering, and variable height
- Wall slide and wall jump
- Air dash with landing refresh and momentum handling
- Spin — double-tap jump, usable in mid-air, granting brief hazard invulnerability on a cooldown
- Six further movement verbs — slide, ground pound, air dash, wall run, ledge grab, grapple. Only three claim a key: the rest derive from inputs the player already knows, because eleven separately-bound verbs stops reading as depth
- Ledge grab is automatic — it rescues a jump that came up a few pixels short
- Moving platforms, conveyor belts, crumbling platforms, bounce pads, wind zones, and one-way platforms (solid from above, pass-through from below)
- Ice and sticky surfaces that change how the ground feels without taking control away — ice keeps you sliding after you stop steering, sticky makes a run-up genuinely short. Both are ground-only, so a jump off them is still an ordinary jump
- Instant-death hazards: spinning blades, swinging pendulums, and lava pits
- Obby gauntlet levels (L2, L7) — flat treks over lava broken by jump, dash, and spin crossings, instead of pure platform-to-platform ascent
- Every level past 15 carries its own lethal hazard mix, escalating to Act V
- Fast fall respawn, manual restart, attempt counter, and run timer
- 25 handcrafted levels across 5 distinct visual acts, with mixed platform mechanics spread across every act (not siloed to a single act)
- Boss chase encounters at Levels 5, 10, 15, 20, and 25, each on a visible countdown — expiry speeds the chase up rather than killing you
- Mid-level checkpoints in Acts IV and V, in-memory only: they make a long level survivable within a session without turning it into saved progress
- Death feedback that escalates past 25 attempts and turns supportive past 50. Respawn stays instant at every tier
- Smart boss AI with stuck detection, adaptive jumping, and ledge detection — chasers hold an edge or jump a gap they can clear, instead of walking off it
- Every level's jump geometry validated against a measured jump envelope, so no step demands more height than the player can actually reach
- Per-level save/checkpoint progression
- Level Select — replay any completed level from the pause menu
- Pause menu with neon panels, action icons, and a shared UI theme
- Cyberpunk pixel font across all UI — menus, HUD, run timer, and controls panel
- Personalisation: 6 player colours, 5 UI accents, and intensity dials for screen shake, parallax depth, and neon glow — all applied live, no reload
- Trauma-based camera shake on hard landings and deaths
- Every setting drives real behaviour, verified by a test that asserts an observable change in the running game rather than that the value saved
- Procedural city skylines, parallax ridges, star fields, floating particles, with per-level shape variation on top of per-act color identity
- Per-act visual identity (Dawn → Dusk → Night → Storm → Apex), each with its own sky landmark — a rising sun, a low moon, a banded planet — plus weather: snow, driving rain with lightning, and rising embers
- A foreground silhouette layer passing in front of the player for real depth
- Themes — named presets (Ascent, Ember, Frost, Vapor, Toxic, Mono) that recolour the player, UI, platform edges and backdrop together. Ascent stays the default identity, and the individual colour pickers remain as overrides
- Platform edge glow and atmospheric lighting
- Dash afterimages and player feedback
- Keyboard and controller bindings from Godot's InputMap
- One-charge ability pickups — super jump and glide, spent with the Ability key
- Zero-gravity fields where the player drifts (Act V)
- Every level ~50% longer, extended along its own measured rhythm
- Standalone launcher with update checking, bundled with every release
Introduction to movement. Jump, dash, precision. Ends with the first boss chase.
Longer levels, tighter precision, movement combinations. Second boss encounter.
Environmental pressure, demanding routes. Shadow Chase boss.
High difficulty, complex combinations. Tempest 2-phase boss.
Maximum challenge, endurance, final escalation. Dawn 3-phase final boss.
| Level | Boss | Minions | Speed |
|---|---|---|---|
| L5 | First Chase | 4 | 170 px/s |
| L10 | Master Escape | 5 | 220 px/s |
| L15 | Shadow Chase | 5 | 200 px/s |
| L20 | Tempest | 6 | 250 px/s |
| L25 | Dawn (Final) | 6 | 300 px/s |
- Automatic per-level checkpoint saving
- Progress persists between game sessions
- Reset Progress available from pause menu
- Corrupt save safely falls back to Level 1
Pending — owner is providing a fresh set of real screenshots for this section.
- Godot 4.7.2 stable
- Git
Clone the repository, open it in Godot, and run:
git clone <repository-url>
cd project-ascent
godot --editor --path .
godot --path .
On Windows, replace godot with the path to your Godot 4.7.2 executable.
Run the complete test suite with the bundled wrapper (slowest suite — the full 25-level reachability sweep — runs last):
tools/run_all_tests.ps1
which runs, in order:
# Game tests
godot --headless --path . --script res://tests/test_boot.gd
godot --headless --path . --script res://tests/test_movement.gd
godot --headless --path . --script res://tests/test_feel.gd
godot --headless --path . --script res://tests/test_loop.gd
godot --headless --path . --script res://tests/test_level.gd
godot --headless --path . --script res://tests/test_level3_route.gd
godot --headless --path . --script res://tests/test_presentation.gd
godot --headless --path . --script res://tests/test_save.gd
godot --headless --path . --script res://tests/test_new_mechanics.gd
godot --headless --path . --script res://tests/test_level_rhythm.gd
godot --headless --path . --script res://tests/test_chaser_ledges.gd
godot --headless --path . --script res://tests/test_new_verbs.gd
godot --headless --path . --script res://tests/test_dev_console.gd
godot --headless --path . --script res://tests/test_customization.gd
godot --headless --path . --script res://tests/test_hazard_placement.gd
# Route and reachability validation (25 levels)
godot --headless --path . --script res://tests/test_all_routes.gd
godot --headless --path . --script res://tests/test_full_campaign.gd
godot --headless --path . --script res://tests/test_all_levels_reachable.gd
# Launcher tests
python -m pytest launcher/tests/
All suites pass with zero failures as of the current build.
Two of these suites exist because an earlier gate proved the wrong thing:
test_level_rhythm.gdchecks that no jump demands more rise than the player can actually deliver, using an envelope measured from the real controller (tests/probe_max_rise.gd) rather than assumed from thejump_heightexport. The reachability suite passed Levels 9 and 10 despite both shipping impossible final jumps — it reached the ledge by wall-jumping off that ledge's own face, which proves a bot can get there, not that the jump is fair.test_chaser_ledges.gdasserts a chaser stops at a cliff instead of walking into it. Three previous fixes for "enemies falling" addressed collision layers and a recovery teleport; none of them checked whether there was ground ahead, which was the actual cause.test_new_verbs.gdasserts each movement verb produces a real effect — a verb that compiles and a verb that works are different claims.
The runner also fails a suite on any GDScript parse or compile error, not just
a non-zero exit code — a suite whose script fails to compile reports
failures=0 while having asserted nothing at all.
scripts/player.gd— movement state and physics, including dash and spinscripts/player_visuals.gd— non-authoritative squash/stretch/lean/spin visualsscripts/game_scene.gd— level loading, transitions, pause overlayscripts/game_manager.gd— game-wide state, progression, pause, level-select jumpscripts/main_scene.gd— level controller, spawn, boss, completionscripts/level_data.gd— all 25 level definitions (data-driven)scripts/save_system.gd— file-based save/loadscripts/pause_menu.gd— pause overlay with settings/progress/level-selectscripts/platform.gd— reusable platform geometryscripts/moving_platform.gd— oscillating platform that carries the playerscripts/conveyor_belt.gd— constant lateral push while grounded on itscripts/crumble_platform.gd— triggered one-shot collapsing platformscripts/bounce_pad.gd— vertical launch padscripts/wind_zone.gd— directional force fieldscripts/one_way_platform.gd— solid from above, pass-through from belowscripts/spinning_blade.gd— rotating instant-death hazardscripts/pendulum.gd— swinging instant-death hazardscripts/lava.gd— static instant-death pitscripts/ui_theme.gd— the shared UI Theme: palette, type, control stylingscripts/camera_shake.gd— trauma-based camera shakescripts/hud.gd— controls, timer, attempts, completion UIscripts/audio.gd— music, SFX, procedural audioscripts/city_silhouette.gd— procedural background city skylinescripts/floating_particles.gd— atmospheric floating particlesscripts/boss.gd— boss AI with stuck detection and adaptive jumpingscripts/minion.gd— minion AI with tracking and jump behaviorlauncher/— Python launcher/updater, bundled with every release and the intended way players start the game (see Download and play above)
scenes/ Godot scenes for levels, player, platforms, UI
scripts/ Runtime GDScript
assets/ UI frames, font, number sprites
tests/ Headless behavior, presentation, and route validation suites
tools/ Test wrapper, web server, probes, and capture scripts
shaders/ Presentation shaders
addons/ Development-only Godot MCP toolkit
docs/ Architecture, design, handoff, and release documentation
launcher/ Optional Python launcher with update checking
build/ Windows standalone build output
Project Ascent's source, original game content, and branding are not granted
reuse rights by this repository. See LICENSE for full terms.
The bundled addons/godot_mcp_toolkit/ is a separate development addon with its
own MIT LICENSE; that license does not license the game.
Godot and the Godot logo are trademarks of the Godot Foundation.
docs/ARCHITECTURE.md— technical referencedocs/LEVEL_DESIGN.md— campaign designdocs/SESSION_HANDOFF.md— continuation guideCREDITS.md— credits and attribution