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; }
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]); }
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; }