#include "jw_smith_copy"
#include "jw_area_funct"
// #include "jw_crafting_lists"
#include "jw_tiles_inc"
#include "jw_custom_spells"
#include "jw_trap_funct"
#include "jw_persist_store"
#include "prc_inc_spells"

// Returns true if this item is meant to decay, otherwise returns false
int GetIsDecayable(object oItem);
// Goes through the PCs and decays their items
void DecayItems();
// Gets the crafting box of the PC
object GetCraftingBox(object oPC);
// Gets the maximum number of enchantments allowed on oItem - this is determined by its tag;
int GetMaxEnchantments(object oItem);
// Gets the number of enchantments currently on oItem;
int GetNumberEnchantments(object oItem);
// Gets the death state of the player - MODULE_EVERYONE_ALIVE or MODULE_NOTEVERYONE_ALIVE
int GetModuleDeathState();
// Sets the death state of the player - MODULE_EVERYONE_ALIVE or MODULE_NOTEVERYONE_ALIVE
void SetModuleDeathState(int nState);
// Gets the death state of the player - PLAYER_ALIVE, PLAYER_BLEEDING or PLAYER_STABLE
int GetDeathState(object oRespawner);
// Sets the death state of the player - PLAYER_ALIVE, PLAYER_BLEEDING or PLAYER_STABLE
void SetDeathState(object oRespawner, int nState);
// Player unequips items
void UnequipPlayer(object oPlayer, int nHandsOnly = TRUE);
// Mob spawns a new mob - best used on death of mob
// Will use special effects if VFX is set. Note that default is to use special
// effects. Set nVFX to 0 to prevent special effects
// Mob will get all effects of old mob is nCopyEffects is set to true
// If nKnockdown is true, the new mob will be knocked down for a second
void SpawnNewMob(string sMobResRef, int nVFX=VFX_FNF_PWSTUN, int nCopyEffects=FALSE, int nKnockdown=FALSE);
// Mob has a repeating visual effect
void RepeatingVisual(int nEffect, object oMob=OBJECT_SELF);
// Adds a random magical effect to the wepon the mob is holding in its right hand
// This will not affect any weapons they equip later so it's not much use for mobs that
// switch weapons, eg melee and ranged
// Int level goes from 1 to 4. 1 is the the weakest and 4 is the best, so use 4 only for high level mobs
void WeaponPowerUp(int nLevel, object oMob=OBJECT_SELF);
// Levels up the mob a random amount up to max nBonusLevels - this is the max number of extra levels it can gain
// The chance of levelling up is nChance. Set nChance to 100 to ensure it gains bonus levels
void BonusLevels(int nBonusLevels, int nChance = 50, object oMob=OBJECT_SELF);
// Sets custom token 2016 to be the type of machine the PC needs to enchant whatever they are enchanting
void SetToken2016(object oPC);
// Sets custom token 2010 to be the type of item this PC is enchanting
void SetToken2010(object oPC);
// Gets the type of crafting the PC is currently doing
int GetCrafting(object oPC);
// Sets the type of enchantment the PC is doing by setting local int isenchanting
// to the relative value on the crafting box of the PC
void SetCrafting(object oPC, int nValue);
// Mob explodes, damaging nearby enemies. Use for on death.
void DeathExplode(int nDamage = 8, int nInitialVFX = VFX_FNF_FIREBALL, int nDamageVFX = VFX_IMP_FLAME_M, int nDamageType = DAMAGE_TYPE_FIRE, int nSaveType= SAVING_THROW_TYPE_FIRE, int nSaveDC = 15, float fRadius = 10.0);
// Mob jumps to enemy randomly. Use in on combat round end
void JumpToEnemy(object oEnemy, int nVis=VFX_FNF_SUMMON_UNDEAD);
// Mob sends fire arrows at nearby enemies. Use in on death
void deathcascade(object oTarget);
// Mob explodes sending poison out to enemies. Use in on death
void PoisonExplode(int nPoison=POISON_BLACK_LOTUS_EXTRACT);
// Mob explodes sending disease out to enemies. Use in on death
void DiseaseExplode(int nDisease=DISEASE_SOLDIER_SHAKES);
// Mob sends rays out to hurt enemies. Use in on heartbeat
void ZapTargets(int nBeam=VFX_BEAM_EVIL, int nDamage = 12, int nDC = 24, int nDamageType=DAMAGE_TYPE_NEGATIVE);
// Mob creates copy of self on oVictim if is dead.
// Instead of making a copy, it can make something else using res ref sMob
// Use in on combat round end
void SpawnCreature(object oVictim, string sMob="");

// Returns BASE_ITEM_GLOVES, BASE_ITEM_BELT or BASE_ITEM_CLOAK
// Depending on the value of nPattern;
int GetMiscClothType (int nPattern);

// returns the tag of the food required for this particular meal
// Tags are jw_meat_lion, jw_meat_polar, jw_meat_deer, jw_meat_rothe ,jw_meat_coug
string GetFoodType (int nPattern);

// Runs graphics when a PC enchants an object
void DoEnchantmentGraphics(object oPC, int nDoing);

// Returns tag of extra reagent 1`for nPattern. If no extra reagent exists,
// returns ""
string TagExtraReg1 (int nPattern);

// Returns tag of extra reagent 2`for nPattern. If no extra reagent exists,
// returns ""
string TagExtraReg2 (int nPattern);


// Sets custom token 2013 to be the description of the technique
// nDoing is the TYPE of technique and nCurrent is the number
// from 0 to 127
void BDSetDescription(int nDoing, int nCurrent);

// Builds the name of the technique, eg jw_pat_wep_007
// from nDoing, which is the TYPE of technique we are doing, and
// nCurrent, which is the number from 0 to 127 we are currently looking at
string BuildTechName (int nDoing, int nCurrent);

// Checks whether the PC is sufficiently close to the relevant crafting device
// This is used for enchantments
int CheckDevice(object oPC, int nDoing);

// Returns TRUE if the PC knows any of the relevant technique.
// Choose from TECHNIQUE_GAUNTLETS, TECHNIQUE_CLOTHING, TECHNIQUE_RINGAMULET
// TECHNIQUE_WEAPON, TECHNIQUE_ARMOUR,TECHNIQUE_FOOD
int KnowsAnyTechnique(object oPC, int nTechnique);

// oUser will learn a new technique based on sTag
// If they already have this pattern, they will get their pattern scroll back
void LearnPattern(object oUser, string sTag, object oItem);

// Sets the conversation tokens suitable to nPattern.
// Tokens are 1 to 7 with Vervain being 7 and Cloth of Gold being 1
// They are set either to the name of the reagent, or to "" if the
// reagent is not required
void SetRegTokens(int nPattern);

// Returns the itemproperty these herbs will bestow on food (turns it into a potion)
itemproperty iFoodProperty  (int nHerbValue);

// Returns the itemproperty these herbs will bestow on monk gloves
itemproperty iGlovesProperty  (int nHerbValue);

// Returns the itemproperty these herbs will bestow on cloaks, boots or belts
itemproperty iClothMiscProperty  (int nHerbValue);

// Returns the itemproperty these herbs will bestow on a ring or amulet
itemproperty iRingAmuletProperty  (int nHerbValue);


// Returns the itemproperty these herbs will bestow on armour
itemproperty iArmourProperty  (int nHerbValue);

// Returns the itemproperty these herbs will bestow on a weapon
itemproperty iWeaponProperty  (int nHerbValue);


// Returns the value of the herbs in oObject
int HerbValue (object oObject=OBJECT_SELF);

// Used in MakeCircle
void DropFlame(location lTemp);

// Make a spectacular pentagram on top of oObject
// Stolen from Twighlight
void MakeCircle(object oObject);


// Strips the PC of everything they own - does not currently remove gold
void jw_strip_items(object oPC);

// Remove all spells from PC as well as summon familiar and
// animal companion
void jw_remove_spells(object oPC);

// Set our constants here
const int REAGENT_VERVAIN=64;
const int REAGENT_SUKAKE=32;
const int REAGENT_ROSEMAGES=16;
const int REAGENT_HYSSOP=8;
const int REAGENT_FOOLSWEED=4;
const int REAGENT_DRYADSTEARS=2;
const int REAGENT_CLOTHGOLD=1;

const int TECHNIQUE_GAUNTLETS=1;
const int TECHNIQUE_CLOTHING=2;
const int TECHNIQUE_RINGAMULET=3;
const int TECHNIQUE_WEAPON=4;
const int TECHNIQUE_ARMOUR=5;
const int TECHNIQUE_FOOD=6;

const int PLAYER_ALIVE=0;
const int PLAYER_BLEEDING=1;
const int PLAYER_STABLE=2;
const int PLAYER_DEAD=3;

const int MODULE_EVERYONE_ALIVE=0;
const int MODULE_NOTEVERYONE_ALIVE=1;


void jw_strip_items(object oPC)

{
int nIdx;
object oItem;
object oStrip;



 for (nIdx=0;nIdx<=18;nIdx++)
   {
    oItem=GetItemInSlot(nIdx,oPC);
    DestroyObject(oItem);
   }

oItem=GetFirstItemInInventory(oPC);

while (GetIsObjectValid(oItem))

{
 oStrip=oItem;
 DestroyObject(oStrip);
 oItem=GetNextItemInInventory(oPC);
}

}

void jw_remove_spells(object oPC)
{
 int nCounter=0;
 int nPrepared=0;

 // strip spells
 for(nCounter = 0; nCounter <= 802; nCounter++)
 {
  nPrepared=GetHasSpell(nCounter,oPC);
  while (nPrepared>0)
  {
   DecrementRemainingSpellUses(oPC,nCounter);
   nPrepared=GetHasSpell(nCounter,oPC);
  }
}
// remove familiar
 nPrepared=GetHasFeat(FEAT_SUMMON_FAMILIAR,oPC);
  if (nPrepared>0)
  {
   DecrementRemainingFeatUses(oPC,FEAT_SUMMON_FAMILIAR);
  }

  // remove animal companions
 nPrepared=GetHasFeat(FEAT_ANIMAL_COMPANION,oPC);
  if (nPrepared>0)
  {
   DecrementRemainingFeatUses(oPC,FEAT_ANIMAL_COMPANION);
  }





}

 void DropFlame(location lTemp)
    {

    object oNew=CreateObject(OBJECT_TYPE_PLACEABLE,"plc_flamemedium",lTemp);
    AssignCommand(oNew,PlaySound("sim_exp2flame"));
    DelayCommand(6.0,DestroyObject(oNew));

    }


