diff --git a/gilden/files.abenteurer/lichtkugel.c b/gilden/files.abenteurer/lichtkugel.c
new file mode 100644
index 0000000..809e96b
--- /dev/null
+++ b/gilden/files.abenteurer/lichtkugel.c
@@ -0,0 +1,42 @@
+#pragma strong_types,save_types
+
+inherit "/std/thing";
+
+#include <properties.h>
+
+protected void create()
+{
+   ::create();
+   SetProp(P_SHORT, "Eine leuchtende Kugel");
+   SetProp(P_LONG, "Eine ziemlich normale Kugel, die magisch leuchtet.\n");
+   SetProp(P_NAME, "Lichtkugel");
+   SetProp(P_GENDER, 2);
+   AddId(({"kugel", "lichtkugel", "leuchtende kugel"}));
+   SetProp(P_WEIGHT, 0);
+   SetProp(P_VALUE, 0);
+   SetProp(P_LIGHT, 2);
+}
+
+
+public varargs int remove(int silent)
+{
+   if (!silent && environment())
+   {
+      if (living(environment()))
+        tell_object(environment(), "Die Lichtkugel loest sich auf.\n");
+      else
+        tell_room(environment(), "Die Lichtkugel loest sich auf.\n");
+   }
+   return ::remove(silent);
+}
+
+public void reset() {
+   remove();
+}
+
+public void start_remove(int zeit)
+{
+   if (zeit > 0);
+     set_next_reset(zeit);
+}
+
diff --git a/gilden/files.abenteurer/std_abenteurer.c b/gilden/files.abenteurer/std_abenteurer.c
new file mode 100644
index 0000000..9214ff5
--- /dev/null
+++ b/gilden/files.abenteurer/std_abenteurer.c
@@ -0,0 +1,190 @@
+/* Humni, 2005-07-01 : habbich mal gebaut */
+
+/* Verwendung: 1. Erben
+	       2. Entweder die Einzelfunktionen aufrufen oder einfach
+	          BuildUp(int spielerlevel) aufrufen und danach noch
+		  bei Bedarf modifizieren.
+*/
+
+inherit "/std/npc";
+
+#include <properties.h>
+#include <language.h>
+#include <new_skills.h>
+#include <combat.h>
+
+// In das Kommando-Array kommen die ganzen Befehle, die der NPC kann.
+string* attack_kommandos;
+string* defend_kommandos;
+mapping row_kommandos;
+
+
+create()
+{
+	::create();
+
+	attack_kommandos=({});
+	defend_kommandos=({});
+	row_kommandos=([]);
+	SetProp(P_GUILD,"abenteurer");
+	seteuid(getuid(this_object()));
+}
+
+/* Mal als simpel-Methode eingebaut, vielleicht kann das ja irgend ein NPC
+   auch noch so brauchen.*/
+AddAttackCommand(string str)
+{
+	attack_kommandos+=({str});
+}
+
+AddDefendCommand(string str)
+{
+	defend_kommandos+=({str});
+}
+
+AddRowCommand(int row, string str)
+{
+	string * com;
+	if (!pointerp(row_kommandos[row]))
+	{
+		row_kommandos+=([row:({str})]);
+	}
+	else
+	{
+		com=row_kommandos[row];
+		com+=({str});
+		row_kommandos+=([row:com]);
+	}
+}
+
+/* Sehr simpel gemacht, gebe ich gerne zu.*/
+AddPreferedRow(int row)
+{
+	AddDefendCommand(sprintf("team reihe %d",row));
+}
+
+/* BuildSkills: Baut die Skills im NPC auf.
+
+   Idee: Level genauso gross wie Mindeslevel fuer Spell: Ability 1000. Danach pro Level>Mindestlevel +1000, bis zu 10000.
+
+   Kampfspells: Saeurestrahl, Feuerball, Schnell, Ausweichen, Kampfschrei.
+   */
+BuildSkills(int level)
+{
+	int val;
+	if (level>=11)
+	{
+		val=((level>21)?10000:(level-10)*1000);
+		ModifySkill("pfeil",val);
+		AddAttackCommand("pfeil");
+		AddAttackCommand("pfeil");
+		AddRowCommand(2,"pfeil");
+		AddRowCommand(2,"pfeil");
+	}
+	if (level>=15)
+	{
+		val=((level>25)?10000:(level-14)*1000);
+		ModifySkill("feuerball",val);
+		AddAttackCommand("feuerball");
+		AddAttackCommand("feuerball");
+		AddRowCommand(3,"feuerball");
+		AddRowCommand(3,"feuerball");
+		AddRowCommand(2,"feuerball");
+		AddRowCommand(3,"feuerball");
+		AddRowCommand(4,"feuerball");
+	}
+	if (level>=30)
+	{
+		val=((level>40)?10000:(level-30)*1000);
+		ModifySkill("saeurestrahl",val);
+		AddAttackCommand("saeurestrahl");
+		AddAttackCommand("saeurestrahl");
+		AddRowCommand(4,"saeurestrahl");
+		AddRowCommand(4,"saeurestrahl");
+		AddRowCommand(4,"saeurestrahl");
+		AddRowCommand(4,"saeurestrahl");
+		AddRowCommand(3,"saeurestrahl");
+	}
+	if (level>=17)
+	{
+		val=((level>27)?10000:(level-16)*1000);
+		ModifySkill("schnell",val);
+		AddRowCommand(1,"schnell");
+		AddRowCommand(1,"schnell");
+	}
+	if (level>=12)
+	{
+		val=((level>27)?10000:(level-16)*1000);
+		ModifySkill("ausweichen",val);
+		AddRowCommand(1,"ausweichen");
+		AddRowCommand(1,"ausweichen");
+		AddRowCommand(1,"ausweichen");
+	}
+	if (level>=13)
+	{
+		val=((level>13)?10000:(level-12)*1000);
+		ModifySkill("kampfschrei",val);
+		AddAttackCommand("kampfschrei");
+		AddAttackCommand("kampfschrei");
+	}
+
+	ModifySkill(SK_FIGHT,([SI_SKILLABILITY:((level>50)?10000:level*200)]),150,"ANY");
+}
+
+//Nachbau...geklaut aus /std/player/skills.c
+
+StdSkill_Fight(object me, string sname, mapping sinfo)
+{
+  int val, w;
+  object enemy;
+
+  if (!mappingp(sinfo) || !objectp(sinfo[P_WEAPON]))
+    return 0;
+
+  w = ([WT_KNIFE : 8,
+        WT_SWORD : 5,
+        WT_AXE   : 4,
+        WT_SPEAR : 6,
+        WT_CLUB  : 1,
+        WT_WHIP  : 9,
+        WT_STAFF : 7])[sinfo[P_WEAPON]->QueryProp(P_WEAPON_TYPE)];
+
+
+  val = sinfo[SI_SKILLABILITY]*(sinfo[P_WEAPON]->QueryProp(P_WC)*
+                                (w*QueryAttribute(A_DEX)+
+                                 (10-w)*QueryAttribute(A_STR))/800)
+        /MAX_ABILITY;
+
+  sinfo[SI_SKILLDAMAGE]+=val;
+
+  //Naja, gut. Lernen hab ich nicht uebernommen, das tut der NPC nicht.
+
+}
+
+void SpellAttack(object enemy)
+{
+	int row;
+	string* cmds;
+	row=PresentPosition();
+	cmds=attack_kommandos;
+	if (pointerp(row_kommandos[row]))
+		cmds+=row_kommandos[row];
+	if (sizeof(cmds)>0)
+		command(cmds[random(sizeof(cmds))]);
+	::SpellAttack(enemy);
+}
+
+int Defend(int dam, mixed dam_type, mixed spell, object enemy)
+{
+	if (sizeof(defend_kommandos)>0)
+		command(defend_kommandos[random(sizeof(defend_kommandos))]);
+	::Defend(dam,dam_type,spell,enemy);
+}
+
+BuildUp(int spielerlevel)
+{
+	// Sehr simpel, zugegeben.
+	create_default_npc(spielerlevel);
+	BuildSkills(spielerlevel);
+	AddPreferedRow(spielerlevel>30?4:(spielerlevel>15?3:(spielerlevel>11?2:1)));
+}
