Please note that I have moved my site! It is now hosted by ProHosting.

Navigation: Table of Contents, Index, next: Noom, prev: MUSH-Programmierung in Imbris, Teil 1, up: Imbris für Newbies

MUSH-Programmierung in Imbris, Teil 2

Ich spiele nicht mehr im Imbris MUSH. Erstens habe ich keine Zeit mehr dafür, und zweitens gab es mir zuwenig Spieler dort. Das ist schade, denn von der Idee her hat Imbris mich damals (1997/98) total begeistert.

Dies ist die zweite Seite mit Beispielen zum Programmieren. Auf der ersten Seite ist der Aufbau des Ladens erlkährt. Alle Bemerkungen zum Code, zum MUSH etc. befinden sich auf der ersten Seite.

Auf dieser Seite finden sich code Beispiele für:

  1. Ein komplizierter Gegenstand
  2. Ein Verkäufer
  3. Lasst uns den Typ ausschmücken

Ein komplizierter Gegenstand

Wir machen uns jetzt eine Trommel. Dies wird die Trommel sein, die man im Trommelladen kaufen kann. Wie man anfängt wurde schon auf der ersten Seite gezeigt:

@create Drachentrommel

@desc Drachentrommel=Die Drachentrommel ist fast mannsgross, ein riesiges, schweres Ungetuem. Die Trommel ist mit grandiosen MUSTER verziert. Wenn man in der Naehe der Drachentrommel steht, spuehrt man ihre Praesenz wie eine gewichtige, bewegungslose Masse im Raum.

@odesc Drachentrommel=bewundert die riesige Drachentrommel.

&DETAIL_MUSTER Drachentrommel=Um die Trommel zieht sich ein breites, schwarz-rotes Ungetuem von einem Drachen. Zaehnefletschend, feuerspuckend, Boden peitschend, fauchend wild ist er! Mit ihm ringt ein kleiner, zaeher Mann. Sein Gesicht ist nicht zu sehen. Anscheinend ist dies Uurd's Kampf gegen den Lindwurm Hurgh'Kcht, doch woran ein Tandrisch Drachen voneinander unterscheiden kann, das wissen nur die Dunklen Steine.

Die Trommel soll nicht nur eine normale Trommel sein, sondern auch etwas interessantes mitzuteilen haben. Das Muster auf der Trommel erzählt ein wenig von den Tandrisch und ihren Legenden.

Nun folgen die Attribute, welche die normale Verwendung der Trommel bestimmen. Wie schon auf der ersten Seite ein paar Mal erwaehnt, kann man zu all diesen Befehlen mit help @odesc und so weiter Hilfe anfordern.

@succ Drachentrommel=Mit einem Aechzen hebst Du die Drachentrommel auf.

@osucc Drachentrommel=hebt die Drachentrommel mit einem Aechzen auf.

@asucc Drachentrommel=@emit Die Drachentrommel gibt einen dumpfen Ton von sich.

@drop Drachentrommel=Vorsichtig setzt Du die Drachentrommel wieder auf den Boden.

@odrop Drachentrommel=setzt die Drachentrommel vorsichtig wieder auf den Boden.

@adrop Drachentrommel=@emit Die Drachentrommel gibt einen dumpfen Ton von sich.

&BERUEHRUNG Drachentrommel=Die Drachentrommel wirkt kuehl und massiv. Sie scheint still vor sich hin zu schwingen.

Wenn ein Gegenstand ein paar eigene Befehle zur Verfügung stellt, dann sollten diese irgendwo erklährt werden. Persönlich bevorzuge ich hierfür das @use Attribut, da man als erstes sicher use Drachentrommel oder benutze Drachentrommel versuchen wird.

