Mage Princes: Dialup Dataflow Diplomacy

Mage Princes was the first game I developed and released as a teen. I developed it using a programming language called Prograph, which used dataflow. I had developed many simple games using C and HyperCard, but Mage Princes was my first ambitious game that I knew from the moment I began was destined to be released and have a massively multiplayer community.

The only obstascle was that my dial-up BBS system of choice, the Mac-friendly GUI BBS software called FirstClass, did not support plugins or games of any kind. It was based solely around message posting forums, so I adapted a concept I had only seen mentioned in classified ads in the back of Dragon Magazines: play-by-mail.


Prograph was a peculiar language when it was released, though an Unreal Blueprints prigrammer might find its dataflow graphs quite familiar.

Prograph cpx logo.PNG

I started with a free interpreter-only version of Prograph and when I entered into a Simon Fraser University Mentorship Program with Professor David Fracchia, I got access to educational pricing and used it to buy a full compiler-equipped Prograph CPX license. CPX could build full Mac apps so I planned to make something worth releasing to the world with it.

Prograph is object-oriented, so I devised my object classes to reflect the parts of the world I was simulating.

Designing a Massively Multiplayer Empire Simulator using Play-by-mail and Dataflow

Mage Princes had Players with names and passwords, but no emails yet, because this was a dial-up BBS game!

Empires were the things each player controlled, and where almost all the games’ data resided. Each Empire had stats like a D&D character sheet would. Population was the meta-stat that mattered most, as it determined how many workers you had to allocate to every activity.


Next came Gold, and shops which produced commodities whose values fluctuated based on player trading such as Spices, Silks and Gems. Players could place trades with high and low price ranges every day and their trading determined the movement of the prices. Shops needed commodities as inputs to power their outputs, so players had to ask around to find out which commodities were in demand and worth investing in building shops for. The bulk of economic message board activity concerned people negotiating trading prices and encouraging new players to make agreeable trades.


A multiplayer empire simulation wouldn’t be complete without warfare, so every Empire had a number of Spies and Soldiers. Soldiers took poopulation and time to train, but they cost money to pay, so a nation that wanted to go to war ran the risk of increasing expenses at the cost of economic growth unless it used its soldiers to take resources from other players. Military actions could be sabotage, raids or invasions. Sabotage was secret and could damage a rival’s economy slightly, but if someone discovered an unlucky sabotage attempt you could expect a retaliatory invasion. Raids were overt and did more damage, but they alerted everyone to your hostility and often resulted in alliances defending the target with retaliation. Invasion was the riskiest all-in mode of attack, pitting your entire army against theirs. A lucky and decisive invasion could do enough damage to someone that their allies would have little chance to intervene before someone was wiped out, but more often an attack would bog down and cause only partial losses, giving an empire a chance to call for backup.


With simplistic empire mechanics, most of the sublety of the game lay in the dynamics created by having message boards for people to discuss and diplomacize. Alliances could request to create their own private rooms, and earning membership in powerful alliances made favor-trading key to climbing the game of thrones.

The Big Bad

I created the first empire in the game, called Stygia (inspired by Conan), to serve as a Big Bad non-player character empire, an antagonist that could ocassionally intervene to spice things up and give the other players something to fear. Stygia’s looming malevolence provided a higher power to be feared akin to the role Lord British played in Ultima Online, and allowed me to intervene in the game at times as a player without violating the simulation rules that every player was bound by.

The future of dataflow programming

I believe dataflow programming as an important place in the future and 2020 will be a big year for its expanding usage. Unity 2020 has dataflow programming coming finally, and Unreal has had Blueprints for a long time.


You can download a modern remake of Prograph for MacOS called Marten for free.

I met with the developers of Marten at a lunch during the 2005 WWDC where Steve Jobs announced the Intel switch. I was excited to see someone rebooting Prograph which I had fond memories of. But I did not really want to use a faithful recreation of the original Prograph (I might have used it to updated my original Mage Princes Prograph CPX Project with their import support, but I had lost the source code in a hard disk failure sadly.)

Instead, I encouraged them to re-invent it as as a plugin for XCode and VisualStudio that could interchangeably transpile Prograph graphs to procedural languages people already used like Java, C# And Javascript. They stuck to their guns however, and produced a pretty mature time capsule of what Prograph CPX could have been polished into for those who are curious to re-live their Prograph days or to take inspiration for moderne dataflow programming language design.

WHEN ITS READY: I’ll document the remake of Mage Princes using the same methods I used at 13. Then I’ll undertake the sequel using all the ideas I had in mind at the time and many I’ve come up with since.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s