fuzzy notepad

Tagged: gamedev

[blog] You should make a Doom level, part 3: cheating

Part 1: the basics · Part 2: design · Part 3: cheating

Tens of thousands of words later, you’ve watched me build a little world, and hopefully tried building your own. All the way we’ve had to deal with Doom’s limitations. Flat surfaces. No room over room. The world can only move vertically. The only tool we’ve found so far that can get around those restrictions is the sky hack, and even that’s fairly limited.

I’ve saved this for last because it’s more complicated than anything else, by far. It also finally, utterly, breaks compatibility with vanilla Doom. You could apply everything I’ve said so far to vanilla with some tweaking — use line types instead of specials, make a Doom-format map, skip the separate light levels and other tricks. But, this, all of this, is very much ZDoom only.

Finally, the time has come.

It’s time to annihilate all of those restrictions.


[blog] You should make a Doom level, part 2: design

Part 1: the basics · Part 2: design · Part 3: cheating

I assume you’ve read the introduction, which tells you the basics of putting a world together.

This post is more narrative than mechanical; it’s a tour of my thought process as I try to turn my previous map into something a little more fun to play. I still touch on new editing things I do, but honestly, you already know the bulk of how to use an editor. Poke through SLADE’s keybindings (Edit → Preferences → Input) to see what hidden gems it has, click that “Show All” checkbox in the prop panel, and go wild. But please do comment if I blatantly forgot to explain something new.

(Fair warning: NVidia’s recent Linux drivers seem to have a bug that spontaneously crashes programs using OpenGL. SLADE is one such program. So if any of the screenshots seem to be slightly inconsistent, it’s probably because the editor crashed and I had to redo some work and it didn’t come out exactly the same.)

[dev] Weekly roundup: magnum opus

This month’s theme is game dev, and the major project is my text adventure, Runed Awakening.

I may have ended up drawing for like half the week, by accident.

  • SLADE: After having used it intensely for a while to write my Doom post, I spent most of a day fixing a bunch of little papercuts, plus (I hope) a crash someone experienced on OS X. I also cobbled together some preliminary support for 3D floors, which will be awesome.

  • Flora: Threw together a quick cutscene. I should really make an editor for these things so I don’t have to keep doing it. Maybe next month.

  • art: Oh wow. I spent the last three days of the week, pretty solidly, working on a single picture. I have a collage of the best thing I drew every two weeks for the whole year, and it only has one final slot left, and I wanted it to be the best I could possibly muster, and I may have been a little ambitious. It’s still not done. Almost.

  • Runed Awakening: Made a couple breakthroughs, implemented some more Main Plot stuff, hurrah. I don’t think I’ll have time this week to do any serious work on it, so it seems I didn’t get mostly-done this month as I’d hoped. I’ve cleared a lot of hurdles and laid a lot of groundwork, though, so I hope I can keep up the progress and have something worth showing by the end of January?

  • blog: Workin’ on parts 2 and 3 simultaneously. Fixing SLADE stuff kind of got in the way. I’m also having some kind of irritating driver problem that crashes SLADE at inopportune times, argh.

[dev] Weekly roundup: Doom

This month’s theme is game dev, and the major project is my text adventure, Runed Awakening.

Much better this week, though most of the effort went into blogging and fixing SLADE, and not so much went into my own game. I’ll try to remedy that this week.

  • art: I drew stuff nearly every day all week, which is a great turnaround from my rut. This is pretty cute. So is this! I had a flip through some of my drawings from earlier in the year and I can’t believe how terrible they are and how not-terrible they sometimes are now.

  • irl: I went through a huge pile of mail and whatnot that had accumulated under my keyboard. Started dealing with taxes, oh boy. I also did another round of going through an old hard drive I accidentally broke a couple years ago — the filesystem shattered a bit, so figuring out what’s there and what’s worth recovering has required some archaeology. Found IRC logs from 2003, though.

  • SLADE: I fixed some behavior related to working with a directory (vs working with a single-file archive), most notably teaching it not to delete files it doesn’t know about. I also implemented about 60% of LOCKDEFS support, i.e., having the UI actually tell you what numbers correspond to what keycards.

  • flora: More planning for the card game. Also a lot of work fixing the goddamn Rails nightmare that runs the Flora store.

  • anachrony: That’s, uh, the Doom map set I’m working on. I have no idea what I’m doing and it’s really tough to figure out how to design spaces I really like, but that’s the whole point of the exercise, so I go back to it every now and then. I basically just tried out some ideas for connecting areas together and kinda like how it came out, so, that’s good.

  • Runed Awakening: I got a good bit of planning done! No actual code written, oops; my time got eaten up by other stuff. I also drew a test illustration for an innocuous object, which was well-received, so I might end up illustrating every object. Maybe.

  • blog: It took several days but I finally finished part 1 about how you should make a Doom level. Still awaiting the avalanche of incredible three-room maps.

