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, 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