• 🏆 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!

Earth's Rampage v1.1a

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
Original Idea goes to gumx
He requested it at Orthane's Spell Workshop, I did the request.
I just added some touches of my own.

Description:
The caster taps into the tectonic energy beneath the earth, summoning forth multiple waves of pure-earth-energy lines in front of him, after which he reaches for his inner power, stomping with all his might, he summons a spiral made of the earth's energy.

Triggers:

  • ER Setup
    • Events
      • Time - Elapsed game time is 0.00 seconds
    • Conditions
    • Actions
      • -------- Configurables: --------
      • -------- ---------------------------------------------------- --------
      • -------- Number of stomps per wave per level: --------
      • Set ER_StompNumber[1] = 5
      • Set ER_StompNumber[2] = 6
      • Set ER_StompNumber[3] = 7
      • Set ER_StompNumber[4] = 8
      • -------- Number of waves per level: --------
      • Set ER_StompWaveNumber[1] = 6
      • Set ER_StompWaveNumber[2] = 7
      • Set ER_StompWaveNumber[3] = 8
      • Set ER_StompWaveNumber[4] = 9
      • -------- Amount of damage each stomp inflicts per level: --------
      • Set ER_StompDamage[1] = 50.00
      • Set ER_StompDamage[2] = 100.00
      • Set ER_StompDamage[3] = 150.00
      • Set ER_StompDamage[4] = 200.00
      • -------- Range of damage the stomps reach per level: --------
      • Set ER_StompAoE[1] = 200.00
      • Set ER_StompAoE[2] = 300.00
      • Set ER_StompAoE[3] = 400.00
      • Set ER_StompAoE[4] = 450.00
      • -------- Distance from the caster in which the stomps are created: --------
      • Set ER_StompIncrementDist[1] = 200.00
      • Set ER_StompIncrementDist[2] = 250.00
      • Set ER_StompIncrementDist[3] = 300.00
      • Set ER_StompIncrementDist[4] = 350.00
      • -------- ---------------------------------------------------- --------
      • -------- Spirals: --------
      • -------- Number of elements per spire: --------
      • Set ER_SpireElementNum[1] = 7
      • Set ER_SpireElementNum[2] = 8
      • Set ER_SpireElementNum[3] = 9
      • Set ER_SpireElementNum[4] = 10
      • -------- Number of spires: --------
      • Set ER_SpireNum[1] = 4
      • Set ER_SpireNum[2] = 5
      • Set ER_SpireNum[3] = 6
      • Set ER_SpireNum[4] = 7
      • -------- How far the spiiral is created from the caster: --------
      • Set ER_SpiralDistance[1] = 200.00
      • Set ER_SpiralDistance[2] = 250.00
      • Set ER_SpiralDistance[3] = 300.00
      • Set ER_SpiralDistance[4] = 350.00
      • -------- How far each spire are apart from each other: --------
      • Set ER_SpireDistance[1] = 50.00
      • Set ER_SpireDistance[2] = 60.00
      • Set ER_SpireDistance[3] = 67.00
      • Set ER_SpireDistance[4] = 75.00
      • -------- How much the spres curve: --------
      • Set ER_SpireCurve[1] = 9.00
      • Set ER_SpireCurve[2] = 10.00
      • Set ER_SpireCurve[3] = 11.00
      • Set ER_SpireCurve[4] = 12.00
      • -------- How much damage is inflicted by each element of the spire: --------
      • Set ER_SpireDamage[1] = 50.00
      • Set ER_SpireDamage[2] = 75.00
      • Set ER_SpireDamage[3] = 100.00
      • Set ER_SpireDamage[4] = 125.00
      • -------- The range the damage reaches: --------
      • Set ER_SpiralRangeDamage[1] = 200.00
      • Set ER_SpiralRangeDamage[2] = 300.00
      • Set ER_SpiralRangeDamage[3] = 400.00
      • Set ER_SpiralRangeDamage[4] = 450.00
      • -------- ---------------------------------------------------- --------
      • -------- End Configurables: --------



  • ER Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Earth's Rampage
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • ER_MaxIndex Equal to 0
        • Then - Actions
          • Trigger - Turn on ER Loop <gen>
        • Else - Actions
      • Set ER_MaxIndex = (ER_MaxIndex + 1)
      • Unit - Make ER_Caster[ER_MaxIndex] Invulnerable
      • Set ER_Caster[ER_MaxIndex] = (Triggering unit)
      • Set ER_ControlPlayer[ER_MaxIndex] = (Owner of ER_Caster[ER_MaxIndex])
      • Set ER_FinalReal[ER_MaxIndex] = 0.00
      • Set ER_Counter[ER_MaxIndex] = 0
      • Set ER_Counter2[ER_MaxIndex] = 0
      • Set ER_Level = (Level of Earth's Rampage for ER_Caster[ER_MaxIndex])



  • ER Loop
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • For each (Integer ER_CurrentIndex) from 1 to ER_MaxIndex, do (Actions)
        • Loop - Actions
          • Set ER_Counter[ER_CurrentIndex] = (ER_Counter[ER_CurrentIndex] + 1)
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • ER_Counter[ER_CurrentIndex] Equal to 33
            • Then - Actions
              • Set ER_Facing[ER_CurrentIndex] = (Facing of ER_Caster[ER_CurrentIndex])
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • ER_Counter2[ER_CurrentIndex] Equal to ER_StompWaveNumber[ER_Level]
                • Then - Actions
                  • Set ER_SomePoint = (Position of ER_Caster[ER_CurrentIndex])
                  • For each (Integer ER_TempInt2[1]) from 1 to ER_SpireElementNum[ER_Level], do (Actions)
                    • Loop - Actions
                      • For each (Integer ER_TempInt2[2]) from 1 to ER_SpireNum[ER_Level], do (Actions)
                        • Loop - Actions
                          • Unit - Create 1 ER_Dummy for ER_ControlPlayer[ER_CurrentIndex] at (ER_SomePoint offset by (ER_SpiralDistance[ER_Level] + (ER_SpireDistance[ER_Level] x (Real(ER_TempInt2[1])))) towards (((360.00 / (Real(ER_SpireNum[ER_Level]))) x (Real(ER_TempInt2[2]))) + (ER_SpireCurve[ER_Level] x (Real(ER_TempInt2[1])))) degrees) facing Default building facing degrees
                          • Set ER_SomeUnit = (Last created unit)
                          • Set ER_DummyPoint = (Position of ER_SomeUnit)
                          • Set ER_DummyGroup = (Units within ER_SpiralRangeDamage[ER_Level] of ER_DummyPoint matching (((Matching unit) belongs to an enemy of ER_ControlPlayer[ER_CurrentIndex]) Equal to True))
                          • Unit Group - Pick every unit in ER_DummyGroup and do (Actions)
                            • Loop - Actions
                              • Unit - Cause ER_Caster[ER_CurrentIndex] to damage (Picked unit), dealing ER_SpireDamage[ER_Level] damage of attack type Normal and damage type Normal
                          • Custom script: call RemoveLocation(udg_ER_DummyPoint)
                          • Custom script: call DestroyGroup(udg_ER_DummyGroup)
                  • -------- Recycling --------
                  • Custom script: call RemoveLocation(udg_ER_SomePoint)
                  • Custom script: call DestroyGroup(udg_ER_DummyGroup)
                  • Custom script: call RemoveLocation(udg_ER_TempPoint)
                  • Set ER_Caster[ER_CurrentIndex] = ER_Caster[ER_MaxIndex]
                  • Set ER_ControlPlayer[ER_CurrentIndex] = ER_ControlPlayer[ER_MaxIndex]
                  • Set ER_Counter2[ER_CurrentIndex] = ER_Counter2[ER_MaxIndex]
                  • Set ER_Counter[ER_CurrentIndex] = ER_Counter[ER_MaxIndex]
                  • Set ER_MaxIndex = (ER_MaxIndex - 1)
                  • Set ER_CurrentIndex = (ER_CurrentIndex - 1)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ER_MaxIndex Equal to 0
                    • Then - Actions
                      • Trigger - Turn off (This trigger)
                    • Else - Actions
                • Else - Actions
                  • For each (Integer ER_TempInt) from 1 to ER_StompNumber[ER_Level], do (Actions)
                    • Loop - Actions
                      • Set ER_SomePoint = (Position of ER_Caster[ER_CurrentIndex])
                      • Set ER_TempReal = (ER_TempReal + ER_StompIncrementDist[ER_Level])
                      • Set ER_TempPoint = (ER_SomePoint offset by ER_TempReal towards ER_Facing[ER_CurrentIndex] degrees)
                      • Unit - Create 1 ER_Dummy for ER_ControlPlayer[ER_CurrentIndex] at ER_TempPoint facing Default building facing degrees
                      • Set ER_SomeUnit = (Last created unit)
                      • Set ER_AoE = ER_StompAoE[ER_Level]
                      • Set ER_DummyPoint = (Position of ER_SomeUnit)
                      • Set ER_DummyGroup = (Units within ER_AoE of ER_DummyPoint matching (((Matching unit) belongs to an enemy of ER_ControlPlayer[ER_CurrentIndex]) Equal to True))
                      • Unit Group - Add ER_SomeUnit to ER_DummyGroup
                      • Unit Group - Pick every unit in ER_DummyGroup and do (Actions)
                        • Loop - Actions
                          • Unit - Cause ER_Caster[ER_CurrentIndex] to damage (Picked unit), dealing ER_StompDamage[ER_Level] damage of attack type Chaos and damage type Divine
                      • Custom script: call RemoveLocation(udg_ER_TempPoint)
                      • Custom script: call RemoveLocation(udg_ER_DummyPoint)
                      • Custom script: call RemoveLocation(udg_ER_SomePoint)
                      • Custom script: call DestroyGroup(udg_ER_DummyGroup)
              • Set ER_TempReal = 0.00
              • Set ER_Counter[ER_CurrentIndex] = 0
              • Set ER_Counter2[ER_CurrentIndex] = (ER_Counter2[ER_CurrentIndex] + 1)
            • Else - Actions


CREDITS:
Tank-Commander : Initial Helping with the Triggers
gumx : idea and concept



Changelog

Version 1.1a
-Caster is no longer de-selected upon casting

Version 1.1
-Made ER_ControlPlayer arrays, so now both are support MUI
-Spell now stores the facing of the caster in a variable
-Removed the timed life of the dummy unit
-No longer destroys non-existent groups
-cleaned other stuff

Version 1.0e
-Removed leaks after every iteration
-Made caster vulnerable while still unselectable, since he is on some kind of rampage.

Version 1.0d
-Removed the dummy-creation-offset leak.
-Removed the ER_Dummy and ER_StartPoint arrays, I turned them into the ER_SomeUnit and ER_SomePoint variable respectively.
-Removed the visibility of the dummy unit.
-Loaded the value of the ability's level into the Cast trigger instead of the loop.
-Deleted the extra actions of removing the caster from selection.
-Removed the action that removes the dummy from the group.

Version 1.0c
-Removed some leaks

Version 1.0b
Tweaked the triggers a little bit

Version 1.0a
-Uploaded the Spell


Keywords:
Earth, earth, Earth's Rampage, War Stomp spell, line war stomp, linear effects, spiral, MasterTrainer, spelll
Contents

Earth's Rampage (Map)

Reviews
12th Dec 2015 IcemanBo: Too long as NeedsFix. Rejected. Purgeandfire; 29th Aug 2014 Latest review (short): http://www.hiveworkshop.com/forums/2579640-post60.html BPower 16.03.2014...

Moderator

M

Moderator

12th Dec 2015
IcemanBo: Too long as NeedsFix. Rejected.

Purgeandfire; 29th Aug 2014

Latest review (short):
http://www.hiveworkshop.com/forums/2579640-post60.html

BPower 16.03.2014

http://www.hiveworkshop.com/forums/spells-569/earths-rampage-v1-0e-235480/index3.html#post2500190

BPower 4.03.2014
You're nested loop is leaking groups and locations like a broken battery.

Basically you lose controll of your hero, making him rampaging into the enemies, while the creep agro ignores you because you are invulnerable. I can see one ending up in a very shitty position with chances 100 to 1. A good name could be lottery rampage.
However wc3 modding is very various and maybe someone wants exactly this concept.


Earth's Rampage v1.0c | Reviewed by Maker | 10th Jun 2013
NEEDS FIX


126248-albums6177-picture66522.png


  • Load the ability level in the looping trigger from the variable
    you stored in the cast trigger
  • You have four actions to remove the caster from selection,
    you only need one
  • You leak the offset point when creating the dummy
126248-albums6177-picture66523.png


  • ER_StartPoint and ER_Dummy do not need to be arrays
  • Units with locust won't be picked by Pick units in range.
    There is no need to remove the unit from the group since
    it is never there
  • The dummy shouldn't give vision
[tr]



Earth's Rampage v1.0b | Reviewed by Maker | 6th Jun 2013
NEEDS FIX


126248-albums6177-picture66522.png


  • Leaks, the offset point when creating the dummy and ER_StartPoint
    that you set in ER Cast and overwrite in the looping trigger.
    Do a double check on any other possible leaks
[tr]
 
Level 20
Joined
Apr 14, 2012
Messages
2,901
effect seems nice and the triggering seems ok. I can't grade your triggers due fugly indexing which makes it unreadable for me.
I think it will be approvalbe after maker comes with 10 changes or so ;)

