We are currently working on new rules for what content should and shouldn't be allowed on this website, and are looking for feedback! See Esolang:2026 topicality proposal to view and give feedback on the current draft.
Tonk
- This is still a work in progress. It may be changed in the future.
Tonk is an esoteric "programming language" by user:raiseafloppafan7741 in 2026 based on the tank game Woomy-Arras.io. However, it is less like a programming language and more like Conway's Game of Life, as it is a zero-player game.
Tonk is based on the 2TDM (Team Deathmatch) mode, with a 9750x6500 map ported from the game.
Program structure
Programs in Tonk are structured like this:
Red Team
Player Name
Player
1/1/1/1/1/1/1/1/1/1
1
Blue Team
[AI] Bot Name
AI
1/1/1/1/1/1/1/1/1/1
1
Leaderboard
Player Name - Annihilator - 59.21k
[AI] Bot Name - Mini Asteroid - 32.15k
Max Players: 100
Bot Amount: 100
Map ID: 1234abc
~~~~ ~~~~ .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ==== ====
~~~~ ~~~~ .... .... .... OOOO .... .... .... OOOO OOOO .... .... .... OOOO .... .... .... ==== ====
~~~~ BBBB .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... RRRR ====
~~~~ .... .... .... .... .... .... .... .... OOOO OOOO .... .... .... .... .... .... .... .... ====
~~~~ .... .... .... OOOO .... .... .... .... .... .... .... .... .... .... OOOO .... .... .... ====
~~~~ .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ====
BBBB .... .... .... .... .... .... .... .... """" """" .... .... .... .... .... .... .... .... RRRR
~~~~ .... .... .... .... .... .... OOOO """" """" """" """" OOOO .... .... .... .... .... .... ====
~~~~ .... .... .... .... .... .... """" """" """" """" """" """" .... .... .... .... .... .... ====
~~~~ .... .... OOOO .... .... """" """" """" OOOO .... """" """" """" .... .... OOOO .... .... ====
~~~~ .... .... OOOO .... .... """" """" """" .... OOOO """" """" """" .... .... OOOO .... .... ====
~~~~ .... .... .... .... .... .... """" """" """" """" """" """" .... .... .... .... .... .... ====
~~~~ .... .... .... .... .... .... OOOO """" """" """" """" OOOO .... .... .... .... .... .... ====
BBBB .... .... .... r..b .... .... .... .... """" """" .... .... .... .... .... .... .... .... RRRR
~~~~ .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ====
~~~~ .... .... .... OOOO .... .... .... .... .... .... .... .... .... .... .... .... .... .... ====
~~~~ .... .... .... .... .... .... .... .... OOOO OOOO .... .... .... .... OOOO .... .... .... ====
~~~~ BBBB .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... RRRR ====
~~~~ ~~~~ .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ==== ====
~~~~ ~~~~ .... .... .... OOOO .... .... .... OOOO OOOO .... .... .... OOOO .... .... .... ==== ====
Program files are meant to represent the initial game state plus an overview.
Team players
At the top are the players for the red team and blue team. A team player may be specified like this:
[Player Name]
[Player|AI]
Body Damage/Max Health/Weapon Speed/Weapon Health/Weapon Penetration/Weapon Damage/Reload/Movement Speed/Shield Regeneration/Shield Capacity
[Spawn Order]
The first line is the player name. If the player is a "human", then this can be anything. If the player is a bot, then it must start with "[AI]" and begin with a name from the list of bot names, including the long removed one.[1]
The second line determines whether the player is a "human" or AI. AI players have the same AI as in the real game, however Player ("human") players have smarter AI but have a more realistic FOV, for example player players using the M-61, Transmitter, or Hephaestus with high Weapon Speed will stay further away from enemies while shooting in the general direction of their enemies, Overload users will tend to move slower and keep their drones close, but if they see a weak AI player then they will massacre them. Player players can only move in the four cardinal directions or a combination of perpendicular directions (so 8 directions), while AI players can move in any direction just like in the real game.
The third line determines the stats of the player's tank. The skill points spent must not be greater than 42, they must be valid (i.e. no greater than 9 or 12 or something else depending on the stat), and they must be according to the tank. For example, Orbital Strike would not have Weapon Speed, while Chinook would not have Weapon Speed, Weapon Health, Weapon Penetration, Weapon Damage, and Reload.
The fourth line determines the spawn order. Simply put, this refers to the index starting at one of the point on the map this will spawn at. In the small example map below, a tank on the red team with an index of 1 would spawn at the first r, while a tank with an index of 2 would spawn at the second r. Players may share the same index.
..b. .... .b..
.... ""r" ....
.... .... .r..
Leaderboard
The starting leaderboard determines the players' tanks. (even though they should've been up there) An example leaderboard could look like:
Leaderboard
[AI] bent boomer is bad - Bent Boomer - 91.73k
4NAX - Rocket Ball - 59.21k
AI tank restrictions
Some AI names have some restrictions to the tanks they can use, however. As of now, the restrictions are:
- [AI] bent boomer is bad can ONLY use Bent Boomer. Anything else results in an error.
Max players and bot amount
Max Players simply determines the maximum amount of "human" players. Currently, it does nothing other than error out when you have more "human" players than the limit.
Bot Amount determines the maximum amount of bots that can spawn. Since bots spawn randomly on a random team at a random position, this can be helpful to control program behavior a tiny bit for small programs utilizing few bots. This can be set to zero to have no bots.
Map
Map ID is a 9-digit hexadecimal number in lowercase. Currently, it does nothing.
The map is ASCII art of the 2TDM map in Woomy, with the initial positions for red team players being marked with r and blue team players being b.
Players' exact spawn positions are randomized within the sub-cell, with each cell of the map containing 4 sub-cells horizontally.
For the ASCII art of the map, ~~~~ is a blue team base cell, BBBB is a blue team base cell with a blue base defender, ==== is a red team base cell, RRRR is a red team base cell with a red base defender, OOOO is an obstacle, """" is a pentagon nest cell, and .... is an empty cell. In the actual game's configuration file for 2TDM, they would respectively correspond to n_b1, bas1, n_b2, bas2, roid, nest, and norm. The horizontal spaces between cells (for example, the space in ~~~~ ~~~~) are just to make the ASCII art look nicer. However, they must be preserved. The ASCII art does not have to be preserved, however. However it would be nice if you did.
Commands
- This section is still a work in progress. It may be changed in the future.
Commands are based on the interactions between entities.
Tier 1 tanks
A Basic killing or being killed does nothing. Sorry but you're just not an interesting tank.
Tier 2 tanks
A Cruiser killing another entity directly adds the score of the victim without running it through the formula.
A Machine Gun killing another entity subtracts the score of the victim from its own score.
A Mini Grower killing another entity sets its own score to the modulo of its score and the score of its victim. If the victim's score is zero, then the result is infinity.
A Pounder killing another entity changes their score by an inputted byte instead of the other entity's score run through some formula.
Tier 3 tanks
A Clicker killing another entity multiplies its score by the score of the victim.
Tier 4 tanks
An Antivaxxer killing an Antivaxxer-branch tank excluding itself (e.g. Coronavirus, Big Pharma, Misinformer, etc.) will kill all other bots with the same name.
A Cookie Clicker killing another entity will divide its own score by the score of its victim. Division by zero results in infinity.
A Sporulator killing another entity will set a spawn point at the victim's location for a dead teammate. The spawn point is deleted after a teammate respawns there.
Tier 5 tanks
A Calibre killing a Snipelet will spawn a Kasane bot of the same team, if possible.
A Chaga killing another entity will set a spawn point at the victim's location for a dead teammate using a freezing tank. (e.g. Chaga itself, Freezer, Hatsune, Fentanyl, etc.) The spawn point is deleted after a teammate respawns there.
A Chinook carrying a teammate will copy its teammate's score to its own score. This is only possible with player players as AI players both in Tonk and in the real game cannot take advantage of Chinook's ability.
A Featured Tanks dying to another entity will set the score of the killer to a random integer in the interval [0, 100000].
A Fly Amanita killing another entity will set a spawn point at the victim's location for a dead teammate using a homing tank. (e.g. Fly Amanita itself, Homing Twin, Psychopath, etc.) The spawn point is deleted after a teammate respawns there.
An M-61 killing another entity prints out the entity's score as a byte modulo 256.
A Snipelet killing a Calibre will spawn a Kasane bot of the same team, if possible.
An Omnimancer killing another entity will set a spawn point at the victim's location for a dead teammate, just like the Sporulator. The spawn point is deleted after a teammate respawns there.
A Wooly Milk Cap killing another entity will set a spawn point at the victim's location for a dead teammate using an acidic tank. (e.g. Wooly Milk Cat itself, Acid, Fentanyl, etc. but not including removed tanks) The spawn point is deleted after a teammate respawns there.
Removed tanks
A Kasane killing a Calibre or Snipelet will spawn a Kasane bot, if possible.
Developer tanks
Arena Closers
Arena closers of any kind (ex: 360-Machine Closer, Arena Summoner, FORD F150) spawning will trigger a lot of other arena closers spawning, which will end the match and halt the program after they massacre everyone. However, you cannot spawn them in any way, so this exists for no reason.
Overdone
An UwU killing any entity will print "urmom". However, you cannot spawn it in any way, so this command exists for no reason.
Examples
One Time Cat
Since Tonk programs never halt, this program does not halt as well and will produce unpredictable results after you input your byte. Also, a shape or a sanctuary might spawn between any of these tanks, completely ruining the program.
Red Team
Kasane Teto
Player
2/6/3/4/6/8/6/2/0/1
1
Blue Team
[AI] Hatsune Miku
AI
2/6/7/4/6/8/6/2/0/1
1
[AI] Have you considered how many of us you killed
AI
0/0/0/0/0/0/0/0/0/0
2
Leaderboard
Kasane Teto - Annihilator - 65536
[AI] Hatsune Miku - M-61 - 59221
[AI] Have you considered how many of us you killed - Basic - 0
Max Players: 1
Bot Amount: 2
Map ID: 45fc91d
~~~~ ~~~~ .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ==== ====
~~~~ ~~~~ .... .... .... OOOO .... .... .... OOOO OOOO .... .... .... OOOO .... .... .... ==== ====
~~~~ BBBB .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... RRRR ====
~~~~ .... .... .... .... .... .... .... .... OOOO OOOO .... .... .... .... .... .... .... .... ====
~~~~ .... .... .... OOOO .... .... .... .... .... .... .... .... .... .... OOOO .... .... .... ====
~~~~ .... .... .... .... b... .... .... .... .... .... .... .... .... .... .... .... .... .... ====
BBBB .... .... .... .... .... .... .... .... """" """" .... .... .... .... .... .... .... .... RRRR
~~~~ .... .... .... ..br .... .... OOOO """" """" """" """" OOOO .... .... .... .... .... .... ====
~~~~ .... .... .... .... .... .... """" """" """" """" """" """" .... .... .... .... .... .... ====
~~~~ .... .... OOOO .... .... """" """" """" OOOO .... """" """" """" .... .... OOOO .... .... ====
~~~~ .... .... OOOO .... .... """" """" """" .... OOOO """" """" """" .... .... OOOO .... .... ====
~~~~ .... .... .... .... .... .... """" """" """" """" """" """" .... .... .... .... .... .... ====
~~~~ .... .... .... .... .... .... OOOO """" """" """" """" OOOO .... .... .... .... .... .... ====
BBBB .... .... .... .... .... .... .... .... """" """" .... .... .... .... .... .... .... .... RRRR
~~~~ .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ====
~~~~ .... .... .... OOOO .... .... .... .... .... .... .... .... .... .... .... .... .... .... ====
~~~~ .... .... .... .... .... .... .... .... OOOO OOOO .... .... .... .... OOOO .... .... .... ====
~~~~ BBBB .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... RRRR ====
~~~~ ~~~~ .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ==== ====
~~~~ ~~~~ .... .... .... OOOO .... .... .... OOOO OOOO .... .... .... OOOO .... .... .... ==== ====
Display
There is also a display to allow the user(s) to watch the program execute. However, there can optionally be multiple displays from separate clients, either on the same machine or over the network. The display is exactly like that of the actual game.
Implementing
Implementing Tonk would require remaking ALL of Woomy-Arras.io, following the license terms, and re-engineering it into a zero-player game.
The only real issue, which is implementing the base, is not as bad since Woomy-Arras.io (specifically, the latest woomy.online version although previous versions are available as well) is open-source at DrakoHyena/woomy-online on GitHub. However, that means that if you want to do the least amount of work, you'd have to stick with JavaScript. If you want to write an implementation in any other language, you'd have to port around 200,000 lines (around 15,000 for the server + 180,000 for the entity definitions as of the time of writing) to another language. Also, the game is very reliant on JavaScript's dynamic nature and functions such as setTimeout so porting to a more static language or low-level like C++ is highly unrealistic.
The requirement for multiple displays like the Undyne Programming Language would require a client-server architecture, which should not be too hard to implement as the actual game is already like that.
Tonk might never be implemented, however a variation of it will eventually be made that is similar but different enough to be implementable without any issues of any kind.
See also
Notes and references
- ↑ The long name in question is "UWU OWO LMFAOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOUWU OWO LMFAOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOUWU OWO LMFAOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO". It was removed and replaced with "UWU OWO LMFAOOOOOO" because it was too long and would vastly overshoot the leaderboard whenever it was on there.