A wild game appeared!

Well, here it is; the fruit of a stressful but productive and fun week.  We finished on time!  On Wednesday afternoon, as the first line of code was being written, I had become less sure that we'd be able to present anything interactive at all.

Tower was not our favourite theme, but it was definitely something we could work with, by making that the setting of the game world.  I teamed up this time with momojohobo, who had greatly impressed me with his ability to animate and produce music last PyWeek.  He encouraged me to try a new art style for this game, which was inspired by games like Samorost and Machinarium.  I'd never tried this before, but I wanted to make a 2-D game this time around, and I was happy to try something new; I quickly learned that the GIMP's Clone, Perspective and Burn tools would become my new friends for the week.

During the first few days, all seemed well; my teammate created the charming titular character while I started work on the first two levels.  After I'd drawn each level I'd hand it off to momojohobo to do his superb animation magic in Blender 2.80.  Because I had never done this kind of thing before, other than a little bit of practice on the Saturday before PyWeek, I was a little unconfident and slow; but I was nonetheless quite pleased with the results—I'm especially proud of how the second floor turned out.

Where we ran into significant trouble was with the export pipeline.  Because the recently-released Blender 2.80 had changed some core elements of its API, the existing exporters to Panda3D didn't work; fortunately, there was now a glTF 2.0 exporter in Blender, and we could import those in Panda3D with the help of the panda3d-gltf plug-in on PyPI.  But, these things were less battle-tested.  They actually performed admirably well, but given our somewhat esoteric uses, we ran into a lot little issues here and there.  Each new issue we encountered required hours of debugging and hours more of trying to find a workaround.  We also ended up with a quite elaborate script to fix up and optimize the assets after conversion.

At the point where we had ironed out or worked around most of the issues, we had only a little over three days left, and the stress could be felt—we had only two and a half levels, and new issues could still pop up around any corner.  We both agreed that we weren't going to worry about finishing a game on time, but primarily to just have fun.  Though the initial plan was that I would draw all the levels, we realised that I really needed to start writing some code, so momojohobo took over the level design of the remaining levels.

The last two (!) days were filled with frantic coding to actually get the levels scripted up in Panda3D.  Because the entire level was rigged up as a single model, and the export tools insisted on having each animation affect the whole level, I ended up making heavy use of Panda3D's ability to define Actor sub-parts using joint filters.  It took some time to come to that conclusion, but it ended up working very elegantly and simply.  This is an aspect where I think the choice of Panda3D really paid off, because I honestly don't know how I would have gotten all this to work anywhere else, especially within such a short period of time.

The final level to be rigged (the one with all the clocks) was scripted up with 6 hours on the clock.  I am personally not really quite happy with some of the puzzles to make it in last; they were produced under stress to get more content in, and as some of my friends have pointed out I appreciate that the clocks puzzle in particular can be a little frustrating.  If you don't figure it out, the solution is in a comment in game/floors/time.py in the source code.

We're also aware of the many graphical glitches, for which there wasn't time to fix; some of them would have required us to redo how we did a bunch of things in the animations, which would have required us to revise all of the animations—definitely something we didn't have time for.  We now know how to avoid all these pitfalls in the future, though, and if we were to do it all over again, we'd be making a game that's thrice as good.

I'm ultimately quite pleased with what we managed to produce despite all the difficulties we faced, and we'll hope you'll find this weird, glitchy little game as charming as we do.  I'm also immensely grateful to my teammate, momojohobo, whose ability to produce amazing animations and music in a very short period of time makes me green with envy.  I am also grateful to Moguri, whose panda3d-gltf and blend2bam libraries met our quixotic pipeline needs admirably well, and was available to discuss the issues we ran into.

Congratulations to everyone who finished PyWeek!  I see a lot of great entries this year, and can't wait to try them!