Files
HeroesStone_PRC8/_module/nss/dl_spell.nss
Jaysyn904 1eefc84201 Initial Commit
Initial Commit.
2025-09-14 15:40:46 -04:00

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 */
}