Lee Hardy Dydo

The Rabbit

October 17, 2026 · Diablo Duck, part 3 of 3

A small brown rabbit sitting up, breathing, turning its head and flicking one ear, in Diablo's pixel style
The rabbit's idle loop, as the game draws it.

The pond has one neighbor: a rabbit who sits beside the rabbit hole. In part 2 he got Cain's job and Cain's spot. This part gives him his own body.

1What kind of rabbit

There were three options on the table: a wild cottontail sitting up, the White Rabbit from Alice in a waistcoat with a pocket watch, or an old robed rabbit as a stand-in for Cain the town elder. I went with the plain cottontail. The duck is a plain rubber duck with a sword, not a character in a costume, and the rabbit should be just as plainly a rabbit.

2What we're replacing

Every townsperson in Diablo is one strip of frames from one angle. Cain is 25 frames, each 96 by 96 pixels, of an old man in a robe swaying slightly: about 60 pixels tall, facing the camera, his shadow falling to the left. The game loops the strip forever. Whatever replaces him has to be the same: 25 frames, same frame size, feet on the same spot.

A row of thirteen frames of Cain, an old man in a blue-grey robe, standing almost still
The first half of Cain's idle loop, decoded from the shareware.

3One model, the duck's camera

The duck was built in Blender, rendered from the same camera angle Blizzard used, and reduced to the game's palette. The rabbit uses the same camera, the same sun and the same shadow trick, so the two look like they belong in one world. The model is made of metaballs: overlapping blobs that melt into one smooth surface. A big round rump, a narrower chest leaning back, long flat hind feet, front paws tucked up, a pale belly, a white puff of a tail, and two long ears.

The first render had problems you'd expect from a first try: the ears floated above the head, the eyes faced forward like a cartoon instead of sitting on the sides of the head the way a rabbit's do, and the hind feet looked like separate pebbles. The fix for the ears was to make them part of the same metaball family as the head, so they grow out of the skull instead of hovering over it. Then the two ears overlapped into a single spike from the camera's angle, so they got splayed into a V.

A 3D render of a brown rabbit sitting up, ears in a V, pale chest, casting a shadow to the left
The model in Blender, mid-loop, head turned toward the path.

4At game size

A render like that is about 350 pixels tall. In the game the rabbit gets about 60. The converter shrinks each frame, pins the feet to the spot Cain's feet use, tones the colors down to sit in Diablo's dark palette, and matches every pixel to the nearest of the town's 256 colors. The shadow becomes the palette's darkest color. Then it packs the frames into the same file format as Cain's sprite, under the same name, and the game loads it the same way it loaded the original.

Cain on the left and the rabbit on the right, both at game resolution, scaled up, same size frames
Cain's first frame next to the rabbit's, at game resolution, enlarged four times.

The idle loop does three things in 25 frames: the rabbit breathes the whole way through, turns his head toward the path the duck walks up and back again, and flicks one ear near the end.

One surprise: the game doesn't play Cain's 25 frames in order. It plays them in a scrambled back-and-forth sequence written for the way Cain sways, which hid the ear flick entirely. The rabbit now plays his frames straight through.

5His words, in my voice

The shareware switches townspeople's chatter off, so the rabbit borrows the way quest characters talk in the original game: a speech that scrolls up the screen while it's read aloud. The game already had an unused slot for one, so his speech took it over, and a few lines of code make it play when the duck walks up.

I read it myself, which meant building a better way to record. Part 1 had a script that beeps, records a fixed number of seconds and cleans up the take. This time it got a teleprompter: a full-screen page with the script in big type and the current line lit, with a countdown and a timer. Partway through setting it up I wanted a way to stop before the time ran out, so the page now sends signals to the recorder through a tiny local server: stepping past the last line ends the take, and each line change gets a timestamp. The game then sizes the scroll to the recording, so the text keeps pace with the voice without any tuning.

6Recording the result

To show it here I wanted a video of the duck walking up with the sound, without clicking through a recording app. OBS has a remote control built in, so a short script drives it: it builds its own scene, records the game's picture and only the game's sound, mutes the microphone, records, and puts everything back the way it was. Getting there took three tries. Capturing just the game window recorded black (the game runs full screen), requesting OBS's list of running apps crashed it, and capturing the whole display plus the game's audio on its own is what worked.

The duck walks up the path, and the rabbit has something to say. Sound on.

7The hole, twice

The way down was still a dirt patch. A character is a sprite that floats over the map; a hole is part of the ground, so it has to become map tiles. Same Blender camera again, with the ground set to render as nothing so only the dirt shows. Then the render is laid over the town's own ground, so its edges match what's around it, cut into the small shaped pieces the game builds its ground from, and appended to the end of the town's tile files, leaving every original tile where it was.

The first one went straight into the game, and it was wrong: a neat little hole in a ring of dirt, one tile across, smaller than the path leading to it. It had been checked to see that it worked, not whether it looked right, and I hadn't seen it before it went in. A rabbit's burrow is a mouth dug in under a heap of the earth that came out of it, with the ground around it churned up and scattered with clods.

The second time went through the map tool before the game. The burrow got a spoil heap with the mouth in its face, a tongue of spilled dirt in front, churned ground thinning out at the edges, and clods kicked across it. Instead of one tile over grass, it's laid over the town exactly as it looks there, path end included, across a 5 by 5 block, and only the tiles the dirt touches get new art. Three passes: the first showed the heap clipped at the block's edge and the churned dirt too faint to see, the second fixed those, and the third scaled it up and drew the rabbit in for scale. I saw that one before it went in.

The first rabbit hole: a small round hole in a ring of dirt at the end of the path, smaller than the path
Take one: smaller than the path.
The second rabbit hole: a burrow mouth under a heap of dug earth, churned dirt and clods around it, the rabbit sitting in front
Take two, with the rabbit for scale.