//::///////////////////////////////////////////////
//:: Poison System includes
//:: inc_poison
//::///////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Ornedan
//:: Created On: 12.12.2004
//:: Updated On: 09.01.2005
//:://////////////////////////////////////////////


const int POISONED_WEAPON_CASTERLEVEL = 1;

const int STRREF_POISON_WORN_OFF             = 16826227;
const int STRREF_POISON_APPLY_SUCCESS        = 16826228;
const int STRREF_POISON_APPLY_FAILURE        = 16826230;
const int STRREF_POISON_CLEAN_OFF_WEAPON     = 16826229;
const int STRREF_POISON_NOT_VALID_FOR_WEAPON = 16826231;
const int STRREF_SHATTER_HARMLESS            = 16826234;
const int STRREF_POISON_ITEM_USE_1           = 16826236;
const int STRREF_POISON_ITEM_USE_2           = 16826237;
const int STRREF_POISON_FOOD_USE_1           = 16826239;
const int STRREF_POISON_FOOD_USE_2           = 16826240;
const int STRREF_CLEAN_ITEM_SUCCESS          = 16826242;
const int STRREF_CLEAN_ITEM_FAIL_1           = 16826243;
const int STRREF_CLEAN_ITEM_FAIL_2           = 16826244;
const int STRREF_INVALID_TARGET              = 16826245;
const int STRREF_NOT_CONTACT_POISON          = 16826246;
const int STRREF_TARGET_ALREADY_POISONED     = 16826247;
const int STRREF_NOT_INGESTED_POISON         = 16826251;
const int STRREF_TARGET_NOT_FOOD             = 16826252;
const int STRREF_ACQUIRE_SPOT_SUCCESS1       = 16826253;
const int STRREF_ACQUIRE_SPOT_SUCCESS2       = 16826254;
const int STRREF_ONEQUIP_CLEAN_ITEM          = 16826255;

const int POISON_TYPE_CONTACT  = 0;
const int POISON_TYPE_INGESTED = 1;
const int POISON_TYPE_INHALED  = 2;
const int POISON_TYPE_INJURY   = 3;

/**
 * Gets the type of the given poison.
 *
 * @param nPoison POISON_* constant
 * @return        POISON_TYPE_* constant
 */
int GetPoisonType(int nPoison);


// Poison removal handlers
void DoPoisonRemovalFromWeapon(object oWeapon);
void DoPoisonRemovalFromItem(object oItem);


//#include "inc_utility"
//#include "inc_poison_const"
#include "prc_inc_spells"
#include "prc_ipfeat_const"

/****************************************************
************** The implementations ******************
****************************************************/

int GetPoisonType(int nPoison)
{
    return StringToInt(Get2DACache("poison", "Poison_Type", nPoison));
}

// Handles removing of itemproperties and locals on a poisoned weapon
void DoPoisonRemovalFromWeapon(object oWeapon)
{
    DeleteLocalInt(oWeapon, "pois_wpn_idx");
    DeleteLocalInt(oWeapon, "pois_wpn_uses");
    RemoveEventScript(oWeapon, EVENT_ITEM_ONHIT, "poison_wpn_onhit", TRUE, TRUE);

    // Remove the UniquePower only if poisoning the weapon added it.
    if(GetLocalInt(oWeapon, "PoisonedWeapon_DoDelete"))
        RemoveSpecificProperty(oWeapon,
                               ITEM_PROPERTY_ONHITCASTSPELL,
                               IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER,
                               0,
                               1,
                               "",
                               -1,
                               DURATION_TYPE_PERMANENT);
}

// Handles removing of itemproperties and locals on a poisoned item
void DoPoisonRemovalFromItem(object oItem)
{
    DeleteLocalInt(oItem, "pois_itm_idx");
    DeleteLocalInt(oItem, "pois_itm_uses");
    DeleteLocalInt(oItem, "pois_itm_trap_dc");
    DeleteLocalObject(oItem, "pois_itm_poisoner");

    int nSafeCount = GetLocalInt(oItem, "pois_itm_safecount");
    DeleteLocalInt(oItem, "pois_itm_safecount");
    int i;
    for(i = 1; i <= nSafeCount; i++)
        DeleteLocalObject(oItem, "pois_itm_safe_" + IntToString(i));

    RemoveSpecificProperty(oItem,
                           ITEM_PROPERTY_CAST_SPELL,
                           IP_CONST_CASTSPELL_CLEAN_POISON_OFF,
                           IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE,
                           1,
                           "",
                           -1,
                           DURATION_TYPE_PERMANENT);

    RemoveEventScript(oItem, EVENT_ITEM_ONACQUIREITEM, "poison_onaquire", TRUE, TRUE);
    RemoveEventScript(oItem, EVENT_ITEM_ONPLAYEREQUIPITEM, "poison_onequip", TRUE, TRUE);
}