void MakeCircle(object oObject)
{
SetLocalObject(OBJECT_SELF,"effectob",OBJECT_INVALID);
int x;
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_SCREEN_SHAKE),oObject);
float Pi = 360.0;
int Radius = 7;
float time = 2.0;
int count = 50/5;
int y;
vector center = GetPosition(oObject);
object oArea = GetArea(oObject);
vector vTemp;
location lTemp;
vTemp.z = center.z;
for (x=1;x<=5;x++)
    {
     vTemp.x = center.x + cos((Pi/5)*x)*Radius;
     vTemp.y = center.y + sin((Pi/5)*x)*Radius;
     lTemp = Location(oArea,vTemp,0.0);
     ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_LIGHTNING_M),lTemp);
    }
for (x=1;x<=count;x++)
    {
    for (y=1;y<=5;y++)
        {
        vTemp.x = center.x + cos(((Pi/(5*count))*x)+(Pi/5)*y)*Radius;
        vTemp.y = center.y + sin(((Pi/(5*count))*x)+(Pi/5)*y)*Radius;
        lTemp = Location(oArea,vTemp,0.0);
        DelayCommand((time/count)*x+1.2, DropFlame(lTemp));
        }
    }
    SetLocalObject(OBJECT_SELF,"effectob",OBJECT_INVALID);
for (x=1;x<=count*5/3;x++)
    {
    for (y=1;y<=5;y++)
        {
        vTemp.x = center.x + cos((Pi/5)*y)*Radius - x*(cos((Pi/5)*y) - cos((Pi/5)*(2+y)))*Radius/(count*5/3);
        vTemp.y = center.y + sin((Pi/5)*y)*Radius - x*(sin((Pi/5)*y) - sin((Pi/5)*(2+y)))*Radius/(count*5/3);
        lTemp = Location(oArea,vTemp,0.0);
       DelayCommand(2.0+time+((time*3)/(count*3))*x,DropFlame(lTemp));
        }
    }
}

int HerbValue (object oObject=OBJECT_SELF)
{
int nReturn=0;
object oHerb=GetItemPossessedBy(oObject,"jw_harpherb1");
if (GetIsObjectValid(oHerb))
{
nReturn=nReturn+1;
}

oHerb=GetItemPossessedBy(oObject,"jw_harpherb2");
if (GetIsObjectValid(oHerb))
{
nReturn=nReturn+2;
}

oHerb=GetItemPossessedBy(oObject,"jw_harpherb3");
if (GetIsObjectValid(oHerb))
{
nReturn=nReturn+4;
}

oHerb=GetItemPossessedBy(oObject,"jw_harpherb4");
if (GetIsObjectValid(oHerb))
{
nReturn=nReturn+8;
}

oHerb=GetItemPossessedBy(oObject,"jw_harpherb5");
if (GetIsObjectValid(oHerb))
{
nReturn=nReturn+16;
}

oHerb=GetItemPossessedBy(oObject,"jw_harpherb6");
if (GetIsObjectValid(oHerb))
{
nReturn=nReturn+32;
}

oHerb=GetItemPossessedBy(oObject,"jw_harpherb7");
if (GetIsObjectValid(oHerb))
{
nReturn=nReturn+64;
}

return nReturn;
}

itemproperty iWeaponProperty (int nHerbValue)
{
itemproperty iProperty;

SendMessageToAllDMs("Debug, doing iWeaponProperty for pattern "+IntToString(nHerbValue));

  switch (nHerbValue)
  {
   case 7: iProperty = ItemPropertyEnhancementBonus (1); break;
   case 11: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_1d4); break;
   case 13: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_BLUDGEONING,IP_CONST_DAMAGEBONUS_1d4); break;
   case 14: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEBONUS_1d4); break;
   case 15: iProperty = ItemPropertyEnhancementBonus (2); break;
   case 19: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_FORTITUDE,1); break;
   case 21: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGEBONUS_1d4); break;
   case 22: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_1d4); break;
   case 23: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d4); break;
   case 25: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_REFLEX,1); break;
   case 26: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_WILL,1); break;
   case 27: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_BLUDGEONING,IP_CONST_DAMAGEBONUS_2d4); break;
   case 28: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEBONUS_1d4); break;
   case 29: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEBONUS_2d4); break;
   case 30: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_FORTITUDE,2); break;
   case 31: iProperty = ItemPropertyEnhancementBonus (3); break;
   case 35: iProperty =ItemPropertyVampiricRegeneration (1); break;
   case 37: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SLASHING,IP_CONST_DAMAGEBONUS_1d4); break;
   case 38: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_1d4); break;
   case 39: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGEBONUS_2d4); break;
   case 41: iProperty =ItemPropertyMassiveCritical (IP_CONST_DAMAGEBONUS_1d10); break;
   case 42: iProperty =ItemPropertyDamageBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEBONUS_1d6); break;
   case 43: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d4); break;
   case 44: iProperty =ItemPropertyDamageBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_BLUDGEONING,IP_CONST_DAMAGEBONUS_1d6); break;
   case 45: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_REFLEX,2); break;
   case 46: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_WILL,2); break;
   case 47: iProperty =ItemPropertyMaxRangeStrengthMod (20); break;
   case 49: iProperty =ItemPropertyDamageBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_SLASHING,IP_CONST_DAMAGEBONUS_1d6); break;
   case 50: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,4); break;
   case 51: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEBONUS_2d4); break;
   case 52: iProperty =ItemPropertySkillBonus (SKILL_TUMBLE,4); break;
   case 53: iProperty =ItemPropertyVampiricRegeneration (3); break;
   case 54: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SLASHING,IP_CONST_DAMAGEBONUS_2d4); break;
   case 55: iProperty =ItemPropertyUnlimitedAmmo (IP_CONST_UNLIMITEDAMMO_PLUS4); break;
   case 56: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_1d6); break;
   case 57: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d4); break;
   case 58: iProperty =ItemPropertyMassiveCritical (IP_CONST_DAMAGEBONUS_2d8); break;
   case 59: iProperty =ItemPropertyVampiricRegeneration (6); break;
   case 60: iProperty =ItemPropertyMaxRangeStrengthMod (14); break;
   case 61: iProperty =ItemPropertyMassiveCritical (IP_CONST_DAMAGEBONUS_2d10); break;
   case 62: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d6); break;
   case 63: iProperty = ItemPropertyEnhancementBonus (4); break;
   case 67: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_1d6); break;
   case 69: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_ORC,IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_1d6); break;
   case 70: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_GOBLINOID,IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEBONUS_1d6); break;
   case 71: iProperty =ItemPropertyUnlimitedAmmo (IP_CONST_UNLIMITEDAMMO_PLUS3); break;
   case 73: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_SILENCE,IP_CONST_ONHIT_SAVEDC_16,IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
   case 74: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_LESSERDISPEL,IP_CONST_ONHIT_SAVEDC_16); break;
   case 75: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,7); break;
   case 76: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_BLINDNESS,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
   case 77: iProperty =ItemPropertySkillBonus (SKILL_TUMBLE,7); break;
   case 78: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d6); break;
   case 79: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEBONUS_2d6); break;
   case 81: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_FEAR,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
   case 82: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_HOLD,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
   case 83: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d6); break;
   case 84: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_DOOM,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
   case 85: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_ORC,IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d6); break;
   case 86: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_GOBLINOID,IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEBONUS_2d6); break;
   case 87: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGEBONUS_2d6); break;
   case 88: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ABILITY_STR); break;
   case 89: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_GREATERDISPEL,IP_CONST_ONHIT_SAVEDC_20); break;
   case 90: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_HOLD,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
   case 91: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d6); break;
   case 92: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_LEVELDRAIN,IP_CONST_ONHIT_SAVEDC_18); break;
   case 93: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_MORDSDISJUNCTION,IP_CONST_ONHIT_SAVEDC_24); break;
   case 94: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_24, IP_CONST_ABILITY_STR); break;
   case 95: iProperty =ItemPropertyUnlimitedAmmo (IP_CONST_UNLIMITEDAMMO_PLUS5); break;
   case 97: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ABILITY_DEX); break;
   case 98: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ABILITY_CON); break;
   case 99: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ABILITY_STR); break;
   case 100: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_WOUNDING,IP_CONST_ONHIT_SAVEDC_16); break;
   case 101: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ABILITY_DEX); break;
   case 102: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ABILITY_CON); break;
   case 103: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_24, IP_CONST_ABILITY_CON); break;
   case 104: iProperty =ItemPropertyMaxRangeStrengthMod (8); break;
   case 105: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_SLOW,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
   case 106: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_SLEEP,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
   case 107: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_24, IP_CONST_ABILITY_DEX); break;
   case 108: iProperty =ItemPropertyOnHitCastSpell (IP_CONST_ONHIT_CASTSPELL_FLESH_TO_STONE,IP_CONST_SPELLLEVEL_8); break;
   case 109: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_LEVELDRAIN,IP_CONST_ONHIT_SAVEDC_22); break;
   case 110: iProperty =ItemPropertyOnHitCastSpell (IP_CONST_ONHIT_CASTSPELL_INFESTATION_OF_MAGGOTS,IP_CONST_SPELLLEVEL_8); break;
   case 111: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_SLOW,IP_CONST_ONHIT_SAVEDC_26, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
   case 112: iProperty =ItemPropertyUnlimitedAmmo (IP_CONST_UNLIMITEDAMMO_PLUS2); break;
   case 113: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ABILITY_CHA); break;
   case 114: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ABILITY_INT); break;
   case 115: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ABILITY_WIS); break;
   case 116: iProperty =ItemPropertyOnHitCastSpell (IP_CONST_ONHIT_CASTSPELL_FREEZE,IP_CONST_SPELLLEVEL_8); break;
   case 117: iProperty =ItemPropertyOnHitCastSpell (IP_CONST_ONHIT_CASTSPELL_KNOCKDOWN,IP_CONST_SPELLLEVEL_8);  break;
   case 118: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_SLOW,IP_CONST_ONHIT_SAVEDC_24, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
   case 119: iProperty =ItemPropertyVampiricRegeneration (10); break;
   case 120: iProperty =ItemPropertyBonusFeat (IP_CONST_FEAT_CLEAVE); break;
   case 121: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_HOLD,IP_CONST_ONHIT_SAVEDC_24, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
   case 122: iProperty =ItemPropertyAttackBonus (5); break;
   case 123: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_26, IP_CONST_ABILITY_STR); break;
   case 124: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_STUN,IP_CONST_ONHIT_SAVEDC_24,IP_CONST_ONHIT_DURATION_75_PERCENT_1_ROUND); break;
   case 125: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_26, IP_CONST_ABILITY_CON); break;
   case 126: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_26, IP_CONST_ABILITY_DEX);  break;
   case 127: iProperty = ItemPropertyEnhancementBonus (5); break;
  }

