XXX

fuzzy notepad

Updates

  1. Blog
Page 2
Atom feed

[updates] Under Construction, our PICO-8 game

Mel and I made a game!

We’d wanted to a small game together for a while. Last month’s post about embedding Lua reminded me of the existence of the PICO-8, a “fantasy console” with 8-bit-ish limitations and built-in editing tools. Both of us have a bad habit of letting ambitions spiral way out of control, so “built-in limitations” sounded pretty good to me. I bought the console ($15, or free with the $20 Voxatron alpha) on a whim and started tinkering with it.

The result: Under Construction!

pico-8 cartridge

You can play in your very own web browser, assuming you have a keyboard. Also, that image is the actual cartridge, which you can save and play directly if you happen to have PICO-8. It’s also in the PICO-8 BBS.

(A couple people using Chrome on OS X have reported a very early crash, which seems to be a bug outside of my control. Safari works, and merely restarting Chrome has fixed it for at least one person.)

I don’t have too much to say about the game itself; hopefully, it speaks for itself. If not, there’s a little more on its Floraverse post.

I do have some things to say about making it. Also I am really, really tired, so apologies if this is even more meandering than usual.

[updates] I made a Doom level

Yes, dear readers, I have a confession to make. Despite spending 29,000 words explaining why and how you should make a Doom level, I’ve yet to actually publish one myself.

I’ve been… orbiting? the ZDoom community for over a decade, but only really contributed in the form of minor wiki edits and occasional advice. I started a good few maps when I was a teenager, but I tended to get bogged down in making some complicated contraption work, and then get bored with the whole idea and lose interest.

More recently I’ve actually made a few maps that got as far as having an exit (!), but I never really finished them, and I haven’t published them anywhere.

So when the Doom Upstart Mapping Project 2 was announced, with the goal of just getting something done with the short time limit of a week, I figured I should give it a shot. And I did. I spent six straight days doing virtually nothing but working on this Doom map.

Results: pretty good! I’m pretty happy with it, and a few people have played it and enjoyed it. I put a lot of thought into it — or tried, anyway — and have a lot to say about it, so this is my developer commentary.

I’ve described the course through the map as I go, and I’ve tried to include some context for people whose knowledge of Doom is only “you shoot monsters”, so I hope it’s at least a little accessible. It’s really long, though. Again. Sorry. Not actually sorry.

[updates] Mario Maker: …

14DC-0000-01ED-C104
Difficulty: fairly easy
Quality: ★★★★★
Secrets: —

I removed the music and only used monochrome obstacles, with very few actual enemies. No pickups, no secrets. It’s short, linear, pretty easy, entirely thematic.

The result is interesting.

[updates] Mario Maker: The Works

ACD6-0000-0198-668D
Difficulty: fairly easy
Quality: ★★★★★
Secrets: 🍄🍄🍄🍄🍄🍄

This is great. I put a lot of effort into polishing it. I even set it aside for a while because I wasn’t happy with it, then came back and fixed it.

It’s fairly long, but doesn’t have any particularly tricky parts. Pretty atmospheric, I hope. Not all of the 1-ups are hidden, and not all of the hidden details are 1-ups.

I don’t even want to say anything more about it; I feel like I’ll ruin it. Just play it.

[updates] Mario Maker: Purgatory

BEA5-0000-0192-AF17
Difficulty: fairly easy
Quality: ★★★☆☆
Secrets: 🍄🍄🍄🍄

I had three hours left at the end of a night, and I decided to use them to speed-map a Mario level. Two hours later, I had this. It’s fairly simple and straightforward as a result, but still a fun quick romp.

The theme is fairly shallow: there’s a “heaven” overworld and a “hell” subworld, and you shift back and forth a couple times on your way through the level.

I watched someone try to speedrun it shortly after I uploaded it, and I was delighted to see that they managed to skip the hell area entirely. Seems appropriate.

[updates] Mario Maker: Pipe Dream

1AA3-0000-0104-C7ED
Difficulty: easy
Quality: ★★★★☆
Secrets: 🍄🍄🍄🍄

I bumbled upon a pipe-themed level while playing 100 Mario Challenge, and decided I wanted to do one. Unfortunately I hit the warp pipe limit much earlier than I’d expected, so it’s only partially pipe-themed. Still, I’m pretty happy with it.

I keep trying to make levels that are easier, more interesting, and less linear, and I think this is the first time I really feel like I hit that mark. I only spent a few hours on it, too.

[updates] Mario Maker: Mount Erebus

8A2E-0000-00FE-85D5
Difficulty: fairly easy
Quality: ★★★☆☆
Secrets: 🍄🍄A + trick to make the boss easier

There’s a story behind this.

