Finished PRC8 integration. Moved creature abilities to top hak. Setup tooling. Created release archive
2264 lines
106 KiB
Plaintext
2264 lines
106 KiB
Plaintext
#include "jw_smith_copy"
|
|
#include "jw_area_funct"
|
|
// #include "jw_crafting_lists"
|
|
#include "jw_tiles_inc"
|
|
#include "jw_custom_spells"
|
|
#include "jw_trap_funct"
|
|
#include "jw_persist_store"
|
|
#include "prc_inc_spells"
|
|
|
|
// Returns true if this item is meant to decay, otherwise returns false
|
|
int GetIsDecayable(object oItem);
|
|
// Goes through the PCs and decays their items
|
|
void DecayItems();
|
|
// Gets the crafting box of the PC
|
|
object GetCraftingBox(object oPC);
|
|
// Gets the maximum number of enchantments allowed on oItem - this is determined by its tag;
|
|
int GetMaxEnchantments(object oItem);
|
|
// Gets the number of enchantments currently on oItem;
|
|
int GetNumberEnchantments(object oItem);
|
|
// Gets the death state of the player - MODULE_EVERYONE_ALIVE or MODULE_NOTEVERYONE_ALIVE
|
|
int GetModuleDeathState();
|
|
// Sets the death state of the player - MODULE_EVERYONE_ALIVE or MODULE_NOTEVERYONE_ALIVE
|
|
void SetModuleDeathState(int nState);
|
|
// Gets the death state of the player - PLAYER_ALIVE, PLAYER_BLEEDING or PLAYER_STABLE
|
|
int GetDeathState(object oRespawner);
|
|
// Sets the death state of the player - PLAYER_ALIVE, PLAYER_BLEEDING or PLAYER_STABLE
|
|
void SetDeathState(object oRespawner, int nState);
|
|
// Player unequips items
|
|
void UnequipPlayer(object oPlayer, int nHandsOnly = TRUE);
|
|
// Mob spawns a new mob - best used on death of mob
|
|
// Will use special effects if VFX is set. Note that default is to use special
|
|
// effects. Set nVFX to 0 to prevent special effects
|
|
// Mob will get all effects of old mob is nCopyEffects is set to true
|
|
// If nKnockdown is true, the new mob will be knocked down for a second
|
|
void SpawnNewMob(string sMobResRef, int nVFX=VFX_FNF_PWSTUN, int nCopyEffects=FALSE, int nKnockdown=FALSE);
|
|
// Mob has a repeating visual effect
|
|
void RepeatingVisual(int nEffect, object oMob=OBJECT_SELF);
|
|
// Adds a random magical effect to the wepon the mob is holding in its right hand
|
|
// This will not affect any weapons they equip later so it's not much use for mobs that
|
|
// switch weapons, eg melee and ranged
|
|
// Int level goes from 1 to 4. 1 is the the weakest and 4 is the best, so use 4 only for high level mobs
|
|
void WeaponPowerUp(int nLevel, object oMob=OBJECT_SELF);
|
|
// Levels up the mob a random amount up to max nBonusLevels - this is the max number of extra levels it can gain
|
|
// The chance of levelling up is nChance. Set nChance to 100 to ensure it gains bonus levels
|
|
void BonusLevels(int nBonusLevels, int nChance = 50, object oMob=OBJECT_SELF);
|
|
// Sets custom token 2016 to be the type of machine the PC needs to enchant whatever they are enchanting
|
|
void SetToken2016(object oPC);
|
|
// Sets custom token 2010 to be the type of item this PC is enchanting
|
|
void SetToken2010(object oPC);
|
|
// Gets the type of crafting the PC is currently doing
|
|
int GetCrafting(object oPC);
|
|
// Sets the type of enchantment the PC is doing by setting local int isenchanting
|
|
// to the relative value on the crafting box of the PC
|
|
void SetCrafting(object oPC, int nValue);
|
|
// Mob explodes, damaging nearby enemies. Use for on death.
|
|
void DeathExplode(int nDamage = 8, int nInitialVFX = VFX_FNF_FIREBALL, int nDamageVFX = VFX_IMP_FLAME_M, int nDamageType = DAMAGE_TYPE_FIRE, int nSaveType= SAVING_THROW_TYPE_FIRE, int nSaveDC = 15, float fRadius = 10.0);
|
|
// Mob jumps to enemy randomly. Use in on combat round end
|
|
void JumpToEnemy(object oEnemy, int nVis=VFX_FNF_SUMMON_UNDEAD);
|
|
// Mob sends fire arrows at nearby enemies. Use in on death
|
|
void deathcascade(object oTarget);
|
|
// Mob explodes sending poison out to enemies. Use in on death
|
|
void PoisonExplode(int nPoison=POISON_BLACK_LOTUS_EXTRACT);
|
|
// Mob explodes sending disease out to enemies. Use in on death
|
|
void DiseaseExplode(int nDisease=DISEASE_SOLDIER_SHAKES);
|
|
// Mob sends rays out to hurt enemies. Use in on heartbeat
|
|
void ZapTargets(int nBeam=VFX_BEAM_EVIL, int nDamage = 12, int nDC = 24, int nDamageType=DAMAGE_TYPE_NEGATIVE);
|
|
// Mob creates copy of self on oVictim if is dead.
|
|
// Instead of making a copy, it can make something else using res ref sMob
|
|
// Use in on combat round end
|
|
void SpawnCreature(object oVictim, string sMob="");
|
|
|
|
// Returns BASE_ITEM_GLOVES, BASE_ITEM_BELT or BASE_ITEM_CLOAK
|
|
// Depending on the value of nPattern;
|
|
int GetMiscClothType (int nPattern);
|
|
|
|
// returns the tag of the food required for this particular meal
|
|
// Tags are jw_meat_lion, jw_meat_polar, jw_meat_deer, jw_meat_rothe ,jw_meat_coug
|
|
string GetFoodType (int nPattern);
|
|
|
|
// Runs graphics when a PC enchants an object
|
|
void DoEnchantmentGraphics(object oPC, int nDoing);
|
|
|
|
// Returns tag of extra reagent 1`for nPattern. If no extra reagent exists,
|
|
// returns ""
|
|
string TagExtraReg1 (int nPattern);
|
|
|
|
// Returns tag of extra reagent 2`for nPattern. If no extra reagent exists,
|
|
// returns ""
|
|
string TagExtraReg2 (int nPattern);
|
|
|
|
|
|
// Sets custom token 2013 to be the description of the technique
|
|
// nDoing is the TYPE of technique and nCurrent is the number
|
|
// from 0 to 127
|
|
void BDSetDescription(int nDoing, int nCurrent);
|
|
|
|
// Builds the name of the technique, eg jw_pat_wep_007
|
|
// from nDoing, which is the TYPE of technique we are doing, and
|
|
// nCurrent, which is the number from 0 to 127 we are currently looking at
|
|
string BuildTechName (int nDoing, int nCurrent);
|
|
|
|
// Checks whether the PC is sufficiently close to the relevant crafting device
|
|
// This is used for enchantments
|
|
int CheckDevice(object oPC, int nDoing);
|
|
|
|
// Returns TRUE if the PC knows any of the relevant technique.
|
|
// Choose from TECHNIQUE_GAUNTLETS, TECHNIQUE_CLOTHING, TECHNIQUE_RINGAMULET
|
|
// TECHNIQUE_WEAPON, TECHNIQUE_ARMOUR,TECHNIQUE_FOOD
|
|
int KnowsAnyTechnique(object oPC, int nTechnique);
|
|
|
|
// oUser will learn a new technique based on sTag
|
|
// If they already have this pattern, they will get their pattern scroll back
|
|
void LearnPattern(object oUser, string sTag, object oItem);
|
|
|
|
// Sets the conversation tokens suitable to nPattern.
|
|
// Tokens are 1 to 7 with Vervain being 7 and Cloth of Gold being 1
|
|
// They are set either to the name of the reagent, or to "" if the
|
|
// reagent is not required
|
|
void SetRegTokens(int nPattern);
|
|
|
|
// Returns the itemproperty these herbs will bestow on food (turns it into a potion)
|
|
itemproperty iFoodProperty (int nHerbValue);
|
|
|
|
// Returns the itemproperty these herbs will bestow on monk gloves
|
|
itemproperty iGlovesProperty (int nHerbValue);
|
|
|
|
// Returns the itemproperty these herbs will bestow on cloaks, boots or belts
|
|
itemproperty iClothMiscProperty (int nHerbValue);
|
|
|
|
// Returns the itemproperty these herbs will bestow on a ring or amulet
|
|
itemproperty iRingAmuletProperty (int nHerbValue);
|
|
|
|
|
|
// Returns the itemproperty these herbs will bestow on armour
|
|
itemproperty iArmourProperty (int nHerbValue);
|
|
|
|
// Returns the itemproperty these herbs will bestow on a weapon
|
|
itemproperty iWeaponProperty (int nHerbValue);
|
|
|
|
|
|
// Returns the value of the herbs in oObject
|
|
int HerbValue (object oObject=OBJECT_SELF);
|
|
|
|
// Used in MakeCircle
|
|
void DropFlame(location lTemp);
|
|
|
|
// Make a spectacular pentagram on top of oObject
|
|
// Stolen from Twighlight
|
|
void MakeCircle(object oObject);
|
|
|
|
|
|
// Strips the PC of everything they own - does not currently remove gold
|
|
void jw_strip_items(object oPC);
|
|
|
|
// Remove all spells from PC as well as summon familiar and
|
|
// animal companion
|
|
void jw_remove_spells(object oPC);
|
|
|
|
// Set our constants here
|
|
const int REAGENT_VERVAIN=64;
|
|
const int REAGENT_SUKAKE=32;
|
|
const int REAGENT_ROSEMAGES=16;
|
|
const int REAGENT_HYSSOP=8;
|
|
const int REAGENT_FOOLSWEED=4;
|
|
const int REAGENT_DRYADSTEARS=2;
|
|
const int REAGENT_CLOTHGOLD=1;
|
|
|
|
const int TECHNIQUE_GAUNTLETS=1;
|
|
const int TECHNIQUE_CLOTHING=2;
|
|
const int TECHNIQUE_RINGAMULET=3;
|
|
const int TECHNIQUE_WEAPON=4;
|
|
const int TECHNIQUE_ARMOUR=5;
|
|
const int TECHNIQUE_FOOD=6;
|
|
|
|
const int PLAYER_ALIVE=0;
|
|
const int PLAYER_BLEEDING=1;
|
|
const int PLAYER_STABLE=2;
|
|
const int PLAYER_DEAD=3;
|
|
|
|
const int MODULE_EVERYONE_ALIVE=0;
|
|
const int MODULE_NOTEVERYONE_ALIVE=1;
|
|
|
|
|
|
void jw_strip_items(object oPC)
|
|
|
|
{
|
|
int nIdx;
|
|
object oItem;
|
|
object oStrip;
|
|
|
|
|
|
|
|
for (nIdx=0;nIdx<=18;nIdx++)
|
|
{
|
|
oItem=GetItemInSlot(nIdx,oPC);
|
|
DestroyObject(oItem);
|
|
}
|
|
|
|
oItem=GetFirstItemInInventory(oPC);
|
|
|
|
while (GetIsObjectValid(oItem))
|
|
|
|
{
|
|
oStrip=oItem;
|
|
DestroyObject(oStrip);
|
|
oItem=GetNextItemInInventory(oPC);
|
|
}
|
|
|
|
}
|
|
|
|
void jw_remove_spells(object oPC)
|
|
{
|
|
int nCounter=0;
|
|
int nPrepared=0;
|
|
|
|
// strip spells
|
|
for(nCounter = 0; nCounter <= 802; nCounter++)
|
|
{
|
|
nPrepared=GetHasSpell(nCounter,oPC);
|
|
while (nPrepared>0)
|
|
{
|
|
DecrementRemainingSpellUses(oPC,nCounter);
|
|
nPrepared=GetHasSpell(nCounter,oPC);
|
|
}
|
|
}
|
|
// remove familiar
|
|
nPrepared=GetHasFeat(FEAT_SUMMON_FAMILIAR,oPC);
|
|
if (nPrepared>0)
|
|
{
|
|
DecrementRemainingFeatUses(oPC,FEAT_SUMMON_FAMILIAR);
|
|
}
|
|
|
|
// remove animal companions
|
|
nPrepared=GetHasFeat(FEAT_ANIMAL_COMPANION,oPC);
|
|
if (nPrepared>0)
|
|
{
|
|
DecrementRemainingFeatUses(oPC,FEAT_ANIMAL_COMPANION);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
void DropFlame(location lTemp)
|
|
{
|
|
|
|
object oNew=CreateObject(OBJECT_TYPE_PLACEABLE,"plc_flamemedium",lTemp);
|
|
AssignCommand(oNew,PlaySound("sim_exp2flame"));
|
|
DelayCommand(6.0,DestroyObject(oNew));
|
|
|
|
}
|
|
|
|
|
|
void MakeCircle(object oObject)
|
|
{
|
|
SetLocalObject(OBJECT_SELF,"effectob",OBJECT_INVALID);
|
|
int x;
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_SCREEN_SHAKE),oObject);
|
|
float Pi = 360.0;
|
|
int Radius = 7;
|
|
float time = 2.0;
|
|
int count = 50/5;
|
|
int y;
|
|
vector center = GetPosition(oObject);
|
|
object oArea = GetArea(oObject);
|
|
vector vTemp;
|
|
location lTemp;
|
|
vTemp.z = center.z;
|
|
for (x=1;x<=5;x++)
|
|
{
|
|
vTemp.x = center.x + cos((Pi/5)*x)*Radius;
|
|
vTemp.y = center.y + sin((Pi/5)*x)*Radius;
|
|
lTemp = Location(oArea,vTemp,0.0);
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_LIGHTNING_M),lTemp);
|
|
}
|
|
for (x=1;x<=count;x++)
|
|
{
|
|
for (y=1;y<=5;y++)
|
|
{
|
|
vTemp.x = center.x + cos(((Pi/(5*count))*x)+(Pi/5)*y)*Radius;
|
|
vTemp.y = center.y + sin(((Pi/(5*count))*x)+(Pi/5)*y)*Radius;
|
|
lTemp = Location(oArea,vTemp,0.0);
|
|
DelayCommand((time/count)*x+1.2, DropFlame(lTemp));
|
|
}
|
|
}
|
|
SetLocalObject(OBJECT_SELF,"effectob",OBJECT_INVALID);
|
|
for (x=1;x<=count*5/3;x++)
|
|
{
|
|
for (y=1;y<=5;y++)
|
|
{
|
|
vTemp.x = center.x + cos((Pi/5)*y)*Radius - x*(cos((Pi/5)*y) - cos((Pi/5)*(2+y)))*Radius/(count*5/3);
|
|
vTemp.y = center.y + sin((Pi/5)*y)*Radius - x*(sin((Pi/5)*y) - sin((Pi/5)*(2+y)))*Radius/(count*5/3);
|
|
lTemp = Location(oArea,vTemp,0.0);
|
|
DelayCommand(2.0+time+((time*3)/(count*3))*x,DropFlame(lTemp));
|
|
}
|
|
}
|
|
}
|
|
|
|
int HerbValue (object oObject=OBJECT_SELF)
|
|
{
|
|
int nReturn=0;
|
|
object oHerb=GetItemPossessedBy(oObject,"jw_harpherb1");
|
|
if (GetIsObjectValid(oHerb))
|
|
{
|
|
nReturn=nReturn+1;
|
|
}
|
|
|
|
oHerb=GetItemPossessedBy(oObject,"jw_harpherb2");
|
|
if (GetIsObjectValid(oHerb))
|
|
{
|
|
nReturn=nReturn+2;
|
|
}
|
|
|
|
oHerb=GetItemPossessedBy(oObject,"jw_harpherb3");
|
|
if (GetIsObjectValid(oHerb))
|
|
{
|
|
nReturn=nReturn+4;
|
|
}
|
|
|
|
oHerb=GetItemPossessedBy(oObject,"jw_harpherb4");
|
|
if (GetIsObjectValid(oHerb))
|
|
{
|
|
nReturn=nReturn+8;
|
|
}
|
|
|
|
oHerb=GetItemPossessedBy(oObject,"jw_harpherb5");
|
|
if (GetIsObjectValid(oHerb))
|
|
{
|
|
nReturn=nReturn+16;
|
|
}
|
|
|
|
oHerb=GetItemPossessedBy(oObject,"jw_harpherb6");
|
|
if (GetIsObjectValid(oHerb))
|
|
{
|
|
nReturn=nReturn+32;
|
|
}
|
|
|
|
oHerb=GetItemPossessedBy(oObject,"jw_harpherb7");
|
|
if (GetIsObjectValid(oHerb))
|
|
{
|
|
nReturn=nReturn+64;
|
|
}
|
|
|
|
return nReturn;
|
|
}
|
|
|
|
itemproperty iWeaponProperty (int nHerbValue)
|
|
{
|
|
itemproperty iProperty;
|
|
|
|
SendMessageToAllDMs("Debug, doing iWeaponProperty for pattern "+IntToString(nHerbValue));
|
|
|
|
switch (nHerbValue)
|
|
{
|
|
case 7: iProperty = ItemPropertyEnhancementBonus (1); break;
|
|
case 11: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_1d4); break;
|
|
case 13: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_BLUDGEONING,IP_CONST_DAMAGEBONUS_1d4); break;
|
|
case 14: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEBONUS_1d4); break;
|
|
case 15: iProperty = ItemPropertyEnhancementBonus (2); break;
|
|
case 19: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_FORTITUDE,1); break;
|
|
case 21: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGEBONUS_1d4); break;
|
|
case 22: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_1d4); break;
|
|
case 23: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d4); break;
|
|
case 25: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_REFLEX,1); break;
|
|
case 26: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_WILL,1); break;
|
|
case 27: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_BLUDGEONING,IP_CONST_DAMAGEBONUS_2d4); break;
|
|
case 28: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEBONUS_1d4); break;
|
|
case 29: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEBONUS_2d4); break;
|
|
case 30: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_FORTITUDE,2); break;
|
|
case 31: iProperty = ItemPropertyEnhancementBonus (3); break;
|
|
case 35: iProperty =ItemPropertyVampiricRegeneration (1); break;
|
|
case 37: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SLASHING,IP_CONST_DAMAGEBONUS_1d4); break;
|
|
case 38: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_1d4); break;
|
|
case 39: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGEBONUS_2d4); break;
|
|
case 41: iProperty =ItemPropertyMassiveCritical (IP_CONST_DAMAGEBONUS_1d10); break;
|
|
case 42: iProperty =ItemPropertyDamageBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEBONUS_1d6); break;
|
|
case 43: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d4); break;
|
|
case 44: iProperty =ItemPropertyDamageBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_BLUDGEONING,IP_CONST_DAMAGEBONUS_1d6); break;
|
|
case 45: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_REFLEX,2); break;
|
|
case 46: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_WILL,2); break;
|
|
case 47: iProperty =ItemPropertyMaxRangeStrengthMod (20); break;
|
|
case 49: iProperty =ItemPropertyDamageBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_SLASHING,IP_CONST_DAMAGEBONUS_1d6); break;
|
|
case 50: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,4); break;
|
|
case 51: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEBONUS_2d4); break;
|
|
case 52: iProperty =ItemPropertySkillBonus (SKILL_TUMBLE,4); break;
|
|
case 53: iProperty =ItemPropertyVampiricRegeneration (3); break;
|
|
case 54: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SLASHING,IP_CONST_DAMAGEBONUS_2d4); break;
|
|
case 55: iProperty =ItemPropertyUnlimitedAmmo (IP_CONST_UNLIMITEDAMMO_PLUS4); break;
|
|
case 56: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_1d6); break;
|
|
case 57: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d4); break;
|
|
case 58: iProperty =ItemPropertyMassiveCritical (IP_CONST_DAMAGEBONUS_2d8); break;
|
|
case 59: iProperty =ItemPropertyVampiricRegeneration (6); break;
|
|
case 60: iProperty =ItemPropertyMaxRangeStrengthMod (14); break;
|
|
case 61: iProperty =ItemPropertyMassiveCritical (IP_CONST_DAMAGEBONUS_2d10); break;
|
|
case 62: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 63: iProperty = ItemPropertyEnhancementBonus (4); break;
|
|
case 67: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_1d6); break;
|
|
case 69: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_ORC,IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_1d6); break;
|
|
case 70: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_GOBLINOID,IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEBONUS_1d6); break;
|
|
case 71: iProperty =ItemPropertyUnlimitedAmmo (IP_CONST_UNLIMITEDAMMO_PLUS3); break;
|
|
case 73: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_SILENCE,IP_CONST_ONHIT_SAVEDC_16,IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
|
|
case 74: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_LESSERDISPEL,IP_CONST_ONHIT_SAVEDC_16); break;
|
|
case 75: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,7); break;
|
|
case 76: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_BLINDNESS,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
|
|
case 77: iProperty =ItemPropertySkillBonus (SKILL_TUMBLE,7); break;
|
|
case 78: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 79: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 81: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_FEAR,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
|
|
case 82: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_HOLD,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
|
|
case 83: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 84: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_DOOM,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
|
|
case 85: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_ORC,IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 86: iProperty =ItemPropertyDamageBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_GOBLINOID,IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 87: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 88: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ABILITY_STR); break;
|
|
case 89: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_GREATERDISPEL,IP_CONST_ONHIT_SAVEDC_20); break;
|
|
case 90: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_HOLD,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
|
|
case 91: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 92: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_LEVELDRAIN,IP_CONST_ONHIT_SAVEDC_18); break;
|
|
case 93: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_MORDSDISJUNCTION,IP_CONST_ONHIT_SAVEDC_24); break;
|
|
case 94: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_24, IP_CONST_ABILITY_STR); break;
|
|
case 95: iProperty =ItemPropertyUnlimitedAmmo (IP_CONST_UNLIMITEDAMMO_PLUS5); break;
|
|
case 97: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ABILITY_DEX); break;
|
|
case 98: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_16, IP_CONST_ABILITY_CON); break;
|
|
case 99: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ABILITY_STR); break;
|
|
case 100: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_WOUNDING,IP_CONST_ONHIT_SAVEDC_16); break;
|
|
case 101: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ABILITY_DEX); break;
|
|
case 102: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ABILITY_CON); break;
|
|
case 103: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_24, IP_CONST_ABILITY_CON); break;
|
|
case 104: iProperty =ItemPropertyMaxRangeStrengthMod (8); break;
|
|
case 105: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_SLOW,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
|
|
case 106: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_SLEEP,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
|
|
case 107: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_24, IP_CONST_ABILITY_DEX); break;
|
|
case 108: iProperty =ItemPropertyOnHitCastSpell (IP_CONST_ONHIT_CASTSPELL_FLESH_TO_STONE,IP_CONST_SPELLLEVEL_8); break;
|
|
case 109: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_LEVELDRAIN,IP_CONST_ONHIT_SAVEDC_22); break;
|
|
case 110: iProperty =ItemPropertyOnHitCastSpell (IP_CONST_ONHIT_CASTSPELL_INFESTATION_OF_MAGGOTS,IP_CONST_SPELLLEVEL_8); break;
|
|
case 111: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_SLOW,IP_CONST_ONHIT_SAVEDC_26, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
|
|
case 112: iProperty =ItemPropertyUnlimitedAmmo (IP_CONST_UNLIMITEDAMMO_PLUS2); break;
|
|
case 113: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ABILITY_CHA); break;
|
|
case 114: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ABILITY_INT); break;
|
|
case 115: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_20, IP_CONST_ABILITY_WIS); break;
|
|
case 116: iProperty =ItemPropertyOnHitCastSpell (IP_CONST_ONHIT_CASTSPELL_FREEZE,IP_CONST_SPELLLEVEL_8); break;
|
|
case 117: iProperty =ItemPropertyOnHitCastSpell (IP_CONST_ONHIT_CASTSPELL_KNOCKDOWN,IP_CONST_SPELLLEVEL_8); break;
|
|
case 118: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_SLOW,IP_CONST_ONHIT_SAVEDC_24, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
|
|
case 119: iProperty =ItemPropertyVampiricRegeneration (10); break;
|
|
case 120: iProperty =ItemPropertyBonusFeat (IP_CONST_FEAT_CLEAVE); break;
|
|
case 121: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_HOLD,IP_CONST_ONHIT_SAVEDC_24, IP_CONST_ONHIT_DURATION_10_PERCENT_4_ROUNDS); break;
|
|
case 122: iProperty =ItemPropertyAttackBonus (5); break;
|
|
case 123: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_26, IP_CONST_ABILITY_STR); break;
|
|
case 124: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_STUN,IP_CONST_ONHIT_SAVEDC_24,IP_CONST_ONHIT_DURATION_75_PERCENT_1_ROUND); break;
|
|
case 125: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_26, IP_CONST_ABILITY_CON); break;
|
|
case 126: iProperty =ItemPropertyOnHitProps (IP_CONST_ONHIT_ABILITYDRAIN,IP_CONST_ONHIT_SAVEDC_26, IP_CONST_ABILITY_DEX); break;
|
|
case 127: iProperty = ItemPropertyEnhancementBonus (5); break;
|
|
}
|
|
|
|
return iProperty;
|
|
}
|
|
|
|
itemproperty iArmourProperty (int nHerbValue)
|
|
{
|
|
itemproperty iProperty;
|
|
|
|
|
|
switch (nHerbValue)
|
|
{
|
|
case 7: iProperty = ItemPropertyACBonus (1); break;
|
|
case 11: iProperty =ItemPropertyACBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,2); break;
|
|
case 13: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGERESIST_5); break;
|
|
case 14: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGERESIST_5); break;
|
|
case 15: iProperty = ItemPropertyACBonus (2); break;
|
|
case 19: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGERESIST_5); break;
|
|
case 21: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGERESIST_5); break;
|
|
case 22: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_MAGICAL,IP_CONST_DAMAGERESIST_5); break;
|
|
case 23: iProperty =ItemPropertyACBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,3); break;
|
|
case 25: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_NEGATIVE,IP_CONST_DAMAGERESIST_5); break;
|
|
case 26: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGERESIST_5); break;
|
|
case 27: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGERESIST_10); break;
|
|
case 28: iProperty =ItemPropertyImmunityToSpellLevel (2); break;
|
|
case 29: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGERESIST_10); break;
|
|
case 30: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGERESIST_10); break;
|
|
case 31: iProperty = ItemPropertyACBonus (3); break;
|
|
case 35: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_BLUDGEONING,2); break;
|
|
case 37: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_PIERCING,2); break;
|
|
case 38: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_SLASHING,2); break;
|
|
case 39: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGERESIST_10); break;
|
|
case 41: iProperty =ItemPropertyBonusSpellResistance (IP_CONST_SPELLRESISTANCEBONUS_10); break;
|
|
case 42: iProperty =ItemPropertyArcaneSpellFailure (IP_CONST_ARCANE_SPELL_FAILURE_MINUS_10_PERCENT); break;
|
|
case 43: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_MAGICAL,IP_CONST_DAMAGERESIST_10); break;
|
|
case 44: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_ABERRATION,3); break;
|
|
case 45: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_NEGATIVE,IP_CONST_DAMAGERESIST_10); break;
|
|
case 46: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGERESIST_10); break;
|
|
case 47: iProperty =ItemPropertyACBonusVsAlign (IP_CONST_ALIGNMENTGROUP_EVIL,3); break;
|
|
case 49: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_ANIMAL,3); break;
|
|
case 50: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_BEAST,3); break;
|
|
case 51: iProperty =ItemPropertyImmunityToSpellLevel (3); break;
|
|
case 52: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_CONSTRUCT,3); break;
|
|
case 53: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_BLUDGEONING,3); break;
|
|
case 54: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_PIERCING,3); break;
|
|
case 55: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGERESIST_15); break;
|
|
case 56: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_DWARF,3); break;
|
|
case 57: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_SLASHING,3); break;
|
|
case 58: iProperty =ItemPropertyBonusSpellResistance (IP_CONST_SPELLRESISTANCEBONUS_16); break;
|
|
case 59: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGERESIST_15); break;
|
|
case 60: iProperty =ItemPropertyBonusFeat (IP_CONST_FEAT_COMBAT_CASTING); break;
|
|
case 61: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGERESIST_15); break;
|
|
case 62: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGERESIST_15); break;
|
|
case 63: iProperty = ItemPropertyACBonus (4); break;
|
|
case 67: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_ELEMENTAL,3); break;
|
|
case 69: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_GOBLINOID,3); break;
|
|
case 70: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_MONSTROUS,3); break;
|
|
case 71: iProperty =ItemPropertyBonusFeat (IP_CONST_FEAT_KNOCKDOWN); break;
|
|
case 73: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_ORC,3); break;
|
|
case 74: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_REPTILIAN,3); break;
|
|
case 75: iProperty =ItemPropertyBonusFeat (IP_CONST_FEAT_POINTBLANK); break;
|
|
case 76: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_MAGICAL_BEAST,3); break;
|
|
case 77: iProperty =ItemPropertyBonusFeat (IP_CONST_FEAT_AMBIDEXTROUS); break;
|
|
case 78: iProperty =ItemPropertyArcaneSpellFailure (IP_CONST_ARCANE_SPELL_FAILURE_MINUS_20_PERCENT); break;
|
|
case 79: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_MAGICAL,IP_CONST_DAMAGERESIST_15); break;
|
|
case 81: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_OUTSIDER,3); break;
|
|
case 82: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_UNDEAD,3); break;
|
|
case 83: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_ABERRATION,4); break;
|
|
case 84: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_FEAR,2); break;
|
|
case 85: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_ANIMAL,4); break;
|
|
case 86: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_BEAST,4); break;
|
|
case 87: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_NEGATIVE,IP_CONST_DAMAGERESIST_15); break;
|
|
case 88: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_MINDAFFECTING,2); break;
|
|
case 89: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_CONSTRUCT,4); break;
|
|
case 90: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_DRAGON,4); break;
|
|
case 91: iProperty =ItemPropertyDamageResistance (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGERESIST_15); break;
|
|
case 92: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_ELEMENTAL,4); break;
|
|
case 93: iProperty =ItemPropertyImmunityToSpellLevel (4); break;
|
|
case 94: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_BLUDGEONING,4); break;
|
|
case 95: iProperty =ItemPropertyUnlimitedAmmo (IP_CONST_UNLIMITEDAMMO_PLUS5); break;
|
|
case 97: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_DISEASE,2); break;
|
|
case 98: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_NEGATIVE,2); break;
|
|
case 99: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_GOBLINOID,4); break;
|
|
case 100: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_DEATH,2); break;
|
|
case 101: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_MONSTROUS,4); break;
|
|
case 102: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_ORC,4); break;
|
|
case 103: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_PIERCING,4); break;
|
|
case 104: iProperty =ItemPropertyRegeneration (1); break;
|
|
case 105: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_HUMANOID_REPTILIAN,4); break;
|
|
case 106: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_MAGICAL_BEAST,4); break;
|
|
case 107: iProperty =ItemPropertyACBonusVsDmgType (IP_CONST_DAMAGETYPE_SLASHING,4); break;
|
|
case 108: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_OUTSIDER,4); break;
|
|
case 109: iProperty =ItemPropertyBonusSpellResistance (IP_CONST_SPELLRESISTANCEBONUS_22); break;
|
|
case 110: iProperty =ItemPropertyArcaneSpellFailure (IP_CONST_ARCANE_SPELL_FAILURE_MINUS_30_PERCENT); break;
|
|
case 111: iProperty =ItemPropertyImmunityToSpellLevel (5); break;
|
|
case 112: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,5); break;
|
|
case 113: iProperty =ItemPropertyACBonusVsRace (IP_CONST_RACIALTYPE_UNDEAD,4); break;
|
|
case 114: iProperty =ItemPropertyRegeneration (3); break;
|
|
case 115: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,10); break;
|
|
case 116: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_DEATH,4); break;
|
|
case 117: iProperty = ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_FEAR); break;
|
|
case 118: iProperty = ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_MINDSPELLS); break;
|
|
case 119: iProperty = ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_PARALYSIS); break;
|
|
case 120: iProperty =ItemPropertyBonusSavingThrowVsX (IP_CONST_SAVEVS_UNIVERSAL,2); break;
|
|
case 121: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEIMMUNITY_50_PERCENT); break;
|
|
case 122: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_BLUDGEONING,IP_CONST_DAMAGEIMMUNITY_50_PERCENT); break;
|
|
case 123: iProperty = ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_CRITICAL_HITS); break;
|
|
case 124: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_SLASHING,IP_CONST_DAMAGEIMMUNITY_50_PERCENT); break;
|
|
case 125: iProperty =ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_KNOCKDOWN); break;
|
|
case 126: iProperty =ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_DEATH_MAGIC); break;
|
|
case 127: iProperty = ItemPropertyACBonus (5); break;
|
|
}
|
|
|
|
return iProperty;
|
|
}
|
|
|
|
|
|
itemproperty iRingAmuletProperty (int nHerbValue)
|
|
{
|
|
|
|
itemproperty iProperty;
|
|
|
|
|
|
switch (nHerbValue)
|
|
{
|
|
case 7: iProperty = ItemPropertyDarkvision (); break;
|
|
case 11: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CHA,1); break;
|
|
case 13: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_INT,1); break;
|
|
case 14: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_WIS,1); break;
|
|
case 15: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CHA,2); break;
|
|
case 19: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_FORTITUDE,1); break;
|
|
case 21: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_REFLEX,1); break;
|
|
case 22: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_WILL,1); break;
|
|
case 23: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_INT,2); break;
|
|
case 25: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_BARD,IP_CONST_SPELLLEVEL_1); break;
|
|
case 26: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_2); break;
|
|
case 27: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_WIS,2); break;
|
|
case 28: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_2); break;
|
|
case 29: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_FORTITUDE,2); break;
|
|
case 30: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_REFLEX,2); break;
|
|
case 31: iProperty = ItemPropertyRegeneration (4); break;
|
|
case 35: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_2); break;
|
|
case 37: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_2); break;
|
|
case 38: iProperty =ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_LOW,IP_CONST_LIGHTCOLOR_BLUE); break;
|
|
case 39: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_WILL,2); break;
|
|
case 41: iProperty =ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_LOW,IP_CONST_LIGHTCOLOR_PURPLE); break;
|
|
case 42: iProperty =ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_LOW,IP_CONST_LIGHTCOLOR_RED); break;
|
|
case 43: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_BARD,IP_CONST_SPELLLEVEL_4); break;
|
|
case 44: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AID_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 45: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_4); break;
|
|
case 46: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_4); break;
|
|
case 47: iProperty =ItemPropertySpellImmunitySchool (SPELL_SCHOOL_EVOCATION); break;
|
|
case 49: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BLESS_2,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 50: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GHOSTLY_VISAGE_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 51: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_4); break;
|
|
case 52: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_EAGLE_SPLEDOR_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 53: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_2); break;
|
|
case 54: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_RANGER,IP_CONST_SPELLLEVEL_2); break;
|
|
case 55: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_WILL,3); break;
|
|
case 56: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENDURANCE_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 57: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_PALADIN,IP_CONST_SPELLLEVEL_2); break;
|
|
case 58: iProperty =ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_NORMAL,IP_CONST_LIGHTCOLOR_YELLOW); break;
|
|
case 59: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_REFLEX,3); break;
|
|
case 60: iProperty =ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_NORMAL,IP_CONST_LIGHTCOLOR_GREEN); break;
|
|
case 61: iProperty =ItemPropertyBonusSavingThrow (IP_CONST_SAVEBASETYPE_FORTITUDE,3); break;
|
|
case 62: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_WIS,3); break;
|
|
case 63: iProperty = ItemPropertyCastSpell (IP_CONST_CASTSPELL_HEAL_11,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY); break;
|
|
case 67: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_LIGHT_WOUNDS_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 69: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BULLS_STRENGTH_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 70: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_OWLS_WISDOM_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 71: iProperty =ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_NORMAL,IP_CONST_LIGHTCOLOR_WHITE); break;
|
|
case 73: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FOXS_CUNNING_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 74: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 75: iProperty =ItemPropertyBonusFeat (IP_CONST_FEAT_EXTRA_TURNING); break;
|
|
case 76:iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENTROPIC_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 77: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 78: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_EAGLES_SPLENDOR_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 79: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_INT,3); break;
|
|
case 81: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CLARITY_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 82: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MAGE_ARMOR_2,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 83: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BARKSKIN_6,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 84: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_VIRTUE_1,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 85: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_ENDURANCE_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 86: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_SERIOUS_WOUNDS_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 87: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CHA,3); break;
|
|
case 88: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FIND_TRAPS_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 89: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ELEMENTAL_SHIELD_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 90: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 91: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_BULLS_STRENGTH_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 92: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_OWLS_WISDOM_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 93: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IMPROVED_INVISIBILITY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 94: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_RESTORATION_13,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 95: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_8); break;
|
|
case 97: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_RESTORATION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 98: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_MIND_BLANK_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 99: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_FOXS_CUNNING_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 100: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_DARKVISION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 101: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_HEALING_CIRCLE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 102: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_RESISTANCE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 103: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GLOBE_OF_INVULNERABILITY_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 104: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_DISEASE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 105: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 106: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IDENTIFY_3,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY); break;
|
|
case 107: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_STONESKIN_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 108: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AURAOFGLORY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 109: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_BARD,IP_CONST_SPELLLEVEL_6); break;
|
|
case 110: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_PALADIN,IP_CONST_SPELLLEVEL_4); break;
|
|
case 111: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_8); break;
|
|
case 112: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 113: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 114: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 115: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 116: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 117: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_RANGER,IP_CONST_SPELLLEVEL_4); break;
|
|
case 118: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_6); break;
|
|
case 119: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_8); break;
|
|
case 120: iProperty =ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_POISON); break;
|
|
case 121: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_6); break;
|
|
case 122: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_6); break;
|
|
case 123: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_8); break;
|
|
case 124: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_6); break;
|
|
case 125: iProperty =ItemPropertyImprovedEvasion (); break;
|
|
case 126: iProperty =ItemPropertyTrueSeeing (); break;
|
|
case 127: iProperty = ItemPropertyHaste (); break;
|
|
}
|
|
|
|
return iProperty;
|
|
}
|
|
|
|
|
|
itemproperty iClothMiscProperty (int nHerbValue)
|
|
{
|
|
|
|
itemproperty iProperty;
|
|
|
|
|
|
switch (nHerbValue)
|
|
{
|
|
case 7: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CON,1); break;
|
|
case 11: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_DEX,1); break;
|
|
case 13: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_STR,1); break;
|
|
case 14: iProperty =ItemPropertySkillBonus (SKILL_ANIMAL_EMPATHY,5); break;
|
|
case 15: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CON,2); break;
|
|
case 19: iProperty =ItemPropertySkillBonus (SKILL_APPRAISE,5); break;
|
|
case 21: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,5); break;
|
|
case 22: iProperty =ItemPropertySkillBonus (SKILL_DISABLE_TRAP,5); break;
|
|
case 23: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_DEX,2); break;
|
|
case 25: iProperty =ItemPropertySkillBonus (FEAT_SKILL_FOCUS_DISCIPLINE,5); break;
|
|
case 26: iProperty =ItemPropertySkillBonus (SKILL_HEAL,5); break;
|
|
case 27: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_STR,2); break;
|
|
case 28: iProperty =ItemPropertySkillBonus (SKILL_HIDE,5); break;
|
|
case 29: iProperty =ItemPropertySkillBonus (SKILL_ANIMAL_EMPATHY,10); break;
|
|
case 30: iProperty =ItemPropertySkillBonus (SKILL_ANIMAL_EMPATHY,10); break;
|
|
case 31: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CON,3); break;
|
|
case 35: iProperty =ItemPropertySkillBonus (SKILL_LISTEN,5); break;
|
|
case 37: iProperty =ItemPropertySkillBonus (SKILL_LORE,5); break;
|
|
case 38: iProperty =ItemPropertySkillBonus (SKILL_MOVE_SILENTLY,5); break;
|
|
case 39: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,10); break;
|
|
case 41: iProperty =ItemPropertySkillBonus (SKILL_PERFORM,5); break;
|
|
case 42: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,5); break;
|
|
case 43: iProperty =ItemPropertySkillBonus (FEAT_SKILL_FOCUS_DISABLE_TRAP,10); break;
|
|
case 44: iProperty =ItemPropertySkillBonus (SKILL_SPOT,5); break;
|
|
case 45: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,10); break;
|
|
case 46: iProperty =ItemPropertySkillBonus (SKILL_HEAL,10); break;
|
|
case 47: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_DEX,3); break;
|
|
case 49: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,5); break;
|
|
case 50: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GHOSTLY_VISAGE_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 51: iProperty =ItemPropertySkillBonus (SKILL_HIDE,10); break;
|
|
case 52: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_EAGLE_SPLEDOR_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 53: iProperty =ItemPropertySkillBonus (SKILL_LISTEN,10); break;
|
|
case 54: iProperty =ItemPropertySkillBonus (SKILL_LORE,10); break;
|
|
case 55: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_STR,3); break;
|
|
case 56: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENDURANCE_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 57: iProperty =ItemPropertySkillBonus (SKILL_LORE,10); break;
|
|
case 58: iProperty =ItemPropertySkillBonus (SKILL_PERFORM,10); break;
|
|
case 59: iProperty =ItemPropertySkillBonus (SKILL_ANIMAL_EMPATHY,15); break;
|
|
case 60: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,10); break;
|
|
case 61: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,15); break;
|
|
case 62: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,15); break;
|
|
case 63: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_CON,4); break;
|
|
case 67: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_LIGHT_WOUNDS_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 69: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BULLS_STRENGTH_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 70: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_OWLS_WISDOM_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 71: iProperty =ItemPropertySkillBonus (SKILL_SPOT,10); break;
|
|
case 73: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FOXS_CUNNING_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 74: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 75: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,10); break;
|
|
case 76:iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENTROPIC_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 77: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 78: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_EAGLES_SPLENDOR_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 79: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,15); break;
|
|
case 81: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CLARITY_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 82: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MAGE_ARMOR_2,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 83: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BARKSKIN_6,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 84: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_VIRTUE_1,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 85: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_ENDURANCE_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 86: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_SERIOUS_WOUNDS_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 87: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,15); break;
|
|
case 88: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FIND_TRAPS_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 89: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ELEMENTAL_SHIELD_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 90: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 91: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_BULLS_STRENGTH_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 92: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_OWLS_WISDOM_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 93: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IMPROVED_INVISIBILITY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 94: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_RESTORATION_13,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 95: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_DEX,4); break;
|
|
case 97: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_RESTORATION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 98: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_MIND_BLANK_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 99: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_FOXS_CUNNING_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 100: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_DARKVISION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 101: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_HEALING_CIRCLE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 102: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_RESISTANCE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 103: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GLOBE_OF_INVULNERABILITY_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 104: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_DISEASE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 105: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 106: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IDENTIFY_3,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY); break;
|
|
case 107: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_STONESKIN_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 108: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AURAOFGLORY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 109: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_BARD,IP_CONST_SPELLLEVEL_6); break;
|
|
case 110: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_PALADIN,IP_CONST_SPELLLEVEL_4); break;
|
|
case 111: iProperty =ItemPropertyAbilityBonus (IP_CONST_ABILITY_STR,4); break;
|
|
case 112: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 113: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 114: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 115: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 116: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 117: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_RANGER,IP_CONST_SPELLLEVEL_4); break;
|
|
case 118: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_6); break;
|
|
case 119: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_8); break;
|
|
case 120: iProperty =ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_POISON); break;
|
|
case 121: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_6); break;
|
|
case 122: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_6); break;
|
|
case 123: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_8); break;
|
|
case 124: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_6); break;
|
|
case 125: iProperty =ItemPropertyImprovedEvasion (); break;
|
|
case 126: iProperty =ItemPropertyTrueSeeing (); break;
|
|
case 127: iProperty = ItemPropertyFreeAction (); break;
|
|
}
|
|
|
|
return iProperty;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
itemproperty iGlovesProperty (int nHerbValue)
|
|
{
|
|
|
|
itemproperty iProperty;
|
|
|
|
|
|
switch (nHerbValue)
|
|
{
|
|
case 7: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_1d6); break;
|
|
case 11: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_1d6); break;
|
|
case 13: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_1d6); break;
|
|
case 14: iProperty =ItemPropertyAttackBonus (3); break;
|
|
case 15: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_1d8); break;
|
|
case 19: iProperty =ItemPropertySkillBonus (SKILL_APPRAISE,5); break;
|
|
case 21: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,5); break;
|
|
case 22: iProperty =ItemPropertySkillBonus (SKILL_DISABLE_TRAP,5); break;
|
|
case 23: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_1d8); break;
|
|
case 25: iProperty =ItemPropertySkillBonus (FEAT_SKILL_FOCUS_DISCIPLINE,5); break;
|
|
case 26: iProperty =ItemPropertySkillBonus (SKILL_HEAL,5); break;
|
|
case 27: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_1d8); break;
|
|
case 28: iProperty =ItemPropertySkillBonus (SKILL_HIDE,5); break;
|
|
case 29: iProperty =ItemPropertyAttackBonus (6); break;
|
|
case 30: iProperty =ItemPropertySkillBonus (SKILL_ANIMAL_EMPATHY,10); break;
|
|
case 31: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 35: iProperty =ItemPropertySkillBonus (SKILL_LISTEN,5); break;
|
|
case 37: iProperty =ItemPropertySkillBonus (SKILL_LORE,5); break;
|
|
case 38: iProperty =ItemPropertySkillBonus (SKILL_MOVE_SILENTLY,5); break;
|
|
case 39: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,10); break;
|
|
case 41: iProperty =ItemPropertySkillBonus (SKILL_PERFORM,5); break;
|
|
case 42: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,5); break;
|
|
case 43: iProperty =ItemPropertySkillBonus (FEAT_SKILL_FOCUS_DISABLE_TRAP,10); break;
|
|
case 44: iProperty =ItemPropertySkillBonus (SKILL_SPOT,5); break;
|
|
case 45: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,10); break;
|
|
case 46: iProperty =ItemPropertySkillBonus (SKILL_HEAL,10); break;
|
|
case 47: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 49: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,5); break;
|
|
case 50: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GHOSTLY_VISAGE_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 51: iProperty =ItemPropertySkillBonus (SKILL_HIDE,10); break;
|
|
case 52: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_EAGLE_SPLEDOR_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 53: iProperty =ItemPropertySkillBonus (SKILL_LISTEN,10); break;
|
|
case 54: iProperty =ItemPropertySkillBonus (SKILL_LORE,10); break;
|
|
case 55: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 56: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENDURANCE_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 57: iProperty =ItemPropertySkillBonus (SKILL_LORE,10); break;
|
|
case 58: iProperty =ItemPropertySkillBonus (SKILL_PERFORM,10); break;
|
|
case 59: iProperty =ItemPropertyAttackBonus (10); break;
|
|
case 60: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,10); break;
|
|
case 61: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,15); break;
|
|
case 62: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,15); break;
|
|
case 63: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d8); break;
|
|
case 67: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_LIGHT_WOUNDS_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 69: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BULLS_STRENGTH_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 70: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_OWLS_WISDOM_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 71: iProperty =ItemPropertySkillBonus (SKILL_SPOT,10); break;
|
|
case 73: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FOXS_CUNNING_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 74: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 75: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,10); break;
|
|
case 76:iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENTROPIC_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 77: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 78: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_EAGLES_SPLENDOR_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 79: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,15); break;
|
|
case 81: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CLARITY_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 82: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MAGE_ARMOR_2,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 83: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BARKSKIN_6,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 84: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_VIRTUE_1,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 85: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_ENDURANCE_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 86: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_SERIOUS_WOUNDS_10,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 87: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,15); break;
|
|
case 88: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FIND_TRAPS_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 89: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ELEMENTAL_SHIELD_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 90: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 91: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_BULLS_STRENGTH_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 92: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_OWLS_WISDOM_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 93: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IMPROVED_INVISIBILITY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 94: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_RESTORATION_13,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 95: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d8); break;
|
|
case 97: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_RESTORATION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 98: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_MIND_BLANK_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 99: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_FOXS_CUNNING_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 100: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_DARKVISION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 101: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_HEALING_CIRCLE_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 102: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_RESISTANCE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 103: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GLOBE_OF_INVULNERABILITY_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 104: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_DISEASE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 105: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 106: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IDENTIFY_3,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY); break;
|
|
case 107: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_STONESKIN_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 108: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AURAOFGLORY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 109: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_BARD,IP_CONST_SPELLLEVEL_6); break;
|
|
case 110: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_PALADIN,IP_CONST_SPELLLEVEL_4); break;
|
|
case 111: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d8); break;
|
|
case 112: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 113: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 114: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 115: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 116: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 117: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_RANGER,IP_CONST_SPELLLEVEL_4); break;
|
|
case 118: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_6); break;
|
|
case 119: iProperty =ItemPropertyAttackBonus (3); break;
|
|
case 120: iProperty =ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_POISON); break;
|
|
case 121: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_6); break;
|
|
case 122: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_6); break;
|
|
case 123: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_8); break;
|
|
case 124: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_6); break;
|
|
case 125: iProperty =ItemPropertyImprovedEvasion (); break;
|
|
case 126: iProperty =ItemPropertyTrueSeeing (); break;
|
|
case 127: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BOMBARDMENT_20,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
}
|
|
|
|
return iProperty;
|
|
}
|
|
|
|
|
|
itemproperty iFoodProperty (int nHerbValue)
|
|
|
|
{
|
|
itemproperty iProperty;
|
|
|
|
|
|
switch (nHerbValue)
|
|
{
|
|
case 7: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AID_3,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 11: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BLESS_2,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 13: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BULLS_STRENGTH_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 14: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CATS_GRACE_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 15: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ANIMATE_DEAD_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 19: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CLARITY_3,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 21: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_LIGHT_WOUNDS_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 22: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_MODERATE_WOUNDS_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 23: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BARKSKIN_6,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 25: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ELEMENTAL_SHIELD_12,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 26: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AID_3,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 27: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ENDURANCE_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 28: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_MIND_BLANK_9,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 29: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CREATE_GREATER_UNDEAD_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 30: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_SERIOUS_WOUNDS_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 31: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 35: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_RESTORATION_3,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 37: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MAGE_ARMOR_2,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 38: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MASS_HEAL_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 39: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_CURE_CRITICAL_WOUNDS_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 41: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MIND_BLANK_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 42: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MINOR_GLOBE_OF_INVULNERABILITY_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 43: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_DEATH_WARD_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 44: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GHOSTLY_VISAGE_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 45: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_FREEDOM_OF_MOVEMENT_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 46: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GLOBE_OF_INVULNERABILITY_11,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 47: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 49: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_NATURES_BALANCE_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 50: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_NEGATIVE_ENERGY_PROTECTION_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 51: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_RESTORATION_13,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 52: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_NEUTRALIZE_POISON_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 53: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_SPELL_MANTLE_17,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 54: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_STONESKIN_11,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 55: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d6); break;
|
|
case 56: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_PRAYER_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 57: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_HASTE_10,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 58: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_HEALING_CIRCLE_16,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 59: iProperty =ItemPropertyAttackBonus (10); break;
|
|
case 60: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IMPROVED_INVISIBILITY_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 61: iProperty =ItemPropertySkillBonus (SKILL_CONCENTRATION,15); break;
|
|
case 62: iProperty =ItemPropertySkillBonus (SKILL_DISCIPLINE,15); break;
|
|
case 63: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_2d8); break;
|
|
case 67: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_PROTECTION_FROM_ALIGNMENT_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 69: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_BLINDNESS_DEAFNESS_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 70: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_FEAR_2,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 71: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_INVISIBILITY_SPHERE_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 73: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_DISEASE_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 74: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_CURSE_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 75: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MASS_HASTE_11,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 76: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_PARALYSIS_3,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 77: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_ETHEREAL_VISAGE_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 78: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_MORDENKAINENS_SWORD_13,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 79: iProperty =ItemPropertySkillBonus (SKILL_SEARCH,15); break;
|
|
case 81: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_RESISTANCE_5,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 82: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_RESTORATION_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 83: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_POLYMORPH_SELF_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 84: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SPELL_RESISTANCE_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 85: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_PREMONITION_15,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 86: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SANCTUARY_2,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 87: iProperty =ItemPropertySkillBonus (SKILL_USE_MAGIC_DEVICE,15); break;
|
|
case 88: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SPELL_MANTLE_13,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 89: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SHADOW_SHIELD_13,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 90: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SHAPECHANGE_17,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 91: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_BULLS_STRENGTH_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 92: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_STONESKIN_7,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 93: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IMPROVED_INVISIBILITY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 94: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GREATER_RESTORATION_13,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 95: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_2d8); break;
|
|
case 97: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REGENERATE_13,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 98: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_LESSER_MIND_BLANK_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 99: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_TENSERS_TRANSFORMATION_11,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 100: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_DARKVISION_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 101: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_HEAL_11,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); break;
|
|
case 102: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_RESISTANCE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 103: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_GLOBE_OF_INVULNERABILITY_11,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 104: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_REMOVE_DISEASE_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 105: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SUMMON_CREATURE_III_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 106: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_IDENTIFY_3,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY); break;
|
|
case 107: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_STONESKIN_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 108: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_AURAOFGLORY_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 109: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_BARD,IP_CONST_SPELLLEVEL_6); break;
|
|
case 110: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_PALADIN,IP_CONST_SPELLLEVEL_4); break;
|
|
case 111: iProperty =ItemPropertyDamageBonus (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEBONUS_2d8); break;
|
|
case 112: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_SHIELD_5,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
case 113: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_PIERCING,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 114: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 115: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 116: iProperty =ItemPropertyDamageImmunity (IP_CONST_DAMAGETYPE_SONIC,IP_CONST_DAMAGEIMMUNITY_25_PERCENT); break;
|
|
case 117: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_RANGER,IP_CONST_SPELLLEVEL_4); break;
|
|
case 118: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_WIZARD,IP_CONST_SPELLLEVEL_6); break;
|
|
case 119: iProperty =ItemPropertyAttackBonus (3); break;
|
|
case 120: iProperty =ItemPropertyImmunityMisc (IP_CONST_IMMUNITYMISC_POISON); break;
|
|
case 121: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_SORCERER,IP_CONST_SPELLLEVEL_6); break;
|
|
case 122: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_DRUID,IP_CONST_SPELLLEVEL_6); break;
|
|
case 123: iProperty = ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_8); break;
|
|
case 124: iProperty =ItemPropertyBonusLevelSpell (IP_CONST_CLASS_CLERIC,IP_CONST_SPELLLEVEL_6); break;
|
|
case 125: iProperty =ItemPropertyImprovedEvasion (); break;
|
|
case 126: iProperty =ItemPropertyTrueSeeing (); break;
|
|
case 127: iProperty =ItemPropertyCastSpell (IP_CONST_CASTSPELL_BOMBARDMENT_20,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); break;
|
|
}
|
|
|
|
return iProperty;
|
|
}
|
|
|
|
void SetRegTokens(int nPattern)
|
|
|
|
{
|
|
// First of all, do our two extra reagents
|
|
SetCustomToken(2008,GetName(GetObjectByTag(TagExtraReg1(nPattern))));
|
|
SetCustomToken(2009,GetName(GetObjectByTag(TagExtraReg2(nPattern))));
|
|
|
|
if (nPattern>=REAGENT_VERVAIN)
|
|
{
|
|
nPattern=nPattern-REAGENT_VERVAIN;
|
|
if (nPattern>0)
|
|
{
|
|
SetCustomToken(2007," vervain,");
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2007," and vervain.");
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2007,"");
|
|
}
|
|
|
|
if (nPattern>=REAGENT_SUKAKE)
|
|
{
|
|
nPattern=nPattern-REAGENT_SUKAKE;
|
|
if (nPattern>0)
|
|
{
|
|
SetCustomToken(2006," sukake,");
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2006," and sukake.");
|
|
}
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2006,"");
|
|
}
|
|
|
|
if (nPattern>=REAGENT_ROSEMAGES)
|
|
{
|
|
|
|
nPattern=nPattern-REAGENT_ROSEMAGES;
|
|
if (nPattern>0)
|
|
{
|
|
SetCustomToken(2005," rose of mages,");
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2005," and rose of mages.");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2005,"");
|
|
}
|
|
|
|
if (nPattern>=REAGENT_HYSSOP)
|
|
{
|
|
|
|
nPattern=nPattern-REAGENT_HYSSOP;
|
|
if (nPattern>0)
|
|
{
|
|
SetCustomToken(2004," hyssop,");
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2004," and hyssop.");
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2004,"");
|
|
}
|
|
|
|
if (nPattern>=REAGENT_FOOLSWEED)
|
|
{
|
|
|
|
nPattern=nPattern-REAGENT_FOOLSWEED;
|
|
if (nPattern>0)
|
|
{
|
|
SetCustomToken(2003," fool's weed,");
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2003," and fool's weed.");
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2003,"");
|
|
}
|
|
|
|
if (nPattern>=REAGENT_DRYADSTEARS)
|
|
{
|
|
|
|
nPattern=nPattern-REAGENT_DRYADSTEARS;
|
|
if (nPattern>0)
|
|
{
|
|
SetCustomToken(2002," dryad's tears,");
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2002," and dryad's tears.");
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2002,"");
|
|
}
|
|
|
|
if (nPattern>=REAGENT_CLOTHGOLD)
|
|
{
|
|
|
|
nPattern=nPattern-REAGENT_CLOTHGOLD;
|
|
if (nPattern>0)
|
|
{
|
|
SetCustomToken(2001," cloth of gold,");
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2001," and cloth of gold.");
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(2001,"");
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void LearnPattern(object oUser, string sTag, object oItem)
|
|
{
|
|
// Sample tag of item jw_pat_gau_000
|
|
// gau is gauntlets. clo is boots, belts and cloak
|
|
// rin is amulets and rings. arm is armour. wep is weapons
|
|
|
|
// Get their persistent storage item
|
|
object oModule=GetItemPossessedBy(oUser,"jw_crafting_gem");
|
|
if (!GetIsObjectValid(oModule))
|
|
{
|
|
SendMessageToPC(oUser,"You have lost your persistent storage module. Please contact a DM");
|
|
return;
|
|
}
|
|
|
|
// The string we use for the technique need not be the same as the
|
|
// Actual tag of the technique, because we
|
|
// Might add some letters on to the end of the tag to represent
|
|
// Additional ingredients
|
|
|
|
string sTech=GetStringLeft(sTag,14);
|
|
|
|
// Check to see if the module aready has this local int stored
|
|
if (GetLocalInt(oModule,sTag)==TRUE)
|
|
{
|
|
SendMessageToPC(oUser,"You already know this technique");
|
|
CreateItemOnObject(sTag,oUser);
|
|
return;
|
|
}
|
|
|
|
// Learn the technique
|
|
SetLocalInt(oModule,sTag,TRUE);
|
|
// Give the player a message
|
|
string sName=GetName(GetObjectByTag(sTag));
|
|
|
|
FloatingTextStringOnCreature("Learned the technique "+sName,oUser,TRUE);
|
|
// Give the player a visual effect
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_HOLY_AID),oUser);
|
|
|
|
// Make it so that we know they have learned at least one technique of this type
|
|
string sType=GetSubString(sTag,7,3);
|
|
|
|
// Should give us gau, clo, rin, arm or wep or fod
|
|
SetLocalInt(oModule,sType,TRUE);
|
|
|
|
}
|
|
|
|
int KnowsAnyTechnique(object oPC, int nTechnique)
|
|
{
|
|
int nReturn=FALSE;
|
|
object oModule=GetItemPossessedBy(oPC,"jw_crafting_gem");
|
|
|
|
if (nTechnique==TECHNIQUE_GAUNTLETS&&GetLocalInt(oModule,"gau")==TRUE)
|
|
{
|
|
nReturn=TRUE;
|
|
}
|
|
if (nTechnique==TECHNIQUE_CLOTHING&&GetLocalInt(oModule,"clo")==TRUE)
|
|
{
|
|
nReturn=TRUE;
|
|
}
|
|
if (nTechnique==TECHNIQUE_RINGAMULET&&GetLocalInt(oModule,"rin")==TRUE)
|
|
{
|
|
nReturn=TRUE;
|
|
}
|
|
if (nTechnique==TECHNIQUE_ARMOUR&&GetLocalInt(oModule,"arm")==TRUE)
|
|
{
|
|
nReturn=TRUE;
|
|
}
|
|
if (nTechnique==TECHNIQUE_WEAPON&&GetLocalInt(oModule,"wep")==TRUE)
|
|
{
|
|
nReturn=TRUE;
|
|
}
|
|
if (nTechnique==TECHNIQUE_FOOD&&GetLocalInt(oModule,"fod")==TRUE)
|
|
{
|
|
nReturn=TRUE;
|
|
}
|
|
return nReturn;
|
|
}
|
|
|
|
int CheckDevice(object oPC, int nDoing)
|
|
{
|
|
// We need to check whether the PC is close to the relevant device
|
|
string sDevice;
|
|
|
|
object oDevice;
|
|
|
|
switch (nDoing)
|
|
{
|
|
case TECHNIQUE_GAUNTLETS: sDevice="jw_gaunt_dev";
|
|
break;
|
|
case TECHNIQUE_CLOTHING: sDevice="jw_cloth_dev";
|
|
break;
|
|
case TECHNIQUE_RINGAMULET: sDevice="jw_ring_dev";
|
|
break;
|
|
case TECHNIQUE_WEAPON: sDevice="jw_weapon_dev";
|
|
break;
|
|
case TECHNIQUE_ARMOUR: sDevice="jw_arm_dev";
|
|
break;
|
|
case TECHNIQUE_FOOD: sDevice="jw_fod_dev";
|
|
break;
|
|
}
|
|
|
|
oDevice=GetNearestObjectByTag(sDevice,oPC);
|
|
if (!GetIsObjectValid(oDevice))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
float fDistance=GetDistanceBetween(oPC,oDevice);
|
|
if (fDistance<0.0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (fDistance>7.0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
string BuildTechName (int nDoing, int nCurrent)
|
|
{
|
|
string sName;
|
|
|
|
string sTechStart;
|
|
|
|
switch (nDoing)
|
|
{
|
|
case TECHNIQUE_GAUNTLETS: sTechStart="jw_pat_gau_";
|
|
break;
|
|
case TECHNIQUE_CLOTHING: sTechStart="jw_pat_clo_";
|
|
break;
|
|
case TECHNIQUE_RINGAMULET: sTechStart="jw_pat_rin_";
|
|
break;
|
|
case TECHNIQUE_WEAPON: sTechStart="jw_pat_wep_";
|
|
break;
|
|
case TECHNIQUE_ARMOUR: sTechStart="jw_pat_arm_";
|
|
break;
|
|
case TECHNIQUE_FOOD: sTechStart="jw_pat_fod_";
|
|
break;
|
|
}
|
|
|
|
string sTechEnd=IntToString(nCurrent);
|
|
if (GetStringLength(sTechEnd)==1)
|
|
{
|
|
sTechEnd="00"+sTechEnd;
|
|
}
|
|
else if (GetStringLength(sTechEnd)==2)
|
|
{
|
|
sTechEnd="0"+sTechEnd;
|
|
}
|
|
sName=sTechStart+sTechEnd;
|
|
|
|
return sName;
|
|
}
|
|
|
|
void BDSetDescription(int nDoing, int nCurrent)
|
|
{
|
|
|
|
SetCustomToken(2013,"description not yet implemented");
|
|
}
|
|
|
|
string TagExtraReg1 (int nPattern)
|
|
{
|
|
|
|
string sReturn;
|
|
|
|
|
|
sReturn="rare1_"+IntToString(nPattern);
|
|
object oReg=GetObjectByTag(sReturn);
|
|
if (!GetIsObjectValid(oReg))
|
|
{
|
|
sReturn="";
|
|
}
|
|
|
|
|
|
return sReturn;
|
|
}
|
|
|
|
string TagExtraReg2 (int nPattern)
|
|
{
|
|
|
|
string sReturn;
|
|
|
|
|
|
sReturn="rare2_"+IntToString(nPattern);
|
|
object oReg=GetObjectByTag(sReturn);
|
|
if (!GetIsObjectValid(oReg))
|
|
{
|
|
sReturn="";
|
|
}
|
|
|
|
return sReturn;
|
|
}
|
|
|
|
void DoEnchantmentGraphics(object oPC, int nDoing)
|
|
{
|
|
// We need to check whether the PC is close to the relevant device
|
|
string sDevice;
|
|
int nGlow;
|
|
object oDevice;
|
|
string sSound;
|
|
|
|
switch (nDoing)
|
|
{
|
|
case TECHNIQUE_GAUNTLETS: sDevice="jw_gaunt_dev";
|
|
nGlow=VFX_DUR_GLOW_ORANGE;
|
|
sSound="sco_mehedevil01";
|
|
break;
|
|
case TECHNIQUE_CLOTHING: sDevice="jw_cloth_dev";
|
|
nGlow=VFX_DUR_GLOW_RED;
|
|
sSound="sco_mehanmind02";
|
|
break;
|
|
case TECHNIQUE_RINGAMULET: sDevice="jw_ring_dev";
|
|
nGlow=VFX_DUR_GLOW_WHITE;
|
|
sSound="sco_mehedsonc01";
|
|
break;
|
|
case TECHNIQUE_WEAPON: sDevice="jw_weapon_dev";
|
|
nGlow=VFX_DUR_GLOW_PURPLE;
|
|
sSound="sco_mebalodd01";
|
|
break;
|
|
case TECHNIQUE_ARMOUR: sDevice="jw_arm_dev";
|
|
nGlow=VFX_DUR_GLOW_YELLOW;
|
|
sSound="sco_lgupelec01";
|
|
break;
|
|
case TECHNIQUE_FOOD: sDevice="jw_fod_dev";
|
|
nGlow=VFX_DUR_INFERNO_NO_SOUND; // This tells it to make a flame instead and not to make the PC effect
|
|
sSound="al_cv_firecamp1";
|
|
break;
|
|
}
|
|
|
|
oDevice=GetNearestObjectByTag(sDevice,oPC);
|
|
|
|
AssignCommand(oPC,SetFacingPoint(GetPosition(oDevice)));
|
|
if (nGlow==VFX_DUR_INFERNO_NO_SOUND)
|
|
{
|
|
DropFlame(GetLocation(oDevice));
|
|
}
|
|
else
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectVisualEffect(nGlow),oDevice,6.0);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_POLYMORPH),oPC);
|
|
}
|
|
AssignCommand(oDevice,PlaySound(sSound));
|
|
//ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectBeam(nBeam,oDevice,BODY_NODE_CHEST),oPC,2.0);
|
|
}
|
|
|
|
|
|
string GetFoodType (int nPattern)
|
|
{
|
|
// Default is deer
|
|
string sString = "jw_meat_deer";
|
|
|
|
// lion
|
|
if (nPattern==13||nPattern==14||nPattern==19||nPattern==50||nPattern==81||nPattern==82||nPattern==84||
|
|
nPattern==53||nPattern==60||nPattern==77||nPattern==86)
|
|
{
|
|
sString="jw_meat_lion";
|
|
}
|
|
else
|
|
// polar bear
|
|
if (nPattern==25||nPattern==28||nPattern==35||nPattern==97||nPattern==23||nPattern==29||nPattern==45||
|
|
nPattern==46||nPattern==54||nPattern==83||nPattern==90)
|
|
{
|
|
sString="jw_meat_polar";
|
|
}
|
|
else
|
|
// deep rothe
|
|
if (nPattern==42||nPattern==15||nPattern==27||nPattern==30||nPattern==43||nPattern==75||nPattern==85||
|
|
nPattern==89||nPattern==92||nPattern==99||nPattern==101)
|
|
{
|
|
sString="jw_meat_rothe";
|
|
}
|
|
else
|
|
// desert cougar
|
|
if (nPattern==22||nPattern==49||nPattern==88||nPattern==39||nPattern==51||nPattern==57||nPattern==58||
|
|
nPattern==78)
|
|
{
|
|
sString="jw_meat_coug";
|
|
}
|
|
|
|
return sString;
|
|
}
|
|
|
|
int GetMiscClothType (int nPattern)
|
|
{
|
|
// Default is belt
|
|
int nReturn=BASE_ITEM_BELT;
|
|
|
|
// cloak
|
|
if (nPattern==7||nPattern==14||nPattern==21||nPattern==28||nPattern==37||nPattern==41||nPattern==49||
|
|
nPattern==15||nPattern==29||nPattern==39||nPattern==51||nPattern==54||nPattern==58||nPattern==75||
|
|
nPattern==31||nPattern==59||nPattern==61||nPattern==87||
|
|
nPattern==7)
|
|
{
|
|
nReturn=BASE_ITEM_CLOAK;
|
|
}
|
|
else
|
|
// boots
|
|
if (nPattern==11||nPattern==25||nPattern==35||nPattern==38||nPattern==42||nPattern==23||nPattern==45||
|
|
nPattern==53||nPattern==57||nPattern==60||nPattern==47||nPattern==62||nPattern==79||nPattern==95)
|
|
{
|
|
nReturn=BASE_ITEM_BOOTS;
|
|
}
|
|
return nReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
void JumpToEnemy(object oEnemy, int nVis=VFX_FNF_SUMMON_UNDEAD)
|
|
{
|
|
|
|
object oTargetVictim = oEnemy;
|
|
|
|
// * won't jump if closer than 4 meters to victim
|
|
if ((GetDistanceToObject(oTargetVictim) > 4.0) && (GetObjectSeen(oTargetVictim) == TRUE))
|
|
{
|
|
ClearAllActions();
|
|
effect eVis = EffectVisualEffect(nVis);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
|
|
|
|
// SpeakString("Jump to " + GetName(oTargetVictim));
|
|
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF));
|
|
DelayCommand(0.3,ActionJumpToObject(oTargetVictim));
|
|
DelayCommand(0.5,ActionAttack(oTargetVictim));
|
|
}
|
|
}
|
|
|
|
|
|
void DeathExplode(int nDamage = 8, int nInitialVFX = VFX_FNF_FIREBALL, int nDamageVFX = VFX_IMP_FLAME_M, int nDamageType = DAMAGE_TYPE_FIRE, int nSaveType= SAVING_THROW_TYPE_FIRE, int nSaveDC = 15, float fRadius = 10.0)
|
|
{
|
|
//Declare major variables
|
|
object oCaster = OBJECT_SELF;
|
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
|
int nDamageBase=nDamage;
|
|
|
|
float fDelay;
|
|
location llocation = GetLocation(OBJECT_SELF);
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(nInitialVFX), llocation);
|
|
|
|
effect eVis = EffectVisualEffect(nDamageVFX);
|
|
effect eDam;
|
|
//Get the spell target location as opposed to the spell target.
|
|
location lTarget = GetLocation(OBJECT_SELF);
|
|
//Limit Caster level for the purposes of damage
|
|
//Apply the fireball explosion at the location captured above.
|
|
|
|
///Declare the spell shape, size and the location. Capture the first target object in the shape.
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, fRadius, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR);
|
|
//Cycle through the targets within the spell shape until an invalid object is captured.
|
|
while (GetIsObjectValid(oTarget))
|
|
{
|
|
if(GetIsReactionTypeHostile(oTarget))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_ICE_STORM));
|
|
//Get the distance between the explosion and the target to calculate delay
|
|
fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
|
|
|
|
//Adjust the damage based on the Reflex Save, Evasion and Improved Evasion.
|
|
nDamage = PRCGetReflexAdjustedDamage(nDamageBase, oTarget, nSaveDC, nSaveType);
|
|
//Set the damage effect
|
|
eDam = EffectDamage(nDamage, nDamageType);
|
|
if(nDamage > 0)
|
|
{
|
|
// Apply effects to the currently selected target.
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget));
|
|
//This visual effect is applied to the target object not the location as above. This visual effect
|
|
//represents the flame that erupts on the target not on the ground.
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
|
|
}
|
|
}
|
|
|
|
//Select the next target within the spell shape.
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, fRadius, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR);
|
|
}
|
|
}
|
|
|
|
|
|
void deathcascade(object oTarget)
|
|
{
|
|
//Declare major variables
|
|
int nCasterLevel = 6;
|
|
int nDamage = d6(nCasterLevel);
|
|
int nDamStrike;
|
|
int nNumAffected = 0;
|
|
//Declare lightning effect connected the casters hands
|
|
effect eLightning = EffectBeam(VFX_BEAM_FIRE, OBJECT_SELF, BODY_NODE_HAND);;
|
|
effect eVis = EffectVisualEffect(VFX_IMP_FLAME_S);
|
|
effect eDamage;
|
|
object oFirstTarget = oTarget;
|
|
object oHolder;
|
|
object oTarget;
|
|
location lSpellLocation;
|
|
//Damage the initial target
|
|
if(!GetIsReactionTypeFriendly(oFirstTarget,OBJECT_SELF))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oFirstTarget, EventSpellCastAt(OBJECT_SELF, SPELL_CHAIN_LIGHTNING));
|
|
//Make an SR Check
|
|
|
|
//Adjust damage via Reflex Save or Evasion or Improved Evasion
|
|
nDamStrike = PRCGetReflexAdjustedDamage(nDamage, oFirstTarget, 24, SAVING_THROW_TYPE_FIRE);
|
|
//Set the damage effect for the first target
|
|
eDamage = EffectDamage(nDamStrike, DAMAGE_TYPE_FIRE);
|
|
//Apply damage to the first target and the VFX impact.
|
|
if(nDamStrike > 0)
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oFirstTarget);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oFirstTarget);
|
|
}
|
|
|
|
}
|
|
//Apply the lightning stream effect to the first target, connecting it with the caster
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLightning,oFirstTarget,0.5);
|
|
//Reinitialize the lightning effect so that it travels from the first target to the next target
|
|
eLightning = EffectBeam(VFX_BEAM_FIRE, oFirstTarget, BODY_NODE_CHEST);
|
|
//Halve the damage for all secondary targets beyond the first.
|
|
// eDamage = EffectDamage(nDamage/2, DAMAGE_TYPE_ELECTRICAL);
|
|
float fDelay = 0.2;
|
|
int nCnt;
|
|
//Get the first target in the spell shape
|
|
oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oFirstTarget), TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
|
while (GetIsObjectValid(oTarget) && nCnt < nCasterLevel)
|
|
{
|
|
//Make sure the caster's faction is not hit and the first target is not hit
|
|
if (oTarget != oFirstTarget && !GetIsReactionTypeFriendly(oTarget) && oTarget != OBJECT_SELF)
|
|
{
|
|
//Connect the new lightning stream to the older target and the new target
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLightning,oTarget,0.5));
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_CHAIN_LIGHTNING));
|
|
//Do an SR check
|
|
|
|
nDamage = d6(nCasterLevel);
|
|
|
|
//Adjust damage via Reflex Save or Evasion or Improved Evasion
|
|
nDamStrike = PRCGetReflexAdjustedDamage(nDamage, oTarget, 24, SAVING_THROW_TYPE_FIRE);
|
|
//Apply the damage and VFX impact to the current target
|
|
eDamage = EffectDamage(nDamStrike, DAMAGE_TYPE_FIRE);
|
|
if(nDamStrike > 0) //age > 0)
|
|
{
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oTarget));
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget));
|
|
}
|
|
|
|
oHolder = oTarget;
|
|
//change the currect holder of the lightning stream to the current target
|
|
eLightning = EffectBeam(VFX_BEAM_FIRE, oHolder, BODY_NODE_CHEST);
|
|
fDelay = fDelay + 0.1f;
|
|
}
|
|
//Count the number of targets that have been hit.
|
|
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
|
|
{
|
|
nCnt++;
|
|
}
|
|
//Get the next target in the shape.
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oFirstTarget), TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
|
}
|
|
}
|
|
|
|
void DiseaseExplode(int nDisease=DISEASE_SOLDIER_SHAKES)
|
|
{
|
|
location llocation = GetLocation(OBJECT_SELF);
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PULSE_NATURE), llocation);
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DISEASE_S), llocation);
|
|
|
|
object oCaster = OBJECT_SELF;
|
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
|
int nDamage;
|
|
float fDelay;
|
|
effect eCon = EffectDisease(nDisease);
|
|
effect eTest;
|
|
eCon = ExtraordinaryEffect(eCon);
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
|
//effect eDis = EffectVisualEffect(VFX_IMP_DISEASE_S);
|
|
effect eLink = EffectLinkEffects(eCon, eDur);
|
|
//eLink = EffectLinkEffects(eDis, eDur);
|
|
//Get the spell target location as opposed to the spell target.
|
|
location lTarget = GetLocation(OBJECT_SELF);
|
|
//Limit Caster level for the purposes of damage
|
|
//Apply the fireball explosion at the location captured above.
|
|
///Declare the spell shape, size and the location. Capture the first target object in the shape.
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR);
|
|
//Cycle through the targets within the spell shape until an invalid object is captured.
|
|
while (GetIsObjectValid(oTarget))
|
|
{
|
|
if(GetIsReactionTypeHostile(oTarget))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(oTarget, SPELL_CONTAGION));
|
|
//Get the distance between the explosion and the target to calculate delay
|
|
fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget));
|
|
}
|
|
//Select the next target within the spell shape.
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR);
|
|
}
|
|
}
|
|
|
|
void PoisonExplode(int nPoison=POISON_BLACK_LOTUS_EXTRACT)
|
|
{
|
|
location llocation = GetLocation(OBJECT_SELF);
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PULSE_WIND), llocation);
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POISON_S), llocation);
|
|
|
|
object oCaster = OBJECT_SELF;
|
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
|
int nDamage;
|
|
float fDelay;
|
|
effect eCon = EffectPoison(nPoison);
|
|
effect eTest;
|
|
eCon = ExtraordinaryEffect(eCon);
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
|
//effect eDis = EffectVisualEffect(VFX_IMP_DISEASE_S);
|
|
effect eLink = EffectLinkEffects(eCon, eDur);
|
|
//eLink = EffectLinkEffects(eDis, eDur);
|
|
//Get the spell target location as opposed to the spell target.
|
|
location lTarget = GetLocation(OBJECT_SELF);
|
|
//Limit Caster level for the purposes of damage
|
|
//Apply the fireball explosion at the location captured above.
|
|
///Declare the spell shape, size and the location. Capture the first target object in the shape.
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR);
|
|
//Cycle through the targets within the spell shape until an invalid object is captured.
|
|
while (GetIsObjectValid(oTarget))
|
|
{
|
|
if(GetIsReactionTypeHostile(oTarget))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(oTarget, SPELL_POISON));
|
|
//Get the distance between the explosion and the target to calculate delay
|
|
fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget));
|
|
}
|
|
//Select the next target within the spell shape.
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR);
|
|
}
|
|
}
|
|
|
|
void ZapTargets(int nBeam=VFX_BEAM_EVIL, int nDamage = 12, int nDC = 24, int nDamageType=DAMAGE_TYPE_NEGATIVE)
|
|
{
|
|
effect e = EffectBeam(nBeam, OBJECT_SELF, BODY_NODE_HAND);
|
|
effect eDam;
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF), TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
|
int nDamage;
|
|
|
|
while (GetIsObjectValid(oTarget))
|
|
{
|
|
if (!GetPlotFlag(oTarget)&&(!GetIsFriend(oTarget)))
|
|
{
|
|
|
|
nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, nDC, SAVING_THROW_TYPE_EVIL);
|
|
eDam = EffectDamage(nDamage, nDamageType);
|
|
if(nDamage > 0 )
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, e, oTarget, 1.0);
|
|
}
|
|
}
|
|
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF), TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
|
}
|
|
}
|
|
|
|
|
|
void SpawnCreature(object oVictim, string sMob="")
|
|
{
|
|
if (sMob=="")
|
|
{
|
|
sMob=GetResRef(OBJECT_SELF);
|
|
}
|
|
|
|
if (GetIsDead(oVictim)&&(GetLocalInt(OBJECT_SELF,"spawned")!=2))
|
|
{
|
|
location lLoc=GetLocation(oVictim);
|
|
effect eVis = EffectVisualEffect(VFX_IMP_RAISE_DEAD);
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, lLoc);
|
|
object oSpawn=CreateObject(OBJECT_TYPE_CREATURE,sMob,lLoc,TRUE);
|
|
// This makes it an encounter creature
|
|
SetLocalInt(oSpawn,"norw",2);
|
|
SetLocalInt(OBJECT_SELF,"spawned",2);
|
|
}
|
|
}
|
|
|
|
void SetCrafting(object oPC, int nValue)
|
|
{
|
|
object oBox=GetItemPossessedBy(oPC,"jw_crafting_gem");
|
|
SetLocalInt(oBox,"isenchanting",nValue);
|
|
}
|
|
|
|
int GetCrafting(object oPC)
|
|
{
|
|
object oBox=GetItemPossessedBy(oPC,"jw_crafting_gem");
|
|
int nReturn=GetLocalInt(oBox,"isenchanting");
|
|
return nReturn;
|
|
}
|
|
|
|
void SetToken2010(object oPC)
|
|
{
|
|
string sString;
|
|
int nDoing=GetCrafting(oPC);
|
|
switch (nDoing)
|
|
{
|
|
case TECHNIQUE_GAUNTLETS: sString="monk's gauntlets";
|
|
break;
|
|
case TECHNIQUE_CLOTHING: sString="boots, belt or cloak";
|
|
break;
|
|
case TECHNIQUE_RINGAMULET: sString="ring or amulet";
|
|
break;
|
|
case TECHNIQUE_WEAPON: sString="weapon";
|
|
break;
|
|
case TECHNIQUE_ARMOUR: sString="armour";
|
|
break;
|
|
case TECHNIQUE_FOOD: sString="food";
|
|
break;
|
|
}
|
|
SetCustomToken(2010,sString);
|
|
}
|
|
|
|
void SetToken2016(object oPC)
|
|
{
|
|
string sString;
|
|
int nDoing=GetCrafting(oPC);
|
|
switch (nDoing)
|
|
{
|
|
case TECHNIQUE_GAUNTLETS: sString="gauntlet enchanting rune";
|
|
break;
|
|
case TECHNIQUE_CLOTHING: sString="boots, belt or cloak enchanting rune";
|
|
break;
|
|
case TECHNIQUE_RINGAMULET: sString="ring or amulet enchanting rune";
|
|
break;
|
|
case TECHNIQUE_WEAPON: sString="weapon enchanting rune";
|
|
break;
|
|
case TECHNIQUE_ARMOUR: sString="armour enchanting rune";
|
|
break;
|
|
case TECHNIQUE_FOOD: sString="oven or campfire";
|
|
break;
|
|
}
|
|
SetCustomToken(2016,sString);
|
|
}
|
|
|
|
void BonusLevels(int nBonusLevels, int nChance = 50, object oMob=OBJECT_SELF)
|
|
{
|
|
if (Random(100)+1>nChance)
|
|
{
|
|
return;
|
|
}
|
|
|
|
int nLevels=Random(nBonusLevels)+1;
|
|
int nIdx;
|
|
for (nIdx=1;nIdx<=nLevels;nIdx++)
|
|
{
|
|
LevelUpHenchman(oMob,GetClassByPosition(1,oMob),TRUE);
|
|
SendMessageToAllDMs("debug - levelling");
|
|
}
|
|
}
|
|
|
|
void WeaponPowerUp(int nLevel, object oMob=OBJECT_SELF)
|
|
{
|
|
object oWeapon=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oMob);
|
|
if (!GetIsObjectValid(oWeapon))
|
|
{
|
|
return;
|
|
}
|
|
int nRandom=Random(20)+1;
|
|
int nEffect;
|
|
|
|
// Level 4 power ups
|
|
if (nLevel==4)
|
|
{
|
|
switch (nRandom)
|
|
{
|
|
case 1: nEffect=121;
|
|
break;
|
|
case 2: nEffect=122;
|
|
break;
|
|
case 3: nEffect=124;
|
|
break;
|
|
case 4: nEffect=63;
|
|
break;
|
|
case 5: nEffect=111;
|
|
break;
|
|
case 6: nEffect=119;
|
|
break;
|
|
case 7: nEffect=123;
|
|
break;
|
|
case 8: nEffect=125;
|
|
break;
|
|
case 9: nEffect=126;
|
|
break;
|
|
case 10: nEffect=127;
|
|
break;
|
|
case 11: nEffect=31;
|
|
break;
|
|
case 12: nEffect=59;
|
|
break;
|
|
case 13: nEffect=61;
|
|
break;
|
|
case 14: nEffect=62;
|
|
break;
|
|
case 15: nEffect=79;
|
|
break;
|
|
case 16: nEffect=87;
|
|
break;
|
|
case 17: nEffect=91;
|
|
break;
|
|
case 18: nEffect=93;
|
|
break;
|
|
case 19: nEffect=94;
|
|
break;
|
|
case 20: nEffect=103;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
// Level 3 power ups
|
|
if (nLevel==3)
|
|
{
|
|
switch (nRandom)
|
|
{
|
|
case 1: nEffect=108;
|
|
break;
|
|
case 2: nEffect=113;
|
|
break;
|
|
case 3: nEffect=114;
|
|
break;
|
|
case 4: nEffect=115;
|
|
break;
|
|
case 5: nEffect=116;
|
|
break;
|
|
case 6: nEffect=31;
|
|
break;
|
|
case 7: nEffect=59;
|
|
break;
|
|
case 8: nEffect=61;
|
|
break;
|
|
case 9: nEffect=62;
|
|
break;
|
|
case 10: nEffect=79;
|
|
break;
|
|
case 11: nEffect=87;
|
|
break;
|
|
case 12: nEffect=91;
|
|
break;
|
|
case 13: nEffect=93;
|
|
break;
|
|
case 14: nEffect=94;
|
|
break;
|
|
case 15: nEffect=103;
|
|
break;
|
|
case 16: nEffect=107;
|
|
break;
|
|
case 17: nEffect=109;
|
|
break;
|
|
case 18: nEffect=110;
|
|
break;
|
|
case 19: nEffect=117;
|
|
break;
|
|
case 20: nEffect=118;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
// Level 2 power ups
|
|
if (nLevel==2)
|
|
{
|
|
switch (nRandom)
|
|
{
|
|
case 1: nEffect=100;
|
|
break;
|
|
case 2: nEffect=15;
|
|
break;
|
|
case 3: nEffect=23;
|
|
break;
|
|
case 4: nEffect=27;
|
|
break;
|
|
case 5: nEffect=29;
|
|
break;
|
|
case 6: nEffect=39;
|
|
break;
|
|
case 7: nEffect=43;
|
|
break;
|
|
case 8: nEffect=51;
|
|
break;
|
|
case 9: nEffect=53;
|
|
break;
|
|
case 10: nEffect=54;
|
|
break;
|
|
case 11: nEffect=57;
|
|
break;
|
|
case 12: nEffect=58;
|
|
break;
|
|
case 13: nEffect=89;
|
|
break;
|
|
case 14: nEffect=90;
|
|
break;
|
|
case 15: nEffect=92;
|
|
break;
|
|
case 16: nEffect=99;
|
|
break;
|
|
case 17: nEffect=101;
|
|
break;
|
|
case 18: nEffect=102;
|
|
break;
|
|
case 19: nEffect=105;
|
|
break;
|
|
case 20: nEffect=106;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
// Level 1 power ups
|
|
if (nLevel==1)
|
|
{
|
|
switch (nRandom)
|
|
{
|
|
case 1: nEffect=7;
|
|
break;
|
|
case 2: nEffect=11;
|
|
break;
|
|
case 3: nEffect=13;
|
|
break;
|
|
case 4: nEffect=14;
|
|
break;
|
|
case 5: nEffect=21;
|
|
break;
|
|
case 6: nEffect=22;
|
|
break;
|
|
case 7: nEffect=28;
|
|
break;
|
|
case 8: nEffect=35;
|
|
break;
|
|
case 9: nEffect=37;
|
|
break;
|
|
case 10: nEffect=38;
|
|
break;
|
|
case 11: nEffect=41;
|
|
break;
|
|
case 12: nEffect=73;
|
|
break;
|
|
case 13: nEffect=74;
|
|
break;
|
|
case 14: nEffect=76;
|
|
break;
|
|
case 15: nEffect=81;
|
|
break;
|
|
case 16: nEffect=82;
|
|
break;
|
|
case 17: nEffect=84;
|
|
break;
|
|
case 18: nEffect=88;
|
|
break;
|
|
case 19: nEffect=97;
|
|
break;
|
|
case 20: nEffect=98;
|
|
break;
|
|
}
|
|
}
|
|
|
|
itemproperty iProp=iWeaponProperty (nEffect);
|
|
IPSafeAddItemProperty(oWeapon,iProp,3600.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
|
}
|
|
|
|
void RepeatingVisual(int nEffect, object oMob=OBJECT_SELF)
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(nEffect),oMob);
|
|
DelayCommand(0.5,RepeatingVisual(nEffect));
|
|
}
|
|
|
|
|
|
void SpawnNewMob(string sMobResRef, int nVFX=VFX_FNF_PWSTUN, int nCopyEffects=FALSE, int nKnockdown=FALSE)
|
|
{
|
|
location llocation = GetLocation(OBJECT_SELF);
|
|
if (nVFX!=0)
|
|
{
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(nVFX), llocation);
|
|
}
|
|
object oNew=CreateObject(OBJECT_TYPE_CREATURE, sMobResRef, llocation, FALSE);
|
|
SetLocalInt(oNew,"norw",2);
|
|
|
|
if (nKnockdown==TRUE)
|
|
{
|
|
effect eKnockdwn = ExtraordinaryEffect(EffectKnockdown());
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnockdwn, oNew, 1.0);
|
|
}
|
|
|
|
if (nCopyEffects==TRUE)
|
|
{
|
|
effect eEffect=GetFirstEffect(OBJECT_SELF);
|
|
while (GetIsEffectValid(eEffect))
|
|
{
|
|
ApplyEffectToObject(GetEffectDurationType(eEffect),eEffect,oNew,60.0);
|
|
eEffect=GetNextEffect(OBJECT_SELF);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void UnequipPlayer(object oPlayer, int nHandsOnly = TRUE)
|
|
{
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_LEFTHAND)));
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND)));
|
|
if (nHandsOnly == FALSE)
|
|
{
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_ARMS, oPlayer)));
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_ARROWS, oPlayer)));
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_BELT, oPlayer)));
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_BOLTS, oPlayer)));
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_BOOTS, oPlayer)));
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_BULLETS, oPlayer)));
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_CHEST, oPlayer)));
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_CLOAK, oPlayer)));
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_HEAD, oPlayer)));
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_LEFTRING, oPlayer)));
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_NECK, oPlayer)));
|
|
AssignCommand(oPlayer, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oPlayer)));
|
|
}
|
|
}
|
|
|
|
void SetDeathState(object oRespawner, int nState)
|
|
{
|
|
object oModule=GetItemPossessedBy(oRespawner,"jw_crafting_gem");
|
|
SetLocalInt(oModule,"deathstate",nState);
|
|
|
|
}
|
|
|
|
int GetDeathState(object oRespawner)
|
|
{
|
|
object oModule=GetItemPossessedBy(oRespawner,"jw_crafting_gem");
|
|
int nState=GetLocalInt(oModule,"deathstate");
|
|
return nState;
|
|
}
|
|
|
|
void SetModuleDeathState(int nState)
|
|
{
|
|
SetLocalInt(GetModule(),"moduledeathstate",nState);
|
|
|
|
}
|
|
|
|
int GetModuleDeathState()
|
|
{
|
|
int nState=GetLocalInt(GetModule(),"moduledeathstate");
|
|
return nState;
|
|
}
|
|
|
|
int GetNumberEnchantments(object oItem)
|
|
{
|
|
int nReturn=0;
|
|
itemproperty iProp=GetFirstItemProperty(oItem);
|
|
while (GetIsItemPropertyValid(iProp))
|
|
{
|
|
nReturn=nReturn+1;
|
|
iProp=GetNextItemProperty(oItem);
|
|
}
|
|
|
|
return nReturn;
|
|
}
|
|
|
|
int GetMaxEnchantments(object oItem)
|
|
{
|
|
int nReturn=0;
|
|
string sTag=GetTag(oItem);
|
|
|
|
// Meat
|
|
if (GetStringLeft(sTag,7)=="jw_meat")
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
//anything but meat must start ccr or ctr to be allowed
|
|
if (GetStringLeft(sTag,3)!="ccr"&&GetStringLeft(sTag,3)!="ctr")
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
// Mithral || weirwood || dire bear hide || worg hide
|
|
if (FindSubString(sTag,"ad")!=-1||FindSubString(sTag,"bv")!=-1||FindSubString(sTag,"bj")!=-1||FindSubString(sTag,"bb")!=-1)
|
|
{
|
|
nReturn=3;
|
|
}
|
|
else
|
|
// Adamantine || cherry || bullet oxe hide || winter wolf hide || diamond
|
|
if (FindSubString(sTag,"ac")!=-1||FindSubString(sTag,"bu")!=-1||FindSubString(sTag,"bi")!=-1||FindSubString(sTag,"ba")!=-1||FindSubString(sTag,"by")!=-1)
|
|
{
|
|
nReturn=2;
|
|
}
|
|
else
|
|
// Lead || cedar || antelope hide || dire wolf hide || ruby
|
|
if (FindSubString(sTag,"ab")!=-1||FindSubString(sTag,"bt")!=-1||FindSubString(sTag,"bh")!=-1||FindSubString(sTag,"a0")!=-1||FindSubString(sTag,"bx")!=-1)
|
|
{
|
|
nReturn=1;
|
|
}
|
|
|
|
return nReturn;
|
|
}
|
|
|
|
object GetCraftingBox(object oPC)
|
|
{
|
|
object oBox=GetItemPossessedBy(oPC,"jw_crafting_gem");
|
|
return oBox;
|
|
}
|
|
|
|
void DecayItems()
|
|
{
|
|
object oItem;
|
|
object oStrip;
|
|
int nDecay;
|
|
int nIdx;
|
|
object oPC=GetFirstPC();
|
|
while (GetIsObjectValid(oPC))
|
|
{
|
|
if (!GetIsDM(oPC))
|
|
{
|
|
for (nIdx=0;nIdx<=18;nIdx++)
|
|
{
|
|
oItem=GetItemInSlot(nIdx,oPC);
|
|
if (GetIsDecayable(oItem))
|
|
{
|
|
nDecay=GetLocalInt(oItem,"decay");
|
|
if (nDecay<100)
|
|
{
|
|
nDecay=nDecay+1;
|
|
SetLocalInt(oItem,"decay",nDecay);
|
|
}
|
|
else
|
|
{
|
|
SendMessageToPC(oPC,"Your "+GetName(oItem)+" is worn out");
|
|
DestroyObject(oItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
oItem=GetFirstItemInInventory(oPC);
|
|
|
|
while (GetIsObjectValid(oItem))
|
|
|
|
{
|
|
oStrip=oItem;
|
|
if (GetIsDecayable(oStrip))
|
|
{
|
|
nDecay=GetLocalInt(oStrip,"decay");
|
|
if (nDecay<100)
|
|
{
|
|
nDecay=nDecay+1;
|
|
SetLocalInt(oStrip,"decay",nDecay);
|
|
}
|
|
else
|
|
{
|
|
SendMessageToPC(oPC,"Your "+GetName(oStrip)+" is worn out");
|
|
DestroyObject(oStrip);
|
|
}
|
|
}
|
|
oItem=GetNextItemInInventory(oPC);
|
|
}
|
|
}
|
|
oPC=GetNextPC();
|
|
}
|
|
|
|
}
|
|
|
|
int GetIsDecayable(object oItem)
|
|
{
|
|
itemproperty iProperty=GetFirstItemProperty(oItem);
|
|
if (!GetIsItemPropertyValid(iProperty))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (GetPlotFlag(oItem)==TRUE)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
int nBase=GetBaseItemType(oItem);
|
|
|
|
if (nBase==BASE_ITEM_AMULET||nBase==BASE_ITEM_ARMOR||nBase==BASE_ITEM_BELT||nBase==BASE_ITEM_BOOTS||
|
|
nBase==BASE_ITEM_BRACER||nBase==BASE_ITEM_CLOAK||nBase==BASE_ITEM_GLOVES||nBase==BASE_ITEM_RING)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
if (IPGetIsMeleeWeapon(oItem))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
if (IPGetIsRangedWeapon(oItem))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|