
move()
******

move()

FUNKTION:
   Fuer unbelebte Gegenstaende (/std/thing):
      varargs int move(object|string dest, int method);

   Fuer Lebewesen (/std/living, /std/npc, usw.):
      varargs int move(object|string dest, int method, string dir,
         string textout, string textin);


DEFINIERT IN
============

   /std/thing/moving.c
   /std/living/moving.c


ARGUMENTE
=========

   dest
        Das Zielobjekt (entweder der Dateiname oder das Objekt selbst).

   method
        Die Art der Bewegung (eine der unten aufgefuehrten Arten; es
        koennen auch mehrere zusammenge-ODER-t werden).

   dir
        Die Richtung, in die ein Lebewesen geht. Normalerweise ist das die
        eingeschlagene Laufrichtung (zB. "nach Norden").

   textout
        Verlaesst ein Lebewesen einen Raum, so wird diese Meldung in den
        Raum geschickt. Ist bei dir ein String angegeben, so wird dieser
        noch an textout angehaengt. Der Name des Lebewesens wird der
        Meldung in jedem Fall vorangestellt.

   textin
        Dieser Text wird im Zielraum ausgegeben, wenn ein Lebewesen ihn
        betritt. Bei normaler Fortbewegung ist das "kommt an". Dem Text
        wird noch der Name des Spielers vorangestellt.


BESCHREIBUNG
============

   Es wird versucht, das Objekt in das Zielobjekt dest zu bewegen.
   Abhaengig vom momentanen Aufenthaltsort und dem Zielobjekt ist die
   Bewegungsmethode method zu waehlen.

   In <moving.h> sind folgende Konstanten fuer die Art der Bewegung
   definiert:
   M_NOCHECK
        Es werden keine Abfragen durchgefuehrt, ob das Objekt ueberhaupt
        in das Zielobjekt hineinpasst (was zB. aus Gewichtsgruenden der
        Fall sein koennte).

   M_GO
        Ein Lebewesen bewegt sich gehend von einem Raum in den naechsten.
        Bei normalem Gehen wird diese Methode benutzt; man sollte sie auch
        benutzen, wenn man Spieler ueber einen SpecialExit in einen
        benachbarten Raum bewegt.

   M_TPORT
        Ein Lebewesen wird von einem Raum in einen anderen teleportiert.
        Im Gegensatz zu M_GO kann ein Raum verhindern, dass man ihn
        mittels M_TPORT verlaesst oder betritt.

   M_NO_SHOW
        Beim Bewegen von Lebewesen bekommen diese die Beschreibung des
        Zielraumes nicht ausgegeben.

   M_NO_ATTACK
        Beim Bewegen von Lebewesen bekommen diese keinen
        Begruessungsschlag, wenn ein Feind im Zielraum steht.

   M_SILENT
        Es werden beim Bewegen keine Meldungen ausgegeben. Dieser
        Parameter wirkt sich nur auf das Bewegen von Lebenwesen aus.

   M_GET
        Das Objekt wird von einem unbelebten Objekt (zB. einem Raum, einer
        Leiche, einem Beutel) in ein lebendes Objekt (Spieler oder NPC)
        bewegt.

   M_PUT
        Das Objekt wird von einem lebenden Objekt in ein unbelebtes Objekt
        bewegt.

   M_GIVE
        Das Objekt wird von einem Lebewesen an ein anderes Lebewesen
        weitergereicht.

   M_MOVE_ALL (Nur fuer Objekte, die /std/unit.c erben)
        Es wird die gesamte Menge bewegt, nicht nur ein Teil.

   Soll das Objekt auf jeden Fall und ohne jede Abfrage bewegt werden, so
   reicht es, als method M_NOCHECK zu uebergeben.

   Waffen und Ruestungen werden, soweit sie gezueckt bzw. angezogen sind,
   beim Bewegen auf jeden Fall weggesteckt bzw. ausgezogen. Ist in method
   M_SILENT enthalten, so geschieht dies ohne Meldungen.

   Die erste Art des Funktionsaufrufs ist sowohl beim Bewegen von
   Lebewesen als auch von unbelebten Objekten moeglich. Die zweite Art
   laesst sich nur bei Lebewesen anwenden.


