This documentation is not uptodate. Latest version is in the python.ps file,
or available online from http://wiki.metalforge.net/doku.php/cfpython



THE PYTHON PLUGIN, VERSION 2.0
===============================

What is the Python Plugin ?
---------------------------
It is a plugin part of the Crossfire server that allows map-makers to create
object behaviors using Python scripts instead of having to hardcode them in C.


Converting from CFPython 0.x and 1.0
------------------------------------
A lot of things have changed which hopefully make your Python coder's life a
little more comfortable.

1. The library name is now "Crossfire", instead of the previous "CFPython". No,
   that's not to annoy you without purpose. It will force you to think about
   reading your old Python code and make the necessary conversions.
2. Objects and Maps are now wrapped into Python objects. It means that instead
   of writing "CFPython.Teleport(object,map,x,y)", you'll now have to write
   "object.Teleport(map,x,y)". It is somewhat more logical and contributes to
   cleaner Python code.
3. The plugin event hook mechanism is now based on event objects contained in
   WhoAmI's inventory.

To make the transition as easy as possible, most functions of CFPython were
converted using the following rules:
- If the function was a getter/setter of an object or map attribute, it is now
  available as a Python object attribute.
  Examples: print CFPython.GetDamage(object) --> print object.Damage
            CFPython.SetDamage(object, value) --> object.Damage = value
- If the function was an action performed by an object/a map, or related to a
  specific object/map, it is now available as a Python object method.
  Examples: CFPython.Take(object, what) --> object.Take(what)
            CFPython.CheckMap(what, map, x, y) --> map.Check(what,x,y)

Only a few methods/attributes have changed names (this is the case for the seven
base attributes STR,DEX,CON,INT,WIS,POW,CHA for example).

Note that although it may seem that converting your old scripts to the new
format will be a huge job, it is rather straightforward in most cases. It only
took me an afternoon to convert and test all the scripts supplied with the
default map set, and I wasn't even their original author.


How do I hook a script to an object?
------------------------------------

There are special archetypes named event_xxx available. You need to put those in
the inventory of the objects to which you want to connect your script.

Some fields of the event_xxx archetypes have a special meaning:

- name: all parameters you want to pass to the scripts should go there;
- title: this is the plugin identifier. For the Python plugin, it is "Python"
         (without the quotes);
- slaying: the name of the script file to execute when the event is triggered.
        Note that this name is relative to the map base directory.

Example:

arch event_apply
name parms
title Python
slaying test.py
end

The event will be triggered when the container object is applied and will run
share/crossfire/maps/test.py, passing "parms" as a parameter string to the
script.

You of course need to write some Python code too... You do as usual, but
remember to add an "import Crossfire" to make all crossfire-specific functions
available in your script.


How do I hook a global event?
-----------------------------

Each global event is bound to a specific Python script file. Those files are
located in the python/events/ subdirectory of your crossfire map directory.
They have specific names, too: python_xxx.py, where xxx is the name of the
global event you want to intercept. For example, a script that should be run
each time a player logs in ("login" event) should be named python_login.py.


What functions are currently supported?
---------------------------------------

A complete list of those functions is given below.

Last count (2005-03-06) result: 217 functions (not including attack type/event
type wrapper functions). This of course does not include all the Python
functions, just the crossfire-specific ones.

In the following, I use the following type naming convention:
int   : An integer.
long  : A long.
float : A float.
object: A crossfire object. (In fact, it is a long).
map   : A crossfire map. (In fact, it is a long).
string: A character string.

1. Global Methods
+++++++++++++++++

Those are provided by the Crossfire library directly, so to call them, you have
to write something like: Crossfire.Method().

ConfigDirectory()    (1.x name: GetConfigurationDirectory())
  Return the name of the base directory containing Crossfire configuration
  files.
  Returns the directory name as a string.

DirectionN()
  Wrapper for the North direction.
  Return value: an integer representing the direction.

DirectionNE()
  Wrapper for the North-East direction.
  Return value: an integer representing the direction.

DirectionE()
  Wrapper for the East direction.
  Return value: an integer representing the direction.

DirectionSE()
  Wrapper for the South-East direction.
  Return value: an integer representing the direction.

DirectionS()
  Wrapper for the South direction.
  Return value: an integer representing the direction.

DirectionSW()
  Wrapper for the South-West direction.
  Return value: an integer representing the direction.

DirectionW()
  Wrapper for the West direction.
  Return value: an integer representing the direction.

DirectionNW()
  Wrapper for the North-West direction.
  Return value: an integer representing the direction.

2. Object-Specific Methods
++++++++++++++++++++++++++

Those are provided by the Python object wrapper.

ActivateRune(object activator)
  Trigger the rune. Note that both the rune and its activator must be in the
  same or in adjacent tiles of the same map.
  Does not return a value.

  Example:
    who = Crossfire.WhoIsActivator()
    rune = who.Map.CreateObject("rune_burning_hands", who.X, who.Y)
    rune.ActivateRune(who)

Apply(object what, int flags)
  Make the object apply an object 'what'. The applying object can be a
  player or a monster. The applied object need not be on the same tile as
  the applier. 'flags' specifies how to apply the object:
   - 0=toggle (apply/unapply) the object
   - 1=always apply the object
   - 2=always unapply the object
  Additionally, you can specify some modifier bits:
   - 16=do not merge an unapplied object with other objects
   - 32=unapply the item even if it is cursed
   - 64=print the object name but do not apply/unapply it

  Return value: integer denoting the result:
   - 0=player or monster can't apply an object of that type
   - 1=object has been applied, or there was an error applying the object
   - 2=objects of that type can't be applied if not in inventory

  Example:
    who = Crossfire.WhoIsActivator()

