public static DisableResult IsDisableSuccessful(CLRScriptBase s, ALFA.Shared.ActiveTrap trap, int DC, uint disabler) { if (s.GetSkillRank(SKILL_DISABLE_TRAP, disabler, TRUE) == 0) { s.SendMessageToPC(disabler, "<c=#98FFFF>Disable Device: * Success will never be possible *</c>"); return DisableResult.Failure; } int roll = s.d20(1); int skill = s.GetSkillRank(SKILL_DISABLE_TRAP, disabler, FALSE) + trap.TotalHelp; int final = roll + skill; string resultString = "Failure!"; DisableResult value = DisableResult.Failure; if (final >= DC) { value = DisableResult.Success; resultString = "Success!"; } if (DC > final + 4) { value = DisableResult.CriticalFailure; resultString = "CRITICAL FAILURE!"; } string message = String.Format("<c=#98FFFF>Disable Device : {0} + {1} = {2} vs. DC {3}. * {4} *</c>", roll, skill, final, DC, resultString); s.SendMessageToPC(disabler, message); return value; }
private static bool IsTrapDetectedBy(CLRScriptBase s, ALFA.Shared.ActiveTrap trap, uint detector) { if (trap.Detected) { return false; } if(!IsInArea(s, trap, detector)) { return false; } if (s.GetDetectMode(detector) == FALSE) { s.DelayCommand(6.0f, delegate { DetectHeartBeat(s, trap, detector); }); return false; } if (trap.DetectDC > 20 && s.GetLevelByClass(CLASS_TYPE_ROGUE, detector) == FALSE && s.GetHasSpellEffect(SPELL_FIND_TRAPS, detector) == FALSE) { s.DelayCommand(6.0f, delegate { DetectHeartBeat(s, trap, detector); }); return false; } int searchBonus = s.GetSkillRank(SKILL_SEARCH, detector, FALSE); int roll = s.d20(1); int finalDice = roll + searchBonus; if (trap.DetectDC <= finalDice) { return true; } s.DelayCommand(6.0f, delegate { DetectHeartBeat(s, trap, detector); }); return false; }
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); }