186 lines
6.9 KiB
Plaintext
186 lines
6.9 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: 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(){}
|