[blog] You should make a Doom level, part 1: the basics

Part 1: the basics · Part 2: design · Part 3: cheating

I love Doom. Or, well, I love Doom 2, which is the game we actually had when I was nostalgia years old.

I love the aesthetic — pixely in a 3D(ish) environment, and consistent in a way that meshes together really well. The classic levels are abstract (occasionally too abstract), but still detailed enough to feel like they could represent real places as long as you don’t think about it too hard. The environment is surprisingly dynamic: there are switches and devices everywhere. That seems to have gotten much rarer over time, as climbing polygon counts have required ever-heavier optimizations on environments, which make it harder to move at runtime.

Plus the engine is really simple, so mapping is really simple, and anyone can make a little world they can then move around in and share with others.

And I think that’s fantastic. Everyone should try making games. They’re a great medium, a way to express nearly any kind of creative idea, no matter what your interests. If you like music (Audiosurf), or art (BECOME A GREAT ARTIST IN JUST 10 SECONDS), or storytelling (Photopia), or programming (TIS-100), or puzzles, or human interaction, or ANYTHING, you can probably find a way to express it with a game. You don’t need to be good at everything. You can focus on one thing, or you can focus on everything, or you can pair up with people who have very different interests. A lot of the existing tools are aimed at programming types (probably since they’re all made by programming types), but they’re only getting better over time.

And what better way to get your feet wet than one of the oldest forms of homebrew game development: Doom modding.

I thought I’d try something different this month, especially because I keep writing ludicrously long posts (I say, as if this one were any better), and also this month I’m trying to focus on an intersection of gamedev and writing, and also it’s Christmas (???). So here is part 1 of a three-part series on how to build you a world.

[blog] ZDoom on a Wii U GamePad with a Raspberry Pi

Well. That was the idea, anyway. SPOILERS: It didn’t work.

Vladimir Costescu has upped the ante and bought a day of my time this month, requesting:

It would be cool to read about you tinkering with a Raspberry Pi or similar cheap device and trying to get it to do cool stuff (where “cool stuff” is left up to your discretion).

Well it just so happens that I already have a Raspberry Pi. I got it at PyCon US, I think three years ago, when they gave every single attendee a Pi for free. I thought it was super duper cool and I spent a whole afternoon tinkering in their Raspberry Pi lab and then I came home and put it in a drawer forever because I had no idea what to use it for.

At first I thought it would be cool to rig something that would download a random wad from idgames (like vectorpoem‘s WADINFO.TXT) and just launch it and let you play it. A teeny tiny portable Doom box.

Then I realized you’d still need a mouse and keyboard (well, at least a keyboard) to actually play, which is a little bit more cumbersome and detracts from the portability a bit.

But I remembered hearing about a Linux-only project that had managed to interface with the Wii U GamePad. Run ZDoom on a light wireless controller with gyros and everything? That sounds awesome.

So off I went.

[blog] Undertale

Undertale is a very good game.

So you should play it, because I am about to spoil the hell out of it.

No, really. Don’t read this if you haven’t played the game. It won’t even make sense. I’m reflecting on it, so I’m not gonna bother explaining stuff you would know if you’d seen the ending(s).

This is a heavily story-based game. Dissecting the plot without playing it will not entertain you and may ruin your enjoyment of the game later. I’m not kidding.

Okay then.

[blog] Flora

