#include "x2_inc_itemprop"
#include "nw_i0_generic"

//////////////////////////////////////////////////////////
//: Constants
//:
//:note* See line 2782 of "sd_lootsystem" for specific item droprate configuration

const int LUCK_CHANCE = 5000; // 1 in x chance getting a much better item (0 for off)
const int DROP_RATE = 4;      // % chance or loot drop
const int CHANCE_WORN = 15;   // % chance of worn item (0 for off)
const int CHANCE_BROKEN = 5;  // % chance of broken item (0 for off)
const int CHANCE_WFOCUS = 20; // % chance of weapon drop based on weap focus

// Generates a random weapon
// =======================================
// oMob = the creature that just died
// oSack = the object into which you will spawn the weapon
// iRange = the quality of the weapon: 1=lowest 5=highest
// SockChance = a % chance for the generated weapon to be socketed
// DamBroke = a switch to disable chance of damaged/broken weapon: 0=on 1=off
void DropWeapon(object oMob, object oSack, int iRange, int SockChance, int DamBroke);

// Generates random chest armor
// =======================================
// oMob = the creature that just died
// oSack = the object into which you will spawn the armor
// iRange = the quality of the armor: 1=lowest 5=highest
// SockChance = a % chance for the generated armor to be socketed
// DamBroke = a switch to disable chance of damaged/broken armor: 0=on 1=off
void DropArmor(object oMob, object oSack, int iRange, int SockChance, int DamBroke);

// Generates a random shield
// =======================================
// oMob = the creature that just died
// oSack = the object into which you will spawn the shield
// iRange = the quality of the shield: 1=lowest 5=highest
// SockChance = a % chance for the generated shield to be socketed
// DamBroke = a switch to disable chance of damaged/broken shield: 0=on 1=off
void DropShield(object oMob, object oSack, int iRange, int SockChance, int DamBroke);

// Generates random monk gloves
// =======================================
// oMob = the creature that just died
// oSack = the object into which you will spawn the gloves
// iRange = the quality of the gloves: 1=lowest 5=highest
// SockChance = a % chance for the generated gloves to be socketed
// DamBroke = a switch to disable chance of damaged/broken gloves: 0=on 1=off
void DropMonkGloves(object oMob, object oSack, int iRange, int SockChance, int DamBroke);

// Generates a random magic item (i.e. boots, helm, amulet, ring, belt, bracer)
// ============================================================================
// oMob = the creature that just died
// oSack = the object into which you will spawn the item
// iRange = the quality of the item: 1=lowest 5=highest
// SockChance = a % chance for the generated item to be socketed
// DamBroke = a switch to disable chance of damaged/broken item: 0=on 1=off
void DropMagicItem(object oMob, object oSack, int iRange, int SockChance, int DamBroke);

// Generates a random socket gem
// =======================================
// oMob = the creature that just died
// oSack = the object into which you will spawn the gem
// iRange = the quality of the gem: 1=lowest 5=highest
void DropGem(object oMob, object oSack, int iRange);

// Generates random ranged ammo (only arrows & bolts)
// ==================================================
// oMob = the creature that just died
// oSack = the object into which you will spawn the ammo
// iRange = the quality of the ammo: 1=lowest 5=highest
void DropAmmo(object oMob, object oSack, int iRange);

// Generates a random scroll
// =======================================
// oMob = the creature that just died
// oSack = the object into which you will spawn the scroll
// iRange = the quality of the scroll: 1=lowest 5=highest
// note* this is based on the gold-value of the scroll
void DropScroll(object oMob, object oSack, int iRange);

// Generates a random potion
// =======================================
// oMob = the creature that just died
// oSack = the object into which you will spawn the potion
// iStack = Stacksize
void DropPot(object oMob, object oSack, int iStack);

// Generates a random misc item (i.e. bag)
// =======================================
// oMob = the creature that just died
// oSack = the object into which you will spawn the misc
void DropMisc(object oMob, object oSack);

// Generates a random rod or wand
// =======================================
// oMob = the creature that just died
// oSack = the object into which you will spawn the rod or wand
void DropRodWand(object oMob, object oSack);

// Generates random gold
// ==================================================
// oMob = the creature that just died
// note* the gold amount will be based on the creature's level using the below formula
// Gold = (d20()*Creature LVL)+(15*Creature LVL)+iBonus
// oSack = the object into which you will spawn the ammo
// iBonus = additional gold to be added to the tally
void DropGold(object oMob, object oSack, int iBonus);

// Drop randomly chosen and generated loot & some gold
// ===================================================
// *This is the main call function of the sd lootsystem
// oMob = the creature that just died (the loot dropped is based on their class & level)
// oSack = the object into which you will spawn the loot
void sd_droploot (object oMob, object oSack);

// Generates a random alchemy recipe
// =======================================
// oMob = the creature that just died
// oSack = the object into which you will spawn the recipe
// iRange = the quality of the item: 1=lowest 5=highest
void DropAlchemyRecipe(object oMob, object oSack, int iRange);





const string COLORTOKEN ="                  ##################$%&'()*+,-./0123456789:;;==?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[[]^_`abcdefghijklmnopqrstuvwxyz{|}~~��������������������������������������������������������������������������������������������������������������������������������";

string ColorString(string sText, int nRed=255, int nGreen=255, int nBlue=255)
{
    return "<c" + GetSubString(COLORTOKEN, nRed, 1) + GetSubString(COLORTOKEN, nGreen, 1) + GetSubString(COLORTOKEN, nBlue, 1) + ">" + sText + "</c>";
}

void SetQuality(object oItem, string sIName, int iQual)
{
 string sName;
 switch(iQual)
       {
        case 0: sName = ColorString("Inferior "+sIName,255, 255, 255); break;
        case 1: sName = ColorString("Superior "+sIName,255, 255, 255); break;
        case 2: sName = ColorString("Enchanted "+sIName, 0, 255, 0); break;
        case 3: sName = ColorString("Powerful "+sIName, 65, 105, 225); break;
        case 4: sName = ColorString("Champion's "+sIName, 102, 205, 170); break;
        case 5: sName = ColorString("Epic "+sIName, 128, 0, 218); break;
        case 6: sName = ColorString("Heroic "+sIName, 255, 255, 0 ); break;
        case 7: sName = ColorString("Legendary "+sIName, 218, 165, 32 ); break;
        case 8: sName = ColorString("Titan's "+sIName, 255, 0, 255 ); break;
       }
  SetName(oItem, sName);
}

void SetThreatLevel(object oMob)
{
 int iHD = GetHitDice(OBJECT_SELF);
 int iRange;
 string sName;
 string cName = GetName(oMob);

 if (iHD>0&&iHD<6)iRange=1;    // lvl 1-5
 if (iHD>5&&iHD<11)iRange=2;   // lvl 6-10
 if (iHD>10&&iHD<21)iRange=3;  // lvl 11-20
 if (iHD>20&&iHD<31)iRange=4;  // lvl 21-30
 if (iHD>30&&iHD<41)iRange=5;  // lvl 31-40

 switch(iRange)
       {
        case 1: sName = ColorString(cName,255, 255, 255); break;
        case 2: sName = ColorString(cName,189, 183, 107); break;
        case 3: sName = ColorString(cName,218, 165, 32); break;
        case 4: sName = ColorString(cName,210, 105, 30); break;
        case 5: sName = ColorString(cName,255, 0, 0); break;
       }
 if (GetLocalInt(OBJECT_SELF, "BOSS")==1)sName = ColorString(cName,255, 255, 0);
 SetName(oMob, sName);
}

void NameSack(object oSack)
{
 string sName = GetName(OBJECT_SELF);
 sName+= " Corpse";
 SetName(oSack, sName);
}

void InvClear (object oMob)
{
 object oItem = GetFirstItemInInventory(oMob);
 while (GetIsObjectValid(oItem))
       {
        if (GetPlotFlag(oItem)==FALSE)DestroyObject(oItem);
        oItem = GetNextItemInInventory(oMob);
       }
}
void LootClear (object oMob)
{
 object oItem = GetFirstItemInInventory(oMob);
 while (GetIsObjectValid(oItem))
       {
        DestroyObject(oItem);
        oItem = GetNextItemInInventory(oMob);
       }
DestroyObject(oMob);
}


