Fixed CCOH, Fixed starting GP, Fixed DMFI languages, Fix cep weapon appearances, Fixed new player start up system. Added PC deleter. Added ACP 4.1. Full compile. Updated release archive.
3184 lines
82 KiB
Plaintext
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(){}
|
|
|