return iProperty;
}

itemproperty iArmourProperty (int nHerbValue)
{
itemproperty iProperty;


  switch (nHerbValue)
  {
   case 7: iProperty = ItemPropertyACBonus (1); break;
   case 11: iProperty =ItemPropertyACBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,2); break;
   case 13: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGERESIST_5); break;
   case 14: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGERESIST_5); break;
   case 15: iProperty = ItemPropertyACBonus (2); break;
   case 19: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGERESIST_5); break;
   case 21: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGERESIST_5); break;
   case 22: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_MAGICAL,IP_CONST_DAMAGERESIST_5); break;
   case 23: iProperty =ItemPropertyACBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,3); break;
   case 25: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_NEGATIVE,IP_CONST_DAMAGERESIST_5); break;
   case 26: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGERESIST_5); break;
   case 27: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGERESIST_10); break;
   case 28: iProperty =ItemPropertyImmunityToSpellLevel (2); break;
   case 29: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGERESIST_10); break;
   case 30: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGERESIST_10); break;
   case 31: iProperty = ItemPropertyACBonus (3); break;
   case 35: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_BLUDGEONING,2); break;
   case 37: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_PIERCING,2); break;
   case 38: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_SLASHING,2); break;
   case 39: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGERESIST_10); break;
   case 41: iProperty =ItemPropertyBonusSpellResistance (IP_CONST_SPELLRESISTANCEBONUS_10); break;
      case 42: iProperty =ItemPropertyArcaneSpellFailure (IP_CONST_ARCANE_SPELL_FAILURE_MINUS_10_PERCENT); break;
   case 43: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_MAGICAL,IP_CONST_DAMAGERESIST_10); break;
   case 44: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_ABERRATION,3); break;
   case 45: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_NEGATIVE,IP_CONST_DAMAGERESIST_10); break;
   case 46: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGERESIST_10); break;
   case 47: iProperty =ItemPropertyACBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,3); break;
   case 49: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_ANIMAL,3); break;
   case 50: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_BEAST,3); break;
   case 51: iProperty =ItemPropertyImmunityToSpellLevel (3); break;
   case 52: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_CONSTRUCT,3); break;
  case 53: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_BLUDGEONING,3); break;
   case 54: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_PIERCING,3); break;
   case 55: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGERESIST_15); break;
   case 56: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_DWARF,3); break;
   case 57: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_SLASHING,3); break;
    case 58: iProperty =ItemPropertyBonusSpellResistance (IP_CONST_SPELLRESISTANCEBONUS_16); break;
   case 59: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGERESIST_15); break;
   case 60: iProperty =ItemPropertyBonusFeat (IP_CONST_FEAT_COMBAT_CASTING); break;
   case 61: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGERESIST_15); break;
   case 62: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGERESIST_15); break;
   case 63: iProperty = ItemPropertyACBonus (4); break;
   case 67: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_ELEMENTAL,3); break;
   case 69: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_GOBLINOID,3); break;
   case 70: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_MONSTROUS,3); break;
   case 71: iProperty =ItemPropertyBonusFeat (IP_CONST_FEAT_KNOCKDOWN); break;
   case 73: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_ORC,3); break;
   case 74: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_REPTILIAN,3); break;
   case 75: iProperty =ItemPropertyBonusFeat (IP_CONST_FEAT_POINTBLANK); break;
   case 76: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_MAGICAL_BEAST,3); break;
   case 77: iProperty =ItemPropertyBonusFeat (IP_CONST_FEAT_AMBIDEXTROUS); break;
   case 78: iProperty =ItemPropertyArcaneSpellFailure (IP_CONST_ARCANE_SPELL_FAILURE_MINUS_20_PERCENT); break;
   case 79: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_MAGICAL,IP_CONST_DAMAGERESIST_15); break;
   case 81: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_OUTSIDER,3); break;
   case 82: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_UNDEAD,3); break;
  case 83: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_ABERRATION,4); break;
   case 84: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_FEAR,2); break;
  case 85: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_ANIMAL,4); break;
   case 86: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_BEAST,4); break;
   case 87: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_NEGATIVE,IP_CONST_DAMAGERESIST_15); break;
    case 88: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_MINDAFFECTING,2); break;
   case 89: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_CONSTRUCT,4); break;
   case 90: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_DRAGON,4); break;
   case 91: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGERESIST_15); break;
   case 92: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_ELEMENTAL,4); break;
   case 93: iProperty =ItemPropertyImmunityToSpellLevel (4); break;
   case 94: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_BLUDGEONING,4); break;
   case 95: iProperty =ItemPropertyUnlimitedAmmo (IP_CONST_UNLIMITEDAMMO_PLUS5); break;
    case 97: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_DISEASE,2); break;
    case 98: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_NEGATIVE,2); break;
   case 99: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_GOBLINOID,4); break;
   case 100: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_DEATH,2); break;
   case 101: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_MONSTROUS,4); break;
   case 102: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_ORC,4); break;
   case 103: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_PIERCING,4); break;
   case 104: iProperty =ItemPropertyRegeneration (1); break;
   case 105: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_REPTILIAN,4); break;
   case 106: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_MAGICAL_BEAST,4); break;
   case 107: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_SLASHING,4); break;
   case 108: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_OUTSIDER,4); break;
   case 109: iProperty =ItemPropertyBonusSpellResistance (IP_CONST_SPELLRESISTANCEBONUS_22); break;
   case 110: iProperty =ItemPropertyArcaneSpellFailure (IP_CONST_ARCANE_SPELL_FAILURE_MINUS_30_PERCENT); break;
   case 111: iProperty =ItemPropertyImmunityToSpellLevel (5); break;
   case 112: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,5); break;
   case 113: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_UNDEAD,4); break;
   case 114: iProperty =ItemPropertyRegeneration (3); break;
   case 115: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,10); break;
   case 116: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_DEATH,4); break;
   case 117: iProperty = ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_FEAR);  break;
   case 118: iProperty = ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_MINDSPELLS); break;
   case 119: iProperty =  ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_PARALYSIS); break;
   case 120: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_UNIVERSAL,2); break;
   case 121: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEIMMUNITY_50_PERCENT); break;
   case 122: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_BLUDGEONING,IP_CONST_DAMAGEIMMUNITY_50_PERCENT); break;
   case 123: iProperty = ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_CRITICAL_HITS);  break;
   case 124: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_SLASHING,IP_CONST_DAMAGEIMMUNITY_50_PERCENT); break;
   case 125: iProperty =ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_KNOCKDOWN); break;
   case 126: iProperty =ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_DEATH_MAGIC);  break;
   case 127: iProperty = ItemPropertyACBonus (5); break;
  }

return iProperty;
}


itemproperty iRingAmuletProperty  (int nHerbValue)
{

itemproperty iProperty;


  switch (nHerbValue)
  {
   case 7: iProperty = ItemPropertyDarkvision (); break;
   case 11: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CHA,1); break;
   case 13: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_INT,1); break;
   case 14: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_WIS,1); break;
   case 15: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CHA,2); break;
   case 19: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_FORTITUDE,1); break;
   case 21: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_REFLEX,1); break;
    case 22: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_WILL,1); break;
   case 23: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_INT,2); break;
   case 25: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_BARD,IP_CONST_SPELLLEVEL_1); break;
   case 26: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_2); break;
   case 27: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_WIS,2); break;
   case 28: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_2); break;
   case 29: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_FORTITUDE,2); break;
    case 30: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_REFLEX,2); break;
   case 31: iProperty = ItemPropertyRegeneration (4); break;
   case 35:  iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_2); break;
   case 37:  iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_2); break;
   case 38: iProperty =ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_LOW,IP_CONST_LIGHTCOLOR_BLUE); break;
    case 39: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_WILL,2); break;
   case 41: iProperty =ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_LOW,IP_CONST_LIGHTCOLOR_PURPLE); break;
      case 42: iProperty =ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_LOW,IP_CONST_LIGHTCOLOR_RED); break;
   case 43: iProperty  =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_BARD,IP_CONST_SPELLLEVEL_4); break;
   case 44: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AID_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 45: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_4); break;
   case 46:  iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_4); break;
   case 47: iProperty =ItemPropertySpellImmunitySchool (SPELL_SCHOOL_EVOCATION); break;
   case 49: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BLESS_2,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 50: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GHOSTLY_VISAGE_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 51:  iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_4); break;
   case 52: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_EAGLE_SPLEDOR_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
  case 53:  iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_2); break;
   case 54:  iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_RANGER,IP_CONST_SPELLLEVEL_2); break;
    case 55: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_WILL,3); break;
   case 56: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENDURANCE_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 57:  iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_PALADIN,IP_CONST_SPELLLEVEL_2); break;
    case 58: iProperty =ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_NORMAL,IP_CONST_LIGHTCOLOR_YELLOW); break;
    case 59: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_REFLEX,3); break;
   case 60:  iProperty =ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_NORMAL,IP_CONST_LIGHTCOLOR_GREEN); break;
   case 61: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_FORTITUDE,3); break;
   case 62: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_WIS,3); break;
   case 63: iProperty = ItemPropertyCastSpell (IP_CONST_CASTSPELL_HEAL_11,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY); break;
   case 67: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_LIGHT_WOUNDS_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 69: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BULLS_STRENGTH_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 70: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_OWLS_WISDOM_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 71:  iProperty =ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_NORMAL,IP_CONST_LIGHTCOLOR_WHITE); break;
   case 73: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FOXS_CUNNING_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 74: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 75: iProperty =ItemPropertyBonusFeat (IP_CONST_FEAT_EXTRA_TURNING); break;
   case 76:iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENTROPIC_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 77: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 78: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_EAGLES_SPLENDOR_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 79: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_INT,3); break;
   case 81: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CLARITY_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 82: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MAGE_ARMOR_2,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
  case 83: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BARKSKIN_6,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 84: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_VIRTUE_1,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
  case 85: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_ENDURANCE_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 86: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_SERIOUS_WOUNDS_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 87: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CHA,3); break;
    case 88: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FIND_TRAPS_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 89: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ELEMENTAL_SHIELD_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 90: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 91: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_BULLS_STRENGTH_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 92: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_OWLS_WISDOM_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 93: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IMPROVED_INVISIBILITY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 94: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_RESTORATION_13,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 95: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_8); break;
    case 97: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_RESTORATION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
    case 98: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_MIND_BLANK_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 99: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_FOXS_CUNNING_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 100: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_DARKVISION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 101: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_HEALING_CIRCLE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 102: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_RESISTANCE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 103: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GLOBE_OF_INVULNERABILITY_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 104: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_DISEASE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 105: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 106: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IDENTIFY_3,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY); break;
   case 107: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_STONESKIN_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 108: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AURAOFGLORY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 109: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_BARD,IP_CONST_SPELLLEVEL_6); break;
   case 110: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_PALADIN,IP_CONST_SPELLLEVEL_4); break;
   case 111: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_8);  break;
   case 112: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 113: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
   case 114: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
  case 115: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
    case 116: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
   case 117: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_RANGER,IP_CONST_SPELLLEVEL_4); break;
   case 118: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_6); break;
   case 119: iProperty =  ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_8); break;
   case 120: iProperty =ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_POISON); break;
   case 121: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_6); break;
   case 122: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_6); break;
   case 123: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_8); break;
   case 124: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_6); break;
   case 125: iProperty =ItemPropertyImprovedEvasion (); break;
   case 126: iProperty =ItemPropertyTrueSeeing (); break;
   case 127: iProperty = ItemPropertyHaste (); break;
  }

