hypnos: a postmortem
When I saw that Sophie was hosting a Myst Jam, I got really excited. Myst was a hugely influential game for me growing up. I spent hours in Myst and Riven, and I still have the Riven strategy guide in my desk for some reason.
I had intended on writing a devlog, but I wasn't sure if I'd have the time to finish the project or not. So, if you're interested, I'll walk through what I did to put this project together – what went right and what went wrong.
** Note: if you haven't played the game, and would like to – there will be spoilers ahead **
Here's the game link: http://okeedokestudios.itch.io/hypnos
The first thing I did right was brainstorming. I took out some actual paper and put together a list of puzzles, story elements and topographical features I wanted in the game. I tend to start in the software, which ends up being pretty unfocused. Before touching Unity, I had the island sketched out and all of the puzzles designed.
By the end of the first night, I had the entire island shaped out in Unity's Terrain editor, along with the painted textures, grass and trees:
I used textures from Unity's Standard Assets package (Speedtrees, dirt/shore/grass textures) along with some grass textures from a Nature Starter Pack by Shapes ( https://www.assetstore.unity3d.com/en/#!/publisher/3292). I also ended up using their skybox and some of their rock prefabs.
Next, I focused on fleshing out the story. It was out of my scope to do the voiceovers right, so I stuck with handwritten notes. I had all the beats I wanted to hit, but left enough room in each note for some mystery. I wrote these all out in a text file and then used Pixelmator to mock up each page sprite.
With the story done, I went back and finished the geometry of the island – there were two buildings, a tower and a pool, which I built out of Unity's primitives. I'm not a 3D modeler, so I kept things simple. However, I did really want a nice bridge and rowboat. There were free versions of both of these models available on the Asset Store ( https://www.assetstore.unity3d.com/en/#!/content/31917 and https://www.assetstore.unity3d.com/en/#!/content/33888), so I went ahead and used those.
I tend to want to control every little thing from scratch, but one of the best decisions I made was to use some existing assets. I used the standard First Person script from Unity to get moving right away, along with a Camera Shake script I copied from an excellent book I've been working through: "Mastering Unity Scripting," by Alan Thorn.
One of the trickiest puzzles to implement was the rock pillar puzzle off the southern shore. The player has to follow a specific path to stay above the water, since touching the water anywhere else will respawn the player back on the shore. I drew the puzzle out carefully on a grid and matched it up with a treasure map to be sure the scale was correct. Finally, I laid out all of the stones on a grid in Unity with a top-down perspective and snap-to-grid turned on.
It's probably the hardest puzzle. Originally, I didn't include the non-path stones on the map, but with the in-game perspective, it was extremely difficult to tell which rock was which. I had considered adding a compass, but adding the non-path rocks to the map made it solvable (and satisfying to complete!). I also made the decision to remove the jump button to prevent skipping between hidden platforms.
I scoped the project very well, but the island itself is a little large. One of the things I loved about Myst was the density of the island. There wasn't much empty space – something Jonathan Blow has said is a major design philosophy of The Witness. So, my island terrain ended up being a little bigger than I would have liked for the number of puzzles. To compensate for this, I made the run speed much faster than a typical exploration/puzzle game.
One of the puzzles is a treasure hunt. Five "copper tubes" (or whatever they look like) are hidden around the island to power the central tower. Originally, I just had them scattered around the island from the beginning. However, my wife tested the game and found them all before doing the rock puzzle (for which the reward is a treasure map of the tube locations), so it felt very anticlimactic. To fix this, I changed the tubes to spawn only once the treasure map was collected. The dream-focused narrative allowed me to do things like that, since that wouldn't make sense in a more reality-based game.
I had been meaning to try out ProBuilder for a while, and I finally got an excuse to use it for building the interiors. It's insanely powerful and easy to use – and I was only using the free version! If you're building level geometry, it's an essential tool in Unity: http://www.protoolsforunity3d.com/probuilder/
To save time, I put everything in one scene. This makes the initial loading time a little longer than it should be, but all of the travel is instantaneous. It's a fairly simple project, but it would probably have been best to split the interiors over several scenes. This did, however, allow me to use a live camera for the interior tower screen. As the dials are changed, the camera shows the actual change to the exterior environment. I originally intended to use still images, but the live feed was a fun addition.
Scripting went well, but like most of my jam code, it started perfectly planned and devolved into copying and pasting the same coroutines in 7 different classes. One of the dumbest mistakes I made was writing my own music player script. I'm an audio/music person, so I got foolishly ambitious about creating a very comprehensive music player. I could have just put both exploration tracks in one audio file and looped it, but instead I spent a couple hours on an unnecessary script. I also wrote it very very late in the evening/early morning, so I made some sample rate conversion errors that took an additional hour or two to debug later. All of that could have been avoided with either someone else's script (I'm sure there are many) or keeping it simple.
On that note – the music turned out very well. I had an idea for the main theme one morning, so I recorded it right away. Music is one of those things that you should always record while you're in the mood to write, if possible. My background is in music composition, so it didn't take long to record and produce the main theme (the full track is during the end credits). However, I did use a couple ambient tracks that I had previously released in an asset pack, which you can check out here for your games: https://www.assetstore.unity3d.com/en/#!/content/37985 :)
I didn't get to audio until 5am on Friday evening (most people call that Saturday morning). Sunday was my daughter's birthday, so I wanted to have everything finished and uploaded by the end of the day on Saturday. Fortunately, I had a huge library of royalty-free sound effects between my licenses for Final Cut Studio, GarageBand and a GDC promo pack from soniss.com. I went through and edited some in Audacity and placed them around the world in Unity.
The original version offered a choice at the end of the game. Throughout the game, you are chasing your love (intentionally left gender-neutral) and discovering they have been trapped on this island. When they are sleeping and become lucid (knowingly in-control of the dream), they can add things and change the island. In the final room, you discover that you were brought here because they dreamed you into its existence, thus trapping you in the island as well. The guilt trapped them in a separate world of darkness (represented as a crude black painting in the corner). Originally, you were able to touch that painting to join them in darkness. Alternatively, you could check out the other side of the room and read the note from the void that encourages you to sleep and dream your love out of the darkness to join you back on the island.
The only difference between endings was a cryptic silhouette as an eye opened to show that you had succeeded in dreaming them back to you after the credits. After some play testing, the choice wasn't clear and I didn't have time to add a confirmation message to add weight to the choice. Therefore, the painting option was dropped, allowing everyone to finish the "best" story.
I had a blast with this project. If anyone has feedback, I'd love to hear it!