A multiplayer game… on a watch?

I recently came across Sensor Watch, a replacement ARM microcontroller board for the wildly popular Casio F-91W digital watch.

photograph of a Casio digital watch and the Sensor Watch replacement board
(c) www.sensorwatch.net

It allows adding whole new features to the watch via a fully custom firmware called Movement, developed by a community of users. I thought it was very cool so I immediately bought one.

Display quirks

During the wait to receive the board, I started learning how to develop for the custom firmware. One of the difficulties of writing features for the watch is how to represent information on the LCD screen.

a diagram of all the segments of the LCD display

The display doesn’t have that many 7-segment digits to start with, and to complicate things further, they’re not actually all 7-segment. Some of the digits have more or less segments, or some of their segments are tied up together and cannot be turned on or off independently. That’s because the original watch doesn’t need to display all possible characters at each position, and the designers used as few segments as necessary.

For example, the leftmost digit for the day-of-month (upper right digits) can only be 1, 2 or 3 so it only has 6 segments “visually” and only 4 actually independent segments since the 3 horizontal segments are grouped.

a diagram showing the 4 segments required to show digits 1 2 3
1, 2 & 3 only need 4 independent segments including one “super-segment”

In that position, you can’t display an 8, as there is one missing segment. You can’t display a 7 either, as you would need to turn the top horizontal segment on, but that would also turn the other two horizontal segments on.

For the developer of new watch apps (called “faces” in Movement), that means having to reword, move things around, or otherwise find creative ways to display legible information. Even if the firmware has a nice emulator, trying new UI ideas still requires recompiling the firmware, running the emulator, navigating to the app and using it, so that’s not an immediate process.

Also, Movement uses a string to represent the state of the display, e.g. 0123456789 would show a 0 at position 0, a 1 at position 1, etc. While most characters map to what they would show on the display (at least if they can be displayed at that position), some others are special characters (e.g. ! shows a small “L” on the upper half of the digit).

To help with the challenge of building nice displays given these constraints, I’ve built a web-based tool that allows testing display strings live.

Try it here:

https://hchargois.github.io/sensor-watch-playground/

Finding an idea for a new face

The first project I wanted to make was a metronome. The watch has a piezo buzzer and with the Sensor Watch, its frequency can even be set in order to play any note we want. I thought it would be nice to build a metronome face that not only can be set to a specific tempo, of course, but also can be set to a given time signature (4/4, 3/4…) and that marks the beats correspondingly with different tones.

I had that idea for some time and even started drafting a UI, experimenting with the buzzer etc. Unfortunately, I had to put that project on pause for a few weeks and by the time I could restart it, someone else had published their own metronome face… It didn’t make sense to build a second one, so I searched for something else.

A game maybe? There were already just a couple games, one being a clone of an existing Casio “Space Invaders” shoot ’em up, the other a simple high-low guessing game. There was also a coin tosser/dice roller that could be used to play games but I don’t think that qualifies as a game by itself.

So, I set out to build a game. For an extra challenge, I wanted it to be somehow novel and not just a port of an existing game. I also wanted it to be a multiplayer game. And if that wasn’t enough of a challenge already, I thought maybe I could make it a real-time multiplayer game, where both players play simultaneously, instead of an easier turn-based game.

Tabletop game inspiration

The watch only has 3 buttons, including one that ideally should be kept reserved for switching to the next face. So… basically 2 buttons for 2 players playing simultaneously. In other words, one button each.

Not much can be done with a single button! You can’t really make complex choices, except, well, pressing it or not. Still, that’s enough for a few gameplay mechanics.

For example, the game could be “who presses their button the most times in 10 seconds”… basically a digital equivalent of Hungry Hungry Hippos.

box cover of the Hungry Hungry Hippos board game

But that’s a bit crude. Another gameplay mechanic that works with a single button is reaction-time based, where you don’t have to press the button many times, but at the right time.

That made me think of a French card game called Jungle Speed (not sure if it’s popular outside of France?)

photograph of an ongoing game of Jungle Speed
CC BY-SA 3.0 Nicosmos, Wikimedia

The goal is to grab the wooden “totem” before your opponent does, when two identical cards are drawn. That’s often tricky because many cards look a lot alike but are actually not the same.

The reaction-based gameplay, the look-alike symbols, the symmetry of the cards, all of that inspired me a lot and I came up with a game I called “Butterfly”.

The Butterfly game

In Butterfly, each player gets assigned their own button (LIGHT and ALARM, which are on opposite sides of the watch). A round starts with the watch showing both players a single “butterfly”, which is a symmetrical 2-character symbol, intended to represent the patterns on the wings of the insect.

a diagram showing 4 different symmetrical 2-digit symbols
A few of the 13 different “butterflies”… Use your imagination!

After both players have memorized the butterfly, the game proceeds to show different butterflies, one per second. When the “target” butterfly that was shown at the start is displayed again, the fastest player to press their button wins the round. If a player makes a mistake and presses their button when an incorrect butterfly is shown, they lose the round. The first player to reach a set number of winning rounds wins the game.

emulated watch showing an ongoing game of Butterfly
An ongoing game of Butterfly; it’s the start of the round, the butterfly that players will have to catch is shown in the middle; player on the left has won 5 rounds and player on the right has won 2

If you want to play the game, you know what you have to do, go buy a Sensor Watch! The code of Butterfly can be found in this Github PR.

It was a really fun challenge to develop on such a constrained device and I encourage you to try a similar exercise!