163 lines
5.9 KiB
Plaintext
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
|
|
//
|
|
|
|
}
|