Sorry; I'm not really good when it comes to the proper indexing conventions. I'm also hoping of Maker's super-long review; it's one of the fun perks of spell making.
 
Level 29
Joined
Oct 24, 2012
Messages
6,543
@master, it's not your indexing that is wrong. It's the index in general that blows my mind.
that's why I use hashtables in every spell I make it's so much easier to read.

ooo wow umm i have a tutorial on it that should help lol. i believe thats were mastertrainer learned how to index. its in my gui tutorial. Things a GUIer Should Know. chapter is how to index. Its rather easy to understand.

Here is the principle of it.
to add things like a new instance of a spell u use the maxIndex number which u increase each time the spell is cast.

in the loop trigger u use a temp integer to loop from 1 to maxIndex.
then to de-index u move everything from maxIndex to the tempInteger ( current indexing number)
then u clean the last index up and null anything that needs to be nulled.
and finally reduce the maxIndex and the tempInteger (currentIndex)
then ur all done.
 
Level 29
Joined
Oct 24, 2012
Messages
6,543
The problem for me as said is not to understand or use it. My eyes hurt by reading the index. My bad who wrote "blows my mind" since that's not the case :p.

However I am grateful for informing me

ooo lol. oops. u can always make a tempInt called c.
then for the maxindex u could make a variable d = maxIndex and use that instead. i do that in my spells when i make them in jass / vJass.

