Jump to content

Super Tilt Bro. for NES


Recommended Posts

Hey there! Wanted to show that networked NESs!

As we prepare for game events to come we have tested our stand. Here you can see both NES connected to the tablet in the middle. The game server runs on the tablet itself, so there is no need for an existing network, what is on the table is autonomous. Convention center's Wi-Fi can be as unstable as it usually is, there will be no problem.

Since this setup we found that the old laggy tablet was not suited for the task, with ping showing spikes up to 500ms. The stand will run with a modern laptop instead.

Pretty excited to put it in the hands of strangers to see their impression!

(Did you whishlist your cart? Doing it helps a lot, telling friends also helps ❤️https://super-tilt-bro.com/wishlist.html )

  • Wow! 1
Link to comment
Share on other sites

  • 2 months later...

Super Tilt Bro. 2.0-alpha10: Improved netcode, and movesets

What's new around the game?

Community is growing

The Super Tilt Bro.'s Discord server sees more and more active users. To the point it finally fills its initial purpose: to help find an online match. More than that, the community is striving. We debate the best characters, strategies, and tournament dates.

Thank you everybody in the community, seeing such enthusiasm is the best reward I could ever receive as a developer!

(If you are not yet part of it, join now: https://discord.gg/qkxHkfx)

Cartridge wishlist

If you want to see online NES gaming on real hardware: progress on this side is steady. Not yet ready, but once prototypes are stable we will start pre-orders.

Don't want to miss it? Here you can register to be notified when it happens (no spam included): https://super-tilt-bro.com/wishlist.html

What's new in the game?

Improved Netcode

The game received a big optimisation pass. While not touching netcode directly it impacts game's capability to rollback efficiently. There also are bug fixes in the netcode itself, those bugs occasionally caused you to see characters teleporting around the screen.

Lost with this "rollback" thing?

In a nutshell, the game predicts your opponent's inputs to stay smooth when it takes time to transit by the network. Sometimes, the game misspredicts, it then has to fix what is drawn on screen. This is done by internally re-playing all frames since the missprediction, and is called rollback.

You can read more about rollback here: https://sgadrat.itch.io/super-tilt-bro/devlog/154432/real-time-online-gaming-with-the-nes

What to expect from it? Playing Pepper vs Pepper on "The Hunt" suffered many slowdowns. It should now be playable perfectly with good connections. Playing on Flatland and Skyride with poor connections should be greatly improved.

We'll see how it behaves on real conditions, and may do another pass of optimisations if necessary.

General gameplay changes

There are two comfort changes in inputs.

First, you can now tech with the jump button in addition to the shield button. For reference "teching" is when you press one of those button just before crashing on ground, your character softens the crash to fasten their recovery.

Top: crash // Bottom: tech


Pepper's signature move (Plan 7-B) has been reworked.

Before this patch you would place Carrot on the stage with side-special, and teleport on him with neutral-special. Now, it is all on neutral-special, placing Carrot the first time, teleporting the second time. This makes sens since it is actually the same move, and both parts are useless and broken without the other.

It also frees the side-special which is now a long range attack. Ideal to follow-up on combos when your opponent has been sent too far away.


Sinbad's jab has been completely changed. It was an infinitely spammable light attack, it is now a three hits combo which deals good damage.

A short video is worth a thousand words


Fixed Kiki being unable to draw platforms after respawn.

NTSC online

The server now accepts NTSC clients.

This is done in anticipation for the physical release, when players cannot freely choose their system's region. For now the emulator is still configured in PAL by default, and changing it is not recomended. There notably is no crossplay between PAL and NTSC. If you want to experiment you a free to proceed, beware that the other player must also configure their emulator in NTSC mode.

More efficient satellite launch

In the online menu, the satellite now observe a prograde rotation. This requires less fuel to launch it from the surface, and feels more natural to space enthusiasts.

Link to comment
Share on other sites

  • 1 month later...

Technical highlight: Music driver, when you can't do a thing, find another way!


Hey! Today topic is music! ... *hmm* OK, it is about the code playing musics.

Super Tilt Bro. version 2 has better musics than the old version, by a long shot. It was not easy, the old music driver is a minimal driver, written while figuring things out. It is very light but seriously lacks features. To the point that importing any track require multiple days of work, and forces to butcher the original song. When Tuï came with a title screen theme, there was no way to butcher it, the audio engine needed an upgrade.

It would have been too easy to use a well known audio engine. GGSound and Famitone are solid, do the work perfectly and are battle-tested. Super Tilt Bro. needs technologies that are experimental, unstable, and ... *hmm* AMBITIOUS!

OK, and to have a home-made audio driver opens some possibilities, we will come back on it. Before that, let's discuss some common knowledge about NES audio, detail Super Tilt Bro.'s driver operation, and bring biased comparison with other drivers.

Here is a glimpse at Super Tilt Bro.'s audio features, so you know where we are headed:

  • Support for Famitracker effects: Axx, Bxx, Dxx, Fxx, Gxx, Qxx, Rxx, Sxx, 1xx, 2xx, 3xx, 4xx (More to come, aiming to support them all)
  • Support for instruments
  • Support for tempo
  • Faster than Famitone

An audio driver, how does it work?

At the lowest lever there is the audio chip in the NES, we name it the APU for Audio Processing Unit. The APU has a lot of functionality but at the end of the day it exposes some registers and the sound played depends on values we write in these. The goal is then to regularly change values in these registers to play a music.

The audio driver is essentially a chunk of code that is called regularly, reading music data, interpreting it, and writing values in the APU registers. We'll strive to do it as fast as we can (to let CPU cycles for the game) while minimizing music data size (to let ROM space for the game.) Oh ... And ... You know ... Actually being able to play what the musician composed.

On the NES, most artists work with the tracker named Famitracker. It has tons of features, and its own track format. The first step will be to convert tracks from tracker's format to our driver's.

From tracker to driver

One distinctive point of Super Tilt Bro.'s driver is to be extremely light while relying on a powerful import script. Other driver generally have more features but ask the composer not to use the rest. Super Tilt Bro. handles only the minimum, but what is not supported by the driver is converted to a simplified equivalent at import time.

From now on, I will take for granted that you are accustomed to trackers and have some chiptune knowledge. Sorry others, I can only suggest trying Famitracker or Famistudio by yourself, it is a lot of fun.

I will also talk about "ticks." A tick is one call of the driver. As it should be called regularly it is the shortest rhythm unit. I'll observe 6 ticks for a quarter note.

So, the driver's goal is to write values in the APU's registers. To do so, it read some data and acts accordingly. Since these data describe the behavior expected from the driver, the simplest is to use a bytecode. A bytecode is a flow of instructions to execute, like a compiled program. Here are the instructions to play a scale:

play the note C
wait 6 ticks
play the note D
wait 6 ticks
play the note E
wait 6 ticks
play the note F
wait 6 ticks
play the note G
wait 6 ticks
play the note A
wait 6 ticks
play the note B
wait 6 ticks

Of course, the NES has multiple channels (pulse1, pulse2, triangle, and noise.) We need a series of instructions per channel. To be able to compress things, Super Tilt Bro. introduce the concept of sample. A sample is a series of instruction, and each channel plays a series of samples. Now we can reuse some samples, like by having the chorus in a sample and verses in others.

CHANNEL pulse1:
CHANNEL pulse2:
CHANNEL triangle:
CHANNEL noise:

    play the note C
    wait 6 ticks
    play the note D
    wait 6 ticks
    sample's end

    play the note C
    wait 5 ticks
    wait 1 tick
    play the note C
    wait 5 ticks
    wait 1 tick
    play the note G
    wait 5 ticks
    sample's end

    play the note B
    wait 6 ticks
    play the note A
    wait 6 ticks
    sample's end

    play silence
    wait 255 ticks
    sample's end

We could improve the compression with smaller samples. Above we could have made a sample for the series "C during 5 ticks, silence during 1 tick," but you get the idea.

While perfectly adapted to driver's code, this notation rapidly become hard to read for human being. We can use an intermediate format, more like trackers' notation but constrained to Super Tilt Bro.'s driver capacities:

00, 01

SAMPLE 00 (2a03-pulse)
#    note   frequency_adjust volume duty pitch_slide
00 : C-3    ...              ...    ...  ...
01 : ...    ...              ...    ...  ...
02 : ...    ...              ...    ...  ...
03 : ...    ...              ...    ...  ...
04 : ...    ...              ...    ...  ...
05 : ...    ...              ...    ...  ...

SAMPLE 01 (2a03-pulse)
#    note   frequency_adjust volume duty pitch_slide
00 : E-3    ...              ...    ...  ...
01 : ...    ...              ...    ...  ...
02 : ...    ...              ...    ...  ...
03 : ...    ...              ...    ...  ...
04 : ...    ...              ...    ...  ...
05 : ...    ...              ...    ...  ...

OK, that is easier to read if you are familiar with trackers. (If you are not, I warned!) "CHANNEL 00" is pulse1, others were left out of this example for brevity.

This format exposes driver's features. There is no loosely defined "effect" column, each column has a specific role. There also is no instrument. "note", "volume", and "duty" should be self-explanatory. "pitch_slide" contains a signed number, it is equivalent to 1xx and 2xx effects in Famitracker. "frequency_adjust" changes the currently played frequency by a number of pitch units, it works as expected even if there is an active pitch_slide. It is unused when importing from Famitracker but can allow for an arpeggio and a slide as Famistudio allows.

This format is readable and trivial to convert to driver's bytecode. But, how do we convert a full-featured Famitracker track to such a limited format?

Here is an extract from a real world track from Tuï:

ROW 00 : C#3 12 . ... ... :
ROW 01 : ... .. . ... ... :
ROW 02 : ... .. . ... ... :
ROW 03 : ... .. . ... ... :
ROW 04 : ... .. . 4AA 103 :
ROW 05 : ... .. . ... ... :
ROW 06 : ... .. . ... ... :
ROW 07 : ... .. . ... ... :
ROW 08 : ... .. . ... ... :
ROW 09 : ... .. . ... ... :
ROW 0A : ... .. . ... ... :
ROW 0B : ... .. . ... ... :
ROW 0C : ... .. . ... ... :
ROW 0D : ... .. . ... ... :
ROW 0E : ... .. . ... ... :
ROW 0F : ... .. . ... ... :
ROW 10 : ... .. . ... ... :
ROW 11 : ... .. . ... ... :
ROW 12 : ... .. . ... ... :
ROW 13 : ... .. . ... ... :
ROW 14 : ... .. . ... ... :
ROW 15 : ... .. . ... ... :
ROW 16 : ... .. . ... ... :
ROW 17 : ... .. . ... ... :
ROW 18 : ... .. . ... ... :
ROW 19 : ... .. . ... ... :
ROW 1A : ... .. . ... ... :
ROW 1B : ... .. . ... ... :
ROW 1C : ... .. . ... ... :
ROW 1D : ... .. . ... ... :
ROW 1E : ... .. . ... ... :
ROW 1F : ... .. . ... ... :
ROW 20 : --- 00 . 400 100 :

Instrument 12 is simple, it just sets duty to 2. The 4xx effect is a vibrato, and the 1xx effect is a pitch slide from low to high pitch. Everything together make for a nice sound:

We will simply transform the file step by step, to finally conform to our limitations. First is to flatten the instrument in the pattern, and convert the vibrato to a series of 1xx and 2xx. Here is the result:

ROW 00 : C#3 .. F ... ... ... V02 :
ROW 01 : ... .. F ... ... ... V02 :
ROW 02 : ... .. F ... ... ... V02 :
ROW 03 : ... .. F ... ... ... V02 :
ROW 04 : ... .. F 214 103 ... V02 :
ROW 05 : ... .. F ... ... ... V02 :
ROW 06 : ... .. F 114 ... ... V02 :
ROW 07 : ... .. F ... ... ... V02 :
ROW 08 : ... .. F ... ... ... V02 :
ROW 09 : ... .. F 214 ... ... V02 :
ROW 0A : ... .. F ... ... ... V02 :
ROW 0B : ... .. F ... ... ... V02 :
ROW 0C : ... .. F 114 ... ... V02 :
ROW 0D : ... .. F ... ... ... V02 :
ROW 0E : ... .. F ... ... ... V02 :
ROW 0F : ... .. F 214 ... ... V02 :
ROW 10 : ... .. F ... ... ... V02 :
ROW 11 : ... .. F ... ... ... V02 :
ROW 12 : ... .. F 114 ... ... V02 :
ROW 13 : ... .. F ... ... ... V02 :
ROW 14 : ... .. F ... ... ... V02 :
ROW 15 : ... .. F 214 ... ... V02 :
ROW 16 : ... .. F ... ... ... V02 :
ROW 17 : ... .. F ... ... ... V02 :
ROW 18 : ... .. F 114 ... ... V02 :
ROW 19 : ... .. F ... ... ... V02 :
ROW 1A : ... .. F ... ... ... V02 :
ROW 1B : ... .. F 214 ... ... V02 :
ROW 1C : ... .. F ... ... ... V02 :
ROW 1D : ... .. F ... ... ... V02 :
ROW 1E : ... .. F 114 ... ... V02 :
ROW 1F : ... .. F ... ... ... V02 :
ROW 20 : --- .. F 100 100 ... V00 :

Note that everything happens in import script's memory, we can add effect columns at will. It comes handy to avoid conflicts.

As Super Tilt Bro.'s driver handles only one "pitch_slide", we now have to merge the slides present on different columns. That done by adding slide values, and here is the result:

ROW 00 : C#3 .. F ... ... ... V02 ... :
ROW 01 : ... .. F ... ... ... V02 ... :
ROW 02 : ... .. F ... ... ... V02 ... :
ROW 03 : ... .. F ... ... ... V02 ... :
ROW 04 : ... .. F ... ... ... V02 211 :
ROW 05 : ... .. F ... ... ... V02 ... :
ROW 06 : ... .. F ... ... ... V02 117 :
ROW 07 : ... .. F ... ... ... V02 ... :
ROW 08 : ... .. F ... ... ... V02 ... :
ROW 09 : ... .. F ... ... ... V02 211 :
ROW 0A : ... .. F ... ... ... V02 ... :
ROW 0B : ... .. F ... ... ... V02 ... :
ROW 0C : ... .. F ... ... ... V02 117 :
ROW 0D : ... .. F ... ... ... V02 ... :
ROW 0E : ... .. F ... ... ... V02 ... :
ROW 0F : ... .. F ... ... ... V02 211 :
ROW 10 : ... .. F ... ... ... V02 ... :
ROW 11 : ... .. F ... ... ... V02 ... :
ROW 12 : ... .. F ... ... ... V02 117 :
ROW 13 : ... .. F ... ... ... V02 ... :
ROW 14 : ... .. F ... ... ... V02 ... :
ROW 15 : ... .. F ... ... ... V02 211 :
ROW 16 : ... .. F ... ... ... V02 ... :
ROW 17 : ... .. F ... ... ... V02 ... :
ROW 18 : ... .. F ... ... ... V02 117 :
ROW 19 : ... .. F ... ... ... V02 ... :
ROW 1A : ... .. F ... ... ... V02 ... :
ROW 1B : ... .. F ... ... ... V02 211 :
ROW 1C : ... .. F ... ... ... V02 ... :
ROW 1D : ... .. F ... ... ... V02 ... :
ROW 1E : ... .. F ... ... ... V02 117 :
ROW 1F : ... .. F ... ... ... V02 ... :
ROW 20 : --- .. F ... ... ... V00 100 :

In some little steps, we obtained a Famitracker's module that sounds the same as the original while observing our harsh constraints. Here is the result in internal format:

SAMPLE 00 (2a03-pulse)
#    note  frequency_adjust    volume  duty    pitch_slide
00 : C#3   ...                 15      2       ...
01 : ...   ...                 ...     ...     ...
02 : ...   ...                 ...     ...     ...
03 : ...   ...                 ...     ...     ...
04 : ...   ...                 ...     ...     17
05 : ...   ...                 ...     ...     ...
06 : ...   ...                 ...     ...     -23
07 : ...   ...                 ...     ...     ...
08 : ...   ...                 ...     ...     ...
09 : ...   ...                 ...     ...     17
0A : ...   ...                 ...     ...     ...
0B : ...   ...                 ...     ...     ...
0C : ...   ...                 ...     ...     -23
0D : ...   ...                 ...     ...     ...
0E : ...   ...                 ...     ...     ...
0F : ...   ...                 ...     ...     17
10 : ...   ...                 ...     ...     ...
11 : ...   ...                 ...     ...     ...
12 : ...   ...                 ...     ...     -23
13 : ...   ...                 ...     ...     ...
14 : ...   ...                 ...     ...     ...
15 : ...   ...                 ...     ...     17
16 : ...   ...                 ...     ...     ...
17 : ...   ...                 ...     ...     ...
18 : ...   ...                 ...     ...     -23
19 : ...   ...                 ...     ...     ...
1A : ...   ...                 ...     ...     ...
1B : ...   ...                 ...     ...     17
1C : ...   ...                 ...     ...     ...
1D : ...   ...                 ...     ...     ...
1E : ...   ...                 ...     ...     -23
1F : ...   ...                 ...     ...     ...
20 : ---   ...                 ...     0       0

And the bytecode will look like this:

    play the note C#3
    set volume to 15
    set duty to 2
    wait 4 ticks

    set pitch slide to 17 units per tick
    wait 2 ticks

    set pitch slide to -23 units per tick
    wait 3 ticks


Actually, before generating the bytecode, the import script will apply some dictionary compression which is finding the optimal set of samples to store the music in as few bytes as possible.

How does this driver perform relative to others?

There are a lot of drivers more or less working. We will focus on the three cool kids: Famitracker, Famitone, and GGSound.

Famitracker is the driver that comes with the eponymous tracker. It has every feature needed to play tracker's musics. Despite that, this driver is often avoided by game developers because it can consume a lot of the CPU budget.

Famitone, by Shiru, is the lightest of the three. Missing notable features, it is typically used on small games, when ROM space is more precious than comfort of the composer.

GGSound, by Gradual Games, is a solid in-between which is easier to write for while keeping performances under control.

Here is a overview of each one's implementation. (Except Famitracker, sorry I didn't do my homework on it.)

  • Famitone and GGSound implement instruments but no effect. Super Tilt Bro. does not support instrument, but handles 1xx and 2xx effects.
  • Music formats
    • Famitone features a minimal bytecode: play a note, wait, select an instrument, and loop the track.
    • GGSound adds some control flow: call a subsection (like our samples), GOTO, ...
    • Super Tilt Bro. has no instrument-related data, instead opcodes directly reflect data to write in APU registers

After the rain, Famitone's demo track, and how it is handled by different drivers.
Note: CPU cost is the worst tick encountered while playing the track.

Two points are obvious: Super Tilt Bro.'s driver is lighter than others, sensible since it does not handle instruments. Also, musics take more space in ROM. Other drivers having instruments, most data is a simple series of notes. Super Tilt Bro. makes up for its weakness with compression, but it is not yet enough to compete.

What to think about that?

That your read until there. Impressive! The topic is far from easy 🙂

Also, the Super Tilt Bro.'s driver is a very lightweight engine which is able to play complex tracks that are not supported by others. This is possible thanks to a big transformation that happens before even running the game. On the other hand, tracks are larger, pressuring the ROM. In Super Tilt Bro.'s case it is not a big deal, CPU cycles are very precious when running the netcode while there is big fat ROM in the cart. That said, it is not a magical solution that fits everybody needs.

In the future, we could gain some ROM space by optimizing the bytecode, and maybe publish the driver as a standalone project if somebody is interested. Also, there is a major reason I insisted on implementing a specific audio engine: everything is possible. It was put aside because of priorities, but one day it would be nice to feature dynamic musics. It means a track that becomes more intense when players are excited, and calms down when they become more passive. That's a reason of the concept of samples, if each sample has multiple variants, the sound engine can choose the most appropriate at any time.

Having a powerful import script is really a good thing. It is too often minimal, simply rejecting features unsupported by the driver or, worse, generating invalid tack data. GGSound could use a compression like the one in Super Tilt Bro. since it is capable of an equivalent to samples. Also, with only the addition of pitch slide effect, and running Super Tilt Bro.'s simplifier, GGSound and Famitone could handle most effects, simplifying composers life.

One last thing, I notice that I repeated the game's name all over this essay. This is because the audio driver does not have a name. Somebody is inspired to name it?

Edited by RogerBidon
Link to comment
Share on other sites

  • 1 month later...

Super Tilt Bro. 2.0-alpha11: Skins, dreams, and rock'n roll!

What's new in the game?

New musics

Two new musics can be heard in game.

The first, inspired by the stage "The Hunt," is composed by Kilirane.

The second, inspired by Kiki, is composed by Tuï.

Improved menus

Some menus were hastily done placeholders, others missed notable features. A big pass has been done to globally level-up.

Matchmaking menu is now integrated in character selection screen.

Notably, credits and matchmaking screen have been completely revamped. The title screen has a better animation, and your ranked play credentials are saved.


When both players select the same skin, now the second player is attributed a lightened variant of it. It is way easier to identify who is who.

Weird input handling during the final slowdown has been fixed.

Sinbad and Kiki skins also have been improved, they were almost random color swaps. Now they are carefully selected color swaps!

Pepper's down-special has a new hitbox at the end of the move. It allows to hit behind her, and is an excellent combo-starter.


What's new under the hood?

New cartridge prototypes

After weeks of efforts to fix race conditions between the game and the Wi-Fi chip, we finally got everything in order.

Broke Studio revised the hardware design, changed almost everything, and now things are nearing perfection!

With that and the netcode which becomes more robust everyday, biggest technical challenges seem to be behind us. Time to focus on making a great game!

Do not forget to wishlist 😉

Link to comment
Share on other sites

  • 3 months later...

Super Tilt Bro., a Guide to Improve Technically and Gain Unrivaled Dominance (GITGUD)

For sure, moving around the character in Super Tilt Bro. is easy. You can also beat the CPU opponent by knowing its flaws. But what to do against a human who knows the game? What are the basic strategies in the game, and how to get the upper hand? This guide will give you the basics to work on.

The rules

If you never touched a platform-fighter before, we'll get you covered immediately.

You, and another player are on the same stage, with the goal of pushing your foo out of the screen's boundaries. To do so, you can strike them with a variety of attacks, causing damages and throwing them forward. The more damage your opponent took, the farther they will be ejected.

The green player attacks the yellow one to increase damages, then finish with a strong attack.

Oh, and here are the controls!


Note that the jump is on d-pad UP, while A and B are bound to normal and special attacks. We'll come to that in the very next section.

Common tricks


Attacks are the most essential moves. An attack hits your opponent, causing damages and throwing them.

Each character has a variety of attacks. All bound to the A button, plus an optional direction. Some cause high damages, some throw far away, some are quick, to choose an attack will depend on the situation and your character.

The simplest attack is done by pressing the A button alone. It is called a "jab", it is a quick attack that does little damage but can save you from a bad situation by throwing your opponent just far enough to be safe.

Kiki's jab, used to stop Sinbad's rush

More powerful attacks can be unleashed by pressing a direction with the A button. These are called tilt attacks, because the character often needs to tilt forward to perform them. Every direction maps to a different attack. Forward + A will trigger a forward-tilt attack, which is totally different from an upward-tilt or a downward-tilt. If in doubt, generally go for the tilt in the direction of your target.

Pepper's forward, upward, and downward tilts

Finally, attacks are different when performed in the air. These are called aerial attacks in general and follow the same principle of having variants for forward-aerial, upward-aerial, downward-aerial, and neutral-aerial (without direction, like the jab)

Pepper's forward, upward, neutral and downward aerials

Special attacks

Special attacks are like attacks, but vary a lot more between characters. They often move the character or have other special effects. They follow the same rule of having variants depending on the direction pressed, and if the character is grounded.

Pepper's neutral-special place her cat on the stage, she can teleport back to him later.

Their use depends heavily on the character, most useful specials are described in the character-specific section of this guide.


By pressing DOWN, your character will shield. The shield can take two hits, avoiding injury to your character. Beware though, the third hit will break the shield and largely amplify the knockback, often leading to disastrous consequences.

Two hits soaked, the third was too much

Double jump

I hope I learn you nothing saying that characters can jump a second time while mid-air. It defies physics, but is super cool looking!

Wall jump

If you played Super Smash Bros, read this. This is a fundamentally different: there is no ledge grab, wall jump is the way.

To put it simply. Your character can perform a wall jump by pressing any button while touching a wall.

Now if you experienced the game, you will notice that there are a few tricks. Notably you can do only one wall jump, you need to touch the ground before doing another. Also, it does not jump very far. Is it of little use?

We'll need to introduce the helpless fall to understand wall jump's use. Some special attacks help you to gain height. This is handy when you want to come back on stage after being pushed away. These attacks put your character in a special state, the helpless fall. When helpless, a character can't do anything except ... wall jumping!

Wall jumping, allows you to escape helpless fall, and go back to the stage.

Sinbad using a wall-jump to climb a wall

Short hop

Releasing the jump button early, you can jump lower. This is called a short hop, and is particularly useful to land aerial attacks against a grounded opponent.

Short hop versus full jump

Fast fall

By pressing DOWN when falling, you can fall faster. This can be used to get on ground before your opponent to be one step ahead of them.

Fast fall versus normal fall


This is certainly the trick that will give you the most for what it takes. To compete seriously, you must master it.

When you are hit by an attack, you normally crash on the ground after being thrown. If you press DOWN just before crashing you will tech, meaning your character avoids the crash and recovers more rapidly.

Tech versus crash

Moreover, you can press DOWN+LEFT or DOWN+RIGHT to tech-slide. It means that your character will avoid the crash and slide rapidly on the requested direction. It is essential to lose your opponent and avoid being the victim of their worst combos.

This is a tech slide


When you hit your opponent, they blink for a short duration. This shows a special state, named hitstun, when they are unable to do anything. You can find series of attacks that abuse hitstun to be unavoidable once the first landed. These series of attacks are true combos, completely unavoidable.

True combos are rare, hard to pull, and work only when the opponent did not receive too much damage. You can however take profit of crashes, or bad reactions of your opponent to land long strings of attacks. We'll still call that combos 😉

Pepper's most iconic combo, note that the opponent could have tech-slide to escape it.


We generally consider three phases of gameplay: neutral, advantage, and disadvantage.

Neutral is when the situation is even. The beginning of the game is always in neutral state, players are too far to attack each other. In neutral game, you want to gain advantage by pushing your opponent in a corner, and avoid them doing it to you. Think calmly about your options, this is the calm before the storm.

Advantage is when you gained the upper-hand, and want to maximize your advantage. Typically, you pushed your rival off-stage, and they want to recover. Their options are limited while you have all of yours. Don't get caught off-guard by a weird move, and you should be able to mark the point.

Disadvantage is, you guessed it, the opposite of advantage. You want to recover, but the opponent is there waiting for you. Your options depend widely on your character, the rule of thumb being "act quickly, act weirdly, take them off guard." Also, each character has at least one move dedicated to recovery, generally up-special. When in trouble try up-special, it is often the best answer.

Playing Sinbad

General strategy

Sinbad moves fast, strikes rapidly, jumps quickly, ... He is what we call a rush down character.

With him, you want to run straight to your foo and unleash a lot of attacks before they can even react. Of course, avoid being too predictable, you have the tools to vary your approaches.

One hit can generally be followed by big combos, giving you a huge advantage. It requires strict timing on your controller though, beginners may have trouble unleashing all his potential.

Playing the advantage

You have two kill moves that cover a large area: your side-tilt and your neutral-special. If your opponent is off-stage, wait them on the ledge ready to inflict the deadly strike. You can also jump offstage to finish them with your fast aerial attacks and come back on stage for the extra glory that comes with a bold move.

Playing the disadvantage

Sinbad has the best recovery in the game. Your up-special travels a good distance vertically, and has a hitbox punishing an opponent edge-guarding from the stage. You can also use your side-special to come back quickly horizontally. Side-special cancels all your momentum, literally a life-saver.

Common combos

Easy: down-tilt -> up-special

This is an easy combo that can be done out of shield. The default move used to punish an opponent hitting your shield.

Hard: side-tilt -> run -> short-hop -> forward-air -> jab -> jab -> jab -> side-tilt

Forward-air has great range, and throws downward. With a short hop, it is a perfect combo tool.

Playing Kiki

General strategy

Kiki can draw walls and platforms with her special attacks. She is also strong and has a good range, but she is slow.

She shines at defensive play styles, you want to detect a flaw or a bad habit in your opponent's game and punish it. To maintain a good distance between you and your opponent is the key, you often out range them but are vulnerable to close combat. Your shield and defensive walls are your best friends ... That and your side-tilt which is super strong with long range.

Kiki can abuse the attack-slide mechanic. When Kiki lands while still performing an aerial attack, she keeps most of her momentum. This allows her to attack while moving. Building incredible pressure if used wisely.

Kiki's aerial-down does not stop on landing.

Kiki is simple to understand, and require experience to play against. It is often a favorite of beginners.

Playing the advantage

You can get super early kill using your walls to deny your opponent's recovery. Against low recovery (from below stage's ground), just put a wall. Against high recovery, you will need to be a bit more creative.


