System Squad System

AgentPaper

From the depths, I come.
Reaction score
107
This is a system I made to allow large amounts of units to be moved around with relative ease. The triggers will work with any units, with any abilities, though triggered stuff about them might cause bugs depending on what they do. With the max unit size of 12, you can select 12 squads of 12, allowing you to order 144 units at once. The triggers are heavily commented, to allow easy understanding of what does what.

This map is tested to work in single player with no problems found, but if you find any bugs or think it could be improved in any way, please post here. If you find a strange bug you think is related to this, it would help me greatly if you sent me a replay of the game. Remember I will need the map you played on as well to view the replay.

Readme from map:

Squad System v1.1b by AgentPaper

This system is meant to work with any units. No changes are needed with any of the triggers to allow new units to be used with this system, nor are changes needed in the units themselves. Feel free to change this system to suit your needs. If you want help with this system, or any triggers, contact me or anyone else at www.TheHelper.net. My username is AgentPaper.

The system works by creating more units of any unit created, except for heroes. These units are then organized into a "Squad", which will move, fight, and die together for the rest of the game. The number of units left in the squad is reflected by the health of the "Squad Leader". Any order given to one unit from the squad will make the whole squad obey that order. If any unit in the squad is selected, the squad leader will be selected instead.

Heroes can join squads by using the "Join Squad" ability on any unit in the desired squad. The hero will replace the squad leader, and act as the squad leader until the squad is destroyed, or the hero leaves with the "Leave Squad" ability. Note that in the current version, if the hero joins the squad, that squad can no longer use its special abilities, unless the hero has the same ability. Autocast and passive abilities will work as normal, though.

Special Thanks:
-Uberplayer (Memory Leaks)

To fix/add:
-Allow units commanded by a hero to use targetted abilities.
-Fix Siege Engine

Triggers:
Trigger:
  • Squad Initialization
    • Events
      • Time - Elapsed game time is 0.01 seconds
    • Conditions
    • Actions
      • Game - Pause the game
      • Game - Display to (All players) the text: Initializing Units
      • Set Group = (Units in (Playable map area))
      • Unit Group - Pick every unit in Group and do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • ((Picked unit) is A structure) Equal to False
              • Or - Any (Conditions) are true
                • Conditions
                  • (Level of (Picked unit)) Greater than 1
                  • ((Picked unit) is A Hero) Equal to True
            • Then - Actions
              • Set Unit = (Picked unit)
              • Trigger - Run Create Squad <gen> (ignoring conditions)
              • Wait 0.10 game-time seconds
            • Else - Actions
      • Custom script: call DestroyGroup (udg_Group)
      • Game - Unpause the game
      • Custom script: call DestroyTrigger( GetTriggeringTrigger() )

