The Design of Quickplay 2.0
by 2024/11/16 (Sat) 2:05:35 am
atQuickplay 2.0 has come a very long way.
In fact, QP2 was actually pretty mediocre for the majority of its development. From November 2022 to July 2023, we’ve had to do a ton of adjusting and adapting. This wasn’t a smooth process, and the game really only started coming together in the final month.
Hi, I’m garbo, the design and creative lead behind QP2. In this post, I’d like to talk more about the key design struggles and decisions that brought us to where we are today.
How it Began
One of the most important things when making a game (especially a free web game) is the new player experience. When we looked at where new players went first, the two places that stuck out were custom rooms (to play with friends) and Quick Play.
While improving the custom room experience is something that remains on the table, the much more alarming entry was Quick Play. This is because it was NOT a beginner-friendly mode at all. To show how unfriendly it was:
- The average Quick Play round would last 4-5 minutes
- 50% of players die within the first 2 minutes
- It takes 30 seconds between a round ending and the next one starting
This means that in many cases a player will join quickplay, wait 5 minutes for the next game, die within a minute, and then be forced to spectate another 5 minutes to play again. It’d be a crime to actually call this “quick” in any sense.
There was also no goal for a newer player to strive for in Quick Play. You could try to survive for a bit longer, or get a KO, but nothing that felt substantial. This led to many players considering the game “too sweaty” and then quitting.
So when it came down to making the concepts for a QP rework, here were the key goals:
- Severely reduce wait times, both when joining and after dying. Quick Play should be the fastest way to get into a multiplayer game.
- Separate players of different skill levels so that new players aren’t getting hit by a bored X rank’s 40 spike.
- Give players of all skill levels meaningful things to strive for. This could be short-term like a high placement, or long-term like achievements.
With these goals in mind, I got to work on some concepts.
Early Design Concepts
The first concept was called the “Multi-Arena System“.
Concept #1 – Multi-Arena System
Players are split evenly between 5 different arenas which each act as their own FFA room. After an arena’s round ends, the best performing players will promote to the next room and the lowest ranking players will fall to the previous. The smaller groups of players speeds up the length of each round, and the skill grouping gives more players a shot at winning.
This was the concept that most closely resembled old Quick Play. You can consider it just an improvement to the way the previous system worked rather than a fully new game.
my concept sketch for the “multi-arena system”
To get into more of the specifics, each round would last about 2 minutes (max 2.5). This cuts the average wait time to about 1.5 minutes for both joining and after dying. It also gives players a fair competition against similarly skilled players and larger goals to strive for (high placement and promoting to a higher arena).
While this system would’ve likely succeeded at reducing wait times, it still meant that a player could have to wait for up to 3 minutes to get into a game. Building a whole new system and only having it cut wait times in half wasn’t good enough. This leads us to the second concept:
Concept #2 – Persistent Tower FFA
Instead of having rounds start and end, the game is a constantly running free-for-all where players can freely drop in or out. The tower is split up into 8 floors where getting a KO moves you up and topping out will let you revive on the floor below.
This is the concept that started the idea of a persistent gamemode where players can drop in or out at any time. The potential was clear from the beginning. Being able to reduce the wait time to 0 would be a massive improvement if we could pull it off.
my concept sketch for “persistent tower FFA”
Aside from completely solving the wait times issue, this system would also roughly split up players into skill groups and give them the goal of seeing how high they can reach in the tower. Due to the random nature of getting a KO, players may go on lucky streaks and reach far above where they would’ve gone normally. Due to dying being so inconsequential, it’d even be fun to sometimes reach a floor you have no business being in.
This is also where the idea of fatigue started. If a player spends too long on the same floor, they will start getting hit by incremental debuffs of permanent lines and garbage multipliers. This would ensure a healthy churn of stagnant players getting KO’d.
Despite all of the potential benefits, there were also many potential problems. The biggest issues stem from the unreliability of building the entire system on KOs. This issue can be broken down into 3 parts:
- Lack of player input: Whether you get a KO or not is extremely random. Sometimes you’ll send 40 lines without scoring credit for any KOs or send 4 lines and get 2 KOs. It’s just not very satisfying having the goal be so attached to something with such little agency.
- Forced consistency: In order to make a game centered around KOs work, there would need to be systems in place in order to force players to die (such as fatigue). Giving a time limit to your life would be fine, but the problem is that the way to win against the clock is to score a KO (which as mentioned earlier is very random).
- Survival time by player skill: Player’s survival time increases exponentially with their downstacking skill. The entire bottom 30% of players will hardly clear any garbage before messing up their stack and dying while the top 30% can downstack an infinite amount as long as they aren’t spiked too hard. This makes it even harder to balance survival in a way that gives all players a similar lifespan without feeling forced.
Since it had become clear that we needed a new primary incentive instead of KOs, this led me to my next and final concept:
Concept #3 – Elevator Battle
Similarly to the previous concept, the game is a constantly running FFA. The player’s board is on an elevator rail and gets powered by sending lines. Targeting is based on the closest opponents to the sender’s altitude. Topping out will send you back to the very bottom to start again.
Elevator Battle is the concept that would eventually become the QP2 that we know today. It was a little rough around the edges, but the idea turned out to be good.
my concept sketch for “elevator battle”
This version can actually be seen as a continuation of the “Persistent Tower FFA”, with a similar focus on instant hop in/out gameplay, and climbing being the main goal (rather than reaching #1 in a lobby). This time, climbing was split into an “altitude” score instead of just 8 different floors, and the method was shifted from KOs to just sending lines.
This system would solve all of the previous concept’s major issues, but would also introduce some new ones.
For example, since sending lines is a fairly solitary action, this would make the game feel much more singleplayer. Your results become more of a product of what you did rather than the people around you. This is a risky direction, as it can very easily make the game feel like “10 minute ultra” rather than a real online multiplayer experience.
The biggest issue comes from how to scale difficulty with altitude. Since everyone starts from the bottom and climbs over the course of their runs, this design seems to fail as a means of sorting players by skill. Players are really only where they’re “supposed to be” for the last 20% of their runs. How do you balance the game properly when nobody is sorted?
Despite the issues and potential pitfalls, “Elevator Battle” was deemed the most promising option, and so we got started with making our first version.
Difficult Early Iterations
Because we had to simulate an entirely populated tower without many testers, we decided to use bots. However, it’d take too long to implement actual bots (and our test server resources were limited) so we had to resort to faking it.
the “bots” in question
These bots would spawn with a random APM between 0-120 (weighted lower), and then infinitely stall pieces for as long as they could. Their APM quota would be automatically sent in chunks of 4 or 1 to simulate a player’s attacks.
On a similar note, the first version of the game was extremely barebones. Just a height number, climbing rank, and a bunch of bots.
footage of the very first version of QP2
When we first tested the game, it absolutely sucked.
For one, it had no moment-to-moment satisfaction. You climbed by increasing your Climbing Rank (shown as “RANK” in the video), which was only influenced by your lines sent in the last 20 seconds (up to a maximum of Rank 5 at 80spm). This made climbing feel far too time-bound rather than performance based.
Another major issue was targeting. Players would go from going 30 seconds without receiving any lines to receiving 20 lines at once. Testers described the game as being one where you do nothing until you get hit by an instadeath spike and lose without counterplay. It was clear to everyone that this game was not good.
Over the next few weeks, we created and iterated on many different systems to address these problems. Here’s a list of the major ones:
- Climbing Speed: The previous version with 5 climbing ranks was replaced with Climbing Speed, a bar that naturally drains but fills upon sending lines. Maxing out this bar would bring you up to the next level with a new bar requiring more lines to fill and draining faster. Unlike the previous climbing ranks, there is no limit to climbing speed.
However, the more important part of this climbing speed change is that you’d instantly jump by 1s of your climbing rate per line sent. This shifted climbing speed from a purely passive reward to something with immediate feedback. As a final bonus, you’d jump 15s of your climbing rate upon scoring a KO. - Climbing Fatigue: As mentioned earlier, this was originally an idea from the “Persistent Tower FFA” concept. In our first tests, some players would be able to survive for absurd lengths due to being much better than everyone else (25-35 minutes in extreme cases). Fatigue was implemented as 5 stages of stacking debuffs starting from 8:00 with the final one at 12:00.
One of my key principles that I stuck to was trying to make fatigue feel unintrusive. Even at max fatigue (+10 permanent garbage, +50% received garbage), you’d still get to play the game for a bit longer and clutch some extra meters. - Targeting Factor and Targeting Grace: To address the targeting issues and make sure that garbage is properly spread across players, these 2 values were added to the game. A player’s Targeting Factor is a stat that naturally increases as they survive. Each time you attack, a new target will be picked based on a weighted RNG calculation. Opponents with a higher Targeting Factor will be more likely to get chosen.
Upon getting attacked, you will gain Targeting Grace equal to the amount of lines received. Each stack would decrease Targeting Factor by a bit. Targeting Grace would effectively grant players a grace period after being hit so that they have a chance to downstack and diverting more garbage to players who haven’t been attacked in a while. These systems helped immensely with making sure that the garbage distribution was balanced properly. - Floors: Floors served 2 important purposes. The first was as a milestone for players to strive for. Trying to push for a new high score and being met with a new environment is much cooler than just watching a number go up.
The second was for difficulty scaling. Certain numbers like messiness or garbage delay could be tied to floors, which would make the difficulty more consistent instead of solely based on the players present at the time. - Bot Garbage Tolerance: While not a change to the final game, I noticed that it was extremely hard to get KOs due to bot stalling. Even in playtests with real people, you’d struggle to get KOs due to the bots eating up your attacks.
Bots were made to not only spawn with an APM stat, but also a “Garbage Tolerance” stat between 15-25. If a bot has above their garbage tolerance in their garbage queue, they will immediately top out. This made KOs a lot easier to get, and would also better simulate a playerbase hierarchy (the bots who are best at both APM and survival will reside at the top of the tower by natural selection).
With all of these changes in place, our tests started looking better. We went from “bad” to “ok”.
1 month later (forgive my poor play I was out of practice)
The game starts becoming “good”
Up until this point, Zenith Tower has been trying to accommodate players of every skill level. This ranges from new players all the way up to the top 10. As a result of this lack of direction, the experience became worse for all groups. This all changed with the Normal-Expert split.
The Normal-Expert split was an effort to split up mechanics for the “bottom 85%” and “top 15%”, and then putting them under a normal and expert mode. This includes things like garbage messiness, garbage delay, climbing speed lenience, etc. This made it so the majority can experience more floors of the tower, while elite-level players can still find difficulty when surrounded by lesser opponents.
By far the biggest improvement from the split was making non-combo singles send 1 line in normal mode. If we break down our methods of difficulty scaling in QP2, it includes things like increasing the chance of getting targeted, multiplying the lines you receive, or increasing the messiness. The one thing that these all have in common is that they require players to attack.
On a macro-scale, players who don’t attack are wasting targeting space without contributing to the garbage economy. The idea was that if we are able to make sure more players are consistently attacking, it’d also increase the consistency of every other system as a result. This single change was the cure to several problems that I had thought would require much more work.
the game starts coming together
In this update, we also added the scrolling parallax background. We handled this by having me draw composition sketches for all 10 floors, and then giving those to artists to turn into finished backgrounds. This way, we’d be able to use the sketches as a placeholder and swap them as the final versions come in.
Mods and Achievements
Now that the tower climbing experience was in a good place, the next major issue to tackle was replayability. Our solution to this was mods and achievements.
The idea of mods is pretty simple. To add more ways to play, you can mix and match mods that augment the gameplay of your run. However, there were 2 key design decisions that would be crucial in shaping how they work:
- Difficulty: There are 3 different types of modifiers that can exist. Ones that make the game easier, ones that make the game harder, and difficulty neutral ones which just bend the game’s rules.
From the outset, I already knew that I didn’t want difficulty decreases. This is because it’d ruin the progression of seeing more of the tower as you improve, and make the experience of reaching a new floor less special. I also wanted to avoid having players perceive more or less “legitimate” ways of accomplishing something. If you reached floor 10, it means you were skilled enough to reach floor 10.
The original plan was to make the rest of the mods a mix of neutral and difficulty increase mods. For example, the original version of Allspin was just a modified attack table with spins enabled but reduced numbers overall. Later on in testing, I decided to shift to all mods being difficulty increases for clarity’s sake. If you take a mod, you can generally expect the game to be more difficult as a result. - Reward: If mods are going to increase the difficulty, what’s the reward? The most obvious solution would be to give each mod a height multiplier, but this introduces a few problems.
The first is that it messes with height-difficulty balance. Let’s consider an S rank player who plays at a similar level to an A rank player when using No Hold. On a macro level, it makes more sense for a player attacking and surviving at an A rank level to exist amongst other A ranks in the tower. Adding an altitude incentive for mods would disrupt this balance.
The second is that it makes the mods more about final score rather than the added challenge. Mods that are deemed impractical won’t see play, and mods that can be used without interfering with gameplay (such as Invisible) must be learned to set top scores. Judging all combinations of mods by a single number would rule out most possible combos, reducing the amount of viable ways to play.
Finally, all of this would be a balance nightmare. How do you quantify the difficulty increase of Invisible? What about Double Hole Garbage? Volatile? The difficulty also changes as players adapt and discover more about the game. Once players overall get better at Allspin, should you nerf the mod’s multiplier? Does that warrant a leaderboard wipe? The changing of past scores? Trying to value everything into the final altitude creates many questions that would require way too much continuous attention to solve.
Upon considering the implications, I decided to shift the reward towards Achievements.
The achievement system solves this issue by giving self-imposed challenges their own mini-categories. Instead of trying to compete on a single leaderboard, players can compete within smaller niches. It’s also a very good system for adding replayability to existing and future modes since we can create new ways to interact with a gamemode. For example, Mr. Boardwide adds a new way to play 40L and Empty Box adds a new way to play Blitz. It also added more long-term progression to the game, making each session feel like it was contributing to something larger.
osk's early sketches for achievements
With these 2 additions, QP2 gained a huge amount of replayability and appeal, especially amongst veteran players. If you’re getting bored of playing one way, it’s very easy to switch it up and try a new category. Mods and Achievements were the final push from feeling like a test product to a fully polished game.
The future of TETR.IO
With the success of Quickplay 2.0, that brings us to a new question: what’s next for TETR.IO? In the future, you can expect:
- Fresh and High-Quality New Gamemodes: Similarly to QP2, you can expect more new major gamemodes with not just a high level of attention to game design, but also to art, music, sound, and UI. There’s a lot of room for creativity in the block-stacking space, and we’re looking forward to exploring it!
- A Focus on Longevity: With such big projects, it’s important that each gamemode remains fun long after release. This involves adding replayability into the gamemode itself, but also through continued support with smaller content updates. With QP2, we plan on continuing to release new achievements, improve the game through patches, and introduce limited-time gameplay content for events.
- Stronger Theming and Worldbuilding: I didn’t get to touch on it much in this post, but writing has been another major focus for me as the creative lead. This can be as simple as the Allspin achievements being different types of artists, or as broad as Zenith Tower’s purpose and it’s place in a greater world. Some of you may think “it’s just tetris it’s not that deep”, but I’ve found that this kind of attention to detail adds a lot of appeal and polish that simply can’t be found through gameplay alone.
That’s it for this post! If you want to read more, check out the post on my personal blog which covers the inspirations behind QP2 (as well as more info about the game’s world).
Also follow me on X @garbocan_
With that being said, thanks for reading! We look forward to showing you all some more cool TETR.IO updates!