215 lines
8.3 KiB
Plaintext
215 lines
8.3 KiB
Plaintext
|
//::///////////////////////////////////////////////
|
||
|
//:: Turn Undead
|
||
|
//:: NW_S2_TurnDead
|
||
|
//:: Copyright (c) 2001 Bioware Corp.
|
||
|
//:://////////////////////////////////////////////
|
||
|
/*
|
||
|
Checks domain powers and class to determine
|
||
|
the proper turning abilities of the casting
|
||
|
character.
|
||
|
*/
|
||
|
//:://////////////////////////////////////////////
|
||
|
//:: Created By: Nov 2, 2001
|
||
|
//:: Created On: Preston Watamaniuk
|
||
|
//:://////////////////////////////////////////////
|
||
|
//:: MODIFIED MARCH 5 2003 for Blackguards
|
||
|
void main()
|
||
|
{
|
||
|
int nClericLevel = GetLevelByClass(CLASS_TYPE_CLERIC);
|
||
|
int nPaladinLevel = GetLevelByClass(CLASS_TYPE_PALADIN);
|
||
|
int nBlackguardlevel = GetLevelByClass(CLASS_TYPE_BLACKGUARD);
|
||
|
int nTotalLevel = GetHitDice(OBJECT_SELF);
|
||
|
|
||
|
int nTurnLevel = nClericLevel;
|
||
|
int nClassLevel = nClericLevel;
|
||
|
|
||
|
|
||
|
if((nPaladinLevel - 2) > nClericLevel)
|
||
|
{
|
||
|
nClassLevel = nPaladinLevel -2;
|
||
|
nTurnLevel = nPaladinLevel - 2;
|
||
|
}
|
||
|
// * April 2003
|
||
|
// * Change from official rules for balance purposes
|
||
|
// * Blackguard gets to turn at 'character level' - 2 not class level
|
||
|
// * otherwise the ability is rather useless
|
||
|
if ( (nBlackguardlevel > 0) && ( nTotalLevel - 2 > nClassLevel) )
|
||
|
{
|
||
|
nClassLevel = nTotalLevel - 2;
|
||
|
nTurnLevel = nTotalLevel - 2;
|
||
|
}
|
||
|
|
||
|
//Flags for bonus turning types
|
||
|
int nElemental = GetHasFeat(FEAT_AIR_DOMAIN_POWER) + GetHasFeat(FEAT_EARTH_DOMAIN_POWER) + GetHasFeat(FEAT_FIRE_DOMAIN_POWER) + GetHasFeat(FEAT_WATER_DOMAIN_POWER);
|
||
|
int nVermin = GetHasFeat(FEAT_PLANT_DOMAIN_POWER) + GetHasFeat(FEAT_ANIMAL_COMPANION);
|
||
|
int nConstructs = GetHasFeat(FEAT_DESTRUCTION_DOMAIN_POWER);
|
||
|
int nOutsider = GetHasFeat(FEAT_GOOD_DOMAIN_POWER) + GetHasFeat(FEAT_EVIL_DOMAIN_POWER);
|
||
|
|
||
|
//Flag for improved turning ability
|
||
|
int nSun = GetHasFeat(FEAT_SUN_DOMAIN_POWER);
|
||
|
|
||
|
//Make a turning check roll, modify if have the Sun Domain
|
||
|
int nChrMod = GetAbilityModifier(ABILITY_CHARISMA);
|
||
|
int nTurnCheck = d20() + nChrMod; //The roll to apply to the max HD of undead that can be turned --> nTurnLevel
|
||
|
int nTurnHD = d6(2) + nChrMod + nClassLevel; //The number of HD of undead that can be turned.
|
||
|
|
||
|
if(nSun == TRUE)
|
||
|
{
|
||
|
nTurnCheck += d4();
|
||
|
nTurnHD += d6();
|
||
|
}
|
||
|
//Determine the maximum HD of the undead that can be turned.
|
||
|
if(nTurnCheck <= 0)
|
||
|
{
|
||
|
nTurnLevel -= 4;
|
||
|
}
|
||
|
else if(nTurnCheck >= 1 && nTurnCheck <= 3)
|
||
|
{
|
||
|
nTurnLevel -= 3;
|
||
|
}
|
||
|
else if(nTurnCheck >= 4 && nTurnCheck <= 6)
|
||
|
{
|
||
|
nTurnLevel -= 2;
|
||
|
}
|
||
|
else if(nTurnCheck >= 7 && nTurnCheck <= 9)
|
||
|
{
|
||
|
nTurnLevel -= 1;
|
||
|
}
|
||
|
else if(nTurnCheck >= 10 && nTurnCheck <= 12)
|
||
|
{
|
||
|
//Stays the same
|
||
|
}
|
||
|
else if(nTurnCheck >= 13 && nTurnCheck <= 15)
|
||
|
{
|
||
|
nTurnLevel += 1;
|
||
|
}
|
||
|
else if(nTurnCheck >= 16 && nTurnCheck <= 18)
|
||
|
{
|
||
|
nTurnLevel += 2;
|
||
|
}
|
||
|
else if(nTurnCheck >= 19 && nTurnCheck <= 21)
|
||
|
{
|
||
|
nTurnLevel += 3;
|
||
|
}
|
||
|
else if(nTurnCheck >= 22)
|
||
|
{
|
||
|
nTurnLevel += 4;
|
||
|
}
|
||
|
|
||
|
//Gets all creatures in a 20m radius around the caster and turns them or not. If the creatures
|
||
|
//HD are 1/2 or less of the nClassLevel then the creature is destroyed.
|
||
|
int nCnt = 1;
|
||
|
int nHD, nRacial, nHDCount, bValid, nDamage;
|
||
|
nHDCount = 0;
|
||
|
effect eVis = EffectVisualEffect(VFX_IMP_SUNSTRIKE);
|
||
|
effect eVisTurn = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR);
|
||
|
effect eDamage;
|
||
|
effect eTurned = EffectTurned();
|
||
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||
|
effect eLink = EffectLinkEffects(eVisTurn, eTurned);
|
||
|
eLink = EffectLinkEffects(eLink, eDur);
|
||
|
|
||
|
effect eDeath = SupernaturalEffect(EffectDeath(TRUE));
|
||
|
|
||
|
effect eImpactVis = EffectVisualEffect(VFX_FNF_LOS_HOLY_30);
|
||
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpactVis, GetLocation(OBJECT_SELF));
|
||
|
|
||
|
//Get nearest enemy within 20m (60ft)
|
||
|
//Why are you using GetNearest instead of GetFirstObjectInShape
|
||
|
object oTarget = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC , OBJECT_SELF, nCnt);
|
||
|
while(GetIsObjectValid(oTarget) && nHDCount < nTurnHD && GetDistanceToObject(oTarget) <= 20.0)
|
||
|
{ // while
|
||
|
if(!GetIsFriend(oTarget))
|
||
|
{
|
||
|
nHD = GetHitDice(oTarget) + GetTurnResistanceHD(oTarget);
|
||
|
nRacial = GetRacialType(oTarget);
|
||
|
if(nHD <= nTurnLevel && nHD <= (nTurnHD - nHDCount))
|
||
|
{
|
||
|
//Check the various domain turning types
|
||
|
if(nRacial == RACIAL_TYPE_UNDEAD)
|
||
|
{
|
||
|
bValid = TRUE;
|
||
|
}
|
||
|
else if (nRacial == RACIAL_TYPE_VERMIN && nVermin > 0)
|
||
|
{
|
||
|
bValid = TRUE;
|
||
|
}
|
||
|
else if (nRacial == RACIAL_TYPE_ELEMENTAL && nElemental > 0)
|
||
|
{
|
||
|
bValid = TRUE;
|
||
|
}
|
||
|
else if (nRacial == RACIAL_TYPE_CONSTRUCT && nConstructs > 0)
|
||
|
{
|
||
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_TURN_UNDEAD));
|
||
|
nDamage = d3(nTurnLevel);
|
||
|
eDamage = EffectDamage(nDamage, DAMAGE_TYPE_MAGICAL);
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget);
|
||
|
nHDCount += nHD;
|
||
|
}
|
||
|
else if (nRacial == RACIAL_TYPE_OUTSIDER && nOutsider > 0)
|
||
|
{
|
||
|
bValid = TRUE;
|
||
|
}
|
||
|
|
||
|
//Apply results of the turn
|
||
|
if( bValid == TRUE)
|
||
|
{
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||
|
//if(IntToFloat(nClassLevel)/2.0 >= IntToFloat(nHD))
|
||
|
//{
|
||
|
|
||
|
if((nClassLevel/2) >= nHD)
|
||
|
{
|
||
|
//Fire cast spell at event for the specified target
|
||
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_TURN_UNDEAD));
|
||
|
//Destroy the target
|
||
|
DelayCommand(0.1f, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//Turn the target
|
||
|
//Fire cast spell at event for the specified target
|
||
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_TURN_UNDEAD));
|
||
|
AssignCommand(oTarget, ActionMoveAwayFromObject(OBJECT_SELF, TRUE));
|
||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nClassLevel + 5));
|
||
|
}
|
||
|
nHDCount = nHDCount + nHD;
|
||
|
}
|
||
|
}
|
||
|
bValid = FALSE;
|
||
|
}
|
||
|
nCnt++;
|
||
|
oTarget = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC, OBJECT_SELF, nCnt);
|
||
|
} // while
|
||
|
nCnt=1;
|
||
|
oTarget=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF, nCnt);
|
||
|
while(oTarget!=OBJECT_INVALID&&GetDistanceBetween(OBJECT_SELF,oTarget)<=20.0)
|
||
|
{ // check for player vampires
|
||
|
if ((GetLocalInt(oTarget,"nIsVampire")||GetLocalInt(oTarget,"bUndead"))&&GetIsFriend(oTarget)!=TRUE)
|
||
|
{ // vampire
|
||
|
nHD = GetHitDice(oTarget) + GetTurnResistanceHD(oTarget);
|
||
|
if (nHD<=nTurnLevel&&nHDCount<nTurnHD)
|
||
|
{
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||
|
if((nClassLevel/2) >= nHD)
|
||
|
{
|
||
|
//Fire cast spell at event for the specified target
|
||
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_TURN_UNDEAD));
|
||
|
//Destroy the target
|
||
|
DelayCommand(0.1f, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget));
|
||
|
}
|
||
|
else
|
||
|
{ // turn
|
||
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_TURN_UNDEAD));
|
||
|
AssignCommand(oTarget, ActionMoveAwayFromObject(OBJECT_SELF, TRUE));
|
||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nClassLevel + 5));
|
||
|
} // turn
|
||
|
nHDCount=nHDCount+nHD;
|
||
|
}
|
||
|
} // vampire
|
||
|
nCnt++;
|
||
|
oTarget=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF, nCnt);
|
||
|
} // check for player vampires
|
||
|
}
|