Shargast_PRC8/_module/Chapter 2/nss/sd_lootsystem.nss
Jaysyn904 66a0a3e043 Initial commit
Initial commit.
2024-08-03 14:13:18 -04:00

3184 lines
82 KiB
Plaintext

//////////////////////////////////////////////////////////
//::use: #include"sd_lootsystem"
//::
//::
//:: Slayers of Darkmoon loot generation system
//::
//::
//::
//:: Commche 2006
//::
#include"sd_lootsys_tools"
void DropArmor (object oMob, object oSack, int iRange, int SockChance, int iChest)
{
object oItem;
itemproperty ipAdd;
string sType, sIName, sName, sSocks;
int iQual = 0;
int iRoll = d10();
switch(iRoll)
{
case 1: sType = "sdarmor8"; sIName = "Plate";break;
case 2: sType = "sdarmor7"; sIName = "Half Plate";break;
case 3: sType = "sdarmor6"; sIName = "Chain Mail";break;
case 4: sType = "sdarmor5"; sIName = "Banded Mail";break;
case 5: sType = "sdarmor4"; sIName = "Breastplate";break;
case 6: sType = "sdarmor3"; sIName = "Studded Leather";break;
case 7: sType = "sdarmor2"; sIName = "Hardened Leather";break;
case 8: sType = "sdarmor1"; sIName = "Leather";break;
case 9: sType = "sdarmor0"; sIName = "Tunic";break;
case 10: sType = "sdarmor02"; sIName = "Robe";break;
}
oItem = CreateItemOnObject(sType, oSack, 1, "sf_socket_item");
// chance for socketed item
iRoll = d100();
if (iRoll<SockChance)
{
iRoll=d6();
SetLocalInt(oItem, "SOCKET_SLOTS", iRoll);
sSocks = IntToString(iRoll);
ipAdd = ItemPropertyCastSpell
(IP_CONST_CASTSPELL_UNIQUE_POWER_SELF_ONLY,
IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
IPSafeAddItemProperty(oItem, ipAdd);
sName = ColorString("Socketed "+sIName+" ("+sSocks+")", 72, 209, 204 );
SetName(oItem, sName);
return;
}
iRoll = d100();
if (iRoll<=CHANCE_WORN&&iRoll>CHANCE_BROKEN&&iChest!=1) // chance of being worn
{
sName = ColorString("Worn "+sIName, 192, 192, 192);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
if (iRoll<=CHANCE_BROKEN&&iChest!=1) // chance of being broken
{
DelayCommand(0.2, ACimbue(oItem, iRange, 1));
sName = ColorString("Broken "+sIName, 255, 0, 0);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
SetIdentified(oItem, FALSE);
//////////////////////////////////////////// Lvls 1-5
// Ac bonus
DelayCommand(0.2, ACimbue(oItem, iRange, 0));
++iQual;
////////////////////////////////////////// Lvls 6-10
if (iRange==2)
{
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Misc
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2,MiscImbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 11-20
if (iRange==3)
{
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Res bonus
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
// Misc
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, MiscImbue(oItem, iRange));
++iQual;
}
// Misc Immunity
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, MIMMimbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>95){DelayCommand(0.2, HasteImbue(oItem));
++iQual;}
}
////////////////////////////////////////// Lvls 20-30
if (iRange==4)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Res bonus x 2
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
// Misc
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, MiscImbue(oItem, iRange));
++iQual;
}
// Misc Immunity
iRoll = d100();
if (iRoll>65)
{
DelayCommand(0.2, MIMMimbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>80){DelayCommand(0.2, HasteImbue(oItem));
++iQual;}
}
////////////////////////////////////////// Lvls 30-40
if (iRange==5)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Res bonus x 3
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
// Misc
iRoll = d100();
if (iRoll>55)
{
DelayCommand(0.2, MiscImbue(oItem, iRange));
++iQual;
}
// Misc Immunity
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, MIMMimbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>70){DelayCommand(0.2, HasteImbue(oItem));
++iQual;}
}
SetQuality(oItem, sIName, iRange);
}
void DropShield (object oMob, object oSack, int iRange, int SockChance, int iChest)
{
object oItem;
itemproperty ipAdd;
string sType, sName, sIName, sSocks;
int iQual = 0;
int iRoll = d12();
switch(iRoll)
{
case 1: {sType = "sdTower1"; sIName = "Targe";} break;
case 2: {sType = "sdLarge1"; sIName = "Wooden Shield";} break;
case 3: {sType = "sdSmall1"; sIName = "Buckler";} break;
case 4: {sType = "sdTower2"; sIName = "Deflektor";} break;
case 5: {sType = "sdLarge2"; sIName = "Protector";} break;
case 6: {sType = "sdSmall2"; sIName = "Heater";} break;
case 7: {sType = "sdTower3"; sIName = "Defender";} break;
case 8: {sType = "sdLarge3"; sIName = "Reinforced Shield";} break;
case 9: {sType = "sdSmall3"; sIName = "Arm Blocker";} break;
case 10: {sType = "sdTower4"; sIName = "Centurion";} break;
case 11: {sType = "sdLarge4"; sIName = "Iron Shield";} break;
case 12: {sType = "sdSmall4"; sIName = "Buckler";} break;
}
oItem = CreateItemOnObject(sType, oSack, 1, "sf_socket_item");
// chance for socketed item
iRoll = d100();
if (iRoll<SockChance)
{
iRoll=d6();
SetLocalInt(oItem, "SOCKET_SLOTS", iRoll);
sSocks = IntToString(iRoll);
ipAdd = ItemPropertyCastSpell
(IP_CONST_CASTSPELL_UNIQUE_POWER_SELF_ONLY,
IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
IPSafeAddItemProperty(oItem, ipAdd);
sName = ColorString("Socketed "+sIName+" ("+sSocks+")", 72, 209, 204 );
SetName(oItem, sName);
return;
}
iRoll = d100();
if (iRoll<=CHANCE_WORN&&iRoll>CHANCE_BROKEN&&iChest!=1) // chance of being worn
{
sName = ColorString("Worn "+sIName, 192, 192, 192);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
if (iRoll<=CHANCE_BROKEN&&iChest!=1) // chance of being broken
{
DelayCommand(0.2, ACimbue(oItem, iRange, 1));
sName = ColorString("Broken "+sIName, 255, 0, 0);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
SetIdentified(oItem, FALSE);
//////////////////////////////////////////// Lvls 1-5
// Ac bonus
DelayCommand(0.2, ACmisc(oItem, iRange));
++iQual;
////////////////////////////////////////// Lvls 6-10
if (iRange==2)
{
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 11-20
if (iRange==3)
{
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Res bonus
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 20-30
if (iRange==4)
{
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Res bonus
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
// Misc
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, MiscImbue(oItem, iRange));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 30-40
if (iRange==5)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Res bonus x 2
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
// Misc
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, MiscImbue(oItem, iRange));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
SetQuality(oItem, sIName, iRange);
}
void DropMagicItem (object oMob, object oSack, int iRange, int SockChance, int iChest)
{
string sType, sName, sIName, sSocks;
object oItem;
itemproperty ipAdd;
int iID = 0;
int iQual = 0;
int iRoll = d20();
if (iChest==5)iRoll = 9;
switch(iRoll)
{
case 1: {sType = "sdammy1"; sIName = "Amulet";iID = 1;} break;
case 2: {sType = "sdring1"; sIName = "Ring";iID = 2;} break;
case 3: {sType = "sdboots1"; sIName = "Boots";iID = 1;}break;
case 4: {sType = "sdbracers1";sIName = "Wristband";} break;
case 5: {sType = "sdhelm1";sIName = "Helm";} break;
case 6: {sType = "sdcloak1";sIName = "Cloak";iID = 1;} break;
case 7: {sType = "sdbelt1";sIName = "Belt";} break;
case 8: {sType = "sdammy2";sIName = "Talisman";iID = 1;} break;
case 9: {sType = "sdring2";sIName = "Band";iID = 2;} break;
case 10: {sType = "sdboots2";sIName = "Sabatons";iID = 1;} break;
case 11: {sType = "sdbracers2";sIName = "Bracers";} break;
case 12: {sType = "sdhelm2";sIName = "Salet";} break;
case 13: {sType = "sdcloak2";sIName = "Cape";iID = 1;} break;
case 14: {sType = "sdbelt2";sIName = "Thick Belt";} break;
case 15: {sType = "sdammy3";sIName = "Charm";iID = 1;} break;
case 16: {sType = "sdring3";sIName = "Circle";iID = 2;} break;
case 17: {sType = "sdboots3";sIName = "Greaves";iID = 1;} break;
case 18: {sType = "sdbracers3";sIName = "Armband";} break;
case 19: {sType = "sdhelm3";sIName = "Vanguard";} break;
case 20: {sType = "sdring4";sIName = "Coil";iID = 2;} break;
}
// chance for socketed item
oItem = CreateItemOnObject(sType, oSack, 1, "sf_socket_item");
iRoll = d100();
if (iRoll<SockChance)
{
iRoll=d6();
SetLocalInt(oItem, "SOCKET_SLOTS", iRoll);
sSocks = IntToString(iRoll);
ipAdd = ItemPropertyCastSpell
(IP_CONST_CASTSPELL_UNIQUE_POWER_SELF_ONLY,
IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
IPSafeAddItemProperty(oItem, ipAdd);
sName = ColorString("Socketed "+sIName+" ("+sSocks+")", 72, 209, 204 );
SetName(oItem, sName);
return;
}
iRoll = d100();
if (iRoll<=CHANCE_WORN&&iRoll>CHANCE_BROKEN&&iChest!=1) // chance of being worn
{
sName = ColorString("Worn "+sIName, 192, 192, 192);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
if (iRoll<=CHANCE_BROKEN&&iChest!=1) // chance of being broken
{
DelayCommand(0.2, ACimbue(oItem, iRange, 1));
sName = ColorString("Broken "+sIName, 255, 0, 0);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
SetIdentified(oItem, FALSE);
///////////////////////////////////////////// Hench Reward Code
object oPC = GetFirstPC();
if (GetMaster(oMob)!=OBJECT_INVALID)
{
SetIdentified(oItem, TRUE);
//SetItemCursedFlag(oItem, TRUE);
}
//////////////////////////////////////////// Lvls 1-5
// AC bonus for ammy, cloak & boots or ability bonus otherwise
if (iID==1)
{
DelayCommand(0.2, ACmisc(oItem, iRange));
++iQual;
}
else
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
////////////////////////////////////////// Lvls 6-10
if (iRange==2)
{
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// If its a ring theres a 30% chance for spellslots - otherwise a save thr
if (iID==2)
{
// Spell Slot
iRoll = d100();
if (iRoll>69)
{
iRoll=d3(); // 1-3 slots
DelayCommand(0.2, SpellSlot(oItem, iRange, iRoll));
iQual+=2;
}
}
else
{
// Save
iRoll = d100();
if (iRoll>90)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
}
////////////////////////////////////////// Lvls 11-20
if (iRange==3)
{
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// If its a ring theres a chance for spellslots - otherwise a save thr
if (iID==2)
{
// Spell Slot
iRoll = d100();
if (iRoll>69)
{
iRoll=d3()+1; // 2-4 slots
DelayCommand(0.2, SpellSlot(oItem, iRange, iRoll));
iQual+=2;
}
}
else
{
// Misc Immunity
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, MIMMimbue(oItem, iRange));
++iQual;
}
}
// Save
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 20-30
if (iRange==4)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
if (iID==2)
{
// Spell Slot
iRoll = d100();
if (iRoll>69)
{
iRoll=d4()+2; // 3-6 slots
DelayCommand(0.2, SpellSlot(oItem, iRange, iRoll));
iQual+=2;
}
}
else
{
// Misc Immunity
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, MIMMimbue(oItem, iRange));
++iQual;
}
}
// Misc
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, MiscImbue(oItem, iRange));
++iQual;
}
// Damage Res bonus
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 30-40
if (iRange==5)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Res bonus x 2
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>65)
{
DelayCommand(0.2, RESimbue(oItem, iRange));
++iQual;
}
// Misc
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, MiscImbue(oItem, iRange));
++iQual;
}
// Misc Immunity
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, MIMMimbue(oItem, iRange));
iQual+=2;
}
// Save
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
if (iID==2)
{
// Spell Slot
iRoll = d100();
if (iRoll>69)
{
iRoll = d6()+2; // 2-8 slots
DelayCommand(0.2, SpellSlot(oItem, iRange, iRoll));
++iQual;
}
}
}
SetQuality(oItem, sIName, iRange);
}
void DropMonkGloves (object oMob, object oSack, int iRange, int SockChance, int iChest)
{
object oItem;
itemproperty ipAdd;
string sType, sName, sIName, sSocks;
int iDice1, iDice2, iRoll;
int iQual;
int iWType = 0;
iRoll = d6();
switch (iRoll)
{
case 1: sType = "sd_mgloves"; break;
case 2: sType = "sd_mgloves1"; break;
case 3: sType = "sd_mgloves2"; break;
case 4: sType = "sd_mgloves3"; break;
case 5: sType = "sd_mgloves4"; break;
case 6: sType = "sd_mgloves5"; break;
}
iRoll = d20();
switch (iRoll)
{
case 1: sIName = "War Talons"; break;
case 2: sIName = "Blood Claws"; break;
case 3: sIName = "Pulverizers"; ;break;
case 4: sIName = "Ninja Claws"; break;
case 5: sIName = "War Gloves"; break;
case 6: sIName = "Flesh Knuckles"; break;
case 7: sIName = "Death Mitts"; break;
case 8: sIName = "Palm Guards"; break;
case 9: sIName = "Knuckledusters"; ;break;
case 10: sIName = "Tiger Fists"; break;
case 11: sIName = "Tauntlets"; break;
case 12: sIName = "Chi Bracelets"; break;
case 13: sIName = "Dragon Claws"; break;
case 14: sIName = "Steel Palms"; break;
case 15: sIName = "Exploding Fists"; break;
case 16: sIName = "Nose Breakers"; break;
case 17: sIName = "Stiff Fingers"; ;break;
case 18: sIName = "Heart Piercers"; break;
case 19: sIName = "Digit Devastators"; break;
case 20: sIName = "Gore Gauntlets"; break;
}
oItem = CreateItemOnObject(sType, oSack, 1, "sf_socket_item");
// Monk
iRoll = d100();
if (iRoll<=CHANCE_WORN&&iRoll>CHANCE_BROKEN&&iChest!=1) // chance of being worn
{
sName = ColorString("Worn "+sIName, 192, 192, 192);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
if (iRoll<=CHANCE_BROKEN&&iChest!=1) // chance of being broken
{
DelayCommand(0.2, ACimbue(oItem, iRange, 1));
sName = ColorString("Broken "+sIName, 255, 0, 0);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
SetIdentified(oItem, FALSE);
//////////////////////////////////////////// Lvls 1-5 ::Monk2::
// Attack bonus
DelayCommand(0.2, BowEnhance(oItem, iRange));
++iQual;
////////////////////////////////////////// Lvls 6-10 ::Monk2::
if (iRange==2)
{
// Ability bonus
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Bonus
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll==90)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
}
////////////////////////////////////////// Lvls 11-20 ::Monk2::
if (iRange==3)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Bonus x 2
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>=85)
{
DelayCommand(0.2, HasteImbue(oItem));
++iQual;
}
}
////////////////////////////////////////// Lvls 20-30 ::Monk2::
if (iRange==4)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Bonus x 3
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>=80)
{
DelayCommand(0.2, HasteImbue(oItem));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 30-40 ::Monk2::
if (iRange==5)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>20)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Bonus x 3
iRoll = d100();
if (iRoll>20)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>=70)
{
DelayCommand(0.2, HasteImbue(oItem));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
switch(iQual)
{
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("Master's "+sIName, 102, 205, 170); break;
case 5: sName = ColorString("Epic "+sIName, 128, 0, 218); break;
case 7: sName = ColorString("Heroic "+sIName, 255, 255, 0 ); break;
case 6: sName = ColorString("Legendary "+sIName, 218, 165, 32 ); break;
case 8: sName = ColorString("Grandmaster's "+sIName, 255, 255, 0 ); break;
}
SetName(oItem, sName);
SetIdentified(oItem, FALSE);
}
void DropWeapon (object oMob, object oSack, int iRange, int SockChance, int iChest)
{
object oPC = GetLastKiller();
object oItem;
itemproperty ipAdd;
string sType, sName, sIName, sSocks;
int iRoll, iDice;
int iQual = 0;
int iWType = 0;
iDice = d20(2);
iRoll = d100();
if (iRoll<CHANCE_WFOCUS)
{
if (GetHasFeat(FEAT_WEAPON_FOCUS_BASTARD_SWORD, oPC))iDice=6;
if (GetHasFeat(FEAT_WEAPON_FOCUS_BATTLE_AXE, oPC))iDice=4;
if (GetHasFeat(FEAT_WEAPON_FOCUS_CLUB, oPC))iDice=19;
if (GetHasFeat(FEAT_WEAPON_FOCUS_DAGGER, oPC))iDice=14;
if (GetHasFeat(FEAT_WEAPON_FOCUS_DIRE_MACE, oPC))iDice=27;
if (GetHasFeat(FEAT_WEAPON_FOCUS_DOUBLE_AXE, oPC))iDice=28;
if (GetHasFeat(FEAT_WEAPON_FOCUS_DWAXE, oPC))iDice=3;
if (GetHasFeat(FEAT_WEAPON_FOCUS_GREAT_AXE, oPC))iDice=2;
if (GetHasFeat(FEAT_WEAPON_FOCUS_GREAT_SWORD, oPC))iDice=10;
if (GetHasFeat(FEAT_WEAPON_FOCUS_HALBERD, oPC))iDice=30;
if (GetHasFeat(FEAT_WEAPON_FOCUS_HAND_AXE, oPC))iDice=5;
if (GetHasFeat(FEAT_WEAPON_FOCUS_HEAVY_CROSSBOW, oPC))iDice=36;
if (GetHasFeat(FEAT_WEAPON_FOCUS_HEAVY_FLAIL, oPC))iDice=20;
if (GetHasFeat(FEAT_WEAPON_FOCUS_KAMA, oPC))iDice=16;
if (GetHasFeat(FEAT_WEAPON_FOCUS_KATANA, oPC))iDice=11;
if (GetHasFeat(FEAT_WEAPON_FOCUS_KUKRI, oPC))iDice=17;
if (GetHasFeat(FEAT_WEAPON_FOCUS_LIGHT_CROSSBOW, oPC))iDice=35;
if (GetHasFeat(FEAT_WEAPON_FOCUS_LIGHT_FLAIL, oPC))iDice=21;
if (GetHasFeat(FEAT_WEAPON_FOCUS_LIGHT_HAMMER, oPC))iDice=37;
if (GetHasFeat(FEAT_WEAPON_FOCUS_LIGHT_MACE, oPC))iDice=24;
if (GetHasFeat(FEAT_WEAPON_FOCUS_LONG_SWORD, oPC))iDice=8;
if (GetHasFeat(FEAT_WEAPON_FOCUS_LONGBOW, oPC))iDice=18;
if (GetHasFeat(FEAT_WEAPON_FOCUS_MORNING_STAR, oPC))iDice=25;
if (GetHasFeat(FEAT_WEAPON_FOCUS_RAPIER, oPC))iDice=13;
if (GetHasFeat(FEAT_WEAPON_FOCUS_SCIMITAR, oPC))iDice=12;
if (GetHasFeat(FEAT_WEAPON_FOCUS_SCYTHE, oPC))iDice=31;
if (GetHasFeat(FEAT_WEAPON_FOCUS_SHORT_SWORD, oPC))iDice=9;
if (GetHasFeat(FEAT_WEAPON_FOCUS_SHORTBOW, oPC))iDice=34;
if (GetHasFeat(FEAT_WEAPON_FOCUS_SICKLE, oPC))iDice=39;
if (GetHasFeat(FEAT_WEAPON_FOCUS_SPEAR, oPC))iDice=32;
if (GetHasFeat(FEAT_WEAPON_FOCUS_STAFF, oPC))iDice=29;
if (GetHasFeat(FEAT_WEAPON_FOCUS_TWO_BLADED_SWORD, oPC))iDice=26;
if (GetHasFeat(FEAT_WEAPON_FOCUS_WAR_HAMMER, oPC))iDice=23;
if (GetHasFeat(FEAT_WEAPON_FOCUS_WHIP, oPC))iDice=33;
if (GetHasFeat(FEAT_WEAPON_FOCUS_UNARMED_STRIKE, oPC))iDice=40;
}
switch(iDice)
{
// Axes
case 0: {sType = "sdgaxe"; iRoll = d3();
if (iRoll==1)sIName = "Greataxe";
if (iRoll==2)sIName = "Two Handed Axe";
if (iRoll==3)sIName = "Decapitator";}
case 1: {sType = "sdgaxe"; iRoll = d3();
if (iRoll==1)sIName = "Greataxe";
if (iRoll==2)sIName = "Two Handed Axe";
if (iRoll==3)sIName = "Decapitator";}
case 2: {sType = "sdgaxe"; iRoll = d3();
if (iRoll==1)sIName = "Greataxe";
if (iRoll==2)sIName = "Two Handed Axe";
if (iRoll==3)sIName = "Decapitator";}
break; break;
case 3: {sType = "sdwaxe"; iRoll = d3();
if (iRoll==1)sIName = "Dwarven War Axe";
if (iRoll==2)sIName = "War Axe";
if (iRoll==3)sIName = "Headsplitter";}
break;
case 4: {sType = "sdbaxe"; iRoll = d3();
if (iRoll==1)sIName = "Battleaxe";
if (iRoll==2)sIName = "Beserker Axe";
if (iRoll==3)sIName = "Siege Axe";}
break;
case 5: {sType = "sdhaxe"; iRoll = d3();
if (iRoll==1)sIName = "Handaxe";
if (iRoll==2)sIName = "Cleaver";
if (iRoll==3)sIName = "Tomohawk";}
break;
// Bladed
case 6: {sType = "sd_bastard"; iRoll = d3();
if (iRoll==1)sIName = "Bastard Sword";
if (iRoll==2)sIName = "Mercinary Blade";
if (iRoll==3)sIName = "Black Blade";}
break;
case 7: {sType = "sdlsword"; iRoll = d3();
if (iRoll==1)sIName = "Longsword";
if (iRoll==2)sIName = "Knight's Sword";
if (iRoll==3)sIName = "Honor Blade";}
break;
case 8: {sType = "sdlsword"; iRoll = d3();
if (iRoll==1)sIName = "Longsword";
if (iRoll==2)sIName = "Knight's Sword";
if (iRoll==3)sIName = "Honor Blade";}
break;
case 9: {sType = "sdssword"; iRoll = d3();
if (iRoll==1)sIName = "Short Sword";
if (iRoll==2)sIName = "Half Blade";
if (iRoll==3)sIName = "Halfling Sword";}
break;
case 10: {sType = "sdgsword"; iRoll = d3();
if (iRoll==1)sIName = "Greatsword";
if (iRoll==2)sIName = "Massive Blade";
if (iRoll==3)sIName = "Champion's Steel";}
break;
case 11: {sType = "sdkatana"; iRoll = d3();
if (iRoll==1)sIName = "Katana";
if (iRoll==2)sIName = "Samurai Sword";
if (iRoll==3)sIName = "Assassin Blade";}
break;
case 12: {sType = "sdscim"; iRoll = d3();
if (iRoll==1)sIName = "Scimitar";
if (iRoll==2)sIName = "Arabian Sword";
if (iRoll==3)sIName = "Sand Blade";}
break;
case 13: {sType = "sdrapier"; iRoll = d3();
if (iRoll==1)sIName = "Rapier";
if (iRoll==2)sIName = "Swashbuckler";
if (iRoll==3)sIName = "Death Pin";}
break;
case 14: {sType = "sddagger"; iRoll = d3();
if (iRoll==1)sIName = "Dagger";
if (iRoll==2)sIName = "Sticker";
if (iRoll==3)sIName = "Switchblade";}
break;
// Exotic
case 15: {sType = "sdstaff3"; iRoll = d3();
iWType = 2;
if (iRoll==1)sIName = "Warlock Bone";
if (iRoll==2)sIName = "Shaman Totem";
if (iRoll==3)sIName = "Cane of Scorcery";}
break;
case 16: {sType = "sdkama"; iRoll = d3();
if (iRoll==1)sIName = "Kama";
if (iRoll==2)sIName = "Monk Claw";
if (iRoll==3)sIName = "Ripper";}
break;
case 17: {sType = "sdkukri"; iRoll = d3();
if (iRoll==1)sIName = "Kukri";
if (iRoll==2)sIName = "Machetti";
if (iRoll==3)sIName = "Scorpion Tail";}
break;
case 18: {sType = "sdlbow"; iRoll = d3();
iWType = 1;
if (iRoll==1)sIName = "Siege Bow";
if (iRoll==2)sIName = "Elven War Bow";
if (iRoll==3)sIName = "Battle Bow";}
break;
// Blunt
case 19: {sType = "sdclub"; iRoll = d3();
if (iRoll==1)sIName = "Club";
if (iRoll==2)sIName = "Baton";
if (iRoll==3)sIName = "Truncheon";}
break;
case 20: {sType = "sdhflail"; iRoll = d3();
if (iRoll==1)sIName = "Heavy Flail";
if (iRoll==2)sIName = "Deathswinger";
if (iRoll==3)sIName = "Skull Masher";}
break;
case 21: {sType = "sdlflail"; iRoll = d3();
if (iRoll==1)sIName = "Flail";
if (iRoll==2)sIName = "Light Flail";
if (iRoll==3)sIName = "Head Cracker";}
break;
case 22: {sType = "sdstaff1"; iRoll = d3();
iWType = 2;
if (iRoll==1)sIName = "Magestaff";
if (iRoll==2)sIName = "Arcane Staff";
if (iRoll==3)sIName = "Magus Pole";}
break;
case 23: {sType = "sdwhamm"; iRoll = d3();
if (iRoll==1)sIName = "Warhammer";
if (iRoll==2)sIName = "Thunderhead";
if (iRoll==3)sIName = "Earthshaker";}
break;
case 24: {sType = "sdmace"; iRoll = d3();
if (iRoll==1)sIName = "Mace";
if (iRoll==2)sIName = "Wrathpole";
if (iRoll==3)sIName = "Justice Bringer";}
break;
case 25: {sType = "sdmstar"; iRoll = d3();
if (iRoll==1)sIName = "Morning Star";
if (iRoll==2)sIName = "Neck Crusher";
if (iRoll==3)sIName = "Bloodcopter";}
break;
//Double Sided
case 26: {sType = "sddbsword"; iRoll = d3();
if (iRoll==1)sIName = "Doubleblade";
if (iRoll==2)sIName = "Doomblade";
if (iRoll==3)sIName = "Body Processor";}
break;
case 27: {sType = "sddsmace"; iRoll = d3();
if (iRoll==1)sIName = "Double Mace";
if (iRoll==2)sIName = "Damage Pole";
if (iRoll==3)sIName = "Twin Basher";}
break;
case 28: {sType = "sddsaxe"; iRoll = d3();
if (iRoll==1)sIName = "Double Axe";
if (iRoll==2)sIName = "Crowd Cutter";
if (iRoll==3)sIName = "Haymaker";}
break;
case 29: {sType = "sdqstaff"; iRoll = d3();
if (iRoll==1)sIName = "Quaterstaff";
if (iRoll==2)sIName = "Pole";
if (iRoll==3)sIName = "Oak Rod";}
break;
// Polearms
case 30: {sType = "sdhalberd"; iRoll = d3();
if (iRoll==1)sIName = "Halberd";
if (iRoll==2)sIName = "Death Reach";
if (iRoll==3)sIName = "Wind Cutter";}
break;
case 31: {sType = "sdscythe"; iRoll = d3();
if (iRoll==1)sIName = "Reaper";
if (iRoll==2)sIName = "Soul Reaver";
if (iRoll==3)sIName = "Flesh Harvester";}
break;
case 32: {sType = "sdspear"; iRoll = d3();
if (iRoll==1)sIName = "Spear";
if (iRoll==2)sIName = "Amazon Finger";
if (iRoll==3)sIName = "Body Skewer";}
break;
// Whip
case 33: {sType = "sdwhip"; iRoll = d3();
if (iRoll==1)sIName = "Whip";
if (iRoll==2)sIName = "Bullwhip";
if (iRoll==3)sIName = "Deathrope";}
break;
// Ranged
case 34: {sType = "sdsbow"; iRoll = d3();
iWType = 1;
if (iRoll==1)sIName = "Halfling War Bow";
if (iRoll==2)sIName = "Shortbow";
if (iRoll==3)sIName = "Bloodstring";}
break;
case 35: {sType = "sdlcbow"; iRoll = d3();
iWType = 1;
if (iRoll==1)sIName = "Light Crossbow";
if (iRoll==2)sIName = "Bolt Pistol";
if (iRoll==3)sIName = "Auto Bow";}
break;
case 36: {sType = "sdhcbow"; iRoll = d3();
iWType = 1;
if (iRoll==1)sIName = "Battle Crossbow";
if (iRoll==2)sIName = "Bolt Rifle";
if (iRoll==3)sIName = "Steelstring Sniper";}
break;
// Mage
case 37: {sType = "sdlhamm"; iRoll = d3();
if (iRoll==1)sIName = "Light Hammer";
if (iRoll==2)sIName = "Wood Hammer";
if (iRoll==3)sIName = "Hole Puncher";}
break;
case 38: {sType = "sdstaff2"; iRoll = d3();
iWType = 2;
if (iRoll==1)sIName = "Mystic Cane";
if (iRoll==2)sIName = "Staff of Conjuring";
if (iRoll==3)sIName = "Ivory Staff";}
break;
case 39: {sType = "sdsickle"; iRoll = d3();
if (iRoll==1)sIName = "Sickle";
if (iRoll==2)sIName = "Blood Crest";
if (iRoll==3)sIName = "Death Ring";}
break;
case 40: {sType = "sdmgloves"; iRoll = d3();
iWType = 3;
if (iRoll==1)sIName = "Death Claws";
if (iRoll==2)sIName = "Exploding Fists";
if (iRoll==3)sIName = "Battle Gloves";}
break;
}
// chance for socketed item
oItem = CreateItemOnObject(sType, oSack, 1, "sf_socket_item");
SetName(oItem, sIName);
iRoll = d100();
if (iRoll<SockChance && iWType!=2)
{
iRoll=d6();
SetLocalInt(oItem, "SOCKET_SLOTS", iRoll);
sSocks = IntToString(iRoll);
ipAdd = ItemPropertyCastSpell
(IP_CONST_CASTSPELL_UNIQUE_POWER_SELF_ONLY,
IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
IPSafeAddItemProperty(oItem, ipAdd);
sName = ColorString("Socketed "+sIName+" ("+sSocks+")", 72, 209, 204 );
SetName(oItem, sName);
return;
}
if (iWType==1)
{
iQual=0;
// Ranged
// Chance for worn or broken item
iRoll = d100();
if (iRoll<=CHANCE_WORN&&iRoll>CHANCE_BROKEN&&iChest!=1) // chance of being worn
{
sName = ColorString("Worn "+sIName, 192, 192, 192);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
if (iRoll<=CHANCE_BROKEN&&iChest!=1) // chance of being broken
{
DelayCommand(0.2, ACimbue(oItem, iRange, 1));
sName = ColorString("Broken "+sIName, 255, 0, 0);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
SetIdentified(oItem, FALSE);
//////////////////////////////////////////// Lvls 1-5 ::Ranged::
// Attack bonus
DelayCommand(0.2, BowEnhance(oItem, iRange));
++iQual;
////////////////////////////////////////// Lvls 6-10 ::Ranged::
if (iRange==2)
{
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Massive Crits
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, MCimbue(oItem, iRange));
++iQual;
}
// Mighty
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, MightyEnhance(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll==90)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
}
////////////////////////////////////////// Lvls 11-20 ::Ranged::
if (iRange==3)
{
// Mighty
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, MightyEnhance(oItem, iRange));
++iQual;
}
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Massive Crits
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, MCimbue(oItem, iRange));
++iQual;
}
// Extra range damage bonus
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, RangedImbue(oItem));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>=85)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
}
////////////////////////////////////////// Lvls 20-30 ::Ranged::
if (iRange==4)
{
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Massive Crits
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, MCimbue(oItem, iRange));
++iQual;
}
// Mighty
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, MightyEnhance(oItem, iRange));
++iQual;
}
// Extra ranged damage bonus
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, RangedImbue(oItem));
iQual+=2;
}
// Save
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>=80)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
}
////////////////////////////////////////// Lvls 30-40 ::Ranged::
if (iRange==5)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Mighty
iRoll = d100();
if (iRoll>20)
{
DelayCommand(0.2, MightyEnhance(oItem, iRange));
++iQual;
}
// Extra melee damage bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, RangedImbue(oItem));
iQual+=2;
}
// Massive Crits
iRoll = d100();
if (iRoll>35)
{
DelayCommand(0.2, MCimbue(oItem, iRange));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>=75)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
}
}
else if (iWType==2)
{
// Mage
iQual=0;
iRoll = d100();
if (iRoll<=CHANCE_WORN&&iRoll>CHANCE_BROKEN&&iChest!=1) // chance of being worn
{
sName = ColorString("Worn "+sIName, 192, 192, 192);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
if (iRoll<=CHANCE_BROKEN&&iChest!=1) // chance of being broken
{
DelayCommand(0.2, ACimbue(oItem, iRange, 1));
sName = ColorString("Broken "+sIName, 255, 0, 0);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
//////////////////////////////////////////// Lvls 1-5 ::Mage::
// Enhancement bonus
DelayCommand(0.2, WeapEnhance(oItem, iRange));
++iQual;
////////////////////////////////////////// Lvls 6-10 ::Mage::
if (iRange==2)
{
// Extra Spell Slot 1-2
iRoll = d100();
if (iRoll>40)
{
iRoll = d3();if (iRoll==3)iRoll==2;
DelayCommand(0.2, SpellSlot(oItem, iRange, iRoll));
++iQual;
}
// Spell Bonus
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, CastImbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 11-20 ::Mage::
if (iRange==3)
{
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Extra Spell Slot 1-4
iRoll = d100();
if (iRoll>35)
{
iRoll = d4();
DelayCommand(0.2, SpellSlot(oItem, iRange, iRoll));
++iQual;
}
// Spell Bonus x 2
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, CastImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, CastImbue(oItem, iRange));
++iQual;
}
// Haste bonus
iRoll = d100();
if (iRoll>90)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
}
////////////////////////////////////////// Lvls 20-30 ::Mage::
if (iRange==4)
{
// Ability bonus
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Extra Spell Slot 1-6
iRoll = d100();
if (iRoll==30)
{
iRoll = d6();
DelayCommand(0.2, SpellSlot(oItem, iRange, iRoll));
}
// Spell Bonus x 2
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, CastImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, CastImbue(oItem, iRange));
++iQual;
}
// Haste bonus
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
// Extra melee damage bonus
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, MeleeImbue(oItem));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 30-40 ::Mage::
if (iRange==5)
{
// Ability bonus
iRoll = d100();
if (iRoll>25)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Extra Spell Slot 1-8
iRoll = d100();
if (iRoll>25)
{
iRoll = d8();
DelayCommand(0.2, SpellSlot(oItem, iRange, iRoll));
++iQual;
}
// Spell Bonus x 3
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, CastImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, CastImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, CastImbue(oItem, iRange));
++iQual;
}
// Haste bonus
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, HasteImbue(oItem));
++iQual;
}
// Extra melee damage bonus
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, MeleeImbue(oItem));
iQual+=2;
}
// Save
iRoll = d100();
if (iRoll>55)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
}
else if (iWType==3)
{
// Monk
iRoll = d100();
if (iRoll<=CHANCE_WORN&&iRoll>CHANCE_BROKEN&&iChest!=1) // chance of being worn
{
sName = ColorString("Worn "+sIName, 192, 192, 192);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
if (iRoll<=CHANCE_BROKEN&&iChest!=1) // chance of being broken
{
DelayCommand(0.2, ACimbue(oItem, iRange, 1));
sName = ColorString("Broken "+sIName, 255, 0, 0);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
SetIdentified(oItem, FALSE);
//////////////////////////////////////////// Lvls 1-5 ::Monk::
// Attack bonus
DelayCommand(0.2, BowEnhance(oItem, iRange));
++iQual;
////////////////////////////////////////// Lvls 6-10 ::Monk::
if (iRange==2)
{
// Ability bonus
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Bonus
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll==90)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
}
////////////////////////////////////////// Lvls 11-20 ::Monk::
if (iRange==3)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Bonus x 2
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Damage Bonus x 2
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>=85)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
}
////////////////////////////////////////// Lvls 20-30 ::Monk::
if (iRange==4)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Bonus x 3
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>=80)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
// Save
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 30-40 ::Monk::
if (iRange==5)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage Bonus x 3
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>=75)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
// Save
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
}
else
{
// Melee
iRoll = d100();
if (iRoll<=CHANCE_WORN&&iRoll>CHANCE_BROKEN&&iChest!=1) // chance of being worn
{
sName = ColorString("Worn "+sIName, 192, 192, 192);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
if (iRoll<=CHANCE_BROKEN&&iChest!=1) // chance of being broken
{
DelayCommand(0.2, ACimbue(oItem, iRange, 1));
sName = ColorString("Broken "+sIName, 255, 0, 0);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
//////////////////////////////////////////// Lvls 1-5 ::Melee::
// Enhancement bonus
DelayCommand(0.2, WeapEnhance(oItem, iRange));
++iQual;
////////////////////////////////////////// Lvls 6-10 ::Melee::
if (iRange==2)
{
// Damage bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Massive Crits
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, MCimbue(oItem, iRange));
++iQual;
}
// Keen bonus
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, KeenImbue(oItem));
++iQual;
}
}
////////////////////////////////////////// Lvls 11-20 ::Melee::
if (iRange==3)
{
// Ability bonus
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage bonus
iRoll = d100();
if (iRoll>35)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Massive Crits
iRoll = d100();
if (iRoll>45)
{
DelayCommand(0.2, MCimbue(oItem, iRange));
++iQual;
}
// Extra melee damage bonus
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, MeleeImbue(oItem));
++iQual;
}
// Keen bonus
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, KeenImbue(oItem));
++iQual;
}
}
////////////////////////////////////////// Lvls 20-30 ::Melee::
if (iRange==4)
{
// Ability bonus
iRoll = d100();
if (iRoll>35)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage bonus x 2
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
if (iRoll>40)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Massive Crits
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, MCimbue(oItem, iRange));
++iQual;
}
// Extra melee damage bonus
iRoll = d100();
if (iRoll>65)
{
DelayCommand(0.2, MeleeImbue(oItem));
++iQual;
}
// Keen bonus
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, KeenImbue(oItem));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 30-40 ::Melee::
if (iRange==5)
{
// Ability bonus
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Damage bonus x 3
iRoll = d100();
if (iRoll>25)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Massive Crits
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, MCimbue(oItem, iRange));
++iQual;
}
// Extra melee damage bonus
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, MeleeImbue(oItem));
++iQual;
}
// Keen bonus
iRoll = d100();
if (iRoll>55)
{
DelayCommand(0.2, KeenImbue(oItem));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
}
}
if (iQual>8)iQual=8;
if (iQual==0)iQual=1;
////////////////////////////////////////////////////////
//: Debugging
//
/*
FloatingTextStringOnCreature("ResRef: "+sType, GetFirstPC());
FloatingTextStringOnCreature("Qual: "+IntToString(iQual), GetFirstPC());
FloatingTextStringOnCreature("Range: "+IntToString(iRange), GetFirstPC());
*/
SetQuality(oItem, sIName, iRange);
SetIdentified(oItem, FALSE);
}
void DropRanged(object oMob, object oSack, int iRange, int SockChance, int iChest)
{
object oPC = GetLastKiller();
object oItem;
itemproperty ipAdd;
string sType, sName, sIName, sSocks;
int iRoll, iDice;
int iQual = 0;
iDice = d4();
switch(iDice)
{
case 1: {sType = "sdsbow"; iRoll = d3();
if (iRoll==1)sIName = "Halfling War Bow";
if (iRoll==2)sIName = "Shortbow";
if (iRoll==3)sIName = "Bloodstring";}
break;
case 2: {sType = "sdlcbow"; iRoll = d3();
if (iRoll==1)sIName = "Light Crossbow";
if (iRoll==2)sIName = "Bolt Pistol";
if (iRoll==3)sIName = "Auto Bow";}
break;
case 3: {sType = "sdhcbow"; iRoll = d3();
if (iRoll==1)sIName = "Battle Crossbow";
if (iRoll==2)sIName = "Bolt Rifle";
if (iRoll==3)sIName = "Steelstring Sniper";}
break;
case 4: {sType = "sdlbow"; iRoll = d3();
if (iRoll==1)sIName = "Siege Bow";
if (iRoll==2)sIName = "Elven War Bow";
if (iRoll==3)sIName = "Battle Bow";}
break;
}
oItem = CreateItemOnObject(sType, oSack, 1, "sf_socket_item");
SetName(oItem, sIName);
// Chance for Socketed Item
iRoll = d100();
if (iRoll<SockChance)
{
iRoll=d6();
SetLocalInt(oItem, "SOCKET_SLOTS", iRoll);
sSocks = IntToString(iRoll);
ipAdd = ItemPropertyCastSpell
(IP_CONST_CASTSPELL_UNIQUE_POWER_SELF_ONLY,
IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
IPSafeAddItemProperty(oItem, ipAdd);
sName = ColorString("Socketed "+sIName+" ("+sSocks+")", 72, 209, 204 );
SetName(oItem, sName);
return;
}
// Chance for worn or broken item
iRoll = d100();
if (iRoll<=CHANCE_WORN&&iRoll>CHANCE_BROKEN&&iChest!=1) // chance of being worn
{
sName = ColorString("Worn "+sIName, 192, 192, 192);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
if (iRoll<=CHANCE_BROKEN&&iChest!=1) // chance of being broken
{
DelayCommand(0.2, ACimbue(oItem, iRange, 1));
sName = ColorString("Broken "+sIName, 255, 0, 0);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
SetIdentified(oItem, FALSE);
//////////////////////////////////////////// Lvls 1-5 ::Ranged::
// Attack bonus
DelayCommand(0.2, BowEnhance(oItem, iRange));
++iQual;
////////////////////////////////////////// Lvls 6-10 ::Ranged::
if (iRange==2)
{
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Massive Crits
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, MCimbue(oItem, iRange));
++iQual;
}
// Mighty
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, MightyEnhance(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll==90)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
}
////////////////////////////////////////// Lvls 11-20 ::Ranged::
if (iRange==3)
{
// Mighty
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, MightyEnhance(oItem, iRange));
++iQual;
}
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Massive Crits
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, MCimbue(oItem, iRange));
++iQual;
}
// Extra range damage bonus
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, RangedImbue(oItem));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>=85)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
}
////////////////////////////////////////// Lvls 20-30 ::Ranged::
if (iRange==4)
{
// Ability bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Massive Crits
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, MCimbue(oItem, iRange));
++iQual;
}
// Mighty
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, MightyEnhance(oItem, iRange));
++iQual;
}
// Extra ranged damage bonus
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, RangedImbue(oItem));
iQual+=2;
}
// Save
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>=80)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
}
////////////////////////////////////////// Lvls 30-40 ::Ranged::
if (iRange==5)
{
// Ability bonus x 2
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, AbilityImbue(oItem, iRange));
++iQual;
}
// Mighty
iRoll = d100();
if (iRoll>20)
{
DelayCommand(0.2, MightyEnhance(oItem, iRange));
++iQual;
}
// Extra melee damage bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, RangedImbue(oItem));
iQual+=2;
}
// Massive Crits
iRoll = d100();
if (iRoll>35)
{
DelayCommand(0.2, MCimbue(oItem, iRange));
++iQual;
}
// Save
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, SaveImbue(oItem, iRange));
++iQual;
}
// Haste
iRoll = d100();
if (iRoll>=75)
{
DelayCommand(0.2, HasteImbue(oItem));
iQual+=2;
}
}
if (iQual>8)iQual=8;
if (iQual==0)iQual=1;
SetQuality(oItem, sIName, iRange);
SetIdentified(oItem, FALSE);
}
void DropAmmo (object oMob, object oSack, int iRange)
{
object oItem;
string sType, sName, sIName;
int iRoll = d4();
int iQual;
int iStack = d10()*9;
switch(iRoll)
{
// Ammo
case 1: {sType = "sdarrow"; iRoll = d3();
if (iRoll==1)sIName = "Arrow";
if (iRoll==2)sIName = "Steel Arrow";
if (iRoll==3)sIName = "Wind Cutter";}
break;
case 2: {sType = "sdbolt"; iRoll = d3();
if (iRoll==1)sIName = "Bolt";
if (iRoll==2)sIName = "Deathpin";
if (iRoll==3)sIName = "Air Lance";}
break;
case 3: {sType = "sdarrow"; iRoll = d3();
if (iRoll==1)sIName = "Air Assassin";
if (iRoll==2)sIName = "Pegasus Horn";
if (iRoll==3)sIName = "Blood Seeker";}
break;
case 4: {sType = "sdbolt"; iRoll = d3();
if (iRoll==1)sIName = "Steel Bolt";
if (iRoll==2)sIName = "Stinger";
if (iRoll==3)sIName = "Blood Sparrow";}
break;
}
oItem = CreateItemOnObject(sType, oSack, iStack);
// Ammo
iRoll = d100();
if (iRoll<=10) // 10% chance of worn item ::Ammo::
{
sName = ColorString("Worn "+sIName, 192, 192, 192);
SetName(oItem, sName);
return;
}
SetIdentified(oItem, FALSE);
//////////////////////////////////////////// Lvls 1-5 ::Ammo::
//++iQual; // Debugging
////////////////////////////////////////// Lvls 6-10 ::Ammo::
if (iRange==2)
{
// Damage bonus
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Vamp Regen bonus
iRoll = d100();
if (iRoll>80)
{
DelayCommand(0.2, VRimbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 11-20 ::Ammo::
if (iRange==3)
{
// Damage bonus x 2
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Vamp Regen bonus
iRoll = d100();
if (iRoll>70)
{
DelayCommand(0.2, VRimbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 20-30 ::Ammo::
if (iRange==4)
{
// Damage bonus x 3
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>45)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>65)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Vamp Regen bonus
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, VRimbue(oItem, iRange));
++iQual;
}
}
////////////////////////////////////////// Lvls 30-40 ::Ammo::
if (iRange==5)
{
// Damage bonus x 4
iRoll = d100();
if (iRoll>20)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>30)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>40)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
iRoll = d100();
if (iRoll>60)
{
DelayCommand(0.2, DAMimbue(oItem, iRange));
++iQual;
}
// Vamp Regen bonus
iRoll = d100();
if (iRoll>50)
{
DelayCommand(0.2, VRimbue(oItem, iRange));
++iQual;
}
}
SetQuality(oItem, sIName, iRange);
}
void DropGem (object oMob, object oSack, int iRange)
{
object oItem;
int iRoll;
int iVal1;
int iVal2;
string sType1;
string sType2;
string sType3;
string sName, pName;
iRoll=d100();
if (iRoll<32)
oItem = CreateItemOnObject("sd_rune", oSack, 1);
else if (iRoll>32&&iRoll<65)
oItem = CreateItemOnObject("sd_rune2", oSack, 1);
else if (iRoll>65)
oItem = CreateItemOnObject("sd_rune3", oSack, 1);
SetIdentified(oItem, FALSE);
iRoll = Random(13)+1;
if (iRoll==1) // mass crits
{
sName = "Brutal Gem";
sName = ColorString(sName, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", 74);
}
else if (iRoll==2) // ability rune
{
switch(iRange)
{
case 1: iVal1 = 1;break;
case 2: iVal1 = 1;break;
case 3: iVal1 = d2();break;
case 4: iVal1 = d2();break;
case 5: iVal1 = d2();break;
}
iRoll=Random(5);
switch(iRoll)
{
case 0: sType1=" Brawny"; break;
case 1: sType1=" Deft";break;
case 2: sType1=" Wise";break;
case 3: sType1=" Hardy";break;
case 4: sType1=" Clever";break;
case 5: sType1=" Charming";break;
}
if (iVal1==0)iVal1=2;
sName = "+"+IntToString(iVal1)+sType1+" Gem";
sName = ColorString(sName, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", 0);
SetLocalInt(oItem, "IP_SUBTYPE", iRoll);
SetLocalInt(oItem, "IP_VALUE", iVal1);
}
else if (iRoll==3) // ac rune
{
switch(iRange)
{
case 1: iVal1 = 1;break;
case 2: iVal1 = d2();break;
case 3: iVal1 = d2();break;
case 4: iVal1 = d3();break;
case 5: iVal1 = d3();break;
}
if (iVal1==0)iVal1=1;
sName = "+"+IntToString(iVal1)+" AC Gem";
sName = ColorString(sName, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", 1);
SetLocalInt(oItem, "IP_VALUE", iVal1);
}
else if (iRoll==4) // ab rune
{
switch(iRange)
{
case 1: iVal1 = 1;break;
case 2: iVal1 = d2();break;
case 3: iVal1 = d2();break;
case 4: iVal1 = d3();break;
case 5: iVal1 = d3();break;
}
if (iVal1==0)iVal1=2;
sName = "+"+IntToString(iVal1)+" Agressive Gem";
sName = ColorString(sName, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", 56);
SetLocalInt(oItem, "IP_VALUE", iVal1);
}
else if (iRoll==5) // Enhancement rune
{
switch(iRange)
{
case 1: iVal1 = 1;break;
case 2: iVal1 = d2();break;
case 3: iVal1 = d2();break;
case 4: iVal1 = d3();break;
case 5: iVal1 = d3();break;
}
if (iVal1==0)iVal1=2;
sName = "+"+IntToString(iVal1)+" Power Gem";
sName = ColorString(sName, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", 6);
SetLocalInt(oItem, "IP_VALUE", iVal1);
}
else if (iRoll==6) // damage rune
{
int iSubType;
iRoll = Random(13);
switch (iRoll)
{
case 0: {iSubType = 0; sType1 = "Thumping Gem"; break;}
case 1: {iSubType = 1; sType1 = "Impaling Gem";break;}
case 2: {iSubType = 2; sType1 = "Slicing Gem";break;}
case 3: {iSubType = 2;sType1 = "Slicing Gem";break;}
case 4: {iSubType = 9;sType1 = "Zapping Gem";break;}
case 5: {iSubType = 5; sType1 = "Magical Gem";break;}
case 6: {iSubType = 6; sType1 = "Corrosive Gem";break;}
case 7: {iSubType = 7; sType1 = "Ice Gem";break;}
case 8: {iSubType = 8; sType1 = "Holy Gem";break;}
case 9: {iSubType = 9; sType1 = "Zapping Gem";break;}
case 10: {iSubType = 10; sType1 = "Scorching Gem";break;}
case 11: {iSubType = 11; sType1 = "Evil Gem";break;}
case 12: {iSubType = 12; sType1 = "Benevolent Gem";break;}
case 13: {iSubType = 13; sType1 = "Booming Gem";break;}
}
if (iVal1==0)iVal1=2;
sName = ColorString(sType1, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", 16);
SetLocalInt(oItem, "IP_SUBTYPE", iSubType);
}
else if (iRoll==7) // VampRegen
{
iRoll = d4();
switch(iRange)
{
case 1: iVal1 = 1;break;
case 2: iVal1 = d2();break;
case 3: iVal1 = d2();break;
case 4: iVal1 = d3();break;
case 5: iVal1 = d3();break;
}
sName = "Feeding Gem";
sName = ColorString(sName, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", 67);
SetLocalInt(oItem, "IP_VALUE", iVal1);
}
else if (iRoll==8) // Misc
{
int iType1;
switch(iRange)
{
case 1:
{
iRoll = d6();
if (iRoll==1){iType1 = 888; sType2 = "Cracked";}
if (iRoll==2){iType1 = 888; sType2 = "Cracked";}
if (iRoll==3){iType1 = 43; sType2 = "Deadly";}
if (iRoll==4){iType1 = 35; sType2 = "Speedy";}
if (iRoll==5){iType1 = 75; sType2 = "Unstoppable";}
if (iRoll==6){iType1 = 888; sType2 = "Cracked";}
}break;
case 2:
{
iRoll = d6();
if (iRoll==1){iType1 = 36; sType2 = "Vengeful";}
if (iRoll==2){iType1 = 75; sType2 = "Unstoppable";}
if (iRoll==3){iType1 = 35; sType2 = "Speedy";}
if (iRoll==4){iType1 = 43; sType2 = "Deadly";}
if (iRoll==5){iType1 = 888; sType2 = "Cracked";}
if (iRoll==6){iType1 = 888; sType2 = "Cracked";}
}break;
case 3:
{
iRoll = d6();
if (iRoll==1){iType1 = 36; sType2 = "Vengeful";}
if (iRoll==2){iType1 = 43; sType2 = "Deadly";}
if (iRoll==3){iType1 = 75; sType2 = "Unstoppable";}
if (iRoll==4){iType1 = 38; sType2 = "Slippery";}
if (iRoll==5){iType1 = 36; sType2 = "Vengeful";}
if (iRoll==6){iType1 = 35; sType2 = "Speedy";}
}break;
case 4:
{
iRoll = d6();
if (iRoll==1){iType1 = 36; sType2 = "Vengeful";}
if (iRoll==2){iType1 = 43; sType2 = "Deadly";}
if (iRoll==3){iType1 = 75; sType2 = "Unstoppable";}
if (iRoll==4){iType1 = 38; sType2 = "Slippery";}
if (iRoll==5){iType1 = 35; sType2 = "Speedy";}
if (iRoll==6){iType1 = 35; sType2 = "Speedy";}
}break;
case 5:
{
iRoll = d6();
if (iRoll==1){iType1 = 43; sType2 = "Deadly";}
if (iRoll==2){iType1 = 43; sType2 = "Deadly";}
if (iRoll==3){iType1 = 75; sType2 = "Unstoppable";}
if (iRoll==4){iType1 = 38; sType2 = "Slippery";}
if (iRoll==5){iType1 = 35; sType2 = "Speedy";}
if (iRoll==6){iType1 = 35; sType2 = "Speedy";}
}break;
}
pName = sType2+" Gem";
if (iType1==888)
{
sName = ColorString(pName, 255, 0, 0);
SetName(oItem, sName);
SetIdentified(oItem, TRUE);
return;
}
else sName = ColorString(pName, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", iType1);
}
else if (iRoll==9) // Regen
{
iRoll = d4();
switch(iRange)
{
case 1: iVal1 = 1;break;
case 2: iVal1 = d2();break;
case 3: iVal1 = d2();break;
case 4: iVal1 = d3();break;
case 5: iVal1 = d3();break;
}
sName = "Living Gem";
sName = ColorString(sName, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", 51);
SetLocalInt(oItem, "IP_VALUE", iVal1);
}
else if (iRoll==10) // damage res rune
{
int iSubType;
iRoll = Random(13);
switch (iRoll)
{
case 0: {iSubType = 0; sType1 = "Solid Gem"; break;} //bludg
case 1: {iSubType = 1; sType1 = "Dense Gem";break;} //pierc
case 2: {iSubType = 2; sType1 = "Mesh Gem";break;} //slash
case 3: {iSubType = 2;sType1 = "Mesh Gem";break;}
case 4: {iSubType = 9;sType1 = "Grounding Gem";break;} //elec
case 5: {iSubType = 5; sType1 = "Mantle Gem";break;} //mag
case 6: {iSubType = 6; sType1 = "Alkaline Gem";break;} //acid
case 7: {iSubType = 7; sType1 = "Warm Gem";break;} //cold
case 8: {iSubType = 8; sType1 = "Absolution Gem";break;} //div
case 9: {iSubType = 9; sType1 = "Grounding Gem";break;}
case 10: {iSubType = 10; sType1 = "Dragonscale Gem";break;} //fire
case 11: {iSubType = 11; sType1 = "Order Gem";break;} //neg
case 12: {iSubType = 12; sType1 = "Chaos Gem";break;} //pos
case 13: {iSubType = 13; sType1 = "Dampening Gem";break;} //son
}
sName = ColorString(sType1, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", 23);
SetLocalInt(oItem, "IP_SUBTYPE", iSubType);
}
else if (iRoll==11) // Mighty rune
{
switch(iRange)
{
case 1: iVal1 = Random(2)+1;break; //1-2
case 2: iVal1 = d3();break; //1-3
case 3: iVal1 = d3()+1;break; //2-4
case 4: iVal1 = d3()+2;break; //3-5
case 5: iVal1 = d4()+3;break; //4-6
}
if (iVal1==0)iVal1=2;
sName = "+"+IntToString(iVal1)+" Pegasus Gem";
sName = ColorString(sName, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", 45);
SetLocalInt(oItem, "IP_VALUE", iVal1);
}
else if (iRoll==12) // Spell Res rune
{
sName = "Arcane Gem";
sName = ColorString(sName, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", 39);
}
else if (iRoll==13) // save rune
{
switch(iRange)
{
case 1: iVal1 = 1;break;
case 2: iVal1 = 1;break;
case 3: iVal1 = d2();break;
case 4: iVal1 = d2();break;
case 5: iVal1 = d3();break;
}
iRoll=d3();
switch(iRoll)
{
case 1: sType1=" Resilient"; break;
case 2: sType1=" Unwavering";break;
case 3: sType1=" Reactive";break;
}
if (iVal1==0)iVal1=2;
sName = "+"+IntToString(iVal1)+sType1+" Gem";
sName = ColorString(sName, 127, 255, 212 );
SetName(oItem, sName);
SetLocalInt(oItem, "IP_TYPE", 40);
SetLocalInt(oItem, "IP_SUBTYPE", iRoll);
SetLocalInt(oItem, "IP_VALUE", iVal1);
}
}
void sd_droploot (object oMob, object oSack)
{
object oPC = GetFirstPC();
// no loot if killed in stonewatch
// chances are it was an uber guard
// and not the PC that did the killing.
// This is to prevent easy looting higher mobs
if (GetTag(GetArea(oMob))=="Stonewatch")return;
// animals dont usually carry wares - but you can skin em!
// This is to prevent tiny rats dropping full plate mail - can't have that!
if (GetRacialType(oMob)== RACIAL_TYPE_ANIMAL ||
GetRacialType(oMob)== RACIAL_TYPE_BEAST)
{CreateItemOnObject("sd_skin", oSack, 1); return;}
if (GetTag(oMob)=="NW_BAT" && d100()<21)
{CreateItemOnObject("sd_batgland", oSack, 1); return;}
if (GetResRef(GetLastKiller())=="stonewatchpatrol")return;
/////////////////////////////////////////
//::Droprate config::
//
int DamBroke = 0;
int lMod, mMod, rMod;
int gMod = 2;
int iSkill = GetLocalInt(oPC, "alch_skill");
// for every 4 alchemy skill points, the droprate of recipes
// increases by 1%
float fAlchMod = IntToFloat(iSkill) * 0.25;
int iAlchMod = FloatToInt(fAlchMod);
// adjust the droprate modifyer based on game difficulty
// if there is no game difficulty: Default to normal
int iDiff = GetLocalInt(GetModule(), "sd_game_diff");
if (iDiff==0)lMod = DROP_RATE; //default
if (iDiff==1)lMod = 8;
if (iDiff==2)lMod = 1;
// Make monk gloves a rare drop except when the player is a lvl 5+ monk
if (GetLevelByClass(CLASS_TYPE_MONK, oPC)>2)mMod = 8;
else mMod=2;
// Gems drop a little more frequently after lvl 10
if (GetHitDice(oPC)>9)gMod = 5;
// Ranged mobs have a high chance to drop bows / crossbows
if (GetLocalInt(oMob, "archer")==1)rMod = 15;
// Bosses have high chance to drop loot (never broken or worn)
if (GetLocalInt(oMob, "BOSS")==1){lMod = 50; DamBroke = 1;}
int WeapChance = 6+lMod; // % chance to drop a weapon
int RangedChance = lMod+rMod+1; // % chance to drop a ranged weapon
int MonkChance = mMod; // % chance to drop monk gloves
int SockChance = 15; // % chance to drop a socketed item
int ArmorChance = 5+lMod; // % chance to drop armor or a shield
int MItemChance = 5+lMod; // % chance to drop a magic item
int RodWandChance = 3+lMod; // % chance to drop a wand/rod item
int AlchRecChance = 4+iAlchMod; // % chance to drop an alchemy recipe
int AmmoChance = 5+lMod+rMod; // % chance to drop a bolt or an arrow
int GoldChance = 26+lMod; // % chance to drop some gold
int PotChance = 15+lMod; // % chance to drop a potion
int ScrollChance = 10+lMod; // % chance to drop a magic scroll
int GemChance = gMod; // % chance to drop a socket gem
int MiscChance = 1; // % chance to drop a miscellaneous item
int SetItemChance = 100; // % chance to drop a class item setpiece
//
//
/////////////////////////////////////////////////
//::initiate variables:: //
int iDice;
int iHD = GetHitDice(oMob);
int iRange;
int iMage;
/////////////////////////////////////////////////
// only casters drop scrolls, wands and rods
if (GetLevelByClass(CLASS_TYPE_DRUID)>0||GetLevelByClass(CLASS_TYPE_BARD)>0
||GetLevelByClass(CLASS_TYPE_CLERIC)>0||GetLevelByClass(CLASS_TYPE_SORCERER)>0
||GetLevelByClass(CLASS_TYPE_WIZARD)>0) iMage=1;
/////////////////////////////////////////////////
//::Quality range based on level of monster:: //
if (iHD>0&&iHD<6)iRange=1; // lvl 1-5
if (iHD>5&&iHD<11)iRange=2; // lvl 6-10
if (iHD>10&&iHD<20)iRange=3; // lvl 11-19
if (iHD>19&&iHD<30)iRange=4; // lvl 20-29
if (iHD>29&&iHD<41)iRange=5; // lvl 30-40
//chance of a more powerful item
if (LUCK_CHANCE>0)
{
iDice = Random(LUCK_CHANCE);
if (iDice==LUCK_CHANCE){++iRange; if (iRange==6)iRange=5;
FloatingTextStringOnCreature("* Luck has favoured you *", GetFirstPC());}
}
///////////////////
//:Debugging
//:
////////////////////////////////////////////////
// SetItem Roll
iDice = d100();
if (GetLocalInt(oMob, "BOSS")==1 && iDice<SetItemChance+1)
DropSetItem(oMob, oSack, 0);
// Gold Roll
iDice = d100();
if (iDice<GoldChance+1)DropGold(oMob, oSack, DamBroke);
// Rod/Wand Roll
iDice = d100();
if (iDice<RodWandChance+1&&iMage==1)DropRodWand(oMob, oSack);
// Weapon Roll
iDice = d100();
if (iDice<WeapChance+1)DropWeapon(oMob, oSack, iRange, SockChance, DamBroke);
// Ranged Weapon Roll
iDice = d100();
if (iDice<RangedChance+1)DropRanged(oMob, oSack, iRange, SockChance, DamBroke);
// Monk Gloves Roll
iDice = d100();
if (iDice<MonkChance+1)DropMonkGloves(oMob, oSack, iRange, SockChance, DamBroke);
// Armor or shield Roll
iDice = d100();
if (iDice<ArmorChance+1)
{
iDice = d100();
if (iDice>59)DropShield(oMob, oSack, iRange, SockChance, DamBroke);
else DropArmor(oMob, oSack, iRange, SockChance, DamBroke);
}
// Magic Item Roll
iDice = d100();
if (iDice<MItemChance+1)DropMagicItem(oMob, oSack, iRange, SockChance, DamBroke);
// Misc Item Roll
iDice = d100();
if (iDice<MiscChance+1)DropMisc(oMob, oSack);
// Ranged Ammo Roll
iDice = d100();
if (iDice<AmmoChance+1)DropAmmo(oMob, oSack, iRange);
// Pot Roll
iDice = d100();
if (iDice<PotChance+1)DropPot(oMob, oSack, 1);
// Scroll Roll
iDice = d100();
if (iDice<ScrollChance+1&&iMage==1)DropScroll(oMob, oSack, iRange);
// Alchemy Recipe Roll
iDice = d100();
if (iDice<AlchRecChance+1&&iMage==1)DropAlchemyRecipe(oMob, oSack, iRange);
// Gem Roll
iDice = d100();
if (iDice<GemChance+1)DropGem(oMob, oSack, iRange);
}
///////////////////////////
//: For test compiling only
//: void main(){}