Celebrating the first NES Tetris game crash

Celebrating the first NES Tetris game crash

Today, the NES Tetris community achieved a new milestone. A player known as “Blue Scuti” reached level 157, a total of 1510 lines deep into the game, placed a piece, and his game crashed.

This post will describe why that is not only interesting, but a thing to be celebrated.

There will be topics in this post that assume you know everything from my previous post about Tetris. That post has no assumed prior knowledge, so start there and then come back if you want to know more.

Blue Scuti

When I wrote that previous post in August 2022, Scuti was only 12 years old. The minimum age of entry into most competitive Tetris events is 13. The scene is young, but Scuti is young even by the standards of the scene. Now age 13, he participated in the 2023 Classic Tetris World Championships, where he took 3rd place. Accompanied everywhere by his stuffed blue yoshi plush, or other plushies borrowed from his friend “coalbucket”, Scuti established himself very quickly as someone to watch. He is without a doubt one of the most talented players the game has ever seen, using the rolling playstyle. An article in his local news gave some additional info about Scuti and his background.

I also attended the Classic Tetris World Championships, where I got 45th. At the afterparty, I did get a picture with coalbucket (left) and Scuti (center).

Game Quirks

Like most old games, NES Tetris doesn’t have safeguards in its game code for every possibility. Built in 1989 for the Nintendo Entertainment System, it had to prioritize simplicity. That prompted some assumptions, ones considered pretty safe for decades.

First, the score count stops at 999,999. This is an entirely reachable score, affectionately called the “maxout.” Developers either assumed that it was not going to be reached (skill issue), or figured that nobody needed to keep track of score beyond that.

Next, the lookup table of levels stops at 29. When a player reaches level 30, the byte loaded in to display the level is actually read from a different table entirely, and shows as “00”. Similar weird values show on all later levels as well. This is only a display bug, the game still stores levels accurately as a value from 0 to 255. Level 256, if reached, would be identical to level 0. Level 29 also marks the final speed increase, which the developers (again due to skill issue) deemed unplayable, so it is fair to believe they considered level 30 to be outside of human ability.

The next interesting display bug comes at level 138. Here, the lookup table for the colors of each piece, is now indexed incorrectly due to 138-10 being stored as a signed byte, where it gets interpreted as -128. Code written and forgotten, with quirks that no developer expected would be relevant. Levels 138 through 255 have unusual color palettes, some of which are exceptionally dark and difficult to play on. In a somewhat famous video, Greg Cannon’s AI called “StackRabbit” plays through many of these colors, and the names given in this video are now the community names for all of the levels.

Game Crash

Explainer courtesy of HydrantDude

Finally, there is the game crash. If the player’s score is 999,999, any further points are still added internally. After adding, the bytes that hold score get reset back to 999,999. In a wonderful bit of inefficiency, this “add then clamp” routine actually runs many many times, equal to the level the player is on, plus one. So while a single line clear on level 0 is worth 40 points, and a single line clear on level 99 is worth 4000 points, the latter is actually 40 points, 100 times. Separately.

The score occupies 3 bytes and singles are the only types of line clear that modify the lowest byte. Accordingly, single line clears take the most time to add to your score. At level 155, due to the slow score loop, it becomes possible for the rendering code to take over before the rest of the game logic finishes. The rendering code assumes that the game logic’s execution pointer is in a known state. Making it to level 155 violates this assumption, to spectacular and game-crashing results.

A few things need to happen. First, there needs to be no modifications to the scoring code. The StackRabbit video above uses a scoring mod, which changes this behavior, which for a long time also led the community to have some misconceptions about the crash. To get a crash at level 155, you need to actually keep the loathsome 999,999 on your screen while playing long past that score.

Next, you need to hit a crash trigger. The earliest and most well known crash trigger is “single to enter level 155”, as the level transition coupled with the slow score loop deterministically brings a crash. If a player misses this trigger, there are later opportunities, but most only have a probability of causing a crash.

What does it look like?

In this video, Scuti has already been playing this particular game of NES Tetris for close to 45 minutes. From level 29 and beyond, the speed shown here is the speed of play. He is able to think quickly enough and place pieces using a method where multiple fingers each push the controller into his other hand from behind (rolling).

