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

DEMONIC RAGE

This bundle is marked as awaiting update. A staff member has requested changes to it before it can be approved.
The hero calls down the devil to aid him, who transforms him into an unstoppable death machine that kills anything standing its way.
This is my first spell, hope you like it :).



Special thanks to
_Guhun_
for explaining the issue to me



Chronosphere model by: PGRU-Unexpected

Triggers:
  • Demonic Rage Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Caster Unit-Type --------
      • -------- ----------------------------- --------
      • Set Demonic_CasterType = Tester
      • -------- In case of more than 1 unit-type with this ability --------
      • Set Demonic_CasterType2 = No unit-type
      • Set Demonic_CasterType3 = No unit-type
      • Set Demonic_CasterType4 = No unit-type
      • Set Demonic_CasterType5 = No unit-type
      • -------- you can easily add more types, by just editing the main trigger's conditions --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Damage dealt to enemies.__________________________ --------
      • -------- ----------------------------- --------
      • Set Demonic_Damage = 200.00
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Duration of the ability --------
      • -------- ----------------------------- --------
      • Set Demonic_AbilityDuration = 60.00
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Area of Effect(AOE).______________________ --------
      • -------- ----------------------------- --------
      • Set Demonic_Radius = 850.00
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Damage over time Radius(1/don't change it) and the real Damage (2)_________ --------
      • -------- ----------------------------- --------
      • Set DemonicTimeRadius = 530.00
      • -------- ----------------------------- --------
      • Set Demonic_DamageOverTime = 50.00
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Ending damage____________________ --------
      • -------- ----------------------------- --------
      • Set Demonic_Ending_Damage = 300.00
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Strength, Agility and Intelligence gained and the rate of increase per level___________ --------
      • -------- ----------------------------- --------
      • Set Demonic_Strength_Gained = 10
      • -------- ----------------------------- --------
      • Set Demonic_Agility_Gained = 10
      • -------- ----------------------------- --------
      • Set Demonic_Intelligence_Gained = 10
      • -------- ----------------------------- --------
      • Set Demonic_Agility_Rule = 10
      • -------- ----------------------------- --------
      • Set Demonic_Strength_Rule = 10
      • -------- ----------------------------- --------
      • Set Demonic_Intelligence_Rule = 10
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Speed gained______________________ --------
      • -------- ----------------------------- --------
      • Set Demonic_Speed_bonus = 300.00
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Main dummies timer___________________ --------
      • -------- ----------------------------- --------
      • Set Demonic_Effectdummies_timer = 63.00
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Lesser wind duration (damage per second)__________ --------
      • -------- ----------------------------- --------
      • Set Demonic_LesserWind_duration = 0.40
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Initial Damage levels______________________ --------
      • -------- ----------------------------- --------
      • Set Demonic_LVL_Main = 100.00
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Repeated damage levels (loop)______________ --------
      • -------- ----------------------------- --------
      • Set Demonic_LVL_Loop = 34.00
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- Special effects' frequency part 1 --------
      • Set Demonic_SpecialEffects = 0.12
      • -------- ----------------------------- --------
      • -------- Special effects' frequency part 2 (includes the lesser periodic damage) --------
      • Set Demonic_SpecialEffects2 = 0.33
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • Set Demonic_Damage_Type = Universal
      • Set Demonic_Attack_Type = Chaos
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- To change the time of the spell go to Demonic Rage trigger, last "Set" action. --------
      • -------- The main skill's timer (time taken for the ability to end.)Default: 63____________ --------
      • -------- You have to decrease the time in Object Editor --> Spell --------
      • -------- Rule: write the time --> Desired Time + 3 --------
      • -------- Example: If you want 20 secs, write 20 in Object Editor and 23 here. --------
      • -------- Note: Don't forget to change the duration of the Main Effects (same rule). --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
      • -------- ----------------------------- --------
  • Demonic Rage
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to DEMONIC RAGE
      • Or - Any (Conditions) are true
        • Conditions
          • (Unit-type of (Triggering unit)) Equal to Demonic_CasterType
          • (Unit-type of (Triggering unit)) Equal to Demonic_CasterType2
          • (Unit-type of (Triggering unit)) Equal to Demonic_CasterType3
          • (Unit-type of (Triggering unit)) Equal to Demonic_CasterType4
          • (Unit-type of (Triggering unit)) Equal to Demonic_CasterType5
    • Actions
      • -------- IMPORTANT SYSTEM PART START --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • Demonic_timer Equal to 0
        • Then - Actions
          • Trigger - Turn on Demonic Rage Loop <gen>
        • Else - Actions
      • -------- Increase the index size --------
      • Set Demonic_timer = (Demonic_timer + 1)
      • -------- Dynamic Index --------
      • -------- Dynamic Index End --------
      • -------- Setup those arrays --------
      • Set Demonic_TempPoint[Demonic_timer] = (Position of (Triggering unit))
      • Set Demonic_Caster[Demonic_timer] = (Triggering unit)
      • Set Demonic_Total_Strength[Demonic_timer] = 0
      • Set Demonic_Total_Agility[Demonic_timer] = 0
      • Set Demonic_Total_Intelligence[Demonic_timer] = 0
      • Set LVL_Demonic[Demonic_timer] = (Level of DEMONIC RAGE for Demonic_Caster[Demonic_timer])
      • Set Demonic_SpellTime[Demonic_timer] = 60.00
      • Unit - Create 1 Dummy (big) for Neutral Passive at Demonic_TempPoint[Demonic_timer] facing Default building facing degrees
      • Unit - Add a Demonic_Effectdummies_timer second Generic expiration timer to (Last created unit)
      • Unit - Create 1 Dummy (crono) for Neutral Passive at Demonic_TempPoint[Demonic_timer] facing Default building facing degrees
      • Unit - Add a Demonic_Effectdummies_timer second Generic expiration timer to (Last created unit)
      • Unit - Create 1 Dummy (small) for Neutral Passive at Demonic_TempPoint[Demonic_timer] facing Default building facing degrees
      • Unit - Add a Demonic_Effectdummies_timer second Generic expiration timer to (Last created unit)
      • Unit - Create 1 Dummy2 (raising skull/howl) for Neutral Passive at Demonic_TempPoint[Demonic_timer] facing Default building facing degrees
      • Unit - Add a 2.00 second Generic expiration timer to (Last created unit)
      • Unit - Set Demonic_Caster[Demonic_timer] movement speed to ((Current movement speed of Demonic_Caster[Demonic_timer]) + Demonic_Speed_bonus)
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within Demonic_Radius of Demonic_TempPoint[Demonic_timer]) and do (Actions)
        • Loop - Actions
          • Set Demonic_pickedunits = (Picked unit)
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Demonic_pickedunits is Magic Immune) Equal to False
              • (Demonic_pickedunits belongs to an enemy of (Owner of Demonic_Caster[Demonic_timer])) Equal to True
            • Then - Actions
              • Unit - Cause Demonic_Caster[Demonic_timer] to damage Demonic_pickedunits, dealing (Demonic_Damage + (Demonic_LVL_Main x (Real(LVL_Demonic[Demonic_timer])))) damage of attack type Demonic_Attack_Type and damage type Demonic_Damage_Type
            • Else - Actions
  • Demonic Rage Loop
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • For each (Integer Demonic_LoopIndex) from 1 to Demonic_timer, do (Actions)
        • Loop - Actions
          • Set TempInt = Demonic_LoopIndex
          • Set DemonicPoint = (Position of Demonic_Caster[Demonic_LoopIndex])
          • Set Dem_Rage_Timer3[TempInt] = (Dem_Rage_Timer3[TempInt] + 0.03)
          • Set Dem_Rage_Timer2[TempInt] = (Dem_Rage_Timer2[TempInt] + 0.03)
          • Set Dem_Rage_Timer[TempInt] = (Dem_Rage_Timer[TempInt] + 0.03)
          • -------- Condition... --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Dem_Rage_Timer3[TempInt] Equal to Demonic_SpecialEffects
            • Then - Actions
              • Set Dem_Rage_Timer3[TempInt] = 0.00
              • Set Demonic_Temp_Point = (DemonicPoint offset by (180.00, 0.00))
              • Unit - Create 1 Dummy3 for Neutral Passive at Demonic_Temp_Point facing Default building facing degrees
              • Unit - Add a 0.01 second Generic expiration timer to (Last created unit)
              • Custom script: call RemoveLocation(udg_Demonic_Temp_Point)
              • Set Demonic_Temp_Point = (DemonicPoint offset by (0.00, 180.00))
              • Unit - Create 1 Dummy3 for Neutral Passive at Demonic_Temp_Point facing Default building facing degrees
              • Unit - Add a 0.01 second Generic expiration timer to (Last created unit)
              • Custom script: call RemoveLocation(udg_Demonic_Temp_Point)
              • Set Demonic_Temp_Point = (DemonicPoint offset by (-180.00, 0.00))
              • Unit - Create 1 Dummy3 for Neutral Passive at Demonic_Temp_Point facing Default building facing degrees
              • Unit - Add a 0.01 second Generic expiration timer to (Last created unit)
              • Custom script: call RemoveLocation(udg_Demonic_Temp_Point)
              • Set Demonic_Temp_Point = (DemonicPoint offset by (0.00, -180.00))
              • Unit - Create 1 Dummy3 for Neutral Passive at Demonic_Temp_Point facing Default building facing degrees
              • Unit - Add a 0.01 second Generic expiration timer to (Last created unit)
              • Custom script: call RemoveLocation(udg_Demonic_Temp_Point)
            • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Dem_Rage_Timer2[TempInt] Equal to Demonic_SpecialEffects2
            • Then - Actions
              • Set Dem_Rage_Timer2[TempInt] = 0.00
              • Unit - Create 1 Dummy (small) for Neutral Passive at DemonicPoint facing Default building facing degrees
              • Unit - Add a Demonic_LesserWind_duration second Generic expiration timer to (Last created unit)
              • Unit - Create 1 Dummy2 (lightning) for Neutral Passive at DemonicPoint facing Default building facing degrees
              • Unit - Add a 1.00 second Generic expiration timer to (Last created unit)
              • Unit Group - Pick every unit in (Units within DemonicTimeRadius of DemonicPoint) and do (Actions)
                • Loop - Actions
                  • Set Demonic_pickedunits = (Picked unit)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Demonic_pickedunits is Magic Immune) Equal to False
                      • (Demonic_pickedunits is dead) Equal to False
                      • (Demonic_pickedunits belongs to an enemy of (Owner of Demonic_Caster[TempInt])) Equal to True
                    • Then - Actions
                      • Unit - Cause Demonic_Caster[TempInt] to damage Demonic_pickedunits, dealing (Demonic_DamageOverTime + (Demonic_LVL_Loop x (Real(LVL_Demonic[Demonic_LoopIndex])))) damage of attack type Demonic_Attack_Type and damage type Demonic_Damage_Type
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Demonic_pickedunits is dead) Equal to True
                        • Then - Actions
                          • Set Demonic_Temp_Point = (Position of Demonic_pickedunits)
                          • Unit - Create 1 Dummy4 for Neutral Passive at Demonic_Temp_Point facing Default building facing degrees
                          • Custom script: call RemoveLocation(udg_Demonic_Temp_Point)
                          • Unit - Add a 0.01 second Generic expiration timer to (Last created unit)
                        • Else - Actions
                    • Else - Actions
            • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Dem_Rage_Timer[TempInt] Greater than or equal to 0.99
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • Demonic_SpellTime[TempInt] Greater than 0.00
                • Then - Actions
                  • -------- Actions --------
                  • Unit - Create 1 Dummy (small) for Neutral Passive at DemonicPoint facing Default building facing degrees
                  • Unit - Add a Demonic_LesserWind_duration second Generic expiration timer to (Last created unit)
                  • Unit - Create 1 Dummy2 (lightning) for Neutral Passive at DemonicPoint facing Default building facing degrees
                  • Unit - Add a 1.00 second Generic expiration timer to (Last created unit)
                  • Unit Group - Pick every unit in (Units within DemonicTimeRadius of DemonicPoint) and do (Actions)
                    • Loop - Actions
                      • Set Demonic_pickedunits = (Picked unit)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Demonic_pickedunits is Magic Immune) Equal to False
                          • (Demonic_pickedunits is dead) Equal to False
                          • (Demonic_pickedunits belongs to an enemy of (Owner of Demonic_Caster[TempInt])) Equal to True
                        • Then - Actions
                          • Unit - Cause Demonic_Caster[TempInt] to damage Demonic_pickedunits, dealing (Demonic_DamageOverTime + (Demonic_LVL_Loop x (Real(LVL_Demonic[Demonic_LoopIndex])))) damage of attack type Demonic_Attack_Type and damage type Demonic_Damage_Type
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Demonic_pickedunits is dead) Equal to True
                            • Then - Actions
                              • Set Demonic_Temp_Point = (Position of Demonic_pickedunits)
                              • Unit - Create 1 Dummy4 for Neutral Passive at Demonic_Temp_Point facing Default building facing degrees
                              • Custom script: call RemoveLocation(udg_Demonic_Temp_Point)
                              • Unit - Add a 0.01 second Generic expiration timer to (Last created unit)
                            • Else - Actions
                        • Else - Actions
                  • Hero - Modify Agility of Demonic_Caster[TempInt]: Add (Demonic_Agility_Gained + (Demonic_Agility_Rule x LVL_Demonic[TempInt]))
                  • Set Demonic_Total_Agility[TempInt] = (Demonic_Total_Agility[TempInt] + (Demonic_Agility_Gained + (LVL_Demonic[TempInt] x Demonic_Agility_Rule)))
                  • Hero - Modify Strength of Demonic_Caster[TempInt]: Add (Demonic_Strength_Gained + (Demonic_Strength_Rule x LVL_Demonic[TempInt]))
                  • Set Demonic_Total_Strength[TempInt] = (Demonic_Total_Strength[TempInt] + (Demonic_Strength_Gained + (LVL_Demonic[TempInt] x Demonic_Strength_Rule)))
                  • Hero - Modify Intelligence of Demonic_Caster[TempInt]: Add (Demonic_Intelligence_Gained + (Demonic_Intelligence_Rule x LVL_Demonic[TempInt]))
                  • Set Demonic_Total_Intelligence[TempInt] = (Demonic_Total_Intelligence[TempInt] + (Demonic_Intelligence_Gained + (LVL_Demonic[TempInt] x Demonic_Intelligence_Rule)))
                  • Custom script: set bj_wantDestroyGroup = true
                  • Unit Group - Pick every unit in (Units within Demonic_Radius of Demonic_TempPoint[TempInt]) and do (Actions)
                    • Loop - Actions
                      • Set Demonic_pickedunits = (Picked unit)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Demonic_pickedunits is Magic Immune) Equal to False
                          • (Demonic_pickedunits belongs to an enemy of (Owner of Demonic_Caster[TempInt])) Equal to True
                        • Then - Actions
                          • Unit - Cause Demonic_Caster[TempInt] to damage Demonic_pickedunits, dealing (Demonic_Damage + (Demonic_LVL_Main x (Real(LVL_Demonic[TempInt])))) damage of attack type Demonic_Attack_Type and damage type Demonic_Damage_Type
                        • Else - Actions
                  • Set Demonic_SpellTime[TempInt] = (Demonic_SpellTime[TempInt] - 0.99)
                  • Set Dem_Rage_Timer[TempInt] = 0.00
                • Else - Actions
                  • Set DemonicPoint = (Position of Demonic_Caster[TempInt])
                  • Hero - Modify Agility of Demonic_Caster[TempInt]: Subtract Demonic_Total_Agility[TempInt]
                  • Set Demonic_Total_Agility[TempInt] = 0
                  • Hero - Modify Strength of Demonic_Caster[TempInt]: Subtract Demonic_Total_Strength[TempInt]
                  • Set Demonic_Total_Strength[TempInt] = 0
                  • Hero - Modify Intelligence of Demonic_Caster[TempInt]: Subtract Demonic_Total_Intelligence[TempInt]
                  • Set Demonic_Total_Intelligence[TempInt] = 0
                  • Unit - Set Demonic_Caster[TempInt] movement speed to (Default movement speed of Demonic_Caster[TempInt])
                  • Unit - Create 1 Dummy (big) for Neutral Passive at DemonicPoint facing Default building facing degrees
                  • Unit - Add a 1.00 second Generic expiration timer to (Last created unit)
                  • Custom script: set bj_wantDestroyGroup = true
                  • Unit Group - Pick every unit in (Units within Demonic_Radius of DemonicPoint) and do (Actions)
                    • Loop - Actions
                      • Set Demonic_pickedunits = (Picked unit)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Demonic_pickedunits is Magic Immune) Equal to False
                          • (Demonic_pickedunits belongs to an enemy of (Owner of Demonic_Caster[Demonic_LoopIndex])) Equal to True
                        • Then - Actions
                          • Unit - Cause Demonic_Caster[Demonic_LoopIndex] to damage Demonic_pickedunits, dealing Demonic_Ending_Damage damage of attack type Demonic_Attack_Type and damage type Demonic_Damage_Type
                        • Else - Actions
                  • Custom script: call RemoveLocation(udg_Demonic_TempPoint[udg_TempInt])
                  • -------- IMPORTANT SYSTEM PART START --------
                  • Set Demonic_TempPoint[Demonic_LoopIndex] = Demonic_TempPoint[Demonic_timer]
                  • Set Demonic_Caster[Demonic_LoopIndex] = Demonic_Caster[Demonic_timer]
                  • Set Demonic_Total_Strength[Demonic_LoopIndex] = Demonic_Total_Strength[Demonic_timer]
                  • Set Demonic_Total_Agility[Demonic_LoopIndex] = Demonic_Total_Agility[Demonic_timer]
                  • Set Demonic_Total_Intelligence[Demonic_LoopIndex] = Demonic_Total_Intelligence[Demonic_timer]
                  • Set Demonic_SpellTime[Demonic_LoopIndex] = Demonic_SpellTime[Demonic_timer]
                  • Set LVL_Demonic[Demonic_LoopIndex] = LVL_Demonic[Demonic_timer]
                  • Set Dem_Rage_Timer3[Demonic_LoopIndex] = (Dem_Rage_Timer3[Demonic_timer] + 0.00)
                  • Set Dem_Rage_Timer2[Demonic_LoopIndex] = (Dem_Rage_Timer2[Demonic_timer] + 0.00)
                  • Set Dem_Rage_Timer[Demonic_LoopIndex] = (Dem_Rage_Timer[Demonic_timer] + 0.00)
                  • -------- RecycleIndex --------
                  • Set Demonic_timer = (Demonic_timer - 1)
                  • Set Demonic_LoopIndex = (Demonic_LoopIndex - 1)
                  • -------- Turn the trigger again off if the index_size is below 0... --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • Demonic_timer Equal to 0
                    • Then - Actions
                      • Trigger - Turn off (This trigger)
                    • Else - Actions
            • Else - Actions
      • Custom script: call RemoveLocation(udg_DemonicPoint)