I was bored and wanted to make a Mario level, so I asked Mel to pick a tileset. They said castle. So I made a castle level.

I didn’t say it was a very good story.

I’m a little unhappy that you can get hurt with little warning in a couple places, but I think it’s balanced out by how short the level is.

If you’re curious, this is named after a level from the original Doom, which in turn is named after the southernmost mountain on Earth.

[updates] Mario Maker: Free Will

D161-0000-00FA-5905
Difficulty: entirely in your hands
Quality: ★★★☆☆
Secrets: 🍄🍄

I want to call this “experimental”, but then, aren’t all of these experimental?

Something I’ve been thinking about a lot lately is games where the plot isn’t actually necessary. The world isn’t ending, your life isn’t in danger, it’s just a fairly standard story. And the game never explains why the protagonist needs to do it. It’s just taken for granted that the protagonist wants to go through the story, because that’s how games work.

(I can’t actually think of examples of this off the top of my head, now, but I know I’ve run into it.)

Of course, players tend not to notice this, because the entire point of playing a game is to do the thing that the game offers. So sometimes that’s the only reason the protagonist wants to do it: because the player wants to do it. Because it’s a game, and if you didn’t do it, there’d be no point.

So.

Here is a completely trivial level. You can just immediately run to the goal. The point of Mario games is to reach the goal, right? There’s nothing stopping you here.

Or is the point to enjoy the experience of traversing a level? If you do that and enjoy yourself, even though none of it got you any closer to the goal, didn’t the level still serve its purpose?

Up to you!

[updates] Mario Maker: Cookie Dough

00EC-0000-00DB-3CA7
Difficulty: fairly easy
Quality: ★★★★☆
Secrets: 🍄🍄🍄🍄

Vanilla Dome has a cool aesthetic and an unusual style — you navigate up and down through caverns, rather than mostly to the right as is common in Mario. I tried to capture some of that here.

This was the first time I tried to do any real narrative things with the detailing in the level. Not some grand coherent plot; just little hints that life is happening here and it’s not necessarily centered around you. I love that in games.

There are also quite a few branching paths, which is a little difficult to cram into Mario Maker where the world can only be two screens tall. Jamming in a lot of secrets made it even harder, but I managed. See if you can find them all! No backtracking required, I think.

There’s a boss battle at the end, though the solution is unfortunately not as obvious as I’d hoped. A surprisingly tricky problem is finding ways to force the player to actually beat the boss, rather than scurry past it. (I’m not sure anyone has picked up on what the boss is, either.) It’s a real shame, because it feels clumsily tacked onto the end of what is otherwise a pretty nice level.

Overall I think this could use a little bit more cohesion, but I’m pretty happy with it.

[updates] Don’t use pickle — use Camel

Don’t use pickle. Don’t use pickle. Don’t use pickle.

The problems with Python’s pickle module are extensively documented (and repeated). It’s unsafe by default: untrusted pickles can execute arbitrary Python code. Its automatic, magical behavior shackles you to the internals of your classes in non-obvious ways. You can’t even easily tell which classes are baked forever into your pickles. Once a pickle breaks, figuring out why and where and how to fix it is an utter nightmare.

Don’t use pickle.

So we keep saying. But people keep using pickle. Because we don’t offer any real alternatives. Oops.

You can fix pickle, of course, by writing a bunch of __setstate__ and __reduce_ex__ methods, and maybe using the copyreg module that you didn’t know existed, and oops that didn’t work, and it’s trial and error figuring out which types you actually need to write this code for, and all you have to do is overlook one type and all your rigor was for nothing.

What about PyYAML? Oops, same problems: it’s dangerous by default, it shackles you to your class internals, it’s possible to be rigorous but hard to enforce it.

Okay, how about that thing Alex Gaynor told me to do at PyCon, where I write custom load and dump methods on my classes that just spit out JSON? Sure, you can do that. But if you want to serialize a nested object, then you have to manually call dump on it, and it has to not do the JSON dumping itself. There’s also the slight disadvantage that all the knowledge about what the data means is locked in your application, in code — if all you have to look at is the JSON itself, there’s no metadata besides “version”. You can’t even tell if your codebase can still load a document without, well, just trying to load it. We’re really talking about rolling ad-hoc data formats here, so I think that’s a shame.

But I have good news: I have solved all of your problems.

[updates] Pokédex doodles, part 1

Inktober” is a thing where you do an ink drawing every day throughout October. I tried it, mostly got frustrated at producing scribbly crap with errant lines everywhere, and gave up after a few days.

I know drawing without relying on an eraser is good practice, and it’s definitely something I want to get better at. So here’s an attempt at combining it with speedpainting, where poor results are more palatable, because hey I didn’t have much time anyway.

