DDM Bouwvakkers handleiding


deel 2


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


Inhoud



Deze handleiding bevat de volgende hoofdstukken:


Daar zijn we weer



In deel 1 heb je al kennis gemaakt met wat objecten en verbs. In deel 2 zal ik op alles wat uitvoeriger ingaan. Ik zal een aantal voorgeprogrammeerde objecten die in de metro aanwezig zijn nader uitleggen. En we gaan zelf ook wat experimenteren met nieuwe objecten. Merk op dat voorgeprogrammeerde objecten vaak een naam hebben die met een $ beginnen. Dit is niets anders dan een makkelijke manier om een bepaald object aan te duiden. Zo zijn #5 en $ding het zelfde object, maar $ding onthoud je toch iets makkelijker.


Schreeuwlelijkerds



Ze zijn je vast niet ontgaan: schreeuwende barvrouwen, klagende lokettistes, koerende duiven en vloekende junks. Het object waar al deze irritante creaties van afstammen heet $schreeuwlelijk. Een schreeuwlelijk heeft onder andere de verbs record, wis, leer en lijst.

We kunnen nu een nieuw object maken dat afstamt van $schreeuwlelijk:
@maak $schreeuwlelijk genaamd "een koekoek":koekoek

Geef hem een omschrijving en plaats hem in een bepaalde ruimte. We kunnen de koekoek nu wat leren door middel van:
record "Koekoek!" op koekoek
of met:
leer koekoek om "Weet iemand hier hoe laat het is?"

Met lijst koekoek kan je een lijst opvragen wat die koekoek allemaal is aangeleerd. Als je wat wilt verwijderen uit deze lijst, dan tik je:
wis <nummer> op koekoek

De schreeuwlelijk reageert direct op een duw commando of na een bepaalde tijd op iets wat in de ruimte gebeurt waar hij zich in bevindt. Om deze tijd bijvoorbeeld op 5 seconden in te stellen doe je @react_time koekoek is 5.

Als je nu ook nog @wait_time koekoek is 10 doet, zal hij om de 10 seconden z'n favoriete woordje uitkramen.

Let op: heb je liever geen wait_time, zet hem dan niet op 0! Je scherm zal dan namelijk binnen een halve seconde vol staan, dus zet hem dan liever op iets 3600 ofzo (precies een uur...).

Als je een schreeuwlelijk gemaakt hebt en je wilt niet dat anderen hier wat aan kunnen toevoegen of kunnen verwijderen, dan kan je dit op jezelf locken:
@lockmsg koekoek met mij


Poppetjes



Dit deel is tijdelijk verwijderd ivm niet functioneren van bepaalde commando's.


Dozen



Als je een aantal dingen hebt die je wilt opbergen in een ander object, heb je iets nodig wat als doos kan fungeren. Hiervoor hebben ze de $container uitgevonden. In een container kan je een ander object proppen. Containers in containers zijn ook mogelijk.

Laten we eens iets kostbaars opbergen in een kluis:
@maak $ding genaamd "een gouden halsketting":ketting
@maak $container genaamd "een grote kluis":kluis
stop ketting in kluis

Niet echt veilig zo'n kluis, want iedereen kan zo die ketting er weer uithalen met:
pak ketting uit kluis

Een oplossing hiervoor is om de kluis dicht te doen met sluit kluis. Okee, iedereen kan nu weer open kluis intikken, maar het is in ieder geval een stuk veiliger. Ennuh... het is toch maar een virtuele ketting!


Papier hier



Als je iets wilt mededelen aan overige spelers via een aanplakbiljet, een vodje papier of pagina 3 van het Algemeen Dagblad, dan kan je dat doen door een object in de vorm van een $notitie te creëren. Een notitie kan je lezen en je kunt er ook op schrijven. Als je iets tijdelijk op papier wilt vastleggen, bijvoorbeeld je wilt de eigenaar van een bepaalde ruimte laten weten dat hij zijn rommel een keer moet opruimen, dan maak je een $brief:

@maak $brief genaamd "een boos briefje":brief*je
schrijf "Ruim je rommel nou eens een keer op!" op briefje

Het voordeel van een $brief is dat deze weer verbrand kan worden zodra de boodschap is overgekomen met verbrand briefje. Zo blijft de metro ten minste ook lekker schoon...


Verbs, een voorbeeld



Ja, het wordt nu eindelijk eens tijd om onze eigen verbs te maken. Laten we eerst weer even een makkelijk voorbeeld bekijken. Zoals je weet stammen alle ruimtes in de metro af van het object $kamer. Een $kamer is niks anders dan een container voor spelers en andere objecten. Een $kamer heeft een hoop verbs. Met het commando @onderzoek $kamer kan je deze bekijken.

Laten we eens naar het uitvoeren van de verb zeg kijken. De uitvoer van @list $kamer:zeg ziet er zo uit:

#3:"say zeg"   any any any
 1:  player:tell("Je zegt, \"", argstr, "\"");
 2:  this:announce(player.name, " zegt, \"", argstr, "\"");
Het programma van de verb zeg of say beslaat dus maar 2 regels. De eerste regel vertelt aan de speler dat zijn commando daadwerkelijk wordt uitgevoerd. Hierbij is player de speler die de verb heeft aangeroepen en tell is een verb die al eerder is geschreven en nu wordt aangeroepen. Deze eerder geschreven verb staat alsvolgt in #1, ofwel de $root_class:

#1:"tell"   this none this
 1:  this:notify(tostr(@args));
Zoals je ziet roept tell op zijn beurt weer een andere verb aan, maar laten we maar niet nog dieper op de zaken ingaan. Zoals je ook kunt zien moet de verb notify zijn parameters in de vorm van een string meekrijgen.