Trigger:
  • Create Squad
    • Events
      • Unit - A unit Finishes training a unit
    • Conditions
      • (Level of (Trained unit)) Greater than 1
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • Unit Equal to No unit
        • Then - Actions
          • -------- This is required to allow the Squad Initialization trigger to work. --------
          • Set Unit = (Trained unit)
          • -------- Stores the trained unit into the generic Unit variable, to make the rest of the trigger easier --------
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Unit is A Hero) Equal to True
        • Then - Actions
          • Unit - Add Join Squad to Unit
          • -------- Gives any heroes the "Join Squad" ability, which allows them to join units. --------
        • Else - Actions
          • -------- This loop checks through the Squad Leader array to find the first empty slot --------
          • For each (Integer B) from 1 to 300, do (Actions)
            • Loop - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • SquadLeader[(Integer B)] Equal to No unit
                • Then - Actions
                  • Set Num = (Integer B)
                  • -------- Stores the first unused squad number for use in the rest of the trigger --------
                  • Set SquadLeader[Num] = Unit
                  • -------- Makes the unit the squad leader --------
                  • Unit - Set the custom value of Unit to Num
                  • -------- Sets the squad leader's custom value to that of what the squad will be. --------
                  • Unit - Add Invulnerable (Neutral) to Unit
                  • -------- Makes the squad leader immune to all attacks. His health will represent the health of the squad, so he isn't actually invincible. --------
                  • Special Effect - Create a special effect attached to the overhead of Unit using Objects\InventoryItems\BattleStandard\BattleStandard.mdl
                  • -------- Puts a flag above the Squad Leader, to make him easier to spot. --------
                  • Set SquadSize[Num] = (Level of Unit)
                  • Set Point = (Position of Unit)
                  • Unit - Create (SquadSize[Num] - 1) (Unit-type of Unit) for (Owner of Unit) at Point facing Default building facing degrees
                  • -------- Creates the rest of the squad. The squad will be the same type of unit as the leader. --------
                  • Custom script: call RemoveLocation (udg_Point)
                  • Set Squad[Num] = (Last created unit group)
                  • -------- Sets the created units to the Squad variable, using Num as the index. --------
                  • Unit Group - Pick every unit in Squad[Num] and do (Actions)
                    • Loop - Actions
                      • Unit - Disable supply usage for (Picked unit)
                      • -------- Makes it so the sub-units in the squad do not use food. This can be disabled, but then the unit will use much more food. --------
                      • Unit - Set the custom value of (Picked unit) to Num
                      • -------- Sets the custom value of each of the sub-units, to keep track of what units are in what squads. --------
                      • Unit - Add classification of Summoned to (Picked unit)
                      • -------- All sub-units are classified as "Summoned" to seperate them from the squad leaders and non-squad units. --------
                  • Unit Group - Add SquadLeader[Num] to Squad[Num]
                  • -------- Makes the squad leader to be part of the unit he leads. --------
                  • Trigger - Turn off Order Squad Point <gen>
                  • Trigger - Turn off Order Squad Object <gen>
                  • Set Point = (Rally-Point of (Triggering unit) as a point)
                  • -------- This is to ensure there can be no infinite loop. --------
                  • Unit Group - Order Squad[Num] to Attack-Move To Point
                  • -------- Makes the squad move to the rally point of the building the unit was trained in if it is set on the ground. --------
                  • Custom script: call RemoveLocation (udg_Point)
                  • Unit Group - Order Squad[Num] to Right-Click (Rally-Point of (Triggering unit) as a unit)
                  • -------- Makes the squad move to the rally point of the building the unit was trained in if the rally point is on a unit. --------
                  • Trigger - Turn on Order Squad Point <gen>
                  • Trigger - Turn on Order Squad Object <gen>
                  • -------- Turns the movement triggers back on. --------
                  • Set Unit = No unit
                  • Set Num = 0
                  • -------- Resets the variables used to prevent errors. --------
                  • Skip remaining actions
                  • -------- Prevents the trigger from running 300 times. Do not remove. --------
                • Else - Actions

Trigger:
  • Death
    • Events
      • Unit - A unit Dies
    • Conditions
    • Actions
      • Set Num = (Custom value of (Dying unit))
      • -------- Num is an integer, set to the value of the squad we are dealing with. --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • ((Dying unit) is Summoned) Equal to True
        • Then - Actions
          • -------- Checks if the unit dying is a sub-unit in a squad by checking it's classification. --------
          • Unit Group - Remove (Dying unit) from Squad[Num]
          • -------- Removes the unit from the squad, preventing him from counting as in the squad for the rest of the trigger. --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Number of units in Squad[Num]) Less than or equal to 1
            • Then - Actions
              • -------- Checks if the squad is empty. --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (SquadLeader[Num] is A Hero) Equal to True
                • Then - Actions
                  • -------- Checks if the squad leader is a hero. --------
                  • Unit - Set life of SquadLeader[Num] to 100.00%
                  • -------- Sets the hero's health to 100%, as his health is no longer meant to represent that of his squad. --------
                  • Unit Group - Remove SquadLeader[Num] from Squad[Num]
                  • -------- Removes the hero from the squad. --------
                  • Unit - Remove Invulnerable (Neutral) from SquadLeader[Num]
                  • -------- Removes the invulnerablility from being the leader of a squad. --------
                  • Unit - Remove Leave Squad from SquadLeader[Num]
                  • -------- Removes the Leave Squad ability from the hero, since he is no longer in a squad. --------
                  • Unit - Add Join Squad to SquadLeader[Num]
                  • -------- Gives the Join Squad ability to the hero, so he can join another squad. --------
                  • Unit - Set the custom value of SquadLeader[Num] to 0
                  • -------- Sets the hero's custom value to 0, to reflect his no longer being a squad. --------
                • Else - Actions
                  • Unit - Explode SquadLeader[Num]
                  • -------- If the Squad Leader isn't a hero, he's useless, and so killed. (and in a gruesome matter, to boot!) --------
              • Set SquadLeader[Num] = No unit
              • Unit Group - Remove all units from Squad[Num]
              • Set SquadSize[Num] = 0
              • -------- Clears the squad variables. --------
            • Else - Actions
              • -------- If hero unit joining is disabled, move the below action out of the If/Then/Else statement, and the remove/disable the If/Then/Else statement. --------
              • Unit - Set life of SquadLeader[Num] to (((Real((Number of units in Squad[Num]))) / (Real(SquadSize[Num]))) x 100.00)%
              • -------- Set's the squad leader's health to reflect how many units remain in the squad. --------
        • Else - Actions
      • Set Num = 0
      • -------- Resets the variables used to prevent errors. --------

