Hi, I'm Henry. In 2012 I quit my job as a programmer at BioWare to spend a year making my own indie games. This blog is about what happened next...

Like Spaceteam? Want to support my work?
Join the Spaceteam Admiral's Club!

Connection Established

After a couple of months full-time on Blabyrinth I'm back on Spaceteam maintenance for a few weeks. I want to improve the connection issues, add support for Bluetooth, and a few other things. I don't want to get too sidetracked but I'm being paid for most of this work so it's easier to justify. Although I'm starting to wish I had some kind of 'employee' to help out! Here are my priorities:

Bluetooth

Complicated and boring, but I’ve put it off for too long. It’s time to get my hands dirty. Here’s why it’s difficult:

  1. The original Bluetooth code was in Objective-C on iOS, and I don’t have the Android code at all because of reasons. So... I can’t just port it to Unity.
  2. Unity’s High-Level Networking API (HLAPI) doesn’t support Bluetooth so... I have to find (or write) a plugin.
  3. There is a good Bluetooth plugin for Android that integrates with UNet HLAPI, but... it doesn’t work for iOS.
  4. The best iOS plugin I found that supports Bluetooth doesn’t integrate with the HLAPI so... I have to start using the Low-Level API. This requires modifying all the networking code (again) to use simple client/server messages instead of SyncVars, Commands, and ClientRPCs. Complicated, boring, and requires re-testing most of the game.
  5. On top of this, the iOS Bluetooth plugin seems to be broken. After further investigation it appears that it might be an Apple bug.
  6. At this point I’ve resigned to just writing an equivalent plugin myself. I haven’t written a Unity plugin before and while I’m sure I can figure it out, it’s not very exciting. Luckily I’ll only have to write it for iOS because I have no experience at all writing native Android code.

But once I get it working I'll be done with Bluetooth, I'll have a more flexible low-level networking layer, and I can reuse the code for Blabyrinth and CaptainsMess. It's a worthwhile investment.

Mysterious external project

More details later but a company has licensed Spaceteam in bulk to play in their venues and I’ll be doing some custom work to support it. It seems like a good fit and there is money involved so I think it's worth it!

Upgrading Spaceteam ESL

Spaceteam ESL is still on the older codebase (1.8) so it has the same Android incompatibility issues that plagued regular Spaceteam. It’s time I brought it up to code, but it also allows me to add the next interesting feature...

Internet Play

This will technically allow you to play with people who aren't in the same room, but I don't recommend it (you won't be able to hear each other!). This feature is designed for situations where neither local Wifi or Bluetooth will work, like school classrooms where Spaceteam ESL is primarily used. My plan is to use GameSparks Real-Time for this, but I’m also investigating other options (like Google Play Real Time Multiplayer) since GameSparks has user limits that I might eventually break.

Spaceteam FSL

The next logical step for Spaceteam ESL is to introduce an equivalent version for learning French! Concordia is rustling up some more grant money so I’ll be working on this for a few weeks. Since the code is mostly shared with the ESL version it won’t take too long.

...and One More Thing

The Spaceteam family is getting a little bit bigger... because Admiral Spaceteam and I are having a baby! She's almost 6 months pregnant and the due date is in June.

Space out!

~ Henry


Blabyrinth - The First Few Hints

Blabyrinth - The First Few Hints

I've now spent almost a month working full-time on Blabyrinth! This game has felt just out of reach for so long. Getting to work on small snippets was always a treat but now that I'm making actual progress it's having a noticeable (and positive!) effect on my mood.

I'm very aware that Spaceteam still has a bunch of connection issues and is missing Bluetooth. I will remedy those things soon but I also need to focus on finishing a second game so I can keep this little operation running. The Spaceteam tip-jar is still clinking away and the Patreon is getting started, but having more than a single game to rely on is going to help tremendously.

So what progress has been made?

Be aware that everything below uses placeholder art. I found a great set of flexible prototype sprites here that is evocative of the final vision: Oryx 16-bit Fantasy Sprite Set

A lot of the foundational work is getting done.

  • Players can connect and see each other and move around
  • Rooms are connected with passages that can be opened or closed
  • Items can be picked up and dropped and stored in containers
  • Locked doors can be opened with keys Key Unlock
  • Pressure plates can open doors while they are pressed Pressure Plate & Portcullis
  • Scenery can be examined, moved, and manipulated Sliding Boulder
  • Scenery can be touched in a certain sequence to trigger... something Secret Statue Sequence
  • Clues can be split across scraps of paper Torn Parchment Clue
  • Keypads can trigger things with a sequence of button presses Keypad Animals

This is a good example of the extensibility I talked about a couple of posts ago. The keypad in the example uses pictures of animals, but the button labels can just as easily be letters, numbers, astrological symbols, runes, whatever. Or they can be blank and the solution can involve their position on the grid. With a few simple changes similar puzzles can have a very different feel.

And importantly, all these behaviours and actions persist across the network.

Incidentally, my best advice for anyone building a multiplayer game: do not build a single player game and then add multiplayer to it later. Build multiplayer in from the start. Always code as if you are sending and receiving data across a network. It will keep your code better separated and save you a lot of headaches. I (claim to) know this and I still find myself taking shortcuts and making assumptions that I later have to throw away and rewrite to accommodate networking.

~

Next up is the Level Generator. It will begin by generating a random treasure and a secret ritual required to discover it. Clues to the ritual will be distributed throughout the level, themselves hidden in secret places, behind locked doors, or engraved onto scenery. This requires further clues, and then the process continues recursively until the labyrinth is sufficiently complex.

To help with testing I've hooked up my Palette hardware controls to the game. So far I'm just using the slider to zoom the camera in and out of the level so I can see how it has been generated. This feature will not be available to players ;)