void DropScroll(object oMob, object oSack, int iRange)
{
 string sType;
 int nRandom = Random(16) + 1;
 int iRoll;

 if (iRange==1)         // scrolls up to max value of 300
    {
     iRoll = d100();
     switch (iRoll)
        {
        case 1: sType = "x1_it_sparscr002";break;
        case 2: sType = "nw_it_sparscr107";break;
        case 3: sType = "x1_it_sparscr102";break;
        case 4: sType = "x1_it_spdvscr101";break;
        case 5: sType = "x2_it_spdvscr202";break;
        case 6: sType = "x2_it_spdvscr103";break;
        case 7: sType = "x2_it_spdvscr102";break;
        case 8: sType = "nw_it_sparscr211";break;
        case 9: sType = "x1_it_spdvscr202";break;
        case 10: sType = "nw_it_sparscr212";break;
        case 11: sType = "nw_it_sparscr112";break;
        case 12: sType = "x1_it_spdvscr107";break;
        case 13: sType = "nw_it_sparscr213";break;
        case 14: sType = "x2_it_sparscr207";break;
        case 15: sType = "nw_it_sparscr107";break;
        case 16: sType = "nw_it_spdvscr202";break;
        case 17: sType = "nw_it_sparscr217";break;
        case 18: sType = "x2_it_sparscr206";break;
        case 19: sType = "nw_it_sparscr110";break;
        case 20: sType = "x2_it_sparscr201";break;
        case 21: sType = "x1_it_spdvscr301";break;
        case 22: sType = "x2_it_spdvscr104";break;
        case 23: sType = "x2_it_spdvscr001";break;
        case 24: sType = "x2_it_spdvscr203";break;
        case 25: sType = "x2_it_spdvscr308";break;
        case 26: sType = "nw_it_sparscr206";break;
        case 27: sType = "nw_it_sparscr003";break;
        case 28: sType = "x2_it_spdvscr101";break;
        case 29: sType = "x2_it_sparscr202";break;
        case 30: sType = "x1_it_spdvscr102";break;
        case 31: sType = "x2_it_spdvscr105";break;
        case 32: sType = "nw_it_sparscr219";break;
        case 33: sType = "x1_it_sparscr003";break;
        case 34: sType = "nw_it_sparscr215";break;
        case 35: sType = "nw_it_sparscr101";break;
        case 36: sType = "x2_it_spdvscr106";break;
        case 37: sType = "x1_it_spdvscr103";break;
        case 38: sType = "x1_it_sparscr101";break;
        case 39: sType = "x1_it_sparscr101";break;
        case 40: sType = "x2_it_sparscr305";break;
        case 41: sType = "x1_it_spdvscr205";break;
        case 42: sType = "x2_it_sparscr205";break;
        case 43: sType = "x1_it_sparscr001";break;
        case 44: sType = "nw_it_sparscr220";break;
        case 45: sType = "x2_it_sparscr203";break;
        case 46: sType = "nw_it_sparscr208";break;
        case 47: sType = "nw_it_sparscr209";break;
        case 48: sType = "nw_it_sparscr103";break;
        case 49: sType = "x2_it_spdvscr204";break;
        case 50: sType = "nw_it_sparscr308";break;
        case 51: sType = "x2_it_sparscr101";break;
        case 52: sType = "x2_it_sparscr104";break;
        case 53: sType = "nw_it_sparscr106";break;
        case 54: sType = "x1_it_spdvscr104";break;
        case 55: sType = "x1_it_spdvscr001";break;
        case 56: sType = "x1_it_spdvscr201";break;
        case 57: sType = "nw_it_sparscr207";break;
        case 58: sType = "x2_it_sparscr102";break;
        case 59: sType = "nw_it_sparscr216";break;
        case 60: sType = "nw_it_sparscr218";break;
        case 61: sType = "nw_it_spdvscr201";break;
        case 62: sType = "nw_it_sparscr004";break;
        case 63: sType = "nw_it_sparscr104";break;
        case 64: sType = "x1_it_spdvscr106";break;
        case 65: sType = "nw_it_sparscr109";break;
        case 66: sType = "x2_it_sparscr105";break;
        case 67: sType = "nw_it_sparscr202";break;
        case 68: sType = "nw_it_sparscr113";break;
        case 69: sType = "x1_it_spdvscr203";break;
        case 70: sType = "nw_it_sparscr221";break;
        case 71: sType = "nw_it_sparscr102";break;
        case 72: sType = "x2_it_sparscral";break;
        case 73: sType = "nw_it_sparscr111";break;
        case 74: sType = "nw_it_sparscr002";break;
        case 75: sType = "x2_it_spdvscr107";break;
        case 76: sType = "x2_it_spdvscr205";break;
        case 77: sType = "nw_it_sparscr201";break;
        case 78: sType = "nw_it_sparscr001";break;
        case 79: sType = "x2_it_spdvscr108";break;
        case 80: sType = "nw_it_sparscr210";break;
        case 81: sType = "x2_it_sparscr103";break;
        case 82: sType = "x1_it_sparscr103";break;
        case 83: sType = "x1_it_spdvscr105";break;
        case 84: sType = "nw_it_spdvscr203";break;
        case 85: sType = "nw_it_sparscr108";break;
        case 86: sType = "nw_it_spdvscr204";break;
        case 87: sType = "x2_it_sparscr204";break;
        case 88: sType = "nw_it_sparscr105";break;
        case 89: sType = "nw_it_sparscr203";break;
        case 90: sType = "x1_it_sparscr202";break;
        case 91: sType = "x1_it_sparscr104";break;
        case 92: sType = "nw_it_sparscr214";break;
        case 93: sType = "x2_it_spdvscr002";break;
        case 94: sType = "nw_it_sparscr204";break;
       }
    }
 if (iRange==2)
    {
     iRoll = d100();    /// scrolls valued 540-1621
     switch (iRoll)
        {
        case 1: sType = "nw_it_sparscr509";break;
        case 2: sType = "x2_it_spdvscr508";break;
        case 3: sType = "x2_it_sparscr501";break;
        case 4: sType = "x2_it_spdvscr501";break;
        case 5: sType = "nw_it_sparscr414";break;
        case 6: sType = "x1_it_sparscr502";break;
        case 7: sType = "x2_it_spdvscr307";break;
        case 8: sType = "nw_it_sparscr405";break;
        case 9: sType = "x2_it_spdvscr504";break;
        case 10: sType = "nw_it_sparscr307";break;
        case 11: sType = "nw_it_sparscr502";break;
        case 12: sType = "nw_it_sparscr507";break;
        case 13: sType = "nw_it_sparscr406";break;
        case 14: sType = "nw_it_sparscr411";break;
        case 15: sType = "x2_it_spdvscr402";break;
        case 16: sType = "x2_it_spdvscr305";break;
        case 17: sType = "x2_it_spdvscr403";break;
        case 18: sType = "nw_it_sparscr501";break;
        case 19: sType = "nw_it_sparscr301";break;
        case 20: sType = "x1_it_sparscr301";break;
        case 21: sType = "x2_it_spdvscr404";break;
        case 22: sType = "x2_it_spdvscr309";break;
        case 23: sType = "nw_it_sparscr416";break;
        case 24: sType = "nw_it_sparscr503";break;
        case 25: sType = "nw_it_sparscr608";break;
        case 26: sType = "nw_it_sparscr418";break;
        case 27: sType = "x2_it_spdvscr509";break;
        case 28: sType = "nw_it_sparscr413";break;
        case 29: sType = "nw_it_sparscr504";break;
        case 30: sType = "nw_it_sparscr309";break;
        case 31: sType = "x1_it_sparscr501";break;
        case 32: sType = "nw_it_sparscr304";break;
        case 33: sType = "x1_it_spdvscr403";break;
        case 34: sType = "x2_it_spdvscr405";break;
        case 35: sType = "x2_it_spdvscr306";break;
        case 36: sType = "x2_it_sparscr701";break;
        case 37: sType = "nw_it_sparscr602";break;
        case 38: sType = "x1_it_spdvscr303";break;
        case 39: sType = "x2_it_sparscr304";break;
        case 40: sType = "nw_it_sparscr508";break;
        case 41: sType = "x1_it_sparscr303";break;
        case 42: sType = "x2_it_spdvscr406";break;
        case 43: sType = "nw_it_sparscr312";break;
        case 44: sType = "x2_it_spdvscr505";break;
        case 45: sType = "x2_it_spdvscr302";break;
        case 46: sType = "nw_it_sparscr505";break;
        case 47: sType = "x2_it_spdvscr401";break;
        case 48: sType = "nw_it_sparscr408";break;
        case 49: sType = "x1_it_spdvscr501";break;
        case 50: sType = "x2_it_spdvscr301";break;
        case 51: sType = "x1_it_spdvscr401";break;
        case 52: sType = "x1_it_spdvscr302";break;
        case 53: sType = "x2_it_spdvscr310";break;
        case 54: sType = "nw_it_sparscr314";break;
        case 55: sType = "x1_it_sparscr401";break;
        case 56: sType = "x2_it_sparscr303";break;
        case 57: sType = "x2_it_sparscr602";break;
        case 58: sType = "nw_it_sparscr511";break;
        case 59: sType = "nw_it_sparscr512";break;
        case 60: sType = "nw_it_sparscr417";break;
        case 61: sType = "nw_it_sparscr513";break;
        case 62: sType = "nw_it_sparscr310";break;
        case 63: sType = "nw_it_sparscr302";break;
        case 64: sType = "x2_it_sparscrmc";break;
        case 65: sType = "x2_it_spdvscr304";break;
        case 66: sType = "x1_it_spdvscr402";break;
        case 67: sType = "x2_it_sparscr301";break;
        case 68: sType = "x2_it_sparscr502";break;
        case 69: sType = "nw_it_sparscr506";break;
        case 70: sType = "nw_it_sparscr401";break;
        case 71: sType = "x2_it_spdvscr502";break;
        case 72: sType = "nw_it_sparscr315";break;
        case 73: sType = "x2_it_spdvscr311";break;
        case 74: sType = "nw_it_spdvscr402";break;
        case 75: sType = "x1_it_spdvscr502";break;
        case 76: sType = "nw_it_sparscr409";break;
        case 77: sType = "x2_it_spdvscr407";break;
        case 78: sType = "nw_it_sparscr415";break;
        case 79: sType = "x2_it_spdvscr312";break;
        case 80: sType = "x1_it_spdvscr305";break;
        case 81: sType = "nw_it_spdvscr501";break;
        case 82: sType = "nw_it_spdvscr301";break;
        case 83: sType = "nw_it_sparscr402";break;
        case 84: sType = "nw_it_spdvscr401";break;
        case 85: sType = "x2_it_sparscr302";break;
        case 86: sType = "nw_it_sparscr410";break;
        case 87: sType = "x2_it_spdvscr506";break;
        case 88: sType = "nw_it_sparscr313";break;
        case 89: sType = "x2_it_spdvscr507";break;
        case 90: sType = "x1_it_spdvscr304";break;
        case 91: sType = "nw_it_sparscr305";break;
        case 92: sType = "nw_it_sparscr403";break;
        case 93: sType = "nw_it_sparscr306";break;
        case 94: sType = "nw_it_sparscr404";break;
        case 95: sType = "nw_it_sparscr510";break;
        case 96: sType = "x2_it_sparscr902";break;
        case 97: sType = "nw_it_sparscr606";break;
        case 98: sType = "x2_it_spdvscr503";break;
        case 99: sType = "nw_it_sparscr407";break;
        case 100: sType = "x1_it_sparscr302";break;
       }
    }
 if (iRange==3)
    {
     iRoll = d100();// scrolls valued 2400-3200
     switch (iRoll)
        {
        case 1: sType = "nw_it_sparscr603";break;
        case 2: sType = "x1_it_spdvscr701";break;
        case 3: sType = "x1_it_spdvscr601";break;
        case 4: sType = "x1_it_sparscr602";break;
        case 5: sType = "x1_it_sparscr701";break;
        case 6: sType = "x2_it_spdvscr603";break;
        case 7: sType = "nw_it_sparscr607";break;
        case 8: sType = "nw_it_sparscr610";break;
        case 9: sType = "nw_it_sparscr707";break;
        case 10: sType = "x1_it_spdvscr605";break;
        case 11: sType = "x1_it_spdvscr702";break;
        case 12: sType = "x2_it_spdvscr601";break;
        case 13: sType = "nw_it_sparscr704";break;
        case 14: sType = "x1_it_spdvscr703";break;
        case 15: sType = "x1_it_sparscr601";break;
        case 16: sType = "x1_it_spdvscr604";break;
        case 17: sType = "x2_it_sparscr503";break;
        case 18: sType = "nw_it_sparscr708";break;
        case 19: sType = "x1_it_spdvscr704";break;
        case 20: sType = "x1_it_sparscr605";break;
        case 21: sType = "nw_it_sparscr601";break;
        case 22: sType = "nw_it_spdvscr701";break;
        case 23: sType = "x1_it_spdvscr602";break;
        case 24: sType = "x2_it_spdvscr606";break;
        case 25: sType = "nw_it_sparscr612";break;
        case 26: sType = "nw_it_sparscr613";break;
        case 27: sType = "x2_it_spdvscr604";break;
        case 28: sType = "x2_it_spdvscr605";break;
        case 29: sType = "x1_it_sparscr603";break;
        case 30: sType = "nw_it_sparscr611";break;
        case 31: sType = "x1_it_spdvscr603";break;
        case 32: sType = "nw_it_sparscr604";break;
        case 33: sType = "nw_it_sparscr702";break;
        case 34: sType = "nw_it_sparscr706";break;
        case 35: sType = "nw_it_sparscr802";break;
        case 36: sType = "x2_it_spdvscr702";break;
        case 37: sType = "nw_it_spdvscr702";break;
        case 38: sType = "nw_it_sparscr609";break;
        case 39: sType = "x2_it_sparscr703";break;
        case 40: sType = "nw_it_sparscr701";break;
        case 41: sType = "x1_it_sparscr604";break;
        case 42: sType = "x2_it_spdvscr602";break;
        case 43: sType = "nw_it_sparscr605";break;
        case 44: sType = "nw_it_sparscr703";break;
        case 45: sType = "x2_it_spdvscr803";break;
        case 46: sType = "nw_it_sparscr614";break;
        case 47: sType = "nw_it_sparscr614";break;
        case 48: sType = "x2_it_sparscr601";break;
        case 49: sType = "x2_it_spdvscr701";break;
        case 50: sType = "nw_it_sparscr603";break;
        case 51: sType = "x1_it_spdvscr701";break;
        case 52: sType = "x1_it_spdvscr601";break;
        case 53: sType = "x1_it_sparscr602";break;
        case 54: sType = "x1_it_sparscr701";break;
        case 55: sType = "x2_it_spdvscr603";break;
        case 56: sType = "nw_it_sparscr607";break;
        case 57: sType = "nw_it_sparscr610";break;
        case 58: sType = "nw_it_sparscr707";break;
        case 59: sType = "x1_it_spdvscr605";break;
        case 60: sType = "x1_it_spdvscr702";break;
        case 61: sType = "x2_it_spdvscr601";break;
        case 62: sType = "nw_it_sparscr704";break;
        case 63: sType = "x1_it_spdvscr703";break;
        case 64: sType = "x1_it_sparscr601";break;
        case 65: sType = "x1_it_spdvscr604";break;
        case 66: sType = "x2_it_sparscr503";break;
        case 67: sType = "nw_it_sparscr708";break;
        case 68: sType = "x1_it_spdvscr704";break;
        case 69: sType = "x1_it_sparscr605";break;
        case 70: sType = "nw_it_sparscr601";break;
        case 71: sType = "nw_it_spdvscr701";break;
        case 72: sType = "x1_it_spdvscr602";break;
        case 73: sType = "x2_it_spdvscr606";break;
        case 74: sType = "nw_it_sparscr612";break;
        case 75: sType = "nw_it_sparscr613";break;
        case 76: sType = "x2_it_spdvscr604";break;
        case 77: sType = "x2_it_spdvscr605";break;
        case 78: sType = "x1_it_sparscr603";break;
        case 79: sType = "nw_it_sparscr611";break;
        case 80: sType = "x1_it_spdvscr603";break;
        case 81: sType = "nw_it_sparscr604";break;
        case 82: sType = "nw_it_sparscr702";break;
        case 83: sType = "nw_it_sparscr706";break;
        case 84: sType = "nw_it_sparscr802";break;
        case 85: sType = "x2_it_spdvscr702";break;
        case 86: sType = "nw_it_spdvscr702";break;
        case 87: sType = "nw_it_sparscr609";break;
        case 88: sType = "x2_it_sparscr703";break;
        case 89: sType = "nw_it_sparscr701";break;
        case 90: sType = "x1_it_sparscr604";break;
        case 91: sType = "x2_it_spdvscr602";break;
        case 92: sType = "nw_it_sparscr605";break;
        case 93: sType = "nw_it_sparscr703";break;
        case 94: sType = "x2_it_spdvscr803";break;
        case 95: sType = "nw_it_sparscr614";break;
        case 96: sType = "nw_it_sparscr614";break;
        case 97: sType = "x2_it_sparscr601";break;
        case 98: sType = "x2_it_spdvscr701";break;
       }
    }
if (iRange==4||iRange==5)
    {
     iRoll = Random(40)+1;     // scrolls valued above 3200
     switch (iRoll)
        {
        case 1: sType = "nw_it_sparscr806";
        case 2: sType = "x2_it_spdvscr804";
        case 3: sType = "x1_it_sparscr801";
        case 4: sType = "x1_it_sparscr901";
        case 5: sType = "x2_it_sparscr901";
        case 6: sType = "x2_it_sparscr801";
        case 7: sType = "x1_it_spdvscr803";
        case 8: sType = "x1_it_spdvscr804";
        case 9: sType = "nw_it_sparscr905";
        case 10: sType = "x2_it_spdvscr901";
        case 11: sType = "nw_it_sparscr908";
        case 12: sType = "nw_it_sparscr902";
        case 13: sType = "nw_it_sparscr803";
        case 14: sType = "nw_it_sparscr912";
        case 15: sType = "nw_it_sparscr809";
        case 16: sType = "x2_it_spdvscr902";
        case 17: sType = "nw_it_sparscr804";
        case 18: sType = "nw_it_sparscr807";
        case 19: sType = "nw_it_sparscr806";
        case 20: sType = "x2_it_spdvscr801";
        case 21: sType = "nw_it_sparscr906";
        case 22: sType = "nw_it_sparscr801";
        case 23: sType = "nw_it_sparscr901";
        case 24: sType = "x2_it_spdvscr802";
        case 25: sType = "nw_it_sparscr903";
        case 26: sType = "nw_it_sparscr808";
        case 27: sType = "nw_it_sparscr910";
        case 28: sType = "x2_it_spdvscr903";
        case 29: sType = "nw_it_sparscr904";
        case 30: sType = "nw_it_sparscr805";
        case 31: sType = "x1_it_spdvscr802";
        case 32: sType = "nw_it_sparscr911";
        case 33: sType = "x1_it_spdvscr901";
        case 34: sType = "nw_it_sparscr909";
        case 35: sType = "nw_it_sparscr907";
        case 36: sType = "x1_it_spdvscr801";
        case 37: sType = "nw_it_sparscr906";
        case 38: sType = "nw_it_sparscr808";
        case 39: sType = "x2_it_sparscr801";
        case 40: sType = "x2_it_spdvscr804";
       }
   }

object oScroll =  CreateItemOnObject(sType, oSack, 1);
SetIdentified(oScroll, FALSE);
}