ANMERKUNG
=========

   Diese Funktion sollte nicht (mehr) ueberschrieben werden. Stattdessen
   greift bitte auf PreventMove() und NotifyMove() zurueck. RMs sind
   aufgerufen, Objekt mit ueberschriebenen move() nur noch dann
   anzuschliessen, wenn der Zweck sonst nicht erreicht werden kann. Solltet
   ihr move() ueberschreiben: Seid euch sehr genau im klaren, was move()
   genau macht. ;-)



   Wenn Livings bewegt werden, sorgt move() automatisch in Abhaengigkeit
   von P_PARA dafuer, dass das Lebewesen in der korrekten (Parallel-)Welt
   landet.

   Bei Gegenstaenden wird ebenfalls versucht, die richtige Zielwelt
   auszuwaehlen (damit z.B. in der Parallelwelt geworfene Bumerangs auch nur
   innerhalb der Parallelwelt fliegen). Um Rechenzeit zu sparen, wird das
   allerdings nur versucht, wenn 'dest' ein Filename ist und kein Objekt.

   Grund: bei Zielobjekten handelt es sich meist um Bewegungen in das Inv
   oder Env eines Spielers - und die sind uninteressant. Raumwechsel dagegen
   erfolgen fast immer unter Angabe eines Filenamens anstatt eines Objektes.


RUeCKGABEWERT
=============

   Alle Rueckgabewerte sind als symbolische Konstanten in <moving.h>
   definiert. (MOVE_OK ist 1, alle anderen sind <0 und symbolisieren Fehler.
   Traditionell erfolgt die Pruefung auf erfolgreiches Move mit == 1, in
   Zukunft wird == MOVE_OK empfohlen.)



   MOVE_OK
        Die Bewegung wurde erfolgreich abgeschlossen.

   ME_PLAYER
        Lebewesen lassen sich nicht ohne weiteres bewegen. Es muss
        mindestens eine der Methoden M_NOCHECK, M_GO oder M_TPORT
        angegeben werden.

   ME_TOO_HEAVY
        Das Zielobjekt kann dieses Objekt aus Gewichtsgruenden nicht mehr
        aufnehmen.

   ME_CANT_TPORT_IN
        Das Zielobjekt verbietet das Teleportieren in sich hinein (nur bei
        M_TPORT ohne M_NOCHECK).

   ME_CANT_TPORT_OUT
        Der Raum, in dem sich das Lebewesen befindet, verbietet das
        Teleportieren aus sich hinaus (nur bei M_TPORT ohne M_NOCHECK).

   ME_CANT_BE_DROPPED
        Das Objekt kann nicht fallen gelassen werden (zB. weil P_NODROP
        gesetzt ist).

   ME_CANT_BE_TAKEN
        Das Objekt kann nicht genommen werden (zB. weil P_NOGET gesetzt
        ist).

   ME_CANT_BE_INSERTED
        Das Zielobjekt verhindert das Einfuegen aus bestimmten Gruenden.

   ME_CANT_LEAVE_ENV
        Der Container verhindert ein verlassen des Objektes

   ME_TOO_HEAVY_FOR_ENV
        Ein Objekt kann einen Behaelter nicht verlassen, da es dem
        Lebewesen sonst zu schwer wuerde.

   TOO_MANY_OBJECTS
        Das Zielobjekt kann soviele Objekte nicht mehr aufnehmen.

   ME_NOT_ALLOWED
        Raeume mit gesetzter Property P_NO_PLAYERS koennen nur von
        Testspielern und Magiern betreten werden. Bei Spielern oder
        Gildentesties gibt es diese Fehlermeldung.
   ME_WAS_DESTRUCTED
        Das Objekt hat sich entweder im Verlaufe der Bewegung selbst
        zerstoert oder wurde zerstoert, sodass move() nicht erfolgreich
        beendet werden konnte. (Bsp: sensitive Objekte)

   ME_DONT_WANT_TO_BE_MOVED
        Das Objekt moechte nicht bewegt werden.


BEISPIELE
=========

   o Ein Objekt "gibt sich" dem Spieler:

     move(this_player(), M_GET);

   o Ein Lebewesen wird in die Abenteurergilde teleportiert:

     lv->move("/gilden/abenteurer", M_TPORT);

   o Ein Spieler "wird in die Gilde gegangen":

     this_player()->move("/gilden/abenteurer", M_GO, "in die Gilde");

     Spieler, die mit ihm im gleichen Raum stehen, sehen folgende
     Meldung:
     "<name> geht in die Gilde."

   o Ein Spieler schwimmt durchs Meer:

     this_player()->move("meer_xy", M_GO, "nach Norden", "schwimmt",
                         "schwimmt herein");

     Spieler in seinem Startraum sehen "<name> schwimmt nach Norden.",
     Spieler in seinem Zielraum sehen "<name> schwimmt herein."


SIEHE AUCH
==========

   move_object(), remove(), setmin, setmmin, setmout, setmmout, review,
   PreventInsert(), PreventLeave(), PreventInsertLiving(),
   PreventLeaveLiving(), PreventMove(), NotifyInsert(), NotifyLeave(),
   NotifyMove(), NotifyRemove(), init(), exit(),
   P_NO_PLAYERS, P_PARA, /std/thing/moving.c, /std/living/moving.c
   -----------------------------------------------------------------------

2015-Jan-19, Arathorn
