/** \~russian .
 *
 * \~ @ingroup Server
 */
class Item
{
public:
    /**
     * \~russian @name  
     * \~english @name General fields
     * \~ @weight 300
     */
    //@{

    /** \~russian   . */
    const uint Id;

    /** \~russian    . */
    /** \~english Allows to check whether underlying object is valid. */
    const bool IsNotValid;

    /** \~russian    . */
    const ProtoItem@ Proto;

    /** \~russian .
     *
     *       .
     */
    uint Cost;

    /** \~russian   .
     *
     * C. @link ItemFlags Item flags@endlink.
     *
     *    :
     * - @c FLAG ( ,    ),
     * - @c SETFLAG (  ),
     * - @c UNSETFLAG (  ).
     *   . @b Flags  @b _macros.fos.
     */
    uint Flags;
	
	/** \~russian   (. @link RadioFlags Radio flags@endlink) */
	uint16 RadioFlags;

    /** \~russian          .
     *
     * @par  :
     * <code>Item::GetProtoId()*100 + Item::Info</code> (+1   ).
     */
    uint16 Info;

    /** \~russian   .
     *
     *      @ref GetStrHash.
     *       .
     */
    uint PicInv;

    /** \~russian   .
     *
     *      @ref GetStrHash.
     *       .
     */
    uint PicMap;

    /** \~russian  .
     *
     *        ///etc.
     *     (    ).
     */
    uint16 SortValue;

    //@}

    /**
     * \~russian @name 
     * \~english @name Access
     * \~ @weight 290
     */
    //@{

    /** \~russian ,   .
     *
     * C. @link ItemsAccessory Items accessory@endlink.
     */
    const uint8 Accessory;

    /** \~russian   ,    . */
    const uint MapId;

    /** \~russian      X. */
    const uint16 HexX;

    /** \~russian      Y. */
    const uint16 HexY;

    /** \~russian   ,     . */
    const uint CritId;

    /** \~russian    ,    .
     *
     * . @link Slots@endlink.
     */
    const uint8 CritSlot;

    /** \~russian   ,    . */
    const uint ContainerId;

    /** (?) */
    const uint StackId;

    /** \~russian  ID .
     *
     *       .
     *    ID ,   .
     *   ID   0.
     *
     * @see AddItem
     * @see GetItem
     * @see GetItems
     * @see MoveItem
     * @see MoveItems
     */
    uint SpecialId;

    //@}

    /**
     * \~russian @name  (Misc2)
     * \~english @name Various (Misc2)
     * \~ @weight 280
     */
    //@{

    /** \~russian     . */
    uint Val1;

    /** \~russian     . */
    uint Val2;

    /** \~russian     . */
    uint Val3;

    /** \~russian     . */
    uint Val4;

    /** \~russian     . */
    uint Val5;

    //@}

    /**
     * \~russian @name    (, )
     * \~english @name For the wearing items (weapon, armor)
     * \~ @weight 270
     */
    //@{

    /** (?) */
    int8 BrokenFlags;

    /** (?) */
    uint8 BrokenCount;

    /** (?) */
    uint16 BrokenWear;

    //@}

    /**
     * \~russian @name    (, , )
     * \~english @name For locks (keys, containers, doors)
     * \~ @weight 280
     */
    //@{

    /** \~russian  . */
    uint LockerId;

    /** \~russian  .
     *
     * . @link Locker@endlink.     .
     */
    uint16 LockerCondition;

    /** \~russian   (   ).
     *
     *     .
     */
    uint16 LockerComplexity;

    //@}

    /**
     * \~russian @name  
     *
     *     .    .
     *
     * \~english @name For animations
     *
     * \~ @weight 270
     */
    //@{

    /** (?) */
    uint16 AnimWaitBase;

    /** (?) */
    uint8 AnimStayBegin;

    /** (?) */
    uint8 AnimStayEnd;

    /** (?) */
    uint8 AnimShowBegin;

    /** (?) */
    uint8 AnimShowEnd;

    /** (?) */
    uint8 AnimHideBegin;

    /** (?) */
    uint8 AnimHideEnd;

    //@}

    /**
     * \~russian @name  
     * \~english @name Weapons
     * \~ @weight 260
     */
    //@{

    /** \~russian  PID  . */
    uint16 Weapon_AmmoPid;

    /** \~russian   . */
    uint16 Weapon_AmmoCount;
	
	/** \~russian   .
	 *    -  (. @link HitLocations Hit Locations@endlink),
	 *    -   (0  primary, 1  secondary, 2  third).
	 */
	uint8 Mode;

    //@}

    /**
     * \~russian @name 
     * \~english @name Lightness
     * \~ @weight 250
     */
    //@{

    /** (?) */
    int8 LightIntensity;

    /** (?) */
    uint8 LightRadius;

    /** (?) */
    uint8 LightFlags;

    /** (?) */
    uint LightColor;

    //@}

    /**
     * \~russian @name   
     * \~english @name Scripts and events
     * \~ @weight 300
     */
    //@{

    /** \~russian            @a firstTime  @c true.
     *
     * @param   script   .
     *
     * @return  @c true    ; @c false    .
     *
     * @remarks      ,      .
     */
    bool SetScript(string@+ script);

    /** \~russian  ID ,    .
     *
     * @return ID . 0,    .
     */
    uint GetScriptId();

    /** \~russian  -  .
     *
     * @param  eventType    (. @link ItemEvents Item events@endlink).
     * @param  funcName    -.
     */
    void SetEvent(int eventType, string& funcName);

