Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/doc/beispiele/zauberwald/npc/arina.c b/doc/beispiele/zauberwald/npc/arina.c
new file mode 100644
index 0000000..9e08e25
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/arina.c
@@ -0,0 +1,101 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <combat.h>
+#include <new_skills.h>
+#include "/p/zauberer/zauberer.h"
+
+inherit NPC("stdnpc");
+
+void create()
+{
+ ::create();
+ SetProp(P_SHORT, "Arina die Waldfee");
+ SetProp(P_LONG,
+ "Vor Dir steht Arina die weise Waldfee. Sie ist die Lehrerin des Waldes und\n"
+ +"unterrichtet die Pixies. In ihrer Hand haelt sie einen kleinen Zeigestock mit\n"
+ +"dem sie alles moegliche erklaert und Buchstaben in den Sand zeichnet. Auch\n"
+ +"Arina ist, genauso wie ihre Schwesten, bildhuebsch, doch ihr gestrenger Blick\n"
+ +"floesst jedem in ihrer Naehe grossen Respekt ein.\n");
+ SetProp(P_NAME, "Arina");
+ SetProp(P_ARTICLE, 0);
+ SetProp(P_GENDER, FEMALE);
+ SetProp(P_LEVEL, 80);
+ SetProp(P_ATTRIBUTES, (["int":80,"con":40,"str":16,"dex":50]) );
+ SetProp(P_DISABLE_ATTACK, -10000); // is nich :)
+ SetProp(P_BODY, 80);
+ SetProp(P_MAX_SP, 2000);
+ SetProp(P_SP, 2000);
+ SetProp(P_MAX_HP, 700);
+ SetProp(P_HP, 700);
+ SetProp(P_ALIGN, 400);
+ SetProp(P_RACE, "Fee");
+ SetProp(P_SIZE, 160+random(16));
+ SetProp(P_ALCOHOL, 0);
+ SetProp(P_CORPSE, OBJ("feenleiche"));
+ SetProp(P_MAX_ALCOHOL, 0); // kein rauschen :)
+ AddAdjective("wunderschoen");
+ AddId(({"arina", "fee", "waldfee", WALDID("fee")}));
+ SetProp(P_HANDS, ({" mit ihren zarten Haenden", 150, DT_BLUDGEON}) );
+ SetProp(P_SKILL_ATTRIBUTE_OFFSETS, ([SA_SPELL_PENETRATION: 200]));
+ SetProp(P_XP, 800*200*5*2);
+ SetProp(P_GUILD, "zauberer");
+ SetProp(P_Z_NO_MATERIAL, 1);
+ SetProp(P_DEFAULT_INFO, "schweigt und laechelt Dich einfach nur freundlich an.\n");
+ ModifySkill("verletze",
+ ([SI_SKILLABILITY:9000, SI_SPELLCOST:0,
+ SI_SPELLFATIGUE:0, SI_NO_CONSEQUENCES:10000,
+ SI_SKILLRESTR_USE:([P_GUILD_LEVEL:0,SR_FREE_HANDS:0]),
+ SI_ARMOUR_RESTR:0]),0,"zauberer");
+ SetProp(P_GUILD, 0);
+ SetProp(P_RESISTANCE_STRENGTHS,
+ ([DT_POISON: 0.15,
+ DT_MAGIC: -0.3 ]) );
+ AddItem(OBJ("stock"), CLONE_WIELD);
+ AddItem(OBJ("kleid"), CLONE_WEAR);
+ if (file_size(SAECKCHEN)>0) AddItem(SAECKCHEN, CLONE_NEW);
+}
+
+void Attack(object enemy)
+{
+ int normal_speed;
+ normal_speed=(enemy->QueryProp(P_SKILL_ATTRIBUTE_OFFSETS)||([]))[SA_SPEED]||100;
+ if (enemy && enemy->QuerySkillAttribute(SA_SPEED) > normal_speed) {
+ write("Die Fee macht eine beruhigende Handbewegung und ploetzlich fuehlst Du Dich\n"
+ +"ruhig und Du merkst wie Du allmaehlich wieder langsamer wirst...\n");
+ enemy->ModifySkillAttribute(SA_SPEED, -20, 180);
+ }
+ if (enemy) ::Attack(enemy);
+ SetProp(P_GUILD, "zauberer");
+ command("verletze mit "+({"feuer", "magie", "eis", "wasser", "wind"})[random(5)] );
+ SetProp(P_GUILD, 0);
+}
+
+int Defend(int dam, mixed dts, mixed spell, object enemy)
+{
+ int normal_speed;
+ normal_speed=(enemy->QueryProp(P_SKILL_ATTRIBUTE_OFFSETS)||([]))[SA_SPEED]||100;
+ if (enemy && enemy->QuerySkillAttribute(SA_SPEED) > normal_speed) {
+ write(Name(WER)+" macht eine beruhigende Handbewegung und ploetzlich fuehlst Du Dich\n"
+ +"ruhig und Du merkst wie Du allmaehlich wieder langsamer wirst...\n");
+ enemy->ModifySkillAttribute(SA_SPEED, -20, 180);
+ }
+
+ if ((!spell || (mappingp(spell) && spell[SP_PHYSICAL_ATTACK])) && !random(3)) {
+ tell_room(environment(), Name(WER)+" weicht schnell einen Schritt zurueck und weicht Deinem Angriff aus.\n");
+ dam=0;
+ }
+ return (int)::Defend(dam, dts, spell, enemy);
+}
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+ if (!who || killer!=ME) return; // uninteressant
+ log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))+" getoetet von /zauberwald/arina\n");
+}
+
+void die()
+{
+ log_file("padreic/kill", ctime(time())+" Arina wurde von "+get_killer()+" getoetet.\n");
+ ::die();
+}
diff --git a/doc/beispiele/zauberwald/npc/laufeiche.c b/doc/beispiele/zauberwald/npc/laufeiche.c
new file mode 100644
index 0000000..0649276
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/laufeiche.c
@@ -0,0 +1,124 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <combat.h>
+#include <moving.h>
+#include <new_skills.h>
+
+inherit NPC("stdnpc");
+inherit MNPC_MOVING;
+
+void create()
+{
+ if (!clonep(ME)) return;
+ stdnpc::create();
+ moving::mnpc_create();
+ SetProp(P_NAME_ADJ, "alt");
+ SetProp(P_NAME, "Eiche");
+ SetProp(P_SHORT, "Eine alte Eiche");
+ SetProp(P_MSGOUT, "wandert");
+ SetProp(P_LONG,
+ "Vor Dir steht eine sehr sehr alte Eiche. Doch diese Eiche ist keine\n"
+ +"gewoehnliche Eiche, wie Du sie bereits an vielen anderen Stellen gesehn hast.\n"
+ +"Diese Eiche lebt! Du kannst deutlich einen Mund, eine Nase und sogar zwei\n"
+ +"Ohren erkennen. Sie ist eigentlich sehr friedlich gesonnen, kann aber auch\n"
+ +"sehr sehr boese werden, wenn es jemand wagt die Ruhe des Waldes zu stoeren.\n");
+ SetProp(P_RACE, "eiche");
+ SetProp(P_LEVEL, 50);
+ SetProp(P_ATTRIBUTES, (["int":50,"con":50,"str":70,"dex":15]) );
+ SetProp(P_GENDER, FEMALE);
+ SetProp(P_MAX_HP, 500);
+ SetProp(P_HP, 500);
+ SetProp(P_ALIGN, 500);
+ SetProp(P_BODY, 100);
+ SetProp(P_SIZE, 650+random(151));
+ AddAdjective("alt");
+ AddId(({"eiche", "eichen", WALDID("eiche") }));
+ SetProp(P_HANDS, ({" mit einem ihrer langen Aeste",400, DT_WHIP}) );
+ SetProp(P_SKILL_ATTRIBUTE_OFFSETS, ([SA_SPEED:180]));
+ SetProp(P_NOCORPSE, 1);
+ SetProp(P_XP, 500*400*5);
+ SetProp(P_DEFAULT_INFO, "bleibt absolut regungslos und reagiert ueberhaupt nicht.\n");
+ SetProp(P_RESISTANCE_STRENGTHS,
+ ([DT_SLASH: 0.1,
+ DT_MAGIC: -1.0,
+ DT_BLUDGEON: -0.5,
+ DT_POISON: 0.25,
+ DT_HOLY: -1.0,
+ DT_RIP: 0.25,
+ DT_FIRE: 0.25,
+ DT_PIERCE: -0.5,
+ DT_WHIP: -1.0 ]) );
+ SetProp(MNPC_AREA, ({ ROOM("weg2"), ROOM("lichtung") }) );
+ SetProp(MNPC_RANDOM, 10);
+ SetProp(MNPC_DELAY, 8);
+ SetProp(MNPC_WALK_TIME, 600);
+ SetProp(MNPC_FLAGS, MNPC_WALK|MNPC_NO_WALK_IN_FIGHT|MNPC_ONLY_EXITS);
+}
+
+static string _query_info()
+{
+ if (!PL || PL->QueryProp(ZAUBERWALD)<=time())
+ return "Die alte Eiche ist Dir sehr friedlich gesonnen. Es ist jedoch auch sicher\n"
+ +"klug dieses nicht zu aendern, da sie mit ihren Aesten wohl auch sehr kraeftig\n"
+ +"zuschlagen kann.\n";
+ return "Du hast den Zorn der alten Eiche auf Dich gezogen, das war ganz und gar nicht\n"
+ +"klug von Dir. Jetzt lebe auch mit den Konsequenzen....\n";
+}
+
+int remove()
+// wenn eine Eiche getoetet wird, dann verlangsamt das den reset der Eiche
+// die auf weg2 blockt. In der Regel steht ja auch so schon immer eine der
+// wanderden Eichen dort. Dies soll verhindern, das gerade eine Eiche resetet
+// wenn man eine tod hat.
+{
+ call_other(ROOM("weg2"), "delay_reset");
+ catch(call_other(QueryProp(MNPC_HOME), "delay_reset", 900+random(3600)));
+ return (int)::remove();
+}
+
+// wenn man den MNPC mit einem anderen stdnpc kombiniert muessen einige
+// funktionen per Hand ueberschrieben werden....
+
+void reset()
+{
+ stdnpc::reset();
+ moving::mnpc_reset();
+}
+
+void init()
+{
+ stdnpc::init();
+ moving::mnpc_init();
+}
+
+varargs int move(mixed dest, int meth, string dir, string out, string in)
+{
+ int i;
+
+ // extra fuer den Zauberwald eingebaut
+ if (environment() && object_name(environment())==ROOM("weg2")) {
+ // wenn es die einzige Eiche ist, dann bleibt sie hier stehn,
+ // bewacht den Weg und bewegt sich nicht mehr hier weg!
+ object *inv;
+
+ inv = all_inventory(environment()) - ({ ME });
+ for (i=sizeof(inv)-1; i>=0; i--)
+ if (BLUE_NAME(inv[i])==NPC("laufeiche")) break;
+ if (i<0) return ME_CANT_LEAVE_ENV;
+ }
+ //////////////////////////////////////
+ i=(int)stdnpc::move(dest, meth, dir, out, in);
+ if (i!=1) return i;
+ moving::mnpc_move();
+ return 1;
+}
+
+int PreventFollow(object dest)
+{ return moving::mnpc_PreventFollow(dest); }
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+ if (!who || killer!=ME) return; // uninteressant
+ log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))+" getoetet von /zauberwald/laufeiche\n");
+}
diff --git a/doc/beispiele/zauberwald/npc/pixie.c b/doc/beispiele/zauberwald/npc/pixie.c
new file mode 100644
index 0000000..7ed953d
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/pixie.c
@@ -0,0 +1,150 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <moving.h>
+#include <combat.h>
+
+inherit NPC("stdnpc");
+
+void create()
+{
+ ::create();
+ SetProp(P_SHORT, "Ein kleiner Pixie");
+ SetProp(P_SIZE, 55+random(11));
+ SetProp(P_LONG, BS(
+ "Der Pixie ist etwa "+QueryProp(P_SIZE)+"cm gross und sieht vermutlich einem "
+ +"kleinen pumeligen Menschenkind am aehnlichsten. Wie alle Pixies scheint er "
+ +"sehr verspielt zu sein und nichts als Unfug im Kopf zu haben, Du solltest "
+ +"Dich also vor ihm ihn acht nehmen. Auch wenn er aussieht wie ein Kind, sich "
+ +"benimmt wie ein Kind, so kann er Dir mit seiner Magie sicher uebel zu spieln."));
+ SetProp(P_INFO, /* kleine Warnung fuer die Kaempfer :) */
+ "Man sollte sich immer vor der Magie der Pixies in acht nehmen, sie ist nicht\n"
+ +"unbedingt gefaehrlich, aber es koennen die unerwartesten Dinge geschehn. So\n"
+ +"ist durchaus von Leuten bekannt die einen Kampf als kleine Ratte beendeten,\n"
+ +"oder deren Schwert im Kampf ploetzlich zu Scheisse zerfloss...\n");
+ SetProp(P_NAME_ADJ, "klein");
+ SetProp(P_NAME, "Pixie");
+ SetProp(P_GENDER, MALE);
+ SetProp(P_RACE, "pixie");
+ SetProp(P_ATTRIBUTES, (["int":30,"con":20,"str":15,"dex":30]) );
+ SetProp(P_LEVEL, 20);
+ SetProp(P_MAX_HP, 600);
+ SetProp(P_HP, 600);
+ SetProp(P_MAX_SP, 800);
+ SetProp(P_SP, 800);
+ SetProp(P_ALIGN, 250);
+ SetProp(P_HANDS, ({" mit seinen kleinen Haenden", 150, DT_BLUDGEON}) );
+ SetProp(P_XP, 600*150*5);
+ AddAdjective("klein");
+ AddId("pixie");
+}
+
+// teleporter Ziele im Gebiet. Der Pixie will ja einfach nur ein bisschen
+// Aergern und nicht helfen (ein Pixiekampf ist kein Ausgang :)
+#define DEST ({"lichtungno", "lichtungso", "lichtungn", "lichtungs", \
+ "lichtungnw", "lichtungsw", "lichtungo", "lichtungw", \
+ "weg2", "stein"})
+
+void Attack(object enemy)
+{
+ object ob, weapon;
+
+ ob=SelectEnemy();
+ if (ob) switch(random(7*8)) { // jede 8te Runde ein Zauberspruch...
+ case 0: // in Frosch verwandeln...
+ if (!ob->QueryProp(P_FROG)) {
+ tell_object(ob, "Der Pixie dreht Dir eine lange Nase und verwandelt Dich in einen Frosch.\n");
+ say(BS("Der Pixie dreht "+ob->name(WEM)+" eine lange Nase und verwandelt "
+ +ob->QueryPronoun(WEN)+" in einen Frosch,"), ob);
+ ob->SetProp(P_FROG, 1);
+ return;
+ }
+ break;
+ case 8..10: // einfach nur nerviger Teleport innerhalb des Gebiets :)
+ tell_object(ob,
+ "Der Pixie schliesst kurz seine Augen und eh Du Dich versiehst, verschwimmt\n"
+ +"alles um Dich herum...\n");
+ say(BS("Der Pixie schliesst kurz seine Augen und ploetzlich loest sich "
+ +ob->name(WER)+" in Luft auf."), ob);
+ ob->move(ROOM(DEST[random(sizeof(DEST))]), M_TPORT|M_NOCHECK|M_SILENT);
+ return;
+ case 16: // Geschlecht aendern... :)
+ tell_object(ob,
+ "Der Pixie grinst breit bis ueber beide Ohren und schaut Dich an, Du weisst\n"
+ +"gar nicht wie Dir geschieht, aber irgendetwas aendert sich an Deinem Koerper.\n");
+ say(BS("Der Pixie grinst "+ob->name(WEN)+" breit an. Ploetzlich "
+ +(ob->QueryProp(P_GENDER)==FEMALE
+ ? "verschwinden ihre Brueste und es waechst ihr ploetzlich ein Bart."
+ : "verschwindet sein Bart und ihm wachsen zwei neue Brueste.")), ob);
+ if (ob->QueryProp(P_GENDER)==FEMALE)
+ ob->SetProp(P_GENDER, MALE);
+ else ob->SetProp(P_GENDER, FEMALE);
+ return;
+ case 24:
+ if (objectp(weapon=ob->QueryProp(P_WEAPON))) {
+ weapon->DoUnwield(1);
+ // verfluchte Waffen nicht betreffen :))
+ if (!objectp(weapon->QueryProp(P_WIELDED))) {
+ string str1, str2;
+ str1=str2=(weapon)->name(WER);
+ if (str1[0..2]=="ein") {
+ str1="D"+str1;
+ str2="s"+str2;
+ }
+ tell_object(ob, BS(
+ "Der Pixie starrt Dir in die Augen und schnippst einmal kurz mit seinen "
+ +"Fingern. Ploetzlich zerrint "+str1+" in Deinen Haenden zu einem Haufen "
+ +"Scheisse."));
+ say(BS("Der Pixie starrt "+weapon->name(WEM)+" in die Augen und "
+ +"schnippst einmal kurz mit den Fingern. Ploetzlich "
+ +"zerrint "+weapon->name(WEM)+" "+str2
+ +" in einen Haufen Scheisse."), ob);
+ weapon->remove();
+ if (weapon) destruct(weapon);
+ return;
+ }
+ }
+ break;
+ case 32:
+ if (!ob->QueryProp(P_BLIND)) {
+ tell_object(ob, BS(
+ "Der Pixie haelt sich die Hand vor die Augen und grinst breit. Ploetzlich "
+ +"merkst Du, wie alles ganz dunkel um Dich rum wird..."));
+ say(BS("Der Pixie haelt sich die Hand vor die Augen und grinst breit. "
+ +ob->name(WER)
+ +" schaut daraufhin ziemlich irritiert in die Gegend."), ob);
+ ob->SetProp(P_BLIND, 1);
+ return;
+ }
+ break;
+ case 40:
+ if (ob->QueryProp(P_POISON)<3 && ob->QueryProp(P_MAX_POISON)>=3) {
+ tell_object(ob, BS(
+ "Der Pixie streicht sich mit der Hand zufrieden ueber seinen Bauch und schaut "
+ +"Dich dabei an. Ploetzlich wird Dir richtig uebel..."));
+ say(BS("Der Pixie streicht sich mit seiner Hand zufrieden ueber seinen Bauch und\n"
+ +"schaut "+ob->name(WEM)+" dabei in die Augen. Ploetzlich wird "+ob->name(WEM)
+ +" ganz uebel."), ob);
+ ob->SetProp(P_POISON, 3);
+ return;
+ }
+ break;
+ case 48:
+ if (!ob->QueryProp(P_DEAF)) {
+ tell_object(ob, "Der Pixie haelt sich die Ohren zu und grinst breit.\n");
+ say(BS("Der Pixie haelt sich die Ohren zu und grinst dabei "
+ +ob->name(WEN)+" an."), ob);
+ ob->SetProp(P_DEAF, 1);
+ return;
+ }
+ break;
+ default:
+ }
+ if (enemy && present(enemy, environment())) ::Attack(enemy);
+}
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+ if (!who || killer!=ME) return; // uninteressant
+ log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))+" getoetet von /zauberwald/pixie\n");
+}
diff --git a/doc/beispiele/zauberwald/npc/riese.c b/doc/beispiele/zauberwald/npc/riese.c
new file mode 100644
index 0000000..a68a3e2
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/riese.c
@@ -0,0 +1,92 @@
+// (c) 2003 by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <properties.h>
+
+inherit NPC("stdnpc");
+
+void create()
+{
+ ::create();
+ create_default_npc(30, 2500);
+ SetProp(P_ARTICLE, 0);
+ SetProp(P_SHORT, "Grimmbart Felsenschieber");
+ SetProp(P_LONG,
+ "Vor Dir sitzt der Riese Grimmbart Felsenschieber. Eigentlich scheint er\n"
+ +"ein sehr gutmuetiger und freundlicher Riese zu sein. Aber irgendwie wirkt\n"
+ +"er derzeit sehr traurig.\n");
+
+ SetProp(P_NAME, "Grimmbart Felsenschieber");
+ SetProp(P_GENDER, MALE);
+ SetProp(P_SIZE, 297);
+ SetProp(P_ALIGN, 200);
+ SetProp(P_RESISTANCE_STRENGTHS,
+ ([DT_HOLY:-1.0,
+ DT_UNHOLY:0.5,
+ DT_MAGIC:0.25,
+ DT_POISON:-0.25,
+ DT_WHIP:-0.6,
+ DT_BLUDGEON:-0.3,
+ DT_PIERCE:-0.1,
+ DT_SLASH:-0.1
+ ]));
+
+ AddInfo(({"felsen", "fels"}),
+ "Ich liebe es meine Muskeln anzuspannen und Felsen zu schieben.",
+ "antwortet: ");
+ AddInfo("schieben",
+ "Ich habe doch keine Felsen mehr die ich schieben koennte.");
+ AddInfo(({"trauer", "traurigkeit"}),
+ "Frueher da habe ich den ganzen Tag hier meine Felsen hin- und "
+ +"hergeschoben, aber nun hat Ulinia mir verboten hier im Wald mit "
+ +"den Felsen zu spielen und ich musste sie alle wegtragen :o(",
+ "jammert: ");
+ AddInfo("tag", "Ja so ein Tag ist ganz schoen lang ohne Felsen",
+ "sagt: ");
+ AddInfo("ulinia",
+ "Eine richtig bloede Fee und haette sie ihre doofen Zauberkraefte nicht,"
+ +"koennte sie uns hier auch nicht alle so rumkommandieren *mopper*.",
+ "sagt: ");
+ AddInfo("grund",
+ "Nur weil mir einmal ausversehen ein klitzekleiner Fels in den Tuempel "
+ +"gefallen ist, musste ich all meine schoenen Felsen aus dem Wald bringen.",
+ "sagt: ");
+ AddInfo("tuempel",
+ "Bloeder Tuempel, wer braucht den schon!", "antwortet gereizt: ");
+ AddInfo("zauberkraefte",
+ "Ich freu mich schon richtig auf den Tag, an dem Ulinias Zauberkraefte "
+ +"nachlassen!",
+ "sagt: ");
+ AddInfo(({"wald", "zauberwald"}),
+ "Wenn es hier wieder ganz viele schoene Felsen gaebe, waer er wieder das "
+ +"reinste Paradies.", "antwortet: ");
+ AddInfo("paradies",
+ "Ja frueher war der Wald hier einmal das reinste Paradies.", "antwortet: ");
+
+ SetChats(3,
+ ({Name(WER)+" sagt: Ich bin so traurig.\n",
+ Name(WER)+" schluchzt: meine schoenen Felsen.. wuaaahhhhh\n",
+ Name(WER)+" sagt: nie wieder werde ich Felsen schieben koennen.\n",
+ Name(WER)+" sagt: F E L S E N !\n",
+ Name(WER)+" jammert: Die Welt ist so furchtbar ungerecht!\n",
+ Name(WER)+" fragt: Wie soll ich so bloss weiterleben?\n"
+ }));
+
+ AddId("riese");
+ AddId("grimmbart");
+ AddId("felsenschieber");
+}
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+ if (!who || killer!=ME) return; // uninteressant
+ log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))
+ +"getoetet von /zauberwald/riese\n");
+}
+
+void die()
+{
+ log_file("padreic/kill", ctime(time())+" Grimmbart wurde von "+get_killer()
+ +" getoetet.\n");
+ ::die();
+}
diff --git a/doc/beispiele/zauberwald/npc/stdnpc.c b/doc/beispiele/zauberwald/npc/stdnpc.c
new file mode 100644
index 0000000..a2b3d2f
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/stdnpc.c
@@ -0,0 +1,39 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+
+inherit "/std/npc";
+inherit "/p/service/mupfel/getkill";
+
+void create()
+{
+ ::create();
+ SetProp(ZAUBERWALDNPC, 1);
+ SetProp(P_AGGRESSIVE, ([P_RACE:(["Dunkelelf":1, 0:0.0]) ]));
+}
+
+int AutoAttack(object ob)
+{
+ if (ob && ob->QueryProp(ZAUBERWALD)>time()) return 1;
+ return ::AutoAttack(ob);
+}
+
+int InsertEnemy(object ob)
+{
+ int ret, is_enemy;
+ is_enemy=IsEnemy(ob);
+ ret=(int)::InsertEnemy(ob);
+ if (!is_enemy) { // alle anderen Zauberwald-NPCs im Raum verstaendigen
+ filter_objects(
+ filter_objects(all_inventory(environment())-users(), "QueryProp", ZAUBERWALDNPC),
+ "InsertEnemy", ob
+ );
+ }
+ return ret;
+}
+
+int Defend(int dam, mixed dts, mixed spell, object enemy)
+{
+ if (enemy) enemy->SetProp(ZAUBERWALD, time()+AGGRESSIVE_TIME);
+ return (int)::Defend(dam, dts, spell, enemy);
+}
diff --git a/doc/beispiele/zauberwald/npc/titina.c b/doc/beispiele/zauberwald/npc/titina.c
new file mode 100644
index 0000000..adce062
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/titina.c
@@ -0,0 +1,114 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <combat.h>
+#include <new_skills.h>
+#include "/p/zauberer/zauberer.h"
+
+inherit NPC("stdnpc");
+
+void create()
+{
+ ::create();
+ SetProp(P_SHORT, "Titina die Waldfee");
+ SetProp(P_LONG,
+ BS("Vor Dir steht Titina die Waldfee. Ihr langes goldenes Haar weht "
+ +"leicht im Wind und das einzige was sie bedeckt, ist ein leichtes Blaetterkleid "
+ +"das ihre weiblichen Rundungen ausserordentlich gut zur Geltung bringt. "
+ +"Ihre schoenen blauen Augen, tun ein uebriges um Dich ganz wahnsinnig zu machen."));
+ SetProp(P_NAME, "Titina");
+ SetProp(P_ARTICLE, 0);
+ SetProp(P_GENDER, FEMALE);
+ SetProp(P_LEVEL, 80);
+ SetProp(P_ATTRIBUTES, (["int":60,"con":40,"str":16,"dex":50]) );
+ SetProp(P_DISABLE_ATTACK, -10000); // is nich :)
+ SetProp(P_BODY, 80);
+ SetProp(P_MAX_SP, 2000);
+ SetProp(P_SP, 2000);
+ SetProp(P_MAX_HP, 600);
+ SetProp(P_HP, 600);
+ SetProp(P_ALIGN, 400);
+ SetProp(P_RACE, "Fee");
+ SetProp(P_SIZE, 160+random(16));
+ SetProp(P_ALCOHOL, 0);
+ SetProp(P_CORPSE, OBJ("feenleiche"));
+ SetProp(P_MAX_ALCOHOL, 0); // kein rauschen :)
+ AddAdjective("wunderschoen");
+ AddId(({"titina", "fee", "waldfee", WALDID("fee")}));
+ SetProp(P_HANDS, ({" mit ihren zarten Haenden", 150, DT_BLUDGEON}) );
+ SetProp(P_SKILL_ATTRIBUTE_OFFSETS, ([SA_SPELL_PENETRATION: 100]));
+ SetProp(P_XP, 800*200*5*2);
+ SetProp(P_GUILD, "zauberer");
+ SetProp(P_Z_NO_MATERIAL, 1);
+ SetProp(P_DEFAULT_INFO, "schweigt und laechelt Dich einfach nur freundlich an.\n");
+ ModifySkill("verletze",
+ ([SI_SKILLABILITY:8000, SI_SPELLCOST:0,
+ SI_SPELLFATIGUE:0, SI_NO_CONSEQUENCES:10000,
+ SI_SKILLRESTR_USE:([P_GUILD_LEVEL:0,SR_FREE_HANDS:0]),
+ SI_ARMOUR_RESTR:0]),0,"zauberer");
+ SetProp(P_GUILD, 0);
+ SetProp(P_RESISTANCE_STRENGTHS,
+ ([DT_UNHOLY: 0.25,
+ DT_AIR: 0.3,
+ DT_POISON: 0.15]) ); // sonst selten in benutzung :)
+
+ AddItem(OBJ("kamm"), CLONE_WIELD);
+ AddItem(OBJ("kleid"), CLONE_WEAR);
+ if (file_size(SAECKCHEN)>0) AddItem(SAECKCHEN, CLONE_NEW);
+}
+
+static string _query_long()
+{
+ if (!PL || PL->QueryProp(P_GENDER)==FEMALE)
+ return Query(P_LONG)
+ +"Ihr ueberhebliches laecheln bringt Dich jedoch total zur Weissglut, so eine\n"
+ +"Zicke hier den ganzen Tag rumzusitzen und sich nur die Haare zu kaemmen.\n";
+ return Query(P_LONG)
+ +"Mit ihrem charmanten laecheln, zieht sie Dich sofort in ihren Bann und Du\n"
+ +"wuerdest ihr jeden Wunsch erfuellen, so sie denn einen aeussern wuerde.\n";
+}
+
+void Attack(object enemy)
+{
+ int normal_speed;
+ normal_speed=(enemy->QueryProp(P_SKILL_ATTRIBUTE_OFFSETS)||([]))[SA_SPEED]||100;
+ if (enemy && enemy->QuerySkillAttribute(SA_SPEED) > normal_speed) {
+ write("Die Fee macht eine beruhigende Handbewegung und ploetzlich fuehlst Du Dich\n"
+ +"ruhig und Du merkst wie Du allmaehlich wieder langsamer wirst...\n");
+ enemy->ModifySkillAttribute(SA_SPEED, -20, 180);
+ }
+ if (enemy) ::Attack(enemy);
+ SetProp(P_GUILD, "zauberer");
+ command("verletze mit "+({"feuer", "magie", "eis", "wasser", "gift",
+ "wind", "saeure", "laerm"})[random(8)] );
+ SetProp(P_GUILD, 0);
+}
+
+int Defend(int dam, mixed dts, mixed spell, object enemy)
+{
+ int normal_speed;
+ normal_speed=(enemy->QueryProp(P_SKILL_ATTRIBUTE_OFFSETS)||([]))[SA_SPEED]||100;
+ if (enemy && enemy->QuerySkillAttribute(SA_SPEED) > normal_speed) {
+ write(Name(WER)+" macht eine beruhigende Handbewegung und ploetzlich fuehlst Du Dich\n"
+ +"ruhig und Du merkst wie Du allmaehlich wieder langsamer wirst...\n");
+ enemy->ModifySkillAttribute(SA_SPEED, -20, 180);
+ }
+
+ if ((!spell || (mappingp(spell) && spell[SP_PHYSICAL_ATTACK])) && !random(4)) {
+ tell_room(environment(), Name(WER)+" weicht schnell einen Schritt zurueck und weicht Deinem Angriff aus.\n");
+ dam=0;
+ }
+ return (int)::Defend(dam, dts, spell, enemy);
+}
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+ if (!who || killer!=ME) return; // uninteressant
+ log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))+" getoetet von /zauberwald/titina\n");
+}
+
+void die()
+{
+ log_file("padreic/kill", ctime(time())+" Titina wurde von "+get_killer()+" getoetet.\n");
+ ::die();
+}
diff --git a/doc/beispiele/zauberwald/npc/ulinia.c b/doc/beispiele/zauberwald/npc/ulinia.c
new file mode 100644
index 0000000..7ea596e
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/ulinia.c
@@ -0,0 +1,160 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <combat.h>
+#include <moving.h>
+#include <new_skills.h>
+#include "/p/zauberer/zauberer.h"
+
+inherit NPC("stdnpc");
+
+string info_tarnzauber()
+{
+ object ob;
+ if (present("\ntarnzauber", PL))
+ return "sagt: Ich habe Dich doch bereist verzaubert.\n";
+ ob=clone_object(OBJ("tarnzauber"));
+ ob->move(PL, M_NOCHECK);
+ ob->Initialize(PL);
+ return "sagt: Nun gut, so sei es...\n"
+ +"macht eine weite Handbewegung und Du fuehlst wie Du Dich verwandelst.\n"
+ +"sagt: Viel Glueck!";
+}
+
+void create()
+{
+ ::create();
+ SetProp(P_SHORT, "Ulinia die Waldfee");
+ SetProp(P_LONG,
+ BS("Ueber dem Teich schwebt Ulinia die Waldfee. Ihr langes goldenes Haar weht "
+ +"leicht im Wind und das einzige was sie bedeckt, ist ein leichtes Blaetterkleid "
+ +"das ihre weiblichen Rundungen ausserordentlich gut zur Geltung bringt. "
+ +"In der Hand haelt sie einen kleinen Zauberstab, mit dem sie hoch ueber allem thront."));
+ SetProp(P_NAME, "Ulinia");
+ SetProp(P_ARTICLE, 0);
+ SetProp(P_GENDER, FEMALE);
+ SetProp(P_LEVEL, 80);
+ SetProp(P_ATTRIBUTES, (["int":80,"con":40,"str":16,"dex":50]) );
+ SetProp(P_DISABLE_ATTACK, -10000); // is nich :)
+ SetProp(P_BODY, 80);
+ SetProp(P_MAX_SP, 2000);
+ SetProp(P_SP, 2000);
+ SetProp(P_MAX_HP, 800);
+ SetProp(P_HP, 800);
+ SetProp(P_ALIGN, 400);
+ SetProp(P_RACE, "Fee");
+ SetProp(P_SIZE, 160+random(16));
+ SetProp(P_ALCOHOL, 0);
+ SetProp(P_CORPSE, OBJ("feenleiche"));
+ SetProp(P_MAX_ALCOHOL, 0); // kein rauschen :)
+ AddAdjective("wunderschoen");
+ AddId(({"fee", "waldfee", "ulinia", WALDID("fee")}));
+ SetProp(P_HANDS, ({" mit ihren zarten Haenden", 150, DT_BLUDGEON}) );
+ SetProp(P_SKILL_ATTRIBUTE_OFFSETS, ([SA_SPELL_PENETRATION: 250]));
+ SetProp(P_XP, 800*200*5*2);
+ SetProp(P_GUILD, "zauberer");
+ SetProp(P_Z_NO_MATERIAL, 1);
+ SetProp(P_DEFAULT_INFO, "schweigt und laechelt Dich einfach nur freundlich an.\n");
+ AddInfo(({"quest", "hilfe", "aufgabe", "dunkelelfenamulett", "delfenamulett"}),
+ "Ohh in der Tat haette ich da eine Aufgabe fuer Dich, aber ich muss Dich "
+ +"warnen, das sie nicht ganz ungefaehrlich ist.\n"
+ +"Ein befreundeter Kobold berichtete mir von einem lange verschollenen Buch, "
+ +"dass in der Bibliothek der Dunkelelfen wieder aufgetaucht ist. In diesem "
+ +"Buch ist unter anderem von einem alten Amulett die Rede, mit dessen Hilfe "
+ +"die Dunkelelfen ihre alte Macht wiedererlangen und erneut Furcht und "
+ +"Schrecken ueber das gesamte Morgengrauen bringen koennten. "
+ +"Wenn Du die Gefahr nicht scheust, waere es ausserordentlich nett wenn Du "
+ +"Dich nach Zzerenzzen begeben wuerdest und dort nach dem Amulett suchst.\n"
+ +"Solltest Du das Amulett tatsaechlich finden, so ist es wichtig das es "
+ +"auf keinen Fall in die Hand der Dunkelelfen geraet und zerstoert wird.",
+ "antwortet: ");
+ AddInfo("gefahr",
+ "Nun Du wirst Dich mitten unter die Dunkelelfen begeben muessen um "
+ +"zu ihrer Bibliothek gelangen zu koennen. In Zzerenzzen wirst Du "
+ +"hierbei voellig auf Dich allein gestellt sein.\n"
+ +"Alles was ich hierbei fuer Dich tun kann, ist einen Tarnzauber zu "
+ +"sprechen der Dich aeusserlich in einen Dunkelelfen verwandelt. "
+ +"Aber vorsicht, spaetestens wenn Du Dich in einen Kampf verwickelst, "
+ +"wird sich der Zauber loesen.", "sagt: ");
+ AddInfo("tarnzauber", #'info_tarnzauber, "");
+ AddInfo(({"furcht", "schrecken", "macht"}),
+ "Ja frueher waren die Dunkelelfen sehr sehr maechtig und alle "
+ +"friedliebenden Geschoepfe dieser Welt sollten hoffen das sie "
+ +"nie wieder ihre alte Macht erlangen werden.", "antwortet: ");
+ AddInfo("amulett",
+ "Nun leider weiss ich auch nichts genaues ueber das Amulett. Ich bin "
+ +"nicht mal sicher ob es existiert oder je existiert hat. Aber sollte "
+ +"es noch existieren, muss es auf jeden Fall zerstoert werden!", "sagt: ");
+ AddInfo("kobold",
+ "Ich habe versprochen ihn nicht zu verraten und so kann ich Dir nichts "
+ +"weiter ueber ihn sagen.", "antwortet: ");
+ AddInfo(({"buch", "bibliothek"}),
+ "Ich denke am besten begibst Du Dich in die Hoehle des Loewen und versuchst "
+ +"in der Bibliothek der Dunkelelfen selbst ein Blick in dies Buch zu werfen.\n"
+ +"Wenn ich das noch recht in Erinnerung habe, handelt es sich hierbei um "
+ +"das Buch eines Dunkelelfen names Teyrion.", "sagt: ");
+ AddInfo("loewen", "Das ist doch bloss eine Redewendung.", "sagt: ");
+ AddInfo("redewendung", "Na das sagt man halt so...", "sagt: ");
+ AddInfo(({"hoehle", "zzerenzzen"}),
+ "Der Eingang nach Zzerenzzen liegt in der naehe von Wilhelmsburg gut hinter "
+ +"einem Wasserfall versteckt.", "sagt: ");
+ ModifySkill("verletze",
+ ([SI_SKILLABILITY:10000, SI_SPELLCOST:0,
+ SI_SPELLFATIGUE:0, SI_NO_CONSEQUENCES:10000,
+ SI_SKILLRESTR_USE:([P_GUILD_LEVEL:0,SR_FREE_HANDS:0]),
+ SI_ARMOUR_RESTR:0]),0,"zauberer");
+ SetProp(P_GUILD, 0);
+ SetProp(P_RESISTANCE_STRENGTHS,
+ ([DT_UNHOLY: 0.25,
+ DT_POISON: 0.15,
+ DT_MAGIC: -0.3]) );
+
+ AddItem(OBJ("zauberstab"), CLONE_WIELD);
+ AddItem(OBJ("kleid"), CLONE_WEAR);
+ if (file_size(SAECKCHEN)>0) AddItem(SAECKCHEN, CLONE_NEW);
+}
+
+void Attack(object enemy)
+{
+ int normal_speed;
+ normal_speed=(enemy->QueryProp(P_SKILL_ATTRIBUTE_OFFSETS)||([]))[SA_SPEED]||100;
+ if (enemy && enemy->QuerySkillAttribute(SA_SPEED) > normal_speed) {
+ write("Die Fee macht eine beruhigende Handbewegung und ploetzlich fuehlst Du Dich\n"
+ +"ruhig und Du merkst wie Du allmaehlich wieder langsamer wirst...\n");
+ enemy->ModifySkillAttribute(SA_SPEED, -20, 180);
+ }
+ if (enemy) ::Attack(enemy);
+ SetProp(P_GUILD, "zauberer");
+ command("verletze mit "+({"feuer", "magie", "eis", "wasser", "gift",
+ "wind", "saeure", "laerm"})[random(8)] );
+ SetProp(P_GUILD, 0);
+}
+
+int Defend(int dam, mixed dts, mixed spell, object enemy)
+{
+ int normal_speed;
+ normal_speed=(enemy->QueryProp(P_SKILL_ATTRIBUTE_OFFSETS)||([]))[SA_SPEED]||100;
+ if (enemy && enemy->QuerySkillAttribute(SA_SPEED) > normal_speed) {
+ write(Name(WER)+" macht eine beruhigende Handbewegung und ploetzlich fuehlst Du Dich\n"
+ +"ruhig und Du merkst wie Du allmaehlich wieder langsamer wirst...\n");
+ enemy->ModifySkillAttribute(SA_SPEED, -20, 180);
+ }
+
+ if ((!spell || (mappingp(spell) && spell[SP_PHYSICAL_ATTACK])) && !random(3)) {
+ tell_room(environment(), Name(WER)+" weicht schnell einen Schritt zurueck und weicht Deinem Angriff aus.\n");
+ dam=0;
+ }
+ return (int)::Defend(dam, dts, spell, enemy);
+}
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+ if (!who || killer!=ME) return; // uninteressant
+ log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))+" getoetet von /zauberwald/ulinia\n");
+}
+
+void die()
+{
+ log_file("padreic/kill", ctime(time())+" Ulinia wurde von "+get_killer()+" getoetet.\n");
+ ::die();
+}
diff --git a/doc/beispiele/zauberwald/npc/waechter.c b/doc/beispiele/zauberwald/npc/waechter.c
new file mode 100644
index 0000000..55c1a10
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/waechter.c
@@ -0,0 +1,87 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <combat.h>
+#include <new_skills.h>
+
+inherit NPC("stdnpc");
+
+void create()
+{
+ ::create();
+ SetProp(P_NAME, "Waechter des Waldes");
+ SetProp(P_SHORT, "Der Waechter des Waldes");
+ SetProp(P_LONG,
+ "Vor Dir steht eine sehr sehr alte Eiche. Doch diese Eiche ist keine\n"
+ +"gewoehnliche Eiche, wie Du sie bereits an vielen anderen Stellen gesehn hast.\n"
+ +"Diese Eiche lebt! Du kannst deutlich einen Mund, eine Nase und sogar zwei\n"
+ +"Ohren erkennen. Sie ist eigentlich sehr friedlich gesonnen, kann aber auch\n"
+ +"sehr sehr boese werden, wenn es jemand wagt die Ruhe des Waldes zu stoeren.\n");
+ SetProp(P_RACE, "eiche");
+ SetProp(P_AGGRESSIVE, 0);
+ SetProp(P_LEVEL, 100);
+ SetProp(P_ATTRIBUTES, (["int":80,"con":100,"str":100,"dex":20]) );
+ SetProp(P_GENDER, MALE);
+ SetProp(P_MAX_HP, 1000);
+ SetProp(P_HP, 1000);
+ SetProp(P_ALIGN, 500);
+ SetProp(P_BODY, 100);
+ SetProp(P_SIZE, 1500);
+ SetProp(P_DISABLE_ATTACK, -10000); // is nich :)
+ AddId(({"eiche", "waechter","waechter des waldes", WALDID("waechtereiche") }));
+ SetProp(P_HANDS, ({" mit einem seiner langen Aeste",550,DT_WHIP}) );
+ SetProp(P_SKILL_ATTRIBUTE_OFFSETS, ([SA_SPEED:210]));
+ SetProp(P_NOCORPSE, 1);
+ SetProp(P_XP, 1000*550*5);
+ SetProp(P_DEFAULT_INFO, "bleibt absolut regungslos und reagiert ueberhaupt nicht.\n");
+ SetProp(P_RESISTANCE_STRENGTHS,
+ ([DT_SLASH: 0.1,
+ DT_MAGIC: -1.0,
+ DT_BLUDGEON: -0.5,
+ DT_POISON: 0.25,
+ DT_HOLY: -1.0,
+ DT_RIP: 0.25,
+ DT_FIRE: 0.25,
+ DT_PIERCE: -0.5,
+ DT_WHIP: -1.0 ]) );
+ AddCmd(({"osten", "westen"}), "cmd_blocken");
+}
+
+static string _query_info()
+{
+ if (!PL || PL->QueryProp(ZAUBERWALD)<=time())
+ return "Die alte Eiche ist Dir sehr friedlich gesonnen. Es ist jedoch auch sicher\n"
+ +"klug dieses nicht zu aendern, da sie mit ihren Aesten wohl auch sehr kraeftig\n"
+ +"zuschlagen kann.\n";
+ return "Du hast den Zorn der alten Waechtereiche auf Dich gezogen, das war ganz und\n"
+ +"gar nicht klug von Dir. Jetzt lebe auch mit den Konsequenzen....\n";
+}
+
+static int cmd_blocken()
+{
+ if (PL->QueryProp(P_RACE)=="Dunkelelf" &&
+ PL->QueryProp(AUSGANG)==query_verb()) {
+ write(BS(Name(WER, 1)+" laesst Dich nicht vorbei.")
+ +break_string("Du solltest hier besser verschwinden, "
+ +"so Typen wie Du sind hier nicht gern gesehn!",
+ 78, Name(WER, 1)+" sagt: "));
+ return 1;
+ }
+ if (PL && PL->QueryProp(ZAUBERWALD) &&
+ PL->QueryProp(AUSGANG)==query_verb()) {
+ write(BS(Name(WER, 1)+" steht Dir da leider im Weg und laesst Dich nicht vorbei."));
+ return 1;
+ }
+}
+
+int remove()
+{
+ call_other(ROOM("weg1"), "delay_reset");
+ return (int)::remove();
+}
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+ if (!who || killer!=ME) return; // uninteressant
+ log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))+" getoetet von /zauberwald/waechter\n");
+}