Playing the disadvantage

You always want to recover high. Use your double jump early, then up-special to draw a platform behind you. That way you regain your double jump and can go higher, putting space between you and your opponent.

Your momentum-cancelling move is your up-special. Spam it if you took a bad hit that may KO you.


Common combos

Kiki is not combo-heavy. One strike is generally enough. Though, to evade close combat, there's always this one: jab -> jab -> side-tilt

Playing Pepper

General strategy

Pepper has a very versatile move set, allowing you to get creative in combat. With a teleport, and attacks sending her opponent in literally all directions, she is a combo power-house ... If you set up the right conditions.

Pepper takes time to master, but can be very surprising in the hands of inventive players.

Playing the advantage

If you placed your cat, Carrot, off-stage. You can teleport on him to chase your opponent. When you teleport right on them, your foo will be thrown downward, often losing a life. You can also use your side-aerial to slam them downward.

If you are on stage, your side-special correctly timed can catch them even far away.

Playing the disadvantage

If you placed Carrot on the stage, you can teleport on him to be safe.

You can also come back with your up-special, which can be directed. UP+LEFT+B will always move to the left. If the opponent is edge guarding, a side-special can clear the path.

Clear the path, then fly on your broom

Common combos

Slam dunk: down-tilt -> jump -> side-aerial -> fast-fall -> down-tilt -> side-special

