Mindestanforderung für Räume

Bild: Nordland

Ein Raum ist eines der wichtigsten Elemente in einem Mud. Deshalb sollte man Räume gut beschreiben (Details) und gründlich programmieren, denn die Stimmung in einem Gebiet hängt fast ausschließlich von den Räumen ab!

Bemerkung:

Solche Details sollte es NICHT mehr geben:

  • der Boden ist unter deinen Fuessen.
  • die Decke ist über deinem Kopf.
  • tatsaechlich, es gibt hier auch Waende.

So etwas wie dies will wirklich niemand mehr lesen! Grundsätzlich ist ein Raum auch erst dann fertig, wenn der Befehl ‘ottest’ nichts mehr an fehlenden Details bemängelt. Schau Dir die Seite ‘Gebiete entwickeln‘ von Rhyan an, wenn Du nicht weißt, wie Du ein Gebiet aufziehen kannst.

Im Efferdland muss man den Räumen zudem einige Eigenschaften mitgeben, die es in anderen Muds nicht gibt. Beispiel hierfür ist das Terrain und das Environment (hier beschrieben). Diese Eigenschaften sind kein schöner Gag, sondern tatsächlich u.a. wichtig für die Rassen. Ein Elf beispielsweise heilt im Wald schneller als in der Wüste, ein Zwerg in der Unterwelt besser als im Wald…

Beispiel für einen Raum im Efferdland:

#include (...)

inherit "/std/room";

protected void create() {
  ::create();

  // Licht an
  SetProp(P_LIGHT,1);
  
  // der Raum ist draussen
  SetProp(P_INDOORS,0);

  // die Kurzbeschreibung
  SetProp(P_INT_SHORT,"Ein Waldpfad");

  // die Langbeschreibung
  SetProp(P_INT_LONG,
  "Dies ist ein Pfad in einem kuehlen, schattigen Wald.");

  // Die Details. ALLE Details müssen beschrieben sein.
  // Magier haben zum Testen den Befehl: ottest

  // Draussen IMMER: Himmel, Sonne, Wolken beschreiben
  // Innnen IMMER  : Wand, Waende, Decke beschreiben
  // IMMER         : Boden, Fussboden beschreiben!

  AddDetail(({"schatten"}),
  "Der Schatten ist schoen kuehl.");

  AddDetail(({"baum","baeume"}),
  "Maechtige Eichen ragen in den Himmel.");

  // hier ist das noch nicht vorbei. Baeume haben mind.
  // Blaetter, Aeste, Rinde, Wurzeln. Die auch beschreiben,
  // auch wenn sie nicht erwaehnt werden im Text!
  
  // hier wird ein Detail per Random ausgewählt:
  AddDetail(({"wald"}),
  ({
    "Neben dem Pfad wachsen maechtige Eichen.",

    "Dies ist ein Eichenwald.",
  }));

  // das Terrain. Sehr wichtig! Hier: Wald und Pfad
  SetProp(P_TERRAIN,T_FOREST | T_TRACK);

  // das Environment, ebenfalls wichtig!
  SetProp(P_ENVIRONMENT,
  ([
    ENV_TEMPERATURE :  3,    // 3 Grad, ziemlich kalt...
    ENV_ENVSPEED    :  1,    // Windstärken 1-12
    ENV_ALTITUDE    :  6,    // 6 Meter über Normal
    ENV_HUMIDITY    :  60,   // Luftfeuchtigkeit in %.
  ]);

  // Geräusche. Sollte es immer geben.
  AddSound(DEFAULT_SOUND,
  "Voegel zwitschern.");

  AddSound(({"vogel","voegel","zwitschern"}),
  "Traeller!");

  // Gerüche
  AddSmell(DEFAULT_SMELL,
  "Es riecht nach Pilze.");

  AddSmell(({"pilz","pilze"}),
  "Wie lecker! Hoffentlich hast Du eine Pfanne dabei!");

  // Hier geht es in den nächsten Raum:
  AddExit("osten", "raum2");
}

Bei Fragen kannst Du Dich gerne an It@Efferdand oder Torin@Efferdland wenden.

Gruß, It@chaos

Neues von der Lagerabeit

Bild: Lager

Hallo,

um das Abenteuer ‘Lagerarbeit’ zu bestehen, muss man eine Karte lesen können. Die ist aber in als Ascii-Karte realisiert und kann leider bei dieser Art von Abenteurer auch nicht geändert werden, so dass Spieler mit Sehproblemen dieses Abenteuer nicht lösen können. Das ist natürlich ärgerlich, da man die Punkte nicht bekommen kann.

Man kann das Abenteuer jetzt aber als Team (nicht zu verwechseln mit dem Teamkampf) bestehen. Der eine arbeitet im Lager, der andere steuert den Arbeiter.

Der Arbeiter lernt dabei das Kartenlesen. Missglückt ihm dies, kann der Helfer nicht helfen. Ebenso werden die Fähigkeiten des Helfers im Kartenlesen abgefragt. Beides muss also stimmen.

Damit dies alles auch funktioniert, benötigt der Arbeiter eine neue Karte von Tante Emma. Zudem müssen beide (Helfer und Arbeiter) einmal ‘ende’ gemacht und sich neu eingeloggt haben.

Es gibt noch eine weitere Bedingung: Der Arbeiter muss mindestens eine Woche lang den ‘einfachen Grafikmodus’ benutzt haben. Mal kurz hin- und herschalten ist also nicht möglich.

Gruß, It@Efferdland

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.

Firstkills bei den Wikingern

Bild: Langhaus

Hallo,

vielleicht hat sich schon jemand mal gewundert, wie viele verschiedene Wikingerwächter im Efferdland es doch gibt…

Früher brachten die Wächter aber nur einen Erstkill (für alle zusammen!).

Jetzt gibt es allerdings für jeden Wikingerwächter mit eigenem Namen  
einen Erstkillpunkt.

Es lohnt sich also, mal wieder im Wikingerdorf vorbei zu schauen.

Gruß, – It –

Bankprobleme behoben

Bild: Goldmünzen

Hallo,

die Bank des Efferdlands war in der Vergangenheit notorisch klamm bei Kasse.

Wir haben etwas an der Schrauben gedreht und einen kleinen Fehler behoben, so dass sich dieser Zustand jetzt bessern sollte und die Läden zukünftig nicht mehr so schnell pleite sind.

Die Bank muss sich noch etwas einspielen, was ein paar Tage dauern dürfte.

LG, It@Efferdland