    //@}

    /**
     * \~russian @name  
     * \~english @name Invoking events
     * \~ @weight 295
     */
    //@{

	/** \~russian    #ITEM_EVENT_FINISH. */
    /** \~english Invokes #ITEM_EVENT_FINISH event. */
	bool EventFinish(bool toDelete);

    /** \~russian    #ITEM_EVENT_ATTACK. */
    /** \~english Invokes #ITEM_EVENT_ATTACK event. */
    bool EventAttack(Critter& attacker, Critter& target);

    /** \~russian    #ITEM_EVENT_USE. */
    /** \~english Invokes #ITEM_EVENT_USE event. */
    bool EventUse(Critter& cr, Critter@ onCritter, Item@ onItem, Scenery@ onScenery);

    /** \~russian    #ITEM_EVENT_USE_ON_ME. */
    /** \~english Invokes #ITEM_EVENT_USE_ON_ME event. */
    bool EventUseOnMe(Critter& cr, Item@ usedItem);

    /** \~russian    #ITEM_EVENT_SKILL. */
    /** \~english Invokes #ITEM_EVENT_SKILL event. */
    bool EventSkill(Critter& cr, int skill);

    /** \~russian    #ITEM_EVENT_DROP. */
    /** \~english Invokes #ITEM_EVENT_DROP event. */
    void EventDrop(Critter& cr);

    /** \~russian    #ITEM_EVENT_MOVE. */
    /** \~english Invokes #ITEM_EVENT_MOVE event. */
    void EventMove(Critter& cr, uint8 fromSlot);

    /** \~russian    #ITEM_EVENT_WALK. */
    /** \~english Invokes #ITEM_EVENT_WALK event. */
    void EventWalk(Critter& cr, bool entered, uint8 dir);

    //@}

    /**
     * \~russian @name 
     * \~english @name General
     * \~ @weight 290
     */
    //@{

   /** \~russian   .
     * @param fromFrame   .
     * @param toFrame   .
     * @remarks     (,
     *   <code>Animate(1,7)</code>  <code>Animate(7,1)</code>).
     */
    void Animate(uint8 fromFrame, uint8 toFrame);

    /** \~russian    .
     *
     *       ,    .
     *
     * @param  protoId     (. @b ITEMPID.H).
     *
     * @return     @c true.     @c false.
     */
    bool ChangeProto(uint16 protoId);

    /** \~russian   .
     *
     * @return   (. @link ItemsTypes Items types@endlink).
     *             0.
     */
    uint8 GetType();

    /** \~russian  ID  .
     *
     * . @b ITEMPID.H.
     *
     * @return ID  .     0.
     */
    uint16 GetProtoId();

    /** \~russian    ,      , ,  .
     *
     * @return  .
     */
    uint GetCost();

    /** \~russian      .
     *
     * @return  .
     *
     * @see    SetCount
     */
    uint GetCount();

    /** \~russian      .
     *
     * @param count   .
     *
     * @see   GetCount
     */
    void SetCount(uint count);

    /** \~russian          .
     *
     *       ,   ,
     *    ( -,       ).
     *
     * @param  hexX, hexY        .
     *
     * @return     Map.     @c null.
     */
    Map@+ GetMapPosition(uint16& hexX, uint16& hexY);

    /** \~russian  ,   .
     *
     * @see  ProtoItem::IsGrouped()
     *
     */
    bool IsGrouped();

    /** \~russian  ,   .
     *
     * @see  ProtoItem::IsWeared()
     *
     */
    bool IsWeared();

    /** \~russian      .
     *
     *          
     * .
     */
    void Update();

    /** \~russian   ( )  ,      .
     *
     * @param lexems   
     *               (. <a href="http://fonline.ru/fowork/wiki/index.php/:___#@lex name@">  \@lex\@</a>,    ).
     *                   @c null,      .
     */
    void SetLexems(string@+ lexems);

    //@}

    /**
     * \~russian @name  
     * \~english @name For the cars
     * \~ @weight 280
     */
    //@{

    /** \~russian ,    .
     *
     * @return @c true   ; @c false    .
     */
    bool IsCar();

    /** \~russian    -,   .
     *
     * @param  numBag   -.  0.     3 .
     *
     * @return     Item.     @c null.
     */
    Item@+ CarGetBag(int numBag);

    //@}

    /**
     * \~russian @name  -
     * \~english @name For containers
     * \~ @weight 270
     */
    //@{

    /** \~russian    .
     *
     * @param  protoId       (.  @b ITEMPID.H).
     * @param  count       .
     * @param  specialId   ID .
     *                       ,   .
     *
     * @return     Item.     @c null.
     *
     * @see    #SpecialId
     */
    Item@+ AddItem(uint16 protoId, uint count, uint specialId);

    /** \~russian    ,    -.
     *
     * @param  protoId       (.  @b ITEMPID.H).
     * @param  specialId   ID .
     *                       ,   .
     *
     * @return     Item.     @c null.
     *
     * @see    #SpecialId
     */
    Item@+ GetItem(uint16 protoId, uint specialId);

    /** \~russian       ID,    -.
     *
     * @param  specialId   ID.
     *                       ,   .
     *                      : -1,      .
     * @param  items         ,    .
     *                      ,      .
     *
     * @return   .
     *
     * @see    #SpecialId
     */
    uint GetItems(uint specialId, Item@[]@+ items);

    //@}
}
