Programmierhilfen und -zeugs

Ein kleines LPC-Tutorial

LPC ist eine Prorammiersprache, die zur Programmierung von MUDs eingesetzt
wird. UNItopia ist so ein MUD, das in
LPC geschrieben ist.
Dieses Tutorial soll dem schnellen Einstieg in LPC dienen.

Warum ein Datei-Header?

Der Dateiheader dient dazu, um schnell zu sehen, welche Datei man bearbeitet und
um nachvollziehen zu können wer wann welche Änderung an der Datei
durchgeführt hat.

Da viele Programmierer die Dateien über FTP bearbeiten, die Dateien also
temporär auf den Rechner des Programmierers geladen werden, kann es sein,
dass der temporäre Dateiname nicht mit dem eigentlichen Dateinamen im MUD
übereinstimmt.

// Beispiel fuer einen Dateiheader
// Datei: /w/dauffe/tutorial/beispiel1.c
// Autor: Dauffe@UNItopia (2005/06/18)
// Aenderungen: Dauffe (2005/06/19): neue Raumbeschreibung erstellt

Warum muss ich meinen Code dokumentieren/kommentieren?

Jeder bekommt am Anfang seiner Programmierlaufbahn beigebracht, seinen Code
ausreichend zu kommentieren. Das bedeutet nicht, dass jede Codezeile
kommentiert werden muss. Die Sachen, die offensichtlich sind, weil sie
grundlegend in jeder Datei vorkommen, muessen nicht kommentiert werden.
Sachen, die speziell sind, einem bestimmten Zweck dienen, der nicht sofort
ersichtlich ist, die müssen kommentiert werden.

Die Beispiele auf dieser Seite werden unnötig viele Kommentare erhalten,
damit der LPC-Anfänger sieht, wofür die einzelnen Sachen gut sind.

Wie erstelle ich einen eigenen Raum?

Räume sind ganz wichtig in einem MUD, denn wo sonst bewegen sich die
Spieler, wenn nicht in einem Raum. Ein Raum kann alles mögliche sein,
z.B. ein Innenraum, eine Straße, ein Ozean…

// Datei: /w/dauffe/tutorial/beispiel1.c// Autor: Dauffe@UNItopia.de (2005/06/18)

inherit

„/i/room.c“

;

// hier werden die grundsaetzlichen Eigenschaften und// Funktionen eines Raumes „geerbt“. Das inheriten bietet// den Vorteil, dass wir die ganzen Grundfunktionen eines// Raumes nicht selbst immer wieder neu erstellen// muessen.void

 reset() {}

// Die Reset-Funktion wird vom MUD-Driver ca. alle 20// Minuten aufgerufen. Im Reset kann man zum Beispiel// ueberpruefen ob bestimmte Sachen noch im Raum liegen,// die dort liegen sollen.void

 create()
{

// Die Funktion set_long() ist in /i/room.c definiert. Da wir diese Datei// inheritet haben, steht uns diese Funktion hier zur Verfuegung.// In dieser Funktion legen wir fest, was der Spieler sehen soll, wenn er// in diesem Raum steht.

    set_long(

„Du stehst in einem leeren Raum. Hier siehst du nichts ausser““ grauem Licht.“

);

// ^// |- Dieses Leerzeichen ist wichtig, sonst sieht der Spieler spaeter// folgendes: … Hier siehst du nichts aussergrauem Licht.// Folgende Funktion ist eine Kurzbeschreibung des Raumes. In Unitopia// kann der Spieler selbst entscheiden, ob er diese sehen moechte oder// nicht. Wichtig ist, dass am Ende der Kurzbeschreibung kein Punkt ist,// da dieser vom MUD-Driver angefuegt wird und der Spieler sonst zwei// Punkte angezeigt bekommt.

    set_short(

„Ein leerer Raum“

);

// Die naechste Funktion legt fest, was der Spieler in diesem Raum riechen// kann. Wenn man dieser Funktion keinen Wert zuweist, bekommt der Spieler// eine Standard-Meldung angezeigt, die vielleicht so aussehen kann: „Du// riechst nichts besonderes.“

    set_smell(

„Es riecht hier nach Erdbeeren.“

);

// Nun legen wir fest, wass ein Spieler in diesem Raum hoeren kann.// Ebenfalls wird hier, wenn wir der Funktion nichts zuweisen, an den// Spieler eine Standard-Meldung ausgegeben.

    set_noise(

„Du hoerst ein Klappern und Haemmern wie in einer Schmiede.“

);

// Als letztes geben wir dem Spieler noch die Moeglichkeit in diesem Raum// etwas zu fuehlen.

    set_feel(

„Du fuehlst dich ganz unwohl hier, da du keinen Ausgang aus diesem““ Raum entdecken kannst.“

);
}

