blog master mode
subscribe
preview

The Design of Quickplay 2.0

by garbo at 2024/11/16 (Sat) 2:05:35 amTETR.IO3RD

Quickplay 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:

  1. 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.
  2. 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!

The Internet Event Horizon

by osk at 2023/07/03 (Mon) 2:26:21 pmPERSONAL

Throughout its history, the Internet has seen a lot of change. What started off as a simple collection of servers hosting barebones pages with an image or two, mostly containing text and links, has turned into a deeply connected yet somehow very centralized set of applications that bring us together.

Of course, the Internet wouldn't exist if it was not profitable, so the leader of Web monetization was pulled in: the humble banner ad. The very first banner ad was purchased in 1994 by AT&T and was very to the point:

It was a massive success. Almost of half of the people who saw it clicked it! You can't say that about ads nowadays, where about 1 in 1,000 tend to click on ads. As soon as this ad went live, others took up the same idea. In fact, this ad format (albeit slightly larger, to fit with our modern screens) is still what drives the majority of the Internet's profitability today, even 30 years later.

The Bubble

Once the world recovered from the dot-com bubble bursting, the Internet once again took upon itself a path of near unstoppable growth. Of course, the Internet has seen changes. The iPhone sparked the world of the mobile Internet and apps, highly increasing the centralization of the Internet. What used to be a large collection of disparate websites has been clobbered into single megasites that do everything. In 2007, the top 50% of internet traffic came from many thousands of Web sites, whereas nowadays, the top 50% of traffic consists of Netflix, YouTube, Disney, TikTok, Amazon and Facebook, with some random large downloads in there like PlayStation and Xbox downloads (because of how ridiculously large games have become). This goes hand-in-hand with the nature of mobile phones, using apps you get in a centralized store as opposed to free-floating websites.

In addition, the Internet has seen many changes in how it addresses ads and monetization. The early Internet just used banner ads, but for a short while, pop-ups got dominance, simply for being higher-impact. Of course, pop-ups were not only obnoxious, but often malicious too, so they were relatively quickly destroyed — first by users using pop-up blockers, then by browser developers themselves. YouTube instead sparked the concept of video ads, a far more valuable but also more annoying form of ad.

But, monetization itself has changed, too. While ads wouldn't randomly go away, the early Internet's sites had a starkly different approach to how they should exist in the larger Internet. Mainly "Web 2.0" was of interest, the concept of making your site really easy to connect other sites to. For example, your own site could display things people are saying on Twitter. In fact, Web 2.0 was Twitter's claim to fame! Twitter was originally meant to be usable through SMS (hence the 140 character limit), but instead, its ability to be used completely programmatically became its selling point. Up until now, you could see many places show live Twitter feeds, and helpful bots write to Twitter in the same way. For a long time, the existence of an API (the way programmers can connect software together) for a site was almost a given.

In more recent years, however, that has changed. As centralization kicks in, once you are a major player in the market, there is simply no need to bother integrating anymore. Rather, sites want to keep their content to themselves, and ensure you don't see it without also seeing their ads. The prevalence of APIs has gone down massively over the last few years.

The Squeeze

Indeed, as time went along, the centralization of the Internet and its obsession with constant growth has created a painful duality. On one hand, information on the Internet wants to be free. People want to be able to visit sites at any time, without payment, and do their thing. Website owners want their sites to be useful, to fit the purposes they are supposed to serve. Developers like the concept of APIs, making cool new projects possible.

But investors want to see money. I talk a bit about the problems with this growth in a previous blogpost titled "Optimizing for time waste". There, I talk about Google, specifically. Google used to be revered as the search engine, always able to show useful results. Yet nowadays, Google is a husk of its former self, only serving spam and ads, begging you to either stay on Google's premises (to see more ads) or to click a bunch of links to sites Google has ads on.

Once the Internet gets centralized, there is nothing other than morals stopping the owners of the large properties from turning on their users and trying to squeeze them for money, instead. Over the last years, this has become harder and harder to uphold, but luckily, the ad business has only been growing. So, as long as the ad business doesn't collapse, and no other strange things happen, we should be OK, right?

...

The Singularity

Uh oh.

In an unstable economic climate, one of the first things to tend to get large cuts is advertising. So after multiple years of global problems, the advertising market is finally buckling. Of course, this isn't the first time economic downturn has caused lower advertising spend, but with the current centralization, the effects are a bit more noticeable.

And there's another thing. Generative AI (ChatGPT, Stable Diffusion, etc.) have shown that aggregating a ton of data from the Internet and forming a neural network out of them tends to work pretty well now. This means that a neural network will be able to give you content from webpages, by simply programmatically downloading them once and extracting the text (scraping). This creates a strong competition against those sites, since now you won't be seeing their ads anymore. As sites have grown to be as human-unfriendly as possible, shoving in as many ads and popups and cookie notices and newsletters and paywalls as possible, the moment they get caught up to is here.

ChatGPT has, within a short amount of time, destroyed the premise of most of the monetization of the Internet. Coupling this with bad advertising climates means... our Web as it is now cannot hold.

The Supernova

We're already seeing the effects of this unfold. YouTube is starting to block users from using adblockers, Twitter and Reddit have immediately destroyed their APIs, and Twitter's going even further, destroying their entire site by only allowing you to read 300 Tweets a day, and only if you're logged in (hey, if nobody can access the content, nor can bots, right?). It's a race to survive, trying to ensure your site doesn't become irrelevant.

So what's next? Well... it depends on where generative AI is. Nobody can predict what happens if it keeps growing, but if the growth spurt of AI is just a one-off thing, and doesn't get any orders of magnitude better than it is now, then it simply means the death of any chance of decentralization of the Web. It's already very entertainment and social media-focused, so the large players will simply lock off their content even more. Search engines will be a thing of the past, as the spam they procure has become completely irrelevant. Banner ads as a format will die out and get replaced wholly by subscriptions and video ads.

Is this a bad change? It's hard to say. I hate the concept of losing APIs, seeing DRM, paywalls etc... but at the same time, such a large purge might give the remaining sites more room to create better experiences. Then again, that puts a lot of trust in companies to care about making a good product, as opposed to just caring about the bottom line.

It's scary to see Internet history occur in real time, especially as a relatively large player. In the end, the hope is that the Internet doesn't devolve entirely to a toy. What do you think? Where do you see the Internet in 5 years, considering the quick change we're seeing now?

The new oskstatus is here!

by osk at 2023/06/24 (Sat) 8:41:23 pm (edited)PERSONALUPDATEOSKWARE

If you've ever looked at status.osk.sh before, you might have noticed it's not very good. That changes today! I've rewritten it from the ground up, as a proper site as opposed to a hacky PHP script. Go and check it out!

This has been in the works for quite a while! I originally started working on it last year, around late August, but simply didn't manage to get it off the ground. A recent multi-hour outage that should've been totally preventable (...I was asleep, I just had to restart MongoDB) spurred me on to get back to work on it, to solve the problems that led up to it.

I've always hated the way the modern status page works, and this is also represented in my previous status page. Modern status pages (Discord's status page is a prime example) aren't actually status pages, they're PR tools. In fact, Atlassian Statuspage (the most popular status page software, the one Discord also uses) expressly tells people not to automate their statuspage. Atlassian themselves say they're "big believers in maintaining a human touch with incident communication". However, that undermines the main purpose of a statuspage, to answer the question: Is the site broken?

The previous statuspage did just the bare minimum to answer that question, the one I deem most important. Quite literally, it just showed "ONLINE" or "OUTAGE". All automated. And with that, it's already better than whatever Statuspage is doing. In the new statuspage, I highly increased the amount of information, as there's a lot of nuance that a single boolean can't show. For example, I show the amount of players online, so if suddenly an entire continent has problems connecting, it'll be visible even if the statuspage server can still reach the game.

However, there's one more followup question that users tend to have if something ends up being broken: how long will this last? The new statuspage lets me write incident reports, so as soon as I notice something's up, I can write a reason why, and give insight on how long I expect things to take. To add credibility to those insights, you will be able to see all past incidents. That way, instead of creating trust by lying to customers with a blog disguised as a status page, I hope to create trust by showing the real situation, and explaining it where needed.

In addition, I added the ability to schedule maintenance on it. That way, if longer maintenance is coming, you'll be prepared. Of course, I'll still also post notifications about such maintenance on Twitter and Discord.

Of course, these aren't "new" concepts, but it seems like the concept of an honest statuspage that shows real data as opposed to a glorified blog has fallen out of style. I hope you won't need to look at it often, but if you ever do, I hope you'll appreciate the attempt at creating a realistic, honest statuspage!

Is TETR.IO legal?

by osk at 2023/04/17 (Mon) 9:34:15 pmPERSONALTETR.IO

This question comes up from time to time, mostly from people who haven't been in the community much. With the recent release of the Tetris movie all about the legal rights behind Tetris, I thought it'd be interesting to go over what exactly the Tetris company owns and doesn't own, and how TETR.IO can exist alongside licensed Tetris games.

NOTE: I am not a lawyer, and this blogpost does not constitute legal advice. These're just my personal ramblings, so please don't interpret them as anything more than an opinion piece.

A little backstory

Tetris is among the largest genres (as a subgenre of the falling block puzzle genre). There are literally thousands of Tetris games, with new ones created on a daily basis. Tetris is, at its core, an easy game to create, and one that's very often used by new programmers to get into games programming. This all makes sense, considering the game is 38 years old by now, originally made in 19851 in Russia to run on, well, the hardware at the time! And yet, the game, in what's mostly still its original format, lives on and on.

1: Not 1984. The 6/6/1984 date is made up by The Tetris Company for the sake of a 25-year anniversary party at E3 2009, nothing more. Before this E3, official sources repeatedly state 1985, and sources close to Alexey also corroborate this. Read more here.

