Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
		
			
				
	
	
		
			281 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| 
 | |
| // Use this function to get the adjustments to a spell or SLAs spell penetration
 | |
| // from the various class effects
 | |
| // Update this function if any new classes change spell pentration
 | |
| int add_spl_pen(object oCaster = OBJECT_SELF);
 | |
| 
 | |
| #include "prc_inc_spells"
 | |
| #include "prc_alterations"
 | |
| #include "prcsp_archmaginc"
 | |
| 
 | |
| int GetHeartWarderPene(int spell_id, object oCaster = OBJECT_SELF) {
 | |
|     // Guard Expensive Calculations
 | |
|     if (!GetHasFeat(FEAT_VOICE_SIREN, oCaster)) return 0;
 | |
| 
 | |
|     int  nSchool = GetLocalInt(OBJECT_SELF,"X2_L_LAST_SPELLSCHOOL_VAR");
 | |
|     
 | |
|     if ( nSchool != SPELL_SCHOOL_ENCHANTMENT) return 0;
 | |
|     
 | |
|     // Bonus Requires Verbal Spells
 | |
|     string VS = lookup_spell_vs(spell_id);
 | |
|     if (VS != "v" && VS != "vs")
 | |
|         return 0;
 | |
| 
 | |
|     // These feats provide greater bonuses or remove the Verbal requirement
 | |
|     if (PRCGetMetaMagicFeat() & METAMAGIC_SILENT
 | |
|             || GetHasFeat(FEAT_SPELL_PENETRATION, oCaster)
 | |
|             || GetHasFeat(FEAT_GREATER_SPELL_PENETRATION, oCaster)
 | |
|             || GetHasFeat(FEAT_EPIC_SPELL_PENETRATION, oCaster))
 | |
|         return 0;
 | |
| 
 | |
|     return 2;
 | |
| }
 | |
| 
 | |
| //
 | |
| //  Calculate Elemental Savant Contributions
 | |
| //
 | |
| int ElementalSavantSP(int spell_id, object oCaster = OBJECT_SELF)
 | |
| {
 | |
|     int nSP = 0;
 | |
|     int nES;
 | |
| 
 | |
|     // All Elemental Savants will have this feat
 | |
|     // when they first gain a penetration bonus.
 | |
|     // Otherwise this would require checking ~4 items (class or specific feats)
 | |
|     if (GetHasFeat(FEAT_ES_PEN_1, oCaster)) {
 | |
|         // get spell elemental type
 | |
|         string element = ChangedElementalType(spell_id, oCaster);
 | |
| 
 | |
|         // Any value that does not match one of the enumerated feats
 | |
|         int feat = 0;
 | |
| 
 | |
|         // Specify the elemental type rather than lookup by class?
 | |
|         if (element == "Fire")
 | |
|         {
 | |
|             feat = FEAT_ES_FIRE;
 | |
|             nES = GetLevelByClass(CLASS_TYPE_ES_FIRE,oCaster);
 | |
|         }
 | |
|         else if (element == "Cold")
 | |
|         {
 | |
|             feat = FEAT_ES_COLD;
 | |
|             nES = GetLevelByClass(CLASS_TYPE_ES_COLD,oCaster);
 | |
|         }
 | |
|         else if (element == "Electricity")
 | |
|         {
 | |
|             feat = FEAT_ES_ELEC;
 | |
|             nES = GetLevelByClass(CLASS_TYPE_ES_ELEC,oCaster);
 | |
|         }
 | |
|         else if (element == "Acid")
 | |
|         {
 | |
|             feat = FEAT_ES_ACID;
 | |
|             nES = GetLevelByClass(CLASS_TYPE_ES_ACID,oCaster);
 | |
|         }
 | |
| 
 | |
|         // Now determine the bonus
 | |
|         if (feat && GetHasFeat(feat, oCaster)) 
 | |
|         {
 | |
| 
 | |
|             if (nES > 28)       nSP = 10;
 | |
|             else if (nES > 25)  nSP = 9;
 | |
|             else if (nES > 22)  nSP = 8;
 | |
|             else if (nES > 19)  nSP = 7;
 | |
|             else if (nES > 16)  nSP = 6;
 | |
|             else if (nES > 13)  nSP = 5;
 | |
|             else if (nES > 10)  nSP = 4;
 | |
|             else if (nES > 7)   nSP = 3;
 | |
|             else if (nES > 4)   nSP = 2;
 | |
|             else if (nES > 1)   nSP = 1;
 | |
| 
 | |
|         }
 | |
|     }
 | |
| //  SendMessageToPC(GetFirstPC(), "Your Elemental Penetration modifier is " + IntToString(nSP));
 | |
|     return nSP;
 | |
| }
 | |
