I'm In!
For once I'm pretty happy with the theme! I have an idea I like — time to see if I can implement it.
For once I'm pretty happy with the theme! I have an idea I like — time to see if I can implement it.

Haven't written a single line of code yet. Let's hope this graphics-first strat pays off

I'm in the mood to make a Zelda clone. But there's going to be a twist, so it fits the theme.
This should be okay for the world map for now. Might revisit later. Need to do a player sprite and some enemies now. And then, at some point, write some code 😅

Done: Movement, collision, graphics, a world, a minimap
Not done yet: Audio, any enemies to fight or anything at all to do in the world.


How does "unstable" come in? Well, play it and you'll see!
https://ldjam.com/events/ludum-dare/49/the-legend-of-error

I couldn't find an easy way to filter the list to just compo web games so I made my own. Just sharing in case anyone else wants a list of these games:
https://foon.uk/ld49-webgames/

So I didn't love the theme, and I sort of begrudgingly came up with this idea where you have a remote control and you can control stuff. Throughout the first day I was thinking, okay, the theme failed to inspire me, my game isn't fun, this LD is a bust.
But now, my game's actually at the point where I kinda don't hate it?
I've got most of the map filled out with puzzles, the controls are okay, there's a bit of animation... I think it's gonna be okay.
I still haven't made a start on the music. I should do that!
My game works, and I quite like it, so I think I'm just going to spend the rest of the time on music.
I think David Lynch once said that a great secret for making good films — and I think it probably applies to games too — is to do the music first, and then listen to it and let it give you ideas. And when you make the final thing, the soundtrack will of course fit perfectly!
I think this is probably a good idea, and I'd like to try it sometime, but in Ludum Dare I always do the music last, because fiddling around in a DAW just expands to fill all available time.


Four hours left in the compo... I don't think I can do any more. I need to sleep.
So, please enjoy Ziggy Zapper and the Robot Factory.

I couldn’t find an easy way to filter the list to just compo web games so I made my own. Just sharing in case anyone else wants a list of these games:
https://foon.uk/ld59-webgames/
Here are some pics showing how Ziggy Zapper came together over the 48 hours:






Full postmortem soon, I hope.
This is how my world map ended up:

I went for 5x4 = 20 rooms, trying for a balance between "big enough to be interesting" and "small enough for compo".
The six rooms at the bottom center with the lighter colours are a sort of "tutorial area". There's no explicit tutorial, but you can't leave this small area until you find 3 triangles, and the mechanics in there are limited to just a couple of simpler things.
The map wraps around because it's easy to implement and reduces the time players need to spend schlepping across the world. It's like having fast travel, except you barely have to write any code.
I wanted to get about half the map filled in on the first day, and finish it on the second, but was behind schedule for most of the time.
30 hours in (map still barely started):

35 hours in:

Would have been cool if I'd done regular PNG exports from Tiled so I could do a timelapse of the map filling in. Oh well, it's an idea for next LD if I do this kind of map again.
Only two rounds of theme voting this time. I saw the options for round 1 and got that sinking feeling. Round two was better; maybe there was hope?
Don't be silly. The theme is always bad. "Signal". The worst theme.
I jotted down a couple of half-hearted ideas. You're exploring somewhere and your map disappears if you run out of signal, so you gotta plan ahead and memorize the map before you enter the dead zone? But when I imagined playing this game, it just wasn't fun.
Really, I felt like making a grid-based puzzle game. I just like them. How about, your only ability is to send signals to other objects telling them what to do? You can signal anything; change a TV channel, open a garage door. It's a universal remote control, the kind you can buy on Amazon, except it really can control anything.
You can chuck anything into a game like this, so I had to be super careful to keep it thematic. One ability only; the ability to signal other objects to do stuff. No weapons, armour, coins, combat, none of that shit. Only signal.

