• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Bat Form v1.3

  • Like
  • Wow
Reactions: Cerocuel and Losam
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
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


Keywords:
skillshot, bat, form, vampire, dreadlord, travel, teleport, damage,
Contents

Just another Warcraft III map (Map)

Reviews
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. Your indexing is pretty...

Moderator

M

Moderator

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.

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
 
Level 29
Joined
Mar 10, 2009
Messages
5,016
The hero launches towards the target point...
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...
attachment.php


EDIT:
In any case, the spell looks great so Im rating it 4/5 unless changes made...
 

Attachments

  • Clipboard01.jpg
    Clipboard01.jpg
    52.9 KB · Views: 2,778
Level 16
Joined
Jun 24, 2009
Messages
1,409
I don't really know what is the deadline ~.~

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 :/
 
Level 6
Joined
May 4, 2012
Messages
187

:ogre_rage:
392174_392445337477592_1249219258_n.jpg

:ogre_rage:

----------------------------------------------------------------------

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. :ogre_frown:
 
Top