It's one thing to talk about a project and another to show a crude work in progress as an example of what I'm doing with it and where I expect it to go. When I introduced KeyLimePie I mentioned that I was excited about how simple the basic data model is, and yet how powerful (or more precisely: expressive) it can be. Now I'd like to start by showing off some of the simplicity with an actual example. For this first slice [1], I'm going to use a very simple, somewhat silly Mass Effect fan fiction conversation I wrote, in which Commander Shepard bumps into a well known hanar SPECTRE and needs to recruit "him".
This example I first scripted directly in YAML. Then it served as my test script for writing a tool to convert from Celtx to my YAML-based data model, so then it was rewritten in Celtx, had some light spell checking/editing, and was converted back to YAML to compare against the original. Then it was converted to JSON because I decided that I didn't want to use either of the two YAML libraries for .NET in Silverlight, whereas System.Json is quite accessible and handy. (YAML and JSON are good friends, and while I'd rather write by hand in YAML, converting from YAML to JSON is very straightforward.)
Nevermind the technical stuff, let me present what this script looks like visually:
That is directly from my visualization tool ("whip"), with no doctoring of any sort. It shows the entire branching layout of the conversation from start to finish, including pre-conditions. I figure that you shouldn't have much trouble following it if you have any experience with state machine diagrams and/or Mass Effect. You'll notice the requisite ...
I've posted my first (presumably buggy) distribution to PyPI (aka the CheeseShop): musdex (musdex documentation). You should be able to just pip install musdex and try it.
This is part of my lead up to Script Frenzy. I'm gearing up to (hopefully) win Script Frenzy by working on a KeyLimePie project. I've got a game backstory and outline I've been working that is less controversial than some of my earlier stuff, and I think a lot of fun. I've put off some of my KeyLimePie work to focus on tooling so that Script Frenzy is as smooth as I can make it.
To get that "real script feel", plus nicely typeset PDF files to help "win" Script Frenzy, I decided to work in Celtx, which is a free screenwriting tool built on the xulrunner platform. I built a tool to convert from a few simple (and I think reasonably script-like) conventions in Celtx to the YAML KeyLimePie data format that I already have tools to work with. (More proof that I think YAML as the basic data format was a good choice.) I took one of my existing YAML scripts, converted it Celtx and then back, as a good test that things work.
That's where musdex comes in. This is a tool that I've meant to build several times over, but knowing that I'm going to be working in Celtx for a month, I decided to finally build it. The Celtx format, like a number of other common document formats today, is really a zip file of a set of XML and HTML documents. musdex is designed so that I can edit a Celtx document as Celtx appears to see it, and yet (transparently) version control the individual XML and HTML documents ...
Normally I don't preface my fiction, but this is mediocre fan fiction at best and probably needs a fair warning. Star Trek Online has put me in a mood I haven't felt in years to write some bad Star Trek fan fiction. Something about the limited impact a player can have on a current generation MMO always tends to bring out weirdly deep character back stories from me. I'm not entirely sure why I'm posting it here, feel free to ignore it, but maybe someone will find it funny or interesting. (Hire me, I promise that I can also write better than this!)
STO doesn't have social pages up yet, or I would link directly to the character, so a screenshot will have to suffice. Star Trek, as always, is Copyright CBS Studios, and Star Trek Online and its character creator are Copyright Cryptic Studios. I'm referencing these works within my fair use rights. The portions that are my own insanity and creativity I reserve some rights in accordance with my usual Creative Commons license, as linked in the footer, by-nc-sa.
Fiara (Rekam, Fiara Wisdom) is a tall, thin, wiry alien with pink skin. As with many players, I do enjoy playing at the extremes of the character builder. (Although it seems to me that more prefer to play at the small end, rather than the tall one, which I always found odd in the superhero MMOs...) Then of course I had to answer what race she was from and why she was on the fast path to being an Officer in the Federation...
First a biography and then a couple of more detailed logs. I realize that logs aren't the best way to write the tale that follows (and I also realize ...
I've mentioned briefly on twitter my attempt to write a game or two in the "Visual Novel" format [1]. It's an easier to write genre than IF, as much as I love IF, and a more interesting genre than just a CYOA. The art requirements are generally a bit kinder if I try to explain them to any interested artists than the traditional adventure game (fewer animations, no walk cycles, ...).
I've smashed this in with my desire to play with writing Mass Effect-like 2D conversations. I realized that a single 2D "compass" menu makes a lot of sense as the driving focus for a Visual Novel game. In particular, it gives more of an IF-like "map directions" relationship to locations, albeit with an even more visual Pie menu chooser.
I think its safe to announce the engine I've been writing, the Keystone Literary Menu Pie (abbrev. KeyLimePie), named of course for the Pie Menu that is the keystone in the engine. If anyone is actually interested, I am planning to release it as Open Source as it comes closer to completion (which should be soon, I expect). I'm focussing on cross-platform, browser-based Silverlight (with IronPython magic!) for the main player engine, which means I will be testing it in Moonlight as well (but I don't expect any difficulties; Moonlight rocks). I've also been building some editing/development tools against normal CPython. (It will be easy to port the engine to non-Silverlight platforms, which are in my mind primarily iPhone and Android. I could see writing a pygame engine as an excuse to better learn pygame, and because that would also be really easy.)
(I guess I should note that I'm not actually announcing any games that I'll be writing for ...
I feel the Mass Effect team is slowly stumbling in the direction of using game mechanics that best fit the story being told. It is fascinating to watch them do so from such a different direction from my own. I was raised, to an extent, by Tim Schaefer's experiments in this direction and Double Fine is certainly the model for me in terms of choosing game mechanics that fit a world. It is silly that gaming has named its genres after collections of mechanics and systems, with the boxing constraints that entails, rather than after anything more meaningful.
Mass Effect comes from a pinnacle of Western RPG orthodoxy. I respect the talent and skill represented in Bioware's catalog. I've bought many of their games over the years, and yet Mass Effect games are thus far the only ones I've beaten. I even beat them in back to back marathons, an altar offering to a gaming god as yet unnamed that gives me some small recharge in my interest in possibly working in the industry. (Hire me.)
As someone else pointed out, it has been useful to throw Dragon Age into the mix for added perspective. Dragon Age is very much somewhere near the apex of the orthodox western RPG. It's a fascinating collection of systems, certainly, but one that more often than not distances me from the games.
Mass Effect, the first, pared down the required systems, and Mass Effect 2 only continues the surgery, trying to focus on the meaningful stories and necessary systems. It's a fascinating progression that belies the traditional nature of game sequels as generally more complex over time. Mass Effect 2 is easily my favorite Bioware game to date, given how much it throws out and re-evaluates as much ...
I've mentioned before how important I think it might be to get "open source game cities" of the GTA sort available for use in many different kinds of projects...
Just recently I've been thinking more about a similar need for "open source avatar systems". It's easy to see that avatars have become nearly ubiquitous, particularly with Microsoft's, PS Home's, and Wii's avatars all used to varying degrees across multiple game projects. (Of the three, Microsoft's being the most accessible to independent development via the XNA platform.) Character creators and character customization can be a key differentiator today between big RPGs and the little guys. Even 2D games have customizable and reusable avatars beginning to be more common.
I think that a collaborative, highly customizable avatar system would be hugely useful if it were open source and available as a relatively easy API to embed into nearly any independent or open source game. Add in even basic sharing of avatars between games, and easy to use customization tools for both in-game player-oriented customization and out-of-game NPC development, and you could easily find a tool that many, many people would heartily use.
Of course, the blocking factor may not even be the technology so much as the art. Good customizable 3D avatars require complicated deformable models that I expect require a lot of smart tweaking from smart artists to get a good, wide, range of possibilities. That's before you start trying to build clothes and accessories that similarly fit the wide range of possibilities... 2D avatar systems are nearly as art intensive, as well I'm sure.
I started wondering if Second Life could at least provide some or all of an open source 3D avatar system. It seems like a decent place to ...
I'm coming into Dragon Age: Origins after a replay of Mass Effect, with Mass Effect 2 clearly on the horizon, so expect more than a few Mass Effect comparisons. Plus, Mass Effect thus far is the only Bioware RPG I've managed to complete a playthrough (with a record of two, now).
I appreciate Dragon Age's use of relative morality over the dualism models that have become fairly standard. The morality of a given choice is primarily determined by the reactions of whichever companions you brought with you to witness them. It fits a world that is full of many shades of gray on the morality spectrum (including the central Gray Wardens).
In practice, however, I find the control of this as a system somewhat opaque and aggravating, particularly within the larger context of the game as a whole. Firstly, there are the obvious complexities from moving from a 2-Bar morality system (as in Mass Effect's Paragon and Renegade counters) to an N-Bar system. Where Mass Effect can (smartly) use the vertical axis of its conversation wheel in rough correspondence with the Paragon/Renegade decision, Dragon Age has no such shorthand. (On the other hand, it would be nice if Dragon Age had at least found some replication for Mass Effect's use of the horizontal axis. But that's a whole other topic of discussion.)
What frustrates me most, however, is the dissonance between the work put into combat tactics systems compared to the lack of equivalents in morality and conversation tactics. Certainly this is nothing new in the world of RPGs, but Dragon Age seems to especially make it more obvious and harder to swallow (particularly as I start to read FAQs/wikis to see the fragility of decisions easily accidentally made). Before even getting ...
I've introduced the "Bee" choreographer bot for playing HoneyComb Engine games by Wave, Email, or IM before. However, this is probably closer to the official "launch" of the bot: all three front ends (Wave, Email and IM) are now available and should now work (knock on wood). I've finally setup the code site for the bot, and the full darcs repository is now available for perusal as open source under the Microsoft Reciprocal License:
http://hce-bee.code.worldmaker.net/
I'm hosting the main instance of the bot, and I encourage people to use it as I can most easily watch its logs to help fix bugs. If anyone does find interesting reasons to fork the bot, I'd love to hear them.
I'll be rewriting this into the issues log of the repository/code site in the near future, but for those that want a brief overview of my agenda going forward:
Obviously there is plenty left to do, so any interest in helping me better prioritize these features for real player scenarios or even collaborating on features is welcome. I'm also interested in exploring opportunities for "commercial support", but don't have any ...
I've taken, with a tiny bit of prodding, the Token Stream Diffs Using Pygments from toy to a nascent toolchain that may even almost be useful.
I've brought in two new dependencies Google diff-match-patch and, for nice argument parsing, argparse. The diff-match-patch library provides a character-based diff algorithm and patch format (a character-based unidiff-like format with character escaping) in a number of languages, including my friend Python. I can use diff-match-patch to produce useful patch output (and apply said patches with a simple new tokpatch.py file that is but a wrapper around diff-match-patch patching).
tokdiff.py has grown three new output formats. The original "toy" format I've renamed "verbose" and its quite interesting for debugging and getting an idea of why diffs look the way they do. Most useful, and the new default, is the unidiff-like output. There's also diff-match-patch's much more compact tab-delimited "delta" format, which is interesting, but I don't think is all that safe. (It's an undocumented, outside of the code itself, feature...)
The final output format is the "compare" which outputs some pretty HTML visually showing the differences between the tokenized diff approach and diff-match-patch's standard character-based diff, plus some basic benchmarking of the two algorithms.
Both tools and both dependencies can be grabbed from the darcs repository:
darcs get http://repos.worldmaker.net/tokdiff/main tokdiff
I'll consider putting together a deeper code site for it in the near future.
Some brief observations and thoughts for future directions:
I'm certainly amused about the hypocrisy I'm about to unleash. I've criticized hardcore players at times for complaining about nerfs that only they seem to care about. As a midcore player of moderate skill, I find it fascinating that Free Realms managed to turn the tables on me. Now I get to play the role of the crotchety person that dislikes recent MMO changes.
For Free Realms, December's update brought a large number of changes. One big swath of which was a full front-to-back combat reform. I can see what the developers where trying with the update and the casual, very young, ADD audience they've always seemed to be targeting. To some extent I believe they have succeeded, but I've never been in that weird demographic they want so I'm probably a poor judge here. On the other hand, as someone that "beat" almost every aspect to the combat system that was, I don't think the combat update was much of a progression towards anything of interest.
I feel even more hypocritical in defending the previous combat system. It was a a by-the-numbers "lite" version of MMO's D&D and Diku-derived traditional combat systems. I complained about its grind, and wondered aloud if perhaps they couldn't have found a more original formula somewhere... But it did its job service-ably and if they had just reduced the number of classes (another Diku-ism I find odd: quantity of classes over quality) or increased the number of experience-giving quests or even just increased the speed of experience then the grind wouldn't have felt as onerous (to those OCD enough to wish to max level all of the classes, at least).
The new system focuses on zerg rushes of mobs and obvious spawners ...
I've been thinking that I'm plus or minus a few days from one graduation milestone anniversary or another. I certainly expected to be in a different place than I am a year out from my graduation... We'll see where the next year takes me.
Several months after NBC's shake-up of their late night show line-up, the show that has really grown on me is Late Night with Jimmy Fallon. I enjoyed Conan from time to time in his old slot, but his new show conflicts with Colbert and my loyalties, as a long time Daily Show stalwart at this point, are obviously with "the nation"...
I'll admit that I actually enjoyed some of Fallon's tenure on SNL, but I did think that he didn't have as much talent as some of the others in that show's illustrious history. Certainly, I thought his attempt at a movie career was a bad idea. Fair to say that I wasn't enthusiastic about the idea of him hosting a late night show, but I also wasn't that skeptical.
Hulu and a few choice guests encouraged me to catch the show, and I've been slowly becoming more hooked. The show excels when Jimmy Fallon's sense of childish, nerdy humor is on full display. Fallon is obviously a fan of video games, and his attempts at covering game releases as if they were big movie releases have been well appreciated. Fallon also is sometimes at his most relaxed and funny when behind a older, fatter style of microphone, reminiscent of the one that Bob Barker seemingly refused to relinquish, that he brings out for silly recurring mini-games.
As Jimmy Fallon gets into the rhythm of doing the show every night and shirks his initial nervousness, the show gains strength. Fallon can make excellent use of his SNL talents, including some of his better impressions, and unlike SNL it is even more likely that a break in character is more helpful than hurtful in the talk show format.
What really makes the ...
This is another itch I needed scratched while working on the HCE bot (which is in alpha testing on Wave). In this case I was butting heads with the API provided by Google Wave for Python, which has provided no end of complaints from me. The poor documentation and brutal "let's just do a rough conversion of the Java API" nature of it haven't helped.
Anyway, I wanted the ability to write rich markup in a friendly neighborhood Django Template (just as I use for the bot's HTML output). The Wave API has a method to append a very anemic subset of HTML, which doesn't come anywhere close to a 1-to-1 correlation with the markup model used on the wire by Wave.
What I'm about to post is a technological turducken: my Wave Annotation Markup "Language" here uses Django templates to render YAML documents (the data structure of which is then used to make API calls that in turn get boiled down into "ops" in Wave's ugly Java-infused "JSON RPC" dialect). But it seems to work, mostly, and that was the point.
I refused to get much closer to the API metal and work inside its innards because I was afraid I'd be too tempted to gut the whole thing and start from scratch to make it all more Pythonic. I'd prefer to get a paycheck from someone to do that sort of thing, before resorting to that. (Hire me!)
Here's the latest version, as of this post, of my "waml" tool, while I continue to procrastinate uploading the entire HCE bot repository:
# Simple, stupid Wave Annotation Markup
# Copyright 2009 Max Battcher. Licensed for use under the Ms-PL.
from google.appengine.ext.webapp import template
from waveapi.document import FormElement, Gadget ...I wanted a simple way to easily output JSON for a couple of AppEngine models. A brief search didn't turn up a snippet that looked like what I was looking for, so I wrote this simple module that I call gaejson.py:
# Simple GAE Model JSON Serialization
# Copyright 2009 Max Battcher. Licensed for use under the Ms-PL.
from django.utils import simplejson as json
from google.appengine.ext import db
class GaeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, db.Model):
return dict([(name, getattr(obj, name)) for name
in obj.properties().keys()])
return super(self, GaeEncoder).default(obj)
# vim: ai et ts=4 sts=4 sw=4
Usage is simple:
from gaejson import GaeEncoder, json
from mymodels import TestModel
test = TestModel.get(... some db key ...)
json.dumps(test, cls=GaeEncoder)
The short story is that this week I relieved some stress and helped relieve some creative blockage by jumping headlong into over-thinking and over-working a new project. I'm working on a "Choreographer bot" for playing games with Corvus Elrod's HoneyComb Engine online via wave, email, and IM. I've got a command language parser written (and I think very well tested at this point) and written up documentation for said parser, which currently assumes familiarity with the HCE. I'll post the source code eventually.
I've hesitated to blog it, but most of the longer story should be familiar by now: I'm running on borrowed passion at this point; this year has been a huge kick to the groin for me. As is the case with many works that involve groin kicks, this post may be dark at times, but I'm trying to keep it on the side of dark humour or at least slapstick. I, at least, find the occasional bathetic introspection useful to get out of the system. If you want to invest your sympathy in "Ego credits", may I suggest applying extra funds to Deirdra's Life Flashes By project. Also, I wouldn't be opposed to gifts arriving in my Steam account or PayPal account, not that I expect any this year... I of course still continue daily my shingle hanging and search for gainful employment as a measure of my worth in society, should rumours of such reach little birdies in y'alls ears. If anyone has any ideas on bankrolling a good Relocation Fund, that might be useful, too.
I'm used to being my own worst critic. I've grown up very familiar with the adage that familiarity breeds contempt, and I've seen myself grow angry at ...