One idea, not great, not awful, and time was a-ticking, so I just went with it, and started drawing up a quick intro cutscene in Aseprite of the player buying the remote control. I thought maybe it would be funny if you saw him buy the main item on Amazon before starting. In the end it wasn't really that funny, but I couldn't bring myself to delete the intro so it stayed, despite not totally meshing with the eventual style of the game.
For Ludum Dare I like to do cutscenes and title sequences as sequences of simple full-screen images. If I want text, I'll just put it in the image. You can do a lot of UI in not much time this way. It limits animation but you can do flashing text by alternating an image with the text and one without, which gives a retro feel I quite like.
For this one I pushed the boat out and added a moving cursor clicking on the Buy button to buy the remote.
I went with plain Javascript in the browser for this game, with no engine, libraries or frameworks, because my idea was simple enough to do without.
Last LD I used WebAssembly and C++, which I remember really liking, but I didn't use it again this time. I remember feeling it was better, but I second-guessed myself; I mean, C++? There's just no way it's faster to write a game in than JavaScript, no matter what I think I remember. I decided to just use JS.
My development process was: - Write a bunch of Javascript in Emacs, stick it all in src/, one class per file. No imports, I hate imports. - Makefile that just concatenates all the files together into src.js, and HTML file that runs it.
I almost like this. I really can't abide having to import this and that at the top of every file. But in JS you can't mark original files with #line like in C++; you have to futz with source maps, which are so complicated you basically need a build tool to generate them, and build tools usually want you to use Babel and imports and modules and all that shit, so I just went with concatenating files.
I really, really should have gone with C++. I'd forgotten just how much I hate JavaScript. If you add up all the time I spent forgetting to type 'this.' everywhere, it was probably like an hour. And you don't see errors until you run the game. Typescript helps, but then you gotta set that up and use Microsoft's wonky compiler that also wants you to waste your brain maintaining imports. Gah, it's so simple. The compiler shouldn't care what file stuff is in. It's an LD game, for chrissake... there's only gonna be one Sprite class.
I love Cog for LD. Write a little bit of code and any graphics you draw automatically become variables in your code, and the images get loaded into them. It saves so much time and energy.
```
/* [[[cog
import glob import pathlib
xs = glob.glob('build/*.png') xs = [pathlib.Path(x).stem for x in xs] xs = sorted(xs)
]]] */ // [[[end]]]
class Graphics { /* [[[cog for x in xs: cog.outl(f'{x} = new Image();') ]]] */ arrow = new Image(); boiler = new Image(); font2 = new Image(); font3 = new Image(); guy1 = new Image(); // [[[end]]]
load() {
return Promise.all([
/* [[[cog
for x in xs:
cog.outl(f'this.loadImage(this.{x}, "{x}.png"),')
]]] */
this.loadImage(this.arrow, "arrow.png"),
this.loadImage(this.boiler, "boiler.png"),
this.loadImage(this.font2, "font2.png"),
this.loadImage(this.font3, "font3.png"),
this.loadImage(this.guy1, "guy1.png"),
// [[[end]]]
]);
}
loadImage(x, url) {
return new Promise((resolve, reject) => {
x.onload = () => resolve(x);
x.onerror = reject;
x.src = url;
});
}
}
```
I drew some halfassed sprites. I'm a total hack at art. I can make stuff that looks good, sometimes, after many tries. What I lack in knowing what I'm doing I make up for with persistence. But today, all artistic ability had left me and this is all I could manage:

Thankfully, I had another go later and ended up with the sprites you see in the game.
Simple, simple, simple. This is how I like to structure my code for LD. Dunno if it's a pure ECS but it's this sort of thing:
```
let tileLayers = [{}, {}, {}]; // layer[position] = tile ID let objects = [ { pos: [42, 42], sprite: graphics.player, player: true, }, ... ];
```
Then there's a buch of systems:
```
process() { // each frame sys.playerControl.process(); sys.robots.process(); sys.coins.process(); sys.mines.process(); sys.winCondition.process(); sys.cutscenes.process(); }
```
Each system then just uses the layers and objects and does what it wants. For instance:
```
class Mines { process() { for (let o of scene.objects) if (o.mine) { let co = scene.co(o); for (let p of scene.objectsAt(co)) { if (p.gm && !p.player) { sys.explosion.trySpawnSmall(o.pos); o.dead = true; p.dead = true; } } } } }
```
Only objects for the current room are loaded, and there's only ever like 12, so even if it wasn't the future and we didn't all have insane hypercomputers it'd still be basically free to iterate them, call map() and filter() on the object list, etc.
I hate JS but I do like that you can just do
``` js
objects.filter(x => x.hasControl && !x.player).map(x => x.pos);
```
and stuff like that, just totally ignoring performance. It's a great tradeoff for LD. In C++ I'd still be writing an ObjectIterator, lol.
On the other hand, all your vector math looks like this:
``` js
let nextPos = vadd( vfloordiv(o.pos, scene.tileSize); vmul(o.speed, o.blah) );
```
In C++ you can just do
```
auto nextPos = o.pos / scene.tileSize + o.speed * o.blah;
```
It's so much better, it overrides any and all downsides of C++.
See, this is what happens when you don't do Ludum Dare for a while. I forgot all this stuff. Why did I go with fucking JavaScript? My god, I'm an idiot.
Tiled is my go-to level editor for tile-based worlds.

I like to try something new every LD, so this time I decided to do these kinda 3D-ish tiles, which I knew Tiled supported but had never used. I like them! You gotta draw your map a bit carefully but it wasn't hard.
I didn't use Object Layers. Instead, tiles that have a "Class" become objects in the game. The game uses the "Class" to setup behaviour; each "class" name just maps to an object in JS that gets copied and becomes the game object. Any "custom properties" set in Tiled then get set as properties on the JS object, maybe overriding the ones from the "Class".
Most entities could be setup using only Custom Properties, with the systems doing the rest, which is good for dev speed.
I reused a Tiled parser library in Python that I wrote before. I had it just output straight JS to be bundled up with the rest of the code.
I implemented a bunch of objects you could signal, like TVs. The TVs did stuff like opening and closing doors, or making robots send their own signals. There were also doors you could signal directly to open and close.
But shooting the TVs just made the theme feel tacked-on. Shooting stuff to make stuff happen is in a million games. I decided that controlling robots would be the ONLY thing you can do. This felt more thematic.
The shootable doors were repurposed as decoration. I never took the code out; they still work, you just can't get at them to signal them.
I like to get a complete game done on day one, and use day two for music and polish. But I didn't manage it. At the end of day one, I had the world map half filled out, and a win condition, though nothing stopping you just romping straight to the exit.
I am away from my MIDI keyboard right now so I had to mouse out the whole tune. I went with a chiptune feel to match the graphics.

I fell into the trap of making the music too lively for a puzzle game. It sounded OK, it was just hard to think while it was playing. So I did another track, an attempt at a chiptuney but ambient thing. I didn't wanna throw away track 1 so I made it so you can press M to switch tracks. After that I fixed the original track and lowered the energy, and quite liked it, but didn't wanna take out the slower track, so they're both still in. Might come across as indecisive, or people might appreciate it. Dunno, players are unpredictable.
Main theme is okay, meanders a bit and is structurally weird, not in a genius Beatles way, just in a bad way. There's not enough time in LD to fiddle with the song structure until it's right. I guess if you're a musician it'll all be under your fingertips and you can bang out something that works, but I just don't have the familiarity with music to do that; I gotta fiddle and redo stuff for hours.
Secondary theme is just kinda nothingy and inoffensive, but I quite like that you get the choice. Like old Tetris. Theme A or theme B. Games don't really do that anymore.
Did music as MP3 for maximum compat. Is that still best? It's annoying because it doesn't loop properly, but what can you do.
I love the idea of realtime synth for web game music, but Firefox doesn't implement Web Audio properly and you can't avoid pops. There's a 9 year old open bug about it. Might see if WASM is fast enough to do a synth next time.
At first I couldn't figure out what the player's objective should be. In room-based games I like having one "thing" to do in each room; it feels like good progression, and you can have the minimap fill out as the player does the thing in each room. But what should the thing be? Turn off the power by signalling a generator? But then you're signalling something that's not a robot. And turning things OFF feels anticlimactic. Turn ON power? So you overload the boiler? Hm, maybe. But it might be hard to get the player to understand.
In the end I just made a decision to get out of analysis paralysis and did triangles you collect that open doors. Not thematic at all, but I needed to keep moving.