Een string is niet anders dan een reeks tekens tussen twee aanhalingstekens. Als je het karakter " in een string wil gebruiken moet je deze vervangen door \" (net als je bij de verb zeg kunt zien).

Terug naar regel 2 van de verb zeg. Hier wordt ook een andere verb aangeroepen, ditmaal genaamd announce. Deze heeft als functie dat ieder in de kamer een boodschap krijgt, uitgezonderd de speler zelf.

Als je precies wilt weten hoe dat in zijn werk gaat kan je natuurlijk even spieken met @list $kamer:announce.

Maargoed, nu we weten hoe tell en announce werken, kunnen we een nieuw soort soort kamer ontwerpen. Kijk eens naar dit voorbeeld:

huis
@dig d naar "De donkere kamer van Damocles"
d
@verb hier:"say zeg" any any any
@edit hier:zeg

Tik de volgende 2 regels in en schrijf het programma weg:

player:tell("Je zegt, \"", argstr, "\"");
this:announce("Iemand zegt, \"", argstr, "\"");
Als een speler nu iets zegt, staat er Iemand, in plaats van zijn naam. Niet echt gezellig zo'n donkere kamer. Kan d'r niet iemand het licht weer aan doen? Het mooiste zou natuurlijk een kamer zijn waar we het licht uit en weer aan kunnen doen. Dit doen we door onze kamer een property te geven:

@property hier.licht 0

Het licht in onze kamer is nu nog uit. We kunnen nu 2 nieuwe verbs gaan schrijven die het licht aan en weer uit doen:

@verb hier:licht none
@edit hier:licht

this.licht = 1;
player:tell("Hij sprak \"licht\", en er was licht...");
this:announce(player.name, " doet het licht aan!");
En om het licht weer uit te doen:
@verb hier:donker none
@edit hier:donker
this.licht = 0;
player:tell("Je doet het licht uit.");
this:announce(player.name, " doet het licht uit!");
Met licht en donker zetten we nu de property .licht van onze kamer aan en uit. Nu hoeven we alleen nog maar ons zeg commando aan te passen:

@edit hier:zeg

if (this.licht == 1)
  player:tell("Je zegt, \"", argstr, "\"");
  this:announce(player.name, " zegt, \"", argstr, "\"");
else
  player:tell("Je zegt, \"", argstr, "\"");
  this:announce("Iemand zegt, \"", argstr, "\"");
endif
Bekijk deze if (...) ... else ... endif constructie eens goed. Zoals je ziet hoeft achter if (...), else en endif geen puntkomma te staan, terwijl het bij overige regels wel verplicht is. Dan moet je nog weten dat de expressie (...) na if altijd tussen haakjes moet staan. De regels na if (...) worden uitgevoerd wanneer de expressie tussen haakjes ongelijk aan 0 is. In ons geval betreft het een vergelijking. Een vergelijking levert 1 op als hij waar is, en 0 als hij niet waar is. We hadden hier dus ook gewoon if (this.licht) kunnen gebruiken (ga maar na).

Let op: Bij een vergelijking moet je == gebruiken, terwijl je bij een toekenning = gebruikt. Als je in dit voorbeeld if (this.licht = 1) geschreven had, dan kreeg je geen foutmeldingen bij het compileren, maar het uitvoeren van de verb verloopt dan toch iets anders.

Je kijkt dan namelijk niet of het licht aan is, maar met (this.licht = 1) zet je gewoon zonder pardon zelf het licht aan. Deze expressie levert 1 op en dientengevolge zal het if commando nog maar weinig zin hebben.

Om een beetje met die if dinges te oefenen heb ik een leuk opdrachtje voor je:
Herschrijf de verbs licht en donker zo dat wanneer het al licht of donker is, de speler gewaarschuwd wordt met "Het licht is al aan." en "Het licht is al uit.".


none any this



Je hebt gezien dat je bij het maken van verbs er steeds dingen als this en any achter moet zetten. Dit is om aan te geven hoe de verb aangeroepen moet worden. We onderscheiden 3 gevallen:

Zoals je misschien weet ziet een volledige verb er zo uit:
verb iets voorzetzel iets
(bijvoorbeeld zet bord op tafel)

Het definieren van een verb gaat dus met 3 parameters, waarvan de middelste het bijbehorende voorzetsel voorstelt. Dit kan ook any of none zijn. Om een verb te schrijven om een bord op tafel te zetten zou je kunnen doen:
@verb tafel:"zet" any op this

Als je minder dan 3 parameters meegeeft wordt de rest aangevuld met none.

Zo hebben de volgende twee regels het zelfde effect:
@verb beer:knuffel this
@verb beer:knuffel this none none

Een speciale vorm hiervan is this none this. Dit betekent dat deze verb geen commando is en dus ook niet door een speler gebruikt kan worden. Je ziet hem dus ook niet als je @onderzoek gebruikt. Een verb van deze vorm kan dus alleen intern gebruikt worden door andere verbs.

Hint: Bij verbs als zeg kan je beter any any any gebruiken dan alleen any. Dan maakt het namelijk niet uit als iemand iets zegt waar toevallig een voorzetsel in voorkomt. Staat d'r namelijk wel een voorzetsel in, dan herkent de MOO het niet als een geldig commando.


Op naar deel 3



Eigenlijk had deel 2 iets langer moeten zijn, maar dan zou het nog langer duren voordat het klaar was. Dus de rest van m'n verhaal heb ik maar even opgeschort tot deel 3. Daarin zal ik onder meer ingaan op het creëren van een generiek object.