DEV Community

Cover image for FRAGLINE: an offline neon arena shooter that turns one laptop and a Wi-Fi network into a LAN party
Saikat Das
Saikat Das

Posted on AI-assisted

FRAGLINE: an offline neon arena shooter that turns one laptop and a Wi-Fi network into a LAN party

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass

What I Built:

FRAGLINE is a fast, neon 2D arena shooter that runs in a browser tab, with bots and LAN multiplayer built in. It's a modern tribute to the Newgrounds classic Unreal Flash, built from scratch in Godot 4.7.

The "touch grass" part is the multiplayer. There are no accounts, no matchmaking servers and no lobbies on someone else's cloud. One person runs a tiny local server and shares a 6-character room code. Everyone else on the same Wi-Fi opens the address in their browser and joins. Up to 8 players fight in the same room, with the host's bots filling any empty slots.

It's for friends, classmates and teammates who want a quick game in the same room, on whatever devices people already have. The whole game is about 4 MB of data, so nobody has to download or install anything.

  • 9 weapons with alt-fire modes (Shock Rifle combos, rocket jumps, sticky grenades, wall-piercing sniper shots)
  • 6 mirrored PvP arenas with hazards, plus a Training Room
  • Bots at 5 skill levels that navigate ladders, jump pads and drop-through floors
  • 12 recolourable fighters, a CC0 synthwave and drum-and-bass soundtrack, and no sprite sheets (everything is drawn in code)

Demo:

Screenshots (from the repo):
FRAGLINE main menu over a live bot match
Foundry arena: molten pit, catwalks and a shock-rifle beam
Cryo Station arena

Code:

FRAGLINE

Fast, neon 2D arena combat that runs in your browser, with bots and LAN multiplayer built in.

A modern tribute to the Newgrounds classic Unreal Flash, built from scratch in Godot 4.7.

Godot 4.7 Platform Multiplayer Game data Tests

FRAGLINE main menu over a live bot match

Why FRAGLINE

  • Opens in a browser tab. No install and no plugins. It runs on WebGL 2 using Godot's no-threads web build, so it works on any static host without special server headers.
  • Small download. All the game data (art, levels, sound and music) is about 4 MB. Every character, weapon, level and effect is drawn in code, so there are no sprite sheets.
  • Bots that play properly. Bots find their way around every arena using ladders, jump pads and drop-through floors. They pick up items, avoid traps, lead their shots and dodge. There are five skill levels, from Rookie to Godlike.
  • LAN multiplayer with a room code. Host a match and share a 6-character code…

Run it yourself:

./tools/build_web.sh        # export to build/web/
python3 tools/serve.py      # serves on http://localhost:8000 and on your LAN
Enter fullscreen mode Exit fullscreen mode

How I Built It:

Engine and rendering. Godot 4.7 with the no-threads web export, so it works on any static host without special headers. Characters, weapons, levels and effects are all drawn procedurally in code, which keeps the download tiny.

Levels are ASCII art. Each arena is a block of text in src/data/maps.gd. The game builds collision, decoration, item spawns and the bot navigation graph from it, and every map is mirrored for fairness.

Events at the core. The World node announces every game event: shots, hits, pickups, kills. Single-player handles them locally. In multiplayer the host sends the same events to every client, so both modes run the same rules code.

LAN multiplayer over WebRTC. tools/serve.py serves the game and swaps WebRTC connection details using the room code. After that, game traffic goes browser to browser and never touches the server. Your own movement runs locally so it never feels laggy, and other players are updated 30 times a second and smoothed. The host makes the final call on damage, pickups and scores, and checks each client's fire rate, ammo, weapon ownership and muzzle position.

Bots. They plan routes over a navigation graph (walking, jumping, double jumps, drop-throughs, ladders, jump pads). They pick what to do (heal, armour up, grab a weapon, hunt, roam) by scoring each option. In a fight they choose a weapon for the range, lead moving targets, arc grenades, aim rockets at your feet and set up shock combos.

Tests. Four headless suites cover combat rules, menus, bot navigation on every arena, and full bot matches.

Why Does Open Innovation Matter?

Every layer of FRAGLINE is open: the engine (Godot, MIT), the music (CC0, The Cynic Project), the sound effects (CC0, Kenney) and the font (OFL, Chakra Petch). That is what made a small, self-hostable, no-account game possible. There's no hosted API to depend on, no per-player cost and no service that can disappear, so the game works on a Wi-Fi network with no internet connection once it's served. A closed platform would have meant accounts, servers and fees between friends sitting in the same room.

My Agent Session:

I used github copilot to plan, and start the initial building of this shooting multiplayer game project. and then completed this project using Claude Code.

Prize Categories:

  1. Gemma Open Wright Local LLM through llama.cpp
  2. Github Copilot (for making this project possible)

Team:

  • Saikat Das : me :P

Top comments (3)

Collapse
 
t-rexbytes profile image
Sourish Panda •

Finally got some free time from work and since then I've been playing this is @ipsamurai for a while, and this is quite dope man 😂, also this fits quite as well, cause i've been seeing games are being playable in website with no hardware, and this hits that as well, keep up the work. :D

Collapse
 
dronzer2code profile image
Subarna Maity •

Lets Brawl 😈

Collapse
 
nextgenrungames profile image
NextGenRunGames •

AI-assisted technical question from NextGenRunGames: since the host validates hits, pickups, and fire rate, have you tested reordered or delayed WebRTC events too? A shot and pickup crossing in transit is a useful edge case for checking that clients converge on host state. Do your headless match tests simulate packet delay or loss, or are those tests local?