return iProperty;
}


itemproperty iClothMiscProperty  (int nHerbValue)
{

itemproperty iProperty;


  switch (nHerbValue)
  {
   case 7: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CON,1); break;
   case 11: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_DEX,1); break;
   case 13: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_STR,1); break;
   case 14: iProperty =ItemPropertySkillBonus (SKILL_ANIMAL_EMPATHY,5); break;
   case 15: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CON,2); break;
   case 19: iProperty =ItemPropertySkillBonus (SKILL_APPRAISE,5); break;
   case 21: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,5); break;
    case 22: iProperty =ItemPropertySkillBonus (SKILL_DISABLE_TRAP,5); break;
   case 23: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_DEX,2); break;
   case 25: iProperty =ItemPropertySkillBonus (FEAT_SKILL_FOCUS_DISCIPLINE,5); break;
   case 26: iProperty =ItemPropertySkillBonus (SKILL_HEAL,5); break;
   case 27: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_STR,2); break;
   case 28: iProperty =ItemPropertySkillBonus (SKILL_HIDE,5); break;
   case 29: iProperty =ItemPropertySkillBonus (SKILL_ANIMAL_EMPATHY,10); break;
    case 30: iProperty =ItemPropertySkillBonus (SKILL_ANIMAL_EMPATHY,10); break;
   case 31: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CON,3); break;
   case 35:  iProperty =ItemPropertySkillBonus (SKILL_LISTEN,5); break;
   case 37:  iProperty =ItemPropertySkillBonus (SKILL_LORE,5); break;
   case 38: iProperty =ItemPropertySkillBonus (SKILL_MOVE_SILENTLY,5); break;
    case 39: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,10); break;
   case 41: iProperty =ItemPropertySkillBonus (SKILL_PERFORM,5); break;
      case 42: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,5); break;
   case 43: iProperty =ItemPropertySkillBonus (FEAT_SKILL_FOCUS_DISABLE_TRAP,10); break;
   case 44: iProperty =ItemPropertySkillBonus (SKILL_SPOT,5); break;
   case 45: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,10); break;
   case 46:  iProperty =ItemPropertySkillBonus (SKILL_HEAL,10); break;
   case 47: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_DEX,3); break;
   case 49: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,5); break;
   case 50: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GHOSTLY_VISAGE_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 51:  iProperty =ItemPropertySkillBonus (SKILL_HIDE,10); break;
   case 52: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_EAGLE_SPLEDOR_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
  case 53:  iProperty =ItemPropertySkillBonus (SKILL_LISTEN,10); break;
   case 54:  iProperty =ItemPropertySkillBonus (SKILL_LORE,10); break;
    case 55: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_STR,3); break;
   case 56: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENDURANCE_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 57:  iProperty =ItemPropertySkillBonus (SKILL_LORE,10); break;
    case 58: iProperty =ItemPropertySkillBonus (SKILL_PERFORM,10); break;
    case 59: iProperty =ItemPropertySkillBonus (SKILL_ANIMAL_EMPATHY,15); break;
   case 60: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,10); break;
   case 61: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,15); break;
   case 62: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,15); break;
   case 63: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CON,4); break;
   case 67: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_LIGHT_WOUNDS_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 69: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BULLS_STRENGTH_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 70: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_OWLS_WISDOM_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 71: iProperty =ItemPropertySkillBonus (SKILL_SPOT,10); break;
   case 73: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FOXS_CUNNING_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 74: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 75: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,10); break;
   case 76:iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENTROPIC_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 77: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 78: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_EAGLES_SPLENDOR_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 79: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,15); break;
   case 81: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CLARITY_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 82: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MAGE_ARMOR_2,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
  case 83: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BARKSKIN_6,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 84: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_VIRTUE_1,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
  case 85: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_ENDURANCE_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 86: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_SERIOUS_WOUNDS_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 87: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,15); break;
    case 88: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FIND_TRAPS_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 89: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ELEMENTAL_SHIELD_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 90: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 91: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_BULLS_STRENGTH_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 92: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_OWLS_WISDOM_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 93: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IMPROVED_INVISIBILITY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 94: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_RESTORATION_13,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 95: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_DEX,4); break;
    case 97: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_RESTORATION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
    case 98: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_MIND_BLANK_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 99: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_FOXS_CUNNING_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 100: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_DARKVISION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 101: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_HEALING_CIRCLE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 102: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_RESISTANCE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 103: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GLOBE_OF_INVULNERABILITY_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 104: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_DISEASE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 105: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 106: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IDENTIFY_3,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY); break;
   case 107: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_STONESKIN_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 108: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AURAOFGLORY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 109: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_BARD,IP_CONST_SPELLLEVEL_6); break;
   case 110: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_PALADIN,IP_CONST_SPELLLEVEL_4); break;
   case 111: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_STR,4); break;
   case 112: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 113: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
   case 114: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
  case 115: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
    case 116: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
   case 117: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_RANGER,IP_CONST_SPELLLEVEL_4); break;
   case 118: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_6); break;
   case 119: iProperty =  ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_8); break;
   case 120: iProperty =ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_POISON); break;
   case 121: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_6); break;
   case 122: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_6); break;
   case 123: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_8); break;
   case 124: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_6); break;
   case 125: iProperty =ItemPropertyImprovedEvasion ();    break;
   case 126: iProperty =ItemPropertyTrueSeeing ();   break;
   case 127: iProperty = ItemPropertyFreeAction (); break;
  }

return iProperty;



}


itemproperty iGlovesProperty  (int nHerbValue)
{

itemproperty iProperty;


  switch (nHerbValue)
  {
   case 7: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_1d6); break;
   case 11:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_1d6); break;
   case 13:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_1d6); break;
   case 14: iProperty =ItemPropertyAttackBonus (3); break;
   case 15:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_1d8); break;
   case 19: iProperty =ItemPropertySkillBonus (SKILL_APPRAISE,5); break;
   case 21: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,5); break;
    case 22: iProperty =ItemPropertySkillBonus (SKILL_DISABLE_TRAP,5); break;
   case 23:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_1d8); break;
   case 25: iProperty =ItemPropertySkillBonus (FEAT_SKILL_FOCUS_DISCIPLINE,5); break;
   case 26: iProperty =ItemPropertySkillBonus (SKILL_HEAL,5); break;
   case 27:   iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_1d8); break;
   case 28: iProperty =ItemPropertySkillBonus (SKILL_HIDE,5); break;
   case 29: iProperty =ItemPropertyAttackBonus (6); break;
    case 30: iProperty =ItemPropertySkillBonus (SKILL_ANIMAL_EMPATHY,10); break;
   case 31:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d6); break;
   case 35:  iProperty =ItemPropertySkillBonus (SKILL_LISTEN,5); break;
   case 37:  iProperty =ItemPropertySkillBonus (SKILL_LORE,5); break;
   case 38: iProperty =ItemPropertySkillBonus (SKILL_MOVE_SILENTLY,5); break;
    case 39: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,10); break;
   case 41: iProperty =ItemPropertySkillBonus (SKILL_PERFORM,5); break;
      case 42: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,5); break;
   case 43: iProperty =ItemPropertySkillBonus (FEAT_SKILL_FOCUS_DISABLE_TRAP,10); break;
   case 44: iProperty =ItemPropertySkillBonus (SKILL_SPOT,5); break;
   case 45: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,10); break;
   case 46:  iProperty =ItemPropertySkillBonus (SKILL_HEAL,10); break;
   case 47:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d6); break;
   case 49: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,5); break;
   case 50: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GHOSTLY_VISAGE_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 51:  iProperty =ItemPropertySkillBonus (SKILL_HIDE,10); break;
   case 52: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_EAGLE_SPLEDOR_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
  case 53:  iProperty =ItemPropertySkillBonus (SKILL_LISTEN,10); break;
   case 54:  iProperty =ItemPropertySkillBonus (SKILL_LORE,10); break;
    case 55:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d6); break;
   case 56: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENDURANCE_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 57:  iProperty =ItemPropertySkillBonus (SKILL_LORE,10); break;
    case 58: iProperty =ItemPropertySkillBonus (SKILL_PERFORM,10); break;
    case 59: iProperty =ItemPropertyAttackBonus (10); break;
   case 60: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,10); break;
   case 61: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,15); break;
   case 62: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,15); break;
   case 63:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d8); break;
   case 67: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_LIGHT_WOUNDS_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 69: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BULLS_STRENGTH_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 70: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_OWLS_WISDOM_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 71: iProperty =ItemPropertySkillBonus (SKILL_SPOT,10); break;
   case 73: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FOXS_CUNNING_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 74: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 75: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,10); break;
   case 76:iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENTROPIC_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 77: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 78: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_EAGLES_SPLENDOR_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 79: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,15); break;
   case 81: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CLARITY_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 82: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MAGE_ARMOR_2,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
  case 83: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BARKSKIN_6,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 84: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_VIRTUE_1,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
  case 85: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_ENDURANCE_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 86: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_SERIOUS_WOUNDS_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 87: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,15); break;
    case 88: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FIND_TRAPS_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 89: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ELEMENTAL_SHIELD_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 90: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 91: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_BULLS_STRENGTH_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 92: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_OWLS_WISDOM_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 93: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IMPROVED_INVISIBILITY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 94: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_RESTORATION_13,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 95:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d8); break;
    case 97: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_RESTORATION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
    case 98: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_MIND_BLANK_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 99: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_FOXS_CUNNING_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 100: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_DARKVISION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 101: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_HEALING_CIRCLE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 102: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_RESISTANCE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 103: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GLOBE_OF_INVULNERABILITY_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 104: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_DISEASE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 105: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 106: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IDENTIFY_3,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY); break;
   case 107: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_STONESKIN_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 108: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AURAOFGLORY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 109: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_BARD,IP_CONST_SPELLLEVEL_6); break;
   case 110: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_PALADIN,IP_CONST_SPELLLEVEL_4); break;
   case 111:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d8); break;
   case 112: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 113: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
   case 114: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
  case 115: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
    case 116: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
   case 117: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_RANGER,IP_CONST_SPELLLEVEL_4); break;
   case 118: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_6); break;
   case 119: iProperty =ItemPropertyAttackBonus (3); break;
   case 120: iProperty =ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_POISON); break;
   case 121: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_6); break;
   case 122: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_6); break;
   case 123: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_8); break;
   case 124: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_6); break;
   case 125: iProperty =ItemPropertyImprovedEvasion (); break;
   case 126: iProperty =ItemPropertyTrueSeeing ();    break;
   case 127: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BOMBARDMENT_20,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
  }