You can repeat the first part of the combo, but it is easily evaded by a tech-slide.

Turn around!: down-special -> side-tilt -> teleport

Using the teleport aggressively


You want to talk like a professional Super Tilt Bro. player? Here's a small cheat sheet.

Aerial attack: An attack performed in the air.
Forward-aerial, up-aerial, down-aerial, neutral-aerial: a specific aerial attack.
Forward-special, up-special, down-special, neutral-special: a specific special attack.
Forward-tilt, up-tilt, down-tilt: A specific tilt.
Helpless fall: A state where your character is unable to do anything befor touching the ground again. Shown by falling head-first.
Hitstun: A period when you can't do anything after getting hit. Shown by blinking.
Jab: The grounded attack done by pressing A, without direction.
KO: Losing a stock.
Self destruct: Losing a stock by your own means (voluntarily or involuntarily.)
Special attack: An attack done by pressing B, and optionally a direction.
Stock: A life. You begin the match with some stocks, lose them by goind out of screen, and win when your opponent has no more stock.
Tilt: A grounded attack done by pressing a direction and A.

One last word

This guide scratches the surface of many aspects of the game. Reading it will not magically improve your level. The guide is there to show you what to watch in your and your opponent's gameplay in order to improve.

Actually gaining skill requires practice. If you want to find other players to train, Super Tilt Bro.'s Discord is dedicated to that 😉

  • Like 3