Tetris has always had legal troubles—if you've watched the 2023 Tetris movie, you'll know the gist of it. The movie uh, exaggerates things a bit, but getting the legal rights to the game was definitely tricky, with a ton of confusion as to who exactly has the rights to the game. It was Dutch game designer Henk Rogers who managed to come out on top and put together The Tetris Company (which I'll refer to as TTC from hereon out for brevity), mainly after recovering the rights to put the game onto the Game Boy as its pack-in title, which gave the game center stage and made it into the massive genre it is today.

Of course, that was 38 years ago. The question of what rights existed to Tetris was already a tough one then, and the situation has only become more complicated. Let's see exactly what intellectual property rights TTC could be holding on the concept of Tetris, and analyze them one by one to narrow them down.

Copyright

Copyright does not protect concepts or systems. To quote the U.S. Copyright Office FL-108:

Copyright does not protect the idea for a game, its name or title, or the method or methods for playing it. Nor does copyright protect any idea, system, method, device, or trademark material involved in developing, merchandising, or playing a game. Once a game has been made public, nothing in the copyright law prevents others from developing another game based on similar principles.

Simple, huh. Copyright law does not protect the concept of Tetris in any way. Copyright only protects specific works. For example, the blockskin (the image that makes up the blocks) in a game, the writing of a game's manual, or the specific programming code of a certain game. Copyright protects a lot, but it does not protect the game's concept itself.

However, don't forget the concept of copyrightable expression. This concept states that despite the fact copyright doesn't cover concepts, it does cover the expression of those concepts, if done in a way uncommon to the genre. For example, while the concept of a health system isn't copyrightable, and nor is a simple progress bar to display health (because everyone does it), a special health bar that looks wildly different from any other you generally see in games may be copyrightable as a design work, for the amount of "abnormal" expression it adds to the basic concept of a health bar is notable. Tetris does no such thing, the few artistic choices it makes are very much standard decisions that either hold no artistic value or are made out of simplicity/necessity. We'll get back to this in a moment, as there's another concept very similar to this one.

Patent

The main (and practically always only) way to protect a concept or invention is by means of a patent. Patents are specifically made to protect a concept, system or invention for 20 years, after which it enters public domain.

Tetris, being made in Soviet Russia, is not patented. Even if it was, said patent would have expired almost two decades ago. Therefore, patent law only encourages competition in this scene.

Note: TTC does have some patents regarding specific types of touch controls for mobile Tetris. However, nothing that protects the game itself.

Trade dress

Here's the interesting one. When it gets down to the wire, TTC likes to claim trade dress. Trade dress is a type of trademark. Trademarks are a type of intellectual property to protect your brand and its identity. Most people will know trademarks for logos and business names, but trademark law also protects the "look and feel" of your brand, called the trade dress. For example, take Coca-Cola. The curved shape of the bottle, the deep red label with white cursive text. It's distinctive and noticeable from afar, and creates a brand identity that goes deeper than just the name "Coca-Cola", the logo, or the product itself.

Every element to be protected by trade dress has three requirements:

  1. The element must be non-technical. Changing or removing it must not alter the base product in any way.
  2. The element must be meaningful to public recognition. That is, people recognize the product/brand based on this element.
  3. The element must be confusing if copied. If copying this element doesn't confuse customers of the source of the product, it does not infringe trade dress.

Let's apply this to the Coca-Cola example and see how trade dress works when all three requirements are fulfilled:

  1. The way the bottle looks, and its label, has no effect on the actual product, the contents of the bottle, and is as such non-technical.
  2. The shape of the bottle and especially the color of the label is very distinctive, and many people recognize the Coca-Cola section of the aisle from far away in a supermarket. It is very much meaningful.
  3. Copying these elements would create severe confusion, as people have become accustomed to the branding of Coca-Cola. If a customer grabbed a curved bottle with red/white label and it turned out to be Pepsi, they would be rather confused.

So that's how trade dress works, and how it protects brands against people leeching off of their visual identity and people's recognition. Now for the interesting part, we'll go through the concept of Tetris, and see how much of it falls under trade dress. We'll work by process of elimination, since all elements must fulfil all requirements.

Let's begin with the second requirement, the meaningfulness requirement. Let's quickly think of what elements of Tetris are the ones that people recognize the game by. There's a lot of elements to Tetris, but most of them aren't what drive public perception, after all. I think it's fair to narrow down Tetris, and the elements that people recognize it by, to the following:

Tetris is a game where you move and rotate square geometric shapes, which fall to the bottom of the screen and pile up. If a line is filled horizontally, it disappears and the player receives positive feedback. If the shapes reach the top of the play area, the player receives negative feedback.

I believe this to be a very apt representation of the elements of Tetris. Removing any element here would stray so far that people would stop calling it Tetris—for example, if the shapes weren't simple geometric shapes, people would no longer recognize a still image as Tetris. Similarly, if pieces didn't pile up, people would stop believing it's Tetris after seeing even the smallest bit of gameplay. At the same time, any additional other elements added to this (colors, hold piece, other rules, effects, specific ways the game rules work, etc.) are extras and don't impact people's recognition of the game. For example, the dimensions of the screen don't matter, as people would recognize these elements as Tetris on a wide board just as well as they would on a thin one.

So that narrows down our list of trade dress elements to those few. Now to get to the first requirement, the non-technicality requirement. Is there any element here, that if changed, doesn't impact the game in any way? Are there any elements here that are only cosmetic? Try it, look at the outline above and try to come up with a change to them that wouldn't impact the game in any way. ...It doesn't exist. There are no elements to Tetris that are both meaningful and non-technical. By the way, you can use this same technique on the "copyrightable expression" idea for all of these. You'll find every artistic decision is either meaningless or made out of necessity.

Trademark

Tetris, however, is covered by trademark! As in, the name "Tetris" is, and so is the logo. Well, in theory if the game rules are proven in court to be unprotected, there is a path for the name "Tetris" to be unprotected as well, as becoming a generic word to describe the game genre. But, proving the genericization of the trademark is a bit tougher than proving the lack of protection on the game itself.

The DMCA problem

So there you have it. TTC essentially only controls the trademark on the word Tetris and the logo. And yet, there's a problem.

DMCA.

DMCA law is pretty simple. It states that, if some company (the "platform") publishes someone's (the "uploader"'s) content on their behalf, then a rightholder can send the platform a takedown request, and as long as the platform always agrees and takes it down immediately, the platform will not get in trouble. In essence, it means that as long as the platform complies with all takedown requests, they can't be sued, a "safe haven" of sorts. It also gives the uploader the ability to send a counterclaim, which is sent back to the rightholder, who can either accept the counterclaim (or not respond within 2 weeks) or send the case to court. If the case is taken to court, the content will remain taken down until the court reinstates it.

...Uh oh. That text in bold is a bit more crucial than you might think. Because while content is taken down, it cannot be monetized. And court cases are expensive. There's a deep-rooted problem here...

Let's explain. Imagine you are a small game studio, and you make a tiny mobile game. You put some ads into it, and somehow, the game actually does kinda well! You manage to make enough to pay everyone, when suddenly—! Some crazy company (let's call them "Big T") sends Apple a DMCA takedown notice! Of course, you know you haven't actually infringed their rights, but Apple wants to keep their own safe haven, so they remove your content. Your revenue drops to 0 within the blink of a second. Of course, you send a counternotice! You're in the right, there's no denying that!

Following the standard procedure, the counternotice is sent over to Big T, who promptly deny it and take you to court, while your revenue is still sitting at 0. Now, you are at a crossroads. Big T has a lot of money, and they will stall the court case for as long as they please. You, on the other hand, have very limited assets, and every minute spent in court you are bleeding money, creeping closer to going bankrupt. What do you do? Do you fight and go bankrupt, or do you give up?

This is the decision that faced Xio Interactive for their mobile game Mino, when the case Tetris Holding, LLC v. Xio Interactive, Inc. was opened against them following their counternotice. Of course, Xio Interactive had no choice and did not oppose practically any of the claims TTC made, to let the case end as swiftly as possible. It's a massive shame that instead of seeing the deserved upset, TTC sees a victory based on technicalities giving them an unfair edge.

Most people receiving a DMCA don't even get to this point. Almost nobody bothers to send a counterclaim. Not because they don't believe in their own case, but because they know the system is rigged against them. TTC, on the other hand, like all large rightholders, loves this. They send out mass DMCA requests, because they know it's safe. They know that most people won't fight back, and that even if they do, they're at such a disadvantage that there's no danger to TTC at all.

You might think this is uncommon, but TTC has become very ligitious lately following a long hiatus. From taking down simple fan projects to stopping a new game (Tetra Online) from blooming, TTC is once again very much interested in ensuring they get no competition at all.

TETR.IO and The Tetris Company

So where is TETR.IO in all this? Well, I simply ensure it's not easy to strike me in a way that puts me at a disadvantage. I don't use software distribution platforms like Steam (despite even having been invited to such platforms), nor do I publish for mobile app stores. Doing so would put me at risk of becoming the underdog in a DMCA lawsuit, which is an impossible task to win unless you already have the assets.

Instead, TTC would have to sue me directly, which would put us at equal footing. Considering how much TTC has to lose if they were to lose a lawsuit over their IP, this is not a fight they're willing to pick.

...And nor am I. I respect the work of The Tetris Company in many areas, allowing us to enjoy this quite special genre which might otherwise have never left Russia. I much prefer this laissez-faire situation over one of constant legal battle. Rather, this post is an appeal, in the hopes it might help give Tetris back to the community. I would love to see a future in which TTC works together with the community to elevate Tetris to be truly something special, to be more than "that game everybody knows but only plays once every 5 years".

...Or at least that they stop thinking anybody wants a Tetris waffle maker.

Photo of a Tetris waffle maker. Yes, it exists.

Image credit: Firebox

Optimizing for time waste