How to import: Copy dummies, triggers, spell and files in import section.



Hope you like it.

Update 1.1:fixed some leaks.Special Thanks to EdgeOfChaos for helping me fixing them.
Update 1.2:Fixed all leaks.Special Thanks to EdgeOfChaos for helping me fixing them.Also deleted the strength bonus.
Update 2.0:Many things changed.3 more triggers,new effect and dummy and Damage Over Time(Every 2 seconds Damage occurs) appearing in the hero location(not where the spell is casted,it is where the hero is).

2016:
Update 3.0: Well I'm back after 2 years with bigger imagination. I cant describe everything so you should try it better than reading. Added 2 effects, made everything (or most things) customizable (for people who want the effect permanent or short), the STR bonus is back and added AGI bonus (and finally without wait action), added a speed bonus (I'm not sure if it really increases the speed, tell me in comments). Changed the wind rate to 1 from half per second (but at the cost of half the damage), added an ending damage and an effect to express it (damage at the end of the ability + wind), and added a damage at the position of the main area of the ability (so it can go with the long period of the main effects.) And that's it. I hope it get approved because I've put much effort on it and I'll be sad to see all that effort goes for nothing.

Update 3.1

Update 3.2

Update 3.3 (Modifiers are bugged)

Update 3.4

Update 4.0 MUI: All the excess triggers and folders will be removed on approval. Any thing which can be noticed easily is made on purpose. This is finally MUI. There is a small problem with decreasing the number of indexes but it doesn't affect gameplay.

