public static void DrawNavigatorCategory(CLRScriptBase script, NavigatorCategory nav) { if (nav != null) { script.ClearListBox(script.OBJECT_SELF, "SCREEN_DMC_CREATOR", "LISTBOX_ACR_CREATOR"); if (nav.ParentCategory != null) { string textFields = "LISTBOX_ITEM_TEXT= .."; string variables = "5=Category:.."; script.AddListBoxRow(script.OBJECT_SELF, "SCREEN_DMC_CREATOR", "LISTBOX_ACR_CREATOR", "Category:..", textFields, "LISTBOX_ITEM_ICON=folder.tga", variables, "unhide"); } foreach (NavigatorCategory navCat in nav.ContainedCategories) { string textFields = String.Format("LISTBOX_ITEM_TEXT= {0}", navCat.DisplayName); string variables = String.Format("5={0}", "Category:" + navCat.Name); script.AddListBoxRow(script.OBJECT_SELF, "SCREEN_DMC_CREATOR", "LISTBOX_ACR_CREATOR", "Category:" + navCat.Name, textFields, "LISTBOX_ITEM_ICON=folder.tga", variables, "unhide"); } foreach (IListBoxItem navItem in nav.ContainedItems) { script.AddListBoxRow(script.OBJECT_SELF, "SCREEN_DMC_CREATOR", "LISTBOX_ACR_CREATOR", navItem.RowName, navItem.TextFields, navItem.Icon, navItem.Variables, "unhide"); } } else { script.SendMessageToPC(script.OBJECT_SELF, "Error: Navigator category is null. Cannot draw a list."); } }
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; }
public static void WaitForNavigator(CLRScriptBase script, Navigator nav) { if (nav.WaitForResourcesLoaded(false) == true) { DrawNavigatorCategory(script, nav.bottomCategory); return; } else { script.SendMessageToPC(script.OBJECT_SELF, "loading..."); script.DelayCommand(0.5f, delegate() { WaitForNavigator(script, nav); }); return; } }
public bool clear(CLRScriptBase script) { if (script.GetIsObjectValid(m_oCreature) == CLRScriptBase.FALSE || script.GetIsObjectValid(m_oCreature) == CLRScriptBase.FALSE) { return false; } uint oOldHide = getHide(script); foreach(ItemProperty prop in script.GetItemPropertiesOnItem(oOldHide)) { if (script.GetItemPropertyDurationType(prop) == CLRScriptBase.DURATION_TYPE_PERMANENT) { script.RemoveItemProperty(oOldHide, prop); } } script.SendMessageToPC(m_oCreature, "PC Hide refreshed."); return true; }
public static void Disable(CLRScriptBase s, ALFA.Shared.ActiveTrap trap, uint disabler) { if (trap.Disabler == 0) { // no one is currently working on this trap. s.SendMessageToPC(disabler, "<c=#98FFFF>You begin to disable the trap...</c>"); trap.Disabler = disabler; trap.Helpers = new List<uint>(); } else { if (trap.Disabler == disabler) { s.SendMessageToPC(disabler, "<c=#98FFFF>Error: You are already disabling this device.</c>"); } else if (trap.Helpers.Contains(disabler)) { s.SendMessageToPC(disabler, "<c=#98FFFF>Disable Device: * Failure * You have already given aid to this attempt.</c>"); return; } else { trap.Helpers.Add(disabler); if (IsDisableSuccessful(s, trap, 10, disabler) == DisableResult.Success) { s.SendMessageToPC(disabler, String.Format("<c=#98FFFF>Disable Device: You grant {0} useful assistance with the trap.</c>", s.GetName(trap.Disabler))); trap.TotalHelp += 2; return; } else { s.SendMessageToPC(disabler, String.Format("<c=#98FFFF>Disable Device: You are unable to grant {0} useful assistance with the trap.</c>", s.GetName(trap.Disabler))); return; } } } if (s.GetIsDM(disabler) == TRUE && s.GetIsDMPossessed(disabler) == FALSE) { RemoveTrap(s, trap); s.SendMessageToPC(disabler, String.Format("<c=#98FFFF>Removing trap {0}</c>", trap.Tag)); return; } float neededTime = s.d4(2) * 6.0f; NWLocation oldLoc = s.GetLocation(disabler); s.DelayCommand(2.0f, delegate { StallForTime(s, trap, disabler, neededTime, oldLoc); }); }
private static void HandleTrapDetected(CLRScriptBase s, ALFA.Shared.ActiveTrap trap, uint detector) { trap.Detected = true; NWEffect vfx = s.SupernaturalEffect(s.EffectNWN2SpecialEffectFile(trap.TrapTriggerVFX, OBJECT_INVALID, s.Vector(0.0f, 0.0f, 0.0f))); s.ApplyEffectToObject(DURATION_TYPE_PERMANENT, vfx, s.GetObjectByTag(trap.Tag, 0), 0.0f); uint detectWidget = s.CreateObject(OBJECT_TYPE_PLACEABLE, "acr_trap_disarm", s.GetLocation(detector), TRUE, trap.Tag + "_"); if (!String.IsNullOrEmpty(trap.Description)) { s.SetDescription(detectWidget, trap.Description); } s.SetFirstName(detectWidget, String.Format("Disarm the {0} trap", trap.SpellTrap ? "Spell" : "Mechanical")); // If they clicked to walk, let's stop them from walking into the hazard they just found. if (s.GetCurrentAction(detector) == ACTION_MOVETOPOINT) { s.AssignCommand(detector, delegate { s.ClearAllActions(0); }); } s.PlaySound("alert", FALSE); s.ApplyEffectToObject(DURATION_TYPE_TEMPORARY, s.SupernaturalEffect(s.EffectNWN2SpecialEffectFile("fx_bang", detector, s.Vector(0.0f,0.0f,0.0f))), detector, 6.0f); s.SendMessageToPC(detector, "You spot a trap!"); }
public static void Exit(CLRScriptBase s, ALFA.Shared.ActiveTrap trap) { s.SendMessageToPC(s.GetEnteringObject(), String.Format("This event has no functionality in it. If it has fired, you should write up a ticket about how. Trap ID: {0}", trap.Tag)); }
public void TransitionToArea(CLRScriptBase script, ExitDirection exit) { string doorTag = "DOOR_NORTH"; switch(exit) { case ExitDirection.North: doorTag = "DOOR_NORTH"; break; case ExitDirection.East: doorTag = "DOOR_EAST"; break; case ExitDirection.South: doorTag = "DOOR_SOUTH"; break; case ExitDirection.West: doorTag = "DOOR_WEST"; break; case ExitDirection.Up: doorTag = "DOOR_UP"; break; case ExitDirection.Down: doorTag = "DOOR_DOWN"; break; } if(script.GetIsObjectValid(script.GetLocalObject(AreaId, doorTag)) == CLRScriptBase.TRUE) { uint door = script.GetLocalObject(AreaId, doorTag); script.JumpToObject(door, CLRScriptBase.TRUE); return; } foreach(uint obj in script.GetObjectsInArea(AreaId)) { if(script.GetTag(obj) == doorTag) { script.SetLocalObject(AreaId, doorTag, obj); script.JumpToObject(obj, CLRScriptBase.TRUE); return; } } script.SendMessageToPC(script.OBJECT_SELF, "I can't find a door to jump you to."); }
public bool recalculate(CLRScriptBase script) { // Ensure that both our hide and our creature are still valid. if (script.GetIsObjectValid(m_oCreature) == CLRScriptBase.FALSE || script.GetIsObjectValid(m_oCreature) == CLRScriptBase.FALSE) { return false; } // Recreate the hide. script.AssignCommand(m_oCreature, delegate { script.ClearAllActions(CLRScriptBase.FALSE); }); uint oOldHide = getHide(script); m_oHide = script.CreateItemOnObject("acr_pchide", m_oCreature, 1, "acr_pchide", CLRScriptBase.FALSE); // Temp variables to store bonuses, to allow stacking from different sources. Dictionary<int, int> saveBonuses = new Dictionary<int, int>(); Dictionary<int, int> skillBonuses = new Dictionary<int, int>(); Dictionary<string, int> otherBonuses = new Dictionary<string, int>(); // Initialize dictionaries. for (int i = 0; i < 68; i++) { skillBonuses.Add(i, 0); } for (int i = 0; i < 4; i++) { saveBonuses.Add(i, 0); } #region Skill Focus feats // Handle all new shiny skill focus feats. if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_BALANCE, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_BALANCE] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CLIMB, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_CLIMB] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_ALCH, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_CRAFT_ALCHEMY] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_ARM, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_CRAFT_ARMORSMITHING] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_BOW, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_CRAFT_BOWMAKING] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_WPN, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_CRAFT_WEAPONSMITHING] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_DECIPHER, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_DECIPHER_SCRIPT] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_DISGUISE, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_DISGUISE] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_ESC_ART, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_ESCAPE_ARTIST] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_HAND_ANIM, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_HANDLE_ANIMAL] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_JUMP, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_JUMP] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_ARC, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_ARCANA] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_DUNG, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_DUNGEONEERING] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_ENG, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_ENGINEERING] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_GEO, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_GEOGRAPHY] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_HIST, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_HISTORY] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_LOC, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_LOCAL] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_NATR, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_NATURE] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_NOBL, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_NOBILITY] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_PLAN, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_THE_PLANES] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_RELG, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_RELIGION] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_ACT, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_ACT] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_COMD, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_COMEDY] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_DANC, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_DANCE] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_KEYB, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_KEYBOARD] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_ORAT, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_ORATORY] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_PERC, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_PERCUSSION] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_SING, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_SING] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_STRG, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_STRING_INSTRUMENTS] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_WIND, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_WIND_INSTRUMENTS] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PROF, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PROFESSION] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_RIDE, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_RIDE] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_SENS_MOTV, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_SPEAK_LANGUAGE] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_SPK_LANG, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_LOCAL] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_SWIM, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_SWIM] += 3; if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_USE_ROPE, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_USE_ROPE] += 3; #endregion // Artist is one bad-ass feat. if (script.GetHasFeat(CLRScriptBase.FEAT_ARTIST, m_oCreature, 1) == CLRScriptBase.TRUE) { // Previously: +2 perform, +2 diplomacy // Currently: +2 perform (all), 3 extra bardic music uses per day skillBonuses[CLRScriptBase.SKILL_DIPLOMACY] -= 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_ACT] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_COMEDY] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_DANCE] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_KEYBOARD] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_ORATORY] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_PERCUSSION] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_SING] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_STRING_INSTRUMENTS] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_WIND_INSTRUMENTS] += 2; } // Add skill bonuses to item. foreach (int skill in skillBonuses.Keys) { if (skillBonuses[skill] == 0) { continue; } else if (skillBonuses[skill] > 0) { script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skill, skillBonuses[skill]), m_oHide, 0.0f); } else if (skillBonuses[skill] < 0) { script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyDecreaseSkill(skill, Math.Abs(skillBonuses[skill])), m_oHide, 0.0f); } } // Add save bonuses to item. foreach (int save in saveBonuses.Keys) { if (saveBonuses[save] == 0) { continue; } else if (saveBonuses[save] > 0) { script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrow(save, saveBonuses[save]), m_oHide, 0.0f); } else if (saveBonuses[save] < 0) { script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyReducedSavingThrow(save, Math.Abs(saveBonuses[save])), m_oHide, 0.0f); } } // Make the person equip the new item. script.AssignCommand(m_oCreature, delegate { script.ClearAllActions(CLRScriptBase.FALSE); }); script.AssignCommand(m_oCreature, delegate { script.ActionEquipItem(m_oHide, CLRScriptBase.INVENTORY_SLOT_CARMOUR); }); script.DestroyObject(oOldHide, 0.0f, CLRScriptBase.FALSE); script.SendMessageToPC(m_oCreature, "PC Hide refreshed."); // Everything looks fine, return our success. return true; }
public static void StallForTime(CLRScriptBase s, ALFA.Shared.ActiveTrap trap, uint disabler, float delay, NWLocation loc) { delay -= 2.0f; if (delay <= 0.5f) { DisableResult result = IsDisableSuccessful(s, trap, trap.DisarmDC, disabler); if (result == DisableResult.Success) { RemoveTrap(s, trap); s.SendMessageToPC(disabler, "<c=#98FFFF>This trap is now gone, and needs no more work from you.</c>"); return; } else if (result == DisableResult.CriticalFailure) { trap.Disabler = 0; trap.Helpers = new List<uint>(); trap.TotalHelp = 0; TrapTrigger.Fire(s, trap, disabler); s.SendMessageToPC(disabler, "<c=#98FFFF>Your disable attempt has backfired, causing you to cease work.</c>"); return; } else { trap.Disabler = 0; trap.Helpers = new List<uint>(); trap.TotalHelp = 0; s.SendMessageToPC(disabler, "<c=#98FFFF>Your disable attempt has failed. You may retry if you like.</c>"); return; } } else { Vector3 oldPos = s.GetPositionFromLocation(loc); NWLocation newLoc = s.GetLocation(disabler); Vector3 newPos = s.GetPosition(disabler); if (Math.Abs(oldPos.x - newPos.x) > DisarmMovementThreshhold || Math.Abs(oldPos.y - newPos.y) > DisarmMovementThreshhold) { // The disabler has moved. Interpret as canceling. trap.Disabler = 0; trap.Helpers = new List<uint>(); trap.TotalHelp = 0; s.SendMessageToPC(disabler, "<c=#98FFFF>You stop working on the trap, due to having moved from your workspace.</c>"); return; } int action = s.GetCurrentAction(disabler); if (action == ACTION_ANIMALEMPATHY || action == ACTION_ATTACKOBJECT || action == ACTION_CASTSPELL || action == ACTION_CLOSEDOOR || action == ACTION_COUNTERSPELL || action == ACTION_DIALOGOBJECT || action == ACTION_DROPITEM || action == ACTION_EXAMINETRAP || action == ACTION_FLAGTRAP || action == ACTION_FOLLOW || action == ACTION_HEAL || action == ACTION_ITEMCASTSPELL || action == ACTION_KIDAMAGE || action == ACTION_LOCK || action == ACTION_MOVETOPOINT || action == ACTION_OPENDOOR || action == ACTION_OPENLOCK || action == ACTION_PICKPOCKET || action == ACTION_PICKUPITEM || action == ACTION_RANDOMWALK || action == ACTION_RECOVERTRAP || action == ACTION_REST || action == ACTION_SETTRAP || action == ACTION_SIT || action == ACTION_SMITEGOOD || action == ACTION_TAUNT || action == ACTION_USEOBJECT) { // Disabler isn't working on the trap any more. Abort. trap.Disabler = 0; trap.Helpers = new List<uint>(); trap.TotalHelp = 0; s.SendMessageToPC(disabler, "<c=#98FFFF>You stop working on the trap, due to having begun another task.</c>"); return; } s.SendMessageToPC(disabler, "<c=#98FFFF>You continue work on the trap...</c>"); s.PlayAnimation(ANIMATION_FIREFORGET_KNEELFIDGET, 1.0f, 2.0f); s.DelayCommand(2.0f, delegate { StallForTime(s, trap, disabler, delay, newLoc); }); } }
private static NWEffect GetTrapEffect(CLRScriptBase s, ALFA.Shared.ActiveTrap trap, uint target) { int damage = 0; for (int count = 0; count < trap.DiceNumber; count++) { damage += s.Random(trap.DiceType) + 1; } if (trap.SaveDC > -1) { if (s.ReflexSave(target, trap.SaveDC, SAVING_THROW_TYPE_TRAP, s.GetObjectByTag(trap.Tag, 0)) != TRUE) { if (s.GetHasFeat(FEAT_IMPROVED_EVASION, target, TRUE) == TRUE) damage /= 2; } else { if (s.GetHasFeat(FEAT_EVASION, target, TRUE) == TRUE) damage = 0; else damage /= 2; } } else { int roll = new Random().Next(20) + 1; int final = roll + trap.AttackBonus; string hitormiss = " *hit* "; if (final < s.GetAC(target, FALSE) && roll != 20) { hitormiss = " *miss* "; damage = 0; } s.SendMessageToPC(target, "<C=DarkViolet>Trap</C><C=DarkOrange> attacks " + s.GetName(target) + ":" + hitormiss + ": " + roll + " + " + trap.AttackBonus + " = " + final); } NWEffect eVis = s.EffectVisualEffect(VFX_COM_HIT_DIVINE, FALSE); List<int> damageTypes = new List<int>(); if ((trap.DamageType & DAMAGE_TYPE_ACID) == DAMAGE_TYPE_ACID) { damageTypes.Add(DAMAGE_TYPE_ACID); eVis = s.EffectVisualEffect(VFX_COM_HIT_ACID, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_BLUDGEONING) == DAMAGE_TYPE_BLUDGEONING) { damageTypes.Add(DAMAGE_TYPE_BLUDGEONING); eVis = s.EffectVisualEffect(VFX_COM_BLOOD_CRT_RED, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_COLD) == DAMAGE_TYPE_COLD) { damageTypes.Add(DAMAGE_TYPE_COLD); eVis = s.EffectVisualEffect(VFX_COM_HIT_FROST, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_DIVINE) == DAMAGE_TYPE_DIVINE) { damageTypes.Add(DAMAGE_TYPE_DIVINE); eVis = s.EffectVisualEffect(VFX_COM_HIT_DIVINE, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_ELECTRICAL) == DAMAGE_TYPE_ELECTRICAL) { damageTypes.Add(DAMAGE_TYPE_ELECTRICAL); eVis = s.EffectVisualEffect(VFX_COM_HIT_ELECTRICAL, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_FIRE) == DAMAGE_TYPE_FIRE) { damageTypes.Add(DAMAGE_TYPE_FIRE); eVis = s.EffectVisualEffect(VFX_COM_HIT_FIRE, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_MAGICAL) == DAMAGE_TYPE_MAGICAL) { damageTypes.Add(DAMAGE_TYPE_MAGICAL); eVis = s.EffectVisualEffect(VFX_COM_HIT_DIVINE, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_NEGATIVE) == DAMAGE_TYPE_NEGATIVE) { damageTypes.Add(DAMAGE_TYPE_NEGATIVE); eVis = s.EffectVisualEffect(VFX_COM_HIT_NEGATIVE, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_PIERCING) == DAMAGE_TYPE_PIERCING) { damageTypes.Add(DAMAGE_TYPE_PIERCING); eVis = s.EffectVisualEffect(VFX_COM_BLOOD_CRT_RED, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_POSITIVE) == DAMAGE_TYPE_POSITIVE) { damageTypes.Add(DAMAGE_TYPE_POSITIVE); eVis = s.EffectVisualEffect(VFX_COM_HIT_DIVINE, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_SLASHING) == DAMAGE_TYPE_SLASHING) { damageTypes.Add(DAMAGE_TYPE_SLASHING); eVis = s.EffectVisualEffect(VFX_COM_BLOOD_CRT_RED, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_SONIC) == DAMAGE_TYPE_SONIC) { damageTypes.Add(DAMAGE_TYPE_SONIC); eVis = s.EffectVisualEffect(VFX_COM_HIT_SONIC, FALSE); } if (damage == 0) { return eVis; } NWEffect eDam = eVis; damage /= damageTypes.Count; if (damage < 1) damage = 1; foreach (int dmgType in damageTypes) { eDam = s.EffectLinkEffects(eDam, s.EffectDamage(damage, dmgType, DAMAGE_POWER_NORMAL, FALSE)); } return eDam; }
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); }
private static void ProcessNoAir(CLRScriptBase script, uint Creature) { if (!GetNeedsToBreathe(script, Creature)) { return; } script.ApplyEffectToObject(CLRScriptBase.DURATION_TYPE_TEMPORARY, script.ExtraordinaryEffect(script.EffectSilence()), Creature, 6.0f); if (!CurrentDrownStatus.ContainsKey(Creature)) { CurrentDrownStatus.Add(Creature, 1); } else { CurrentDrownStatus[Creature]++; } if(CurrentDrownStatus[Creature] > script.GetAbilityScore(Creature, CLRScriptBase.ABILITY_CONSTITUTION, CLRScriptBase.FALSE) * 2) { if(!CurrentDrownDC.ContainsKey(Creature)) { CurrentDrownDC.Add(Creature, 10); } else { CurrentDrownDC[Creature]++; } int conCheck = script.d20(1); int conMod = script.GetAbilityModifier(CLRScriptBase.ABILITY_CONSTITUTION, Creature); if(conCheck + conMod < CurrentDrownDC[Creature]) { script.SendMessageToPC(Creature, String.Format("*Constitution: {0} + {1} = {2} v. DC {3} :: Failure!*", conCheck, conMod, conCheck + conMod, CurrentDrownDC[Creature])); int Damage = 0; string Message; int HP = script.GetCurrentHitPoints(Creature); if(HP > 1) { Damage = script.GetCurrentHitPoints(Creature) - 1; Message = "You're suffocating! If you don't find air NOW, you will DIE!"; } else if(HP > 0) { Damage = 2; Message = "You have lost consciousness. Unless someone comes to rescue you, you will die."; } else { Damage = 10; Message = "You have suffocated"; } script.ApplyEffectToObject(CLRScriptBase.DURATION_TYPE_INSTANT, script.EffectDamage(Damage, CLRScriptBase.DAMAGE_TYPE_MAGICAL, CLRScriptBase.DAMAGE_POWER_ENERGY, CLRScriptBase.TRUE), Creature, 0.0f); script.SendMessageToPC(Creature, Message); return; } else { script.SendMessageToPC(Creature, "You are barely clutching to consciousness! Get air NOW!"); return; } } else { int SecondsLeft = ((script.GetAbilityScore(Creature, CLRScriptBase.ABILITY_CONSTITUTION, CLRScriptBase.FALSE) * 2) - CurrentDrownStatus[Creature]) * 6; if(SecondsLeft > 60) { script.SendMessageToPC(Creature, String.Format("You can hold your breath for {0} more seconds.", SecondsLeft)); } else if(SecondsLeft > 30) { script.SendMessageToPC(Creature, String.Format("Careful! You can only hold your breath for {0} more seconds!", SecondsLeft)); } else { script.SendMessageToPC(Creature, String.Format("** WARNING ** If you don't find air within {0} seconds, you will DIE!", SecondsLeft)); } } }