void DropAlchemyRecipe(object oMob, object oSack, int iRange)
{
 string sType;
 int iRoll;

 if (iRange==1)         //
    {
     iRoll = d10();
     switch (iRoll)
        {
        case 1: sType = "cm_alch_rec1";break;
        case 2: sType = "cm_alch_rec2";break;
        case 3: sType = "cm_alch_rec3";break;
        case 4: sType = "cm_alch_rec4";break;
        case 5: sType = "cm_alch_rec5";break;
        case 6: sType = "cm_alch_rec6";break;
        case 7: sType = "cm_alch_rec7";break;
        case 8: sType = "cm_alch_rec8";break;
        case 9: sType = "cm_alch_rec9";break;
        case 10: sType = "cm_alch_rec10";break;
       }
    }
 if (iRange==2)
    {
     iRoll = d10();    ///
     switch (iRoll)
        {
        case 1: sType = "cm_alch_rec1";break;
        case 2: sType = "cm_alch_rec2";break;
        case 3: sType = "cm_alch_rec3";break;
        case 4: sType = "cm_alch_rec4";break;
        case 5: sType = "cm_alch_rec5";break;
        case 6: sType = "cm_alch_rec6";break;
        case 7: sType = "cm_alch_rec7";break;
        case 8: sType = "cm_alch_rec8";break;
        case 9: sType = "cm_alch_rec9";break;
        case 10: sType = "cm_alch_rec10";break;
       }
    }
 if (iRange==3)
    {
     iRoll = d10();//
     switch (iRoll)
        {
        case 1: sType = "cm_alch_rec11";break;
        case 2: sType = "cm_alch_rec12";break;
        case 3: sType = "cm_alch_rec13";break;
        case 4: sType = "cm_alch_rec14";break;
        case 5: sType = "cm_alch_rec15";break;
        case 6: sType = "cm_alch_rec16";break;
        case 7: sType = "cm_alch_rec17";break;
        case 8: sType = "cm_alch_rec18";break;
        case 9: sType = "cm_alch_rec19";break;
        case 10: sType = "cm_alch_rec20";break;
       }
    }
if (iRange==4||iRange==5)
    {
     iRoll = d10();     //
     switch (iRoll)
        {
        case 1: sType = "cm_alch_rec21";break;
        case 2: sType = "cm_alch_rec22";break;
        case 3: sType = "cm_alch_rec23";break;
        case 4: sType = "cm_alch_rec24";break;
        case 5: sType = "cm_alch_rec25";break;
        case 6: sType = "cm_alch_rec26";break;
        case 7: sType = "cm_alch_rec27";break;
        case 8: sType = "cm_alch_rec28";break;
        case 9: sType = "cm_alch_rec29";break;
        case 10: sType = "cm_alch_rec30";break;
       }
   }

object oRecipe =  CreateItemOnObject(sType, oSack, 1);
SetIdentified(oRecipe, FALSE);
}

void DropPot(object oMod, object oSack, int iStack)
{
 string sPotion;

 int iDice = d10()+d10()+d10();
 switch (iDice)
        {
         case 1:sPotion = "dummy";  break;
         case 2:sPotion = "dummy";  break;
         case 3:sPotion = "nw_it_mpotion002";  break;
         case 4:sPotion = "nw_it_mpotion003";  break;
         case 5:sPotion = "nw_it_mpotion008";  break;
         case 6:sPotion = "nw_it_mpotion009";  break;
         case 7:sPotion = "nw_it_mpotion012";  break;
         case 8:sPotion = "nw_it_mpotion011";  break;
         case 9: sPotion = "nw_it_mpotion001" ; break;
         case 10: sPotion = "nw_it_mpotion002" ; break;
         case 11: sPotion = "nw_it_mpotion003" ; break;
         case 12: sPotion = "nw_it_mpotion004" ; break;
         case 13: sPotion = "nw_it_mpotion005" ; break;
         case 14: sPotion = "nw_it_mpotion006";  break;
         case 15: sPotion = "nw_it_mpotion007";  break;
         case 16: sPotion = "nw_it_mpotion008";  break;
         case 17: sPotion = "nw_it_mpotion009";  break;
         case 18: sPotion = "nw_it_mpotion010";  break;
         case 19: sPotion = "nw_it_mpotion011";  break;
         case 20: sPotion = "nw_it_mpotion012";  break;
         case 21: sPotion = "nw_it_mpotion013";  break;
         case 22: sPotion = "nw_it_mpotion014";  break;
         case 23: sPotion = "nw_it_mpotion015";  break;
         case 24: sPotion = "nw_it_mpotion016";  break;
         case 25: sPotion = "nw_it_mpotion017";  break;
         case 26: sPotion = "nw_it_mpotion018";  break;
         case 27: sPotion = "nw_it_mpotion019";  break;
         case 28: sPotion = "nw_it_mpotion020";  break;
         case 29: sPotion = "nw_it_mpotion002";  break;
         case 30: sPotion = "x2_it_mpotion001";  break;
        }
 CreateItemOnObject(sPotion, oSack, iStack);
}

void DropRodWand(object oMod, object oSack)
{
 string sType;

 int nRandom = Random(16) + 1;
 switch (nRandom)
        {
                       // rods

        case 1: sType = "nw_wmgmrd002";break;  //res
        case 2: sType = "nw_wmgmrd005";break;  //rev
        case 3: sType = "nw_wmgrd002";break;   // ghost
        case 4: sType = "nw_wmgmrd006";break;  // frost

                      // wands

        case 5: sType = "nw_wmgwn011";break;
        case 6: sType = "nw_wmgwn002";break;
        case 7: sType = "nw_wmgwn007";break;
        case 8: sType = "nw_wmgwn004";break;
        case 9: sType = "nw_wmgwn006";break;
        case 10: sType = "nw_wmgwn005";break;
        case 11: sType = "nw_wmgwn012";break;
        case 12: sType = "nw_wmgwn010";break;
        case 13: sType = "nw_wmgwn008";break;
        case 14: sType = "nw_wmgwn009";break;
        case 15: sType = "nw_wmgwn003";break;
        case 16: sType = "nw_wmgwn013";break;
        }
 CreateItemOnObject(sType, oSack, 1);
}