| 
 | |
| //Red Wizard SP boost based on spell school specialization
 | |
| int RedWizardSP(int spell_id, object oCaster = OBJECT_SELF)
 | |
| {
 | |
|     int iRedWizard = GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster);
 | |
|     int nSP;
 | |
| 
 | |
|     if (iRedWizard > 0)
 | |
|     {
 | |
|         int nSpell = PRCGetSpellId();
 | |
|         string sSpellSchool = lookup_spell_school(nSpell);
 | |
|         int iSpellSchool;
 | |
|         int iRWSpec;
 | |
| 
 | |
|         if (sSpellSchool == "A") iSpellSchool = SPELL_SCHOOL_ABJURATION;
 | |
|         else if (sSpellSchool == "C") iSpellSchool = SPELL_SCHOOL_CONJURATION;
 | |
|         else if (sSpellSchool == "D") iSpellSchool = SPELL_SCHOOL_DIVINATION;
 | |
|         else if (sSpellSchool == "E") iSpellSchool = SPELL_SCHOOL_ENCHANTMENT;
 | |
|         else if (sSpellSchool == "V") iSpellSchool = SPELL_SCHOOL_EVOCATION;
 | |
|         else if (sSpellSchool == "I") iSpellSchool = SPELL_SCHOOL_ILLUSION;
 | |
|         else if (sSpellSchool == "N") iSpellSchool = SPELL_SCHOOL_NECROMANCY;
 | |
|         else if (sSpellSchool == "T") iSpellSchool = SPELL_SCHOOL_TRANSMUTATION;
 | |
| 
 | |
|         if (GetHasFeat(FEAT_RW_TF_ABJ, oCaster)) iRWSpec = SPELL_SCHOOL_ABJURATION;
 | |
|         else if (GetHasFeat(FEAT_RW_TF_CON, oCaster)) iRWSpec = SPELL_SCHOOL_CONJURATION;
 | |
|         else if (GetHasFeat(FEAT_RW_TF_DIV, oCaster)) iRWSpec = SPELL_SCHOOL_DIVINATION;
 | |
|         else if (GetHasFeat(FEAT_RW_TF_ENC, oCaster)) iRWSpec = SPELL_SCHOOL_ENCHANTMENT;
 | |
|         else if (GetHasFeat(FEAT_RW_TF_EVO, oCaster)) iRWSpec = SPELL_SCHOOL_EVOCATION;
 | |
|         else if (GetHasFeat(FEAT_RW_TF_ILL, oCaster)) iRWSpec = SPELL_SCHOOL_ILLUSION;
 | |
|         else if (GetHasFeat(FEAT_RW_TF_NEC, oCaster)) iRWSpec = SPELL_SCHOOL_NECROMANCY;
 | |
|         else if (GetHasFeat(FEAT_RW_TF_TRS, oCaster)) iRWSpec = SPELL_SCHOOL_TRANSMUTATION;
 | |
| 
 | |
|         if (iSpellSchool == iRWSpec)
 | |
|         {
 | |
|         
 | |
|             nSP = 1;
 | |
| 
 | |
|             if (iRedWizard > 29)        nSP = 16;
 | |
|             else if (iRedWizard > 27)   nSP = 15;
 | |
|             else if (iRedWizard > 25)   nSP = 14;
 | |
|             else if (iRedWizard > 23)   nSP = 13;
 | |
|             else if (iRedWizard > 21)   nSP = 12;
 | |
|             else if (iRedWizard > 19)   nSP = 11;
 | |
|             else if (iRedWizard > 17)   nSP = 10;
 | |
|             else if (iRedWizard > 15)   nSP = 9;
 | |
|             else if (iRedWizard > 13)   nSP = 8;
 | |
|             else if (iRedWizard > 11)   nSP = 7;
 | |
|             else if (iRedWizard > 9)    nSP = 6;
 | |
|             else if (iRedWizard > 7)    nSP = 5;
 | |
|             else if (iRedWizard > 5)    nSP = 4;
 | |
|             else if (iRedWizard > 3)    nSP = 3;
 | |
|             else if (iRedWizard > 1)    nSP = 2;
 | |
|         
 | |
|         }
 | |
| 
 | |
| 
 | |
|     }
 | |