# create and apply a trigger object
    trigger = who.Map.CreateObject("trigger", who.X, who.Y)
    result = who.Apply(trigger, 0); # returns 1

# create and apply an amulet
    food = who.Map.CreateObject("amulet of sustenance", who.X, who.Y)
    result = who.Apply(food, 0); # returns 2

# create and apply/unapply a cursed shield
    shield = who.CreateObject("small shield")
    shield.Cursed = 1;
    result = who.Apply(shield, 1); # returns 1
    result = who.Apply(shield, 2); # returns 1 (it does not unapply the item)
    result = who.Apply(shield, 2|32); # returns 1

LearnSpell(object spell)   (1.x name: AcquireSpell)
  Learn the spell identified by a spell object.
  Does not return a value.

  Example:
    who = Crossfire.WhoIsActivator()
    spell = Crossfire.CreateObjectByName("spell_large_fireball")
    who.LearnSpell(spell)
    spell.Remove()

Say(message text)
  Say 'text'.
  Does not return a value.

3. Object-Specific Attributes
+++++++++++++++++++++++++++++

CanCastSpell
  Test if the object can cast spells.
  Return value: test result as an integer - 0 if and only if false.

CanPassThru
  Test if the object has the 'pass through' ability.
  Return value: test result as an integer - 0 if and only if false.

CanPickUp
  Test if the object can pick up stuff.
  Return value: test result as an integer - 0 if and only if false.

CanRoll
  Test if the object can roll.
  Return value: test result as an integer - 0 if and only if false.

CanSeeInDark
  Test if object has got infravision capabilities.
  Return value: test result as an integer - 0 if and only if false.

CanSeeInvisible
  Test if the object can see invisible things.
  Return value: test result as an integer - 0 if and only if false.

CanUseArmour
  Test if the object can wear armor.
  Return value: test result as an integer - 0 if and only if false.

CanUseBow
  Test if the object can use a bow.
  Return value: test result as an integer - 0 if and only if false.

CanUseHorn
  Test if the object can use a horn (and other musical instruments).
  Return value: test result as an integer - 0 if and only if false.

CanUseRing
  Test if the object can use rings.
  Return value: test result as an integer - 0 if and only if false.

CanUseRod
  Test if the object can use magical rods.
  Return value: test result as an integer - 0 if and only if false.

CanUseScroll
  Test if the object can read scrolls.
  Return value: test result as an integer - 0 if and only if false.

CanUseSkill
  Test if the object can use skills.
  Return value: test result as an integer - 0 if and only if false.

CanUseWand
  Test if the object can use a magical wand.
  Return value: test result as an integer - 0 if and only if false.

CanUseWeapon
  Test if the object can use a weapon.
  Return value: test result as an integer - 0 if and only if false.


4. Map-Specific Methods
+++++++++++++++++++++++

Those are provided by the Python map wrapper.

5. Map-Specific Attributes
++++++++++++++++++++++++++


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TODO: Finish converting the 1.x docs.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


A
AttackTypeXxx()
  Wrapper for attack type Xxx. Possible values for Xxx are: Acid Blind
  Cancellation Chaos Cold Confusion Counterspell Death Depletion Disease Drain
  Electricity Fear Fire Ghosthit Godpower HolyWord LifeStealing Magic Paralyze
  Physical Poison Slow TurnUndead Weaponmagic.
  Return value: an integer representing the attack type.

B
BlocksView(object obj)
  Check if 'obj' can block the line-of-sight.
  Return value: test result as in integer - 0 if and only if false.

C

CastAbility(object who, object caster, string spell, int direction, string
  options)
  Make the object 'caster' cast a 'spell'. 'who' is the owner of the casting
  object; 'who' and 'caster' may be the same item. The spell is identified by
  the spell name and cast into the given direction. 'options' can hold some
  options.
  Does not return a value.

  Note: to cast a spell by a spell object, use CastSpell().

  Example:
    who = CFPython.WhoIsActivator()
    caster = CFPython.CreateObjectInside("horn of Fire", who)
    CFPython.CastAbility(who, caster, "spell_firebolt", CFPython.DirectionE(), "")

  Example:
    who = CFPython.WhoIsActivator()
    CFPython.CastAbility(who, who, "spell_create_food", 0, "booze")

CastSpell(object who, object spell, int direction, string options)

  Make 'who' cast a spell, identified by a spell object, into one direction.
  'options' can hold some options.
  Does not return a value.

  Note: this function is similar to CastAbility() except that a spell object
  (instead of a spell name) is used and that 'caster' is set to 'who'.

  Note: the spell will be cast even if the 'who' has not sufficient spell
  points; in fact, 'who' may end with negative spell points.

  Example:
    # make the activator cast a large fireball (if he knows that spell)
    who = CFPython.WhoIsActivator()
    spell = CFPython.DoKnowSpell(who, "large fireball")
    if spell: CFPython.CastSpell(who, spell, CFPython.DirectionSE(), "")

CheckArchInventory(object who, string arch_name)
  Check if 'who' has an object with the archetype 'arch_name' in his inventory.
  Return value: the first matching object or 0 if the archetype was not found.

  Example:
    who = CFPython.WhoIsActivator()
    obj = CFPython.CheckArchInventory(who, 'key2')
    if obj: CFPython.Write(CFPython.GetName(obj), who)

CheckInventory(object who, string name)
  Check if 'who' has an object named 'name' in his inventory. It first checks
  for any item with a matching archetype name, then for an object with a name
  beginning with 'name'.
  Return value: the matching object or 0 if no object was found.

CheckInvisibleObjectInside(object who, string id)
  Check for the existence of an force object with a slaying field 'id' inside
  'who'.
  Return value: The force object found or 0.

CheckMap(string what, map map, (int x, int y))
  Check for an item with the archetype name 'what' in a map at a given
  position. The function works for tiled maps.
  Return value: The object found or 0.