Trigger:
  • Selection
    • Events
      • Player - Player 1 (Red) Selects a unit
      • Player - Player 2 (Blue) Selects a unit
      • Player - Player 3 (Teal) Selects a unit
      • Player - Player 4 (Purple) Selects a unit
      • Player - Player 5 (Yellow) Selects a unit
      • Player - Player 6 (Orange) Selects a unit
      • Player - Player 7 (Green) Selects a unit
      • Player - Player 8 (Pink) Selects a unit
      • Player - Player 9 (Gray) Selects a unit
      • Player - Player 10 (Light Blue) Selects a unit
      • Player - Player 11 (Dark Green) Selects a unit
      • Player - Player 12 (Brown) Selects a unit
    • Conditions
    • Actions
      • Set Group = (Units currently selected by (Triggering player))
      • Unit Group - Pick every unit in Group and do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • ((Picked unit) is Summoned) Equal to True
            • Then - Actions
              • -------- Checks if the selcted unit is a sub-unit, by checking it's classification. --------
              • Selection - Remove (Picked unit) from selection for (Triggering player)
              • -------- Removes the unit from selection. --------
              • Selection - Add SquadLeader[(Custom value of (Picked unit))] to selection for (Triggering player)
              • -------- Adds the squad leader of the unit to the selection. --------
            • Else - Actions
      • Custom script: call DestroyGroup (udg_Group)

Trigger:
  • Hero Join Squad
    • Events
      • Unit - A unit Begins casting an ability
    • Conditions
      • (Ability being cast) Equal to Join Squad
      • (SquadLeader[(Custom value of (Target unit of ability being cast))] is A Hero) Equal to False
      • ((Target unit of ability being cast) is A flying unit) Equal to False
      • ((Target unit of ability being cast) is Mechanical) Equal to False
    • Actions
      • -------- Checks if the ability is the Join Unit ability, to prevent errors. --------
      • -------- Checks if the squad is already led by a hero. This ensures that there are no units led by 2 heros. --------
      • -------- The last 2 check to make sure the target squad isn't of fliers or mechanical units, including ships. --------
      • Set Num = (Custom value of (Target unit of ability being cast))
      • -------- Num is an integer, set to the value of the squad we are dealing with. --------
      • Set Hero = (Casting unit)
      • -------- Hero is a unit variable, set to be the hero joining the unit. --------
      • Unit - Set life of Hero to (Percentage life of SquadLeader[Num])%
      • -------- Sets the hero's life to what the old squad leader's life was. --------
      • Unit - Set Hero movement speed to (Default movement speed of SquadLeader[Num])
      • -------- Sets the hero's movement speed to be the same as his unit, so he can keep up. --------
      • Set Point = (Position of SquadLeader[Num])
      • Unit Group - Remove SquadLeader[Num] from Squad[Num]
      • Unit - Remove SquadLeader[Num] from the game
      • -------- Removes the normal squad leader from the game. --------
      • Unit - Move Hero instantly to Point
      • -------- Moves the hero into the squad he is joining. --------
      • Custom script: call RemoveLocation (udg_Point)
      • Unit - Set the custom value of Hero to Num
      • -------- Sets the custom value of the hero to reflect the squad he has joined. --------
      • Unit - Add Invulnerable (Neutral) to Hero
      • -------- Makes the hero invulnerable, as his health will now reflect that of his squad. --------
      • Unit - Remove Join Squad from Hero
      • -------- Removes the "Join Squad" ability from the hero, since he is now in a squad. --------
      • Unit - Add Leave Squad to Hero
      • -------- Adds the "Leave Squad" ability to the hero, so that he can leave his squad. --------
      • Set SquadLeader[Num] = Hero
      • -------- Sets the hero as the squad leader of the unit he is joining. --------
      • Unit Group - Add Hero to Squad[Num]
      • -------- Adds the hero to the squad he's joining. --------
      • Set Num = 0
      • Set Hero = No unit
      • -------- Resets the variables used to prevent errors. --------

