Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
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
|