summerengine/summer/celeste-momentum-platforming
Claude Code and agent skill by summerengine/summer
- community
Checking that the SKILL.md file is still in the repository.
Celeste-style 2D precision platformer movement — momentum running, coyote time, variable jumps, dash, wall jump/slide, climb stamina, pixel corner correction.
Install
npx vskill@latest install summerengine/summer/celeste-momentum-platformingSKILL.md
Celeste-Style Momentum Platforming (Movement System)
Outcome
A 2D character controller for Summer Engine that reproduces the tuning architecture and forgiveness mechanics of Celeste's player movement: momentum-based running with distinct ground/air acceleration, variable-height jumping with coyote time, a multi-directional dash with cooldown and residual speed, wall interaction (jump, slide, climb with stamina), and pixel-scale corner corrections that make near-miss inputs succeed instead of fail.
When to Use
- Building a precision 2D platformer in Summer Engine where movement feel is the core gameplay.
- Porting or prototyping Celeste-style mechanics (dash, wall jump, climb stamina).
- Tuning an existing platformer controller that feels "unfair" or unresponsive — the forgiveness systems below are the primary fix.
Do not use for: 3D character controllers, physics-driven (RigidBody) movement, or games where floaty/arcade jump physics are desired over momentum precision.
Core Principle
Celeste's movement is a single controller class driven by an explicit integer state machine, with all feel-critical numbers as a flat compile-time constants table at the top of the class. The released source (Player.cs, 5,471 lines) defines states Normal=0, Climb=1, Dash=2, Swim=3, Boost=4, RedDash=5, HitSquash=6, Launch=7, Pickup=8, DreamDash=9 (+ a Summit state), each with Begin/Update/End callbacks. State transitions are direct integer assignments.
The second principle: forgiveness at the pixel and millisecond scale. The code repeatedly nudges the player 2–6 pixels or grants 50–200 ms windows so that inputs which are almost correct still succeed. Most of the "tight" feel comes from these windows.
Tuning Constants (verbatim from Player.cs)
Celeste's units are pixels/second for speeds and pixels/second² for accelerations at its native resolution; times in seconds. When porting, preserve the ratios more than the absolute numbers if your pixels-per-meter differs.
Gravity & Falling
| Constant | Value | Feel role | |
|---|---|---|---|
| Gravity | 900 | Base downward acceleration | |
| MaxFall | 160 | Terminal fall speed (normal) | |
| HalfGravThreshold | 40 | Below this vertical speed, gravity is halved (floaty apex) | |
| FastMaxFall | 240 | Terminal fall speed when fast-falling (hold down) | |
| FastMaxAccel | 300 | Acceleration toward FastMaxFall |
Running
| Constant | Value | Feel role | |
|---|---|---|---|
| MaxRun | 90 | Top ground speed | |
| RunAccel | 1000 | Ground acceleration (~11× MaxRun — near-instant response) | |
| RunReduce | 400 | Deceleration when input stops | |
| AirMult | 0.65 | Air control multiplier on acceleration | |
| HoldingMaxRun | 70 | Reduced top speed while carrying objects | |
| HoldMinTime | 0.35 | Min time before hold-reduction applies | |
| WalkSpeed | 64 | Slow-walk speed | |
| DuckFriction | 500 | Friction while crouched |
Jumping
| Constant | Value | Feel role | |
|---|---|---|---|
| JumpGraceTime | 0.1 | Coyote time — jump input valid 100 ms after leaving ground | |
| JumpSpeed | -105 | Initial jump velocity | |
| JumpHBoost | 40 | Horizontal boost added on jump | |
| VarJumpTime | 0.2 | Variable jump — held jump sustains/boosts for up to 200 ms | |
| CeilingVarJumpGrace | 0.05 | Grace before ceiling cancels variable jump | |
| UpwardCornerCorrection | 4 | px nudge to slip past near-miss ceiling corners while rising | |
| WallSpeedRetentionTime | 0.06 | Horizontal speed retained briefly after wall interactions | |
| BounceAutoJumpTime | 0.1 | Auto-jump window off bouncy surfaces |
Wall Interaction
| Constant | Value | Feel role | |
|---|---|---|---|
| WallJumpCheckDist | 3 | px probe distance for wall detection | |
| WallJumpForceTime | 0.16 | Duration of forced horizontal speed after wall jump | |
| WallJumpHSpeed | 130 | = MaxRun + JumpHBoost; forced away-from-wall speed | |
| WallSlideStartMax | 20 | Initial wall slide speed cap | |
| WallSlideTime | 1.2 | Time over which wall slide behavior ramps | |
| ClimbGrabYMult | 0.2 | Vertical speed multiplied by 0.2 on grab |
Super Variants
| Constant | Value | |
|---|---|---|
| SuperJumpH | 260 | |
| SuperWallJumpSpeed | -160 | |
| SuperWallJumpH | 170 (= MaxRun + JumpHBoost×2) | |
| SuperWallJumpForceTime | 0.2 | |
| SuperWallJumpVarTime | 0.25 | |
| BounceSpeed / SuperBounceSpeed | -140 / -185 | |
| DuckSuperJumpXMult / YMult | 1.25 / 0.5 |
Dash
| Constant | Value | Feel role | |
|---|---|---|---|
| DashSpeed | 240 | Speed during dash | |
| DashTime | 0.15 | Dash duration | |
| EndDashSpeed | 160 | Residual speed after dash ends (2/3 of dash speed) | |
| EndDashUpMult | 0.75 | Residual multiplier for upward dashes | |
| DashCooldown | 0.2 | Time before dash input re-accepted | |
| DashRefillCooldown | 0.1 | Refill timing after landing | |
| DashAttackTime | 0.3 | Active dash collision window | |
| DashCornerCorrection | 4 | px nudge on dash near-misses | |
| DashHJumpThruNudge | 6 | px nudge for horizontal dashes through one-way platforms | |
| DashVFloorSnapDist | 3 | px snap to floor after downward dash |
Climb / Stamina
| Constant | Value | Feel role | |
|---|---|---|---|
| ClimbMaxStamina | 110 | Total stamina pool | |
| ClimbUpCost | ~45.5/s (100/2.2) | Climbing upward drains ~2.4 s of pool | |
| ClimbStillCost | 10/s (100/10) | Hanging drains ~11 s of pool | |
| ClimbJumpCost | 27.5 (110/4) | Flat cost per climb-jump | |
| ClimbTiredThreshold | 20 | Below this, climb behavior degrades | |
| ClimbUpSpeed | -45 | Climb ascent speed | |
| ClimbDownSpeed | 80 | Climb descent speed | |
| ClimbSlipSpeed | 30 | Slip speed when exhausted | |
| ClimbAccel | 900 | Climb velocity acceleration | |
| ClimbCheckDist / UpCheckDist | 2 / 2 | px probe for grab detection | |
| ClimbHopX / HopY | 100 / -120 | Wall-hop impulse | |
| ClimbHopForceTime | 0.2 | Forced duration of hop impulse | |
| ClimbGrabYMult | 0.2 | Vertical damp on grab |
Other
| Constant | Value | |
|---|---|---|
| LaunchSpeed / LaunchCancelThreshold | 280 / 220 | |
| LiftYCap / LiftXCap | -130 / 250 | |
| JumpThruAssistSpeed | -40 (upward assist through one-way platforms) | |
| ReboundSpeedX / Y | 120 / -120 | |
| ReflectBoundSpeed | 220 | |
| ThrowRecoil | 80 | |
| DuckWindMult | 0 (ducking negates wind) | |
| SpacePhysicsMult | 0.6 (low-gravity zones) |
Scene / Node Shape
Reference Implementation Skeleton (GDScript)
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckinglibrary/skills/celeste-momentum-platforming/SKILL.md
Popularity
- Repository stars
- 65
- Repository forks
- 4
- 7-day trend score
- 21
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/summerengine/summer/celeste-momentum-platforming)