CheckTrigger(object trigger, object what)
  Try to trigger an object 'trigger' by 'what'. The object 'what' may be
  destroyed. (For example if 'trigger' is an altar.)
  Does not return a value.

  Example:
    # create and trigger an altar
    altar = CFPython.CreateObject("altar_trigger", (0, 0))
    food = CFPython.CreateObject("food", (1, 0))
    CFPython.SetQuantity(food, 5)
    CFPython.CheckTrigger(altar, food)

CostFlagXxx()
  Wrapper for flags to use as the third parameter of GetObjectCost(). You must
  always choose one of FBuy, FSell, or FTrue. You may add any other flags as
  well. Possible Values for Xxx are:
   - FBuy: item value for a player buying the item
   - FSell: item value for a player selling the item
   - FTrue: true value of the item
   - FNoBargain: disable modifications due to bargaining skill
   - FIdentified: pretend the item as identified
   - FNotCursed: pretend the item as not cursed
  Return value: integer integer representing the flag.

CreateInvisibleObjectInside(object where, string name)
  Create a force object with a slaying field of 'name'. The object is placed in
  the inventory of 'where'.
  Return value: the created force object.

  Note: The statement "obj = CFPython.CreateInvisibleObjectInside(who, 'slay')"
  is basically the same as:
    obj = CFPython.CreateObjectInside('force', who)
    CFPython.SetSlaying(obj, 'slay')
    CFPython.SetSpeed(obj, 0)

CreateObject(string name, (int x, int y)[, string map])
  Create an object from the archetype 'name', or with the name 'name'. Insert
  it at position (x,y) in the map. If map is omitted, it defaults to
  GetMap(WhoAmI()).
  Return value: the created object. Note that the returned object may have
  nrof>1 if the new item has been merged with other objects.

  Note: Not all types of objects can be created; for example, objects of type
  PLAYER will crash the server.

  Note: Not all kinds of objects are created correctly; for example, currently
  a "horn of Fire" cannot be created: it creates a working horn but it is blue
  with message "Putting this shell to you ear, you hear a strange and haunting
  melody" and it is god-given.

  Note: This function does not work correctly if the object contains a
  "randomitems" field in the archetype.

CreateObjectInside(string name, object where)
  Create an object from the archetype 'name', or with the name 'name'. Insert
  it into the inventory of 'where'.
  Return value: the created object

  Note: see CreateObject()

  Examples:
    CFPython.CreateObjectInside("stylus", CFPython.WhoAmI()) # archetype name
    CFPython.CreateObjectInside("writing pen", CFPython.WhoAmI()) # object name
    CFPython.CreateObjectInside("levitation boots of mobility", CFPython.WhoAmI()) # artifact object

D
DecreaseObjectNr(object ob, int nrof)
  Remove the given number of items from ob. If nrof is equal or more
  than the items left in ob, ob is removed.
  Return value: the object ob if some items are still remaining or 0 if all
  objects are removed.

DoKnowSpell(object who, string spell)
  Check if 'who' knows the spell by the name of 'spell'.
  Returns the spell object if 'who' knows the spell or 0 if not.

  Example: see CastSpell()

Drop(object who, string name)
  Let 'who' drop the items named 'name'.
  Does not return a value.

E
EventXxx()
  Wrapper for event type Xxx. Possible values are: Apply Attack Close Death
  Drop Pickup Say Stop Throw Time Timer Trigger.
  Return value: an integer representing the event type.

F
FindPlayer(string name)
  Check for a player with the given name. Note: the comparison is
  case-sensitive and does not allow for partial matches.
  Return value: the player object or 0 if not found.

FixObject(object who)
  Update all abilities granted by applied objects in the inventory of the
  given object. This functions starts from base values (archetype or player
  object) and then adjusts them according to what the object has equipped.
  Does not return a value.

ForgetSpell(object who, string spell)
  Cause who to forget the spell named 'spell'.  who must be a player.
  Does not return a value.

  Example:
    who = CFPython.WhoIsActivator()
    CFPython.ForgetSpell(who, "large fireball")

G
GetAC(object who)
  Get the Armor Class coefficient associated with the given object.
  Returns the armor class coefficient as an integer.

GetArchType(object who)
  Get the archtype name of an object.
  Returns the archtype as a string.

GetAttackType(object who)
  Determine the attack type of an object.
  Returns the attack type as an integer.

GetCharisma(object who)
  Get the Charisma value of the given object.
  Returns the charisma value as an integer.

GetConstitution(object who)
  Get the Constitution value of the given object.
  Returns the constitution value as an integer.

GetDamage(object who)
  Get the amount of damage associated with the given object.
  Returns the damage value as an integer.

GetDataDirectory()
  Return the name of the base directory containing the Crossfire read only data
  files.
  Returns the directory name as a string.

GetDexterity(object who)
  Get the Dexterity value of the given object.
  Returns the dexterity value as an integer.

GetDirection(object who)
  Determine the direction an turnable object 'who' is currently moving. Use
  IsTurnable(who) to determine if an object is turnable.
  Returns the direction as an integer.

GetEventHandler(object who, int event)
  Get the event handler of 'who' for the event number 'event'. The parameter
  'event' should be a value returned by EventXxx().
  Returns the event handler name as a string or no object if the handler is not
  used.

GetEventOptions(object who, int event)
  Get the event options of 'who' for the event number 'event'. The parameter
  'event' should be a value returned by EventXxx().
  Returns the event options as a string or no object if the handler is not
  used.

GetEventPlugin(object who, int event)
  Get the event plugin name of 'who' for the event number 'event'. The
  parameter 'event' should be a value returned by EventXxx().
  Returns the event options as a string or no object if the handler is not
  used.

