Retour au texte principal

Lecon 2 de programmation sur DUM


CH101, Beginner's MOO Coding, Class 2 LOG:

TOPICS LIST: Class 1 Review and Corrections, @d Verb, Property Value
Types, Lists-of-Lists as Arrays, Verb Ownership and Permissions,
Permission Bits on Properties, Objects, Verbs, and What They Mean.

Chip says, "O.k...."
Chip says, "Quick Review from the last class..."
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
REVIEW FROM SESSION #1:
MOO is both a programming language and an object-oriented database.
Each of us, and everything we own and encounter, is an object in the database.
Objects are referenced by their object number, like so:
#6
Objects Are defined in the object-oriented system by three main techniques:
---------------------------------------------------------------------
Chip finishes quoting.
kilty pulls out her coffee (can't have class without coffee)
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
1) Verbs:
Verbs are referenced by naming the object they are attached to, followed by
a colon, followed by the name of the verb itself.  You also, in MOO code,
follow the verb name with parentheses.  This is because you have the option
to pass values to the verb you are calling.  We will discuss the passing of
values in another class session.  Verb Naming Example:
#6:page()
---------------------------------------------------------------------
Chip finishes quoting.
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
2) Properties:
Properties are referenced by the name of the object they are attached to,
followed by a period, followed by the property name itself:
#6.description = "A generic-looking person."
---------------------------------------------------------------------
Chip finishes quoting.
Adele nods.
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
3) Parentage (lineage):
Every object in the MOO (with the exception of #1, Root Class) has at
least one parent.  Most objects have more than one parent.  However, it is
important to note that these parents are really grandparents, great-grand-
parents, etc.  As of now, multiple lineages are not a standard part of MOO.
An object's parents determine MUCH about it, since any and all verbs and
properties which exist on the parents are passed down to the child.  Thus,
since #6.description exists, YOU have a .description property.  Since #6:page
exists, YOU have a page verb.  This is because YOU are a child of #6, the
Generic Player.
---------------------------------------------------------------------
Chip finishes quoting.
kilty nods.
Darren raises his hand.
Chip flips the chalkboard over, and it sizzles and crackles with electric
blue energy.
Darren [to Chip]: are multiple lineages a thing that is coming soon, or just
an idea?
Chip says, "O.k.  that's a quick rehash of the last lesson..."
Chip notes he doesn't type as much while eating Cheetos. ;-)
Chip [to Darren]: What ya got?
Chip says, "Supposedly, multiple lineages are already being played with in a
couple of different ways."
kilty . o O ( Cheetos... mmmm )
Chip says, "NOT standard or air-tight yet, as far as I know."
Darren nods thoughfully.
Chip stuffs cheetos in the floppy drive and issues the "send" command.
Chip says, "O.k.  CORRECTIONS:"
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
CORRECTIONS FROM THE LAST CLASS SESSION:
1) I stated that :emote and :say were located on #6, the Generic Player.
I was wrong.  They are actually on #3, the Generic Room.
---------------------------------------------------------------------
Chip finishes quoting.
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
2) Re: The MOO Generics.  This is the actual list of the main MOO generics,
and their parents:
Generic Room(#3)     Root Class(#1)
generic exit(#7)     Root Class(#1)
generic player(#6)     Root Class(#1)
generic container(#8)     generic thing(#5)     Root Class(#1)
generic note(#9)     generic thing(#5)     Root Class(#1)
---------------------------------------------------------------------
Chip finishes quoting.
kilty nods.
Adele [to Chip]: What makes something a "generic"?
Chip says, "This means that $container and $note are actually kids of $thing."
Chip says, "They have still been corified.  (made a property on #0), so you
can still reference them with the $ sign."
Chip says, "Generic Object:  Any object designed to be a master copy.  It is
programmed in such a way as to anticipate that each copy will be modified
and customized."
Darren offers, "A template?"
Frankie smiles at Darren.
Chip says, "Where's Barrington?  He's a bunny, but is actually a first-
generation of the Generic Pet, just like a dog or cat in this MOO would be."
Chip says, "Template is a good definition."
kilty offers "with all general messages"
Darren nods.
Lakota [to Chip]:  didn't want him dsrupting class ..
Chip says, "A well-made generic has lots of built-in verbs which allow you to
customize messages and descriptions as well."
Chip says, "Barrington might randomly wiggle his nose, for example, where the
dog would randomly thump fleas."
Chip says, "Both have a generic verb designed to spew WHATEVER message the
child's owner puts in."
Chip says, "O.k.  More corrections:"
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
3) Real-Time System:
   Less I sound misleading, understand that pretty much ALL MUDs and MOOs are
   defined as real-time systems.  Even if they are disk-based.  This is
   because at the moment of interaction, it is still "live".  The disk-based
   versus on-the-motherboard approach simply affects a) speed of overall
   system b) how often work is saved.
---------------------------------------------------------------------
Chip finishes quoting.
kilty nods.
Chip says, "Right now (not counting lag!) we're talking to each other "live".
That's real-time.  A BBS where you post a message, someone reads it later,
is NOT real-time."
You smile.
Darren grins.
Chip <-- reveals his anal retentive streak with all this stuff.
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
The Procedure/Function distinction which we toyed with briefly I'm going to
leave until a later class session.  This includes the question I neglected
to answer re: Do procedures pass multiple processes?
---------------------------------------------------------------------
Chip finishes quoting.
You ask, "O.k.  Any questions before I take us back to properties?"
kilty quietly sips coffee and munches Cheetos from her disk drive... they're
broken!
Chip flips the chalkboard over, and it sizzles and crackles with electric
blue energy.
kilty says, "no ques."
Darren . o O ( coffee and cheetos? )
Chip says, "i need to write a better CTP (Cheeto Transfer Protocol)"
Darren is set for now.
Frankie downs some more Geritol!
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
PROPERTY VALUE TYPES:
STRING:
A string is any sequence of characters (alpha- or non-).
This can include a name: "Chip"
Or a description: "A small, fluffy cat with a fat tail."
Or something more cryptic: "AXP101"
---------------------------------------------------------------------
Chip finishes quoting.
Chip says, "The cat in this case being soundly asleep on my overcoat."
kilty whispers, " that was funny!!!"
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
INTEGER:
This is a numeric property.  For one example, your .player property
is set to: 1
and your .wizard property is set to: 0
Other integers might be counters.  My chalkboard currently has 10 sides to
it, so its .sides property is set to: 10
---------------------------------------------------------------------
Chip finishes quoting.
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
OBJECT NUMBER:
Sometimes a property merely reflects the object number of another object
in the MOO.  For example, every child of the generic thing, note, and room
have a .owner property.  Since my object number is #2100, the .owner property
on every object I own would be: #2100
---------------------------------------------------------------------
Chip finishes quoting.
kilty nods.
Adele [to Chip]: how do you what the properties on an onject are?
Chip [to Adele]: That's next. :)
Chip says, "That's your easy property values... Here's the more complex ones:"
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
LIST:
A list is a series of values, which can be either of the above two types.
Lists are always contained in curly brackets (as strings are contained in
quotes).  A list can be a list of strings, like many people's descriptions:
{"A vivacious young Scottswoman.", "Her curly brown hair flows down her
shoulders.", "Her eyes are a piercing blue."}
A list can also be a list of numbers: {0, 10, 14, 65}
A list can also be a list of OBJECT numbers: {#2001, #2345, #345}
A list can also be a list of lists: {{..}, {..}}
---------------------------------------------------------------------
Chip finishes quoting.
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
Note For Vetern Programmers:
A list of lists is the MOO equivalent of a multi-dimensional array.
Yeah, it's klugey, but it works.
To refer to specific elements in a list, use the [index] option, where
'index'is an integer referring to that element's place in the list.
For Example:
box.contents = {#2100, #345, #765}
box.contents[1] = #2100
box.contents[2] = #345
box.contents[3] = #765
For lists of lists, use double-indexing:
box.master_list[1][3]
returns the 3rd element from the 1st list from the master list.
---------------------------------------------------------------------
Chip finishes quoting.
Adele drops Bucket of Party Snacks.
Darren selects a package of sugar toasted almonds and happily munches on it.
kilty hops down from the barstool.
kilty picks up Bucket of Party Snacks.
kilty drops Bucket of Party Snacks.
kilty sits down on one of the barstools which line the lab tables.
Chip says, "That covers every single type of property value you'll ever see in
a MOO."
FrankCh asks, "multi-dimensional array with different dimension size?"
Chip says, "AND:"
Chip [to FrankCh]: Eh?
kilty says, "Sorry! 'Guess I was hungrier than I thought! -blush-"
Chip says, "In theory you can do #578.master_list [1][1][2][4][5][6][7][8]"
FrankCh says, "a list of list that 1st list has 3 elements and 2nd has 4,..."
kilty selects a package of sour cream and garlic potato chips and happily
munches on it.
Chip says, "Right."
Frankie is now completely lost!
Chip says, "That same expression could be:
#578.master_list[1 of 8,000][4 of 1,234][etc]"
Adele hops down from the barstool.
Adele picks up Bucket of Party Snacks.
Darren is a bit lost as well.
Chip says, "Except you wouldn't acutally use 'of'."
Chip says, "O.k.  If a list has 15 lists in it:"
Chip says, "It's a list of 15 lists."
FrankCh asks, "any tools to do range check?"
Frankie nods.
Chip says, "Each of those lists might have 60 elements in it."
Frankie nods.
kilty nods.
Chip says, "Your first element of the first list of the first list would be:"
Darren nods slowly.
Chip says, ".list[1][1]"
Frankie nods.
Chip says, "Your last element of the last list of the list would be:"
Chip says, ".list[15][60]"
Frankie exclaims, "Ok, I get that!"
Chip says, "It's the equivalent of a two-dimensional checkerboard, 15x60
squares."
kilty thinks she gest it 
Darren nods more assertively.
Frankie asks, "How far can you take that... to three levels..or more ?"
Chip says, "If you have a master list of lists of lists, you have three
dimensions."
kilty [to Adele]: thanks for the snacks btw
Adele has disconnected.
Chip says, "In theory, I don't think there is a limit in MOO."
Frankie says, "It is HARD to conceptualize though"
Adele has connected.
Chip says, "I could be wrong.  I'll need to check.  I've never seen a need for
even a three-dimensional list though."
Darren [to Adele]: welcome back, Adele.
kilty is confused - what's the master list again?
Chip says, "Arrays suck.  Lists of lists are even harder to grasp."
You ask, "Would you like a real-life example?"
Frankie nods vigorously in agreement with your ideas.
Darren would love to see one.
Frankie exclaims, "It would help, i think!"
Chip says, "O.k.  My syllabus for this class has all of your names in a list:"
Donald says, " well one day we will have 3 -d and then I might need those
three dimensional arrays :)."
Chip says, "syllabus.students = {"PJ", "Suzi_J", ... "kilty"}"
Chip says, "There's 13 of you in all, counting Darren."
Frankie nods.
kilty nods.
Chip says, "So the length of the list is 13."
Darren is glad to count.
FrankCh says, "4-d (3-d plus time) should not be too far"
Chip says, "syllabus.students[1] = "PJ" in this case."
Chip says, "syallbus.students[13] = "kilty" in this case."
Chip says, "NOW"
Chip says, "Let's say a year has gone by."
Chip says, "I have made 27 syllabuses."
Chip says, "For 27 different classes."
Darren . o O ( syllabi? )
Chip says, "syllabi"
You smile.
Frankie smiles at Darren.
Adele smiles.
Chip says, "Like Elvi and Jesi"
kilty grins.
Darren grins shyly.
Chip says, "27 classes, each with its own list."
kilty nods.
Chip says, "I decide to make a master student list."
Chip says, "On my rolodex:"
Frankie says, "The light begins to shine in Franlies eyes :->"
Darren asks, "so syllabus.students [1][1] would still be PJ?"
Frankie says, "frankies eyes too"
Suzi_J has disconnected.
kilty asks, "PJ would still be 1 1 because this is the first list, yes?"
Chip says, "rolodex.students = {{"PJ", "Suzi_J", .. "kilty"}, {"Bob", "Fred",
.. "Tom"}, {}, {}, {}, {}} all the way up to 27 classes worth."
kilty lags
JohnMac says, "I just hit MAJOR LAG"
Chip says, "Yup.  rolodex.students[1][1] would be PJ"
Darren tries to beat back the lag monster.
CindyB has connected.
Suzi_J has connected.
Chip says, "rolodex.students[1][13] would be kilty"
Chip says, "rolodex.students[10][1] would the first student on the list from
the 10th class."
Chip says, "I'm lagging BAD"
Darren nods in comprehension.
CindyB nods.
Chip says, "We just got over a checkpoint.  Bet ya we get lag like that in an
hour."
JohnMac says, "Ok what if PJ took 3 courses -- would he be there 3 times"
Darren says, "I think that we all did for a few minutes there..."
CindyB has disconnected.
Chip says, "So that's a two-dimensional refernencing structure."
kilty asks, "ok, I think I understand what the lists are ... now what good
are they?"
Chip says, "Sure.  And it wouldn't matter, because "PJ" is just a string."
Frankie has disconnected.
Frankie has connected.
You ask, "O.k.  Why lists matter?"
Chip says, "Hmmmm."
Frankie asks, "Did I miss much...I got hung?"
Darren takes a look at Adele.
Adele has disconnected.
JohnMac says, "But we could concatanate in some way to make a unike rolladex
list"
Chip says, "At Point MOOt I had a city contract for the citizens to sign off
to do community work."
JohnMac says, "that was "unigue" -- TFT"
Chip says, "Each contract had a .info list which looked liked this:"
Suzi_J has disconnected.
Adele has connected.
Chip says, "{"Citizen Name", "Wizard Name", "Job Description", }"
Chip says, "I had a verb on the wizards called @jobs - designed to give a list
of the outstanding contracts."
Chip says, "It had a master property on it."
Darren nods.
Chip says, "ALL of the contracts .info in one list."
Chip says, "So when you typed '@jobs' you saw:"
Chip says, ""
Chip says, "Bob        by Chip         Build a Steamboat        25 Quotas"
Chip says, "Fred       by Smack        Build a Bar              30 Quotas"
Chip says, "etc."
Darren nods.
Chip says, "It did it by using the list of lists techniques."
kilty sees a lightbulb over her head!  Oh!
Chip says, "You set counters."
Darren says quietly, "A useful system..."
Frankie says, "It makes sense"
Chip says, "for job  in (1 to length(master list))"
kilty nods.
Chip says, "player:tell(job[1], job[2], job[3], job[4])"
kilty asks, "1 to length?"
Chip says, "endfor"
Suzi_J has connected.
Chip says, "Length is the answer to the question that was asked earlier:"
You ask, "How do you know how long the list is?"
Chip says, "length() is a built-in MOO function."
kilty cheers
Chip says, "length(listname) returns how many elements are in the list."
Darren says, "4 by however many contracts were awarded, I'd say."
Chip says, "If it's 13, then list[13] is as high as you can go."
kilty says, "ok, I think I comprehend the concept (can i use it yet? no)
thank you"
Chip says, "Bingo.  Master list was the number of contracts.  Each contract a
length-of-four list int he master list."
Adele has disconnected.
Chip says, "So master list[1][1-4] all the way up to list[lenth(list][1-4] was
your ranges."
Chip says, "Not that that's valid moo syntax.  you get the idea though."
kilty nods to you.
Adele has connected.
Chip says, "O.k.  That's what in old-fashioned programming is called an array."
kilty nods.
Chip says, "Perl, as a side note, uses lists of lists too.  It's not just a MOO
thang."
Chip says, "Once again, we'll get into details on that later."
Adele puts on a seatbelt.
kilty asks, "and Forth?"
Donald asks, " Just to verify since MOO is coded in C, list starts from 1
always not 0 ?"
Chip says, "Forth?  Dunno."
Darren chuckles politely at Adele.
Chip says, "Right.  Lists always start at 1."
kilty nods to Donald.
Chip says, "In Perl they start at 0, and that THREW me the first time I used
it."
Chip says, "EVERYTHING was 1 off, and at the end I got an "out-of-range error""
kilty pats Chip on the shoulder politely
Chip says, "O.k.  Back to Adele's question about how we see what the 
properties
and their values are..."
Chip flips the chalkboard over, and it sizzles and crackles with electric
blue energy.
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
YOUR SECOND PROGRAMMER'S VERB:
(@parents was your first one!)
@d
As you know from the lessons on properties and verbs, they are each defined
by their object name, followed by a colon or period, followed by their name.
@d is a command which shows you some of the basic information about an object,
its properties, or its verbs.
---------------------------------------------------------------------
Chip finishes quoting.
FrankCh asks, "So list-of-list can combine different type of list?"
Darren raises one eyebrow.
Chip says, "Sure it can.  My jobs list had strings and integers in it."
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
As an example, AND DON'T TRY IT YET!, you would do:
@d board
To see the information about my chalkboard.
@d board:
To see information about its verbs.
@d board.
To see information about its properties.
Using the object name (or number) with nothing else gives you info on the
object itself.  Using the name (or number) with a colon shows the verbs.
The period shows the properties.
---------------------------------------------------------------------
Chip finishes quoting.
Chip says, "And actually, that jobs list had players' object numbers in it 
too."
Darren exclaims, "Neat!"
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
Special Note:  When properties are listed out by the @d verb, their actual
values may not show up completely on the screen.  You can view the full
contents of that property (unless its a HUGE list) by using the @d command
on the property name itself:
@d me.description
This is a valuable tool to check for the presence and/or values of properties,
and the details on verbs.
---------------------------------------------------------------------
Chip finishes quoting.
Chip says, "O.k.  Let's give it a whirl, though it's gonna raise 8 million new
questions."
Chip says, "Everyone type: @d board"
[Chip types @d board:]
Chip's dimensional phase-shifting, quotable chalkboard (#12194) [ readable ]
  Child of generic thing (#5).
  Location [IN CLASS IN SESSION] (#9819).
-------------------------------- finished ---------------------------------
Darren says, "life just got complicated on me again..."
Darren grins.
Chip says, "You see here that it shows the object's owner, the name, the object
number, the location and the object number of the location"
Chip says, "I renamed this room [IN CLASS IN SESSION] by the way."
Chip says, "It also shows the rwfc flags on the property."
kilty asks, "rwfc?"
You ask, "Readable?  Writeable?  Fertile?"
FrankCh asks, "what's fc?"
Chip says, "Skip the 'c' one.  that's not valid."
You ask, "Readable means, can other players read it and its verbs 'n' stuff?"
kilty asks, "yes, but where?  oh! readable in []?"
You ask, "Writeable means, can they change the values of its properties?"
You ask, "Fertile means, Can you make kids of it?"
Chip says, "THAT is the key to generics.  ALL generics are fertile."
Chip says, "Watch:"
[Chip types: @chmod chalkboard +f]
[Chip types: @d chalkboard]
Object permissions set to "rf".
Chip's dimensional phase-shifting, quotable chalkboard (#12194) [ readable
fertile ]
  Child of generic thing (#5).
  Location [IN CLASS IN SESSION] (#9819).
-------------------------------- finished ---------------------------------
Darren says, "very, very nice."
kilty says, "I understood the meaning of rwfc but didn't see where @d showed
it. Now I do."
Chip says, "Now do @d board"
Chip says, "I just made it fertile."
Chip says, "You guys could all copy it right now if you wanted to."
FrankCh says, "d board"
kilty says, "aha! ok  I see..."
Darren says, "the light begins to dawn..."
Chip says, "That covers the usage of @d on an object."
Chip says, "Lets try:"
Chip says, "@d board:"
Chip says, "To look at its verbs."
Chip ducks, 'cause HERE COME THE QUESTIONS!
[Chip types: @d board:]
Chip's dimensional phase-shifting, quotable chalkboard (#12194) [ readable
fertile ]
  Child of generic thing (#5).
  Location [IN CLASS IN SESSION] (#9819).
#12194:sides                    Chip (#2100)         r d    this is any
#12194:r*ead                    Chip (#2100)         rxd    this none none
#12194:quote                    Chip (#2100)         r d    any out of/from
inside/from this
#12194:flip                     Chip (#2100)         r d    this at/to any
#12194:text                     Chip (#2100)         rxd    this none this
#12194:wr*ite                   Chip (#2100)         rxd    any on top of/on/
onto/upon this
-------------------------------- finished ---------------------------------
Darren asks, "rxd?"
Chip says, "O.k.  That's a list of every verb I put on my board."
Chip says, "rxd is similar to rwf on the object itself."
Darren says, "and the three args after it, while we're in the neighborhood.."
You ask, "r = is the verb readable?"
You ask, "x = is it executable.  i.e., can you CALL it from within another
verb?"
You ask, "d = is the debugger active for it?"
Darren nods.
Chip says, "if the debugger is NOT active (in theory) you don't get traceback."
Darren chuckles politely.
Chip says, "Although I don't think d has ever worked right."
Chip says, "Seems to me that you get traceback even without it."
Darren takes a look at Adele.
Chip says, "You notice too, that my name is on there."
Chip says, "I OWN the verb."
Darren nods.
Chip says, "That's important."
You ask, "Why?"
Chip says, "I'm a programmer - NOT a wizard."
kilty asks, "because if you didn't you couldn't call it unless it was public?"
Chip says, "If I try to write a verb that takes away your programmer bits,"
Chip says, "I'm trying to do something that only a wizard can do."
kilty is confused again
Chip says, "When I run my verb that says kilty.programmer = 0"
Darren says, "so that keeps you from hacking into a higher privelege."
Chip says, "The MOO is going to check and see if I can do that."
Chip says, "I shouldn't be allowed to set kilty.programmer to 0"
kilty nods to you.
Darren asks, "you can't make tools above your station?"
kilty says, "ok ...."
Chip says, "So:  Since I  own the verb that tries to do this, the permissions
on the verb are MY permissions - the permissions of a lowly programmer."
Chip says, "If Jeanne owned the verb, it would work."
Darren nods.
kilty asks, "oh, ok   so the verbs sort of have their own levels of
permission?"
Darren asks, "Could Jeanne create a wizard-level verb that was usable by
programmers?"
FrankCh says, "before I forget, 'c' is not valid? for @d board? there is
'r c' in @d board.description"
Chip says, "Wizards write certain verbs that do certain things that normally
aren't doable by a player.  If Jeanne writes a verb called button:press on a
button that when you press it, it makes you a programmer, it would work."
Chip says, "Hand on FrankCh, properties are next."
Darren nods.
Donald says, "yes, VSPO's are examples."
kilty asks, "if you are promoted to wizard suddenly, do all your previously
made verbs gain wiz status retroactively?"
Adele has disconnected.
Chip says, "If jeanne write and owns that verb, I can walk up as a player,
press that button, and get a programmer's bit.  I I write that verb, none
of us can make the button work."
Darren nods.
Chip [to kilty]: Yes, they do.
Donald says, " of a programmer being able to make a programmer out of
ordinary character, i.e. wiz level"
kilty nods.
Chip says, "THAT is a major security hole too."
kilty [to Chip]: why?
Chip says, "Over at PMC MOO, the terrorists did this:"
Donald says, "don't even have to be programmer even, as long as you control
VSPO, thats enough."
Chip says, "Everyone has a verb on them called :moveto()"
Suzi_J hops down from the barstool.
Suzi_J goes home.
Frankie asks, "What is a "VSPO"?"
Suzi_J A tiny yellow butterfly flitters into the room, circles your head,
and lands on the floor.  At second glance you realize it's Suzi!
Lakota [to Frankie]: Visting Student Player Object
You ask, "Are y'all familiar with '@refuse move from '?"
kilty nods to you.
Darren says, "not really, no."
Frankie says, "No I am not"
CindyB shakes her head
Chip says, "At LambdaMOO, they have a room called Hell, and one called Prison,
NEITHER of which you can teleport out of."
Darren nods.
FrankCh exclaims, "no!"
Chip says, "It was a common prank to send people there."
Chip says, "By doing: @move FrankCh to Hell"
Chip says, "BUT"
Chip says, "You had a natural defense."
Chip says, "FrankCh could type: @refuse move from Chip"
Chip says, "And then, no matter how hard I tried to teleport him, it wouldn't
work."
Chip says, "I'd get: permission denied."
FrankCh asks, "Is there @refuse move from everyone?"
Assistants of the local psychology institute arrive to cart Adele off to
their dream-research labs.
Chip says, "There may have been."
Chip says, "Now the way the @move verb works, is this:"
Chip says, "It calls up FrankCh's FrankCh:moveto() verb."
Donald says, "I am not sure but here you must own or control the object,
I think. DU that is."
Chip says, "Which FrankCh owns, because it's a verb on himself."
You ask, "What if I found a moveto() verb that was owned by a wizard?"
kilty says, "uh-oh"
Chip says, "Then I have a moveto() verb that OVERRIDES anything Frank can do."
Darren says, "like the @trust command in Cybersphere"
Darren lags once again.
Chip says, "ALL wizards can ALWAYS override player verbs."
Suzi_J smiles wiz-like
Donald says, "hm you mean hack the verbs given by wizards, I have not tried
to do that, wonder if it is easy. :)."
Chip says, "So I find a whole collection of moveto() verbs that are wiz-owned,
and that thus have WIZ PERMISSIONS"
Chip says, "I sort through the list and find one that is +x (executable,
callable by another verb)"
Chip says, "I re-write my own @move verb to reference that one, instead of the
one on the player I'm trying to move (which is how it's normally written)."
Chip says, "Now I can teleport anyone anywhere any time without them being able 
to stop me."
kilty begins to see through the haze
Chip says, "I can do what the PMC Terrorists did:"
Chip says, "Make a bomb that blows up and moves() you to somewhere else."
Chip says, "Make a gun that does the same."
Chip says, "ETc. etc. etc."
kilty asks, "PMC Terrorists?"
Darren says, "in other words, you take the power tools from the wizard's
bench and they get whatever job you choose done."
FrankCh asks, "You can do that to Jeanne also?"
kilty nods to Darren.
Chip says, "PMC MOO was almost completely destroyed about a year ago by a
group of people that got together and attacked the place with verbs like
this."
Chip says, "Sure.  Wizards have equal power over each other."
kilty sighs at such behavior.
Chip says, "She'd have to code another verb that did something to block mine."
Frankie asks, "What has been done HERe to prevent this?"
Donald asks, "ever trace them? "
Cil asks, "are there any safeguards here?"
Chip says, "I don't know.  I'll bet I could take this MOO out in a day."
Frankie exclaims, "OH GREAT!"
Cil exclaims, "Let's do it!"
Chip says, "I'd wager Rich hasn't had time for security since it hasn't been an
issue so far."
Darren . o O ( powerful, and dangerous knowlege... )
kilty chokes on a sip of coffee and gives Chip an evil eye
Chip says, "It's a bitch to write verbs like that, and it's a bitch to block
verbs like that."
Donald says, "he has looked into it. security"
Chip says, "LONG hours of sorting through all the verbs in the moo to find the
wiz-owned verb that does what you want."
Chip says, "It's easier for the wizard, because most players only own a few
objects, and thus only own a few verbs."
Chip says, "After-the-fact it's easy to find out who did it."
Chip says, "but that's why +x and who owns the verb are important."
kilty nods to you.
Darren says, "and, one may hope, to site them, spam them, and generally
return the misery that they visited upon the MOO."
Suzi_J goes home.
Cil hmms.
Chip says, "It doesn't have to be wiz-owned either.  If it's only one player I
want to mess with, and I find a verb that that player owns that accomplishes
my goal, it works too.  Why?   Because any player is allowed to manipulate
him/herself all day long."
Cil laughs.
CindyB . o O ( That didn't sound quite right. )
Donald says, " there are the odd warnings sent out but its impossible to stop all attacks on a MOO, only minimize, just like any Unix system :)."
FrankCh asks, "does +x same as 'x'(rxd) from @d board:?"
Darren says, "the wiz-owned verb I assume would be universal, with the more
plebian player verbs only affecting that player."
kilty chokes again
kilty lags
Cil [to FrankCh]: ????
Cil lagging behind
Chip says, "Another note on wizards: all of this who-owns-what, what's
readable, what's writeable, what's executable business doesn't matter at all
to them.  They can do whatever the hell they want."
Cil says, "I figured that"
Darren nods.
Chip says, "+x is rxd stuff.  the command is a rip-off of unix:"
Cil nods.
Chip says, "@chmod object +/-rwf"
kilty [to Chip]: I thought it was close to read write execute
Chip says, "@chmod object:verb +/-rwxd"
Darren says, "of course, chmod +x .plan"
Chip says, "@chmod object.property +/-rwc"
Chip quotes from Chip's dimensional phase-shifting, quotable chalkboard:
---------------------------------------------------------------------
Special Note:  When properties are listed out by the @d verb, their actual
values may not show up completely on the screen.  You can view the full
contents of that property (unless its a HUGE list) by using the @d command
on the property name itself:
@d me.description
This is a valuable tool to check for the presence and/or values of
properties, and the details on verbs.
---------------------------------------------------------------------
Chip finishes quoting.
Cil [to Chip]: I hope I can ftp this session from you!
You ask, "O.k.  What is the 'c' bit, which you only find on properties?"
Chip says, "It has to do with inheritance."
Darren hugs Adele warmly.
kilty [to Chip]: I don't know
Chip says, "If I make a generic pet, and you make a copy of it, I still own its 
verbs."
Adele says, "Sorry Bad night."
Cil [to Adele]: Me too
FrankCh [to Cil]: gopher actlab.rtf.utexas.edu
Chip says, "Because I wrote them, and you only own the CHILD of what I wrote."
kilty [to Chip]: really?  doesn't that give you power over it?
Darren asks, "I see. So I could not use the verbs of the child?"
You ask, "So:  What is one of the verbs is: pet:@set-messages ?"
Chip says, "You can still use it, but it's used by you with MY permissions on
it."
Chip says, "This @set-messages verb is designed to set all of the properties
which are the messages about what your pet does."
Darren . o O ( then Chip could set it to 'piddles on  somebody's leg. )
kilty looks a bit confused
kilty says, "ok...."
kilty asks, "so the "c" signifies it's the child and not the original?"
Chip says, "Trouble is, when you made a copy of my pet, YOU own the pet, _I_
own the verbs, and YOU (by default) own the properties too."
Chip says, "If YOU use MY @set-messages verb to change YOUR properties, you're
going to get "permission denied""
Darren asks, "huh?"
Darren says, "oh."
You ask, "How do I fix this so you can use your pet?"
Frankie says, "I see"
Cil says, "so what's the point"
Darren . o O ( my night for witty repatre )
Chip says, "I set all of the properties on the pet to -c"
Chip says, "@chmod pet.enter_msg -c"
Darren says, "kluging, you could just change over the names one by one..."
Chip says, "@chmod pet.exit_msg -c"
Chip says, "@chmod pet.scratch_fleas_msg -c"
Darren nods.
Cil nods.
Frankie asks, "And -c stands for what?"
Chip says, "By doing this to the properties, I take away your ownership of
them.  -c on a property means the owner of the parent owns the properties on
the children."
kilty listens
Chip says, "If I do that, YOU own the dog itself, but I own both its properties 
and its verbs."
Darren says, "so I would own the vehicle of your verbs."
kilty asks, "is that a good idea?"
Darren says, "like having a tv tuned only to your station."
Chip says, "Now when you invoke the verb I wrote to change properties on your
child, it works.  I own the verb that modifies the property that I own - even 
though you own the dog itself and you invoked the verb."
Cil says, "that makes intuitive sense."
Chip says, "It's a system that I don't like, but we're stuck with it."
Frankie asks, "But then i could write new verbs that your verbs pass
arguments to?"
Chip says, "If by default, you owned the verbs of the child, I could write
verbs that cause you to do REALLY BAD things to yourself."
Darren takes a look at Adele.
Chip [to Frankie]: Yes.
Chip says, "I could make it look like a verb that sets the messages on the dog, 
but which actually changes your description to "I'm a sucker!" or something."
Chip says, "That's why the system is the way it is."
Chip says, "It makes it very tough for programmers to make useful generics
then."
kilty says, "I see.."
Chip says, "My syllabus:""
Chip says, "I made a child of the generic and didn't like it."
Chip says, "It only let me modify the properties through one verb."
Adele has disconnected.
Chip says, "If I wanted to change one thing (like the time of the class) I had
to change ALL the properties (i.e., re-type the whole damned thing)."
Chip says, "I ended up just building my own."
Chip says, "And put verbs on it that allowed me to change only one property."
Darren asks, "ack! you basically had to start from scratch each time?"
kilty says, "my room/office has a similar set-up"
Chip says, "Bingo.  Generics which are VERY well-written and thoroughly tested
out are usually changed to the owner of a wizard upon completion."
kilty asks, "Does it ever get to a point where one uses generics made only by 
people one knows and trusts?"
Chip says, "That way you can modify all of the properties even though the owner 
of the parent owns those properties, because you're now doing it with wiz-
owned verbs."
Chip [to kilty]: It doesn't have to because of this complicated system.
Darren nods.
Frankie says, "If a wizzard goes bad...we are all screwed :->"
Chip [to kilty]: My job would be easier if YOU owned the verbs of my
children, but that would mean that you WOULD have to trust me.
Chip says, "That's the @d verb, though."
Donald [to kilty]: that is wise, like in real life would you use a gun made
by strangers, it may blow up. :).
Chip says, "And I'm surprised no one asked about this one..."
Chip says, "do @d board: again (to see its verbs)"
[Chip types: @d board:]
Chip's dimensional phase-shifting, quotable chalkboard (#12194) [ readable
fertile ]
  Child of generic thing (#5).
  Location [IN CLASS IN SESSION] (#9819).
#12194:sides                    Chip (#2100)         r d    this is any
#12194:r*ead                    Chip (#2100)         rxd    this none none
#12194:quote                    Chip (#2100)         r d    any out of/from
inside/from this
#12194:flip                     Chip (#2100)         r d    this at/to any
#12194:text                     Chip (#2100)         rxd    this none this
#12194:wr*ite                   Chip (#2100)         rxd    any on top of/on/
onto/upon this
-------------------------------- finished ---------------------------------
Chip says, "The far right column:"
Chip says, "those are the arguments of the verb."
Chip says, "Every verb has a possibilty of three arguments, the middle one of
which is ALWAYS a preposition."
kilty looks at Chip questionningly
Chip says, "We're going to get into that in the next class, but I'll give a
quick explanation now:"
You ask, "Let's say I want to pet Barrington.  What do I type?"
Chip says, "pet barrington"
You ask, "What verb is that?"
Chip says, "It's barrington:pet this none none"
Assistants of the local psychology institute arrive to cart Adele off to
their dream-research labs.
Chip says, "So the syntax is 'pet this'  (this is a system variable which
references the object upon which the verb is written)."
You ask, "hand donut to kilty?"
Frankie exclaims, "There is no preposition and no indirect object!"
Chip says, "donut:hand this to any"
You ask, "write  on chalkboard?"
Chip says, "chalkboard:write any on this"
Cil sees through the clouds of confusion
You ask, "Is that making sense?"
CindyB finally sees
Frankie asks, "Does "any" have a special meaning here?"
FrankCh says, "I got it! I think..."
Darren says, "a bit... I'll know when I try to use it I guess."
Chip says, "Any means it can be anything.  In the cas of chalkboard:write,
the 'any' is anticipating a string of text, like:"
Chip says, "write "BOOGA BOGGA" on chalkboard"
Frankie asks, "What are the choices of words we are limited in these
positions?"
Chip says, "in the case of the donut, it's looking for a player name:"
Chip says, "donut:hand this to any      is invoked like:  hand donut to kilty"
Chip says, "We'll get into the full scope and their finer uses next lesson."
Frankie says, "Ok"
Darren says, "so this is the object in question, and any is the target."
kilty whispers, "You completely lost me with this last."
Chip says, "Just know for now that every verb has those arguments, and that
they shape how the player actually types in the verb."
Chip [to Darren]: bingo
kilty says, "ok... I'll read this over between now and then."
Darren asks, "donut:take from any?"
CindyB has to go and waves goodbye to everyone.
Chip says, "donut:take this from any"
Chip [to CindyB]: Bye!
Darren asks, "take donut from plate?"
Chip says, "bingo."
Frankie [to CindyB]: Bye
Darren nods.
Chip says, "Think of other verbs you use...."
Darren [to CindyB]: Bye!
Chip says, "@join kilty  ===>  chip:@join any none none"
Cil [to cindy]: Bye!
CindyB goes home.
Chip says, "page jeanne "hello"   ==> chip:page any none any"
Darren nods slowly.
kilty asks, "none?"
Chip says, "pet barrington   ==> barrington:pet this none none"
Cil says, "no preposition"
kilty says, "it's the none that flumoxes me"
Chip says, "None on the page verb because you don't need a preposition."
Chip says, "You assume up-front that three arguments are possible:"
kilty exclaims, "but you do need and object!"
Chip says, "direct object, preposition, indirect object"
Chip says, "If you page  "
kilty exclaims, "oh! wait!  It just clicked in!"
Chip says, "You're NOT doing:"
Cil exclaims, "Back to English class!"
Chip says, "page   "
Chip says, "the middle one is ALWAYS the preposition."
kilty asks, "and not @join player with self   either, right?"
Chip says, "sometimes, there's no preposition AND no indirect object"
Chip says, "right."
Chip says, "though you could write it that way."
Chip says, "You can also do:"
FrankCh asks, "or a keyword must be used for that verb?"
Chip says, "chip:bark none none none"
Darren . o O ( feed carrot to bunny    ====> darren:feed this to any )
kilty says, "like pet Barr      it has only the direct object"
Frankie must leave now
Chip says, "If I code a verb like that on myself, i simply type 'bark' to
bark.  I don't need ANY arguments."
Frankie says, "CU all L8R"
Darren [to Frankie]: bye!
Frankie waves to FrankCh, Ruby_Guest, you, Darren, kilty, Donald, JohnMac,
Lakota, and Cil.
You exclaim, "CARROT:feed this to any.  DARREN:feed this to any means "feed
darren to bunny"!"
You smile.
kilty exclaims, "bye Frankie!"
Darren laughs at himself.
Cil [to Frankie]: Bye!
You wave.
Frankie has disconnected.
Darren . o O ( a carnivorous bunny. )
Chip says, "Okay.  Bad lag tonight, and lots of students taking off."
You sigh.
You ask, "Any questions now?"
Darren says, "I think I have it..."
kilty [to Chip]: I'd like some time to digest and reread it...  we're a bit
overtime anyway
FrankCh says, "Yes, back to list-of-list."
Chip says, "Is everyone following this?  It's a lot to digest for sure."
Chip says, "O.k.  Tell y'all what."
Chip says, "Class is officially over if you want to split."
Cil exclaims, "I'm following what i"ve seen!"
kilty grins at FrankCh.
Chip says, "If you have specific questions, I'll field those."
You smile.
kilty will stay as long as she can....
kilty whispers, "thanks... good class even with lag"
Cil will stay to listen and absorb
Darren says, "I think that I'm going to go do some fiels research at
Cybersphere, for now."
You nod to Darren.
Darren says, "as I've grokked about as much as I can for tonight :)"
Darren hops down from the barstool.
Darren bows gracefully to you.
Chip says, "Use that @d verb.  It'll tell you everything."
kilty exclaims, "bye Darren!"
Darren [to Chip]: thank you for the lesson.
Chip says, "Except, of course the actualy verb contents."
You smile.
Cil [to Darren]: Bye!
Darren waves to FrankCh, Ruby_Guest, Frankie, you, kilty, Donald, JohnMac,
Lakota, and Cil.
Darren has disconnected.
FrankCh says, "list of list can combine different object type and with
different size for each list."
Chip says, "Right."
Chip says, "But if the lengths arent's consistent, you'll have to check for
them to avoid range errors."
FrankCh asks, "IS there tools available to tell me the size/type or do the
range check?"
kilty says, "oh... I didn't consider the possibility of inconsistant ranges."
Chip says, "I have always used length() in a for loop and set a variable equal
to that value in the next for loop."
Chip says, "x = length(list)"
Chip says, "for element in (1 to x)"
Chip says, "  y = length(element)"
Chip says, "etc."
Frankie hops down from the barstool.
Assistants of the local psychology institute arrive to cart Frankie off to
their dream-research labs.
Chip says, "Nest 'em."
kilty asks, "but there wouldn't nec. be the same number of students in each
class so range would nec. vary in your class roster example, yes?"
FrankCh asks, "is there is_valid(list[i][j][k])?"
Chip [to kilty]: right.
Chip [to FrankCh]: Not sure.  If it's there, it's on that programmer's cheat
sheet in my reference list.  q-refpro.moo
Chip says, "Might be a built-in do_while_in_range() even or something like
that."
Chip says, "MOO is huge.  I by NO means know all of it."
Chip says, "Do an @d $list_utils:"
JohnMac says, "brb .. Thanks, Chip"
[Chip type: @d $list_utils:]
list utilities (#56) [ readable ]
  Owned by Hacker (#38).
  Child of Root Class (#1).
   #56:make                     Hacker (#38)         rxd    this none this
   #56:range                    Hacker (#38)         rxd    this none this
   #56:map_prop*erty            Jeanne (#2)          rxd    this none this
   #56:map_verb                 Jeanne (#2)          rxd    this none this
   #56:map_arg                  Jeanne (#2)          rxd    this none this
   #56:map_builtin              Jeanne (#2)          rxd    this none this
   #56:find_insert              Hacker (#38)         rxd    this none this
   #56:remove_duplicates        Hacker (#38)         rxd    this none this
   #56:arrayset                 Hacker (#38)         rxd    this none this
   #56:setremove_all            Hacker (#38)         rxd    this none this
   #56:append                   Hacker (#38)         rxd    this none this
   #56:reverse                  Hacker (#38)         rxd    this none this
   #56:_reverse                 Hacker (#38)         rxd    this none this
   #56:compress                 Hacker (#38)         rxd    this none this
   #56:sort                     Hacker (#38)         rxd    this none this
   #56:sort_suspended           Jeanne (#2)          rxd    this none this
   #56:slice                    Hacker (#38)         rxd    this none this
   #56:assoc                    Hacker (#38)         rx     this none this
   #56:iassoc                   Hacker (#38)         rx     this none this
   #56:iassoc_suspended         Jeanne (#2)          rx     this none this
   #56:assoc_prefix             Hacker (#38)         rxd    this none this
   #56:iassoc_prefix            Hacker (#38)         rxd    this none this
   #56:iassoc_sorted            Hacker (#38)         rxd    this none this
   #56:sort_alist               Hacker (#38)         rxd    this none this
   #56:sort_alist_suspended     Jeanne (#2)          rxd    this none this
   #56:randomly_permute         Hacker (#38)         rxd    this none this
   #56:count                    Jeanne (#2)          rxd    this none this
   #56:flatten                  Hacker (#38)         rxd    this none this
   #56:"longest shortest"       Hacker (#38)         rxd    this none this
   #56:check_nonstring_tell_lines Hacker (#38)       rxd    this none this
-------------------------------- finished ---------------------------------
JohnMac goes home.
FrankCh [to Chip]: thanks for the answer!
Chip says, "$list_utils:range()"
You smile.
Chip says, "Look at that one."
Chip says, "There are numerous power tools here.  I'm saving those for later
in the class, though."
kilty nods to you.
Assistants of the local psychology institute arrive to cart Darren off to
their dream-research labs.
FrankCh says, "another question about +x. looks like lots of verbs are owned
by Jeanne with"
Chip says, "With +x?"
FrankCh asks, "rxd , any security risk?"
Chip says, "Most of them are harmless."
Chip says, "Reason being, the contents of the verb are highly specific to the
object upon which they are located."
Chip says, "I use @move(player)"
Chip says, "It calls player:moveto()"
Chip says, "  which is +x and contains checks to see if I've got permissions."
Chip says, "That +x verb either moves him, or returns an error message."
Chip says, "It's a +x verb I could call from anywhere, but it's still gonna
check ME out and return one of those two conditions."
kilty says, "I hate to leave ...."
FrankCh says, "So, it depends on how careful the programmer is"
Chip says, "It's callable, but won't do much outside of its specific task."
Chip [to kilty]: You're welcome to!
You bow.
Lakota smiles at you.
Chip says, "Most of the time, it's not even an issue of care."
kilty says, "Thanks... I need to go but I don't want to miss anything!
*grin*"
Chip says, "Your +x verbs are coded by their very nature to do simple little
specific things:  convert a list to a different order, or whatever."
kilty asks, "is anyone else logging the rest of this?"
Chip says, "I'm still logging."
Chip says, "Tell ya what."
Chip says, "I have an example."
kilty [to Chip]: thanks... I'll ask for it later... take care all!  Thank
you Chip!
Lakota waves to kilty.
kilty [to Chip]: what?
Cil [to kilty]: Bye!
Chip says, "Cool.  My whole syllabus is +r."
You drop [CH101] Beginner's MOO Code.
Chip says, "@d syllabus:"
Chip says, "The only +x verb is 'checkemout'"
Chip says, "It's called by enroll"
Chip says, "All it does is hit you with all of the checks:"
You ask, "Do you have your bit?"
kilty waves goodbye to all and thanks to Chip and heads out before people
murder her! :)
FrankCh exclaims, "yes!"
You ask, "Is the class already full?"
kilty waves.
Cil exclaims, "yes -- before it started!"
You ask, "Did you read the syllabus first?"
Chip says, "It prompts the person trying to enroll to answer these questions.  
It checks a few thing for itself too."
FrankCh says, "back then? yes. the counter is zero"
Chip says, "If they sucessfully jump through every hoop, it returns a 1.  If
not, it returns 0."
kilty hops down from the barstool.
kilty goes home.
Chip says, "I'm describing what the verb does - asking rhetoricals here. :)"
Chip says, "checkemout is the verb that actually GRILLS and examines the player 
to make sure they qualify."
Chip says, "It is +x, and exists only to do those tasks, and to then return 0
or 1."
Chip says, "After that verb is called from :enroll, :enroll takes that zero and 
one and either 1) signs the player up.  2) rejects them and gives them a
polite reason why."
Chip says, "that's what +x verbs are usually for - generic tasks specific to
the the object that you code as their own routines to keep the main code from 
getting too long and unwieldy."
FrankCh says, "The first time I tried :enroll, the counter was 6 and I was
rejected but with"
FrankCh says, "no aparent reason/"
Donald says, " see you later, thurs. waves"
Chip says, "I originally set the enrollment to 5."
Cil [to Donald]: Bye!
Chip says, "Then I upped it one at a time as each student came to me."
You wave.
Lakota waves to Donald.
Donald suddenly disappears.
Chip says, "The line in :enroll that calls :checkemout is:"
Chip says, "if (this:checkemout(foo))"
Chip says, "Foo is the variable that I give to the player who tries to enroll."
Chip says, "It's actually doing: this:checkemout(player)"
Chip says, "Inside checkemout, you have:"
Chip says, "if (player.programmer == 1)"
Chip says, "etc."
Chip says, "It's a wholly separate verb that is essentially only a subroutine."
Chip says, "You could write a verb right now on yourself, call
syllabus:checkemout(player object number) with it, and get prompted by those
messages when you fire off your verb."
Chip says, "It's +x, but it's useless to you."
FrankCh says, "Thanks for the explaination. I got to go and maybe we can
continue next time. Thanks Chip! Bye Lakota, Cil"
You bow.
You ask, "Any more questions?"
You smile.
Lakota says, "bye Frank"
FrankCh exclaims, "next time!"
Cil exclaims, "Bye Frank!"
Chip [to Lakota]: go for it.
FrankCh has disconnected.
Ruby_Guest has disconnected.
Assistants of the local psychology institute arrive to cart Ruby_Guest off
to their dream-research labs.
Cil exclaims, "See you all later!!"
Lakota says, "bye Cil"
Cil goes home.
Assistants of the local psychology institute arrive to cart FrankCh off to
their dream-research labs.
Lakota says, "well,i need to go.  gotta pack!   :)"
Chip says, "I can help you build your offices over there."
Lakota says, "the course is great.  thanks for letting me in :)"
You exclaim, "DAMN THIS LAG!"
Lakota exclaims, "i'll be in touch!"
Lakota waves to you.
You exclaim, "Email me!"
You exclaim, "I'm gonna @quit!"
You bow.


P.J.