When you get to the boiler you just signal these five machines to overload it. I don't love it, but that's what I ended up with.
Breaks my rule from earlier but if you got this far you probably like the game and are less likely to ding it for theme.
I quite like how the animation turned out.
Wayfarer's Toy Box is my favourite font so I did the title cards in it:

...but it wasn't thematic; it's a fantasy font, this is sci-fi. I spent ages picking a new font and ended up with Press Start 2P which looks good I think:

Dunno why, but I love games with room names, so I thought, maybe worth adding? It would mean adding a font system. But bitmap fonts are easy, so I decided to try it. I like to do new things in LD. I'm glad I did, I think it adds a touch of polish.
I decided I liked the Aseprite font for the room names, but it's proportional. Oh well, I just manually counted the pixels and hardcoded a list of glyph widths. Uppercase alphabet only, 26 glyphs, it's not so bad.

This room's name is a joke: it's the kind of crappy puzzle you make when you see how much time is left and you start to panic.
Glad I did a few runthroughs because I found you could softlock yourself in the Airlock. I just hacked in some code that ignores your keypress if you try and let go of the robot when you're behind the door in that room. I wanted to flash a message up like "Careful! Don't trap yourself" but didn't get round to it.
The controllable blue “rafts” would be daunting to implement if they had to work in every situation but this game is nice cause I can make sure no stuff that moves on its own is in these rooms, so movement is very limited and the code can be simple.
I love item-based and ability-based progression but was constrained thematically. The remote is all you have; it's a game about signalling stuff. Upgraded remote that shoots further? Eh, doesn't really add anything. So it's just a world of puzzles. Once you're out of the 6-room tutorial space, you can just visit wherever you like, and you can blast open new ways between rooms by signalling the pink guys. I think it turned out okay. Constraints are good for you!
I like games where you can "open up the map" as you go, gradually blasting open new shortcuts. It feels like you're making the world your own, and it's satisfying. I think I first noticed it in La-Mulana, though I'm sure it's older than that.
My sprite work really needs work. He almost looks okay from the side (I looked at a picture of Megaman as a reference) but then he shrinks when he faces up or down.

I hate drawing human sprites like this with 4 directions and all these frames. It takes forever and I'm not good at it and it isn't fun. Will I ever learn? Just make the character a blob or something.
Before submitting, I had a moment of panic; are people gonna not notice you gotta press K to let go of the first robot? I made it flash.
Then are people gonna not see that the first shooty guy can shoot? I made his shoot icon flash too.
Hope it's enough.
I start from scratch each LD. Vector class? Write it. Font class? Write it. I enjoy just making a new folder and building this self-contained thing in 48 hours. It feels good, doing something you know how to do and getting better at it each time. And at the end, there's a new thing you've made. It's all pointless, ultimately, but what isn't?

Happy with my game, happy I did this LD.
I love gamedev but the internet is now vast and impersonal and nobody plays anything you make, so it's nice to have LD to push you to actually create something, with other people doing it too, and at the end your thing might get briefly seen.
Game jams are really the only time I manage to add a new, small, free game to my website, and I love them.
There are so many talented people doing this, and it's awesome to be part of it and think, maybe one day I'll make something as good as Inscryption. I dunno, I just love LD.