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

Moderator

M

Moderator

12th Dec 2015
IcemanBo: Too long as NeedsFix. Rejected.

Maker, Talent System v1.7, 19th Oct 2011

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 hashtable.
I also spotted some leaks in Talent Hover trigger.
Improve the test map, it doesn't showcase the system enough.

14:40, 19th Aug 2011
Bribe:

You code can be improved:

You use arrays like DeathPos for just two indices, should be two
variables instead. Same with the TalentPosHashtables array which
could be three variables. This cuts on array space which is obviously
important for readability, map file size and memory usage in-game.

Yes I know you use a loop for the hashtables that's what makes JASS
so good because you can use functions for this instead of copping out
for an array. If you don't want JASS there are workarounds anyway
but should not use an array.

I have no idea how to use this the documentation does not explain
what talents are nor does it explain how to customize the script. For
example why do you do "Set X = 35" in the main trigger it doesn't
have any exclusiveness. Stuff like this needs way better comments
and variable names.
 
Level 15
Joined
Oct 18, 2008
Messages
1,588
Ooookay
EDIT: Done
EDIT2: Well yeah documentation needs some more specific details ^^ It still has some problems with customization since you can change the maximum rows/columns in a tree, but when I tried expending it my WE crashed :(

I named it X because I use it as a helper variable, and I use it in loops too so I can't name it any better :(

I'll change the DeathPos to a normal variable ^^
 
Last edited:
Hehe ^^ I worked with it I think a day (or two? Oo My sense of time is a bit blurry without school :D). I'm waiting for a new moderation - I think now after I updated it could be approved ^^

Looks alot better;


- Maybe add the description of the talent being learned
Instead of jsut the name;
- Maybe make a floating text at the bottom of the talent screen showing your talents; instead of using food; cause food could be used for something else in some maps.
 
Well I could do that (the variable thing), thanks for the feedback, +rep ^^ And it has description implemented ;)

Edit: how can I update the screenshot? Oo

As i mentioned not reallyy got chance to test it properly; since updates... and cheers.

when you update it says Upload Picture;
sometimes the picture takes ages to replace the old one, well i have noticed;
 
Here a little suggestion;
Try and revamp the whole Wow Talent System; cause from my point of view
on world of warcraft i thought it was quite ugly;

i personaly like ones that go across for example;

---------- Talent -Talent -Talent -
---------/
Talent -Talent -Talent - Talent -
---------\ Talent \ ----------------\Talent -
----------- Talent -

Yes i know that is abit messy;
but then you can create more area for the description to be shown, in a different
rectangle.
 
Level 15
Joined
Oct 18, 2008
Messages
1,588
Not at all, since the point is you can have 3 separate trees-that way there would be space only for 3-and making it to work as tabs would make me remake the entire thing but a lot difficultier - even it's setup would be a pain by itself. I've beeon tough about the window thing, and I may be able to make it if I can get a proper model
 
Level 15
Joined
Oct 18, 2008
Messages
1,588
That would be only solvable with a custom lightning effect, only usable by custom script :( And I still need a white arrow thingy for that purpose

Well, I added a variable to be able to remove a great column (or even add one with correct camera settings, but for that you have to edit the init trigger's first section a bit) - even I got surprised that I didn't have to edit the code as at the moment it is dynamic enough that by changing only the integer number of the main loop makes it possible to completely ignore a column
 
Level 15
Joined
Oct 18, 2008
Messages
1,588
Found a bug in adding skill points - Now I'm correcting it
Also I'm working on an add/remove skill button so that even if you have 20 of them unlocked you can still select which ones to use - but I can't use hashtable for this which makes it hard :(

Is there any jass way to get the string of an ability (the game ID) from a variable and to transform it back to a variable? It'd help me ^^

EDIT: Made a HUGE update, if anyone has an earlier version, please DL the new one. I fixed all the bugs so far and arranged the things so you don't need to touch any of the other triggers except the settings - the system dynamically alligns to the changes you make (well don't change the shape of the squares nor the size, that's something which I don't want to waste time on :p)
 
Last edited:
Level 3
Joined
Jul 8, 2008
Messages
28
Think in Future :)

by the way WOW Death system is more like Projectileing the Hero Death Itself untill the Soul go back to him or Ressed by spirit healer , i aint gonna teach you how to do all of that because its pointless and verry simple im just
gonna show you what it wont be bad to be done on your next update of the System Tree ( i made it in your own Death System , its that you just missed few things ) and thats what im gonna show you now :) as Example
EXAMPLE :
  • Unit - Create 1 (Unit-type of (Dying unit)) for Neutral Passive at DeathPos1 facing (Facing of (Dying unit)) degrees
  • Set DiedTempUnit[(Player number of (Triggering player))] = (Last created unit)
  • Animation - Play (Last created unit)'s death animation
  • Unit - Make (Last created unit) Invulnerable
