Code: Valider NPC für das Efferdland (Properties)

Bild: Binär

Im Efferdland müssen NPCs bestimmte Properties enthalten. Leider werden immer wieder welche vergessen. Hier folgt ein NPC, den man als Vorlage benutzen kann, der die Properties enthält, die auf jeden Fall IMMER gesetzt werden müssen:

// npc.c - Ein minimaler NPC

#pragma strong_types

#include <properties.h>
#include <language.h>
#include <combat.h>
#include <moving.h>

inherit "/std/npc";

protected void create()
{
  if (!clonep()) {
    set_next_reset(-1);
    return;
  }
  ::create();
  
// Folgende Dinge MUESSEN IMMER gesetzt sein:

  // Setzt schonmal alle Grundwerte für einen NPC mit Level 5 mit
  // 80 Lebenspunkten
  create_default_npc(5,80); 

  // Die ID des Hasen, mit der man ihn bei 'untersuche', 'toete' etc
  // ansprechen kann.  
  AddId(({"hase","meister lampe","tier"}));

  // Der Name des NPCs
  SetProp(P_NAME,"Hase");

  // Das Geschlecht: NEUTER, MALE oder FEMALE
  SetProp(P_GENDER,MALE); 

  // Die Kurzbeschreibung, sieht man, wenn man im Raum 'schau' eingibt.
  SetProp(P_SHORT, "Ein Hase"); 

  // Die Langbeschreibung, sieht man, wenn man 'untersuche Monster'
  SetProp(P_LONG,"Ein grauer Hase."); 

  // Die Groesse in Zentimeter
  SetProp(P_SIZE,40);

  // Das Gewicht in Gramm
  SetProp(P_WEIGHT,3000);
  
  // Die Klassen, bitte richtig und möglichst komplett setzen, 
  // da sie im Spiel an vielen Stellen benutzt werden! Alle 
  // Klassen findet man in /sys/class.h
  // Bedeutungen: CL_FUR -> Hase hat Fell, 
  //              CL_ANIMAL -> Hase ist ein Tier,
  //              CL_WALKING -> Hase bewegt sie gehend fort,   
  //              CL_MAMMAL_LAND -> Hase ist ein Landsaeuger, 
  //              CL_RABBIT -> Hase ist ein Hase :)
  //              CL_BREATH_AIR -> Der Hase atmet Luft
  AddClass(({
    CL_FUR,
    CL_ANIMAL,
    CL_MAMMAL_LAND,
    CL_WALKING,
    CL_RABBIT,
    CL_BREATH_AIR
  }));

  // Die Rasse des Hasen
  SetProp(P_RACE,CL_RABBIT);

// Folgende Dinge sollten gesetzt werden.
 
  // Die Details des Hasen 
  AddDetail({"ohr","ohren"}),"Die Ohren sind enorm lang.");

  AddDetail(({"fell","hasenfell"}),"Das Fell ist grau.");

  // Womit greift der Hase an und wieviel Schaden macht er:
  // DT_WHIP -> Peitschender Schaden.
  // Alle Schaeden, die es gibt, kann man in /sys/combat.h
  // nachlesen.
  SetProp(P_HANDS,({ " mit seinen Ohren",30, DT_WHIP }));

  // Die Gesinnung des Hasen. Bei NPCs vom -1500 (satanisch)
  // bis +1500 (heilig)
  SetProp(P_ALIGN,300);

// Folgendes Sachen waeren schoen:
  // Die In-/Out- Medlungen

    // Meldungen bei 'normaler' Bewegung
  SetProp(P_MSGIN,    "hoppelt herein");
  SetProp(P_MSGOUT,   "hoppelt");

    // Bei Teleport, wo es keine Richtungen bei der Bewegung gibt
  SetProp(P_MMSGOUT,  "hoppelt davon");
  SetProp(P_MMSGIN,   "hoppelt herein");

  // Die Kampfpunkte, die ein Npc gibt. Muss man normalerweise
  // nicht setzen, da dies automatisch berechnet wird. Moechte
  // man aber eine Bonus darauf geben, geht das wie folgt (und
  // zwar IMMER GANZ AM ENDE VON CREATE! Im Beispiel: 1000
  // Bonus fuer den Kill.
  SetProp(P_XP,suggest_xp(1000));
}

Natürlich kann man noch viel viel mehr in einem NPC setzen. Wenn Du nicht weißt, wie etwas geht oder was noch möglich ist, einfach mal einen Magier Deiner Wahl im Efferdland fragen!

Gruß, It@Efferdland

Die Programmier – Gebote

Bild: Binär


Im Efferdland gibt es einige Regeln, an die man sich als Magier halten sollte.

Leider gibt es immer Programmierer, die nicht einsehen, warum sie sich daran halten sollten. Meist hört man dann Argumente wie: ‘Warum keine Tabs, bei mir sieht das doch gut aus’, ‘Warum nur 78 Zeichen pro Zeile, mein Monitor schafft das Vierfache’ oder ‘Warum soll ich die vordefinierten Defines benutzen’ etc.

Die einfache Erklärung für fast alle Regeln ist: Wir Programmieren im Efferdland mit den unterschiedlichsten Tools und mit verschiedenen Betriebssystemen. Manch einer benutzt einen einfachen Editor in einer Textkonsole, der andere eine IDE mit allem drum und dran. Daher müssen wir uns auf den kleinsten Nenner einigen und der ist in diesen Regeln zusammen gefasst:

1. Du sollst keine Tabs verwenden.

2. Du sollst nicht mehr als 78 Zeichen in eine Zeile packen.

3. Du sollst keine Klammern statistisch über das Programm verteilen. Man muss erkennen, welche Klammer zu welchem Befehl gehört.

4. Du sollst sauber einrücken. Hinter einer Klammer haben in der nächsten Zeile mind. 2 Leerzeichen zu folgen. (aber beachte Punkt 1!)

5. Du sollst, wo es geht, keine globalen Variablen benutzen.

6. Du sollst Deinen Funktionen und Variablen einen Typen zuweisen.

7. Du sollst die Defines aus /sys/ benutzen, auch wenn Du z.B. selbst weißt, dass NEUTER = 0 ist…

8. Du sollst keine call_outs starten, wenn du nicht überprueft hast, ob bereits ein call_out läuft.

9. Du sollst überpruefen, ob ein Spieler das Objekt, dass du in ihn bewegen willst, überhaupt noch tragen kann.

10. Du sollst keine Objekte in Geister bewegen (und beachte Punkt 9!).

11. Du sollst überprüfen, ob ein Objekt überhaupt existiert, bevor Du mit dem Objekt etwas anstellen willst. Beachte, dass dies auch und besonders für call_out-Funktionen gilt. Wenn Zeit verstreicht, kann ein Objekt zwischendurch zerstört worden sein.

12. Du sollst gut lesbar proggen, auch wenn du weißt, wie man proggt, damit niemand mehr den Code versteht (siehe Punkt 1 bis 7).

13. Du sollst in den Kopf einer Datei schreiben, wer sie wann geändert hat. (Beachte hierbei aber Punkt 1 und Punkt 2!)

14. Du sollst für ascii-Grafiken Alternativen für P_SIMPLE_MODE anbieten. AddDetail und AddReadDetal haben schon entsprechende Parameter, um dir die Arbeit zu erleichtern!

15. Du sollst Alternativen für P_SIMPLE_MODE anbieten, wenn du einem NPC oder Raum scheinbar etwas sagen lässt. Z.B. write(break_string(“Hallo”,0,”Der Mann sagt: “); lautet für P_SIMPLE_MODE:
write(break_string(“Hallo”,0,”Der Mann sagt:”,BS_INDENT_ONCE);
Teste dies! Das sind verschiedene Ausgaben, wenn der Text über mehrere Zeilen geht!

16. Du sollst keinen Müll hinterlassen. Lösche nach Beendigung deines Projektes in /d/ alle *.bat, *.bak, *.old, *.older, *.orig, *~ (und wie sie alle heißen) Files, entferne ebenso Verzeichnisse, die nicht mehr gebraucht werden oder auch Objekte, die Du gar nicht anschließen willst!

17. Du sollst für Befehle keine Defines benutzen. Kein BS, kein TP, kein TPN und TPn und TPU und wie sie alle heißen. Auch andere müssen evtl. deinen Code verstehen und debuggen können!

18. Du sollst, wenn du mit Geld arbeitest, die ZENTRALBANK benutzen. Wenn du nicht weißt, wie das geht, dann melde dich bei einem Magier, der dir helfen kann!

LG, It@Efferdland

Fehlende Erfahrungspunkte

Bild: Fehler


Moin moin,

wie der ein oder andere Spieler sicher merken wird, sind jetzt einige Erfahrungspunkte bei den Spielern verschwunden.

Erklärung:
Das Erlernen von Skills wie das Klettern oder das Kämpfen mit Waffen bringt Erfahrungspunkte. Jede Rasse hat bei den Skills einen Rassebonus, Elfen beim Klettern, Oger beim Furzen etc. Alles darüber hinaus muss man selbst lernen.

Dummerweise wurde seit der letzten Änderung dieser Rassebonus bei den Erfahrungspunkten mit eingerechnet, so dass schon ein neuer Spieler ohne etwas zu tun auf Stufe 5 erhöhen konnte.

Verständlicherweise musste ich diesen Bug beheben.

Gruß,

– It –

Magier: Nötige Anpassungen an Driver 3.5 Teil 1

Bild: Binär


Hallo zusammen!

Mit dem nächsten Reboot werden wir auf LD 3.5 updaten (aktuell 3.3).

LD 3.5 bringt eine Reihe von Vorteilen mit sich, u.a. das Konzept ‘unions’. Kurz gesagt ist dadurch ‘mixed’ überflüssig geworden. Eine manpage gibt es auch schon dazu: “man unions”.

Bedingt durch diese Veränderung des Compilers, könnte es nun sein, dass dadurch einige Objekte erstmal nicht mehr funktionieren (vor allem bei #pragma strong_types), denn zukünftig wird

string *hands = ({ ({ “feuer”, “eis”, “saeure” }) });

nicht mehr nur als EIN Array, sondern als ein Array in einem Array angesehen.
Die richtige Deklaration muss also in diesem Fall lauten:

string **hands = ({ ({ “feuer”, “eis”, “saeure” }) });

Falls ihr also vorhabt, demnächst etwas anzuschließen, achtet doch jetzt schon bitte auf die obigen Dinge.

Für Fragen wendet euch bitte an It oder mich.

Weiterhin viel Spaß beim Programmieren wünscht euch

Torin@Efferdland