GetExperience(object who)
  Get the amount of experience associated with the object.
  Returns the event options as a long.

GetFacing(object who)
  Determine the direction an turnable object 'who' is currently facing. It
  is similar to GetDirection except it works for non-moving objects too. See
  GetDirection for details.
  Returns the direction as an integer.

GetFirstObjectOnSquare(map map, int x, int y)
  Get the first object at position (x,y) in the map 'map'. Use
  GetPreviousObject() to find the next item(s).
  Returns the object or 0 if the position is empty.

GetFood(object who)
  Get the food level of the given object.
  Returns the food level as an integer.

GetGod(object who)
  Get the name of the god associated with the given object. Usually, this will
  be the god 'who' is worshipping.
  Return value: the god name as a string or no object if 'who' has no god.

GetGrace(object obj)
  Get the grace amount of the given object.
  Returns the grace amount as an integer.

GetHP(object who)
  Get the amount of Hit Points associated with the given object.
  Returns the amount of hit points as an integer.

GetHumidity(int x, int y, map map)
  Get the humidity level of a given square of a map.
  Returns the humidity level as an integer.

  Remark: not implemented. Always returns zero.

GetIntelligence(object who)
  Get the Intelligence value of the given object.
  Returns the intelligence value as an integer.

GetInternalName(object who)
  Get the name of 'who' without any modifications.
  Returns the object name as a string.

GetInventory(object who)
  Get the first inventory object of 'who'. Use GetNextObject() to find the next
  inventory objects.
  Returns the object or 0 if the inventory is empty.

GetIP(object player)
  Get the ip address of 'player'. The given object should be a player object.
  Returns the ip address as a string or no value if the object is not a player
  object.

GetLastGrace(object who)
  Get the last_grace parameter value associated with the given object.
  Returns the last_grace value as an integer.

GetLastSP(object who)
  Get the last_sp parameter value associated with the given object.
  Returns the last_sp value as an integer.

GetLevel(object who)
  Get the level of a given object.
  Returns the level as an integer.

GetLocalDirectory()
  Return the name of the base directory containing the Crossfire read-write
  data files.
  Returns the directory name as a string.

GetMap(object who)
  Determine the map the object 'who' is currently in.
  Returns the map as a map or 0 if the items is not part of a map.

GetMapDirectory()
  Return the name of the base directory containing the Crossfire maps. You need
  to concatenate the result with the value returned by GetDataDirectory() to
  get an absolute path.
  Returns the directory as a string.

GetMapHeight(map map)
  Get the height (the number of tiles) of a map.
  Returns the height as an integer.

GetMapObject()
  This function should not be used anymore. It always throws an exception.

GetMapPath(map map)
  Get the path name of the map.
  Returns the path name as a string.

GetMapWidth(map map)
  Get the width (the number of tiles) of a map.
  Returns the width as an integer.

GetMaxHP(object who)
  Get the maximum amount of Hit Points the given object can get.
  Returns the amount of hit points as an integer.

GetMaxSP(object who)
  Get the maximum amount of mana the given object can get.
  Returns the maximum amount of mana as an integer.

GetMessage(object obj)
  Get the message contained in the specified object. The message is what
  appears inside msg...endmsg tags.
  Returns the message as a string.

GetName(object who)
  Get the 'clear name' of the given object.
  Returns the name as a string.

GetNextObject(object obj)
  Get the next object below 'obj'.
  Returns the next object or 0 if 'obj' is the last object.

GetObjectAt(map map, int x, int y)
  Get the first object at position (x,y) in the map.
  Returns the object or 0 if the position is empty.

GetObjectCost(object who, object obj, int type)
  Determine the cost of an object 'obj' if 'who' would buy or sell it. The
  parameter 'type' should be one or more values returned by CostFlagXxx().
  Returns the cost in silver coins as an integer.

GetObjectMoney(object who)
  Determine how much money 'who' is carrying, including what is in containers.
  Returns the amount in silver coins as an integer.

GetPlayerDirectory()
  Return the name of the base directory containing the Crossfire players files.
  You need to concatenate the result with the value returned by
  GetLocalDirectory() to get an absolute path.
  Returns the directory as a string.

GetPower(object who)
  Get the Power value of the given object.
  Returns the power value as an integer.

GetPressure(int x, int y, map map)
  Get the humidity level of a given square of a map.
  Returns the humidity level as an integer.

  Remark: not implemented. Always returns zero.

GetPreviousObject(object obj)
  Get the object before 'obj'.
  Returns the previous object or 0 if 'obj' is the first object.

GetQuantity(object obj)
  Return the number of items this object represents.
  Returns the number as a long.

GetReturnValue()
  Return the current exit status of the event script as an integer. See below
  for an overview of events that use the exit value.

GetSkillExperience(object who, string skill)
  Get the experience of skill 'skill' the object 'who' has. 'skill' should
  skill name.
  Returns the skill experience as a long or no value if 'who' does not know the
  skill.
  Example:
    who = CFPython.WhoIsActivator()
    exp = CFPython.GetSkillExperience(who, "alchemy")
    if exp != None:
        CFPython.Write("Alchemy experience %d"%(exp), who)
    else:
        CFPython.Write("Alchemy skill is unknown", who)

GetSlaying(object obj)
  Get the "slaying" field of an object.
  Returns the slaying value as a string.

GetSP(object who)
  Get the amount of mana possessed by the given object.
  Returns the amount of mana as an integer.

GetSpeed(object who)
  Get the speed of the given object.
  Returns the speed as a float.

GetStrength(object who)
  Get the Strength value of the given object.
  Returns the strength as an integer.

GetTempDirectory()
  Return the name of the base directory containing temporary Crossfire files
  (for example swapped-out maps).
  Returns the directory as a string.

