The H_MOVE_OBJECT0/1 implement the details of moving objects.
In older drivers, init() was called to handle the adding of
actions, and a lot of hook implementations still follow this
The main purpose of this function is to publish the commands
an object implements to other, living objects. Traditionally,
whenever a living object enters the vicinity of another
object, init() is called in the latter and this_player() will
point to the former object. This happens mutually should both
objects happen to be living.
Or more formally:
If the object O that moves is marked as living then first
call init() of the destination object D with this_player()
set to O.
Then apply the two following rules for each object C
If C is marked as living then call O->init() with
this_player() set to C.
If O is marked as living then call C->init() with
this_player() set to O.
Finally, if D is marked as living then call O->init(),
with this_player() set to D.
Starting with 3.2.1, the actual move handling became part of the
object library, so a given installation may implement any other scheme
of calling init().
One caveat: commands defined in the player object for the player
himself should not be defined in init(), as these commands would be
added to _other_ players whenever they happen to be nearby. Instead
use a separate function ("add_player_commands()" or so) which
is called during the creation of the player.
(This example assumes a traditional implementation of the
Lets say we have a object structure of living (l1 and l2) and
non living objects (n1 and n2) as the following:
If we now move another living object l3 into l1, the call
sequence of the init() functions looks like this:
l1->init() first init() of the destination will be called
n1->init() now iterate through the inventory of the destination
l3->init() and finally call init() of the object that has
add_action(E), set_environment(E), environment(E), move_object(E),