Update 4.1 MUI

Update 5: Supports 3 levels, fixed speed bonus, Loop turns off successfully. I believe it can be approved now.

Update 5.1: I made an alternative for the "Demonic_index = ___ -1" and similar triggers. Not because it isn't what it should be means it's wrong. (But it could be wrong, test it.)

Update 5.2: "Unit begins casting" and "Unit starts the effect" are now optional (with different functions). Attributes gained now supports multiple levels. Some fixes.

Update 5.3: Intelligence, variable for the duration of the spell, more fixes.

Update 6: Complete MUI. I used:
[GUI] Dynamic Indexing Template
Credits to: Hanky
This is all what I can do for recycling and MUI.


Update 6.1: Fixes and cleans. 2 more effects WITHOUT lag.

Update 7: Updated the recycling triggers, changed the colors of the models and decreased the lag. Special thanks to _Guhun_

Update 7.1: The effects frequency can now be changed. Fixed location leaks. Removed Or conditions. Attack and Damage type are now configurable. Better tooltip.

Update 8.0: Fixed an issue in recycling. Event made to "starts effect". Added unit-type conditions to solve some bugs. The second part of the special effects and periodic damage timer made configurable. Fixed some leaks. Ability's duration is now configurable. Special thanks to Dr Super Good.


Keywords:

Demon, Rage, Evil, Rampage, Chaos, Death, Demonic, Deadly, Illidan.

Use this however you like, just give credits.
Contents

DEMONIC RAGE (Map)

Reviews
MyPad
As jarring as the spell might be, the issue of indexing has been resolved, at least partially. However, getting this spell to work handily with custom durations is another thing to address, since the spell considers the hard-coded duration of the base...
I downloaded the map that you submitted and as they mentioned, you had a lot of leaks. Hopefully, I managed to reduce much of the leaks produced initially but I found another bug in your indexing, even after the hero has transformed back to his original state, he keeps on reaping the benefits.

Here is a slightly-cleaned up version of your map:


EDIT:

I've optimized it a bit more, now you have fewer leaks to worry about...


I wouldn't just give him a fixed map; that doesn't teach anything about why it's changed, or teach how to change it. Actually doing efficient coding works wonders to improve skill.

Oops, shouldn't have done that...
... should've asked for your permission to optimize it.
 

Attachments

  • DEMONIC RAGE 3.w3x
    81.5 KB · Views: 51
Last edited:

NightKnight

Hosted Project RUID
Level 14
Joined
Sep 3, 2014
Messages
222
So I should set "Custom script: set bj_wantDestroyGroup = true" before every unit group action? or what do you mean?

I use the "A unit begins casting", because other events cause glitches due to the base of the skill which is the (demon transforming skill), like the repeating of the skill after its end. Anyway, I'll try it again.


I can't make the weapon and damage types changeable, because it will destroy the idea of the skill (+ I've seen some approved spells with constant types.)


adding variation to the strength and agility gained would be enough for the multilevel to be finished?


but I found another bug in your indexing, even after the hero has transformed back to his original state, he keeps on reaping the benefits.

I've done many updates to fix this and I think I did, upload a screenshot and tell me what you did exactly, I cant fix it if I cant see it happening myself.
EDIT: what do you mean exactly by reaping the benefits?
 
Last edited:
bj_WantDestroyGroup() == True has to be set every time you are about to create a group that will leak
location leaks have to be cleared every time you set a location to a new point, not once at the end of the spell
you lack proper recycling still
a unit begins casting is still being used
multilevel support is still incomplete (this should range for all possible attributes ideally, at least half), also they should be calculated on cast and not calculated every loop
loop timer should run every 0.03 seconds or 0.04, not every 1 (has up to 0.99 second latency/inaccuracy)
damagetype and weapontype are still not configurable

@reyo
I averted the need for bj_wantDestroyGroup=true because I used the natives directly..

Which Natives:
ForGroup instead of ForGroupBJ

The location is updated every loop, right? It leaks, because the previous location has not been removed. Fixed that inconsistency...

Proper recycling has been implemented in the loop... AKA Dynamic Indexing

Changed the event into unit starts an effect of an ability and filtered out the unit type not to be the metamorph...

Damagetype variable is the only configurable variable as the weapontype variable AFAIK is not available in GUI.

As for reaping the benefits, I mean that the hero keeps on gaining strength and agility points when it should be reset.
 