GetTemperature(int x, int y, map map)
  Get the temperature of a given square of a map.
  Returns the temperature as an integer.

  Remark: not implemented. Always returns zero.

GetTitle(object who)
  Get the title of 'who'. The "title" is the artifact suffix of in item. For
  example, an "gauntlets of the Titans" has the title "of the Titans".
  Returns the title as a string or no value if the object has no title.

  Note: this function does not return the title the player has chosen for
  himself.

GetType(object who)
  Get the type of a given object, as a numerical identifier.
  Returns the type as an integer.

GetUniqueDirectory()
  Return the name of the base directory containing the Crossfire Unique items.
  You need to concatenate the result with the value returned by
  GetLocalDirectory() to get an absolute path.
  Returns the directory as a string.

GetValue(object who)
  Get the "value" field of an object.
  Returns the value as an integer.

GetWC(object who)
  Get the Weapon Class coefficient associated with the given object.
  Returns the weapon class coefficient as an integer.

GetWeight(object who)
  Determine the weight of the given object. The weight does not include the
  inventory.
  Returns the weight in grams as an integer.

GetWisdom(object who)
  Get the Wisdom value of the given object.
  Returns the wisdom value as an integer.

GetXPosition(object obj)
  Get the x-position of an object in its map.
  Returns the x-position as an integer.

GetYPosition()
  Get the y-position of an object in its map.
  Returns the y-position as an integer.

H
HasBeenApplied(object obj)
  Check whether the object has been applied before.
  Return value: test result as an integer - 0 if and only if false.

HasStealth(object obj)
  Check whether the object is stealthy.
  Return value: test result as an integer - 0 if and only if false.

HasXRays()
  Check whether the object uses or grants x-rays.
  Return value: test result as an integer - 0 if and only if false.

HitBack()
  Check whether the object has the hitback flag set.
  Return value: test result as an integer - 0 if and only if false.

I
InsertObjectInside(object obj, object environment)
  Insert the object 'obj' into 'environment'.
  Does not return a value.

  Example: see SetSlaying()

IsAlive(object who)
  Test if the given object is alive.
  Return value: test result as an integer - 0 if and only if false.

IsApplied(object who)
  Test if the given object is applied.
  Return value: test result as an integer - 0 if and only if false.

IsBlind(object who)
  Test if the given object causes blindness. For players, tests if he is blind.
  Return value: test result as an integer - 0 if and only if false.

IsCanBePicked(object who)
  Test if on object can be picked up.
  Return value: test result as an integer - 0 if and only if false.

IsConfused(object who)
  Test if the given object is confused.
  Return value: test result as an integer - 0 if and only if false.

IsCursed(object who)
  Test if the given object is cursed. Not that not all "damned" objects are
  cursed as well.
  Return value: test result as an integer - 0 if and only if false.

IsDamned(object who)
  Test if the given object is damned.
  Return value: test result as an integer - 0 if and only if false.

IsDungeonMaster(object who)
  Test if the given object is a DM.
  Return value: test result as an integer - 0 if and only if false.

IsFloor(object who)
  Test if the given object is a floor tile.
  Return value: test result as an integer - 0 if and only if false.

IsFlying(object who)
  Test if the given object is flying.
  Return value: test result as an integer - 0 if and only if false.

IsFriendly(object who)
  Test if the given object is in friendly mode.
  Return value: test result as an integer - 0 if and only if false.

IsGenerator(object who)
  Test if the given object is a generator.
  Return value: test result as an integer - 0 if and only if false.

IsIdentified(object who)
  Test if the given object is identified.
  Return value: test result as an integer - 0 if and only if false.

IsInvisible(object who)
  Test if the given object is invisible.
  Return value: test result as an integer - 0 if and only if false.

IsKnownCursed(object who)
  Test if the given object is known to be a cursed one.
  Return value: test result as an integer - 0 if and only if false.

IsKnownMagical(object who)
  Test if the given object is known to be a magical one.
  Return value: test result as an integer - 0 if and only if false.

IsLifesaver(object who)
  Test if the given object is a Lifesaver. For players, tests if he wears an
  object that is a Lifesaver.
  Return value: test result as an integer - 0 if and only if false.

IsMonster(object who)
  Test if the given object is a monster.
  Return value: test result as an integer - 0 if and only if false.

IsOfType(object obj, int type)
  Check if the object is of the given type.
  Return value: test result as an integer - 0 if and only if false.

  Note: There is no function to determine the type values by name.

  Example:
    if CFPython.IsOfType(CFPython.CreateObject("ring", (0, 0)), 70): # 70=RING
      # item is a ring

IsOutOfMap(object obj, int x, int y)
  Check if the object would be outside of the current map if moved to (x,y).
  This function works for tiled maps.
  Return value: test result as an integer - 0 if and only if false.

IsRunningAway(object who)
  Test if the given object is running away.
  Return value: test result as an integer - 0 if and only if false.

IsScared(object who)
  Test if the given object is scared.
  Return value: test result as an integer - 0 if and only if false.

IsSleeping(object who)
  Test if the given object is sleeping.
  Return value: test result as an integer - 0 if and only if false.

IsSplitting(object who)
  Test if the given object can split.
  Return value: test result as an integer - 0 if and only if false.

IsThrown(object who)
  Test if the given object is designed to be thrown.
  Return value: test result as an integer - 0 if and only if false.

IsTurnable(object who)
  Test if the given object can change its face with direction.
  Return value: test result as an integer - 0 if and only if false.

  Note: use SetDirection(who) to change the direction of turnable objects.

IsUnaggressive(object who)
  Test if the given object is in unaggressive mode.
  Return value: test result as an integer - 0 if and only if false.

IsUndead(object who)
  Test if the given object is an undead.
  Return value: test result as an integer - 0 if and only if false.