void DropMisc(object oMod, object oSack)
{
 string sName;

 int nDice = d10(3);
 switch (nDice)
        {
        case 1: sName = "nw_it_contain006"; break; //bag holding
        case 2: sName = "nw_it_contain005"; break;  //gmbag
        case 3: sName = "nw_it_contain003"; break;  //lmbag
        case 4: sName = "nw_it_contain004"; break;  //mbag
        case 5: sName = "nw_it_contain002"; break;  //mpouch
        case 6: sName = "nw_it_msmlmisc05"; break;  //healpearl
        case 7: sName = "nw_it_mmidmisc04"; break;  //scab bless
        case 8: sName = "x0_it_msmlmisc05"; break;  //earth elem
        case 9: sName = "x0_it_mmedmisc03"; break;  //harp
        case 10: sName = "x0_it_msmlmisc01"; break; //water elem
        case 11: sName = "x0_it_msmlmisc02"; break; //fire elem
        case 12: sName = "x0_it_mmedmisc01"; break; //shielding
        case 13: sName = "x0_it_mthnmisc21"; break; //air elem
        case 14: sName = "x0_it_mthnmisc19"; break; //bard lire
        case 15: sName = "x0_it_mthnmisc17"; break; // bard spls
        case 16: sName = "x0_it_mmedmisc02"; break; // bard spls
        case 17: sName = "x0_it_mthnmisc05"; break; // dust app
        case 18: sName = "x0_it_mthnmisc06"; break; // dust dissapp
        case 19: sName = "x0_it_mthnmisc13"; break; // sunbeam
        case 20: sName = "x0_it_mthnmisc15"; break; //
        case 21: sName = "x0_it_mthnmisc14"; break; // lath chal
        case 22: sName = "nw_it_mmidmisc01"; break; // harp charm
        case 23: sName = "nw_it_mmidmisc02"; break; // harp haunt
        case 24: sName = "nw_it_mmidmisc03"; break; // harp pand
        case 25: sName = "x0_it_msmlmisc06"; break; // horn good/evil
        case 26: sName = "x0_it_mthnmisc09"; break; //
        case 27: sName = "nw_it_contain001"; break; // box
        case 28: sName = "nw_it_contain006"; break; //bag holding
        case 29: sName = "nw_it_contain005"; break;  //gmbag
        case 30: sName = "nw_it_contain003"; break;  //lmbag
        }
 CreateItemOnObject(sName, oSack, 1);
}

void DropSetItem(object oMod, object oSack, int iClass)
{
 object oPC = GetLastKiller();
 if (oPC==OBJECT_INVALID)oPC = GetFirstPC();
 if (GetMaster(oPC)!=OBJECT_INVALID)oPC = GetMaster(oPC);

 int iDex = GetAbilityScore(oPC, ABILITY_DEXTERITY, TRUE);
 int iStr = GetAbilityScore(oPC, ABILITY_STRENGTH, TRUE);

 int iHD = GetHitDice(oPC);
 if (iHD<=9)return;

 string sName;
 int iDice;

 if (iClass==0)
    {
     if (GetLevelByClass(CLASS_TYPE_WIZARD, oPC)>=3)iClass = 2;
     if (GetLevelByClass(CLASS_TYPE_SORCERER, oPC)>=3)iClass = 3;
     if (GetLevelByClass(CLASS_TYPE_BARD, oPC)>=3)iClass = 3;
     if (GetLevelByClass(CLASS_TYPE_CLERIC, oPC)>=5)iClass = 5;
     if (GetLevelByClass(CLASS_TYPE_MONK, oPC)>=5)iClass = 10;
     if (GetLevelByClass(CLASS_TYPE_BARBARIAN, oPC)>=5)iClass = 11;
     if (GetLevelByClass(CLASS_TYPE_DRUID, oPC)>=5)iClass = 8;
     if (GetLevelByClass(CLASS_TYPE_ROGUE, oPC)>=5)iClass = 4;
     if (GetLevelByClass(CLASS_TYPE_DWARVEN_DEFENDER, oPC)>1)iClass = 11;
     if (GetLevelByClass(CLASS_TYPE_DIVINE_CHAMPION, oPC)>1)iClass = 7;
     if (GetLevelByClass(CLASS_TYPE_PALADIN, oPC)>=5)iClass = 7;
     if (GetLevelByClass(CLASS_TYPE_ARCANE_ARCHER, oPC)>1)iClass = 4;
     if (GetLevelByClass(CLASS_TYPE_FIGHTER, oPC)>=5){
         if (iStr>iDex)iClass = 1;
         else iClass = 4;
        }
      if (GetLevelByClass(CLASS_TYPE_RANGER, oPC)>5){
         if (iStr>iDex)iClass = 1;
         else iClass = 4;
        }

  }


 switch (iClass)
  {
   case 1:{        // STR Fighter Set
        iDice = d6();
        switch(iDice)
        {
        case 1: sName = "sd_fighter_s1_1"; break;
        case 2: sName = "sd_fighter_s1_2"; break;
        case 3: sName = "sd_fighter_s1_3"; break;
        case 4: sName = "sd_fighter_s1_4"; break;
        case 5: sName = "sd_fighter_s1_5"; break;
        case 6: sName = "sd_fighter_s1_6"; break;
        }}break;
   case 2:{        // Wizard Set
        iDice = d6();
        switch(iDice)
        {
        case 1: sName = "sd_wizard_s1_1"; break;
        case 2: sName = "sd_wizard_s1_2"; break;
        case 3: sName = "sd_wizard_s1_3"; break;
        case 4: sName = "sd_wizard_s1_4"; break;
        case 5: sName = "sd_wizard_s1_5"; break;
        case 6: sName = "sd_wizard_s1_6"; break;
        }}break;
   case 3:{        // Sorcerer Set
        iDice = d6();
        switch(iDice)
        {
        case 1: sName = "sd_sorc_s1_1"; break;
        case 2: sName = "sd_sorc_s1_2"; break;
        case 3: sName = "sd_sorc_s1_3"; break;
        case 4: sName = "sd_sorc_s1_4"; break;
        case 5: sName = "sd_sorc_s1_5"; break;
        case 6: sName = "sd_sorc_s1_6"; break;
        }}break;
   case 4:{        // DEX Fighter/Rogue Set
        iDice = d6();
        switch(iDice)
        {
        case 1: sName = "sd_fighter_s2_1"; break;
        case 2: sName = "sd_fighter_s2_2"; break;
        case 3: sName = "sd_fighter_s2_3"; break;
        case 4: sName = "sd_fighter_s2_4"; break;
        case 5: sName = "sd_fighter_s2_5"; break;
        case 6: sName = "sd_fighter_s2_6"; break;
        }} break;
   case 5:{        // Cleric Set
        iDice = d6();
        switch(iDice)
        {
        case 1: sName = "sd_cleric_s1_1"; break;
        case 2: sName = "sd_cleric_s1_2"; break;
        case 3: sName = "sd_cleric_s1_3"; break;
        case 4: sName = "sd_cleric_s1_4"; break;
        case 5: sName = "sd_cleric_s1_5"; break;
        case 6: sName = "sd_cleric_s1_6"; break;
        }} break;
   case 6:{        // Bard Set
        iDice = d6();
        switch(iDice)
        {
        case 1: sName = "sd_bard_s1_1"; break;
        case 2: sName = "sd_bard_s1_2"; break;
        case 3: sName = "sd_bard_s1_3"; break;
        case 4: sName = "sd_bard_s1_4"; break;
        case 5: sName = "sd_bard_s1_5"; break;
        case 6: sName = "sd_bard_s1_6"; break;
        }}break;
   case 7:{        // Paladin Set
        iDice = d6();
        switch(iDice)
        {
        case 1: sName = "sd_paladin_s1_1"; break;
        case 2: sName = "sd_paladin_s1_2"; break;
        case 3: sName = "sd_paladin_s1_3"; break;
        case 4: sName = "sd_paladin_s1_4"; break;
        case 5: sName = "sd_paladin_s1_5"; break;
        case 6: sName = "sd_paladin_s1_6"; break;
        }}break;
   case 8:{        // Druid Set
        iDice = d6();
        switch(iDice)
        {
        case 1: sName = "sd_druid_s1_1"; break;
        case 2: sName = "sd_druid_s1_2"; break;
        case 3: sName = "sd_druid_s1_3"; break;
        case 4: sName = "sd_druid_s1_4"; break;
        case 5: sName = "sd_druid_s1_5"; break;
        case 6: sName = "sd_druid_s1_6"; break;
        }}break;
   case 9:{        // Ranger Set
        iDice = d6();
        switch(iDice)
        {
        case 1: sName = "sd_ranger_s1_1"; break;
        case 2: sName = "sd_ranger_s1_2"; break;
        case 3: sName = "sd_ranger_s1_3"; break;
        case 4: sName = "sd_ranger_s1_4"; break;
        case 5: sName = "sd_ranger_s1_5"; break;
        case 6: sName = "sd_ranger_s1_6"; break;
        }}break;
   case 10:{        // Monk Set
        iDice = d6();
        switch(iDice)
        {
        case 1: sName = "sd_monk_s1_1"; break;
        case 2: sName = "sd_monk_s1_2"; break;
        case 3: sName = "sd_monk_s1_3"; break;
        case 4: sName = "sd_monk_s1_4"; break;
        case 5: sName = "sd_monk_s1_5"; break;
        case 6: sName = "sd_monk_s1_6"; break;
        }}break;
   case 11:{        // Barbarian Set
        iDice = d6();
        switch(iDice)
        {
        case 1: sName = "sd_barb_s6"; break;
        case 2: sName = "sd_barb_s1"; break;
        case 3: sName = "sd_barb_s2"; break;
        case 4: sName = "sd_barb_s3"; break;
        case 5: sName = "sd_barb_s4"; break;
        case 6: sName = "sd_barb_s5"; break;
        }}break;
   case 12:{        // Duel Weapon/Weapon & Shield Sets
        iDice = d6();
        switch(iDice)
        {
        case 1: sName = "sd_weap_s1_1"; break;
        case 2: sName = "sd_weap_s1_2"; break;
        case 3: sName = "sd_weap_s2_1"; break;
        case 4: sName = "sd_weap_s2_2"; break;
        case 5: sName = "sd_weap_s3_1"; break;
        case 6: sName = "sd_weap_s3_2"; break;
        }}break;
  }
// comming soon: Ring Sets, Ammy/Ring Sets


//////////////////////////////////////
//:Debugging
// FloatingTextStringOnCreature("Class: "+IntToString(iClass), oMod);
// FloatingTextStringOnCreature("Roll: "+IntToString(iDice), oMod);
// FloatingTextStringOnCreature(sName, oMod);

 CreateItemOnObject(sName, oSack, 1);
}



void DropGold (object oMob, object oSack, int iBonus)
{
object oPC = GetFirstPC();
string sGold, sLvl;
int iHD = GetHitDice(oMob);
int iGold = 0;

iGold = (d20()*iHD)+(15*iHD)+iBonus;

if (GetHenchman(oPC,2)!=OBJECT_INVALID)iGold+=iGold;

CreateItemOnObject("nw_it_gold001", oSack, iGold);

/////////////////////////////////////////////////////////////////////////
//Gold Debugging
//object oPC = GetFirstPC();
//sGold = IntToString(iGold);
//sLvl = IntToString(iHD);
//FloatingTextStringOnCreature(sGold+" Gold Spawned by lvl "+sLvl+" mob", oPC);
//
//
//
}