| //  SendMessageToPC(GetFirstPC(), "Your Spell Power modifier is " + IntToString(nSP));
 | |
|     return nSP;
 | |
| }
 | |
| 
 | |
| int GetSpellPenetreFocusSchool(object oCaster = OBJECT_SELF)
 | |
| {
 | |
|   int  nSchool = GetLocalInt(OBJECT_SELF,"X2_L_LAST_SPELLSCHOOL_VAR");
 | |
|   
 | |
|   if (nSchool >0){
 | |
|      if (GetHasFeat(FEAT_FOCUSED_SPELL_PENETRATION_ABJURATION+nSchool-1, oCaster))
 | |
|        return 4;}   
 | |
|     
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| int GetSpellPowerBonus(object oCaster = OBJECT_SELF)
 | |
| {
 | |
|     int nBonus = 0;
 | |
| 
 | |
|     if(GetHasFeat(FEAT_SPELLPOWER_10, oCaster))
 | |
|         nBonus = 10;
 | |
|     else if(GetHasFeat(FEAT_SPELLPOWER_8, oCaster))
 | |
|         nBonus = 8;
 | |
|     else if(GetHasFeat(FEAT_SPELLPOWER_6, oCaster))
 | |
|         nBonus = 6;
 | |
|     else if(GetHasFeat(FEAT_SPELLPOWER_4, oCaster))
 | |
|         nBonus = 4;
 | |
|     else if(GetHasFeat(FEAT_SPELLPOWER_2, oCaster))
 | |
|         nBonus = 2;
 | |
| 
 | |
|     return nBonus;
 | |
| }
 | |
| 
 | |
| // Shadow Weave Feat
 | |
| // +1 caster level vs SR (school Ench,Illu,Necro)
 | |
| int ShadowWeavePen(int spell_id, object oCaster = OBJECT_SELF)
 | |
| {
 | |
|     int iShadow = GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster);
 | |
|     int nSP;
 | |
| 
 | |
|     if (iShadow > 0)
 | |
|     {
 | |
|         int nSpell = PRCGetSpellId();
 | |
|         string sSpellSchool = lookup_spell_school(nSpell);
 | |
|         int iSpellSchool;
 | |
|         
 | |
|         if (sSpellSchool == "A") iSpellSchool = SPELL_SCHOOL_ABJURATION;
 | |
|         else if (sSpellSchool == "C") iSpellSchool = SPELL_SCHOOL_CONJURATION;
 | |
|         else if (sSpellSchool == "D") iSpellSchool = SPELL_SCHOOL_DIVINATION;
 | |
|         else if (sSpellSchool == "E") iSpellSchool = SPELL_SCHOOL_ENCHANTMENT;
 | |
|         else if (sSpellSchool == "V") iSpellSchool = SPELL_SCHOOL_EVOCATION;
 | |
|         else if (sSpellSchool == "I") iSpellSchool = SPELL_SCHOOL_ILLUSION;
 | |
|         else if (sSpellSchool == "N") iSpellSchool = SPELL_SCHOOL_NECROMANCY;
 | |
|         else if (sSpellSchool == "T") iSpellSchool = SPELL_SCHOOL_TRANSMUTATION;
 | |
| 
 | |
|         if (iSpellSchool == SPELL_SCHOOL_ENCHANTMENT || iSpellSchool == SPELL_SCHOOL_NECROMANCY || iSpellSchool == SPELL_SCHOOL_ILLUSION)
 | |
|         {
 | |
|         
 | |
|             if (iShadow > 29)   nSP = 10;
 | |
|             else if (iShadow > 26)  nSP = 9;
 | |
|             else if (iShadow > 23)  nSP = 8;
 | |
|             else if (iShadow > 20)  nSP = 7;
 | |
|             else if (iShadow > 17)  nSP = 6;
 | |
|             else if (iShadow > 14)  nSP = 5;
 | |
|             else if (iShadow > 11)  nSP = 4;
 | |
|             else if (iShadow > 8)   nSP = 3;
 | |
|             else if (iShadow > 5)   nSP = 2;
 | |
|             else if (iShadow > 2)   nSP = 1;
 | |
|         }
 | |
| 
 | |
| 
 | |
|     }
 | |
|     //SendMessageToPC(GetFirstPC(), "Your Spell Pen modifier is " + IntToString(nSP));
 | |
|     return nSP;
 | |
| }
 | |
