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

  • 2 months later...

Super Tilt Bro. 2.0-beta4: New musics, refined mechanics, and a terrible secret!

No beta-3?

It was a hotfix, not worth a release note 😉

What's new in the game

New musics

Two new musics by Tuï can be heard in the game.


We also hear that a half-baked jukebox is hidden somewhere. Useful to listen the soundtrack, if you can find it 😉

New Stage

Name: The Plank
Environment: Jungle
Hazards: No
Feature: A big platform!


The platform can be reached with a single jump, which allow to rapidly switch between it and the main stage. Be it to retreat or to extend a combo.

Changes to the stages

Moving platforms in The Pit now stay lower, making them more reliable when trying to avoid falling in the terrible pit. Also, being on a moving platform is no more a voucher to pass through Kiki's platforms.


On The Hunt, characters now get a lighter version of their colors for a better contrast with the dark background.

Gameplay adjustments

There are some adjustments to gameplay. Nothing big by itself, but overall the game feels better. Here's the list.

The game can now be paused, by pressing START. When both characters are at the same place, they are slightly pushed apart. The screen shake has been improved. The ground friction physics has been refined, allowing more flexibility when designing characters. The most notable impact is on Sinbad who is now a bit more slippy.


The Sage now has a hitbox on his side-special. This move is meant as a secondary recovery move, so having no hitbox seemed fine. It appears that it is troubling, so now there is a weak upward hitbox trailing behind The Sage.

The Sage can now slightly change his course when charging the punch midair. Having a very low air speed, it allows for subtle placement without being a big buff of the punch. Remember, The Sage shines on the ground, not in the air.


NTSC vs PAL crossplay is now working.

It was a special beast because a PAL NES runs the game at 50 frames per second, while an NTSC one runs at 60 frames per second. All values about durations, and velocities are different in both systems to compensate. This is nice, it allows NTSC system to exploit the extra frames to feature smoother movements. It also means that these are two (very slightly) different games, sadly with netcodes every tinny difference is a big problem.

The solution is to detect crossplay situation. In this case, the NTSC system will skip one frame out of 6 (effectively running at 50 FPS), and use values of the PAL version. That's right, if needed, the game emulates PAL on NTSC systems for the sake of compatibility.

Link to comment
Share on other sites

  • 2 months later...

Super Tilt Bro. 2.0-beta5: Better arcade mode, new music and fixes

What's new in the game?

New music

Spirit of chivalry, by Kilirane, can be heard in game.

The knight, overwatching the battlefield. He is calm, yet will storm-in soon.


Arcade mode has received the graphics it deserves. Thanks to Fawzi from GGS Studio Creation!

As we were at it, musics are no more random, cutscene have sound effects, and fights happen on exclusive stages matching the story!

Finally, the medal system has been revamped. You now get copper, silver, or gold medal per section. Your final score is the average of your medals.

New stage

Deep Rock is the name. It is a three-platform stage, with platforms lower than in Skyride, so characters have an easier time jumping on it.



Pepper's down-special has been improved. The animation is better, and the aerial version now has a spike hitbox at the end.

Fixes and adjustments

In The Hunt, the buff vanishes if you lose a stock.

AI opponent will recover better on The Hunt.

On the character selection screen, player 2 can enter by using the second controller even when an AI opponent is selected.

Fixed Pepper's ability to stall midair by spamming down-special

Fixed Pepper's up-special weird reaction to windboxes.

  • Like 1
Link to comment
Share on other sites

Posted (edited)

Haha, I see it. Youtube choose the worst picture possible for the preview 😳

It is effectively an attributes thing, but just a design issue I really should fix. What you see is the splash effect when the opponent is KOed, the effect is done by forcing some regions to a red/white palette, reseting to palette zero (the dominant one in all stages) when the explosion locally fade, finally restoring original scene's attributes.

The problem with this map is that there are two "dominant" palettes: the sky and the house's interior. Reseting to zero seems glitchy in this case. Worsened by the still picture, animated it is a bit more acceptable. It all is repaired on the third step, when the attributes table is restored.

Edit, to add thing:

You can see the glitchy effect in the video at 1:06, and the intended effect at 2:00 (note how it still is glitchy on platforms, but way less noticeable.)

This trick of animating the attributes tables to have full screen animation at little cpu/vblank cost is definitely blog-worthy. When I get time, I'll fore sure describe it at length with details.

Edited by RogerBidon
Link to comment
Share on other sites


It's comming!!!

The game is in a state that is worth your hard earned bucks. The carts prototypes are stable ... We just need your energy (and dollars) to prepare the real production!

Here's the kickstarter "coming soon" page: https://www.kickstarter.com/projects/brokestudio/super-tilt-bro-new-online-nes-game

Please share it around! The world needs to know! And at this point, seeing our passion being shared is the biggest motivator to keep going forward 🤩


  • Like 1
  • Love 1
Link to comment
Share on other sites

Member · Posted
6 hours ago, RogerBidon said:


It's comming!!!

The game is in a state that is worth your hard earned bucks. The carts prototypes are stable ... We just need your energy (and dollars) to prepare the real production!

Here's the kickstarter "coming soon" page: https://www.kickstarter.com/projects/brokestudio/super-tilt-bro-new-online-nes-game