void CastImbue(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iSpell;
 int iUses;
 int iRoll;
 switch (iRange)
      {
       case 1: {
                iRoll = d8();
                if (iRoll==1)iSpell = IP_CONST_CASTSPELL_BURNING_HANDS_2;
                if (iRoll==2)iSpell = IP_CONST_CASTSPELL_BARKSKIN_3;
                if (iRoll==3)iSpell = IP_CONST_CASTSPELL_MAGE_ARMOR_2;
                if (iRoll==4)iSpell = IP_CONST_CASTSPELL_MAGIC_MISSILE_5;
                if (iRoll==5)iSpell = IP_CONST_CASTSPELL_COLOR_SPRAY_2;
                if (iRoll==6)iSpell = IP_CONST_CASTSPELL_DOOM_5;
                if (iRoll==7)iSpell = IP_CONST_CASTSPELL_ENTANGLE_5;
                if (iRoll==8)iSpell = IP_CONST_CASTSPELL_GHOSTLY_VISAGE_3;
               }break;
       case 2: {
                iRoll = d8();
                if (iRoll==1)iSpell = IP_CONST_CASTSPELL_DISPLACEMENT_9;
                if (iRoll==2)iSpell = IP_CONST_CASTSPELL_FIREBALL_10;
                if (iRoll==3)iSpell = IP_CONST_CASTSPELL_MAGIC_CIRCLE_AGAINST_ALIGNMENT_5;
                if (iRoll==4)iSpell = IP_CONST_CASTSPELL_SLAY_LIVING_9;
                if (iRoll==5)iSpell = IP_CONST_CASTSPELL_STONESKIN_7;
                if (iRoll==6)iSpell = IP_CONST_CASTSPELL_ICE_STORM_9;
                if (iRoll==7)iSpell = IP_CONST_CASTSPELL_CALL_LIGHTNING_10;
                if (iRoll==8)iSpell = IP_CONST_CASTSPELL_ISAACS_LESSER_MISSILE_STORM_13;
               }break;
       case 3: {
                iRoll = d8();
                if (iRoll==1)iSpell = IP_CONST_CASTSPELL_SUNBEAM_13;
                if (iRoll==2)iSpell = IP_CONST_CASTSPELL_CONE_OF_COLD_15;
                if (iRoll==3)iSpell = IP_CONST_CASTSPELL_MASS_HEAL_15;
                if (iRoll==4)iSpell = IP_CONST_CASTSPELL_ETHEREAL_VISAGE_15;
                if (iRoll==5)iSpell = IP_CONST_CASTSPELL_GREATER_DISPELLING_15;
                if (iRoll==6)iSpell = IP_CONST_CASTSPELL_ISAACS_GREATER_MISSILE_STORM_15;
                if (iRoll==7)iSpell = IP_CONST_CASTSPELL_CHAIN_LIGHTNING_20;
                if (iRoll==8)iSpell = IP_CONST_CASTSPELL_GREATER_STONESKIN_11;
               }break;
       case 4: {
                iRoll = d12();
                if (iRoll==1)iSpell = IP_CONST_CASTSPELL_BIGBYS_FORCEFUL_HAND_15;
                if (iRoll==2)iSpell = IP_CONST_CASTSPELL_HORRID_WILTING_20;
                if (iRoll==3)iSpell = IP_CONST_CASTSPELL_IMPLOSION_17;
                if (iRoll==4)iSpell = IP_CONST_CASTSPELL_INCENDIARY_CLOUD_15;
                if (iRoll==5)iSpell = IP_CONST_CASTSPELL_PREMONITION_15;
                if (iRoll==6)iSpell = IP_CONST_CASTSPELL_MORDENKAINENS_DISJUNCTION_17;
                if (iRoll==7)iSpell = IP_CONST_CASTSPELL_METEOR_SWARM_17;
                if (iRoll==8)iSpell = IP_CONST_CASTSPELL_ISAACS_GREATER_MISSILE_STORM_15;
                if (iRoll==9)iSpell = IP_CONST_CASTSPELL_SUNBEAM_13;
                if (iRoll==10)iSpell = IP_CONST_CASTSPELL_CONE_OF_COLD_15;
                if (iRoll==11)iSpell = IP_CONST_CASTSPELL_MASS_HEAL_15;
                if (iRoll==12)iSpell = IP_CONST_CASTSPELL_ETHEREAL_VISAGE_15;
               }break;
       case 5: {
                iRoll = d20();
                if (iRoll==1)iSpell = IP_CONST_CASTSPELL_WAIL_OF_THE_BANSHEE_17;
                if (iRoll==2)iSpell = IP_CONST_CASTSPELL_TIME_STOP_17;
                if (iRoll==3)iSpell = IP_CONST_CASTSPELL_IMPLOSION_17;
                if (iRoll==4)iSpell = IP_CONST_CASTSPELL_ISAACS_GREATER_MISSILE_STORM_15;
                if (iRoll==5)iSpell = IP_CONST_CASTSPELL_HORRID_WILTING_20;
                if (iRoll==6)iSpell = IP_CONST_CASTSPELL_MORDENKAINENS_SWORD_18;
                if (iRoll==7)iSpell = IP_CONST_CASTSPELL_MORDENKAINENS_DISJUNCTION_17;
                if (iRoll==8)iSpell = IP_CONST_CASTSPELL_MASS_HEAL_15;
                if (iRoll==9)iSpell = IP_CONST_CASTSPELL_BIGBYS_FORCEFUL_HAND_15;
                if (iRoll==10)iSpell = IP_CONST_CASTSPELL_HORRID_WILTING_20;
                if (iRoll==11)iSpell = IP_CONST_CASTSPELL_IMPLOSION_17;
                if (iRoll==12)iSpell = IP_CONST_CASTSPELL_INCENDIARY_CLOUD_15;
                if (iRoll==13)iSpell = IP_CONST_CASTSPELL_PREMONITION_15;
                if (iRoll==14)iSpell = IP_CONST_CASTSPELL_MORDENKAINENS_DISJUNCTION_17;
                if (iRoll==15)iSpell = IP_CONST_CASTSPELL_METEOR_SWARM_17;
                if (iRoll==16)iSpell = IP_CONST_CASTSPELL_ISAACS_GREATER_MISSILE_STORM_15;
                if (iRoll==17)iSpell = IP_CONST_CASTSPELL_SUNBEAM_13;
                if (iRoll==18)iSpell = IP_CONST_CASTSPELL_CONE_OF_COLD_15;
                if (iRoll==19)iSpell = IP_CONST_CASTSPELL_MASS_HEAL_15;
                if (iRoll==20)iSpell = IP_CONST_CASTSPELL_ETHEREAL_VISAGE_15;
               }break;

      }


 switch (iRange)
        {
         case 1: {iRoll = d3();
                  if (iRoll==1)iUses = IP_CONST_CASTSPELL_NUMUSES_5_CHARGES_PER_USE;
                  if (iRoll==2)iUses = IP_CONST_CASTSPELL_NUMUSES_4_CHARGES_PER_USE;
                  if (iRoll==3)iUses = IP_CONST_CASTSPELL_NUMUSES_3_CHARGES_PER_USE;
                  break; }
         case 2: {iRoll = d3();
                  if (iRoll==1)iUses = IP_CONST_CASTSPELL_NUMUSES_5_CHARGES_PER_USE;
                  if (iRoll==2)iUses = IP_CONST_CASTSPELL_NUMUSES_5_CHARGES_PER_USE;
                  if (iRoll==3)iUses = IP_CONST_CASTSPELL_NUMUSES_4_CHARGES_PER_USE;
                  break; }
         case 3: {iRoll = d3();
                  if (iRoll==1)iUses = IP_CONST_CASTSPELL_NUMUSES_4_CHARGES_PER_USE;
                  if (iRoll==2)iUses = IP_CONST_CASTSPELL_NUMUSES_3_CHARGES_PER_USE;
                  if (iRoll==3)iUses = IP_CONST_CASTSPELL_NUMUSES_2_CHARGES_PER_USE;
                  iRoll=d100();
                  if (iRoll>95)iUses = IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE;
                  break; }
         case 4: {iRoll = d3();
                  if (iRoll==1)iUses = IP_CONST_CASTSPELL_NUMUSES_1_CHARGE_PER_USE;
                  if (iRoll==2)iUses = IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY;
                  if (iRoll==3)iUses = IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY;
                  iRoll=d100();
                  if (iRoll>95)iUses = IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE;
                  break;}
         case 5: {iRoll = d3();
                  if (iRoll==1)iUses = IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY;
                  if (iRoll==2)iUses = IP_CONST_CASTSPELL_NUMUSES_4_USES_PER_DAY;
                  if (iRoll==3)iUses = IP_CONST_CASTSPELL_NUMUSES_5_USES_PER_DAY;
                  iRoll=d100();
                  if (iRoll>90)iUses = IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE;
                  break;}

        }
  ipAdd = ItemPropertyCastSpell(iSpell, iUses);
  IPSafeAddItemProperty(oItem, ipAdd);
  iRoll = (d12() * iRange)+1; if (iRoll>50)iRoll=50;
  SetItemCharges(oItem, iRoll);
}


void SpellSlot(object oItem, int iRange, int iNum)
{
 itemproperty ipAdd;
 itemproperty ipClass;
 int iLvl, i;
 int iClass;
 int iSpec;
 int iRoll;
 iRoll = d8();
 switch (iRoll)
      {
       case 1: {
                iClass = IP_CONST_CLASS_BARD; iSpec = 1;
                ipClass = ItemPropertyLimitUseByClass(IP_CONST_CLASS_BARD);
                } break;
       case 2: {
                iClass = IP_CONST_CLASS_DRUID;
                ipClass = ItemPropertyLimitUseByClass(IP_CONST_CLASS_DRUID);
                } break;
       case 3: {
                iClass = IP_CONST_CLASS_SORCERER;
                ipClass = ItemPropertyLimitUseByClass(IP_CONST_CLASS_SORCERER);
                } break;
       case 4: {
                iClass = IP_CONST_CLASS_WIZARD;
                ipClass = ItemPropertyLimitUseByClass(IP_CONST_CLASS_WIZARD);
                } break;
       case 5: {
                iClass = IP_CONST_CLASS_PALADIN; iSpec = 2;
                ipClass = ItemPropertyLimitUseByClass(IP_CONST_CLASS_PALADIN);
                } break;
       case 6: {
                iClass = IP_CONST_CLASS_RANGER; iSpec = 2;
                ipClass = ItemPropertyLimitUseByClass(IP_CONST_CLASS_RANGER);
                } break;
       case 7: {
                iClass = IP_CONST_CLASS_CLERIC;
                ipClass = ItemPropertyLimitUseByClass(IP_CONST_CLASS_CLERIC);
                } break;
       case 8: {
                iClass = IP_CONST_CLASS_WIZARD;
                ipClass = ItemPropertyLimitUseByClass(IP_CONST_CLASS_WIZARD);
                } break;
      }

 for (i = 0; i < iNum; i++)
     {
      if (iSpec==1)
         {
          switch (iRange)  // Bard max lvl 6
                 {
                  case 1: iLvl = 1; break;                          // 1
                  case 2: {iLvl = d3();if(iLvl==3)iLvl=2;}break;    // 1-2
                  case 3: {iLvl = d3()+2;if(iLvl==5)iLvl=3;}break;  // 3-4
                  case 4: {iLvl = d3()+3;if(iLvl==6)iLvl=4;}break;  // 4-5
                  case 5: {iLvl = d3()+4;if(iLvl==7)iLvl=5;}break;  // 5-6
                 }
         }
      else if (iSpec==2)
         {
          switch (iRange)  // Pally & Ranger max lvl 4
                 {
                  case 1: iLvl = 1; break;                            // 1
                  case 2: {iLvl = d3();if(iLvl==3)iLvl=2;}break;      // 1-2
                  case 3: iLvl = d3(); break;                         // 1-3
                  case 4: iLvl = d3()+1; break;                       // 2-4
                  case 5: {iLvl = d3()+2;if(iLvl==5)iLvl=3;}break;    // 3-4
                 }
        }
     else
        {
         switch (iRange)  // The rest max lvl 9
                {
                 case 1: iLvl = 1; break;                         // 1
                 case 2: iLvl = d4(); break;                      // 1-4
                 case 3: iLvl = d4()+1; break;                    // 2-5
                 case 4: iLvl = d6()+2; break;                    // 3-8
                 case 5: iLvl = d6()+4; break;                    // 5-9
                }
        }
    ipAdd = ItemPropertyBonusLevelSpell(iClass, iLvl);
    AddItemProperty(DURATION_TYPE_PERMANENT, ipAdd, oItem);
   }
 IPSafeAddItemProperty(oItem, ipClass);
}

