Geschreven door: Timo Krul (mrfan@dds.nl).
Laatste wijzigingen: Mei'95.
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
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!
@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...
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:
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, "\""); endifBekijk 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.".
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.