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

Talent/Skill Tree 1.7

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
This system was made for the request of Foronisus, but he abandoned his project and so I upload this. The models I used for this system was imported from Anachron's Custom Inventory system:

http://www.hiveworkshop.com/forums/spells-569/vjass-system-custominventory-159130/?prev=search%3Dinventory%26d%3Dlist%26r%3D20

Use -talent and -talentoff to open or close talent menu.

A WoW Death system is included, to test it write -killme.

JASS:
Q.)What is this system?
A.)This is a skill/talent tree system, similar to the one can be found in World of Warcraft or Diablo 2-but a slightly
more primitive.

Q.)Why do dependancies not work correctly?
A.)Check your variable again, if you used a format like: 12213, then you left there a 1-digit number, so rewrite it to
120213 or 122103 - the digits number to be an even number!

Q.)Why do I have to use 2-digit format in the case of 1-digit numbers?
A.)Because the system checks the string for every 2 letters ;)

Q.)How can I add more columns/rows?
A.)Yes! Now you can set it by setting TalentRows/TalentColumns (be careful, this will change the numbering of the
abilities)

Q.)Is it MUI?
A.)No, but it is MPI, you only see your class's icons and dependancies

Q.)What are the numbers of the talent positions?
A.)The numbering of the talent buttons goes as the following:

##################################################
# 01 # 02 # 03 ### 19 # 20 # 21 ### 37 # 38 # 39 #
# 04 # 05 # 06 ### 22 # 23 # 24 ### 40 # 41 # 42 #
# 07 # 08 # 09 ### 25 # 26 # 27 ### 43 # 44 # 45 #
# 10 # 11 # 12 ### 28 # 29 # 30 ### 46 # 47 # 48 #
# 13 # 14 # 15 ### 31 # 32 # 33 ### 49 # 50 # 51 #
# 16 # 17 # 18 ### 34 # 35 # 36 ### 52 # 53 # 54 #
##################################################

If you modify the number of rows to 5, it will change to:

##################################################
# 01 # 02 # 03 ### 16 # 17 # 18 ### 31 # 32 # 33 #
# 04 # 05 # 06 ### 19 # 20 # 21 ### 34 # 35 # 36 #
# 0  # 08 # 09 ### 22 # 23 # 24 ### 37 # 38 # 39 #
# 10 # 11 # 12 ### 25 # 26 # 27 ### 40 # 41 # 42 #
# 13 # 14 # 15 ### 28 # 29 # 30 ### 43 # 44 # 45 #
##################################################

If you modify the number of culumns to 4, it will change to:

TalentColumns = 4, TalentRows = 6
##################################################################
# 01 #  02 # 03 #  4 ### 21 # 22 # 23 # 24 ### 41 # 42 # 43 # 44 #
# 05 #  06 # 07 #  8 ### 25 # 26 # 27 # 28 ### 45 # 46 # 47 # 48 #
# 09 #  10 # 11 # 12 ### 29 # 30 # 31 # 32 ### 49 # 50 # 51 # 52 #
# 13 #  14 # 15 # 16 ### 33 # 34 # 35 # 36 ### 53 # 54 # 55 # 56 #
# 17 #  18 # 19 # 20 ### 37 # 38 # 39 # 40 ### 57 # 58 # 59 # 60 #
##################################################################

Q.)How to add new skills?
A.)To add new skills:
1. Copy one of the custom icon destructibles already included
2. Give them the icon as texture
3. Copy the format of Classes

Q.)How to add a new class?
A.)Add the new class and its skills to Classes

Q.)Why does a player not see his talents?
A.)You have to set PlayerClass[] to the specific class's name

Q.)Can I give a hero bonus ability points too?
A.)Yes, by the usage of the Hashtable SkillBonuses - save the total bonus value as (Ability number of Player Number
in SkillBonuses)