Trigger:
  • Hero Leave Squad
    • Events
      • Unit - A unit Begins casting an ability
    • Conditions
      • (Ability being cast) Equal to Leave Squad
    • Actions
      • Set Hero = (Casting unit)
      • -------- Hero is a unit variable, set to be the hero joining the unit. --------
      • Set Num = (Custom value of Hero)
      • -------- Num is an integer, set to the value of the squad we are dealing with. --------
      • -------- --------
      • Unit Group - Remove Hero from Squad[Num]
      • -------- Removes the hero from the squad. --------
      • Unit - Remove Invulnerable (Neutral) from Hero
      • -------- Removes the invulnerablility from being the leader of a squad. --------
      • Unit - Set the custom value of Hero to 0
      • -------- Sets the hero's custom value to 0, to reflect his no longer being a squad. --------
      • -------- --------
      • Set Point = (Position of (Random unit from Squad[Num]))
      • Unit - Create 1 (Unit-type of (Random unit from Squad[Num])) for (Owner of Hero) at Point facing Default building facing degrees
      • -------- Creates a new Squad Leader. --------
      • Custom script: call RemoveLocation (udg_Point)
      • Set Unit = (Last created unit)
      • -------- Stores the trained unit into the generic Unit variable, to make the rest of the trigger easier --------
      • Set SquadLeader[Num] = Unit
      • -------- Makes the unit the squad leader --------
      • Unit - Set the custom value of Unit to Num
      • -------- Sets the squad leader's custom value to that of what the squad will be. --------
      • Unit - Add Invulnerable (Neutral) to Unit
      • -------- Makes the squad leader immune to all attacks. His health will represent the health of the squad, so he isn't actually invincible. --------
      • Special Effect - Create a special effect attached to the overhead of Unit using Objects\InventoryItems\BattleStandard\BattleStandard.mdl
      • -------- Puts a flag above the Squad Leader, to make him easier to spot. --------
      • Unit Group - Add Unit to Squad[Num]
      • -------- Makes the squad leader to be part of the unit he leads. --------
      • Unit - Set life of Unit to (Percentage life of Hero)%
      • -------- Sets the new squad leader's life to what the hero's life was. --------
      • -------- --------
      • Unit - Set life of Hero to 100.00%
      • -------- Sets the hero's health to 100%, as his health is no longer meant to represent that of his squad. --------
      • Unit - Remove Leave Squad from Hero
      • -------- Removes the Leave Squad ability from the hero, since he is no longer in a squad. --------
      • Unit - Add Join Squad to Hero
      • -------- Gives the Join Squad ability to the hero, so he can join another squad. --------
      • -------- --------
      • Set Unit = No unit
      • Set Hero = No unit
      • Set Num = 0
      • -------- Resets the variables used to prevent errors. --------