void MightyEnhance(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iEnh = d4();

 switch (iRange)
      {
       case 1: ; break;                              // 1-4
       case 2: iEnh+=1; break;                       // 2-5
       case 3: iEnh+=2; break;                       // 3-6
       case 4: iEnh+=3; break;                       // 4-7
       case 5: iEnh+=4; break;                       // 5-8
      }
 ipAdd = ItemPropertyMaxRangeStrengthMod(iEnh);
 IPSafeAddItemProperty(oItem, ipAdd);
}

void BowEnhance(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iEnh = d3();

 switch (iRange)
      {
       case 1: if (iEnh==3)iEnh=1; break;            // 1-2
       case 2: {iEnh+=1;if (iEnh==4)iEnh=2;} break;  // 2-3
       case 3: {iEnh+=2;if (iEnh==5)iEnh=3;} break;  // 3-4
       case 4: {iEnh+=3;if (iEnh==6)iEnh=4;} break;  // 4-5
       case 5: {iEnh+=4;if (iEnh==7)iEnh=5;} break;  // 5-6
      }
 ipAdd = ItemPropertyAttackBonus(iEnh);
 IPSafeAddItemProperty(oItem, ipAdd);
}



void AmmoUnlim(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iType;
 int iDam;
 int iRoll = d12();
 switch (iRange)
        {
         case 1:
                {
                 iRoll = d3();
                 if (iRoll==1)iType = IP_CONST_UNLIMITEDAMMO_BASIC;
                 if (iRoll==2)iType = IP_CONST_UNLIMITEDAMMO_BASIC;
                 if (iRoll==3)iType = IP_CONST_UNLIMITEDAMMO_PLUS1;
                }break;
         case 2: {
                 iRoll = d4();
                 if (iRoll==1)iType = IP_CONST_UNLIMITEDAMMO_PLUS2;
                 if (iRoll==2)iType = IP_CONST_UNLIMITEDAMMO_PLUS2;
                 if (iRoll==3)iType = IP_CONST_UNLIMITEDAMMO_1D6COLD;
                 if (iRoll==4)iType = IP_CONST_UNLIMITEDAMMO_1D6LIGHT;
                }break;
         case 3: {
                 iRoll = d6();
                 if (iRoll==1)iType = IP_CONST_UNLIMITEDAMMO_PLUS2;
                 if (iRoll==2)iType = IP_CONST_UNLIMITEDAMMO_PLUS2;
                 if (iRoll==3)iType = IP_CONST_UNLIMITEDAMMO_PLUS3;
                 if (iRoll==4)iType = IP_CONST_UNLIMITEDAMMO_1D6FIRE;
                 if (iRoll==5)iType = IP_CONST_UNLIMITEDAMMO_1D6COLD;
                 if (iRoll==6)iType = IP_CONST_UNLIMITEDAMMO_1D6LIGHT;
                }break;
         case 4: {
                 iRoll = d6();
                 if (iRoll==1)iType = IP_CONST_UNLIMITEDAMMO_PLUS3;
                 if (iRoll==2)iType = IP_CONST_UNLIMITEDAMMO_PLUS4;
                 if (iRoll==3)iType = IP_CONST_UNLIMITEDAMMO_PLUS4;
                 if (iRoll==4)iType = IP_CONST_UNLIMITEDAMMO_1D6FIRE;
                 if (iRoll==5)iType = IP_CONST_UNLIMITEDAMMO_1D6COLD;
                 if (iRoll==6)iType = IP_CONST_UNLIMITEDAMMO_1D6LIGHT;
                }break;
         case 5: {
                 iRoll = d6();
                 if (iRoll==1)iType = IP_CONST_UNLIMITEDAMMO_PLUS4;
                 if (iRoll==2)iType = IP_CONST_UNLIMITEDAMMO_PLUS5;
                 if (iRoll==3)iType = IP_CONST_UNLIMITEDAMMO_PLUS5;
                 if (iRoll==4)iType = IP_CONST_UNLIMITEDAMMO_1D6FIRE;
                 if (iRoll==5)iType = IP_CONST_UNLIMITEDAMMO_1D6COLD;
                 if (iRoll==6)iType = IP_CONST_UNLIMITEDAMMO_1D6LIGHT;
                }break;
        }
ipAdd = ItemPropertyUnlimitedAmmo(iType);
 IPSafeAddItemProperty(oItem, ipAdd);
}



void AmmoEnhance(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iType;
 int iDam;
 int iRoll = d12();
 switch (iRoll)
        {
         case 1: iType = IP_CONST_DAMAGETYPE_ACID; break;
         case 2: iType = IP_CONST_DAMAGETYPE_BLUDGEONING; break;
         case 3: iType = IP_CONST_DAMAGETYPE_COLD; break;
         case 4: iType = IP_CONST_DAMAGETYPE_ELECTRICAL; break;
         case 5: iType = IP_CONST_DAMAGETYPE_FIRE; break;
         case 6: iType = IP_CONST_DAMAGETYPE_MAGICAL; break;
         case 7: iType = IP_CONST_DAMAGETYPE_NEGATIVE; break;
         case 8: iType = IP_CONST_DAMAGETYPE_DIVINE; break;
         case 9: iType = IP_CONST_DAMAGETYPE_PIERCING; break;
         case 10: iType = IP_CONST_DAMAGETYPE_POSITIVE; break;
         case 11: iType = IP_CONST_DAMAGETYPE_SLASHING; break;
         case 12: iType = IP_CONST_DAMAGETYPE_SONIC; break;
        }
 switch (iRange)
        {
         case 1: iDam = IP_CONST_DAMAGEBONUS_1; break;
         case 2: {
                iRoll = d4();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_1;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_2;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_1d4;
                if (iRoll==4)iDam = IP_CONST_DAMAGEBONUS_3;
               }break;
         case 3: {
                iRoll = d6();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_2;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_3;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_1d4;
                if (iRoll==4)iDam = IP_CONST_DAMAGEBONUS_1d6;
                if (iRoll==5)iDam = IP_CONST_DAMAGEBONUS_4;
                if (iRoll==6)iDam = IP_CONST_DAMAGEBONUS_5;
               }break;
         case 4: {
                iRoll = d8();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_3;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_1d4;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_4;
                if (iRoll==4)iDam = IP_CONST_DAMAGEBONUS_1d6;
                if (iRoll==5)iDam = IP_CONST_DAMAGEBONUS_5;
                if (iRoll==6)iDam = IP_CONST_DAMAGEBONUS_1d8;
                if (iRoll==7)iDam = IP_CONST_DAMAGEBONUS_6;
                if (iRoll==8)iDam = IP_CONST_DAMAGEBONUS_1d10;
               }break;
         case 5: {
                iRoll = d10();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_3;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_1d4;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_4;
                if (iRoll==4)iDam = IP_CONST_DAMAGEBONUS_1d6;
                if (iRoll==5)iDam = IP_CONST_DAMAGEBONUS_5;
                if (iRoll==6)iDam = IP_CONST_DAMAGEBONUS_1d8;
                if (iRoll==7)iDam = IP_CONST_DAMAGEBONUS_2d4;
                if (iRoll==8)iDam = IP_CONST_DAMAGEBONUS_6;
                if (iRoll==9)iDam = IP_CONST_DAMAGEBONUS_1d10;
                if (iRoll==10)iDam = IP_CONST_DAMAGEBONUS_7;
               }break;
      }
 ipAdd = ItemPropertyDamageBonus(iType, iDam);
 IPSafeAddItemProperty(oItem, ipAdd);
}

void WeapEnhance(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iEnh = d3();

 switch (iRange)
      {
       case 1: if (iEnh==3)iEnh=1; break;            // 1-2
       case 2: {iEnh+=1;if (iEnh==4)iEnh=2;} break;  // 2-3
       case 3: {iEnh+=2;if (iEnh==5)iEnh=3;} break;  // 3-4
       case 4: {iEnh+=3;if (iEnh==6)iEnh=4;} break;  // 4-5
       case 5: {iEnh+=4;if (iEnh==7)iEnh=5;} break;  // 5-6
      }
 ipAdd = ItemPropertyEnhancementBonus(iEnh);
 IPSafeAddItemProperty(oItem, ipAdd);
}

void RangedImbue(object oItem)
{
 itemproperty ipAdd;
 int iType;
 int iRoll = d3();

 switch (iRoll)
      {
       case 1: if (iRoll==1)iType=IP_CONST_DAMAGETYPE_BLUDGEONING; break;
       case 2: if (iRoll==2)iType=IP_CONST_DAMAGETYPE_SLASHING; break;
       case 3: if (iRoll==3)iType=IP_CONST_DAMAGETYPE_PIERCING; break;
      }
 ipAdd = ItemPropertyExtraRangeDamageType(iType);
 IPSafeAddItemProperty(oItem, ipAdd);
}

void MeleeImbue(object oItem)
{
 itemproperty ipAdd;
 int iType;
 int iRoll = d3();

 switch (iRoll)
      {
       case 1: if (iRoll==1)iType=IP_CONST_DAMAGETYPE_BLUDGEONING; break;
       case 2: if (iRoll==2)iType=IP_CONST_DAMAGETYPE_SLASHING; break;
       case 3: if (iRoll==3)iType=IP_CONST_DAMAGETYPE_PIERCING; break;
      }
 ipAdd = ItemPropertyExtraMeleeDamageType(iType);
 IPSafeAddItemProperty(oItem, ipAdd);
}

