Neu: Attribute & Co.


Hallo zusammen!

eine der wesentlichen Spielkomponenten sind die Attribute eines Spielers und alles, was dazugehört. Daher haben It und ich uns viele Gedanken darum gemacht, wie man

a) die Attributserhöhungen transparenter, und…
b) deutlichere Rassenunterschiede gestalten kann.

Als Ergebnis kam heraus:

  • Die Attributserhöhungen sind nur noch vom Spielerlevel abhängig (s. “hilfe attribute”). Da man die Art und Weise des Spielerlevel – Fortschritts weitgehend selber gestalten kann, bestimmt ihr damit auch selber eure Anzahl der Attributserhöhungen.

  • Die neue Attributsgrenze wurde für alle Attribute auf 23 angehoben.

  • Es wird zukünftig vier Quests geben, mit deren Belohnungen man zusätzliche Attributserhöhungen dazubekommen kann — frei wählbar. Mit diesen Quest-Boni kann man die Grenze auf 25 pro Attribut hochschieben. Später dann dazu mehr.

  • Die AttributsBONI jeder Rasse werden in naher Zukunft:
    • um zwei erhoeht und
    • neu sortiert.

Dies hat den Vorteil, dass wir die Rassenunterschiede mehr betonen können (s. “hilfe attributsboni”).

Die bekannten “alten” Monster zur Attributserhöhung sind geblieben, es ist aber nicht auszuschließen, dass neue hinzukommen.

Weiterhin viel Spaß beim Spielen wünscht euch

Torin

archer-2345211_1920

Debuggen mit dtell()


Hallo,

die Funktion dtell() ist für das Debuggen von Code gedacht. Sie ist in der secure/simul_efun.c definiert.

Syntax: dtell(mixed wem,mixed was,string idt);

wem
Magiername oder Array mit mehreren Magiernamen
was
Array, String, Mapping etc.
idt
Optionaler String, der jeder Zeile vorangestellt ist

Mit dtell() kann man sich eigene Texte oder die Inhalte von Variablen anzeigen lassen. dtell() ist AnderLand spezifisch, in anderen MUDs mag es andere Lösungen geben.

Vorteile von dtell(): Mit dtell() kann es nicht passieren, dass der Code buggt, wenn der debuggende Magier nicht anwesend ist. Vor dtell() wurden oft solche Konstrukte benutzt:

  • tell_object(find_player(“magiername”),”Meine Debugmeldug.\n”);
    Buggt, wenn der Magier ‘magiername’ nicht im AnderLand ist. Die Abfrage nach der Anwesenheit des Magiers wird gerne mal unterschlagen (z.B. aus Faulheit).

  • DD(x) tell_object(find_player(“magiername”)||this_object(), x)
    Hat den Nachteil, dass man das irgendwo definieren muss. Hat man kein zentrales Header-File, muss man das immer wieder irgendwo eintragen.

Es gibt bestimmt noch etliche andere Lösungen, doch alle sind irgendwie umständlich oder fehleranfällig.

Mit dtell() kann man Debugging z.B. so realisieren:

public void test()
{
  int i,j;
  mapping map;
  string *arr;

   i = 1;
   j = 2;

   map = (["test": 3]);

   arr = ({1,2,3});

   // Eine Meldung an It
   dtell("it","Mal schauen, ob das Programm bis hierher kommt.");
     // Das sieht dann wie folgt aus:
     //  [DTELL] /players/it/test/test
     //  [DTELL] Mal schauen, ob das Programm bis hierher kommt.

   
   // Eine Meldung an It und Harrypotter
   dtell( ({"it","harrypotter"}),"Meldung an mehrere Magier.");

   // Man kann sich natürlich auch eine Variable anzeigen lassen:
   dtell( ({"it"}),i);
     // Das sieht dann wie folgt aus:
     //  [DTELL] /players/it/test/test
     //  [DTELL] 1

   // Oder auch mehr als eine Vatiable:
   dtell( ({"it"}), ({ i,j }) );
     // Das sieht dann wie folgt aus:
     //  [DTELL] /players/it/test/test
     //  [DTELL] ({ /* #1, size: 2 */
     //  [DTELL]   1,
     //  [DTELL]   2
     //  [DTELL] })

   // natürlich kann man auch Arrays wie Mappings anzeigen:
   dtell( ({"it"}), map);
    // Das sieht dann so aus:
    //  [DTELL] /players/it/test/test
    //  [DTELL] ([ /* #1 */
    //  [DTELL]   "test": 3
    //  [DTELL] ])

   // oder alles auf einmal, indem man diese Variablen ebenfalls in ein
   // Array packt und sich dieses anzeigen lässt:
   dtell( "it", ({i, j, map, arr}) );
     // Das sieht dann so aus:
     //  [DTELL] /players/it/test/test
     //  [DTELL] ({ /* #1, size: 4 */
     //  [DTELL]   1,
     //  [DTELL]   2,
     //  [DTELL]   ([ /* #2 */
     //  [DTELL]     "test": 3
     //  [DTELL]   ]),
     //  [DTELL]   ({ /* #3, size: 3 */
     //  [DTELL]     1,
     //  [DTELL]     2,
     //  [DTELL]     3
     //  [DTELL]   })
     //  [DTELL] })

}

Fazit: Nicht verzweifeln und öfters mal dtell() benutzen 🙂

Gruß,

– It –

Befehle, die kaum jemand kennt


Hiho,

im AnderLand gibt es viele Befehle, die ein Spieler benutzen kann. Meistens sind sie dokumentiert, aber manche kennt man dennoch nicht. Hier ist eine kleine, nützliche Liste samt Anleitung:

  • ruestungen (kurz: ‘rue’)
    zeigt dir die Rüstungen samt Körperbereich an, die du momentan trägst.

  • whoami oder char
    praktisch, wenn man zeitgleich mit mehreren Spielern online ist. Zeigt dir in Kurzform an, wer du bist. Das sieht dann so aus: It – Fusselzwerg – Druiden.

  • msghist
    Zeigt die die Nachrichten an, die dir jemand per ‘teile mit’ gesendet hat. Default sind 21 Nachrichten, gibt man eine Zahl hinter ‘msghist’ an, kann man bis maximal 100 Nachrichten nachlesen.

  • tmhist
    Zeigt dir an, welchen Spielern du eine Nachricht gesendet hast.

  • untersuche
    Jaja, den Befehl kennt jeder. Aber kennt ihr auch:
    • untersuche karte in mir (die Karte, die ich dabei habe)
    • untersuche karte in raum (die Karte, die im Raum liegt)

  • kurzinfo
    zeigt dir deine Lebenspunkte und Magiepunkte als graphische Kurzanzeige

  • grafikmodus (normal | einfach)
    wechselt in einen anderen Graphikmodus, der ursprünglich für blinde Spieler entwickelt wurde. ‘einfach’: u.A. werden ASCII-Grafiken und die Info-Anzeige vereinfacht dargestellt. ‘normal’: die Std-Anzeige.

  • angriffsmeldung (aus | an)
    • ‘an’: Wenn an, dann wird dir immer angezeigt, mit welcher Waffe dich ein Gegner angreift.
    • ‘aus’: Es wird dir nur einmal angezeigt, mit welcher Waffe dich ein Gegner angreift. Danach erscheinen nur die Trefferanzeigen, bis der Gegener die Waffe wechselt und das ganze beginnt von vorne.

  • fehler, idee, typo
    Du meldest einen Fehler, eine Idee, die du hast, oder einen Typo (Rechtschreibfehler). Soweit, so gut, das kennt fast jeder. Aber was einige Spieler nicht zu kennen scheinen ist, dass du auch das Objekt angeben kannst, das du meinst. Ohne Objekt wird nämlich nur der Raum gemeldet, in dem du steht, also lieber bei Objekten:
    • fehler objekt:text, also: ‘fehler monstername:Hat keine Kurzbeschreibung’
    • idee object:text also: ‘idee fackel:Fackel brennt zu kurz’
    • typo object:text also: ‘typo schwert:Das Schwert_z_ in der Long’

Gruß,

– It –

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

Im AnderLand 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";

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
  create_default_npc(5); 

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

  // 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 -> Hase ist ein Saeugetier, 
  //              CL_MAMMAL_LAND -> Hase ist ein Landsaeuger, 
  //              CL_RABBIT -> Hase ist ein Hase 🙂

  AddClass(({CL_FUR,CL_ANIMAL,CL_MAMMAL,CL_WALKING,CL_MAMMAL_LAND, 
             CL_RABBIT}));

  // 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);

  // 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 AnderLand fragen!

Gruß,

– It –