IsUnique(object who)
  Test if the given object is unique.
  Return value: test result as an integer - 0 if and only if false.

IsUnpaid(object who)
  Test if the given object is paid.
  Return value: test result as an integer - 0 if and only if false.

IsUsedUp(object who)
  Test if the given object has the flag "FLAG_IS_USED_UP" set.
  Return value: test result as an integer - 0 if and only if false.

  Example:
    who = CFPython.WhoIsActivator()
    obj = CFPython.CreateObject("burning item", (0, 0))
    CFPython.Write("IsUsedUp(%s)=%d"%(CFPython.GetName(obj), CFPython.IsUsedUp(obj)), who)


J
K
KillObject(object who, object what, int type)
  Kill the object 'what' in an combat-like fashion. 'who' is the object killing
  'what'. 'type' is the attack type; it should be one or more values returned
  by AttackTypeXxx().
  Does not return a value.

  Note: the death event of 'what' will be called.

L
LoadObject(string str)
  Construct an object from its string representation. Use SaveObject() to
  convert an object into its string representation.
  Returns the created object or 0 if the object could no be created.

M
MakeInvisible(object obj)
  Test if the given object makes the wielder invisible. For players, tests if
  he is invisible.
  Return value: test result as an integer - 0 if and only if false.

MatchString(string str, string regex)
  Try to match the string 'str' to a regular expression 'regex'.
  Return value: test result as an integer - 0 if and only if false.

Message(string text, object who[, int color])
  Write the message 'text' to the map of 'who'. 'color' determines the color
  and flags to use. (Consult the crossfire source code for all available flags
  NDI_*.) If 'color' if omitted, NDI_BLUE|NDI_UNIQUE is used.
  Does not return a value.

  Note: to write a message to just one player, use Write().

N
O
OnlyAttack(object who)
  Test if the given object evaporates if it has no enemy.
  Return value: test result as an integer - 0 if and only if false.

P
PayAmount(object buyer, int silver)
  Remove a given amount of silver coins from the buyer object. It uses money
  from the inventory or from pouches in the inventory of 'buyer'.
  Returns an integer, 1 for success or 0 for failure.

PayForItem(object buyer, object what)
  Make 'buyer' to buy the object 'what'. Removes the necessary money from the
  inventory or from pouches in the inventory. It grants bargaining experience
  for a successful completion.
  Returns an integer, 1 for success or 0 for failure.

PickUp(object who, object what)
  Make 'who' pick up the object 'what'.
  Does not return a value.

Q
R
ReadyMap(string mapname)
  Return the map with the name 'mapname'. The functions loads (or swaps in) the
  map if necessary.
  Returns the map or 0 if the map could not be loaded.

  Example:
    # teleport activator to another map
    map = CFPython.ReadyMap("/scorn/misc/beginners")
    CFPython.Teleport(CFPython.WhoIsActivator(), map, 10, 10)

ReflectMissiles(object obj)
  Test if the given object reflects missiles. For players, tests if he reflects
  missiles.
  Return value: test result as an integer - 0 if and only if false.

ReflectSpells(object obj)
  Test if the given object reflects spells. For players, tests if he reflects
  spells.
  Return value: test result as an integer - 0 if and only if false.

RegisterCommand(string command, string script, float speed)
  Define a new command that players can call. 'script' is the Python script to
  execute if a player issues 'command'. 'speed' determines how long the command
  will paralyze the player.

  When the script is run, WhoAmI() will return the player that issued the
  command. WhatIsMessage() returns the command parameters (if any).
  Throws an exception if the command is already registered or if 'speed' is
  negative.
  If the script fails, it should call SetReturnValue(0).

  Note: It is possible to overwrite internal commands.

RemoveObject(object obj)
  Remove an object from its environment (and frees it).
  Does not return a value.

  Note: do not use the object 'obj' afterwards.

  Note: if the removed object is a container, the objects inside are not freed,
  they are dropped to the ground.

S


SendCustomCommand(object player, string cmd)
  Send 'cmd' to the crossfire client of 'player'. Consult the crossfire
  protocol specification for valid commands. 'player' must be a player object.
  Does not return a value.

  Example:
    CFPython.SendCustomCommand(CFPython.WhoIsActivator(), "drawinfo 1 text")

SetAC(object obj, int value)
  Set the Armor Class coefficient if the given object to 'value'.
  Does not return a value.
  Throws an exception if the value is less than -120 or higher than 120.

SetAttackType(object obj, int type)
  Sets the attack type of an object. The type can be one or more return values
  of AttackTypeXxx().
  Does not return a value.

  Example:
    # create a sword with fire and cold attack type
    sword = CFPython.CreateObject("sword", (1, 3))
    CFPython.SetAttackType(sword, CFPython.AttackTypeFire()|CFPython.AttackTypeCold())
    CFPython.SetIdentified(sword, 1)

SetBeenApplied(object obj, int flag)
  Mark the object as been applied before (flag != 0) or has never been applied
  (flag = 0).
  Does not return a value.

SetCharisma(object obj, int value)
  Set the Charisma value of the given object.
  Does not return a value.
  Throws an exception if the value is less than -30 or higher than 30.

SetConstitution(object obj, int value)
  Set the Constitution value of the given object.
  Does not return a value.
  Throws an exception if the value is less than -30 or higher than 30.

SetCursed(object obj, int flag)
  Make the object cursed (flag != 0) or removes a curse (flag = 0).
  Does not return a value.

  Note: does not remove the damned flag - use SetDamned() to change the damned
  status.

SetDamage(object obj, int value)
  Set the amount of damage associated with the given object.
  Does not return a value.
  Throws an exception if the value is negative or higher than 120.

