Added "removed" folder
This commit is contained in:
268
_removed/nw_s2_turndead.nss
Normal file
268
_removed/nw_s2_turndead.nss
Normal file
@@ -0,0 +1,268 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: 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: Preston Watamaniuk
|
||||
//:: Created On: Nov 2, 2001
|
||||
//:: Updated On: Jul 15, 2003 - Georg Zoeller
|
||||
//:://////////////////////////////////////////////
|
||||
//:: MODIFIED MARCH 5 2003 for Blackguards
|
||||
//:: MODIFIED JULY 24 2003 for Planar Turning to include turn resistance hd
|
||||
/*
|
||||
Patch 1.70, by Shadooow
|
||||
|
||||
- takes into account turn resistance of player character (but only from itemproperty)
|
||||
*/
|
||||
|
||||
int GetPCTurnResistance(object oPC);
|
||||
|
||||
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;
|
||||
|
||||
// GZ: Since paladin levels stack when turning, blackguard levels should stack as well
|
||||
// GZ: but not with the paladin levels (thus else if).
|
||||
if((nBlackguardlevel - 2) > 0 && (nBlackguardlevel > nPaladinLevel))
|
||||
{
|
||||
nClassLevel += (nBlackguardlevel - 2);
|
||||
nTurnLevel += (nBlackguardlevel - 2);
|
||||
}
|
||||
else if((nPaladinLevel - 2) > 0)
|
||||
{
|
||||
nClassLevel += (nPaladinLevel -2);
|
||||
nTurnLevel += (nPaladinLevel - 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 nGoodOrEvilDomain = GetHasFeat(FEAT_GOOD_DOMAIN_POWER) + GetHasFeat(FEAT_EVIL_DOMAIN_POWER);
|
||||
int nPlanar = GetHasFeat(854);
|
||||
|
||||
//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_IS_ALIVE, TRUE , OBJECT_SELF, nCnt,CREATURE_TYPE_PERCEPTION , PERCEPTION_SEEN);
|
||||
|
||||
while(GetIsObjectValid(oTarget) && nHDCount < nTurnHD && GetDistanceToObject(oTarget) <= 20.0)
|
||||
{
|
||||
if(!GetIsFriend(oTarget))
|
||||
{
|
||||
nRacial = GetRacialType(oTarget);
|
||||
|
||||
if (nRacial == RACIAL_TYPE_OUTSIDER )
|
||||
{
|
||||
if (nPlanar)
|
||||
{
|
||||
//Planar turning decreases spell resistance against turning by 1/2
|
||||
nHD = GetHitDice(oTarget) + (GetSpellResistance(oTarget) /2) + GetTurnResistanceHD(oTarget);
|
||||
}
|
||||
else
|
||||
{
|
||||
nHD = GetHitDice(oTarget) + (GetSpellResistance(oTarget) + GetTurnResistanceHD(oTarget) );
|
||||
}
|
||||
}
|
||||
else //(full turn resistance)
|
||||
{
|
||||
nHD = GetHitDice(oTarget) + GetTurnResistanceHD(oTarget);
|
||||
}
|
||||
//1.70 by Shadooow: special workaround for player characters wearing custom items with turn resistance and shifter in spectre form
|
||||
if(GetIsPC(oTarget) && !GetIsDMPossessed(oTarget) && !GetIsPossessedFamiliar(oTarget))
|
||||
{
|
||||
nHD+= GetPCTurnResistance(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);
|
||||
DelayCommand(0.01, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget));
|
||||
nHDCount += nHD;
|
||||
}
|
||||
else if (nRacial == RACIAL_TYPE_OUTSIDER && (nGoodOrEvilDomain+nPlanar > 0) )
|
||||
{
|
||||
bValid = TRUE;
|
||||
}
|
||||
// * if wearing gauntlets of the lich,then can be turned
|
||||
else if (GetIsObjectValid(GetItemPossessedBy(oTarget, "x2_gauntletlich")) == TRUE)
|
||||
{
|
||||
if (GetTag(GetItemInSlot(INVENTORY_SLOT_ARMS)) == "x2_gauntletlich")
|
||||
{
|
||||
bValid = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
//Apply results of the turn
|
||||
if( bValid == TRUE)
|
||||
{
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||||
|
||||
if (nPlanar>0 && nRacial == RACIAL_TYPE_OUTSIDER)
|
||||
{
|
||||
effect ePlane = EffectVisualEffect(VFX_IMP_DIVINE_STRIKE_HOLY);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, ePlane, oTarget);
|
||||
}
|
||||
//if(IntToFloat(nClassLevel)/2.0 >= IntToFloat(nHD))
|
||||
//{
|
||||
|
||||
if((nClassLevel/2) >= nHD)
|
||||
{
|
||||
if (nPlanar>0 && nRacial == RACIAL_TYPE_OUTSIDER)
|
||||
{
|
||||
effect ePlane2 = EffectVisualEffect(VFX_IMP_UNSUMMON);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, ePlane2, oTarget);
|
||||
}
|
||||
|
||||
effect ePlane2 = EffectVisualEffect(VFX_IMP_DIVINE_STRIKE_HOLY);
|
||||
|
||||
//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_IS_ALIVE,TRUE, OBJECT_SELF, nCnt,CREATURE_TYPE_PERCEPTION , PERCEPTION_SEEN);
|
||||
}
|
||||
}
|
||||
|
||||
int GetPCTurnResistance(object oPC)
|
||||
{
|
||||
if(!GetIsPC(oPC) || GetIsDMPossessed(oPC) || GetIsPossessedFamiliar(oPC))
|
||||
{
|
||||
return 0;//in these cases the default function works fine
|
||||
}
|
||||
int nTurnResistance;
|
||||
object oItem;
|
||||
int nSlot;
|
||||
itemproperty ip;
|
||||
for(;nSlot < NUM_INVENTORY_SLOTS;nSlot++)
|
||||
{
|
||||
oItem = GetItemInSlot(nSlot,oPC);
|
||||
if(GetIsObjectValid(oItem))
|
||||
{
|
||||
ip = GetFirstItemProperty(oItem);
|
||||
while(GetIsItemPropertyValid(ip))
|
||||
{
|
||||
if(GetItemPropertyType(ip) == ITEM_PROPERTY_TURN_RESISTANCE)
|
||||
{
|
||||
nTurnResistance+= GetItemPropertyCostTableValue(ip);//turn resistance stacks even on one item
|
||||
}
|
||||
ip = GetNextItemProperty(oItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
return nTurnResistance;
|
||||
}
|
Reference in New Issue
Block a user