Projectile Spell Template Script

*Created by UUICEO.*

```
Using "RC_Core.rcm"

; Aftermath!

; Date/Time: 11:20:32 PM on 3/24/2009

; By UUICEO on RealityCrafters

;

; Spell Template for Standard
Projectile type spells

; This is the base script used in SCW for the damage
spells tab

;

Dim Reagent$(9, 1)

Dim HasReagent$(9)

Function Main()

   Attacker% = Actor()

   Target% =
ContextActor()

;

;==================================[Spell
Template Variables]=======================

;

;===================================================================================

;         Adjust Attacker Attributes                    =

;===================================================================================

   ReduceAttackerSpeed# = .25 ;Set this to the % you want the attackers
Speed

;               Attribute to be while casting, (zero to disable)

;-----------------------------------------------------------------------------------

   ManaCost% = 15 ;           Set this # to the amount of MANA the spell
will

;               Cost to Successfully cast

;===================================================================================

;         Movement Modifiers and requirements             =

;===================================================================================

   RequireStop% = 0 ;      Set this to 1 to force the caster to stop
while

;            casting this spell

;-----------------------------------------------------------------------------------

   NoMovement% = 1 ;      If set to 1 this option will cancel a spell being

;            cast if casters location changes durring casting

;===================================================================================

;         Multi-Projectile Spell                   =

;===================================================================================

;   Set this to something other than 1 to have the spell fire additional
projectiles

   MultiShot% = 5

;-----------------------------------------------------------------------------------

;   Set this value to the delay time (in Milliseconds) between shots for a
multi-shot spell

   MultiShotDelay% = 350

;===================================================================================

;         Chain Spell                         =

;===================================================================================

;   Set this to 1 too allow the cast projectile to hit multiple targets
after the initial hit

   IsChain% = 0

;===================================================================================

;         Spell Reagents needed to case spell             =

;===================================================================================

;   Set this to the total # of different items the caster is required to
have to case this spell, zero to disable

   ReagentsTotal% = 0

;-----------------------------------------------------------------------------------

;   Set these next values to the items the caster must have in their
inventory to cast this spell

;   Note that these should be items that are
expendable like roots or other such items (up to 10 items per spell)

;
 Also Note that you can also specify a Quantity of each item. leave at zero to
just make sure the caster has the item

;   but the item will not be removed
from the casters inventory.

;=-=-=-=-=-[Items]-=-=-=-=-=-=-=

 Reagent$(0, 0) = ""

   Reagent$(1, 0) = ""

   Reagent$(2, 0) = ""

 Reagent$(3, 0) = ""

   Reagent$(4, 0) = ""

   Reagent$(5, 0) = ""

 Reagent$(6, 0) = ""

   Reagent$(7, 0) = ""

   Reagent$(8, 0) = ""

 Reagent$(9, 0) = ""

;=-=-=-=-=-[Item QTY]-=-=-=-=-=

   Reagent$(0,
1) = "0"

   Reagent$(1, 1) = "0"

   Reagent$(2, 1) = "0"

 Reagent$(3, 1) = "0"

   Reagent$(4, 1) = "0"

   Reagent$(5, 1) = "0"

   Reagent$(6, 1) = "0"

   Reagent$(7, 1) = "0"

   Reagent$(8, 1) =
"0"

   Reagent$(9, 1) = "0"

;===================================================================================

;         Casting Animation and Animation Speed             =

;===================================================================================

;   Set this to the Animation to use for casting the Spell, 'NONE' to
disable

   CastingAnimation$ = "Default attack"

;-----------------------------------------------------------------------------------

;             Set this to the speed at which the animation should run (0.5 =
half speed)

   CastingAnimationSpeed# = 0.4

;===================================================================================

;           Set Casting Time (Delay)                   =

;===================================================================================

    CastingTime% = 2000 ;   Set this to = the amount of time you want
the

;               spell to take to cast (1000 = 1 second)

;===================================================================================

;            Set Min/Max distances and Range Modifications          =

;===================================================================================

   MinDistance# = 0.0 ;      Set this to the minimum distance a target
must be

;                  from the player to be able to use the spell

;-----------------------------------------------------------------------------------

   MaxDistance# = 80.0 ;   Set this to the maximum distance a target can be

;                  away from the attacker to be able to use the spell

;-----------------------------------------------------------------------------------

   UseRangeMod = 1.1 ;      Set this to a value you want to use as a
modifyer

;               multiplied against ability level, ZERO Disables

;-----------------------------------------------------------------------------------

   UseDamageMod = .75 ;      Set this to a value you want to use as a
modifyer

;               multiplied against ability level, ZERO Disables

;===================================================================================

;         Set Spell Damage Type                    =

;===================================================================================

   SpellDamageType% = 2 ;   Set the damage type so our output knows what
info

;               to display to the target and what resistances to

;
             to use when checking resistance.

;===================================================================================

;         Set Spell, Emitter and Projectile Names                 =

;===================================================================================

;    Change this to the name of the spell ability that is needed for
this spell

   SpellAbilityName$ = "FireBall"

;-----------------------------------------------------------------------------------

;   Change this to the name you want to be displayed for all output
messages, Leave Blank to use SpellAbilityName$

   SpellDisplayName$ = ""

;-----------------------------------------------------------------------------------

;   This is the Emitter to Attach to the Attacker while Casting the spell,
Leave Blank for NONE

   AttackerEmitterName$ = "MMCast"

;-----------------------------------------------------------------------------------

;      This is the emitter to attach to the target if the projectile hits
the Target, Leave Blank for NONE

   TargetEmitterName$ = "Explode"

;-----------------------------------------------------------------------------------

;   This is the name of the Projectile to use

   ProjectileName$ =
"Fireball"

;-----------------------------------------------------------------------------------

;     This is the ID of the texture to use for the AttackerEmitter (Casting
Spell Emitter Prior to Projectile Fireing)

   AttackerEmitterTextureID = 15

;-----------------------------------------------------------------------------------

;   This is the ID of the texture to use for the TargetEmitter (Projectile
HIT Target emitter)

   TargetEmitterTextureID = 109

;===================================================================================

;              Set Sound options                      =

;===================================================================================

;    Set this to 1 to allow for Casting and Hit sounds for this spell,
zero to disables

   UseSpellSounds% = 1

;-----------------------------------------------------------------------------------

;        Set this to the sounds GUE ID # that you want to use for the
CASTING sound, zero to disable

   CastingSoundID% = 3

;-----------------------------------------------------------------------------------

;                  Set this to the sounds GUE ID # that you want to use for
the PROJECTILE sound, zero to disable

   ProjectileSoundID% = 30

;
 -----------------------------------------------------------------------------------

;          Set this to the sounds GUE ID # that you want to use for the
Spell HITTING Target sound, zero to disable

   SpellHitSoundID% = 4

;===================================================================================

;         Set Screen Flash Options                   =

;===================================================================================

   FlashScreenAttacker% = 1 ;   Set this to 1 to flash the casters
screen when

;               the spell is cast, zero to disable the flash

;-----------------------------------------------------------------------------------

   FlashScreenTarget% = 1 ;   Set this to 1 to flash the targets screen if
the

;                spell makes a successfull hit

;-----------------------------------------------------------------------------------

   AttackerFlashTime% = 750 ;   Set the length of time the screen flash will
last

;               for the Attacker

;-----------------------------------------------------------------------------------

   TargetFlashTime% = 1000 ;   Set the length of time the screen flash will
last

;               for the Target

;-----------------------------------------------------------------------------------

   AttackerRED% = 255 ;      Set this to the RED value for the screen flash

;                        color of the Attacker

;-----------------------------------------------------------------------------------

   AttackerGREEN% = 20 ;   Set this to the GREEN value for the screen flash

;                  color of the Attacker

;-----------------------------------------------------------------------------------

   AttackerBLUE% = 10 ;      Set this to the BLUE value for the screen flash

;                         color of the Attacker

;-----------------------------------------------------------------------------------

   TargetRED% = 255 ;      Set this to the RED value for the screen flash

;               color of the Target

;-----------------------------------------------------------------------------------

   TargetGREEN% = 20 ;      Set this to the GREEN value for the screen flash

;               color of the Target

;-----------------------------------------------------------------------------------

   TargetBLUE% = 10 ;      Set this to the BLUE value for the screen flash

;                   color of the Target

;===================================================================================

;         Set Min/Max Damage of spell                   =

;===================================================================================

   MinDamage% = 10 ;      This is the minimum amount of (BASE) damage
the

;               spell will do on a successfull hit

;-----------------------------------------------------------------------------------

   MaxDamage% = 25 ;      This is the maximum amount of (BASE) damage the

;               spell will do on a successfull hit

;===================================================================================

;            BEGIN MAIN SPELL SCRIPT                 =

;===================================================================================

   If SpellDisplayName$ = "" Then SpellDisplayName$ = SpellAbilityName$

   If UseRangeMod <> 0 Then

      RangeMod =
Int(AbilityLevel(Attacker, SpellName$) * RangeMod)

      MaxDistance =
MaxDistance + (MaxDistance * RangeMod)

   Else

      RangeMod = 0

 EndIf

   If UseDamageMod <> 0 Then

      DamageMod =
AbilityLevel(Attacker, SpellName$) * 1.25

      MaxDamage = MaxDamage +
(MaxDamage * DamageMod)

   Else

      DamageMod = 0

   EndIf

 TargetDistance# = ActorDistance(Attacker, Target)

   AttackerNormalSpeed% =
Attribute(Attacker, "Speed")

;   Check for correct distance between
attacker and target

   If MinDistance > TargetDistance Then

 OutPut(Attacker, "Your target is too close to use that spell.", 255, 255, 255)

          Return

   ElseIf TargetDistance > MaxDistance Then

 OutPut(Attacker, "Your target is too far away to use that spell.", 255, 255,

      Return

   EndIf

;   Check for needed Reagents in
Attackers Backpack

   If ReagentsTotal <> 0

      For i = 0 to
ReagentsTotal

         If Reagent$(i, 0) <> ""

            If
Int(Reagent$(i,1)) = 0 And HasItem(Attacker, Reagent$(i, 0), 1) Then

       HasReagent$(i) = Reagent$(i, 0)

               Reagent$(i, 0) = ""

            ElseIf HasItem(Attacker, Reagent$(i, 0), Int(Reagent$(i, 1)))
Then

               HasReagent$(i) = Reagent$(i, 0)

 Reagent$(i, 0) = ""

            Else

               OutPut(Attacker,
"You are missing Reagents to be able to cast this spell.")

 Return

            EndIf

         EndIf

 Next

      For i = 0 to ReagentsTotal

         If HasReagent$(i)
<> "" Then

            If Reagent$(i, 1) <> 0 Then

       GiveItem(Attacker, HasReagent$(i), -(Int(Reagent$(i, 1))))

 EndIf

         EndIf

      Next

   EndIf

;   Reset
attackers speed if applicable

   If ReduceAttackerSpeed# <> 0 And
RequireStop = 0 Then

      AttackerSpeed# = AttackerNormalSpeed *
ReduceAttackerSpeed#

      SetAttribute(Attacker, "Speed",
Int(AttackerSpeed))

   ElseIf RequireStop = 1 Then

 SetAttribute(Attacker, "Speed", 0)

   EndIf

   CasterX# =
ActorX(Attacker)

   CasterY# = ActorY(Attacker)

   CasterZ# =
ActorZ(Attacker)

;   Give some game enhancing output

 Output(Attacker, "You begin casting " + SpellDisplayName$, 127, 255, 20)

;   Turn on Casting Emitter if applicable

   StartMS =
Millisecs()

   If AttackerEmitterName$ <> "" Then

 CreateEmitter(Attacker, AttackerEmitterName$, AttackerEmitterTextureID, 1000)

   EndIf

;   Turn on the casting sound if applicable

   If
UseSpellSounds <> 0 Then

      If CastingSoundID <> 0 Then

       PlaySound(Attacker, CastingSoundID, 1)

      EndIf

   EndIf

;      Start Casting Animation

   If Upper(CastingAnimation$)
<> "NONE" or CastingAnimation$ <> "" Then

 AnimateActor(Attacker, CastingAnimation$, CastingAnimationSpeed#)

   EndIf

;   Create the Casting time Progress Bar

   Pbar% =
CreateProgressBar(Attacker, 250, 175, 0, 0.39, 0.35, 0.2, 0.04, 100, 1,
"Gathering Magic Power")

   Clicks = 0

   DelayPeriod# = CastingTime /
100

   KillSpell = 0

;   Do our casting delay prior to shooting the
projectile(s)

   Repeat

      KillSpell = Checkmovement%(Attacker%,
CasterX#, CasterY#, CasterZ#, NoMovement%)

      If KillSpell = 1 Then

          DeleteProgressBar(Attacker, Pbar)

            OutPut(Attacker,
"Your Movement caused your spell to fail.")

 SetAttribute(Attacker, "Speed", AttackerNormalSpeed)

            Return

      EndIf

      If AttackerEmitterName$ <> "" Then

 CheckMS = Millisecs()

         If CheckMS > (StartMS + 1000) Then

          StartMS = CheckMS

            CheckMS = Millisecs()

 CreateEmitter(Attacker, AttackerEmitterName$, AttackerEmitterTextureID, 1000)

         EndIf

      EndIf

      Clicks = Clicks + 1

 DoEvents(DelayPeriod#)

      UpdateProgressBar(Attacker, Pbar, Clicks)

   Until Clicks = 100

   DeleteProgressBar(Attacker, Pbar)

;
 Fire the projectile(s)

   Repeat

;   Flash the attackers Screen
if applicable

      If FlashScreenAttacker And ActorIsHuman(Attacker)
Then

         ScreenFlash(Attacker, AttackerRED, AttackerGREEN,
AttackerBLUE, 200, AttackerFlashTime, 65535)

      EndIf

 TargetDistance# = ActorDistance(Attacker, Target)

;   Check for
movement of attacker

      KillSpell = Checkmovement%(Attacker%,
CasterX#, CasterY#, CasterZ#, NoMovement%)

      If KillSpell = 1 Then

          DeleteProgressBar(Attacker, Pbar)

            OutPut(Attacker,
"Your Movement caused your spell to end Early.")

 SetAttribute(Attacker, "Speed", AttackerNormalSpeed)

            Return

      EndIf

;   Turn on projectile being fired sound

 If  UseSpellSounds <> 0 Then

         If  ProjectileSoundID% <>
0 Then

            PlaySound(Attacker,  ProjectileSoundID, 1)

 EndIf

      EndIf

      FireProjectile(Attacker, Target,
ProjectileName$)

;   Track our projectile via a function (Shoot and
forget function)

      TrackProjectile(Attacker%, Target%, MultiShot%,
MaxDamage%, MinDamage%, TargetDistance#, DamageType%, FlashScreenTarget%,
TargetEmitterName$, TargetEmitterTextureID%, SpellHitSoundID%, UseSpellSounds%,
TargetRED%, TargetGREEN%, TargetBLUE%, TargetFlashTime%, AttackerNormalSpeed)

;   If this is a multiple projectile spell then do our delay before
repeating the process

      DoEvents(MultiShotDelay + 1)

 MultiShot = MultiShot - 1

   Until MultiShot < 1

;   Reset the
attackers speed to Normal

   SetAttribute(Attacker, "Speed",
AttackerNormalSpeed)

   Output(Attacker, "Exiting From Script")

 Output(Attacker, "Current Speed = " + Attribute(Attacker, "Speed"))

 Return

End Function

Function TrackProjectile(fAttacker%,
fTarget%, fMultiShot%, fMaxDamage%, fMinDamage%, fTargetDistance#, fDamageType%,
fFlashScreenTarget%, fTargetEmitterName$, fTargetEmitterTextureID,
fSpellHitSoundID, fUseSpellSounds, fTargetRED, fTargetGREEN, fTargetBLUE,
fTargetFlashTime, fAttackerNormalSpeed)

;   Add in a delay before we
check to see if we successfully hit our target and

;   Turn on the Target
hit Emitter

   If fMultiShot = 1 Then

      SetAttribute(fAttacker,
"Speed", fAttackerNormalSpeed)

   EndIf

   ProjectileDistanceTraveled =
fTargetDistance

   While ProjectileDistanceTraveled > 0

 DoEvents(100)

      ProjectileDistanceTraveled = ProjectileDistanceTraveled
- 4

   Wend

;   Flash the Targets Screen if applicable

   If
fFlashScreenTarget And ActorIsHuman(fTarget) Then

      ScreenFlash(fTarget,
fTargetRED, fTargetGREEN, fTargetBLUE, 200, fTargetFlashTime, 65535)

 EndIf

;    Add Target Emitter if applicable

   If
fTargetEmitterName$ <> "" Then

      CreateEmitter(fTarget,
fTargetEmitterName$, fTargetEmitterTextureID, 1000)

   EndIf

;   Add
Target Hit Sound

   If fUseSpellSounds <> 0 Then

      If
fSpellHitSoundID <> 0 Then

         PlaySound(fTarget,
fSpellHitSoundID, 1)

      EndIf

   EndIf

   ToHit% = 0

 ApplyDamage(fAttacker%, fTarget%, fDamageType%, fMinDamage, fMaxDamage)

Return

End Function

Function ApplyDamage(fAttacker%,
fTarget%, fDamageType%, fMinDamage, fMaxDamage)

   If fDamageType% = 1
Then

      DMGType$ = "NORMALFIRE"

      DMGOutput$ = "Fire"

   ElseIf fDamageType% = 2 Then

      DMGType$ = "MAGICFIRE"

      DMGOutput$ = "Magical Fire"

   ElseIf fDamageType% = 3 Then

      DMGType$ = "OTHERFIRE"

      DMGOutput$ = "Fire"

 ElseIf fDamageType% = 4 Then

      DMGType$ = "NORMALELECTRIC"

 DMGOutput$ = "Electrical"

   ElseIf fDamageType% = 5 Then

 DMGType$ = "MAGICELECTRIC"

      DMGOutput$ = "Magical Electric"

 ElseIf fDamageType% = 6 Then

      DMGType$ = "OTHERELECTRIC"

 DMGOutput$ = "Electrical"

   ElseIf fDamageType% = 7 Then

 DMGType$ = "NORMALWIND"

      DMGOutput$ = "Wind"

   ElseIf
fDamageType% = 8 Then

      DMGType$ = "MAGICWIND"

      DMGOutput$
= "Magical Wind"

   ElseIf fDamageType% = 9 Then

      DMGType$
= "OTHERWIND"

      DMGOutput$ = "Wind"

   ElseIf fDamageType% = 10
Then

      DMGType$ = "NORMALIMPACT"

      DMGOutput$ = "Impact"

   ElseIf fDamageType% = 11 Then

      DMGType$ = "MAGICIMPACT"

      DMGOutput$ = "Magical Impact"

   ElseIf fDamageType% = 12 Then

      DMGType$ = "OTHERIMPACT"

      DMGOutput$ = "Impact"

 ElseIf fDamageType% = 13 Then

      DMGType$ = "NORMALHOLY"

 DMGOutput$ = "Holy"

   ElseIf fDamageType% = 14 Then

 DMGType$ = "DIVINEHOLY"

      DMGOutput$ = "Divine Holy"

   ElseIf
fDamageType% = 15 Then

      DMGType$ = "OTHERHOLY"

      DMGOutput$
= "Holy"

   ElseIf fDamageType% = 16 Then

      DMGType$ =
"NORMALUNHOLY"

      DMGOutput$ = "UnHoly"

   ElseIf fDamageType% =
17 Then

      DMGType$ = "DIVINEUNHOLY"

      DMGOutput$ = "Divine
UnHoly"

   ElseIf fDamageType% = 18 Then

      DMGType$ =
"OTHERUNHOLY"

      DMGOutput$ = "UnHoly"

   ElseIf fDamageType% =
19 Then

      DMGType$ = "NONE"

      DMGOutput$ = "Other"

 ElseIf fDamageType% = 20 Then

      DMGType$ = "NONE"

 DMGOutput$ = "Other"

   EndIf

   If  SpecialMOD% < 0 Then

;      SpecialDMG$ = SpecialMOD%

   ElseIf fSpecialMOD% = 1 Then

   ElseIf fSpecialMOD% = 2 Then

   ElseIf fSpecialMOD% = 3 Then

   ElseIf fSpecialMOD% = 4 Then

   ElseIf fSpecialMOD% = 5 Then

   ElseIf fSpecialMOD% = 6 Then

   ElseIf fSpecialMOD% = 7 Then

   ElseIf fSpecialMOD% = 8 Then

   ElseIf fSpecialMOD% = 9 Then

   ElseIf fSpecialMOD% = 10 Then

   Else

 SpecialDMG$ = "NONE"

   EndIf

   TotalDamage% = Rand(1,
(fMaxDamage - fMinDamage)) + (fMinDamage - 1)

;               MyString$ =
DMGType$$ + "," + DMGOutput$+ "," + SpecialDMG$ + "," + fMinDamage% + "," +
fMaxDamage%

;         ThreadExecute("SpellDamage", "Main", fAttacker,
fTarget, MyString$)

   If Attribute(fTarget, "Health") < TotalDamage Then

      DeadMob = 1

      GiveXP(fAttacker, ActorLevel(fTarget) +
MaxAttribute(fTarget, "Health"))

;
 SetAttribute(fTarget, "Health", 0)

      KillActor(fTarget, fAttacker)

   Else

      SetAttribute(fTarget, "Health", Attribute(fTarget,
"Health") - TotalDamage)

   EndIf

;   SetResistance(Actor,
DamageType, Value)

;           Use this commands help to create resistance
script.

   Return

End Function

Function
Checkmovement%(fAttacker%, fCasterX#, fCasterY#, fCasterZ#, fNoMovement%)

   If fNoMovement <> 1 Then Return

   If ActorX(fAttacker)
<> fCasterX Then Return(1)

   If ActorY(fAttacker) <> fCasterY
Then Return(1)

   If ActorZ(fAttacker) <> fCasterZ Then Return(1)

   Return

End Function

```