I've only just started on the generator but I'm very excited to keep building on this foundation and see where it takes me.

Space out!

~ Henry


Spaceteam is coming to Your Library

Your Library

Every year libraries around the world participate in International Games Day @ your library raising awareness of games and gaming in libraries. Read more about the history of IGD.

This year, on Saturday November 19th, Spaceteam will be one of the official games played in libraries across the planet and I'll also be running an experiment to connect all IGD Spaceteams together through a global event leaderboard.

Here's a sneak peek at what the event page will look like:

Leaderboard Sneak Peek

This is a web page that will be updated in real time to show a ranked leaderboard of every Spaceteam participating in the event, along with some other stats like the total number of sectors travelled. I'm also planning to include a world map showing all the locations where Spaceteam is being played.

Your Events

IGD will be the first official event to use this feature but starting with Spaceteam 2.1 it will be totally open to be used by anyone to run your own Spaceteam events.

Just pick a short Event Code (like "IGD" or "Challenge2016") and tell your participants to use it. Then go to the website (probably leaderboard.spaceteam.ca when it's ready) and enter your code. You'll get a custom leaderboard filtered to only show teams who used that specific code!

Event Settings

This task has a specific deadline (November 19th!) so it has taken precendence over other things but I hope to wrap it up this week and then my next Spaceteam priority is Bluetooth support!

Technical Details

Getting the leaderboards working proved more difficult than I expected. My first plan was to use the built-in Unity Analytics to send a custom event whenever a team finished a game. Then a worker app on Heroku would periodically download the event data through Unity's Raw Data Export system and store it in a database. The web page then queried the database to display the top teams. But there was just too much lag time between sending an event and it showing up on the website.

Next I experimented with a service called PlayFab, and finally settled on GameSparks.

GameSparks has a bunch of useful features that I might be able to use in future games, the only drawback is the potential cost. They have a great "indie" program which is free for up to 100,000 Monthly Active Users (MAU). Well... lucky for me Spaceteam has over 100k MAU. So for now I'm only enabling GameSparks if a player enters an Event Code in the settings. So please don't all do it at once! Just kidding, only a small fraction of Spaceteam players read these posts so there is basically no chance that the numbers will get that high. Use it as much as you want!

Blabyrinth!

In the world of Blabyrinth I'm in the midst of building the engine foundation.

One of the basic concepts in the game is the "level" which consists of a 5x5 grid of rooms (this may change) containing scenery, doors, and items. A level can be hand-crafted or procedurally generated. A level also has rules that determine how doors are unlocked, secret passages opened, and what happens when scenery is interacted with.

A rule might be:

  • if all four players push (swipe) this statue at the same time then it will slide out of the way revealing a hidden item cache
  • if three specific items (eg. a bell, book, and candle) are placed on an altar and certain words are recited then a mystical symbol will appear on the wall
  • if keypad buttons E, N, I, G, M, and A are pressed in sequence then a secret passage will open

These rules are easy to write in code, but I need to design them in such a way that I can easily store them in a database and send them across a network. I also want to support players making new rules for their own levels. JSON is a good format for doing this, partly because it's an easy format for humans to read and write. So I'm making sure that I can store not only the level layout and contents, but also the rules, in JSON. Converting data between different formats like this is called "serialization" and this is what I've been working on recently.

Space out!

~ Henry