return iProperty;
}


itemproperty iFoodProperty  (int nHerbValue)

{
itemproperty iProperty;


  switch (nHerbValue)
  {
   case 7: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AID_3,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 11:  iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BLESS_2,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 13:  iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BULLS_STRENGTH_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 14: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CATS_GRACE_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 15:  iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ANIMATE_DEAD_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 19: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CLARITY_3,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 21: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_LIGHT_WOUNDS_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
    case 22: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_MODERATE_WOUNDS_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 23:  iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BARKSKIN_6,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 25: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ELEMENTAL_SHIELD_12,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 26: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AID_3,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 27:   iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENDURANCE_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 28: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_MIND_BLANK_9,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 29: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CREATE_GREATER_UNDEAD_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
    case 30: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_SERIOUS_WOUNDS_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 31:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d6); break;
   case 35:  iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_RESTORATION_3,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 37:  iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MAGE_ARMOR_2,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 38: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MASS_HEAL_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
    case 39: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_CRITICAL_WOUNDS_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 41: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MIND_BLANK_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
      case 42: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MINOR_GLOBE_OF_INVULNERABILITY_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 43: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_DEATH_WARD_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 44: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GHOSTLY_VISAGE_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 45: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FREEDOM_OF_MOVEMENT_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 46:  iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GLOBE_OF_INVULNERABILITY_11,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 47:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d6); break;
   case 49: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_NATURES_BALANCE_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 50: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_NEGATIVE_ENERGY_PROTECTION_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 51:  iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_RESTORATION_13,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 52: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_NEUTRALIZE_POISON_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
  case 53:  iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_SPELL_MANTLE_17,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 54:  iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_STONESKIN_11,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
    case 55:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d6); break;
   case 56: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_PRAYER_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 57:  iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_HASTE_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
    case 58: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_HEALING_CIRCLE_16,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
    case 59: iProperty =ItemPropertyAttackBonus (10); break;
   case 60: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IMPROVED_INVISIBILITY_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 61: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,15); break;
   case 62: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,15); break;
   case 63:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d8); break;
   case 67: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_PROTECTION_FROM_ALIGNMENT_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 69: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_BLINDNESS_DEAFNESS_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 70: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_FEAR_2,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 71: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_INVISIBILITY_SPHERE_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 73: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_DISEASE_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 74: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_CURSE_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 75: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MASS_HASTE_11,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 76: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_PARALYSIS_3,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 77: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 78: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MORDENKAINENS_SWORD_13,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 79: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,15); break;
   case 81: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_RESISTANCE_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 82: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_RESTORATION_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
  case 83: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_POLYMORPH_SELF_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 84: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SPELL_RESISTANCE_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
  case 85: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_PREMONITION_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 86: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SANCTUARY_2,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 87: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,15); break;
    case 88: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SPELL_MANTLE_13,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 89: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SHADOW_SHIELD_13,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 90: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SHAPECHANGE_17,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 91: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_BULLS_STRENGTH_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 92: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_STONESKIN_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 93: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IMPROVED_INVISIBILITY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 94: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_RESTORATION_13,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 95:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d8); break;
    case 97: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REGENERATE_13,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
    case 98: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_MIND_BLANK_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 99: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_TENSERS_TRANSFORMATION_11,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 100: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_DARKVISION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 101: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_HEAL_11,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
   case 102: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_RESISTANCE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 103: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GLOBE_OF_INVULNERABILITY_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 104: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_DISEASE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 105: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 106: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IDENTIFY_3,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY); break;
   case 107: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_STONESKIN_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 108: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AURAOFGLORY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 109: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_BARD,IP_CONST_SPELLLEVEL_6); break;
   case 110: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_PALADIN,IP_CONST_SPELLLEVEL_4); break;
   case 111:  iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d8); break;
   case 112: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
   case 113: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
   case 114: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
  case 115: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
    case 116: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
   case 117: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_RANGER,IP_CONST_SPELLLEVEL_4); break;
   case 118: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_6); break;
   case 119: iProperty =ItemPropertyAttackBonus (3); break;
   case 120: iProperty =ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_POISON); break;
   case 121: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_6); break;
   case 122: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_6); break;
   case 123: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_8); break;
   case 124: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_6); break;
   case 125: iProperty =ItemPropertyImprovedEvasion (); break;
   case 126: iProperty =ItemPropertyTrueSeeing ();    break;
   case 127: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BOMBARDMENT_20,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
  }

return iProperty;
}

void SetRegTokens(int nPattern)

{
// First of all, do our two extra reagents
SetCustomToken(2008,GetName(GetObjectByTag(TagExtraReg1(nPattern))));
SetCustomToken(2009,GetName(GetObjectByTag(TagExtraReg2(nPattern))));

if (nPattern>=REAGENT_VERVAIN)
{
nPattern=nPattern-REAGENT_VERVAIN;
 if (nPattern>0)
 {
 SetCustomToken(2007," vervain,");
 }
 else
 {
 SetCustomToken(2007," and vervain.");
 }

}
else
{
SetCustomToken(2007,"");
}

if (nPattern>=REAGENT_SUKAKE)
{
nPattern=nPattern-REAGENT_SUKAKE;
 if (nPattern>0)
 {
 SetCustomToken(2006," sukake,");
 }
 else
 {
 SetCustomToken(2006," and sukake.");
 }


}
else
{
SetCustomToken(2006,"");
}

if (nPattern>=REAGENT_ROSEMAGES)
{

nPattern=nPattern-REAGENT_ROSEMAGES;
 if (nPattern>0)
 {
 SetCustomToken(2005," rose of mages,");
 }
 else
 {
 SetCustomToken(2005," and rose of mages.");
 }
}
else
{
SetCustomToken(2005,"");
}

if (nPattern>=REAGENT_HYSSOP)
{

nPattern=nPattern-REAGENT_HYSSOP;
 if (nPattern>0)
 {
 SetCustomToken(2004," hyssop,");
 }
 else
 {
 SetCustomToken(2004," and hyssop.");
 }

}
else
{
SetCustomToken(2004,"");
}

if (nPattern>=REAGENT_FOOLSWEED)
{

nPattern=nPattern-REAGENT_FOOLSWEED;
 if (nPattern>0)
 {
 SetCustomToken(2003," fool's weed,");
 }
 else
 {
 SetCustomToken(2003," and fool's weed.");
 }

}
else
{
SetCustomToken(2003,"");
}

if (nPattern>=REAGENT_DRYADSTEARS)
{

nPattern=nPattern-REAGENT_DRYADSTEARS;
 if (nPattern>0)
 {
 SetCustomToken(2002," dryad's tears,");
 }
 else
 {
 SetCustomToken(2002," and dryad's tears.");
 }

}
else
{
SetCustomToken(2002,"");
}

if (nPattern>=REAGENT_CLOTHGOLD)
{

nPattern=nPattern-REAGENT_CLOTHGOLD;
 if (nPattern>0)
 {
 SetCustomToken(2001," cloth of gold,");
 }
 else
 {
 SetCustomToken(2001," and cloth of gold.");
 }

}
else
{
SetCustomToken(2001,"");
}


}

void LearnPattern(object oUser, string sTag, object oItem)
{
// Sample tag of item jw_pat_gau_000
// gau is gauntlets. clo is boots, belts and cloak
// rin is amulets and rings. arm is armour. wep is weapons

// Get their persistent storage item
object oModule=GetItemPossessedBy(oUser,"jw_crafting_gem");
if (!GetIsObjectValid(oModule))
{
SendMessageToPC(oUser,"You have lost your persistent storage module. Please contact a DM");
return;
}

// The string we use for the technique need not be the same as the
// Actual tag of the technique, because we
// Might add some letters on to the end of the tag to represent
// Additional ingredients

string sTech=GetStringLeft(sTag,14);

// Check to see if the module aready has this local int stored
if (GetLocalInt(oModule,sTag)==TRUE)
{
SendMessageToPC(oUser,"You already know this technique");
CreateItemOnObject(sTag,oUser);
return;
}

// Learn the technique
SetLocalInt(oModule,sTag,TRUE);
// Give the player a message
string sName=GetName(GetObjectByTag(sTag));

FloatingTextStringOnCreature("Learned the technique "+sName,oUser,TRUE);
// Give the player a visual effect
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_HOLY_AID),oUser);

// Make it so that we know they have learned at least one technique of this type
string sType=GetSubString(sTag,7,3);

