morgan herlocker

about work bsky github posts rss

Worm Helsing

Today my friend, Dan Hanf, and I released a game for the 4MB game jam. It was the first game jam for both of us, and the first game either of us had released.

The 4mb game jam

The 4MB game jam is a game jam that takes place every other year. The rules of the jam state that every submission must be a standalone desktop application and it must be below 4MB. This year, the theme was 'Worms, Holes and Wormholes', so we naturally decided to make a game about worms, and holes, and... you get the idea.

In the age of 100GB+ games, multi-dozen-MB web pages****, and 7+ minute loading times, the idea of trying to make something fun with a much smaller footprint was compelling. The submissions included a full 3D FPS in just 21KiB, as well as a puzzle game written in hand coded NASM assembly (2.4KiB).

Our game

Itch.io / Worm Helsing

Worm Helsing is an isometric hack-n-slash where you explore a procedurally generated warren of vampiric worms as an intrepid explorer. We wrote the game in C using the raylib library. All audio was made by Dan in Reaper, using a combination of synths and mic'd sounds. I made the sprites and animations in Aseprite, a simple pixel editing tool, with procedural effects sprinkled in to cut size.

In the end, we submitted a game that was 1,043 KiB, uncompressed, with no additional dependencies.

Relative size breakdown

Below is a windirstat view of the game's files. The executable was built for Linux Mint, and compressed with UPX. UPX has a long history in the world of demoscene, and works by compressing your program with a thin deflate wrapper that is unpacked at runtime. It has some downsides, in particular we found that Windows antivirus tries hard to prevent the user from executing a program like this, but in the case of a gamejam or demoscene submission, this is forgivable.

As you can see, our exe was the largest component, followed by music. Some of the smaller submissions were able to exploit system resources, like SDL2, which comes preinstalled on Linux Mint, or Win32 for Windows. While I was very pleased with the size of our raylib binary, if we wanted to hit the sub-100KiB tiers, we would reconsider it for a library that could use one of these preinstalled dependencies. Some of the submissions got quite creative with their use of system dependencies, such as using a lib that uses the system web view, or a submission that relied on the system image viewer opened in a 2nd window.

Takeaways


5-31-25