generated from Jaysyn/ModuleTemplate
402 lines
16 KiB
Plaintext
402 lines
16 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: qn_inc_beholder
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Q-Necron
|
|
//:://////////////////////////////////////////////
|
|
#include "prc_inc_spells"
|
|
#include "inc_utility"
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Beholder's Eye Rays: Shape & Size
|
|
//------------------------------------------------------------------------------
|
|
int BEHOLDER_TARGET_SHAPE = SHAPE_SPHERE;
|
|
float BEHOLDER_TARGET_SIZE = RADIUS_SIZE_LARGE;
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Eye Rays: Charm, Fear & Sleep
|
|
//------------------------------------------------------------------------------
|
|
effect eBeam_Mind = EffectBeam(VFX_BEAM_MIND, OBJECT_SELF, BODY_NODE_MONSTER_0);
|
|
//------------------------------------------------------------------------------
|
|
// Eye Rays: Disintigrate & Finger of Death
|
|
//------------------------------------------------------------------------------
|
|
effect eBeam_Disintegrate = EffectBeam(447, OBJECT_SELF, BODY_NODE_MONSTER_1);
|
|
effect eBeam_Death = EffectBeam(VFX_BEAM_BLACK, OBJECT_SELF, BODY_NODE_MONSTER_1);
|
|
//------------------------------------------------------------------------------
|
|
// Eye Rays: Flesh to Stone & Inflict Moderate Wounds
|
|
//------------------------------------------------------------------------------
|
|
effect eBeam_Stone = EffectBeam(VFX_BEAM_HOLY, OBJECT_SELF, BODY_NODE_MONSTER_3);
|
|
effect eBeam_Inflict = EffectBeam(VFX_BEAM_EVIL, OBJECT_SELF, BODY_NODE_MONSTER_3);
|
|
//------------------------------------------------------------------------------
|
|
// Eye Rays: Slow & Telekensis
|
|
//------------------------------------------------------------------------------
|
|
effect eBeam_Slow = EffectBeam(VFX_BEAM_COLD, OBJECT_SELF, BODY_NODE_MONSTER_4);
|
|
effect eBeam_Telekensis = EffectBeam(VFX_BEAM_ODD, OBJECT_SELF, BODY_NODE_MONSTER_4);
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Count the number of creatures near the targeted object.
|
|
//------------------------------------------------------------------------------
|
|
int UnitCount(object oTarget)
|
|
{
|
|
int nUnitCount = 0;
|
|
location lTarget = GetLocation(oTarget);
|
|
|
|
//Get the first PC.
|
|
oTarget = GetFirstObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
if(GetIsReactionTypeHostile(oTarget, OBJECT_SELF) &&
|
|
GetIsDead(oTarget) == FALSE &&
|
|
PRCGetHasEffect(EFFECT_TYPE_SLEEP, oTarget) == FALSE)
|
|
{
|
|
//+1 to UnitCount.
|
|
nUnitCount++;
|
|
}
|
|
//Get next PC.
|
|
oTarget = GetNextObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
|
|
//Return how many players there are.
|
|
return nUnitCount;
|
|
//SendMessageToPC(OBJECT_SELF, "Number of targets: "+IntToString(nUnitCount)+".");
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Charm Person/Animal, Fear & Sleep
|
|
//------------------------------------------------------------------------------
|
|
void Ray_Mind(object oTarget, int nDC, int nPlayer, effect eEye, int Dur_VFX, int Vis_VFX, float fDuration)
|
|
{
|
|
int nCount;
|
|
effect eDur = EffectVisualEffect(Dur_VFX);
|
|
effect eVis = EffectVisualEffect(Vis_VFX);
|
|
effect eLink;
|
|
location lTarget = GetLocation(oTarget);
|
|
|
|
oTarget = GetFirstObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oTarget) && nCount != nPlayer)
|
|
{
|
|
//Can't be self or friendly unit.
|
|
if(oTarget != OBJECT_SELF &&
|
|
//oTarget != GetSpellTargetObject() &&
|
|
GetIsReactionTypeHostile(oTarget, OBJECT_SELF) &&
|
|
MyPRCGetRacialType(oTarget) != RACIAL_TYPE_UNDEAD &&
|
|
MyPRCGetRacialType(oTarget) != RACIAL_TYPE_CONSTRUCT)
|
|
{
|
|
//Stops while.
|
|
nCount++;
|
|
|
|
if(nCount == nPlayer)
|
|
{
|
|
//Touch attack.
|
|
if(TouchAttackRanged(oTarget) > 0)
|
|
{
|
|
//Make Save
|
|
if(PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_MIND_SPELLS) == 0)
|
|
{
|
|
//Link effects.
|
|
eLink = EffectLinkEffects(eEye, eDur);
|
|
eLink = EffectLinkEffects(eVis, eLink);
|
|
|
|
//Apply effects.
|
|
DelayCommand(0.3f, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration));
|
|
}
|
|
}
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam_Mind, oTarget, 1.0f);
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Disintigrate
|
|
//------------------------------------------------------------------------------
|
|
void Ray_Disintegrate(object oTarget, int nDC, int nPlayer)
|
|
{
|
|
int nCount;
|
|
int nDamage = d6(26);
|
|
effect eDamage;
|
|
effect eVis = EffectVisualEffect(VFX_IMP_ACID_S);
|
|
effect eLink;
|
|
location lTarget = GetLocation(oTarget);
|
|
|
|
oTarget = GetFirstObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oTarget) && nCount != nPlayer)
|
|
{
|
|
//Can't be self or friendly unit.
|
|
if(oTarget != OBJECT_SELF &&
|
|
//oTarget != GetSpellTargetObject() &&
|
|
GetIsReactionTypeHostile(oTarget, OBJECT_SELF) &&
|
|
MyPRCGetRacialType(oTarget) != RACIAL_TYPE_CONSTRUCT)
|
|
{
|
|
//Stops while.
|
|
nCount++;
|
|
|
|
if(nCount == nPlayer)
|
|
{
|
|
//Touch attack.
|
|
if(TouchAttackRanged(oTarget) > 0)
|
|
{
|
|
//Make Save
|
|
if(PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_ALL) == 1)
|
|
{
|
|
nDamage = d6(5);
|
|
}
|
|
|
|
//Set damage.
|
|
eDamage = EffectDamage(nDamage);
|
|
|
|
//Link effects.
|
|
eLink = EffectLinkEffects(eDamage, eVis);
|
|
|
|
//Apply effects.
|
|
DelayCommand(0.3f, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget));
|
|
|
|
}
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam_Disintegrate, oTarget, 1.0f);
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Finger of Death
|
|
//------------------------------------------------------------------------------
|
|
void Ray_Death(object oTarget, int nDC, int nPlayer)
|
|
{
|
|
int nCount;
|
|
int nDamage = d6(3) + 13;
|
|
effect eDamage = EffectDamage(nDamage);
|
|
effect eDeath = EffectDeath(TRUE);
|
|
effect eVis = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
|
|
effect eLink;
|
|
location lTarget = GetLocation(oTarget);
|
|
|
|
oTarget = GetFirstObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oTarget) && nCount != nPlayer)
|
|
{
|
|
//Can't be self or friendly unit.
|
|
if(oTarget != OBJECT_SELF &&
|
|
//oTarget != GetSpellTargetObject() &&
|
|
GetIsReactionTypeHostile(oTarget, OBJECT_SELF) &&
|
|
MyPRCGetRacialType(oTarget) != RACIAL_TYPE_UNDEAD &&
|
|
MyPRCGetRacialType(oTarget) != RACIAL_TYPE_CONSTRUCT)
|
|
{
|
|
//Stops while.
|
|
nCount++;
|
|
|
|
if(nCount == nPlayer)
|
|
{
|
|
//Touch attack.
|
|
if(TouchAttackRanged(oTarget) > 0)
|
|
{
|
|
//Make Save
|
|
if(PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_DEATH) == 0)
|
|
{
|
|
//Apply effects.
|
|
DelayCommand(0.3f, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget));
|
|
}
|
|
else
|
|
{
|
|
//Link effects.
|
|
eLink = EffectLinkEffects(eDamage, eVis);
|
|
|
|
//Apply effects.
|
|
DelayCommand(0.3f, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget));
|
|
}
|
|
}
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam_Death, oTarget, 1.0f);
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Flesh to Stone
|
|
//------------------------------------------------------------------------------
|
|
void Ray_Stone(object oTarget, int nDC, int nPlayer)
|
|
{
|
|
int nCount;
|
|
effect eStone = EffectPetrify();
|
|
location lTarget = GetLocation(oTarget);
|
|
|
|
oTarget = GetFirstObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oTarget) && nCount != nPlayer)
|
|
{
|
|
//Can't be self or friendly unit.
|
|
if(oTarget != OBJECT_SELF &&
|
|
//oTarget != GetSpellTargetObject() &&
|
|
GetIsReactionTypeHostile(oTarget, OBJECT_SELF) &&
|
|
MyPRCGetRacialType(oTarget) != RACIAL_TYPE_CONSTRUCT)
|
|
{
|
|
//Stops while.
|
|
nCount++;
|
|
|
|
if(nCount == nPlayer)
|
|
{
|
|
//Touch attack.
|
|
if(TouchAttackRanged(oTarget) > 0)
|
|
{
|
|
//Make Save
|
|
if(PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_ALL) == 0)
|
|
{
|
|
//Apply effects.
|
|
DelayCommand(0.3f, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eStone, oTarget, TurnsToSeconds(13)));
|
|
}
|
|
}
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam_Stone, oTarget, 1.0f);
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Inflict Moderate Wounds
|
|
//------------------------------------------------------------------------------
|
|
void Ray_Inflict(object oTarget, int nDC, int nPlayer)
|
|
{
|
|
int nCount;
|
|
int nDamage = d8(2) + 10;
|
|
effect eDamage;
|
|
effect eVis = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
|
|
effect eLink;
|
|
location lTarget = GetLocation(oTarget);
|
|
|
|
oTarget = GetFirstObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oTarget) && nCount != nPlayer)
|
|
{
|
|
//Can't be self or friendly unit.
|
|
if(oTarget != OBJECT_SELF &&
|
|
//oTarget != GetSpellTargetObject() &&
|
|
GetIsReactionTypeHostile(oTarget, OBJECT_SELF) &&
|
|
MyPRCGetRacialType(oTarget) != RACIAL_TYPE_UNDEAD &&
|
|
MyPRCGetRacialType(oTarget) != RACIAL_TYPE_CONSTRUCT)
|
|
{
|
|
//Stops while.
|
|
nCount++;
|
|
|
|
if(nCount == nPlayer)
|
|
{
|
|
//Touch attack.
|
|
if(TouchAttackRanged(oTarget) > 0)
|
|
{
|
|
//Make Save
|
|
if(PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_NEGATIVE) == 1)
|
|
{
|
|
nDamage = nDamage / 2;
|
|
}
|
|
|
|
//Set damage.
|
|
eDamage = EffectDamage(nDamage, DAMAGE_TYPE_NEGATIVE);
|
|
|
|
//Link effects.
|
|
eLink = EffectLinkEffects(eDamage, eVis);
|
|
|
|
//Apply effects.
|
|
DelayCommand(0.3f, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget));
|
|
}
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam_Inflict, oTarget, 1.0f);
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Slow
|
|
//------------------------------------------------------------------------------
|
|
void Ray_Slow(object oTarget, int nDC, int nPlayer)
|
|
{
|
|
int nCount;
|
|
effect eSlow = EffectSlow();
|
|
effect eVis = EffectVisualEffect(VFX_IMP_SLOW);
|
|
effect eLink;
|
|
location lTarget = GetLocation(oTarget);
|
|
|
|
oTarget = GetFirstObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oTarget) && nCount != nPlayer)
|
|
{
|
|
//Can't be self or friendly unit.
|
|
if(oTarget != OBJECT_SELF &&
|
|
//oTarget != GetSpellTargetObject() &&
|
|
GetIsReactionTypeHostile(oTarget, OBJECT_SELF) &&
|
|
MyPRCGetRacialType(oTarget) != RACIAL_TYPE_CONSTRUCT)
|
|
{
|
|
//Stops while.
|
|
nCount++;
|
|
|
|
if(nCount == nPlayer)
|
|
{
|
|
//Touch attack.
|
|
if(TouchAttackRanged(oTarget) > 0)
|
|
{
|
|
//Make Save
|
|
if(PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_ALL) == 0)
|
|
{
|
|
//Link effects.
|
|
eLink = EffectLinkEffects(eSlow, eVis);
|
|
|
|
//Apply effects.
|
|
DelayCommand(0.3f, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(13)));
|
|
}
|
|
}
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam_Slow, oTarget, 1.0f);
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Telekensis
|
|
//------------------------------------------------------------------------------
|
|
void Ray_Telekensis(object oTarget, int nDC, int nPlayer)
|
|
{
|
|
int nCount;
|
|
effect eTelekensis = EffectKnockdown();
|
|
effect eVis = EffectVisualEffect(VFX_IMP_STUN);
|
|
effect eLink;
|
|
location lTarget = GetLocation(oTarget);
|
|
|
|
oTarget = GetFirstObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oTarget) && nCount != nPlayer)
|
|
{
|
|
//Can't be self or friendly unit.
|
|
if(oTarget != OBJECT_SELF &&
|
|
//oTarget != GetSpellTargetObject() &&
|
|
GetIsReactionTypeHostile(oTarget, OBJECT_SELF) &&
|
|
MyPRCGetRacialType(oTarget) != RACIAL_TYPE_CONSTRUCT)
|
|
{
|
|
//Stops while.
|
|
nCount++;
|
|
|
|
if(nCount == nPlayer)
|
|
{
|
|
//Touch attack.
|
|
if(TouchAttackRanged(oTarget) > 0)
|
|
{
|
|
//Make Save
|
|
if(PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_ALL) == 0)
|
|
{
|
|
//Link effects.
|
|
eLink = EffectLinkEffects(eTelekensis, eVis);
|
|
|
|
//Apply effects.
|
|
DelayCommand(0.3f, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(6)));
|
|
}
|
|
}
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam_Telekensis, oTarget, 1.0f);
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(BEHOLDER_TARGET_SHAPE, BEHOLDER_TARGET_SIZE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
}
|
|
|
|
//void main(){}
|