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

Call of the Damned v1.0

Call of the Damned v1.0

Creates a summoning circle which allows the caster to conjure demons from another realm. Acolytes may help the caster during the summoning to reduce the summoning time and summon additional units.
Triggers


  • Call of the Damned Init
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- --------
      • -------- Main Ability --------
      • Set CD_Ability = Call of the Damned
      • -------- --------
      • -------- Orderstring of the Main ability --------
      • Set CD_AbilityOrder = starfall
      • -------- --------
      • -------- Ability that switches the Main Ability with the Fake Ability --------
      • -------- Note: This is necessary to avoid double casting the ability by the same unit --------
      • Set CD_SwitchAbility = Switch Call of the Damned
      • -------- --------
      • -------- Unit-type of the summoned unit which will appear on the center --------
      • -------- Note: Its usually the strongest unit in the batch --------
      • Set CD_SummonedUnitType[1] = Doom Guard - level 1
      • Set CD_SummonedUnitType[2] = Doom Guard - level 2
      • Set CD_SummonedUnitType[3] = Doom Guard - level 3
      • Set CD_SummonedUnitType[4] = Doom Guard - level 4
      • -------- --------
      • -------- The number of summoned units which will appear in the center of the circle --------
      • Set CD_SummonedUnitCount[1] = 1
      • Set CD_SummonedUnitCount[2] = 1
      • Set CD_SummonedUnitCount[3] = 1
      • Set CD_SummonedUnitCount[4] = 1
      • -------- --------
      • -------- Unit-type of the bonus unit that comes with the summoned unit once the summoning is complete --------
      • Set CD_BonusUnitType[1] = Fel Beast - level 1
      • Set CD_BonusUnitType[2] = Fel Beast - level 2
      • Set CD_BonusUnitType[3] = Fel Beast - level 3
      • Set CD_BonusUnitType[4] = Fel Beast - level 4
      • -------- --------
      • -------- The number of additional units that are summoned with each apprentice --------
      • -------- Note: When i mentioned apprentice im referring to acolytes --------
      • Set CD_BonusUnitCount[1] = 1
      • Set CD_BonusUnitCount[2] = 1
      • Set CD_BonusUnitCount[3] = 1
      • Set CD_BonusUnitCount[4] = 1
      • -------- --------
      • -------- How long will the summoned units last in our realm --------
      • -------- Note: If you want the summoned units to be permanent then make the value equal to zero (0) --------
      • Set CD_SummonedUnitDuration[1] = 120.00
      • Set CD_SummonedUnitDuration[2] = 120.00
      • Set CD_SummonedUnitDuration[3] = 120.00
      • Set CD_SummonedUnitDuration[4] = 120.00
      • -------- --------
      • -------- How long will it take to finish summoning --------
      • -------- Note: It should be less than the casting time of the main ability --------
      • Set CD_CastingTime[1] = 30.00
      • Set CD_CastingTime[2] = 30.00
      • Set CD_CastingTime[3] = 30.00
      • Set CD_CastingTime[4] = 30.00
      • -------- --------
      • -------- How many apprentice are allowed to help the caster --------
      • Set CD_ApprenticeUnitAllowed[1] = 2
      • Set CD_ApprenticeUnitAllowed[2] = 3
      • Set CD_ApprenticeUnitAllowed[3] = 4
      • Set CD_ApprenticeUnitAllowed[4] = 5
      • -------- --------
      • -------- The amount of casting time reduced when an apprentice helps the caster --------
      • Set CD_CastingTimeReduction[1] = 2.00
      • Set CD_CastingTimeReduction[2] = 2.00
      • Set CD_CastingTimeReduction[3] = 2.00
      • Set CD_CastingTimeReduction[4] = 2.00
      • -------- --------
      • -------- How large is the detection radius of each formation circle dedicated for the apprentice --------
      • Set CD_ApprenticeAoE[1] = 100.00
      • Set CD_ApprenticeAoE[2] = 100.00
      • Set CD_ApprenticeAoE[3] = 100.00
      • Set CD_ApprenticeAoE[4] = 100.00
      • -------- --------
      • -------- The actual size of the summoning circle --------
      • -------- Note: this is not the actual model circle but it determines how far are the apprentices from the center --------
      • Set CD_SummoningCircleAoE[1] = 500.00
      • Set CD_SummoningCircleAoE[2] = 500.00
      • Set CD_SummoningCircleAoE[3] = 500.00
      • Set CD_SummoningCircleAoE[4] = 500.00
      • -------- --------
      • -------- How far from the center of the summoning circle will the bonus units appear --------
      • Set CD_BonusUnitOffset[1] = 250.00
      • Set CD_BonusUnitOffset[2] = 250.00
      • Set CD_BonusUnitOffset[3] = 250.00
      • Set CD_BonusUnitOffset[4] = 250.00
      • -------- --------
      • -------- How large is the summoning circle model --------
      • -------- Note: the value comes in %. meaning 200 = 2x the size of the actual model --------
      • Set CD_SummoningCircleSize[1] = 300.00
      • Set CD_SummoningCircleSize[2] = 300.00
      • Set CD_SummoningCircleSize[3] = 300.00
      • Set CD_SummoningCircleSize[4] = 300.00
      • -------- --------
      • -------- Model used as the summoning circle --------
      • Set CD_SummoningCircleSFX = SharedModels\UBirth.mdl
      • -------- --------
      • -------- Transparency of the summoning circle --------
      • -------- Note:for this model i need a transparency to remove the creepy claw in it --------
      • Set CD_SummoningCircleTransparency = 1.00
      • -------- --------
      • -------- Model used once the summoning is complete/cancelled --------
      • Set CD_CleanSFX = Objects\Spawnmodels\Undead\UDeathMedium\UDeath.mdl
      • -------- --------
      • -------- The amount of time before the summoning circle vanishes when the summoning is complete/cancelled --------
      • -------- Note: the value is 2.10 to fit the spell visuals --------
      • Set CD_SummoningCircleDelay = 2.10
      • -------- --------
      • -------- Special effects found at the center of the summoning circle while summoning for added visuals --------
      • Set CD_SummoningGroundSFX1 = Abilities\Spells\Undead\Unsummon\UnsummonTarget.mdl
      • Set CD_SummoningGroundSFX2 = Abilities\Spells\Undead\Darksummoning\DarkSummonTarget.mdl
      • -------- --------
      • -------- The model used as indicator on where the caster stands and where the acolytes must stand --------
      • Set CD_FormationSFX = Abilities\Spells\Undead\Darksummoning\DarkSummonTarget.mdl
      • -------- --------
      • -------- The model used to indicate that the acolytes are helping the caster summon --------
      • Set CD_NotifySFX = Abilities\Spells\Items\TomeOfRetraining\TomeOfRetrainingCaster.mdl
      • -------- --------
      • -------- The model used as an indicator that the summoning has been successful --------
      • -------- Note: It appears at the center of the circle --------
      • Set CD_SpawnSFX = Doodads\Cinematic\ShimmeringPortal\ShimmeringPortal.mdl
      • -------- --------
      • -------- The animation of the substitute units --------
      • -------- Note: Substitute unit looks like the helping unit the only difference is they cannot be selected --------
      • -------- and are only there for the visuals --------
      • Set CD_SubstituteAnimation = work
      • -------- --------
      • -------- The interval on which the animation of the substitute units are called while summoning --------
      • -------- Note: Substitute unit looks like the helping unit the only difference is they cannot be selected --------
      • -------- and are only there for the visuals --------
      • Set CD_SubstituteInterval = 2.26
      • -------- --------
      • -------- The model used for the flying souls during the summoning ritual --------
      • Set CD_SoulSFX = Abilities\Weapons\ZigguratMissile\ZigguratMissile.mdl
      • -------- --------
      • -------- The maximum height of the souls --------
      • Set CD_SoulMaxHeight = 500.00
      • -------- --------
      • -------- The rotation of the souls --------
      • -------- Note: True of clockwise and False if counter-clockwise --------
      • Set CD_IsClockwise = True
      • -------- --------
      • -------- The speed of the rotation of the souls around the center of the circle --------
      • Set CD_SoulTurnRate = 3.00
      • -------- --------
      • -------- The amount of time before the soul reaches the center from the outside of the circle --------
      • Set CD_SoulDelay = 1.00
      • -------- --------
      • -------- The rate on which the souls are ascending or descending --------
      • Set CD_SoulHeightSpeed = 5.00
      • -------- --------
      • -------- The Unit-Type of the unit that can help with the summoning --------
      • Set CD_ApprenticeUnitType = Acolyte
      • -------- --------
      • -------- The Unit-Type of the substitute unit --------
      • -------- Note: Substitute unit looks like the helping unit the only difference is they cannot be selected --------
      • -------- and are only there for the visuals --------
      • Set CD_SubstituteUnitType = Apprentice
      • -------- --------
      • -------- The Unit-Type of the multipurpose dummy --------
      • Set CD_DummyUnitType = Dummy
      • -------- --------
      • -------- NECESSARRY ACTIONS --------
      • -------- Note: Do NOT tamper unless you know what you are doing --------
      • -------- --------
      • -------- Disable the switch ability to all players --------
      • For each (Integer CD_TempInt) from 1 to 12, do (Actions)
        • Loop - Actions
          • Player - Disable Switch Call of the Damned for (Player(CD_TempInt))
      • -------- --------
      • -------- Preload --------
      • Set CD_Point1 = (Random point in (Playable map area))
      • Unit - Create 1 CD_DummyUnitType for Neutral Passive at CD_Point1 facing Default building facing degrees
      • Set CD_Harvester = (Last created unit)
      • -------- --------
      • Unit - Add CD_Ability to CD_Harvester
      • Unit - Remove CD_Ability from CD_Harvester
      • -------- --------
      • Unit - Add Harvest (Gold and Lumber) to CD_Harvester
      • -------- --------
      • Custom script: call RemoveLocation(udg_CD_Point1)



  • Call of the Damned Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to CD_Ability
    • Actions
      • -------- --------
      • -------- Set current index --------
      • Set CD_Index1 = (CD_Index1 + 1)
      • -------- --------
      • -------- Store necessary values --------
      • Set CD_CasterUnit[CD_Index1] = (Triggering unit)
      • Set CD_Player[CD_Index1] = (Triggering player)
      • Set CD_Level[CD_Index1] = (Level of CD_Ability for CD_CasterUnit[CD_Index1])
      • -------- --------
      • -------- Set necessary points --------
      • Set CD_Point1 = (Position of CD_CasterUnit[CD_Index1])
      • Set CD_Point2 = (CD_Point1 offset by CD_SummoningCircleAoE[CD_Level[CD_Index1]] towards (Facing of CD_CasterUnit[CD_Index1]) degrees)
      • -------- --------
      • -------- clearing the path --------
      • Destructible - Pick every destructible within (CD_SummoningCircleAoE[CD_Level[CD_Index1]] + CD_ApprenticeAoE[CD_Level[CD_Index1]]) of CD_Point2 and do (Actions)
        • Loop - Actions
          • Set CD_Destructible = (Picked destructible)
          • Unit - Order CD_Harvester to Harvest CD_Destructible
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Current order of CD_Harvester) Equal to (Order(harvest))
            • Then - Actions
              • Destructible - Kill CD_Destructible
              • Unit - Order CD_Harvester to Stop
            • Else - Actions
      • -------- --------
      • -------- Calculate angles 360 (full circle) divided by the number of allowed helper + 1 --------
      • -------- to create the perfect gap between the caster and the summoners --------
      • Set CD_TempAngle = (Angle from CD_Point2 to CD_Point1)
      • Set CD_AngleAdjustment = (360.00 / ((Real(CD_ApprenticeUnitAllowed[CD_Level[CD_Index1]])) + 1.00))
      • -------- --------
      • -------- Create the dummy for the summoning circle on where the other models will be attached --------
      • Unit - Create 1 CD_DummyUnitType for Neutral Passive at CD_Point2 facing CD_TempAngle degrees
      • Set CD_SummoningCircleUnit[CD_Index1] = (Last created unit)
      • -------- --------
      • -------- Change the size and transparency of the summoning circle --------
      • Animation - Change CD_SummoningCircleUnit[CD_Index1]'s size to (CD_SummoningCircleSize[CD_Level[CD_Index1]]%, 100.00%, 100.00%) of its original size
      • Animation - Change CD_SummoningCircleUnit[CD_Index1]'s vertex coloring to (100.00%, 100.00%, 100.00%) with CD_SummoningCircleTransparency% transparency
      • -------- --------
      • -------- Apply the summoning circle model --------
      • Special Effect - Create a special effect attached to the origin of CD_SummoningCircleUnit[CD_Index1] using CD_SummoningCircleSFX
      • Set CD_SummoningCircleEffect[CD_Index1] = (Last created special effect)
      • -------- --------
      • -------- Apply the models found at the center of the summoning circle --------
      • Special Effect - Create a special effect at CD_Point2 using CD_SummoningGroundSFX1
      • Set CD_SummoningGroundEffect1[CD_Index1] = (Last created special effect)
      • Special Effect - Create a special effect at CD_Point2 using CD_SummoningGroundSFX2
      • Set CD_SummoningGroundEffect2[CD_Index1] = (Last created special effect)
      • -------- --------
      • -------- LOGIC --------
      • -------- add the anti double cast --------
      • Unit - Add Switch Call of the Damned to CD_CasterUnit[CD_Index1]
      • -------- --------
      • -------- time left before the summoning is complete --------
      • Set CD_CastingTimeLeft[CD_Index1] = CD_CastingTime[CD_Level[CD_Index1]]
      • -------- --------
      • -------- flag to indicate that the summoning is not done yet --------
      • Set CD_IsComplete[CD_Index1] = False
      • -------- --------
      • -------- flag to indicate that the slot is for the caster --------
      • Set CD_DefaultState = True
      • -------- --------
      • -------- dispose unneeded point --------
      • Custom script: call RemoveLocation(udg_CD_Point1)
      • -------- --------
      • -------- FORMATION CIRCLE --------
      • -------- loops to number of allowed helpers + the caster --------
      • For each (Integer CD_Looper2) from 1 to (CD_ApprenticeUnitAllowed[CD_Level[CD_Index1]] + 1), do (Actions)
        • Loop - Actions
          • -------- --------
          • -------- set current index --------
          • Set CD_Index2 = (CD_Index2 + 1)
          • -------- --------
          • -------- make a reference to the caster --------
          • Set CD_CasterId[CD_Index2] = CD_CasterUnit[CD_Index1]
          • -------- --------
          • -------- recycle the point variable and make a point towards the angle that we calculated earlier --------
          • Set CD_Point1 = (CD_Point2 offset by CD_SummoningCircleAoE[CD_Level[CD_Index1]] towards CD_TempAngle degrees)
          • -------- --------
          • -------- recycle the point variable and make a point towards the angle that we calculated earlier --------
          • -------- creates an indicator where helpers must stand --------
          • Unit - Create 1 CD_DummyUnitType for Neutral Passive at CD_Point1 facing CD_Angle[CD_Index2] degrees
          • Set CD_FormationUnit[CD_Index2] = (Last created unit)
          • -------- --------
          • -------- applies the model for the indicator --------
          • Special Effect - Create a special effect attached to the origin of CD_FormationUnit[CD_Index2] using CD_FormationSFX
          • Set CD_FormationEffect[CD_Index2] = (Last created special effect)
          • -------- --------
          • -------- indicates whether the spot has been occupied --------
          • -------- the default state is true for the caster so that no helper may occupy it --------
          • Set CD_IsOccupied[CD_Index2] = CD_DefaultState
          • -------- --------
          • -------- defaultstate is true if its the main caster --------
          • -------- it is also true if the spot has been occupied by a helper --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • CD_DefaultState Equal to True
            • Then - Actions
              • -------- --------
              • -------- animation time default --------
              • Set CD_SubstituteTimeLeft[CD_Index2] = 0.00
              • -------- --------
              • -------- all about the soul --------
              • Set CD_SoulAngle[CD_Index2] = CD_TempAngle
              • Set CD_SoulDistance[CD_Index2] = CD_SummoningCircleAoE[CD_Level[CD_Index1]]
              • Set CD_SoulSpeed[CD_Index2] = (CD_SummoningCircleAoE[CD_Level[CD_Index1]] / (CD_SoulDelay / 0.03))
              • Set CD_SoulCurrentHeight[CD_Index2] = 0.00
              • -------- --------
              • Set CD_IsInward[CD_Index2] = True
              • Set CD_IsUpward[CD_Index2] = True
              • -------- --------
              • Unit - Create 1 CD_DummyUnitType for Neutral Passive at CD_Point1 facing CD_Angle[CD_Index2] degrees
              • Set CD_SoulUnit[CD_Index2] = (Last created unit)
              • -------- --------
              • Unit - Add Storm Crow Form to CD_SoulUnit[CD_Index2]
              • Unit - Remove Storm Crow Form from CD_SoulUnit[CD_Index2]
              • -------- --------
              • Special Effect - Create a special effect attached to the origin of CD_SoulUnit[CD_Index2] using CD_SoulSFX
              • Set CD_SoulEffect[CD_Index2] = (Last created special effect)
              • -------- --------
              • -------- change the value of default state to create vacant spots --------
              • Set CD_DefaultState = False
            • Else - Actions
          • -------- --------
          • -------- clean up --------
          • Custom script: call RemoveLocation(udg_CD_Point1)
          • -------- --------
          • -------- adjust and store angles for later use --------
          • Set CD_Angle[CD_Index2] = CD_TempAngle
          • Set CD_TempAngle = (CD_TempAngle + CD_AngleAdjustment)
          • -------- --------
      • -------- --------
      • -------- dispose point --------
      • Custom script: call RemoveLocation(udg_CD_Point2)
      • -------- --------
      • -------- start summoning --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • CD_Index1 Equal to 1
        • Then - Actions
          • Trigger - Turn on Call of the Damned Effect <gen>
        • Else - Actions



  • Call of the Damned Effect
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • -------- --------
      • -------- enumerates through all the casters --------
      • For each (Integer CD_Looper1) from 1 to CD_Index1, do (Actions)
        • Loop - Actions
          • -------- --------
          • -------- checks if the caster is still casting --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Current order of CD_CasterUnit[CD_Looper1]) Equal to (Order(CD_AbilityOrder))
            • Then - Actions
              • -------- --------
              • -------- checks if the casting is complete --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • CD_CastingTimeLeft[CD_Looper1] Greater than 0.00
                • Then - Actions
                  • Set CD_CastingTimeLeft[CD_Looper1] = (CD_CastingTimeLeft[CD_Looper1] - 0.03)
                • Else - Actions
                  • Set CD_IsComplete[CD_Looper1] = True
                  • Unit - Order CD_CasterUnit[CD_Looper1] to Stop
              • -------- --------
              • -------- enumerates all the available spots and souls --------
              • For each (Integer CD_Looper2) from 1 to CD_Index2, do (Actions)
                • Loop - Actions
                  • -------- --------
                  • -------- checks if its for the right caster --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • CD_CasterId[CD_Looper2] Equal to CD_CasterUnit[CD_Looper1]
                    • Then - Actions
                      • -------- --------
                      • -------- checks if the spot is already occupied --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • CD_IsOccupied[CD_Looper2] Equal to True
                        • Then - Actions
                          • -------- --------
                          • -------- checks if its time to animate --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • CD_SubstituteTimeLeft[CD_Looper2] Greater than 0.00
                            • Then - Actions
                              • Set CD_SubstituteTimeLeft[CD_Looper2] = (CD_SubstituteTimeLeft[CD_Looper2] - 0.03)
                            • Else - Actions
                              • -------- --------
                              • -------- animate substitute unit and create notify special effect --------
                              • Set CD_Point1 = (Position of CD_FormationUnit[CD_Looper2])
                              • -------- --------
                              • Set CD_SubstituteTimeLeft[CD_Looper2] = CD_SubstituteInterval
                              • -------- --------
                              • Animation - Play CD_SubstituteUnit[CD_Looper2]'s CD_SubstituteAnimation animation
                              • -------- --------
                              • Special Effect - Create a special effect at CD_Point1 using CD_NotifySFX
                              • Special Effect - Destroy (Last created special effect)
                              • -------- --------
                              • Custom script: call RemoveLocation(udg_CD_Point1)
                          • -------- --------
                          • -------- SOUL ANIMATION --------
                          • -------- --------
                          • -------- soul rotation --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • CD_IsClockwise Equal to True
                            • Then - Actions
                              • Set CD_SoulAngle[CD_Looper2] = (CD_SoulAngle[CD_Looper2] - CD_SoulTurnRate)
                            • Else - Actions
                              • Set CD_SoulAngle[CD_Looper2] = (CD_SoulAngle[CD_Looper2] + CD_SoulTurnRate)
                          • -------- --------
                          • -------- soul distance --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • CD_IsInward[CD_Looper2] Equal to True
                            • Then - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • CD_SoulDistance[CD_Looper2] Greater than 0.00
                                • Then - Actions
                                  • Set CD_SoulDistance[CD_Looper2] = (CD_SoulDistance[CD_Looper2] - CD_SoulSpeed[CD_Looper2])
                                • Else - Actions
                                  • Set CD_IsInward[CD_Looper2] = False
                            • Else - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • CD_SoulDistance[CD_Looper2] Less than CD_SummoningCircleAoE[CD_Level[CD_Looper1]]
                                • Then - Actions
                                  • Set CD_SoulDistance[CD_Looper2] = (CD_SoulDistance[CD_Looper2] + CD_SoulSpeed[CD_Looper2])
                                • Else - Actions
                                  • Set CD_IsInward[CD_Looper2] = True
                          • -------- --------
                          • -------- soul height --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • CD_IsUpward[CD_Looper2] Equal to True
                            • Then - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • CD_SoulCurrentHeight[CD_Looper2] Less than CD_SoulMaxHeight
                                • Then - Actions
                                  • Set CD_SoulCurrentHeight[CD_Looper2] = (CD_SoulCurrentHeight[CD_Looper2] + CD_SoulHeightSpeed)
                                • Else - Actions
                                  • Set CD_IsUpward[CD_Looper2] = False
                            • Else - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • CD_SoulCurrentHeight[CD_Looper2] Greater than 0.00
                                • Then - Actions
                                  • Set CD_SoulCurrentHeight[CD_Looper2] = (CD_SoulCurrentHeight[CD_Looper2] - CD_SoulHeightSpeed)
                                • Else - Actions
                                  • Set CD_IsUpward[CD_Looper2] = True
                          • -------- --------
                          • -------- move soul to correct position --------
                          • Set CD_Point1 = (Position of CD_SummoningCircleUnit[CD_Looper1])
                          • Set CD_Point2 = (CD_Point1 offset by CD_SoulDistance[CD_Looper2] towards CD_SoulAngle[CD_Looper2] degrees)
                          • -------- --------
                          • Animation - Change CD_SoulUnit[CD_Looper2] flying height to CD_SoulCurrentHeight[CD_Looper2] at 0.00
                          • -------- --------
                          • Custom script: call SetUnitY(udg_CD_SoulUnit[udg_CD_Looper2], GetLocationY(udg_CD_Point2))
                          • Custom script: call SetUnitX(udg_CD_SoulUnit[udg_CD_Looper2], GetLocationX(udg_CD_Point2))
                          • -------- --------
                          • Custom script: call RemoveLocation(udg_CD_Point1)
                          • Custom script: call RemoveLocation(udg_CD_Point2)
                        • Else - Actions
                          • -------- --------
                          • -------- checks if nearby helper unit-type is nearby --------
                          • Set CD_Point1 = (Position of CD_FormationUnit[CD_Looper2])
                          • Set CD_TempGroup = (Units within CD_ApprenticeAoE[CD_Level[CD_Looper1]] of CD_Point1)
                          • -------- --------
                          • Unit Group - Pick every unit in CD_TempGroup and do (Actions)
                            • Loop - Actions
                              • -------- --------
                              • Set CD_TempUnit = (Picked unit)
                              • -------- --------
                              • -------- checks if nearby units are valid helpers --------
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (Unit-type of CD_TempUnit) Equal to CD_ApprenticeUnitType
                                  • (CD_TempUnit is alive) Equal to True
                                  • (Owner of CD_TempUnit) Equal to CD_Player[CD_Looper1]
                                • Then - Actions
                                  • -------- --------
                                  • -------- necessarry check if the spot has been occupied in case there are more than one nearby helper --------
                                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    • If - Conditions
                                      • CD_IsOccupied[CD_Looper2] Equal to False
                                    • Then - Actions
                                      • -------- --------
                                      • -------- spot is not occupied --------
                                      • Set CD_IsOccupied[CD_Looper2] = True
                                      • -------- --------
                                      • -------- hide the helper unit --------
                                      • Set CD_HiddenUnit[CD_Looper2] = CD_TempUnit
                                      • Unit - Make CD_HiddenUnit[CD_Looper2] Invulnerable
                                      • Unit - Hide CD_HiddenUnit[CD_Looper2]
                                      • -------- --------
                                      • -------- souls --------
                                      • Set CD_SoulAngle[CD_Looper2] = CD_Angle[CD_Looper2]
                                      • Set CD_SoulDistance[CD_Looper2] = CD_SummoningCircleAoE[CD_Level[CD_Looper1]]
                                      • Set CD_SoulSpeed[CD_Looper2] = (CD_SummoningCircleAoE[CD_Level[CD_Looper1]] / (CD_SoulDelay / 0.03))
                                      • Set CD_SoulCurrentHeight[CD_Looper2] = 0.00
                                      • -------- --------
                                      • Set CD_IsInward[CD_Looper2] = True
                                      • Set CD_IsUpward[CD_Looper2] = True
                                      • -------- --------
                                      • Unit - Create 1 CD_DummyUnitType for Neutral Passive at CD_Point1 facing CD_Angle[CD_Looper2] degrees
                                      • Set CD_SoulUnit[CD_Looper2] = (Last created unit)
                                      • -------- --------
                                      • Unit - Add Storm Crow Form to CD_SoulUnit[CD_Looper2]
                                      • Unit - Remove Storm Crow Form from CD_SoulUnit[CD_Looper2]
                                      • -------- --------
                                      • Special Effect - Create a special effect attached to the origin of CD_SoulUnit[CD_Looper2] using CD_SoulSFX
                                      • Set CD_SoulEffect[CD_Looper2] = (Last created special effect)
                                      • -------- --------
                                      • Unit - Create 1 CD_SubstituteUnitType for Neutral Passive at CD_Point1 facing (CD_Angle[CD_Looper2] + 180.00) degrees
                                      • Set CD_SubstituteUnit[CD_Looper2] = (Last created unit)
                                      • -------- --------
                                      • -------- animation time left --------
                                      • Set CD_SubstituteTimeLeft[CD_Looper2] = 0.00
                                      • -------- --------
                                      • -------- casting time reduction --------
                                      • Set CD_CastingTimeLeft[CD_Looper1] = (CD_CastingTimeLeft[CD_Looper1] - CD_CastingTimeReduction[CD_Level[CD_Looper1]])
                                    • Else - Actions
                                • Else - Actions
                                  • -------- --------
                                  • Set CD_TempUnit = No unit
                          • -------- --------
                          • Custom script: call DestroyGroup(udg_CD_TempGroup)
                          • -------- --------
                          • Custom script: call RemoveLocation(udg_CD_Point1)
                    • Else - Actions
            • Else - Actions
              • -------- --------
              • -------- checks if the summoning is complete --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • CD_IsComplete[CD_Looper1] Equal to True
                • Then - Actions
                  • -------- --------
                  • Set CD_Point1 = (Position of CD_SummoningCircleUnit[CD_Looper1])
                  • -------- --------
                  • Special Effect - Create a special effect at CD_Point1 using CD_SpawnSFX
                  • Special Effect - Destroy (Last created special effect)
                  • -------- --------
                  • -------- create summoned units --------
                  • -------- it will loop as many summoned units are needed --------
                  • For each (Integer CD_TempInt) from 1 to CD_SummonedUnitCount[CD_Level[CD_Looper1]], do (Actions)
                    • Loop - Actions
                      • -------- --------
                      • Unit - Create 1 CD_SummonedUnitType[CD_Level[CD_Looper1]] for CD_Player[CD_Looper1] at CD_Point1 facing (Facing of CD_SummoningCircleUnit[CD_Looper1]) degrees
                      • Set CD_TempUnit = (Last created unit)
                      • -------- --------
                      • Unit - Add a CD_SummonedUnitDuration[CD_Level[CD_Looper1]] second Generic expiration timer to CD_TempUnit
                      • Unit - Add classification of Summoned to CD_TempUnit
                  • -------- --------
                  • For each (Integer CD_Looper2) from 1 to CD_Index2, do (Actions)
                    • Loop - Actions
                      • -------- --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • CD_CasterId[CD_Looper2] Equal to CD_CasterUnit[CD_Looper1]
                          • CD_IsOccupied[CD_Looper2] Equal to True
                        • Then - Actions
                          • -------- --------
                          • Set CD_Point2 = (CD_Point1 offset by CD_BonusUnitOffset[CD_Level[CD_Looper1]] towards CD_Angle[CD_Looper2] degrees)
                          • -------- create summoned units --------
                          • -------- it will loop as many summoned units are needed --------
                          • For each (Integer CD_TempInt) from 1 to CD_BonusUnitCount[CD_Level[CD_Looper1]], do (Actions)
                            • Loop - Actions
                              • -------- --------
                              • Unit - Create 1 CD_BonusUnitType[CD_Level[CD_Looper1]] for CD_Player[CD_Looper1] at CD_Point2 facing CD_Angle[CD_Looper2] degrees
                              • Set CD_TempUnit = (Last created unit)
                              • -------- --------
                              • Unit - Add a CD_SummonedUnitDuration[CD_Level[CD_Looper1]] second Generic expiration timer to CD_TempUnit
                              • Unit - Add classification of Summoned to CD_TempUnit
                          • -------- --------
                          • Custom script: call RemoveLocation(udg_CD_Point2)
                        • Else - Actions
                  • -------- --------
                  • Custom script: call RemoveLocation(udg_CD_Point1)
                • Else - Actions
              • -------- --------
              • -------- DEINDEXING --------
              • For each (Integer CD_Looper2) from 1 to CD_Index2, do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • CD_CasterId[CD_Looper2] Equal to CD_CasterUnit[CD_Looper1]
                    • Then - Actions
                      • -------- --------
                      • Special Effect - Destroy CD_SoulEffect[CD_Looper2]
                      • Special Effect - Destroy CD_FormationEffect[CD_Looper2]
                      • -------- --------
                      • Unit - Add a 0.01 second Generic expiration timer to CD_FormationUnit[CD_Looper2]
                      • Unit - Add a 0.01 second Generic expiration timer to CD_SubstituteUnit[CD_Looper2]
                      • Unit - Add a 0.01 second Generic expiration timer to CD_SoulUnit[CD_Looper2]
                      • -------- --------
                      • Unit - Unhide CD_HiddenUnit[CD_Looper2]
                      • Unit - Make CD_HiddenUnit[CD_Looper2] Vulnerable
                      • -------- --------
                      • Set CD_CasterId[CD_Looper2] = CD_CasterId[CD_Index2]
                      • -------- --------
                      • Set CD_HiddenUnit[CD_Looper2] = CD_HiddenUnit[CD_Index2]
                      • -------- --------
                      • Set CD_Angle[CD_Looper2] = CD_Angle[CD_Index2]
                      • -------- --------
                      • Set CD_FormationUnit[CD_Looper2] = CD_FormationUnit[CD_Index2]
                      • Set CD_FormationEffect[CD_Looper2] = CD_FormationEffect[CD_Index2]
                      • -------- --------
                      • Set CD_IsOccupied[CD_Looper2] = CD_IsOccupied[CD_Index2]
                      • -------- --------
                      • Set CD_SoulUnit[CD_Looper2] = CD_SoulUnit[CD_Index2]
                      • -------- --------
                      • Set CD_IsUpward[CD_Looper2] = CD_IsUpward[CD_Index2]
                      • Set CD_IsInward[CD_Looper2] = CD_IsInward[CD_Index2]
                      • -------- --------
                      • Set CD_SoulAngle[CD_Looper2] = CD_SoulAngle[CD_Index2]
                      • Set CD_SoulCurrentHeight[CD_Looper2] = CD_SoulCurrentHeight[CD_Index2]
                      • Set CD_SoulDistance[CD_Looper2] = CD_SoulDistance[CD_Index2]
                      • Set CD_SoulSpeed[CD_Looper2] = CD_SoulSpeed[CD_Index2]
                      • -------- --------
                      • Set CD_SubstituteTimeLeft[CD_Looper2] = CD_SubstituteTimeLeft[CD_Index2]
                      • Set CD_SubstituteUnit[CD_Looper2] = CD_SubstituteUnit[CD_Index2]
                      • -------- --------
                      • Set CD_Looper2 = (CD_Looper2 - 1)
                      • Set CD_Index2 = (CD_Index2 - 1)
                    • Else - Actions
              • -------- --------
              • Special Effect - Create a special effect attached to the origin of CD_SummoningCircleUnit[CD_Looper1] using CD_CleanSFX
              • Special Effect - Destroy (Last created special effect)
              • -------- --------
              • Special Effect - Destroy CD_SummoningCircleEffect[CD_Looper1]
              • Special Effect - Destroy CD_SummoningGroundEffect1[CD_Looper1]
              • Special Effect - Destroy CD_SummoningGroundEffect2[CD_Looper1]
              • -------- --------
              • Unit - Add a CD_SummoningCircleDelay second Generic expiration timer to CD_SummoningCircleUnit[CD_Looper1]
              • -------- --------
              • Unit - Remove CD_SwitchAbility from CD_CasterUnit[CD_Looper1]
              • -------- --------
              • Set CD_CasterUnit[CD_Looper1] = CD_CasterUnit[CD_Index1]
              • Set CD_Level[CD_Looper1] = CD_Level[CD_Index1]
              • Set CD_Player[CD_Looper1] = CD_Player[CD_Index1]
              • -------- --------
              • Set CD_CastingTimeLeft[CD_Looper1] = CD_CastingTimeLeft[CD_Index1]
              • -------- --------
              • Set CD_SummoningCircleUnit[CD_Looper1] = CD_SummoningCircleUnit[CD_Index1]
              • Set CD_SummoningCircleEffect[CD_Looper1] = CD_SummoningCircleEffect[CD_Index1]
              • Set CD_SummoningGroundEffect1[CD_Looper1] = CD_SummoningGroundEffect1[CD_Index1]
              • Set CD_SummoningGroundEffect2[CD_Looper1] = CD_SummoningGroundEffect2[CD_Index1]
              • -------- --------
              • Set CD_Looper1 = (CD_Looper1 - 1)
              • Set CD_Index1 = (CD_Index1 - 1)
              • -------- --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • CD_Index1 Equal to 0
                • Then - Actions
                  • Trigger - Turn off (This trigger)
                • Else - Actions

Credits

Vexorian's dummy.mdx
Some Words

No changes has been made since submitted to the Zephyr Contest #14.
Previews
Contents

Call of the Damned (Map)

Level 37
Joined
Jul 22, 2015
Messages
3,485
Spell looks good! Descriptive config trigger and nothing game breaking in the code. I would appreciate it if you can add "How to Install" instructions in your description + map.

Needs Fixed

  • Nothing

Suggestions

  • CD is too generic for a variable prefix. This can cause issues if the user happens to have the same prefix in their map
  • Add configurables for the attachment points of the special effects that attach to the unit
  • Even though you only change the helper units vertex colors to (100%, 100%, 100%), I would add configurables for this as well
  • When you create the summoned units, you make them face the same angle as the helpers. Given that they can't move, I would store their facing angle when they first come out
  • Periodic timer should be configurable. If a user decided to change the loop to something else without changing everything else that is dependant to it, the spell will bug out
  • (Units within range) has a reference leak

Status

Approved
 
Level 38
Joined
Feb 27, 2007
Messages
4,950
Either CD_Point1 (a point variable) doesn't exist in the map or your map is set to Lua mode so the JASS custom scripts don't work. If that's the case you'll just need to remove the call from before each line to convert to Lua.
 
Top