In vorigem Beispiel fehlt natürlich etwas ganz wichtiges: Der Spieler
steht in diesem Raum,sieht etwas, kann Sachen hören, riechen und sogar
etwas fühlen. Aber wie ihm sein ungutes Gefühl schon sagt: er kann
diesen Raum nicht verlassen. Wir müssen also Ausgänge zur
Verfügung stellen.

// Datei: /w/dauffe/tutorial/beispiel2.c// Autor: Dauffe@UNItopia (2005/06/18)

inherit

„/i/room.c“

;

void

 create()
{

// Hier gibt es jetzt viel weniger Kommentare, da wir ja schon im ersten// Beispiel gelernt haben, was verschiedene Sachen bedeuten.

    set_short(

„Ein Raum mit einer Dornenhecke und einem Weg“

);
    set_long(

„Du befindest dich hier in einem Raum, der schon viel interessanter ist als““ der vorherige. Am Boden siehst du naemlich einen Kiesweg, der nach Norden““ fuehrt. In saemtliche anderen Richtungen ist dir der Weg durch eine““ grosse und undurchdringliche Dornenhecke versperrt.“

);
    set_smell(

„Es riecht hier nach Rosen.“

);
    set_noise(

„Du hoerst Stimmengewirr, dass aus dem Norden zu kommen scheint.“

);
    set_feel(

„Du fuehlst eine unwiderstehliche Anziehungskraft nach Norden gehen zu““ wollen.“

);

// So jetzt sind wir soweit dem Spieler auch tatsaechlich einen Ausgang// anzubieten:// Dazu nutzen wir die Funktion add_exit(), die einen Ausgang zum Raum// hinzufuegt. Dieser Funktion werden zwei Parameter uebergeben, die durch// ein Komma getrennt werden:// Der erste Parameter ist die Datei, welche den Raum beschreibt, in den der Spieler// gehen kann,// der zweite Parameter gibt an, in welche Richtung der Spieler gehen muss, damit er// in diesen Raum kommt.

    add_exit(

„beispiel3.c“

,

„norden“

);
}

Was sind v_items?

Das zweite Beispiel beschreibt einen Raum, in dem der Spieler einen Weg und
eine Hecke sieht. Wenn der Spieler nun die Hecke und den Weg genauer
betrachten will, dann wird er in Unitopia die Meldung bekommen:“Weg nicht
gefunden.“ oder „Hecke nicht gefunden.“. Das ist für den Spieler
natuerlich eine unbefriedigende Situation, schliesslich wird ja behauptet,
dass hier ein Weg und eine Hecke zu sehen seien.
Hier kommen jetzt die v_items ins Spiel. Diese bieten die Möglichkeit
eben genau solche Besonderheiten des Raumes näher zu beschreiben.
Ein v_item ist kein eigenständiges Objekt sondern nur ein Detail des
Raumes, welches gesondert betrachtet werden kann und eigene Eigenschaften wie
Geruch oder Geraeusch besitzen können.

// Datei: /w/dauffe/tutorial/beispiel2v_item.c// Autor: Dauffe@UNItopia (2005/06/18)

inherit

„/i/room.c“

;

