1. Are you planning to upload your awesome spell or system to Hive? Please review the rules here.
    Dismiss Notice
  2. Updated Resource Submission Rules: All model & skin resource submissions must now include an in-game screenshot. This is to help speed up the moderation process and to show how the model and/or texture looks like from the in-game camera.
    Dismiss Notice
  3. The 15th Mini-Mapping Contest came to an end. The Secrets of Warcraft 3 are soon to be revealed! Come and vote in the public poll for your favorite maps.
    Dismiss Notice
  4. The 12th incarnation of the Music Contest is LIVE! The theme is Synthwave. Knight Rider needs a song to listen to on his journey. You should definitely have some fun with this theme!
    Dismiss Notice
  5. Join other hivers in a friendly concept-art contest. The contestants have to create a genie coming out of its container. We wish you the best of luck!
    Dismiss Notice
  6. Check out the Staff job openings thread.
    Dismiss Notice
Dismiss Notice
60,000 passwords have been reset on July 8, 2019. If you cannot login, read this.

Flame Burst v1.00

Submitted by KILLCIDE
This bundle is marked as approved. It works and satisfies the submission rules.

Spell Description


Ignite a target unit, dealing damage over time and reducing their movement speed. Every few seconds, the target unit will send out blast waves that ignite enemy units and deal over time. Any unit killed by this ability will explode and deal additional damage to nearby enemy units.​

Ingame Information:
  • Primary debuff base ability is Cripple
  • Secondary debuff base ability is Curse
  • Both debuffs are dispellable
  • Primary and secondary debuffs do not stack. An instance will only be overwritten if it is equal or stronger in level
  • When a primary or secondary instance is overwritten, the duration is reset
  • Blast Waves cannot cross terrain or structures
  • A target can have a primary and secondary debuff simultaneously
  • When a target with both the primary and secondary debuff dies, the ability level taken for explosion damage and radius will be whichever ability level is higher

Requirements



Credits

  • PurgeandFire
  • Vexorian


