Proof that you can actually win this game

Down The Drain

The ambitious game we didn't finish:
  • Non-traditional sensory input
  • stealth
  • shrinkwrap
  • exploration

The game we actually made:

  • a 3D tunnel racer with a single level that runs for 2 minutes 15 seconds... can you beat it?
  • all you need is a browser
Check it out at


The "Premature Salmon Related Artwork" award for unused thematic concept designs.
Presented by ntoll

Give this entry an award


Ratings (show detail)

Overall: 3.3
Fun: 3.2
Production: 3.7
Innovation: 3.1

10% respondents marked the game as not working.
Respondents: 18


File Uploader Date
Proof that you can actually win this game
ambv 2023/09/24 23:27
Surely it's easier to play by going to but if you really want to try it locally, unzip and run "python".
ambv 2023/09/24 22:50
A screenshot of a crash
ambv 2023/09/24 22:45
tenth 2023/09/23 22:52
Bellflower ringing animation
tenth 2023/09/23 22:51
Off topic - Some concept art for the Salmon Run theme (that was ultimately not chosen)
tenth 2023/09/17 20:32

Diary Entries

Getting excited about the wrong theme

This is very much off topic, as the chosen theme is Dark Matter, but I collaged together some concept art in an attempt to get excited about the other theme options. By far, the one I was most excited about was Salmon Run, but Dark Matter also seemed promising.

Perhaps we can visit the world of drift-racing salmon vs. giant robot bears sometime in the future.

Concept art for the not-actually-relevant Salmon Run theme

Add a comment


After participating in shorter game jams, it was exciting to think about having a whole week!

In practice, though (especially, in US time zones), it's not as much time as it sounds like. Especially depending on how many work emergencies come up during the week, and how burned out you feel (and what degree of a headache you have) by the time you're ready to switch to Video Game mode...

It doesn't seem like our entry will be particularly playable in time, but it's been really nice to get back into a creative project! And it seems like we do want to keep working on it beyond the end of this challenge (if only so we're more prepared for next time...)

I am impressed with all the new features that Tiled has added since I last used it, though the UI continues to be challenging. (Lots of submenus you can accidentally close, and then have a hard time finding again.)  I wasn't expecting to be able to use it to  generate random terrain, and was especially pleased with the Tile Transformation system - being able to generate a full "blob" tileset from only 15 hand-drawn tiles is really cool! I just really wish they hadn't dropped support for expressing those rotations in the output files, which kind of defeats the purpose? (Unless I'm missing something, which is totally possible...)

Bellflower RingingSadly it wasn't until Saturday afternoon, hours away from the due date, that we were actually getting close to something playable, and cranking out some decent (placeholder) sprites and animations... But I am looking forward to doing more justice to this concept in the future!

Add a comment

It's tubes, okay?


Play it yourself:
Playthrough video:

The backstory

I got really excited when Glyph pinged me to team up for PyWeek. I always admired PyWeek and people who managed to accomplish something in seven days when regular life can be a bit much on its own.

I made the theme for the game, and we had a funny little Zoom meeting where Glyph's daughter shared ideas with us that could easily turn into a few games. However, later in the week, life caught up to each one of us, and the ambitious plans went down the drain.

And now for something completely different

But I'm a stubborn guy, and I already had the music. I also gave a talk at EuroPython about generative graphics where the most well-received part was about 3D animation with PyScript. So, to salvage PyWeek #36, I decided to spend my Saturday hacking up something that's not much more than a tech demo to demonstrate this cool technology. I managed to complete just that, so this becomes our team's entry for this edition of PyWeek! Did I finish on Saturday or did I cheat a bit and only managed to get collision detection working on Sunday? Well, friends don't ask friends such questions.
A winning game of "Down The Drain"
OK, but is it at least on topic?

Well, you're flying in a dark tube, the title's got somewhat negative connotations... you could say it fits the "Dark Matter" theme! If you squint right 😎

Python in the browser is all I wanted for Christmas

Let's talk about the tech, that's definitely a more pleasant topic!
  • this is written in PyScript, which packages Pyodide in a way that is very easy to use for new projects;
  • graphics and audio bind to THREE.js, a wonderful library that makes using WebGL pretty easy;
  • but there is no JavaScript in this project, it's all Python 3.11!
There are some fantastic things about this that you might notice:
  • it runs everywhere without installation, including my iPhone;
  • it easily runs at 60FPS in Firefox and at a whopping 120FPS in Chrome -- remember that all logic here is written in Python;
  • it looks really nice, even if I only used the most primitive pieces of THREE.js this time.
Did you at least learn anything interesting?

Sure, sure! This entire ordeal of making a game in 24 hours or so taught me many things, but in no particular order, these are some highlights:
  • collision detection is a complex beast, and no algorithm is perfect;
  • in space no one can hear you scream that there's actually not three but six attributes needed to position and orient an object in three dimensions;
  • there are many clock domains: if you want to make your game synchronize to audio, you can't naively increment calculations in an animation frame callback, because some systems will run 60 of them per second, some 120, and some will struggle with even 30;
  • JavaScript is an FFI language in Pyodide, so there are some surprises like the fact that you need to call create_proxy() when passing callbacks so that Python's memory management doesn't destroy the function before it's called by JavaScript;
  • THREE.js is very powerful but still easy to use, even though many examples available online for it no longer work because it moves very quickly in terms of API changes;
  • more importantly, you can successfully write Python in the browser while reading JavaScript API docs and survive to tell the tale!

Add a comment