An Update on the Decentralised Adventure Games

Demonstration of 2D game features directed by Linked Data

April 3, 2023

In older blog posts I’ve explored the wider possibilities of decentralised games running on the semantic web, but I’ll briefly introduce it here. Since 2021 I’ve been playing around with the use of Linked Data to enable games to share content and features. The long-term goal is to build a game in common, where I’m able to publish a character, or meet one in a text-adventure game, use it as a card in a card game and find when I take it back to the text adventure game the experiences in the card game have changed the character. So then it’s an ecosystem of games which build on top of each other and choose to share things with one another.

In this demonstration, I made a pretty basic city-building-like game which lets you place characters and buildings down in a map using cards. The player is able to play a card which turns one of the characters into a vampire, the action the card is read from being instructed from Linked Data. A GIF of the result is below.

Video GIF of demo gameplay. In a 2D city-building game using cards, a card is played on one of the characters in the village, called 'Vampiric Bite'. After being played the character is transformed into a vampire.

What is really cool about this is that the card I played was read from linked data, which means that it could be pulled from any server - a server providing features of vampire lore to any game which connects to it, perhaps, or the server of another game which hosts the vampire’s lair. The game found the action “Vampiric Bite” from the server and adapted to its instructions, and this allowed it to support vampires without having been explicitly developed with these assets or features in mind.

The “Vampiric Bite” action is available in JSON and describes an action which turns a character into a vampire. It includes basic information about the description and depiction of the action, and indicates that it can be played as a card via the property-value implementsSpecification: playableCard. Via playTarget it indicates it should only target characters, and via the patchesOnComplete it describes to the game how to change the world state so that the change is made (how to make the target a vampire).

The next steps will be to add restrictions to playing the card via shapes (this means to define the game state which must be for an action to be valid - to perform Vampiric Bite the actor must themselves be a vampire) and to separate the consequences of an aciton from the action itself so that it can have different effects depending on the context (e.g. if a vampire drinks the blood of the dead or dying, then the vampire itself dies).

The code is all available on GitHub. The game itself is from a game I’m calling Sim Polis, and most of the specifications are defined in the Multi-User-Domain vocabularies. To have some context in the vocabularly in particular check out the issues and the Wiki. You’re welcome as well to contact me.