// Should give us gau, clo, rin, arm or wep or fod
SetLocalInt(oModule,sType,TRUE);

}

int KnowsAnyTechnique(object oPC, int nTechnique)
{
int nReturn=FALSE;
object oModule=GetItemPossessedBy(oPC,"jw_crafting_gem");

if (nTechnique==TECHNIQUE_GAUNTLETS&&GetLocalInt(oModule,"gau")==TRUE)
{
nReturn=TRUE;
}
if (nTechnique==TECHNIQUE_CLOTHING&&GetLocalInt(oModule,"clo")==TRUE)
{
nReturn=TRUE;
}
if (nTechnique==TECHNIQUE_RINGAMULET&&GetLocalInt(oModule,"rin")==TRUE)
{
nReturn=TRUE;
}
if (nTechnique==TECHNIQUE_ARMOUR&&GetLocalInt(oModule,"arm")==TRUE)
{
nReturn=TRUE;
}
if (nTechnique==TECHNIQUE_WEAPON&&GetLocalInt(oModule,"wep")==TRUE)
{
nReturn=TRUE;
}
if (nTechnique==TECHNIQUE_FOOD&&GetLocalInt(oModule,"fod")==TRUE)
{
nReturn=TRUE;
}
return nReturn;
}

int CheckDevice(object oPC, int nDoing)
{
// We need to check whether the PC is close to the relevant device
string sDevice;

object oDevice;

switch (nDoing)
{
case TECHNIQUE_GAUNTLETS: sDevice="jw_gaunt_dev";
break;
case TECHNIQUE_CLOTHING: sDevice="jw_cloth_dev";
break;
case TECHNIQUE_RINGAMULET: sDevice="jw_ring_dev";
break;
case TECHNIQUE_WEAPON: sDevice="jw_weapon_dev";
break;
case TECHNIQUE_ARMOUR: sDevice="jw_arm_dev";
break;
case TECHNIQUE_FOOD: sDevice="jw_fod_dev";
break;
}

 oDevice=GetNearestObjectByTag(sDevice,oPC);
if (!GetIsObjectValid(oDevice))
{
return FALSE;
}

float fDistance=GetDistanceBetween(oPC,oDevice);
if (fDistance<0.0)
{
return FALSE;
}

if (fDistance>7.0)
{
return FALSE;
}


return TRUE;
}

string BuildTechName (int nDoing, int nCurrent)
{
string sName;

string sTechStart;

   switch (nDoing)
   {
case TECHNIQUE_GAUNTLETS: sTechStart="jw_pat_gau_";
break;
case TECHNIQUE_CLOTHING: sTechStart="jw_pat_clo_";
break;
case TECHNIQUE_RINGAMULET: sTechStart="jw_pat_rin_";
break;
case TECHNIQUE_WEAPON: sTechStart="jw_pat_wep_";
break;
case TECHNIQUE_ARMOUR: sTechStart="jw_pat_arm_";
break;
case TECHNIQUE_FOOD: sTechStart="jw_pat_fod_";
break;
}

string sTechEnd=IntToString(nCurrent);
if (GetStringLength(sTechEnd)==1)
{
sTechEnd="00"+sTechEnd;
}
else if (GetStringLength(sTechEnd)==2)
{
sTechEnd="0"+sTechEnd;
}
sName=sTechStart+sTechEnd;

return sName;
}

void BDSetDescription(int nDoing, int nCurrent)
{

SetCustomToken(2013,"description not yet implemented");
}

string TagExtraReg1 (int nPattern)
{

 string sReturn;


 sReturn="rare1_"+IntToString(nPattern);
 object oReg=GetObjectByTag(sReturn);
 if (!GetIsObjectValid(oReg))
 {
 sReturn="";
 }


return sReturn;
}

string TagExtraReg2 (int nPattern)
{

 string sReturn;


 sReturn="rare2_"+IntToString(nPattern);
 object oReg=GetObjectByTag(sReturn);
 if (!GetIsObjectValid(oReg))
 {
 sReturn="";
 }

return sReturn;
}

void DoEnchantmentGraphics(object oPC, int nDoing)
{
// We need to check whether the PC is close to the relevant device
string sDevice;
int nGlow;
object oDevice;
string sSound;

switch (nDoing)
{
case TECHNIQUE_GAUNTLETS: sDevice="jw_gaunt_dev";
nGlow=VFX_DUR_GLOW_ORANGE;
sSound="sco_mehedevil01";
break;
case TECHNIQUE_CLOTHING: sDevice="jw_cloth_dev";
nGlow=VFX_DUR_GLOW_RED;
sSound="sco_mehanmind02";
break;
case TECHNIQUE_RINGAMULET: sDevice="jw_ring_dev";
nGlow=VFX_DUR_GLOW_WHITE;
sSound="sco_mehedsonc01";
break;
case TECHNIQUE_WEAPON: sDevice="jw_weapon_dev";
nGlow=VFX_DUR_GLOW_PURPLE;
sSound="sco_mebalodd01";
break;
case TECHNIQUE_ARMOUR: sDevice="jw_arm_dev";
nGlow=VFX_DUR_GLOW_YELLOW;
sSound="sco_lgupelec01";
break;
case TECHNIQUE_FOOD: sDevice="jw_fod_dev";
nGlow=VFX_DUR_INFERNO_NO_SOUND; // This tells it to make a flame instead and not to make the PC effect
sSound="al_cv_firecamp1";
break;
}

 oDevice=GetNearestObjectByTag(sDevice,oPC);

AssignCommand(oPC,SetFacingPoint(GetPosition(oDevice)));
if (nGlow==VFX_DUR_INFERNO_NO_SOUND)
{
DropFlame(GetLocation(oDevice));
}
else
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectVisualEffect(nGlow),oDevice,6.0);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_POLYMORPH),oPC);
}
AssignCommand(oDevice,PlaySound(sSound));
//ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectBeam(nBeam,oDevice,BODY_NODE_CHEST),oPC,2.0);
}


string GetFoodType (int nPattern)
{
// Default is deer
string sString = "jw_meat_deer";

// lion
if (nPattern==13||nPattern==14||nPattern==19||nPattern==50||nPattern==81||nPattern==82||nPattern==84||
nPattern==53||nPattern==60||nPattern==77||nPattern==86)
{
sString="jw_meat_lion";
}
else
// polar bear
if (nPattern==25||nPattern==28||nPattern==35||nPattern==97||nPattern==23||nPattern==29||nPattern==45||
nPattern==46||nPattern==54||nPattern==83||nPattern==90)
{
sString="jw_meat_polar";
}
else
// deep rothe
if (nPattern==42||nPattern==15||nPattern==27||nPattern==30||nPattern==43||nPattern==75||nPattern==85||
nPattern==89||nPattern==92||nPattern==99||nPattern==101)
{
sString="jw_meat_rothe";
}
else
// desert cougar
if (nPattern==22||nPattern==49||nPattern==88||nPattern==39||nPattern==51||nPattern==57||nPattern==58||
nPattern==78)
{
sString="jw_meat_coug";
}

return sString;
}

int GetMiscClothType (int nPattern)
{
// Default is belt
int nReturn=BASE_ITEM_BELT;

// cloak
if (nPattern==7||nPattern==14||nPattern==21||nPattern==28||nPattern==37||nPattern==41||nPattern==49||
nPattern==15||nPattern==29||nPattern==39||nPattern==51||nPattern==54||nPattern==58||nPattern==75||
nPattern==31||nPattern==59||nPattern==61||nPattern==87||
nPattern==7)
{
nReturn=BASE_ITEM_CLOAK;
}
else
// boots
if (nPattern==11||nPattern==25||nPattern==35||nPattern==38||nPattern==42||nPattern==23||nPattern==45||
nPattern==53||nPattern==57||nPattern==60||nPattern==47||nPattern==62||nPattern==79||nPattern==95)
{
nReturn=BASE_ITEM_BOOTS;
}
return nReturn;

}



void JumpToEnemy(object oEnemy, int nVis=VFX_FNF_SUMMON_UNDEAD)
{

    object oTargetVictim = oEnemy;

    // * won't jump if closer than 4 meters to victim
    if ((GetDistanceToObject(oTargetVictim) > 4.0)   && (GetObjectSeen(oTargetVictim) == TRUE))
    {
        ClearAllActions();
        effect eVis = EffectVisualEffect(nVis);
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);

//        SpeakString("Jump to " + GetName(oTargetVictim));
        DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF));
        DelayCommand(0.3,ActionJumpToObject(oTargetVictim));
        DelayCommand(0.5,ActionAttack(oTargetVictim));
    }
}


void DeathExplode(int nDamage = 8, int nInitialVFX = VFX_FNF_FIREBALL, int nDamageVFX = VFX_IMP_FLAME_M, int nDamageType = DAMAGE_TYPE_FIRE, int nSaveType= SAVING_THROW_TYPE_FIRE, int nSaveDC = 15, float fRadius = 10.0)
{
      //Declare major variables
    object oCaster = OBJECT_SELF;
    int nMetaMagic = PRCGetMetaMagicFeat();
    int nDamageBase=nDamage;

    float fDelay;
    location llocation = GetLocation(OBJECT_SELF);
       ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(nInitialVFX), llocation);

    effect eVis = EffectVisualEffect(nDamageVFX);
    effect eDam;
    //Get the spell target location as opposed to the spell target.
    location lTarget = GetLocation(OBJECT_SELF);
    //Limit Caster level for the purposes of damage
    //Apply the fireball explosion at the location captured above.

    ///Declare the spell shape, size and the location.  Capture the first target object in the shape.
    object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, fRadius, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR);
    //Cycle through the targets within the spell shape until an invalid object is captured.
    while (GetIsObjectValid(oTarget))
    {
        if(GetIsReactionTypeHostile(oTarget))
        {
       //Fire cast spell at event for the specified target
        SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_ICE_STORM));
        //Get the distance between the explosion and the target to calculate delay
        fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;

            //Adjust the damage based on the Reflex Save, Evasion and Improved Evasion.
            nDamage = PRCGetReflexAdjustedDamage(nDamageBase, oTarget, nSaveDC, nSaveType);
            //Set the damage effect
            eDam = EffectDamage(nDamage, nDamageType);
            if(nDamage > 0)
            {
                // Apply effects to the currently selected target.
                DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget));
                //This visual effect is applied to the target object not the location as above.  This visual effect
                //represents the flame that erupts on the target not on the ground.
                DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
            }
         }

       //Select the next target within the spell shape.
       oTarget = GetNextObjectInShape(SHAPE_SPHERE, fRadius, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR);
    }
   }