Link to comment
Share on other sites

  • 1 month later...
  • 2 weeks later...
  • 1 month later...

Super Tilt Bro. 2.0-beta1: New character, new adventure!

What's new in the game?

A new challenger!

(A character nobody knows here, I have to present him!)

From the depths of the Internets, where the dark magic of retro-gaming is omnipresent, here comes the Video Game Sage!

The Sage is a close-combat focused character with very strong attacks and the best survivability in the game.


He notably specializes on multi-hits attacks which are devastating against shields. His great ground-speed allows to bait opponent's moves, but beware of his reduced air-mobility.

The beginning of an adventure!

Are you too often playing alone? Empty servers don't help? There is a solution!

The arcade mode is made for you!

In this story-driven series of challenges, you will fight, break targets, run, save the world, eat a cake, and get medals!

Graphics were not the first thing finished, but the gameplay is here. Let see if you can get the best medal!

Big KO explosions!

Finally! We cannot pretend to be a platform fighter without a big explosion when a stock is taken!



Pepper received a huge amount of buffs. In her design, she was designed to have an option for every situation, but seriously lacked viable options to score KOs.

That, and her best combo-starter - the down-tilt - had too much end-lag making it unreliable.

Here are the details:

  • forward-tilt now has more scaling knockback, improving its kill-power on weakened opponents
  • down-tilt has less end-lag, improving its ability to start combos
  • aerial-neutral has no more a weak hitbox at the beginning, it is easier to connect the sweet spot now (which is a semi-spike)
  • aerial-up has more scaling knockback on its sweet spot, making its kill-power a real threat
  • neutral-special has a stronger spike at the end of teleport, it is rare to use it offensively it won't change but the option is here
  • forward-special has more scaling knockback, it may become a dangerous combo-finisher