@TO
the config should be changed to what how i told u earlier lol
 
Last edited:
Level 20
Joined
Apr 14, 2012
Messages
2,901
Has offset... do you mean this:

  • Unit - Create 1 ER_Dummy for ER_TempPlayer at (ER_StartPoint[ER_CurrentIndex] offset by (ER_SpiralDistance[ER_Level] + (ER_SpireDistance[ER_Level] x (Real(ER_TempInt2[1])))) towards (((360.00 / (Real(ER_SpireNum[ER_Level]))) x (Real(ER_TempInt2[2]))) + (ER_SpireCurve[ER_Level] x (Real(ER_TempInt2[1])))) facing Default building facing degrees
 
Last edited:
Level 33
Joined
Apr 24, 2012
Messages
5,113
This makes the caster not able to move, but it can still turn.
  • Custom script: call SetUnitPropWindow(unit, 0)

Store the value with GetUnitPropWindow(unit) before setting it to 0, and then load it to reset it.

And also make sure to index the value of GetUnitPropWindow. Something like:
  • Custom script: set udg_propWindow[udg_newIndex] = GetUnitPropWindow(udg_TempU)
  • Custom script: call SetUnitPropWindow(udg_TempU, 0)

Then after the spell ends:
  • Custom script: call SetUnitPropWindow(udg_TempU, udg_propWindow[udg_tempIndex])
 
Level 16
Joined
Dec 15, 2011
Messages
1,423
Oh EliTe help me out here: can you explain more on what Almia said?

Almia is saying that you need to attach the caster's prop window to the index being processed. Each unit has its own prop window value so you cannot use the GetUnitDefaultPropWindow () func here and you have to save it the same way you save values. When the spell ends, the unit's prop window will be set back to this value. He has explained the issue very clear there.

@Elite: Sorry, I posted on impulse.
 
  • Unit - Make ER_Caster[ER_MaxIndex] Invulnerable
  • Set ER_Caster[ER_MaxIndex] = (Triggering unit)
-->
  • Set ER_Caster[ER_MaxIndex] = (Triggering unit)
  • Unit - Make ER_Caster[ER_MaxIndex] Invulnerable
I don't see you make unit unit vulnerable again.

  • -------- Recycling --------
  • Custom script: call RemoveLocation(udg_ER_SomePoint)
  • Custom script: call DestroyGroup(udg_ER_DummyGroup) <---
  • Custom script: call RemoveLocation(udg_ER_TempPoint) <---
  • Custom script: call RemoveLocation(udg_ER_DummyPoint) <---
Why these actions? Only the line with "SomePoint" makes sense. Or not?
 
Level 20
Joined
Apr 14, 2012
Messages
2,901
  • Unit - Make ER_Caster[ER_MaxIndex] Invulnerable
  • Set ER_Caster[ER_MaxIndex] = (Triggering unit)
-->
  • Set ER_Caster[ER_MaxIndex] = (Triggering unit)
  • Unit - Make ER_Caster[ER_MaxIndex] Invulnerable
I don't see you make unit unit vulnerable again.

  • -------- Recycling --------
  • Custom script: call RemoveLocation(udg_ER_SomePoint)
  • Custom script: call DestroyGroup(udg_ER_DummyGroup) <---
  • Custom script: call RemoveLocation(udg_ER_TempPoint) <---
  • Custom script: call RemoveLocation(udg_ER_DummyPoint) <---
Why these actions? Only the line with "SomePoint" makes sense. Or not?

Interesting... but anyway:
I made my unit vulnerable since being invulnerable + unselectable seems unfair to some extent.


Custom script: call DestroyGroup(udg_ER_DummyGroup) <---
Custom script: call RemoveLocation(udg_ER_TempPoint) <---
Custom script: call RemoveLocation(udg_ER_DummyPoint) <---

These actions are, um, as you might say my backup plan, or ultimate cleaning of leaks solution. A desperate attempt to remove any remaining leaks.

Are they redundant since I've cleared those variables in the iterations before these actions?
 
Level 19
Joined
Mar 18, 2012
Messages
1,716
This line does not support MUI. Fix that.
  • Set ER_ControlPlayer = (Owner of ER_Caster[ER_MaxIndex])
In "Recycling" you attempt to destroy a group which does not exist.
Also you attempt to remove a location which does not exist.
  • Custom script: call DestroyGroup(udg_ER_DummyGroup)
In your last loop is something very wrong.
You apply timed life multiple times to the same unit. Furthermore you add that unit to the dummy unit to the unit group.
 

Kazeon

Hosted Project: EC
Level 33
Joined
Oct 12, 2011
Messages
3,449
effect seems nice and the triggering seems ok. I can't grade your triggers due fugly indexing which makes it unreadable for me.
I think it will be approvalbe after maker comes with 10 changes or so ;)

