Schnelleinstieg ins EL

Bild: Würfel

Hallo,

da ich immer wieder erlebe, dass Anfänger im Spiel wenig Lust haben, sich durch lange Anleitungen zu quälen und dann sehr schnell nicht weiter wissen, habe ich hier eine Kurzanleitung für den Schnelleinstieg verfasst.

Zuerst musst Du Dich natürlich in das Spiel Efferdland anmelden. Das geht über diesen Link. Über kurz oder lang wirst du dir aber ein eigenes Programm zum Spieler zulegen, wie z.B Mutlet.

Bist Du diesem Link gefolgt, öffnet sich das Fenster zum Anmelden. Dort gibst Du Dir einen Namen, der noch nicht vergeben ist, oder wählst für ein kurzes Reinschnuppern ‘gast’ und folgst den Anweisungen.

Nun bist Du im Efferdland.

Wenn Du wissen willst, wo Du dich gerade aufhältst, so tippe: schau

Wenn Du etwas sagen möchtest, dann tippe: sag Hallo

Wenn Du mit allen Spielern reden willst, dann tippe: -a Hallo! (-a ist eine sogenannte Ebene, vergleichbar mit einem Chatroom, hier kannst Du alles fragen, was Dir in den Sinn kommt.)

Wenn Du Dich bewegen willst, dann tippe die Richtung, z.B. osten (kurz: o)

Wenn Du etwas untersuchen möchtest, z.B. den Boden: untersuche Boden (kurz unt)

Wenn Du ein Monster bei Dir in der Nähe siehst und diesem etwas fragen möchtest, dann tippe: frage monster nach frage.

Wenn etwas im Raum herum liegt, das Du haben willst, dann tippe: nimm gegenstand.

Wenn Du den Gegenstand untersuchen willst, dann tippe: unt gegenstand (untersuche anfangs einfach alles, was du entdeckst)

Wenn Du wissen willst, was Du dabei hast, dann tippe: inventar (kurz i)

Wenn Dir die Ansicht zu farblos ist, dann tippe: farben

Eine Übersicht über die Befehle bekommst Du mit: hilfe

Eine detaillierte Übersicht mit: hilfe befehl

Wir helfen Dir gerne auf der Ebene -a wenn Du Fragen hast! Bitte beachte, dass es im Efferldand keine Umlaute gibt, also schreibe für ö: oe, ä:ae, ß: ss usw.

LG, It@Efferdland


Informiert bleiben

Bild: Social

Hallo,

um die Entwicklung des Efferdlands zu verfolgen, kann man natürlich unsere Webseite regelmäßig nach neuen Einträgen durchforsten, oder direkt im Spiel die Ingame Zeitung lesen.

Wer aber nichts verpassen möchte, für den gibt es nun 3 Möglichkeiten, immer auf dem Laufenden zu bleiben.

1. Unseren RSS Feed. Dieser ist zu erreichen unter: https://efferdland.de/feed/

Dafür ist natürlich ein RSS Reader nötig, den gibt es quasi für alle aktuellen Betriebssysteme, auch für Smartphones mit Android oder iOS. Eine Liste von RSS Reader für alle möglichen Systeme findet sich hier.

2. Unsere Facebook Seite findet sich unter https://facebook.com/Efferdland.

Um diese Seite zu sehen, muss man natürlich bei Facebook angemeldet sein.

3. Unser Telegram Channel.

Telegram ist ein Messanger, ähnlich Whatsapp. Um über Telegram informiert zu werden, einfach in Telegram nach ‘Efferdland’ suchen und unserem Channel beitreten. Telegram gibt es ebenfalls für alle aktuellen Betriebssysteme, auch für Smartphoes mit Android oder iOS.

Mehr zum Telegram Messanger findet sich hier.

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

Neue Zweigstelle der Abenteurer Gilde

Bild: Elfenbäume

Hallo,

nun haben auch die Elfen im Wald unweit der Ebene in ihrer Siedlung weit oben in den Bäumen eine eigene Zweigstelle der Abenteurer Gilde.

Besonders für die Anfänger unter den Elfen dürfte diese Zweigstelle ein enormer Komfortgewinn sein.

Viel Spaß wünscht Euch It@Efferdland

NPC Firstkill Nummern

Bild: Cyberworld

Seit kurzem besitzt jeder (metzelbare) NPC eine eindeutige ID. Diese ID

  • wird vom Killmaster in jedem metzelbaren NPC gesetzt
  • kann im NPC über die Property P_NPC_KILL_NUM abgerufen werden. Die Property ist in /sys/npc/combat.h definiert.

Beispielweise ist die P_NPC_KILL_NUM von einem Drachen die 284.

Will man nun wissen, ob der Spieler diesen Drachen schon getötet hat, dann kann man das wie folgt realisieren:

public int test_kill(object pl) {
  if(objectp(pl) && interactive(pl)) {
   
    // Alle Kills des Spielers befinden sich in diesem
    // Bitfeld (String) direkt in Spielerobjekt
    string|int killbits = pl->GetKillBits();  

    // Noch keine Kills im Spieler gesetzt
    if(!stringp(killbits)) {
      return 0; 
    }
    // Testet auf die ID (284) unseres Drachen
    if(long_test_bit(killbits,284)) {
      
      // Drache bereits einmal getötet
      return 1;  
    } 
  }
  return 0;  // Drache noch nie getötet.
}

Man kann natürlich auch eine ganze Liste von NPCs anlegen und diese dann abfragen. Hier ein Beispiel mit einem Mapping:

protected mapping killmap = 
([
  284: "Drache 1",
  285: "Drache 2",
  400: "Drache 3",
]);

public int|int* test_kill(object pl) {
  if(objectp(pl) && interactive(pl)) {
    string|int killbits = pl->GetKillBits();

    if(!stringp(killbits)) {
      return 0; // Noch keine Kills im Spieler gesetzt
    }

    // Hier schreiben wir später unser Ergebnis rein
    int *ret = ({});

    // Durchlaeuft alle Keys des Mappings killmap
    foreach(int num:killmap) {

      // auf Key (num) testen
      if(long_test_bit(killbits,num)) {

        // falls bereits im Spieler gesetzt, dann in
        // einem Array eintragen, das wir später zurück
        // geben können. 
        ret += ({num});                    
      }
    }
    // Array mit allen NPCs aus killmap, die der Spieler 
    // bereits getötet hat, zurück geben.
    return num; 
  }
  return 0;
}

Ich hoffe, diese kleinen Beispiele regen etwas Eure Fantasie an. Damit kann man einige interessante Aufgaben schreiben. Ich selbst arbeite gerade an einen ‘Orden der Drachentöter’.

LG, It@Efferdland