by osk at 2023/02/16 (Thu) 9:42:58 pmPERSONAL

Ever noticed that when you click a link on Google, then come back to try and click the next link, a box with similar search queries spawns in about a second later, right as you're about to click the next link, causing you go be sent off to an entirely different search query?

It's been around for quite a while (early 2018), and despite constant complaints from users, to the point there's even an extension that disables it, it doesn't seem to be on its way out any time soon, either. Why, when this "feature" is among the most hated parts of all of Google Search? Why, when Google themselves don't just advise against doing this, but actively lowers pages that do this in search results? Even if they're an Agile™ company, an error like this wouldn't fall through the cracks, let alone with such hypocricy, right?

And the more you look, the more strange events like these pop up—take for example the categories ("Web", "Images", "News", "Shopping"...); it is almost never to anyone's benefit to randomize the order of these should-be-stable elements, let alone stuff a bunch of other junk in there (indistinguishable from the thing you wanted):

What's going on here? These aren't reverted like the usual "oops"es, so why is Google actively trying to divert you from your task, from the answer you seek? And while we're at it... doesn't it feel like Google Search used to be...better? A lot of results nowadays are just (seemingly) autogenerated spam, made specifically to cram as many ads in and get the highest search ranking... Where's the content?

Where Growth Ends

To understand Google's decisionmaking, we need look no further than their revenue breakdown—the great great majority comes from ads. In fact, almost all ads you see in browsers are Google ads. Google has practically monopolized the advertising space on the Web with their intense monopoly: a monopoly on search, as well as a monopoly on browsers, one they are happy to keep pushing. In TETR.IO's case, a jaw-dropping 95% of players use Chrome, or a Chrome-like browser (e.g. Brave, Opera, Microsoft Edge, etc.). They all run modified versions of Chromium (the open-source base of Chrome, also developed in-house by Google), and thus inherit any changes by Google. For all intents and purposes, they are Chrome reskins. (Not that it matters, as Chrome reskins are still in the minority, making up only about 9% of players.)

So, in terms of occupying the advertising and browser markets, Google has no way to increase their revenues and keep investors happy. The growth of the advertising market on its own isn't something Google can truly influence (and increasing their cut would only harm this). So how else can Google grow?

It's a simple question, but since Google relies on ads, we need to take apart when exactly Google makes money. In specific, Google mainly makes money when it can either show ads directly on its own content (and get a 100% cut), or when it can send you to any page that serves ads through Google's network (and get a smaller cut). The more ads on the result page, the better. The problem is, people don't spend 100% of their waking days on Google properties, or even on the "general Internet" at all. Since this is the only place where Google can increase their revenues.... what can we do about this?

Optimizing "engagement"