Bei der nun folgenden Anleitung sind die %r und %t codes besonders wichtig. %r bedeuted ein Return Zeichen, und %t ein Tabulator. Diese codes kann man auch beim Verschicken von Briefen oder dem Pinnen von Zetteln an die Bretter verwenden (siehe +hilfe bretter bzw. +hilfe post). Wenn man in einem Text, den man sagen will, oder den man verschicken will, ein %r als solches verwenden will, dann muss man %%r schreiben (beispielsweise ar Hast Du mir einen Tip: Soll ich %%# oder besser %%N verwenden?).

@use Drachentrommel=Mit der Drachentrommel kann getrommelt werden:%r%ttrommel laut%tTrommelt laut und wild%r%ttrommel leise%tTrommelt leise und sanft%rSowie der besondere Befehl:%rtrommel botschaft <person>=<text>%rDieser Befehl lässt der genannten Personen eine Trommelbotschaft zukommen.

&LAUT Drachentrommel=$trommel laut:@emit/room %N trommelt wie verrueckt auf der Drachentrommel!%rRATATATAMM! TAMM! TAMM! RATAMM! TAMM! TAMM!

&LEISE Drachentrommel=$trommel leise:@emit/room %N trommelt sanft auf der Drachentrommel:%rDumdadadumdadadummm. Dadumm. Dadumm. Dadumm dumm dumm.

Hierfür wurden sogennate $commands verwendet. Sobald ein Spieler nun den hinter dem Dollarzeichen angegebenen Text eintippt, wobei für die Sterne (*) irgenetwas stehen kann, wird die hinter dem Doppelpunkt angegebene Befehlsliste ausgeführt. Dabei wird für %0 der Text des ersten Sternes, für %1 der Text des zweiten Sternes etc. eingesetzt.

&BOTSCHAFT Drachentrommel=$trommel botschaft *=*: sende %0=;schlaege. [name(loc(me))] trommelt eine Botschaft:%rTamm. Datamm. Ratatatamm. Ratamm. Datamm.%r%1%rDammdatatamm ratamm.%rLeise verklingt die getrommelte Botschaft.

Hier kommt noch etwas neues hinzu: Funktionen. Normalerweise kann man Funktionen ein Befehlslisten einfach einfügen. Will man eine Funktion allerdings in einen Text einbetten (wie hier in den sende Befehl), dann muss die Funktion in eckige Klammern gesetzt werden. Was die Funktionen tun, erfährt man mit help name() und help loc().

Um von der Drachentrommel Kopien anfertigen zu können, benötigen wir noch folgenden Befehl:

@set Drachentrommel=PARENT_OK

Damit können wir nun neue Objekte (Trommeln) erschaffen lassen, und sie alle Eigenschaften von dieser Original Trommel erben lassen. Das spahrt Platz auf der Datenbank des MUSH.

Ein Verkäufer

Nun machen wir uns an den Verkäufer. Der Anfang ist wie gehabt:

@create Iloorg

@lock Iloorg=me

@desc Iloorg=Iloorg hat roetlich gefaerbte Haut, keine Haare, und er laeuft barfuss. Er ist der Verkaeufer hier im Trommelladen und zeigt Dir gerne die Sammlung von tandrischen Trommeln, die er hier auf Lager hat. Vor allem die mannsgrossen Drachentrommeln empfiehlt er waermstens. Iloorg ist sehr gespraechig und wird Dir gerne alle Fragen beantworten.

Damit Iloorg die Drachentrommel als Vorlage für seine verkauften Trommeln verwenden kann, teleportieren wir die Trommel in Iloorg hinein und machen ihn undurchsichtig, damit man nicht sehen kann, dass Iloorg die "Muttertrommel" trägt.

@tel Drachentrommel=Iloorg

@set Iloorg=OPAQUE

Um Iloorg noch ein wenig lebendiger aussehen zu lassen, können wir ein weitere Aktion für den Raum ausführen lassen. Aktionen werden auch auf der ersten Seite besprochen

&ACTION_2 here = Illorg laechelt.

Nun kommt der Verkauf der Waren. Unser Plan ist folgender: Wir verwenden ein $command um eine Trommel zu kaufen. Wenn man eine Trommel kauft, nimmt man bei Iloorg Schulden auf. Diese Schulden kann man mit IR Währung (Silberpfennige etc.) wieder abzahlen. Der folgende IR Währungs code ist ein Werk von Dariane.

Wir erzeugen eine neue Trommel und vererben ihr alle Eigenschaften der Muttertrommel, die wir vorher eben erzeugt haben. Die Nummer dieser vorher erzeugten Trommel war in meinem Fall #2547. Ganz wichtig ist, dass die neue Trommel keinerlei flags vom Mutterobjekt bekommt, deswegen müssen wir CHOWN_OK (damit Kunden die Trommel in Besitz nehmen können), DESTROY_OK (damit Kunden die gekauften Trommeln auch wieder zerstöhren können) und COMMANDS (damit die $commands der Trommel auch verwendet werden können) neu setzen.

&KAUFE Iloorg=$kaufe *trommel*: @pemit %#=Iloorg fuehrt Dich durch die Regale hin zu einer wunderbaren Drachentrommel. Sie ist Dein!; @wait me={ @create neue Trommel; @set neue Trommel=CHOWN_OK; @set neue Trommel=DESTROY_OK; @set neue Trommel=COMMANDS; @parent neue Trommel=#2547; drop neue Trommel; @name neue Trommel=Trommel; &RECHNUNG_%# me=add(v(RECHNUNG_%#), 12); @pemit %#=Iloorg sagt, "Du schuldest mir nun [u(BETRAG,v(RECHNUNG_%#))]."; @notify me; &KUNDEN me=cat(v(kunden), %N); @pemit %#=% * Du kannst die Trommel mit '@chown Trommel=me' in Besitz nehmen!}

&BETRAG Iloorg=u(#8/NAME_MONEY, u(#8/KU_TO_MON,%0))

Das BETRAG Attribut ist eine Funktion, es erhält eine Zahl als Parameter. Dieser Parameter ist der Betrag in Kupferpfennige, und die Funktion rechnet den um in die einzelnen Währungen. Der Aufruf dieser Funktion geschieht im BETRAG Attribut mittels u(BETRAG,xxx). Genauso ruft u(#8/KU_TO_MON,%0) die Funktion KU_TO_MON im Objekt #8 auf (versuche mal ex #8). Diese verwandelt den Betrag in Kupferpfennigen zu einem String um mit einer Zahl pro Muenzen Sorte (genauso wie er mit ex me/GELD angezeigt wird). Dieser String wird dann von NAME_MONEY verwendet, um eine schoene Textausgabe zu produzieren.

Die Schulden werden in Atributen gespeichert, welche die Form RECHNUNG_#<dbref des Kunden> haben, zum Beispiel RECHNUNG_#2555. Da man natürlich immer mehr Schulden bei Iloorg anhöufen kann, werden die neuen Schulden zu den alten hinzugezählt. Den Wert der alten Schulden des Kunden erhält man mit v(RECHNUNG_%#). Dazu kommen noch die neuen Schulden, in diesem Fall ein Silberpfennig, bzw. 12 Kupferpfennige: &RECHNUNG_%# me=add(v(RECHNUNG_%#), 12). Siehe auch help u() und help v().

Damit der MUSH nicht in Verwirrung geraet, wenn mehrere Trommeln gleichzeitig gekauft werden, wird hier die Technik von Semaphores gebraucht. Iloorg blockiert sich selber, wenn er gerade am erschaffen einer neuen Trommel ist, indem er "auf sich selber wartet": @wait me={ @create neue Trommel; ... @notify me; ...}. Der @notify Befehl erlaubt nun dem nächsten @wait me={...} mit der Ausführung fort zu fahren.

Damit Iloorg mit dem Verkauf anfangen kann, muss man ihm vor dem Kauf der ersten Trommel und nach jedem reboot einen @notify Befehl geben. Dies macht man mit dem @startup Befehl.

@notify Iloorg

@startup Iloorg=&KUNDEN me=; &OFFENE_FRAGEN me=; @drain me; @notify me

Damit wir selber auch einen überblick darüber erhalten, an wen Iloorg alles Trommeln verkauft hat, speichern wir die Namen aller Kunden in im KUNDEN Attribut. Für den Fall, dass wir einmal aufhören würden in Imbris zu spielen, soll diese Liste natürlich auch nicht unendlich lang werden. Deswegen wird sie bei jedem reboot gelöscht. Das OFFENE_FRAGEN Attribut wird weiter unten erklährt.

Nun kommen wir zum Rückzahlen der Schulden: Wenn man Illorg mit zahle/silber iloorg=1 oder einem ähnlichen Befehl IR Geld gibt, wird das AZAHLE Attribut ausgeführt. Dort prüfen wir nach, ob mit dem bezahlten Betrag immer noch zuwenig oder genug bezahlt wurde. Wenn genug bezahlt wurde, versuchen wir dem Kunden Wechselgeld zu geben. Damit dies möglich ist, muss Iloorg vorher natürlich noch genug IR Geld bekommen.

&AZAHLE Iloorg=@switch GTE(%0,v(RECHNUNG_%#))=0,{&RECHNUNG_%# me=sub(v(RECHNUNG_%#),%0);@pemit %#=Iloorg sagt, "Danke! Du schuldest mir noch [u(BETRAG,v(RECHNUNG_%#))]."},{@tr me/rueckzahle=%#,sub(%0,v(RECHNUNG_%#)); &RECHNUNG_%# me; @pemit %#=Iloorg sagt, "Danke, Du schuldest mir nichts mehr."}

&RUECKZAHLE Iloorg=@switch div(%1,144)=0,,{zahle/gold %0=[div(%1,144)]};@switch div(mod(%1,144),12)=0,,{zahle/silber %0=[div(mod(%1,144),12)]};@switch mod(%1,12)=0,,zahle/kupfer %0=[mod(%1,12)]

zahle/silber iloorg=20

zahle/kupfer iloorg=20

Lasst uns den Typ ausschmücken

Damit Iloorg nicht nur ein langweiliger Verkäufer ist, soll er auch ein paar Fragen über Noom und die Tandrisch beantworten können. Siehe auch +hilfe fragen. Interessant ist hier vor allem, dass Iloorg sich aufschreibt, welche Fragen er nicht beantworten konnte (auch diese Liste wird wie oben gezeigt nach einem reboot gelöscht). Auch solche Information kann man abfragen.

Wenn eine Figur mindestens eine Frage beantworten kann, dann sollte sie auch das FRAGE Attribut gesetzt haben, damit man bei einer unbekannten Frage trotzdem merkt, dass die Figur Fragen beantworten könnte! Oft ist es ganz angenehm, wenn man an dieser Stelle wenigstens ein paar Tips bekommt, was man die Figur überhaupt fragen kann.

&FRAGE Iloorg=@pemit %#=Iloorg bittet um Entschuldigung: "Da kann ich leider nicht helfen! Frage mich nach TROMMELN, DRACHEN, TANDRISCH, nach NOOM, nach der Liste der PREISE, nach Deinen SCHULDEN bei mir, oder auch ueber die TRAAMI und den FEUERVOGEL!"%rIloorg schreibt sich etwas auf.; &OFFENE_FRAGEN me=cat(v(offene_fragen), %0(%N))

&FRAGE_TANDRISCH Iloorg=@pemit %#=Iloorg sagt, "Dabriel Haldafest, der Mysteriarch, schrieb einmal folgendes: 'Als ich mir sicher war, das mir von den Tandrisch keine Gefahr drohte, sah ich sie mir genauer an und ich glaubte zu verstehen, wie all die Geschichten ueber sie entstanden waren. Feuerrot war ihre Haut und man fand kein einziges Haar auf ihren drahtigen Koerpern. Man merkte an ihnen das Leben im Gebirge, denn sie sahen in meinen Augen so zaeh aus wie das Leder der Stiefel, die ich trug. Auch die Kaelte schien ihnen nicht viel auszumachen, sie trugen nur einfache Leinenhemden und -hosen und ueberhaupt kein Schuhwerk. Ihre Gesichter waren kantig und wettergegerbt, gar nicht recht passend zu den guetigen, schwarzen Augen, die ihnen eigen waren.'"

&OFRAGE_TANDRISCH Iloorg=laesst sich in ein Gespraech mit Iloorg verwickeln.%rIloorgs lacht, zeigt auf sich selber und erzaehlt ein wenig.

etc...

&FRAGE_KUNDEN Iloorg=@pemit %#=Iloorg sagt, "Dies ist die Liste meiner bisherigen Kunden:%r[v(KUNDEN)]"

&FRAGE_OFFENEN_FRAGEN Iloorg=@pemit %#=Iloorg sagt, "Dies ist die Liste der Fragen (und der jeweiligen Fragestellern), auf die ich keine Antwort wusste: %r[v(OFFENE_FRAGEN)]"

&FRAGE_CODE Iloorg=Iloorg informiert ueber die Tandrisch und verkauft Trommeln.

&FRAGE_VERMOEGEN Iloorg=@pemit %#=Iloorg sagt, "Ich habe im Augenblick [v(GELD)]"


Navigation: Top, Table of Contents, Index, next: Noom, prev: MUSH-Programmierung in Imbris, Teil 1, up: Imbris für Newbies


http://hammer.prohosting.com/~gumbart/code2.html / Alex Schroeder <a.schroeder@bsiag.ch> / updated: 2000-01-24 / significant changes: 1999-06-14