In Nowmoo bak je natuurlijk geen taart (al zou je dat wel mogelijk kunnen maken), maar maak je hem. Op deze pagina, die bedoeld is om nieuwe bewoners een inleiding te geven in het programmeren in MOO, zal ik beschrijven hoe dit in zijn werk gaat.
Omdat gewone voorwerpen erg saai zijn en voor het maken van een voorwerp geen echt programmeerwerk vereist is, zullen we ervoor zorgen dat je deze taart naar iemand kunt gooien.
Omdat ik in dit programma iets uit het feature van Large gebruik , zul je eerst dit feature aan je personage moeten toevoegen met @addfeature #2208.
Dan gaan we nu beginnen met het echte werk:
Eerst maak je de taart met het commando @create.
Het commando @create heeft de volgende syntax: @create parent called "naam"[, alias,..]
Waar parent de naam van het voorwerp is dat je als uitgangspunt neemt (Het is handig om een parent-object te gebruiken, omdat daarop al een aantal handelingen zoals bijv. oppakken en neerleggen voorgeprogrammeerd zijn).Voor onze taart is dit $thing.
Tussen de aanhalingstekens zet je de naam van het nieuwe voorwerp, in dit geval bijv. "een slagroomtaart".
Verder kun je achter de naam van het voorwerp een of meer bijnamen voor het voorwerp aangeven gescheiden door komma's (De rechte haken worden gebruikt om aan te geven dat alles ertussen ook weg gelaten mag worden). Dit is handig, omdat je het voorwerp dan ook met een van de bijnamen kunt aangeven. In dit voorbeeld gebruiken we de bijnaam taart.
We maken de taart dus met: @create $thing called "een slagroomtaart", taart
Nu hebben we een taart gemaakt, maar we willen er ook mee kunnen gaan gooien...
Om dit mogelijk te maken gaan we het werkwoord gooien (gooi) aan de taart koppelen.
Dit doen we met het commando @verb, dat de volgende syntaxis heeft: @verb voorwerp:werkwoord this/none/any voorzetsel/none/any this/none/any
Dit lijkt op het eerste gezicht ietwat ingewikkeld, maar dat valt best mee.
Nu wordt duidelijk waarom we onze taart een bijnaam hebben gegeven. We kunnen onze taart nu met taart aanduiden in plaats van met "een slagroomtaart".
Voor werkwoord gebruiken we gooi. this/none/any zijn aanduidingen die als volgt zijn uit te leggen: this verwijst naar het voorwerp zelf, in dit geval dus de taart. none gebruik je als je niet wilt dat iemand iets op bijbehorende positie hoeft mee te geven. Als je dus bijv. een voorwerp wilt 'gebruiken' met alleen het werkwoord gebruik, dan geef je @verb voorwerp:gebruik none none none , zodat je er niets bij hoeft te geven. any kan elk willekeurig woord zijn, dat je dan in het werkwoord zult verwerken.
We willen dat we de taart naar iemand kunnen gaan gooien met gooi taart naar iemand,
dus als voorzetsel gebruiken we naar. De opdracht wordt dus: @verb taart:gooi this naar any
(Vergelijk dit met gooi taart naar iemand>)
Nu zullen we het werkwoord gaan invullen.
Afhankelijk van het programma dat je gebruikt om Nowmoo te komen zijn er verschillende manieren om een werkwoord te 'editten'. Zo schijnt VMOO een handige standaard-editor te hebben, maar tot mijn spijt moet ik bekennen dat ik geen VMOO-gebruiker ben en de details niet weet. Ik raad je aan om eens rond te vragen in Nowmoo bij andere helpers (op te vragen met @helpers) of gewone bewoners; zij kunnen je vast wel meer informatie geven.
Je kunt werkwoorden in ieder geval altijd programmeren met behulp van het commando @program, met de syntaxis:
@program voorwerp:werkwoord
programmacode
.
Met de punt op het eind geef je aan dat je klaar bent met programmeren.
Voor onze taart tikken we dus @program taart:gooi in.
We gaan nu verder met de eigenlijke programmacode, het doel van deze pagina.
Bij het gooien van de taart gaan we eerst controleren of iemand een bestaande speler is. iemand is het derde argument en die geef je in het programma aan met het woord iobj.
Voor de controle gebruiken we een if-constructie, die de volgende syntaxis heeft:
if (voorwaarde)
[programmacode]
[elseif (voorwaarde)]
[programmacode]
[else]
[programmacode]
endif
(Merk opnieuw de rechte haken op; alles daartussen mag je eventueel weglaten...)
Als de voorwaarde achter if waar is, dan wordt de bijbehorende programmacode uitgevoerd, zoniet dan wordt, als voorwaarde achter elseif waar is, de programmacode uitgevoerd die daarbij hoort. Als geen enkele voorwaarde waar is, dan wordt de programmacode na else uitgevoerd.(Opmerking: Er zijn meerdere elseif-onderdelen toegestaan.)
De controle waar ik het net over gehad heb, schrijf je als volgt:
if ($object_utils:isa(iobj, $player))
endif
Deze voorwaarde zal ik verder niet uitleggen, omdat ik dat te ver vind gaan voor een beginnend programmeur.
Wel wil ik even de reactie van Capi(onze alom bekende archwizard) aan jullie voorleggen: Om snel te kijken of iets een speler is kan je ook is_player(iobj)
oproepen. (Dat verb geeft alleen wel een foutmelding als iobj geen
geldig object is)
Met valid(iobj) kan je dat checken.
$capi_utils:is_character(iobj) Geeft aan of iobj een aanwezige speler of
een AI speler is.
Nu gaan we controleren of de persoon die de taart gooit (Deze wordt in het programma aangegeven met player) hem wel op zak heeft. Doorgewinterde bewoners kunnen er namelijk voor zorgen, dat ze een voorwerp gebruiken die ze niet hebben en dat is niet de bedoeling.
Tegelijkertijd stellen we als voorwaarde dat de persoon die de taart gooit zich in dezelfde ruimte moet bevinden als de persoon waarnaar de taart gegooid wordt, door een && tussen de voorwaarden te zetten.
We krijgen de volgende programmacode:
if ($object_utils:isa(iobj, $player))
if (player == this.location && player.location == iobj.location)
endif
endif
Waarvoor geldt: player is de persoon die de taart gooit this.location is de plaats waar de taart is player.location is de plaats waar player is iobj.location is de plaats waar het 'slachtoffer' is == betekent 'is gelijk aan'
Nu hebben we genoeg gecontroleerd, zodat we kunnen gaan beschrijven wat er gebeurt als je de taart gooit:
1) wordt als volgt gegeven; player:tell("Je gooit een slagroomtaart naar ", iobj:title(), ".");
Waarvoor geldt: player:tell("tekst"); betekent 'zeg tegen de dader tekst'. (Vergeet de puntkomma niet!) iobj:title() een functie is die de naam van het slachtoffer (iobj) teruggeeft. Deze naam wordt tussen komma's tussen de rest van de tekst geplaatst. Vergeet vooral de spatie voor de functie niet, want anders krijg je een zin als Kai gooit een slagroomtaart naarLolario.
2) lijkt op 1) en wordt als volgt gegeven: iobj:tell(player:titlec, " gooit een slagroomtaart naar je!");
Waar iobj:tell("tekst") een functie is die tekst tegen het slachtoffer zegt. player:titlec() ongeveer hetzelfde doet als iobj:title() in 1). Het enige verschil is dat titlec() de eerste letter van de naam verandert in een hoofdletter.
3) is de volgende regel: player.location:announce_all_but({player, iobj}, player:titlec(), " gooit een taart naar ", iobj:title(), "." );
Waarvoor geldt: player.location is de plaats waar player is. plaats:announce_all_but({[speler]}, "tekst"); Aan iedereen op plaats, behalve speler "tekst" vertelt. speler kan er ook meer dan een zijn, gescheiden door komma's.
Nu gaan we iets aan de beschrijving van het slachtoffer toevoegen met het commando smeer().
4) Ziet er als volgt uit: iobj:smeer(iobj.psc + " zit onder de slagroom."); iobj:smeer("tekst"); voegt tekst aan de beschrijving van het slachtoffer (iobj) toe. iobj.psc haal ik uit het feature dat ik je op het begin heb laten toevoegen. Het feature kijkt of iobj een man of een vrouw is en geeft het onderstaande rijtje.
iobj.psc -- Hij/Zij
iobj.ps -- hij/zij
iobj.ppc -- Zijn/Haar
iobj.pp -- zijn/haar
iobj.poc -- Hem/Haar
iobj.po -- hem/haar
iobj.prc -- Zichzelf/Haarzelf
iobj.pr -- zichzelf/haarzelf
Alles wat er nu nog overblijft is het verplaatsen van de taart.
5) wordt geschreven als: this:moveto(iobj);
Oftewel 'verplaats de taart naar het slachtoffer (iobj)'.
Het gehele programma komt er dan als volgt uit te zien:
if ($object_utils:isa(iobj, $player))
if (player == this.location && player.location == iobj.location)
player:tell("Je gooit een slagroomtaart naar ", iobj:title(), ".");
iobj:tell(player:titlec(), " gooit een slagroomtaart naar je!");
player.location:announce_all_but({player, iobj}, player:titlec(), " gooit een taart naar ", iobj:title(), "." );
iobj:smeer(iobj.psc + " zit onder de slagroom.");
this:moveto(iobj);
endif
endif
Ik voeg nu alleen nog een foutmelding toe, die gegeven wordt als de geven iobj (derde argument) geen speler is. Het volledige programma wordt dan (Met gebruik van @program):
@program taart:gooi
if ($object_utils:isa(iobj, $player))
if (player == this.location && player.location == iobj.location)
player:tell("Je gooit een slagroomtaart naar ", iobj:title(), ".");
iobj:tell(player:titlec, " gooit een slagroomtaart naar je!");
player.location:announce_all_but({player, iobj}, player:titlec(), " gooit een taart naar ", iobj:title(), "." );
iobj:smeer(iobj.psc + " zit onder de slagroom.");
this:moveto(iobj);
endif
else
player:tell("Dat is geen bestaande speler!");
endif
.
Als alles goed is gegaan, dan heb je nu een slagroomtaart gemaakt, die je kunt gooien met bijv. gooi taart naar Lolario
Mocht je verder nog vragen hebben, dan kun je ze aan mij stellen als ik (Lolario) in Nowmoo aanwezig ben. Verder sta ik altijd open voor opmerkingen over deze pagina en suggesties voor het land achter de spiegel (Nowmoo).