What's new under the hood?

Full screen animations

It is no accident that the KO explosion came at the same time as The Sage. Both use the novel feature of the engine named "full screen animations."

The idea is to hijack the attributes table, responsible for affecting color palettes to the screen's regions, as a big bitmap.

This is 64 bytes of the Video RAM. Even if Video RAM access is (terribly) inefficient, that tiny section can be modified at will, impacting the entire screen. With smart use of palettes, it appears as a big semi-transparent picture above the background.


It required quite some changes in the depths of critical pieces of the engine (for the nerdiests: the NMI handler), and caused a swarm of bugs. They were almost everywhere, but it seems that all have been squashed by now.

The engine can handle multiple effects going at once, even with the netcode imposing heavy rollback. Details out-scope this release note, but there are counters, flags, ideal state, actual state, asynchronous screen repair operations, and other fun stuff involved.

Custom hitboxes

When The Sage punches, it bypasses normal hitbox behavior. Instead of just throwing the opponent, it displays an animation before.

Actually, there is more than that. If the punch misses its target, it creates a windbox (like an hitbox, but gently pushing the opponent.)

Both of these actions are made thanks to one kind of new hitbox: the custom hitbox. While the normal hitbox holds all values necessary to compute knockback of a hit, custom hitboxes hold a pointer to a routine and opaque values. So the character's code can do whatever it wants on hit.

