Magic and True Names

Posted by Daniel Lyons Sat, 19 Jan 2008 04:44:00 GMT

I somehow find myself participating in a game design group called “Etherware.” I’m not quite sure how, but at any rate, we’re discussing how to implement magic in a video game. Most video games implement magic as a list of pre-defined spells. This is very constricting.

My first reaction was, of course, that to make it better is to make it a language, and now we’re actually talking about making a programming language designed around a particular task and trying to find a compelling UI for it that doesn’t resemble programming.

We’ve identified so far four different “languages”: wand waving, rune cutting, verbal incantations and potion crafting. I haven’t read Harry Potter all the way through so I’m probably omitting several.

Jesse mentioned that he always prized the “true name” concept from various magic systems: that once you know someone or something’s true name, you have power over it.

A “true name” is just a string that can be used as an address. There are a number of ways to deal with this, probably the easiest one is just to make a hash and use that. It occurred to me that the number of objects in any game will be prohibitively large, and anyway, what do you do if the gamer creates new objects?

An easy solution to this problem is to use the memory address encoded in hex. But that’s not very user-friendly, or very pronounceable. Plus they tend to be quite large. On the other hand, you have encodings like base-64 which use the alphabet. Base-64 isn’t very pronounceable either, though. You could take the alphabet as-is and use it to encode numbers under base 26.

On the other hand, there are other types of orthographies, such as a syllabary, in which every possible syllable is enumerated. It wouldn’t work with English because of the vast quantity of dipthongs and consonant combinations, but it works quite well for Japanese, which has two syllabaries, katakana and hiragana. There happen to be around 115 distinct symbols in katakana. So, you can encode any number in Romanized katakana by removing any duplicate sounds, assigning an order to the orthographs, and converting the number to base 115. If you do, you’ll get something like this:

>> 12983.to_name
=> "ryavu" 
>> 6.to_name
=> "ki" 
>> 12983923239823.to_name
=> "megomeagyubika"

Converting back is easy if you’ve ever implemented atoi() in C:

>> "ryakujani".name_value
=> 33155983
>> "kyu".name_value
=> 53
>> "aeiouaeiou".name_value
=> 7158386439867648320

The latter example there is to illustrate the point that, just because it always works, doesn’t mean it always makes something that would be a word. I haven’t computed the probability, but it’s roughly the probability of a number showing up all 9’s. I expect it to be particularly rare because base 115 can represent numbers with a pretty high compression ratio. The set of three syllable words is 1,520,875 in size. There are 5 vowels out of 115, which means there are 60 ways to choose three vowels in a row, so 60 / 1,520,875 = 0.00395%, AKA not very likely. But still can happen.

Of course, there is already a swell system built into every language and every program of uniquely identifying an object. The memory address! And it happens to be a number. In Ruby, you can get at it with Object#object_id and convert back to the object with the please-don’t-use-me method ObjectSpace#_id2ref. Which means you could also have this:

>> h = {:this => "that", :name => 48}
=> {:this=>"that", :name=>48}
>> h.magic_name
=> "vachugyuku" 
>> "vachugyuku".object
=> {:this=>"that", :name=>48}

Works with everything in Ruby, for free. Oh, is that a class?

>> Numeric.magic_name
=> "weseke" 
>> "weseke".object
=> Numeric

Yeah, I think it is!

I’m pretty proud of the code. It’s BSD-licensed, so feel free to borrow it. Feedback appreciated!

Tags , , ,  | no comments

Launch Detected

Posted by Daniel Lyons Fri, 27 Apr 2007 00:25:00 GMT

Oh man. I haven’t really enjoyed a game in ages. But this is just too much fun! I toasted Mother Russia yesterday and today Europe flattened me, playing as Africa.

By the way, if anyone else needs absinthe supplies, I recommend Absinthe on the Net.

Tags , ,  | no comments

iConquer and Defcon

Posted by Daniel Lyons Tue, 24 Apr 2007 20:09:00 GMT

Two games have made it through my protective bubble in the last 24 hours: iConquer and Defcon.

iConquer is an extremely pretty and spiffy Risk clone (I believe; I’ve only played Risk once). Defcon is a very pretty implementation of that game “Global Thermonuclear War” which you might remember from that movie.

Tags  | 3 comments

Guitar Hero

Posted by Daniel Lyons Tue, 31 Oct 2006 05:29:36 GMT

I don’t often play video games but Guitar Hero has caught my attention. And it’s only been out long enough for one sequal to come around.

Playing Guitar Hero gives you the sensation you’re actually creating music. I used to really like Frequency, which operates on the same principle except for shit techno. Guitar Hero, on the other hand, is about butt rock. Now that’s something I can get behind.

Apparently all of my friends in Albuquerque are huge fans of this game, which means spending time with them is going to involve spending time playing it. My only complaint is that all the time invested in it could instead be invested in, like, playing guitar.

Tags ,  | no comments