Immune/resist calculation script

General discussion on NWN scripting, expansions, and modules
Locked
Lokey
-2 Penalty in Daylight
Posts: 3094
Joined: Mon Dec 16, 2002 6:49 pm
Contact:

Immune/resist calculation script

Post by Lokey »

Image

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;
}
Tep wrote:I login and there's a dwarf to kill. You can't ask for much more than that.

Alkapwn wrote:NC has the most amazing melee build there is. Its a friggin unstopable juggernaut of pain.

mining
Absentee Ballot Dev
Posts: 2411
Joined: Wed Oct 14, 2009 5:09 am

Re: Immune/resist calculation script

Post by mining »

... I honestly don't know what the purpose of this is, but it seems to work. Well, even.

Image

Even allows for PM penalties on skin and stuff.
Bargeld wrote:Overall, I think most would agree that a pure rogue is probably the worst build on the server.

Lokey
-2 Penalty in Daylight
Posts: 3094
Joined: Mon Dec 16, 2002 6:49 pm
Contact:

Re: Immune/resist calculation script

Post by Lokey »

Little tweaking.
Image

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, nItems;
    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);
            nItems++;
            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
    SendMessageToPC(oPC, "Damage protections for " + GetName(oPC) + "'s " + IntToString(nItems) + " equipped items.");
    SendMessageToPC(oPC, "Damage Type: Immunity/Resist");
    SendMessageToPC(oPC, "Blunt:  " + IntToString(nImmBlunt) + "% " + IntToString(5 * nResBlunt));
    SendMessageToPC(oPC, "Pierce: " + IntToString(nImmPierce) + "% " + IntToString(5 * nResPierce));
    SendMessageToPC(oPC, "Slash:  " + IntToString(nImmSlash) + "% " + IntToString(5 * nResSlash));
    SendMessageToPC(oPC, "Magic:  " + IntToString(nImmMagic) + "% " + IntToString(5 * nResMagic));
    SendMessageToPC(oPC, "Acid:   " + IntToString(nImmAcid) + "% " + IntToString(5 * nResAcid));
    SendMessageToPC(oPC, "Cold:   " + IntToString(nImmCold) + "% " + IntToString(5 * nResCold));
    SendMessageToPC(oPC, "Divine: " + IntToString(nImmDivine) + "% " + IntToString(5 * nResDivine));
    SendMessageToPC(oPC, "Elect:  " + IntToString(nImmElect) + "% " + IntToString(5 * nResElect));
    SendMessageToPC(oPC, "Fire:   " + IntToString(nImmFire) + "% " + IntToString(5 * nResFire));
    SendMessageToPC(oPC, "Neg:    " + IntToString(nImmNeg) + "% " + IntToString(5 * nResNeg));
    SendMessageToPC(oPC, "Pos:    " + IntToString(nImmPos) + "% " + IntToString(5 * nResPos));
    SendMessageToPC(oPC, "Sonic:  " + IntToString(nImmSonic) + "% " + IntToString(5 * nResSonic));
}

  //  nResDivine, nResElect, nResFire, nResNeg, nResPos, 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;
}
Tep wrote:I login and there's a dwarf to kill. You can't ask for much more than that.

Alkapwn wrote:NC has the most amazing melee build there is. Its a friggin unstopable juggernaut of pain.

Amoenotep
Lord DM Supreme
Posts: 4717
Joined: Wed Aug 30, 2006 4:09 pm
Location: in the mists of eternity

Re: Immune/resist calculation script

Post by Amoenotep »

i like the second one
Mask, Lord of the Shadows
Gruumsh, One-Eye
amoenotep@hotmail.com
----------------------------------
Image

Amoenotep
Lord DM Supreme
Posts: 4717
Joined: Wed Aug 30, 2006 4:09 pm
Location: in the mists of eternity

Re: Immune/resist calculation script

Post by Amoenotep »

Image
Mask, Lord of the Shadows
Gruumsh, One-Eye
amoenotep@hotmail.com
----------------------------------
Image

Ghostly
Dungeon Master
Posts: 307
Joined: Thu Jun 26, 2008 5:30 am

Re: Immune/resist calculation script

Post by Ghostly »

now thats cheeze :D
Brandobaris, The Irrepressible Scamp

********************************************
if i didn't do it... someone else would have...

Locked

Return to “NWN Discussion”