Renamed inc_array to stop nwnx include collisions Added missing bonus feat 2da for Forest Master. Changed prc_newspellbook.hak to prc_nsb.hak to prevent issues with nwserver. Updated tester module. Updated release archive.
598 lines
25 KiB
Plaintext
598 lines
25 KiB
Plaintext
/*
|
|
|
|
This file is used for lookup functions for psionics and newspellbooks
|
|
It is supposed to reduce the need for large loops that may result in
|
|
TMI errors.
|
|
It does this by creating arrays in advance and the using those as direct
|
|
lookups.
|
|
*/
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Function prototypes */
|
|
//////////////////////////////////////////////////
|
|
|
|
|
|
void MakeLookupLoop(int nClass, string sFile, int nMin, int nMax, int nLoopSize = 100, string sTemp = "");
|
|
void SetupLookupStage(object oMod, int n);
|
|
|
|
|
|
//this returns the real SpellID of "wrapper" spells cast by psionic or the new spellbooks
|
|
int GetPowerFromSpellID(int nSpellID);
|
|
|
|
/**
|
|
* Maps spells.2da rows of the class-specific entries to corresponding cls_psipw_*.2da rows.
|
|
*
|
|
* @param nSpellID Spells.2da row to determine cls_psipw_*.2da row for
|
|
* @return The mapped value
|
|
*/
|
|
int GetPowerfileIndexFromSpellID(int nSpellID);
|
|
|
|
/**
|
|
* Maps spells.2da rows of the real entries to corresponding cls_psipw_*.2da rows.
|
|
*
|
|
* @param nSpellID Spells.2da row to determine cls_psipw_*.2da row for
|
|
* @return The mapped value
|
|
*/
|
|
int GetPowerfileIndexFromRealSpellID(int nRealSpellID);
|
|
|
|
//this retuns the featID of the class-specific feat for a spellID
|
|
//useful for psionics GetHasPower function
|
|
int GetClassFeatFromPower(int nPowerID, int nClass);
|
|
|
|
/**
|
|
* Determines cls_spell_*.2da index from a given new spellbook class-specific
|
|
* spell spells.2da index.
|
|
*
|
|
* @param nSpell The class-specific spell to find cls_spell_*.2da index for
|
|
* @return The cls_spell_*.2da index in whichever class's file that the
|
|
* given spell belongs to.
|
|
* If the spell at nSpell isn't a newspellbook class-specific spell,
|
|
* returns -1 instead.
|
|
*/
|
|
int SpellToSpellbookID(int nSpell);
|
|
|
|
/**
|
|
* Determines cls_spell_*.2da index from a given spells.2da index.
|
|
*
|
|
* @param nClass The class in whose spellbook to search in
|
|
* @param nSpell The spell to search for
|
|
* @return The cls_spell_*.2da index in whichever class's file that the
|
|
* given spell belongs to.
|
|
* If nSpell does not exist within the spellbook,
|
|
* returns -1 instead.
|
|
*/
|
|
int RealSpellToSpellbookID(int nClass, int nSpell);
|
|
|
|
/**
|
|
* Determines number of metamagics from a given spells.2da index.
|
|
*
|
|
* @param nClass The class in whose spellbook to search in
|
|
* @param nSpell The spell to search for
|
|
* @return The number of metamagics in cls_spell_*.2da
|
|
* for a particular spell.
|
|
*/
|
|
int RealSpellToSpellbookIDCount(int nClass, int nSpell);
|
|
|
|
/**
|
|
* Determines the name of the 2da file that defines the number of alternate magic
|
|
* system powers/spells/whathaveyou known, maximum level of such known and
|
|
* number of uses at each level of the given class. And possibly related things
|
|
* that apply to that specific system.
|
|
*
|
|
* @param nClass CLASS_TYPE_* of the class to determine the powers known 2da name of
|
|
* @return The name of the given class's powers known 2da
|
|
*/
|
|
string GetAMSKnownFileName(int nClass);
|
|
|
|
/**
|
|
* Determines the name of the 2da file that lists the powers/spells/whathaveyou
|
|
* on the given class's list of such.
|
|
*
|
|
* @param nClass CLASS_TYPE_* of the class to determine the power list 2da name of
|
|
* @return The name of the given class's power list 2da
|
|
*/
|
|
string GetAMSDefinitionFileName(int nClass);
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Includes */
|
|
//////////////////////////////////////////////////
|
|
|
|
#include "inc_2dacache"
|
|
#include "prc_inc_array"
|
|
#include "prc_class_const"
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Internal functions */
|
|
//////////////////////////////////////////////////
|
|
|
|
object _inc_lookups_GetCacheObject(string sTag)
|
|
{
|
|
object oWP = GetObjectByTag(sTag);
|
|
if(!GetIsObjectValid(oWP))
|
|
{
|
|
object oChest = GetObjectByTag("Bioware2DACache");
|
|
if(!GetIsObjectValid(oChest))
|
|
{
|
|
//has to be an object, placeables cant go through the DB
|
|
oChest = CreateObject(OBJECT_TYPE_CREATURE, "prc_2da_cache",
|
|
GetLocation(GetObjectByTag("HEARTOFCHAOS")), FALSE, "Bioware2DACache");
|
|
}
|
|
if(!GetIsObjectValid(oChest))
|
|
{
|
|
//has to be an object, placeables cant go through the DB
|
|
oChest = CreateObject(OBJECT_TYPE_CREATURE, "prc_2da_cache",
|
|
GetStartingLocation(), FALSE, "Bioware2DACache");
|
|
}
|
|
|
|
int nContainer = 0;
|
|
string sContainerName = "Bio2DACacheTokenContainer_Lkup_";
|
|
object oContainer = GetObjectByTag(sContainerName + IntToString(nContainer));
|
|
|
|
// Find last existing container
|
|
if(GetIsObjectValid(oContainer))
|
|
{
|
|
nContainer = GetLocalInt(oContainer, "ContainerCount");
|
|
oContainer = GetObjectByTag(sContainerName + IntToString(nContainer));
|
|
|
|
// Make sure it's not full
|
|
if(GetLocalInt(oContainer, "NumTokensInside") >= 34) // Container has 35 slots. Attempt to not use them all, just in case
|
|
{
|
|
oContainer = OBJECT_INVALID;
|
|
++nContainer; // new container is 1 higher than last one
|
|
}
|
|
}
|
|
|
|
// We need to create a container
|
|
if(!GetIsObjectValid(oContainer))
|
|
{
|
|
oContainer = CreateObject(OBJECT_TYPE_ITEM, "nw_it_contain001", GetLocation(oChest), FALSE, sContainerName + IntToString(nContainer));
|
|
DestroyObject(oContainer);
|
|
oContainer = CopyObject(oContainer, GetLocation(oChest), oChest, 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.
|
|
}
|
|
|
|
// Create the new token
|
|
oWP = CreateItemOnObject("hidetoken", oContainer, 1, sTag);
|
|
|
|
// Increment token count tracking variable
|
|
SetLocalInt(oContainer, "NumTokensInside", GetLocalInt(oContainer, "NumTokensInside") + 1);
|
|
}
|
|
|
|
if(!GetIsObjectValid(oWP))
|
|
{
|
|
DoDebug("ERROR: Failed to create lookup storage token for " + sTag);
|
|
return OBJECT_INVALID;
|
|
}
|
|
|
|
return oWP;
|
|
}
|
|
|
|
void SetLkupStage(int nStage, object oModule, int nClass, string sFile)
|
|
{
|
|
SetLocalInt(oModule, "PRCLookup_Stage", nStage + 1);
|
|
SetLocalInt(oModule, "PRCLookup_Class", nClass);
|
|
SetLocalString(oModule, "PRCLookup_File", sFile);
|
|
}
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Function definitions */
|
|
//////////////////////////////////////////////////
|
|
|
|
void RunLookupLoop()
|
|
{
|
|
// check if we run lookup before
|
|
if(GetXP(GetObjectByTag("Bioware2DACache")) & 0x01)
|
|
{
|
|
if (DEBUG) DoDebug("RunLookupLoop() - marker found - exiting");
|
|
return;
|
|
}
|
|
|
|
object oModule = GetModule();
|
|
SetupLookupStage(oModule, 1);
|
|
int nClass = GetLocalInt(oModule, "PRCLookup_Class");
|
|
string sFile = GetLocalString(oModule, "PRCLookup_File");
|
|
if (DEBUG) DoDebug("RunLookupLoop(): Looking in "+sFile+" for nClass "+IntToString(nClass));
|
|
MakeLookupLoop(nClass, sFile, 1, PRCGetDynamicFileEnd(sFile));
|
|
}
|
|
|
|
void RunNextLoop()
|
|
{
|
|
object oModule = GetModule();
|
|
int nStage = GetLocalInt(oModule, "PRCLookup_Stage");
|
|
SetupLookupStage(oModule, nStage);
|
|
int nClass = GetLocalInt(oModule, "PRCLookup_Class");
|
|
if(nClass)
|
|
{
|
|
string sFile = GetLocalString(oModule, "PRCLookup_File");
|
|
if (DEBUG) DoDebug("RunNextLoop(): Looking in "+sFile+" for nClass "+IntToString(nClass));
|
|
MakeLookupLoop(nClass, sFile, 1, PRCGetDynamicFileEnd(sFile));
|
|
}
|
|
else
|
|
{
|
|
DeleteLocalInt(oModule, "PRCLookup_Stage");
|
|
DeleteLocalInt(oModule, "PRCLookup_Class");
|
|
DeleteLocalString(oModule, "PRCLookup_File");
|
|
|
|
//mark lookup as done, tell hb to save the DB
|
|
object oCache = GetObjectByTag("Bioware2DACache");
|
|
SetXP(oCache, GetXP(oCache) | 0x01);
|
|
SetLocalInt(oModule, "Bioware2dacacheCount", GetPRCSwitch(PRC_USE_BIOWARE_DATABASE) - 5);
|
|
}
|
|
}
|
|
|
|
void SetupLookupStage(object oMod, int n)
|
|
{
|
|
switch(n)
|
|
{
|
|
case 1: SetLkupStage(n, oMod, CLASS_TYPE_PSION, "cls_psipw_psion"); break;
|
|
case 2: SetLkupStage(n, oMod, CLASS_TYPE_PSYWAR, "cls_psipw_psywar"); break;
|
|
case 3: SetLkupStage(n, oMod, CLASS_TYPE_WILDER, "cls_psipw_wilder"); break;
|
|
case 4: SetLkupStage(n, oMod, CLASS_TYPE_FIST_OF_ZUOKEN, "cls_psipw_foz"); break;
|
|
case 5: SetLkupStage(n, oMod, CLASS_TYPE_WARMIND, "cls_psipw_warmnd"); break;
|
|
case 6: SetLkupStage(n, oMod, CLASS_TYPE_TRUENAMER, "cls_true_utter"); break;
|
|
case 7: SetLkupStage(n, oMod, CLASS_TYPE_CRUSADER, "cls_move_crusdr"); break;
|
|
case 8: SetLkupStage(n, oMod, CLASS_TYPE_SWORDSAGE, "cls_move_swdsge"); break;
|
|
case 9: SetLkupStage(n, oMod, CLASS_TYPE_WARBLADE, "cls_move_warbld"); break;
|
|
case 10: SetLkupStage(n, oMod, CLASS_TYPE_DRAGONFIRE_ADEPT, "cls_inv_dfa"); break;
|
|
case 11: SetLkupStage(n, oMod, CLASS_TYPE_DRAGON_SHAMAN, "cls_inv_drgshm"); break;
|
|
case 12: SetLkupStage(n, oMod, CLASS_TYPE_WARLOCK, "cls_inv_warlok"); break;
|
|
case 13: SetLkupStage(n, oMod, CLASS_TYPE_ARCHIVIST, "cls_spell_archv"); break;
|
|
case 14: SetLkupStage(n, oMod, CLASS_TYPE_ASSASSIN, "cls_spell_asasin"); break;
|
|
case 15: SetLkupStage(n, oMod, CLASS_TYPE_BARD, "cls_spell_bard"); break;
|
|
case 16: SetLkupStage(n, oMod, CLASS_TYPE_BEGUILER, "cls_spell_beguil"); break;
|
|
case 17: SetLkupStage(n, oMod, CLASS_TYPE_BLACKGUARD, "cls_spell_blkgrd"); break;
|
|
case 18: SetLkupStage(n, oMod, CLASS_TYPE_DREAD_NECROMANCER, "cls_spell_dnecro"); break;
|
|
case 19: SetLkupStage(n, oMod, CLASS_TYPE_DUSKBLADE, "cls_spell_duskbl"); break;
|
|
case 20: SetLkupStage(n, oMod, CLASS_TYPE_FAVOURED_SOUL, "cls_spell_favsol"); break;
|
|
case 21: SetLkupStage(n, oMod, CLASS_TYPE_HARPER, "cls_spell_harper"); break;
|
|
case 22: SetLkupStage(n, oMod, CLASS_TYPE_HEALER, "cls_spell_healer"); break;
|
|
case 23: SetLkupStage(n, oMod, CLASS_TYPE_HEXBLADE, "cls_spell_hexbl"); break;
|
|
case 24: SetLkupStage(n, oMod, CLASS_TYPE_JUSTICEWW, "cls_spell_justww"); break;
|
|
case 25: SetLkupStage(n, oMod, CLASS_TYPE_KNIGHT_CHALICE, "cls_spell_kchal"); break;
|
|
case 26: SetLkupStage(n, oMod, CLASS_TYPE_KNIGHT_MIDDLECIRCLE, "cls_spell_kotmc"); break;
|
|
case 27: SetLkupStage(n, oMod, CLASS_TYPE_OCULAR, "cls_spell_ocu"); break;
|
|
case 28: SetLkupStage(n, oMod, CLASS_TYPE_SHADOWLORD, "cls_spell_tfshad"); break;
|
|
case 29: SetLkupStage(n, oMod, CLASS_TYPE_SHAMAN, "cls_spell_shaman"); break;
|
|
case 30: SetLkupStage(n, oMod, CLASS_TYPE_SLAYER_OF_DOMIEL, "cls_spell_sod"); break;
|
|
case 31: SetLkupStage(n, oMod, CLASS_TYPE_SOHEI, "cls_spell_sohei"); break;
|
|
case 32: SetLkupStage(n, oMod, CLASS_TYPE_SOLDIER_OF_LIGHT, "cls_spell_sol"); break;
|
|
case 33: SetLkupStage(n, oMod, CLASS_TYPE_SORCERER, "cls_spell_sorc"); break;
|
|
case 34: SetLkupStage(n, oMod, CLASS_TYPE_SUBLIME_CHORD, "cls_spell_schord"); break;
|
|
case 35: SetLkupStage(n, oMod, CLASS_TYPE_SUEL_ARCHANAMACH, "cls_spell_suel"); break;
|
|
case 36: SetLkupStage(n, oMod, CLASS_TYPE_VASSAL, "cls_spell_vassal"); break;
|
|
case 37: SetLkupStage(n, oMod, CLASS_TYPE_VIGILANT, "cls_spell_vigil"); break;
|
|
case 38: SetLkupStage(n, oMod, CLASS_TYPE_WARMAGE, "cls_spell_wrmage"); break;
|
|
case 39: SetLkupStage(n, oMod, CLASS_TYPE_BLIGHTER, "cls_spell_blight"); break;
|
|
case 40: SetLkupStage(n, oMod, CLASS_TYPE_NENTYAR_HUNTER, "cls_spell_hunter"); break;
|
|
case 41: SetLkupStage(n, oMod, CLASS_TYPE_KNIGHT_WEAVE, "cls_spell_kngtwv"); break;
|
|
case 42: SetLkupStage(n, oMod, CLASS_TYPE_PSYCHIC_ROGUE, "cls_psipw_psyrog"); break;
|
|
case 43: SetLkupStage(n, oMod, CLASS_TYPE_SHADOWCASTER, "cls_myst_shdcst"); break;
|
|
case 44: SetLkupStage(n, oMod, CLASS_TYPE_SHADOWSMITH, "cls_myst_shdsmt"); break;
|
|
case 45: SetLkupStage(n, oMod, CLASS_TYPE_CELEBRANT_SHARESS, "cls_spell_sharss"); break;
|
|
case 46: SetLkupStage(n, oMod, CLASS_TYPE_CULTIST_SHATTERED_PEAK, "cls_spell_cultst"); break;
|
|
|
|
default: SetLkupStage(n, oMod, 0, ""); break;
|
|
}
|
|
}
|
|
/*
|
|
void LookupSpells(int nRealSpellID, string sClass, string sLevel);
|
|
{
|
|
int nDescriptor = Get2DACache("prc_spells", "Descriptor", nRealSpellID);//should already be in cache, just read the value
|
|
|
|
DESCRIPTOR_ACID
|
|
DESCRIPTOR_AIR
|
|
DESCRIPTOR_COLD
|
|
DESCRIPTOR_LIGHT
|
|
DESCRIPTOR_ELECTRICITY
|
|
DESCRIPTOR_DARKNESS
|
|
DESCRIPTOR_FIRE
|
|
DESCRIPTOR_SONIC
|
|
|
|
|
|
SUBSCHOOL_HEALING
|
|
SUBSCHOOL_SUMMONING
|
|
SUBSCHOOL_POLYMORPH
|
|
|
|
SPELL_SCHOOL_ENCHANTMENT
|
|
SPELL_SCHOOL_NECROMANCY
|
|
SPELL_SCHOOL_ABJURATION
|
|
|
|
string sLevel = Get2DACache("spells", "Cleric", nRealSpellID);
|
|
if(sLevel != "")
|
|
{
|
|
oLevelToken = _inc_lookups_GetCacheObject("SpellLvl_2_Level_"+sLevel);
|
|
// check if array exist, if not create one
|
|
if(!array_exists(oLevelToken, "Lkup"))
|
|
array_create(oLevelToken, "Lkup");
|
|
array_set_int(oLevelToken, "Lkup", array_get_size(oLevelToken, "Lkup"), i);
|
|
}
|
|
sLevel = Get2DACache("spells", "Druid", nRealSpellID);
|
|
if(sLevel != "")
|
|
{
|
|
oLevelToken = _inc_lookups_GetCacheObject("SpellLvl_3_Level_"+sLevel);
|
|
// check if array exist, if not create one
|
|
if(!array_exists(oLevelToken, "Lkup"))
|
|
array_create(oLevelToken, "Lkup");
|
|
array_set_int(oLevelToken, "Lkup", array_get_size(oLevelToken, "Lkup"), i);
|
|
}
|
|
sLevel = Get2DACache("spells", "Paladin", nRealSpellID);
|
|
if(sLevel != "")
|
|
{
|
|
oLevelToken = _inc_lookups_GetCacheObject("SpellLvl_6_Level_"+sLevel);
|
|
// check if array exist, if not create one
|
|
if(!array_exists(oLevelToken, "Lkup"))
|
|
array_create(oLevelToken, "Lkup");
|
|
array_set_int(oLevelToken, "Lkup", array_get_size(oLevelToken, "Lkup"), i);
|
|
}
|
|
sLevel = Get2DACache("spells", "Ranger", nRealSpellID);
|
|
if(sLevel != "")
|
|
{
|
|
oLevelToken = _inc_lookups_GetCacheObject("SpellLvl_7_Level_"+sLevel);
|
|
// check if array exist, if not create one
|
|
if(!array_exists(oLevelToken, "Lkup"))
|
|
array_create(oLevelToken, "Lkup");
|
|
array_set_int(oLevelToken, "Lkup", array_get_size(oLevelToken, "Lkup"), i);
|
|
}
|
|
sLevel = Get2DACache("spells", "Wiz_Sorc", nRealSpellID);
|
|
if(sLevel != "")
|
|
{
|
|
oLevelToken = _inc_lookups_GetCacheObject("SpellLvl_10_Level_"+sLevel);
|
|
// check if array exist, if not create one
|
|
if(!array_exists(oLevelToken, "Lkup"))
|
|
array_create(oLevelToken, "Lkup");
|
|
array_set_int(oLevelToken, "Lkup", array_get_size(oLevelToken, "Lkup"), i);
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
void MakeLookupLoop(int nClass, string sFile, int nMin, int nMax, int nLoopSize = 100, string sTemp = "")
|
|
{
|
|
// Tell the function to skip before reaching nMax
|
|
int bSkipLoop = FALSE;
|
|
int i;
|
|
|
|
if(DEBUG) DoDebug("MakeLookupLoop("
|
|
+IntToString(nClass)+", "
|
|
+sFile+", "
|
|
+IntToString(nMin)+", "
|
|
+IntToString(nMax)+", "
|
|
+IntToString(nLoopSize)+", "
|
|
+") : sTemp = "+sTemp);
|
|
|
|
// psionic, tob, truenameing and ivocation using classes have slightly different handling
|
|
// new AMS classes should be added here
|
|
int bAMS = FALSE;
|
|
|
|
if(nClass == CLASS_TYPE_PSION
|
|
|| nClass == CLASS_TYPE_PSYWAR
|
|
|| nClass == CLASS_TYPE_PSYCHIC_ROGUE
|
|
|| nClass == CLASS_TYPE_WILDER
|
|
|| nClass == CLASS_TYPE_FIST_OF_ZUOKEN
|
|
|| nClass == CLASS_TYPE_WARMIND
|
|
|| nClass == CLASS_TYPE_CRUSADER
|
|
|| nClass == CLASS_TYPE_SWORDSAGE
|
|
|| nClass == CLASS_TYPE_WARBLADE
|
|
|| nClass == CLASS_TYPE_TRUENAMER
|
|
|| nClass == CLASS_TYPE_SHADOWCASTER
|
|
|| nClass == CLASS_TYPE_SHADOWSMITH
|
|
|| nClass == CLASS_TYPE_DRAGONFIRE_ADEPT
|
|
|| nClass == CLASS_TYPE_DRAGON_SHAMAN
|
|
|| nClass == CLASS_TYPE_WARLOCK)
|
|
bAMS = TRUE;
|
|
|
|
//object oSpellIDToken = bAMS ? _inc_lookups_GetCacheObject("PRC_SpellIDToClsPsipw"):
|
|
// _inc_lookups_GetCacheObject("PRC_GetRowFromSpellID");
|
|
|
|
// Failed to obtain a valid token - nothing to store on
|
|
//if(!GetIsObjectValid(oSpellIDToken))
|
|
// bSkipLoop = TRUE;
|
|
|
|
// Starting a new run and the data is present already. Assume the whole thing is present and abort
|
|
if(nMin == 1
|
|
&& GetLocalInt(oSpellIDToken, Get2DACache(sFile, "SpellID", 1)))
|
|
{
|
|
if(DEBUG) DoDebug("MakeLookupLoop("+sFile+") restored from database");
|
|
bSkipLoop = TRUE;
|
|
}
|
|
|
|
if(!bSkipLoop)
|
|
{
|
|
string sClass = IntToString(nClass);
|
|
|
|
//object oLevelToken;
|
|
//object oPowerToken = _inc_lookups_GetCacheObject("PRC_GetPowerFromSpellID");
|
|
//object oRealSpellIDToken = bAMS ? _inc_lookups_GetCacheObject("PRC_GetClassFeatFromPower_"+sClass):
|
|
_inc_lookups_GetCacheObject("PRC_GetRowFromRealSpellID");
|
|
|
|
int nRealSpellID, nFeatID, nCount;
|
|
string sSpellID, sRealSID;
|
|
for(i = nMin; i < nMin + nLoopSize; i++)
|
|
{
|
|
// None of the relevant 2da files have blank Label entries on rows other than 0. We can assume i is greater than 0 at this point
|
|
if(Get2DAString(sFile, "Label", i) == "") // Using Get2DAString() instead of Get2DACache() to avoid caching useless data
|
|
{
|
|
bSkipLoop = TRUE;
|
|
break;// exit the loop
|
|
}
|
|
|
|
sSpellID = Get2DACache(sFile, "SpellID", i);
|
|
sRealSID = Get2DACache(sFile, "RealSpellID", i);
|
|
nRealSpellID = StringToInt(sRealSID);
|
|
|
|
//GetPowerfileIndexFromSpellID
|
|
//SpellToSpellbookID
|
|
SetLocalInt(oSpellIDToken, sSpellID, i);
|
|
|
|
//GetPowerfileIndexFromRealSpellID
|
|
SetLocalInt(oSpellIDToken, sRealSID, i);
|
|
|
|
//GetPowerFromSpellID
|
|
SetLocalInt(oPowerToken, sSpellID, nRealSpellID);
|
|
|
|
//Spell level lookup
|
|
if(!bAMS || nClass == CLASS_TYPE_WARLOCK)
|
|
{
|
|
string sReqFt = bAMS ? "" : Get2DACache(sFile, "ReqFeat", i);// Only new spellbooks have the ReqFeat column. No sense in caching it for other stuff
|
|
if(sReqFt == "")
|
|
{
|
|
string sLevel = Get2DACache(sFile, "Level", i);
|
|
//oLevelToken = _inc_lookups_GetCacheObject("SpellLvl_"+sClass+"_Level_"+sLevel);
|
|
// check if array exist, if not create one
|
|
if(!persistant_array_exists(oLevelToken, "SpellLvl_"+sClass+"_Level_"+sLevel))
|
|
persistant_array_create(oLevelToken, "SpellLvl_"+sClass+"_Level_"+sLevel);
|
|
|
|
persistant_array_get_int(oLevelToken, "SpellLvl_"+sClass+"_Level_"+sLevel, persistant_array_get_size(oLevelToken, "SpellLvl_"+sClass+"_Level_"+sLevel), i);
|
|
|
|
//LookupSpellDescriptor(nRealSpellID, sClass, sLevel);
|
|
}
|
|
}
|
|
|
|
//GetClassFeatFromPower
|
|
if(bAMS)
|
|
{
|
|
nFeatID = StringToInt(Get2DACache(sFile, "FeatID", i));
|
|
if(nFeatID != 0)
|
|
{
|
|
SetLocalInt(oRealSpellIDToken, sRealSID, nFeatID);
|
|
}
|
|
}
|
|
//RealSpellToSpellbookID
|
|
//RealSpellToSpellbookIDCount
|
|
else
|
|
{
|
|
if(sRealSID == sTemp)
|
|
{
|
|
nCount += 1;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
SetLocalInt(oRealSpellIDToken, sClass+"_"+sTemp+"_Count", nCount);
|
|
SetLocalInt(oRealSpellIDToken, sClass+"_"+sRealSID+"_Start", i);
|
|
sTemp = sRealSID;
|
|
nCount = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// And delay continuation to avoid TMI
|
|
if(i < nMax && !bSkipLoop)
|
|
DelayCommand(0.0, MakeLookupLoop(nClass, sFile, i, nMax, nLoopSize, sTemp));
|
|
else
|
|
DelayCommand(0.0, RunNextLoop());
|
|
}
|
|
|
|
int GetPowerFromSpellID(int nSpellID)
|
|
{
|
|
object oWP = GetObjectByTag("PRC_GetPowerFromSpellID");
|
|
int nPower = GetLocalInt(oWP, /*"PRC_GetPowerFromSpellID_" + */IntToString(nSpellID));
|
|
if(nPower == 0)
|
|
nPower = -1;
|
|
return nPower;
|
|
}
|
|
|
|
int GetPowerfileIndexFromSpellID(int nSpellID)
|
|
{
|
|
object oWP = GetObjectByTag("PRC_SpellIDToClsPsipw");
|
|
int nIndex = GetLocalInt(oWP, /*"PRC_SpellIDToClsPsipw_" + */IntToString(nSpellID));
|
|
return nIndex;
|
|
}
|
|
|
|
int GetPowerfileIndexFromRealSpellID(int nRealSpellID)
|
|
{
|
|
object oWP = GetObjectByTag("PRC_SpellIDToClsPsipw");
|
|
int nIndex = GetLocalInt(oWP, /*"PRC_SpellIDToClsPsipw_" + */IntToString(nRealSpellID));
|
|
return nIndex;
|
|
}
|
|
|
|
int GetClassFeatFromPower(int nPowerID, int nClass)
|
|
{
|
|
string sLabel = "PRC_GetClassFeatFromPower_" + IntToString(nClass);
|
|
object oWP = GetObjectByTag(sLabel);
|
|
int nPower = GetLocalInt(oWP, /*sLabel+"_" + */IntToString(nPowerID));
|
|
if(nPower == 0)
|
|
nPower = -1;
|
|
return nPower;
|
|
}
|
|
|
|
int SpellToSpellbookID(int nSpell)
|
|
{
|
|
object oWP = GetObjectByTag("PRC_GetRowFromSpellID");
|
|
int nOutSpellID = GetLocalInt(oWP, /*"PRC_GetRowFromSpellID_" + */IntToString(nSpell));
|
|
if(nOutSpellID == 0)
|
|
nOutSpellID = -1;
|
|
//if(DEBUG) DoDebug("SpellToSpellbookID(" + IntToString(nSpell) + ", " + sFile + ") = " + IntToString(nOutSpellID));
|
|
return nOutSpellID;
|
|
}
|
|
|
|
int RealSpellToSpellbookID(int nClass, int nSpell)
|
|
{
|
|
object oWP = GetObjectByTag("PRC_GetRowFromRealSpellID");
|
|
int nOutSpellID = GetLocalInt(oWP, IntToString(nClass) + "_" + IntToString(nSpell) + "_Start");
|
|
if(nOutSpellID == 0)
|
|
nOutSpellID = -1;
|
|
return nOutSpellID;
|
|
}
|
|
|
|
int RealSpellToSpellbookIDCount(int nClass, int nSpell)
|
|
{
|
|
return GetLocalInt(GetObjectByTag("PRC_GetRowFromRealSpellID"), IntToString(nClass) + "_" + IntToString(nSpell) + "_Count");
|
|
}
|
|
|
|
string GetAMSKnownFileName(int nClass)
|
|
{
|
|
// Get the class-specific base
|
|
string sFile = Get2DACache("classes", "FeatsTable", nClass);
|
|
|
|
// Various naming schemes based on system
|
|
if(nClass == CLASS_TYPE_TRUENAMER)
|
|
sFile = "cls_true_known";
|
|
// ToB
|
|
else if(nClass == CLASS_TYPE_CRUSADER || nClass == CLASS_TYPE_SWORDSAGE || nClass == CLASS_TYPE_WARBLADE)
|
|
sFile = "cls_mvkn" + GetStringRight(sFile, GetStringLength(sFile) - 8); // Hardcoded the cls_ part. It's not as if any class uses some other prefix - Ornedan, 20061210
|
|
// Shadowcasting
|
|
else if(nClass == CLASS_TYPE_SHADOWCASTER || nClass == CLASS_TYPE_SHADOWSMITH)
|
|
sFile = "cls_mykn" + GetStringRight(sFile, GetStringLength(sFile) - 8); // Hardcoded the cls_ part. It's not as if any class uses some other prefix - Ornedan, 20061210
|
|
// Invocations
|
|
else if(nClass == CLASS_TYPE_DRAGONFIRE_ADEPT || nClass == CLASS_TYPE_WARLOCK || nClass == CLASS_TYPE_DRAGON_SHAMAN)
|
|
sFile = "cls_invkn" + GetStringRight(sFile, GetStringLength(sFile) - 8); // Hardcoded the cls_ part. It's not as if any class uses some other prefix - Ornedan, 20061210
|
|
// Assume psionics if no other match
|
|
else
|
|
sFile = "cls_psbk" + GetStringRight(sFile, GetStringLength(sFile) - 8); // Hardcoded the cls_ part. It's not as if any class uses some other prefix - Ornedan, 20061210
|
|
|
|
return sFile;
|
|
}
|
|
|
|
string GetAMSDefinitionFileName(int nClass)
|
|
{
|
|
// Get the class-specific base
|
|
string sFile = Get2DACache("classes", "FeatsTable", nClass);
|
|
|
|
// Various naming schemes based on system
|
|
if(nClass == CLASS_TYPE_TRUENAMER)
|
|
sFile = "cls_true_utter";
|
|
// ToB
|
|
else if(nClass == CLASS_TYPE_CRUSADER || nClass == CLASS_TYPE_SWORDSAGE || nClass == CLASS_TYPE_WARBLADE)
|
|
sFile = "cls_move" + GetStringRight(sFile, GetStringLength(sFile) - 8); // Hardcoded the cls_ part. It's not as if any class uses some other prefix - Ornedan, 20061210
|
|
// Shadowcasting
|
|
else if(nClass == CLASS_TYPE_SHADOWCASTER || nClass == CLASS_TYPE_SHADOWSMITH)
|
|
sFile = "cls_myst" + GetStringRight(sFile, GetStringLength(sFile) - 8); // Hardcoded the cls_ part. It's not as if any class uses some other prefix - Ornedan, 20061210
|
|
// Invoc
|
|
else if(nClass == CLASS_TYPE_DRAGONFIRE_ADEPT || nClass == CLASS_TYPE_WARLOCK || nClass == CLASS_TYPE_DRAGON_SHAMAN)
|
|
sFile = "cls_inv" + GetStringRight(sFile, GetStringLength(sFile) - 8); // Hardcoded the cls_ part. It's not as if any class uses some other prefix - Ornedan, 20061210
|
|
// Assume psionics if no other match
|
|
else
|
|
sFile = "cls_psipw" + GetStringRight(sFile, GetStringLength(sFile) - 8); // Hardcoded the cls_ part. It's not as if any class uses some other prefix - Ornedan, 20061210
|
|
|
|
return sFile;
|
|
}
|
|
|
|
// Test main
|
|
//void main(){} |