TomLabs Apps
← All applications

Rascals

A cartoon shootout of little soldiers in the jungle, online or several players at one keyboard.

web game multiplayer typescript websocket Public Homepage

Rascals

A playful 90s cartoon army top-down arena shooter set in the Vietnam war, inspired by the Czech classic Bulánci (2001) and Cannon Fodder: little soldiers run around a jungle clearing, pick up real Vietnam-era weapons and shoot each other. Play with friends online (share a four-letter room code or invite link) or hot-seat with up to four players on one keyboard / gamepads — even without internet.

Inspired by Bulánci; no name, code or assets of the original game are used.

In the middle of the clearing stands a cottage where granny Anča and grandpa Láďa live. They are modelled on my own grandparents: shoot the cottage and Anča storms out with a fly swatter, yelling, while Láďa puts out the fire with a hose and patches the holes with his hammer.

Features

  • Online rooms for up to 8 players, several local players per device.
  • Offline hot-seat: the whole game runs in the browser, no server needed.
  • Keyboard layouts (WASD, arrows, IJKL, numpad), gamepads, touch joystick on phones.
  • Colt M1911, Ithaca 37 shotgun, M16 and M60; weapon crates respawn; 3-minute rounds with a scoreboard.
  • Procedural cartoon placeholder graphics; hand-drawn sprites drop in by file name — see docs/ASSETS.md. The soldier is composed from layers (body, shirt, hair, hat, vest, helmet), ready for customisation and armour pickups.

Architecture

shared/src   simulation shared by server and client (TypeScript)
  constants.ts   tick rate, speeds, weapons
  maps.ts        arena maps as character grids
  sim.ts         deterministic movement + wall collision (used for prediction)
  room.ts        authoritative game state: players, bullets, pickups, rounds
  protocol.ts    WebSocket message types
server/src   Node HTTP + WebSocket server (ws): rooms, 30 Hz game loop, /health, static files
client/      Vite app: canvas renderer, input, prediction + interpolation

Networking model: the server is authoritative and runs at 30 ticks per second. Clients send only input bits with a sequence number. Local players are predicted with the same sim.ts code and reconciled against the server's acknowledged input; remote players are interpolated about 100 ms in the past. Bullets are real projectiles simulated on the server. The hot-seat mode runs the same Room class in the browser.

Development

npm install
npm run dev        # server on :3000 (tsx watch) + Vite on :5173 with /ws proxy
npm test           # simulation tests (node:test)
npm run typecheck
npm run build      # dist/public (client) + dist/server.mjs
npm start          # serves the built app on PORT (default 3000)

GET /health answers { "status": "Healthy", "version": "…", "name": "rascals" }.

Docker

docker build -t rascals .
docker run -p 3000:3000 rascals

WebSocket path is /ws; behind nginx proxy it with Upgrade / Connection headers.

Deployment

Production runs at https://rascals.tomlabs.xyz on the VPS (docker + nginx), container port 127.0.0.1:5240. azure-pipelines.yml builds and tests every push; on main it copies the sources to /opt/rascals/releases/<build>, switches /opt/rascals/current, runs docker compose -f docker-compose.production.yml up -d --build, installs nginx.rascals.tomlabs.xyz.conf (with the WebSocket upgrade for /ws) and certbot, and then waits for GET /health to answer Healthy with the new version. Degraded keeps the release but fails the run; Unhealthy or no answer switches back to the previous release.

The pipeline needs the variable group rascals-deployment with the secret VPS_SSH_PRIVATE_KEY_B64 (base64 of the codexdeploy SSH key, the same key the other VPS apps use).

Admin page and settings

/admin shows every weapon's numbers and has a switch per crate item: what is switched off stops coming in crates in every game on the server (running ones too) and in hot-seat games that can reach the server. GET /api/settings answers { "disabled": [...] } to anyone; PUT /api/settings needs Authorization: Bearer <ADMIN_TOKEN> (the admin page asks for the token once and keeps it in the browser).

  • DATA_DIR (default ./data, /data in the container) holds settings.json. On the VPS it is the volume /opt/rascals/data, owned by uid 1000; /health reports Degraded when the folder cannot be written.
  • ADMIN_TOKEN comes from the secret RASCALS_ADMIN_TOKEN in the variable group rascals-deployment; the pipeline writes it to /opt/rascals/rascals.env. Without the secret the file already on the server is kept, and without any token production refuses every change (local development allows them).

