The new old wolf

2026-03-12

A long, long time ago — way back in 2014, in fact — some cool people came up with the idea of #LOWREZJAM — a game jam where you create games that run at a resolution of 32x32 pixels. (Later editions changed this to 64x64 pixels.) At the time, I had a bit of a nostalgia episode for old shooters, replaying Spear Of Destiny for the umpteenth time and trying out Blake Stone; so naturally, I figured that writing a small raytraced 3D game would be a great idea for the jam. And hey – with a resolution of 32x32, even if the per-ray performance was awful, it wouldn't matter much.

Animated GIF showing the same scene rendered with 512, 256, 128, 64 and 32 rays. All the walls are a solid red color, with some shading involved.

While this was a fun little exercise that kept me occupied for a couple afternoons, it turned out that the 32x32 resolution was way too low for a 3D experience. Even for a maze crawler game that you could play at your own pace, the image was just too blocky and it was difficult making out where to go. And so, like many times before, I gave up on the idea and didn't work on it any further.

Animated GIF showing a different scene at 512, 256, 128, 64, 32 and 16 rays. This time the walls are textured.

I live, I die, I live again

A few months went by until, one dark evening of February 2015, I found myself yet again feeling an itch to tinker on some sort of game in 3D. I dusted off the raytracer and ported the code from Pascal to C. No longer bound by the game jam's requirements, I bumped the resolution to 320x200, similar to Wolfenstein 3D or Doom. (Well, not entirely similar, as those games had non-square pixels, by virtue of displaying a 16:10 aspect ratio image on 4:3 aspect ratio monitors of the time – but I digress.) I then proceeded to fix some glaring bugs, like this funny little fisheye-esque effect.

Animated GIF with the camera rotating in place, showing a small maze. The walls at the edges of the image curve inwards.

Satisfied with the wall-rendering bit, I turned my attention to making the game into a proper shooter. Of course, in order to do that, I needed assets — graphics and sounds for the player weapons, but most importantly, for the enemies. Naturally, I headed over to the Freedoom project and stole borrowed some of their stuff. As time went by, the project grew: I added projectile-based weapons and hitscan weapons; some basic stupid enemies, and some more tricky and intelligent enemies (with obligatory infighting).

A pair of screenshots from the game, showing the same scene in a top-down 2D view and a 3D view. A blood-red skeleton spawns a line of explosions at a floating sphere-like demon.

I added normal doors, locked doors opened with a key, and locked doors opened with a switch. I implemented proper pathfinding for the enemies, first by running A* on the 2D tile map, and then by refining it to run on a quadtree representation of the map.

Screenshot of a debug feature in the game, where the top-down 2D view is overlaid with a visualisation of the quadtree. Each node is marked with a border: passable nodes with green, impassable with red. The centre of each node has lines going out of it, showing neighbour relations.

I added menus, allowing to tweak the game's settings and customize keybinds. I also implemented some basic support for internationalization — it'd be a tad weird to release the game only in English, without support for my native Polish. And of course, I added a save and load feature.

Screenshot of the "load game" menu, showing a list of saves, each accompanied by a thumbnail view of the saved game.

I even made a custom map editor — and when I say custom, I do mean custom: the UI is all original code, not using any widget library underneath. The editor map format recycles the savegame format, merely replacing item and monster entities with "prototype" equivalents.

Screenshot of the map editor, showing the level in a top-down 2D view. Tabs at the top of the UI allow for switching between different editing modes. The editor is currently in "tiles" mode, with a side panel on the left side offering a choice of different wall tiles that can be placed.

While my pace wasn't particularly spectacular – all the progress described above took span over three years – I was having fun, and the project was steadily moving forward. Until one day... I just dropped it. On the 12th of March 2018, I made the last commit. It's not that I decided I no longer want to work on the game, that I made a conscious choice; it just... kinda happened. Like playing with your favourite childhood toy for the last time.

In the void, no one can see you fade away

And so, the project laid abandoned on my computer's SSD. A year went by... then another. And another. Recently however, I found myself playtesting the game a few times... and with each session, I felt a deepening sense of regret. The game definitely was playable, and it was actually quite fun. All the base mechanics were there – different weapons, cannon fodder enemies, tanky enemies, tricky enemies... While there were definitely quite a few rough patches, there were also many aspects that felt polished and well iterated upon.

In retrospect, it was probably a mistake to keep a low profile. Back then I had a habit of working mostly "in shadow"; I didn't like sharing information about my efforts in-progress, considering it to be taking credit for results not yet achieved. Thus, apart from showcasing an occasional screenshot, I avoided posting about the game. This meant that when work stopped, there wasn't really anyone to bug me about it.

So here we are. Eight years later, I'm willing to give this another go.

Recent screenshot from the game, showing various enemies infighting each other. A few corpses already lay on the ground.

Talk is cheap, show me the code

Ugh. I wasn't a very experienced programmer when I wrote most of the code, and definitely not an experienced C programmer, so the code's a mess. That's not really an issue, though; shameful as the code may be, publishing it is not a risk.

I am a bit concerned about the game's assets; while I did a surprisingly good job in cataloguing most of the files, their origin and their licenses, there are some that are not accounted for – 52 out of 351, to be exact. Even then, some of the files have a known origin, but the author never specified a license – making them useless in a FLOSS context. This is the main thing I'd like to sort out before publishing the code or a demo version of the game.

So sorry, the git repository won't be public for some time still.

Something of a semblance of a plan

While it's too early for me to talk of a concrete plan, I have a list of various ideas that should keep me occupied for the nearest time:

All that being said, I plan on posting some regular updates – ideally every few weeks, at least once per quarer.

A game needs a name

Oh, right. All of this text, and I haven't dropped the game's title even once. Here it is: wilk320.

The game's main menu, with a rough black-and-white pencil drawing serving as the background.

The title is very much a reference to the game's origin — a simple raytracer mimicking how Wolfenstein 3D worked. When people talk of Blazkowicz's first exploits, they often shorten the name to "Wolf3D" – and you can probably see where this is going. "wilk" is the Polish word for "wolf", and 320 is the fake-retro resolution the whole thing's running at. Simple as that.

As uninspired as the name may be, it's actually been with the project since the very beginning – it appears in the git repository's initial commit! For all its flaws, it's grown on me over time, so I'll probably keep it.

Credit where it's due

While I've been developing the game mostly solo, I did receive a lot of help along the way. I'd like to extend extra thanks to ŻbiXs, who has partnered with me on previous projects and did some original pixel art for the game, like the great hero portraits; and my wife, who patiently listened to me nerding out about the project, helped with turning vague ideas into more concrete ones, and even created some concept art, like the menu background above.

Also, as mentioned before, none of this would've been possible if not for the existence of the Freedom project, where I took most of the assets from. Xonotic was another a great source of sounds and textures. Many files were also taken from OpenGameArt and FreeSound. The soundtrack is comprised wholly of the great work of Deceased Superior Technician (nosoapradio_us).

External links

I will be posting future updates on my blog here, but if you can also follow the game's development on itch.io. Sometime in the future I will probably also launch a Steam page; this section will get updated as more options appear.

Share with friends

e-mail Google+ Hacker News LinkedIn Reddit Tumblr VKontakte Wykop Xing

Comments

Do you have some interesting thoughts to share? You can comment by sending an e-mail to blog-comments@svgames.pl.