forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
222 lines
7.7 KiB
Plaintext
222 lines
7.7 KiB
Plaintext
#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;
|
|
}
|
|
}
|
|
}
|
|
|