Trigger:
  • Order Squad None
    • Events
      • Unit - A unit Is issued an order with no target
    • Conditions
      • (Custom value of (Ordered unit)) Not equal to 0
    • Actions
      • Set Num = (Custom value of (Ordered unit))
      • -------- Num is an integer, set to the value of the squad we are dealing with. --------
      • Set Order = (String((Issued order)))
      • -------- Order is a string, used to hold the order we will give to the squad later. --------
      • Trigger - Turn off (This trigger)
      • -------- This is to ensure there can be no infinite loop. --------
      • Custom script: call GroupImmediateOrder( udg_Squad[udg_Num], udg_Order )
      • -------- This custom text orders the squad to do the order specified earlier. --------
      • Trigger - Turn on (This trigger)
      • -------- Turns the movement triggers back on. --------
      • Set Order = <Empty String>
      • Set Num = 0
      • -------- Resets the variables used to prevent errors. --------

Trigger:
  • Order Squad Point
    • Events
      • Unit - A unit Is issued an order targeting a point
    • Conditions
      • (Custom value of (Ordered unit)) Not equal to 0
    • Actions
      • Set Num = (Custom value of (Ordered unit))
      • -------- Num is an integer, set to the value of the squad we are dealing with. --------
      • Set Order = (String((Issued order)))
      • -------- Order is a string, used to hold the order we will give to the squad later. --------
      • Trigger - Turn off (This trigger)
      • -------- This is to ensure there can be no infinite loop. --------
      • Custom script: set udg_Point = GetOrderPointLoc()
      • Custom script: call GroupPointOrderLoc( udg_Squad[udg_Num], udg_Order, udg_Point )
      • Custom script: call RemoveLocation(udg_Point)
      • -------- This custom text orders the squad to do the order specified earlier at the same point as the ordered unit. --------
      • Trigger - Turn on (This trigger)
      • -------- Turns the movement triggers back on. --------
      • Set Order = <Empty String>
      • Set Num = 0
      • -------- Resets the variables used to prevent errors. --------

Trigger:
  • Order Squad Object
    • Events
      • Unit - A unit Is issued an order targeting an object
    • Conditions
      • (Custom value of (Ordered unit)) Not equal to 0
    • Actions
      • Set Num = (Custom value of (Ordered unit))
      • -------- Num is an integer, set to the value of the squad we are dealing with. --------
      • Set Order = (String((Issued order)))
      • -------- Order is a string, used to hold the order we will give to the squad later. --------
      • Trigger - Turn off (This trigger)
      • -------- This is to ensure there can be no infinite loop. --------
      • Custom script: call GroupTargetOrder( udg_Squad[udg_Num], udg_Order, GetOrderTargetUnit() )
      • -------- This custom text orders the squad to do the order specified earlier on the same object as the ordered unit. --------
      • Trigger - Turn on (This trigger)
      • -------- Turns the movement triggers back on. --------
      • Set Order = <Empty String>
      • Set Num = 0
      • -------- Resets the variables used to prevent errors. --------

Updates:

1.1b
-Fixed memory leaks

1.1
-Heroes can now join and leave units
-You can control how many units a squad of a certain unit type will spawn, by changing that unit's level to be the number of units to spawn, from 2 to 12. A level 1 unit will not make a squad.

1.0
-Basic system.
 

Attachments

  • (4)Tanaris.w3x
    161.6 KB · Views: 303
  • Squad System 1.0.w3x
    41.4 KB · Views: 259
  • Squad System 1.1b.w3x
    61.6 KB · Views: 458

Oninuva

You can change this now in User CP.
Reaction score
221
Good job, will be good for those that made the thead for this. Also can be called Batallion System :)
 

AgentPaper

From the depths, I come.
Reaction score
107
Could anyone help me remove the memory leaks? I have no experience in that, so I can't really do it myself, but it does need doing if this is to be used much.
 

AgentPaper

From the depths, I come.
Reaction score
107
Bump

Added a melee map with the triggers to show the versatility of this.
 

Drunken_God

Hopes to get back into Mapmaking with SC2 :)
Reaction score
106
nice
saw it already yesterday in another thread (ofcourse made by you, too^^)
+rep

i could help you with the leak removal
 

AgentPaper