the indexing is pretty okay but I do find some.. :)
  • you need to give it index or it will causes bug
    • Set ER_ControlPlayer = (Owner of ER_Caster[ER_MaxIndex])
    • Set ER_Level = (Level of Earth's Rampage for ER_Caster[ER_MaxIndex])
  • oh, nested loop with unit enumeration inside it (I'm talking about the loop trigger)? it's a hard process for a simple looking spell, isn't it? can you find another lighter way?

  • store (Facing of ER_Caster[ER_CurrentIndex]) into a variable before looping
    • Set ER_TempPoint = (ER_SomePoint offset by ER_TempReal towards (Facing of ER_Caster[ER_CurrentIndex]) degrees
  • damage and attack type is better optional
    • Unit - Cause ER_Caster[ER_CurrentIndex] to damage (Picked unit), dealing ER_SpireDamage[ER_Level] damage of attack type Normal and damage type Normal
  • just like BPow said, you do it wrong
    • Unit Group - Pick every unit in ER_DummyGroup and do (Actions)
    • Loop - Actions
    • Unit - Cause ER_SomeUnit to damage (Picked unit), dealing ER_StompDamage[ER_Level] damage of attack type Chaos and damage type Divine
    • Unit - Add a 0.30 second Generic expiration timer to ER_SomeUnit
  • do you need to do it when ER_CurrentIndex is equal to ER_MaxIndex?
    • Set ER_Caster[ER_CurrentIndex] = ER_Caster[ER_MaxIndex]
    • Set ER_Counter2[ER_CurrentIndex] = ER_Counter2[ER_MaxIndex]
    • Set ER_Counter[ER_CurrentIndex] = ER_Counter[ER_MaxIndex]
  • and this part, you do it wrong too :p It will not makes the caster invul for the first cast
    • Unit - Make ER_Caster[ER_MaxIndex] Invulnerable
    • Set ER_Caster[ER_MaxIndex] = (Triggering unit)

This also leaks
  • (ER_SomePoint offset by (ER_SpiralDistance[ER_Level] + (ER_SpireDistance[ER_Level] x (Real(ER_TempInt2[1]))))
are you sure?
he is right, you are leaking location here
  • Unit - Create 1 ER_Dummy for ER_ControlPlayer at (ER_SomePoint offset by (ER_SpiralDistance[ER_Level] + (ER_SpireDistance[ER_Level] x (Real(ER_TempInt2[1]))))
 

Kazeon

Hosted Project: EC
Level 33
Joined
Oct 12, 2011
Messages
3,449
  • Unit - Create 1 ER_Dummy for ER_ControlPlayer[ER_CurrentIndex] at (ER_SomePoint offset by (ER_SpiralDistance[ER_Level] + (ER_SpireDistance[ER_Level] x (Real(ER_TempInt2[1])))) towards (((360.00 / (Real(ER_SpireNum[ER_Level]))) x (Real(ER_TempInt2[2]))) + (ER_SpireCurve[ER_Level] x (Real(ER_TempInt2[1])))) degrees) facing Default building facing degrees
leak
 
Top