skillshot, bat, form, vampire, dreadlord, travel, teleport, damage,
Type:
Target Ground
Category:
GUI / Triggers
My entry for The Legendary 2012 arena event. My opponent is defskull.
Description:
The hero launches towards the target point in form of a bat swarm dealing damage. The swarm will deal 8% less damage for each target hit, down to a minimum of 40% damage dealt.
This spell was greatly inspired by:
-Ezreal from League of Legends
-The Ancient Apparition from DotA
-Kain from Legacy of Kain
Spell type: Global Skillshot
Bat Form
Events
Unit - A unit Starts the effect of an ability
Conditions
(Ability being cast) Equal to Bat Form
Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
BTHas[BTLastRecycled] Equal to True
Then - Actions
Set BTMax = (BTMax + 1) Set BTIndex = BTMax
Else - Actions
Set BTIndex = BTLastRecycled Set BTLastRecycled = BTRecycledList[BTLastRecycled]
Set BTCaster[BTIndex] = (Triggering unit) Set BTCasterPoint[BTIndex] = (Position of BTCaster[BTIndex]) Set TempLoc = (Target point of ability being cast) Set BTAngle[BTIndex] = (Angle from BTCasterPoint[BTIndex] to TempLoc) Set BTDistance[BTIndex] = 0.00 Set BTAbiLevel[BTInteger] = (Level of Bat Form for BTCaster[BTIndex]) Set BTDamage[BTIndex] = (50.00 + (15.00 x (Real(BTAbiLevel[BTInteger])))) Set BTOriginalDamage[BTInteger] = BTDamage[BTInteger] Set BTDamageReduce[BTInteger] = (BTDamage[BTIndex] x 0.08) Set BTDone[BTIndex] = False Set BTStop[BTIndex] = False Set BTHas[BTIndex] = True Set BTCount = (BTCount + 1) Unit - Create 1 Target Pointer for (Triggering player) at BTCasterPoint[BTIndex] facing Default building facing degrees Set BTTargetPointer[BTIndex] = (Last created unit) Animation - Change BTTargetPointer[BTIndex]'s vertex coloring to (100.00%, 100.00%, 100.00%) with 50.00% transparency Unit - Pause BTTargetPointer[BTIndex] Unit - Make BTTargetPointer[BTIndex] Invulnerable Custom script: set udg_BTDMGGroup[udg_BTIndex] = CreateGroup() Custom script: call RemoveLocation (udg_TempLoc) Unit - Remove Bat Form from BTCaster[BTIndex] Unit - Add Bat Form Launch to BTCaster[BTIndex] If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Bat Form Loop <gen> is on) Equal to False
Then - Actions
Trigger - Turn on Bat Form Loop <gen>
Else - Actions
Bat Form Activate
Events
Unit - A unit Starts the effect of an ability
Conditions
(Ability being cast) Equal to Bat Form Launch
Actions
Set TempUnit = (Triggering unit) For each (Integer TempIntS) from 0 to BTMax, do (Actions)
Loop - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
TempUnit Equal to BTCaster[TempIntS]
Then - Actions
Custom script: call RemoveLocation (udg_BTCasterPoint[udg_TempIntS]) Set BTCasterPoint[TempIntS] = (Position of BTCaster[TempIntS]) Set BTTargetPoint[TempIntS] = (Position of BTTargetPointer[TempIntS]) Set BTAngle[TempIntS] = (Angle from BTCasterPoint[TempIntS] to BTTargetPoint[TempIntS]) Set BTMaxDistance[TempIntS] = BTDistance[TempIntS] Set BTDistance[TempIntS] = 0.00 Set BTStop[TempIntS] = True Unit - Remove Bat Form Launch from BTCaster[TempIntS] Unit - Add Bat Form to BTCaster[TempIntS] Unit - Set level of Bat Form for BTCaster[TempIntS] to BTAbiLevel[TempIntS] Unit - Pause BTCaster[TempIntS] Unit - Turn collision for BTCaster[TempIntS] Off Unit - Make BTCaster[TempIntS] Invulnerable Unit - Create 1 Swarm Dummy for (Owner of BTCaster[TempIntS]) at BTCasterPoint[TempIntS] facing BTAngle[TempIntS] degrees Set BTSwarm[TempIntS] = (Last created unit) Animation - Change BTSwarm[TempIntS]'s animation speed to 40.00% of its original speed Unit - Create 1 Bat Effect for (Owner of BTCaster[TempIntS]) at BTCasterPoint[TempIntS] facing BTAngle[TempIntS] degrees Animation - Change (Last created unit)'s animation speed to 300.00% of its original speed Unit - Kill (Last created unit) Sound - Play SacrificeUnit <gen> at 100.00% volume, attached to BTCaster[TempIntS]
Else - Actions
Bat Form Loop
Events
Time - Every 0.03 seconds of game time
Conditions Actions
For each (Integer BTInteger) from 0 to BTMax, do (Actions)
Loop - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
BTHas[BTInteger] Equal to True
Then - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
BTStop[BTInteger] Equal to False
Then - Actions
Set BTDistance[BTInteger] = (BTDistance[BTInteger] + 40.00) Set TempLoc = (BTCasterPoint[BTInteger] offset by BTDistance[BTInteger] towards BTAngle[BTInteger] degrees) If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
((Playable map area) contains TempLoc) Equal to True
Then - Actions
Unit - Move BTTargetPointer[BTInteger] instantly to TempLoc
Else - Actions
Custom script: call RemoveLocation (udg_BTCasterPoint[udg_BTInteger]) Set BTCasterPoint[BTInteger] = (Position of BTCaster[BTInteger]) Set BTTargetPoint[BTInteger] = (Position of BTTargetPointer[BTInteger]) Set BTAngle[BTInteger] = (Angle from BTCasterPoint[BTInteger] to BTTargetPoint[BTInteger]) Set BTMaxDistance[BTInteger] = BTDistance[BTInteger] Set BTDistance[BTInteger] = 0.00 Set BTStop[BTInteger] = True Unit - Remove Bat Form Launch from BTCaster[BTInteger] Unit - Add Bat Form to BTCaster[BTInteger] Unit - Set level of Bat Form for BTCaster[BTInteger] to BTAbiLevel[BTInteger] Unit - Turn collision for BTCaster[BTInteger] Off Unit - Pause BTCaster[BTInteger] Unit - Make BTCaster[BTInteger] Invulnerable Unit - Create 1 Swarm Dummy for (Owner of BTCaster[BTInteger]) at BTCasterPoint[BTInteger] facing BTAngle[BTInteger] degrees Set BTSwarm[BTInteger] = (Last created unit) Animation - Change BTSwarm[BTInteger]'s animation speed to 40.00% of its original speed Unit - Create 1 Bat Effect for (Owner of BTCaster[BTInteger]) at BTCasterPoint[BTInteger] facing BTAngle[BTInteger] degrees Animation - Change (Last created unit)'s animation speed to 300.00% of its original speed Unit - Kill (Last created unit) Sound - Play SacrificeUnit <gen> at 100.00% volume, attached to BTCaster[BTInteger]
Custom script: call RemoveLocation (udg_TempLoc)
Else - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
BTDone[BTInteger] Equal to False
Then - Actions
Set BTDistance[BTInteger] = (BTDistance[BTInteger] + 35.00) Set TempLoc = (BTCasterPoint[BTInteger] offset by BTDistance[BTInteger] towards BTAngle[BTInteger] degrees) Unit - Move BTCaster[BTInteger] instantly to TempLoc Unit - Move BTSwarm[BTInteger] instantly to TempLoc Animation - Change BTCaster[BTInteger]'s vertex coloring to (100.00%, 100.00%, 100.00%) with 100.00% transparency Custom script: set bj_wantDestroyGroup = true Unit Group - Pick every unit in (Units within 225.00 of TempLoc matching ((((Matching unit) is A structure) Equal to False) and ((((Matching unit) is Magic Immune) Equal to False) and (((((Matching unit) is alive) Equal to True) and (((Matching unit) is in BTDMGGroup[BTInteger]) Equal to Fa and do (Actions)
Loop - Actions
Unit Group - Add (Picked unit) to BTDMGGroup[BTInteger] Unit - Cause BTCaster[BTInteger] to damage (Picked unit), dealing BTDamage[BTInteger] damage of attack type Pierce and damage type Normal If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
BTDamage[BTInteger] Greater than (BTOriginalDamage[BTInteger] x 0.40)
Then - Actions
Set BTDamage[BTInteger] = (BTDamage[BTInteger] - BTDamageReduce[BTInteger])
Else - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
BTDistance[BTInteger] Greater than or equal to BTMaxDistance[BTInteger]
Then - Actions
Unit - Move BTCaster[BTInteger] instantly to TempLoc Set BTDone[BTInteger] = True Custom script: set bj_wantDestroyGroup = true Destructible - Pick every destructible within 200.00 of TempLoc and do (Actions)
Loop - Actions
Destructible - Kill (Picked destructible)
Else - Actions
Custom script: call RemoveLocation (udg_TempLoc)
Else - Actions
Unit - Turn collision for BTCaster[BTInteger] On Unit - Explode BTTargetPointer[BTInteger] Unit - Explode BTSwarm[BTInteger] Unit - Unpause BTCaster[BTInteger] Unit - Make BTCaster[BTInteger] Vulnerable Animation - Change BTCaster[BTInteger]'s vertex coloring to (100.00%, 100.00%, 100.00%) with 0.00% transparency Custom script: call DestroyGroup (udg_BTDMGGroup[udg_BTInteger]) Custom script: call RemoveLocation (udg_BTCasterPoint[udg_BTInteger]) Set BTCount = (BTCount - 1) Set BTHas[BTInteger] = False Set BTRecycledList[BTInteger] = BTLastRecycled Set BTLastRecycled = BTInteger If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
BTCount Equal to 0
Then - Actions
Set BTRecycledList[BTInteger] = 0 Set BTLastRecycled = 0 Set BTMax = 0 Trigger - Turn off (This trigger)
Else - Actions
Else - Actions
Changelog
v1.3
- Fixed sound
- Fixed effect problems when launched directly
- Now destroys destructibles at the destination
- Scaled damage circle to fit it more to the effect
v1.2
- Extra effects
- Changed sound
- Damage changes as targets are hit.
v1.1 - Fixed loop issue
v1.0 - Release
Rating - 4.00 (1 vote)
(Hover and click)
Moderator Comments
Useful
16:17, 3rd Aug 2012
Magtheridon96: Okay, there aren't any major problems at this point.
I'll still leave the Indexing tip in this review in case you want to update it to use a better form of indexing.
Still, good job.
Indexing tip
Your indexing is pretty much the same way I do indexing in vJass, but the iteration isn't as good as it could be. There are cases in which you'd be iterating over dead instances when you don't need to.
Try using a stack instead. All you need is one variable to store the number of running instances and arrays for all your data. (And another integer to use in the For each loop)
Allocation is done by incrementing the integer simply.
Deallocation is done like this:
set data1[currentInstanceInLoop] = data1[instancesRunningCount]
set data2[currentInstanceInLoop] = data2[instancesRunningCount]
etc...
set currentInstanceInLoop = currentInstanceInLoop - 1
set instancesRunningCount = instancesRunningCount - 1
no it doesnt, it travels towards the edge of the map at that angle, which causes bugs, the picture below shows the hero cant get out of the shaded area...
EDIT:
In any case, the spell looks great so Im rating it 4/5 unless changes made...
Forgot about this, I thought it will act like items with abilities, if you drop it and pick it up again it will still have a cooldown. I could fix that by using a different method but from what you said I guess I'm out of the deadline :/
__________________
People should learn how to say "Thanks" and how to give rep to those who helped them.....
Don't be a douche... I didn't know what the deadline is since I wasn't there.. Anyway this is just a spell, it took really nothing but 2-3 hours. It's not the world.
__________________
People should learn how to say "Thanks" and how to give rep to those who helped them.....
As you can see in the image, there is 2 heroes. But when I used the skill, it went over the border, and left the other hero. I tried it with the other one, but I didn't work. So only 1 hero left.