private static void SwimHeartbeat(CLRScriptBase script, uint Creature)
{
uint Trigger = AppearanceTypes.currentSwimTrigger[Creature];
foreach(uint contents in script.GetObjectsInPersistentObject(Trigger, CLRScriptBase.OBJECT_TYPE_CREATURE, CLRScriptBase.PERSISTENT_ZONE_ACTIVE))
{
if(contents == Creature)
{
if (script.GetSubRace(Creature) != CLRScriptBase.RACIAL_SUBTYPE_WATER_GENASI &&
script.GetLocalInt(Creature, ACR_CREATURE_AQUATIC) == 0)
{
int SwimDC = script.GetLocalInt(Trigger, ACR_SWIM_DC);
int SinkDC = SwimDC - 5;
int NoAir = script.GetLocalInt(Trigger, ACR_NO_AIR);
int Roll = script.d20(1);
int Bonus = script.GetSkillRank(CLRScriptBase.SKILL_SWIM, Creature, CLRScriptBase.FALSE);
ProcessWaterEffects(script, Creature, Trigger);
if (10 + Bonus >= SwimDC)
{
// Can take 10 here.
Roll = 10;
}
if (Roll + Bonus >= SwimDC)
{
script.ApplyEffectToObject(CLRScriptBase.DURATION_TYPE_TEMPORARY, script.ExtraordinaryEffect(script.EffectMovementSpeedDecrease(50)), Creature, 6.0f);
script.SendMessageToPC(Creature, String.Format("*Swim: {0} + {1} = {2} v. DC {3} :: Success!*", Roll, Bonus, Roll+Bonus, SwimDC));
if(NoAir == CLRScriptBase.FALSE)
{
CurrentDrownStatus.Remove(Creature);
CurrentDrownDC.Remove(Creature);
}
else
{
ProcessNoAir(script, Creature);
}
}
else if (Roll + Bonus >= SinkDC)
{
script.ApplyEffectToObject(CLRScriptBase.DURATION_TYPE_TEMPORARY, script.ExtraordinaryEffect(script.EffectMovementSpeedDecrease(75)), Creature, 6.0f);
script.SendMessageToPC(Creature, String.Format("*Swim: {0} + {1} = {2} v. DC {3} :: Failure!*", Roll, Bonus, Roll + Bonus, SwimDC));
script.SendMessageToPC(Creature, String.Format("You struggle to move through the water."));
if (NoAir == CLRScriptBase.FALSE)
{
CurrentDrownStatus.Remove(Creature);
CurrentDrownDC.Remove(Creature);
}
else
{
ProcessNoAir(script, Creature);
}
}
else
{
script.ApplyEffectToObject(CLRScriptBase.DURATION_TYPE_TEMPORARY, script.ExtraordinaryEffect(script.EffectMovementSpeedDecrease(75)), Creature, 6.0f);
// TODO: Find a way to apply this penalty without completely screwing the PC's AC.
//script.ApplyEffectToObject(CLRScriptBase.DURATION_TYPE_TEMPORARY, script.ExtraordinaryEffect(script.EffectACDecrease(2, CLRScriptBase.AC_DODGE_BONUS, CLRScriptBase.DAMAGE_TYPE_ALL)), Creature, 6.0f);
script.SendMessageToPC(Creature, String.Format("*Swim: {0} + {1} = {2} v. DC {3} :: Failure!*", Roll, Bonus, Roll + Bonus, SwimDC));
script.SendMessageToPC(Creature, String.Format("You're completely overwhelmed by the pull of the water!"));
ProcessNoAir(script, Creature);
}
}
else
{
script.SendMessageToPC(Creature, "Your swim speed and capacity to breathe water allows you to move easily through the water.");
return;
}
script.DelayCommand(6.0f, delegate { SwimHeartbeat(script, Creature); });
return;
}
}
AppearanceTypes.currentSwimTrigger[Creature] = CLRScriptBase.OBJECT_INVALID;
AppearanceTypes.characterMovement[Creature] = AppearanceTypes.MovementType.Walking;
if (Swimming.CurrentDrownStatus.ContainsKey(Creature)) Swimming.CurrentDrownStatus.Remove(Creature);
AppearanceTypes.RecalculateMovement(script, Creature);
}