Game Documentation

Battle on the High Seas!

Latest Post da Bomb - Badge Post-Mortem by John Adams

da Bomb contains a multiplayer sea battle game that takes place over a private, BLE radio network at DEF CON 27. To play, you must have a badge and have someone else to fight against nearby. By nearby, we mean "within BLE Radio Range", which can be anywhere up to 50 feet away or less (maybe more), depending on radio conditions.

Badges are aware of other badges and advertise their status using BLE GAP advertisements periodically, approximately once every three seconds. If you want to disable this, enable airplane mode.

Once you connect to another player we open a high-speed BLE L2CAP connection that allows for fast transmission and real-time game play! Unlike our turn-by-turn DC25 badge, we're using some fancy code to play in real-time.


This is complicated but really, just look where the A and B joysticks are!

Getting Started

Pressing the battle icon on the main badge screen or selecting “Sea Battle” from the launcher (access the launcher by hitting the gear icon on the default badge screen) will place you on the WORLD MAP. On the world map you can see other badges moving around.

Ship positions are randomized at initial configuration load and do not represent actual distance, but they do represent your current position in the game. You must be within radio range to see and battle ships.

The color of each square on the World Map "radar" represents what their level is versus your level.

Difference Factor Display Color
≥ 3 2x XP RED
≥ 2 1.50x XP ORANGE
≥ 1 1.25x XP YELLOW
≤ 1 .75x XP GREEN
≤ 2 .25x XP DARK GREEN
≤ 3 0 XP GREY

To find an enemy, pull up along side them with your square (in white) and press down on the "B" joystick to activate the "select" button.


Engage a ship by pressing down on the B Joystick, or exit the WORLD MAP by pushing down on the A joystick. When you engage another ship, your badge connects to theirs and the ship selection screen will be shown.

Ship Selection Screen

At this point you'll have 20 seconds to select a ship. Select a ship by moving the A joystick. When both players have selected a ship, the game will advance to the battle screen.

Note! Until you both agree to fight, you can always press the selection button again to back out and change your ship. Only when you both agree will combat begin.

Initially, you can only use the PT boat. Each level up will unlock a new ship up to level 6. The ships, levels, and their differences are:

Lvl Ship Max HP Max Energy Max DMG Shot Cost Shots per Sec Special Cost Special
1 PT Boat 200 100 25 30 2:1 S 30 4-way Diagonal Shot
2 Patrol Boat 250 120 40 30 1:1 S 40 4-way Axis Shot
3 Destroyer 400 120 50 60 1:2 S 40 Lay Mine
4 Cruiser 400 250 45 60 1:1.25 S 250 Shield
5 Frigate 250 300 80 70 2:1 S 150 Heal
6 Battleship 600 400 100 100 3:1 S 100 4-way Diag Cannon
?? S____ 300 300 30 45 3:1 S 100 Cloak
?? T____ 300 300 60 45 3:1 S 300 Teleport

There are many ships and many parameters that run the SEA BATTLE simulation. Ships are represented in a physics simulation and each have their own drag, velocity, and acceleration profiles. Experiment with them and learn!

The first six ships will unlock, one per level, as you level up. There are also two hidden ships which can be unlocked. They are known as [redacted and [redacted]. Find a way to unlock them and their power can be yours.


All ships have at least one special, unique to their class.

The Cruiser's shield stops all damage for a short amount of time at great energy cost. It costs 250 energy to enable the shield.

The Destroyer is the only ship that can lay mines, laying 6 mines at a time.
Each mine lasts for seven seconds, at which point it will expire.

The Frigate is the only ship that can heal - It will restore HP at a specific rate, allowing you to recover from damage.


A sample combat screen

Once a ship is selected, combat will begin. Combat is limited to two minutes.

The attacker starts on the left side of the screen. The defender, on the right.

In combat, regardless of what side of the screen you start on, two things are always true:

Your ship that you are controlling is always colored black.
The enemy and their bullets are always colored red.

You can now use the A joystick to move and the B joystick to fire your weapons on the axis (remember Robotron? Yeah, that. You get to shoot in four directions. woooot!)

Pressing down on the B joystick will use the ships “Special”

The top bar indicates how many hit points you have. When this reaches zero, you die. When the enemy’s reaches zero, they die.

The bottom bar indicates Energy. Energy is required to fire and to use your special. It recharges at a rate that is based on the ship type. Beware! If you run out of energy, you cannot fire and you cannot use your special. With some ships, this can be certain death!

Without energy, you cannot use specials or fire weapons. a "boop" sound will alert you to this.

Each ship regenerates energy at a specific rate, as specified below

Level Ship Max Energy Regeneration Rate
(per second)
1 PT Boat 100 30
2 Patrol Boat 120 30
3 Destroyer 120 60
4 Cruiser 250 60
5 Frigate 300 90
6 Battleship 400 90
?? [redacted] 300 90
?? [redacted] 300 120

Note that some special ships can cloak or submerge. When cloaked or submerged energy does not regenerate.


Damage is calculated when your ship is hit by a bullet.

Each ship can deliver up to MAX DMG (see the above table)

Running aground will cost you and your opponent 10% of your max hit points. Do this for too long and you will sink. It can be a useful strategy when you're cornered.

The damage calculation is:

Starting with a A random number between 75% and 100% of the maximum damage possible (max_dmg is taken from the attacking ship)

Then Multiply by:

  • 1.25 if a mine
  • .9 if the user being hit has the UL_PLUSDEF (Defense) unlock
  • 1.1 if the user who fired has the UL_PLUSDMG (Additional Damage) unlock

Your level and XP DO NOT come into play in the damage calculation. Only the opponet's MAX DMG value matter here.

Combat continues until a player's HP reaches zero or the time runs out.


The  game ends when one player reaches zero HP.

If the game ends due to a timeout, the player with the highest HP wins. In a tie, both players split the XP pool.

XP Gain on a win is calculated by:

(80 + ((winners_level * 16)) * factor

On a loss, it is:

(10 + ((losers_level) * 16)) * factor

factor comes from the level difference table, shown above.

Obviously, battling lower level opponents gets you no where fast. Find higher level players  to play with and challenge yourself!

If you TIE with your opponent, we will split the XP on Win with both of you, because that's only fair.

Level up

When you reach the required XP for each level, you'll get a level up message and you'll advance to the next level.

This one goes to 11. After level 11, no further advancement is possible but you will continue to gain XP.

Level RANK Required XP
1 Ensign 0
2 Lt. Junior 400
3 Lieutenant 880
4 LT Commander 1,440
5 Commander 2,080
6 Captain 2,800
7 Rear Admiral 3,600
8 Rear Admiral 2 4,480
9 Vice Admiral 5,440
10 Admiral 6,480
11 [redacted] 10,000

Radio Issues

The BLE radio on the NRF 52840 isn't the best thing in the world. We've tried our best to build the radio subsystem to the specs on the data sheet and when we see signal loss, we've tried to recover the transmission as much as we can. We expect performance in the high noise, caustic radio environment of DC27 to be a difficult one, but we hope our code changes will make it through the noise.

When the badge experiences major signal loss, the game will abort with a BLE XMIT FAIL message or RADIO LINK LOST message.

If your badge continues to fail to connect, hit the RESET button at the top of the badge and try to battle again.

Lastly, Thanks for playing!

We hope you enjoy our game as much as we have making it for you.

If you find bugs, please file an issue in our github at: