diff --git a/doc/wiz/fernkampfwaffen b/doc/wiz/fernkampfwaffen
new file mode 100644
index 0000000..f8dd285
--- /dev/null
+++ b/doc/wiz/fernkampfwaffen
@@ -0,0 +1,128 @@
+Zusammenfassung zu Fernkampfwaffen
+==================================
+
+  Schusswaffe:
+  ============
+    Standardobjekt: /std/ranged_weapon.c
+
+    P_WC:           gibt den Schaden im Nahkampf an (wenn man damit auf einen
+                    Gegner einpruegelt. Default 30.
+    P_QUALITY:      nur beim Nahkampf relevant. Default 100.
+    P_NR_HANDS:     Boegen und Armbrueste sind in jedem Fall zweihaendig.
+    P_SHOOTING_WC:  Die Basis-Waffenklasse der Fernwaffe.
+    P_RANGE:        Reichweite der Waffe. Default 50.
+    P_STRETCH_TIME: Anzahl der Runden, die zum Laden/Spannen der Waffe
+                    benoetigt werden. Default 1.
+    P_AMMUNITION:   Benoetigter Munitionstyp.
+
+    Eine HitFunc wirkt sich auf die P_WC aus, nicht auf P_SHOOTING_WC!
+
+    Methoden:
+    static int cmd_shoot(string str);
+    * Befehlsauswertung und Schussvorbereitung, wird durch
+      AddCmd( ({"schiess", "schiesse"}), "cmd_shoot");
+      verknuepft
+
+    static int shoot_dam(mapping shoot);
+    * Schadensermittlung
+
+    static string FindRangedTarget(string str, mapping shoot);
+    * Gegnerermittlung
+
+  Munition:
+  =========
+    Standardobjekt: Nutzung von /std/unit ist empfohlen
+
+    P_SHOOTING_WC: legt die Munitionsstaerke fest
+    P_DAM_TYPE:    legt die Schadensart des Schussangriffs fest
+
+    Eine HitFunc in der Munition wirkt sich auf P_SHOOTING_WC aus!
+
+  Allgemeines:
+  ============
+    In der Waffe legt man ueber P_AMMUNITION fest, welche Art Munition
+    damit verschossen werden kann. In der Munition muss diese Munition
+    auch als ID gesetzt werden.
+
+    Ueber P_STRETCH_TIME legt man fest, alle wieviel Runden die
+    Fernkampfwaffe abgefeuert werden kann (default: 1).
+
+    Der verursachte Schaden wird aus der Staerke der Fernkampfwaffe
+    und der Staerke der Munition bestimmt. In beiden wird diese in der
+    Property P_SHOOTING_WC angegeben.
+
+    Zusaetzlich kann man in P_RANGE die Reichweite der Fernkampfwaffe
+    festlegen. Hat man einen Raum A, der sich innerhalb eines anderen
+    Raumes befindet (z.B. Transporter), so kann man mittels P_SHOOTING_AREA
+    dessen 'Groesse' festlegen. Mit einer Waffe, deren P_RANGE mindestens
+    gleich diesem Zahlenwert ist, kann aus diesem Raum heraus geschossen
+    werden.
+    Alternativ kann man in A einen anderen Raum B)in die Property
+    P_TARGET_AREA schreiben.
+
+BEISPIEL:
+    // #1 siehe auch /doc/beispiele/fernwaffen fuer ladbaren Code
+
+    // #2 eine einfache, aber gute Schleuder
+    inherit "/std/ranged_weapon";
+
+    void create() {
+      if (!clonep(this_object())) return;
+      ::create();
+
+      SetProp(P_SHORT, "Eine Schleuder");
+      SetProp(P_INFO,
+        "Die Syntax lautet: schleuder <geschoss> auf <ziel>\n");
+      // sonstige Objektprops ...
+
+      RemoveCmd(({"schiess", "schiesse"})); // entferne Default-Kommando
+      AddCmd(({"schleuder", "schleudere"}), #'cmd_shoot);
+
+      SetProp(P_WC, 10);          // eine Schleuder ist erstmal harmlos
+      SetProp(P_DAM_TYPE, DT_WHIP);
+
+      SetProp(P_SHOOTING_WC, 90); // ziemlich gute Schleuder
+      SetProp(P_NR_HANDS, 1);     // einhaendig
+      SetProp(P_WEAPON_TYPE, WT_RANGED_WEAPON);
+      SetProp(P_AMMUNITION, MUN_STONE);
+      SetProp(P_STRETCH_TIME, 1);
+      SetProp(P_RANGE, 30);       // 30 weit kann man damit nur schleudern
+    }
+
+    // #3 passende Munition
+    inherit "/std/unit";
+
+    void create() {
+      if (!clonep(this_object())) return;
+      ::create();
+
+      SetProp(P_NAME, ({"Schleuderstein", "Schleudersteine"}) );
+      SetProp(P_LONG, break_string(
+        "Hervorragend geformte Schleudersteine aus Murmelnit.", 78));
+      SetProp(P_GENDER, MALE);
+      SetProp(P_AMOUNT, 1);
+      SetProp(P_SHOOTING_WC, 50);
+      SetProp(P_DAM_TYPE, ({DT_BLUDGEON}));
+      SetProp(P_WEAPON_TYPE, WT_AMMU);
+      SetProp(P_MATERIAL, MAT_STONE);
+
+      SetGramsPerUnits(60,1);
+      SetCoinsPerUnits(25,1);
+
+      AddId(MUN_STONE);
+      AddSingularId(({"stein", "schleuderstein"}));
+      AddPluralId(({"steine", "schleudersteine"}));
+      AddClass(CL_AMMUNITION);
+    }
+
+SIEHE AUCH:
+    Generell:  P_SHOOTING_WC, P_STRETCH_TIME, P_AMMUNITION
+    Methoden:  FindRangedTarget(L), shoot_dam(L)
+    Gebiet:    P_RANGE, P_SHOOTING_AREA, P_TARGET_AREA
+    Waffen:    P_WEAPON_TYPE, P_WC, P_EQUIP_TIME, P_NR_HANDS
+    Kampf:     Attack(L), Defend(L), P_DISABLE_ATTACK, P_ATTACK_BUSY
+    Team:      PresentPosition(L)
+    Sonstiges: P_NOGET
+    Balance:   fernwaffen, waffen, balance
+
+29.Jul 2014 Gloinson
\ No newline at end of file
