Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
530 lines
19 KiB
Plaintext
530 lines
19 KiB
Plaintext
//:://////////////////////////////////////////////
|
|
//:: Associate include
|
|
//:: prc_inc_assoc.nss
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
This file contains various functions for animal
|
|
companions and familiars
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "inc_npc"
|
|
#include "inc_nwnx_funcs"
|
|
#include "shd_inc_shdfunc"
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Function prototypes */
|
|
//////////////////////////////////////////////////
|
|
|
|
//adds associate as a henchman
|
|
void AddAssociate(object oMaster, object oAssociate);
|
|
|
|
//removes associate with unsummon vfx
|
|
void DestroyAssociate(object oAssociate);
|
|
|
|
//applies exalted companion bonuses
|
|
void ApplyExaltedCompanion(object oCompanion, object oCompSkin);
|
|
|
|
//applies blightspawned properties
|
|
void ApplyIllmaster(object oCompanion, object oCompSkin);
|
|
|
|
//applies pseudonatural template
|
|
void ApplyPseudonatural(object oFamiliar, object oFamSkin);
|
|
|
|
//applies pnp familiar bonuses
|
|
void ApplyPnPFamiliarProperties(object oPC, object oFamiliar);
|
|
|
|
//sets up animal companion natural weapons using following scheme:
|
|
/*
|
|
Damage
|
|
Lvl Claw Bite
|
|
1 1d3 1d6
|
|
6 1d4 1d8
|
|
12 1d6 1d10
|
|
19 1d8 2d6
|
|
27 1d10 2d8
|
|
36 1d12 2d10
|
|
|
|
enhancement bonus
|
|
(Lvl - 15) / 5
|
|
*/
|
|
void SetNaturalWeaponDamage(object oCompanion, int nLvlMod = 0);
|
|
|
|
void UnsummonCompanions(object oPC);
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Constants */
|
|
//////////////////////////////////////////////////
|
|
|
|
const int DISEASE_TALONAS_BLIGHT = 52;
|
|
|
|
//associate numbers as nTH parameter in GetAssociateNPC()
|
|
const int NPC_BIOWARE_COMPANION = 1; //'original' bioware familiar/companion returned by GetAssociate()
|
|
const int NPC_HENCHMAN_COMPANION = 2; //bioware familiar/companion added as hanchman
|
|
//ASSOCIATE_TYPE_FAMILIAR
|
|
const int NPC_PNP_FAMILIAR = 3;
|
|
const int NPC_BONDED_FAMILIAR = 4;
|
|
const int NPC_DN_FAMILIAR = 5;
|
|
const int NPC_MS_ELEMENTAL = 6;
|
|
//ASSOCIATE_TYPE_ANIMALCOMPANION
|
|
const int NPC_SHAMAN_COMPANION = 3;
|
|
const int NPC_UR_COMPANION = 4;
|
|
//ASSOCIATE_TYPE_SUMMONED
|
|
const int NPC_DARK_COMPANION = 2;
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Function definitions */
|
|
//////////////////////////////////////////////////
|
|
|
|
void AddAssociate(object oMaster, object oAssociate)
|
|
{
|
|
int nMaxHenchmen = GetMaxHenchmen();
|
|
SetMaxHenchmen(99);
|
|
AddHenchman(oMaster, oAssociate);
|
|
SetMaxHenchmen(nMaxHenchmen);
|
|
}
|
|
|
|
void DestroyAssociate(object oAssociate)
|
|
{
|
|
AssignCommand(oAssociate, SetIsDestroyable(TRUE));
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_UNSUMMON), GetLocation(oAssociate));
|
|
DestroyObject(oAssociate);
|
|
}
|
|
|
|
void CleanProperties(object oItem)
|
|
{
|
|
itemproperty ip = GetFirstItemProperty(oItem);
|
|
while(GetIsItemPropertyValid(ip))
|
|
{
|
|
RemoveItemProperty(oItem, ip);
|
|
ip = GetNextItemProperty(oItem);
|
|
}
|
|
}
|
|
|
|
void ApplyExaltedCompanion(object oCompanion, object oCompSkin)
|
|
{
|
|
int nHD = GetHitDice(oCompanion);
|
|
effect eDR;
|
|
int nResist;
|
|
|
|
if (nHD >= 12)
|
|
{
|
|
eDR = EffectDamageReduction(10, DAMAGE_POWER_PLUS_THREE);
|
|
nResist = 20;
|
|
}
|
|
else if (12 > nHD && nHD >= 8)
|
|
{
|
|
eDR = EffectDamageReduction(5, DAMAGE_POWER_PLUS_TWO);
|
|
nResist = 15;
|
|
}
|
|
else if (8 > nHD && nHD >= 4)
|
|
{
|
|
eDR = EffectDamageReduction(5, DAMAGE_POWER_PLUS_ONE);
|
|
nResist = 10;
|
|
}
|
|
else if (4 > nHD)
|
|
{
|
|
nResist = 5;
|
|
}
|
|
|
|
effect eAcid = EffectDamageResistance(DAMAGE_TYPE_ACID, nResist);
|
|
effect eCold = EffectDamageResistance(DAMAGE_TYPE_COLD, nResist);
|
|
effect eElec = EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, nResist);
|
|
effect eVis = EffectUltravision();
|
|
effect eLink = EffectLinkEffects(eDR, eAcid);
|
|
eLink = EffectLinkEffects(eLink, eCold);
|
|
eLink = EffectLinkEffects(eLink, eElec);
|
|
eLink = EffectLinkEffects(eLink, eVis);
|
|
eLink = SupernaturalEffect(eLink);
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oCompanion);
|
|
|
|
itemproperty ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_TEMPLATE_CELESTIAL_SMITE_EVIL);
|
|
IPSafeAddItemProperty(oCompSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
|
|
|
if(GetAlignmentGoodEvil(oCompanion) != ALIGNMENT_GOOD)
|
|
AdjustAlignment(oCompanion, ALIGNMENT_GOOD, 80, FALSE);
|
|
|
|
SetLocalInt(oCompanion, "CelestialTemplate", 1);
|
|
}
|
|
|
|
void ApplyPseudonatural(object oFamiliar, object oFamSkin)
|
|
{
|
|
if(GetLocalInt(oFamiliar, "PseudonaturalTemplate"))
|
|
return;
|
|
|
|
int nHD = GetHitDice(oFamiliar);
|
|
int nResist;
|
|
effect eDR;
|
|
if (nHD >= 12)
|
|
{
|
|
eDR = EffectDamageReduction(10, DAMAGE_POWER_PLUS_THREE);
|
|
nResist = 20;
|
|
}
|
|
else if (12 > nHD && nHD >= 8)
|
|
{
|
|
eDR = EffectDamageReduction(5, DAMAGE_POWER_PLUS_TWO);
|
|
nResist = 15;
|
|
}
|
|
else if (8 > nHD && nHD >= 4)
|
|
{
|
|
eDR = EffectDamageReduction(5, DAMAGE_POWER_PLUS_ONE);
|
|
nResist = 10;
|
|
}
|
|
else if (4 > nHD)
|
|
{
|
|
nResist = 5;
|
|
}
|
|
|
|
effect eAcid = EffectDamageResistance(DAMAGE_TYPE_ACID, nResist);
|
|
effect eElec = EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, nResist);
|
|
effect eAC = EffectACIncrease(1,AC_NATURAL_BONUS);
|
|
effect eLink = EffectLinkEffects(eDR, eAcid);
|
|
eLink = EffectLinkEffects(eLink, eElec);
|
|
eLink = EffectLinkEffects(eLink, eAC);
|
|
eLink = SupernaturalEffect(eLink);
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oFamiliar);
|
|
|
|
// itemproperty ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_TEMPLATE_PSEUDONATURAL_TRUESTRIKE);
|
|
// IPSafeAddItemProperty(oFamSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
|
|
|
SetLocalInt(oFamiliar, "PseudonaturalTemplate", 1);
|
|
}
|
|
|
|
void ApplyIllmaster(object oCompanion, object oCompSkin)
|
|
{
|
|
//Give the companion permanent Str +4, Con +2, Wis -2, and Cha -2
|
|
if(GetPRCSwitch(PRC_NWNX_FUNCS))
|
|
{
|
|
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_STRENGTH, 4);
|
|
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_CONSTITUTION, 2);
|
|
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_WISDOM, -2);
|
|
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_CHARISMA, -2);
|
|
}
|
|
else
|
|
{
|
|
string sFlag = "Illmaster";
|
|
SetCompositeBonus(oCompSkin, sFlag, 4, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_STR);
|
|
SetCompositeBonus(oCompSkin, sFlag, 2, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_CON);
|
|
SetCompositeBonus(oCompSkin, sFlag, 2, ITEM_PROPERTY_DECREASED_ABILITY_SCORE, IP_CONST_ABILITY_WIS);
|
|
SetCompositeBonus(oCompSkin, sFlag, 2, ITEM_PROPERTY_DECREASED_ABILITY_SCORE, IP_CONST_ABILITY_CHA);
|
|
}
|
|
|
|
//Set PLANT immunities and add low light vision
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_CHARM_PERSON), oCompSkin);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_DOMINATE_PERSON), oCompSkin);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_HOLD_PERSON), oCompSkin);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_MASS_CHARM), oCompSkin);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_MINDSPELLS), oCompSkin);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON), oCompSkin);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_PARALYSIS), oCompSkin);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_CRITICAL_HITS), oCompSkin);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_DISEASE), oCompSkin);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_BACKSTAB), oCompSkin);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, PRCItemPropertyBonusFeat(FEAT_LOWLIGHTVISION), oCompSkin);
|
|
|
|
//Compute the DC for this companion's blight touch
|
|
int iHD = GetHitDice(oCompanion);
|
|
int iCons = GetAbilityModifier(ABILITY_CONSTITUTION, oCompanion);
|
|
int iDC = 10 + (iHD / 2) + iCons;
|
|
//Create the onhit item property for causing the blight touch disease
|
|
itemproperty ipBlightTouch = ItemPropertyOnHitProps(IP_CONST_ONHIT_DISEASE, iDC, DISEASE_TALONAS_BLIGHT);
|
|
//Get the companion's creature weapons
|
|
object oBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oCompanion);
|
|
object oLClaw = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oCompanion);
|
|
object oRClaw = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oCompanion);
|
|
//Apply blight touch to each weapon
|
|
if (GetIsObjectValid(oBite))
|
|
IPSafeAddItemProperty(oBite, ipBlightTouch);
|
|
if (GetIsObjectValid(oLClaw))
|
|
IPSafeAddItemProperty(oLClaw, ipBlightTouch);
|
|
if (GetIsObjectValid(oRClaw))
|
|
IPSafeAddItemProperty(oRClaw, ipBlightTouch);
|
|
|
|
//Adjust alignment to Neutral Evil
|
|
if(GetAlignmentLawChaos(oCompanion) != ALIGNMENT_NEUTRAL)
|
|
AdjustAlignment(oCompanion, ALIGNMENT_NEUTRAL, 50, FALSE);
|
|
if (GetAlignmentGoodEvil(oCompanion) != ALIGNMENT_EVIL)
|
|
AdjustAlignment(oCompanion, ALIGNMENT_EVIL, 80, FALSE);
|
|
}
|
|
|
|
void WinterWolfProperties(object oCompanion, int nLevel)
|
|
{
|
|
int iStr = nLevel >= 30 ? (nLevel-30)/2 : (nLevel-4)/2;
|
|
int iDex = nLevel >= 30 ? (nLevel-31)/2 : (nLevel-5)/2;
|
|
|
|
object oCreR = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oCompanion);
|
|
|
|
if(GetPRCSwitch(PRC_NWNX_FUNCS))
|
|
{
|
|
if(iStr > 0)
|
|
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_STRENGTH, iStr);
|
|
if(iDex > 0)
|
|
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_DEXTERITY, iStr);
|
|
}
|
|
else
|
|
{
|
|
if(iStr > 0)
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAbilityBonus(IP_CONST_ABILITY_STR, iStr), oCreR);
|
|
if(iDex > 0)
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAbilityBonus(IP_CONST_ABILITY_DEX, iDex), oCreR);
|
|
}
|
|
|
|
int nBonusDmg;
|
|
|
|
if(nLevel > 24)
|
|
nBonusDmg = IP_CONST_DAMAGEBONUS_1d12;
|
|
else if(nLevel > 16)
|
|
nBonusDmg = IP_CONST_DAMAGEBONUS_1d10;
|
|
else if(nLevel > 7)
|
|
nBonusDmg = IP_CONST_DAMAGEBONUS_1d8;
|
|
else
|
|
nBonusDmg = IP_CONST_DAMAGEBONUS_1d6;
|
|
|
|
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_COLD, nBonusDmg), oCreR);
|
|
//winter wolf properties
|
|
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyDamageVulnerability(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEVULNERABILITY_50_PERCENT), oCreR);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyDamageImmunity(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEIMMUNITY_100_PERCENT), oCreR);
|
|
|
|
int iMax, i;
|
|
int coneAbi = nLevel / 5;
|
|
switch(coneAbi)
|
|
{
|
|
case 1 : iMax = 7; break;
|
|
case 2 : iMax = 6; break;
|
|
case 3 : iMax = 5; break;
|
|
case 4 : iMax = 4; break;
|
|
case 5 : iMax = 3; break;
|
|
case 6 : iMax = 2; break;
|
|
case 7 : iMax = 1; break;
|
|
}
|
|
|
|
if(iMax > 0)
|
|
{
|
|
for(i = 1; i <= iMax; i++)
|
|
DecrementRemainingSpellUses(oCompanion, 230);
|
|
}
|
|
}
|
|
|
|
void ApplyPnPFamiliarProperties(object oPC, object oFam)
|
|
{
|
|
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
|
|
effect eBonus;
|
|
|
|
//get familiar level
|
|
int nFamLevel = GetLevelByClass(CLASS_TYPE_WIZARD, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_SORCERER, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_WITCH, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_ALIENIST, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_HEXBLADE, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_DREAD_NECROMANCER, oPC);
|
|
|
|
if (GetHasFeat(FEAT_SHADOW_FAMILIAR, oPC)) nFamLevel = GetLevelByTypeArcane(oPC) + GetShadowcasterLevel(oPC); // For the purpose of determining familiar abilities that depend on your arcane caster level,
|
|
// your levels in all classes that allow you to cast mysteries or arcane spells stack
|
|
|
|
//scaling bonuses
|
|
int nAdjustLevel = nFamLevel - GetHitDice(oFam);
|
|
int n;
|
|
for(n = 1; nAdjustLevel >= n; n++)
|
|
LevelUpHenchman(oFam, CLASS_TYPE_INVALID, TRUE);
|
|
|
|
int nACBonus = nFamLevel / 2;
|
|
int nIntBonus = nFamLevel / 2;
|
|
int nSRBonus = nFamLevel > 11 ? nFamLevel + 5 : 0;
|
|
|
|
//saving throws
|
|
int nSaveRefBonus = GetReflexSavingThrow(oPC) - GetReflexSavingThrow(oFam);
|
|
int nSaveFortBonus = GetFortitudeSavingThrow(oPC) - GetFortitudeSavingThrow(oFam);
|
|
int nSaveWillBonus = GetWillSavingThrow(oPC) - GetWillSavingThrow(oFam);
|
|
|
|
int nHPBonus;
|
|
|
|
if(bFuncs)
|
|
{
|
|
nHPBonus = GetMaxHitPoints(oPC) / 2;
|
|
|
|
int i, nBonus;
|
|
for(i = 0; i < GetPRCSwitch(FILE_END_SKILLS); i++)
|
|
{
|
|
nBonus = GetSkillRank(i, oPC) - GetSkillRank(i, oFam);
|
|
if(nBonus > 0)
|
|
PRC_Funcs_ModSkill(oFam, i, nBonus);
|
|
}
|
|
|
|
PRC_Funcs_SetBaseNaturalAC(oFam, PRC_Funcs_GetBaseNaturalAC(oFam) + nACBonus);
|
|
PRC_Funcs_ModAbilityScore(oFam, ABILITY_INTELLIGENCE, nIntBonus);
|
|
PRC_Funcs_ModSavingThrowBonus(oFam, SAVING_THROW_REFLEX, nSaveRefBonus);
|
|
PRC_Funcs_ModSavingThrowBonus(oFam, SAVING_THROW_FORT, nSaveFortBonus);
|
|
PRC_Funcs_ModSavingThrowBonus(oFam, SAVING_THROW_WILL, nSaveWillBonus);
|
|
PRC_Funcs_SetMaxHitPoints(oFam, nHPBonus);
|
|
PRC_Funcs_SetCurrentHitPoints(oFam, nHPBonus);
|
|
}
|
|
else
|
|
{
|
|
//temporary HP for the moment, have to think of a better idea later
|
|
nHPBonus = (GetMaxHitPoints(oPC) / 2) - GetMaxHitPoints(oFam);
|
|
|
|
int i, nBonus;
|
|
for(i = 0; i < GetPRCSwitch(FILE_END_SKILLS); i++)
|
|
{
|
|
nBonus = GetSkillRank(i, oPC) - GetSkillRank(i, oFam);
|
|
eBonus = EffectLinkEffects(eBonus, EffectSkillIncrease(i, nBonus));
|
|
}
|
|
|
|
eBonus = EffectLinkEffects(eBonus, EffectACIncrease(nACBonus, AC_NATURAL_BONUS));
|
|
eBonus = EffectLinkEffects(eBonus, EffectAbilityIncrease(ABILITY_INTELLIGENCE, nIntBonus));
|
|
eBonus = EffectLinkEffects(eBonus, EffectSavingThrowIncrease(SAVING_THROW_REFLEX, nSaveRefBonus));
|
|
eBonus = EffectLinkEffects(eBonus, EffectSavingThrowIncrease(SAVING_THROW_FORT, nSaveFortBonus));
|
|
eBonus = EffectLinkEffects(eBonus, EffectSavingThrowIncrease(SAVING_THROW_WILL, nSaveWillBonus));
|
|
eBonus = EffectLinkEffects(eBonus, EffectTemporaryHitpoints(nHPBonus));
|
|
}
|
|
|
|
int nABBonus = GetBaseAttackBonus(oPC) - GetBaseAttackBonus(oFam);
|
|
int nAttacks = (GetBaseAttackBonus(oPC)/5)+1;
|
|
if(nAttacks > 5)
|
|
nAttacks = 5;
|
|
SetBaseAttackBonus(nAttacks, oFam);
|
|
|
|
//effect doing
|
|
if(nSRBonus > 0) eBonus = EffectLinkEffects(eBonus, EffectSpellResistanceIncrease(nSRBonus));
|
|
eBonus = EffectLinkEffects(eBonus, EffectAttackIncrease(nABBonus));
|
|
//skills were linked earlier
|
|
eBonus = SupernaturalEffect(eBonus);
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonus, oFam);
|
|
}
|
|
|
|
void CheckIsValidFamiliar(object oMaster, effect eBonus)
|
|
{
|
|
object oFam = GetAssociateNPC(ASSOCIATE_TYPE_FAMILIAR);
|
|
object oFamToken = GetItemPossessedBy(oMaster, "prc_pnp_familiar");
|
|
|
|
if(GetIsObjectValid(oFam))
|
|
{
|
|
if(!GetIsDead(oFam))
|
|
{
|
|
DelayCommand(30.0, CheckIsValidFamiliar(oMaster, eBonus));
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(GetIsObjectValid(oFamToken))
|
|
{
|
|
DelayCommand(30.0, CheckIsValidFamiliar(oMaster, eBonus));
|
|
return;
|
|
}
|
|
}
|
|
|
|
RemoveEffect(oMaster, eBonus);
|
|
}
|
|
|
|
effect GetMasterBonus(int nFamiliarType)
|
|
{
|
|
effect eBonus;
|
|
string sFile = "prc_familiar";
|
|
string sTemp = Get2DACache(sFile, "BONUS", nFamiliarType);
|
|
int nParam1 = StringToInt(Get2DACache(sFile, "PARAM1", nFamiliarType));
|
|
int nParam2 = StringToInt(Get2DACache(sFile, "PARAM2", nFamiliarType));
|
|
|
|
if(sTemp == "sk")
|
|
eBonus = EffectSkillIncrease(nParam1, nParam2);
|
|
else if(sTemp == "sv")
|
|
eBonus = EffectSavingThrowIncrease(nParam1, nParam2);
|
|
else if(sTemp == "hp")
|
|
eBonus = EffectTemporaryHitpoints(nParam1);
|
|
|
|
return eBonus;
|
|
}
|
|
|
|
int GetCompanionBaseDamage(int nLevel, int bBite)
|
|
{
|
|
int nBite, nClaw;
|
|
if(nLevel > 35)
|
|
{
|
|
nBite = IP_CONST_MONSTERDAMAGE_2d10;
|
|
nClaw = IP_CONST_MONSTERDAMAGE_1d12;
|
|
}
|
|
else if(nLevel > 26)
|
|
{
|
|
nBite = IP_CONST_MONSTERDAMAGE_2d8;
|
|
nClaw = IP_CONST_MONSTERDAMAGE_1d10;
|
|
}
|
|
else if(nLevel > 18)
|
|
{
|
|
nBite = IP_CONST_MONSTERDAMAGE_2d6;
|
|
nClaw = IP_CONST_MONSTERDAMAGE_1d8;
|
|
}
|
|
else if(nLevel > 11)
|
|
{
|
|
nBite = IP_CONST_MONSTERDAMAGE_1d10;
|
|
nClaw = IP_CONST_MONSTERDAMAGE_1d6;
|
|
}
|
|
else if(nLevel > 5)
|
|
{
|
|
nBite = IP_CONST_MONSTERDAMAGE_1d8;
|
|
nClaw = IP_CONST_MONSTERDAMAGE_1d4;
|
|
}
|
|
else
|
|
{
|
|
nBite = IP_CONST_MONSTERDAMAGE_1d6;
|
|
nClaw = IP_CONST_MONSTERDAMAGE_1d3;
|
|
}
|
|
|
|
if(bBite)
|
|
return nBite;
|
|
|
|
return nClaw;
|
|
}
|
|
|
|
void SetNaturalWeaponDamage(object oCompanion, int nLvlMod = 0)
|
|
{
|
|
int nLevel = GetHitDice(oCompanion);
|
|
nLevel += nLvlMod;
|
|
int Enh = (nLevel - 15) / 5;
|
|
int nDamage;
|
|
|
|
//Get the companion's creature weapons
|
|
object oBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oCompanion);
|
|
object oLClaw = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oCompanion);
|
|
object oRClaw = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oCompanion);
|
|
|
|
//Apply properties to each weapon
|
|
if(GetIsObjectValid(oBite))
|
|
{
|
|
CleanProperties(oBite);
|
|
nDamage = GetCompanionBaseDamage(nLevel, TRUE);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyMonsterDamage(nDamage), oBite);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAttackBonus(Enh), oBite);
|
|
}
|
|
if(GetIsObjectValid(oLClaw))
|
|
{
|
|
CleanProperties(oLClaw);
|
|
nDamage = GetCompanionBaseDamage(nLevel, FALSE);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyMonsterDamage(nDamage), oLClaw);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAttackBonus(Enh), oLClaw);
|
|
}
|
|
if(GetIsObjectValid(oRClaw))
|
|
{
|
|
CleanProperties(oRClaw);
|
|
nDamage = GetCompanionBaseDamage(nLevel, FALSE);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyMonsterDamage(nDamage), oRClaw);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAttackBonus(Enh), oRClaw);
|
|
}
|
|
}
|
|
|
|
void UnsummonCompanions(object oPC)
|
|
{
|
|
int i;
|
|
object oAsso;
|
|
for(i = 1; i <= 5; i++)
|
|
{
|
|
oAsso = GetAssociateNPC(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC, i);
|
|
if(GetIsObjectValid(oAsso))
|
|
DestroyAssociate(oAsso);
|
|
}
|
|
for(i = 1; i <= 5; i++)
|
|
{
|
|
oAsso = GetAssociateNPC(ASSOCIATE_TYPE_FAMILIAR, oPC, i);
|
|
if(GetIsObjectValid(oAsso))
|
|
DestroyAssociate(oAsso);
|
|
}
|
|
} |