Further file organization
Further file organization
This commit is contained in:
176
nwn/nwnprc/trunk/epicspellscripts/ss_ep_whipshar.nss
Normal file
176
nwn/nwnprc/trunk/epicspellscripts/ss_ep_whipshar.nss
Normal file
@@ -0,0 +1,176 @@
|
||||
/////////////////////////////////////////////////
|
||||
// Whip of Shar
|
||||
// tm_s0_epwhipshar.nss
|
||||
//-----------------------------------------------
|
||||
// Created By: Nron Ksr
|
||||
// Created On: 03/12/2004
|
||||
// Description: Creates a magical whip from the goddess Shar herself.
|
||||
// (MAYBE, I'll create it alignment specific)
|
||||
/////////////////////////////////////////////////
|
||||
// Last Updated: 03/12/2004, Nron Ksr
|
||||
/////////////////////////////////////////////////
|
||||
|
||||
#include "prc_alterations"
|
||||
//#include "x2_inc_spellhook"
|
||||
#include "inc_epicspells"
|
||||
|
||||
void AddEffectsToWeapon( object oTarget, float fDuration, int iCasterLvl )
|
||||
{
|
||||
/* If the spell is cast again, any previous itemproperties matching are removed.
|
||||
Declaring variables
|
||||
+1, per 3 caster lvls, Vampiric Regen: 12 pnts, OnHit: Blindness - DC:26,
|
||||
Piercing: 2d12, Slashing: 2d12, and OnHit: Darkness.
|
||||
*/
|
||||
IPSafeAddItemProperty( oTarget,
|
||||
ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_PIERCING,
|
||||
IP_CONST_DAMAGEBONUS_2d12), fDuration,
|
||||
X2_IP_ADDPROP_POLICY_REPLACE_EXISTING );
|
||||
IPSafeAddItemProperty( oTarget,
|
||||
ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_SLASHING,
|
||||
IP_CONST_DAMAGEBONUS_2d12), fDuration,
|
||||
X2_IP_ADDPROP_POLICY_REPLACE_EXISTING );
|
||||
IPSafeAddItemProperty( oTarget,
|
||||
ItemPropertyVampiricRegeneration(12), fDuration,
|
||||
X2_IP_ADDPROP_POLICY_REPLACE_EXISTING );
|
||||
IPSafeAddItemProperty( oTarget,
|
||||
ItemPropertyEnhancementBonus(iCasterLvl / 3), fDuration,
|
||||
X2_IP_ADDPROP_POLICY_REPLACE_EXISTING );
|
||||
IPSafeAddItemProperty( oTarget,
|
||||
ItemPropertyOnHitProps(IP_CONST_ONHIT_BLINDNESS,
|
||||
IP_CONST_ONHIT_SAVEDC_26, IP_CONST_ONHIT_DURATION_50_PERCENT_2_ROUNDS),
|
||||
fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING );
|
||||
IPSafeAddItemProperty( oTarget,
|
||||
ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_DARKNESS,
|
||||
iCasterLvl / 5), fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING );
|
||||
IPSafeAddItemProperty( oTarget,
|
||||
ItemPropertyVisualEffect(ITEM_VISUAL_EVIL), fDuration,
|
||||
X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,FALSE,TRUE );
|
||||
return;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
||||
|
||||
// Spell Cast Hook
|
||||
if (!X2PreSpellCastCode())
|
||||
{
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
return;
|
||||
}
|
||||
if (GetCanCastSpell(OBJECT_SELF, SPELL_EPIC_WHIP_SH))
|
||||
{
|
||||
|
||||
//Declare major variables
|
||||
object oPC = PRCGetSpellTargetObject();
|
||||
|
||||
// Visual effect only
|
||||
effect eVis = EffectVisualEffect( VFX_IMP_AURA_NEGATIVE_ENERGY );
|
||||
eVis = EffectLinkEffects( EffectVisualEffect(VFX_IMP_EVIL_HELP),eVis );
|
||||
eVis = EffectLinkEffects( EffectVisualEffect(VFX_IMP_PULSE_NEGATIVE),eVis );
|
||||
|
||||
// Visual and substantial effects to caster
|
||||
effect ether = EffectVisualEffect( VFX_DUR_ETHEREAL_VISAGE );
|
||||
effect ultra = EffectVisualEffect( VFX_DUR_ULTRAVISION );
|
||||
effect eyes = EffectVisualEffect( VFX_DUR_MAGICAL_SIGHT );
|
||||
effect eDur = EffectVisualEffect( VFX_DUR_CESSATE_POSITIVE );
|
||||
effect conceal = EffectConcealment(33);
|
||||
effect vision = EffectUltravision();
|
||||
eDur = EffectLinkEffects( eDur, ether );
|
||||
eDur = EffectLinkEffects( eDur, ultra );
|
||||
eDur = EffectLinkEffects( eDur, eyes );
|
||||
eDur = EffectLinkEffects( eDur, conceal );
|
||||
eDur = EffectLinkEffects( eDur, vision );
|
||||
eDur = ExtraordinaryEffect(eDur);
|
||||
|
||||
int iCasterLvl = GetTotalCastingLevel(OBJECT_SELF); // Bone - changed.
|
||||
int iDuration = iCasterLvl;
|
||||
itemproperty ipExoticFeat =
|
||||
PRCItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_PROF_EXOTIC);
|
||||
object oHide = GetPCSkin(oPC);
|
||||
object oWeapon = OBJECT_INVALID;
|
||||
|
||||
/* Boneshank - Not required, since player must already have a hide item.
|
||||
if( !GetIsObjectValid(oHide) )
|
||||
{
|
||||
// Create a creature hide if the PC doesn't have one.
|
||||
oHide = CreateItemOnObject( "x2_it_emptyskin", oPC );
|
||||
// Need to ID the hide before we can put it on the PC
|
||||
SetIdentified( oHide, TRUE );
|
||||
AssignCommand( oPC, ActionEquipItem(oHide, INVENTORY_SLOT_CARMOUR) );
|
||||
}
|
||||
*/
|
||||
if( GetIsObjectValid(oHide) )
|
||||
{
|
||||
// Adding the Exotic Feat to the caster via the oHide object.
|
||||
IPSafeAddItemProperty( oHide, ipExoticFeat,
|
||||
TurnsToSeconds(iDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING );
|
||||
}
|
||||
else
|
||||
{ return; }
|
||||
|
||||
oWeapon = GetItemPossessedBy( oPC, "WhipofShar" );
|
||||
|
||||
// Have I cast "Whip of Shar" once already?
|
||||
if( GetLocalInt(oPC, "WhipOfShar") == 1 )
|
||||
{
|
||||
IPRemoveAllItemProperties( oWeapon );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( oWeapon == OBJECT_INVALID )
|
||||
{
|
||||
// Create Shars whip for the caster.
|
||||
oWeapon = CreateItemOnObject( "whipofshar", oPC );
|
||||
SetDroppableFlag( oWeapon, FALSE );
|
||||
}
|
||||
}
|
||||
|
||||
if( GetIsObjectValid(oWeapon) )
|
||||
{
|
||||
SignalEvent(oPC, EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE));
|
||||
|
||||
if( iDuration > 0 )
|
||||
{
|
||||
// Applying various effects to the Caster & Weapon.
|
||||
SPApplyEffectToObject( DURATION_TYPE_INSTANT, eVis, oPC );
|
||||
SPApplyEffectToObject( DURATION_TYPE_TEMPORARY, eDur, oPC,
|
||||
TurnsToSeconds(iDuration), TRUE, -1, GetTotalCastingLevel(OBJECT_SELF) );
|
||||
AddEffectsToWeapon( oWeapon,
|
||||
TurnsToSeconds(iDuration),iCasterLvl );
|
||||
//Add the Exotic Weapons feature to oHide temporarily.
|
||||
IPSafeAddItemProperty( oHide, ipExoticFeat,
|
||||
TurnsToSeconds(iDuration),
|
||||
X2_IP_ADDPROP_POLICY_KEEP_EXISTING );
|
||||
}
|
||||
}
|
||||
else
|
||||
{ return; }
|
||||
|
||||
// Darkness, centered on the caster.
|
||||
AssignCommand( oPC,
|
||||
ActionCastSpellAtLocation(SPELL_DARKNESS, PRCGetSpellTargetLocation(),
|
||||
METAMAGIC_ANY,TRUE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE) );
|
||||
ActionDoCommand( AssignCommand(oPC,
|
||||
ActionEquipItem(oWeapon, INVENTORY_SLOT_RIGHTHAND)) );
|
||||
|
||||
// Setting Locals to try to not allow exploitation of multicasts.
|
||||
if( GetLocalInt(oPC, "WhipOfShar") == 0 )
|
||||
{
|
||||
// To record if the spell was already cast or not.
|
||||
SetLocalInt( oPC, "WhipOfShar", 1 );
|
||||
}
|
||||
|
||||
// Don't want to really destroy the object.
|
||||
// Does it make much sense? The effects will wear off,
|
||||
// yes, but you don't want to be defenseless, do you?
|
||||
// You can't store the whip except in your
|
||||
// inventory though... trade offs.. trade offs...
|
||||
DelayCommand( TurnsToSeconds(iDuration),
|
||||
AssignCommand(GetModule(), DestroyObject(oWeapon)) );
|
||||
DelayCommand( TurnsToSeconds(iDuration),
|
||||
SetLocalInt(oPC, "WhipOfShar", 0) );
|
||||
}
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
}
|
Reference in New Issue
Block a user