RATDOG/_module/nss/tar_lake_hb.nss
Jaysyn904 c0e04f09c3 Updated Tar Lake interior
Updated Tar Lake interior.  Added Water Breathing to Amulet of Water Breathing.  Updated tar mephit.
2023-08-18 23:16:27 -04:00

160 lines
5.7 KiB
Plaintext

//::////////////////////////////////////////////////////////////////////////////
//::
// tar_lake_hb.nss
/*
Just in case the players are dumb enough to jump into a lake of boiling tar.
"Should the PCs be inclined to dive into the tar, they suffer
the following effects: 1/2 normal swim movement; 1d4 heat damage per
round and zero visibility. The mephits, of course, suffer none of these
effects. Magic, such as freedom of movement, water breathing, endure,
resist, or protection from energy (fire) and true seeing can all help while
within the tar."
*/
//
//::
//::////////////////////////////////////////////////////////////////////////////
#include "prc_inc_spells"
#include "prc_feat_const"
#include "x0_i0_match"
//:: 1d4 fire damage per round from the hot tar.
void ApplyHeatEffect(object oCreature)
{
int iHeatDam = d4(1);
DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDamage(iHeatDam, DAMAGE_TYPE_FIRE), oCreature, 6.0f));
}
//:: Can't breathe in tar
void ApplySuffocationEffect(object oCreature)
{
int iConstitution = GetAbilityScore(oCreature, ABILITY_CONSTITUTION);
int iBreathRounds = iConstitution * 2;
int iSuffocationDC = 10; // Starting suffocation DC
int iCurrentRound = GetLocalInt(oCreature, "SuffocationRound");
if (iCurrentRound <= iBreathRounds)
{
if (GetResRef(OBJECT_SELF) != "mepooze001" &&
GetResRef(OBJECT_SELF) != "tarmephit001" &&
!GetHasFeat(FEAT_WATER_BREATHING, oCreature) &&
!GetHasFeat(FEAT_BREATHLESS, oCreature) &&
!GetHasSpellEffect(SPELL_WATER_BREATHING, oCreature) &&
(MyPRCGetRacialType(oCreature) != RACIAL_TYPE_UNDEAD) &&
(MyPRCGetRacialType(oCreature) != RACIAL_TYPE_CONSTRUCT))
{
SendMessageToPC(oCreature, "You are struggling to breathe in the tar!");
if (d20() + GetFortitudeSavingThrow(oCreature) >= iSuffocationDC)
{
SendMessageToPC(oCreature, "You manage to hold your breath and avoid suffocation for now.");
}
else
{
SendMessageToPC(oCreature, "You are suffocating in the tar!");
if (iCurrentRound == 1)
{
AssignCommand(oCreature, ActionPlayAnimation(ANIMATION_LOOPING_SPASM, 0.5f, 6.0f));
SetCurrentHitPoints(oCreature, 1);
}
else if (iCurrentRound == 2)
{
SetCurrentHitPoints(oCreature, 0);
}
else if (iCurrentRound == 3)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), oCreature);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDeath(), oCreature);
}
iCurrentRound++;
}
}
// Store the updated round counter back in the creature's local variables
SetLocalInt(oCreature, "SuffocationRound", iCurrentRound);
}
}
//:: Tar slows creatures other than Tar Mephits to 1/2 speed
//:: unless they are under the effect of Freedom of Movement
void ApplySlowEffect(object oCreature)
{
if (GetResRef(OBJECT_SELF) != "mepooze001" &&
GetResRef(OBJECT_SELF) != "tarmephit001" &&
!GetHasSpellEffect(SPELL_FREEDOM_OF_MOVEMENT, oCreature) ||
GetHasEffect(IMMUNITY_TYPE_MOVEMENT_SPEED_DECREASE, oCreature))
{
// Object has either Freedom of Movement spell effect or IMMUNITY_TYPE_MOVEMENT_SPEED_DECREASE effect
SendMessageToPC(GetFirstPC(), "This object has Freedom of Movement or immunity to movement speed decrease!");
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectMovementSpeedDecrease(50), oCreature, 6.0f);
}
//:: Can't see in tar without True Seeing or Blindsight
void ApplySightEffect(object oCreature)
{
// Check if the PC has zero visibility
if (GetResRef(OBJECT_SELF) != "mepooze001" &&
GetResRef(OBJECT_SELF) != "tarmephit001" &&
!GetHasSpellEffect(SPELL_TRUE_SEEING, oCreature) &&
!GetHasFeat(FEAT_BLINDSIGHT_5_FT, oCreature) &&
!GetHasFeat(FEAT_BLINDSIGHT_10_FT, oCreature) &&
!GetHasFeat(FEAT_BLINDSIGHT_5_FEET, oCreature) &&
!GetHasFeat(FEAT_BLINDSIGHT_10_FEET, oCreature) &&
!GetHasFeat(FEAT_BLINDSIGHT_60_FEET, oCreature) &&
!GetHasFeat(FEAT_PRESTIGE_BLINDSIGHT, oCreature))
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBlindness(), oCreature, 6.0f);
}
}
void main()
{
object oArea = GetArea(OBJECT_SELF);
object oCreature = GetFirstObjectInArea(oArea, OBJECT_TYPE_CREATURE);
string sResref = GetResRef(oCreature);
while (GetIsObjectValid(oCreature))
{
//:: Calculate the armor penalty
int iArmorPenalty = 0;
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oCreature);
if (GetIsObjectValid(oArmor))
{
iArmorPenalty = GetItemACValue(oArmor);
}
//:: Calculate the DC for the Strength check
int iStrengthDC = 15 + iArmorPenalty;
//:: Be an Ooze Mephit or roll a Strength check against the DC
if (GetResRef(OBJECT_SELF) != "mepooze001" &&
GetResRef(OBJECT_SELF) != "tarmephit001" ||
GetAppearanceType(oCreature) != APPEARANCE_TYPE_MEPHIT_OOZE ||
d20() + GetAbilityModifier(ABILITY_STRENGTH, oCreature) < iStrengthDC)
{
//:: Apply the other effects since the Strength check failed
SendMessageToPC(oCreature, "You are floundering in the tar!");
ApplySightEffect(oCreature);
ApplySuffocationEffect(oCreature);
}
//:: Tar is always hot & slowing
ApplyHeatEffect(oCreature);
ApplySlowEffect(oCreature);
oCreature = GetNextObjectInArea(oArea, OBJECT_TYPE_CREATURE);
}
}