PRC8/nwn/nwnprc/trunk/include/inc_2dacache.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
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.
2024-02-11 14:01:05 -05:00

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