Last edited:
@MyPad use of the ForGroup native does not avert the need to clear the group, the handle still leaks
your rewrite is also in JASS and as such would be held to JASS standards which would have the following implications:
- The spell must be 1 trigger large (there is no reason to have more than 1 in a JASS spell)
- functions should be nested whenever they can be, "bj_lastCreatedUnit" has no need to ever be used
- functions need proper names "Trig_Demonic_Rage_Loop_Func001Func004Func001Func008A" for example is useless and not needed, even if you convert GUI to JASS to make it better, these things should be fixed.
- You've incorrectly marked your recycling as "Inheritance" which it is not in your commenting
- You've left in some functions that are never called "Trig_Demonic_Rage_Actions" for example
- Functions should be properly commented on their purpose above their declaration
- While the cast was correctly changed to run on condition the loop was not (though as with a previous note there's only need for one trigger in JASS anyway)
This then of course has all the issues I hadn't listed before (as previous fixes required code rewrite and thus may've been solved by that
- there's no need for Demonic_Point to be an array variable, should be a non-array temp variable (also in JASS use co-ordinates when you can instead of points, which applies to this spell)
- Duration of the spell should be configurable "63.00" should not be hardcoded
- Unit types should all be configurable
- Spell type should be configurable
- You only need to check for trigger disblaing (max index == 0) when you've actively recycling something, checking every time is pointless for comparison of efficiency, it'll either run 63 times per cast (but not increase if multi-casts are done at the exact same time) or once per cast (on recycle), if a proper timer speed was used to avoid latency on the spell, this would be much laster (a few hundred times per cast)
Other legacy issues:
- Still using 1.00 second timer speed
- Incomplete multi-level support

as an aside you're right weapontype isn't available in GUI, I meant attacktype and damagetype (though in JASS weapontype should also be configurable)
Generally speaking, please don't rewrite other people's submissions in an attempt to do their work for them, unless you plan on doing it for everything they ever submit in which case you may as well be making your own submission instead - people don't learn anything if you do it for them and if they don't learn they won't be able to make approvable submissions and then this whole song and dance gets repeated forever which is frustrating for a creator and moderator if nothing else since we end up having to repeat ourselves
 
@MyPad use of the ForGroup native does not avert the need to clear the group, the handle still leaks
your rewrite is also in JASS and as such would be held to JASS standards which would have the following implications:
- The spell must be 1 trigger large (there is no reason to have more than 1 in a JASS spell)
- functions should be nested whenever they can be, "bj_lastCreatedUnit" has no need to ever be used
- functions need proper names "Trig_Demonic_Rage_Loop_Func001Func004Func001Func008A" for example is useless and not needed, even if you convert GUI to JASS to make it better, these things should be fixed.
- You've incorrectly marked your recycling as "Inheritance" which it is not in your commenting
- You've left in some functions that are never called "Trig_Demonic_Rage_Actions" for example
- Functions should be properly commented on their purpose above their declaration
- While the cast was correctly changed to run on condition the loop was not (though as with a previous note there's only need for one trigger in JASS anyway)
This then of course has all the issues I hadn't listed before (as previous fixes required code rewrite and thus may've been solved by that
- there's no need for Demonic_Point to be an array variable, should be a non-array temp variable (also in JASS use co-ordinates when you can instead of points, which applies to this spell)
- Duration of the spell should be configurable "63.00" should not be hardcoded
- Unit types should all be configurable
- Spell type should be configurable
- You only need to check for trigger disblaing (max index == 0) when you've actively recycling something, checking every time is pointless for comparison of efficiency, it'll either run 63 times per cast (but not increase if multi-casts are done at the exact same time) or once per cast (on recycle), if a proper timer speed was used to avoid latency on the spell, this would be much laster (a few hundred times per cast)
Other legacy issues:
- Still using 1.00 second timer speed
- Incomplete multi-level support

as an aside you're right weapontype isn't available in GUI, I meant attacktype and damagetype (though in JASS weapontype should also be configurable)
Generally speaking, please don't rewrite other people's submissions in an attempt to do their work for them, unless you plan on doing it for everything they ever submit in which case you may as well be making your own submission instead - people don't learn anything if you do it for them and if they don't learn they won't be able to make approvable submissions and then this whole song and dance gets repeated forever which is frustrating for a creator and moderator if nothing else since we end up having to repeat ourselves

Sorry about that, I just like optimizing. I will just watch the thread instead and see what unfolds. I kept the naming convention as is, since it is someone else's.
 
So the problem in the group leak is that i did
  • Custom script: set bj_wantDestroyGroup = true
not
  • Custom script: set bj_wantDestroyGroup((udg?)_Demonic_pickedunits) = true
?

I'm not good with the custom scripts.

The second line is incorrect, while the first is correct. As to how you should use it, you will write it like this

  • Custom script: set bj_wantDestroyGroup = true
  • Unit Group - Pick every unit in (Units in some area) and do (Actions)
    • Loop - Actions
      • ---- insert action here ----
  • Custom script: set bj_wantDestroyGroup = true
  • Unit Group - Pick every unit in (Units in (Playable map area)) and do (Actions)
    • Loop - Actions
      • ---- insert action here ----
To note:
  • Unit Group - Pick every unit in (Units in some area) and do (Actions)
..is in JASS,

JASS:
call ForGroupBJ( GetUnitsInRectAll(somearea), Actions)

The reason why you should set it before the Pick every unit part is explained below:

JASS:
function ForGroupBJ takes group whichGroup, code callback returns nothing
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    call ForGroup(whichGroup, callback)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(whichGroup)
    endif
endfunction

As you can see, bj_wantDestroyGroup is reset to false, thus making this sample leak:

  • Custom script: set bj_wantDestroyGroup = true
  • Unit Group - Pick every unit in (Units in some area) and do (Actions)
    • Loop - Actions
      • ---- insert action here ----
  • Unit Group - Pick every unit in (Units in (Playable map area)) and do (Actions)
    • Loop - Actions
      • ---- insert action here ----
 
You've nearly cleared all the leaks - you still have point leaks though if they get false on the first if in the loop and then else on the second one (why does that second if even exist, if the counter is no longer less than 63 surely you want the other actions to execute? if you've done this to avoid a bug then the bug would be a consequence of the lack of proper recycling - you should just put the point removal outside of the if conditions afterwards at the bottom (so the leak removal always works) as usual there's some old points to address I'll remind you of some of the things I noted earlier from myPad's rewrite (they hadn't been mentioned before as they weren't as pressing
- Duration of the spell should be configurable
- Unit types and spell types should be configurable
- LVL_Loop and LVL_Main are too generic for names, their naming should be descriptive, also they break your spell's prefix rule
- I don't see why you're using two location indexes, one of them is entirely not needed
- Your point variable could be a single non-array point variable

suggestion:
- You could add configurables to support int gain as well (even if you set these to 0 in your config, just to have the support there)
 

NightKnight

Hosted Project RUID
Level 14
Joined
Sep 3, 2014
Messages
222
Putting
  • Custom script: call RemoveLocation(udg_Demonic_TempPoint[udg_Demonic_LoopIndex])
at the bottom (out of the if condition) would cancel the effect of
  • Unit Group - Pick every unit in (Units within Demonic_Radius of Demonic_TempPoint[Demonic_LoopIndex]) and do (Actions)
    • Loop - Actions
      • Set Demonic_pickedunits = (Picked unit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Demonic_pickedunits is Magic Immune) Equal to False
          • (Demonic_pickedunits belongs to an enemy of (Owner of CasterDR[Demonic_LoopIndex])) Equal to True
        • Then - Actions
          • Unit - Cause CasterDR[Demonic_LoopIndex] to damage Demonic_pickedunits, dealing (Demonic_Damage + (LVL_Main x (Real(LVL_Demonic[Demonic_LoopIndex])))) damage of attack type Chaos and damage type Universal
        • Else - Actions
I think you meant the demonic point. I'll update it.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

The duration of the spell can't be only changed from triggers, it should be changed from object editor too. (manually)
If this is acceptable then I'll make it. (Although a problem with movement speed gained might happen.)

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Unit types and spell types, what are those?

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

- I don't see why you're using two location indexes, one of them is entirely not needed
- Your point variable could be a single non-array point variable

Unless they were essential for the spell to be approved, I prefer to leave them to evade any possible problem. (I'm not a good programmer.)

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

Adding Intelligence won't fit in the spell's idea and gameplay.

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

The If conditions weren't made to avoid any bug, I used it in past versions for "set demonic index = demonic index -1" and these stuffs (which I removed because it failed). I'll update it with the next update (as long as no problem occurs.)
 
- Your first point is just not true - I wouldn't give a suggestion I thought would break the code and I know from experience
- Yeah it's fine that the object data would also need to be changed - the duration should still be configurable though so you don't have to go skimming through the code finding all references to 63
- Unit Types - the unit types you used for dummies, spell type is well obviously the base spell for your submission
- it's not essential but it would result in a lower rating, especially the fact of using it twice, the first location set is the only one that does anything useful, what is the second one even for when they're both set to the same value?
- It doesn't matter what fits the spells idea (and this has no effect on the gameplay), this section is about making things for other people to use as they see fit so having more options and configurables is better unless it involves adding extra mechanics to the spell that requires additional code structure (which this was not) hence the suggestion, it's also why I suggested making the addition 0 as the defaults
 

NightKnight

Hosted Project RUID
Level 14
Joined
Sep 3, 2014
Messages
222
I've reviewed the if conditions, I can't remove the second condition because I want the actions in it to happen 1 time only. (If I just put actions on the Else of the first condition then it will happen every second indefinitely.) It will only work if the user will use one instance only at a time.
 
Going to test your map right now to see if there are no leaks...

By the way,

  • [LIST]
  • [*][IMG]https://www.hiveworkshop.com/styles/default/ratrigger/empty.gif[/IMG][IMG]https://www.hiveworkshop.com/styles/default/ratrigger/join.gif[/IMG][IMG]https://www.hiveworkshop.com/styles/default/ratrigger/comment.gif[/IMG]-------- Note: If you want the skill to be repeated 1 time after the end then go to trigger/Demonic Rage and change the event from "Begins casting" to "Start the effect" --------
  • [*][IMG]https://www.hiveworkshop.com/styles/default/ratrigger/empty.gif[/IMG][IMG]https://www.hiveworkshop.com/styles/default/ratrigger/join.gif[/IMG][IMG]https://www.hiveworkshop.com/styles/default/ratrigger/comment.gif[/IMG]-------- However, this isn't recommended. I'm not responsible for bugs and glitches that may happen. --------
  • [/LIST]
Nice disclaimer...
 

NightKnight

Hosted Project RUID
Level 14
Joined
Sep 3, 2014
Messages
222
I'd appreciate it if someone could explain some things in that system (as how that recycling works), and point out the difference between my old system and Hanky's system.


The main base skill doesn't work properly with the "Start the effect" and Tank-commander wants me to make it as that so I have no choice.
 
You could filter out the unit type of the unit when the unit starts the effect of DEMONIC RAGE.

Example:

- Demon Hunter casts DEMONIC RAGE. On that instant, game still identifies Demon Hunter as Demon Hunter
Ideal situation for making an instance.

- Demon casts DEMONIC RAGE. On that instant, game identifies Demon as Demon.
Ideal situation for removing an instance.

The reason why the rest of those commenting were telling you to use starts the effect of an ability event instead of casting an ability event is that the latter is abusable, that is to say that they can cancel the spell and reap its' benefits.

So, you just filter out if the unit type of the caster is not yet a Demon. If it is so, create an instance.
If it is the Demon that casts the ability, you would remove the instance if it is found.

Example:

- You cast a heal over time spell but haven't finished. At this point, you didn't expend mana points yet, making the spell abusable.


Also, I would like to mention that once turning back to a Demon Hunter, the stat gain is still present. The aforementioned statement above is a possible solution to the dilemma.


Disregard what I crushed out. Turns out it was just on my part.

Once you're ready, I'll talk about the asymptotic case scenarios of the spell in order to protect it from potential exploitation.

As for Hanky's dynamic indexing system and yours, well, I could only say that "if it ain't broke, don't fix it".
 
Last edited:
I may not be a spell reviewer but here are some of my suggestions:

Instead of using units as dummies, use special effects instead.
- Creating units dynamically as far as I know costs an irremovable 4 bytes.

Change the normal type field data of the spell into the Tester unit.

Seeing that the system handles most of the indexing and deindexing in the loop trigger, I could take a hypothetical scenario:

What if there is a unit that can one-shot the Demon? Upon death, the Demon would have lost his instance immediately because the instance is no longer in use.

To make it more clear:

1.) Demon Instance at 40 ticks
2.) Demon Instance at 29 ticks
3.) Demon Instance at 35 ticks

