Files
HeroesStone_PRC8/_module/nss/jw_include_funct.nss
Jaysyn904 1eefc84201 Initial Commit
Initial Commit.
2025-09-14 15:40:46 -04:00

2750 lines
139 KiB
Plaintext

#include "jw_smith_copy"
#include "jw_area_funct"
#include "jw_crafting_list"
#include "jw_tiles_inc"
#include "jw_custom_spells"
#include "jw_trap_funct"
#include "jw_persist_store"
#include "jw_golem_inc"
#include "jw_exp_giver"
#include "jw_treasure_gene"
#include "jw_torch_code"
#include "jw_bard_text"
#include "jw_economics"
#include "jw_travel"
#include "jw_death"
#include "jw_newbies"
#include "prc_inc_spells"
// Gets the correct enchantment cost based on the level of the enchantment
int GetEnchantmentCost(int nLevel);
// Removes all enchantments from oItem
void RemoveAllEnchantments(object oItem);
////// Gets the decay level of the object, from 0 to DECAY_TOTAL. 0 is the best.
int GetDecay(object oObject);
// Goes through a PC's inventory and decays their items.
void DecayItemsForOnePC(object oPC, int nDecay = 1);
// Returns true if this item is meant to decay, otherwise returns false
int GetIsDecayable(object oItem);
// Goes through every PC and decays their items by 1. Not currently used
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);
// 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 SetDescription(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
// Also sets custom token 2017 to be the GP cost
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 ENCHANTMENT_COST=1000;
const int DECAY_TOTAL=225;
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 (8); 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_POSITIVE,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 (4); 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_DIVINE,IP_CONST_DAMAGEBONUS_1d6); break;
case 69: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_ORC,IP_CONST_DAMAGETYPE_SLASHING,IP_CONST_DAMAGEBONUS_1d6); break;
case 70: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_GOBLINOID,IP_CONST_DAMAGETYPE_SLASHING,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_SLOW,IP_CONST_ONHIT_SAVEDC_14, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); 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_POSITIVE,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_DIVINE,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_SLASHING,IP_CONST_DAMAGEBONUS_2d6); break;
case 86: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_GOBLINOID,IP_CONST_DAMAGETYPE_SLASHING,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_SILENCE,IP_CONST_ONHIT_SAVEDC_20,IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); 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 =ItemPropertyUnlimitedAmmo (IP_CONST_UNLIMITEDAMMO_1D6FIRE); 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 (2); 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 =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_HUMAN,IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d6); break;
case 109: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_LEVELDRAIN,IP_CONST_ONHIT_SAVEDC_22); break;
case 110: iProperty =ItemPropertyUnlimitedAmmo (IP_CONST_UNLIMITEDAMMO_1D6COLD); 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 (3); 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 (4); 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_DRAGON,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 (5); break;
case 94: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_BLUDGEONING,4); break;
case 95: iProperty =ItemPropertyACBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,5); 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 (6); break;
case 112: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,5); break;
case 113: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_UNDEAD,4); break;
case 114: iProperty =ItemPropertyRegeneration (2); 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 (2); 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(IP_CONST_SPELLSCHOOL_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_4); 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_RESTORATION_7,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_V_9,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 (SKILL_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_APPRAISE,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_MOVE_SILENTLY,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_RESTORATION_7,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 (SKILL_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_MOVE_SILENTLY,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_ENDURANCE_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
case 27: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CLAIRAUDIENCE_CLAIRVOYANCE_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)
{
int nLevel=0;
// 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;
nLevel=nLevel+1;
if (nPattern>0)
SetCustomToken(2007," vervain,");
else
SetCustomToken(2007," and vervain.");
}
else
SetCustomToken(2007,"");
if (nPattern>=REAGENT_SUKAKE)
{
nLevel=nLevel+1;
nPattern=nPattern-REAGENT_SUKAKE;
if (nPattern>0)
{
SetCustomToken(2006," sukake,");
}
else
{
SetCustomToken(2006," and sukake.");
}
}
else
{
SetCustomToken(2006,"");
}
if (nPattern>=REAGENT_ROSEMAGES)
{
nLevel=nLevel+1;
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)
{
nLevel=nLevel+1;
nPattern=nPattern-REAGENT_HYSSOP;
if (nPattern>0)
{
SetCustomToken(2004," hyssop,");
}
else
{
SetCustomToken(2004," and hyssop.");
}
}
else
{
SetCustomToken(2004,"");
}
if (nPattern>=REAGENT_FOOLSWEED)
{
nLevel=nLevel+1;
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)
{
nLevel=nLevel+1;
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)
{
nLevel=nLevel+1;
nPattern=nPattern-REAGENT_CLOTHGOLD;
if (nPattern>0)
{
SetCustomToken(2001," cloth of gold,");
}
else
{
SetCustomToken(2001," and cloth of gold.");
}
}
else
{
SetCustomToken(2001,"");
}
SetCustomToken(2017,IntToString(GetEnchantmentCost(nLevel)));
}
int GetEnchantmentCost(int nLevel)
{
nLevel=nLevel-2;
if (nLevel>1)
{
nLevel=nLevel*3;
}
return nLevel*ENCHANTMENT_COST;
}
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 SetDescription(int nDoing, int nCurrent)
{
string sString="This description still needs doing";
if (nDoing==TECHNIQUE_WEAPON)
{
// Weapons
switch (nCurrent)
{
case 7: sString = "Enhancement +1, melee weapon only"; break;
case 11: sString = "Acid Damage 1d4, melee weapon only"; break;
case 13: sString = "Bludgeoning Damage 1d4, melee weapon only"; break;
case 14: sString = "Cold Damage 1d4, melee weapon only"; break;
case 15: sString = "Enhancement +2, melee weapon only"; break;
case 19: sString = "Weapon Gives Fortitude Save +1"; break;
case 21: sString = "Electrical Damage 1d4, melee weapon only"; break;
case 22: sString = "Fire Damage 1d4, melee weapon only"; break;
case 23: sString = "Acid Damage 2d4, melee weapon only"; break;
case 25: sString = "Weapon Gives Reflex Save +1"; break;
case 26: sString = "Weapon Gives Will Save +1"; break;
case 27: sString = "Bludgeoning Damage 2d4, melee weapon only"; break;
case 28: sString = "Piercing Damage 1d4, melee weapon only"; break;
case 29: sString = "Cold Damage 2d4, melee weapon only"; break;
case 30: sString = "Weapon Gives Fortitude Bonus +2"; break;
case 31: sString = "Enhancement +3, melee weapon only"; break;
case 35: sString = "Vampiric Regeneration +1, melee weapon only"; break;
case 37: sString = "Slashing Damage 1d4, melee weapon only"; break;
case 38: sString = "Sonic Damage 1d4, melee weapon only"; break;
case 39: sString = "Electrical Damage 2d4, melee weapon only"; break;
case 41: sString = "Massive Critical 1d10"; break;
case 42: sString = "1d6 Piercing Damage vs Evil, melee weapon only"; break;
case 43: sString = "Fire Damage 2d4, melee weapon only"; break;
case 44: sString = "1d6 Bludgeoning Damage vs Evil, melee weapon only"; break;
case 45: sString = "Weapon Gives Reflex Bonus +2"; break;
case 46: sString = "Weapon Gives Will Bonus +2"; break;
case 47: sString = "Mighty Weapon + 8 ranged weapon only"; break;
case 49: sString = "1d6 Slashing Damage vs Evil, melee weapon only"; break;
case 50: sString = "Weapon Gives +4 to Discipline"; break;
case 51: sString = "Piercing Damage 2d4, melee weapon only"; break;
case 52: sString = "Weapon Gives +4 to Tumble"; break;
case 53: sString = "Vampiric Regeneration +3, melee weapon only"; break;
case 54: sString = "Slashing Damage 2d4, melee weapon only"; break;
case 55: sString = "Ranged Weapon Gains Unlimited +4 Ammo ranged weapon only"; break;
case 56: sString = "1d6 Positive Energy vs Undead, melee weapon only"; break;
case 57: sString = "Sonic Damage 2d4, melee weapon only"; break;
case 58: sString = "Massive Criticals 2d8"; break;
case 59: sString = "Vampiric Regeneration +6, melee weapon only"; break;
case 60: sString = "Mighty Weapon +4 ranged weapon only"; break;
case 61: sString = "Massive Critical 2d10"; break;
case 62: sString = "Acid Damage 2d6, melee weapon only"; break;
case 63: sString = "Enhancement +4, melee weapon only"; break;
case 67: sString = "1d6 Divine Damage vs Outsiders, melee weapon only"; break;
case 69: sString = "1d6 Slashing Damage vs Orcs, melee weapon only"; break;
case 70: sString = "1d6 Slashing Damage vs Goblinoids, melee weapon only"; break;
case 71: sString = "Ranged Weapon Gains Unlimited +3 Ammo"; break;
case 73: sString = "Chance to silence enemy, DC 16, melee weapon only"; break;
case 74: sString = "Chance to slow an enemy, DC 14, melee weapon only"; break;
case 75: sString = "Weapon Gives +7 Bonus to Discipline"; break;
case 76: sString = "Chance to Blind Enemy, DC 16, melee weapon only"; break;
case 77: sString = "Weapon Gives +7 to Tumble"; break;
case 78: sString = "2d6 Positive Energy Damage vs Undead, melee weapon only"; break;
case 79: sString = "Cold Damage 2d6, melee weapon only"; break;
case 81: sString = "Chance to Cause Fear on Enemy, DC 16, melee weapon only"; break;
case 82: sString = "Chance to Hold Enemy, DC 16, melee weapon only"; break;
case 83: sString = "2d6 Divine Damage vs Outsiders, melee weapon only"; break;
case 84: sString = "Chance to Cause Doom Effect on Enemy, DC 16, melee weapon only"; break;
case 85: sString = "2d6 Slashing Damage vs Orcs, melee weapon only"; break;
case 86: sString = "2d6 Slashing Damage vs Goblinoids, melee weapon only"; break;
case 87: sString = "Electrical Damage 2d6, melee weapon only"; break;
case 88: sString = "Drain Strength DC 16, melee weapon only"; break;
case 89: sString = "Chance to silence an enemy, DC 20, melee weapon only"; break;
case 90: sString = "Chance to Hold Enemy, DC 20, melee weapon only"; break;
case 91: sString = "Fire Damage 2d6, melee weapon only"; break;
case 92: sString = "On Hit Drain Level DC 18, melee weapon only"; break;
case 93: sString = "Ranged weapon gains unlimited ammo 1d6 fire damage, ranged weapon only."; break;
case 94: sString = "Drain Strength DC 24, melee weapon only"; break;
case 95: sString = "Ranged Weapon Gains Unlimited Ammo +5"; break;
case 97: sString = "Drain Dexterity DC 16, melee weapon only"; break;
case 98: sString = "Drain Constitution DC 16, melee weapon only"; break;
case 99: sString = "Drain Strength DC 20, melee weapon only"; break;
case 100: sString = "Wounding DC 16, melee weapon only"; break;
case 101: sString = "Drain Dexterity DC 20, melee weapon only"; break;
case 102: sString = "Drain Constitution DC 20, melee weapon only"; break;
case 103: sString = "Drain Constiution DC 24, melee weapon only"; break;
case 104: sString = "Mighty +2 ranged weapon only"; break;
case 105: sString = "Chance to Slow Enemy DC 20, melee weapon only"; break;
case 106: sString = "Chance to Make Enemy Sleep DC 20, melee weapon only"; break;
case 107: sString = "Drain Dexterity DC 24, melee weapon only"; break;
case 108: sString = "2d6 bonus sonic damage vs humans only"; break;
case 109: sString = "Drain Level DC 22, melee weapon only"; break;
case 110: sString = "Ranged weapon gains unlimited ammo 1d6 cold damage, ranged weapon only."; break;
case 111: sString = "Chance to Slow Enemy DC 26, melee weapon only"; break;
case 112: sString = "Ranged Weapon Gains Unlimited Ammo +2"; break;
case 113: sString = "Drain Charisma DC 20, melee weapon only"; break; break;
case 114: sString = "Drain Intelligence DC 20, melee weapon only"; break; break;
case 115: sString = "Drain Wisdom DC 20, melee weapon only"; break;
case 116: sString = "Chance to Freeze Enemy, melee weapon only"; break;
case 117: sString = "Knockdown DC18, melee weapon only"; break;
case 118: sString = "Chance to Slow Enemy DC 24, melee weapon only"; break;
case 119: sString = "Vampiric Regeneration +10, melee weapon only"; break;
case 120: sString = "Weapon Gives Bonus Feat Cleave"; break;
case 121: sString = "Chance to Hold Enemy DC 24, melee weapon only"; break;
case 122: sString = "Attack Bonus +5"; break;
case 123: sString = "Drain Strength DC 26, melee weapon only"; break;
case 124: sString = "Chance to Stun Enemy DC 24, melee weapon only"; break;
case 125: sString = "Drain Constitution DC 26, melee weapon only"; break;
case 126: sString = "Drain Dexterity DC 26, melee weapon only"; break;
case 127: sString = "Enhancement +5, melee weapon only"; break;
}
// End weapons
}
else
if (nDoing==TECHNIQUE_ARMOUR)
{
// armour
switch (nCurrent)
{
case 7: sString = "AC +1"; break;
case 11: sString = "AC vs Evil +2"; break;
case 13: sString = "Damage Resist 5 vs Acid"; break;
case 14: sString = "Damage Resist 5 vs Cold"; break;
case 15: sString = "AC +2"; break;
case 19: sString = "Damage Resist 5 vs Electrical"; break;
case 21: sString = "Damage Resist 5 vs Fire"; break;
case 22: sString = "Damage Resist 5 vs Magical"; break;
case 23: sString = "AC vs Evil +3"; break;
case 25: sString = "Damage Resist 5 vs Negative"; break;
case 26: sString = "Damage Resist 5 vs Sonic"; break;
case 27: sString = "Damage Resist 10 vs Acid"; break;
case 28: sString = "Immunity to Spells Level 2 or Below"; break;
case 29: sString = "Damage Resist 10 vs Cold"; break;
case 30: sString = "Damage Resist 10 vs Electrical"; break;
case 31: sString = "AC +3"; break;
case 35: sString = "AC vs Bludgeoning +2"; break;
case 37: sString = "AC vs Piercing +2"; break;
case 38: sString = "AC vs Slashing +2"; break;
case 39: sString = "Damage Resist 10 vs Fire"; break;
case 41: sString = "Spell Resistance 10"; break;
case 42: sString = "Spell Failure Reduced By 10 per cent"; break;
case 43: sString = "Damage Resist 10 vs Magical"; break;
case 44: sString = "AC vs Abberations +3"; break;
case 45: sString = "Damage Resist 10 vs Negative"; break;
case 46: sString = "Damage Resist 10 vs Sonic"; break;
case 47: sString = "AC vs Evil +3"; break;
case 49: sString = "AC vs Animals +3"; break;
case 50: sString = "AC vs Beasts +3"; break;
case 51: sString = "Immunity to Spells Level 3 or Below"; break;
case 52: sString = "AC vs Constructs +3"; break;
case 53: sString = "AC vs Bludgeoning +3"; break;
case 54: sString = "AC vs Piercing +3"; break;
case 55: sString = "Damage Resist 15 vs Acid"; break;
case 56: sString = "AC vs Dragons +3"; break;
case 57: sString = "AC vs Slashing +3"; break;
case 58: sString = "Spell Resistance 16"; break;
case 59: sString = "Damage Resist 15 vs Cold"; break;
case 60: sString = "Bonus Feat - Combat Casting"; break;
case 61: sString = "Damage Resist 15 vs Electrical"; break;
case 62: sString = "Damage Resist 15 vs Fire"; break;
case 63: sString = "AC +4"; break;
case 67: sString = "AC vs Elementals +3"; break;
case 69: sString = "AC vs Goblinoids +3"; break;
case 70: sString = "AC vs Monstrous Creatures +3"; break;
case 71: sString = "Bonus Feat - Knockdown"; break;
case 73: sString = "AC vs Orcs +3"; break;
case 74: sString = "AC vs Reptilian Humanoids +3"; break;
case 75: sString = "Bonus Feat - Point Blank Shot"; break;
case 76: sString = "AC vs Magical Beasts +3"; break;
case 77: sString = "Bonus Feat - Ambidexterity"; break;
case 78: sString = "Spell Failure Minus 20 Per Cent"; break; break;
case 79: sString = "Damage Resist 15 vs Magical"; break;
case 81: sString = "AC vs Outsiders +3"; break;
case 82: sString = "AC vs Undead +3"; break;
case 83: sString = "AC vs Abberations +4"; break;
case 84: sString = "Save vs Fear +2"; break;
case 85: sString = "AC vs Animals +4"; break;
case 86: sString = "AC vs Beasts +4"; break;
case 87: sString = "Damage Resist 15 vs Negative"; break;
case 88: sString = "Save vs Mind Affecting +2"; break;
case 89: sString = "AC vs Constructs +4"; break;
case 90: sString = "AC vs Dragons +4"; break;
case 91: sString = "Damage Resist 15 vs Sonic"; break;
case 92: sString = "AC vs Elementals +4"; break;
case 93: sString = "Immunity to Spells of Level 4 or Below"; break;
case 94: sString = "AC vs Bludgeoning +4"; break;
case 95: sString = "AC vs Evil +5"; break;
case 97: sString = "Save vs Disease +2"; break;
case 98: sString = "Save vs Negative +2"; break;
case 99: sString = "AC vs Goblinoids +4"; break;
case 100: sString = "Save vs Death Effects +2"; break;
case 101: sString = "AC vs Monstrous Creatures +4"; break;
case 102: sString = "AC vs Orcs +4"; break;
case 103: sString = "AC vs Piercing +4"; break;
case 104: sString = "Regeneration +1"; break;
case 105: sString = "AC vs Reptilian Humanoids +4"; break;
case 106: sString = "AC vs Magical Beasts +4"; break;
case 107: sString = "AC vs Slashing +4"; break;
case 108: sString = "AC vs Outsiders +4"; break;
case 109: sString = "Spell Resistance 22"; break;
case 110: sString = "Spell Failure Minus 30 Per Cent"; break;
case 111: sString = "Immunity to Spells Level 5 or Below"; break;
case 112: sString = "+5 Bonus to Concentration"; break;
case 113: sString = "AC vs Undead +4"; break;
case 114: sString = "Regeneration +2"; break;
case 115: sString = "+10 Bonus to Concentration"; break;
case 116: sString = "Save vs Death Effects +4"; break;
case 117: sString = "Immunity to Fear"; break;
case 118: sString = "Immunity to Mind Spells"; break;
case 119: sString = "Immunity to Paralysis"; break;
case 120: sString = "+2 to All Saving Throws"; break;
case 121: sString = "50 Per Cent Immunity to Fire Damage"; break;
case 122: sString = "50 Per Cent Immunity to Bludgeoning Damage"; break;
case 123: sString = "Immunity to Critical Hits"; break;
case 124: sString = "50 Per Cent Immunity to Slashing Damage"; break;
case 125: sString = "Immunity to Knockdown"; break;
case 126: sString = "Immunity to Death Magic"; break;
case 127: sString = "AC +5"; break;
}
}
else
if (nDoing==TECHNIQUE_RINGAMULET)
{
// Rings and amulets
switch (nCurrent)
{
case 7: sString = "Darkvision"; break;
case 11: sString = "Charisma +1"; break;
case 13: sString = "Intelligence +1"; break;
case 14: sString = "Wisdom +1"; break;
case 15: sString = "Charisma +2"; break;
case 19: sString = "Fortitude Save +1"; break;
case 21: sString = "Reflex Save +1"; break;
case 22: sString = "Will Save +1"; break;
case 23: sString = "Intelligence +1"; break;
case 25: sString = "Bonus Bard Spell Level 1"; break;
case 26: sString = "Bonus Cleric Spell Level 2"; break;
case 27: sString = "Bonus Wisdom Spell Level 2"; break;
case 28: sString = "Bonus Druid Spell Level 2"; break;
case 29: sString = "Fortitude Save +2"; break;
case 30: sString = "Reflex Save +2"; break;
case 31: sString = "Regeneration +2"; break;
case 35: sString = "Bonus Sorcerer Spell Level 2"; break;
case 37: sString = "Bonus Wizard Spell Level 2"; break;
case 38: sString = "Blue Light"; break;
case 39: sString = "Will Save +2"; break;
case 41: sString = "Purple Light"; break;
case 42: sString = "Red Light"; break;
case 43: sString = "Bonus Bard Spell Level 4"; break;
case 44: sString = "Casts Aid Once Per Day"; break;
case 45: sString = "Bonus Cleric Spell Level 4"; break;
case 46: sString = "Bonus Druid Spell Level 4"; break;
case 47: sString = "Immunity to Evocation Spells"; break;
case 49: sString = "Casts Bless Once Per Day"; break;
case 50: sString = "Casts Ghostly Visage Once Per Day"; break;
case 51: sString = "Bonus Sorcerer Spell Level 4"; break;
case 52: sString = "Casts Eagle's Splendour Once Per Day"; break;
case 53: sString = "Bonus Wizard Spell Level 4"; break;
case 54: sString = "Bonus Ranger Spell Level 2"; break;
case 55: sString = "Will Save +3"; break;
case 56: sString = "Casts Endurance Once Per Day"; break;
case 57: sString = "Bonus Paladin Spell Level 2"; break;
case 58: sString = "Yellow Light"; break;
case 59: sString = "Reflex Save +3"; break;
case 60: sString = "Green Light"; break;
case 61: sString = "Fortitude Save +3"; break;
case 62: sString = "Wisdom +3"; break;
case 63: sString = "Casts Heal Twice Per Day"; break;
case 67: sString = "Casts Cure Light Wounds Once Per Day"; break;
case 69: sString = "Casts Bulls Strength Once Per Day"; break;
case 70: sString = "Casts Owls Wisdom Once Per Day"; break;
case 71: sString = "White Light"; break;
case 73: sString = "Casts Fox's Cunning Once Per Day"; break;
case 74: sString = "Casts Summon Creature III Once Per Day"; break;
case 75: sString = "Bonus Feat - Extra Turning"; break;
case 76: sString = "Casts Spell Entropic Shield Once Per Day"; break;
case 77: sString = "Casts Spell Ethereal Visage Once Per Day"; break;
case 78: sString = "Casts Spell Greater Eagle's Splendour Once Per Day"; break;
case 79: sString = "Intelligence +3"; break;
case 81: sString = "Casts Spell Clarity Once Per Day"; break;
case 82: sString = "Casts Spell Mage Armour Once Per Day"; break;
case 83: sString = "Casts Spell Barkskin Once Per Day"; break;
case 84: sString = "Casts Spell Virtue Once Per Day"; break;
case 85: sString = "Casts Spell Greater Endurance Once Per Day"; break;
case 86: sString = "Casts Spell Cure Serious Wounds Once Per Day"; break;
case 87: sString = "Charisma + 3"; break;
case 88: sString = "Casts Spell Find Traps Once Per Day"; break;
case 89: sString = "Casts Spell Elemental Shield Once Per Day"; break;
case 90: sString = "Casts Spell Ethereal Visage Once Per Day"; break;
case 91: sString = "Casts Spell Greater Bulls Strength Once Per Day"; break;
case 92: sString = "Casts Spell Greater Owls Wisdom Once Per Day"; break;
case 93: sString = "Casts Spell Improved Invisibility Once Per Day"; break;
case 94: sString = "Casts Spell Greater Restoration Once Per Day"; break;
case 95: sString = "Bonus Wizard Spell Level 8"; break;
case 97: sString = "Casts Spell Restoration Once Per Day"; break;
case 98: sString = "Casts Spell Mind Blank Once Per Day"; break;
case 99: sString = "Casts Spell Greater Fox's Cunning Once Per Day"; break;
case 100: sString = "Casts Spell Ultravision Once Per Day"; break;
case 101: sString = "Casts Spell Healing Circle Once Per Day"; break;
case 102: sString = "Casts Spell Resistance Once Per Day"; break;
case 103: sString = "Casts Spell Globe of Invulnerability Once Per Day"; break;
case 104: sString = "Casts Spell Remove Disease Once Per Day"; break;
case 105: sString = "Casts Spell Summon Creature V Once Per Day"; break;
case 106: sString = "Casts Spell Identify Three Times Per Day"; break;
case 107: sString = "Casts Spell Stoneskin Once Per Day"; break;
case 108: sString = "Casts Spell Aura of Glory Once Per Day"; break;
case 109: sString = "Bonus Bard Spell Level 6"; break;
case 110: sString = "Bonus Paladin Spell Level 4"; break;
case 111: sString = "Bonus Sorcerer Spell Level 8"; break;
case 112: sString = "Casts Spell Shield Once Per Day"; break;
case 113: sString = "Damage Immunity Piercing 25 Per Cent"; break;
case 114: sString = "Damage Immunity Acid 25 Per Cent"; break;
case 115: sString = "Damage Immunity Cold 25 Per Cent"; break;
case 116: sString = "Damage Immunity Sonic 25 Per Cent"; break;
case 117: sString = "Bonus Ranger Spell Level 4"; break;
case 118: sString = "Bonus Wizard Spell Level 6"; break;
case 119: sString = "Bonus Druid Spell Level 8"; break;
case 120: sString = "Immunity to Poison"; break;
case 121: sString = "Bonus Sorcerer Spell Level 6"; break;
case 122: sString = "Bonus Druid Spell Level 6"; break;
case 123: sString = "Bonus Cleric Spell Level 8"; break;
case 124: sString = "Bonus Cleric Spell Level 6"; break;
case 125: sString = "Grants Improved Evasion"; break;
case 126: sString = "Grants True Seeing"; break;
case 127: sString = "Grants Haste"; break;
}
}
else
if (nDoing==TECHNIQUE_CLOTHING)
{
// Boots, belts etc
switch (nCurrent)
{
case 7: sString = "Constitution +1"; break;
case 11: sString = "Dexterity +1"; break;
case 13: sString = "Strength +1"; break;
case 14: sString = "Animal Empathy +5"; break;
case 15: sString = "Constitution +2"; break;
case 19: sString = "Appraise +5"; break;
case 21: sString = "Concentration +5"; break;
case 22: sString = "Disable Trap +5"; break;
case 23: sString = "Dexterity +2"; break;
case 25: sString = "Discipline +5"; break;
case 26: sString = "Heal +5"; break;
case 27: sString = "Strength +2"; break;
case 28: sString = "Hide +5"; break;
case 29: sString = "Animal Empathy +10"; break;
case 30: sString = "Appraise +10"; break;
case 31: sString = "Constitution +3"; break;
case 35: sString = "Listen +5"; break;
case 37: sString = "Lore +5"; break;
case 38: sString = "Move Silently +5"; break;
case 39: sString = "Concentration +10"; break;
case 41: sString = "Perform +5"; break;
case 42: sString = "Search +5"; break;
case 43: sString = "Disable Trap +10"; break;
case 44: sString = "Spot +5"; break;
case 45: sString = "Discipline +10"; break;
case 46: sString = "Heal +10"; break;
case 47: sString = "Dexterity +3"; break;
case 49: sString = "Use Magic Device +5"; break;
case 51: sString = "Hide +10"; break;
case 53: sString = "Listen +10"; break;
case 54: sString = "Lore +10"; break;
case 55: sString = "Strength +3"; break;
case 57: sString = "Move Silently +10"; break;
case 58: sString = "Perform +10"; break;
case 59: sString = "Animal Empathy +15"; break;
case 60: sString = "Search +10"; break;
case 61: sString = "Concentration +15"; break;
case 62: sString = "Discipline +15"; break;
case 63: sString = "Constitution +4"; break;
case 71: sString = "Spot +10"; break;
case 75: sString = "Use Magic Device +10"; break;
case 79: sString = "Search +15"; break;
case 87: sString = "Use Magic Device +15"; break;
case 95: sString = "Dexterity +4"; break;
case 111: sString = "Strength +4"; break;
case 127: sString = "Freedom of Movement"; break;
}
}
else
if (nDoing==TECHNIQUE_GAUNTLETS)
{
// Monk gloves
switch (nCurrent)
{
case 7: sString = "Damage Bonus Acid 1d6"; break;
case 11: sString = "Damage Bonus Fire 1d6"; break;
case 13: sString = "Damage Bonus Sonic 1d6"; break;
case 14: sString = "Attack Bonus +3"; break;
case 15: sString = "Damage Bonus Acid 1d8"; break;
case 23: sString = "Damage Bonus Fire 1d8"; break;
case 27: sString = "Damage Bonus Sonic 1d8"; break;
case 29: sString = "Attack Bonus +6"; break;
case 31: sString = "Damage Bonus Acid 2d6"; break;
case 47: sString = "Damage Bonus Fire 2d6"; break;
case 55: sString = "Damage Bonus Sonic 2d6"; break;
case 59: sString = "Attack Bonus +10"; break;
case 63: sString = "Damage Bonus Acid 2d8"; break;
case 95: sString = "Damage Bonus Fire 2d8"; break;
case 111: sString = "Damage Bonus Sonic 2d8"; break;
case 127: sString = "Cast Spell Bombardment Once Per Day"; break;
}
}
else
if (nDoing==TECHNIQUE_FOOD)
{
// Food
switch (nCurrent)
{
case 7: sString = "Cast Spell Aid Single Use"; break;
case 11: sString = "Cast Spell Bless Single Use"; break; break;
case 13: sString = "Cast Spell Bulls Strength Single Use"; break;
case 14: sString = "Cast Spell Cats Grace Single Use"; break;
case 15: sString = "Cast Spell animate Dead Single Use"; break;
case 19: sString = "Cast Spell Clarity Single Use"; break;
case 21: sString = "Cast Spell Cure Light Wounds Single Use"; break;
case 22:sString = "Cast Spell Cure Moderate Wounds Single Use"; break;
case 23: sString = "Cast Spell Barkskin Single Use"; break;
case 25: sString = "Cast Spell Elemental Shield Single Use"; break;
case 26: sString = "Cast Spell Endurance Single Use"; break;
case 27: sString = "Cast Spell Clairaudience and Clairvoyance Single Use"; break;
case 28: sString = "Cast Spell Lesser Mind Blank Single Use"; break;
case 29: sString = "Cast Spell Create Greater Undead Single Use"; break;
case 30: sString = "Cast Spell Cure Serious Wounds Single Use"; break;
case 35: sString = "Cast Spell Lesser Restoration Single Use"; break;
case 37: sString = "Cast Spell Mage Armour Single Use"; break;
case 38: sString = "Cast Spell Mass Heal Single Use"; break;
case 39: sString = "Cast Spell Cure Critical Wounds Single Use"; break;
case 41: sString = "Cast Spell Mind Blank Single Use"; break;
case 42: sString = "Cast Spell Minor Globe of Invulnerability Single Use"; break;
case 43: sString = "Cast Spell Death Ward Single Use"; break;
case 44: sString = "Cast Spell Ghostly Visage Single Use"; break;
case 45: sString = "Cast Spell Freedom of Movement Single Use"; break;
case 46: sString = "Cast Spell Globe of Invulnerability Single Use"; break;
case 49: sString = "Cast Spell Nature's Balance Single Use"; break; break;
case 50: sString = "Cast Spell Negative Energy Protection Single Use"; break;
case 51: sString = "Cast Spell Greater Restoration Single Use"; break;
case 52: sString = "Cast Spell Neutralise Poison Single Use"; break;
case 53: sString = "Cast Spell Greater Spell Mantle Single Use"; break;
case 54: sString = "Cast Spell Greater Stoneskin Single Use"; break;
case 56: sString = "Cast Spell Prayer Single Use"; break;
case 57: sString = "Cast Spell Haste Single Use"; break;
case 58: sString = "Cast Spell Healing Circle Single Use"; break;
case 60: sString = "Cast Spell Improved Invisibility Single Use"; break;
case 67: sString = "Cast Spell Protection from Alignment Single Use"; break;
case 69: sString = "Cast Spell Remove Blindness & Deafness Single Use"; break;
case 70: sString = "Cast Spell Remove Fear Single Use"; break;
case 71: sString = "Cast Spell Inivisibility Sphere Single Use"; break; break;
case 73: sString = "Cast Spell Remove Disease Single Use"; break;
case 74: sString = "Cast Spell Remove Curse Single Use"; break;
case 75: sString = "Cast Spell Mass Haste Single Use"; break;
case 76: sString = "Cast Spell Remove Paralysis Single Use"; break;
case 77: sString = "Cast Spell Ethereal Visage Single Use"; break;
case 78: sString = "Cast Spell Mordenkainen's Sword Single Use"; break;
case 81: sString = "Cast Spell Resistance Single Use"; break;
case 82: sString = "Cast Spell Restoration Single Use"; break;
case 83: sString = "Cast Spell Polymorph Self Single Use"; break;
case 84: sString = "Cast Spell Spell Resistance Single Use"; break;
case 85: sString = "Cast Spell Premonition Single Use"; break;
case 86: sString = "Cast Spell Sanctuary Single Use"; break;
case 88: sString = "Cast Spell Spell Mantle Single Use"; break;
case 89: sString = "Cast Spell Shadow Shield Single Use"; break;
case 90: sString = "Cast Spell Shapechange Single Use"; break;
case 91: sString = "Cast Spell Greater Bulls Strength Single Use"; break;
case 92: sString = "Cast Spell Stoneskin Single Use"; break;
case 93: sString = "Cast Spell Improved Invisibility Single Use"; break;
case 94: sString = "Cast Spell Greater Restoration Single Use"; break;
case 97: sString = "Cast Spell Regenerate Single Use"; break;
case 98: sString = "Cast Spell Lesser Mind Blank Single Use"; break;
case 99: sString = "Cast Spell Tenser's Transformation Single Use"; break;
case 100: sString = "Cast Spell Darkvision Single Use"; break;
case 101: sString = "Cast Spell Heal Single Use"; break;
}
}
SetCustomToken(2013,sString);
}
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==63||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=62;
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=99;
break;
case 14: nEffect=94;
break;
case 15: nEffect=103;
break;
case 16: nEffect=107;
break;
case 17: nEffect=109;
break;
case 18: nEffect=101;
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);
}
}
}
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 || alexandrite
if (FindSubString(sTag,"ad")!=-1||FindSubString(sTag,"bv")!=-1||FindSubString(sTag,"bj")!=-1||FindSubString(sTag,"bb")!=-1||FindSubString(sTag,"a8")!=-1)
{
nReturn=3;
}
else
// Adamantine || cherry || bullet oxe hide || winter wolf hide || diamond || rhodolite
if (FindSubString(sTag,"ac")!=-1||FindSubString(sTag,"bu")!=-1||FindSubString(sTag,"bi")!=-1||FindSubString(sTag,"ba")!=-1||FindSubString(sTag,"by")!=-1||FindSubString(sTag,"a7")!=-1)
{
nReturn=2;
}
else
// Lead || cedar || antelope hide || dire wolf hide || ruby || topaz
if (FindSubString(sTag,"ab")!=-1||FindSubString(sTag,"bt")!=-1||FindSubString(sTag,"bh")!=-1||FindSubString(sTag,"a0")!=-1||FindSubString(sTag,"bx")!=-1||FindSubString(sTag,"a6")!=-1)
{
nReturn=1;
}
return nReturn;
}
object GetCraftingBox(object oPC)
{
object oBox=GetItemPossessedBy(oPC,"jw_crafting_gem");
return oBox;
}
void DecayItems()
{
object oPC=GetFirstPC();
while (GetIsObjectValid(oPC))
{
if (!GetIsDM(oPC))
{
// Do the golem here too
SaveGolem(oPC);
//DecayItemsForOnePC(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;
}
void RemoveAllEnchantments(object oItem)
{
itemproperty iProp=GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(iProp))
{
RemoveItemProperty(oItem,iProp);
iProp=GetNextItemProperty(oItem);
}
//end function
}
void DecayItemsForOnePC(object oPC, int nDecay = 1)
{
object oItem;
object oStrip;
int DecayTotal;
int nIdx;
int nDecayHappened=0;
for (nIdx=0;nIdx<=18;nIdx++)
{
oItem=GetItemInSlot(nIdx,oPC);
if (GetIsDecayable(oItem))
{
nDecayHappened=1;
DecayTotal=GetLocalInt(oItem,"DecayTotal");
DecayTotal=DecayTotal+nDecay;
if (nDecay<DECAY_TOTAL)
{
SetLocalInt(oItem,"DecayTotal",DecayTotal);
}
else
{
SendMessageToPC(oPC,"Your "+GetName(oItem)+" is worn out and has lost its enchantments.");
SetLocalInt(oItem,"DecayTotal",0);
RemoveAllEnchantments(oItem);
}
}
}
oItem=GetFirstItemInInventory(oPC);
while (GetIsObjectValid(oItem))
{
oStrip=oItem;
if (GetIsDecayable(oStrip))
{
nDecayHappened=1;
DecayTotal=GetLocalInt(oStrip,"DecayTotal");
DecayTotal=DecayTotal+nDecay;
if (DecayTotal<DECAY_TOTAL)
{
SetLocalInt(oStrip,"DecayTotal",DecayTotal);
}
else
{
SendMessageToPC(oPC,"Your "+GetName(oItem)+" is worn out and has lost its enchantments.");
SetLocalInt(oItem,"DecayTotal",0);
RemoveAllEnchantments(oItem);
}
}
oItem=GetNextItemInInventory(oPC);
}
if (nDecayHappened==1)
{
DelayCommand(4.0, FloatingTextStringOnCreature("The enchantments on your items decay", oPC, FALSE));
}
//end function
}
int GetDecay(object oObject)
{
if (!GetIsDecayable(oObject))
{
return 0;
}
else
{
return GetLocalInt(oObject,"DecayTotal");
}
}