generated from Jaysyn/ModuleTemplate
169 lines
7.1 KiB
Plaintext
169 lines
7.1 KiB
Plaintext
/* dl_spell
|
|
* by dluan on feb 2003 */
|
|
|
|
/* assigned spells */
|
|
//int SPELL_EARTHQUAKE = SPELL_LIGHT;
|
|
int SPELL_TRAVELING = SPELL_LIGHT;
|
|
/* set HOSTILE to 0 if you don't want "teleport" to affect hostile creatures */
|
|
int HOSTILE = 1;
|
|
|
|
string NOLEVEL = "You don't have enough strength to use that spell.";
|
|
|
|
#include "prc_inc_spells"
|
|
|
|
void main()
|
|
{
|
|
object oUser = OBJECT_SELF;
|
|
object oItem = GetLocalObject(oUser,"ACTITEM");
|
|
object oTarget = GetLocalObject(oUser,"ACTTARGET");
|
|
location lTarLoc = GetLocalLocation(oUser,"ACTTARLOC");
|
|
string sTag = GetTag(oItem);
|
|
|
|
if (FindSubString(sTag, "dl_spell") == -1) return;
|
|
|
|
int nLev = GetHitDice(oUser);
|
|
|
|
/* Earthquake */
|
|
if (sTag == "dl_spell_89") {
|
|
|
|
/* Clerics - Earth or Destruction Domain */
|
|
if (GetLevelByClass(CLASS_TYPE_CLERIC) > 13) {
|
|
if(!GetHasFeat(FEAT_EARTH_DOMAIN_POWER) &&
|
|
!GetHasFeat(FEAT_DESTRUCTION_DOMAIN_POWER)) {
|
|
SendMessageToPC(oUser, "You do not fulfill the requirements to master this weave.");
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (GetHasSpell(SPELL_EARTHQUAKE) || GetIsDM(oUser)) {
|
|
|
|
if (!GetIsDM(oUser))
|
|
DecrementRemainingSpellUses(oUser, SPELL_EARTHQUAKE);
|
|
|
|
/* Earthquake Sound & Visual Effects */
|
|
ActionCastFakeSpellAtObject(SPELL_STORM_OF_VENGEANCE, oUser);
|
|
DelayCommand( 6.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), lTarLoc));
|
|
DelayCommand( 7.3, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_BUMP), lTarLoc));
|
|
DelayCommand( 8.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), lTarLoc));
|
|
DelayCommand( 9.8, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_BUMP), lTarLoc));
|
|
DelayCommand(11.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), lTarLoc));
|
|
DelayCommand( 6.0, PlaySound("as_cv_boomdist1"));
|
|
DelayCommand( 7.9, PlaySound("as_wt_thunderds3"));
|
|
DelayCommand( 9.0, PlaySound("as_cv_boomdist1"));
|
|
|
|
/* Earthquake Damage & Knockdown */
|
|
effect eDamage, eMove;
|
|
int nDamage;
|
|
//int nCount = 1;
|
|
//object oOther = GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE, oUser, nCount);
|
|
object oOther = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarLoc, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
|
while (GetIsObjectValid(oOther)) {
|
|
if (oOther != oUser) {
|
|
if (GetObjectType(oOther) == OBJECT_TYPE_CREATURE) {
|
|
if (GetSkillRank(SKILL_DISCIPLINE, oOther) < d20()+6) {
|
|
DelayCommand(9.1, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oOther, 8.0));
|
|
}
|
|
eMove = EffectMovementSpeedDecrease(90);
|
|
DelayCommand(1.6, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eMove, oOther, 16.0));
|
|
nDamage = PRCGetReflexAdjustedDamage(d6(8), oOther, 15);
|
|
} else nDamage = d6(8);
|
|
eDamage = EffectDamage(d6(nLev/3), DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_THREE);
|
|
DelayCommand(8.3, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oOther));
|
|
eDamage = EffectDamage(nDamage, DAMAGE_TYPE_BLUDGEONING, DAMAGE_POWER_PLUS_THREE);
|
|
DelayCommand(8.6, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oOther));
|
|
}
|
|
//nCount++;
|
|
//oOther = GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE, oUser, nCount);
|
|
oOther = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarLoc, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
|
}
|
|
|
|
} else {
|
|
|
|
SendMessageToPC(oUser, NOLEVEL);
|
|
return;
|
|
|
|
}
|
|
|
|
return;
|
|
}
|
|
/* End of Earthquake */
|
|
|
|
/* Teleport */
|
|
if (sTag == "dl_spell_98") {
|
|
|
|
/* checking the spell and requirements */
|
|
if (GetHasSpell(SPELL_TRAVELING) || GetIsDM(oUser)) {
|
|
if (!GetIsDM(oUser))
|
|
DecrementRemainingSpellUses(oUser, SPELL_TRAVELING);
|
|
} else {
|
|
SendMessageToPC(oUser, NOLEVEL);
|
|
return;
|
|
}
|
|
|
|
/* teleport self or another player */
|
|
if ((oTarget == oUser) ||
|
|
(GetIsPC(oTarget) && !GetIsDM(oTarget))) {
|
|
SetLocalObject(oUser, "TP_TARGET", oTarget);
|
|
if (!GetLocalInt(oUser, "TP_PARTY"))
|
|
SetCustomToken(2007, "[Unit]");
|
|
else SetCustomToken(2007, "[Party]");
|
|
AssignCommand(oUser, ActionStartConversation(oUser, "dl_teleport", TRUE));
|
|
return;
|
|
}
|
|
|
|
if (!HOSTILE) return;
|
|
|
|
/* if target is neutral, teleport user to it.
|
|
* else teleport target to somewhere (destroy it?) */
|
|
effect eVisual = EffectVisualEffect(VFX_IMP_UNSUMMON);
|
|
|
|
if (GetIsObjectValid(oTarget)) {
|
|
|
|
if (GetObjectType(oTarget) == OBJECT_TYPE_CREATURE && GetIsEnemy(oTarget)) {
|
|
|
|
int nCount = 1;
|
|
object oOther = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_FRIEND,
|
|
oTarget, nCount, CREATURE_TYPE_IS_ALIVE, TRUE);
|
|
while (GetIsObjectValid(oOther) && GetDistanceBetween(oTarget, oOther) < 4.5) {
|
|
if (GetHitDice(oOther) < 13 && PRCGetReflexAdjustedDamage(20, oOther, 15) > 0) {
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oOther);
|
|
//DelayCommand(1.0, JumpToLocation(GetStartingLocation()));
|
|
DestroyObject(oOther, 0.6);
|
|
}
|
|
nCount++;
|
|
oOther = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_FRIEND,
|
|
oTarget, nCount, CREATURE_TYPE_IS_ALIVE, TRUE);
|
|
}
|
|
|
|
/* modify the location or destroy the target */
|
|
if (GetHitDice(oTarget) < 16 && PRCGetReflexAdjustedDamage(20, oTarget, 20) > 0) {
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oTarget);
|
|
//DelayCommand(1.0, JumpToLocation(GetStartingLocation()));
|
|
DestroyObject(oTarget, 0.6);
|
|
} else {
|
|
nCount--;
|
|
SendMessageToPC(oUser, "Your spell has no effect on the target.");
|
|
}
|
|
|
|
if (nCount)
|
|
GiveXPToCreature(oUser, nCount);
|
|
|
|
return;
|
|
}
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oUser);
|
|
DelayCommand(1.0, JumpToObject(oTarget));
|
|
|
|
} else {
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oUser);
|
|
DelayCommand(1.0, JumpToLocation(lTarLoc));
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
/* End of Teleport */
|
|
|
|
}
|
|
|