Updated all ToB maneuvers with saves to respect Blade Meditation. Added HasBladeMeditationForDiscipline() Expanded Witchborn Binder for epic progression. Fixed a few bugs around Vile Martial strike. Echo Spell shouldn't target self or items. Muckdweller should have a -6 STR. Added new Vile Martial feats to GetVileFeats(). Grappling something now removes invisibility. Started on Power Attack NUI. Starmantle shouldn't stack. Factotum & Shadow Thief of Amn require UMD checks for scroll casting.
		
			
				
	
	
		
			99 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*
 | |
|    ----------------
 | |
|    Firesnake
 | |
| 
 | |
|    tob_dw_frsnk.nss
 | |
|    ----------------
 | |
| 
 | |
|     19/08/07 by Stratovarius
 | |
| */ /** @file
 | |
| 
 | |
|     Firesnake
 | |
| 
 | |
|     Desert Wind (Strike) [Fire]
 | |
|     Level: Swordsage 4
 | |
|     Prerequisite: Two Desert Wind Maneuvers
 | |
|     Initiation Action: 1 Standard Action
 | |
|     Range: 60ft.
 | |
|     Area: Line
 | |
|     Duration: Instantaneous
 | |
|     Saving Throw: Reflex half
 | |
| 
 | |
|     You drive your weapon into the ground, causing a gout of fire to jet into the air.
 | |
|     The fire flows back to the ground and creeps ahead like a serpent, sweeping over
 | |
|     your enemies and roasting them where they stand.
 | |
|     
 | |
|     You create a line of fire that does 6d6 damage.
 | |
|     This is a supernatural maneuver.
 | |
| */
 | |
| 
 | |
| #include "tob_inc_move"
 | |
| #include "tob_movehook"
 | |
| ////#include "prc_alterations"
 | |
| 
 | |
| void main()
 | |
| {
 | |
|     if (!PreManeuverCastCode())
 | |
|     {
 | |
|     // If code within the PreManeuverCastCode (i.e. UMD) reports FALSE, do not run this spell
 | |
|         return;
 | |
|     }
 | |
| 
 | |
| // End of Spell Cast Hook
 | |
| 
 | |
|     object oInitiator    = OBJECT_SELF;
 | |
|     object oTarget       = PRCGetSpellTargetObject();
 | |
|     struct maneuver move = EvaluateManeuver(oInitiator, oTarget);
 | |
| 
 | |
|     if(move.bCanManeuver)
 | |
|     {
 | |
|     	location lTarget = PRCGetSpellTargetLocation();
 | |
|     	float fLength = FeetToMeters(60.0);
 | |
|     	vector vOrigin = GetPosition(oInitiator);
 | |
|     	int nDC = 14 + GetAbilityModifier(ABILITY_WISDOM, oInitiator);
 | |
| 		
 | |
| 		int nBladeMed = HasBladeMeditationForDiscipline(oInitiator, GetDisciplineByManeuver(PRCGetSpellId()));;
 | |
| 		if (nBladeMed)
 | |
| 		{
 | |
| 			nDC += 1;
 | |
| 		}	
 | |
| 		
 | |
|     	effect eVis = EffectVisualEffect(VFX_IMP_FLAME_M);
 | |
|             // Loop over targets in the line shape
 | |
|             oTarget = MyFirstObjectInShape(SHAPE_SPELLCYLINDER, fLength, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, vOrigin);
 | |
|             while(GetIsObjectValid(oTarget))
 | |
|             {
 | |
|                 if(oTarget != oInitiator &&
 | |
|                    spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oInitiator)
 | |
|                    )
 | |
|                 {
 | |
|                     // Let the AI know
 | |
|                     PRCSignalSpellEvent(oTarget, TRUE, move.nMoveId, oInitiator);
 | |
|                         // Roll damage
 | |
|                         int nDamage = d6(6);
 | |
|                         if (GetLocalInt(oInitiator, "DesertFire")) nDamage += d6();
 | |
| 
 | |
|                         // Adjust damage according to Reflex Save, Evasion or Improved Evasion
 | |
|                         nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, nDC, SAVING_THROW_TYPE_FIRE);
 | |
| 
 | |
|                         if(nDamage > 0)
 | |
|                         {
 | |
|                             float fDelay = GetDistanceBetweenLocations(GetLocation(oInitiator), lTarget) / 20.0f;
 | |
|                             effect eDamage = EffectDamage(nDamage, DAMAGE_TYPE_FIRE);
 | |
|                             DelayCommand(1.0f + fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget));
 | |
|                             DelayCommand(1.0f + fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
 | |
|                         }// end if - There was still damage remaining to be dealt after adjustments
 | |
|                 }// end if - Target validity check
 | |
| 
 | |
|                // Get next target
 | |
|                 oTarget = MyNextObjectInShape(SHAPE_SPELLCYLINDER, fLength, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, vOrigin);
 | |
|             }// end while - Target loop
 | |
|             
 | |
|             // Do some VFX
 | |
|             DelayCommand(0.5f, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oInitiator, 0.55));
 | |
|             DrawLineFromVectorToVector(DURATION_TYPE_INSTANT, VFX_IMP_SPELLF_FLAME, GetArea(oInitiator), GetPosition(oInitiator), GetPositionFromLocation(lTarget), 0.0,
 | |
|                                        FloatToInt(GetDistanceBetweenLocations(GetLocation(oInitiator), lTarget)), // One VFX every meter
 | |
|                                        0.5
 | |
|                                        );           
 | |
|     }
 | |
| } |