Demon #2 dies, but his instance is still present, adding up while the unit is dead. If you have a trigger that detects the death of the Demon, that is you create a generic unit dies trigger that filters out the type of dying unit (you can actually use triggering unit) to be Demon, you check if that Demon has an instance, which in the aforementioned case is 2. By using Hanky's dynamic indexing method, the last instance of the indices will have its' contents forced onto the deindexed instance.

An example is more clear:

1.) A
2.) R
3.) R2
4.) O
5.) W

3 disappears

1.) A
2.) R
5.) W
4.) O
5.) W - I guess this decrements the instance, so it is no longer accessible by iteration..
 
Level 21
Joined
Dec 4, 2007
Messages
1,473
Well it looks interesting, that unholy whirling effect especially!
Is that your custom model, or where did you get it from?
 
Your recycling still doesn't work properly - you also do a lot of needless stuff with your dynamic index
when adding an index
MaxIndex = MaxIndex + 1
Data[MaxIndex] = whatever
That's all you need to do
when removing
Data[CurrentIndex] = Data[MaxIndex]
MaxIndex = MaxIndex - 1
CurrentIndex = CurrentIndex - 1
<<Check if MaxIndex is now 0, turn of trigger if it is>>
and that's for all Data
you've just got a lot of random pieces from different attempts at getting recycling laying around or being semi-incorporated just making the whole thing a lot more confused

