Further file organization
Further file organization
This commit is contained in:
221
nwn/nwnprc/trunk/scripts/spl_ooze_touch.nss
Normal file
221
nwn/nwnprc/trunk/scripts/spl_ooze_touch.nss
Normal file
@@ -0,0 +1,221 @@
|
||||
#include "prc_inc_sp_tch"
|
||||
#include "prc_x2_craft"
|
||||
|
||||
/* Fungus touch */
|
||||
void ooze_touch_fungus()
|
||||
{
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nDuration;
|
||||
|
||||
// Handle spell cast on item....
|
||||
if (GetObjectType(oTarget) == OBJECT_TYPE_ITEM && ! CIGetIsCraftFeatBaseItem(oTarget))
|
||||
{
|
||||
// Do not allow casting on not equippable items
|
||||
if (!IPGetIsItemEquipable(oTarget))
|
||||
{
|
||||
// Item must be equipable...
|
||||
FloatingTextStrRefOnCreature(83326,OBJECT_SELF);
|
||||
return;
|
||||
}
|
||||
|
||||
itemproperty ip = ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_NORMAL, IP_CONST_LIGHTCOLOR_PURPLE);
|
||||
|
||||
if (GetItemHasItemProperty(oTarget, ITEM_PROPERTY_LIGHT))
|
||||
{
|
||||
IPRemoveMatchingItemProperties(oTarget,ITEM_PROPERTY_LIGHT,DURATION_TYPE_TEMPORARY);
|
||||
}
|
||||
|
||||
nDuration = GetLevelByClass(CLASS_TYPE_OOZEMASTER);
|
||||
|
||||
AddItemProperty(DURATION_TYPE_TEMPORARY,ip,oTarget,HoursToSeconds(nDuration));
|
||||
}
|
||||
else
|
||||
{
|
||||
effect eVis = EffectVisualEffect(VFX_DUR_LIGHT_WHITE_20);
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
||||
effect eLink = EffectLinkEffects(eVis, eDur);
|
||||
|
||||
nDuration = GetLevelByClass(CLASS_TYPE_OOZEMASTER);
|
||||
|
||||
//Fire cast spell at event for the specified oTarget
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, PRCGetSpellId(), FALSE));
|
||||
|
||||
//Apply the VFX impact and effects
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, HoursToSeconds(nDuration));
|
||||
}
|
||||
}
|
||||
|
||||
int ooze_touch_damage(effect eDamage)
|
||||
{
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
|
||||
if(!GetIsReactionTypeFriendly(oTarget))
|
||||
{
|
||||
//Fire cast spell at event for the specified oTarget
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, PRCGetSpellId()));
|
||||
//Make a touch attack to afflict oTarget
|
||||
|
||||
// GZ: * GetSpellCastItem() == OBJECT_INVALID is used to prevent feedback from showing up when used as OnHitCastSpell property
|
||||
if (PRCDoMeleeTouchAttack(oTarget))
|
||||
{
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_ACID_L);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int OozeTouchEffect(effect eDamage, int time)
|
||||
{
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
|
||||
if(!GetIsReactionTypeFriendly(oTarget))
|
||||
{
|
||||
//Fire cast spell at event for the specified oTarget
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, PRCGetSpellId()));
|
||||
//Make a touch attack to afflict oTarget
|
||||
|
||||
// GZ: * GetSpellCastItem() == OBJECT_INVALID is used to prevent feedback from showing up when used as OnHitCastSpell property
|
||||
if (PRCDoMeleeTouchAttack(oTarget))
|
||||
{
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_ACID_L);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDamage, oTarget, RoundsToSeconds(time));
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int level = GetLevelByClass(CLASS_TYPE_OOZEMASTER);
|
||||
|
||||
switch (PRCGetSpellId())
|
||||
{
|
||||
/* Brown Mold */
|
||||
case 2010:
|
||||
{
|
||||
ooze_touch_damage(EffectDamage(d6() + level, DAMAGE_TYPE_COLD));
|
||||
break;
|
||||
}
|
||||
/* Gray ooze */
|
||||
case 2011:
|
||||
{
|
||||
ooze_touch_damage(EffectDamage(d6() + level, DAMAGE_TYPE_ACID));
|
||||
break;
|
||||
}
|
||||
/* Ochre Jelly */
|
||||
case 2012:
|
||||
{
|
||||
effect damage = EffectDamage(d4() + level, DAMAGE_TYPE_ACID);
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int DC = 15 + level;
|
||||
|
||||
if (ooze_touch_damage(damage))
|
||||
{
|
||||
if (!PRCMySavingThrow(SAVING_THROW_REFLEX, oTarget, DC, SAVING_THROW_TYPE_ACID, OBJECT_SELF))
|
||||
{
|
||||
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE);
|
||||
effect stun = EffectLinkEffects(EffectStunned(), eMind);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, stun, oTarget, RoundsToSeconds(1));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* Phosphorescent Fungus */
|
||||
case 2013:
|
||||
ooze_touch_fungus();
|
||||
break;
|
||||
|
||||
/* Black pudding */
|
||||
case 2014:
|
||||
{
|
||||
ooze_touch_damage(EffectDamage(d6(2) + level, DAMAGE_TYPE_ACID));
|
||||
break;
|
||||
}
|
||||
/* Gelatinous cube */
|
||||
case 2015:
|
||||
{
|
||||
int DC = 15 + level;
|
||||
|
||||
if (!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, DC, SAVING_THROW_TYPE_NONE, OBJECT_SELF))
|
||||
{
|
||||
effect damage = EffectParalyze();
|
||||
effect eMind = EffectVisualEffect(VFX_DUR_PARALYZED);
|
||||
effect paralyze = EffectLinkEffects(damage, eMind);
|
||||
|
||||
OozeTouchEffect(paralyze, 1 + (level / 2));
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* Green Slime */
|
||||
case 2016:
|
||||
{
|
||||
effect damage = EffectDamage(d6() + level, DAMAGE_TYPE_ACID);
|
||||
int DC = 15 + level;
|
||||
|
||||
if (ooze_touch_damage(damage))
|
||||
{
|
||||
if (!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, DC, SAVING_THROW_TYPE_ACID, OBJECT_SELF))
|
||||
{
|
||||
effect eMind = EffectVisualEffect(VFX_DUR_IOUNSTONE_RED);
|
||||
//effect stun = EffectLinkEffects(EffectAbilityDecrease(ABILITY_CONSTITUTION, d6()), eMind);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eMind, oTarget, RoundsToSeconds(1 + (level / 2)));
|
||||
ApplyAbilityDamage(oTarget, ABILITY_CONSTITUTION, d6(), DURATION_TYPE_TEMPORARY, TRUE, RoundsToSeconds(1 + (level / 2)));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* Yellow Mold */
|
||||
case 2017:
|
||||
{
|
||||
//effect damage;
|
||||
int nDamage;
|
||||
int DC = 15 + level;
|
||||
|
||||
if (!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, DC, SAVING_THROW_TYPE_NONE, OBJECT_SELF))
|
||||
{
|
||||
//damage = EffectAbilityDecrease(ABILITY_CONSTITUTION, d6(2));
|
||||
nDamage = d4(2);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetHasMettle(oTarget, SAVING_THROW_FORT))
|
||||
// This script does nothing if it has Mettle, bail
|
||||
return;
|
||||
//damage = EffectAbilityDecrease(ABILITY_CONSTITUTION, d6());
|
||||
nDamage = d4();
|
||||
}
|
||||
effect eMind = EffectVisualEffect(VFX_DUR_IOUNSTONE_RED);
|
||||
//effect paralyze = EffectLinkEffects(damage, eMind);
|
||||
|
||||
//ooze_touch_effect(paralyze, 1 + level); // Inlined the code to make ApplyAbilityDamage work
|
||||
if(!GetIsReactionTypeFriendly(oTarget))
|
||||
{
|
||||
//Fire cast spell at event for the specified oTarget
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, PRCGetSpellId()));
|
||||
//Make a touch attack to afflict oTarget
|
||||
|
||||
// GZ: * GetSpellCastItem() == OBJECT_INVALID is used to prevent feedback from showing up when used as OnHitCastSpell property
|
||||
if (PRCDoMeleeTouchAttack(oTarget))
|
||||
{
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_ACID_L);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eMind, oTarget, RoundsToSeconds(1 + level));
|
||||
ApplyAbilityDamage(oTarget, ABILITY_CONSTITUTION, nDamage, DURATION_TYPE_TEMPORARY, TRUE, RoundsToSeconds(1 + level));
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user