\\\====("DiedTempUnit" is:
______________________________________
|Variable Name|Variable Type |Initial Value |
| | | |
|>DiedTempUnit|> Unit Array (1) |> -none- |
--------------------------------------------
...)====///


:goblin_boom:
THIS IS ONLY FOR !!ONLY!!ONE!!HERO!!PER!!PLAYER!!
:goblin_boom:

  • (Unit-type of (Triggering unit)) Equal to (Unit-type of DiedTempUnit[(Player number of (Triggering player))])
 
Level 3
Joined
Jul 8, 2008
Messages
28
maddeem you cannot Learn Abilitys because you need to have the hero Already in game or Otherwise sayed it should be more like!!!!!!! Set HEROES(1) = Paladin0027 !!!!!!!!!!
that is Example :) it could be any Unit like :
Set HEROES(2) = Dreadlord0008
the Numbers after the Name of the Unit is Declaired by WE ( Warcraft Editor ) When it was Created that Unit on the Map :) or you need to Upload you Pictures how to do it :)
and the Triggers i Posted , i Posted them for People who Already know How the System Works :) because the First Group of Triggers i Posted must go in "Unit Dies" - Trigger
and the Last one Must go in Conditions in "Resurrect Hero" - Trigger
thats all to Have Real WoW Revive System :) Because he made it When the Hero Dies to Create "TombStone" - Object Floating Overhead in the air <.< and you really want me to Believe , The Way i make it , When the Hero Dies it Automaticaly Create a Second Hero that Looks Like the First One at the Same Point of Death Which the Second One is Controlled by Neutral Forces which cannot be touched , when he is playing Animation in "Invulnerable" he cannot be attacked or Forced to do Whatever to Interrupt the Death :) and here it comes the Tricky part He Also Plays the Role of Animation and Object , b-cuz when your Hero Comes to him He Can Ressurect :) all this Here is Contained in 4 Lines of GUI Script Without any CUSTOM Scripts :) i Found that GUI is More Usefull then Jass But not so Correct :) if you dont know how to Make it :p

By the Way you Rock Maaan :) I Mostly Like how you made it with /--\Player Class - Talent Class/--\ Which i could Change at Any Time of Game :p Thanks for that Bro :)
And Keep up Da Spirit :p

Bro i wanna Ask you something Verry Important Can you make the System Work with Multi Specialization Example Spec1 and Spec2 :) to Switch Fast :) and if you can to show me How To Make Adding the Abilitys to Spellbook For Faster, because i will have to spend hour or two to make your System Work with the book because i dont know it Perfect so Far but i discovered already few WHOLES in your Sys , thats b-cuz im Experimenting as ussual :p hahahaaa
 
