Updated to PRC8
Updated to PRC8. Further function integration. Fixed NPC onDeath script. Full compile. Updated release archive.
This commit is contained in:
		
							
								
								
									
										143
									
								
								_haks/poa_exp_spells/x0_s0_magicfang.nss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								_haks/poa_exp_spells/x0_s0_magicfang.nss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,143 @@ | ||||
| /* | ||||
|     x0_s0_magicfang | ||||
|  | ||||
|     +1 enhancement bonus to attack and damage rolls. | ||||
|     Also applys damage reduction +1; this allows the creature | ||||
|     to strike creatures with +1 damage reduction. | ||||
|  | ||||
|     Checks to see if a valid summoned monster or animal companion | ||||
|     exists to apply the effects to. If none exists, then | ||||
|     the spell is wasted. | ||||
|  | ||||
|     By: Brent Knowles | ||||
|     Created: September 6, 2002 | ||||
|     Modified: Jun 29, 2006 | ||||
|  | ||||
|     Flaming_Sword: cleaned up, added greater magic fang | ||||
| */ | ||||
|  | ||||
| #include "prc_sp_func" | ||||
|  | ||||
|  | ||||
| void CheckStillUnarmed(object oTarget) | ||||
| { | ||||
|     //only works if you have nothing in right & left hands | ||||
|     if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget)) | ||||
|         || GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget))) | ||||
|     { | ||||
|         FloatingTextStrRefOnCreature(8962, oTarget, FALSE); | ||||
|         //remove other magic fang effects | ||||
|         PRCRemoveSpellEffects(452, OBJECT_SELF, oTarget); | ||||
|         PRCRemoveSpellEffects(453, OBJECT_SELF, oTarget); | ||||
|         return; // has neither an animal companion | ||||
|     } | ||||
|     DelayCommand(1.0, CheckStillUnarmed(oTarget)); | ||||
| } | ||||
|  | ||||
| //Implements the spell impact, put code here | ||||
| //  if called in many places, return TRUE if | ||||
| //  stored charges should be decreased | ||||
| //  eg. touch attack hits | ||||
| // | ||||
| //  Variables passed may be changed if necessary | ||||
| int DoSpell(object oCaster, object oTarget, int nCasterLevel, int nEvent) | ||||
| { | ||||
|     int nSpellID = PRCGetSpellId(); | ||||
|     int bNorm = (nSpellID == 452); | ||||
|  | ||||
|     int nPower = bNorm ? 1 : (nCasterLevel + 1) / 3;    //magic fang | ||||
|     if (nPower > 20) | ||||
|      nPower = 20;  // * max of +5 bonus | ||||
|     int nDamagePower; | ||||
|  | ||||
|     switch (nPower) | ||||
|     { | ||||
|         case 1: nDamagePower = DAMAGE_POWER_PLUS_ONE; break; | ||||
|         case 2: nDamagePower = DAMAGE_POWER_PLUS_TWO; break; | ||||
|         case 3: nDamagePower = DAMAGE_POWER_PLUS_THREE; break; | ||||
|         case 4: nDamagePower = DAMAGE_POWER_PLUS_FOUR; break; | ||||
|         case 5: nDamagePower = DAMAGE_POWER_PLUS_FIVE; break; | ||||
| 		case 6: nDamagePower = DAMAGE_POWER_PLUS_SIX; break; | ||||
| 		case 7: nDamagePower = DAMAGE_POWER_PLUS_SEVEN; break; | ||||
| 		case 8: nDamagePower = DAMAGE_POWER_PLUS_EIGHT; break; | ||||
| 		case 9: nDamagePower = DAMAGE_POWER_PLUS_NINE; break; | ||||
| 		case 10: nDamagePower = DAMAGE_POWER_PLUS_TEN; break; | ||||
| 		case 11: nDamagePower = DAMAGE_POWER_PLUS_ELEVEN; break; | ||||
| 		case 12: nDamagePower = DAMAGE_POWER_PLUS_TWELVE; break; | ||||
| 		case 13: nDamagePower = DAMAGE_POWER_PLUS_THIRTEEN; break; | ||||
| 		case 14: nDamagePower = DAMAGE_POWER_PLUS_FOURTEEN; break; | ||||
| 		case 15: nDamagePower = DAMAGE_POWER_PLUS_FIFTEEN; break; | ||||
| 		case 16: nDamagePower = DAMAGE_POWER_PLUS_SIXTEEN; break; | ||||
| 		case 17: nDamagePower = DAMAGE_POWER_PLUS_SEVENTEEN; break; | ||||
| 		case 18: nDamagePower = DAMAGE_POWER_PLUS_EIGHTEEN; break; | ||||
| 		case 19: nDamagePower = DAMAGE_POWER_PLUS_NINTEEN; break; | ||||
| 		case 20: nDamagePower = DAMAGE_POWER_PLUS_TWENTY; break; | ||||
|     } | ||||
|  | ||||
|     if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget)) | ||||
|         || GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget))) | ||||
|     { | ||||
|         FloatingTextStrRefOnCreature(8962, OBJECT_SELF, FALSE); | ||||
|         return TRUE; // has neither an animal companion | ||||
|     } | ||||
|     //only works if target has monk levels | ||||
|     //or has a creature weapon | ||||
|     if(!GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oTarget)) | ||||
|         && !GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oTarget)) | ||||
|         && !GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oTarget)) | ||||
|         && !GetLevelByClass(CLASS_TYPE_MONK, oTarget)) | ||||
|     { | ||||
|         FloatingTextStrRefOnCreature(8962, OBJECT_SELF, FALSE); | ||||
|         return TRUE; // has neither an animal companion | ||||
|     } | ||||
|  | ||||
|     //remove other magic fang effects | ||||
|     PRCRemoveSpellEffects(452, OBJECT_SELF, oTarget); | ||||
|     PRCRemoveSpellEffects(453, OBJECT_SELF, oTarget); | ||||
|     int nMetaMagic = PRCGetMetaMagicFeat(); | ||||
|  | ||||
|     effect eLink = EffectLinkEffects(EffectAttackIncrease(nPower), EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE)); | ||||
|     eLink = EffectLinkEffects(eLink, EffectDamageIncrease(nPower)); | ||||
|     eLink = EffectLinkEffects(eLink, EffectDamageReduction(nPower, nDamagePower)); | ||||
|  | ||||
|     float fDuration = bNorm ? TurnsToSeconds(nCasterLevel) : HoursToSeconds(nCasterLevel); // * Duration 1 hour/level | ||||
|     if ((nMetaMagic & METAMAGIC_EXTEND))    //Duration is +100% | ||||
|         fDuration = fDuration * 2.0; | ||||
|  | ||||
|     //Fire spell cast at event for target | ||||
|     SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, PRCGetSpellId(), FALSE)); | ||||
|     //Apply VFX impact and bonus effects | ||||
|     ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HOLY_AID), oTarget); | ||||
|     ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration); | ||||
|     DelayCommand(1.0, CheckStillUnarmed(oTarget)); | ||||
|  | ||||
|     return TRUE;    //return TRUE if spell charges should be decremented | ||||
| } | ||||
|  | ||||
| void main() | ||||
| { | ||||
|     object oCaster = OBJECT_SELF; | ||||
|     int nCasterLevel = PRCGetCasterLevel(oCaster); | ||||
|     PRCSetSchool(GetSpellSchool(PRCGetSpellId())); | ||||
|     if (!X2PreSpellCastCode()) return; | ||||
|     object oTarget = PRCGetSpellTargetObject(); | ||||
|     int nEvent = GetLocalInt(oCaster, PRC_SPELL_EVENT); //use bitwise & to extract flags | ||||
|     if(!nEvent) //normal cast | ||||
|     { | ||||
|         if(GetLocalInt(oCaster, PRC_SPELL_HOLD) && oCaster == oTarget) | ||||
|         {   //holding the charge, casting spell on self | ||||
|             SetLocalSpellVariables(oCaster, 1);   //change 1 to number of charges | ||||
|             return; | ||||
|         } | ||||
|         DoSpell(oCaster, oTarget, nCasterLevel, nEvent); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         if(nEvent & PRC_SPELL_EVENT_ATTACK) | ||||
|         { | ||||
|             if(DoSpell(oCaster, oTarget, nCasterLevel, nEvent)) | ||||
|                 DecrementSpellCharges(oCaster); | ||||
|         } | ||||
|     } | ||||
|     PRCSetSchool(); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user