int Hook_GetACClassAdjustment (CNWSCreatureStats *stats, int touch) {
    int adj = 0;

#ifndef NWNX_DEFENSES_HG
    if (!touch) {
        if (CNWSCreatureStats__HasFeat(stats, FEAT_DRAGON_ARMOR)) {
            int rdd = nwn_GetLevelByClass(stats, CLASS_TYPE_DRAGONDISCIPLE);

            switch (rdd) {
                case  0: adj += 0; break;
                case  1: adj += 1; break;
                case  2: adj += 1; break;
                case  3: adj += 1; break;
                case  4: adj += 1; break;
                case  5: adj += 2; break;
                case  6: adj += 2; break;
                case  7: adj += 2; break;
                case  8: adj += 3; break;
                case  9: adj += 3; break;

                default: adj += 4 + ((rdd - 10) / 5); break;
            }
        }

        if (CNWSCreatureStats__HasFeat(stats, FEAT_BONE_SKIN_2)) {
            int pm = nwn_GetLevelByClass(stats, CLASS_TYPE_PALEMASTER) / 4;

            adj += 2 + (pm * 2);
        }
    }
#endif

    return Local_GetACClassAdjustment(stats, touch, adj);
}
Beispiel #2
0
int Hook_GetWeaponFocus (CNWSCreatureStats *info, CNWSItem *weapon) {
    int feat = 0;

    if (weapon == NULL)
        feat = Table_WeaponFocus[BASE_ITEM_GLOVES];
    else if (weapon->it_baseitem < NWNX_WEAPONS_BASE_ITEM_TABLE_SIZE)
        feat = Table_WeaponFocus[weapon->it_baseitem];

    if (feat == FEAT_WEAPON_FOCUS_CREATURE &&
        CNWSCreatureStats__HasFeat(info, FEAT_WEAPON_FOCUS_UNARMED_STRIKE))
        return 1;

    return (feat ? CNWSCreatureStats__HasFeat(info, feat) : 0);
}
int Local_GetACEquipAdjustment (CNWSCreatureStats *stats, int touch, int adj) {
#ifdef NWNX_DEFENSES_HG
    if (!touch) {
        int i;

        /* Insurmountable Protection feats */
        for (i = 3105; i <= 3109; i++) {
            if (CNWSCreatureStats__HasFeat(stats, i))
                adj += 2;
        }

        /* cap shield AC for large/tower shields */
        if (stats->cs_ac_shield_base > 1 && stats->cs_ac_armour_base < 6) {
            int dex = CNWSCreatureStats__GetDEXMod(stats, 1);

            if (stats->cs_ac_shield_base == 3) {
                if (dex > (11 - stats->cs_ac_armour_base))
                    adj -= dex - (11 - stats->cs_ac_armour_base);
            } else if (stats->cs_ac_shield_base == 2) {
                if (dex > (18 - stats->cs_ac_armour_base))
                    adj -= dex - (18 - stats->cs_ac_armour_base);
            }
        }
    }

#endif

    return adj;
}
int Hook_GetIsWeaponOfChoice (CNWSCreatureStats *info, int baseitem) {
    int feat = 0;

    if (baseitem < NWNX_WEAPONS_BASE_ITEM_TABLE_SIZE)
        feat = Table_WeaponOfChoice[baseitem];

    return (feat ? CNWSCreatureStats__HasFeat(info, feat) : 0);
}
int Hook_GetACFeatAdjustment (CNWSCreatureStats *stats, int touch) {
    int adj = 0;

    if (!touch && CNWSCreatureStats__HasFeat(stats, FEAT_EPIC_ARMOR_SKIN))
        adj += 2;

    return Local_GetACFeatAdjustment(stats, touch, adj);
}
int Local_GetCriticalRangeAdjustment (CNWSCreatureStats *attacker, CNWSItem *weapon, int adj) {
#ifdef NWNX_WEAPONS_HG
    if (adj == 0                                                     &&
        weapon != NULL                                               &&
        attacker->cs_ac_armour_base <= 3                             &&
        nwn_GetLevelByClass(attacker, CLASS_TYPE_ROGUE) >= 30        &&
        !CNWSCreatureStats__HasFeat(attacker, FEAT_KI_CRITICAL)      &&
        CNWSCreatureStats__HasFeat(attacker, FEAT_CRIPPLING_STRIKE)  &&
        (GetIsWeaponLight(attacker, weapon, false)      ||
         weapon->it_baseitem == BASE_ITEM_LIGHTCROSSBOW ||
         weapon->it_baseitem == BASE_ITEM_MORNINGSTAR   ||
         weapon->it_baseitem == BASE_ITEM_SLING))
        return 1;
#endif

    return adj;
}
int Hook_GetEpicWeaponOverwhelmingCritical(CNWSCreatureStats *info, CNWSItem *weapon)
{
    int feat = 0;

    if (weapon == NULL)
        feat = Table_WeaponOverwhelmingCritical[BASE_ITEM_GLOVES];
    else if (weapon->it_baseitem < NWNX_WEAPONS_BASE_ITEM_TABLE_SIZE)
        feat = Table_WeaponOverwhelmingCritical[weapon->it_baseitem];

    return (feat ? CNWSCreatureStats__HasFeat(info, feat) : 0);
}
int Hook_GetWeaponSpecialization(CNWSCreatureStats *info, CNWSItem *weapon)
{
    int feat = 0;

    if (weapon == NULL)
        feat = Table_WeaponSpecialization[BASE_ITEM_GLOVES];
    else if (weapon->it_baseitem < NWNX_WEAPONS_BASE_ITEM_TABLE_SIZE)
        feat = Table_WeaponSpecialization[weapon->it_baseitem];

    return (feat ? CNWSCreatureStats__HasFeat(info, feat) : 0);
}
Beispiel #9
0
int Hook_ConfirmCritical (CNWSCreatureStats *target, CNWSCreature *attacker) {
    int ret;

    if (target == NULL)
        return 0;

    if ((ret = Local_GetCritConfirmationResult(attacker, target)) >= 0)
        return ret;

    return CNWSCreatureStats__HasFeat(target, FEAT_DEATHLESS_MASTERY);
}
Beispiel #10
0
static int Hook_GetConcealmentCheckResult (CNWSCreature *attacker, CNWSCreature *target, int concealment, int misschance) {
    int ret;

    if ((ret = Local_GetConcealmentCheckResult(attacker, target, concealment, misschance)) >= 0)
        return ret;

    if (misschance > 0) {
        if (random() % 100 < misschance) {
            if (attacker != NULL                               &&
                attacker->obj.obj_type == OBJECT_TYPE_CREATURE && 
                attacker->cre_stats != NULL                    &&
                CNWSCreatureStats__HasFeat(attacker->cre_stats, FEAT_BLIND_FIGHT)) {

                if (random() % 100 < misschance)
                    return misschance;
            } else
                return misschance;
        }
    }

    if (concealment > 0) {
        if (random() % 100 < concealment) {
            if (attacker != NULL                               &&
                attacker->obj.obj_type == OBJECT_TYPE_CREATURE && 
                attacker->cre_stats != NULL                    &&
                CNWSCreatureStats__HasFeat(attacker->cre_stats, FEAT_BLIND_FIGHT)) {

                if (random() % 100 < concealment)
                    return concealment;
            } else
                return concealment;
        }
    }

    return 0;
}
Beispiel #11
0
int Hook_GetACWisAdjustment (CNWSCreatureStats *stats, int touch) {
    int adj = 0;

#ifndef NWNX_DEFENSES_HG
    if (stats->cs_ac_armour_base == 0 &&
        stats->cs_ac_shield_base == 0 &&
        CNWSCreatureStats__HasFeat(stats, FEAT_MONK_AC_BONUS)) {

        int monk = nwn_GetLevelByClass(stats, CLASS_TYPE_MONK);

        adj = (stats->cs_wis_mod > 0 ? stats->cs_wis_mod : 0) + (monk / 5);
    }
#endif

    return Local_GetACWisAdjustment(stats, touch, adj);
}
int8_t Hook_GetDamageImmunity (CNWSCreature *cre, int damtypeindex) {
    int imm;

    if (cre->obj.obj_damage_immunities == NULL || damtypeindex < 0 || damtypeindex > DAMAGE_TYPE_LAST)
        return 0;
    imm = cre->obj.obj_damage_immunities[damtypeindex];

#ifndef NWNX_DEFENSES_HG
    if (damtypeindex == 8                         &&
        cre->obj.obj_type == OBJECT_TYPE_CREATURE &&
        cre->cre_stats != NULL                    &&
        CNWSCreatureStats__HasFeat(cre->cre_stats, FEAT_DRAGON_IMMUNE_FIRE))
        imm = 100;
#endif

    imm = Local_GetDamageImmunity(cre, damtypeindex, imm);

    if (imm > 100)
        return 100;
    if (imm < -100)
        return -100;

    return imm;
}
Beispiel #13
0
int Local_GetACWisAdjustment(CNWSCreatureStats *stats, int touch, int adj)
{
#ifdef NWNX_DEFENSES_HG
    int ranger;

    if (stats->cs_original != NULL && stats->cs_original->cre_is_poly) {
        /* do nothing */
    } else if (CNWSCreatureStats__HasFeat(stats, FEAT_MONK_AC_BONUS)) {
        if (stats->cs_ac_armour_base == 0 && stats->cs_ac_shield_base == 0) {
            int monk = nwn_GetLevelByClass(stats, CLASS_TYPE_MONK);

            adj += (stats->cs_wis_mod > 0 ? stats->cs_wis_mod : 0) + (monk / 5);

        } else if (nwn_GetLevelByClass(stats, CLASS_TYPE_DRUID) > 30 &&
                   stats->cs_ac_armour_base <= 3                     &&
                   stats->cs_ac_shield_base <= 2) {

            if (stats->cs_wis_mod > 3)
                adj += (stats->cs_wis_mod * 2) / 3;
        }
    } else if (stats->cs_ac_armour_base >= 1 &&
               stats->cs_ac_armour_base <= 3 &&
               stats->cs_ac_shield_base == 0 &&
               (ranger = nwn_GetLevelByClass(stats, CLASS_TYPE_RANGER)) > 1) {

        if (stats->cs_original != NULL && stats->cs_original->cre_equipment != NULL) {
            CNWSItem *weapon = CNWSInventory__GetItemInSlot(stats->cs_original->cre_equipment,
                               EQUIPMENT_SLOT_RIGHTHAND);

            switch (weapon != NULL ? weapon->it_baseitem : -1) {
                case BASE_ITEM_DIREMACE:
                case BASE_ITEM_DOUBLEAXE:
                case BASE_ITEM_DWARVENWARAXE:
                case BASE_ITEM_GREATAXE:
                case BASE_ITEM_GREATSWORD:
                case BASE_ITEM_HALBERD:
                case BASE_ITEM_HEAVYFLAIL:
                case BASE_ITEM_KAMA:
                case BASE_ITEM_QUARTERSTAFF:
                case BASE_ITEM_SCYTHE:
                case BASE_ITEM_TWOBLADEDSWORD:

                case BASE_ITEM_CEP_DOUBLEPICK:
                case BASE_ITEM_CEP_DOUBLESCIMITAR:
                case BASE_ITEM_CEP_FALCHION:
                case BASE_ITEM_CEP_GOAD:
                case BASE_ITEM_CEP_HEAVYPICK:
                case BASE_ITEM_CEP_MAUL:
                case BASE_ITEM_CEP_MERCURIALGREATSWORD:
                case BASE_ITEM_CEP_MERCURIALLONGSWORD:
                case BASE_ITEM_CEP_NUNCHAKU:
                    ranger = 0;
                    break;

                default: break;
            }

            if (ranger > 0) {
                weapon = CNWSInventory__GetItemInSlot(stats->cs_original->cre_equipment,
                                                      EQUIPMENT_SLOT_LEFTHAND);

                if (weapon != NULL && weapon->it_baseitem == BASE_ITEM_DWARVENWARAXE)
                    ranger = 0;
            }
        }

        if (stats->cs_wis_mod <= 20) {
            int wisac = stats->cs_wis_mod * 2, limit = ranger / 2;

            if (wisac > limit)
                adj += limit;
            else if (wisac > 0)
                adj += wisac;
        } else if (ranger > 20)
            adj += (stats->cs_wis_mod > ranger ? ranger : stats->cs_wis_mod);
    }
#endif

    return adj;
}
int CNWSCreatureStats_s::HasFeat(uint16_t feat) {
	return CNWSCreatureStats__HasFeat(this, feat);
}
static float Hook_GetSpellRange (CNWSCreature *caster, CExoString *range, nwn_objid_t target_id) {
    float ret;
    bool no_bonus = false;
#ifdef NWNX_SPELLS_HG
    CGameObject *ob;
    CNWSCreature *target;
#endif // (NWNX_SPELLS_HG)

    if (range == NULL || range->text == NULL)
        return 0.0;

    switch (*(range->text)) {
        case 'T': ret =  2.25; break;
        case 's': no_bonus = true;
        case 'S': ret =  8.00; break;
        case 'm': no_bonus = true;
        case 'M': ret = 20.00; break;
        case 'L': ret = 40.00; break;
        case 'P': ret =  0.00; break;

#ifdef NWNX_SPELLS_HG
        case 'a':
        case 'c':
        case 'd':
        case 'e':
        case 'i':
        case 'n':
        case 't':
        case 'v':
        case 'p': {
            u_int16_t feats[3] = { 0, 0, 0 };

            switch (*(range->text)) {
                case 'a':
                    feats[0] = FEAT_SPELL_FOCUS_ABJURATION;
                    feats[1] = FEAT_GREATER_SPELL_FOCUS_ABJURATION;
                    feats[2] = FEAT_EPIC_SPELL_FOCUS_ABJURATION;
                    break;

                case 'c':
                    feats[0] = FEAT_SPELL_FOCUS_CONJURATION;
                    feats[1] = FEAT_GREATER_SPELL_FOCUS_CONJURATION;
                    feats[2] = FEAT_EPIC_SPELL_FOCUS_CONJURATION;
                    break;

                case 'd':
                    feats[0] = FEAT_SPELL_FOCUS_DIVINATION;
                    feats[1] = FEAT_GREATER_SPELL_FOCUS_DIVINATION;
                    feats[2] = FEAT_EPIC_SPELL_FOCUS_DIVINATION;
                    break;

                case 'e':
                    feats[0] = FEAT_SPELL_FOCUS_ENCHANTMENT;
                    feats[1] = FEAT_GREATER_SPELL_FOCUS_ENCHANTMENT;
                    feats[2] = FEAT_EPIC_SPELL_FOCUS_ENCHANTMENT;
                    break;

                case 'i':
                    feats[0] = FEAT_SPELL_FOCUS_ILLUSION;
                    feats[1] = FEAT_GREATER_SPELL_FOCUS_ILLUSION;
                    feats[2] = FEAT_EPIC_SPELL_FOCUS_ILLUSION;
                    break;

                case 'n':
                    feats[0] = FEAT_SPELL_FOCUS_NECROMANCY;
                    feats[1] = FEAT_GREATER_SPELL_FOCUS_NECROMANCY;
                    feats[2] = FEAT_EPIC_SPELL_FOCUS_NECROMANCY;
                    break;

                case 't':
                    feats[0] = FEAT_SPELL_FOCUS_TRANSMUTATION;
                    feats[1] = FEAT_GREATER_SPELL_FOCUS_TRANSMUTATION;
                    feats[2] = FEAT_EPIC_SPELL_FOCUS_TRANSMUTATION;
                    break;

                case 'v':
                    feats[0] = FEAT_SPELL_FOCUS_EVOCATION;
                    feats[1] = FEAT_GREATER_SPELL_FOCUS_EVOCATION;
                    feats[2] = FEAT_EPIC_SPELL_FOCUS_EVOCATION;
                    break;

                case 'p':
                    feats[0] = FEAT_SPELL_PENETRATION;
                    feats[1] = FEAT_GREATER_SPELL_PENETRATION;
                    feats[2] = FEAT_EPIC_SPELL_PENETRATION;
                    break;

                default: return 0.0;
            }

            if (caster != NULL                               &&
                caster->obj.obj_type == OBJECT_TYPE_CREATURE &&
                caster->cre_stats != NULL) {

                if (CNWSCreatureStats__HasFeat(caster->cre_stats, feats[2]))
                    ret = 40.0;
                else if (CNWSCreatureStats__HasFeat(caster->cre_stats, feats[1]))
                    ret = 20.0;
                else if (CNWSCreatureStats__HasFeat(caster->cre_stats, feats[0]))
                    ret = 8.0;
                else
                    ret = 2.25;
            } else
                ret = 2.25;

        }
        break;
#endif

        default:  ret = 0.0; break;
    }

    /* TODO: check if spell is being cast from an item */

#ifdef NWNX_SPELLS_HG
    if (!no_bonus) {
        /* increase spell range with Extraordinary Spell Reach feat */
        if (caster != NULL                               &&
            caster->obj.obj_type == OBJECT_TYPE_CREATURE &&
            caster->cre_is_pc                            &&
            caster->cre_stats != NULL                    &&
            CNWSCreatureStats__HasFeat(caster->cre_stats, 2426)) {  /* HGFEAT_EXTRAORDINARY_SPELL_REACH */

            if (ret >= 5.0 && ret <= 30.0)
                ret *= 1.25;
        }

        /* increase spell range when someone is hit by Targeting Ray */
        if (target_id != OBJECT_INVALID                      &&
            (ob = nwn_GetObjectByID(target_id)) != NULL      &&
            (target = ob->vtable->AsNWSCreature(ob)) != NULL &&
            target->cre_stats != NULL) {

#if 0
            if (ret >= 5.0 &&
                CNWSCreatureStats__HasFeat(target->cre_stats, HGFEAT_Z_TARGETING_RAY))
                ret *= 1.5;
#endif
        }
    }
#endif

    return ret;
}