A snapshot of the second floor.

Hobot's Ascent

Meet Hobot, a quirky little robot who one day wakes up to find himself in the basement of a strange tower. Help him use the limited means at his disposal to ascend through the fantastical floors, to discover what is at the very top!

Use the ← → ↓ ↑ keys to move and the Enter key to interact. To switch to fullscreen, press Alt+Enter or F11.

To run the game, just type:
python3 run_game.py

The only dependency is Panda3D, which can be installed using the following command:
pip install -r requirements.txt

Binary builds with all dependencies packaged are available from the downloads, though there should not be issues with running from source code.

With the macOS .app bundle, note that you may get an error after clicking Hobot's Ascent.app about me being an untrusted developer. Go to System Preferences, Security, and click "Open anyway".

If you run into any issues, please send the output log. In the binary builds, the output is saved to the following log files:
Windows: C:\Users\You\AppData\Local\Hobot's Ascent\output.log
macOS: /Users/You/Documents/Hobot's Ascent/output.log
Linux: /home/you/.local/share/Hobot's Ascent/output.log

Artwork by rdb and momojohobo using the GIMP
Animations by momojohobo using Blender 2.80
Programming by rdb using Panda3D
Original soundtrack and sound effects by momojohobo using FL Studio 12
All source assets are from public domain sources and all created assets are placed in the public domain.



natural nature award
Presented by speedlimit35

The "W.A.Mozart" award for subtle musical trickery involving bells and in-game music.
Presented by ntoll

Modern hobos must ascend to new heights
Presented by tizilogic

Give this entry an award


Ratings (show detail)

Overall: 4.1
Fun: 4
Production: 4.6
Innovation: 3.8

6% respondents marked the game as not working.
Respondents: 15


File Uploader Date
Final source code with a few trivial fixes
rdb 2019/09/29 19:27
64-bit Windows binaries
rdb 2019/09/29 19:22
64-bit Linux binaries
rdb 2019/09/29 19:21
macOS .app bundle - READ INSTRUCTIONS)
rdb 2019/09/29 19:19
A snapshot of the second floor.
rdb 2019/09/29 00:06
Code at time of upload deadline
rdb 2019/09/29 00:01

Diary Entries

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!

Add a comment