Realm of the Mad Frog Header

Realm of the Mad Frog (ROTMF)

A tongue-in-cheek tribute to “Realm of the Mad God,” made in GameMaker to see if I could twist a primarily single-player engine into supporting a mini-multiplayer arena. It's a fun, short, bullet hell mayhem with questionable netcode!

The concept is simple: roam a top-down battlefield, blast creatures, collect loot, level up, and attempt to do it all with multiple players connected. Since GM2 doesn't offer large-scale network features out of the box, I made do with basic socket code and a patchwork of third-party advice. It got far enough to spawn enemies, broadcast positions, sync player data, and handle an inventory system, but the iteration pipeline was unsustainable, as every code change meant recompiling and testing multiple game instances.

ROTMF screenshot 1ROTMF screenshot 2ROTMF gameplay GIFROTMF screenshot 3

Controls & Gameplay Loop

Movement is WASD, aiming is mouse-based, and firing is a simple left-click. Killed enemies drop loot, or sometimes junk. With the Hule Inventory System, you can equip items or juggle them around. The underlying architecture tries to broadcast these changes to connected players, so everyone sees your updated gear or the new monsters in real time.

Example: Minimaps & Remote Entities

/// draw_map(minimap_x, minimap_y, scale)
// ...
with (obj_remote_entity) {
  if sprite_index in [spr_goblin, spr_demon, spr_skeleton, etc.] {
    draw_set_color(c_red);
  } else {
    draw_set_color(c_white);
  }
  // Position them on the minimap, scaled down by 'scale'.
}

Each entity's position is mirrored by the server, so we can paint a low-res “blip” on your local minimap.

Example: Basic Packet Sending

// server sends player ID
buffer_seek(buffer, buffer_seek_start, 0);
buffer_write(buffer, buffer_u8, PACKET_MYID);
buffer_write(buffer, buffer_u8, player_id);
network_send_packet(client_socket, buffer, buffer_tell(buffer));

Simple approach: create a buffer, write an opcode (PACKET_MYID), then attach relevant data. The client decodes it, sets local ID, and that's how each instance knows who's who.

Video

Where It Stands

With the daily overhead of compiling multiple GM2 builds to test networking, I eventually put the project on ice. What exists is a partial MMO-ish bullet-hell with real items, enemies, which is synced between all players, at least in short local tests.

Conclusion

This was a fun experiment in pushing GameMaker beyond its single-player comfort zone. I used a mix of open-source sprites, the Hule Inventory System, and some networked-object tutorials for references. The code is up on GitHub if you want to try it out.

That's all for ROTMF. Maybe it'll be revived someday if GM2 gets more robust multiplayer tools, or if someone's up for the challenge!