void deathcascade(object oTarget)
{
    //Declare major variables
    int nCasterLevel = 6;
    int nDamage = d6(nCasterLevel);
    int nDamStrike;
    int nNumAffected = 0;
    //Declare lightning effect connected the casters hands
    effect eLightning = EffectBeam(VFX_BEAM_FIRE, OBJECT_SELF, BODY_NODE_HAND);;
    effect eVis  = EffectVisualEffect(VFX_IMP_FLAME_S);
    effect eDamage;
    object oFirstTarget = oTarget;
    object oHolder;
    object oTarget;
    location lSpellLocation;
    //Damage the initial target
    if(!GetIsReactionTypeFriendly(oFirstTarget,OBJECT_SELF))
    {
        //Fire cast spell at event for the specified target
        SignalEvent(oFirstTarget, EventSpellCastAt(OBJECT_SELF, SPELL_CHAIN_LIGHTNING));
        //Make an SR Check

            //Adjust damage via Reflex Save or Evasion or Improved Evasion
            nDamStrike = PRCGetReflexAdjustedDamage(nDamage, oFirstTarget, 24, SAVING_THROW_TYPE_FIRE);
            //Set the damage effect for the first target
            eDamage = EffectDamage(nDamStrike, DAMAGE_TYPE_FIRE);
            //Apply damage to the first target and the VFX impact.
            if(nDamStrike > 0)
            {
                ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oFirstTarget);
                ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oFirstTarget);
            }

    }
    //Apply the lightning stream effect to the first target, connecting it with the caster
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLightning,oFirstTarget,0.5);
    //Reinitialize the lightning effect so that it travels from the first target to the next target
    eLightning = EffectBeam(VFX_BEAM_FIRE, oFirstTarget, BODY_NODE_CHEST);
    //Halve the damage for all secondary targets beyond the first.
//    eDamage = EffectDamage(nDamage/2, DAMAGE_TYPE_ELECTRICAL);
    float fDelay = 0.2;
    int nCnt;
    //Get the first target in the spell shape
    oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oFirstTarget), TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
    while (GetIsObjectValid(oTarget) && nCnt < nCasterLevel)
    {
        //Make sure the caster's faction is not hit and the first target is not hit
        if (oTarget != oFirstTarget && !GetIsReactionTypeFriendly(oTarget) && oTarget != OBJECT_SELF)
        {
            //Connect the new lightning stream to the older target and the new target
            DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLightning,oTarget,0.5));
            //Fire cast spell at event for the specified target
            SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_CHAIN_LIGHTNING));
            //Do an SR check

                nDamage = d6(nCasterLevel);

                //Adjust damage via Reflex Save or Evasion or Improved Evasion
                nDamStrike = PRCGetReflexAdjustedDamage(nDamage, oTarget, 24, SAVING_THROW_TYPE_FIRE);
                //Apply the damage and VFX impact to the current target
                eDamage = EffectDamage(nDamStrike, DAMAGE_TYPE_FIRE);
                if(nDamStrike > 0) //age > 0)
                {
                    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oTarget));
                    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget));
                }

            oHolder = oTarget;
            //change the currect holder of the lightning stream to the current target
            eLightning = EffectBeam(VFX_BEAM_FIRE, oHolder, BODY_NODE_CHEST);
            fDelay = fDelay + 0.1f;
        }
        //Count the number of targets that have been hit.
        if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
        {
            nCnt++;
        }
        //Get the next target in the shape.
        oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oFirstTarget), TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
      }
 }

void DiseaseExplode(int nDisease=DISEASE_SOLDIER_SHAKES)
 {
      location llocation = GetLocation(OBJECT_SELF);
       ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PULSE_NATURE), llocation);
       ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DISEASE_S), llocation);

    object oCaster = OBJECT_SELF;
    int nMetaMagic = PRCGetMetaMagicFeat();
    int nDamage;
    float fDelay;
    effect eCon = EffectDisease(nDisease);
    effect eTest;
    eCon = ExtraordinaryEffect(eCon);
    effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
    //effect eDis = EffectVisualEffect(VFX_IMP_DISEASE_S);
    effect eLink = EffectLinkEffects(eCon, eDur);
    //eLink = EffectLinkEffects(eDis, eDur);
    //Get the spell target location as opposed to the spell target.
    location lTarget = GetLocation(OBJECT_SELF);
    //Limit Caster level for the purposes of damage
    //Apply the fireball explosion at the location captured above.
    ///Declare the spell shape, size and the location.  Capture the first target object in the shape.
    object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR);
    //Cycle through the targets within the spell shape until an invalid object is captured.
    while (GetIsObjectValid(oTarget))
    {
       if(GetIsReactionTypeHostile(oTarget))
       {
       //Fire cast spell at event for the specified target
        SignalEvent(oTarget, EventSpellCastAt(oTarget, SPELL_CONTAGION));
        //Get the distance between the explosion and the target to calculate delay
        fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
        DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget));
       }
       //Select the next target within the spell shape.
       oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR);
    }
}

void PoisonExplode(int nPoison=POISON_BLACK_LOTUS_EXTRACT)
 {
      location llocation = GetLocation(OBJECT_SELF);
       ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PULSE_WIND), llocation);
       ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POISON_S), llocation);

    object oCaster = OBJECT_SELF;
    int nMetaMagic = PRCGetMetaMagicFeat();
    int nDamage;
    float fDelay;
    effect eCon = EffectPoison(nPoison);
    effect eTest;
    eCon = ExtraordinaryEffect(eCon);
    effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
    //effect eDis = EffectVisualEffect(VFX_IMP_DISEASE_S);
    effect eLink = EffectLinkEffects(eCon, eDur);
    //eLink = EffectLinkEffects(eDis, eDur);
    //Get the spell target location as opposed to the spell target.
    location lTarget = GetLocation(OBJECT_SELF);
    //Limit Caster level for the purposes of damage
    //Apply the fireball explosion at the location captured above.
    ///Declare the spell shape, size and the location.  Capture the first target object in the shape.
    object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR);
    //Cycle through the targets within the spell shape until an invalid object is captured.
    while (GetIsObjectValid(oTarget))
    {
       if(GetIsReactionTypeHostile(oTarget))
       {
       //Fire cast spell at event for the specified target
        SignalEvent(oTarget, EventSpellCastAt(oTarget, SPELL_POISON));
        //Get the distance between the explosion and the target to calculate delay
        fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
        DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget));
       }
       //Select the next target within the spell shape.
       oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR);
    }
}

void ZapTargets(int nBeam=VFX_BEAM_EVIL, int nDamage = 12, int nDC = 24, int nDamageType=DAMAGE_TYPE_NEGATIVE)
{
    effect e = EffectBeam(nBeam, OBJECT_SELF, BODY_NODE_HAND);
    effect eDam;
    object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF), TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
    int nDamage;

    while (GetIsObjectValid(oTarget))
    {
       if (!GetPlotFlag(oTarget)&&(!GetIsFriend(oTarget)))
       {

            nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, nDC, SAVING_THROW_TYPE_EVIL);
            eDam = EffectDamage(nDamage, nDamageType);
            if(nDamage > 0 )
            {
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
                ApplyEffectToObject(DURATION_TYPE_TEMPORARY, e, oTarget, 1.0);
            }
        }

        oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF), TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
    }
}


void SpawnCreature(object oVictim, string sMob="")
{
      if (sMob=="")
      {
       sMob=GetResRef(OBJECT_SELF);
      }

      if (GetIsDead(oVictim)&&(GetLocalInt(OBJECT_SELF,"spawned")!=2))
      {
      location lLoc=GetLocation(oVictim);
      effect eVis = EffectVisualEffect(VFX_IMP_RAISE_DEAD);
      ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, lLoc);
      object oSpawn=CreateObject(OBJECT_TYPE_CREATURE,sMob,lLoc,TRUE);
      // This makes it an encounter creature
      SetLocalInt(oSpawn,"norw",2);
      SetLocalInt(OBJECT_SELF,"spawned",2);
      }
}

void SetCrafting(object oPC, int nValue)
{
 object oBox=GetItemPossessedBy(oPC,"jw_crafting_gem");
 SetLocalInt(oBox,"isenchanting",nValue);
}

int GetCrafting(object oPC)
{
 object oBox=GetItemPossessedBy(oPC,"jw_crafting_gem");
 int nReturn=GetLocalInt(oBox,"isenchanting");
 return nReturn;
}

void SetToken2010(object oPC)
{
string sString;
int nDoing=GetCrafting(oPC);
switch (nDoing)
{
case TECHNIQUE_GAUNTLETS: sString="monk's gauntlets";
break;
case TECHNIQUE_CLOTHING:  sString="boots, belt or cloak";
break;
case TECHNIQUE_RINGAMULET: sString="ring or amulet";
break;
case TECHNIQUE_WEAPON: sString="weapon";
break;
case TECHNIQUE_ARMOUR: sString="armour";
break;
case TECHNIQUE_FOOD: sString="food";
break;
}
SetCustomToken(2010,sString);
}

void SetToken2016(object oPC)
{
string sString;
int nDoing=GetCrafting(oPC);
switch (nDoing)
{
case TECHNIQUE_GAUNTLETS: sString="gauntlet enchanting rune";
break;
case TECHNIQUE_CLOTHING:  sString="boots, belt or cloak enchanting rune";
break;
case TECHNIQUE_RINGAMULET: sString="ring or amulet enchanting rune";
break;
case TECHNIQUE_WEAPON: sString="weapon enchanting rune";
break;
case TECHNIQUE_ARMOUR: sString="armour enchanting rune";
break;
case TECHNIQUE_FOOD: sString="oven or campfire";
break;
}
SetCustomToken(2016,sString);
}

void BonusLevels(int nBonusLevels, int nChance = 50, object oMob=OBJECT_SELF)
{
if (Random(100)+1>nChance)
{
return;
}

int nLevels=Random(nBonusLevels)+1;
int nIdx;
for (nIdx=1;nIdx<=nLevels;nIdx++)
 {
  LevelUpHenchman(oMob,GetClassByPosition(1,oMob),TRUE);
  SendMessageToAllDMs("debug - levelling");
 }
}