| 
 | |
| int KOTCSpellPenVsDemons(object oCaster)
 | |
| {
 | |
| 	int nSP = 0;
 | |
| 	int iKOTC = GetLevelByClass(CLASS_TYPE_KNIGHT_CHALICE, oCaster);
 | |
| 	object oTarget = PRCGetSpellTargetObject();
 | |
| 	
 | |
| 	if (iKOTC >= 1)
 | |
|     	{
 | |
|     		if (MyPRCGetRacialType(oTarget) == RACIAL_TYPE_OUTSIDER)
 | |
|     		{
 | |
|     			if (GetAlignmentGoodEvil(oTarget) == ALIGNMENT_EVIL)
 | |
|     			{
 | |
| 				nSP = 2;
 | |
|     			}
 | |
|     		}
 | |
|     	}
 | |
|     	return nSP;
 | |
| }
 | |
| 
 | |
| int RunecasterRunePowerSP(object oCaster)
 | |
| {
 | |
| 	int nSP = 0;
 | |
| 	int nClass = GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster);
 | |
| 	if (nClass >= 2)
 | |
| 	{
 | |
|             if (nClass >= 30)        nSP = 10;
 | |
|             else if (nClass >= 27)   nSP = 9;
 | |
|             else if (nClass >= 24)   nSP = 8;
 | |
|             else if (nClass >= 21)   nSP = 7;
 | |
|             else if (nClass >= 18)   nSP = 6;
 | |
|             else if (nClass >= 15)   nSP = 5;
 | |
|             else if (nClass >= 12)   nSP = 4;
 | |
|             else if (nClass >= 9)    nSP = 3;
 | |
|             else if (nClass >= 5)    nSP = 2;
 | |
|             else if (nClass >= 2)    nSP = 1;
 | |
|         }
 | |
|         return nSP;
 | |
| }
 | |
| 
 | |
| int add_spl_pen(object oCaster = OBJECT_SELF)
 | |
| {
 | |
|     int spell_id = PRCGetSpellId();
 | |
|     int nSP = ElementalSavantSP(spell_id, oCaster);
 | |
|     nSP += GetHeartWarderPene(spell_id, oCaster);
 | |
|     nSP += RedWizardSP(spell_id, oCaster);
 | |
|     nSP += GetSpellPowerBonus(oCaster);
 | |
|     nSP += GetSpellPenetreFocusSchool(oCaster);
 | |
|     nSP += ShadowWeavePen(spell_id,oCaster);
 | |
|     nSP += KOTCSpellPenVsDemons(oCaster);
 | |
|     nSP += RunecasterRunePowerSP(oCaster);
 | |
|         
 | |
|     return nSP;
 | |
| }
 |