The rules:

  • Draw Pokémon, in order
  • Pose must be different from the stock/reference artwork
  • I have to publish the results, no matter how terrible
  • 5 minute hard time limit
  • No erasing
  • No undo
  • No layers
  • No layer modes
  • No starting over
  • No cheating

Mel pointed out that the rules are likely to get old after a while, so I might shake them up every couple dozen or so, or change how I’m drawing, or whatever.

Here’s the first batch. I’m underwhelmed, but not ready to throw my tablet out the window, so that’s an improvement. Let’s see how this goes.

[updates] Fair warning: minor restructuring ahead

I started using Tumblr some time ago to publish sporadic shorter writing, as a way to combat the feeling that everything I wrote in this “real blog” had to be long and semi-formal. The short writing more or less migrated to Twitter, but Tumblr remained for some community-specific griping. When I started learning to draw, it was an obvious place to stick my doodles as well.

But Tumblr is a frustrating platform that I’ve never found myself particularly enjoying. Plus, it seems a shame to have this amazing domain hack and only use it for one kind of thing.

So I’m going to try expanding the purview of my tiny platform. Pelican isn’t quite designed for this, but I’m going to turn its concept of “categories” into more like content types, whatever that ends up meaning. “Blog” is now its own category; I’ve put all my old posts in it and will put other long-form writing in it in the future. (I also cleaned up the tags I use, merged the old categories into tags, and hid single-use tags from the sidebar.)

I haven’t decided exactly what else will go here yet. Posting art is an obvious start, and I might even backfill all my doodles since I started drawing in January. I might write some shorter and more “disposable” things. I might write short updates on particular projects. I might post tons of cat photos, and backfill those too. I might try keeping a “dev journal”, where every single day I write a quick paragraph or two about what I did.

I mention this mainly as a heads up to any techies who’re following via the feed. If you want to see anything and everything I publish, it’ll all be in the same global Atom feed, so you don’t need to do anything. If you only want to follow my blog, there should be a new feed just for blog posts. Every category gets its own feed, so you can also mix and match as you please, once I get some other categories started.

Are you excited? I’m excited.

[updates] Mario Maker: Tiny–Huge Island

A953-0000-0055-15BA
Difficulty: medium, has some annoying spots
Quality: ★★★☆☆
Secrets: 🍄🍄🍄🍄

I love any kind of parallel-areas gimmick, and since you can make large versions of basically any critter in Mario Maker, it was begging for this. It’s named for a world in Mario 64, which I played only briefly but found memorable anyway.

It’s surprisingly difficult to come up with puzzles that actually require large monsters, and even harder to come up with ones that require small monsters. In the end, I think all but one of the puzzles can be solved in either world, though one way is always considerably easier than the other. I like alternate solutions, and heavily dislike when game designers add obvious artificial roadblocks to seal off alternate solutions, so I’m fine with this.

There are some places that are a little harder than they ought to be, which is a shame, but it’s my most popular level nonetheless. I’m itching to make a sequel, but this was incredibly tedious to do, because you can’t actually copy anything across areas. All of it was done manually.

[updates] Mario Maker: Spoopy Manor

CA39-0000-004B-FF52
Difficulty: slightly tricky, not in a good way
Quality: ★★★☆☆
Secrets: 🍄🍄 + “secret exit”

Boo houses are cool. Mario Maker adds a Boo house theme for the classic Mario tileset. Awesome.

I tried to make this moderately confusing and weird, as Boo houses ought to be. I think I may have overshadowed that a little bit with some annoying jumps into Boo circles, though. And unfortunately this predates checkpoints, though it direly needs one.

Still, I enjoy playing it just for the strange environment, so maybe you will too.

[updates] Mario Maker: Test Flight

55A7-0000-0049-50DD
Difficulty: tricky, not in a good way
Quality: ★★☆☆☆
Secrets: 🍄🍄🍄

This is my first Mario level, hence the title. It… is not particularly great.

The concept was okay: you start out in what seems like a cheerful easy level, then you suddenly hit a wall. You have to go down a pipe to progress, and surprise! It’s not so cheery any more.

Unfortunately it’s a bit worse than “not cheery”; it’s cramped and kind of annoying. The original idea was actually worse than how it came out — I’d intended that you have to cross the entire second area, get a cape upgrade, and then backtrack without losing the cape. You need the cape to reach the exit, so if you lost it, you were screwed. I found out that you could actually skip all the backtracking pretty easily, and I was relieved enough that I left it in.

Suffice to say, I would do this very differently if I did it again now.

[updates] Comment policy

I’m still dealing with cretins’ comments on my PHP post, two years later. I’ve always made an effort to never delete or ban any of them, in the interest of allowing discussion and all that jazz.

