generated from Jaysyn/ModuleTemplate
Initial commit
Initial commit
This commit is contained in:
185
_module/nss/oai_inc_weapstat.nss
Normal file
185
_module/nss/oai_inc_weapstat.nss
Normal file
@@ -0,0 +1,185 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Name oai_inc_weapstat
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Routines to get weapon stats
|
||||
Implements an on demand cache for weapon stats from 2DA to local variables
|
||||
|
||||
Cache Table is "OAI_CWS_" prefix to variable name (can be chanhed below)
|
||||
Uses "OAI_CWS_Category" as the index to determine if cache values are loaded
|
||||
(so "OAI_CWS_Category0" would hold the Category of a short sword)
|
||||
Loads all variables (tracked) for the requested base item type from the
|
||||
baseitems.2da per when first required.
|
||||
Nb! So far only get Int values (through need, will impliment strings later if required)
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: David Kelly
|
||||
//:: Created On: 26-Dec-2005
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
const string OAI_CACHEPREFIX = "OAI_CSW_"; // Prefix for cahce variables
|
||||
const int OAI_CACHENULL = -99; // Value which means has no value (caution, CAN NOT BE zero)
|
||||
|
||||
// Tracked variables
|
||||
const string OAI_STAT_CATEGORY = "Category";
|
||||
const string OAI_STAT_WEAPONSIZE = "WeaponSize";
|
||||
const string OAI_STAT_WEAPONTYPE = "WeaponType";
|
||||
const string OAI_STAT_BASEAMMO = "BaseAmmo";
|
||||
const string OAI_STAT_MAXDAMAGE = "MaxDamage";
|
||||
const string OAI_STAT_REQFEAT = "ReqFeat";
|
||||
|
||||
// Fixed flags for Feat Mask
|
||||
// Bit mask: 1E,2M,4S,8D,16Mo,32R,64MU,128Elf,256C
|
||||
const int OAI_MASK_EXOTIC = 0x0001;
|
||||
const int OAI_MASK_MARTIAL = 0x0002;
|
||||
const int OAI_MASK_SIMPLE = 0x0004;
|
||||
const int OAI_MASK_DRUID = 0x0008;
|
||||
const int OAI_MASK_MONK = 0x0010;
|
||||
const int OAI_MASK_ROGUE = 0x0020;
|
||||
const int OAI_MASK_MU = 0x0040;
|
||||
const int OAI_MASK_ELF = 0x0080;
|
||||
const int OAI_MASK_CREATURE = 0x0100;
|
||||
|
||||
struct OAIWeapon
|
||||
{
|
||||
int nBaseType; // Weapons BaseType
|
||||
int nCategory; // 1 melee, 2 bows, 3 shield, 6 ammo, 7 thrown
|
||||
int nWeaponSize; // 1 tiny, 2 small, 3 medium, 4 large
|
||||
int nWeaponType; // 1 pierce, 2 crush, 3 slash, 4 slash/pierce
|
||||
int nBaseAmmo; // nBaseType of ammo (self for thrown)
|
||||
int nMaxDamage; // Maximum damage not counting criticals
|
||||
int nReqFeat; // 1 Exotic, 2 martial, 4 simple, 8 druid, 16 monk,
|
||||
// 32 rogue, 64 MU, 128 elf, 256 creature (as Bit Mask)
|
||||
};
|
||||
|
||||
// Routine to get weapon stats structure for given weapon
|
||||
struct OAIWeapon OAI_GetWeaponStats(object oItem);
|
||||
|
||||
// Gets required weapon stat, from cache if available
|
||||
// if not chache will be loaded first and then used
|
||||
int OAI_GetWeaponStat(object oItem, string sStat);
|
||||
|
||||
// Converts 2DA Feat reference to Feat Bit Mask value
|
||||
int OAI_FeatToMask(string sFeat);
|
||||
|
||||
// Generate the FeatMask for the given creature
|
||||
int OAI_GetFeatMask(object oMon);
|
||||
|
||||
int OAI_GetFeatMask(object oMon)
|
||||
{
|
||||
int class, pos, mask = 0;
|
||||
|
||||
if (GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE))
|
||||
mask += OAI_MASK_SIMPLE;
|
||||
if (GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL))
|
||||
mask += OAI_MASK_MARTIAL;
|
||||
if (GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC))
|
||||
mask += OAI_MASK_EXOTIC;
|
||||
|
||||
for (pos = 1; pos <= 3; pos++)
|
||||
switch (GetClassByPosition(pos, oMon))
|
||||
{
|
||||
case CLASS_TYPE_DRUID: mask += OAI_MASK_DRUID; break;
|
||||
case CLASS_TYPE_MONK: mask += OAI_MASK_MONK; break;
|
||||
case CLASS_TYPE_ROGUE: mask += OAI_MASK_ROGUE; break;
|
||||
case CLASS_TYPE_SORCERER:
|
||||
case CLASS_TYPE_WIZARD:
|
||||
mask += OAI_MASK_MU; break;
|
||||
}
|
||||
|
||||
if (GetRacialType(oMon) == RACIAL_TYPE_ELF)
|
||||
mask += OAI_MASK_ELF;
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
/*
|
||||
* If using 2DA references
|
||||
*/
|
||||
int OAI_FeatToMask(string sFeat)
|
||||
{
|
||||
int nFeat = StringToInt(sFeat);
|
||||
int nMask;
|
||||
|
||||
switch (nFeat)
|
||||
{
|
||||
case 44: nMask = OAI_MASK_EXOTIC; break; // Exotic
|
||||
case 45: nMask = OAI_MASK_MARTIAL; break; // Martial
|
||||
case 46: nMask = OAI_MASK_SIMPLE; break; // Simple
|
||||
case 48: nMask = OAI_MASK_DRUID; break; // Druid
|
||||
case 49: nMask = OAI_MASK_MONK; break; // Monk
|
||||
case 50: nMask = OAI_MASK_ROGUE; break; // Rogue
|
||||
case 51: nMask = OAI_MASK_ELF; break; // MU
|
||||
case 255: nMask = OAI_MASK_CREATURE; break; // Creature
|
||||
default: nMask = 0;
|
||||
}
|
||||
|
||||
return nMask;
|
||||
}
|
||||
|
||||
int OAI_GetWeaponStat(object oItem, string sStat)
|
||||
{
|
||||
object oMod = GetModule();
|
||||
int nBaseType = GetBaseItemType(oItem);
|
||||
string sBaseType = IntToString(nBaseType);
|
||||
int nValue = GetLocalInt(oMod, OAI_CACHEPREFIX + OAI_STAT_CATEGORY + sBaseType);
|
||||
|
||||
// Values not loaded yet
|
||||
if (nValue == 0)
|
||||
{
|
||||
int nLoop;
|
||||
|
||||
// Load Cache
|
||||
nValue = StringToInt(Get2DAString("baseitems", "Category", nBaseType));
|
||||
if (nValue == 0)
|
||||
nValue = OAI_CACHENULL; // NOT ALLOWED to be zero
|
||||
SetLocalInt(oMod, OAI_CACHEPREFIX + OAI_STAT_CATEGORY + sBaseType, nValue);
|
||||
|
||||
// Weapon Size and Type and AMmotype are straight forward
|
||||
nValue = StringToInt(Get2DAString("baseitems", "WeaponSize", nBaseType));
|
||||
if (nValue)
|
||||
SetLocalInt(oMod, OAI_CACHEPREFIX + OAI_STAT_WEAPONSIZE + sBaseType, nValue);
|
||||
nValue = StringToInt(Get2DAString("baseitems", "WeaponType", nBaseType));
|
||||
if (nValue)
|
||||
SetLocalInt(oMod, OAI_CACHEPREFIX + OAI_STAT_WEAPONTYPE + sBaseType, nValue);
|
||||
nValue = StringToInt(Get2DAString("baseitems", "RangedWeapon", nBaseType));
|
||||
if (nValue)
|
||||
SetLocalInt(oMod, OAI_CACHEPREFIX + OAI_STAT_BASEAMMO + sBaseType, nValue);
|
||||
|
||||
// Max Damge is a calculation
|
||||
nValue = StringToInt(Get2DAString("baseitems", "NumDice", nBaseType)) *
|
||||
StringToInt(Get2DAString("baseitems", "DieToRoll", nBaseType));
|
||||
if (nValue)
|
||||
SetLocalInt(oMod, OAI_CACHEPREFIX + OAI_STAT_MAXDAMAGE + sBaseType, nValue);
|
||||
|
||||
// Feats are mapped onto the bit mask values and stored as a single number
|
||||
nValue = 0;
|
||||
for (nLoop = 0; nLoop <= 4; nLoop++)
|
||||
nValue += OAI_FeatToMask(Get2DAString("baseitems", "ReqFeat" + IntToString(nLoop), nBaseType));
|
||||
if (nValue)
|
||||
SetLocalInt(oMod, OAI_CACHEPREFIX + OAI_STAT_REQFEAT + sBaseType, nValue);
|
||||
}
|
||||
|
||||
// Return required result
|
||||
return GetLocalInt(oMod, OAI_CACHEPREFIX + sStat + sBaseType);
|
||||
}
|
||||
|
||||
struct OAIWeapon OAI_GetWeaponStats(object oItem)
|
||||
{
|
||||
object oMod = GetModule();
|
||||
struct OAIWeapon ow;
|
||||
string sBT;
|
||||
|
||||
ow.nBaseType = GetBaseItemType(oItem);
|
||||
ow.nCategory = OAI_GetWeaponStat(oItem, OAI_STAT_CATEGORY); // Force cache to load if necessary
|
||||
sBT = IntToString(ow.nBaseType);
|
||||
ow.nWeaponSize = GetLocalInt(oMod, OAI_CACHEPREFIX + OAI_STAT_WEAPONSIZE + sBT);
|
||||
ow.nWeaponType = GetLocalInt(oMod, OAI_CACHEPREFIX + OAI_STAT_WEAPONTYPE + sBT);
|
||||
ow.nBaseAmmo = GetLocalInt(oMod, OAI_CACHEPREFIX + OAI_STAT_BASEAMMO + sBT);
|
||||
ow.nMaxDamage = GetLocalInt(oMod, OAI_CACHEPREFIX + OAI_STAT_MAXDAMAGE + sBT);
|
||||
ow.nReqFeat = GetLocalInt(oMod, OAI_CACHEPREFIX + OAI_STAT_REQFEAT + sBT);
|
||||
|
||||
return ow;
|
||||
}
|
||||
|
||||
//void main(){}
|
||||
Reference in New Issue
Block a user