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.
180 lines
6.5 KiB
Plaintext
180 lines
6.5 KiB
Plaintext
#include "prc_inc_spells"
|
||
|
||
//Checks target racial type for Archivists Dark Knowledge ability
|
||
int DarkKnowledgeValidTarget(int nRacialType)
|
||
{
|
||
switch(nRacialType)
|
||
{
|
||
case RACIAL_TYPE_ABERRATION: return TRUE;
|
||
case RACIAL_TYPE_ELEMENTAL: return TRUE;
|
||
case RACIAL_TYPE_MAGICAL_BEAST: return TRUE;
|
||
case RACIAL_TYPE_OUTSIDER: return TRUE;
|
||
case RACIAL_TYPE_UNDEAD: return TRUE;
|
||
case RACIAL_TYPE_DRAGON: if(GetHasFeat(FEAT_DRACONIC_ARCHIVIST)) return TRUE;
|
||
case RACIAL_TYPE_CONSTRUCT: if(GetHasFeat(FEAT_DRACONIC_ARCHIVIST)) return TRUE;
|
||
case RACIAL_TYPE_FEY: if(GetHasFeat(FEAT_ARCHIVIST_OF_NATURE)) return TRUE;
|
||
case RACIAL_TYPE_GIANT: if(GetHasFeat(FEAT_ARCHIVIST_OF_NATURE)) return TRUE;
|
||
|
||
default: return FALSE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
int SpellIDToFeatID(int nSpellID)
|
||
{
|
||
switch(nSpellID)
|
||
{
|
||
case SPELL_DK_TACTICS: return FEAT_DK_TACTICS;
|
||
case SPELL_DK_PUISSANCE: return FEAT_DK_PUISSANCE;
|
||
case SPELL_DK_FOE: return FEAT_DK_FOE;
|
||
case SPELL_DK_DREADSECRET: return FEAT_DK_DREADSECRET;
|
||
case SPELL_DK_FOREKNOWLEDGE: return FEAT_DK_FOREKNOWLEDGE;
|
||
}
|
||
//on error
|
||
return -1;
|
||
}
|
||
|
||
void main()
|
||
{
|
||
object oPC = OBJECT_SELF;
|
||
object oTarget = PRCGetSpellTargetObject();
|
||
int nSpellID = PRCGetSpellId();
|
||
int nRacialType = MyPRCGetRacialType(oTarget);
|
||
effect eBonus, eVis, eEff;
|
||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
||
|
||
//nr of uses is decreased by game engine and by this script, so add an extra use here
|
||
IncrementRemainingFeatUses(oPC, SpellIDToFeatID(nSpellID));
|
||
|
||
//check if target is valid
|
||
if(!DarkKnowledgeValidTarget(nRacialType))
|
||
{
|
||
FloatingTextStringOnCreature(GetStringByStrRef(16789900), oPC, FALSE);
|
||
return;
|
||
}
|
||
|
||
//remove use for all dark knowledge abilities
|
||
DecrementRemainingFeatUses(oPC, FEAT_DK_TACTICS);
|
||
DecrementRemainingFeatUses(oPC, FEAT_DK_PUISSANCE);
|
||
DecrementRemainingFeatUses(oPC, FEAT_DK_FOE);
|
||
DecrementRemainingFeatUses(oPC, FEAT_DK_DREADSECRET);
|
||
DecrementRemainingFeatUses(oPC, FEAT_DK_FOREKNOWLEDGE);
|
||
|
||
//make a lore check
|
||
int nRoll = d20();
|
||
int nLoreCheck = nRoll + GetSkillRank(SKILL_LORE);
|
||
if(!GetPRCIsSkillSuccessful(oPC, SKILL_LORE, 15, nRoll))
|
||
{
|
||
//FloatingTextStringOnCreature(GetStringByStrRef(16789901), oPC, FALSE);
|
||
return;
|
||
}
|
||
|
||
if(nSpellID == SPELL_DK_DREADSECRET)
|
||
{
|
||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||
effect eVis = EffectVisualEffect(VFX_FNF_PWSTUN);// VFX_IMP_CHARM sko<6B>czy<7A>em na 181
|
||
|
||
int bMindSpellImmune = GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS, oPC);
|
||
int bStunImmune = GetIsImmune(oTarget, IMMUNITY_TYPE_STUN, oPC);
|
||
int bDazeImmune = GetIsImmune(oTarget, IMMUNITY_TYPE_DAZED, oPC);
|
||
|
||
if(nLoreCheck >= 35)
|
||
{
|
||
if(!bMindSpellImmune && !bStunImmune)//Stunned
|
||
eEff = EffectStunned();
|
||
else
|
||
eEff = EffectCutsceneParalyze();
|
||
}
|
||
else if(nLoreCheck < 35 && nLoreCheck >= 25)//Dazed
|
||
{
|
||
if(!bMindSpellImmune && !bDazeImmune)
|
||
eEff = EffectDazed();
|
||
else
|
||
eEff = EffectCutsceneImmobilize();
|
||
}
|
||
else if(nLoreCheck < 25)//Dazzled
|
||
{
|
||
eEff = EffectDazzle();
|
||
}
|
||
|
||
eEff = EffectLinkEffects(eEff, eDur);
|
||
|
||
//remove effects of previous castings
|
||
PRCRemoveEffectsFromSpell(oTarget, SPELL_DK_DREADSECRET);
|
||
|
||
//apply new effects
|
||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEff, oTarget, RoundsToSeconds(1));
|
||
return;
|
||
}
|
||
|
||
//other abilities are beneficial
|
||
int nBonus = (nLoreCheck - 5) / 10;
|
||
if(nBonus > 3 && !GetHasFeat(FEAT_EPIC_DARK_KNOWLEDGE, oPC))
|
||
nBonus = 3;
|
||
|
||
//set bonuses
|
||
if(nSpellID == SPELL_DK_TACTICS)
|
||
{
|
||
eBonus = VersusRacialTypeEffect(EffectAttackIncrease(nBonus), nRacialType);
|
||
eVis = EffectVisualEffect(VFX_IMP_HOLY_AID_DN_PURPLE);
|
||
}
|
||
else if(nSpellID == SPELL_DK_PUISSANCE)
|
||
{
|
||
eBonus = VersusRacialTypeEffect(EffectSavingThrowIncrease(SAVING_THROW_ALL, nBonus), nRacialType);
|
||
eVis = EffectVisualEffect(VFX_IMP_MAGIC_PROTECTION_P);
|
||
}
|
||
else if(nSpellID == SPELL_DK_FOREKNOWLEDGE)
|
||
{
|
||
eBonus = VersusRacialTypeEffect(EffectACIncrease(nBonus), nRacialType);
|
||
eVis = EffectVisualEffect(VFX_IMP_PDK_RALLYING_CRY);
|
||
}
|
||
else if(nSpellID == SPELL_DK_FOE)
|
||
{
|
||
switch(nBonus)
|
||
{
|
||
case 1: nBonus = DAMAGE_BONUS_1d6; break;
|
||
case 2: nBonus = DAMAGE_BONUS_2d6; break;
|
||
case 3: nBonus = 31; break;//DAMAGE_BONUS_3d6 - no constant?
|
||
case 4: nBonus = 32; break;//DAMAGE_BONUS_4d6
|
||
case 5: nBonus = 33; break;//DAMAGE_BONUS_5d6
|
||
case 6: nBonus = 34; break;//DAMAGE_BONUS_6d6
|
||
case 7: nBonus = 35; break;//DAMAGE_BONUS_7d6
|
||
case 8: nBonus = 36; break;//DAMAGE_BONUS_8d6
|
||
case 9: nBonus = 53; break;//DAMAGE_BONUS_9d6
|
||
default: nBonus = 54; break;//DAMAGE_BONUS_10d6
|
||
}
|
||
eBonus = VersusRacialTypeEffect(EffectDamageIncrease(nBonus, DAMAGE_TYPE_BLUDGEONING), nRacialType);
|
||
eVis = EffectVisualEffect(VFX_IMP_SUPER_HEROISM);
|
||
}
|
||
|
||
eBonus = EffectLinkEffects(eBonus, eDur);
|
||
eBonus = ExtraordinaryEffect(eBonus);
|
||
|
||
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_LOS_PURPLE_30_SILENT), GetLocation(oPC));
|
||
|
||
object oAlly = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
||
|
||
while(GetIsObjectValid(oAlly) && GetIsFriend(oAlly))
|
||
{
|
||
//remove effects of previous castings
|
||
effect eLook = GetFirstEffect(oAlly);
|
||
while(GetIsEffectValid(eLook))
|
||
{
|
||
int nEffID = GetEffectSpellId(eLook);
|
||
if(nEffID == SPELL_DK_TACTICS
|
||
|| nEffID == SPELL_DK_PUISSANCE
|
||
|| nEffID == SPELL_DK_FOREKNOWLEDGE
|
||
|| nEffID == SPELL_DK_FOE)
|
||
RemoveEffect(oAlly, eLook);
|
||
eLook = GetNextEffect(oAlly);
|
||
}
|
||
|
||
//apply new effects
|
||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oAlly);
|
||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBonus, oAlly, TurnsToSeconds(1));
|
||
|
||
oAlly = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
||
}
|
||
} |