void MCimbue(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iDam;
 int iCol;
 int iType;
 int iRoll;

 switch (iRange)
      {
       case 1: {
                iRoll = d3();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_1;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_2;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_1d4;
               }break;
       case 2: {
                iRoll = d4();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_1;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_2;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_1d4;
                if (iRoll==4)iDam = IP_CONST_DAMAGEBONUS_1d6;
               }break;
       case 3: {
                iRoll = d6();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_2;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_3;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_1d4;
                if (iRoll==4)iDam = IP_CONST_DAMAGEBONUS_1d6;
                if (iRoll==5)iDam = IP_CONST_DAMAGEBONUS_4;
                if (iRoll==6)iDam = IP_CONST_DAMAGEBONUS_1d8;
               }break;
       case 4: {
                iRoll = d10();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_3;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_1d4;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_4;
                if (iRoll==4)iDam = IP_CONST_DAMAGEBONUS_1d6;
                if (iRoll==5)iDam = IP_CONST_DAMAGEBONUS_5;
                if (iRoll==6)iDam = IP_CONST_DAMAGEBONUS_1d8;
                if (iRoll==7)iDam = IP_CONST_DAMAGEBONUS_6;
                if (iRoll==8)iDam = IP_CONST_DAMAGEBONUS_2d4;
                if (iRoll==9)iDam = IP_CONST_DAMAGEBONUS_5;
                if (iRoll==10)iDam = IP_CONST_DAMAGEBONUS_1d10;
               }break;
       case 5: {
                iRoll = d12();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_3;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_1d4;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_4;
                if (iRoll==4)iDam = IP_CONST_DAMAGEBONUS_1d6;
                if (iRoll==5)iDam = IP_CONST_DAMAGEBONUS_5;
                if (iRoll==6)iDam = IP_CONST_DAMAGEBONUS_1d8;
                if (iRoll==7)iDam = IP_CONST_DAMAGEBONUS_2d4;
                if (iRoll==8)iDam = IP_CONST_DAMAGEBONUS_6;
                if (iRoll==9)iDam = IP_CONST_DAMAGEBONUS_1d10;
                if (iRoll==10)iDam = IP_CONST_DAMAGEBONUS_7;
                if (iRoll==11)iDam = IP_CONST_DAMAGEBONUS_1d12;
                if (iRoll==12)iDam = IP_CONST_DAMAGEBONUS_2d6;
               }break;
      }
 ipAdd = ItemPropertyMassiveCritical(iDam);
 IPSafeAddItemProperty(oItem, ipAdd);
}

int sd_PropCheck(object oItem, int tCode, int iSubProp)
{
 int iFlag=0;
 itemproperty ipProp = GetFirstItemProperty(oItem);
 int iMatchType, iMatchSubType;
 while (GetIsItemPropertyValid(ipProp))
       {
        iMatchType = GetItemPropertyType(ipProp);
        iMatchSubType = GetItemPropertySubType(ipProp);
        if (iMatchType == tCode && iMatchSubType == iSubProp)iFlag=1;
        ipProp = GetNextItemProperty(oItem);
       }
 if (iFlag==1)return TRUE;
 else return FALSE;
}

int sd_GetDamType()
{
 int iType;
 int iRoll = Random(13)+1;
 switch (iRoll)
      {
       case 1: iType = IP_CONST_DAMAGETYPE_ACID; break;
       case 2: iType = IP_CONST_DAMAGETYPE_BLUDGEONING; break;
       case 3: iType = IP_CONST_DAMAGETYPE_COLD; break;
       case 4: iType = IP_CONST_DAMAGETYPE_DIVINE; break;
       case 5: iType = IP_CONST_DAMAGETYPE_ELECTRICAL; break;
       case 6: iType = IP_CONST_DAMAGETYPE_FIRE; break;
       case 7: iType = IP_CONST_DAMAGETYPE_MAGICAL; break;
       case 8: iType = IP_CONST_DAMAGETYPE_NEGATIVE; break;
       case 9: iType = IP_CONST_DAMAGETYPE_PHYSICAL; break;
       case 10: iType = IP_CONST_DAMAGETYPE_PIERCING; break;
       case 11: iType = IP_CONST_DAMAGETYPE_POSITIVE; break;
       case 12: iType = IP_CONST_DAMAGETYPE_SLASHING; break;
       case 13: iType = IP_CONST_DAMAGETYPE_SONIC; break;
      }

 return iType;
}

int sd_GetAbil()
{
 int iType;
 int iRoll = d6();
 switch (iRoll)
      {
       case 1: iType = ABILITY_DEXTERITY; break;
       case 2: iType = ABILITY_INTELLIGENCE; break;
       case 3: iType = ABILITY_WISDOM; break;
       case 4: iType = ABILITY_CHARISMA; break;
       case 5: iType = ABILITY_CONSTITUTION; break;
       case 6: iType = ABILITY_STRENGTH; break;
      }

 return iType;
}

void DAMimbue(object oItem, int iRange)
{
 itemproperty ipAdd;
 itemproperty ipVis;
 int iDam, iCol, iType, iRoll;

 iType = sd_GetDamType();
 while (sd_PropCheck(oItem, 16 , iType))iType = sd_GetDamType();

 switch (iRange)
      {
       case 1: {
                iRoll = d3();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_1;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_2;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_1d4;
               }break;
       case 2: {
                iRoll = d4();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_1;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_2;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_1d4;
                if (iRoll==4)iDam = IP_CONST_DAMAGEBONUS_1d6;
               }break;
       case 3: {
                iRoll = d6();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_2;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_3;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_1d4;
                if (iRoll==4)iDam = IP_CONST_DAMAGEBONUS_1d6;
                if (iRoll==5)iDam = IP_CONST_DAMAGEBONUS_4;
                if (iRoll==6)iDam = IP_CONST_DAMAGEBONUS_1d8;
               }break;
       case 4: {
                iRoll = d10();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_3;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_1d4;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_4;
                if (iRoll==4)iDam = IP_CONST_DAMAGEBONUS_1d6;
                if (iRoll==5)iDam = IP_CONST_DAMAGEBONUS_5;
                if (iRoll==6)iDam = IP_CONST_DAMAGEBONUS_1d8;
                if (iRoll==7)iDam = IP_CONST_DAMAGEBONUS_6;
                if (iRoll==8)iDam = IP_CONST_DAMAGEBONUS_2d4;
                if (iRoll==9)iDam = IP_CONST_DAMAGEBONUS_5;
                if (iRoll==10)iDam = IP_CONST_DAMAGEBONUS_1d10;
               }break;
       case 5: {
                iRoll = d12();
                if (iRoll==1)iDam = IP_CONST_DAMAGEBONUS_3;
                if (iRoll==2)iDam = IP_CONST_DAMAGEBONUS_1d4;
                if (iRoll==3)iDam = IP_CONST_DAMAGEBONUS_4;
                if (iRoll==4)iDam = IP_CONST_DAMAGEBONUS_1d6;
                if (iRoll==5)iDam = IP_CONST_DAMAGEBONUS_5;
                if (iRoll==6)iDam = IP_CONST_DAMAGEBONUS_1d8;
                if (iRoll==7)iDam = IP_CONST_DAMAGEBONUS_2d4;
                if (iRoll==8)iDam = IP_CONST_DAMAGEBONUS_6;
                if (iRoll==9)iDam = IP_CONST_DAMAGEBONUS_1d10;
                if (iRoll==10)iDam = IP_CONST_DAMAGEBONUS_7;
                if (iRoll==11)iDam = IP_CONST_DAMAGEBONUS_1d12;
                if (iRoll==12)iDam = IP_CONST_DAMAGEBONUS_2d6;
               }break;
      }
 ipAdd = ItemPropertyDamageBonus(iType, iDam);
 IPSafeAddItemProperty(oItem, ipAdd);

 //ipAdd = ItemPropertyVisualEffect(ITEM_VISUAL_EVIL);
 //IPSafeAddItemProperty(oItem, ipAdd);

 switch(iCol)
       {
        case 1: ipVis = ItemPropertyVisualEffect(ITEM_VISUAL_EVIL); break;
        case 2: ipVis = ItemPropertyVisualEffect(ITEM_VISUAL_COLD); break;
        case 3: ipVis = ItemPropertyVisualEffect(ITEM_VISUAL_FIRE); break;
        case 4: ipVis = ItemPropertyVisualEffect(ITEM_VISUAL_ACID); break;
        case 5: ipVis = ItemPropertyVisualEffect(ITEM_VISUAL_ELECTRICAL); break;
        case 6: ipVis = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY); break;
        case 7: ipVis = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC); break;
       }
 AddItemProperty(DURATION_TYPE_PERMANENT, ipVis, oItem);
}

void ACmisc(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iAC = d3();

 switch (iRange)
      {
       case 1: if (iAC==3)iAC=1; break;           // 1-2
       case 2: {iAC+=1;if (iAC==4)iAC=2;} break;  // 2-3
       case 3: {iAC+=2;if (iAC==5)iAC=3;} break;  // 3-4
       case 4: {iAC+=3;if (iAC==6)iAC=4;} break;  // 4-5
       case 5: {iAC+=4;if (iAC==7)iAC=5;} break;  // 5-6
      }
 ipAdd = ItemPropertyACBonus(iAC);
 IPSafeAddItemProperty(oItem, ipAdd);
}

void ACimbue(object oItem, int iRange, int iSpec)
{
 itemproperty ipAdd;
 int iAC = d3();
 int iPen;
 int iRoll;
 int iAbil;
 switch (iRange)
      {
       case 1: if(iAC==3)iAC=1; break;             // 1-2
       case 2: {iAC+=1;if (iAC==4)iAC=2;} break;   // 2-3
       case 3: {iAC+=2;if (iAC==5)iAC=3;} break;   // 3-4
       case 4: {iAC+=3;if (iAC==6)iAC=4;} break;   // 4-5
       case 5: {iAC+=4;if (iAC==7)iAC=5;} break;   // 5-6
      }
 ipAdd = ItemPropertyACBonus(iAC);

 if (iSpec==1){iPen = d4()+1; ipAdd = ItemPropertyDecreaseAC(IP_CONST_ACMODIFIERTYPE_ARMOR, iPen);}
 if (iSpec==2){iPen = d4()+1; ipAdd = ItemPropertyEnhancementPenalty(iPen);}
 if (iSpec==3)
    {
     iPen = d4()+1;
     iRoll = d6();
     switch(iRoll)
           {
            case 1: iAbil = ABILITY_DEXTERITY; break;
            case 2: iAbil = ABILITY_INTELLIGENCE; break;
            case 3: iAbil = ABILITY_WISDOM; break;
            case 4: iAbil = ABILITY_CHARISMA; break;
            case 5: iAbil = ABILITY_CONSTITUTION; break;
            case 6: iAbil = ABILITY_STRENGTH; break;
           }
     ipAdd = ItemPropertyDecreaseAbility(iAbil, iPen);
    }
 if (iSpec==4){iPen = d4()+1; ipAdd = ItemPropertyAttackPenalty(iPen);}

 IPSafeAddItemProperty(oItem, ipAdd);
}

