You're Not A Mountain Climber

I’ve been playing Celeste, a video game about climbing a mountain, for about two years now. I’ve never been that good at things that need precise hand-eye coordination or strong reflexes; as a kid I liked turn-based games like Pokémon in part because they didn’t need me to press buttons at specific times, just whenever I was ready. But Celeste’s gameplay loop – making you die when it’s warranted, but immediately putting you back where you were so you can try again, and telling you it’s meant to be hard and to be proud of your death count – encouraged me to keep trying. I beat the main part of the game, climbing to the top of the mountain, after about two months and over 31 in-game hours.

While I was looking for that screenshot, I also found this one, so here you go:

While I was playing for the first time, I’d seen online that this was a game with a lot of speedrunning interest, and dismissed that as something I’d never be good enough to get into. But then, after a few more months of doing the harder B-side levels, I sat down one afternoon and decided to try and beat the whole game in one sitting. I managed it in 3 hours, 41 minutes: nearly a tenfold improvement over my first try!

One of the helpful properties of Celeste is it’s completely deterministic. There’s no random number generation, everything is entirely a function of how you move through the space or has a fixed pattern in time on each run. That means you can get significant improvements just by becoming more confident in how you move, or in getting used to the timing of obstacles. Just by making improvements to those aspects by playing the harder levels, I’d made such a huge step forward: how good could I get if I drilled the main game?

I started doing a full run of Celeste every time I had a long journey. I ran it about three or four times before I started logging my runs. I was playing on my Switch, so I didn’t have built-in speedrunning tools. Instead, I wrote down my time and deaths per chapter as reported by the game, and put them in a spreadsheet. In addition to the time and number of deaths per chapter, I calculated my best achievable time (the time I’d get if I did my best on every chapter), best achievable deaths (the same, but for the number of deaths), and the run-to-run gain in both of those. At some point, when I decided to go for a sub-hour time – a stretch goal that’s considered achievable by committed casual players – I started logging the total clock time reported by the game, too, which is a bit longer than the sum of chapter times due to the game’s prologue and some cutscenes.

My log of Any% runs extends from 15 February 2023 to 22 May 2024. I had gaps of a few months sometimes, but was fairly consistent: I played the whole game 37 times, plus the individual chapters several more times each. Within just one month, I’d gotten my time down from my first logged attempt of 2:21:43 to 1:06:25, and my death count down from 538 to 125! It would take another year just to shave off those last few minutes, though, as I’d exhausted all the easy ways of gaining time. In that month, I had to learn new techniques like the Search Skip, which lets you cut out several minutes of searching for keys by just doing a weird backward jump over a pit of tentacles, and I started to wavedash everywhere – an ability you’re supposed to learn in the brutally difficult DLC chapter Farewell, which I still haven’t completed – to shave off fractions of a second at a time. All the easy ways of gaining time had been exhausted, and I just had to get better at executing on what I already knew.

Over the next year, I got steadily better at every part of the game, mostly just by gaining confidence. I developed a sense of where I should be in the game at certain time milestones, and grew cautiously excited whenever I beat those mental benchmarks. Having the clock running was sometimes great for my self-confidence, and sometimes really stressful. On the run where I finally got under an hour, I didn’t have the clock on, and I have a feeling that if I’d known I was on track to make it, I would’ve been too nervous and ended up self-sabotaging. I knew when I got my clock time down to 1:00:52 on 9 May 2024 that getting my target time was imminent, and sure enough, on 22 May 2024, I blew past my target and got to 0:57:47, setting personal bests on three of the seven chapters as I did it!

Ignore all the frowning, this one is better! They're just sad I didn't collect more strawberries (my current record for getting all the berries is 3 hours, 27 minutes, 28 seconds.)

If I’d recorded the run, this would’ve got me on the speedrun.com Any% board at number 3984 at the time of writing (although there’s undoubtedly many unsubmitted runs that beat that). The world record is 24 minutes, 58 seconds, which clears the next best time by almost a minute; this run requires incredibly precise timing for every single movement, along with playing the harder versions of chapters 5 and 6 because they save seconds each. I think sub-hour is about as good as I can get and is pretty impressive considering where I started!

Now that I’ve achieved the goal and have all this data about the process of getting there, I have no choice but to make a bunch of plots! I sent this one to my department Slack the day before my sub-hour run:

For the rest, I’ll plot over attempt number rather than time so we don’t have to look at an uneven x-axis (and so I don’t have to keep dealing with date parsing). This one shows how much my achievable time and deaths changed as I kept trying:

I really like how well correlated these are! It really reflects how much of the improvement was just driven by doing the same things, but more reliably/without dying as much. This one shows the per-chapter time and deaths.

Since each chapter is a different difficulty level, I also wanted to plot some measures of fractional improvement. I took the best achievable time at each attempt (so I’d get a monotonic function and it wouldn’t look like noise), divided it by the time I actually achieved on my sub-hour run, and plotted that. Note that I’m not normalizing by my best achieved time, so you can see that on some chapters I didn’t perform the best I’d ever done on the sub-hour run. I repeated this process with the death count; to avoid dividing by 0 I added 1 to the death count in cases where I’d done a deathless run before. I actually had to log-scale this for the death count, which I’m very happy about, mainly because I improved my death count on Chapter 4 by a factor of more than 30x!

At the end of this, I don’t know if I’ll try to speedrun anything again – despite all this experience, playing fast and precisely remains pretty far outside my comfort zone on most other games. But I’m glad I pushed my boundaries and achieved something that looked impossible at first! For now I’m happy to just try for even more months on end to beat Farewell…