WizardryEE/Module/nss/spawn_cfg_loot.nss
Jaysyn904 71a604d04a Added NESS. Updated Level 10
Added NESS.  Updated Level 10.  Full compile.
2023-04-20 23:24:24 -04:00

163 lines
5.9 KiB
Plaintext

//
// Spawn Loot
//
// History:
// --/--/-- Neshke Created
// 12/03/02 Cereborn Added DanielleB's merchant-based loot tables
// 12/31/02 Cereborn Use newly added flags for determining the
// probabilities of 1,2, or 3 item drops from
// merchant-based (LT500-LT999) loot tables.
// Fixed an off-by-one bug in the item choosing
// code for for merchant-based loot tables. The
// code was trying to take items 2 through n+1.
//
int ParseFlagValue(string sName, string sFlag, int nDigits, int nDefault);
int ParseSubFlagValue(string sName, string sFlag, int nDigits, string sSubFlag, int nSubDigits, int nDefault);
object GetChildByTag(object oSpawn, string sChildTag);
object GetChildByNumber(object oSpawn, int nChildNum);
object GetSpawnByID(int nSpawnID);
void DeactivateSpawn(object oSpawn);
void DeactivateSpawnsByTag(string sSpawnTag);
void DeactivateAllSpawns();
void DespawnChildren(object oSpawn);
void DespawnChildrenByTag(object oSpawn, string sSpawnTag);
void CleanInventory(object oSpawned);
//
//
void LootTable(object oSpawn, object oSpawned, int nLootTable)
{
// Initialize
object oItem;
string sTemplate;
int nStack;
//
// Only Make Modifications Between These Lines
// -------------------------------------------
// Table 00
if (nLootTable == 0)
{
// 50% Chance
if (d100(1) > 50)
{
// Created Custom Item with ResRef of magicsword
sTemplate = "magicsword";
nStack = 1;
}
oItem = CreateItemOnObject(sTemplate, oSpawned, nStack);
}
//
// Random Gold and *Nothing* Else
else if (nLootTable == 1)
{
CleanInventory(oSpawned);
// Add our Items: Gold for Example
nStack = Random(50) + 1;
oItem = CreateItemOnObject("nw_it_gold001", oSpawned, nStack);
}
// Merchant-based loot - from DanieleB NESS scripts
else if( nLootTable >= 500 )
{
object oStore = OBJECT_INVALID;
oStore = GetObjectByTag( "LOOT_" + IntToString(nLootTable));
object oItem;
int nCount;
int nAmount;
if( GetIsObjectValid( oStore ) )
{
// -- check if we already know item count
nCount = GetLocalInt( oStore , "nItemCount" );
if( nCount <= 0 )
{
// -- Count Items in Store Inventory
oItem = GetFirstItemInInventory( oStore );
while( GetIsObjectValid( oItem ) )
{
nCount++ ;
oItem = GetNextItemInInventory( oStore );
}
SetLocalInt( oStore , "nItemCount" , nCount );
}
// -- probability for multiple items
nAmount = d100();
// Cereborn: removed 12/31/02
// Old:
// int nProbOneItem = 50; // 50% chance 1 item
// int nProbTwoItems = 15; // 15% chance 2 items
// int nProbThreeItems = 5; // 5% chance 3 items
// 30% chance no items ( implied )
// New:
int nProbOneItem = GetLocalInt(oSpawn, "f_LootTable1ItemChance");
int nProbTwoItems = GetLocalInt(oSpawn, "f_LootTable2ItemChance");
int nProbThreeItems = GetLocalInt(oSpawn, "f_LootTable3ItemChance");
if( nAmount <= nProbThreeItems )
nAmount = 3;
else
if( nAmount <= nProbThreeItems + nProbTwoItems )
nAmount = 2;
else
if( nAmount <= nProbThreeItems + nProbTwoItems + nProbOneItem )
nAmount = 1;
else
nAmount = 0;
// -- Generate nAmount items on oSpawned
while( nAmount > 0 )
{
// -- Determine random item
int nSelected;
int nRand = Random( nCount ) + 1;
// -- Get the item
oItem = GetFirstItemInInventory( oStore );
for( nSelected = 1 ; nSelected < nRand ; nSelected++ )
{
oItem = GetNextItemInInventory( oStore );
}
// -- Grab item template
if (oItem != OBJECT_INVALID)
{
sTemplate = GetResRef( oItem );
}
// -- Checks to see if this it is a ammo or thrown item and creates more in the stack
string sRoot = GetStringLowerCase( GetSubString( sTemplate , 0 , 6 ) );
if( sRoot == "nw_wam" || sRoot == "nw_wth" )
{
nStack = Random( 30 ) + 1;
}
else
// -- Check if the item is Gold, and creates more in Stack
// small amount generated : gold placement should maybe be handled in some other way.
if( GetStringLowerCase( sTemplate ) == "nw_it_gold001" )
nStack = Random( 30 ) + 5;
else
if( nStack < 1 )
nStack = 1;
// -- create the item on oSpawned
oItem = CreateItemOnObject( sTemplate , oSpawned , nStack );
// -- decerement the Item Amount counter
nAmount--;
}
}
else
{
// Write to log
PrintString( "Could not find Loot Merchant [" +
"LOOT_" +
IntToString( nLootTable ) +
"] for Spawn Waypoint : " +
GetLocalString(oSpawn, "f_Flags") );
}
}
// -------------------------------------------
// Only Make Modifications Between These Lines
//
}