From the depths, I come.
Reaction score
107
Bump

I'd appreciate the help with leak-removing. Send me a PM?

Also, any mods look at this yet? Anything I need to do to get this approved? I'm going to be adding more features, but it's not really a WIP since the main system is there. (I'm actually making this in preparation for a map I'm going to be making)
 
S

Skitz_24

Guest
Oh so you finally went along and made this into a system :p

I liked it when you suggested it to me for help with my map, and i still lie kit now :D
 

PurgeandFire

zxcvmkgdfg
Reaction score
509
Hm... Nice. Nice system. But when I select only a few units, it will affect all the units of that type in that area?

Else, good job. ;)
 

AgentPaper

From the depths, I come.
Reaction score
107
Hm... Nice. Nice system. But when I select only a few units, it will affect all the units of that type in that area?

Else, good job. ;)

No, that's not how it works. The units are organized into squads so only the other units in that squad will be moved around. Try the test map if you wanna see.
 

PurgeandFire

zxcvmkgdfg
Reaction score
509
Yeah, I tried it. Whoops, I accidentally misunderstood the system.

Anywho, it is a fine working system, I haven't received any bugs. Good job.
 

Atreyu

One Last Breath.
Reaction score
49
C&C: Tiberium Wars
Lord of the Rings: Battle for Middle Earth I & II
Praetorians

All I know with that kind of system.. Unit battalions might work in Melee maps.

Cool System, +rep.

FOUND A BUG ------

Whenever I let a Unit Leader ( The one who moves his battalion when he moves ) Follow a unit, he alone follows it..While the other battalion units stays put.. Does it do that?

Question: How can I lessen the units that come out?
 

AgentPaper

From the depths, I come.
Reaction score
107
You can change the amount of units spawned for the squads by changing the "SquadSize" variable. Just set it to whatever size you want, minus one. So, if you want squads of 8, set it to 7. Just don't set it to 12 or higher, as this will cause bugs.

For the patrol bug, I think that comes from the hero unit joining system. In the next version, I have abilities to join or leave, so that should be fixed.
 
S

Skitz_24

Guest
This isn't approved yet? :O

Wut still needs to be done ? XD
 

AgentPaper

From the depths, I come.
Reaction score
107
I've actually done some work on this, but the only reason I haven't updated is that I'm making it to work with a combat system I'm making, which is based off of the Warhammer tabletop game rules. This system is a lot different from what most maps would use (ie, the normal wc3 system:rolleyes:) so it wouldn't translate perfectly. I plan to dis-entangle the squad system so it can be used on it's own, but for now the two are kinda merged together. I could post the squad system, but it would probably look kinda funny.
 

Romek

Super Moderator
Reaction score
963
Wow... Pretty cool. And Useful!
Only thing I'd do is add some sort of effect to the squad leader.
Maybe a flag attachment or something.

Lagged out after 50 supply of Flying Machines ;)

+Rep
 

AgentPaper

From the depths, I come.
Reaction score
107
The new system has a flag on the squad leader, and the hero join system uses a custom ability instead of the "patrol" command. Still, the ability is given to all heroes made, so you don't have to worry about running around adding it to all of your heroes.
 

AgentPaper

From the depths, I come.
Reaction score
107
Bumpy for GREAT JUSTICE!
 

N-a-z-g-u-l

New Member
Reaction score
30
nice system ;)

but the craziest thing is: this is all in GUI!!

i was a GUI-freak once, too, but now, i moved to jass and for things like this, JASS would be so much easier!

i thought about making a squad system once before, too, but i wanted to create a selection circle and so on, and i did not think of group-orders, i wanted to script it on my own, and thats what i was frightened of^^

this is a nice system, and for GUI, this is an incredible system^^ please learn JASS and serve the world with great systems :thup:

+rep and so on
 

Nazdra

New Member
Reaction score
3
The new system has a flag on the squad leader, and the hero join system uses a custom ability instead of the "patrol" command. Still, the ability is given to all heroes made, so you don't have to worry about running around adding it to all of your heroes.

Did you update the file link ? I am perhas blind or something, for i don't see any of the update your talking about.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top