v0.1 ⌊ALPHA⌉
Cite as
NoelFB/Celeste
Original
https://github.com/NoelFB/Celeste
Pinned
NoelFB/Celeste @ 1b0ce45c75e05649ae91b44a8bb6b196684e4352
Accessed
2026-10-20
Licence
MIT (LICENSE: "Copyright (c) 2018 Noel Berry"). The README: "the MIT License only applies to the code in this repo and does not include the actual commercial Celeste game or assets."
Credit
Maddy Thorson and Noel Berry, Celeste's two programmers (Source/Player/Readme.md: "We had 2 programmers working on Celeste (Noel and Maddy)"). Released "as a learning resource and for general interest" (README).
Notes
Contains Source/Player/Player.cs (the full game's player class) and Source/PICO-8/ (the C# port of Celeste Classic that runs inside the full game). Engine classes (Actor, Engine, Calc) are not included.

Cited on

Claims (21)

Celeste Classic's grace counter resets to 6 on the ground and drops by 1 before each airborne jump check, so jumps work for 5 updates after leaving a ledge.Source/PICO-8/Classic.cs L233–243Source/PICO-8/Classic.cs L297–304T3
Inside Celeste, the Celeste Classic port skips every second frame to run at 30 Hz, so its 5 grace updates last about 0.17 s.Source/PICO-8/Emulator.cs L268–273T2
Celeste Classic sets its jump buffer, jbuffer, to 4 on a new press and otherwise counts it down by 1 each update.Source/PICO-8/Classic.cs L223–228Source/PICO-8/Classic.cs L297T3
A normal jump sets Madeline's vertical speed to JumpSpeed, −105 px/s.Source/Player/Player.cs L49T3
Jump() sets vertical speed to JumpSpeed plus any platform lift boost, saves it as varJumpSpeed, starts varJumpTimer at VarJumpTime, and zeroes the grace timer.Source/Player/Player.cs L1660–1673T3
Celeste's gravity is 900 px/s²; each airborne update moves vertical speed toward the fall limit by Gravity * mult * Engine.DeltaTime.Source/Player/Player.cs L24Source/Player/Player.cs L2957T3
HalfGravThreshold is 40 px/s, the vertical speed below which (in either direction) holding jump halves gravity.Source/Player/Player.cs L25T3
Gravity halves while |Speed.Y| is under HalfGravThreshold and jump is held (or auto-jump is on), so a held jump hangs at the top.Source/Player/Player.cs L2952T3
VarJumpTime, how long holding jump can keep the take-off speed, is 0.2 s.Source/Player/Player.cs L51T3
While varJumpTimer runs, holding jump keeps Madeline rising no slower than varJumpSpeed, canceling gravity; releasing zeroes the timer and cuts no speed.Source/Player/Player.cs L2960–2966T3
MaxFall, the normal limit on falling speed, is 160 px/s; NormalBegin starts maxFall there and gravity approaches it.Source/Player/Player.cs L23Source/Player/Player.cs L2760–2763T3
Holding down while falling at MaxFall or faster raises the limit toward FastMaxFall (240 px/s) at FastMaxAccel (300 px/s²); otherwise it eases back.Source/Player/Player.cs L27–28Source/Player/Player.cs L2911–2924T3
JumpGraceTime, Celeste's coyote time, is 0.1 s.Source/Player/Player.cs L48T3
Grounded updates refill jumpGraceTimer; airborne ones subtract Engine.DeltaTime before NormalUpdate, which jumps on a press while it is above zero.Source/Player/Player.cs L713–720Source/Player/Player.cs L2970–2975T3
In each update, Player.Update ticks both jump timers, the state machine runs NormalUpdate (gravity, hold, and new jump), and then MoveV applies Speed.Y * Engine.DeltaTime.Source/Player/Player.cs L742–744Source/Player/Player.cs L908Source/Player/Player.cs L934–935Source/Player/Player.cs L322–323T3
Celeste's actors sit on whole pixels; MoveV adds the float distance to a remainder, moves by its rounded value, and keeps the fraction.Source/Player/Player.cs L935T2
Celeste's developers describe the game as locked to 60 updates per second, so the bundled PICO-8 port skips every second frame.Source/PICO-8/Emulator.cs L268–270T2
At normal speed, Celeste's Engine.DeltaTime is most likely (float)0.0166667 s, the XNA and FNA default 166,667-tick step, not an exact 1/60 s.Source/Player/Readme.md L28T1
The 0.1 s grace and 0.2 s variable-jump timers end on float rounding; a (float)0.0166667 step gives 5 and 11 updates, and (float)(1/60) gives 6 and 12.Source/Player/Player.cs L713–720Source/Player/Player.cs L742–744T4
Simulating the jump code (flat ground, no lift boost, (float)0.0166667 step) gives apexes of 7 px tapped and 27 px held, airtimes 15 and 39 updates; an exact 1/60 s step gives 29 px held in 40.Source/Player/Player.cs L2952–2966Source/Player/Player.cs L1660–1673T4
The developers chose one large file of long methods for the player's behavior, so its tightly ordered logic reads in sequence.Source/Player/Readme.md L16T2