building a modern mud - o'reilly mediaassets.en.oreilly.com/1/event/80/building a modern mud...

80
Building a Modern MUD with your host, termie Friday, July 20, 12

Upload: phungnhu

Post on 16-Apr-2018

218 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

Building a Modern MUDwith your host, termie

Friday, July 20, 12

Page 2: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

Me.

Friday, July 20, 12

Page 3: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

Me.

Friday, July 20, 12

Page 4: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 5: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 6: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 7: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

this talk

Ancient Times

Contemporary Inspirations

A Modern Approach

Future Awesomeness

Where It’s At / Demo

Friday, July 20, 12

Page 8: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

ancient times

Friday, July 20, 12

Page 9: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 10: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 11: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 12: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 13: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 14: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 15: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 16: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 17: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

contemporary inspirations

Friday, July 20, 12

Page 18: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 19: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 20: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 21: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 22: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 23: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 24: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

a modern approach

Friday, July 20, 12

Page 25: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 26: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 27: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 28: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 29: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

future awesomeness

Friday, July 20, 12

Page 30: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 31: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 32: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 33: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 34: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 35: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

where it’s at / demo

Friday, July 20, 12

Page 36: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

where it’s at

worlds, locations,npcs, objects

servers

endpoints

all using pretty much the same interfaces right now

zmq

Friday, July 20, 12

Page 37: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

worlds, locations, npcs, objects

where it’s at

Friday, July 20, 12

Page 38: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

where it’s at

worlds, locations, npcs, objectsuser

Friday, July 20, 12

Page 39: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

where it’s at

worlds, locations, npcs, objectsuser

Friday, July 20, 12

Page 40: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

where it’s at

worlds, locations, npcs, objectsuser

Friday, July 20, 12

Page 41: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

where it’s at

worlds, locations, npcs, objectsuser

Friday, July 20, 12

Page 42: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

where it’s at

worlds, locations, npcs, objects

Friday, July 20, 12

Page 43: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

where it’s at

worlds, locations, npcs, objects

Friday, July 20, 12

Page 44: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 45: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 46: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 47: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 48: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 49: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 50: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 51: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 52: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 53: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

where it’s at

objects.txtsimilar to locations but for objects

also naive but allows extensibility

Friday, July 20, 12

Page 54: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 55: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 56: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 57: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 58: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 59: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 60: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 61: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 62: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 63: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 64: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 65: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 66: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 67: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 68: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 69: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 70: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

where it’s at

devclient

Friday, July 20, 12

Page 71: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 72: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 73: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 74: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 75: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 76: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 77: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 78: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

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

Page 79: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

demo?

Friday, July 20, 12

Page 80: Building a Modern MUD - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Building a Modern MUD Presentation... · Building a Modern MUD ... Why? working on games always seemed like

thankscode at: http://github.com/termie/zombie

me at: @termiehttp://term.ie

Friday, July 20, 12