eitherway I confirmed it wasn't working by telling each hero in turn to use the ability waiting 5-10 seconds between activating each, the last one continued to get buffs for roughly twice the duration of the spell also you still have that latency of the spell of up to a second due to your timer speed
 
Level 21
Joined
Dec 4, 2007
Messages
1,473
No i mean the whirling dust, which needs custom model importing. Can't say i've ever seen this in use/uploaded anywhere.
 
It lags so heavily because you're spamming effects every 0.03 seconds, there is no fix to that - simply don't do it
also I generally advise against the use of effects that serve no purpose, denoting AOEs and such like fair enough but the effects you added serve no need and just generate lag

Edit: Still got those recycling errors in your new update
 
Last edited:
This is the result of your recycling error - I can get others to confirm it if necessary. you have to wait a while after the first one has reverted back (though this time it was the first one who transformed rather than the last which experienced the glitch) there's a recycling error because you don't transfer all the data - if you recycled in the manner I posted a while ago this wouldn't occur
 

Attachments

  • Recycling Glitch.png
    Recycling Glitch.png
    2.7 MB · Views: 74
  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
      • Or - Any (Conditions) are true
        • Conditions
          • Dem_Rage_Timer[TempInt] Equal to 0.06
          • Dem_Rage_Timer[TempInt] Equal to 0.12
          • Dem_Rage_Timer[TempInt] Equal to 0.18
          • Dem_Rage_Timer[TempInt] Equal to 0.24
          • Dem_Rage_Timer[TempInt] Equal to 0.30
          • Dem_Rage_Timer[TempInt] Equal to 0.36
          • Dem_Rage_Timer[TempInt] Equal to 0.42
          • Dem_Rage_Timer[TempInt] Equal to 0.48
          • Dem_Rage_Timer[TempInt] Equal to 0.54
          • Dem_Rage_Timer[TempInt] Equal to 0.60
          • Dem_Rage_Timer[TempInt] Equal to 0.66
          • Dem_Rage_Timer[TempInt] Equal to 0.72
          • Dem_Rage_Timer[TempInt] Equal to 0.78
          • Dem_Rage_Timer[TempInt] Equal to 0.84
          • Dem_Rage_Timer[TempInt] Equal to 0.90
          • Dem_Rage_Timer[TempInt] Equal to 0.96
That's completely the wrong way to go about what you're after, use a single timer and count down rather than up and reset it every time it hits 0 if you're going to do something like that all those IF statements are highly inefficient
  • Unit - Create 1 Dummy3 for Neutral Passive at (DemonicPoint offset by 180.00 towards 0.00 degrees) facing Default building facing degrees
These lines leak points

As I mentioned before effect spam isn't very good in a spell
Also you still have the same recycling error as before
 

NightKnight

Hosted Project RUID
Level 14
Joined
Sep 3, 2014
Messages
222
when adding an index
MaxIndex = MaxIndex + 1
Data[MaxIndex] = whatever
That's all you need to do
  • -------- Increase the index size --------
  • Set Demonic_timer = (Demonic_timer + 1)
  • -------- Dynamic Index --------
  • Set Demonic_Index[Demonic_timer] = Demonic_timer
  • -------- Dynamic Index End ----------------
  • IMPORTANT SYSTEM PART END --------
  • Set TempInt = Demonic_Index[Demonic_timer]
when removing
Data[CurrentIndex] = Data[MaxIndex]
MaxIndex = MaxIndex - 1
CurrentIndex = CurrentIndex - 1
<<Check if MaxIndex is now 0, turn of trigger if it is>>
  • -------- IMPORTANT SYSTEM PART START --------
  • ------- RecycleIndex --------
  • Set Demonic_Index[Demonic_LoopIndex] = Demonic_Index[Demonic_timer]
  • Set Demonic_timer = (Demonic_timer - 1)
  • Set Demonic_LoopIndex = (Demonic_LoopIndex - 1)
  • -------- Turn the trigger again off if the index_size is below 0... --------
  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)If - Conditions
  • Demonic_timer Equal to 0
  • Then - Actions
  • Trigger - Turn off (This trigger)
  • Else - Actions
 
Those things aren't equivelent, you're not indexing any data using Demonic_timer, your Demonic_Index variable has never been needed
by data[MaxIndex] I meant lines like this: Set Demonic_TempPoint[TempInt] = (Position of (Triggering unit))
should be: Set Demonic_TempPoint[Demonic_timer] = (Position of (Triggering unit))
tempInt also has never been needed
and then you recycle ALL the data
 
neither, they can be both be removed and just use your Demonic_timer variable
TempInt is set to the same value as Demonic_timer, so data[Tempint] is the same thing as data[demonic_timer]
at the moment what you're doing is
Demonic_timer ++ (so say it's now 1)
Demonic_Index[demonic_timer] = demonic_timer, this is functionally Demonic_Index[1] = 1
TempInt = Demonic_Index[demonic_timer] which is still 1
Data[TempInt] = whatever is Data[1] = whatever which is Data[Demonic_timer] = whatever

you could argue that this would be needed because of your recycling method but that turns out like this:
assume you have indexes and for simplicity say data is the same as the numbers (whatever it may actually be) so you can see which original index it belongs to) also keep in mind you access data via
"Set TempInt = Demonic_Index[Demonic_LoopIndex]"
Demonic_timer = 4
Demonic_Index = {1, 2, 3, 4}
Data = {1, 2, 3, 4}
So as TempInt goes through the Demonic_LoopIndex values from 1-4 it's going to become equal to 1-4 in turn via Demonic_Index

