Celeste Classic
Maddy Thorson and Noel Berry's 2015 PICO-8 precision platformer.
On this page
Maddy Thorson and Noel Berry’s precision platformer for the PICO-8 fantasy console was released in 2015 and later ported to C# and included with the 2018 Celeste. The atlas reads the C# port1. Like the main game, Celeste Classic uses a grace window after leaving a ledge1, but its grace counter counts 6 (5 airborne updates)1 updates. Inside Celeste, the port runs at 30 Hz2 Hz, half the main game’s rate, so its 5 airborne grace updates last about 0.17 s1,2. The game also implements jump-buffering with a buffer that stores presses for 4 updates3 updates3.
Mechanics
| Mechanic | Kind | How |
|---|---|---|
| Coyote time | Grace timer | a 6-update grace counter that refills on the ground |
| Jump buffering | Update counter | a 4-update counter stores presses and counts down until a jump starts |
Every claim about this game, by concept (3)
References
- ^ abcdCeleste 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.CodeNoelFB/Celeste
How we know
233 if (on_ground) ⋮ 235 grace = 6; ⋮ 242 else if (grace > 0) 243 grace--;
Source/PICO-8/Classic.cs lines 233–243 at 1b0ce45 · upstream ↗ 297 if (jbuffer > 0) ⋮ 299 if (grace > 0) ⋮ 301 // normal jump ⋮ 304 grace = 0;
Source/PICO-8/Classic.cs lines 297–304 at 1b0ce45 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
- ^ abInside Celeste, the Celeste Classic port skips every second frame to run at 30 Hz.CodeNoelFB/Celesterevised
How we know
268 // this is a pretty dumb hack but because Celeste is locked to 60fps 269 // and PICO-8 runs at 30 ... we just skip every 2nd frame ⋮ 271 skipFrame = !skipFrame; 272 if (skipFrame) 273 return;
Source/PICO-8/Emulator.cs lines 268–273 at 1b0ce45 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Revised after a check by a second AI model, 2026-10-27: Read in code, so T3; the 0.17 s belongs to grace-frames.
- ^ abCeleste Classic stores a fresh jump press in
jbufferfor 4 updates, counts it down by 1 on later updates, and clears it when a normal or wall jump starts.CodeNoelFB/CelesteHow we know
223 var jump = E.btn(G.k_jump) && !p_jump; 224 p_jump = E.btn(G.k_jump); 225 if (jump) 226 jbuffer = 4; 227 else if (jbuffer > 0) 228 jbuffer--;
Source/PICO-8/Classic.cs lines 223–228 at 1b0ce45 · upstream ↗ 297 if (jbuffer > 0) ⋮ 299 if (grace > 0) ⋮ 301 // normal jump ⋮ 303 jbuffer = 0; ⋮ 308 else ⋮ 310 // wall jump ⋮ 312 if (wall_dir != 0) ⋮ 315 jbuffer = 0;
Source/PICO-8/Classic.cs lines 297–315 at 1b0ce45 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-27.
Sources
Code
- Thorson, Maddy and Noel Berry. 2021. “Celeste: released class files (NoelFB/Celeste).” Commit 1b0ce45. NoelFB/Celeste @ 1b0ce45 · licence, all uses