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 kann.
// 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