so instance 1 ends
Demonic_Index = {4, 2, 3, 4} (the original 4 does not go away, thus those two indexes store the same data)
Demonic_timer = 3
Data = {1, 2, 3, 4} (as it's not touched, note that all the data from the finished instance remains in memory)
now when TempInt goes through Demonic_LoopIndex it's going to get data 4, then 2, then 3 but because Demonic_timer is decreased it doesn't get data 4 twice (as Demonic_timer doesn't go to the 4th value)

all is good, but now lets try indexing a new cast:
Demonic_timer = 4
Demonic_Index[4] = 4
TempInt = 4
Data[4] = whatever (note that this is Data = {1, 2, 3, >>whatever<<})
But wait, instance 4 never ended only instance 1 did, but now all the data assigned to data[4] belongs to the new instance and 4 has gone missing
Demonic_Index = {4, 2, 3, 4} still but that's not the same data that the 1st 4 is supposed to preserve through recycling and now because Demonic_timer = 4, Data[4] is going to run twice every time you loop through it since it'll go "TempInt = Demonic_Index[Demonic_LoopIndex]" each time and thus access order would be Data[4], Data[2], Data[3], Data[4]

Indeed actually the closest recycling method you have to your present form is a dynamic pointer method by which you would put recycled index numbers (such as 1) onto a stack and take indexes from that if they were free
(which would mean when you attempted to index again it'd be Demonic_Index[4] = 1, since 1 would be on that recycle stack) in which case your current way of doing things would make more sense though you'd still need to modify both your indexing and deindexing methods to use that stack

With Dynamic Indexing it's much simpler
on index:
Demonic_timer ++
Data[Demonic_timer] = whatever

on recycle:
Data[Demonic_LoopIndex] = Data[Demonic_timer]
Demonic_timer --
Demonic_LoopIndex --

so same example, though keep in mind that looping through with dynamic indexing is done directly via Data[Demonic_LoopIndex] which will go from 1-Demonic_Timer each loop
Demonic_timer = 4
Data = {1, 2, 3, 4}

instance 1 ends
Data = {4, 2, 3, 4} (the original 4 does not go away, thus those two indexes store the same data)
Demonic_timer = 3

all is good, try indexing a new cast:
Demonic_timer = 4
Data[4] = whatever (note that this is Data = {4, 2, 3, >>whatever<<}, which means the 4 remains intact
As the 4 remains untouched (since it is in access point data[1] now and wasn't overwritten) and will still be accessed properly as Demonic_LoopIndex is still going to go through 1-4, so Data[1] is obviously going to be accessed and everything continues to work
 

NightKnight

Hosted Project RUID
Level 14
Joined
Sep 3, 2014
Messages
222
Those things aren't equivelent, you're not indexing any data using Demonic_timer, your Demonic_Index variable has never been needed
by data[MaxIndex] I meant lines like this: Set Demonic_TempPoint[TempInt] = (Position of (Triggering unit))
should be: Set Demonic_TempPoint[Demonic_timer] = (Position of (Triggering unit))
tempInt also has never been needed
and then you recycle ALL the data


So all the changes will be in first trigger only? If so I'm ready to update it.
 
Haven't seen this in a while, I see you've changed the aesthetic to it but problems still persist:
- Recycling errors still occur (exactly the same way to cause it as when I first mentioned it)
- Ability still based off metamorphosis
- Effects are still spammed way more heavily than necessary with no option to configure them
- Location leaks still exist when you create those effects
- Don't use or conditions for various timings, use an artificial wait for it instead (tutorial on how to do so in the tutorial section)
- Attacktype and damagetype could still be made configurable
- Still has an improper tooltip, the tooltip should look stylistically the same as other abilities in the game
- Still uses "a unit begins casting"
- (...)
I've pointed out all of these issues before, I don't see why they haven't been resolved nearly a year after I pointed them out, I've warned about giving incomplete updates before - please go over all my reviews up to this point and actually fix these things and make sure the fix(es) work(s) before updating
 

NightKnight

Hosted Project RUID
Level 14
Joined
Sep 3, 2014
Messages
222
Haven't seen this in a while, I see you've changed the aesthetic to it but problems still persist:
- Recycling errors still occur (exactly the same way to cause it as when I first mentioned it)
How? It's supposed to be correctly recycling all the data now.
- Ability still based off metamorphosis
I want its functionality
- Still uses "a unit begins casting"
  • -------- Note: If you want the skill to be repeated 1 time after the end then go to trigger/Demonic Rage and change the event from "Begins casting" to "Start the effect" --------
  • -------- However, this isn't recommended. I'm not responsible for bugs and glitches that may happen. -----
 
For the sake of brevity I'm going to set this to awaiting update every time it's updated by default until the recycling issue has been resolved, so if no new comments are made when reviewing the resource in future, that will be the issue regardless of whether or not it "should" be recycling correctly the fact of the matter is that it doesn't, currently this is the exact method by which I find the recycling error:
1) Have 3 of the 4 heroes cast the spell
2) When the 1st expires (completes) but before any of the others expire have the 4th cast the spell
3) Before the 4th cast expires, have the 1st recast the spell
4) The 4th caster is now bugged and when their cast expires they continue to gain stats

this eventually corrects itself approximately double the time after the 1st's recast expires (i.e. the extension time seems to be equal to the remaining duration of the recast when the 4th cast expires + one full duration of the spell

also you have a location leak
  • Unit - Create 1 Dummy4 for Neutral Passive at (Position of Demonic_pickedunits) facing Default building facing degrees
Note that this is not a guarantee that the resource will be approved once the recycling issue is fixed, just that it has been so prevalent that nothing else should be done to the resource before it has been fixed.
 
As jarring as the spell might be, the issue of indexing has been resolved, at least partially.
However, getting this spell to work handily with custom durations is another thing to address, since the spell considers the hard-coded duration of the base spell instead of its' custom-defined duration.

Moreover, there are residual "special effects" from the moment of casting the spell, which makes it awkward to look at in a battle scenario (unless that is intended).

upload_2019-12-22_10-17-10.png

The usage of dummy units as special effects appears to be a waste of resources, considering the recently introduced functionalities for the special effects, especially when they are created en masse during the loop trigger. Even with just 4 instances running at any given time, the game struggles to render each frame, possibly due to the above.

At the moment, this cannot be approved yet. Hence, moved to Awaiting Update
 
Top