Create x2_s1_beholdray.nss
Fixed vanilla beholder ray attack to work with PRC's petrification immunity.
This commit is contained in:
		
							
								
								
									
										218
									
								
								nwn/nwnprc/trunk/ocfixerf/x2_s1_beholdray.nss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										218
									
								
								nwn/nwnprc/trunk/ocfixerf/x2_s1_beholdray.nss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,218 @@ | ||||
| //:://///////////////////////////////////////////// | ||||
| //:: Beholder Ray Attacks | ||||
| //:: x2_s2_beholdray | ||||
| //:: Copyright (c) 2003 Bioware Corp. | ||||
| //::////////////////////////////////////////////// | ||||
| /* | ||||
|     Implementation for the new version of the | ||||
|     beholder rays, using projectiles instead of | ||||
|     rays | ||||
| */ | ||||
| //::////////////////////////////////////////////// | ||||
| //:: Created By: Georg Zoeller | ||||
| //:: Created On: 2003-09-16 | ||||
| //::////////////////////////////////////////////// | ||||
|  | ||||
|  | ||||
| #include "x0_i0_spells" | ||||
|  | ||||
|  | ||||
| void DoBeholderPetrify(int nDuration,object oSource, object oTarget, int nSpellID); | ||||
|  | ||||
| void main() | ||||
| { | ||||
|  | ||||
|     int     nSpell = GetSpellId(); | ||||
|     object  oTarget = GetSpellTargetObject(); | ||||
|     int     nSave, bSave; | ||||
|     int     nSaveDC = 15; | ||||
|     float   fDelay; | ||||
|     effect  e1, eLink, eVis, eDur; | ||||
|  | ||||
|  | ||||
|     switch (nSpell) | ||||
|     { | ||||
|          case 776 : | ||||
|                                   nSave = SAVING_THROW_FORT;      //BEHOLDER_RAY_DEATH | ||||
|                                   break; | ||||
|  | ||||
|         case  777: | ||||
|                                   nSave = SAVING_THROW_WILL;     //BEHOLDER_RAY_TK | ||||
|                                   break; | ||||
|  | ||||
|         case 778 :                                              //BEHOLDER_RAY_PETRI | ||||
|                                   nSave = SAVING_THROW_FORT; | ||||
|                                   break; | ||||
|  | ||||
|         case 779:                                                   // BEHOLDER_RAY_CHARM | ||||
|                                   nSave = SAVING_THROW_WILL; | ||||
|                                   break; | ||||
|  | ||||
|         case 780:                                                   //BEHOLDER_RAY_SLOW | ||||
|                                   nSave = SAVING_THROW_WILL; | ||||
|                                   break; | ||||
|  | ||||
|        case 783: | ||||
|                                   nSave = SAVING_THROW_FORT;        //BEHOLDER_RAY_WOUND | ||||
|                                   break; | ||||
|  | ||||
|        case 784:                                                    // BEHOLDER_RAY_FEAR | ||||
|                                   nSave = SAVING_THROW_WILL; | ||||
|                                   break; | ||||
|  | ||||
|        case 785: | ||||
|        case 786: | ||||
|        case 787: | ||||
|     } | ||||
|  | ||||
|     SignalEvent(oTarget,EventSpellCastAt(OBJECT_SELF,GetSpellId(),TRUE)); | ||||
|     fDelay  = 0.0f;  //old -- GetSpellEffectDelay(GetLocation(oTarget),OBJECT_SELF); | ||||
|     if (nSave == SAVING_THROW_WILL) | ||||
|     { | ||||
|         bSave = MySavingThrow(SAVING_THROW_WILL,oTarget, nSaveDC,SAVING_THROW_TYPE_ALL,OBJECT_SELF,fDelay) >0; | ||||
|     } | ||||
|     else if (nSave == SAVING_THROW_FORT) | ||||
|     { | ||||
|       bSave = MySavingThrow(SAVING_THROW_FORT,oTarget, nSaveDC,SAVING_THROW_TYPE_ALL,OBJECT_SELF,fDelay) >0; | ||||
|     } | ||||
|  | ||||
|     if (!bSave) | ||||
|     { | ||||
|  | ||||
|       switch (nSpell) | ||||
|       { | ||||
|          case 776:                 e1 = EffectDeath(TRUE); | ||||
|                                    eVis = EffectVisualEffect(VFX_IMP_DEATH); | ||||
|                                    eLink = EffectLinkEffects(e1,eVis); | ||||
|                                    ApplyEffectToObject(DURATION_TYPE_INSTANT,eLink,oTarget); | ||||
|                                    break; | ||||
|  | ||||
|           case 777:                e1 = ExtraordinaryEffect(EffectKnockdown()); | ||||
|                                    eVis = EffectVisualEffect(VFX_IMP_STUN); | ||||
|                                    ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget); | ||||
|                                    ApplyEffectToObject(DURATION_TYPE_TEMPORARY,e1,oTarget,6.0f); | ||||
|                                    break; | ||||
|  | ||||
|           // Petrify for one round per SaveDC | ||||
|           case 778:                eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); | ||||
|                                    ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget); | ||||
|                                    DoBeholderPetrify(nSaveDC,OBJECT_SELF,oTarget,GetSpellId()); | ||||
|                                    break; | ||||
|  | ||||
|  | ||||
|           case 779:                e1 = EffectCharmed(); | ||||
|                                    eVis = EffectVisualEffect(VFX_IMP_CHARM); | ||||
|                                    ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget); | ||||
|                                    ApplyEffectToObject(DURATION_TYPE_TEMPORARY,e1,oTarget,24.0f); | ||||
|                                    break; | ||||
|  | ||||
|  | ||||
|           case 780:                e1 = EffectSlow(); | ||||
|                                    eVis = EffectVisualEffect(VFX_IMP_SLOW); | ||||
|                                    ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget); | ||||
|                                    ApplyEffectToObject(DURATION_TYPE_TEMPORARY,e1,oTarget,RoundsToSeconds(6)); | ||||
|                                    break; | ||||
|  | ||||
|           case 783:                e1 = EffectDamage(d8(2)+10); | ||||
|                                    eVis = EffectVisualEffect(VFX_COM_BLOOD_REG_RED); | ||||
|                                    ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget); | ||||
|                                    ApplyEffectToObject(DURATION_TYPE_INSTANT,e1,oTarget); | ||||
|                                    break; | ||||
|  | ||||
|  | ||||
|           case 784: | ||||
|                                    e1 = EffectFrightened(); | ||||
|                                    eVis = EffectVisualEffect(VFX_IMP_FEAR_S); | ||||
|                                    eDur = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR); | ||||
|                                    e1 = EffectLinkEffects(eDur,e1); | ||||
|                                    ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget); | ||||
|                                    ApplyEffectToObject(DURATION_TYPE_TEMPORARY,e1,oTarget,RoundsToSeconds(1+d4())); | ||||
|                                    break; | ||||
|  | ||||
|  | ||||
|        } | ||||
|  | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|          switch (nSpell) | ||||
|          { | ||||
|                case 776:         e1 = EffectDamage(d6(3)+13); | ||||
|                                  eVis = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY); | ||||
|                                  eLink = EffectLinkEffects(e1,eVis); | ||||
|                                  ApplyEffectToObject(DURATION_TYPE_INSTANT,eLink,oTarget); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void DoBeholderPetrify(int nDuration,object oSource, object oTarget, int nSpellID) | ||||
| { | ||||
|  | ||||
|     if(!GetIsReactionTypeFriendly(oTarget) && !GetIsDead(oTarget)) | ||||
|     { | ||||
|         // * exit if creature is immune to petrification | ||||
|         if (spellsIsImmuneToPetrification(oTarget) == TRUE || GetHasFeat(4643))  //:: PRC's Immunity to Petrification | ||||
|         { | ||||
|             return; | ||||
|         } | ||||
|         float fDifficulty = 0.0; | ||||
|         int bIsPC = GetIsPC(oTarget); | ||||
|         int bShowPopup = FALSE; | ||||
|  | ||||
|         // * calculate Duration based on difficulty settings | ||||
|         int nGameDiff = GetGameDifficulty(); | ||||
|         switch (nGameDiff) | ||||
|         { | ||||
|             case GAME_DIFFICULTY_VERY_EASY: | ||||
|             case GAME_DIFFICULTY_EASY: | ||||
|             case GAME_DIFFICULTY_NORMAL: | ||||
|                     fDifficulty = RoundsToSeconds(nDuration); // One Round per hit-die or caster level | ||||
|                 break; | ||||
|             case GAME_DIFFICULTY_CORE_RULES: | ||||
|             case GAME_DIFFICULTY_DIFFICULT: | ||||
|                 if (!GetPlotFlag(oTarget)) | ||||
|                 { | ||||
|                     bShowPopup = TRUE; | ||||
|                 } | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|         effect ePetrify = EffectPetrify(); | ||||
|         effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); | ||||
|         effect eLink = EffectLinkEffects(eDur, ePetrify); | ||||
|  | ||||
|  | ||||
|                 /// * The duration is permanent against NPCs but only temporary against PCs | ||||
|                 if (bIsPC == TRUE) | ||||
|                 { | ||||
|                     if (bShowPopup == TRUE) | ||||
|                     { | ||||
|                         // * under hardcore rules or higher, this is an instant death | ||||
|                         ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget); | ||||
|                         DelayCommand(2.75, PopUpDeathGUIPanel(oTarget, FALSE , TRUE, 40579)); | ||||
|                         // if in hardcore, treat the player as an NPC | ||||
|                         bIsPC = FALSE; | ||||
|                     } | ||||
|                     else | ||||
|                         ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDifficulty); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget); | ||||
|                     // * Feb 11 2003 BK I don't think this is necessary anymore | ||||
|                     //if the target was an NPC - make him uncommandable until Stone to Flesh is cast | ||||
|                     //SetCommandable(FALSE, oTarget); | ||||
|  | ||||
|                     // Feb 5 2004 - Jon | ||||
|                     // Added kick-henchman-out-of-party code from generic petrify script | ||||
|                     if (GetAssociateType(oTarget) == ASSOCIATE_TYPE_HENCHMAN) | ||||
|                     { | ||||
|                         FireHenchman(GetMaster(oTarget),oTarget); | ||||
|                     } | ||||
|                 } | ||||
|                 // April 2003: Clearing actions to kick them out of conversation when petrified | ||||
|                 AssignCommand(oTarget, ClearAllActions()); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user