void MIMMimbue(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iType;
 int iRoll;
 switch (iRange)
      {
       case 1: {}; break;
       case 2: {
                iRoll = d3();
                if (iRoll==1)iType = IP_CONST_IMMUNITYMISC_POISON;
                if (iRoll==2)iType = IP_CONST_IMMUNITYMISC_DISEASE;
                if (iRoll==3)iType = IP_CONST_IMMUNITYMISC_DISEASE;
               }; break;
       case 3: {
                iRoll = d6();
                if (iRoll==1)iType = IP_CONST_IMMUNITYMISC_POISON;
                if (iRoll==2)iType = IP_CONST_IMMUNITYMISC_DISEASE;
                if (iRoll==3)iType = IP_CONST_IMMUNITYMISC_FEAR;
                if (iRoll==4)iType = IP_CONST_IMMUNITYMISC_PARALYSIS;
                if (iRoll==5)iType = IP_CONST_IMMUNITYMISC_DEATH_MAGIC;
                if (iRoll==6)iType = IP_CONST_IMMUNITYMISC_LEVEL_ABIL_DRAIN;
               }; break;
       case 4: {
                iRoll = d10();
                if (iRoll==1)iType = IP_CONST_IMMUNITYMISC_POISON;
                if (iRoll==2)iType = IP_CONST_IMMUNITYMISC_DISEASE;
                if (iRoll==3)iType = IP_CONST_IMMUNITYMISC_FEAR;
                if (iRoll==4)iType = IP_CONST_IMMUNITYMISC_PARALYSIS;
                if (iRoll==5)iType = IP_CONST_IMMUNITYMISC_DEATH_MAGIC;
                if (iRoll==6)iType = IP_CONST_IMMUNITYMISC_DISEASE;
                if (iRoll==7)iType = IP_CONST_IMMUNITYMISC_KNOCKDOWN;
                if (iRoll==8)iType = IP_CONST_IMMUNITYMISC_LEVEL_ABIL_DRAIN;
                if (iRoll==9)iType = IP_CONST_IMMUNITYMISC_BACKSTAB;
                if (iRoll==10)iType = IP_CONST_IMMUNITYMISC_LEVEL_ABIL_DRAIN;
               }; break;
       case 5: {
                iRoll = d12();
                if (iRoll==1)iType = IP_CONST_IMMUNITYMISC_POISON;
                if (iRoll==2)iType = IP_CONST_IMMUNITYMISC_DISEASE;
                if (iRoll==3)iType = IP_CONST_IMMUNITYMISC_FEAR;
                if (iRoll==4)iType = IP_CONST_IMMUNITYMISC_PARALYSIS;
                if (iRoll==5)iType = IP_CONST_IMMUNITYMISC_DEATH_MAGIC;
                if (iRoll==6)iType = IP_CONST_IMMUNITYMISC_DISEASE;
                if (iRoll==7)iType = IP_CONST_IMMUNITYMISC_KNOCKDOWN;
                if (iRoll==8)iType = IP_CONST_IMMUNITYMISC_LEVEL_ABIL_DRAIN;
                if (iRoll==9)iType = IP_CONST_IMMUNITYMISC_BACKSTAB;
                if (iRoll==10)iType = IP_CONST_IMMUNITYMISC_LEVEL_ABIL_DRAIN;
                if (iRoll==11)iType = IP_CONST_IMMUNITYMISC_MINDSPELLS;
                if (iRoll==12)iType = IP_CONST_IMMUNITYMISC_CRITICAL_HITS;
               }; break;
      }
 ipAdd = ItemPropertyImmunityMisc(iType);
 IPSafeAddItemProperty(oItem, ipAdd);
}

void RESimbue(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iRes, iType, iRoll;

 iType = sd_GetDamType();
 while (sd_PropCheck(oItem, 23 , iType))iType = sd_GetDamType();


 switch (iRange)
      {
       case 1:  iRes = IP_CONST_DAMAGERESIST_5; break;
       case 2: {iRoll=d4();
                if (iRoll==1)iRes = IP_CONST_DAMAGERESIST_5;
                if (iRoll==2)iRes = IP_CONST_DAMAGERESIST_5;
                if (iRoll==3)iRes = IP_CONST_DAMAGERESIST_5;
                if (iRoll==4)iRes = IP_CONST_DAMAGERESIST_10;
                }break;
       case 3: {iRoll=d3();
                if (iRoll==1)iRes = IP_CONST_DAMAGERESIST_5;
                if (iRoll==2)iRes = IP_CONST_DAMAGERESIST_10;
                if (iRoll==3)iRes = IP_CONST_DAMAGERESIST_5;
                }break;
       case 4: {iRoll=d4();
                if (iRoll==1)iRes = IP_CONST_DAMAGERESIST_5;
                if (iRoll==2)iRes = IP_CONST_DAMAGERESIST_10;
                if (iRoll==3)iRes = IP_CONST_DAMAGERESIST_15;
                if (iRoll==4)iRes = IP_CONST_DAMAGERESIST_10;
                }break;
       case 5: {iRoll=d3();
                if (iRoll==1)iRes = IP_CONST_DAMAGERESIST_5;
                if (iRoll==2)iRes = IP_CONST_DAMAGERESIST_10;
                if (iRoll==3)iRes = IP_CONST_DAMAGERESIST_15;
               }break;
      }
 ipAdd = ItemPropertyDamageResistance(iType, iRes);
 IPSafeAddItemProperty(oItem, ipAdd);
}


void AbilityImbue(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iAbil;
 int iType;

 iType = sd_GetAbil();
 while (sd_PropCheck(oItem, 0, iType))iType = sd_GetDamType();

  switch (iRange)
      {
       case 1: iAbil = 1;  break;     // 1
       case 2: iAbil = d2(); break;   // 1-2
       case 3: iAbil = d3(); break;   // 1-3
       case 4: iAbil = d3()+1; break; // 2-4
       case 5: iAbil = d2()+2; break; // 3-4
      }
 ipAdd = ItemPropertyAbilityBonus(iType, iAbil);
 IPSafeAddItemProperty(oItem, ipAdd);
}

void MiscImbue(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iRoll;
 switch (iRange)
      {
       case 1: {}; break;
       case 2: {
                iRoll = d3();
                if (iRoll==1)ipAdd = ItemPropertyDarkvision();
                if (iRoll==2)ipAdd = ItemPropertyImprovedEvasion();
                if (iRoll==3)ipAdd = ItemPropertyBonusSavingThrow(IP_CONST_SAVEBASETYPE_FORTITUDE, 2);
               }; break;
       case 3: {
                iRoll = d6();
                if (iRoll==1)ipAdd = ItemPropertyDarkvision();
                if (iRoll==2)ipAdd = ItemPropertyImprovedEvasion();
                if (iRoll==3)ipAdd = ItemPropertyVampiricRegeneration(1);
                if (iRoll==4)ipAdd = ItemPropertyBonusSavingThrow(IP_CONST_SAVEBASETYPE_FORTITUDE, 3);
                if (iRoll==5)ipAdd = ItemPropertyRegeneration(1);
                if (iRoll==6)ipAdd = ItemPropertyDarkvision();
               }; break;
       case 4: {
                iRoll = d6();
                if (iRoll==1)ipAdd = ItemPropertyDarkvision();
                if (iRoll==2)ipAdd = ItemPropertyImprovedEvasion();
                if (iRoll==3)ipAdd = ItemPropertyVampiricRegeneration(2);
                if (iRoll==4)ipAdd = ItemPropertyBonusSavingThrow(IP_CONST_SAVEBASETYPE_FORTITUDE, 4);
                if (iRoll==5)ipAdd = ItemPropertyRegeneration(2);
                if (iRoll==6)ipAdd = ItemPropertyTrueSeeing();
                }; break;
       case 5: {
                iRoll = d6();
                if (iRoll==1)ipAdd = ItemPropertyDarkvision();
                if (iRoll==2)ipAdd = ItemPropertyImprovedEvasion();
                if (iRoll==3)ipAdd = ItemPropertyVampiricRegeneration(4);
                if (iRoll==4)ipAdd = ItemPropertyBonusSavingThrow(IP_CONST_SAVEBASETYPE_FORTITUDE, 5);
                if (iRoll==5)ipAdd = ItemPropertyRegeneration(4);
                if (iRoll==6)ipAdd = ItemPropertyTrueSeeing();
                }; break;
      }
 IPSafeAddItemProperty(oItem, ipAdd);
}

void SaveImbue(object oItem, int iRange)
{
 itemproperty ipAdd;
 int iAbil;
 int iType;
 int iRoll = d6();
 switch (iRoll)
      {
       case 1: iType = IP_CONST_SAVEBASETYPE_FORTITUDE; break;
       case 2: iType = IP_CONST_SAVEBASETYPE_REFLEX; break;
       case 3: iType = IP_CONST_SAVEBASETYPE_WILL; break;
       case 4: iType = IP_CONST_SAVEBASETYPE_FORTITUDE; break;
       case 5: iType = IP_CONST_SAVEBASETYPE_REFLEX; break;
       case 6: iType = IP_CONST_SAVEBASETYPE_WILL; break;
      }



 switch (iRange)
      {
       case 1: iAbil = 1;  break;     // 1
       case 2: iAbil = d2(); break;   // 1-2
       case 3: iAbil = d3(); break;   // 1-3
       case 4: iAbil = d3()+1; break; // 2-4
       case 5: iAbil = d2()+2; break; // 3-4
      }
 ipAdd = ItemPropertyBonusSavingThrow(iType, iAbil);
 IPSafeAddItemProperty(oItem, ipAdd);
}
void ImpEvasionImbue(object oItem)
{
itemproperty ipAdd;
ipAdd = ItemPropertyImprovedEvasion();
IPSafeAddItemProperty(oItem, ipAdd);
}

void TruseeingImbue(object oItem)
{
itemproperty ipAdd;
ipAdd = ItemPropertyTrueSeeing();
IPSafeAddItemProperty(oItem, ipAdd);
}
void DarkvisionImbue(object oItem)
{
itemproperty ipAdd;
ipAdd = ItemPropertyDarkvision();
IPSafeAddItemProperty(oItem, ipAdd);
}

void FreedomImbue(object oItem)
{
itemproperty ipAdd;
ipAdd = ItemPropertyFreeAction();
IPSafeAddItemProperty(oItem, ipAdd);
}

void RegenImbue(object oItem, int iRange)
{
int iRegen;
itemproperty ipAdd;
switch (iRange)
      {
       case 1: {iRegen = d3();if (iRegen==3)iRegen=1; break;}   //1-2
       case 2: iRegen = d3(); break;                            //1-3
       case 3: iRegen = d3()+1; break;                          //1-4
       case 4: {iRegen = d3()+2;if (iRegen==5)iRegen=3;break;}  //2-4
       case 5: iRegen = d4()+1;break;                           //2-5
      }
ipAdd = ItemPropertyRegeneration(iRegen);
IPSafeAddItemProperty(oItem, ipAdd);
}

void VRimbue(object oItem, int iRange)
{
int iRegen;
itemproperty ipAdd;
switch (iRange)
      {
       case 1: {iRegen = d3();if (iRegen==3)iRegen=1; break;}   //1-2
       case 2: iRegen = d3(); break;                            //1-3
       case 3: iRegen = d3()+1; break;                          //1-4
       case 4: {iRegen = d3()+2;if (iRegen==5)iRegen=3;break;}  //2-4
       case 5: iRegen = d4()+1;break;                           //2-5
      }
ipAdd = ItemPropertyVampiricRegeneration(iRegen);
IPSafeAddItemProperty(oItem, ipAdd);
}

void EvilImbue(object oItem)
{
itemproperty ipAdd;
ipAdd = ItemPropertyVisualEffect(ITEM_VISUAL_EVIL);
IPSafeAddItemProperty(oItem, ipAdd);
}

void HolyImbue(object oItem)
{
itemproperty ipAdd;
ipAdd = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
IPSafeAddItemProperty(oItem, ipAdd);
}

void FireImbue(object oItem)
{
itemproperty ipAdd;
ipAdd = ItemPropertyVisualEffect(ITEM_VISUAL_FIRE);
IPSafeAddItemProperty(oItem, ipAdd);
}

void ElecImbue(object oItem)
{
itemproperty ipAdd;
ipAdd = ItemPropertyVisualEffect(ITEM_VISUAL_ELECTRICAL);
IPSafeAddItemProperty(oItem, ipAdd);
}

void AcidImbue(object oItem)
{
itemproperty ipAdd;
ipAdd = ItemPropertyVisualEffect(ITEM_VISUAL_ACID);
IPSafeAddItemProperty(oItem, ipAdd);
}

void HasteImbue(object oItem)
{
itemproperty ipAdd;
ipAdd = ItemPropertyHaste();
IPSafeAddItemProperty(oItem, ipAdd);
}

void KeenImbue(object oItem)
{
itemproperty ipAdd;
ipAdd = ItemPropertyKeen();
IPSafeAddItemProperty(oItem, ipAdd);
}

/////////////////
//Test Compiling
//void main() {}