
Script is written to be used on use as a placeable (because that's really easy). How to use:
1) Open module you want to use it in.
2) Plop down a new placeable or use an existing one somewhere you can get to in game.
3) Right click that placeable and select properties (if it selects a tile, View/Selection Mode/Select Objects), a menu pops up.
4) Basic (opens to that page) tick Useable.
5) Pick the scripts panel.
6) Type a script name into OnUsed (suggested: report_gear).
7) Click the ... button next to that field, script editor pops up.
8) Copy/paste everything in gray box below into that overwriting anything already there.
9) Hit f7 to compile the script and save.
10) Close script editor.
11) Hit ok on placeable's properties menu.
12) Save module.
13) See if it works.
Code: Select all
// Make a placeable useable, put this script on used
// Sum up immunities, resists; report
// Assuming normal nwn resist/immune properties
// Helper function for immune/vuln cost table
int ConvertCost(int nCost);
void main()
{
object oPC = GetLastUsedBy();
// Need some variables
int nResBlunt, nResPierce, nResSlash, nResMagic, nResAcid, nResCold,
nResDivine, nResElect, nResFire, nResNeg, nResPos, nResSonic;
int nImmBlunt, nImmPierce, nImmSlash, nImmMagic, nImmAcid, nImmCold,
nImmDivine, nImmElect, nImmFire, nImmNeg, nImmPos, nImmSonic;
// iterators and whatnot
int i, nType, nSubType, nCost;
itemproperty ipProp;
object oItem;
// includes creature item slots too
for(i = 0; i <= 17; i++)
{
oItem = GetItemInSlot(i, oPC);
if(GetIsObjectValid(oItem))
{
ipProp = GetFirstItemProperty(oItem);
while(GetIsItemPropertyValid(ipProp))
{
nType = GetItemPropertyType(ipProp);
nSubType = GetItemPropertySubType(ipProp);
nCost = GetItemPropertyCostTableValue(ipProp);
// Resists, keep track of highest
if(nType == ITEM_PROPERTY_DAMAGE_RESISTANCE)
{
switch(nSubType)
{
case 0: nSubType = DAMAGE_TYPE_BLUDGEONING;
if (nCost > nResBlunt) nResBlunt = nCost; break;
case 1: nSubType = DAMAGE_TYPE_PIERCING;
if (nCost > nResPierce) nResPierce = nCost; break;
case 2: nSubType = DAMAGE_TYPE_SLASHING;
if (nCost > nResSlash) nResSlash = nCost; break;
case 5: nSubType = DAMAGE_TYPE_MAGICAL;
if (nCost > nResMagic) nResMagic = nCost; break;
case 6: nSubType = DAMAGE_TYPE_ACID;
if (nCost > nResAcid) nResAcid = nCost;break;
case 7: nSubType = DAMAGE_TYPE_COLD;
if (nCost > nResCold) nResCold = nCost; break;
case 8: nSubType = DAMAGE_TYPE_DIVINE;
if (nCost > nResDivine) nResDivine = nCost; break;
case 9: nSubType = DAMAGE_TYPE_ELECTRICAL;
if (nCost > nResElect) nResElect = nCost; break;
case 10: nSubType = DAMAGE_TYPE_FIRE;
if (nCost > nResFire) nResFire = nCost; break;
case 11: nSubType = DAMAGE_TYPE_NEGATIVE;
if (nCost > nResNeg) nResNeg = nCost; break;
case 12: nSubType = DAMAGE_TYPE_POSITIVE;
if (nCost > nResPos) nResPos = nCost; break;
case 13: nSubType = DAMAGE_TYPE_SONIC;
if (nCost > nResSonic) nResSonic = nCost; break;
}
}
// Immunes/vulns add up
else if(nType == ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE)
{
switch(nSubType)
{
case 0: nSubType = DAMAGE_TYPE_BLUDGEONING;
nImmBlunt += ConvertCost(nCost); break;
case 1: nSubType = DAMAGE_TYPE_PIERCING;
nImmPierce += ConvertCost(nCost); break;
case 2: nSubType = DAMAGE_TYPE_SLASHING;
nImmSlash += ConvertCost(nCost); break;
case 5: nSubType = DAMAGE_TYPE_MAGICAL;
nImmMagic += ConvertCost(nCost); break;
case 6: nSubType = DAMAGE_TYPE_ACID;
nImmAcid += ConvertCost(nCost); break;
case 7: nSubType = DAMAGE_TYPE_COLD;
nImmCold += ConvertCost(nCost); break;
case 8: nSubType = DAMAGE_TYPE_DIVINE;
nImmDivine += ConvertCost(nCost); break;
case 9: nSubType = DAMAGE_TYPE_ELECTRICAL;
nImmElect += ConvertCost(nCost); break;
case 10: nSubType = DAMAGE_TYPE_FIRE;
nImmFire += ConvertCost(nCost); break;
case 11: nSubType = DAMAGE_TYPE_NEGATIVE;
nImmNeg += ConvertCost(nCost); break;
case 12: nSubType = DAMAGE_TYPE_POSITIVE;
nImmPos += ConvertCost(nCost); break;
case 13: nSubType = DAMAGE_TYPE_SONIC;
nImmSonic += ConvertCost(nCost); break;
}
}
else if(nType == ITEM_PROPERTY_DAMAGE_VULNERABILITY)
{
switch(nSubType)
{
case 0: nSubType = DAMAGE_TYPE_BLUDGEONING;
nImmBlunt -= ConvertCost(nCost); break;
case 1: nSubType = DAMAGE_TYPE_PIERCING;
nImmPierce -= ConvertCost(nCost); break;
case 2: nSubType = DAMAGE_TYPE_SLASHING;
nImmSlash -= ConvertCost(nCost); break;
case 5: nSubType = DAMAGE_TYPE_MAGICAL;
nImmMagic -= ConvertCost(nCost); break;
case 6: nSubType = DAMAGE_TYPE_ACID;
nImmAcid -= ConvertCost(nCost); break;
case 7: nSubType = DAMAGE_TYPE_COLD;
nImmCold -= ConvertCost(nCost); break;
case 8: nSubType = DAMAGE_TYPE_DIVINE;
nImmDivine -= ConvertCost(nCost); break;
case 9: nSubType = DAMAGE_TYPE_ELECTRICAL;
nImmElect -= ConvertCost(nCost); break;
case 10: nSubType = DAMAGE_TYPE_FIRE;
nImmFire -= ConvertCost(nCost); break;
case 11: nSubType = DAMAGE_TYPE_NEGATIVE;
nImmNeg -= ConvertCost(nCost); break;
case 12: nSubType = DAMAGE_TYPE_POSITIVE;
nImmPos -= ConvertCost(nCost); break;
case 13: nSubType = DAMAGE_TYPE_SONIC;
nImmSonic -= ConvertCost(nCost); break;
}
}
ipProp = GetNextItemProperty(oItem);
}
}
}
// Speak results
SpeakString("Damage Type: Immunity/Resist");
SpeakString("Blunt: " + IntToString(nImmBlunt) + "/" + IntToString(5 * nResBlunt));
SpeakString("Pierce: " + IntToString(nImmPierce) + "/" + IntToString(5 * nResPierce));
SpeakString("Slash: " + IntToString(nImmSlash) + "/" + IntToString(5 * nResSlash));
SpeakString("Magic: " + IntToString(nImmMagic) + "/" + IntToString(5 * nResMagic));
SpeakString("Acid: " + IntToString(nImmAcid) + "/" + IntToString(5 * nResAcid));
SpeakString("Cold: " + IntToString(nImmCold) + "/" + IntToString(5 * nResCold));
SpeakString("Divine: " + IntToString(nImmDivine) + "/" + IntToString(5 * nResDivine));
SpeakString("Elect: " + IntToString(nImmElect) + "/" + IntToString(5 * nResElect));
SpeakString("Fire: " + IntToString(nImmFire) + "/" + IntToString(5 * nResFire));
SpeakString("Neg: " + IntToString(nImmNeg) + "/" + IntToString(5 * nResNeg));
SpeakString("Pos: " + IntToString(nImmPos) + "/" + IntToString(5 * nResPos));
SpeakString("Sonic: " + IntToString(nImmSonic) + "/" + IntToString(5 * nResSonic));
}
int ConvertCost(int nCost)
{
switch(nCost)
{
case 1: return 5;
case 2: return 10;
case 3: return 25;
case 4: return 50;
case 5: return 75;
case 6: return 90;
case 7: return 100;
}
// in case explodes
return 0;
}