void WeaponPowerUp(int nLevel, object oMob=OBJECT_SELF)
{
object oWeapon=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oMob);
if (!GetIsObjectValid(oWeapon))
{
return;
}
int nRandom=Random(20)+1;
int nEffect;

// Level 4 power ups
if (nLevel==4)
{
switch (nRandom)
{
case 1: nEffect=121;
break;
case 2: nEffect=122;
break;
case 3: nEffect=124;
break;
case 4: nEffect=63;
break;
case 5: nEffect=111;
break;
case 6: nEffect=119;
break;
case 7: nEffect=123;
break;
case 8: nEffect=125;
break;
case 9: nEffect=126;
break;
case 10: nEffect=127;
break;
case 11: nEffect=31;
break;
case 12: nEffect=59;
break;
case 13: nEffect=61;
break;
case 14: nEffect=62;
break;
case 15: nEffect=79;
break;
case 16: nEffect=87;
break;
case 17: nEffect=91;
break;
case 18: nEffect=93;
break;
case 19: nEffect=94;
break;
case 20: nEffect=103;
break;
}
}
else
// Level 3 power ups
if (nLevel==3)
{
switch (nRandom)
{
case 1: nEffect=108;
break;
case 2: nEffect=113;
break;
case 3: nEffect=114;
break;
case 4: nEffect=115;
break;
case 5: nEffect=116;
break;
case 6: nEffect=31;
break;
case 7: nEffect=59;
break;
case 8: nEffect=61;
break;
case 9: nEffect=62;
break;
case 10: nEffect=79;
break;
case 11: nEffect=87;
break;
case 12: nEffect=91;
break;
case 13: nEffect=93;
break;
case 14: nEffect=94;
break;
case 15: nEffect=103;
break;
case 16: nEffect=107;
break;
case 17: nEffect=109;
break;
case 18: nEffect=110;
break;
case 19: nEffect=117;
break;
case 20: nEffect=118;
break;
}
}
else
// Level 2 power ups
if (nLevel==2)
{
switch (nRandom)
{
case 1: nEffect=100;
break;
case 2: nEffect=15;
break;
case 3: nEffect=23;
break;
case 4: nEffect=27;
break;
case 5: nEffect=29;
break;
case 6: nEffect=39;
break;
case 7: nEffect=43;
break;
case 8: nEffect=51;
break;
case 9: nEffect=53;
break;
case 10: nEffect=54;
break;
case 11: nEffect=57;
break;
case 12: nEffect=58;
break;
case 13: nEffect=89;
break;
case 14: nEffect=90;
break;
case 15: nEffect=92;
break;
case 16: nEffect=99;
break;
case 17: nEffect=101;
break;
case 18: nEffect=102;
break;
case 19: nEffect=105;
break;
case 20: nEffect=106;
break;
}
}
else
// Level 1 power ups
if (nLevel==1)
{
switch (nRandom)
{
case 1: nEffect=7;
break;
case 2: nEffect=11;
break;
case 3: nEffect=13;
break;
case 4: nEffect=14;
break;
case 5: nEffect=21;
break;
case 6: nEffect=22;
break;
case 7: nEffect=28;
break;
case 8: nEffect=35;
break;
case 9: nEffect=37;
break;
case 10: nEffect=38;
break;
case 11: nEffect=41;
break;
case 12: nEffect=73;
break;
case 13: nEffect=74;
break;
case 14: nEffect=76;
break;
case 15: nEffect=81;
break;
case 16: nEffect=82;
break;
case 17: nEffect=84;
break;
case 18: nEffect=88;
break;
case 19: nEffect=97;
break;
case 20: nEffect=98;
break;
}
}

itemproperty iProp=iWeaponProperty  (nEffect);
IPSafeAddItemProperty(oWeapon,iProp,3600.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
}

void RepeatingVisual(int nEffect, object oMob=OBJECT_SELF)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(nEffect),oMob);
DelayCommand(0.5,RepeatingVisual(nEffect));
}


void SpawnNewMob(string sMobResRef, int nVFX=VFX_FNF_PWSTUN, int nCopyEffects=FALSE, int nKnockdown=FALSE)
{
 location llocation = GetLocation(OBJECT_SELF);
       if (nVFX!=0)
       {
       ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(nVFX), llocation);
       }
object oNew=CreateObject(OBJECT_TYPE_CREATURE, sMobResRef, llocation, FALSE);
SetLocalInt(oNew,"norw",2);

if (nKnockdown==TRUE)
{
effect eKnockdwn = ExtraordinaryEffect(EffectKnockdown());
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnockdwn, oNew, 1.0);
}

if (nCopyEffects==TRUE)
{
effect eEffect=GetFirstEffect(OBJECT_SELF);
while (GetIsEffectValid(eEffect))
 {
  ApplyEffectToObject(GetEffectDurationType(eEffect),eEffect,oNew,60.0);
  eEffect=GetNextEffect(OBJECT_SELF);
 }
}

}

void UnequipPlayer(object oPlayer, int nHandsOnly = TRUE)
{
    AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_LEFTHAND)));
    AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND)));
    if (nHandsOnly == FALSE)
    {
        AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_ARMS, oPlayer)));
        AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_ARROWS, oPlayer)));
        AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_BELT, oPlayer)));
        AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_BOLTS, oPlayer)));
        AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_BOOTS, oPlayer)));
        AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_BULLETS, oPlayer)));
        AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_CHEST, oPlayer)));
        AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_CLOAK, oPlayer)));
        AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_HEAD, oPlayer)));
        AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_LEFTRING, oPlayer)));
        AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_NECK, oPlayer)));
        AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oPlayer)));
    }
}

void SetDeathState(object oRespawner, int nState)
{
object oModule=GetItemPossessedBy(oRespawner,"jw_crafting_gem");
SetLocalInt(oModule,"deathstate",nState);

}

int GetDeathState(object oRespawner)
{
object oModule=GetItemPossessedBy(oRespawner,"jw_crafting_gem");
int nState=GetLocalInt(oModule,"deathstate");
return nState;
}

void SetModuleDeathState(int nState)
{
SetLocalInt(GetModule(),"moduledeathstate",nState);

}

int GetModuleDeathState()
{
int nState=GetLocalInt(GetModule(),"moduledeathstate");
return nState;
}

int GetNumberEnchantments(object oItem)
{
int nReturn=0;
itemproperty iProp=GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(iProp))
{
nReturn=nReturn+1;
iProp=GetNextItemProperty(oItem);
}

return nReturn;
}

int GetMaxEnchantments(object oItem)
{
int nReturn=0;
string sTag=GetTag(oItem);

// Meat
if (GetStringLeft(sTag,7)=="jw_meat")
{
return 1;
}

//anything but meat must start ccr or ctr to be allowed
if (GetStringLeft(sTag,3)!="ccr"&&GetStringLeft(sTag,3)!="ctr")
{
return 0;
}

// Mithral                                || weirwood                   || dire bear hide               || worg hide
if (FindSubString(sTag,"ad")!=-1||FindSubString(sTag,"bv")!=-1||FindSubString(sTag,"bj")!=-1||FindSubString(sTag,"bb")!=-1)
{
nReturn=3;
}
else
// Adamantine                         || cherry                       || bullet oxe hide           || winter wolf hide            || diamond
if (FindSubString(sTag,"ac")!=-1||FindSubString(sTag,"bu")!=-1||FindSubString(sTag,"bi")!=-1||FindSubString(sTag,"ba")!=-1||FindSubString(sTag,"by")!=-1)
{
nReturn=2;
}
else
// Lead                            || cedar                        || antelope hide              || dire wolf hide           || ruby
if (FindSubString(sTag,"ab")!=-1||FindSubString(sTag,"bt")!=-1||FindSubString(sTag,"bh")!=-1||FindSubString(sTag,"a0")!=-1||FindSubString(sTag,"bx")!=-1)
{
nReturn=1;
}

return nReturn;
}

object GetCraftingBox(object oPC)
{
object oBox=GetItemPossessedBy(oPC,"jw_crafting_gem");
return oBox;
}

void DecayItems()
{
object oItem;
object oStrip;
int nDecay;
int nIdx;
object oPC=GetFirstPC();
while (GetIsObjectValid(oPC))
 {
   if (!GetIsDM(oPC))
  {
    for (nIdx=0;nIdx<=18;nIdx++)
   {
    oItem=GetItemInSlot(nIdx,oPC);
    if (GetIsDecayable(oItem))
    {
    nDecay=GetLocalInt(oItem,"decay");
    if (nDecay<100)
     {
      nDecay=nDecay+1;
      SetLocalInt(oItem,"decay",nDecay);
     }
    else
     {
      SendMessageToPC(oPC,"Your "+GetName(oItem)+" is worn out");
      DestroyObject(oItem);
     }
     }
   }

   oItem=GetFirstItemInInventory(oPC);

   while (GetIsObjectValid(oItem))

   {
    oStrip=oItem;
    if (GetIsDecayable(oStrip))
    {
    nDecay=GetLocalInt(oStrip,"decay");
    if (nDecay<100)
     {
      nDecay=nDecay+1;
      SetLocalInt(oStrip,"decay",nDecay);
     }
    else
     {
      SendMessageToPC(oPC,"Your "+GetName(oStrip)+" is worn out");
      DestroyObject(oStrip);
     }
    }
    oItem=GetNextItemInInventory(oPC);
   }
  }
  oPC=GetNextPC();
 }

}

int GetIsDecayable(object oItem)
{
itemproperty iProperty=GetFirstItemProperty(oItem);
if (!GetIsItemPropertyValid(iProperty))
{
return FALSE;
}

if (GetPlotFlag(oItem)==TRUE)
{
return FALSE;
}

int nBase=GetBaseItemType(oItem);

if (nBase==BASE_ITEM_AMULET||nBase==BASE_ITEM_ARMOR||nBase==BASE_ITEM_BELT||nBase==BASE_ITEM_BOOTS||
nBase==BASE_ITEM_BRACER||nBase==BASE_ITEM_CLOAK||nBase==BASE_ITEM_GLOVES||nBase==BASE_ITEM_RING)
{
return TRUE;
}

if (IPGetIsMeleeWeapon(oItem))
{
return TRUE;
}

if (IPGetIsRangedWeapon(oItem))
{
return TRUE;
}

return FALSE;
}