Final screenshot

The Tide Summoner

Adrift on the ocean, you find yourself among a mysterious archipelago of small islands. Fortunately your boat still works, but you'll soon discover that leaving this place is not as easy as it seems.

Escape the Room style puzzle game, inspired by that classic genre of Flash games, particularly Archipelago and The Dark Room by Jonathan May. If you've played these games, you know there's a good chance of becoming hopelessly stuck. See the README for how to access hints.

Some clues are given through sound effects. It's possible to complete the game without sound, but it will be more difficult. You need to distinguish the colors red, blue, yellow, white, and black for one puzzle. See the README for instructions on changing them if needed.

v1 and v2 have identical gameplay, so feel free to rate either one. However, the autosave/autoload feature is broken in v1. The game's not that long so it shouldn't be a problem unless it crashes on you, but if you want to be able to pick up where you stopped, use v2.

Controls with keyboard. Requires PyGame and PyOpenGL. If you get a syntax error on Python3.7+, see here for a fix.


Golden Globe Award for Heavenly Balance
Presented by mit-mit

Give this entry an award


Ratings (show detail)

Overall: 4.1
Fun: 3.9
Production: 4.3
Innovation: 4.2

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


File Uploader Date
Final entry v2
Cosmologicon 2020/09/27 04:42
First final entry
Cosmologicon 2020/09/27 00:49
Final screenshot
Cosmologicon 2020/09/27 00:39

Diary Entries

Game uploaded

The Tide Summoner

This is a PyOpenGL game so there's bound to be some cross-platform bugs. Please let me know here if you find any, thank you!


Postmortem (plus all the diary entries I didn't make)

Here was my thought process behind this game.

"Castaway" makes me think of escaping a mysterious puzzle island, like in PyWeek 25's The Desert and The Sea. But programming walking around on ground is hard. What if you stay on the water and just travel between islands, like Wind Waker but you're stuck in the boat. Okay, but then what's to stop you from just riding off into the sea? It would be cool if that just sent you back to where you started, like the Lost Woods. You know what would do this really well? A sphere. Guess I'm making a 3d game.

So, you're on the water and we need some puzzle mechanics. Raising and lowering the water is classic. But how would that work on a tiny planet? If you raise the water everywhere, where does it come from? I guess what would be the most intuitive is raising it on one side while lowering it on the other, like a tide. So I guess you need some way to control the location of the moon.

And that was enough to start with. I'm a little surprised that someone didn't see the connection to the theme? I felt like this was one of my most overt uses of the theme. No big deal.

I enjoy puzzles where part of the challenge is figuring out what to do, but I think you have to be really careful with them in PyWeek. Judges, myself included, are likely to move on if it takes too long, which is bad if you want your entire game judged. I knew I would never be able to tweak the puzzles to the right difficulty level without play testers, so I needed an easy mode, or set of hints. I originally planned three modes: medium (the default) would not include instructions, but would include hints from the character, possibly in voiceover, (e.g. "Hmmm, those trees look dry....") Easy would have the voiceover plus the instructions, and hard would have neither. I didn't have time for voiceover, so we basically got easy and hard. But neither seemed like a good default: starting on easy would spoil some of the fun, but starting on hard runs the risk of players forgetting about easy mode and just giving up. I really like the compromise of having easy mode always available if you take a deliberate action (although I could have chosen a different key). You get a message reminding you it's available if you haven't made any progress in 60 seconds; that might have been too aggressive. You have to hold the key down instead of being a toggle so that nobody accidentally left it on and spoiled the next challenge for themselves. It's kind of weird UI, though. I guess it could just turn itself off after each challenge.

I really enjoy setting games on spheres like this. I was hoping that people wouldn't realize it was a sphere at first, and that when the camera pulled back enough to tell, it would be a big twist as you suddenly realize just how trapped you are. Commenters said the game starts out too close up, and this is why. I originally imagined the "twist" would happen at the end of Act 1, but I could tell that would really frustrate people, so I moved it up much earlier, to about 1/3 of the way into Act 1. I gave the islands suggestive and distinctive names, hoping that someone would try to map it out, and realize it was a sphere that way, before the reveal.

Judging by the comments, this completely failed. I guess most people were able to tell it was a sphere from the beginning? I wonder if there's a way to salvage it so that it actually is an impactful reveal. If not, then I definitely would start more zoomed out. I also wanted the reveal that you were moving the actual moon to be a surprise as well, which is why you can't Tab to zoom out until after you've used the Tide Summoner for one challenge. I wonder if that reveal surprised anyone.

I got a late start on the puzzle design. As late as Wednesday, I didn't really have any good way to use the changing water level, and I was considering scrapping the puzzle altogether and just making an action game. But then I thought of watering the trees and that was enough to get me unstuck. I've fallen out of the habit of thinking about my game ideas during the week before PyWeek. It definitely would have helped here. I could have used another day at the end to handle a few loose ends.

My PyWeek 17 entry Eclipsed was set on a sphere like this, and I learned from that experience that spheres are really confusing for players. I think that Mario Galaxy keeps its spherical areas manageable by having a series of small challenges on individual spheres: typically you only spend a minute or two on each one fighting a couple enemies, and you don't need to do much navigation. At any rate, because of this, I went as simple as possible. 6 islands laid out like the faces of the cube, and disks appear at one of the 8 spots corresponding to the vertices of the cube. This means that there's just not much stuff out there to keep track of, and you can find where you're going by wandering for just a little bit. I considered having you teleport from one planet to another once you complete each challenge, but decided it's more appropriate to the genre to have the world change, with objects appearing and disappearing, and the trees resetting. Fortunately the tree watering mechanic was not too hard to incorporate into the various challenges, so I could reuse the islands in multiple puzzles. I'm mostly happy with the various mechanics involving the moon, although I'm certain they could use some tweaking. The one I left out because I just couldn't get it to work was having two moons you could control separately.

A little about the graphics. The game is flat shaded. This was an early decision, made the first time I realized that if I wanted lighting then I would have to calculate normal vectors. I was concerned that flat shading would look terrible, but I think it turned out okay. The one thing that just looks bad is the player vehicle (as one commenter astutely noted). Procedural generation is apparently easier for natural objects than for vehicles. I really should have used Blender for this, but I'd already done everything else procedurally and I was worried about not getting the OBJ loader to work right, especially since I was flat shading. I did try a procedural boat-like shape at first and trust me it looked even worse. I definitely should have left myself more time for this.

I'm not really happy with my usage of PyOpenGL. I want to be off the fixed function pipeline, but I don't want to have to go all in on a library. I think I want some boilerplate shaders and example usage code that I can copy into my program and tweak as necessary. I would have liked to have written a fragment shader that would do a procedural nebula for the sky box, but I couldn't figure out how to make that work with the fixed function pipeline.

I can't believe I had some code that just happened to be a syntax error on Python 3.7 but not 3.6. What are the odds? Someone did helpfully point it out during the upload period but only with about 2 hours left so I missed it. Next time, in addition to making a post about it here, I'll ask people on Discord to test it out early.

Thank you to everyone who tried the game! Congratulations to our winners, Tee and Team E! Thank you very much to mauve for running things so smoothly, it's always a great time!