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