New characters state

Characters are state machines. Everything they can do is a state. Jumping, running, attacking, attacking downward, being hit, ... even being idle. Roughly, what a player says being "an animation" is a state.

This is a lot of states. Of course, most of them are specific to the character and purely internal. We could make a character without jump by not implementing the "jumping" state.

Some states, however, can be called directly by the engine or any other part of the code. Since the engine expects them to exist, these states must be implemented for all characters. Of course, it is wise to avoid having too many of them.

The new state is named "owned." A character in this state must do ... nothing. Like imperatively nothing: do not process inputs, do not leave this state, do not draw sprites, NOTHING! The idea is that another part of the code is taking the responsibility of controlling you.

It is currently used by the sage, to prevent the opponent from moving during the big animation. That said, it could be the base for a grab move. Actually, when a character grabs another, he takes control out of his opponent.

  • Like 2
  • Wow! 1
  • Love 2
Link to comment
Share on other sites

Super Tilt Bro. 2.0-beta2: The urgent nerf

What's new in the game?

The Sage hit by a nerf

This is a very little release, the new character was way too strong and buggy. So, the biggest change is his nerf and fixes.

The problem was the Sage's neutral special, the powerful punch. It was way too easy to land, and ensured a KO each time.


The hitboxes when charging his punch made it a super fast attack. They are removed completely, ensuring the opponent can react to the move.

The punch is still the most powerful attack in the game, but not guarantee a KO from the middle of the stage ... Not until your opponent is at 60% damages.

The Knight animation appears only if the Sage is on his last stock. When the Knight is here, the punch pierces through your opponent's shield.

The punch animation has been modified to show its windbox. When hit by the windbox instead of the hitbox, the opponent is "gently" pushed.

Punching your opponent's weapon will not score you a hit anymore.

Windbox's physics has been improved.

Not related to the punch, but alternate skins of the Sage have been changed, his magic is now always distinct from his body. Without that, the shielding and side-special looked weird.

Colorful portraits!

This is something I wanted in the game for a long time, but only recently found a nice way to integrate it: Characters' portraits now have the same colors as your character.

See, we know who is player 1, and who is player 2

This is actually a feature requested during the VGS tournament, without it watching replays was very confusing when both players picked the same character. Thank you for the feedback!

Fixed crash in arcade

When spamming "A" in a cutscene to speed it up, you may crash the game. This is not possible anymore.

Pro-tip: Use the START button to skip a cutscene entirely.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Create New...