Mel, Jayson, and I are attempting to construct a game called Flora. It seems obvious now that we’ve actually started: between us we have the pixels, the words, and the binaries. That’s everything right there.

I could blather about my adventures figuring out how to make OpenGL do anything useful, but who the hell cares. Far more interesting is the adventure of figuring out what the game actually is.

We have a pretty simple approach here: we’ve each played some decent set of video games, and we each have unreasonably strong opinions about what was good or bad. All we have to do is make a game with all the good stuff and none of the bad stuff. Done. Ship it.

The big picture

The game revolves around Mel’s fictional universe, populated by all manner of colorful critters. The protagonists and namesakes are flowercats, so named because they are flowers with cats growing out of their stems.

It’s a top-down role-playing adventure, except everyone has a different idea of what that means, so let’s say it’s roughly the same style of game as Link’s Awakening. Turns out all three of us like adventuring: exploring a world, feeling like part of it, discovering secrets, finding teases of the plot, and hitting stuff. Luckily, the main characters are into the same kinds of stuff, so we’re off to a good start there.

The theme is turning out to be “elements”: both of nature (earth, fire, etc.) and of gameplay itself. We keep finding ways that distinct focus on each of exploration, puzzles, and combat seems appropriate. Possibly because each of us has a different favorite of the three.


Which brings me to the tricky bit: finding a middle ground between what we like and what drives us fucking bonkers.

  • Good: Exploring a wide, open world. Bad: Calling GTA4 a “wide, open world”. Backtracking like crazy. Fast-travel that makes you never see the world. A map that, paradoxically, doesn’t show you where anything is or how to get to it.
  • Good: Unlocking new ways to move through the environment. Bad: Realizing you don’t remember the ten places you saw an obstacle that you can now pass.
  • Good: Collecting stuff. Bad: Being forced to collect the same worthless plot items to progress. Collection that doesn’t actually lead anywhere. Collection you don’t have a prayer of finishing until you’ve otherwised finished the game, thus turning it into a lame “post-game”.
  • Good: A populated world. Bad: NPCs who walk back and forth their entire lives and only say one thing to you. A quantum world that seems to pause while you’re not around to look at it.
  • Good: Multiple ways to defeat obstacles. Bad: Letting the player skip an obstacle with no punishment. Fallout 3.
  • Good: A sense of progression. Bad: Screenfuls of stats that don’t seem to mean anything or change predictably. Huge numbers of stat-changing options. Minmaxing.
  • Good: Novel puzzles that instill a sense of accomplishment when solved. Bad: Puzzles the game solves for you. Puzzles that are afraid to be difficult. Puzzles that rely on the author’s perspective. Puzzles that you can opt to skip, thus making solving it a complete waste of time.

Avoiding the bad is going to be tricky, to say the least. Some of these plague virtually every game because it’s just damn hard to do anything else. Still, I have every confidence that we are uniquely suited to avoid pitfalls that the biggest and most successful game development studios have yet to subvert. Cause we’re awesome.


So far we have one sprite drawn, and I’ve built an engine that lets it walk around a fixed region. (Spot the programmer art.) Basically done! I guess I’m building it half-from-scratch: I’m using pyglet and cocos2d, which provide a lot of basic niceties like event handling and layering and transformation and actions over time, but they’re both simple enough that I can easily understand everything they’re doing and could replicate it with a gun to my head. It’s the same kind of sweet spot as Pyramid is for Web development.

We have a Large Pad with tons of small ideas scribbled on it, and we brainstorm every other day. Currently trying to pin down how combat and advancement will work; there are a ton of options and getting it right is tricky. As the engine becomes useful, we’ll be able to actually try stuff out.

This is a side project among side projects for all of us, completely unfunded, with no deadline. So there’s no ETA, and we’ll just work on it as we feel inspired to do so. Interest is always interesting, of course.

The code is ISC and the assets are CC BY-NC-SA. All of it lives on GitHub. We’d still like to sell the completed game, but the plan is to only charge for the installer. (Oh, right: I develop on Linux (who doesn’t!) and it’s all Python and OpenGL, so it oughta run on pretty much anything.)

Yep, that’s all I got. May write about bits of it in more detail later, if there be interest.