building a modern mud - o'reilly mediaassets.en.oreilly.com/1/event/80/building a modern mud...
TRANSCRIPT
Building a Modern MUDwith your host, termie
Friday, July 20, 12
Me.
Friday, July 20, 12
Me.
Friday, July 20, 12
Why?
working on games always seemed like a dream job, probably isn’t
i really loved playing muds so much, i wanted to make one where users could surprise me again
minecraft, dwarf fortress, lo-fi and indie games back on the rise
Friday, July 20, 12
working on games always seemed like a dream job, probably isn’t
i really loved playing muds so much, i wanted to make one where users could surprise me again
minecraft, dwarf fortress, lo-fi and indie games back on the rise
Friday, July 20, 12
working on games always seemed like a dream job, probably isn’t
i really loved playing muds so much, i wanted to make one where users could surprise me again
minecraft, dwarf fortress, lo-fi and indie games back on the rise
Friday, July 20, 12
this talk
Ancient Times
Contemporary Inspirations
A Modern Approach
Future Awesomeness
Where It’s At / Demo
Friday, July 20, 12
ancient times
Friday, July 20, 12
ancient times
interactive fictionWest of HouseYou are standing in an open field west of a white house, with a boarded front door.There is a small mailbox here.
>
zork!
not designed for multiple users
inform 7
Friday, July 20, 12
interactive fiction
Volume 4 - Physical Environment
Book 1 - The Study
Chapter 1 - Basic Room
The Water Study is a room. "The walls are painted black with simple architectural motifs, except for the cunning panel of three green pears[if the pitcher is whole] and a pitcher of water. The glass is painted so that light seems to fall through it from [the window], and the pears are[end if] luscious enough to eat[if the pitcher is ruined]. The shards of glass and the pool of water are a little hard to explain, but might be written off as the artist's odd fancy[end if]." The printed name of the Water Study is "Study with Pears and [if the pitcher is whole]Pitcher[otherwise]Spilled Water[end if]".
Instead of going nowhere: say "You can go in and out the window, but otherwise gallivanting around the villa is a bad idea. The other rooms are full of soldiers."
found out about inform last year at oscon
ben collins-sussman
Friday, July 20, 12
interactive fiction
Volume 4 - Physical Environment
Book 1 - The Study
Chapter 1 - Basic Room
The Water Study is a room. "The walls are painted black with simple architectural motifs, except for the cunning panel of three green pears[if the pitcher is whole] and a pitcher of water. The glass is painted so that light seems to fall through it from [the window], and the pears are[end if] luscious enough to eat[if the pitcher is ruined]. The shards of glass and the pool of water are a little hard to explain, but might be written off as the artist's odd fancy[end if]." The printed name of the Water Study is "Study with Pears and [if the pitcher is whole]Pitcher[otherwise]Spilled Water[end if]".
Instead of going nowhere: say "You can go in and out the window, but otherwise gallivanting around the villa is a bad idea. The other rooms are full of soldiers."
found out about inform last year at oscon
ben collins-sussman
Friday, July 20, 12
interactive fiction
Volume 4 - Physical Environment
Book 1 - The Study
Chapter 1 - Basic Room
The Water Study is a room. "The walls are painted black with simple architectural motifs, except for the cunning panel of three green pears[if the pitcher is whole] and a pitcher of water. The glass is painted so that light seems to fall through it from [the window], and the pears are[end if] luscious enough to eat[if the pitcher is ruined]. The shards of glass and the pool of water are a little hard to explain, but might be written off as the artist's odd fancy[end if]." The printed name of the Water Study is "Study with Pears and [if the pitcher is whole]Pitcher[otherwise]Spilled Water[end if]".
Instead of going nowhere: say "You can go in and out the window, but otherwise gallivanting around the villa is a bad idea. The other rooms are full of soldiers."
found out about inform last year at oscon
ben collins-sussman
Friday, July 20, 12
ancient times
telnet
Let’s face it, kinda sucks
best thing we had at the time
Connected to term.ie.Escape character is '^]'.
Friday, July 20, 12
ancient times
line oriented protocols
MCP, basically described a system of passing additional information for clients via what amount to comments that clients were meant not to display
#$#spam 12345 from: Biff text*: "" _data-tag: 9b76#$#* 9b76 text: This is some sample text.#$#* 9b76 text: #$#* 9b76 text: Note that you don't need to quote strings#$#* 9b76 text: in multiline data. Also, you can include "special"#$#* 9b76 text: characters like quotes. Everything after the#$#* 9b76 text: space after the keyword and colon is considered#$#* 9b76 text: part of the value.#$#* 9b76 text: This means that spaces can also be part of the value.#$#: 9b76
Friday, July 20, 12
ancient times
lpc
LPC was the first programming language i used extensively at the time
printed out the manual at my mother’s office inherit "/lib/room";
void create() { ::create(); set_short("a simple room"); set_long("A simple room in a simple building."); set_description("This is a simple room in a simple building. It is very nice."); add_exit("north", "/realms/descartes/north_room");}
Friday, July 20, 12
ancient times
lots and lots of MUDs
one thing i definitely found out when researching this
people still working on them
people still playing them
pretty much everybody tried to write one
Friday, July 20, 12
contemporary inspirations
Friday, July 20, 12
contemporary inspirations
evennia
twisted, django
comet (precursor to websockets) style web interface in addition to mud protocols
relatively full-featured
all-in-one server
i don’t really like twisted any more (though it taught me everything i know)
Friday, July 20, 12
contemporary inspirations
nakedmud
c, python for scripting
rather mature but very stripped down, no stock combat, currency, etc
all-in-one server
c, yuck
i looked at its source a bunch to see which things i hadn’t thought about yet for my code
Friday, July 20, 12
contemporary inspirations
imaginary
i don’t think it is a joke, but it might be
twisted, meant to be a simulation
can’t really find the code anywhere
Friday, July 20, 12
contemporary inspirations
imaginary
i don’t think it is a joke, but it might be
twisted, meant to be a simulation
can’t really find the code anywheremaybe glyph knows more ?
Friday, July 20, 12
contemporary inspirations
second life
not really a mud, but has many object-creation characteristics that cater well to developers
housemate worked on it, always discussed possible ideas about hosting own land
it’s graphical and i think that takes away a lot from the immersive experience, the space between things makes worlds feel empty
Friday, July 20, 12
contemporary inspirations
playsh
totally awesome project from a few years back, ben cerveny and matt webb
users are basically in a python shell connected with other python shells, and can share objects
has a perspective concept where the client interprets the available verbs and properties with the goal that individual clients can be interacting while playing different types of games
Friday, July 20, 12
a modern approach
Friday, July 20, 12
a modern approach
distributed game world
locations can run in different processes, different servers
most calls require very little state
trust models
i looked at eve online quite a bit in modeling it
why is that better? well, it implies certain scaling characteristics, allows usage of high-end load balancing techniques
Friday, July 20, 12
a modern approach
rpc-style interactions
rich objects rather than line-oriented (json at the moment)
calls get routed between users and (users, npcs, objects) via the location or world
why is this better? - structured data makes clients much easier to write- it also makes parsing the interactions easy- would still like to add NLP stuff
Friday, July 20, 12
a modern approach
cryptographically signed items
items, locations, users, everything has a trust chain
this allows for many types of interactions that do not require checking a database
also allows in-game entities to create new items that they can trust, for example a bank
Friday, July 20, 12
a modern approach
connections to external resources
objects can be represented by REST web services
notch and his MMO and DCPU to operate while out
maybe instead an avatar that forwards messages to a web service?
github integration
Friday, July 20, 12
future awesomeness
Friday, July 20, 12
future awesomeness
world state based on voting
sci-fi has a lot of really interesting philosophical models
demarchy
liquid democracy
example voting topics:- new users, possibly limited resources- certain votes required to affect story line
Friday, July 20, 12
future awesomeness
self-hosted locationsregister a location running on your own server
possibly connect your own entire world, see federation / layering later
Friday, July 20, 12
future awesomeness
credit for accepted pull-requests
give people in-game credit for successfully submitting patches to the project
connect to the real world
also, bittorrent file-sharing
Friday, July 20, 12
future awesomeness
DCPU-controlled robots
bunch of VMs already for DCPU
why not allow you to program NPCs with it?
different programs could possibly be traded
cost credits to run
Friday, July 20, 12
future awesomeness
federated / layered worlds
because things are signed, a person could be in two worlds at the same time
trusting one cert might show the current world, but trusting a new cert might allow interaction with a world on top of that
new people might be on a “lower plane”
Friday, July 20, 12
where it’s at / demo
Friday, July 20, 12
where it’s at
worlds, locations,npcs, objects
servers
endpoints
all using pretty much the same interfaces right now
zmq
Friday, July 20, 12
worlds, locations, npcs, objects
where it’s at
Friday, July 20, 12
where it’s at
worlds, locations, npcs, objectsuser
Friday, July 20, 12
where it’s at
worlds, locations, npcs, objectsuser
Friday, July 20, 12
where it’s at
worlds, locations, npcs, objectsuser
Friday, July 20, 12
where it’s at
worlds, locations, npcs, objectsuser
Friday, July 20, 12
where it’s at
worlds, locations, npcs, objects
Friday, July 20, 12
where it’s at
worlds, locations, npcs, objects
Friday, July 20, 12
where it’s at
locations.txthousemate made a joke about not creating a language over a weekend that gets used for 10 years
Friday, July 20, 12
locations.txtawakeningYou are cold. You shake. You cannot breathe. The liquid around you drainsaway and you open your eyes to a birthing chamber.
EXITSthe door: testing_chamber_0
OBJECTSthe rock: rock_singularity
testing_chamber_0This is a small white room. There is a console.
EXITSthe door: testing_chamber_1
OBJECTSthe rock: rock_singularityconsole: testing_console_0
Friday, July 20, 12
locations.txtawakeningYou are cold. You shake. You cannot breathe. The liquid around you drainsaway and you open your eyes to a birthing chamber.
EXITSthe door: testing_chamber_0
OBJECTSthe rock: rock_singularity
testing_chamber_0This is a small white room. There is a console.
EXITSthe door: testing_chamber_1
OBJECTSthe rock: rock_singularityconsole: testing_console_0
Friday, July 20, 12
locations.txtawakeningYou are cold. You shake. You cannot breathe. The liquid around you drainsaway and you open your eyes to a birthing chamber.
EXITSthe door: testing_chamber_0
OBJECTSthe rock: rock_singularity
testing_chamber_0This is a small white room. There is a console.
EXITSthe door: testing_chamber_1
OBJECTSthe rock: rock_singularityconsole: testing_console_0
Friday, July 20, 12
locations.txtawakeningYou are cold. You shake. You cannot breathe. The liquid around you drainsaway and you open your eyes to a birthing chamber.
EXITSthe door: testing_chamber_0
OBJECTSthe rock: rock_singularity
testing_chamber_0This is a small white room. There is a console.
EXITSthe door: testing_chamber_1
OBJECTSthe rock: rock_singularityconsole: testing_console_0
Friday, July 20, 12
locations.txtawakeningYou are cold. You shake. You cannot breathe. The liquid around you drainsaway and you open your eyes to a birthing chamber.
EXITSthe door: testing_chamber_0
OBJECTSthe rock: rock_singularity
testing_chamber_0This is a small white room. There is a console.
EXITSthe door: testing_chamber_1
OBJECTSthe rock: rock_singularityconsole: testing_console_0
Friday, July 20, 12
locations.txtawakeningYou are cold. You shake. You cannot breathe. The liquid around you drainsaway and you open your eyes to a birthing chamber.
EXITSthe door: testing_chamber_0
OBJECTSthe rock: rock_singularity
testing_chamber_0This is a small white room. There is a console.
EXITSthe door: testing_chamber_1
OBJECTSthe rock: rock_singularityconsole: testing_console_0
Friday, July 20, 12
locations.txtawakeningYou are cold. You shake. You cannot breathe. The liquid around you drainsaway and you open your eyes to a birthing chamber.
EXITSthe door: testing_chamber_0
OBJECTSthe rock: rock_singularity
testing_chamber_0This is a small white room. There is a console.
EXITSthe door: testing_chamber_1
OBJECTSthe rock: rock_singularityconsole: testing_console_0
Friday, July 20, 12
locations.txtawakeningYou are cold. You shake. You cannot breathe. The liquid around you drainsaway and you open your eyes to a birthing chamber.
EXITSthe door: testing_chamber_0
OBJECTSthe rock: rock_singularity
testing_chamber_0This is a small white room. There is a console.
EXITSthe door: testing_chamber_1
OBJECTSthe rock: rock_singularityconsole: testing_console_0
Friday, July 20, 12
where it’s at
objects.txtsimilar to locations but for objects
also naive but allows extensibility
Friday, July 20, 12
objects.txt
rock_singularityThis rock seems to exist in all locations.
TRIGGERS:not used: not used
testing_console_0: zombie.objects.console.GithubConsoleThis is the first test console. Try use-ing it.
TRIGGERS:not used: not used
Friday, July 20, 12
objects.txt
rock_singularityThis rock seems to exist in all locations.
TRIGGERS:not used: not used
testing_console_0: zombie.objects.console.GithubConsoleThis is the first test console. Try use-ing it.
TRIGGERS:not used: not used
Friday, July 20, 12
objects.txt
rock_singularityThis rock seems to exist in all locations.
TRIGGERS:not used: not used
testing_console_0: zombie.objects.console.GithubConsoleThis is the first test console. Try use-ing it.
TRIGGERS:not used: not used
Friday, July 20, 12
zombie.objects.console.GithubConsole
class GithubConsole(Console): def cmd_use(self, ctx): """Tell the user what to do.""" session = self.sessions.get(ctx.caller_id, {'tick': 0}) if session['tick'] == 0: ctx.reply({'message': self.message_0.strip()})
def cmd_show(self, ctx, data): """Do something cool using the github api.""" if 'token' in data: github_login = gh.get_identity(data['token']) item = {'id': uuid.uuid4().hex, 'description': 'A github identity card for %s' % github_login, 'github_login': github_login} item_s = json.dumps(item) signer_id, sig = ctx._sign(item_s) ctx.reply({'item': [item_s, signer_id, sig]})
Friday, July 20, 12
zombie.objects.console.GithubConsole
class GithubConsole(Console): def cmd_use(self, ctx): """Tell the user what to do.""" session = self.sessions.get(ctx.caller_id, {'tick': 0}) if session['tick'] == 0: ctx.reply({'message': self.message_0.strip()})
def cmd_show(self, ctx, data): """Do something cool using the github api.""" if 'token' in data: github_login = gh.get_identity(data['token']) item = {'id': uuid.uuid4().hex, 'description': 'A github identity card for %s' % github_login, 'github_login': github_login} item_s = json.dumps(item) signer_id, sig = ctx._sign(item_s) ctx.reply({'item': [item_s, signer_id, sig]})
Friday, July 20, 12
zombie.objects.console.GithubConsole
class GithubConsole(Console): def cmd_use(self, ctx): """Tell the user what to do.""" session = self.sessions.get(ctx.caller_id, {'tick': 0}) if session['tick'] == 0: ctx.reply({'message': self.message_0.strip()})
def cmd_show(self, ctx, data): """Do something cool using the github api.""" if 'token' in data: github_login = gh.get_identity(data['token']) item = {'id': uuid.uuid4().hex, 'description': 'A github identity card for %s' % github_login, 'github_login': github_login} item_s = json.dumps(item) signer_id, sig = ctx._sign(item_s) ctx.reply({'item': [item_s, signer_id, sig]})
Friday, July 20, 12
zombie.objects.console.GithubConsole
class GithubConsole(Console): def cmd_use(self, ctx): """Tell the user what to do.""" session = self.sessions.get(ctx.caller_id, {'tick': 0}) if session['tick'] == 0: ctx.reply({'message': self.message_0.strip()})
def cmd_show(self, ctx, data): """Do something cool using the github api.""" if 'token' in data: github_login = gh.get_identity(data['token']) item = {'id': uuid.uuid4().hex, 'description': 'A github identity card for %s' % github_login, 'github_login': github_login} item_s = json.dumps(item) signer_id, sig = ctx._sign(item_s) ctx.reply({'item': [item_s, signer_id, sig]})
Friday, July 20, 12
zombie.objects.console.GithubConsole
class GithubConsole(Console): def cmd_use(self, ctx): """Tell the user what to do.""" session = self.sessions.get(ctx.caller_id, {'tick': 0}) if session['tick'] == 0: ctx.reply({'message': self.message_0.strip()})
def cmd_show(self, ctx, data): """Do something cool using the github api.""" if 'token' in data: github_login = gh.get_identity(data['token']) item = {'id': uuid.uuid4().hex, 'description': 'A github identity card for %s' % github_login, 'github_login': github_login} item_s = json.dumps(item) signer_id, sig = ctx._sign(item_s) ctx.reply({'item': [item_s, signer_id, sig]})
Friday, July 20, 12
zombie.objects.console.GithubConsole
class GithubConsole(Console): def cmd_use(self, ctx): """Tell the user what to do.""" session = self.sessions.get(ctx.caller_id, {'tick': 0}) if session['tick'] == 0: ctx.reply({'message': self.message_0.strip()})
def cmd_show(self, ctx, data): """Do something cool using the github api.""" if 'token' in data: github_login = gh.get_identity(data['token']) item = {'id': uuid.uuid4().hex, 'description': 'A github identity card for %s' % github_login, 'github_login': github_login} item_s = json.dumps(item) signer_id, sig = ctx._sign(item_s) ctx.reply({'item': [item_s, signer_id, sig]})
Friday, July 20, 12
where it’s at
devserverDEBUG:zombie.net:World:foo:SERVE tcp://127.0.0.1:2222DEBUG:zombie.net:Location:awakening:SERVE tcp://127.0.0.1:54632DEBUG:zombie.net:Location:awakening:CONNECT tcp://127.0.0.1:2222DEBUG:zombie.net:Client:rock_singularity:CONNECT tcp://127.0.0.1:54632
spawns everything in one process
yay eventlet
Friday, July 20, 12
where it’s at
devserverDEBUG:zombie.net:World:foo:SERVE tcp://127.0.0.1:2222DEBUG:zombie.net:Location:awakening:SERVE tcp://127.0.0.1:54632DEBUG:zombie.net:Location:awakening:CONNECT tcp://127.0.0.1:2222DEBUG:zombie.net:Client:rock_singularity:CONNECT tcp://127.0.0.1:54632
Friday, July 20, 12
where it’s at
devserverDEBUG:zombie.net:World:foo:SERVE tcp://127.0.0.1:2222DEBUG:zombie.net:Location:awakening:SERVE tcp://127.0.0.1:54632DEBUG:zombie.net:Location:awakening:CONNECT tcp://127.0.0.1:2222DEBUG:zombie.net:Client:rock_singularity:CONNECT tcp://127.0.0.1:54632
Friday, July 20, 12
where it’s at
devserverDEBUG:zombie.net:World:foo:SERVE tcp://127.0.0.1:2222DEBUG:zombie.net:Location:awakening:SERVE tcp://127.0.0.1:54632DEBUG:zombie.net:Location:awakening:CONNECT tcp://127.0.0.1:2222DEBUG:zombie.net:Client:rock_singularity:CONNECT tcp://127.0.0.1:54632
Friday, July 20, 12
where it’s at
devserverDEBUG:zombie.net:World:foo:SERVE tcp://127.0.0.1:2222DEBUG:zombie.net:Location:awakening:SERVE tcp://127.0.0.1:54632DEBUG:zombie.net:Location:awakening:CONNECT tcp://127.0.0.1:2222DEBUG:zombie.net:Client:rock_singularity:CONNECT tcp://127.0.0.1:54632
Friday, July 20, 12
where it’s at
devserverDEBUG:zombie.net:World:foo:SERVE tcp://127.0.0.1:2222DEBUG:zombie.net:Location:awakening:SERVE tcp://127.0.0.1:54632DEBUG:zombie.net:Location:awakening:CONNECT tcp://127.0.0.1:2222DEBUG:zombie.net:Client:rock_singularity:CONNECT tcp://127.0.0.1:54632
Friday, July 20, 12
where it’s at
devserverDEBUG:zombie.net:World:foo:SERVE tcp://127.0.0.1:2222DEBUG:zombie.net:Location:awakening:SERVE tcp://127.0.0.1:54632DEBUG:zombie.net:Location:awakening:CONNECT tcp://127.0.0.1:2222DEBUG:zombie.net:Client:rock_singularity:CONNECT tcp://127.0.0.1:54632
Friday, July 20, 12
where it’s at
devclient
Friday, July 20, 12
zombie_devclient.py ===================================================================== You are now in an interactive python shell.
You've got couple common functions already floating around in here:
look(<object name or player id>) move(<exit name>) proxy(<object name>) show(<object name>, <data>) store(<custom name>, <item>) use(<object name>) ===================================================================== -> darkthorn entered the room.This is a small white room. There is a console.
Exits: the door<zombie.client.LocationClient object at 0x10d5e4c10>
>>> _<zombie.client.LocationClient object at 0x10d5e4c10>>>> tool.gh.get_token('termie', 'XXXXXX'){'token': u'XXXXXX'}>>> show('console', _){u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']}>>> store('github_id', _)>>> items()[('github_id', {u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']})]>>>
Friday, July 20, 12
zombie_devclient.py ===================================================================== You are now in an interactive python shell.
You've got couple common functions already floating around in here:
look(<object name or player id>) move(<exit name>) proxy(<object name>) show(<object name>, <data>) store(<custom name>, <item>) use(<object name>) ===================================================================== -> darkthorn entered the room.This is a small white room. There is a console.
Exits: the door<zombie.client.LocationClient object at 0x10d5e4c10>
>>> _<zombie.client.LocationClient object at 0x10d5e4c10>>>> tool.gh.get_token('termie', 'XXXXXX'){'token': u'XXXXXX'}>>> show('console', _){u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']}>>> store('github_id', _)>>> items()[('github_id', {u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']})]>>>
Friday, July 20, 12
zombie_devclient.py ===================================================================== You are now in an interactive python shell.
You've got couple common functions already floating around in here:
look(<object name or player id>) move(<exit name>) proxy(<object name>) show(<object name>, <data>) store(<custom name>, <item>) use(<object name>) ===================================================================== -> darkthorn entered the room.This is a small white room. There is a console.
Exits: the door<zombie.client.LocationClient object at 0x10d5e4c10>
>>> _<zombie.client.LocationClient object at 0x10d5e4c10>>>> tool.gh.get_token('termie', 'XXXXXX'){'token': u'XXXXXX'}>>> show('console', _){u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']}>>> store('github_id', _)>>> items()[('github_id', {u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']})]>>>
Friday, July 20, 12
zombie_devclient.py ===================================================================== You are now in an interactive python shell.
You've got couple common functions already floating around in here:
look(<object name or player id>) move(<exit name>) proxy(<object name>) show(<object name>, <data>) store(<custom name>, <item>) use(<object name>) ===================================================================== -> darkthorn entered the room.This is a small white room. There is a console.
Exits: the door<zombie.client.LocationClient object at 0x10d5e4c10>
>>> _<zombie.client.LocationClient object at 0x10d5e4c10>>>> tool.gh.get_token('termie', 'XXXXXX'){'token': u'XXXXXX'}>>> show('console', _){u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']}>>> store('github_id', _)>>> items()[('github_id', {u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']})]>>>
Friday, July 20, 12
zombie_devclient.py ===================================================================== You are now in an interactive python shell.
You've got couple common functions already floating around in here:
look(<object name or player id>) move(<exit name>) proxy(<object name>) show(<object name>, <data>) store(<custom name>, <item>) use(<object name>) ===================================================================== -> darkthorn entered the room.This is a small white room. There is a console.
Exits: the door<zombie.client.LocationClient object at 0x10d5e4c10>
>>> _<zombie.client.LocationClient object at 0x10d5e4c10>>>> tool.gh.get_token('termie', 'XXXXXX'){'token': u'XXXXXX'}>>> show('console', _){u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']}>>> store('github_id', _)>>> items()[('github_id', {u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']})]>>>
Friday, July 20, 12
zombie_devclient.py ===================================================================== You are now in an interactive python shell.
You've got couple common functions already floating around in here:
look(<object name or player id>) move(<exit name>) proxy(<object name>) show(<object name>, <data>) store(<custom name>, <item>) use(<object name>) ===================================================================== -> darkthorn entered the room.This is a small white room. There is a console.
Exits: the door<zombie.client.LocationClient object at 0x10d5e4c10>
>>> _<zombie.client.LocationClient object at 0x10d5e4c10>>>> tool.gh.get_token('termie', 'XXXXXX'){'token': u'XXXXXX'}>>> show('console', _){u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']}>>> store('github_id', _)>>> items()[('github_id', {u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']})]>>>
Friday, July 20, 12
zombie_devclient.py ===================================================================== You are now in an interactive python shell.
You've got couple common functions already floating around in here:
look(<object name or player id>) move(<exit name>) proxy(<object name>) show(<object name>, <data>) store(<custom name>, <item>) use(<object name>) ===================================================================== -> darkthorn entered the room.This is a small white room. There is a console.
Exits: the door<zombie.client.LocationClient object at 0x10d5e4c10>
>>> _<zombie.client.LocationClient object at 0x10d5e4c10>>>> tool.gh.get_token('termie', 'XXXXXX'){'token': u'XXXXXX'}>>> show('console', _){u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']}>>> store('github_id', _)>>> items()[('github_id', {u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']})]>>>
Friday, July 20, 12
zombie_devclient.py ===================================================================== You are now in an interactive python shell.
You've got couple common functions already floating around in here:
look(<object name or player id>) move(<exit name>) proxy(<object name>) show(<object name>, <data>) store(<custom name>, <item>) use(<object name>) ===================================================================== -> darkthorn entered the room.This is a small white room. There is a console.
Exits: the door<zombie.client.LocationClient object at 0x10d5e4c10>
>>> _<zombie.client.LocationClient object at 0x10d5e4c10>>>> tool.gh.get_token('termie', 'XXXXXX'){'token': u'XXXXXX'}>>> show('console', _){u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']}>>> store('github_id', _)>>> items()[('github_id', {u'item': [u'{"github_login": "termie", "id": "32aea29e38d540f5b298f3cfa7685c54", "description": "A github identity card for termie"}', u'testing_console_0', u'signature']})]>>>
Friday, July 20, 12
demo?
Friday, July 20, 12
thankscode at: http://github.com/termie/zombie
me at: @termiehttp://term.ie
Friday, July 20, 12