SetDamned(object obj, int flag)
  Make the object damned (flag != 0) or removes a damnation (flag = 0).
  Does not return a value.

  Note: does not affect the cursed flag - use SetCursed() to change the cursed
  status.

SetDexterity(object obj, int value)
  Set the Dexterity value of the given object.
  Does not return a value.
  Throws an exception if the value is less than -30 or higher than 30.

SetDirection(object who, int dir)
  Set the direction 'who' is currently moving.
  Does not return a value.

SetFace(object obj, string anim)
  Set the face of an object 'obj' to 'anim'. 'anim' is an animation name.
  Does not return a value.

  Example:
    # make a pair of speed boots look like Idaten boots
    obj = CFPython.CreateObject("speedboots", (1, 3))
    CFPython.SetFace(obj, "idaten")

SetFood(object who, int food)
  Set the food level of the given object.
  Does not return a value.
  Throws an exception if the value is negative or higher than 999.

SetGod(object who, string god)
  Make 'who' to become a follower of 'god'.
  Does not return a value.
  Throws an exception if 'god' is invalid.

  Note: Does nothing if 'who' does not know the skill 'praying'.

SetGrace(object obj, int value)
  Set the grace amount of the given object.
  Does not return a value.
  Throws an exception if the value is less than -32000 or higher than 32000.

SetHP(object obj, int value)
  Set the amount of Hit Points associated with the given object.
  Does not return a value.
  Throws an exception if the value is negative or higher than 32000.

SetIdentified(object obj, int flag)
  Mark the object as identified (flag != 0) or not identified (flag = 0).
  Does not return a value.

SetIntelligence(object who, int value)
  Set the Intelligence value of the given object.
  Does not return a value.
  Throws an exception if the value is less than -30 or higher than 30.

SetInvisible(object obj, int flag)
  Set (flag != 0) or clears (flag = 0) the invisible flag of the object.
  Does not return a value.

SetLastGrace(object who, int value)
  Set the last_grace parameter value associated with the given object.
  Does not return a value.
  Throws an exception if the value is negative or higher than 32000.

SetLastSP(object who, int value)
  Set the last_sp parameter value associated with the given object.
  Does not return a value.
  Throws an exception if the value is negative or higher than 32000.

SetMaxHP(object who, int value)
  Set the maximum amount of Hit Points the given object can get.
  Does not return a value.
  Throws an exception if the value is negative or higher than 32000.

SetMaxSP(object who, int value)
  Set the maximum amount of mana the given object can get.
  Does not return a value.
  Throws an exception if the value is negative or higher than 32000.

SetMessage(object obj, string msg)
  Set the message contained in the specified object. The message is what
  appears inside msg...endmsg tags.
  Does not return a value.

SetName(object name, string name[, string name_pl])
  Set the 'clear name' of the given object. If 'name_pl' (name to use for
  multiple objects) is not given, 'name' is used.
  Does not return a value.

  Example:
    # create a scroll with a custom name
    key = CFPython.CreateObject("scroll", (0, 0))
    CFPython.SetName(key, "warning scroll", "warning scrolls")
    CFPython.SetMessage(key, "<unreadable text>")

SetNickname(object obj, string name)
  Set the title of a player or an object.
  Does not return a value.

SetPosition(object obj, (int x, int y))
  Move an object to another spot on the same map. The object must not be part
  of an inventory. Places the item in a nearby spot if the destination spot is
  blocked. The object will no be moved if no free spot can be found.
  Does not return a value.

SetPower(object obj, int value)
  Set the Power value of the given object.
  Does not return a value.
  Throws an exception if the value is less than -30 or higher than 30.

SetQuantity(object obj, int nrof)
  Set the number of items this object represents.
  Does not return a value.
  Throws an exception if the value is negative.

  Note: the object should not be in a player's inventory because the client
  view will not be updated.

  Note: "nrof=0" does not mean "destroy the item".

SetReturnValue(int value)
  Set the current exit status of the event script. See below for an overview of
  events that use the exit value.
  Does not return a value.

SetSkillExperience(object who, string skill, long exp)
  Set the experience of skill 'skill' the object 'who' has. 'skill' should be a
  skill name.
  Does not return a value.
  Throws an exception if 'who' does not know the 'skill'.
  Throws an exception if the value is negative.

  Note: If the new experience value is less than the current value, 'who'
  looses the difference from his total experience.

SetSlaying(object obj, string value)
  Set the "slaying" field of an object.
  Does not return a value.

  Example:
    # create a key and set its lock-code
    key = CFPython.CreateObject("key2", (0, 0))
    CFPython.SetName(key, "treasure key")
    CFPython.SetSlaying(key, "treasure-code")
    CFPython.InsertObjectInside(key, CFPython.WhoIsActivator())

SetSP(object obj, int value)
  Set the amount of mana possessed by the given object.
  Does not return a value.
  Throws an exception if the value is negative or higher than 32000.

SetSpeed(object obj, float value)
  Set the speed value of the given object.
  Does not return a value.
  Throws an exception if the speed value is less than -9.99 or higher than
  9.99.

SetStrength(object obj, int value)
  Set the Strength value of the given object.
  Does not return a value.
  Throws an exception if the value is less than -30 or higher than 30.

SetTitle(object obj, string title)
  Set the title of the given object.
  Note: to set the title of a player, use SetNickname() instead.
  Does not return a value.

SetUnaggressive(object obj, int flag)
  Make the given object unaggressive (flag != 0) or aggressive (flag = 0).
  Does not return a value.

SetValue(object obj, int silver)
  Set the "value" field of an object in silver coins.
  Does not return a value.
  Throws an exception if the value is negative.

SetVariable(object obj, string value)
  Change an object according to an argument string. It is equivalent of the DM
  patch command.
  Does not return a value.

