Clear out experimental .35 files
Clear out experimental .35 files
This commit is contained in:
@@ -1,530 +0,0 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: 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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user