Map editor

/editor (linked from the menu as "Editor map") paints an arena on a grid and shows it drawn the way the game draws it. Terrain tools paint cells (sandbag wall, grass, bush, tree, player start, crate spot); ready-made objects are placed as a whole with their scripted behaviour — today the cottage with granny Anča and grandpa Láďa (PREFABS in shared/src/maps.ts). The editor checks the map as you go (outer wall, at least two starts and one crate, one whole cottage with its door free) and keeps the draft in the browser; Vyzkoušet plays the draft in a local game.

  • Maps are the same character grid as the built-in ones (# wall, . grass, B bush, T tree, H cottage, S start, W crate). GET /api/maps lists every arena; PUT /api/maps/<key> saves one and DELETE removes it, both with the admin token. They live in DATA_DIR/maps.json.
  • Every save registers the map under <key>~<revision>: games already running on the old version keep it, new games get the new one. A room on a custom map sends its grid along with joined, so players who have not got it can draw it.
  • The menu lists the arenas and remembers them in the browser, so the custom ones work without internet too.

Changelog

0.13.0 — 2026-10-01

  • The test range has grown a corner on the right with granny Anča's cottage (hens included) and Ježibaba's hut on its chicken leg, with trees around it for her to wake.
  • A Postavy section in the range panel: call granny out angry, send her home or beat her down; the same for grandpa Láďa; set off Ježibaba's anger stage 1, 2 or 3, send her home or kill her (she comes back for another go). Each of them, and the hens and pheasants, has a switch: on they behave as in the game, off they stand still as living targets - Ježibaba frozen up on her broom makes a good target for trying the SA-7. The debug panel shows how they are doing.
  • The SA-7 seeker now sounds like one: a pulsing growl while it sees Ježibaba and locks on, then a steady tone while it has her ("missile lock on sound" by Alxy, Freesound, CC0).
  • Fixed: while the hut on the chicken leg leapt away (or stamped about in stage 3), its knee stayed on the ground and the thigh stretched into a long brown pole.

0.12.0 — 2026-10-01

  • A weapon catalogue in the menu (the Zbraně tab): every weapon and piece of gear as a card with its picture, filtered by kind, and the picked one large with what it is and how it works in the game, its damage, rate of fire, range and ammunition, and how often it turns up in crates.
  • Walking trees can be set on fire - by the flamethrower, napalm, phosphorus, incendiary rockets or burning ground. A burning tree goes on lashing out and lights the bushes it walks through, then falls to ashes after five seconds. Bullets, blasts and blades still do nothing to it.
  • The SA-7 turns up in crates about three times as often on maps where Ježibaba lives.
  • Granny Anča beaten down to nothing drops her fly swatter as she runs home ("Moje plácačka!"). Whoever picks it up kills with one swat, just like her - but after its first kill it falls apart.
  • Fixed: every close-quarters kill was reported as a machete kill; the knife, the entrenching tool and the swatter now show as themselves.

0.11.1 — 2026-09-30

  • Hand-drawn SA-7 Strela.

0.11.0 — 2026-09-30

  • A special weapon for the Black Forest: the SA-7 Strela, a shoulder-fired anti-aircraft missile, comes in crates only on maps where Ježibaba lives. Hold the trigger with her flying in front of you (up to about 16 tiles): brackets close in on her and the seeker locks on with a tone (ZAMĚŘENO). Let go and the missile climbs after her over trees and walls and hits her for 140 - three hits bring her down. Without a lock it flies straight like a small rocket, since the heat seeker cannot find a soldier on the ground. Two missiles, a fresh tube clipped on between them.

0.10.0 — 2026-09-30

  • A new menu in the style of a big online game client: a dark top bar with the gold HRÁT and the tabs Vojáci, Mapy and Jak se hraje; the picked arena dimly laid out behind everything; a dock at the bottom with Hrát tady, joining by room code, the test range and the gold ZALOŽIT ONLINE HRU.
  • Hrát: the arenas as cards with a picture of each map, the modes as big tiles, the round length, kill limit and bots below, and your party - the soldiers on this device - on the right.
  • Vojáci: the players on this device with their controls and the character editor. Mapy: all arenas large, with a way into the map editor. Jak se hraje: the rules.
  • On a phone everything stacks into one column and the call to action spans the width.

0.9.0 — 2026-09-30

  • New map: Černý les. A dark spruce forest walled in by a thicket of young spruces, with needles and cones on the ground, mist drifting through and the edges sunk in shadow; it follows the seasons too (snowy spruces in winter).
  • In its middle stands Baba Yaga's hut on a chicken leg: a log cabin with a mossy roof and a crooked smoking chimney, swaying on one scaly clawed leg that now and then shifts its weight, a ladder hanging from the door and a candle in the window, where Ježibaba looks out from time to time.
  • Bullets, shotgun pellets, crossbow bolts and thrown knives glance off the hut (with a spark) and can come back at whoever fired them.
  • Explosions at the hut make Ježibaba angry, in three stages shown by three moons over the roof:
    1. she climbs down to her door and casts a spell that turns the attacker into a frog, a pig, a rabbit or a goat for 15 seconds - an animal cannot shoot or pick anything up, but can still be killed;
    2. she wakes the three trees nearest the hut: they pull their roots out of the ground, open glowing eyes and for 25 seconds walk after the nearest soldier (slowly - you can outrun them), lashing with their branches at everyone in reach and knocking them back; shots thud into them. Then they walk back to their holes and take root again;
    3. the hut stamps about on its leg so the ground shakes (soldiers close by are knocked off their feet), and she flies over the forest on her broom for 30 seconds, cursing soldiers at random - into an animal, with stiff legs, or with burning pain - then flies home and calms down, back to stage one.
  • Ježibaba can be killed while she is out of her hut (at the door or up on her broom, where you see her flying) - she has four times a soldier's health. When she dies she vanishes, her trees go home, and the hut leaps away off the map in big bounds, leaving trampled ground behind; it is back in the next round. The kill feed names her (větev, kletba, dupnutí) when her magic finishes someone off.
  • Music of its own for the Black Forest ("Hunt in the Woods"), and a wild folk gallop while Ježibaba flies on her broom ("Witch's Gallop"); the map music comes back when she is home or dead.
  • The hut is a ready-made object in the map editor too (Chaloupka na kuří nožce, 3 × 3), checked like the cottage: one per map, whole, with the ground in front of its door free.

0.8.0 — 2026-09-29

  • The arena follows the season of the year (spring from March, summer from June, autumn from September, winter from December):
    • spring: fresh green grass full of flowers, blossoming bushes and trees;
    • summer: the green clearing as before, with a few flowers;
    • autumn: yellowing grass strewn with fallen leaves, orange and red bushes and crowns, leaves drifting down from the trees;
    • winter: snow over the clearing, bare oaks with snow on their branches, snow-capped bushes, snow on the sandbag walls, the cottage roof and the fence, and snowflakes falling.
  • The server picks the season for the room, so everyone in it sees the same one; it is checked again every round. Adding ?season=spring, summer, autumn or winter to the address shows another one.

0.7.1 — 2026-09-29

  • A hen or a pheasant killed by an explosion or fire (napalm, the flamethrower, burning bushes) comes out as a roast (PEČÍNKA!): a golden-brown bird with drumsticks in paper frills, steaming where it fell. A roast hen lies there until the next round; a roast pheasant is still fetched by grandpa Láďa, who carries the roast home.
  • Fixed: a pheasant shot down over a wall, or lying right against one, left grandpa walking on the spot without reaching it. A bird (or a roast) that comes down on a wall now lies at its foot where he can pick it up.

0.7.0 — 2026-09-29

  • A new character editor: a big soldier that turns round and shows how he stands, walks, shoots or spins, and every choice as a picture of your soldier with it, grouped in tabs (Hotoví, Postava, Hlava, Obličej, Výstroj, Šatník). It works with a finger as well as a mouse.
  • Ready-made soldiers to start from: Rambo, Veterán, Zelenáč, Radista, Odstřelovač and Kapitán (your skin stays your own), and a random look.
  • More to choose from: ten skin tones, nine hair colours (chestnut, platinum and white among them), a mohawk and a ponytail, a beret, a Rambo headband and a radioman's headset, stubble and a goatee, black-and-green face paint in stripes or blotches, trousers in olive, khaki, black, tiger stripes or woodland camouflage, and a slim, normal or stocky build.
  • Extras you can combine: sunglasses, a cigar, an eye patch, a scar, a scarf over the mouth, dog tags, an ammo bandolier, a backpack or a radio with its antenna. Sunglasses and a cigar are now extras, not the whole face, so they go with any beard.
  • The wardrobe keeps up to twelve looks you saved, for every player on the device.
  • Looks saved before keep their moustache, beard, shades or cigar.
  • Two soldiers hiding in the same thicket see each other when they are close (up to three tiles apart); from outside the bush they stay hidden. Bots see the same way.

0.6.2 — 2026-09-29

  • Killed while winding up a throw, a soldier drops the live grenade (smoke, tear gas, napalm or phosphorus) at their feet (POZOR!) and it goes off when its fuse runs out, so it can take the killer with it.
  • Watch the bots fight: set every player in the menu to a bot and start the game (online or here); you only watch, and see everything, including hidden traps, wires and soldiers in bushes. With the room code you can watch someone else's game the same way.
  • Fixed: bots of one team could come back to life on the same spot and then walk around inside each other. Nobody respawns on top of someone else now, and bots that end up together step apart.

0.6.1 — 2026-09-29

  • Team mode is for people only: the bot count in the menu no longer applies to it, the people in the room split into Modří and Rudí.
  • A player slot in the menu can be played by the computer ("Bot – lehký / normální / těžký" instead of the keys): it joins with that name and look and fights on your side in co-op, so you can play, say, you and a bot against two bots in team mode.

0.6.0 — 2026-09-29

  • Co-op mode: all the people in the room fight side by side against the bots. Picking it with no bots sets four; the number of bots is how strong the enemy is.
  • Team mode: people and bots split into two even teams, Modří and Rudí. Whoever joins takes a bot's place, and when players leave a bot crosses over to keep the sides even.
  • In both team modes shirts and names are in the team colour, the score under the clock shows both teams, a team scores the kills of all its soldiers (the kill limit counts for the whole team) and the scoreboard lists the soldiers team by team with the winner at the end of the round.
  • Friendly fire is off by default: bullets, fragments, blasts, fire and punji pits spare your teammates. With the "Přátelská palba" box ticked they hurt, and killing a teammate costs a point.
  • Bots only hunt soldiers of the other team.

0.5.4 — 2026-09-28

  • Volume control: the "Zvuk" button (in the menu and in the game) opens sliders for the overall volume, the effects and the music, plus a switch to turn the sound off. The settings are remembered; M still mutes everything in the game.
  • Music: a battle groove plays during the game on the music channel, looped with a soft crossfade and quieter behind the scoreboard between rounds.
  • "Nové kolo" button in the bar starts the round over (scores to zero, everyone back with a pistol, the map as new). Offline it is always there; online only whoever made the room has it, and it passes to the next player when they leave.
  • Granny and grandpa are a bit slower: a soldier can now outrun them when they give chase, and grandpa takes his time walking about his work.
  • A picket fence in front of granny's cottage, with a gate at her door. When grandpa loses his temper he first tears a picket off it (KŘUP!) and beats soldiers with that; the gap stays until the next round, and with the fence stripped bare he goes back to his hammer.
  • Three hens scratch and peck round the cottage and scatter when a soldier comes near. They can be shot, blown up, burnt or cut down (KOKODÁK!), and they walk into punji pits, M14 mines and tripwires like anyone else - and whoever kills one has granny out of her door at once, after him and nobody else.
  • Granny or grandpa beaten until they run home stay inside for the rest of the round: neither shots at the cottage, a dead hen nor a fire bring them out again until the next round.
  • A cottage nobody puts out burns right down to a smoking ruin - charred wall stumps and timbers, fallen roof beams, glowing embers and the chimney still standing - that grandpa cannot fix until the next round. One he puts out in time only gets sooty and he patches it up as before.
  • Wild pheasants strut about the arena and burst into flight when a soldier comes near. Shoot one (KRRÁ!) and it lies there until grandpa Láďa comes out for it, carries it home by the legs and, after a while to pluck it, sits at the other window gnawing a leg. Hit him on the way and he drops it to go after you; a new pheasant turns up every half minute or so.
  • The cottage door swings open on its hinges as grandpa comes out or goes in, and shuts behind him (granny storming out still leaves it wide open).
  • Game mode and round settings in the menu: Deathmatch (everyone for themselves, the most kills wins), a round of 1, 2, 3, 5 or 10 minutes or with no time limit, and an optional kill limit (10, 20, 30 or 50) that ends the round as soon as someone reaches it. The clock shows the limit under it.
  • Rename yourself in the game: the "Jméno" button in the bar opens a name field for every player on the device (with the dice for a random one); everyone sees the new name at once and the menu remembers it. Arriving straight from an invite link without a name of your own, you are asked for one. Typing a name no longer moves your soldier or mutes the sound.
  • Your soldier is pointed out whenever it (re)spawns and at the start of a round: a ring in its colour closes in on it, pulses for a moment and a bouncing arrow says TY (or its name when several play on one device).
  • Entrenching tool: hits whoever is within reach; otherwise hold the trigger while standing still to dig, and the earth heaps up into a mound on the tile in front (cover like a wall, but a heap of soil, not sandbags). It never wears out. Mounds only go on open ground (no bushes, trees, soldiers, spawn points or the cottage door), a green or red outline shows where; one soldier can have six up (the oldest crumbles), rockets knock them down and a new round clears them.
  • Hand-drawn entrenching tool.

0.5.3 — 2026-09-28

  • Fewer rounds per crate: one KA-BAR knife, two M14 mines, two RPG-7 rockets, two punji pits and four M79 grenades.
  • Hand-drawn M127 flare.
  • Map editor ("Editor map" in the menu): paint sandbag walls, grass, bushes, trees, player starts and crate spots, place the cottage with granny and grandpa as a ready-made object, see the arena as the game draws it, undo and redo, and try it out straight away. Saved maps appear in the new map picker in the menu, online and in hot-seat games.
  • Bots: add up to seven computer soldiers (easy, normal or hard) to an online or a hot-seat game from the menu. They see only what a player could (not through walls, not into a bush or smoke unless you fire), go for crates and the best gun they carry, line up and shoot. A player who joins a full online room takes a bot's place.

0.5.2 — 2026-09-28

  • An invite link takes you straight into the game instead of the menu; if the room no longer exists, the menu says so. Sound (and full screen on a phone) switches on with the first tap or key press.
  • A new app icon: a grinning GI in a camouflaged M1 helmet with an ace of spades tucked in the band.
  • A set-up M1919 stays standing on the ground: the tripod does not move, only the gun turns on it and the gunner walks round behind. Q / E jumps off it (you take up your previous weapon), and walking right up to a free gun mans it again, with the belt it was left with. Anyone can take over a free gun; a gunner who dies leaves it standing.
  • C4, a bazooka rocket or a mortar round wrecks a standing gun caught in its blast (ŘACHY!); grenades and rifles do not.
  • The setting-up ring sits next to the health bar instead of over the head.
  • Debuffs next to the health bar, like in World of Warcraft: limping from a trap and choking on tear gas show as little icons with a sweep of the time that is left.
  • Machine guns overheat: the M60, M1919 and RPD heat up with every shot (a bar in the inventory slot) and jam after a few seconds of continuous fire, steaming, until they have cooled down.
  • Tripwire: tie a grenade down with one press, stretch the wire to where you stand with the second; whoever walks into it (you too) sets it off. Other players only see the wire up close.
  • M127 flare: fired about 8 tiles ahead, it hangs under a parachute for 8 seconds and lights up everyone around it, even in bushes and smoke, for players and for granny and grandpa alike.
  • The kill feed shows the weapon's picture between the killer and the victim, both in their colours.
  • Weapon statistics on the admin page: shots, hits and kills per weapon across all online games, with a reset button.

0.5.1 — 2026-09-28

  • Granny now really yells when she storms out of her cottage: a recorded voice instead of the synthesised squeal.
  • Granny and grandpa have names now: Anča and Láďa, after the real grandparents who inspired them.
  • Grandpa Láďa has grey hair and grey brows now.
  • The flak vest bar sits under the health bar on the player cards, and soldiers wearing a vest show it under their health over their heads too.
  • Granny Anča and grandpa Láďa can be hurt: they have three times a soldier's health (no bar shown), and bullets, blasts, fire, the machete, punji pits and tear gas all work on them, limping and choking included. Worn down, they run back into the cottage and stay in to recover for a while.
  • Hurt grandpa Láďa while he is putting out the fire or repairing the cottage and he loses his temper: he goes after the soldiers with his hammer, one blow kills, then he gets back to work.
  • Granny's temper cools down slowly while nobody shoots at the cottage.
  • Every explosion cracks a sandbag wall right next to it; a second crack brings it down.
  • Character customisation: click the soldier next to your name in the menu and pick skin tone, hairstyle (short, buzz cut, long, afro, bald), hair colour, headwear (bandana, boonie hat, patrol cap, nothing) and a face (moustache, beard, sunglasses, cigar), with a live preview you can turn round. The look is remembered and everyone in the game sees it.
  • Players who leave the name empty get a random GI name (Hank Miller, Doc, Sarge, …), different from everyone else in the room; the dice next to the name suggests one.
  • Test range ("Střelnice – vyzkoušet zbraně" in the menu, offline): target dummies behind sandbags, bushes, trees and in a bunker, a panel to hand yourself any weapon, vest, helmet or healing, infinite ammo and god mode switches, a reset button and live debug info (FPS, projectiles, your soldier's magazine, cooldowns, reload and more); F3 hides it.
  • Crossbow: a silent shot that does not give you away in a bush, 75 damage per bolt, one bolt at a time. Bolts that miss stick in the wall or drop to the ground for 20 seconds, and whoever carries a crossbow picks them up again.
  • KA-BAR knife: stabs whoever is within reach (without using the knife up) and is thrown when nobody is; a thrown knife lies on the ground for anyone to pick up.
  • C4 satchel charge: thrown a short way, it waits on the ground with a blinking light until you set it off with the M57 firing device; the big blast knocks down walls and trees.
  • Granny and grandpa cannot see soldiers hiding deep in smoke: they head for where they last saw you for a moment and then give up, unless you fire something loud (the crossbow and knife are quiet) or stand right under their nose.
  • Everything thrown by hand except the knife (grenades, smoke, napalm, tear gas, WP, C4) is thrown like the mortar fires: hold the trigger to wind up a longer throw (a dotted line and a small cross show where it lands), let go to throw. C4 is heavy and does not go as far.
  • Soldiers throw grenades, canisters, C4 and the knife overarm: the arm winds back behind the head while you hold the trigger and whips forward on the throw.
  • The crossbow and the thrown knife reach about half as far as before.
  • Napalm or an XM202 incendiary rocket that hits the cottage sets it on fire at once, like the real thing would; burning ground next to its walls keeps heating it up.
  • Test range: three of the dummies now patrol up and down across the firing lanes to practise leading your shots; a switch on the panel stops them.
  • Mk 2 "pineapple" grenade: a longer fuse than the M26 and less blast, but a lot of heavy fragments flying far.
  • M14 "toe popper" mine: a small hidden pressure mine that only its owner sees; whoever steps on it (the owner too) is hurt and limps for 6 seconds, and it goes off when another blast is close.
  • XM202: four incendiary rockets fired in quick succession, each setting the ground on fire where it bursts; the empty launcher is then thrown away. Very rare.
  • RPD: a Soviet light machine gun with a 100-round drum.
  • Hand-drawn crossbow, KA-BAR knife, C4 satchel, RPD, Mk 2 grenade, M14 mine, XM202 and tripwire, and a first-aid kit pouch on the ground instead of a crate.

0.5.0 — 2026-09-27

  • Real recorded sounds in stereo, with their full punch: gunshots from the CC0 Free Firearm Sound Library and Freesound (Colt 1911, an M1919 for the machine guns, AR-15 for the M16, AK-47, .30-06 rifles for the M14 and M21, …), a real grenade and a big artillery blast, the flamethrower, mortar and rocket launches, reloads, bullet hits, machete swings, grandpa's hammer and crackling fire.
  • A crate now holds a single loaded magazine; single-shot launchers (M79, mortar, RPG-7, bazooka) still come with several rounds.
  • Only one Claymore per crate. Once placed it turns into an M57 firing device: squeeze it to blow the mine from afar (no more tripwire). The device is gone when its mine is.
  • Grandpa comes out to put out a burning cottage and repairs it.
  • Explosions shake the arena and make the phone vibrate.
  • M1919 machine gun on a tripod: hold fire while standing still to set it up (CVAK!), then it fires very fast; the direction keys turn the barrel smoothly instead of walking. Switch weapons to pack it up.
  • M2 mortar: hold fire to push the crosshair further out, let go to fire. The shell flies over everything and a blinking red ring shows everyone where it will land.
  • RPG-7: three fast rockets with a bigger blast than the LAW, reloaded one at a time.
  • M20 bazooka: a slow, very rare rocket with a huge blast that knocks down the trees around it.
  • Punji pits: dig one in front of you; only you can see it. Whoever steps in, you included, gets bamboo stakes in the foot and limps at half speed for 4 seconds.
  • Napalm grenade: thrown over walls, it sets a circle of ground on fire for 6 seconds, burning soldiers and lighting bushes and trees.
  • Tear gas: a yellow-green cloud; soldiers in it choke (KCH KCH!), walk at half speed and shoot wild, and a lone player sees the arena doubled through watering eyes.
  • WP grenade: a small blast, a cloud of white smoke that hides soldiers and blobs of burning white phosphorus that start little fires where they land.
  • Big rockets break sandbag walls: an RPG-7 cracks a wall and brings it down with a second hit, a bazooka blows a hole in one go (KRACH!). The rubble can be walked and shot over; the outer wall of the arena, trees and granny's cottage stay standing. Walls are back at the start of every round.
  • Admin page: every weapon and piece of gear can be switched off in the crates, for all games on the server at once (protected by an admin token).
  • Hand-drawn M1919, mortar, RPG-7, bazooka, punji stakes and napalm, tear gas and WP grenades, and pictures of the vest and helmet on crate labels and player cards.
  • Guns kick when fired: the gun jumps back and up and the arms go with it (a pistol flips, a machine gun only shivers), with a muzzle flash; rocket launchers blast fire out of the back.

0.4.0 — 2026-09-27

  • Grenades, smoke grenades and the M79 fly in an arc over walls (with a shadow on the ground); an M79 round explodes where it lands.
  • Explosions have a blast radius and then throw shrapnel in random directions; the Claymore fans its steel balls forward.
  • Fire burns much longer: bushes 10 s, trees 18 s.
  • Granny's house can be set on fire (flamethrower or explosions): it burns slowly for 45 s, making granny angrier every second, and stays charred until the round ends. Bullet holes, machete gashes and blast scorch marks stay visible on the house.
  • The machete cuts a bush down in one blow and fells a tree in four (leaving a stump). Flames and machete blows on granny's house count towards her temper too.
  • Admin page at /admin with a table of every weapon (damage, rate of fire, DPS, magazine, reload, range, blast, shrapnel) and the world settings.
  • Ten more hand-drawn weapons in the crates: M14, AK-47, CAR-15, M1 Carbine, the M21 sniper rifle (one shot, one kill), M3A1 grease gun, Thompson, BAR, the single-use M72 LAW rocket launcher and Claymore mines that blow up when someone steps in front of them.
  • Inventory: picked-up weapons are carried and can be switched (Q / E, right Shift / slash, Y / O, Num + / −, mouse wheel, gamepad bumpers, a ZBRAŇ button on touch). Picking up a weapon you have adds ammo; you lose the inventory when you die.
  • Only automatic weapons (M16, M60, AK-47, CAR-15, M3A1, Thompson, BAR, flamethrower) keep firing while the trigger is held; the others fire once per press.
  • Real magazines and reloading: Colt 7 rounds, Ithaca 37 four shells loaded one by one, M16 20, M60 a 100-round belt, M79 one grenade. Reload happens by itself when empty, or with R / period / P / Num , / gamepad X.
  • New screen layout: player cards (score, weapon, health) on the left, your soldiers' inventory on the right, the arena in the middle; on a phone held upright they sit above and below the arena.
  • Full screen button; on a phone the game goes full screen and turns to landscape when it starts. The game can be added to the home screen and then runs full screen too.
  • Crates are no longer all equally likely: rifles and submachine guns turn up often, the M60, flamethrower, M79 and Claymore less often, the M21 and the LAW only rarely. The admin page shows each item's weight and chance.
  • Flak vest in the crates: it takes 40 % of every bullet, fragment and blast until it is worn through (a grey-blue bar above the health bar on the player card). It does not stop fire or a one-hit kill.
  • M1 helmet: saves you once from a one-hit kill (M21, machete, granny's fly swatter) and flies off with a CINK!
  • First-aid kit: a white box with a red cross that heals you to full. Gear you do not need stays on the ground for someone else.

0.3.0 — 2026-09-27

  • New look: 90s cartoon army in the Vietnam war — soldiers with bandanas, a jungle clearing, sandbag walls.
  • Real weapons: Colt M1911, Ithaca 37 shotgun, M16 and the new M60 machine gun (replaces the submachine gun).
  • Granny lives in a cottage in the middle of the clearing: ten bullets into her house and she storms out with a fly swatter — one swat and you are out. Bullets only make her angrier; after a while she goes back home.
  • More detailed soldiers who hold their gun with both hands.
  • Hand-drawn Colt M1911, Ithaca 37, M16 and M60. Weapons lie in olive army crates with the weapon on a label. Granny throws her window open and leans out as she gets annoyed.
  • New weapons: the M2 flamethrower (fuel tanks on the soldier's back) sets bushes and trees on fire — fire spreads through a bush, hurts anyone standing in it and leaves scorched ground or a charred stump. The hand-drawn M79 grenade launcher and M26 hand grenades explode, and a blast next to granny's house makes her very cross.
  • Machete: a swing kills whoever is right in front of you.
  • M18 smoke grenade: a purple smoke cloud for about nine seconds; soldiers inside it are hidden from the others.
  • Bushes to hide in: soldiers inside are invisible to the other players until they shoot or get hit. Trees with solid trunks and leafy crowns that turn see-through over your own soldier.
  • Weapon crates appear at random places around the map, always well away from the soldiers.
  • Soldiers are now built from layers, ready for character customisation and vest / helmet pickups.
  • Soldiers waddle when they walk.

0.2.0 — 2026-09-27

  • The game is now called Rascals, with a new icon.
  • Players are little cartoon people in caps instead of eggs (placeholder art until the hand-drawn sprites arrive).
  • Default player names are "Rošťák 1", "Rošťák 2", …

0.1.0 — 2026-09-26

  • First playable version: a meadow arena with crates, egg-shaped players, pistol, shotgun and submachine gun.
  • Online games: create a room, share the four-letter code or invite link, up to 8 players.
  • Hot-seat on one device: up to 4 players with keyboard layouts or gamepads, works without internet.
  • Touch joystick and fire button on phones.
  • 3-minute rounds, kill feed, scoreboard (Tab), respawn with short spawn protection.
  • Placeholder cartoon graphics; hand-drawn sprites can be dropped in by file name.