SetWC(object obj. int value)
  Set the Weapon Class coefficient associated with the given object.
  Does not return a value.
  Throws an exception if the value is less than -120 or higher than 120.

SetWeight(object obj, long weight)
  Set the weight (in grams) of the given object.
  Does not return a value.
  Throws an exception if the value is negative or higher than 1000000000.

SetWisdom(object obj, int value)
  Set the Wisdom value of the given object.
  Does not return a value.
  Throws an exception if the value is less than -30 or higher than 30.

StandStill(object obj)
  Test if the given object has the flag "FLAG_STAND_STILL" set.
  Return value: test result as an integer - 0 if and only if false.

T
Take(object who, string what)
  Make 'who' to pick up 'what'. The syntax of 'what' is the same as what is
  allowed for the client command 'get'.
  Does not return a value.

Teleport(object who, map map, int x, int y)
  Move the given object to (x,y) in map 'map'. The object to be moved may be
  part of a map or in some object's inventory. If the destination position is
  blocked, the object is placed in a nearby space.
  Does not return a value.

  Note: if the destination coordinates are outside of the map or if no free
  space could be found, this function does not move the object.

  Note: the object to be moved should not be part of a player's inventory.

U
V
W
WasDungeonMaster(object who)
  Test if the given object is or has been a DM.
  Return value: test result as an integer - 0 if and only if false.

WhatIsMessage()
  Return the message related to the current event as a string or no object if
  no message is applicable.

  Note: see below for an overview of events with messages.

WhoAmI()
  Return the object related to the current event or 0 if not applicable.

  Note: the related object is frequently (but not always) the object containing
  the script. See below for an overview of events with related objects.

WhoIsActivator()
  Return the object that caused the script to run or 0 if not applicable.
  Note: See below for an overview of events with activator objects.

WhoIsOther()
  Return an auxiliary object for the current event or 0 if not applicable.

  Note: See below for an overview of events with auxiliary objects.

Write(string text, object who[, int color])
  Write the message 'text' to the player 'who'. 'color' determines the color
  and flags to use. (Consult the crossfire source code for all available flags
  NDI_*.) If 'color' if omitted, NDI_BLUE|NDI_UNIQUE is used.
  Does not return a value.

  Note: to write a message to all players in a map, use Message().

X
Y
Z


What parameters are available to a script?
------------------------------------------

The following table contains all events that can be tied to objects.

event Activator WhoAmI Other Message parm1 parm2 parm3 result comment
----- --------- ------ ----- ------- ----- ----- ----- ------ --------------
apply   op     ALTAR     -      -    0     0     0     yes    'op' prays at 'altar'
apply   op     BOOK      -      -    0     0     0     no     'op' reads 'book'
apply   op     ITEM      -      -    aflag 0     0     yes    'op' applies 'item'
attack  hitter hitter    OP     -    0     dam   wc    no     'hitter' hits 'op'
attack  hitter ITEM      op     -    0     dam   wc    no     'hitter' hits 'op' with 'item'
close   op     CONTAINER -      -    0     0     0     yes    'op' closes 'container'
death   -      PLAYER    -      -    0     0     0     yes    'player' dies
death   hitter OP        -      -    atype 0     0     yes    'hitter' kills 'op'
drop    op     ITEM      -      -    nrof  0     0     yes    'op' drops 'item'
pickup                                                        (not implemented)
say     op     ITEM      npc    msg  0     0     0     always 'op' tells 'msg' to 'item' in 'npc''s inventory
say     op     NPC       -      msg  0     0     0     always 'op' tells 'msg' to 'npc'
stop    -      OP        -      -    0     0     0     no     thrown object 'op' is stopped
throw   op     ITEM      -      -    0     0     0     no     'op' throws 'item'
time    -      OP        -      -    0     0     0     no     'op' takes a turn
timer   OP     -         -      -    0     0     0     no     timer of 'op' has expired
trigger OP     item      -      msg  0     0     0     always 'op' writes 'msg' into 'item'
trigger TELEPORTER op    -      -    0     0     0     yes    'teleporter' moves 'op'
trigger TRAP  originator victim -    0     0     0     yes    'originator' causes 'victim' to trigger 'trap'

Notes:
- the object that contains the event script is written in capitals.
- result column: indicates how the result value set by SetReturnValue() is
  used: no=result value is not used; yes=non-zero result value prevents the
  normal action; always=prevents the normal action regardless of result value.
- apply event: aflag: Consult the crossfire source code for all available flags
  AP_*.
- death event: atype=attacktype
- trigger event: originator is unset if the trap (pedestal/button) someone left
  it.
- parm1..3 are not currently available to the script.
- attack event: 'item' can be a weapon or a missile.


The following table contains all global events.

event Activator WhoAmI Other Message  comment
----- --------- ------ ----- -------- --------------
born     op     -      -     -        new player 'op' was created
clock    -      -      -     -        called each tick
crash                                 (not implemented)
gdeath                                player 'op' dies (not implemented)
gkill                                 'hitter' kills 'op' (not implemented)
kick     op     -      -     name     player 'op' named 'name' is kicked out of the game
login    op     op     -     ip       player 'op' logged in from IP address 'ip'
logout   op     op     -     ip       player 'op' logged out from IP address 'ip'
mapenter op     -      -     -        player 'op' has entered a new map
mapleave op     -      -     -        player 'op' is leaving a map
mapreset -      -      -     mappath  map 'mappath' is resetting
muzzle   op     -      -     name     player 'op' named 'name' is muzzled
remove   op     -      -     -        player 'op' quits the game
shout    op     -      -     message  player 'op' shouts 'message'
tell                                  (not implemented)

Notes:
- kick event: param is either the player name or None if all players are
  kicked.
- login event: this event is also called when a new player was created.
