#ifndef TRLARA_H
#define TRLARA_H

#include <trng_core.h>

#define LaraFlareFrame                       VAR(0x0080DEEE, short)

class TRLara
{
public:

    ///
    /// Get Value
    ///
    short getItemIndex();
    short getGunStatus();
    short getGunType();
    short getGunRequestType();
    short getGunLastType();
    short getCalcFallspeed();
    short getWaterStatus();
    int getClimbStatus();
    short getPoseCount();
    short getHitDirection();
    short getAir();
    short getDiveCount();
    short getDeathCount();
    short getUnderwaterActive();
    short getSpazEffectCount();
    short getFlareAge();
    short getSkidoo();
    short getWeaponItem();
    short getWeaponBackItem();
    short getFlareFrame();
    short getPoison1();
    short getPoison2();
    // you can use MESH_ flag for index.
    BYTE getWet(BYTE index);
    // FLF_ flags
    WORD getFlags(WORD Flags);
    // FLF_ flags
    bool isFlagsEnabled(WORD Flags);
    long getWaterSurfaceDist();
    // unknown flag for now :x
    int getMeshEffects();
    StrMeshTr4* getMeshPtrs(LARA_MESHES mesh);
    StrMeshTr4* getMeshTightRight();
    StrMeshTr4* getMeshTightLeft();
    StrMeshTr4* getMeshCalf();
    StrMeshTr4* getMeshTorso();
    StrMeshTr4* getMeshRightArm();
    StrMeshTr4* getMeshRightHand();
    StrMeshTr4* getMeshLeftArm();
    StrMeshTr4* getMeshLeftHand();
    StrMeshTr4* getMeshHead();
    ITEM_INFO* getTarget();
    short getTargetAngleY();
    short getTargetAngleX();
    short getTurnRate();
    short getMoveAngle();
    short getHeadX();
    short getHeadY();
    short getHeadZ();
    short getTorsoX();
    short getTorsoY();
    short getTorsoZ();
    LARA_ARM *getLeftArm();
    LARA_ARM *getRightArm();

    ///
    /// Is Value
    ///
    bool isPistolCarried();
    bool isUziCarried();
    bool isShotgunCarried();
    bool isRevolverCarried();
    bool isCrossbowCarried();
    bool isGrenadeCarried();
    bool isMagnumCarried();
    bool isAutopistolCarried();
    bool isDesertEagleCarried();
    bool isM16Carried();
    bool isMP5Carried();
    bool isRocketCarried();
    bool isHarpoonCarried();
    bool isFlareCarried();
    bool isFlareEmpty();
    bool isFlareNotEmpty();

    ///
    /// Set Value
    ///
    void setGunStatus(short value);
    void setGunType(short value);
    void setGunRequestType(short value);
    void setGunLastType(short value);
    void setCalcFallspeed(short value);
    void setWaterStatus(LARA_WATER_STATUS value);
    void setClimbStatus(short value);
    void setPoseCount(short value);
    // -1 by default !
    void setHitDirection(short value);
    void setAir(short value);
    void setDiveCount(short value);
    void setDeathCount(short value);
    void setUnderwaterActive(short value);
    void setSpazEffectCount(short value);
    void setFlareAge(short value);
    // -1 by default !
    void setSkidoo(short value);
    // -1 by default !
    void setWeaponItem(short value);
    void setWeaponBackItem(short value);
    void setFlareFrame(short value);
    void setPoison1(short value);
    void setPoison2(short value);
    // you can use MESH_ flag for index.
    void setWet(BYTE index, BYTE value);
    // FLF_ flags
    void addFlags(WORD flags);
    // FLF_ flags
    void deleteFlags(WORD flags);
    void setMeshPtrs(LARA_MESHES mesh_of_lara, short slots, LARA_MESHES mesh_of_slot);
    void setMeshTightRight(short slots, LARA_MESHES meshes);
    void setMeshTightLeft(short slots, LARA_MESHES meshes);
    void setMeshCalf(short slots, LARA_MESHES meshes);
    void setMeshTorso(short slots, LARA_MESHES meshes);
    void setMeshRightArm(short slots, LARA_MESHES meshes);
    void setMeshRightHand(short slots, LARA_MESHES meshes);
    void setMeshLeftArm(short slots, LARA_MESHES meshes);
    void setMeshLeftHand(short slots, LARA_MESHES meshes);
    void setMeshHead(short slots, LARA_MESHES meshes);
    void setTarget(ITEM_INFO* target);
    void setTargetAngleY(short angle);
    void setTargetAngleX(short angle);
    void setTargetAngle(short y_angle, short x_angle);
    void setTurnRate(short rate);
    void setTurnRate(short rate, bool substract);
    void setMoveAngle(short angle);
    void setMoveAngle(short angle, bool substract);
    void setHeadX(short angle);
    void setHeadX(short angle, bool substract);
    void setHeadY(short angle);
    void setHeadY(short angle, bool substract);
    void setHeadZ(short angle);
    void setHeadZ(short angle, bool substract);
    void setTorsoX(short angle);
    void setTorsoX(short angle, bool substract);
    void setTorsoY(short angle);
    void setTorsoY(short angle, bool substract);
    void setTorsoZ(short angle);
    void setTorsoZ(short angle, bool substract);
    void setArmFrameBase(bool isLeft, short* frame_base);
    void setArmAnim(bool isLeft, short anim);
    void setArmFrame(bool isLeft, short frame);
    void setArmLock(bool isLeft, bool isLocked);
    void setArmDoubleLock(bool isLockL, bool isLockR);
    void setArmRotY(bool isLeft, short y_rot);
    void setArmRotX(bool isLeft, short x_rot);
    void setArmRotZ(bool isLeft, short z_rot);
    void setArmFlashGun(bool isLeft, short flash_time);

    ///
    /// Decrease/Increase
    ///
    void decreaseFlare();
};

extern TRLara Lara;

#endif