But let me tell you, it is fucking exhausting reading all that and I am tired of it. And I just realized I wrote a sassy post about Mozilla.

So the comment policy is thus:

Keep your fucking vitriol to your own blog.

Disagree with me all you want. In fact, I encourage it! I love to know when I’m wrong, and arguing over things is how I figure out why I think them in the first place.

But this space is mine, and I even said long ago that the comments are really optional. The important stuff here is what I say, not what you say. If what you say is clearly only intended to be destructive, it and you are gone. I’ve had enough.

[updates] Issues

I love tinkering with things, but in the absence of external stimuli (like, “it’s my job”), I’m pretty bad at finishing things. Instead I gradually accrete a ball of projects, todo lists, XXX comments, half-written blog posts, and mental notes-to-self. Eventually the mental load becomes overwhelming and I freak out at how many recreational things I “have” to do.

So I spent much of last weekend trying to alleviate this, by dumping various todo files and the contents of my head and tabs that have been open for months and half of my Workflowy into issue trackers. I know, duh, but I always get out of the habit of using them, and then it seems like more effort to get back into the habit than to just jot down or remember one more thing. Maybe this time it’ll stick. I have far more brain to be dumped, but what’s left is generally more detailed planning that won’t come into focus until I sit down to seriously work on the corresponding project. The real test will be whether I keep filing tickets as they come to mind. And actually, like, assign them to myself. And do them! Whoa.

I’m also making an effort to make my code more accessible to anyone who wants to contribute to it; I’ve been using git and GitHub for ages and attracted a couple pull requests, but I’m pretty lax about even build documentation. I wrote a few READMEs to alleviate this, and will be writing some more as I touch repositories that lack them.

Oh, if you give half a crap about what I hack, I’ve thrown together a projects page listing some of the things I’ve started attempting to build. Or you could just look at my GitHub, really. Feel free to contribute, or tell me how I’m making it hard to contribute.

And I totally cut down on the number of distinct categories I was using for this blog, so when I start posting more than once a month, categories will be useful for sifting through posts!

[updates] Once more, with feeling

Let’s try this again.

Blogofile was a cool experiment, but unfortunately it’s been effectively abandoned. It’s not bad, but it has a lot of warts that add friction to blogging, and I need all the non-friction I can get.

So this is powered by Octopress. It’s a Ruby thing wrapped around Jekyll, which I guess is GitHub’s wiki engine or something, and I strongly suspect that Blogofile took a lot of inspiration from it.

It’s still the same basic idea: static generation, Markdown, templates, Disqus, etc. But it’s a bit more fully-featured from the get-go, has some shortcuts that make it harder for me to avoid writing thoughts down, and does the deployment for me.

This default theme ain’t bad, either. Rather not have the exact same blog as dozens of other nerds, but it’s a start.

[updates] Something new

Do you remember LiveJournal in its heyday? It was glorious. Built like a hacker’s hobby project, with all manner of little hidden treasures. Multiple avatars that use keywords so you can swap them out retroactively. A threaded comment system that still defies most competition. Site-wide banning, originally available only via a text-only admin console. A DSL for styling your blog thing however you want! It introduced OpenID; it was probably one of the first sites to really embrace RSS.

Now, though, none of this is particularly impressive. LiveJournal is far from being the only kid in town, and since it was sold to an already increasingly-irrelevant Six Apart and then some obscure Russian media company, it’s fairly well stagnated. More effort is spent on micro-promotions than actual functionality. LiveJournal is now optionally a client for Twitter and Facebook, rather than standing on equal footing as with OpenID or (gasp!) being the server. LJ’s own OpenID server support is some of the weakest I can name. LJ ran out of good ideas long ago, and now it’s just running on inertia.

A sad tale, sure. But on a more personal note, LJ is just not fun for me to use any more. I’m a hacker, and I like fiddling with things, and LJ just feels like a huge wall between my content and the world. I really just want to write some text and broadcast it to all who wish to read it.

And so, I depart LJ to do exactly that. This blog is stored in git, formatted as Markdown, and built into mere static pages by a few small Python scripts.

The comments, alas, are powered by Disqus. I apologize profusely for this, to those of you who would actually care. I thought long and hard about this, but ultimately I came to the realization that my blog is about things I want to say, not so much what others say in response, and so it shouldn’t really matter what the commenting mechanism looks like. If you don’t want to allow the necessary JavaScript but you really have something to say, you can always be old-school and email me.

Now, then. I’ve spent far too long just nitpicking the design of this thing (which I intend to finish up and apply to veekun proper, eventually). Let’s see if this legitimately makes me more interested in blogging.