Let's get to work then! Let's take an example user. They might be doing something productive (let's say, writing a document), and suddenly they need to look something up. Let's make a chart for that:

Here, the user searches something, looks through the search results page, clicks a result, then finds the answer they were looking for. In this time, Google got to serve 2~4 ads themselves (in the Search page), and the site owner of the result page got to serve another maybe 3~4 ads. That's good, and makes for a good user experience. The user finds what they were looking for in no time, and can go back to being productive.

...

This isn't very lucrative. What if I told you we could turn those simple "3 or so" digits into maybe, 10 times as much? Keep the user searching for 10+ minutes? No reason not to, there's no alternatives anyway! After all, the point of ads is to market in human attention span. Let's redo the chart to something better:

Look at how much more time is being spent on Google and sites with Google ads! Total searches are tripled, link clicks quintupled, and above all, our revenue from this interaction has increased manyfold! Now, the user searches for something, gets to a spammy AI-generated site filled with ads we get a cut from, tries a bunch more, then accidentally clicks to a new search term (allowing us to serve new full-price ads at the top), gets to some more spam, tries another query, and only after a long time of being "engaged" leaves Google!

This might sound dumb and exaggerated, but this is the reality that comes up when Agile and data-driven development becomes the norm. Data-driven development is just a fancy name for ignoring the big picture and hammering down on optimizing specific numbers (KPIs)... and those will always include revenue and meaningless stats like "engagement". It is not a coincidence that the hitbox for the related search terms exactly overlaps the hitbox of the next search result:

Side note on those spam sites: why would Google remove them? It's a question with a simple answer: they wouldn't, as they actively increase Google's revenue.

The Death of Web 2.0

If you think this might be an isolated case, look again. This is all around us on a massive scale. As soon as a company has grown to a size where it cannot gain new users, it instead looks to gain more "engagement" from said users. It's pretty logical when put like that—but when applied to search engines or other productivity tools, it goes against their purpose. This also explains another aspect of why search results are so low-quality: many modern sites don't want to be indexed anymore. How often have you clicked a search result to end on a loginwall? Sites want to protect their own growth by locking you into their platforms, too. They don't want you jumping in, getting the info you need, then leaving.

In essence, we're witnessing the true death of what we used to call Web 2.0 - the web as a publicly available writeable interconnected network of information, where anyone can get the information they need within a few clicks. Instead, the Web has become a set of massive islands, purposefully isolating themselves from all others, and making sure you stay there for as long as possible.

After all, a product is a means to make money. There's no reason to care about the overarching quality of your product when it doesn't increase your KPIs in the short term!


Have you run into similar things like this? I'm wondering about other people's interactions with KPI-focused UI design like this, and foregoing all user experience or even the core of a product for bottom line gains. Let me know your experiences in the comments!

For a while, I've had multiple policy documents kinda randomly thrown around my websites. For example, branding information on a subdomain, the promotional kit policy on the blog... And, even though I use Matomo on all my sites, there wasn't really a formal privacy policy or ToS on them, it was simply implied the same as the TETR.IO one would be followed. (This is true, albeit slimmed down, since there's no ads etc. on them.)

For this reason, there is now a proper knowledge base over at txt.osk.sh! It hosts the branding information (unchanged), the promotional kit policy (changed due to abuse, see below), and a new overarching Terms of Service and Privacy Policy pair.

The osk General Terms of Service and Privacy Policy

From today on, all osk services will be governed by the General Terms of Service. The ToS is very simple, and is very similar to what you're used to on TETR.IO (no liability, no guarantee of fitness for any purpose, reservation of right of removal and cessation).

In addition, all osk services will follow the General Privacy Policy. It, too, is very simple — I use Matomo to get analytics, and that's it. I don't sell that data.

These documents act as a fallback for if no other document is specified. For example, on TETR.IO, its own terms of service take precedence. As such, on TETR.IO, you agree to both the osk GToS and the TETR.IO-specific ToS. If any TETR.IO-specific clause were to clash with the GToS, the TETR.IO-specific clause takes precedence. Pretty simple, right?

The Promotional Kit Policy

From today on, the distribution of native advertisements on TETR.IO (the "promotional kit") is governed by the new TETR.IO promotional kit policy. The previous blogpost is now deprecated. In addition, a new page helps shed light on the nature of the promotional kit for players.

The most important and notable changes to the kit include:

  • All sponsors and advertisements related to your event/advertisement must be declared. This means, if you plan to run a tournament, and there's any sponsors, you must declare who your sponsors are, the associated deals, and how this impacts any of your content (will you be doing sponsored segments? giveaways? etc.). Failure to declare a sponsor or advertisement is deemed fraud.
  • In the case of events where smurfing could pose a threat, sign-ups must close at least 24 hours before tournament start. This to ensure you have the time to go through user lists and weed out bad actors before they're stuck in your bracket. TETR.IO staff can help you with this.
  • From now on, there are no exceptions to the "all information must be handed in 14 days prior to flight date" rule for events on the free tier. If you are too late, you will be required to pay a premium or be rejected, period.
    • As a reminder, flight date is when the campaign starts, NOT when the tournament starts. If you want a banner to go up on the 18th, THAT is the flight date, no matter when the event date is. If you make this mistake and submit information 14 days prior to event date (and not flight date), you WILL be rejected!
  • More attention is brought to the fact this kit is a gift. A community leader is never "entitled" to (free) usage of the kit.

Tetralympic S3

The new policy is rather strict, in particular toward sponsorships. While this may seem rather untoward to tournament organizers and the like, it's important to remember that the promotional kit, in particular the free tier, is a very large gift. Advertising is not cheap, and the price of a banner lies in multiple thousands of dollars a day. I care very much for the community, and wish to promote its events. Not only does this in turn help promote the game, it also allows me to give back to the community. Nothing forces me to give out 5 digits worth of advertising to the community, or to stay awake to 4am just to develop a specially-made banner. It's a free gift to the community, from the developer of a game that in turn is also entirely free-to-win.

It is for that reason that it hurts me a lot when some show a lack of respect toward it (just seeing it as a service that's part of the game that they, as community leaders, are entitled to), or worse, abuse it. Throughout the later half of June, I gave out access to the promotional kit (consisting of a banner and 15 badges) to the tournaments Tetralympic S3 SG and Tetralympic S3 Worlds, both led by Skyllabtw (with support from MMC, but they did not handle sponsorships). Throughout the application for the kit (which was already beyond the deadline), there was near to no indication or declaration that the event was sponsored, so I approved it for the kit.

However, the streams were completely different. There were three sponsors (two multi-million dollar corporations, and a supplement company), all of which with large constant on-stream advertisements, sponsored segments, giveaways, chat commands, 10+ mentions per stream, etc. The tournament's website was also changed after I reviewed it to include large, multi-page sponsored segments. This obviously does not consitute fair use of a community resource, and would never ever have been approved for the free kit. I immediately took action by removing the banner, and defacing all the awarded badges for any Tetralympic tournament.

Skyllabtw, the organizer (and sole person in charge of the event's sponsorships), has apologized and states it was a misunderstanding, and that she did not mean to pull in large sponsors behind my back, or leave out any information about them to me until it's too late. She further stated that she did not receive any monetary compensation for the sponsorships (???). In understanding that I am partially at fault for not vetting and verifying applications harshly enough (the previous policy was vague on the subject of sponsorships), I have decided to not let this impact the players who played in the tournaments, and have restored the badges for all 26 total involved players. My gift to the community being abused, be it through fraud or negligence as Skyllabtw states, should not cause these players' achievements to be wiped, considering the event itself was fair and transparent.

To prevent anything like this from happening again in the future, I will be thoroughly vetting any applications for the promotional kit in the future, using these stricter policies. If you are interested in advertising on TETR.IO, be it on the free tier or not, please ensure you have read and understand the new TETR.IO promotional kit policy in its entirety. If you have any questions, please do not hesitate to contact me!

Blog posts are now tagged.

by osk at 2022/06/03 (Fri) 11:22:06 pm (edited)PERSONALUPDATEOSKWARE

To organize the blog a little, the posts on it are now tagged according to their content and nature. There's not that many posts here, but it's still useful to have. You can click a tag, and it'll take you to the index, filtered to just posts with that tag. That way, you can bookmark just official posts or the like. You can also set up your RSS reader in the same way — while filtered to a tag, the Subscribe button in the top left changes to allow you to subscribe to just that tag.

This is one of the many recent changes I'm making to somewhat separate my personal identity (the osk who develops software, likes UI design, rants a lot, and genuinely loves and is in a relationship with Kagari, a fictional character from Rewrite) from my brand (osk, the person and corporation behind TETR.IO, developing, maintaining and directing it). (Perhaps a topic for another post.) Posts that fall under the former identity are tagged PERSONAL, while brand posts are tagged OFFICIAL. This way, I can feel a bit safer writing genuine posts from the heart about my personal interests, without distracting those who are only here for professional press releases. I'm hoping this will allow me to post a bit more often. There's a lot of things I could rant about :^)

To be clear, this is still a personal blog. Press release-like "official" posts are secondary, and I wish to post more personal posts here in the future. If you are not interested in those and only care about me for TETR.IO, feel free to filter to official posts only with this tool.

Please look forward to me perhaps blogging somewhat more often than twice a year!

smash that unsubscribe button mate

Policy regarding TETR.IO promotional kits

by osk at 2021/12/30 (Thu) 2:04:41 am (edited)OFFICIALTETR.IODOCUMENTATION

NOTE: This policy has been deprecated. You may find the current policy here.

This message is primarily for tournament organizers. It is public for transparency purposes.


First off, a heartfelt thanks to everyone who sees TETR.IO as the home for their tournaments, and regards the game as the place to be for competitive stacking! I'm very glad the competitive community has accepted TETR.IO as major game within the community, and of course I will continue to support tournaments that take place on the platform.

2021 has been an amazing year for competitive stacking, and I hope to collaborate with tournament organizers again in 2022 to bring amazing tournaments to the platform and help them thrive. To keep this sustainable and fair, I do want to lay out a few basic rules regarding the promotional kits I make available to tournament organizers, though.

What "promotional kits"?

The TETR.IO promotional kits generally consist of a few elements:

  • The homebanner — a customized ad slot deeply integrated into the game, right at the top of the home menu.
    • You can either use a simple creative in IAB Leaderboard or similar sizes, or let me hand-craft a banner that intertwines your tournament's branding with TETR.IO's.
    • Over 250,000 impressions daily
    • Click-through rate between 10‰ and 20‰ (that's 2,5K to 5K clicks)
    • Not blocked by any adblocker (but adblock users aren't tracked, so you get their impressions&clicks for free!)
  • Ingame call-to-action notifications — a customized notification that engages anyone online (e.g. to watch the tournament on your Twitch).
  • Profile badges — customized, permanent icons on the profiles of tournament champions.

You've most likely seen all of these in action at some point — don't worry too much about the details.

Policy

To make more obvious who is eligible for what kits, and the procedures for requesting one, here is a quick explanation of my policy. This policy goes in effect Jan 1st, 2022.

PRICING

Let's start with the elephant in the room. This advertising kit is incredibly powerful. Anyone would call me an utter fool for giving it away for free. I'm doing it anyway. The competitive TETR.IO community is very important to me, and I absolutely want to keep supporting it where possible. However, to keep this fair, I cannot give out free or discounted kits to everyone. There are requirements to getting these kits for free.

The main dividing line is the nature of the use of the kit. That is, whether the kit is used to inform about particularly notable community events, or as promotional/marketing tool. If the notability of your tournament hinges on being able to advertise with TETR.IO's toolkit, it's generally a no-go. To be clear, exceptions are always possible (most notably, Underdogs Cup was such an exception; it has since grown to be a major, trend-setting community event of insane proportions).

Secondly, please keep in mind the promotional/sponsored nature of a tournament. Having sponsors isn't immediately a problem, but if your tournament is a vehicle for their promotion, I cannot accept it. For example, mentioning your sponsors or showing their logo onscreen is OK (especially if they have ties with the community), but actively advertising for them significantly is not. This rule is somewhat vague on purpose, as it is difficult to draw a concrete line in this space. Please understand that this is handled on a case-by-case basis.

Finally, there should be a clear connection between you and the stacker community as a whole.

If you are eligible:

In general, if you are eligible, the kit is entirely free. I do request that any amount of your choosing (be it €1 or 50%) of tournament proceeds are remitted to TETR.IO. This can be through PayPal/bank wire/Bitcoin invoice, but it could be far more fun to give out Supporter gifts to players or spectators. Events with proceeds below €100 do not need to even consider doing this. In cases where a lot of work is requested (high-fidelity banners, banners with complex popups, work outside of my office hours, etc.), or your given flight times clash with other events, I may request a minimum amount for my time. If this is the case, I will let you know in time, at which point you can change plans to something simpler, or accept and go with the complex request.

If you are not eligible:

The price for the kit is generally dynamic based on amount of sponsorship, promotional nature of the advertised event, amount of audience overlap, etc. Additionally, advertising prices change with the seasons. In general, advertising increases in price as the year progresses, with Q4 being the most expensive. Advertising around events like Black Friday will bump up prices considerably. The same goes for TETR.IO events. Having a lot of banners at once, or very large banners causes the third-party ad slots to be pushed below the fold for a greater amount of users, lowering revenue from these ads significantly.

Due to the ever-changing nature of these things, I cannot give any price estimates on a non-changing blogpost like this one. For any estimate or offer, please contact me. However, please expect to pay quite a bit into the four digits on a daily basis. In certain extreme cases, this may even tip into five digits. If this sounds insane, please be reminded that digital advertising is incredibly expensive. The usual price for a single Google Search ad click ranges between $1 and $2, and can even go into double digits for particularly expensive keywords. TETR.IO's advertising kit gives you thousands of such clicks daily, from a highly engaged, specialized audience who will be very interested in your content, as well as the positive effect of linking your brand and TETR.IO's brand together.

Many payment models are available (per click, CPM, per day...). Please get in contact if you are interested in directly reaching over 600,000 monthly active players of one of the largest stacker games (if not the largest!) in the industry.

FURTHER REQUIREMENTS

This is probably the most important part of this post, as especially the first point here seems to be troublesome.

  • ALL INFORMATION (ASSETS, FLIGHT DATES, ETC.) MUST BE HANDED IN TWO WEEKS (14 DAYS) BEFORE THE FLIGHT DATE.
    • This means, if you want the banner for the tournament to appear Jan 18th (the starting "flight date"), I must have received everything I need by Jan 5th, regardless of the tournament's actual start date.
    • Any major changes after this period are prohibited. Small edits are OK (or corrections to mistakes on my side).
    • Please also let me know of any scheduled changes (e.g. if you want the banner to link to a Twitch when the tournament starts).
    • If you are too late, you may be rejected or requested to pay a premium to have the changes made, for my time.
    • For non-eligible paying advertisers, this does not apply, but please be cautious as I am not always available (I will try my best to have any changes made within 24 hours).
  • Any advertisements of sexual or suggestive nature, any advertisements involving gambling (including social gambling), any advertisements of offensive nature, and any advertisements connected to any of the foregoing (or anything of that nature) will be rejected.
  • Any advertisements for, organized by, or connected to users, corporations, events or other instances banned from the community, silenced/restricted ingame, in a bad standing with their account, or otherwise problematic within the community may be rejected.
  • Any advertisements for, organized by, or connected to users, corporations, events or other instances who are breaking any TETR.IO TOS or other osk service TOS, or any advertisements promoting, condoning, or in any other way connected to any of the foregoing will be rejected.
  • Please do not paint TETR.IO in an unnecessarily bad light in any of your connected materials, or by any of your connected users throughout the event and its surrounding media, releases, etc.
  • Advertisements that do not follow the osk branding guidelines will be rejected. In particular, please ensure to write TETR.IO as such, not as "Tetrio", "Tetr.IO" or any other mess.
  • Please ensure the presentability of the TETR.IO visual design. While using extensions to change the background, add additional effects, etc. or using overlays to create a rich experience is commended, please request permission before changing the core TETR.IO design (e.g. the blockskin, the fonts used, etc.). Additionally, please take care to use a presentable graphics setting. Avoid the minimal and low graphics options.

Finally, please understand that I may reject or remove any element of the promotional kit at any time, for any or no reason. Similarly, please understand that eligibility for free promotional kits is at my sole discretion.


I hope this lengthy post sheds some light on the procedure and policy regarding TETR.IO's advertising kits, and the changes made to them. If you have any more questions, feel free to comment below this post.

Adding ads to TETR.IO, six months later

by osk at 2021/05/10 (Mon) 10:50:14 pm (edited)PERSONALTETR.IO

A little over 6 months ago, I added display advertisements into TETR.IO. This blog post, I want to reflect on these first 6 months, both from the perspective of a player, and that of a developer. I'll be going over the questions most commonly asked by the community, the questions I had, as well as the lessons I learned.

A little background

Back on the first of November 2020, I started a partnership with AdinPlay, to display banner ads in the game's menus. While I was (and still am) very grateful for all the players supporting the game through Patreon, 99.97% of players did not support. While running the game is not incredibly expensive (since a lot of my work in the past year has been on performance), I wanted to be able to go full-time on TETR.IO, as well as build a budget to be able to work on the Character System update. The game was popular, but I was not quite ready to jump onto larger monetization schemes. So, a perfect solution is simply monetizing that 99.97%, the "freeloaders" in a sense.

Just like most players, I don't particularly enjoy ads, though. And to be quite honest, this extends to almost all monetization. Monetizing a game is very much a balance, where you must balance out a good experience with revenue. Looking around the .io game space, the balance seems tipped in revenue's favor. A worryingly large amount of .io games copy eachother, finding more and more ways to sneakily insert ads into the game, get you to click ads, drive in-game purchases, run video ads, and whatever else. This video covers just how much these games are willing to compromise just to drive the best bottom line. I wanted (and still want) to stay away from that side. My drive has always been to make a game I can be proud of, as opposed to a wallet to be proud of. This complicates matters a lot, though.

The Implementation

How do you implement worthwhile ads, without ruining the player experience? This was a question I did not want to avoid (like most .io games do). I ended up settling on the simplest type of advertising: banner advertisements. Technically, I had already been running banner ads for months — those banners above the main menu that announce new features and tournaments are, by all definitions, ads after all. I decided to simply place some ads in the menus, never ingame. Ingame ads, after all, could interfere with the game. No video ads either, everyone hates those.

The next question was getting an advertising partner to partner with. Google AdSense is generally seen as a relatively badly paying partner, so I wanted to find a partner who would both help me more with implementation, and give a fairer price for my ads. Sadly, the world of advertising is pretty hard to understand. I ended up going with AdinPlay. The main reason I went with them, is since AdinPlay specializes in ads on webgames, like .io games, so they would be able to help me kickstart my setup.

Setup of ads is relatively easy. In general, all you'll need to do is tell the library that your partner gives you to load an ad in a specific HTML element, and it will load one. I set up TETR.IO ads to only load the ad currently visible, and to reload an ad after showing it for 30 seconds. All ads also immediately unload when the menu UI hides. Ads are pretty heavy after all, both on the network and in rendering. In fact, when playing about with them, I found it almost worrying how incredibly unoptimized many ads are. Hence, it is vital to make sure the ads are inactive while ingame, especially since TETR.IO requires quick and reliable inputs. Even a millisecond off can cause the game to feel sluggish or slippery.

Deciding on positioning, sizes, etc. is also relatively easy for the most part. In general, you want to be in the way of the player. ...of course, that isn't the plan I am going with. So, I tried to put the ads near the places people will look (near important buttons), but not particularly in the way, either. Obviously, this lowers my click rates, but remember the balance! I would like to stay on the good side of said balance. The Online Advertising Guide is a great source for information on advertising, both for publishers like me, and for advertisers. Some data on there may be slightly out of date, though.

What to Expect

AdinPlay, like most partners, will sell your ads in many different schemes. This is generally not very visible to us publishers, so all we really get to know is a few key performance indicators (or KPIs): ad requests, impressions, clicks (and click rate), and RPM. An ad request is when your site (or in my case, the client) requests an ad, and an impression is counted when said ad is displayed on screen for at least a full second (we can say with certainty that the ad has been seen by the user). Then finally, if the user clicks the ad, we count that as a click.

The magic number here is the last: the RPM. RPM stands for Revenue per 1000 (usually impressions). It's often also called CPM (cost per 1000). CPM is what the advertisers pay to advertise on your site, and RPM is what you receive as publisher. Your RPM is generally controlled by three things: the click-through rate (the percentage of impressions that lead to a click), the kind of content you publish, and the day of the year.

Since I don't let my ads get in the way, my click-through rate is well... abysmal. The average click-through rate around the internet for display ads is about 1‰ (that's 1 in 1000, which lines up neatly with the RPM/CPM metric!). Mine is about 0.2‰. Not so good. This is mostly caused by the fact that the ads are both not in your way, and that most internet users nowadays have become accustomed to ads (also called "banner blindness"). Games also tend to not get super-high RPMs to begin with, compared to say, car rental sites or accountants.

Furthermore, your RPM will almost always start off low. After a few weeks, your RPMs will start normalizing to their normal levels. From then on, your RPM can mainly be changed by the time of year, and the type (and placement) of ads you serve. For example, things like Black Friday will see a spike in RPM, as there will be more advertisers competing for the same ad space. Simply put, advertisers are always bidding on ad spaces, and if there's more competition, ad prices will go up. This also means your RPM will generally go up through the year slowly, go down at the start of every month and quarter (as ad campaigns tend to end at those times), and that January will be by far your worst month.

The Results

Most importantly, community response was far, far better than I expected. Even after taking a step into the dark side, you still trusted me to steer this ship into the right path, and not just a little bit, either — only half a year later, TETR.IO's active userbase has tripled! I'm incredibly grateful for that.

From about 12K users daily to easily hitting 46K users daily!

A bit more on-topic though, RPM was as expected. Since my click-through rate is not particularly high, nor is the RPM. Especially in games, and even more so when trying to avoid invasive ads, revenue is driven by the amount of players you have (and as such, the amount of impressions you serve). Nowadays, TETR.IO gets between 600K and 750K impressions daily, which is the driver for its ad revenue. That way, players who cannot or do not want to support the game otherwise, can support just by playing the game normally, without impacting their experience too much. Of course, a growing amount of internet users use adblock, usually between 33% and 50%, or even worse, they use a browser like Brave which replaces your ads with its own. But remember, that's their decision. I never ask people to turn off their ad blockers. The balance between revenue and a good experience is easy to tip.

In Conclusion

Above all, I am very thankful for everyone's support of me adding ads to TETR.IO. While they don't make me six digits or anything right now, ads together with Xsolla integration allow me to create a budget for future experiences like the Character System update. I hope this post has shed some light and insight on the world of advertising, and, if you happen to be a publisher, has helped you around the more confusing parts of advertising. (Perhaps I could even persuade a publisher to think about the balance between between revenue and a good experience!)

I hope you'll keep trust in me in the future too. I'm interested in seeing in what other ways I can monetize, in such a way that it improves the game, as opposed to simply trying to be a cash-grab. When the Character System update comes out, it could be nice to let users unlock skins (skins for their pieces, as well as other skinnable elements) both by playing, but let there be soft monetization as well (nothing requiring a purchase, but if there's something specific you want, and want it fast, you can get it).

Please, let me know what you think about my current strategy (ads + Xsolla for monthly supporter), as well as future endeavors (be it skinnable game elements, or anything else) in the comments. I read all of them!

ONE MILLION

by osk at 2021/02/09 (Tue) 10:58:06 pm (edited)OFFICIALTETR.IO

Just now, TETR.IO has hit one million total players. Can you believe it? Because I can't. It's been an insane journey here, one I never expected.

Back when I first started developing TETR.IO, just under 2 years ago, I thought it would be incredibly cool if I could make a game that had some sort of meaning to the stacker community. Yet here we are, at what is probably the most meaningful milestone — for example, for a lot of YouTubers, hitting 1 million subscribers is the peak, the validation, the apex — and while of course, most of these players are anons who simply played for a little bit, it's this reach that feels insane to me. In the last year, TETR.IO has had a reach far beyond what I could've ever imagined, being at GDQ Hotfix, being on 10K-viewer streams, seeing 400+ player lobbies, and massive tournaments multiple times a month. Being able to reach so many people, and potentially give them an experience they could think of fondly years from now, is a really, really nice feeling.

And it's all thanks to you — the players, the Supporters, the streamers, the tournament organizers, the YouTubers, the INFDEV testers, the contributors — the believers.

I want to thank you all from the bottom of my heart for playing my game, for believing in me. It's been an amazing journey up to here, but there's no end in sight! A lot of very exciting things are coming up (most obviously the Character System update), and I hope you'll stick around for another million!!!

♥ ♥ ♥

On January 31st 2021, TETR.IO will close its Patreon and partner with Xsolla for swift and secure ingame payments. This means that Patrons will no longer be billed, and the Patreon page will no longer be accessible.
In its place, TETR.IO Supporter will now become directly accessable and purchasable from within the game. The key points:

  • TETR.IO Supporter will be a non-renewing subscription. This means you buy any amount of months in bulk whenever you see fit, and if you don't renew, your Supporter status will expire on its own.
  • TETR.IO Supporter will be a single tier, and contain all the rewards of what used to be the Deca tier.
  • TETR.IO Supporter will cost €5 before taxes. Gifts and any month after the third bought in bulk are €4. So, buying 4 months at once is €19, or €16 as a gift.
  • You will be able to gift Supporter to other players at any moment, just like adding months to your own support.
  • You can add months at any time and your expiry date will be extended.
  • You will be able to manage your Supporter subscription from your account settings at any time.
  • Payments will be powered by Xsolla, allowing you to use hundreds of different payment systems to fulfill the purchase.
  • Payments should usually be processed instantly, although depending on the payment system used there may be a small delay.
  • Refunds will go through Xsolla. The applicable refund policy can be read here.
  • The Perfect Clear tier reward (having your name in the Special Thanks) can be achieved by reaching a certain total amount of support, racked up by buying months and/or gifting months.

I'm currently supporting you on Patreon. What's going to change?

Thank you very much for your support! Don't worry, I've got you covered. Here's what will change for you on the 31st:

  • You will no longer be automatically billed by Patreon.
  • If you were supporting me at Deca tier and up, you will immediately receive three free months of Supporter in the new system.
  • If you choose to not use Xsolla, your Supporter role will simply expire after those three months are up, without any further costs on your side. If you wish to keep supporting me, you may add months anytime.
  • As thanks for your early support, everyone who has been a patron on or before the 31st will receive an exclusive "early supporter" badge! (Note: this is applied by email address. If you haven't received your badge by the 1st, let me know.)
  • You may temporarily lose the Discord role on the TETR.IO Discord. To get it back, simply go into your account settings on TETR.IO after the update, and link your Discord there to get it back.

Why switch systems?

There's quite a few reasons, to be honest. Above all, while Patreon is a very nice system for creators to receive a stable and sustainable income for their work, it is not meant to sell a service on. Patreon is very easy to use if you are say, a YouTube creator looking to receive some support from fans. You can set up simple tiers, show behind-the-scenes footage, talk to fans and quickly export lists of all patrons of any tier for use in credits.

Patreon, however, falls flat when you try to use it for an actual service. While TETR.IO Supporter is still in essence a donation, the rewards bound to it are hard to automate and handle smoothly on Patreon. Patreon's administration and integration is sadly lacking on this front, and understandably so - Patreon isn't made for it! This caused players' Supporter benefits to often be applied late, and require a lot of work to fulfill.

On top of that, the monthly autorenew model of Patreon is very expensive. Patreon in general is known to stack fees quite heavily, but this is increased a lot by the sheer amount of (small) transactions. This is the reason TETR.IO Supporter was so expensive (€10 before taxes for the Deca tier, really?) - the fees for small transactions would cause so much money to be lost it would stop being worthwhile.

Finally, due to being an autorenewing model, Patreon does not support very many payment methods. On paper, it supports credit cards and PayPal, but in reality, PayPal support is limited because a PayPal account would need to have a credit card or bank account linked with it. This caused many people to approach me asking if they could somehow purchase Supporter in another way, which wasn't possible at the time.

That said, I do believe Patreon is a very powerful platform for those it's meant for. Its tools are very strong for creators, and have caused quite a positive change in the industry! I am glad to have been able to use Patreon for the time I have, and I would never have been able to grow as large as I am now without Patreon giving me a platform to receive your donations on.

What makes Xsolla the better fit?

Above all, Xsolla's expertise in specifically games makes for a far better fit. Xsolla's tools are all geared specifically to game developers and players, and can deeply integrate into your work without inhibiting your creative process. This not only makes things a lot easier for me, it also makes purchasing Supporter a lot easier.

Since Xsolla deeply integrates into the game, buying Supporter is easier than ever. You can open up the Supporter dialog from many places, and move on immediately to the purchase process. As soon as your payment is confirmed, you almost always immediately get the rewards. In my testing, I can get from the home menu to being a proud Supporter within twenty seconds, without any need to create accounts, link other services, send messages or other hassle. In the same way, there is also very little work involved in handling Supporter on my end — I practically only have to handle refunds. This means you can get your Supporter rewards within seconds instead of hours (or sometimes days).

On top of that, due to the model I'm using not being autorenewing, fees can be far lower. Due to that, I'm confident to be able to lower the price of Supporter by more than half, while allowing you to buy Supporter freely without being tied to any autorenewing subscriptions. There's this element of subscription models that cashes in on people forgetting to disable a subscription that I honestly very much dislike. Maybe I'm simply not fit for this business, but I wish players to be able to get Supporter without having to worry about yet another subscription in a world where almost everything seems to have a subscription nowadays.

On top of that, Xsolla supports hundreds of payment providers, which means you can pay with just about anything, not just credit cards and PayPal. Xsolla is trusted by many other large games and related sites (Roblox, Twitch, Epic Games, XSplit, osu!, just to name a few).


I am glad to be able to partner with Xsolla to bring you a more fair way to support the game we love. I am incredibly grateful for all the support I have received ever since going into Alpha. We're reaching closer and closer to the 1-million player mark every day, which is a number I NEVER expected to be able to even dream about! I want to thank everyone who's supported me to get this far — let's make 2021 count!

Adding ads to TETR.IO, some questions answered

by osk at 2020/11/01 (Sun) 12:19:03 am (edited)OFFICIALTETR.IOUPDATE

Starting November 2nd, I'm putting ad space up on TETR.IO. I understand this is going to cause some confusion, so I want to answer some common questions in this blog post.


So what kind of ads?

I don't intend to devalue the TETR.IO experience. So, the ads will only be simple banner ads, like this example:

Ads will only show up in menus, never ingame. No video ads, no popups, etc. The site also won't complain if you use an adblocker. At a later point, I may introduce rewarded video ads (ads you choose to watch that get you something in return), but that isn't going to happen any time soon.

The ads will be personalized, so they'll try to be based on your interests. By default, you should receive gaming ads. I will keep care to ensure all ads are safe for work. Furthermore, supporters of Deca tier and up won't see ads.

Why add ads?

Simply said, TETR.IO has outgrown being a hobby project. Operating TETR.IO is as taxing as a full-time job for me, and I want to be able to take it seriously as one. Currently, I'm trying to balance multiple workloads at once, and you might be able to tell by the lower amount of updates that that isn't particularly working.

I am incredibly grateful for all the support by patrons, and that won't change! You are the ones who made TETR.IO happen in the first place. This change is aimed towards the 99.97% of players that don't (or can't) support. Serving ads to that segment of the playerbase will allow them to indirectly support TETR.IO as well!

Having a bit more revenue available would also generally help TETR.IO development a lot. There's a lot of things I cannot do, or don't have the time to do. Think about hiring artists, voice actors etc. Perhaps at some point even other programmers to assist me in the things I lack experience in, or simply to grow the workforce to keep up with demand.

But the Patreon is so expensive!

I don't disagree. The Patreon tiers are really expensive right now. .....It's for a reason, though. Patreon takes insane fees, and simply isn't worth it for small amounts. I hope to, in the relative future, switch to a more direct platform for Supporter, so I can bring down the price of the ingame benefits.

How much will the ads make, anyway?

I do not currently know. I will be experimenting a lot with different ad slots and positions, to see what is the most effective way to place ads. I get about 350K potential impressions daily, but cannot know an RPM yet. I'll let you know once I have actual data, to perhaps help other webgame developers interested in these kinds of statistics for their games.

Is this the beginning of the end?

Not at all. I 100% stand by the fact that TETR.IO will always be free-to-win. There won't be any ingame purchases that increase your skill, required payments to play more, lootboxes, or other shady practices like that. Reaching #1 on the leaderboards will always be equally difficult for paying players as non-paying players with Adblock on. No exceptions.

But (other game) doesn't have ads!

Please compare the two by more than just whether they have ads. I am (surprise, surprise) not a multi-billion-dollar corporation, but I do have a large-scale game that tries to reach those kinds of levels of quality. On top of that, these games are often monetized anyway. How often do you see a free game made by an AAA company that's actually free of monetization?

"If you add ads, I'll quit TETR.IO!!!!"

That's your choice. I hope, however, that after reading this post, you can understand why I am adding ads. And if you still disagree, well.... it's a free game. I'm not sure what you expected. Nothing in the world is free, you know?


In all seriousness, if you have any other questions or (constructive) things to add, feel free to reply to this post with your feedback.

TETRA CHANNEL: separating game and data

by osk at 2020/09/28 (Mon) 9:16:55 pm (edited)OFFICIALTETR.IOUPDATE

It's been a while! Last blog post, we were at 20,000 total players on TETR.IO. That number has...... grown. An insane amount, almost 20x over! At almost 400,000 total accounts, overseeing this data has become a hassle in more ways than one.

TETR.IO's ingame UI, while I like it a lot, is not suited for complex datasets. On top of that, cluttering the main game code with UI mess is not what I was looking for in development.

Quite a few games fix it in a particular way: by showing simpler, less-detailed stats in-game, and having an (un)official site to accompany it with a lot of stats. I am honored to be of such size now that I can join this group, by creating:


TETRA CHANNEL, THE STANDALONE SITE


This site currently allows you to browse all the leaderboards seamlessly, view user stats, with avatars and banners, and more. I hope to in the future also add a bunch of extra statistics - like your TR progression, singleplayer score progression, recent TETRA LEAGUE matches, etc. All those sorts of datasets would be impossible to ever display ingame!

I hope you'll stay tuned for what's next in store!

TETR.IO TETRA LEAGUE OPEN TO ALL!

by osk at 2020/04/18 (Sat) 3:31:35 pmOFFICIALTETR.IOUPDATE


...Can you believe it's only been a month? TETRA LEAGUE, TETR.IO's 1v1 ranked matchmaker, is now live for all to play! You can play it here!

Once again, I'd like to thank all testers in helping me shape this feature within such a short period. And of course, all Patreon supporters! Without the support, I would not have had the time, drive or money to work on it!

Other prominents I'd like to thank are Garbo and Doremy for their extensive feedback!


Have fun, and go rise those ranks!

TETR.IO PUBLIC ALPHA RELEASED!

by osk at 2020/03/21 (Sat) 8:00:20 pmOFFICIALTETR.IOUPDATE

TETR.IO ALPHA

TETR.IO has reached the ALPHA development stage, and is now accessible to everyone! After almost two months of INFDEV with a team of testers I cannot be more thankful of, I am now able to unveil TETR.IO to the entire world!

PLAY NOW

PROGRESS UPDATE
  • Planned for later Planned for later: this won't be available until after release. But, it is something I hope to do.
  • Development has not yet started Development has not yet started: this is planned, but work on the feature has not yet started.
  • Development has started Development has started: this feature has its framework set up and is being worked on.
  • Development underway Development underway: this feature is starting to become reality and has minor functionality ready to implement.
  • Development nearing completion Development nearing completion: most of this feature is implemented, but it is not yet ready for release.
  • Rough version complete Rough version complete: this feature is fully implemented, but may be overhauled - it's ready for an alpha release, but should be polished more.
  • Fully complete Fully complete: this feature is fully implemented and polished!

5. Custom Multiplayer Rules Development underwayRough version complete

There are now many multiplayer tweaks that can be applied, from hold on/off to garbage travel speed, to custom DAS!

9. Chat with players Development nearing completionRough version complete

Chat is complete, and a swear word filter has been implemented!

21. Profile w/ personal best displayed Development nearing completionRough version complete

TETR.IO now displays detailed info about a player whenever you wish to view their profiles!

22. Simple accounts system w/o hassle Development nearing completionRough version complete

You can now easily create accounts and, if you have set an email, even recover their passwords!

25. EXP Planned for laterRough version complete

I wasn't planning to implement this as early as now, but EXP is available now, so you can progress as you develop your skills!

39. Dazzling graphics Development nearing completionRough version complete

All the effects and tweaks I'd like to implement by Alpha have been implemented, with hopefully more polish coming soon!

40. Custom wallpapers Development has startedRough version complete

You can now set custom wallpapers, or even a collection of custom wallpapers. A better UI is planned, but for now this works well ^^


WHAT'S NEXT?

We're only in Alpha stage right now, so there's still a lot to be done. However, I do have plans for many cool things to come.

Right now, Quick Play is just one big room. This is great and all, but as soon as one pro joins, others will have to make way. I hope to be able to add 1v1 matchmaking as soon as possible, once the userbase is large enough to support such a feature.

The only online mode right now is ELIMINATION. This is the de facto online mode in most stackers, but I'd like to also implement TIMED and RACE modes.

It's impossible to spectate a match that's already begun right now. I'd like to make it possible to do so - it just requires a bit of headache code-wise.

Of course, I'd like to add more single-player fun too - above all, a ZEN mode that can be played inbetween matches as well, and a longer MARATHON-esque mode.

And, of course, I still want to look into making performance as smooth as possible on as many devices as possible.

For the most part, the 44-FACT-FRENZY still holds up. While I do not know in which order I will tackle everything, I hope to be able to, together with your support, make TETR.IO something we can all enjoy!


I want to extend my gratitude and thankfulness to everyone who helped test the INFDEV builds. Without your extensive support, I would not have been able to make TETR.IO what it is today. Going Alpha, however, doesn't mean I'll stop developing and fixing bugs. I hope all of you, and all newcomers, will help us make TETR.IO ever better!

With the launch of Alpha, I'd like to also announce I now have a Patreon! This will hopefully help pay the servers, and be another way to support TETR.IO. Depending on the tier you choose, you can get pretty cool rewards, including an ingame badge and a permanent position in the game's About page! I would be incredibly grateful if you checked it out here: TETR.IO Patreon

Furthermore, I'd also like to remind everyone reading to join the TETR.IO Discord! This is the #1 place to get updates and changelogs as they roll in: TETR.IO Discord

Finally, I'd like to thank the Hard Drop community for helping me develop the game, giving feedback and reporting bugs. If you haven't yet, check out Hard Drop now!


Thank you very much for reading, and have fun!


Just five days left until TETR.IO is released to the world!

When that time comes, I'll post a larger blog post with all information!

IP requests will close a day or 2 prior.

I'm now selfhosting email

by osk at 2020/02/03 (Mon) 12:43:33 amPERSONALUPDATE

Hi! Up to now, my email provider has always been ProtonMail. However, for some projects I need a mailserver, so I decided to set one up. Please do not contact me on my old ProtonMail account (@pm.me), but use my new email:

me [AT] osk [DOT] sh

Thank you!

TETR.IO is now in INFDEV!

by osk at 2020/02/01 (Sat) 12:01:16 am (edited)OFFICIALTETR.IOUPDATE

TETR.IO INFDEV

TETR.IO has reached the INFDEV development stage! This means that I am now giving out access to test it on a wider scale to select people. This to allow more and more diverse people to play it and give their feedback on TETR.IO, without opening it fully to the public yet (and having to worry about making a bad first impression).

Want to try out TETR.IO? Contact me with your IP and why you would like to try out TETR.IO, and I'll add you to the whitelist!


PROGRESS UPDATE
  • Planned for later Planned for later: this won't be available until after release. But, it is something I hope to do.
  • Development has not yet started Development has not yet started: this is planned, but work on the feature has not yet started.
  • Development has started Development has started: this feature has its framework set up and is being worked on.
  • Development underway Development underway: this feature is starting to become reality and has minor functionality ready to implement.
  • Development nearing completion Development nearing completion: most of this feature is implemented, but it is not yet ready for release.
  • Rough version complete Rough version complete: this feature is fully implemented, but may be overhauled - it's ready for an alpha release, but should be polished more.
  • Fully complete Fully complete: this feature is fully implemented and polished!

3. Multiplayer Lobbies Development nearing completionRough version complete

The feature to join a room by URL has been implemented (it makes short URLs like https://tetr.io/#7YhaIs6), completing the feature!

4. Quick Play Development has startedRough version complete

Quick Play has been implemented - join Quick Play and the room will automatically start an infinite loop of games as long as at least 2 people are in Quick Play!

9. Chat with players Development has startedDevelopment nearing completion

Chat is nearly complete, but a swear word filter has yet to be implemented, and a few hotkeys may still be swapped around.

16. TETRA CHANNEL Development underwayRough version complete

All basic functionality of TETRA CHANNEL has been implemented. Stuff like MAPS and a list of players may be added later, but is not on the roadmap for Alpha (see the TETR.IO 44-Fact-Frenzy page for more info).

17. Personal Best Development has startedFully complete

TETRA CHANNEL now happily saves your top 10 plays in all categories.

18. Global records Development underwayFully complete

Likewise, TETRA CHANNEL now happily saves the top 1000 plays in all categories (note: the client only displays 100, but the standalone site will display all 1000).

19. Replays saved and can be watched Development nearing completionRough version complete

All plays are saved at least temporarily, and a nice replay link can be shared!

20. Custom game options Development underwayRough version complete

The CUSTOM GAME mode has been implemented, and already allows for lots of experimentation most other games don't provide. However, I hope to add more options to it in the future.

21. Profile w/ personal best displayed Development has not yet startedDevelopment nearing completion

TETR.IO displays nice badges of a user's scores when you click them. I hope to still add some extra info, like join date, before Alpha. More info could potentially go to the TETRA CHANNEL site.

41. Music by Hurt Record Development underwayRough version complete

I believe to have added most music I want to, but I can always add more when I find a purpose for it.

42. Controller support Planned for laterRough version complete

Its implementation is rather basic, but I decided to add it already. Only the in-game controls work with controller (all else must still be done w/ mouse), but it's better than nothing (hence it does not get the polished icon).


Still to be done before Alpha...

  • Development underway 5. Custom Multiplayer Rules
  • Development nearing completion 9. Chat with players
  • Development nearing completion 21. Profile w/ personal best displayed
  • Development nearing completion 22. Simple accounts system w/o hassle
  • Development nearing completion 39. Dazzling graphics
  • Development has started 40. Custom wallpapers

Thank you for reading. If you're planning on becoming a tester, have fun!

There's now a view count next to blog posts.

by osk at 2019/12/27 (Fri) 1:17:01 pmPERSONALUPDATE


I should really cool it with this crystallize effect.

It might impact the server negatively, so let's see how well it works, right? It's only triggered when you view a post's own page, not the homepage.

Even less useful: PeakGadget

by osk at 2019/12/27 (Fri) 1:16:07 amPERSONALOSKWARE

This time, to address a bug I face in my antiquated Windows 7 install where the sidebar gadgets would stop being "topmost" (above all other windows) and get hidden. It's a stupidly simple program, but hey - can add it to my portfolio, right?

If you happen to be impacted by this bug as well, the program can be retrieved (and its source seen) over here.

WindowSmasher: "simple" window management

by osk at 2019/12/20 (Fri) 11:51:19 pmPERSONALOSKWARE

My right monitor always does something weird when I turn it on - it throws all my windows out of whack. I needed a way to put them back into place easily. Tools like Fancy Zones exist, but I wanted to make something different, so I whipped up WindowSmasher. It's a small tool that allows you to define up to 10 presets to sort your windows into. Its code isn't the greatest, but I open-sourced it as well.

Get it now!


I also open-sourced Kurumi for your viewing pleasure. Its code isn't any better, but you know. You can get it here.

TETR.IO Forty-Four Fact Frenzy!

by osk at 2019/12/17 (Tue) 9:18:55 pm (edited)OFFICIALTETR.IO

TETR.IO 44-FACT FRENZY

It's been too long since I reported on TETR.IO. Therefore, with the TETR.IO FORTY-FOUR FACT FRENZY (don't take the name too seriously) I hope to shed some light on what I have been working on, what you can expect, and how far I am in its development.

As for development, every item has an indicator of its development status. I will reuse those indicators in later updates as well to show the evolution of the project. Here they all are:

  • Planned for later Planned for later: this won't be available until after release. But, it is something I hope to do.
  • Development has not yet started Development has not yet started: this is planned, but work on the feature has not yet started.
  • Development has started Development has started: this feature has its framework set up and is being worked on.
  • Development underway Development underway: this feature is starting to become reality and has minor functionality ready to implement.
  • Development nearing completion Development nearing completion: most of this feature is implemented, but it is not yet ready for release.
  • Rough version complete Rough version complete: this feature is fully implemented, but may be overhauled - it's ready for an alpha release, but should be polished more.
  • Fully complete Fully complete: this feature is fully implemented and polished!

If you find anything you want to give your opinion on, the comments are here for you. Anything here is still up for debate! Thank you for taking the time to read through them. Without further ado, forty-four facts about TETR.IO, coming your way!


Multiplayer

1. Unlimited players Rough version complete

In TETR.IO, you'll be able to play with as many players as you please! Not 99, not 6, but the exact size you want! (I've been able to get stable 60FPS with 500 test players, but don't know how much the server and client can take in real situations yet. There's no hard limits though!)

2. Elimination Mode Rough version complete

The standard multiplayer mode will be ELIMINATION! Be the last man standing by knocking out all other players!

3. Multiplayer Lobbies Development nearing completion

Normal multiplayer will take place in lobbies of any size! A registered player makes a public or private room, and gives others a short link to join the fun! Public lobbies can be easily joined from the room listing!

4. Quick Play Development has started

Don't want to mess about with rooms and just get to playing? QUICK PLAY will throw you in a big room with all sorts of players of all sorts of skill levels! (Later, this may be expanded so players can find others of their skill more easily.)

5. Custom Multiplayer Rules Development underway

Play by your rules! Hold or no Hold? Super-fast or beginner-friendly? You define the rules of a multiplayer lobby!

6. Multiple Rounds Fully complete

Play as many rounds per game as you want by changing from KNOCKOUT (first to 1) to another score target!

7. Spiced up Garbage Rough version complete

TETR.IO changes the Garbage table. It weakens boring single-line combos like the Four-wide and instead adds a smart multiplier onto the table! Finish off a combo with a powerful move and destroy your opponent!

8. Smart anti-cheat Fully complete

TETR.IO's codebase is shared perfectly between client and server, so the server can check precisely what a potential cheater may be doing - one discrepancy and you're out!

9. Chat with players Development has started

Talk with other players before starting a game, or bathe in salt after a heated match with optional chat! (May be changed. By default, a swear word filter will be applied.)

10. Planned for later: Competitive matchmaking Planned for later

When we're ready for it and have a strong userbase, we hope to be able to test your true skill in a one-on-one environment! Play as many duels as you can imagine with people of your skill, and rank up as you gain skill!

11. Planned for later: Tournament mode Planned for later

When we're ready for it, we can create a tournament mode where you can play a big array of games together with your friends to find your true CHAMPION!

12. Planned for later: Race mode Planned for later

Aside from ELIMINATION mode, we hope to also add a RACE mode where you can see who can reach a certain target faster!

13. Planned for later: Spectate in-progress matches Planned for later

When our code is ready for it, we hope to allow you to spectate games that are already in progress!


Singleplayer

14. 40L mode Fully complete

Clear forty lines as fast as you can imagine to reach the leaderboards! A true test of your speed an insight!

15. BLITZ mode Fully complete

Rack up as many points as you can within TWO MINUTES! Do cool tricks, get All Clears and bring your best game to reach higher levels and gain more points!

16. TETRA CHANNEL Development underway

See how you stack up against the world in TETRA CHANNEL, the hub for records, leaderboards and all sorts of other content!

17. Personal Best Development has started

TETRA CHANNEL will store your best plays and allow you to see how you fare!

18. Global records Development underway

But, TETRA CHANNEL will also store the world's best records! Play well, and you'll be rewarded a spot on the TETRA CHANNEL LEADERBOARD!

19. Replays saved and can be watched Development nearing completion

All records on TETRA CHANNEL are verifiable and have full replays available! See where you can improve, and see how others achieve their scores!

20. Custom game options Development underway

Choose your own game by adding custom game options! Ever wanted to play a 1000-line game at maximum gravity? You can now!

21. Profile w/ personal best displayed Development has not yet started

Rep your skill right on your profile! Your personal bests and, if applicable, global rankings will be displayed on your profile!

22. Simple accounts system w/o hassle Development nearing completion

Joining TETR.IO is easy - just send in a username, password and optional email, and you're ready to enter the game! (If you don't specify an email, we can't reset your password!) Want to join a friend's room or just play for fun? A username is all you need for a temporary anonymous account!

23. Planned for later: TETRA CHANNEL website Planned for later

When it's ready, we hope to unveil a website where you can quickly see detailed stats on players, scores and the such, far more detailed than the in-game views!

24. Planned for later: MARATHON Planned for later

After some testing, we should be able to get a MARATHON mode up, where you get to 150 lines with as many points as possible! (Or perhaps, something a bit more different?)

25. Planned for later: EXP Planned for later

Progress as you play with a simple experience system!

26. Planned for later: Maps Planned for later

When we're ready, create and play on MAPS! Create a map, and try to clear it as fast as you can!

27. Planned for later: FEVER mode Planned for later

Those MAPS can also be used to create a FEVER MODE! Clear as many simple maps as fast as you can, and gain extra points if you can get a higher combo than the map intended!

28. Planned for later: TUTORIAL mode Planned for later

We hope to get this in pretty fast for those not used to modern stackers - the TUTORIAL MODE will breeze you through the game, from learning the controls to more intricate pro moves, to mastering the rules of online play!


Engine

29. Powerful JavaScript engine Rough version complete

TETR.IO runs on the fastest, most advanced JavaScript stacker engine! It's custom made for the job, and shared between server and client for super-fast anti-cheat!

30. Runs in all modern browsers Rough version complete

TETR.IO is engineered to run in all modern browsers! Currently tested browsers are Firefox 56 and up, and Chrome 67 and up! I will make sure to test other browsers and see how much support I can create! The graphics can be turned down so the game runs on as many devices as possible!

31. Rebindable keyboard controls Fully complete

By default, TETR.IO supports the standard arrow key controls, and a more optimized WASD control set. But, if you like neither of them, you can set up your own controls!

32. GPU-accelerated with Pixi.JS Rough version complete

TETR.IO looks splendid with GPU-accelerated graphics in the browsers that support it, using the WebGL library Pixi.JS!

33. SRS rotation Fully complete

TETR.IO will use the time-tested Super Rotation System to make many pro moves possible! There's a lot of reading material and tutorials on how it works already, and the pros already know it, so it's the best choice for the deal!

34. Zero Delay Fully complete

TETR.IO will let you unlock your true potential. No line clear delay, "are" spawn delays, or any other delays. Play as fast as you can for as high of a skill ceiling as you can imagine!

35. Adjustable DAS, ARR speeds Fully complete

Get comfortable and tune the controls exactly to what feels right to you. If you're precise enough, turn up ARR and DAS to move left to right faster!

36. T-Spin, B2B and All Clear recognition Fully complete

As expected of a modern stacker, TETR.IO will recognize and reward common skill moves like T-Spins, Back-To-Back clears and All Clears for extra points or garbage.

37. Guideline Formula Fully complete

It takes little effort to learn TETR.IO if you know another stacker. TETR.IO mostly follows the Guideline formula, with minor changes. Experienced players will feel right at home, while new players will have tons of tutorials already created by the awesome stacker community!

38. Higher piece spawn location Fully complete

One of the exceptions is that TETR.IO spawns tetrominoes up to 2 tiles higher than a Guideline game. This to make it harder to get stuck in the way the SRS rotation system works.

39. Dazzling graphics Development nearing completion

By utilizing your GPU and modern JavaScript, TETR.IO can bring amazing graphics to your retinas - from a swaying board, to particle effects, to an ambient background. Of course, if you or your computer don't like the effects, you can easily turn them off!

40. Custom wallpapers Development has started

Make TETR.IO yours by adding a custom wallpaper and many other forms of customization!

41. Music by Hurt Record Development underway

TETR.IO will feature awesome music created by the artists at HURT RECORD!

42. Planned for later: Controller support Planned for later

No matter what your preferred way to play is, we hope to be able to support it! While the alpha will start out with only keyboard support, we hope to add XInput controller support (and perhaps even Switch controller support depending on browser support) soon after!

43. Planned for later: Standalone client Planned for later

Since TETR.IO is all JavaScript, it should be possible to use as a desktop application as well! When I've got the time, I will definitely see what can be done in this regard, to make a nice standalone client work (and perhaps integrate with other platforms).

44. Planned for later: Mobile support Planned for later

Later on, I'd like to also add touchscreen controls for mobile support. That way, you can even play TETR.IO on the go!


Thank you very much for reading the forty-four facts I laid out. If there's anything you want to give your opinion on, please do so in the comments! I look forward to hearing your opinions! If you know someone else who might be interested, be sure to let them know!

Please look forward to TETR.IO!

Kurumi: sync time without the bullshit

by osk at 2019/11/19 (Tue) 1:31:51 am (edited)PERSONALOSKWARE

I run a Windows installation which has a very restrictive firewall. One of the things it blocks is Windows' NTP ("Network Time Protocol") service. This is the service that automatically synchronizes your system time to that of a specialized time server. If it's disabled, your clock will slowly desync over time, or, in my case, within a few days. My usual setup to deal with this is to just go to say, time.is and adjust the time manually. But, that requires effort, and after all, they say the best ideas arise out of laziness, right?

Jokes aside, I've created a tiny (66KB) tool that will synchronize your system clock for you, in case you don't want to use the built-in service. It's very simple and doesn't ask questions - just run it, and it'll tell you how badly out of sync you are, then offer to fix it. Hit "Fix" and all your problems will go away!

If you're interested, you can pick it up here.

If you find any bugs, this is the place to report them!

Welcome!

by osk at 2019/11/17 (Sun) 10:23:44 pm (edited)PERSONALUPDATE

Here I will post project updates, sneak peeks, and whatever else is on my mind at the time. Don't expect super-frequent updates, but hey - there's something new every once in a while. Please note that this blog is personal space. Please respect that (and as such, my interests).

You can star posts and comments you enjoy as much as you like, a bit like how Flipnote Hatena and Medium work. There's no limit to how many stars you can give something, but please don't bot it (I will throw sharp glances at you).

You can also comment on posts, and on replies to those posts. Your name and color is randomized (bound to IP). There's no CAPTCHA or anything like that right now, so see it as a bit of an experiment. Be civil, okay? I reserve the right to delete anything for any reason. If it ends up being an issue, I can always add CAPTCHA later or turn off comments. As long as your IP does not change, you can delete your comments with the DEL button next to it.

Happy sightseeing!