Пример #1
0
static int Local_GetDEXMod_ipMaxDexBonusMod()
{
    GDM_acbmb = 0;
    if (pCreatureStats != NULL) {
        CNWSItem *pItem_1 = CNWSInventory__GetItemInSlot(pCreatureStats->cs_original->cre_equipment, EQUIPMENT_SLOT_CHEST);
        if (pItem_1 != NULL) {
            if (CNWSItem__GetPropertyByTypeExists(pItem_1, confMaxDexterityBonus_ip, 0)) {
                CNWItemProperty *IP;
                for (size_t i = 0; i < pItem_1->field_1FC; i++) {
                    IP = CNWSItem__GetPassiveProperty(pItem_1, i);
                    if (IP != NULL && IP->ip_type == confMaxDexterityBonus_ip) {
                        if (IP->ip_cost_value != 9) {
                            GDM_acbmb = IP->ip_cost_value - 9;
                        } else {
                            GDM_acbmb = 100 - GDM_acb;
                        }
                    }
                }
            }
        }
    }
    GDM_acb += GDM_acbmb;
    if (GDM_acb > pCreatureStats->cs_dex_mod) {
        GDM_acb = pCreatureStats->cs_dex_mod;
    }
    return GDM_acb;
}
Пример #2
0
int Hook_GetUseMonkAttackTables (CNWSCreatureStats *info, int unarmedonly) {
    int monk = nwn_GetLevelByClass(info, CLASS_TYPE_MONK);

    if (monk < 1                    ||
        info->cs_ac_armour_base > 0 ||
        info->cs_ac_shield_base > 0)
        return 0;

    CNWSItem *weapon = CNWSInventory__GetItemInSlot(info->cs_original->cre_equipment,
        EQUIPMENT_SLOT_RIGHTHAND);

    if (weapon == NULL)
        return 1;

    if (unarmedonly                                              ||
        weapon->it_baseitem >= NWNX_WEAPONS_BASE_ITEM_TABLE_SIZE ||
        Table_WeaponMonk[weapon->it_baseitem] < 1)
        return 0;

#if 0
    if (monk < Table_WeaponMonk[weapon->it_baseitem]);
        return 0;

    weapon = CNWSInventory__GetItemInSlot(info->cs_original->cre_equipment,
        EQUIPMENT_SLOT_LEFTHAND);

    if (weapon == NULL)
        return 1;

    if (weapon->it_baseitem >= NWNX_WEAPONS_BASE_ITEM_TABLE_SIZE ||
        Table_WeaponMonk[weapon->it_baseitem] < 1)
        return 0;
#endif

    return (monk >= Table_WeaponMonk[weapon->it_baseitem]);
}
Пример #3
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;
}