void

 create()
{
    set_short(

„Ein Raum mit einer Dornenhecke und einem Weg“

);
    set_long(

„Du befindest dich hier in einem Raum, der schon viel interessanter ist als““ der vorherige. Am Boden siehst du naemlich einen Kiesweg, der nach Norden““ fuehrt. In saemtliche anderen Richtungen ist dir der Weg durch eine““ grosse und undurchdringliche Dornenhecke versperrt.“

);
    set_smell(

„Es riecht hier nach Rosen.“

);
    set_noise(

„Du hoerst Stimmengewirr, dass aus dem Norden zu kommen scheint.“

);
    set_feel(

„Du fuehlst eine unwiderstehliche Anziehungskraft nach Norden gehen zu““ wollen.“

);

    add_exit(

„beispiel3.c“

,

„norden“

);

// Hier fuegen wir nun zwei v_items ein. Eines fuer den Weg und eines fuer// die Dornenhecke.

    add_v_item( ([

// Der Name ist das, was angezeigt wird, wenn jemand das v_item betrachtet,// daran riecht, daran fuehlt…„name“

  :

„weg“

,

// Die ID ist unter welchem Namen man das v_item ansprechen kann,// in diesem Fall nur mit „weg“„id“

    :

„weg“

,

// Das Geschlecht sorgt dafuer, dass das v_item mit dem richtigen// Artikel und dem richtigen Fall angezeigt wird. // z.B. „Dauffe betrachtet den Weg.“„gender“

:

„maennlich“

,

// Das „long“ beinhaltet die Beschreibung, was jemand sieht, wenn er// das v_item betrachtet.„long“

  :

„Der Weg ist mit weissen Kiesel bestreut, die von jemandem sorgfaeltig““ geharkt wurden.“

,

// Das „feel“ beschreibt, was jemand fuehlt, wenn er das v_item betastet.„feel“

  :

„Du fuehlst die glatten, runden Kieselsteine, mit denen der Weg““ bestreut ist.“

,

// „smell“ beschreibt, was jemand riecht, wenn er an dem v_item riecht.„smell“

 :

„Du nimmst den Geruch von feuchter Erde wahr.“

,

// „noise“ beschreibt das Geraeusch, das man hoert, wenn man an dem// v_item lauscht.„noise“

 :

„Du hoerst das Knirschen der Kiesel als du dich herunter kauerst um““ an dem Weg zu lauschen.“

,

// „take“ beschreibt die Meldung, die der Spieler bekommt, wenn er// versucht das v_item zu nehmen. Was nicht geht, da es nicht wirklich// als Objekt existiert, sondern nur ein Teil der Raumbeschreibung// ist, den man mit einem eigenen Namen ansprechen kann.„take“

  :

„Du besinnst dich gerade den Weg zu nehmen. Worauf solltest du laufen““ wenn der Weg nicht mehr da waere?“

        ]) );

// Nun das v_item fuer die Hecke:

    add_v_item( ([

„name“

  :

„dornenhecke“

,

// Hier kommt jetzt ein Unterschied zum Weg: die Hecke kann man mit// zwei verschiedenen Woertern ansprechen: Hecke und Dornenhecke.„id“

    : ({

„hecke“

,

„dornenhecke“

}),

„gender“

:

„weiblich“

,

„long“

  :

„Eine Hecke aus dichten Zweigen mit grossen, gruenen Blaettern und““ dicken, spitzen Dornen auf den Zweigen.“

,

„feel“

  :

„Die Dornen auf den Zweigen stechen in deinen Finger.“

,

„smell“

 :

„Die Hecke duftet wie frisches Laub.“

,

„noise“

 :

„Du hoerst das Rascheln der Blaetter.“

,

„take“

  :

„Du willst die ganze Hecke nehmen? Das gelingt dir nicht.“

        ]) );
}

Man sieht recht schnell, dass die nähere Beschreibung eines Raumdetails
weitere Details nach sich ziehen kann. Man kann sicher all diese Detail als
v_items abbilden, sollte sich jedoch die Frage stellen, bis zu welchem Punkt
das sinnvoll erscheint. In unserem Beispiel könnte man eventuell noch die
Dornen der Hecke näher beschreiben, aber noch weiter ins Detail zu gehen
wäre eher nicht sinnvoll.

Räume mit Türen

Bisher haben wir gesehen wie man einen Raum beschreibt und mit
zusätzlichen Details ausstattet. Ebenfalls wissen wir, wie man zwei
Räume mit einander verbindet, so dass sich der Spieler in unserer Welt,
die wir gestalten wollen bewegen kann.
Als nächstes schauen wir uns an wie man einen Raum mit einer Tür
versieht.

Fortsetzung folgt…

Vim

Mein Lieblingseditor, da auf Windows, Linux und MacOSX verfügbar.

Vim: downloads

Mein colorsheme: anschitech.vim
Meine vimrc: vimrc

Inhaltsverzeichnis