The level display has long since given up, and the score is unhelpful, but other numbers on the screen still have meaning. The line count E85, is actually 1485. By dividing by 10 and adding 6, we can find that Scuti is on level 154. If he gets a single when his line count reads E89, entering level 155, then the game will crash. But he scores a triple instead, which calculates more quickly due to the base value of a triple being 300. So he misses the crash. From E92 and beyond, he doesn’t know if or when when the game will crash and has to plan for anything.

Two levels later, with a line count of F10, the color palette once again becomes dark. Levels 146, 148, and 151, nicknamed “Dusk”, “Charcoal” and “Australian Outback”, are the only really dark levels necessary to reach the E89 crash trigger, and so these are the ones players practice, or calibrate their display for. Level 157, “Radium”, isn’t one of the ones that most players practice these days. Scuti’s play suffers, and the crash has not come yet.

In a tense position, Scuti manages to get a single line to burn, and immediately the game freezes. The line clears visually, the game updates from F10 to F11 lines, but the pieces stop falling. A gentle hum replaces the background music. Inputs do nothing. Scuti crashed the game.

History

In my previous post, I wrote “The only things left to do now on the original cartridge are to literally crash the game, or to perform ridiculous (TAS-only?) crash-avoiding tactics beyond a certain level.” We’ve now done the first.

Looking at the year and a half since that post, there was a lot of new focus on a game modification that adds a new speed increase at level 39.

This super-killscreen was used in most competitive events since its introduction in 2022, but November 2023 hosted a no-linecap event that got people thinking about crash again. With lots of spare time, winter break 2023 was when historic movement began. So let’s look at 3 consecutive very special days in NES Tetris history.

Tuesday, December 19, 2023

Fractal161 was the most dedicated to game crash. He was also the first player to reach level 138 and experience those color palettes on the original rom. Back from MIT for this year’s winter break, he set up a stream titled “FINAL CRASH GRIND DAY 1”. The intention was to stream attempts every day, until he achieved this milestone.

That same day, also on winter break, Scuti set a new score world record. Beating EricICX’s long-standing 6.4 million point game, Scuti got 6,609,220. In this 6.6 million point game, Scuti also played through all 3 challenging levels pre-crash: “Dusk”, “Charcoal” and “Australian Outback”. He ended up losing the game naturally to a difficult sequence on level 153, but because he was playing on a version of the game that modifies the score, there was not going to be a crash at 155 anyway.

Wednesday, December 20, 2023

The very next day, Fractal took back the score world record with 6.7 million. Because he was going for game crash, he was using the unmodified rom, so his score only showed as 999,999. It took many people confirming every line clear from the video, to arrive at an exact score of 6,737,260. With efficient play, Fractal had scored more points before the difficult colors. His game ended on Dusk, level 146.

On the 20th, Scuti began his own attempts at game crash, providing a battle of titans.

Thursday, December 21, 2023

One day later, another player Gerald Freeman joined the race to game crash. Gerald had a game end on level 150 the previous day, with modified score showing 6.2 million, making him the 2nd ever player to pass both Dusk and Charcoal in a run. Three of the 6 players to have ever reached level 138’s colors, were now playing on the original, unmodified rom, with the same goal. Crash the game.

That day, Scuti triumphed. Not on level 155, but level 157. His final score was recalculated to 6,850,560 points. Historic milestone, and reclaimed world record.

As I write this, Fractal is adjusting his goal. He still wants to crash the game, but no longer as the first ever. Instead, he intends to claim the “best game of classic Tetris ever played” by scoring far more Tetrises on the fastest speed, and still ending with a crash. Pushing the efficiency harder, to break score world record by a lot, multiple millions higher.

It’s an exciting day.

Who to Watch

All of the players below have expressed some interest in playing long games of NES Tetris. Please follow them! I will also be trying to do cool things in Tetris, but my level PB is 37 which doesn’t put me in any sort of contention for these sorts of achievements.

Blue Scuti: twitch youtube

Fractal161: twitch, youtube

Gerald Freeman: twitch youtube

Sidnev: youtube

Alex Thach: youtube

PixelAndy: youtube

Other content creators who are likely to make a much better video or article about this milestone:

aGameScout: youtube

Cobalt: youtube

EricICX: youtube

HydrantDude: youtube

See you around!