Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
191 lines
7.1 KiB
Plaintext
191 lines
7.1 KiB
Plaintext
/** @file
|
|
* Caching 2da read function and related.
|
|
*
|
|
* SQL/NWNx functions now in inc_sql
|
|
* @author Primogenitor
|
|
*
|
|
* @todo Document the constants and functions
|
|
*/
|
|
|
|
const int DEBUG_GET2DACACHE = FALSE;
|
|
|
|
string Get2DACache(string s2DA, string sColumn, int nRow);
|
|
|
|
string GetBiowareDBName();
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Include section */
|
|
//////////////////////////////////////////////////
|
|
|
|
#include "inc_debug"
|
|
//#include "prc_inc_switch"
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Function defintions */
|
|
//////////////////////////////////////////////////
|
|
|
|
/*
|
|
This is fugly and long. Should maybe be refactored to multiple functions. But everything inline does give
|
|
a few less instructions used.
|
|
|
|
Caching behaviour: Tokens in creature inventory
|
|
*/
|
|
string Get2DACache(string s2DA, string sColumn, int nRow)
|
|
{
|
|
//lower case the 2da and column
|
|
s2DA = GetStringLowerCase(s2DA);
|
|
sColumn = GetStringLowerCase(sColumn);
|
|
|
|
/*//get the chest that contains the cache
|
|
object oCacheWP = GetObjectByTag("Bioware2DACache");
|
|
//if no chest, use HEARTOFCHAOS in limbo as a location to make a new one
|
|
if (!GetIsObjectValid(oCacheWP))
|
|
{
|
|
if(DEBUG_GET2DACACHE) DoDebug("Get2DACache: Cache container creature does not exist, creating new one");
|
|
//oCacheWP = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_chest2",
|
|
// GetLocation(GetObjectByTag("HEARTOFCHAOS")), FALSE, "Bioware2DACache");
|
|
//has to be a creature, placeables cant go through the DB
|
|
oCacheWP = CreateObject(OBJECT_TYPE_CREATURE, "prc_2da_cache",
|
|
GetLocation(GetObjectByTag("HEARTOFCHAOS")), FALSE, "Bioware2DACache");
|
|
}
|
|
|
|
//get the token for this file
|
|
string sFileWPName = s2DA + "_" + sColumn + "_" + IntToString(nRow / 1000);
|
|
//if(DEBUG_GET2DACACHE) DoDebug("Get2DACache: Token tag is " + sFileWPName);
|
|
object oFileWP = GetObjectByTag(sFileWPName);
|
|
//token doesnt exist make it
|
|
if(!GetIsObjectValid(oFileWP))
|
|
{
|
|
if(DEBUG_GET2DACACHE) DoDebug("Get2DACache: Token does not exist, creating new one");
|
|
|
|
// Use containers to avoid running out of inventory space
|
|
int nContainer = 0;
|
|
string sContainerName = "Bio2DACacheTokenContainer_" + GetSubString(s2DA, 0, 1) + "_";
|
|
object oContainer = GetObjectByTag(sContainerName + IntToString(nContainer));
|
|
|
|
// Find last existing container
|
|
if(GetIsObjectValid(oContainer))
|
|
{
|
|
if(DEBUG_GET2DACACHE) DoDebug("Get2DACache: Seeking last container in series: " + sContainerName);
|
|
// find the last container
|
|
nContainer = GetLocalInt(oContainer, "ContainerCount");
|
|
oContainer = GetObjectByTag(sContainerName + IntToString(nContainer));
|
|
|
|
if(DEBUG_GET2DACACHE) DoDebug("Get2DACache: Found: " + DebugObject2Str(oContainer));
|
|
|
|
// Make sure it's not full
|
|
if(GetLocalInt(oContainer, "NumTokensInside") >= 34) // Container has 35 slots. Attempt to not use them all, just in case
|
|
{
|
|
if(DEBUG_GET2DACACHE) DoDebug("Get2DACache: Container full: " + DebugObject2Str(oContainer));
|
|
oContainer = OBJECT_INVALID;
|
|
++nContainer; // new container is 1 higher than last one
|
|
}
|
|
}
|
|
// We need to create a container
|
|
if(!GetIsObjectValid(oContainer))
|
|
{
|
|
if(DEBUG_GET2DACACHE) DoDebug("Get2DACache: Creating new container");
|
|
|
|
oContainer = CreateObject(OBJECT_TYPE_ITEM, "nw_it_contain001", GetLocation(oCacheWP), FALSE, sContainerName + IntToString(nContainer));
|
|
DestroyObject(oContainer);
|
|
oContainer = CopyObject(oContainer, GetLocation(oCacheWP), oCacheWP, sContainerName + IntToString(nContainer));
|
|
// store the new number of containers in this series
|
|
if (nContainer)
|
|
SetLocalInt( GetObjectByTag(sContainerName + "0"), "ContainerCount", nContainer);
|
|
// else this is the first container - do nothing as this is the same as storing 0 on it.
|
|
// Also here we still have 2 objects with the same tag so above code may get
|
|
// the object destroyed at the end of the function if this is the first container.
|
|
}
|
|
|
|
if(DEBUG_GET2DACACHE) DoDebug("Get2DACache: Using container: " + DebugObject2Str(oContainer));
|
|
|
|
// Create the new token
|
|
//oFileWP = CreateObject(OBJECT_TYPE_ITEM, "hidetoken", GetLocation(oCacheWP), FALSE, sFileWPName);
|
|
//DestroyObject(oFileWP);
|
|
//oFileWP = CopyObject(oFileWP, GetLocation(oCacheWP), oCacheWP, sFileWPName);
|
|
oFileWP = CreateItemOnObject("hidetoken", oContainer, 1, sFileWPName);
|
|
|
|
//SetName(oFileWP, "2da Cache - " + sFileWPName);
|
|
|
|
// Increment token count tracking variable
|
|
SetLocalInt(oContainer, "NumTokensInside", GetLocalInt(oContainer, "NumTokensInside") + 1);
|
|
}
|
|
|
|
// get the value from the cache
|
|
string s = GetLocalString(oFileWP, s2DA+"|"+sColumn+"|"+IntToString(nRow));
|
|
//entry didnt exist in the cache
|
|
if(s == "")
|
|
{
|
|
//fetch from the 2da file
|
|
s = Get2DAString(s2DA, sColumn, nRow);
|
|
|
|
// store it on the waypoint
|
|
SetLocalString(oFileWP, s2DA+"|"+sColumn+"|"+IntToString(nRow),
|
|
(s == "" ? "****" : s) ); // this sets the stored string to "****" if s is an empty string (else stores s)
|
|
if(DEBUG_GET2DACACHE) DoDebug("Get2DACache: Missing from cache: " + s2DA + "|" + sColumn + "|" + IntToString(nRow));
|
|
}
|
|
//if(DEBUG_GET2DACACHE) PrintString("Get2DACache: Returned value is '" + s + "'");*/
|
|
string s = Get2DAString(s2DA, sColumn, nRow);
|
|
return s == "****" ? "" : s;
|
|
}
|
|
|
|
string GetBiowareDBName()
|
|
{
|
|
string sReturn;
|
|
sReturn = "prc_data";
|
|
//if(GetPRCSwitch(MARKER_PRC_COMPANION))
|
|
// sReturn += "cp";
|
|
if(GetPRCSwitch(MARKER_CEP1))
|
|
sReturn += "c1";
|
|
if(GetPRCSwitch(MARKER_CEP2))
|
|
sReturn += "c2";
|
|
if(GetPRCSwitch(MARKER_Q))
|
|
sReturn += "q";
|
|
return sReturn;
|
|
|
|
}
|
|
|
|
/**
|
|
* Gets the file end for the given 2da.
|
|
*
|
|
* @param sTable The 2da to get the file end for
|
|
* @return The file end value of the 2da.
|
|
*/
|
|
int PRCGetFileEnd(string sTable)
|
|
{
|
|
sTable = GetStringLowerCase(sTable);
|
|
return GetPRCSwitch("PRC_FILE_END_" + sTable);
|
|
/* //check fileends.2da first
|
|
int nEnd = StringToInt(Get2DACache("fileends", sTable, 0));
|
|
|
|
//still nothing - check
|
|
if(!nEnd) nEnd = StringToInt(Get2DACache("fileends", GetStringLeft(sTable, 8)+"*", 0));
|
|
|
|
return nEnd;*/
|
|
}
|
|
|
|
/**
|
|
* Gets the file end for special PRC files - used in new spellbook system.
|
|
*
|
|
* cls_psipw_*
|
|
* cls_move_*
|
|
* cls_true_*
|
|
* cls_inv_*
|
|
* cls_spell_*
|
|
*
|
|
* @param sTable The 2da to get the file end for
|
|
* @return The file end value of the 2da.
|
|
*/
|
|
int PRCGetDynamicFileEnd(string sTable)
|
|
{
|
|
int nRet = StringToInt(Get2DACache(sTable, "label", 0));
|
|
if(!nRet)
|
|
{
|
|
if (DEBUG) DoDebug("FileEnd for "+sTable+" not found! Using default value.");
|
|
nRet = 2720;
|
|
}
|
|
return nRet;
|
|
}
|
|
|
|
//Cache setup functions moved to inc_cache_setup
|