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.
		
			
				
	
	
		
			176 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //::///////////////////////////////////////////////
 | |
| //:: Dragonfire Adept Breath Effects
 | |
| //:: inv_adeptbreath.nss
 | |
| //::///////////////////////////////////////////////
 | |
| /*
 | |
|     Handles the breath effects for Dragonfire Adepts
 | |
| */
 | |
| //:://////////////////////////////////////////////
 | |
| //:: Created By: Fox
 | |
| //:: Created On: Jan 25, 2007
 | |
| //:://////////////////////////////////////////////
 | |
| 
 | |
| #include "prc_inc_spells"
 | |
| #include "prc_inc_breath"
 | |
| #include "inv_inc_invfunc"
 | |
| 
 | |
| void main()
 | |
| {
 | |
|     object oPC = OBJECT_SELF;
 | |
|     location lTarget = PRCGetSpellTargetLocation();
 | |
|     int nClass = GetLevelByClass(CLASS_TYPE_DRAGONFIRE_ADEPT, oPC);
 | |
|     //PrC arcane spellcasting levels grant damage dice and DC
 | |
|     nClass += GetInvocationPRCLevels(oPC);
 | |
|     int nDice = (nClass + 1) / 2;
 | |
|     int nSaveDCBonus = nClass / 2;
 | |
|     float fRange = nClass < 10 ? 30.0 : 60.0;
 | |
|     int nAlignment = GetAlignmentGoodEvil(oPC);
 | |
|     int nSpellID = GetSpellId();
 | |
|     int nLastEffectUsed = GetLocalInt(oPC, "LastBreathEffect");
 | |
|     struct breath BaseBreath;
 | |
|     
 | |
|     if(DEBUG) DoDebug("inv_adeptbreath: range: " + FloatToString(fRange));
 | |
| 
 | |
|     if(GetLocalInt(oPC, "AdeptTiamatLock"))
 | |
|     {
 | |
|         SendMessageToPC(oPC, "You cannot use your breath weapon again until next round");
 | |
|         return;
 | |
|     }
 | |
|     
 | |
|     if(nLastEffectUsed == nSpellID
 | |
|        && nSpellID != BREATH_SHAPED_BREATH
 | |
|        && nSpellID != BREATH_CLOUD_BREATH
 | |
|        && nSpellID != BREATH_ENDURING_BREATH)
 | |
|     {
 | |
|         SendMessageToPC(oPC, "You cannot use the same breath effect two rounds in a row.");
 | |
|         return;
 | |
|     }
 | |
|     
 | |
|     switch(nSpellID)
 | |
|     {
 | |
|         case BREATH_FIRE_CONE:
 | |
|              BaseBreath = CreateBreath(oPC, FALSE, fRange, DAMAGE_TYPE_FIRE, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_FIRE_LINE:
 | |
|              BaseBreath = CreateBreath(oPC, TRUE, fRange * 2, DAMAGE_TYPE_FIRE, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_FROST_CONE:
 | |
|              BaseBreath = CreateBreath(oPC, FALSE, fRange, DAMAGE_TYPE_COLD, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_ELECTRIC_LINE:
 | |
|              BaseBreath = CreateBreath(oPC, TRUE, fRange * 2, DAMAGE_TYPE_ELECTRICAL, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_SICKENING_CONE:
 | |
|              BaseBreath = CreateBreath(oPC, FALSE, fRange, -1, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_SICKENING, 0, SAVING_THROW_FORT);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_ACID_CONE:
 | |
|              BaseBreath = CreateBreath(oPC, FALSE, fRange, DAMAGE_TYPE_ACID, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_ACID_LINE:
 | |
|              BaseBreath = CreateBreath(oPC, TRUE, fRange * 2, DAMAGE_TYPE_ACID, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_SHAPED_BREATH:
 | |
|              if(GetLocalInt(oPC, "AdeptShapedBreath"))
 | |
|              {
 | |
|                  DeleteLocalInt(oPC, "AdeptShapedBreath");
 | |
|                  FloatingTextStringOnCreature("*Shaped Breath Removed*", oPC, FALSE);
 | |
|              }
 | |
|              else
 | |
|              {
 | |
|                  SetLocalInt(oPC, "AdeptShapedBreath", TRUE);
 | |
|                  FloatingTextStringOnCreature("*Shaped Breath Applied*", oPC, FALSE);
 | |
|              } break;
 | |
| 
 | |
|         case BREATH_SLOW_CONE:
 | |
|              BaseBreath = CreateBreath(oPC, FALSE, fRange, -1, 6, 2, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_SLOW, 0, SAVING_THROW_FORT);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_WEAKENING_CONE:
 | |
|              BaseBreath = CreateBreath(oPC, FALSE, fRange, -1, 6, 6, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_WEAKENING, 0, SAVING_THROW_FORT);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_CLOUD_BREATH:
 | |
|              if(GetLocalInt(oPC, "AdeptCloudBreath"))
 | |
|              {
 | |
|                  DeleteLocalInt(oPC, "AdeptCloudBreath");
 | |
|                  FloatingTextStringOnCreature("*Cloud Breath Removed*", oPC, FALSE);
 | |
|              }
 | |
|              else
 | |
|              {
 | |
|                  SetLocalInt(oPC, "AdeptCloudBreath", TRUE);
 | |
|                  FloatingTextStringOnCreature("*Cloud Breath Applied*", oPC, FALSE);
 | |
|              } break;
 | |
| 
 | |
|         case BREATH_ENDURING_BREATH:
 | |
|              if(GetLocalInt(oPC, "AdeptEnduringBreath"))
 | |
|              {
 | |
|                  DeleteLocalInt(oPC, "AdeptEnduringBreath");
 | |
|                  FloatingTextStringOnCreature("*Enduring Breath Removed*", oPC, FALSE);
 | |
|              }
 | |
|              else
 | |
|              {
 | |
|                  SetLocalInt(oPC, "AdeptEnduringBreath", TRUE);
 | |
|                  FloatingTextStringOnCreature("*Enduring Breath Applied*", oPC, FALSE);
 | |
|              } break;
 | |
| 
 | |
|         case BREATH_SLEEP_CONE:
 | |
|              BaseBreath = CreateBreath(oPC, FALSE, fRange, -1, 6, 1, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_SLEEP, 0, SAVING_THROW_WILL);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_THUNDER_CONE:
 | |
|              BaseBreath = CreateBreath(oPC, FALSE, fRange, DAMAGE_TYPE_SONIC, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0, SAVING_THROW_FORT);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_BAHAMUT_LINE:
 | |
|              //evil characters can't use this breath
 | |
|              if(nAlignment == ALIGNMENT_EVIL) return;
 | |
|              BaseBreath = CreateBreath(oPC, TRUE, fRange * 2, DAMAGE_TYPE_MAGICAL, 6, nDice * 2, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); 
 | |
|              if(nAlignment == ALIGNMENT_GOOD) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nClass * 2, DAMAGE_TYPE_POSITIVE, DAMAGE_POWER_ENERGY), oPC);
 | |
|              if(nAlignment == ALIGNMENT_NEUTRAL) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nClass * 4, DAMAGE_TYPE_POSITIVE, DAMAGE_POWER_ENERGY), oPC);
 | |
|              break;
 | |
| 
 | |
|         case BREATH_FORCE_LINE:
 | |
|              BaseBreath = CreateBreath(oPC, TRUE, fRange * 2, DAMAGE_TYPE_MAGICAL, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_PARALYZE_CONE:
 | |
|              BaseBreath = CreateBreath(oPC, FALSE, fRange, -1, 6, 1, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_PARALYZE, 0, SAVING_THROW_FORT);
 | |
|              ApplyBreath(BaseBreath, lTarget); break;
 | |
| 
 | |
|         case BREATH_FIVEFOLD_TIAMAT:
 | |
|              //good characters can't use this breath
 | |
|              if(nAlignment == ALIGNMENT_GOOD) return;
 | |
|              BaseBreath = CreateBreath(oPC, TRUE, fRange * 2, DAMAGE_TYPE_ACID, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); 
 | |
|              BaseBreath = CreateBreath(oPC, TRUE, fRange * 2, DAMAGE_TYPE_ELECTRICAL, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); 
 | |
|              BaseBreath = CreateBreath(oPC, FALSE, fRange, DAMAGE_TYPE_ACID, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); 
 | |
|              BaseBreath = CreateBreath(oPC, FALSE, fRange, DAMAGE_TYPE_COLD, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); 
 | |
|              BaseBreath = CreateBreath(oPC, FALSE, fRange, DAMAGE_TYPE_FIRE, 6, nDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_NORMAL, 0);
 | |
|              ApplyBreath(BaseBreath, lTarget); 
 | |
|              if(nAlignment == ALIGNMENT_EVIL) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nClass * 2, DAMAGE_TYPE_POSITIVE, DAMAGE_POWER_ENERGY), oPC);
 | |
|              if(nAlignment == ALIGNMENT_NEUTRAL) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nClass * 4, DAMAGE_TYPE_POSITIVE, DAMAGE_POWER_ENERGY), oPC);
 | |
|              SetLocalInt(oPC, "AdeptTiamatLock", TRUE);
 | |
|              DelayCommand(6.0, DeleteLocalInt(oPC, "AdeptTiamatLock"));
 | |
|              break;
 | |
|     }
 | |
| 
 | |
|     //Mark the breath effect as used.
 | |
|     if(nSpellID != BREATH_SHAPED_BREATH
 | |
|        && nSpellID != BREATH_CLOUD_BREATH
 | |
|        && nSpellID != BREATH_ENDURING_BREATH)
 | |
|     {
 | |
|        SetLocalInt(oPC, "LastBreathEffect", nSpellID);
 | |
|        DelayCommand(6.0, DeleteLocalInt(oPC, "LastBreathEffect"));
 | |
|     }
 | |
| } |