DDM Bouwvakkers handleiding


deel 1


Geschreven door: Timo Krul (mrfan@dds.nl).
Laatste wijzigingen: Mei'95.


Inhoud



Deze handleiding bevat de volgende hoofdstukken:


Inleiding



Waarschijnlijk heb je al een beetje in de metro rondgekeken voor je deze tekst gelezen hebt. Je zult ongetwijfeld wat help commando's opgevraagd hebben. Denk nou niet dat je na het lezen van deze handleiding nooit meer een help op hoeft te vragen. Iedereen vergeet wel eens iets en bedenk dat de help functie er juist is om je te helpen. Dus ook als je wat instructies uit deze handleiding doorloopt, schaam je niet om een keer @help <commando> in te tikken!


MOO



Om te beginnen moet je een beetje weten waar je mee te maken hebt. Het soort programma waar de metro uit bestaat is een zo genaamde MOO. Dit staat voor MUD Object Orientated. Het woord MUD staat voor Multi User Dungeon.

Een MOO is het best te beschrijven als een text-georiënteerde, virtuele (=niet reële) ruimte waar meerdere gebruikers op dezelfde tijd gebruik van kunnen maken. Het doet een beetje denken aan de oude tekst-adventures. (Misschien ken je Zork nog wel? HET spel van begin jaren '80 :)

Een groot verschil met een tekst-adventure is, dat een MOO nooit zal eindigen. Je kunt dus ook geen punten halen. Ook puzzeltjes oplossen gaat wat moeilijker in een MOO. Zoals je bij een tekst-adventure misschien eerst een opblaasboot bij de speelgoedwinkel moest pakken en opblazen met een fietspomp uit de tuinkast om een rivier over te kunnen steken. Bij een MOO gaat zoiets eenmaal niet, want als 1 speler toevallig de fietspomp de hele tijd bij zich blijft dragen, kom jij die rivier natuurlijk nooit meer over.


OOP



Weer zo'n DLA (drie-letterige-afkorting :). Een belangrijk ding om te weten bij het bouwen van de metro, is hoe het concept OOP werkt. OOP staat voor het object-georiënteerd programmeren. Je moet namelijk weten dat ALLES in de MOO een object is. Spelers, kamers, uitgangen, noem maar op. Elk object wordt geïdentificeerd met een object-nummer. Dit nummer bestaat uit een #-teken, gevolgd door een nummer. Dus bijvoorbeeld: #592 is een geldig object-nummer.

Zo heb je zelf ook een object-nummer. Tik bijvoorbeeld eens het commando waar in. Je ziet dan alle object-nummers van de aanwezigen in de metro en als bonus ook nog eens het object-nummer van de kamer waar ze uithangen.

Een object kan naast een nummer ook nog een naam hebben. Bijvoorbeeld de barman, De kiosk of een ijsje met chocola. Speciale namen zijn: me of mij (dat ben je altijd zelf) en hier (dit is altijd de kamer waar je je op dat moment in bevindt)

Het principe van object-georiënteerd programmeren is dat een object kan afstammen van een ander object. Stel bijvoorbeeld dat we het object stoel hebben. Dit object heeft natuurlijk bepaalde eigenschappen. Zo kan je dit object zo programmeren dat je er op kan gaan zitten.
Nu kan je weer een nieuw object maken dat afstamt van de stoel, bijvoorbeeld een metro-zitplaats. Dit object heeft dan dezelfde eigenschappen als stoel, dus je hoeft niet meer helemaal alles te schrijven wat je ook bij stoel hebt geprogrammeerd.

Aan de metro-zitplaats kan je dan weer andere dingen toevoegen die je niet bij de gewone stoel kwijt kon. (bijvoorbeeld dat je na 2 minuten toch maar weer opstaat, omdat hij niet lekker zit :).
Uiteraard kan je van de metro-zitplaats weer andere metro-zitplaatsen laten afstammen (denk aan een bekliederde metro-zitplaats).

Natuurlijk wil je nu meteen al allemaal stoelen gaan maken, maar eigenlijk valt er nog veel meer uit te leggen. Nouja, laten we toch eerst maar eens wat gaan bouwen, anders wordt het zo saai allemaal.


Handen uit de mouwen... we gaan bouwen!



Als je voor het eerst de metro inkomt, kan je nog geen dingen bouwen. Anders zou het natuurlijk wel een zooitje worden. Je moet eerst toestemming vragen aan een opper-bouwvakker. Als je nog geen bouwvakker bent, stuur dan een bericht aan metro@dds.nl en vertel waarom jij zo graag wilt meehelpen aan het creëren van de enige echte digitale metro.
Dit moet geen probleem opleveren. Vanaf nu gaan we er dan ook vanuit dat je rechten hebt om te gaan bouwen.

Allereerst moet je weten dat je maar een beperkt aantal dingen kan bouwen. Alles wat je maakt kost ruimte op de DDS-computer, dus houdt daar rekening mee. Als je wilt weten hoeveel objecten je kan maken, tik dan @quota in.

Natuurlijk is het eerste wat we gaan bouwen een eigen ruimte. Dit gaat met het commando @dig (we zitten tenslotte onder de grond :). Vraag ook eens een help op met @help @dig.

Welnu, laten we een eenvoudige werkplaats bouwen:
@dig "De werkplaats van <en dan hier je naam>"

Je krijgt nu het object-nummer van je eigen werkplaats! Maar waar hangt dat ding uit? Zomaar ergens dus. Hij zweeft ergens in cyberspace. Laten we onszelf er maar eens heen transporteren.

Het verplaatsen van objecten doe je met:
@verplaats <object> naar <ander object>

In ons geval wil je jezelf verplaatsen naar je werkplaats, dus doe je:
@verplaats me naar <het object-nummer wat je net terugkreeg>

Als je jezelf wilt verplaatsen kan dit ook korter met het commando ga <object-nummer van de kamer>. Als het goed is ben je nu in je eigen werkplaats beland. Hij heeft geen uitgangen en geen ingangen. Je kunt er dus (voorlopig) alleen nog maar in met het @verplaats of ga commando. Op deze manier kan je eerst werken aan je ruimte en pas als hij af is een in- en uitgang maken, zodat anderen er ook makkelijk in kunnen komen. Het koppelen van je kamer aan een andere ruimte moet natuurlijk wel in overleg gebeuren met de eigenaar van die andere ruimte.

Dat je nu ongestoord kunt werken is niet helemaal waar. Je kamer mag dan wel geen ingang hebben, anderen kunnen er nog wel in met volg <jouw naam>. Als je je kamer echt wilt afsluiten doe dan:
@zet hier.free_entry naar 0 (en 1 om hem weer open te zetten)

Goed, je hebt nu dus je eigen huis (een plek onder de zon.. eh.. grond). Om dat even duidelijk te maken aan de MOO, tik je @thuis in. Elke keer als je dan huis of thuis intikt, kom je in je werkkamer terug.

Awel, je hebt nu wel een werkkamer, maar hij is nog wel heel erg leeg. Wat we gaan doen is eerst even een beschrijving maken.

Het beschrijven van objecten gaat met:
@beschrijf <object-nummer> als "beschrijving van dit object"

Je weet wat object-nummer van je kamer is, maar je kan ook doen:
@beschrijf hier als "Hier beschrijf je dus hoe je kamer eruit ziet, wat voor rommel je over de vloer hebt liggen of hoeveel ruiten er nog heel zijn."

Als je de editor wilt gebruiken, doe dan /he.

Als je kijk intikt of wanneer je de kamer binnenstapt krijg je deze beschrijving te zien.

Ook is het mogelijk om dingen in de kamer te beschrijven, zonder dat het objecten zijn:
@detail raam is "Het raam staat open."

Als je nu kijk raam intikt, krijg je de beschrijving te zien. Het nadeel hiervan is dat raam niet als object wordt gezien. Je kunt er dus niet veel andere dingen mee uitspoken. Wat je er wel voor leuke dingen mee kan doen is dingen beschrijven die je niet direct op het eerste gezicht in de kamer kan zien:
@beschrijf hier als "Je ziet hier allemaal boeken."
@detail boek, boeken is "Het enige boek dat je herkent is de bijbel."
@detail bijbel is "Er zit een boekenlegger in op pagina 131."
@detail boekenlegger is "De boekenlegger is gewoon een half bierviltje."
Enzovoorts, enzovoorts...

Enkele handige commando's op dit punt zijn:


Dingen



Met het commando @dig heb je een afstammeling van het object $kamer gemaakt. Deze heeft bijvoorbeeld als eigenschap dat andere objecten (en dus ook personen) zich er in kunnen bevinden. Nu wil je je werkkamer wat gezelliger maken met andere dingen, dus kiezen we een afstammeling van het object $ding. Een ding kan je pakken, laten vallen, en nog een aantal mogelijkheden. Met het commando @onderzoek $ding krijg je een volledig overzicht (schrikt niet...). Laten we eens een teddy-beer maken:
@maak $ding genaamd "een teddy-beer"

Elke keer als we nu iets met dit object willen doen, moeten we z'n volledige naam intikken. Omdat dit nogal onhandig is, kunnen we dit object ook meerdere namen geven. Dit kan meteen bij het creëren, door middel van:
@maak $ding genaamd "een teddy-beer":teddy-beer, teddy

Of als we later nog wat vergeten zijn, door toe te voegen met
@addalias "beer" aan een teddy-beer

Nog mooier is:
@addalias "teddy*beer" aan een teddy-beer

Dit sterretje betekent dat teddy voldoende is om in te tikken, maar dat alle woorden die beginnen met teddy met daarna nog enkele letters van het woord beer ook geldig zijn. Je kunt je beer dus nu ook aanspreken met teddyb, teddybe, teddybee en teddybeer.

Wil je het helemaal erg maken, doe dan:
@addalias "teddy*" aan een teddy-beer

Nu zijn alle woorden die beginnen met teddy geldig. Dus ook teddyberin of zelfs teddyshoarmabroodje, je verzint het maar.

Het weghalen van een alias kan met @rmalias. Zie hiervoor @help @rmalias.

Even wat nuttige tips:

We hebben nu een teddy-beer gemaakt. Alles wat je maakt met @maak, komt altijd bij je bezittingen terecht (ja zelfs een olifant van 1000 kg). Je kan hem in je kamer plaatsen door gebruik te maken van de eigenschap dat het een $ding is en je hem kan pakken en neerleggen. Ook kan je gebruik maken van het feit dat het nog steeds een object is:
@verplaats beer naar hier

Een probleem dat je misschien later tegen kan komen is dat je een object in een kamer hebt laten liggen, maar je weet niet meer precies waar. Het commando @verplaats beer naar hier werkt dan niet meer. Dit komt omdat een naam of alias van een object alleen gebruikt kan worden wanneer het object zich bevindt in de kamer waar je op dat moment bent of als je het bij je draagt. Je zult dan echt het object-nummer moeten gebruiken wanneer je er iets mee wilt doen.

Als je niet meer weet wat de nummers zijn van de objecten die je hebt, dan kan je met het commando @audit de hele lijst van jouw creaties opvragen en waar ze zich bevinden.

Met @audit <speler> kan je kijken wat de objecten zijn die iemand anders heeft gemaakt.
Weet je van te voren waarnaar je op zoek bent dan kan je doen:
@audit <speler> for <object-naam>

Houd er rekening mee dat @verplaats alleen werkt op de objecten die je zelf gemaakt hebt. Maar als je een object dat van jezelf is wilt verplaatsen dan kan dat ook altijd, zelfs al heeft iemand anders het object in zijn bezittingen. Denk dus niet dat wanneer je een object oppakt dat het meteen van jou is: de rechtmatige eigenaar kan altijd @verplaats <object-nummer> naar mij doen!

Experimenteer nu een beetje met je teddy-beer. Geef hem een leuke beschrijving of misschien ben je hem zat en snij je liever z'n kop af:
@hernoem beer to "een kapotte teddy-beer":teddy-beer, teddy, beer

Je kan er natuurlijk ook een race-fiets met 20 versnellingen van maken.

Het nadeel van een $ding is, dat iedereen hem kan pakken en meenemen. Een oplossing hiervoor is het commando @lock. Probeer bijvoorbeeld:
@lock beer met mij

Nu kan jij hem alleen pakken of neerleggen. In het algemeen is het verstandiger om dingen aan een kamer te locken dan aan een persoon.

Als je er genoeg van hebt (je moet voorzichtig zijn met je quota):
@recycle beer En de metro gaat door alsof je teddy-beer nooit bestaan heeft.


Meer kamers!



Een alleenstaande werkkamer is natuurlijk een beetje weinig. Waar moet je bijvoorbeeld slapen (met je teddy-beer natuurlijk)? Precies, in de slaapkamer! En de slaapkamer moet toegankelijk zijn met de s vanaf de werkkamer, dus tik je:
@dig s to "De slaapkamer"

Let op: dit kost 2 objecten! Namelijk 1 om de kamers te verbinden en 1 voor de slaapkamer zelf. Je kunt nu naar de slaapkamer door s in te tikken.
En hoe gaan we terug? Met w natuurlijk! Maar dat werkt niet!

Inderdaad we moeten vanuit hier ook een uitgang terug maken naar de werkkamer. Dit gaat op dezelfde manier (stel je wil ook met werkkamer terug komen):
@dig w, werkkamer naar <object-nummer van je werkkamer>

Je had ook in 1 keer deze 2 uitgangen kunnen maken:
@dig s | w, werkkamer naar "De slaapkamer"

Houd er weer rekening mee dat elke verbinding een object kost! Probeer nu zelf eens wat nieuwe lokaties te maken.

Let op: Het is niet mogelijk de letters i, k en l te gebruiken voor uitgangen, omdat deze al een andere functie hebben.


Terug naar het programmeren



Je weet nu als het goed is wat meer van objecten. Er zijn een aantal manieren om objecten te bekijken. kijk (of k) wist je al, deze laat alleen de beschrijving zien. @onderzoek laat meer zien: wat je er mee kan (de verbs) en de eigenschappen (de properties).

Met @show kan je ook zien van waar het object van afstamt (wie z'n ouders zijn, zie ook @help @parents) en wie de eigenaar is. De eigenaar is degene die het object gemaakt heeft met @maak.

Tenslotte hebben we nog @dump die van alle verbs ook de programs geeft (vraag weer eens wat @help op).

Wat is nu precies een verb (vertaald uit het Engels: werkwoord)?
Een verb is simpelweg gewoon een stukje programma wat bij het object hoort. Bijvoorbeeld onze teddy-beer van hierboven was een $ding. Dit object heeft al wat voorgeprogrameerde verbs zoals pak.

Als je verbs gaat programmeren, dan gebruik je ze in samenhang met het object waar ze bijhoren in de vorm <object>:<verb>. Dus doe bijvoorbeeld @list beer:pak (oef...)

Laten we eens wat programmeren:
@verb beer:knuffel this

We gaan nu zorgen dat er wat op het scherm komt als je knuffel beer zegt.
@edit beer:knuffel

Je komt nu in de editor om je programma te schrijven. Om het makkelijk te houden schrijven we een programma van 2 regels, tik in:

player:tell("Je geeft de teddy-beer een lekkere knuffel.");
this.location:announce(player.name," knuffelt de teddy-beer!");

Schrijf dit weg en probeer het eens uit met knuffel beer. Vraag ook eens wat help op over de verb commando's. Je kunt er echt heel veel mee!


Properties



Een property is een string of waarde die bij een object hoort. Er zijn properties die bij elk object gedefinieerd zijn (bijv. de beschrijving). Een property wordt aangegeven met een punt. Zo staat de beschrijving van een object in object.description.

Het commando kijk op een object voert de verb object:look_self uit en deze laat je zien wat de inhoud van object.description is.

Doe eens @help @property en experimenteer eens wat.
Met @property beer.ogen maak je dus een eigenschap van de beer.

Je zou kunnen doen @zet beer.ogen naar 2 of @zet beer.ogen naar 1 voor de kapotte teddy-beer. Dit kan je weer in je verbs gebruiken.

Een voorbeeldje:

Geef de beer 4 ogen en voeg toe aan je knuffel verb:

player:tell("Hij kijkt je lief aan met ", this.ogen, " ogen...");

Een speciaal voorbeeld van een property is een message. @messages beer laat zien wat er gebeurt als je hem oppakt of neerlegt. Messages zijn properties die eindigen op _msg. Zo heeft de beer bijvoorbeeld een take_failed_msg. In plaats van @zet, kan je bij messages direct deze property veranderen met:
@take_failed beer is "Hij is te zwaar!"

Ook bij het verlaten van een kamer kan je de messages veranderen. Als je bijvoorbeeld met s naar de slaapkamer gaat, doe: @messages s.

Tip: Heel veel objecten bevatten van dit soort messages. Er staan er ook een aantal op jezelf! Het veranderen van deze messages maakt het leven in de metro er een stuk leuker op.


Einde deel 1



Tot zover een simpele uitleg. Je kunt nu al een heel eind gaan bouwen. In het volgende deel komen een aantal generieke objecten en de wat meer ingewikkelde dingen van het programmeren aan bod.