The story of my seemingly-cursed lightweight virtual tabletop for RPGs project(s)
Most of my tabletop roleplaying gaming is done online. I started playing via Skype after being inspired by an Actual Play podcast who played games over Skype. Back when I started there were some virtual tabletop applications available, but they all had drawbacks (for example, some of them were standalone apps so there could be problems if you had some players on Windows machines, some on Macs, and some on Linux). Regardless, for the kinds of games we played we often didn't need any kind of virtual tabletop (I wasn't playing any games with grid-and-minis combat, for example) and we figured that since we could just roll physical dice locally to play we should do that and not worry about the hassle or distraction of an extra program.
When Google launched Google+ and Hangouts I eventually migrated over to gaming via Hangouts video chat. I still preferred to rely on rolling physical dice locally, and that worked fine for the games I was playing. There were some new virtual tabletops that came out, Roll20 being the biggest. To my eyes it had some downsides: it seemed to be focused on “map” style play, for games like combat-focused D&D, which wasn't the kind of game I played. And I had a snobbish dislike for how it didn't seem to have the “production values” you'd get in a 2D video game, the look-and-feel didn't appeal to me. Because I didn't need to use it I didn't pay much attention.
Dogged perseverence
Eventually I formed an online group with the intention of playing Dogs in the Vineyard over Hangouts. While this doesn't use any kind of combat maps it does have a complicated dice mechanic where you roll big pools of dice and it's important to know which dice the other players have “on the table” in front of them. I knew from previous experience that you could do this with locally-rolled dice and just taking notes as other players read off their dice results, but one of the players convinced us that we should try DiceStream based on his previous experience. Rather than a map-focused experience, DiceStream was just focused on dice-rolling, and rather than taking the focus away from the other players it used the clever technique of superimposing the dice results over the video feed of the player rather than making the virtual tabletop a separate window or panel. Once we tried it I had to concede that it was a better way to pay this particular game. There was one problem, though, which was that because of a design choice in how the program displayed d6s it was hard to use in exactly the way we wanted to.
Since I had done some programming (and some 2D game programming in particular) I decided to see how hard it would be to make a tool that did the same thing as DiceStream, but didn't have the quirk that was causing our headache with using the d6s the way we wanted to with Dogs in the Vineyard. I didn't copy the code, but replicated the functionality, plus added a few extra features for the particular game. I released it as its own Hangouts app, Dice in the Vineyard:
Specific to general
The player who suggested we try Roll20 in the first place noticed that one of the features I added would also be convenient for him if he used this tool when he was playing a Burning Wheel game with his other group. He also requested another minor feature, which I implemented since it wasn't much trouble. After our campaign of Dogs in the Vineyard wrapped we decided to start playing My Life with Master. The dice mechanics in that are pretty straightforward, but they do call for a few dice with different colors. I decided that since I had already started down the path of generalizing Dice in the Vineyard with features for other games I should just go all-in and make a full-featured dice rolling lightweight virtual tabletop. It took a little while, but I eventually got RPG HUD working (the idea behind the name being that the “overlay over the video” functionality would let you keep your “heads up” while playing the RPG rather than staring at a separate virtual tabletop window). I also had some other ideas that were partially implemented, such as “token drawing” functionality to support games like @paulczege's The Clay That Woke.
What else was in the cards?
With the experience of implementing dice-rolling functionality in a lightweight virtual tabletop, I realized that there were some card-based RPGs that were hard to play online. I figured that I should be able to take what I had learned by creating RPG HUD and make a lightweight VTT for cards, the working title was Cardinal.
Life finds a way. Unless it's a Google product, then end-of-life finds a way.
However, these projects got totally derailed when Google announced they were going to end-of-life the API functionality that let tools like RPG HUD and Cardinal integrate with Google Hangouts. This was very disappointing, since I had ended up putting a significant amount of time and energy into these projects by that point. Also, I suspected that this would be a pretty big blow to Hangout gaming in general since a lot of people had seemed to be using some types of Hangouts API to assist their gaming (not many people were using mine yet, but I was still optimistic).
As something of a coincidence, I had started investigating how to code a Chrome extension for a different project. But one feature of a Chrome extension lets you do is create a little “popup” window that hovers over your browser window. It occurred to me that if you were running a Hangouts session in your browser and an extension popped open one of these windows it would be very similar to what I had been doing with the “overlays” in RPG HUD. So a new RPG HUD was born. Since it wasn't showing the dice via the video feed anymore it needed an actual communication mechanism to tell the other players' instances of the app which dice to show on your part of the table. I didn't want to have to run my own server to coordinate messages, to I decided to use Google's Realtime API, which was a generalization of the functionality that makes realtime collaborating in a GoogleDoc possible. I got a prototype up and running, and it seemed like it was working.
Party on? Not so much.
However, I had been putting a lot of time and energy into this project without much to show for it, so I decided to start a Patreon to support development. It didn't get a lot of support. I had tried to keep my expectations low (especially since I'm really bad at self-promotion), but I was really deflated by the lack of interest. It basically killed my motivation to work on the project, so it was essentially shelved.
End-of-life me once, shame on you...
I've never been part of the open-source scene, but when I saw the Utopian-IO buzz starting it occurred to me that it might be worthwhile to take this version of RPG HUD out of mothballs and see if I could make it into an open-source project suitable for Utopian-IO – I couldn't get money for developing it through Patron, but maybe I could get some Steem rewards for it. However, a few days ago when I went to check out the state of the Realtime API I was amused/dismayed to see that yet another Google product is being end-of-lifed out from under me:
If I do want to resurrect the project I'll need to find another communication backbone. Realtime wasn't perfect anyway, since there were no ideal methods for guaranteeing atomic operations (useful for stuff like moving a token from one stack to another while a different player might be trying to grab it), but I'm not sure it would be worth the effort to ramp up on a whole new method. I briefly looked at some chat APIs like Discord to see if might be easy to use that, but it seems like their consistency models are even looser than the Realtime one. Right now I think the project is likely to remain dead, except as this tale-of-woe blog post, but I do hate it that I have all this code I worked on that's essentially going to waste.
Having dice on the tabletop does work in roll20:
If you aren't using roll20's virtual tabletop to place miniatures on, roll20 isn't at its best though.
Tabletop Sim might do better for games like Fiasco, but TTS doesn't deal with communication really well, which means you will have even less time to look at the other players faces (especially if you only have one screen … like any normal person).
Displaying dice right next to ones face is pretty smart. Makes you wonder why no one thought of this before.
Well, at least one person did, the developer of DiceStream who I stole the idea from. :) But I think the reason it's not a more popular approach has to do with the software tools that are available and the way people tend to think about software. Getting a live video feed is already a somewhat nontrivial task, so that tends to be either its own standalone app or a library that does it. If they don't provide hooks that allow you to composite other stuff with it then it's hard to do with a standalone app, and if it's a library then you've got "network effect" problems convincing people to use your virtual tabletop app that has integrated video (plus all the cross-compatibility headaches). Or if you're looking at it from the "game engine" side of it, your mind will tend to end up with map or environment simulators like roll20 or tabletop simulator because that's the kind of things those tools usually seem good at creating. Plus there's a much bigger market for tools that support those kinds of games.
Oh, that's cool! What about something like Pusher?
I'll look into it.
And oh, hey, grats on nabbing a @curie nod! Got one at random with my own last post, always a treat.
Stories like this always make me hesitant to build things based on Google's free APIs. I've been wary about putting all of my eggs in their basket since they killed Google Reader.
We play online Shadowrun, and use Google Hangouts along with Slack where I've written a custom bot for dice rolling. It's not pretty in that it doesn't actually show dice, but it does show the results, which is what we really need.