How to Install

  1. Go to the Preferences menu and make sure "Automatically create unknown variables while pasting trigger data" is checked

  2. Import all Object Editor data
    • Spell Dummy Unit (import dummy.mdx as well / you do not have to import another dummy unit if your map already has one)
    • Flame Burst (Ability)
    • Flame Burst (Movement Speed Reduction)
    • Flame Burst (Secondary Debuff Indicator)
    • Flame Burst (Buff)
    • Flame Burst Wave (Buff)

  3. Import all Trigger Editor data
    • Flame Burst Requirements (only import requirements that you don't have in your map)
    • Flame Burst

  4. Go to FBurst Config and change the following variables to their corresponding data:
    • FBurst_Ability = Flame Burst
    • FBurst_ABILITY_MOVE_SPEED = Flame Burst (Movement Speed Reduction)
    • FBurst_ABILITY_SECOND_DEBUFF = Flame Burst (Secondary Debuff Indicator)
    • FBurst_DEBUFF_PRIMARY = Flame Burst
    • FBurst_DEBUFF_SECONDARY = Flame Burst Wave
    • FBurst_SPELL_DUMMY_UNIT_TYPE = Spell Dummy Unit (or to whatever your dummy unit is in your map)
    • FBurst_TRIGGER_PRIMARY_LOOP = FBurst Primary Loop <gen>
    • FBurst_TRIGGER_CREATE_WAVE = FBurst Wave Index <gen>
    • FBurst_TRIGGER_WAVE_LOOP = FBurst Wave Loop <gen>
    • FBurst_TRIGGER_APPLY_DOT = FBurst DoT Apply <gen>
    • FBurst_TRIGGER_SECONDARY_LOOP = FBurst DoT Loop <gen>
    • FBurst_TRIGGER_DOT_DEATH = FBurst DoT Death <gen>
    • FBurst_TRIGGER_PATHING_CHECK = Check Walkability <gen>


Triggers


FBurst Config
  • FBurst Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- --------
      • -------- --------
      • -------- CONFIG START --------
      • -------- --------
      • -------- imported object editor data --------
      • Set FBurst_ABILITY = Flame Burst
      • Set FBurst_ABILITY_MOVE_SPEED = Flame Burst (Movement Speed Reduction)
      • Set FBurst_ABILITY_SECOND_DEBUFF = Flame Burst (Secondary Debuff Indicator)
      • Set FBurst_DEBUFF_PRIMARY = Flame Burst
      • -------- ^ ensure that ABILITY_MOVE_SPEED is giving this buff --------
      • Set FBurst_DEBUFF_SECONDARY = Flame Burst Wave
      • -------- ^ ensure that ABILITY_SECOND_DEBUFF is giving this buff --------
      • Set FBurst_SPELL_DUMMY_UNIT_TYPE = Spell Dummy Unit
      • -------- --------
      • -------- imported triggers --------
      • Set FBurst_TRIGGER_PRIMARY_LOOP = FBurst Primary Loop <gen>
      • Set FBurst_TRIGGER_CREATE_WAVE = FBurst Wave Index <gen>
      • Set FBurst_TRIGGER_WAVE_LOOP = FBurst Wave Loop <gen>
      • Set FBurst_TRIGGER_APPLY_DOT = FBurst DoT Apply <gen>
      • Set FBurst_TRIGGER_SECONDARY_LOOP = FBurst DoT Loop <gen>
      • Set FBurst_TRIGGER_DOT_DEATH = FBurst DoT Death <gen>
      • Set FBurst_TRIGGER_PATHING_CHECK = Check Walkability <gen>
      • -------- --------
      • -------- maximum level for ABILITY --------
      • Set FBurst_MAX_LEVEL = 3
      • -------- ^ make sure to set this to the correct value. not doing so will cause the spell to not work as intended --------
      • -------- order string for ABILITY --------
      • Set FBurst_ORDER_ID = channel
      • -------- --------
      • -------- duration of primary debuff in seconds --------
      • Set FBurst_DOT_PRIMARY_DURATION[1] = 6.00
      • Set FBurst_DOT_PRIMARY_DURATION[2] = 7.00
      • Set FBurst_DOT_PRIMARY_DURATION[3] = 8.00
      • -------- --------
      • -------- primary damage dealt to target over a second --------
      • Set FBurst_DOT_PRIMARY_DAMAGE[1] = 25.00
      • Set FBurst_DOT_PRIMARY_DAMAGE[2] = 25.00
      • Set FBurst_DOT_PRIMARY_DAMAGE[3] = 25.00
      • -------- --------
      • -------- interval of blast wave in seconds --------
      • Set FBurst_WAVE_INTERVAL[1] = 2.00
      • Set FBurst_WAVE_INTERVAL[2] = 2.00
      • Set FBurst_WAVE_INTERVAL[3] = 2.00
      • -------- --------
      • -------- number of individual waves created every WAVE_INTERVAL[] seconds --------
      • Set FBurst_WAVE_COUNT[1] = 8
      • Set FBurst_WAVE_COUNT[2] = 10
      • Set FBurst_WAVE_COUNT[3] = 12
      • -------- --------
      • -------- full distance waves will travel in units --------
      • Set FBurst_TRAVEL_DISTANCE[1] = 400.00
      • Set FBurst_TRAVEL_DISTANCE[2] = 400.00
      • Set FBurst_TRAVEL_DISTANCE[3] = 400.00
      • -------- --------
      • -------- how long it will take a wave to move TRAVEL_DISTANCE[] in seconds --------
      • Set FBurst_TRAVEL_DURATION[1] = 0.75
      • Set FBurst_TRAVEL_DURATION[2] = 0.65
      • Set FBurst_TRAVEL_DURATION[3] = 0.50
      • -------- --------
      • -------- how close a unit must be to a wave to be affected by the secondary debuff --------
      • Set FBurst_WAVE_RADIUS[1] = 100.00
      • Set FBurst_WAVE_RADIUS[2] = 100.00
      • Set FBurst_WAVE_RADIUS[3] = 100.00
      • -------- --------
      • -------- duration of secondary debuff in seconds --------
      • Set FBurst_DOT_SECONDARY_DURATION[1] = 10.00
      • Set FBurst_DOT_SECONDARY_DURATION[2] = 15.00
      • Set FBurst_DOT_SECONDARY_DURATION[3] = 20.00
      • -------- --------
      • -------- secondary damage dealt to target over a second --------
      • Set FBurst_DOT_SECONDARY_DAMAGE[1] = 12.00
      • Set FBurst_DOT_SECONDARY_DAMAGE[2] = 12.00
      • Set FBurst_DOT_SECONDARY_DAMAGE[3] = 12.00
      • -------- --------
      • -------- damage dealt to nearby units when a unit with the secondary debuff dies --------
      • Set FBurst_EXPLOSION_DAMAGE[1] = 75.00
      • Set FBurst_EXPLOSION_DAMAGE[1] = 100.00
      • Set FBurst_EXPLOSION_DAMAGE[3] = 150.00
      • -------- --------
      • -------- how close a unit must be to the dying unit to take damage from the explosion --------
      • Set FBurst_EXPLOSION_RADIUS[1] = 200.00
      • Set FBurst_EXPLOSION_RADIUS[2] = 200.00
      • Set FBurst_EXPLOSION_RADIUS[3] = 200.00
      • -------- --------
      • -------- special effect for the primary debuff on the target + special effect's attachment point --------
      • Set FBurst_SFX_PRIMARY_DEBUFF = Abilities\Spells\Other\SoulBurn\SoulBurnbuff.mdl
      • Set FBurst_SFX_PRIMARY_DEBUFF_AP = overhead
      • -------- --------
      • -------- special effect for the secondary debuff on the target + special effect's attachment point --------
      • Set FBurst_SFX_SECOND_DEBUFF = Abilities\Spells\Other\Incinerate\IncinerateBuff.mdl
      • Set FBurst_SFX_SECOND_DEBUFF_AP = chest
      • -------- --------
      • -------- special effect for an individual wave + special effect's attachment point --------
      • Set FBurst_SFX_WAVE = Abilities\Weapons\RedDragonBreath\RedDragonMissile.mdl
      • Set FBurst_SFX_WAVE_AP = chest
      • -------- --------
      • -------- special effect played on target that indicates a wave explosion + special effect's attachment point --------
      • Set FBurst_SFX_WAVE_INDICATOR = Abilities\Spells\Other\Doom\DoomDeath.mdl
      • Set FBurst_SFX_WAVE_INDICATOR_AP = origin
      • -------- --------
      • -------- special effect for explosion when a target with the secondary debuff dies + special effect's attachment point --------
      • Set FBurst_SFX_EXPLOSION = Abilities\Spells\Other\Incinerate\FireLordDeathExplode.mdl
      • Set FBurst_SFX_EXPLOSION_AP = overhead
      • -------- --------
      • -------- other --------
      • Set FBurst_ATTACK_TYPE = Spells
      • Set FBurst_DAMAGE_TYPE = Magic
      • Set FBurst_SPELL_DUMMY_OWNER = Neutral Extra
      • Set FBurst_PERIODIC_TIMER = 0.03
      • -------- error message that will display to the player when they attempt to apply --------
      • -------- a primary instance to a target that has a stronger instance already active --------
      • Set FBurst_ERROR_MSG = Target has a stronger instance active.
      • -------- --------
      • -------- CONFIG END --------
      • -------- --------
      • -------- --------
      • Trigger - Add to FBurst_TRIGGER_PRIMARY_LOOP the event (Time - Every FBurst_PERIODIC_TIMER seconds of game time)
      • Trigger - Add to FBurst_TRIGGER_WAVE_LOOP the event (Time - Every FBurst_PERIODIC_TIMER seconds of game time)
      • Trigger - Add to FBurst_TRIGGER_SECONDARY_LOOP the event (Time - Every FBurst_PERIODIC_TIMER seconds of game time)
      • Custom script: set udg_FBurst_ErrorSound = CreateSoundFromLabel("InterfaceError", false, false, false, 10, 10)
      • Hashtable - Create a hashtable
      • Set FBurst_Hash = (Last created hashtable)
      • -------- creating dummy caster --------
      • Set FBurst_TempLoc = (Center of (Playable map area))
      • Unit - Create 1 FBurst_SPELL_DUMMY_UNIT_TYPE for FBurst_SPELL_DUMMY_OWNER at FBurst_TempLoc facing Default building facing degrees
      • Set FBurst_DummyCaster = (Last created unit)
      • Custom script: call UnitRemoveAbility(udg_FBurst_DummyCaster, 'Amov')
      • Unit - Add FBurst_ABILITY_MOVE_SPEED to FBurst_DummyCaster
      • Unit - Add FBurst_ABILITY_SECOND_DEBUFF to FBurst_DummyCaster
      • Custom script: call RemoveLocation(udg_FBurst_TempLoc)
      • -------- preload (using another unit to preload effects so that it is not seen in the center of the map) --------
      • Unit - Create 1 FBurst_SPELL_DUMMY_UNIT_TYPE for FBurst_SPELL_DUMMY_OWNER at FBurst_TempLoc facing Default building facing degrees
      • Set FBurst_TempUnit = (Last created unit)
      • Special Effect - Create a special effect attached to the FBurst_SFX_PRIMARY_DEBUFF_AP of FBurst_TempUnit using FBurst_SFX_PRIMARY_DEBUFF
      • Special Effect - Destroy (Last created special effect)
      • Special Effect - Create a special effect attached to the FBurst_SFX_SECOND_DEBUFF_AP of FBurst_TempUnit using FBurst_SFX_SECOND_DEBUFF
      • Special Effect - Destroy (Last created special effect)
      • Special Effect - Create a special effect attached to the FBurst_SFX_WAVE_AP of FBurst_TempUnit using FBurst_SFX_WAVE
      • Special Effect - Destroy (Last created special effect)
      • Special Effect - Create a special effect attached to the FBurst_SFX_WAVE_INDICATOR_AP of FBurst_TempUnit using FBurst_SFX_WAVE_INDICATOR
      • Special Effect - Destroy (Last created special effect)
      • Special Effect - Create a special effect attached to the FBurst_SFX_EXPLOSION_AP of FBurst_TempUnit using FBurst_SFX_EXPLOSION
      • Special Effect - Destroy (Last created special effect)
      • Unit - Remove FBurst_TempUnit from the game
      • -------- --------
      • -------- math calculations --------
      • For each (Integer FBurst_LoopInt) from 1 to FBurst_MAX_LEVEL, do (Actions)
        • Loop - Actions
          • Set FBurst_DOT_PRIMARY_DAMAGE[FBurst_LoopInt] = (FBurst_DOT_PRIMARY_DAMAGE[FBurst_LoopInt] x FBurst_PERIODIC_TIMER)
          • Set FBurst_DOT_SECONDARY_DAMAGE[FBurst_LoopInt] = (FBurst_DOT_SECONDARY_DAMAGE[FBurst_LoopInt] x FBurst_PERIODIC_TIMER)
          • Set FBurst_SpawnAngle[FBurst_LoopInt] = (360.00 / (Real(FBurst_WAVE_COUNT[FBurst_LoopInt])))
          • Set FBurst_TravelSpeed[FBurst_LoopInt] = (FBurst_TRAVEL_DISTANCE[FBurst_LoopInt] / (FBurst_TRAVEL_DURATION[FBurst_LoopInt] / FBurst_PERIODIC_TIMER))


FBurst Cast
  • FBurst Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to FBurst_ABILITY
    • Actions
      • -------- FBurst Cast --------
      • -------- this trigger will check to see if the target needs a new primary instance or if its current primary instance needs to be overwritten --------
      • -------- if a target needs a new instance, the dummy caster will apply the slow and the target will receive the debuff effect --------
      • -------- if the target already has an instance, the slow and debuff effect will be reapplied, and the duration will be reset along with updated data from the new caster --------
      • -------- --------
      • -------- child keys for primary instance --------
      • -------- 0 - caster --------
      • -------- 1 - owner --------
      • -------- 2 - ability level --------
      • -------- 3 - duration --------
      • -------- 4 - duration counter for wave --------
      • -------- 5 - special effect --------
      • -------- --------
      • -------- child keys for explosion mechanic --------
      • -------- 10 - caster --------
      • -------- 11 - ability level --------
      • -------- --------
      • -------- --------
      • Set FBurst_Caster = (Triggering unit)
      • Set FBurst_AbilityLvl = (Level of FBurst_ABILITY for FBurst_Caster)
      • Set FBurst_TempLoc = (Position of FBurst_Target)
      • -------- checking if target needs to be given a primary instance --------
      • Set FBurst_Target = (Target unit of ability being cast)
      • Custom script: set udg_FBurst_UnitId = GetHandleId(udg_FBurst_Target)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (FBurst_Target has buff FBurst_DEBUFF_PRIMARY) Equal to False
        • Then - Actions
          • -------- target does not have an active instance --------
          • -------- --------
          • Unit Group - Add FBurst_Target to FBurst_PrimaryGroup
          • Set FBurst_PrimaryGroupCount = (FBurst_PrimaryGroupCount + 1)
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • FBurst_PrimaryGroupCount Equal to 1
            • Then - Actions
              • Trigger - Turn on FBurst_TRIGGER_PRIMARY_LOOP
              • Trigger - Turn on FBurst_TRIGGER_DOT_DEATH
            • Else - Actions
              • -------- do nothing --------
        • Else - Actions
          • -------- target has an active instance --------
          • -------- --------
          • -------- removing original effect + debuff to give it that "reapplication" effect --------
          • Unit - Remove FBurst_DEBUFF_PRIMARY buff from FBurst_Target
          • Special Effect - Destroy (Load 5 of FBurst_UnitId in FBurst_Hash)
      • -------- --------
      • Unit - Move FBurst_DummyCaster instantly to FBurst_TempLoc
      • Unit - Set level of FBurst_ABILITY_MOVE_SPEED for FBurst_DummyCaster to FBurst_AbilityLvl
      • Unit - Order FBurst_DummyCaster to Undead Necromancer - Cripple FBurst_Target
      • Special Effect - Create a special effect attached to the FBurst_SFX_PRIMARY_DEBUFF_AP of FBurst_Target using FBurst_SFX_PRIMARY_DEBUFF
      • Custom script: call RemoveLocation(udg_FBurst_TempLoc)
      • -------- --------
      • -------- saving necessary data --------
      • Hashtable - Save Handle OfFBurst_Caster as 0 of FBurst_UnitId in FBurst_Hash
      • Hashtable - Save Handle Of(Triggering player) as 1 of FBurst_UnitId in FBurst_Hash
      • Hashtable - Save FBurst_AbilityLvl as 2 of FBurst_UnitId in FBurst_Hash
      • Hashtable - Save FBurst_DOT_PRIMARY_DURATION[FBurst_AbilityLvl] as 3 of FBurst_UnitId in FBurst_Hash
      • Hashtable - Save FBurst_WAVE_INTERVAL[FBurst_AbilityLvl] as 4 of FBurst_UnitId in FBurst_Hash
      • Hashtable - Save Handle Of(Last created special effect) as 5 of FBurst_UnitId in FBurst_Hash
      • -------- --------
      • -------- storing the highest ability level between the primary or secondary debuff --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • FBurst_AbilityLvl Greater than or equal to (Load 11 of FBurst_UnitId from FBurst_Hash)
        • Then - Actions
          • -------- current ability level is equal or greater to the previous one --------
          • -------- --------
          • Hashtable - Save Handle OfFBurst_Caster as 10 of FBurst_UnitId in FBurst_Hash
          • Hashtable - Save FBurst_AbilityLvl as 11 of FBurst_UnitId in FBurst_Hash
        • Else - Actions
          • -------- do nothing --------


FBurst Order
  • FBurst Order
    • Events
      • Unit - A unit Is issued an order targeting an object
    • Conditions
      • (Issued order) Equal to (Order(FBurst_ORDER_ID))
    • Actions
      • -------- FBurst Order --------
      • -------- this trigger will ensure that the caster cannot overwrite a stronger leveled instance of the primary debuff --------
      • -------- --------
      • -------- child keys required for order checking mechanic --------
      • -------- 2 - ability level --------
      • -------- --------
      • -------- --------
      • -------- there can be multiple spells in a map with the same order id. to ensure it's the one we are looking for, check for the level of the ABILITY on the triggering unit --------
      • Set FBurst_TempUnit = (Triggering unit)
      • Set FBurst_AbilityLvl = (Level of FBurst_ABILITY for FBurst_TempUnit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • FBurst_AbilityLvl Greater than 0
        • Then - Actions
          • -------- order id and ability match --------
          • -------- --------
          • -------- checking if the current ability level is weaker than the target's current instance --------
          • Custom script: set udg_FBurst_UnitId = GetHandleId(GetOrderTarget())
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • FBurst_AbilityLvl Less than (Load 2 of FBurst_UnitId from FBurst_Hash)
            • Then - Actions
              • -------- current ability level is weaker than the target's current instance --------
              • -------- --------
              • Unit - Pause FBurst_TempUnit
              • Unit - Order FBurst_TempUnit to Stop
              • Unit - Unpause FBurst_TempUnit
              • -------- play error message --------
              • Set FBurst_Owner = (Triggering player)
              • Custom script: if (GetLocalPlayer() == udg_FBurst_Owner) then
              • Custom script: call ClearTextMessages()
              • Custom script: call DisplayTimedTextToPlayer(udg_FBurst_Owner, 0.52, 0.96, 2.00, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n|cffffcc00" + udg_FBurst_ERROR_MSG +"|r")
              • Sound - Play FBurst_ErrorSound
              • Custom script: endif
            • Else - Actions
              • -------- do nothing --------
        • Else - Actions
          • -------- do nothing --------


FBurst Primary Loop
  • FBurst Primary Loop
    • Events
    • Conditions
    • Actions
      • -------- FBurst Primary Loop --------
      • -------- this trigger will run the periodic actions of the primary spell (deal damage, create blast waves, and end the spell instance if it has to) --------
      • -------- --------
      • -------- child keys for primary instance --------
      • -------- 0 - caster --------
      • -------- 1 - owner --------
      • -------- 2 - ability level --------
      • -------- 3 - duration --------
      • -------- 4 - duration counter for wave --------
      • -------- 5 - special effect --------
      • -------- --------
      • -------- --------
      • Unit Group - Pick every unit in FBurst_PrimaryGroup and do (Actions)
        • Loop - Actions
          • Set FBurst_Target = (Picked unit)
          • Custom script: set udg_FBurst_UnitId = GetHandleId(udg_FBurst_Target)
          • -------- --------
          • -------- check if it is time to create blast wave (must be done before we check if the instance must end to ensure that the wave at 0 seconds is created) --------
          • Set FBurst_Caster = (Load 0 of FBurst_UnitId in FBurst_Hash)
          • Set FBurst_AbilityLvl = (Load 2 of FBurst_UnitId from FBurst_Hash)
          • Set FBurst_WaveCounter = ((Load 4 of FBurst_UnitId from FBurst_Hash) - FBurst_PERIODIC_TIMER)
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • FBurst_WaveCounter Less than or equal to 0.00
            • Then - Actions
              • -------- create blast wave --------
              • Special Effect - Create a special effect attached to the FBurst_SFX_WAVE_INDICATOR_AP of FBurst_Target using FBurst_SFX_WAVE_INDICATOR
              • Special Effect - Destroy (Last created special effect)
              • Custom script: set udg_FBurst_X = GetUnitX(udg_FBurst_Target)
              • Custom script: set udg_FBurst_Y = GetUnitY(udg_FBurst_Target)
              • Set FBurst_Owner = (Load 1 of FBurst_UnitId in FBurst_Hash)
              • Set FBurst_Angle = 0.00
              • For each (Integer FBurst_LoopInt) from 1 to FBurst_WAVE_COUNT[FBurst_AbilityLvl], do (Actions)
                • Loop - Actions
                  • Trigger - Run FBurst_TRIGGER_CREATE_WAVE (ignoring conditions)
                  • Set FBurst_Angle = (FBurst_Angle + FBurst_SpawnAngle[FBurst_AbilityLvl])
              • -------- reset timer for WaveCounter --------
              • Set FBurst_WaveCounter = FBurst_WAVE_INTERVAL[FBurst_AbilityLvl]
            • Else - Actions
              • -------- do nothing --------
          • -------- --------
          • -------- check end conditions before performing other loop actions --------
          • Set FBurst_Duration = (Load 3 of FBurst_UnitId from FBurst_Hash)
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Or - Any (Conditions) are true
                • Conditions
                  • (FBurst_Target is dead) Equal to True
                  • (FBurst_Target has buff FBurst_DEBUFF_PRIMARY) Equal to False
                  • FBurst_Duration Less than or equal to 0.00
            • Then - Actions
              • -------- end instance --------
              • Unit - Remove FBurst_DEBUFF_PRIMARY buff from FBurst_Target
              • Special Effect - Destroy (Load 5 of FBurst_UnitId in FBurst_Hash)
              • -------- manually removing child keys 0-5 because child keys 6-9 might still be needed --------
              • Custom script: call RemoveSavedHandle(udg_FBurst_Hash, udg_FBurst_UnitId, 0)
              • Custom script: call RemoveSavedHandle(udg_FBurst_Hash, udg_FBurst_UnitId, 1)
              • Custom script: call RemoveSavedInteger(udg_FBurst_Hash, udg_FBurst_UnitId, 2)
              • Custom script: call RemoveSavedReal(udg_FBurst_Hash, udg_FBurst_UnitId, 3)
              • Custom script: call RemoveSavedReal(udg_FBurst_Hash, udg_FBurst_UnitId, 4)
              • Custom script: call RemoveSavedReal(udg_FBurst_Hash, udg_FBurst_UnitId, 5)
              • -------- --------
              • Unit Group - Remove FBurst_Target from FBurst_PrimaryGroup
              • Set FBurst_PrimaryGroupCount = (FBurst_PrimaryGroupCount - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • FBurst_PrimaryGroupCount Equal to 0
                • Then - Actions
                  • Trigger - Turn off FBurst_TRIGGER_PRIMARY_LOOP
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • FBurst_SecondaryGroupCount Equal to 0
                    • Then - Actions
                      • Trigger - Turn off FBurst_TRIGGER_DOT_DEATH
                    • Else - Actions
                      • -------- do nothing --------
                • Else - Actions
                  • -------- do nothing --------
            • Else - Actions
              • Unit - Cause FBurst_Caster to damage FBurst_Target, dealing FBurst_DOT_PRIMARY_DAMAGE[FBurst_AbilityLvl] damage of attack type FBurst_ATTACK_TYPE and damage type FBurst_DAMAGE_TYPE
              • -------- --------
              • Hashtable - Save (FBurst_Duration - FBurst_PERIODIC_TIMER) as 3 of FBurst_UnitId in FBurst_Hash
              • Hashtable - Save FBurst_WaveCounter as 4 of FBurst_UnitId in FBurst_Hash


FBurst Wave Index
  • FBurst Wave Index
    • Events
    • Conditions
    • Actions
      • -------- FBurst Wave Index --------
      • -------- this trigger creates an individual wave of an entire blast wave mechanic --------
      • -------- once a wave is created, it will be added into the linked list with the necessary data to function as intended --------
      • -------- --------
      • -------- members --------
      • -------- SourceUnit[] = unit that will be emitting the explosions --------
      • -------- CasterWave[] = caster that started the effect --------
      • -------- OwnerWave[] = owner of CasterWave[] --------
      • -------- AbilityLvlWave[] = level of primary ability of caster --------
      • -------- WaveUnit[] = dummy unit with the wave special effect --------
      • -------- DistancedTraveled[] = total distance moved by WaveUnit[] --------
      • -------- Cos[] = cosine of the angle in which WaveUnit[] will move --------
      • -------- Sin[] = Sine of the angle in which WaveUnit[] will move --------
      • -------- WaveSfx[] = special effect of the wave --------
      • -------- --------
      • -------- --------
      • Set FBurst_WaveCount = (FBurst_WaveCount + 1)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • FBurst_WaveCount Equal to 1
        • Then - Actions
          • Trigger - Turn on FBurst_TRIGGER_WAVE_LOOP
        • Else - Actions
          • -------- do nothing --------
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • FBurst_RecycledSize Equal to 0
        • Then - Actions
          • Set FBurst_MaxIndex = (FBurst_MaxIndex + 1)
          • Set FBurst_WaveId = FBurst_MaxIndex
        • Else - Actions
          • Set FBurst_RecycledSize = (FBurst_RecycledSize - 1)
          • Set FBurst_WaveId = FBurst_RecycledStack[FBurst_RecycledSize]
      • Set FBurst_NodeNext[FBurst_WaveId] = 0
      • Set FBurst_NodePrev[FBurst_WaveId] = FBurst_NodePrev[0]
      • Set FBurst_NodeNext[FBurst_NodePrev[0]] = FBurst_WaveId
      • Set FBurst_NodePrev[0] = FBurst_WaveId
      • -------- --------
      • Custom script: set udg_FBurst_WaveUnit[udg_FBurst_WaveId] = CreateUnit(udg_FBurst_SPELL_DUMMY_OWNER, udg_FBurst_SPELL_DUMMY_UNIT_TYPE, udg_FBurst_X, udg_FBurst_Y, udg_FBurst_Angle)
      • -------- repositioning dummy unit to the center because the target's collision size will displace the effect --------
      • Custom script: call SetUnitX(udg_FBurst_WaveUnit[udg_FBurst_WaveId], udg_FBurst_X)
      • Custom script: call SetUnitY(udg_FBurst_WaveUnit[udg_FBurst_WaveId], udg_FBurst_Y)
      • -------- --------
      • Set FBurst_SourceUnit[FBurst_WaveId] = FBurst_Target
      • Set FBurst_CasterWave[FBurst_WaveId] = FBurst_Caster
      • Set FBurst_OwnerWave[FBurst_WaveId] = FBurst_Owner
      • Set FBurst_AbilityLvlWave[FBurst_WaveId] = FBurst_AbilityLvl
      • -------- --------
      • Set FBurst_DistanceTraveled[FBurst_WaveId] = FBurst_TRAVEL_DISTANCE[FBurst_AbilityLvlWave[FBurst_WaveId]]
      • Set FBurst_Cos[FBurst_WaveId] = (Cos(FBurst_Angle))
      • Set FBurst_Sin[FBurst_WaveId] = (Sin(FBurst_Angle))
      • -------- --------
      • Special Effect - Create a special effect attached to the FBurst_SFX_WAVE_AP of FBurst_WaveUnit[FBurst_WaveId] using FBurst_SFX_WAVE
      • Set FBurst_WaveSfx[FBurst_WaveId] = (Last created special effect)


FBurst Wave Loop
  • FBurst Wave Loop
    • Events
    • Conditions
    • Actions
      • -------- FBurst Wave Index --------
      • -------- this trigger peridoically moves WaveUnit[] --------
      • -------- during the movement of WaveUnit[], the trigger will also periodically check if any units are within the radius of WaveUnit[] --------
      • -------- if a unit is within the radius of WaveUnit[], a secondary instance will be indexed for them --------
      • -------- --------
      • -------- members --------
      • -------- SourceUnit[] = unit that will be emitting the explosions --------
      • -------- CasterWave[] = caster that started the effect --------
      • -------- OwnerWave[] = owner of CasterWave[] --------
      • -------- AbilityLvlWave[] = level of primary ability of caster --------
      • -------- WaveUnit[] = dummy unit with the wave special effect --------
      • -------- DistancedTraveled[] = total distance moved by WaveUnit[] --------
      • -------- Cos[] = cosine of the angle in which WaveUnit[] will move --------
      • -------- Sin[] = Sine of the angle in which WaveUnit[] will move --------
      • -------- WaveSfx[] = special effect of the wave --------
      • -------- --------
      • -------- --------
      • Custom script: local real x
      • Custom script: local real y
      • Set FBurst_WaveId = 0
      • For each (Integer FBurst_LoopInt) from 1 to FBurst_WaveCount, do (Actions)
        • Loop - Actions
          • Set FBurst_WaveId = FBurst_NodeNext[FBurst_WaveId]
          • -------- --------
          • Custom script: set x = GetUnitX(udg_FBurst_WaveUnit[udg_FBurst_WaveId]) + udg_FBurst_TravelSpeed[udg_FBurst_AbilityLvlWave[udg_FBurst_WaveId]] * udg_FBurst_Cos[udg_FBurst_WaveId]
          • Custom script: set y = GetUnitY(udg_FBurst_WaveUnit[udg_FBurst_WaveId]) + udg_FBurst_TravelSpeed[udg_FBurst_AbilityLvlWave[udg_FBurst_WaveId]] * udg_FBurst_Sin[udg_FBurst_WaveId]
          • -------- checking if terrain ahead is pathable for WaveUnit[] --------
          • Custom script: set udg_CP_Point = Location(x, y)
          • Trigger - Run FBurst_TRIGGER_PATHING_CHECK (ignoring conditions)
          • -------- --------
          • -------- checking if instance should be ended --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Or - Any (Conditions) are true
                • Conditions
                  • CP_PointIsWalkable Equal to False
                  • FBurst_DistanceTraveled[FBurst_WaveId] Less than or equal to 0.00
            • Then - Actions
              • -------- end instance --------
              • Unit - Kill FBurst_WaveUnit[FBurst_WaveId]
              • Special Effect - Destroy FBurst_WaveSfx[FBurst_WaveId]
              • -------- --------
              • Set FBurst_RecycledStack[FBurst_RecycledSize] = FBurst_WaveId
              • Set FBurst_RecycledSize = (FBurst_RecycledSize + 1)
              • Set FBurst_NodeNext[FBurst_NodePrev[FBurst_WaveId]] = FBurst_NodeNext[FBurst_WaveId]
              • Set FBurst_NodePrev[FBurst_NodeNext[FBurst_WaveId]] = FBurst_NodePrev[FBurst_WaveId]
              • -------- --------
              • Set FBurst_WaveCount = (FBurst_WaveCount - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • FBurst_WaveCount Equal to 0
                • Then - Actions
                  • Trigger - Turn off FBurst_TRIGGER_WAVE_LOOP
                • Else - Actions
                  • -------- do nothing --------
            • Else - Actions
              • Set FBurst_DistanceTraveled[FBurst_WaveId] = (FBurst_DistanceTraveled[FBurst_WaveId] - FBurst_TravelSpeed[FBurst_AbilityLvlWave[FBurst_WaveId]])
              • Custom script: call SetUnitX(udg_FBurst_WaveUnit[udg_FBurst_WaveId], x)
              • Custom script: call SetUnitY(udg_FBurst_WaveUnit[udg_FBurst_WaveId], y)
              • -------- --------
              • -------- checking if there are any nearby enemy units --------
              • -------- using GroupEnumUnitsInRange because GetUnitsInRangeOfLoc has a reference handle leak --------
              • Custom script: call GroupEnumUnitsInRange(udg_FBurst_InRangeGroup, x, y, udg_FBurst_WAVE_RADIUS[udg_FBurst_AbilityLvlWave[udg_FBurst_WaveId]], null)
              • -------- removing the original target so that they do not get their own secondary debuff --------
              • Unit Group - Remove FBurst_SourceUnit[FBurst_WaveId] from FBurst_InRangeGroup
              • Unit Group - Pick every unit in FBurst_InRangeGroup and do (Actions)
                • Loop - Actions
                  • Set FBurst_TempUnit = (Picked unit)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (FBurst_TempUnit is A structure) Equal to False
                      • (FBurst_TempUnit is A flying unit) Equal to False
                      • (FBurst_TempUnit is Magic Immune) Equal to False
                      • (FBurst_TempUnit is alive) Equal to True
                      • (FBurst_TempUnit belongs to an enemy of FBurst_OwnerWave[FBurst_WaveId]) Equal to True
                    • Then - Actions
                      • Trigger - Run FBurst_TRIGGER_APPLY_DOT (ignoring conditions)
                    • Else - Actions
                      • -------- do nothing --------
                  • Unit Group - Remove FBurst_TempUnit from FBurst_InRangeGroup


FBurst DoT Apply
  • FBurst DoT Apply
    • Events
    • Conditions
    • Actions
      • -------- FBurst DoT Apply --------
      • -------- this trigger applies the DoT debuff to units who are hit by the blast wave. since the debuff is non-stacking, it will first check if the unit already has the debuff --------
      • -------- if the unit does not already have the debuff, it will simply be given a new instance --------
      • -------- if the unit does have the debuff, and the new debuff is equal or stronger in level, the debuff will be reapplied, and the duration will be reset along with updated data from the caster --------
      • -------- --------
      • -------- child keys for secondary instance --------
      • -------- 6 - caster --------
      • -------- 7 - ability level --------
      • -------- 8 - duration --------
      • -------- 9 - special effect --------
      • -------- --------
      • -------- child keys for explosion mechanic --------
      • -------- 10 - caster --------
      • -------- 11 - ability level --------
      • -------- --------
      • -------- --------
      • Custom script: set udg_FBurst_UnitId = GetHandleId(udg_FBurst_TempUnit)
      • -------- checking if unit has the debuff or not --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (FBurst_TempUnit has buff FBurst_DEBUFF_SECONDARY) Equal to False
        • Then - Actions
          • -------- unit does not have buff --------
          • -------- --------
          • Unit Group - Add FBurst_TempUnit to FBurst_SeondaryGroup
          • Set FBurst_SecondaryGroupCount = (FBurst_SecondaryGroupCount + 1)
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • FBurst_SecondaryGroupCount Equal to 1
            • Then - Actions
              • Trigger - Turn on FBurst_TRIGGER_SECONDARY_LOOP
            • Else - Actions
              • -------- do nothing --------
        • Else - Actions
          • -------- unit has buff --------
          • -------- --------
          • -------- checking if the new instance level is equal or greater than the current instance's level --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • FBurst_AbilityLvlWave[FBurst_WaveId] Greater than or equal to (Load 7 of FBurst_UnitId from FBurst_Hash)
            • Then - Actions
              • -------- new instance level is equal or greater --------
              • -------- --------
              • -------- removing original effect + debuff to give it that "reapplication" effect --------
              • Unit - Remove FBurst_DEBUFF_SECONDARY buff from FBurst_TempUnit
              • Special Effect - Destroy (Load 9 of FBurst_UnitId in FBurst_Hash)
            • Else - Actions
              • -------- new instance level is not equal or greater --------
              • -------- --------
              • Skip remaining actions
      • -------- --------
      • Set FBurst_TempLoc = (Position of FBurst_TempUnit)
      • Unit - Move FBurst_DummyCaster instantly to FBurst_TempLoc
      • Unit - Order FBurst_DummyCaster to Undead Banshee - Curse FBurst_TempUnit
      • Special Effect - Create a special effect attached to the FBurst_SFX_SECOND_DEBUFF_AP of FBurst_TempUnit using FBurst_SFX_SECOND_DEBUFF
      • Custom script: call RemoveLocation(udg_FBurst_TempLoc)
      • -------- --------
      • -------- saving necessary data --------
      • Hashtable - Save Handle OfFBurst_CasterWave[FBurst_WaveId] as 6 of FBurst_UnitId in FBurst_Hash
      • Hashtable - Save FBurst_AbilityLvlWave[FBurst_WaveId] as 7 of FBurst_UnitId in FBurst_Hash
      • Hashtable - Save FBurst_DOT_SECONDARY_DURATION[FBurst_AbilityLvlWave[FBurst_WaveId]] as 8 of FBurst_UnitId in FBurst_Hash
      • Hashtable - Save Handle Of(Last created special effect) as 9 of FBurst_UnitId in FBurst_Hash
      • -------- --------
      • -------- storing the highest ability level between the primary or secondary debuff --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • FBurst_AbilityLvlWave[FBurst_WaveId] Greater than or equal to (Load 11 of FBurst_UnitId from FBurst_Hash)
        • Then - Actions
          • -------- current ability level is equal or greater to the previous one --------
          • -------- --------
          • Hashtable - Save Handle OfFBurst_CasterWave[FBurst_WaveId] as 10 of FBurst_UnitId in FBurst_Hash
          • Hashtable - Save FBurst_AbilityLvlWave[FBurst_WaveId] as 11 of FBurst_UnitId in FBurst_Hash
        • Else - Actions
          • -------- do nothing --------


FBurst DoT Loop
  • FBurst DoT Loop
    • Events
    • Conditions
    • Actions
      • -------- FBurst DoT Apply --------
      • -------- this trigger will run the periodic actions of the secondary spell (deal damage and end the spell instance if it has to) --------
      • -------- --------
      • -------- child keys for secondary instance --------
      • -------- 6 - caster --------
      • -------- 7 - ability level --------
      • -------- 8 - duration --------
      • -------- 9 - special effect --------
      • -------- --------
      • -------- --------
      • Unit Group - Pick every unit in FBurst_SeondaryGroup and do (Actions)
        • Loop - Actions
          • Set FBurst_Target = (Picked unit)
          • Custom script: set udg_FBurst_UnitId = GetHandleId(udg_FBurst_Target)
          • -------- --------
          • -------- check end conditions before dealing damage to unit --------
          • Set FBurst_Duration = (Load 8 of FBurst_UnitId from FBurst_Hash)
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Or - Any (Conditions) are true
                • Conditions
                  • (FBurst_Target is dead) Equal to True
                  • (FBurst_Target has buff FBurst_DEBUFF_SECONDARY) Equal to False
                  • FBurst_Duration Less than or equal to 0.00
            • Then - Actions
              • -------- end instance --------
              • Unit - Remove FBurst_DEBUFF_SECONDARY buff from FBurst_Target
              • Special Effect - Destroy (Load 9 of FBurst_UnitId in FBurst_Hash)
              • -------- manually removing child keys 6-9 because child keys 0-5 might still be needed --------
              • Custom script: call RemoveSavedHandle(udg_FBurst_Hash, udg_FBurst_UnitId, 6)
              • Custom script: call RemoveSavedInteger(udg_FBurst_Hash, udg_FBurst_UnitId, 7)
              • Custom script: call RemoveSavedReal(udg_FBurst_Hash, udg_FBurst_UnitId, 8)
              • Custom script: call RemoveSavedHandle(udg_FBurst_Hash, udg_FBurst_UnitId, 9)
              • -------- --------
              • Unit Group - Remove FBurst_Target from FBurst_SeondaryGroup
              • Set FBurst_SecondaryGroupCount = (FBurst_SecondaryGroupCount - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • FBurst_SecondaryGroupCount Equal to 0
                • Then - Actions
                  • Trigger - Turn off FBurst_TRIGGER_SECONDARY_LOOP
                  • -------- --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • FBurst_PrimaryGroupCount Equal to 0
                    • Then - Actions
                      • Trigger - Turn off FBurst_TRIGGER_DOT_DEATH
                    • Else - Actions
                      • -------- do nothing --------
                • Else - Actions
                  • -------- do nothing --------
            • Else - Actions
              • Unit - Cause (Load 6 of FBurst_UnitId in FBurst_Hash) to damage FBurst_Target, dealing FBurst_DOT_SECONDARY_DAMAGE[(Load 7 of FBurst_UnitId from FBurst_Hash)] damage of attack type FBurst_ATTACK_TYPE and damage type FBurst_DAMAGE_TYPE
              • -------- --------
              • Hashtable - Save (FBurst_Duration - FBurst_PERIODIC_TIMER) as 8 of FBurst_UnitId in FBurst_Hash


FBurst DoT Death
  • FBurst DoT Death
    • Events
      • Unit - A unit Dies
    • Conditions
    • Actions
      • -------- FBurst DoT Death --------
      • -------- this trigger will run the explosion mechanic if a unit with either the primary or secondary debuff dies --------
      • -------- --------
      • -------- child keys for explosion mechanic --------
      • -------- 10 - caster --------
      • -------- 11 - ability level --------
      • -------- --------
      • -------- --------
      • -------- checking if dying unit has secondary debuff --------
      • Set FBurst_TempUnit = (Triggering unit)
      • Custom script: set udg_FBurst_TempInt = GetHandleId(udg_FBurst_TempUnit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • Or - Any (Conditions) are true
            • Conditions
              • (FBurst_TempUnit is in FBurst_SeondaryGroup) Equal to True
              • (FBurst_TempUnit is in FBurst_PrimaryGroup) Equal to True
        • Then - Actions
          • -------- dying unit has debuff --------
          • -------- --------
          • Special Effect - Create a special effect attached to the FBurst_SFX_EXPLOSION_AP of FBurst_TempUnit using FBurst_SFX_EXPLOSION
          • Special Effect - Destroy (Last created special effect)
          • -------- --------
          • Set FBurst_Caster = (Load 10 of FBurst_TempInt in FBurst_Hash)
          • Set FBurst_AbilityLvl = (Load 11 of FBurst_TempInt from FBurst_Hash)
          • Set FBurst_Owner = (Owner of FBurst_TempUnit)
          • -------- --------
          • -------- checking if there are any nearby enemy units --------
          • -------- using GroupEnumUnitsInRange because GetUnitsInRangeOfLoc has a reference handle leak --------
          • Custom script: call GroupEnumUnitsInRange(udg_FBurst_InRangeGroup, GetUnitX(udg_FBurst_TempUnit), GetUnitY(udg_FBurst_TempUnit), udg_FBurst_EXPLOSION_RADIUS[udg_FBurst_AbilityLvl], null)
          • Unit Group - Pick every unit in FBurst_InRangeGroup and do (Actions)
            • Loop - Actions
              • Set FBurst_TempUnit = (Picked unit)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (FBurst_TempUnit is A structure) Equal to False
                  • (FBurst_TempUnit is Magic Immune) Equal to False
                  • (FBurst_TempUnit is alive) Equal to True
                  • (FBurst_TempUnit belongs to an ally of FBurst_Owner) Equal to True
                • Then - Actions
                  • Unit - Cause FBurst_Caster to damage FBurst_TempUnit, dealing FBurst_EXPLOSION_DAMAGE[FBurst_AbilityLvl] damage of attack type FBurst_ATTACK_TYPE and damage type FBurst_DAMAGE_TYPE
                • Else - Actions
                  • -------- do nothing --------
              • Unit Group - Remove FBurst_TempUnit from FBurst_InRangeGroup
          • -------- --------
          • -------- manually removing child keys 10 & 11 because child keys 0-9 might still be needed --------
          • Custom script: call RemoveSavedHandle(udg_FBurst_Hash, udg_FBurst_UnitId, 10)
          • Custom script: call RemoveSavedInteger(udg_FBurst_Hash, udg_FBurst_UnitId, 11)
        • Else - Actions
          • -------- do nothing --------


Changelog (04 April 2017)


Added:
  • Uploaded

Fixed / Changed:
  • Nothing

Removed:
  • Nothing
Contents

Flame Burst v1.00 (Map)

Reviews
Tank-Commander
The winning entry - looks great, easy to use and the code is clean and consistent, approved Suggestions: Nothing really, perhaps remove air targeting for consistency but hardly major
  1. Tank-Commander

    Tank-Commander

    Spell Reviewer

    Joined:
    May 26, 2009
    Messages:
    1,543
    Resources:
    44
    Packs:
    1
    Spells:
    41
    Tutorials:
    2
    Resources:
    44
    The winning entry - looks great, easy to use and the code is clean and consistent, approved

    Suggestions: Nothing really, perhaps remove air targeting for consistency but hardly major