Archive for the ‘Uncategorized’ Category

Virgil’s Commonplace Book

Posted on:

Virgil's Commonplace Book

For NaNoGenMo 2015, my project was Virgil’s Commonplace Book, a computer-generated travel novel set in the Roman Empire. As always, the code is on Github.

There’s also a related Twitter bot, @erat_viator.

In both cases, one of the underlying motivations was to explore serendipity in publically accessible data. There’s a ton of databases of information from the Roman Empire, but sorting through the deluge of data is hard to do without context. The bot and the book add context as you explore the data.

Virgil's Commonplace Book

Gravity on

Posted on:


I’ve updated Gravity so that it works in current browsers.

I took the opportunity to tweak a couple of things. The biggest change, though, is that it’s now hosted on

Clojure-Unity: Getting it to Work

Posted on:

Clojure in Unity is a really exciting idea. Since Clojure CLR has been around a while, it’s been theoretically possible to combine the two, but last time I looked into it the old version of Mono that Unity currently uses was too big a barrier without some work being done. Well, now that work has been done, and it’s working enough that I can have a functional REPL in Unity.

The downside is that it’s very, very early stuff right now, and requires you to have your duct tape ready to deal with the problems you’ll run into.

The biggest one I’ve run into so far is the Windows paths were broken, since the main developers seem to be working on OSX. Fortunately, there’s already been one enthusiastic Windows user, Joseph Parker, who made Parade Route for Clojure Cup 2014. And made the source code available, so I could check his changes.

static public string[] CompilationRoots = new [] {

static public string pathToAssemblies = "Assets\\Clojure\\Compiled";

static public void SetupLoadPath() {
string loadPath = Path.Combine(System.Environment.CurrentDirectory, pathToAssemblies);
foreach(string path in CompilationRoots) {
loadPath += ";" + Path.Combine(System.Environment.CurrentDirectory, path);

System.Environment.SetEnvironmentVariable("CLOJURE_LOAD_PATH", loadPath);

There’s still some issues with it, some of which aren’t present is parade-route, especially with the play mode in the editor. But for a pre-alpha duct-taped project it’s got a lot working already.

Ludum Dare #26: Nothing Left

Posted on:

I made a game.

The theme was “Minimalism”, which worked because I didn’t have a lot of time to work on it. It’s a no-button bullet-hell vertical-scrolling shooter. With procedurally generated enemies.

I think the competition version may be a little too easy, but I think it has enough potential that I’d like to add a bit more to the game.

Gravity In Progress

Posted on:

Still doing occasional work on Gravity. I’d been blocked on the art style, which greatly slowed things down on that side and affected motivation for the rest of it. The original idea involved a rocket ship, but I didn’t want a typical rocket ship design. The eventual inspiration is rounder and more toy-like, as you can see here. Still a work in progress; the textures are only half-done.

Failure Equals Game Over

Posted on:

One of the most powerful moments I have had in gaming came when I thought that the game was over. It was in Deus Ex, of course, as so many things are. It was a classic scenario: one character was wounded, and begged me to go on without him. Well, I was already deeply immersed enough in the story that I decided that I wasn’t going to leave him. I was going to make a last stand right there. I made a quick-save and prepared to hold off the assault.

I lost, of course. There were too many of them. I was shot, and collapsed, and the screen faded to black. And just as I was preparing to see the ‘Game Over’ screen, my character woke up. He’d been captured. The game wasn’t over. I could have walked away, but I chose to stay and fight and the game respected that decision.

This example was especially powerful because of the subversion of expectations, but the general principle of interesting failure applies. A ‘Game Over’ screen is a judgement on the player, one that demands immediate historical revision, literally altering simulated history, as Prince of Persia: Sands of Time makes explicit. But this only softens the blow, making quicksaves into a accepted part of the gameplay. It’s much more interesting when we can accept the player’s decision, whatever the result.

A few games have made this connection explicit. In Burning Wheel Revised, for example, the DM isn’t supposed to let the players roll the dice unless the explicit failure result is stated: usually a complication that makes things worse for the players and skews them off in an interesting direction, but very seldom are the stakes “Game Over”.
Roguelikes and Ironman modes are one approach to address this, where the harshness of permadeath forces every choice to remain meaningful and keeps the player cautious. But this has a niche appeal. And the game still comes to an abrupt end.

Crusader Kings 2 takes a different approach to failure. Your character is going to die, sooner or later: the game lasts longer than even the longest lifespan. But the player keeps going, with that character’s heir. A similar approach informs the rest of the game: you’ll never conquer the whole world, and even the most massive of empires tends to collapse under its own weight. The scoring system doesn’t necessarily even reward most warfare, since you’re only allowed to hold on to those titles that you can prove a legitimate claim to. So by most games’ terms the player is continually going to be confronted by failures, as each character dies and their heirs see their legacy unravel. But the game keeps going, keeps throwing interesting challenges at the player.

Odd as it may sound in a game about European nobility, Crusader Kings ultimately eschews fulfilling the player’s power fantasies. This is a game that is as much about failure as it is about success, as much about the king who died after a month as it is about the king who reigned for sixty years.

Players respond to the feedback the game gives them. Game Over is a death of feedback, a cessation of meaningful interaction. If a game can support a player failing but then still continue, with meaningful things for the player to do, interesting goals to strive for, and new challenges to be overcome then that game can continue to engage the player.

Game Over is an execution. It’s a temper tantrum that emphasizes that the story wasn’t supposed to go that way. Game on is an affirmation that even if the player made some bad decisions, they can still be redeemed, still find closure.

Unity3D and Lightwave

Posted on:

NewTek has an official tutorial that explains the basics.

When Unity asks for the location of Lightwave, point it to the root Lightwave folder (probably “Lightwave11.0”) not the /bin or any of the other subfolders.

Unity can seamlessly import animations from Lightwave, including from rigged and skinned models. This took me by surprise, as I was planning to bake the animations. Baking turned out to be unnecessary, as the automatic FBX export apparently handles it.

End-of-Summer Updates

Posted on:

In lieu of posting about my unfinished Ludum Dare 24 game (which, although a learning experience, isn’t really very playable) I’ll instead mention that I also put some work in on Gravity.

In other news, DayZ is way over a million players at this point.