Last edited:
Level 15
Joined
Oct 18, 2008
Messages
1,588
by the way WOW Death system is more like Projectileing the Hero Death Itself untill the Soul go back to him or Ressed by spirit healer , i aint gonna teach you how to do all of that because its pointless and verry simple im just
gonna show you what it wont be bad to be done on your next update of the System Tree ( i made it in your own Death System , its that you just missed few things ) and thats what im gonna show you now :) as Example
EXAMPLE :
  • Unit - Create 1 (Unit-type of (Dying unit)) for Neutral Passive at DeathPos1 facing (Facing of (Dying unit)) degrees
  • Set DiedTempUnit[(Player number of (Triggering player))] = (Last created unit)
  • Animation - Play (Last created unit)'s death animation
  • Unit - Make (Last created unit) Invulnerable
\\\====("DiedTempUnit" is:
______________________________________
|Variable Name|Variable Type |Initial Value |
| | | |
|>DiedTempUnit|> Unit Array (1) |> -none- |
--------------------------------------------
...)====///


:goblin_boom:
THIS IS ONLY FOR !!ONLY!!ONE!!HERO!!PER!!PLAYER!!
:goblin_boom:

  • (Unit-type of (Triggering unit)) Equal to (Unit-type of DiedTempUnit[(Player number of (Triggering player))])

For normal units it would maybe work, but for units like the Lich who has no normal dead animation it'd screw it up ^^
 
Level 3
Joined
Jul 8, 2008
Messages
28
that was Example :) but you can always avoid it with one

IF
Lich and Dreadlord or Undead Rider
THEN
play common
ELSE
play death
(thats the lazy way)

there are many , many other things that you can use to avoid that :)
you know , but after all it's example :) b-cuz nothing is perfect :)

and btw please if you can, comment sirious things about my Examples, its no needed to talk something that most people know :)
 
Level 15
Joined
Oct 18, 2008
Messages
1,588
Such a nice stuff you got there. Finally a nice(and long O.O) talent tree written in GUI. As soon as I can touch my own map, I will use this cutie. But what if I only want 2 of the big columns? So I only want the Bloodthirst and Combat columns.

There is a variable currently set to 3, but if you set it to 2 it won't use the 3rd big column ^^ I've already prepared for questions like that ^^
 
Level 15
Joined
Oct 18, 2008
Messages
1,588
The hero may not be able to learn them because I didn't implement any abilities if I remember well, maybe only the first one. So you can only learn them if you link them with the system. From that point it should handle it. Just remember to have at least the same number of levels for the ability if not more than the talent's levels
 

Deleted member 177737

D

Deleted member 177737

I just downloaded and tested this...

Bugs:
-When I selected a talent no points were added.


Suggestions:
-Remove the need to click on the tombstone to resurrect, there should be a check to see if the ghost is within say 50 radius of the tombstone. If the unit is within 50 then resurrect the hero.
 

Deleted member 177737

D

Deleted member 177737

Well you select the talent in the talent tree and no point is added, basically nothing happens.
 

Deleted member 177737

D

Deleted member 177737

Did you click on the blue sign? :D Every talent has 4 buttons:
"blue" = add point
"green" = subtract point
"+" - teach hero (if an ability)
"-" - remove from hero
Hmm.... Maybe I should switch them? :D

I'd make them more noticeable, I went in that menu 4 times and never saw those.
 
Level 15
Joined
Oct 18, 2008
Messages
1,588
o_O Yayoi, you are some kind of miracle, as you're the first to go over such a thing xD When I made those I didnt have the knowledge to use left/right clicking on the icons efficiently. Although now I know trackables are capable of that, I kinda stopped working with WC3. I sometimes take a look at the Idea Factory, but thats most of what I do.
 

Deleted member 177737

D

Deleted member 177737

=P It helps if you check out your old stuff once-in-awhile, you can always improve things.
 
Level 15
Joined
Oct 18, 2008
Messages
1,588
I know, but I stopped playing/modding WC3, and I don't even know where my disc is, and in fact, I'm not even sure I want to go back to WC3 at all, maybe when I've finished my matura which comes this year. I'd really appreciate if someone would be so kind to edit this map, merge the hashtables and place right/left click control instead of the current one :3
 
Top