Please share it around! The world needs to know! And at this point, seeing our passion being shared is the biggest motivator to keep going forward 🤩


Was a new PCB created for this game because of the onboard Wi-Fi? The reason I ask is because the UNROM 512 put out by Broke Studio are hit or miss to work on my analogue nt mini noir. 

Link to comment
Share on other sites

  • 3 weeks later...
  • 1 month later...

Super Tilt Bro. 2.0-beta6: Gameplay adjustments

What's new in the game?

Kickstarter is over

My first time on this side of the Kickstarter, and a huge success! Thank you!

Gameplay adjustments

This update focus on refining the base mechanics of the game. It is a lot of very small things that, put together, should noticeably improve the feeling of the game controller in hand. Because there are few things more annoying than a character not doing exactly what you want.

Of course, doing it right is especially hard when we developed the game for a long time and are accustomed to the current controls. So if you have feedback on what still feels weird controlling your character, I'll gladly take it :)

Now the list of these little things:

  • It is now easier to input short-hop into aerial
  • It is now possible to maneuvering left/right during most aerial attacks
  • Hitting opponent's shield triggers a small hitpause
  • Hitting opponent's shield pushes them slightly
  • Out of shield animation can be cancelled by a jump
  • Being hit reloads the wall jump
  • Keeping down pressed after a tech buffers a shied
  • Buffering the same move you are performing works more consistently
  • It is now possible, and easy, to reverse up and down variants of tilts, specials and aerials


Sinbad received a big graphical update. Lots of details in this tiny sprite!

Did you see? The statues have been updated too!


Pepper can now change direction while flying on her broom. Sound's like a big change, it's actually a way to ease the input to fly in a specific direction. If you input the direction a bit too late, it will turn to move like you expected. Could have been in the "Gameplay adjustments" section, but it is specific to Pepper, and who knows, maybe you'll find other uses for this new ability.

Pepper also has new victory and defeat animations. I was about to put a GIF of that but, hey, guess you'll have to win and lose a game playing Pepper to see it!


Laggy players can no more play from the past.

Due to internet latency, and the nature of rollback netcode, getting your opponent's input from the past is expected. But there is a limit, when a laggy player hits you several seconds in the past, it becomes unfair on top of being weird. Now the server checks for inputs too far in the past and move them to a more reasonable time.

Of course this is experimental, if you know one of those players who lags a lot while having a correct ping, please send feedback on how the patch impacts your experience.

  • Like 1
Link to comment
Share on other sites

  • 2 months later...

Super Tilt Bro. 2.0-beta7: Revenge of the Sage

What's new in the game?


Jump, aerial jump, wall jump, special jump, ... Definitely not enough.

Let me introduce the brand-new footstool jump!


Yes you can use your opponent as a footstool to jump higher. It interrupts their attack, makes them fall, and don't consume your aerial jump. Definitely a powerful move but beware, it is pretty hard to land and exposes you if failed.


Last update introduced the short-hop aerial mechanic. Easing the input of an aerial attack near the ground. It was devastating for the VGSage who rarely wants to short-hop but have a lot of combos with its full jump aerials. Now the Sage has easier time full jumping than short hoping, fixing the issue.


Another problem with last patch: air friction is now applied during aerial moves. It is almost imperceptible for others. The Sage however is terribly not aerodynamic, this change nerfed his combo game even further. To fix it, air friction of the Sage has been greatly reduced, but it makes him more vulnerable to ring outs, so an extra resistance to knockback has been implemented for him.

Resistance to knockback is like the weight in the Smash Bros series. So the Sage is officially the first heavyweight character of Super Tilt Bro.!

Last change to the Sage this patch is that his roll move is now impacted by the gravity. It was weird to ignore that law of physics.



Kiki can now paint a platform as soon as returning from a ring out. Formerly she had to land on the ground before.


Pepper's AI is now better at recovering. She often trapped herself above the edge by changing direction rapidly on her broomstick.

What's new under the hood?

New cart, new emulator

Hardware development is on fire, we think we have the final version of the cart.

Porting the game to it progressed enough that we can update the emulator. 2.0-beta7 is the first version that runs on an emulator compatible with the game as it will be released.

It may be obscure but is a huge milestone, resulting from great progresses on both hardware and software fronts.

Rescue mode

With the hardware nearing completion, our first priority is safety. Upgrading software on the NES is a world first, we want to be sure not to brick your cartridges.

When things go wrong with your phone, the last resort is to reset it to factory. The Super Tilt Bro. cart is no different. No matter how safe we make the upgrade, you may need at some point to reset it to a state known to work. This is why we implemented the rescue mode.

By pressing Start+B at boot, you will enter this rescue mode. This is a special section of the ROM that is never updated and can rewrite the game from a compressed backup. Everything is in the cartridge you have nothing more to do than start the rescue, and watch it rewriting your game.

Retro Windows are welcome

By popular demand, Windows 32 bits is now supported. The Windows version of the game contains both the 32-bit and 64-bit versions, so the vast majority of users still use the full potential of their 64 bits CPU.

Note that with changes in the emulator, this dual version is still lighter than the former "64 bits only" version.

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...