Struktur eines EL – Projekts

Bild: Computer

Die Struktur eines Efferdland Projektes unterscheidet sich von diversen anderen MUDs. Deshalb ist es für wechselwillige Magier aus anderen MUDs manchmal etwas schwierig, sich anfangs im Efferdland zurecht zu finden.

Wenn man kein eigenes Home-Mud zur Verfügung hat, kann man auch direkt im Efferdland Programmieren. Hierzu gibt es die Region /d/work/. Ein Regionsmagier legt Dir dort Dein Projekt Verzeichnis an und gibt Dir die nötigen Schreibrechte. Deine Files kannst Du dann mit einem FTP-Programm übertragen. Der FTP Port des Efferdlands lautet ‘6666’.

In Deinem neuen Arbeitsverzeichnis /d/work/<mein projekt>/ findest Du die Unterverzeichnisse für Objekte ( obj/ ), Monster ( npc/ ) und Räume ( room/ ).

Waffen und Rüstungen liegen aber nicht dort, sondern befinden sich im Efferdland in /p/armour/ bzw. /p/weapon/. Auf unser Beispiel Projekt bezogen wären das

  1. /p/armour/work/<mein_projekt>/ für Deine Rüstungen
  2. /p/weapon/work/<mein_projekt>/ für Deine Waffen.

Im Efferdland benutzen alle Magier die selben Header-Files, um für alle identische Defines für die Pfade zu erhalten. Das macht die spätere Fehlersuche einfacher und man kann ganze Projekte ohne größere Anpassungen in andere Regionen verschieben.

Dafür legt man sich in seinem Wurzelverzeichnis in /d/work/<mein_projekt>/ eine Datei def.h an (wenn das der zuständige Regionsmagier nicht schon alles für Dich erledigt hat) und bindet die ../region.h ein. Zusätzlich muss man in def.h noch ein paar Anpassungen machen. Z.B. musst Du Deinen Magiernamen eintragen und den Verzeichnisnamen Deines Projekts. In unserem Beispiel wäre das ‘mein_projekt’.

Beispiel für die def.h:

#ifndef __MEIN_PROJEKT_H__
#define __MEIN_PROJEKT_H__

#define MAGIERNAME "manwe"
#define GEBIET     "mein_project"

#include "../region.h"

#endif

Nun hast Du folgende Defines zur Verfügung:

  1. WEAPON : Waffen in /p/weapon/work/<mein_projekt>/
  2. ARMOUR : Rüstungen in /p/armour/work/<mein_projekct>/
  3. NPC : Monster in /d/work/<mein_projekt>/npc/
  4. OBJ: Objekte in /d/work/<mein_projekt>/obj/
  5. ROOM : In /d/work/<mein_projekt>/room/

Willst du jetzt z.b. ein NPC in Deinen Raum einbinden, geht das wie folgt:

#include "../def.h"

inherit "/std/room";

protected void create() {
  ::create();
  SetProp(P_INT_SHORT, "Ein Raum");
  SetProp(P_INT_LONG,  "Ein Raum.");

  // mein_monster.c aus /d/work/mein_projekt/npc/
  AddItem(NPC "mein_monster", REFRESH_DESTRUCT);
}

Viele Magier binden auch einfach diverse System-Defines in ihr def.h ein, damit sie das nicht jedes mal in ihr Programm schreiben müssen. Da kann man sich drüber streiten, ob das gut oder schlecht ist, das sollte jeder aber für sich entscheiden. Das sähe dann so aus:

#ifndef __MEIN_PROJEKT_H__
#define __MEIN_PROJEKT_H__

#define MAGIERNAME "manwe"
#define GEBIET     "mein_projekt"

#include "../region.h"

#include <v_compiler.h>
#include <properties.h>
#include <moving.h>
#include <jewel.h>
#include <kneipe.h>
#include <bank.h>
#include <quest.h>
#include <mudmaster.h>
#include <sequence.h>
#include <living/bskills.h>

#endif

Zum Schluss erwähne ich hier noch einem die Standard Files, die viele Magier anlegen. Das kann beispielsweise ein Standard Monster oder ein Standard Raum sein. In solchen Standard Files werden oftmals Dinge eingetragen, die sich ständig wiederholen, um sie nicht doppelt und dreifach schreiben zu müssen.

Im Efferdland ist es wichtig, dass solche Standard Files in einem Unterverzeichnis std/ liegen. Für STD-Räume ist das wichtig, damit sie sich nicht in die Efferdland-Karte eintragen, für STD-Monster, damit ihnen kein Erstkill zugewiesen wird.

Beispiel für einen Raum in /d/work/mein_projekt/room/

Man legt zuerst eine neues Verzeichnis an. Für einen Raum wäre das /p/work/<mein_projekt>/room/std/

In diesem Verzeichnis erstellt man dann seinen STD-Raum, in unserem Fall /p/work/<mein_projekt>/room/std/raum_std.c

#include ../../def.h"

inherit "/std/room"; // Dies ist ein STD-Raum, den die
                     // Mudlib zur Verfügung stellt

protected void create() {
  ::create();
  SetProp(P_INT_SHORT,"Ein STD-Raum");
  SetProp(P_INT_LONG, "Ein STD-Raum");

  AddDetail(({"boden","fussboden"}),
  "Der Boden ist unter deinen Fuessen.");
}

Dann schreibt man seinen Raum in /d/work/mein_project/room/raum.c

#include "../def.h"

inherit ROOM "std/raum_std";  // Hier binden wir den STD-
                              // Raum ein.

protected void create() {
  ::create();
  SetProp(P_INT_SHORT,"Ein Raum");
  SetProp(P_INT_LONG, "Ein Raum.");
}

Unser raum.c in /d/work/mein_project/room/ besitzt jetzt auch das Detail ‘boden’ und ‘fussboden’, so dass dieses nicht ständig neu mit dem selben Wortlaut in raum.c geschrieben werden muss. Sowas sollte man aber nicht zu oft machen, da dann Deine Gegend schnell langweilig wird.