home *** CD-ROM | disk | FTP | other *** search
/ PC Zone 125 / DPPCZ0203B.7z / DPPCZ0203B.ISO / Demos / Neverwinter / data1.cab / override / nw_i0_spells.nss < prev    next >
Text File  |  2002-09-10  |  17KB  |  469 lines

  1. //::///////////////////////////////////////////////
  2. //:: Spells Include
  3. //:: NW_I0_SPELLS
  4. //:: Copyright (c) 2001 Bioware Corp.
  5. //:://////////////////////////////////////////////
  6. //:://////////////////////////////////////////////
  7. //:: Created By: Preston Watamaniuk
  8. //:: Created On: Jan 2, 2002
  9. //:://////////////////////////////////////////////
  10.  
  11. // BRENT: Added a function for doing electrical traps
  12. void TrapDoElectricalDamage(int ngDamageMaster, int nSaveDC, int nSecondary);
  13.  
  14. //Used to route the resist magic checks into this function to check for spell countering by SR, Globes or Mantles.
  15. int MyResistSpell(object oCaster, object oTarget, float fDelay = 0.0);
  16. //Used to route the saving throws through this function to check for spell countering by a saving throw.
  17. int MySavingThrow(int nSavingThrow, object oTarget, int nDC, int nSaveType=SAVING_THROW_TYPE_NONE, object oSaveVersus = OBJECT_SELF, float fDelay = 0.0);
  18. //Will pass back a linked effect for all the protection from alignment spells.  The power represents the multiplier of strength.
  19. //That is instead of +3 AC and +2 Saves a  power of 2 will yield +6 AC and +4 Saves.
  20. effect CreateProtectionFromAlignmentLink(int nAlignment, int nPower = 1);
  21. //Will pass back a linked effect for all of the doom effects.
  22. effect CreateDoomEffectsLink();
  23. //Searchs through a persons effects and removes those from a particular spell by a particular caster.
  24. void RemoveSpellEffects(int nSpell_ID, object oCaster, object oTarget);
  25. //Searchs through a persons effects and removes all those of a specific type.
  26. void RemoveSpecificEffect(int nEffectTypeID, object oTarget);
  27. //Returns the time in seconds that the effect should be delayed before application.
  28. float GetSpellEffectDelay(location SpellTargetLocation, object oTarget);
  29. //This allows the application of a random delay to effects based on time parameters passed in.  Min default = 0.4, Max default = 1.1
  30. float GetRandomDelay(float fMinimumTime = 0.4, float MaximumTime = 1.1);
  31. // Get Difficulty Duration
  32. int GetScaledDuration(int nActualDuration, object oTarget);
  33. // Get Scaled Effect
  34. effect GetScaledEffect(effect eStandard, object oTarget);
  35. //Remove all spell protections of a specific type
  36. int RemoveProtections(int nSpell_ID, object oTarget, int nCount);
  37. //
  38. int GetSpellBreachProtection(int nLastChecked);
  39. //Assigns a debug string to the Area of Effect Creator
  40. void AssignAOEDebugString(string sString);
  41. //Plays a random dragon battlecry based on age.
  42. void PlayDragonBattleCry();
  43.  
  44. int MyResistSpell(object oCaster, object oTarget, float fDelay = 0.0)
  45. {
  46.     if (fDelay > 0.5)
  47.     {
  48.         fDelay = fDelay - 0.1;
  49.     }
  50.     int nResist = ResistSpell(oCaster, oTarget);
  51.     effect eSR = EffectVisualEffect(VFX_IMP_MAGIC_RESISTANCE_USE);
  52.     effect eGlobe = EffectVisualEffect(VFX_IMP_GLOBE_USE);
  53.     effect eMantle = EffectVisualEffect(VFX_IMP_SPELL_MANTLE_USE);
  54.     if(nResist == 1) //Spell Resistance
  55.     {
  56.         DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eSR, oTarget));
  57.     }
  58.     else if(nResist == 2) //Globe
  59.     {
  60.         DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eGlobe, oTarget));
  61.     }
  62.     else if(nResist == 3) //Spell Mantle
  63.     {
  64.         if (fDelay > 0.5)
  65.         {
  66.             fDelay = fDelay - 0.1;
  67.         }
  68.         DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eMantle, oTarget));
  69.     }
  70.     return nResist;
  71. }
  72.  
  73. int MySavingThrow(int nSavingThrow, object oTarget, int nDC, int nSaveType=SAVING_THROW_TYPE_NONE, object oSaveVersus = OBJECT_SELF, float fDelay = 0.0)
  74. {
  75.     //SpeakString(IntToString(nDC));
  76.     effect eVis;
  77.     int bValid = FALSE;
  78.     int nSpellID;
  79.     if(nSavingThrow == SAVING_THROW_FORT)
  80.     {
  81.         bValid = FortitudeSave(oTarget, nDC, nSaveType, oSaveVersus);
  82.         if(bValid == 1)
  83.         {
  84.             eVis = EffectVisualEffect(VFX_IMP_FORTITUDE_SAVING_THROW_USE);
  85.         }
  86.     }
  87.     else if(nSavingThrow == SAVING_THROW_REFLEX)
  88.     {
  89.         bValid = ReflexSave(oTarget, nDC, nSaveType, oSaveVersus);
  90.         if(bValid == 1)
  91.         {
  92.             eVis = EffectVisualEffect(VFX_IMP_REFLEX_SAVE_THROW_USE);
  93.         }
  94.     }
  95.     else if(nSavingThrow == SAVING_THROW_WILL)
  96.     {
  97.         bValid = WillSave(oTarget, nDC, nSaveType, oSaveVersus);
  98.         if(bValid == 1)
  99.         {
  100.             eVis = EffectVisualEffect(VFX_IMP_WILL_SAVING_THROW_USE);
  101.         }
  102.     }
  103.  
  104.     nSpellID = GetSpellId();
  105.  
  106.     /*
  107.         return 0 = FAILED SAVE
  108.         return 1 = SAVE SUCCESSFUL
  109.         return 2 = IMMUNE TO WHAT WAS BEING SAVED AGAINST
  110.     */
  111.     if(bValid == 0)
  112.     {
  113.         if((nSaveType == SAVING_THROW_TYPE_DEATH
  114.          || nSpellID == SPELL_WEIRD
  115.          || nSpellID == SPELL_FINGER_OF_DEATH) &&
  116.          nSpellID != SPELL_HORRID_WILTING)
  117.         {
  118.             eVis = EffectVisualEffect(VFX_IMP_DEATH);
  119.             DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
  120.         }
  121.     }
  122.     if(bValid == 2)
  123.     {
  124.         eVis = EffectVisualEffect(VFX_IMP_MAGIC_RESISTANCE_USE);
  125.     }
  126.     if(bValid == 1 || bValid == 2)
  127.     {
  128.         if(bValid == 2)
  129.         {
  130.             /*
  131.             If the spell is save immune then the link must be applied in order to get the true immunity
  132.             to be resisted.  That is the reason for returing false and not true.  True blocks the
  133.             application of effects.
  134.             */
  135.             bValid = FALSE;
  136.         }
  137.         DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
  138.     }
  139.     return bValid;
  140. }
  141.  
  142. effect CreateProtectionFromAlignmentLink(int nAlignment, int nPower = 1)
  143. {
  144.     int nFinal = nPower * 2;
  145.     effect eAC = EffectACIncrease(nFinal, AC_DEFLECTION_BONUS);
  146.     eAC = VersusAlignmentEffect(eAC, ALIGNMENT_ALL, nAlignment);
  147.     effect eSave = EffectSavingThrowIncrease(SAVING_THROW_ALL, nFinal);
  148.     eSave = VersusAlignmentEffect(eSave,ALIGNMENT_ALL, nAlignment);
  149.     effect eImmune = EffectImmunity(IMMUNITY_TYPE_MIND_SPELLS);
  150.     eImmune = VersusAlignmentEffect(eImmune,ALIGNMENT_ALL, nAlignment);
  151.     effect eDur;
  152.     if(nAlignment == ALIGNMENT_EVIL)
  153.     {
  154.         eDur = EffectVisualEffect(VFX_DUR_PROTECTION_GOOD_MINOR);
  155.     }
  156.     else if(nAlignment == ALIGNMENT_GOOD)
  157.     {
  158.         eDur = EffectVisualEffect(VFX_DUR_PROTECTION_EVIL_MINOR);
  159.     }
  160.  
  161.     effect eDur2 = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
  162.     effect eLink = EffectLinkEffects(eImmune, eSave);
  163.     eLink = EffectLinkEffects(eLink, eAC);
  164.     eLink = EffectLinkEffects(eLink, eDur);
  165.     eLink = EffectLinkEffects(eLink, eDur2);
  166.     return eLink;
  167. }
  168.  
  169. effect CreateDoomEffectsLink()
  170. {
  171.     //Declare major variables
  172.     effect eSaves = EffectSavingThrowDecrease(SAVING_THROW_ALL, 2);
  173.     effect eAttack = EffectAttackDecrease(2);
  174.     effect eDamage = EffectDamageDecrease(2);
  175.     effect eSkill = EffectSkillDecrease(SKILL_ALL_SKILLS, 2);
  176.     effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
  177.  
  178.     effect eLink = EffectLinkEffects(eAttack, eDamage);
  179.     eLink = EffectLinkEffects(eLink, eSaves);
  180.     eLink = EffectLinkEffects(eLink, eSkill);
  181.     eLink = EffectLinkEffects(eLink, eDur);
  182.  
  183.     return eLink;
  184. }
  185.  
  186. void RemoveSpellEffects(int nSpell_ID, object oCaster, object oTarget)
  187. {
  188.     //Declare major variables
  189.     int bValid = FALSE;
  190.     effect eAOE;
  191.     if(GetHasSpellEffect(nSpell_ID, oTarget))
  192.     {
  193.         //Search through the valid effects on the target.
  194.         eAOE = GetFirstEffect(oTarget);
  195.         while (GetIsEffectValid(eAOE) && bValid == FALSE)
  196.         {
  197.             if (GetEffectCreator(eAOE) == oCaster)
  198.             {
  199.                 //If the effect was created by the spell then remove it
  200.                 if(GetEffectSpellId(eAOE) == nSpell_ID)
  201.                 {
  202.                     RemoveEffect(oTarget, eAOE);
  203.                     bValid = TRUE;
  204.                 }
  205.             }
  206.             //Get next effect on the target
  207.             eAOE = GetNextEffect(oTarget);
  208.         }
  209.     }
  210. }
  211.  
  212. void RemoveSpecificEffect(int nEffectTypeID, object oTarget)
  213. {
  214.     //Declare major variables
  215.     //Get the object that is exiting the AOE
  216.     int bValid = FALSE;
  217.     effect eAOE;
  218.     //Search through the valid effects on the target.
  219.     eAOE = GetFirstEffect(oTarget);
  220.     while (GetIsEffectValid(eAOE))
  221.     {
  222.         if (GetEffectType(eAOE) == nEffectTypeID)
  223.         {
  224.             //If the effect was created by the spell then remove it
  225.             bValid = TRUE;
  226.             RemoveEffect(oTarget, eAOE);
  227.         }
  228.         //Get next effect on the target
  229.         eAOE = GetNextEffect(oTarget);
  230.     }
  231. }
  232.  
  233. float GetSpellEffectDelay(location SpellTargetLocation, object oTarget)
  234. {
  235.     float fDelay;
  236.     return fDelay = GetDistanceBetweenLocations(SpellTargetLocation, GetLocation(oTarget))/20;
  237. }
  238.  
  239. float GetRandomDelay(float fMinimumTime = 0.4, float MaximumTime = 1.1)
  240. {
  241.     float fRandom = MaximumTime - fMinimumTime;
  242.     int nRandom;
  243.     if(fRandom < 0.0)
  244.     {
  245.         return 0.0;
  246.     }
  247.     else
  248.     {
  249.         nRandom = FloatToInt(fRandom  * 10.0);
  250.         nRandom = Random(nRandom) + 1;
  251.         fRandom = IntToFloat(nRandom);
  252.         fRandom /= 10.0;
  253.         return fRandom + fMinimumTime;
  254.     }
  255. }
  256.  
  257. int GetScaledDuration(int nActualDuration, object oTarget)
  258. {
  259.  
  260.     int nDiff = GetGameDifficulty();
  261.     int nNew = nActualDuration;
  262.     if(GetIsPC(oTarget) && nActualDuration > 3)
  263.     {
  264.         if(nDiff == GAME_DIFFICULTY_VERY_EASY || nDiff == GAME_DIFFICULTY_EASY)
  265.         {
  266.             nNew = nActualDuration / 4;
  267.         }
  268.         else if(nDiff == GAME_DIFFICULTY_NORMAL)
  269.         {
  270.             nNew = nActualDuration / 2;
  271.         }
  272.         if(nNew == 0)
  273.         {
  274.             nNew = 1;
  275.         }
  276.     }
  277.     return nNew;
  278. }
  279.  
  280. effect GetScaledEffect(effect eStandard, object oTarget)
  281. {
  282.     int nDiff = GetGameDifficulty();
  283.     effect eNew = eStandard;
  284.     object oMaster = GetMaster(oTarget);
  285.     if(GetIsPC(oTarget) || (GetIsObjectValid(oMaster) && GetIsPC(oMaster)))
  286.     {
  287.         if(GetEffectType(eStandard) == EFFECT_TYPE_FRIGHTENED && nDiff == GAME_DIFFICULTY_VERY_EASY)
  288.         {
  289.             eNew = EffectAttackDecrease(-2);
  290.             return eNew;
  291.         }
  292.         if(GetEffectType(eStandard) == EFFECT_TYPE_FRIGHTENED && nDiff == GAME_DIFFICULTY_EASY)
  293.         {
  294.             eNew = EffectAttackDecrease(-4);
  295.             return eNew;
  296.         }
  297.         if(nDiff == GAME_DIFFICULTY_VERY_EASY &&
  298.             (GetEffectType(eStandard) == EFFECT_TYPE_PARALYZE ||
  299.              GetEffectType(eStandard) == EFFECT_TYPE_STUNNED ||
  300.              GetEffectType(eStandard) == EFFECT_TYPE_CONFUSED))
  301.         {
  302.             eNew = EffectDazed();
  303.             return eNew;
  304.         }
  305.         else if(GetEffectType(eStandard) == EFFECT_TYPE_CHARMED || GetEffectType(eStandard) == EFFECT_TYPE_DOMINATED)
  306.         {
  307.             eNew = EffectDazed();
  308.             return eNew;
  309.         }
  310.     }
  311.     return eNew;
  312. }
  313.  
  314. int RemoveProtections(int nSpell_ID, object oTarget, int nCount)
  315. {
  316.     //Declare major variables
  317.     effect eProtection;
  318.     int nCnt = 0;
  319.     if(GetHasSpellEffect(nSpell_ID, oTarget))
  320.     {
  321.         //Search through the valid effects on the target.
  322.         eProtection = GetFirstEffect(oTarget);
  323.         while (GetIsEffectValid(eProtection))
  324.         {
  325.             //If the effect was created by the spell then remove it
  326.             if(GetEffectSpellId(eProtection) == nSpell_ID)
  327.             {
  328.                 RemoveEffect(oTarget, eProtection);
  329.                 //return 1;
  330.                 nCnt++;
  331.             }
  332.             //Get next effect on the target
  333.             eProtection = GetNextEffect(oTarget);
  334.         }
  335.     }
  336.     if(nCnt > 0)
  337.     {
  338.         return 1;
  339.     }
  340.     else
  341.     {
  342.         return 0;
  343.     }
  344. }
  345.  
  346. int GetSpellBreachProtection(int nLastChecked)
  347. {
  348.     //nLastChecked++;
  349.     if(nLastChecked == 1) {return SPELL_GREATER_SPELL_MANTLE;}
  350.     else if (nLastChecked == 2){return SPELL_PREMONITION;}
  351.     else if(nLastChecked == 3) {return SPELL_SPELL_MANTLE;}
  352.     else if(nLastChecked == 4) {return SPELL_SHADOW_SHIELD;}
  353.     else if(nLastChecked == 5) {return SPELL_GREATER_STONESKIN;}
  354.     else if(nLastChecked == 6) {return SPELL_ETHEREAL_VISAGE;}
  355.     else if(nLastChecked == 7) {return SPELL_GLOBE_OF_INVULNERABILITY;}
  356.     else if(nLastChecked == 8) {return SPELL_ENERGY_BUFFER;}
  357.     else if(nLastChecked == 9) {return SPELL_MINOR_GLOBE_OF_INVULNERABILITY;}
  358.     else if(nLastChecked == 10) {return SPELL_STONESKIN;}
  359.     else if(nLastChecked == 11) {return SPELL_LESSER_SPELL_MANTLE;}
  360.     else if(nLastChecked == 12) {return SPELL_ELEMENTAL_SHIELD;}
  361.     else if(nLastChecked == 13) {return SPELL_PROTECTION_FROM_ELEMENTS;}
  362.     else if(nLastChecked == 14) {return SPELL_RESIST_ELEMENTS;}
  363.     else if(nLastChecked == 15) {return SPELL_GHOSTLY_VISAGE;}
  364.     else if(nLastChecked == 16) {return SPELL_ENDURE_ELEMENTS;}
  365.     else if(nLastChecked == 17) {return SPELL_MAGE_ARMOR;}
  366.     return nLastChecked;
  367. }
  368.  
  369. void AssignAOEDebugString(string sString)
  370. {
  371.     object oTarget = GetAreaOfEffectCreator();
  372.     AssignCommand(oTarget, SpeakString(sString));
  373. }
  374.  
  375. void PlayDragonBattleCry()
  376. {
  377.     if(d100() > 50)
  378.     {
  379.         PlayVoiceChat(VOICE_CHAT_BATTLECRY1);
  380.     }
  381.     else
  382.     {
  383.         PlayVoiceChat(VOICE_CHAT_BATTLECRY2);
  384.     }
  385. }
  386.  
  387. void TrapDoElectricalDamage(int ngDamageMaster, int nSaveDC, int nSecondary)
  388. {
  389.     //Declare major variables
  390.     object oTarget = GetEnteringObject();
  391.     object o2ndTarget;
  392.     effect eLightning = EffectBeam(VFX_BEAM_LIGHTNING, oTarget, BODY_NODE_CHEST);
  393.     int nDamageMaster = ngDamageMaster;
  394.     int nDamage = nDamageMaster;
  395.     effect eDam;
  396.     effect eVis = EffectVisualEffect(VFX_IMP_LIGHTNING_S);
  397.     location lTarget = GetLocation(oTarget);
  398.     int nCount = 0;
  399.     //Adjust the trap damage based on the feats of the target
  400.     if(!MySavingThrow(SAVING_THROW_REFLEX, oTarget, nSaveDC, SAVING_THROW_TYPE_ELECTRICITY))
  401.     {
  402.         if (GetHasFeat(FEAT_IMPROVED_EVASION, oTarget))
  403.         {
  404.             nDamage /= 2;
  405.         }
  406.     }
  407.     else if (GetHasFeat(FEAT_EVASION, oTarget) || GetHasFeat(FEAT_IMPROVED_EVASION, oTarget))
  408.     {
  409.         nDamage = 0;
  410.     }
  411.     else
  412.     {
  413.         nDamage /= 2;
  414.     }
  415.     if (nDamage > 0)
  416.     {
  417.         eDam = EffectDamage(nDamage, DAMAGE_TYPE_ELECTRICAL);
  418.         ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
  419.         ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
  420.     }
  421.     //Reset the damage;
  422.     nDamage = nDamageMaster;
  423.     o2ndTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, lTarget);
  424.     while (GetIsObjectValid(o2ndTarget) && nCount <= nSecondary)
  425.     {
  426.         if(!GetIsReactionTypeFriendly(oTarget))
  427.         {
  428.             //check to see that the original target is not hit again.
  429.             if(o2ndTarget != oTarget)
  430.             {
  431.                 //Adjust the trap damage based on the feats of the target
  432.                 if(!MySavingThrow(SAVING_THROW_REFLEX, o2ndTarget, nSaveDC, SAVING_THROW_TYPE_ELECTRICITY))
  433.                 {
  434.                     if (GetHasFeat(FEAT_IMPROVED_EVASION, o2ndTarget))
  435.                     {
  436.                         nDamage /= 2;
  437.                     }
  438.                 }
  439.                 else if (GetHasFeat(FEAT_EVASION, o2ndTarget) || GetHasFeat(FEAT_IMPROVED_EVASION, o2ndTarget))
  440.                 {
  441.                     nDamage = 0;
  442.                 }
  443.                 else
  444.                 {
  445.                     nDamage /= 2;
  446.                 }
  447.                 if (nDamage > 0)
  448.                 {
  449.                     //Set the damage effect
  450.                     eDam = EffectDamage(nDamage, DAMAGE_TYPE_ELECTRICAL);
  451.                     //Apply the VFX impact and damage effect
  452.                     ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, o2ndTarget);
  453.                     ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, o2ndTarget);
  454.                     //Connect the lightning stream from one target to another.
  455.                     ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLightning, o2ndTarget, 0.75);
  456.                     //Set the last target as the new start for the lightning stream
  457.                     eLightning = EffectBeam(VFX_BEAM_LIGHTNING, o2ndTarget, BODY_NODE_CHEST);
  458.                 }
  459.             }
  460.             //Reset the damage
  461.             nDamage = nDamageMaster;
  462.             //Increment the count
  463.             nCount++;
  464.         }
  465.         //Get next target in the shape.
  466.         o2ndTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, lTarget);
  467.     }
  468. }
  469.