Take a look at Map/Init!! You have to set those values for every hero/player!
  • Talent System Settings
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- #########Scroll down for settings########### --------
      • -------- #########Scroll down for settings########### --------
      • -------- #################################### --------
      • -------- ########### DON'T TOUCH ############ --------
      • -------- #################################### --------
      • Hashtable - Create a hashtable
      • Set TalentlName = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set TalentlExists = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set TalentlDescriptions = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set TalentMaxLevels = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set TalentLevels = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set TalentlDependancies = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set TalentDependanciesBackwards = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set TalentAbilitiesClass = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set TrackTable = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set TalentLevelRequirement = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set TalentAdded = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set TalentIcons = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set CanNOTBeLearnt = (Last created hashtable)
      • Set TalentMaxClasses = 0
      • -------- #################################### --------
      • -------- ############# SETTINGS ############# --------
      • -------- #################################### --------
      • -------- Talents's Floating Text's Font Size --------
      • Set TalentFontSize = 7.00
      • -------- Number of Talent Trees --------
      • Set TalentTrees = 3
      • -------- Number of Columns --------
      • Set TalentColumns = 3
      • -------- Number of Rows --------
      • Set TalentRows = 6
      • -------- The number of abilities a hero can learn at a time --------
      • Set MaxAbilitiesPerHero = 6
      • -------- The minimum level a unit needs before he gets food (Talent Point) --------
      • Set AddFoodFromLevel = 10
      • -------- Moving the texts in the last BIG column a bit left (RECOMMENDED) --------
      • Set RightSideModifier = True
      • -------- #################################### --------
      • Set TalentTotalIcons = (TalentRows x (TalentColumns x 3))
      • -------- ##################################### --------
      • -------- ############## CLASSES ############## --------
      • -------- ##################################### --------
      • -------- Class 1 --------
      • Set TalentMaxClasses = (TalentTempInt + 1)
      • -------- Talent Tree Names --------
      • Hashtable - Save Bloodthirst as (TalentTotalIcons + 1) of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save Combat as (TalentTotalIcons + 2) of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save Masteries as (TalentTotalIcons + 3) of TalentMaxClasses in TalentlDescriptions
      • -------- Class Name --------
      • Set TalentClasses[TalentMaxClasses] = Warrior
      • -------- ############################# --------
      • -------- Skills for Class 1 --------
      • -------- Beginning of the first ability section-COPY FROM THIS POINT --------
      • -------- Beginning of the first ability section-COPY FROM THIS POINT --------
      • -------- Beginning of the first ability section-COPY FROM THIS POINT --------
      • -------- ############################# --------
      • -------- Skill slot number-Look in the trigger comment for skill positions --------
      • Set X = 20
      • -------- ############################# --------
      • -------- Vertify that this slot is occupied --------
      • Hashtable - Save True as X of TalentMaxClasses in TalentlExists
      • -------- ############################# --------
      • -------- Talent name --------
      • Hashtable - Save Battle Roar as X of TalentMaxClasses in TalentlName
      • -------- ############################# --------
      • -------- Talent Description --------
      • Hashtable - Save Your roar damages units as X of TalentMaxClasses in TalentlDescriptions
      • -------- ############################# --------
      • -------- Max level of this talent --------
      • Hashtable - Save 2 as X of TalentMaxClasses in TalentMaxLevels
      • -------- ############################# --------
      • -------- Level requirement of this talent --------
      • Hashtable - Save 1 as X of TalentMaxClasses in TalentLevelRequirement
      • -------- ############################# --------
      • -------- The talents which this one depends on-use 0 before a number with 1 digit! (like 02 instead of 2) --------
      • -------- Leave empty for no dependancy --------
      • Hashtable - Save <Empty String> as X of TalentMaxClasses in TalentlDependancies
      • -------- ############################# --------
      • -------- Icon of this talent-it needs a new destructible for every type of icon! --------
      • Set ClassTalentIcons[X] = [Talents] BattleRoar
      • -------- ############################# --------
      • -------- Choose the ability which will be given to you if you spend points on this talent --------
      • Set AbilityOfTalent[X] = Battle Roar
      • -------- ############################# --------
      • -------- End of the first ability section-COPY UNTIL THIS POINT --------
      • -------- End of the first ability section-COPY UNTIL THIS POINT --------
      • -------- End of the first ability section-COPY UNTIL THIS POINT --------
      • -------- ---------------------------------------------------------------- --------
      • Set X = 21
      • Hashtable - Save True as X of TalentMaxClasses in TalentlExists
      • Hashtable - Save Viper Talons as X of TalentMaxClasses in TalentlName
      • Hashtable - Save Your attacks poison your enemmy as X of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save 3 as X of TalentMaxClasses in TalentMaxLevels
      • Hashtable - Save 1 as X of TalentMaxClasses in TalentLevelRequirement
      • Set AbilityOfTalent[X] = Serpent Ward
      • Set ClassTalentIcons[X] = [Talents] SerpentlHead
      • -------- ---------------------------------------------------------------- --------
      • Set X = 23
      • Hashtable - Save True as X of TalentMaxClasses in TalentlExists
      • Hashtable - Save War Axe as X of TalentMaxClasses in TalentlName
      • Hashtable - Save You deal bonus damage as X of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save 20 as X of TalentMaxClasses in TalentlDependancies
      • Hashtable - Save 3 as X of TalentMaxClasses in TalentMaxLevels
      • Hashtable - Save 6 as X of TalentMaxClasses in TalentLevelRequirement
      • Set ClassTalentIcons[X] = [Talents] WarAxe
      • -------- ---------------------------------------------------------------- --------
      • Set X = 24
      • Hashtable - Save True as X of TalentMaxClasses in TalentlExists
      • Hashtable - Save Lizardman summon as X of TalentMaxClasses in TalentlName
      • Hashtable - Save You summon a Lizardman ally as X of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save 21 as X of TalentMaxClasses in TalentlDependancies
      • Hashtable - Save 2 as X of TalentMaxClasses in TalentMaxLevels
      • Hashtable - Save 6 as X of TalentMaxClasses in TalentLevelRequirement
      • Set ClassTalentIcons[X] = [Talents] LizardHead
      • -------- ---------------------------------------------------------------- --------
      • Set X = 26
      • Hashtable - Save True as X of TalentMaxClasses in TalentlExists
      • Hashtable - Save Stone Skin as X of TalentMaxClasses in TalentlName
      • Hashtable - Save You take less damage as X of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save 23 as X of TalentMaxClasses in TalentlDependancies
      • Hashtable - Save 3 as X of TalentMaxClasses in TalentMaxLevels
      • Hashtable - Save 12 as X of TalentMaxClasses in TalentLevelRequirement
      • Set ClassTalentIcons[X] = [Talents] StoneSkin
      • -------- ---------------------------------------------------------------- --------
      • Set X = 27
      • Hashtable - Save True as X of TalentMaxClasses in TalentlExists
      • Hashtable - Save Summon Dragon as X of TalentMaxClasses in TalentlName
      • Hashtable - Save You summon a Dragon ally as X of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save 24 as X of TalentMaxClasses in TalentlDependancies
      • Hashtable - Save 1 as X of TalentMaxClasses in TalentMaxLevels
      • Hashtable - Save 12 as X of TalentMaxClasses in TalentLevelRequirement
      • Set ClassTalentIcons[X] = [Talents] DragonHead
      • -------- ---------------------------------------------------------------- --------
      • Set X = 28
      • Hashtable - Save True as X of TalentMaxClasses in TalentlExists
      • Hashtable - Save Battle Roar as X of TalentMaxClasses in TalentlName
      • Hashtable - Save Your roar damages units as X of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save 1 as X of TalentMaxClasses in TalentMaxLevels
      • Hashtable - Save 18 as X of TalentMaxClasses in TalentLevelRequirement
      • Set ClassTalentIcons[X] = [Talents] Reincarnation
      • -------- ############################# --------
      • Set X = 29
      • Hashtable - Save True as X of TalentMaxClasses in TalentlExists
      • Hashtable - Save Battle Roar as X of TalentMaxClasses in TalentlName
      • Hashtable - Save You hit the ground, causing it to tremble, knocking units around you in 400 radius into the air as X of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save 2627 as X of TalentMaxClasses in TalentlDependancies
      • Hashtable - Save 1 as X of TalentMaxClasses in TalentMaxLevels
      • Hashtable - Save 18 as X of TalentMaxClasses in TalentLevelRequirement
      • Set ClassTalentIcons[X] = [Talents] EarthQuake
      • -------- ############################# --------
      • Set X = 38
      • Hashtable - Save True as X of TalentMaxClasses in TalentlExists
      • Hashtable - Save Battle Roar as X of TalentMaxClasses in TalentlName
      • Hashtable - Save Your roar damages units as X of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save 2 as X of TalentMaxClasses in TalentMaxLevels
      • Hashtable - Save 1 as X of TalentMaxClasses in TalentLevelRequirement
      • Set ClassTalentIcons[X] = [Talents] EarthQuake
      • -------- ############################# --------
      • -------- ############################# --------
      • Set X = 40
      • Hashtable - Save True as X of TalentMaxClasses in TalentlExists
      • Hashtable - Save Battle Roar as X of TalentMaxClasses in TalentlName
      • Hashtable - Save Your roar damages units as X of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save 38 as X of TalentMaxClasses in TalentlDependancies
      • Hashtable - Save 1 as X of TalentMaxClasses in TalentMaxLevels
      • Hashtable - Save 6 as X of TalentMaxClasses in TalentLevelRequirement
      • Set ClassTalentIcons[X] = [Talents] BattleRoar
      • -------- ############################# --------
      • Set X = 41
      • Hashtable - Save True as X of TalentMaxClasses in TalentlExists
      • Hashtable - Save Battle Roar as X of TalentMaxClasses in TalentlName
      • Hashtable - Save Your roar damages units as X of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save 38 as X of TalentMaxClasses in TalentlDependancies
      • Hashtable - Save 1 as X of TalentMaxClasses in TalentMaxLevels
      • Set ClassTalentIcons[X] = [Talents] Reincarnation
      • -------- ########################################################################### --------
      • -------- ### This talent only serves as a passive ability from the book, used only for calculations (E.g.:Empower) ### --------
      • -------- ####### If this is set to TRUE, the small icon enabling to learn the ability of a talent won't appear ####### --------
      • -------- ################## NOT RECOMMENDED TO USE FOR NOVICE USERS ################# --------
      • Hashtable - Save True as X of TalentMaxClasses in CanNOTBeLearnt
      • -------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- ################################### --------
      • -------- ### Copy this loop to the end of a new class ### --------
      • -------- ################################### --------
      • For each (Integer A) from 1 to TalentTotalIcons, do (Actions)
        • Loop - Actions
          • Custom script: set udg_AbilityID = udg_AbilityOfTalent[GetForLoopIndexA()]
          • Hashtable - Save AbilityID as (Integer A) of TalentMaxClasses in TalentAbilitiesClass
          • Custom script: set udg_AbilityID = udg_ClassTalentIcons[GetForLoopIndexA()]
          • Hashtable - Save AbilityID as (Integer A) of TalentMaxClasses in TalentIcons
      • -------- ############################## --------
      • -------- Class 2 --------
      • Set TalentMaxClasses = (TalentMaxClasses + 1)
      • Set TalentClasses[TalentMaxClasses] = Hunter
      • -------- Talent Tree Names --------
      • Hashtable - Save Archery as (TalentTotalIcons + 1) of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save Beast Mastery as (TalentTotalIcons + 2) of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save Trapps as (TalentTotalIcons + 3) of TalentMaxClasses in TalentlDescriptions
      • -------- ############################# --------
      • -------- Skills for Class 2 --------
      • Set X = 1
      • Hashtable - Save True as X of TalentMaxClasses in TalentlExists
      • Hashtable - Save Battle Roar as X of TalentMaxClasses in TalentlName
      • Hashtable - Save Your roar damages units as X of TalentMaxClasses in TalentlDescriptions
      • Hashtable - Save 1 as X of TalentMaxClasses in TalentMaxLevels
      • Set ClassTalentIcons[X] = [Talents] SerpentlHead
      • -------- ################################### --------
      • -------- ### Copy this loop to the end of a new class ### --------
      • -------- ################################### --------
      • For each (Integer A) from 1 to TalentTotalIcons, do (Actions)
        • Loop - Actions
          • Custom script: set udg_AbilityID = udg_AbilityOfTalent[GetForLoopIndexA()]
          • Hashtable - Save AbilityID as (Integer A) of TalentMaxClasses in TalentAbilitiesClass
          • Custom script: set udg_AbilityID = udg_ClassTalentIcons[GetForLoopIndexA()]
          • Hashtable - Save AbilityID as (Integer A) of TalentMaxClasses in TalentIcons
      • -------- ############################## --------
  • Talent System Init
    • Events
      • Time - Elapsed game time is 0.00 seconds
    • Conditions
    • Actions
      • Custom script: local trackable tr
      • For each (Integer A) from 1 to 12, do (Actions)
        • Loop - Actions
          • Trigger - Add to TalentSystemOn <gen> the event (Player - (Player((Integer A))) types a chat message containing -talent as An exact match)
          • Trigger - Add to TalentSystemOff <gen> the event (Player - (Player((Integer A))) types a chat message containing -talentoff as An exact match)
      • For each (Integer A) from 1 to TalentTrees, do (Actions)
        • Loop - Actions
          • Hashtable - Create a hashtable
          • Set TalentPosHashtables[(Integer A)] = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set ClassTalents = (Last created hashtable)
      • Hashtable - Create a hashtable
      • Set TalentLightnings = (Last created hashtable)
      • Hashtable - Save Handle Of(Center of Region 000 <gen>) as 0 of 0 in TalentPosHashtables[1]
      • Hashtable - Save Handle Of(Center of Region 000 Copy <gen>) as 0 of 0 in TalentPosHashtables[2]
      • Hashtable - Save Handle Of(Center of Region 000 Copy Copy <gen>) as 0 of 0 in TalentPosHashtables[3]
      • Set TalentTempInt = 0
      • For each (Integer A) from 1 to 12, do (Actions)
        • Loop - Actions
          • Set CurrentSkills[(Integer A)] = MaxAbilitiesPerHero
      • For each (Integer X) from 1 to TalentTrees, do (Actions)
        • Loop - Actions
          • For each (Integer B) from 0 to (TalentRows - 1), do (Actions)
            • Loop - Actions
              • For each (Integer A) from 0 to (TalentColumns - 1), do (Actions)
                • Loop - Actions
                  • Hashtable - Save Handle Of((Load 0 of 0 in TalentPosHashtables[X]) offset by (((Real((Integer A))) x (384.00 / (Real(TalentColumns)))), ((Real((Integer B))) x (-620.00 / (Real(TalentRows)))))) as (Integer A) of (Integer B) in TalentPosHashtables[X]
                  • Set TalentTempInt = (TalentTempInt + 1)
                  • Set TalentPointsX[TalentTempInt] = (Load (Integer A) of (Integer B) in TalentPosHashtables[X])
                  • Set TalentTempPoint = (Load (Integer A) of (Integer B) in TalentPosHashtables[X])
                  • For each (Integer XX) from 1 to TalentMaxClasses, do (Actions)
                    • Loop - Actions
                      • Set AbilityID = (Load TalentTempInt of XX from TalentIcons)
                      • Custom script: set udg_ClassTalentIcons[1] = udg_AbilityID
                      • Destructible - Create a ClassTalentIcons[1] at TalentTempPoint facing (Random angle) with scale 1.00 and variation 0
                      • Hashtable - Save Handle Of(Last created destructible) as TalentTempInt of XX in ClassTalents
                      • Destructible - Hide (Last created destructible)
                  • Set TalentTempPoint = ((Load (Integer A) of (Integer B) in TalentPosHashtables[X]) offset by (-25.00, -50.00))
                  • Unit - Create 1 Button for Neutral Passive at TalentTempPoint facing Default building facing degrees
                  • Animation - Change (Last created unit)'s vertex coloring to (100.00%, 100.00%, 100.00%) with 100.00% transparency
                  • Set TalentButtonsAdd[TalentTempInt] = (Last created unit)
                  • Destructible - Create a Button Add at TalentTempPoint facing 270.00 with scale 0.40 and variation 0
                  • Destructible - Hide (Last created destructible)
                  • Set AddButtonDestructible[TalentTempInt] = (Last created destructible)
                  • Custom script: call RemoveLocation (udg_TalentTempPoint)
                  • Set TalentTempPoint = ((Load (Integer A) of (Integer B) in TalentPosHashtables[X]) offset by (25.00, -50.00))
                  • Unit - Create 1 Button for Neutral Passive at TalentTempPoint facing Default building facing degrees
                  • Animation - Change (Last created unit)'s vertex coloring to (100.00%, 100.00%, 100.00%) with 100.00% transparency
                  • Destructible - Create a Button Subtract at TalentTempPoint facing 270.00 with scale 0.40 and variation 0
                  • Destructible - Hide (Last created destructible)
                  • Set SubtractButtonDestructible[TalentTempInt] = (Last created destructible)
                  • Set TalentButtonsSubtract[TalentTempInt] = (Last created unit)
                  • Custom script: call RemoveLocation (udg_TalentTempPoint)
                  • Set TalentTempPoint = ((Load (Integer A) of (Integer B) in TalentPosHashtables[X]) offset by (50.00, 0.00))
                  • Unit - Create 1 Button for Neutral Passive at TalentTempPoint facing Default building facing degrees
                  • Animation - Change (Last created unit)'s vertex coloring to (100.00%, 100.00%, 100.00%) with 100.00% transparency
                  • Set SkillButton[TalentTempInt] = (Last created unit)
                  • Destructible - Create a Button SkillUp at TalentTempPoint facing 270.00 with scale 0.40 and variation 0
                  • Destructible - Hide (Last created destructible)
                  • Set AddSkillDestructable[TalentTempInt] = (Last created destructible)
                  • Destructible - Create a Button SkillDown at TalentTempPoint facing 270.00 with scale 0.40 and variation 0
                  • Destructible - Hide (Last created destructible)
                  • Set RemoveSkillDestructable[TalentTempInt] = (Last created destructible)
                  • Custom script: call RemoveLocation (udg_TalentTempPoint)
      • For each (Integer A) from 1 to TalentTotalIcons, do (Actions)
        • Loop - Actions
          • Set TalentTempPoint = (TalentPointsX[(Integer A)] offset by (-10.00, -60.00))
          • Floating Text - Create floating text that reads / at TalentTempPoint with Z offset 0.00, using font size 8.00, color (100.00%, 100.00%, 100.00%), and 0.00% transparency
          • Set TalentFloatingTexts[(Integer A)] = (Last created floating text)
          • Custom script: call RemoveLocation (udg_TalentTempPoint)
          • For each (Integer B) from 1 to TalentMaxClasses, do (Actions)
            • Loop - Actions
              • Set TalentTempString = (Load (Integer A) of (Integer B) from TalentlDependancies)
              • For each (Integer Y) from 1 to ((Length of TalentTempString) / 2), do (Actions)
                • Loop - Actions
                  • Set TalentTempInt = (Integer((Substring(TalentTempString, (((Y - 1) / 2) + 1), (((Y - 1) / 2) + 2)))))
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Integer A) Less than 10
                    • Then - Actions
                      • Hashtable - Save ((Load TalentTempInt of (Integer B) from TalentDependanciesBackwards) + (0 + (String((Integer A))))) as TalentTempInt of (Integer B) in TalentDependanciesBackwards
                    • Else - Actions
                      • Hashtable - Save ((Load TalentTempInt of (Integer B) from TalentDependanciesBackwards) + (String((Integer A)))) as TalentTempInt of (Integer B) in TalentDependanciesBackwards
      • Set TalentTempPoint = (TalentPointsX[2] offset by (-50.00, 80.00))
      • Floating Text - Create floating text that reads <Empty String> at TalentTempPoint with Z offset 0.00, using font size 12.00, color (100.00%, 100.00%, 100.00%), and 0.00% transparency
      • Set TalentFloatingTexts[(TalentTotalIcons + 1)] = (Last created floating text)
      • Custom script: call RemoveLocation (udg_TalentTempPoint)
      • Set TalentTempPoint = ((Load 1 of 0 in TalentPosHashtables[2]) offset by (-50.00, 80.00))
      • Floating Text - Create floating text that reads <Empty String> at TalentTempPoint with Z offset 0.00, using font size 12.00, color (100.00%, 100.00%, 100.00%), and 0.00% transparency
      • Set TalentFloatingTexts[(TalentTotalIcons + 2)] = (Last created floating text)
      • Custom script: call RemoveLocation (udg_TalentTempPoint)
      • Set TalentTempPoint = ((Load 1 of 0 in TalentPosHashtables[3]) offset by (-50.00, 80.00))
      • Floating Text - Create floating text that reads <Empty String> at TalentTempPoint with Z offset 0.00, using font size 12.00, color (100.00%, 100.00%, 100.00%), and 0.00% transparency
      • Set TalentFloatingTexts[(TalentTotalIcons + 3)] = (Last created floating text)
      • Custom script: call RemoveLocation (udg_TalentTempPoint)
      • For each (Integer A) from 1 to TalentTotalIcons, do (Actions)
        • Loop - Actions
          • Set XPos = (X of TalentPointsX[(Integer A)])
          • Set YPos = (Y of TalentPointsX[(Integer A)])
          • For each (Integer B) from 1 to 12, do (Actions)
            • Loop - Actions
              • Set s = <Empty String>
              • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexB())) then
              • Set s = war3mapImported\Track75.mdx
              • Custom script: endif
              • Custom script: set tr = CreateTrackable(udg_s, udg_XPos, udg_YPos, udg_FAngle)
              • Custom script: set udg_i = GetHandleId(tr)
              • Hashtable - Save XPos as 0 of i in TrackTable
              • Hashtable - Save YPos as 1 of i in TrackTable
              • Hashtable - Save s as 2 of i in TrackTable
              • Hashtable - Save (Integer B) as 3 of i in TrackTable
              • Hashtable - Save (Integer A) as 4 of i in TrackTable
              • Custom script: call TriggerRegisterTrackableTrackEvent(gg_trg_TalentHover, tr)
      • Set TalentTempInt = 0
      • For each (Integer B) from 1 to 4, do (Actions)
        • Loop - Actions
          • For each (Integer A) from 1 to 12, do (Actions)
            • Loop - Actions
              • Set TalentTempInt = TalentTempInt + 1
              • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexA())) then
              • Floating Text - Create floating text that reads <Empty String> at TalentPointsX[TalentTempInt] with Z offset 0.00, using font size (TalentFontSize + 2.00), color (100.00%, 100.00%, 100.00%), and 0.00% transparency
              • Set TalentInfoTexts[TalentTempInt] = (Last created floating text)
              • Custom script: endif
      • Custom script: set tr = null
  • Talent Point Effects
    • 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
      • (Unit-type of (Triggering unit)) Equal to Button
    • Actions
      • Set TalentTempPlayer = (Triggering player)
      • For each (Integer A) from 1 to TalentTotalIcons, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Triggering unit) Equal to SkillButton[(Integer A)]
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Load (Player number of (Triggering player)) of (Integer A) from TalentAdded) Equal to False
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Load (Integer A) of (Player number of (Triggering player)) from CanNOTBeLearnt) Equal to False
                      • CurrentSkills[(Player number of (Triggering player))] Greater than 0
                    • Then - Actions
                      • Hashtable - Save True as (Player number of (Triggering player)) of (Integer A) in TalentAdded
                      • Set CurrentSkills[(Player number of (Triggering player))] = (CurrentSkills[(Player number of (Triggering player))] - 1)
                      • Set TalentSecInt = (Integer A)
                      • For each (Integer B) from 1 to TalentMaxClasses, do (Actions)
                        • Loop - Actions
                          • Set AbilityID = (Load (Integer A) of (Integer B) from TalentAbilitiesClass)
                          • Custom script: set udg_TempAbility =udg_AbilityID
                          • Set TalentTempInt = (Integer B)
                          • Trigger - Run Talent Point Loop <gen> (checking conditions)
                    • Else - Actions
                • Else - Actions
                  • Set CurrentSkills[(Player number of (Triggering player))] = (CurrentSkills[(Player number of (Triggering player))] + 1)
                  • Hashtable - Save False as (Player number of (Triggering player)) of (Integer A) in TalentAdded
                  • For each (Integer B) from 1 to TalentMaxClasses, do (Actions)
                    • Loop - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • TalentClassInt[(Player number of (Triggering player))] Equal to (Integer B)
                        • Then - Actions
                          • Set AbilityID = (Load (Integer A) of (Integer B) from TalentAbilitiesClass)
                          • Custom script: set udg_TempAbility =udg_AbilityID
                          • Unit - Remove TempAbility from Heroes[(Player number of (Triggering player))]
                        • Else - Actions
            • Else - Actions
  • Talent Button Click
    • 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
      • (Unit-type of (Triggering unit)) Equal to Button
    • Actions
      • Selection - Clear selection for (Triggering player)
      • For each (Integer A) from 1 to TalentTotalIcons, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Triggering unit) Equal to TalentButtonsAdd[(Integer A)]
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • TalentPoints[(Player number of (Triggering player))] Greater than 0
                • Then - Actions
                  • For each (Integer B) from 1 to TalentMaxClasses, do (Actions)
                    • Loop - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • PlayerClass[(Player number of (Triggering player))] Equal to TalentClasses[(Integer B)]
                          • (Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) Less than (Load (Integer A) of (Integer B) from TalentMaxLevels)
                        • Then - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Hero level of Heroes[(Player number of (Triggering player))]) Greater than or equal to (Load (Integer A) of (Integer B) from TalentLevelRequirement)
                            • Then - Actions
                              • Set TalentTempString = (Load (Integer A) of (Integer B) from TalentlDependancies)
                              • Set TalentCondition = True
                              • For each (Integer Y) from 1 to ((Length of TalentTempString) / 2), do (Actions)
                                • Loop - Actions
                                  • Set TalentTempInt = (Integer((Substring(TalentTempString, (Y + (Y - 1)), (Y x 2)))))
                                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    • If - Conditions
                                      • (Load TalentTempInt of (Player number of (Triggering player)) from TalentLevels) Less than 1
                                    • Then - Actions
                                      • Set TalentCondition = False
                                    • Else - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • TalentCondition Equal to True
                                • Then - Actions
                                  • Set TalentPoints[(Player number of (Triggering player))] = (TalentPoints[(Player number of (Triggering player))] - 1)
                                  • Hashtable - Save ((Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) + 1) as (Integer A) of (Player number of (Triggering player)) in TalentLevels
                                  • Hashtable - Save False as (Player number of (Triggering player)) of (Integer A) in TalentAdded
                                  • For each (Integer XX) from 1 to TalentMaxClasses, do (Actions)
                                    • Loop - Actions
                                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                        • If - Conditions
                                          • TalentClassInt[(Player number of (Triggering player))] Equal to XX
                                        • Then - Actions
                                          • Set AbilityID = (Load (Integer A) of XX from TalentAbilitiesClass)
                                          • Custom script: set udg_TempAbility =udg_AbilityID
                                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                            • If - Conditions
                                              • (Level of TempAbility for Heroes[(Player number of (Triggering player))]) Greater than 0
                                            • Then - Actions
                                              • Set CurrentSkills[(Player number of (Triggering player))] = (CurrentSkills[(Player number of (Triggering player))] + 1)
                                            • Else - Actions
                                          • Unit - Remove TempAbility from Heroes[(Player number of (Triggering player))]
                                        • Else - Actions
                                  • For each (Integer Y) from 1 to TalentLightningEffects[(Player number of (Triggering player))], do (Actions)
                                    • Loop - Actions
                                      • Lightning - Destroy (Load Y of (Player number of (Triggering player)) in TalentLightnings)
                                  • For each (Integer Z) from 1 to TalentTotalIcons, do (Actions)
                                    • Loop - Actions
                                      • For each (Integer X) from 1 to TalentMaxClasses, do (Actions)
                                        • Loop - Actions
                                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                            • If - Conditions
                                              • PlayerClass[(Player number of (Triggering player))] Equal to TalentClasses[X]
                                            • Then - Actions
                                              • Set TalentTempString = (Load Z of X from TalentlDependancies)
                                              • Set TalentLightningPoints[1] = TalentPointsX[Z]
                                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                                • If - Conditions
                                                  • TalentTempString Not equal to <Empty String>
                                                • Then - Actions
                                                  • For each (Integer Y) from 1 to ((Length of TalentTempString) / 2), do (Actions)
                                                    • Loop - Actions
                                                      • Set TalentTempInt = (Integer((Substring(TalentTempString, (Y + (Y - 1)), (Y x 2)))))
                                                      • Set TalentLightningPoints[2] = TalentPointsX[TalentTempInt]
                                                      • Set TalentLightningPoints[3] = (TalentLightningPoints[1] offset by ((-25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), (-25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                                      • Set TalentLightningPoints[4] = (TalentLightningPoints[2] offset by ((25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), (25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                                        • If - Conditions
                                                          • (Y of TalentLightningPoints[1]) Equal to (Y of TalentLightningPoints[2])
                                                        • Then - Actions
                                                          • Set TalentLightningPoints[3] = (TalentLightningPoints[1] offset by ((-25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), 0.00))
                                                          • Set TalentLightningPoints[4] = (TalentLightningPoints[2] offset by ((25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), 0.00))
                                                        • Else - Actions
                                                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                                        • If - Conditions
                                                          • (X of TalentLightningPoints[1]) Equal to (X of TalentLightningPoints[2])
                                                        • Then - Actions
                                                          • Set TalentLightningPoints[3] = (TalentLightningPoints[1] offset by (0.00, (-25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                                          • Set TalentLightningPoints[4] = (TalentLightningPoints[2] offset by (0.00, (25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                                        • Else - Actions
                                                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                                        • If - Conditions
                                                          • (Load TalentTempInt of (Player number of (Triggering player)) from TalentLevels) Greater than 0
                                                          • (Hero level of Heroes[(Player number of (Triggering player))]) Greater than or equal to (Load Z of TalentClassInt[(Player number of (Triggering player))] from TalentLevelRequirement)
                                                        • Then - Actions
                                                          • Lightning - Create a Drain Life lightning effect from source TalentLightningPoints[3] to target TalentLightningPoints[4]
                                                          • Lightning - Change color of (Last created lightning effect) to (1.00 0.00 0.00) with 0.00 alpha
                                                          • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexB())) then
                                                          • Lightning - Change color of (Last created lightning effect) to (1.00 1.00 1.00) with 1.00 alpha
                                                          • Custom script: endif
                                                        • Else - Actions
                                                          • Lightning - Create a Drain Life lightning effect from source TalentLightningPoints[3] to target TalentLightningPoints[4]
                                                          • Lightning - Change color of (Last created lightning effect) to (1.00 0.00 0.00) with 0.00 alpha
                                                          • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexB())) then
                                                          • Lightning - Change color of (Last created lightning effect) to (1.00 0.00 0.00) with 1.00 alpha
                                                          • Custom script: endif
                                                      • Hashtable - Save Handle Of(Last created lightning effect) as TalentLightningEffects[(Player number of (Triggering player))] of (Player number of (Triggering player)) in TalentLightnings
                                                      • Set TalentLightningEffects[(Player number of (Triggering player))] = (TalentLightningEffects[(Player number of (Triggering player))] + 1)
                                                      • Custom script: call RemoveLocation (udg_TalentLightningPoints[3])
                                                      • Custom script: call RemoveLocation (udg_TalentLightningPoints[4])
                                                • Else - Actions
                                            • Else - Actions
                                • Else - Actions
                            • Else - Actions
                              • Set TalentTempGroup = (Player group((Triggering player)))
                              • Game - Display to TalentTempGroup the text: Your level is too l...
                              • Custom script: call DestroyForce (udg_TalentTempGroup)
                        • Else - Actions
                • Else - Actions
            • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Triggering unit) Equal to TalentButtonsSubtract[(Integer A)]
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) Greater than 0
                • Then - Actions
                  • For each (Integer B) from 1 to TalentMaxClasses, do (Actions)
                    • Loop - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • PlayerClass[(Player number of (Triggering player))] Equal to TalentClasses[(Integer B)]
                        • Then - Actions
                          • Set TalentTempString = (Load (Integer A) of (Integer B) from TalentDependanciesBackwards)
                          • Set TalentCondition = True
                          • For each (Integer Y) from 1 to ((Length of TalentTempString) / 2), do (Actions)
                            • Loop - Actions
                              • Set TalentTempInt = (Integer((Substring(TalentTempString, (Y + (Y - 1)), (Y x 2)))))
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (Load TalentTempInt of (Player number of (Triggering player)) from TalentLevels) Greater than 0
                                • Then - Actions
                                  • Set TalentCondition = False
                                • Else - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • TalentCondition Equal to True
                            • Then - Actions
                              • Set TalentPoints[(Player number of (Triggering player))] = (TalentPoints[(Player number of (Triggering player))] + 1)
                              • Hashtable - Save ((Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) - 1) as (Integer A) of (Player number of (Triggering player)) in TalentLevels
                              • Hashtable - Save False as (Player number of (Triggering player)) of (Integer A) in TalentAdded
                              • For each (Talent Button Click
    • 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
      • (Unit-type of (Triggering unit)) Equal to Button
    • Actions
      • Selection - Clear selection for (Triggering player)
      • For each (Integer A) from 1 to TalentTotalIcons, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Triggering unit) Equal to TalentButtonsAdd[(Integer A)]
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • TalentPoints[(Player number of (Triggering player))] Greater than 0
                • Then - Actions
                  • For each (Integer B) from 1 to TalentMaxClasses, do (Actions)
                    • Loop - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • PlayerClass[(Player number of (Triggering player))] Equal to TalentClasses[(Integer B)]
                          • (Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) Less than (Load (Integer A) of (Integer B) from TalentMaxLevels)
                        • Then - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Hero level of Heroes[(Player number of (Triggering player))]) Greater than or equal to (Load (Integer A) of (Integer B) from TalentLevelRequirement)
                            • Then - Actions
                              • Set TalentTempString = (Load (Integer A) of (Integer B) from TalentlDependancies)
                              • Set TalentCondition = True
                              • For each (Integer Y) from 1 to ((Length of TalentTempString) / 2), do (Actions)
                                • Loop - Actions
                                  • Set TalentTempInt = (Integer((Substring(TalentTempString, (Y + (Y - 1)), (Y x 2)))))
                                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    • If - Conditions
                                      • (Load TalentTempInt of (Player number of (Triggering player)) from TalentLevels) Less than 1
                                    • Then - Actions
                                      • Set TalentCondition = False
                                    • Else - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • TalentCondition Equal to True
                                • Then - Actions
                                  • Set TalentPoints[(Player number of (Triggering player))] = (TalentPoints[(Player number of (Triggering player))] - 1)
                                  • Hashtable - Save ((Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) + 1) as (Integer A) of (Player number of (Triggering player)) in TalentLevels
                                  • Hashtable - Save False as (Player number of (Triggering player)) of (Integer A) in TalentAdded
                                  • For each (Integer XX) from 1 to TalentMaxClasses, do (Actions)
                                    • Loop - Actions
                                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                        • If - Conditions
                                          • TalentClassInt[(Player number of (Triggering player))] Equal to XX
                                        • Then - Actions
                                          • Set AbilityID = (Load (Integer A) of XX from TalentAbilitiesClass)
                                          • Custom script: set udg_TempAbility =udg_AbilityID
                                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                            • If - Conditions
                                              • (Level of TempAbility for Heroes[(Player number of (Triggering player))]) Greater than 0
                                            • Then - Actions
                                              • Set CurrentSkills[(Player number of (Triggering player))] = (CurrentSkills[(Player number of (Triggering player))] + 1)
                                            • Else - Actions
                                          • Unit - Remove TempAbility from Heroes[(Player number of (Triggering player))]
                                        • Else - Actions
                                  • For each (Integer Y) from 1 to TalentLightningEffects[(Player number of (Triggering player))], do (Actions)
                                    • Loop - Actions
                                      • Lightning - Destroy (Load Y of (Player number of (Triggering player)) in TalentLightnings)
                                  • For each (Integer Z) from 1 to TalentTotalIcons, do (Actions)
                                    • Loop - Actions
                                      • For each (Integer X) from 1 to TalentMaxClasses, do (Actions)
                                        • Loop - Actions
                                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                            • If - Conditions
                                              • PlayerClass[(Player number of (Triggering player))] Equal to TalentClasses[X]
                                            • Then - Actions
                                              • Set TalentTempString = (Load Z of X from TalentlDependancies)
                                              • Set TalentLightningPoints[1] = TalentPointsX[Z]
                                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                                • If - Conditions
                                                  • TalentTempString Not equal to <Empty String>
                                                • Then - Actions
                                                  • For each (Integer Y) from 1 to ((Length of TalentTempString) / 2), do (Actions)
                                                    • Loop - Actions
                                                      • Set TalentTempInt = (Integer((Substring(TalentTempString, (Y + (Y - 1)), (Y x 2)))))
                                                      • Set TalentLightningPoints[2] = TalentPointsX[TalentTempInt]
                                                      • Set TalentLightningPoints[3] = (TalentLightningPoints[1] offset by ((-25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), (-25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                                      • Set TalentLightningPoints[4] = (TalentLightningPoints[2] offset by ((25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), (25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                                        • If - Conditions
                                                          • (Y of TalentLightningPoints[1]) Equal to (Y of TalentLightningPoints[2])
                                                        • Then - Actions
                                                          • Set TalentLightningPoints[3] = (TalentLightningPoints[1] offset by ((-25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), 0.00))
                                                          • Set TalentLightningPoints[4] = (TalentLightningPoints[2] offset by ((25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), 0.00))
                                                        • Else - Actions
                                                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                                        • If - Conditions
                                                          • (X of TalentLightningPoints[1]) Equal to (X of TalentLightningPoints[2])
                                                        • Then - Actions
                                                          • Set TalentLightningPoints[3] = (TalentLightningPoints[1] offset by (0.00, (-25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                                          • Set TalentLightningPoints[4] = (TalentLightningPoints[2] offset by (0.00, (25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                                        • Else - Actions
                                                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                                        • If - Conditions
                                                          • (Load TalentTempInt of (Player number of (Triggering player)) from TalentLevels) Greater than 0
                                                          • (Hero level of Heroes[(Player number of (Triggering player))]) Greater than or equal to (Load Z of TalentClassInt[(Player number of (Triggering player))] from TalentLevelRequirement)
                                                        • Then - Actions
                                                          • Lightning - Create a Drain Life lightning effect from source TalentLightningPoints[3] to target TalentLightningPoints[4]
                                                          • Lightning - Change color of (Last created lightning effect) to (1.00 0.00 0.00) with 0.00 alpha
                                                          • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexB())) then
                                                          • Lightning - Change color of (Last created lightning effect) to (1.00 1.00 1.00) with 1.00 alpha
                                                          • Custom script: endif
                                                        • Else - Actions
                                                          • Lightning - Create a Drain Life lightning effect from source TalentLightningPoints[3] to target TalentLightningPoints[4]
                                                          • Lightning - Change color of (Last created lightning effect) to (1.00 0.00 0.00) with 0.00 alpha
                                                          • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexB())) then
                                                          • Lightning - Change color of (Last created lightning effect) to (1.00 0.00 0.00) with 1.00 alpha
                                                          • Custom script: endif
                                                      • Hashtable - Save Handle Of(Last created lightning effect) as TalentLightningEffects[(Player number of (Triggering player))] of (Player number of (Triggering player)) in TalentLightnings
                                                      • Set TalentLightningEffects[(Player number of (Triggering player))] = (TalentLightningEffects[(Player number of (Triggering player))] + 1)
                                                      • Custom script: call RemoveLocation (udg_TalentLightningPoints[3])
                                                      • Custom script: call RemoveLocation (udg_TalentLightningPoints[4])
                                                • Else - Actions
                                            • Else - Actions
                                • Else - Actions
                            • Else - Actions
                              • Set TalentTempGroup = (Player group((Triggering player)))
                              • Game - Display to TalentTempGroup the text: Your level is too l...
                              • Custom script: call DestroyForce (udg_TalentTempGroup)
                        • Else - Actions
                • Else - Actions
            • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Triggering unit) Equal to TalentButtonsSubtract[(Integer A)]
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) Greater than 0
                • Then - Actions
                  • For each (Integer B) from 1 to TalentMaxClasses, do (Actions)
                    • Loop - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • PlayerClass[(Player number of (Triggering player))] Equal to TalentClasses[(Integer B)]
                        • Then - Actions
                          • Set TalentTempString = (Load (Integer A) of (Integer B) from TalentDependanciesBackwards)
                          • Set TalentCondition = True
                          • For each (Integer Y) from 1 to ((Length of TalentTempString) / 2), do (Actions)
                            • Loop - Actions
                              • Set TalentTempInt = (Integer((Substring(TalentTempString, (Y + (Y - 1)), (Y x 2)))))
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (Load TalentTempInt of (Player number of (Triggering player)) from TalentLevels) Greater than 0
                                • Then - Actions
                                  • Set TalentCondition = False
                                • Else - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • TalentCondition Equal to True
                            • Then - Actions
                              • Set TalentPoints[(Player number of (Triggering player))] = (TalentPoints[(Player number of (Triggering player))] + 1)
                              • Hashtable - Save ((Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) - 1) as (Integer A) of (Player number of (Triggering player)) in TalentLevels
                              • Hashtable - Save False as (Player number of (Triggering player)) of (Integer A) in TalentAdded
                              • For each (Integer XX) from 1 to TalentMaxClasses, do (Actions)
                                • Loop - Actions
                                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    • If - Conditions
                                      • TalentClassInt[(Player number of (Triggering player))] Equal to XX
                                    • Then - Actions
                                      • Set AbilityID = (Load (Integer A) of XX from TalentAbilitiesClass)
                                      • Custom script: set udg_TempAbility =udg_AbilityID
                                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                        • If - Conditions
                                          • (Level of TempAbility for Heroes[(Player number of (Triggering player))]) Greater than 0
                                        • Then - Actions
                                          • Set CurrentSkills[(Player number of (Triggering player))] = (CurrentSkills[(Player number of (Triggering player))] + 1)
                                        • Else - Actions
                                      • Unit - Remove TempAbility from Heroes[(Player number of (Triggering player))]
                                    • Else - Actions
                              • For each (Integer Y) from 1 to TalentLightningEffects[(Player number of (Triggering player))], do (Actions)
                                • Loop - Actions
                                  • Lightning - Destroy (Load Y of (Player number of (Triggering player)) in TalentLightnings)
                              • For each (Integer Z) from 1 to TalentTotalIcons, do (Actions)
                                • Loop - Actions
                                  • For each (Integer X) from 1 to TalentMaxClasses, do (Actions)
                                    • Loop - Actions
                                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                        • If - Conditions
                                          • PlayerClass[(Player number of (Triggering player))] Equal to TalentClasses[X]
                                        • Then - Actions
                                          • Set TalentTempString = (Load Z of X from TalentlDependancies)
                                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                            • If - Conditions
                                              • TalentTempString Not equal to <Empty String>
                                            • Then - Actions
                                              • For each (Integer Y) from 1 to ((Length of TalentTempString) / 2), do (Actions)
                                                • Loop - Actions
                                                  • Set TalentTempInt = (Integer((Substring(TalentTempString, (Y + (Y - 1)), (Y x 2)))))
                                                  • Set TalentLightningPoints[1] = TalentPointsX[Z]
                                                  • Set TalentLightningPoints[2] = TalentPointsX[TalentTempInt]
                                                  • Set TalentLightningPoints[3] = (TalentLightningPoints[1] offset by ((-25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), (-25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                                  • Set TalentLightningPoints[4] = (TalentLightningPoints[2] offset by ((25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), (25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                                    • If - Conditions
                                                      • (Y of TalentLightningPoints[1]) Equal to (Y of TalentLightningPoints[2])
                                                    • Then - Actions
                                                      • Set TalentLightningPoints[3] = (TalentLightningPoints[1] offset by ((-25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), 0.00))
                                                      • Set TalentLightningPoints[4] = (TalentLightningPoints[2] offset by ((25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), 0.00))
                                                    • Else - Actions
                                                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                                    • If - Conditions
                                                      • (X of TalentLightningPoints[1]) Equal to (X of TalentLightningPoints[2])
                                                    • Then - Actions
                                                      • Set TalentLightningPoints[3] = (TalentLightningPoints[1] offset by (0.00, (-25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                                      • Set TalentLightningPoints[4] = (TalentLightningPoints[2] offset by (0.00, (25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                                    • Else - Actions
                                                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                                    • If - Conditions
                                                      • (Load TalentTempInt of (Player number of (Triggering player)) from TalentLevels) Greater than 0
                                                      • (Hero level of Heroes[(Player number of (Triggering player))]) Greater than or equal to (Load Z of TalentClassInt[(Player number of (Triggering player))] from TalentLevelRequirement)
                                                    • Then - Actions
                                                      • Lightning - Create a Drain Life lightning effect from source TalentLightningPoints[3] to target TalentLightningPoints[4]
                                                      • Lightning - Change color of (Last created lightning effect) to (1.00 0.00 0.00) with 0.00 alpha
                                                      • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexB())) then
                                                      • Lightning - Change color of (Last created lightning effect) to (1.00 1.00 1.00) with 1.00 alpha
                                                      • Custom script: endif
                                                    • Else - Actions
                                                      • Lightning - Create a Drain Life lightning effect from source TalentLightningPoints[3] to target TalentLightningPoints[4]
                                                      • Lightning - Change color of (Last created lightning effect) to (1.00 0.00 0.00) with 0.00 alpha
                                                      • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexB())) then
                                                      • Lightning - Change color of (Last created lightning effect) to (1.00 0.00 0.00) with 1.00 alpha
                                                      • Custom script: endif
                                                  • Hashtable - Save Handle Of(Last created lightning effect) as TalentLightningEffects[(Player number of (Triggering player))] of (Player number of (Triggering player)) in TalentLightnings
                                                  • Set TalentLightningEffects[(Player number of (Triggering player))] = (TalentLightningEffects[(Player number of (Triggering player))] + 1)
                                                  • Custom script: call RemoveLocation (udg_TalentLightningPoints[3])
                                                  • Custom script: call RemoveLocation (udg_TalentLightningPoints[4])
                                            • Else - Actions
                                        • Else - Actions
                            • Else - Actions
                        • Else - Actions
                • Else - Actions
            • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) Equal to 0
            • Then - Actions
              • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
              • Destructible - Hide SubtractButtonDestructible[(Integer A)]
              • Destructible - Hide RemoveSkillDestructable[(Integer A)]
              • Destructible - Hide AddSkillDestructable[(Integer A)]
              • Custom script: endif
            • Else - Actions
              • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
              • Destructible - Show SubtractButtonDestructible[(Integer A)]
              • Custom script: endif
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Load (Integer A) of TalentClassInt[(Player number of (Triggering player))] from CanNOTBeLearnt) Equal to False
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Load (Player number of (Triggering player)) of (Integer A) from TalentAdded) Equal to False
                    • Then - Actions
                      • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
                      • Destructible - Show AddSkillDestructable[(Integer A)]
                      • Destructible - Hide RemoveSkillDestructable[(Integer A)]
                      • Custom script: endif
                    • Else - Actions
                      • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
                      • Destructible - Hide AddSkillDestructable[(Integer A)]
                      • Destructible - Show RemoveSkillDestructable[(Integer A)]
                      • Custom script: endif
                • Else - Actions
                  • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
                  • Destructible - Hide RemoveSkillDestructable[(Integer A)]
                  • Destructible - Hide AddSkillDestructable[(Integer A)]
                  • Custom script: endif
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) Not equal to (Load (Integer A) of TalentClassInt[(Player number of (Triggering player))] from TalentMaxLevels)
              • (Load (Integer A) of TalentClassInt[(Player number of (Triggering player))] from TalentlExists) Equal to True
            • Then - Actions
              • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
              • Destructible - Show AddButtonDestructible[(Integer A)]
              • Custom script: endif
            • Else - Actions
              • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
              • Destructible - Hide AddButtonDestructible[(Integer A)]
              • Custom script: endif
          • For each (Integer A) from 1 to TalentTotalIcons, do (Actions)
            • Loop - Actions
          • For each (Integer B) from 1 to TalentMaxClasses, do (Actions)
            • Loop - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • PlayerClass[(Player number of (Triggering player))] Equal to TalentClasses[(Integer B)]
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) Equal to (Load (Integer A) of (Player number of (Triggering player)) from TalentMaxLevels)
                    • Then - Actions
                      • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
                      • Destructible - Hide AddButtonDestructible[(Integer A)]
                      • Custom script: endif
                    • Else - Actions
                      • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
                      • Destructible - Show AddButtonDestructible[(Integer A)]
                      • Custom script: endif
                • Else - Actions
          • For each (Integer X) from 1 to TalentMaxClasses, do (Actions)
            • Loop - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • PlayerClass[(Player number of (Triggering player))] Equal to TalentClasses[X]
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Load (Integer A) of X from TalentlExists) Equal to False
                    • Then - Actions
                      • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
                      • Floating Text - Change text of TalentFloatingTexts[(Integer A)] to <Empty String> using font size TalentFontSize
                      • Custom script: endif
                    • Else - Actions
                      • Set Y = ((Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) + (Load (Integer A) of (Player number of (Triggering player)) from SkillBonuses))
                      • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
                      • Floating Text - Change text of TalentFloatingTexts[(Integer A)] to ((String(Y)) + (/ + (String((Load (Integer A) of X from TalentMaxLevels))))) using font size TalentFontSize
                      • Custom script: endif
                • Else - Actions
      • For each (Integer A) from 1 to 3, do (Actions)
        • Loop - Actions
          • For each (Integer X) from 1 to TalentMaxClasses, do (Actions)
            • Loop - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • PlayerClass[(Player number of (Triggering player))] Equal to TalentClasses[X]
                • Then - Actions
                  • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
                  • Floating Text - Change text of TalentFloatingTexts[((Integer A) + TalentTotalIcons)] to (Load ((Integer A) + TalentTotalIcons) of X from TalentlDescriptions) using font size 12.00
                  • Custom script: endif
                • Else - Actions
      • Floating Text - Change text of TalentInfoTexts[(36 + (Player number of (Triggering player)))] to (Talent Points Left: + (|cFFFFCC00 + ((String(TalentPoints[(Player number of (Triggering player))])) + |r))) using font size (TalentFontSize + 2.00)
  • TalentHover
    • Events
    • Conditions
    • Actions
      • Custom script: local trackable tr = GetTriggeringTrackable()
      • Custom script: set udg_i = GetHandleId(tr)
      • Set XPos = (Load 0 of i from TrackTable)
      • Set YPos = (Load 1 of i from TrackTable)
      • Set TalentTempInt = (Load 3 of i from TrackTable)
      • Set TrackableTempInt = (Load 4 of i from TrackTable)
      • Set TalentTempReal = (-100.00 - (4.00 x (Real((Length of (Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentlDescriptions))))))
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentlExists) Equal to False
        • Then - Actions
          • Custom script: set tr = null
          • Skip remaining actions
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • TrackableTempInt Greater than ((TalentTotalIcons / (6 - TalentTrees)) x 2)
          • RightSideModifier Equal to True
        • Then - Actions
          • Set TalentTempPoint = ((Point(XPos, YPos)) offset by (TalentTempReal, -70.00))
        • Else - Actions
          • Set TalentTempPoint = ((Point(XPos, YPos)) offset by (50.00, -70.00))
      • Floating Text - Change the position of TalentInfoTexts[TalentTempInt] to TalentTempPoint with Z offset 0.00
      • Custom script: if (GetLocalPlayer() == ConvertedPlayer(udg_TalentTempInt)) then
      • Floating Text - Change text of TalentInfoTexts[TalentTempInt] to (Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentlName) using font size (TalentFontSize + 2.00)
      • Floating Text - Change the color of TalentInfoTexts[TalentTempInt] to (100.00%, 100.00%, 0.00%) with 0.00% transparency
      • Custom script: endif
      • Custom script: call RemoveLocation (udg_TalentTempPoint)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • TrackableTempInt Greater than ((TalentTotalIcons / (6 - TalentTrees)) x 2)
          • RightSideModifier Equal to True
        • Then - Actions
          • Set TalentTempPoint = ((Point(XPos, YPos)) offset by (TalentTempReal, (-100.00 + (-0.66 x (Real(((Length of (Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentlDescriptions)) + (32 - ((Length of (Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentlDe
        • Else - Actions
          • Set TalentTempPoint = ((Point(XPos, YPos)) offset by (50.00, (-100.00 + (-0.66 x (Real(((Length of (Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentlDescriptions)) + (32 - ((Length of (Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentlDescription
      • Floating Text - Change the position of TalentInfoTexts[(TalentTempInt + 12)] to TalentTempPoint with Z offset 0.00
      • Custom script: if (GetLocalPlayer() == ConvertedPlayer(udg_TalentTempInt)) then
      • Floating Text - Change text of TalentInfoTexts[(12 + TalentTempInt)] to (Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentlDescriptions) using font size (TalentFontSize + 2.00)
      • Custom script: endif
      • Custom script: call RemoveLocation (udg_TalentTempPoint)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • TrackableTempInt Greater than ((TalentTotalIcons / (6 - TalentTrees)) x 2)
          • RightSideModifier Equal to True
        • Then - Actions
          • Set TalentTempPoint = ((Point(XPos, YPos)) offset by (TalentTempReal, -95.00))
        • Else - Actions
          • Set TalentTempPoint = ((Point(XPos, YPos)) offset by (50.00, -95.00))
      • Floating Text - Change the position of TalentInfoTexts[(TalentTempInt + 24)] to TalentTempPoint with Z offset 0.00
      • Custom script: if (GetLocalPlayer() == ConvertedPlayer(udg_TalentTempInt)) then
      • Floating Text - Change text of TalentInfoTexts[(24 + TalentTempInt)] to (Level Requirement: + (|cFFFFCC00 + ((String((Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentLevelRequirement))) + |r))) using font size (TalentFontSize + 2.00)
      • Custom script: endif
      • Custom script: call RemoveLocation (udg_TalentTempPoint)
      • Custom script: set tr = null
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • TrackableTempInt Greater than ((TalentTotalIcons / (6 - TalentTrees)) x 2)
          • RightSideModifier Equal to True
        • Then - Actions
          • Set TalentTempPoint = ((Point(XPos, YPos)) offset by (TalentTempReal, (-125.00 + (-0.66 x (Real(((Length of (Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentlDescriptions)) + (32 - ((Length of (Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentlDe
        • Else - Actions
          • Set TalentTempPoint = ((Point(XPos, YPos)) offset by (50.00, (-125.00 + (-0.66 x (Real(((Length of (Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentlDescriptions)) + (32 - ((Length of (Load TrackableTempInt of TalentClassInt[TalentTempInt] from TalentlDescription
      • Floating Text - Change the position of TalentInfoTexts[(TalentTempInt + 36)] to TalentTempPoint with Z offset 0.00
      • Custom script: if (GetLocalPlayer() == ConvertedPlayer(udg_TalentTempInt)) then
      • Floating Text - Change text of TalentInfoTexts[(36 + TalentTempInt)] to (Talent Points Left: + (|cFFFFCC00 + ((String(TalentPoints[TalentTempInt])) + |r))) using font size (TalentFontSize + 2.00)
      • Custom script: endif
      • Custom script: call RemoveLocation (udg_TalentTempPoint)
      • Custom script: set tr = null
  • Talent Point Loop
    • Events
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • PlayerClass[(Player number of TalentTempPlayer)] Equal to TalentClasses[TalentTempInt]
        • Then - Actions
          • Set X = ((Load TalentSecInt of (Player number of TalentTempPlayer) from TalentLevels) + (Load TalentSecInt of (Player number of TalentTempPlayer) from SkillBonuses))
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Level of TempAbility for Heroes[(Player number of TalentTempPlayer)]) Not equal to X
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Load TalentSecInt of (Player number of TalentTempPlayer) from TalentLevels) Equal to 0
                • Then - Actions
                  • Unit - Remove TempAbility from Heroes[(Player number of TalentTempPlayer)]
                  • Hashtable - Save False as (Player number of TalentTempPlayer) of TalentSecInt in TalentAdded
                • Else - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Level of TempAbility for Heroes[(Player number of TalentTempPlayer)]) Equal to 0
                    • Then - Actions
                      • Unit - Add TempAbility to Heroes[(Player number of TalentTempPlayer)]
                      • Unit - Set level of TempAbility for Heroes[(Player number of TalentTempPlayer)] to X
                    • Else - Actions
                      • Unit - Set level of TempAbility for Heroes[(Player number of TalentTempPlayer)] to X
            • Else - Actions
        • Else - Actions
  • TalentSystemOn
    • Events
    • Conditions
    • Actions
      • For each (Integer A) from 1 to 12, do (Actions)
        • Loop - Actions
          • For each (Integer B) from 1 to TalentMaxClasses, do (Actions)
            • Loop - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • PlayerClass[(Integer A)] Equal to TalentClasses[(Integer B)]
                • Then - Actions
                  • Set TalentClassInt[(Integer A)] = (Integer B)
                • Else - Actions
      • Camera - Apply Camera 001 <gen> for (Triggering player) over 0.00 seconds
      • Visibility - Create an initially Enabled visibility modifier for (Triggering player) emitting Visibility across Region 001 <gen>
      • Set TalentVis[(Player number of (Triggering player))] = (Last created visibility modifier)
      • Player Group - Add (Triggering player) to TalentTreeView
      • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
      • Game - Enable pre-selection functionality (Disable pre-selection circles, life bars, and object info)
      • Custom script: endif
      • For each (Integer B) from 1 to TalentMaxClasses, do (Actions)
        • Loop - Actions
          • For each (Integer X) from 1 to TalentTotalIcons, do (Actions)
            • Loop - Actions
              • Set TalentTempDestructible = (Load X of (Integer B) in ClassTalents)
              • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
              • Destructible - Hide TalentTempDestructible
              • Custom script: endif
      • For each (Integer X) from 1 to TalentTotalIcons, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Load X of TalentClassInt[(Player number of (Triggering player))] from TalentlExists) Equal to True
            • Then - Actions
              • Set TalentTempDestructible = (Load X of TalentClassInt[(Player number of (Triggering player))] in ClassTalents)
              • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
              • Destructible - Show TalentTempDestructible
              • Custom script: endif
            • Else - Actions
      • For each (Integer A) from 1 to TalentTotalIcons, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) Equal to 0
            • Then - Actions
              • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
              • Destructible - Hide SubtractButtonDestructible[(Integer A)]
              • Destructible - Hide RemoveSkillDestructable[(Integer A)]
              • Destructible - Hide AddSkillDestructable[(Integer A)]
              • Custom script: endif
            • Else - Actions
              • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
              • Destructible - Show SubtractButtonDestructible[(Integer A)]
              • Custom script: endif
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Load (Integer A) of TalentClassInt[(Player number of (Triggering player))] from CanNOTBeLearnt) Equal to False
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Load (Player number of (Triggering player)) of (Integer A) from TalentAdded) Equal to False
                    • Then - Actions
                      • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
                      • Destructible - Show AddSkillDestructable[(Integer A)]
                      • Destructible - Hide RemoveSkillDestructable[(Integer A)]
                      • Custom script: endif
                    • Else - Actions
                      • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
                      • Destructible - Hide AddSkillDestructable[(Integer A)]
                      • Destructible - Show RemoveSkillDestructable[(Integer A)]
                      • Custom script: endif
                • Else - Actions
                  • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
                  • Destructible - Hide RemoveSkillDestructable[(Integer A)]
                  • Destructible - Hide AddSkillDestructable[(Integer A)]
                  • Custom script: endif
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) Not equal to (Load (Integer A) of TalentClassInt[(Player number of (Triggering player))] from TalentMaxLevels)
              • (Load (Integer A) of TalentClassInt[(Player number of (Triggering player))] from TalentlExists) Equal to True
            • Then - Actions
              • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
              • Destructible - Show AddButtonDestructible[(Integer A)]
              • Custom script: endif
            • Else - Actions
              • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
              • Destructible - Hide AddButtonDestructible[(Integer A)]
              • Custom script: endif
      • For each (Integer A) from 1 to TalentLightningEffects[(Player number of (Triggering player))], do (Actions)
        • Loop - Actions
          • Lightning - Destroy (Load (Integer A) of (Player number of (Triggering player)) in TalentLightnings)
      • For each (Integer B) from 1 to 12, do (Actions)
        • Loop - Actions
          • For each (Integer X) from 1 to TalentMaxClasses, do (Actions)
            • Loop - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • PlayerClass[(Integer B)] Equal to TalentClasses[X]
                • Then - Actions
                  • For each (Integer A) from 1 to TalentTotalIcons, do (Actions)
                    • Loop - Actions
                      • Set TalentTempString = (Load (Integer A) of X from TalentlDependancies)
                      • Set TalentLightningPoints[1] = TalentPointsX[(Integer A)]
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • TalentTempString Not equal to <Empty String>
                        • Then - Actions
                          • For each (Integer Y) from 1 to ((Length of TalentTempString) / 2), do (Actions)
                            • Loop - Actions
                              • Set TalentTempInt = (Integer((Substring(TalentTempString, (Y + (Y - 1)), (Y x 2)))))
                              • Set TalentLightningPoints[2] = TalentPointsX[TalentTempInt]
                              • Set TalentLightningPoints[3] = (TalentLightningPoints[1] offset by ((-25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), (-25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                              • Set TalentLightningPoints[4] = (TalentLightningPoints[2] offset by ((25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), (25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (Y of TalentLightningPoints[1]) Equal to (Y of TalentLightningPoints[2])
                                • Then - Actions
                                  • Set TalentLightningPoints[3] = (TalentLightningPoints[1] offset by ((-25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), 0.00))
                                  • Set TalentLightningPoints[4] = (TalentLightningPoints[2] offset by ((25.00 x (Sign(((X of TalentLightningPoints[1]) - (X of TalentLightningPoints[2]))))), 0.00))
                                • Else - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (X of TalentLightningPoints[1]) Equal to (X of TalentLightningPoints[2])
                                • Then - Actions
                                  • Set TalentLightningPoints[3] = (TalentLightningPoints[1] offset by (0.00, (-25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                  • Set TalentLightningPoints[4] = (TalentLightningPoints[2] offset by (0.00, (25.00 x (Sign(((Y of TalentLightningPoints[1]) - (Y of TalentLightningPoints[2])))))))
                                • Else - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (Load TalentTempInt of (Integer B) from TalentLevels) Greater than 0
                                  • (Hero level of Heroes[(Player number of (Triggering player))]) Greater than or equal to (Load (Integer A) of TalentClassInt[(Player number of (Triggering player))] from TalentLevelRequirement)
                                • Then - Actions
                                  • Lightning - Create a Drain Life lightning effect from source TalentLightningPoints[3] to target TalentLightningPoints[4]
                                  • Lightning - Change color of (Last created lightning effect) to (1.00 0.00 0.00) with 0.00 alpha
                                  • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexB())) then
                                  • Lightning - Change color of (Last created lightning effect) to (1.00 1.00 1.00) with 1.00 alpha
                                  • Custom script: endif
                                • Else - Actions
                                  • Lightning - Create a Drain Life lightning effect from source TalentLightningPoints[3] to target TalentLightningPoints[4]
                                  • Lightning - Change color of (Last created lightning effect) to (1.00 0.00 0.00) with 0.00 alpha
                                  • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexB())) then
                                  • Lightning - Change color of (Last created lightning effect) to (1.00 0.00 0.00) with 1.00 alpha
                                  • Custom script: endif
                              • Hashtable - Save Handle Of(Last created lightning effect) as TalentLightningEffects[(Integer B)] of (Integer B) in TalentLightnings
                              • Set TalentLightningEffects[(Integer B)] = (TalentLightningEffects[(Integer B)] + 1)
                              • Custom script: call RemoveLocation (udg_TalentLightningPoints[3])
                              • Custom script: call RemoveLocation (udg_TalentLightningPoints[4])
                        • Else - Actions
                • Else - Actions
      • For each (Integer A) from 1 to TalentTotalIcons, do (Actions)
        • Loop - Actions
          • For each (Integer B) from 1 to 12, do (Actions)
            • Loop - Actions
              • For each (Integer X) from 1 to TalentMaxClasses, do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • PlayerClass[(Integer B)] Equal to TalentClasses[X]
                    • Then - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Load (Integer A) of X from TalentlExists) Equal to False
                        • Then - Actions
                          • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexB())) then
                          • Floating Text - Change text of TalentFloatingTexts[(Integer A)] to <Empty String> using font size TalentFontSize
                          • Custom script: endif
                        • Else - Actions
                          • Set Y = ((Load (Integer A) of (Player number of (Triggering player)) from TalentLevels) + (Load (Integer A) of (Player number of (Triggering player)) from SkillBonuses))
                          • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexB())) then
                          • Floating Text - Change text of TalentFloatingTexts[(Integer A)] to ((String(Y)) + (/ + (String((Load (Integer A) of X from TalentMaxLevels))))) using font size TalentFontSize
                          • Custom script: endif
                    • Else - Actions
      • For each (Integer A) from 1 to 3, do (Actions)
        • Loop - Actions
          • For each (Integer B) from 1 to 12, do (Actions)
            • Loop - Actions
              • For each (Integer X) from 1 to TalentMaxClasses, do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • PlayerClass[(Integer B)] Equal to TalentClasses[X]
                    • Then - Actions
                      • Custom script: if (GetLocalPlayer() == ConvertedPlayer(GetForLoopIndexB())) then
                      • Floating Text - Change text of TalentFloatingTexts[((Integer A) + TalentTotalIcons)] to (Load ((Integer A) + TalentTotalIcons) of X from TalentlDescriptions) using font size 12.00
                      • Custom script: endif
                    • Else - Actions
  • TalentSystemOff
    • Events
    • Conditions
    • Actions
      • Visibility - Destroy TalentVis[(Player number of (Triggering player))]
      • Set TalentTempPoint = (Position of Heroes[(Player number of (Triggering player))])
      • Player Group - Remove (Triggering player) from TalentTreeView
      • Custom script: if (GetLocalPlayer() == GetTriggerPlayer()) then
      • Game - Enable pre-selection functionality (Enable pre-selection circles, life bars, and object info)
      • Custom script: endif
      • Camera - Reset camera for (Triggering player) to standard game-view over 0.00 seconds
      • Camera - Pan camera for (Triggering player) to TalentTempPoint over 0.00 seconds
      • Custom script: call RemoveLocation (udg_TalentTempPoint)
  • TalentTree Lock
    • Events
      • Time - Every 0.20 seconds of game time
    • Conditions
    • Actions
      • Player Group - Pick every player in TalentTreeView and do (Actions)
        • Loop - Actions
          • Camera - Apply Camera 001 <gen> for (Picked player) over 0.00 seconds
  • TalentTree Level Up
    • Events
      • Unit - A unit Gains a level
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Hero level of (Triggering unit)) Greater than or equal to AddFoodFromLevel
        • Then - Actions
          • Player - Set (Owner of (Triggering unit)) Food used to (((Owner of (Triggering unit)) Food used) + 1)
        • Else - Actions

  • Settings
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- Set These! --------
      • Set SpiritSpawnRegion = Region 002 <gen>
      • Set ResurrectionDistance = 500.00
      • -------- Set the Graveyard Unit! --------
      • Set GraveyardIndicator = Demon Gate
      • -------- ############ --------
      • Hashtable - Create a hashtable
      • Set ResurrectionTable = (Last created hashtable)
      • For each (Integer A) from 1 to 12, do (Actions)
        • Loop - Actions
          • Trigger - Add to ResurrectHero <gen> the event (Player - (Player((Integer A))) Selects a unit)
  • Unit Dies
    • Events
      • Unit - A unit Dies
    • Conditions
      • ((Dying unit) is A Hero) Equal to True
      • ((Owner of (Triggering unit)) controller) Equal to User
    • Actions
      • Set DeathPos1 = (Position of (Triggering unit))
      • Set GraveyardIndicators = (Units of type GraveyardIndicator)
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in GraveyardIndicators and do (Actions)
        • Loop - Actions
          • Set DeathPos2 = (Position of (Picked unit))
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Distance between DeathPos2 and DeathPos1) Less than (Distance between DeathPos1 and DeathPos3)
            • Then - Actions
              • Set DeathPos3 = DeathPos2
            • Else - Actions
      • Unit - Create 1 Ghost for (Owner of (Triggering unit)) at DeathPos3 facing Default building facing degrees
      • Set DeathTempUnit = (Last created unit)
      • Unit - Create 1 TombStone for Neutral Passive at DeathPos1 facing Default building facing degrees
      • Custom script: call RemoveLocation (udg_DeathPos1)
      • Custom script: call RemoveLocation (udg_DeathPos2)
      • Custom script: call RemoveLocation (udg_DeathPos3)
      • Hashtable - Save Handle OfDeathTempUnit as 1 of (Key (Last created unit)) in ResurrectionTable
      • Hashtable - Save Handle Of(Dying unit) as 2 of (Key (Last created unit)) in ResurrectionTable
  • ResurrectHero
    • Events
    • Conditions
      • (Unit-type of (Triggering unit)) Equal to TombStone
      • (Owner of (Load 1 of (Key (Triggering unit)) in ResurrectionTable)) Equal to (Triggering player)
    • Actions
      • Set DeathPos1 = (Position of (Triggering unit))
      • Set DeathPos2 = (Position of (Load 1 of (Key (Triggering unit)) in ResurrectionTable))
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Distance between DeathPos1 and DeathPos2) Less than or equal to ResurrectionDistance
        • Then - Actions
          • Unit - Remove (Load 1 of (Key (Triggering unit)) in ResurrectionTable) from the game
          • Unit - Remove (Triggering unit) from the game
          • Hero - Instantly revive (Load 2 of (Key (Triggering unit)) in ResurrectionTable) at DeathPos2, Show revival graphics
          • Unit - Set life of (Load 2 of (Key (Triggering unit)) in ResurrectionTable) to 50.00%
          • Unit - Set mana of (Load 2 of (Key (Triggering unit)) in ResurrectionTable) to 50.00%
        • Else - Actions
      • Custom script: call RemoveLocation (udg_DeathPos1)
      • Custom script: call RemoveLocation (udg_DeathPos2)


Thanks for Pharaoh_ for removing the old one uploaded by Foronisus

Special thanks: CRAZYRUSSIAN for his awesome icons

Please give credits in your map!


V1.1 - Documentation extended a bit, replaced DeathPos[] With DeathPos1, DeathPos2, DeathPos3. Minimum level before food gain is now settable

V1.2 - Now you can customize the number of rows/columns, also extended documentation

V1.3 - Fixed the bug where players would get each other's abilities, added the Hashtable SkillBonuses which enables the player to set a skill bonus for a talent

V1.4
-Instead of food the system now uses a variable shown under the description of the talent
-Added long-description support
-Added variable to be able to change the number of the GREAT columns without any modification to the main triggers

v1.5
-Now the floating text in the last column is placed a bit to the left (you can enable/disable)

v1.6
-Made the system more user-friendly
-Added add/remove ability button()
-Added variable MaxAbilitiesPerHero so players can't abuse passive abilities (if you don't want to)
-Added CanNOTBeLearnt hashtable, for the use of synergy passive abilities and normal talent tree systems linked to this one (If it's set to true then the + sign won't appear for the player on the ability)
-Fixed the bug where the ability was set to 2x the level of the talent
-Fixed the bug where the unit didn't got the bonus ability points
-Fixed the bug where the buttons didn't show up properly with points spent on them without a button click
-Now creates the tooltip texts locally, which means less floating texts! (they didn't appear properly for players in slot 6+)

v1.7
-Fixed the bug where the player saw all the class icons
-Simplified and optimalized the code by removing some loops
-Fixed the bug where you got 2 points from level 9


Keywords:
Talent Tree, Skill Tree, Skill, Talent, Tree, Diablo, Warcraft, WoW, Diablo 2, Diablo II, World of Warcraft, Ability System, System, Spell Tree, Death
Contents

Talent and WoW Death System (Map)

Reviews
12th Dec 2015 IcemanBo: Too long as NeedsFix. Rejected. By default you're creating 18 hashtables, which is unacceptable. One can "only" have 255 hashtables in a map, and if every system used that many problems would occur. Try to use only one...
Level 2
Joined
Aug 19, 2007
Messages
8
How come i can't open it? It says "worldedit.exe stopped working" - "a problem is the reason why the program stopped working properly. Windows will close the program...". This does not happen when i try other maps - so is it protected or something like it?

And thanks for making this skill tree, it seems awesome :)
 

S11

S11

Level 3
Joined
Apr 29, 2012
Messages
41
so i know this is a dead topic, and i just revived it but i think i found a bug.. if anyone would be so kind to help me... you start with 19 Talent points you can add a point to the serpent ward in archery. but u cant accept what u did until u close the Talent tree, but when u do that u can respec on the serpent ward and then hit - and cancel and ull get a free Talent point.. so u go from 19 to 20.. it increases...

nevermind when u close it again u lose the spec and its 0/1 and u have 20 talent points.

Question how do you make the talent points permanent i dont want them to be able to respec

Also when ispeced for the battle roar.. i couldnt find the skill anywhere how do i fix this?
 
Last edited:

S11

S11

Level 3
Joined
Apr 29, 2012
Messages
41
If I had the patience to download WC3 then I'd rewrite the entire thing in JASS, really no point in patching this now :p

im not that familier in jazz :/, but i do need this so i was just wondering
 
Top