• 🏆 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!
  • 🏆 Hive's 6th HD Modeling Contest: Mechanical is now open! Design and model a mechanical creature, mechanized animal, a futuristic robotic being, or anything else your imagination can tinker with! 📅 Submissions close on June 30, 2024. Don't miss this opportunity to let your creativity shine! Enter now and show us your mechanical masterpiece! 🔗 Click here to enter!

TasAbilityFieldTooltip

  • Like
Reactions: deepstrasz

Introduction


This is a Lua system created for Warcraft 3 V1.31.1 or higher. It updates placeholders in an Extended Ability Tooltip with the current value from one of the abilityLevelField of the ability.

A simple math operation can be used onto it for display reasons, the second value in the operation can be an abilityLevelField of the same ability. This system only works probably for single unit selection and is only useful if one uses BlzSetAbilityIntegerLevelField, BlzSetAbilityRealLevelField or their GUI versions in the map script.

One still writes the tooltips in Object Editor but can write a placeholder to have a value that changes dynamicly during runtime.
An example of such is:
Calls down 'Hbz1' freezing ice shard waves; Deals 'Hbz2,*Hbz1' damage to units in an area over 'Hbz1,*acas' seconds.

This System can use HoverOriginButton to automatic update

How to Install:


Your map needs to be in Lua mode:
Copy Paste into your map either from the map or taking it from the Code Section below.
TasAbilityFieldTooltip

if you want the automatic update System copy HoverOriginButtonV1.3+ into your map and you need to TasAbilityFieldTooltip.InitAuto(true) in some 0s expired trigger.
The automatic update System needs FrameLoader when you want to support the warcraft 3 Save&Load System in your map.

For the automatic update system you need to tell the system what skills each unitCode has at the top of the system code, if the heroes dont learn them. Learned skills can be automatic handled.
this.HeroSkills = {
Hamg = "AHbz,AHab,AHwe,AHmt"

Code:


Lua:
--[[ TasAbilityFieldTooltip V2 by Tasyen
fills placeHolders in a extended ability Tooltip with current values of a 'abilityLevelField' can do simple displayFormating.
   Calls down 'Hbz1' freezing ice shard waves; Deals 'Hbz2,*Hbz1' damage to units in an area over 'Hbz1,*acas'.
displays fraction digits 'Hbz1,2' -> 10.xx 'Hbz1,1' -> 10.x
displays value*100 without fraction digits 'Hbz4,%'
One can do 1 math action onto the field for displaying purposes '<field>,<mathOp><Factor>'.
mathop is one of them + - * /
Factor is either a number or another AbilityLevelField RawCodeString when an RawCodeString is given it reads from the same ability
'Hbz2,*adur' display Blizzard Wavedamage*duration(unit)
'Hbz2,+10' display the value of 'Hbz2'+10

function TasAbilityFieldTooltip.InitAuto(addLearned) 
   start the auto updating, which only works correctly for single unit selection
   needs HoverOriginButton by Tasyen https://www.hiveworkshop.com/threads/hoveroriginbuttonv1-3.353560/
   addLearned = (true) autodetects learned skills and adds them to the unitCode of the learner

function TasAbilityFieldTooltip.GetRuntimeText(unit, abilityCode) -> string
function TasAbilityFieldTooltip.UpdateRuntimeText(unit, abilityCode)
   update the extended tooltip replace the placeholders with current values
   beaware that in V1.31.1 this will update the global extended tooltip for this skill.

Credits: Slayer of Reforged, Mayday, Zed
--]]
do
   local PercentChar = "\x25"
    TasAbilityFieldTooltip = {
       DefaultTooltip = {}
       ,Selected = {}
    }
    local this = TasAbilityFieldTooltip
     -- the skills for an unitCode to update for the automatic hoverOriginButton approach. Learned hero skills are added when they are learned the first time.
     -- so you only would need to add not learnedSkills
    this.HeroSkills  = {
       Hamg = "AHbz,AHab,AHwe,AHmt"
       --,Hpal = "AHhb,AHds,AHre,AHad"
    }
    local enumAbi, enumIndex
    local pattern = "'....?,?.?"..PercentChar.."w*'"
    local NoDigit = PercentChar..".0f"
    local function TextEnum(s)
      --print(s)
       -- 'Hbz1' -> Hbz1
       local fieldCode = string.sub(s,2,5)       
       if this.AbilityFieldData[fieldCode] then
          --print(fieldCode)      
          local func = this.AbilityFieldData[fieldCode]
          local field = func(FourCC(fieldCode))
         
         --print(string.len( s ))
 
         -- 'Hbz1' or advanced like 'Hbz1,2'
          if string.len(s) > 6 then
             local digits = string.sub(s,7,string.len( s ) - 1)
             local firstDigit = string.sub(digits, 1, 1)
              --print("'"..digits.."'")
             -- display value*100 
             if digits == PercentChar then
                return string.format(NoDigit, this.AbilityFieldData[func][1](enumAbi, field, enumIndex)*100)
             -- inline Math ,* ,+,-,/
             elseif firstDigit == "*" or firstDigit == "/" or firstDigit == "+" or firstDigit == "-" then
                -- do one math action onto the display 
                local remain = string.sub(digits, 2)
                
                local func2 = this.AbilityFieldData[remain]
                local value2
                if func2 then
                   local field2 = func2(FourCC(remain))
                   value2 = this.AbilityFieldData[func2][1](enumAbi, field2, enumIndex)
                else
                   value2 = tonumber(remain)
                end
 
                if firstDigit == "*" then
                   return string.format(NoDigit, this.AbilityFieldData[func][1](enumAbi, field, enumIndex) * value2)
                elseif firstDigit == "/" then
                   return string.format(NoDigit, this.AbilityFieldData[func][1](enumAbi, field, enumIndex) / value2)
                elseif firstDigit == "+" then
                   return string.format(NoDigit, this.AbilityFieldData[func][1](enumAbi, field, enumIndex) + value2)
                elseif firstDigit == "-" then
                   return string.format(NoDigit, this.AbilityFieldData[func][1](enumAbi, field, enumIndex) - value2)
                end
                -- when everything goes wrong
                return s
             -- display with this amount of fractions?
             -- this has to happen after inline Math because +1/-1 are interpreted as inline math but tonumber would see them as number
             elseif tonumber(digits) then
                return string.format(PercentChar.."."..digits.."f", this.AbilityFieldData[func][1](enumAbi, field, enumIndex))
             else
                print("unsupported TasAbilityFieldTooltip")
                print(GetObjectName(abilityCode), "Level", enumIndex+1, s)
                return s
             end
          else
             return string.format(NoDigit, this.AbilityFieldData[func][1](enumAbi, field, enumIndex))
          end
       else
          return s
       end
    end
    
 
 function this.GetRuntimeText(unit, abilityCode)
    if type(abilityCode) == "string" then abilityCode = FourCC(abilityCode) end
    local index = GetUnitAbilityLevel(unit, abilityCode) - 1
    local abi = BlzGetUnitAbility(unit, abilityCode)
 
    -- use the backup string or generate it on first use of this ability[index]
    local text = this.DefaultTooltip[abilityCode ..",".. index]
    if not text then text = BlzGetAbilityExtendedTooltip(abilityCode, index) this.DefaultTooltip[abilityCode ..",".. index] = text end
    
    --local result =  string.gsub(text, "'....,?"..PercentChar.."d?"..PercentChar.."p?"..PercentChar.."p?'", TextEnum
    enumAbi = abi
    enumIndex = index
    local result =  string.gsub(text, pattern, TextEnum)
    abi = nil
    enumAbi = nil

    return result
 end
 
 function this.UpdateRuntimeText(unit, abilityCode)
 --xpcall(function()
    if GetLocalizedString("REFORGED") == "REFORGED" then
       BlzSetAbilityExtendedTooltip(abilityCode, this.GetRuntimeText(unit, abilityCode), GetUnitAbilityLevel(unit, abilityCode) - 1)
    else
       BlzSetAbilityStringLevelField(BlzGetUnitAbility(unit, abilityCode), ABILITY_SLF_TOOLTIP_NORMAL_EXTENDED, GetUnitAbilityLevel(unit, abilityCode) - 1, this.GetRuntimeText(unit, abilityCode))
    end
 --end, print)
 end
  
 function this.InitAuto(addLearned)
    -- transform Hamg = "AHbz,AHab,AHwe,AHmt"
    -- -> FourCC("Hamg") = {FourCC["AHbz"] = true , FourCC["AHab"] = true ...}
    -- this is done for easier setup in this.HeroSkills
    for key, v in pairs(this.HeroSkills) do
       if type(v) == "string" then
          local vNew = {}
          local startIndex = 1
          while startIndex + 3 <= string.len(v)  do
                local skillCode = string.sub(v, startIndex, startIndex + 3)
                
                startIndex = startIndex + 5
                skillCode = FourCC(skillCode)
                vNew[skillCode] = true
          end
          v = vNew
       end
       if type(key) == "string" then this.HeroSkills[FourCC(key)] = v end      
    end
    if HoverOriginButton then
      HoverOriginButton.Add(ORIGIN_FRAME_COMMAND_BUTTON, function(int)
         local unitCode = GetUnitTypeId(this.Selected[GetLocalPlayer()])
         if this.HeroSkills[unitCode] then
               for abiCode in pairs(this.HeroSkills[unitCode]) do
                  this.UpdateRuntimeText(this.Selected[GetLocalPlayer()], abiCode)
               end
         end
      end)
 
    local trigger = CreateTrigger()
    TriggerRegisterAnyUnitEventBJ(trigger, EVENT_PLAYER_UNIT_SELECTED)
    TriggerAddAction(trigger, function()
       this.Selected[GetTriggerPlayer()] = GetTriggerUnit()
    end)

   end
    -- when wanted auto add learned skills to the update que for the learner's unitCode
    if addLearned then
       trigger = CreateTrigger()
       TriggerRegisterAnyUnitEventBJ(trigger, EVENT_PLAYER_HERO_SKILL)
       TriggerAddAction(trigger, function()
          local unitCode =  GetUnitTypeId(GetTriggerUnit())
          if not this.HeroSkills[unitCode] then this.HeroSkills[unitCode] = {} end
          this.HeroSkills[unitCode][GetLearnedSkill()] = true
       end)
    end
 end
 
 local fLInt = ConvertAbilityIntegerLevelField
 local fLReal = ConvertAbilityRealLevelField


 -- this data tells what to do with the given field 4 digit codeString
 -- This only cares about Ability Level Fields
 this.AbilityFieldData = {
 [fLInt] = {BlzGetAbilityIntegerLevelField, BlzSetAbilityIntegerLevelField},
 [fLReal] = {BlzGetAbilityRealLevelField, BlzSetAbilityRealLevelField},
 -- AbilityBooleanLevelField is not used it is AbilityIntegerLevelField instead
 --[ConvertAbilityBooleanLevelField] = {BlzGetAbilityBooleanLevelField,BlzSetAbilityBooleanLevelField},
 [ConvertAbilityStringLevelField] = {BlzGetAbilityStringLevelField,BlzSetAbilityStringLevelField},
 acas = fLReal,
 adur = fLReal,
 ahdu = fLReal,
 acdn = fLReal,
 amcs = fLInt,
 aare = fLReal,
 aran = fLReal,
 Hbz1 = fLInt,
 Hbz2 = fLReal,
 Hbz3 = fLInt,
 Hbz4 = fLReal,
 Hbz5 = fLReal,
 Hbz6 = fLReal,
 Hab1 = fLReal,
 Hab2 = fLInt,
 Hmt1 = fLInt,
 Hmt2 = fLReal,
 Hmt3 = fLInt,
 Hwe1 = fLInt,
 Hwe2 = fLInt,
 Oww1 = fLReal,
 Oww2 = fLReal,
 Ocr1 = fLReal,
 Ocr2 = fLReal,
  Ocr3 = fLReal,
  Ocr4 = fLReal,
  Ocr5 = fLInt,
  Ocr6 = fLInt,
  Omi1 = fLInt,
  Omi2 = fLReal,
  Omi3 = fLReal,
  Omi4 = fLReal,
  Owk1 = fLReal,
  Owk2 = fLReal,
  Owk3 = fLReal,
  Owk4 = fLInt,
  Owk5 = fLInt,
  Uan1 = fLInt,
  Uan3 = fLInt,
  Udc1 = fLReal,
  Udp1 = fLReal,
  Udp2 = fLReal,
  Udp3 = fLInt,
  Udp4 = fLInt,
  Udp5 = fLInt,
  Uau1 = fLReal,
  Uau2 = fLReal,
  Uau3 = fLInt,
  Eev1 = fLReal,
  Eim1 = fLReal,
  Eim2 = fLReal,
  Eim3 = fLReal,
  Emb1 = fLReal,
  Emb2 = fLReal,
  Emb3 = fLReal,
  Eme1 = fLInt,
  Eme2 = morphFlags,
  Eme3 = fLReal,
  Eme4 = fLReal,
  Eme5 = fLReal,
  Ncr5 = fLReal,
  Ncr6 = fLReal,
  Nrg5 = fLInt,
  Nrg6 = fLInt,
  ave5 = fLReal,
  Emeu = fLInt,
  Usl1 = fLReal,
  Uav1 = fLReal,
  Ucs1 = fLReal,
  Ucs2 = fLReal,
  Ucs3 = fLReal,
  Ucs4 = fLReal,
  Uin1 = fLReal,
  Uin2 = fLReal,
  Uin3 = fLReal,
  Uin4 = fLInt,
  Ocl1 = fLReal,
  Ocl2 = fLInt,
  Ocl3 = fLReal,
  Oeq1 = fLReal,
  Oeq2 = fLReal,
  Oeq3 = fLReal,
  Oeq4 = fLReal,
  Ofs1 = fLInt,
  Osf1 = fLInt,
  Osf2 = fLInt,
  Eer1 = fLReal,
  Efn1 = fLInt,
  Efnu = fLInt,
  Eah1 = fLReal,
  Eah2 = fLInt,
  Etq1 = fLReal,
  Etq2 = fLReal,
  Etq3 = fLReal,
  Etq4 = fLReal,
  Udd1 = fLReal,
  Udd2 = fLReal,
  Ufa1 = fLReal,
  Ufa2 = fLReal,
  Ufn1 = fLReal,
  Ufn2 = fLReal,
  Ufn5 = fLReal,
  Hfa1 = fLReal,
  Esf1 = fLReal,
  Esf2 = fLReal,
  Esf3 = fLReal,
  Ear1 = fLReal,
  Ear2 = fLInt,
  Ear3 = fLInt,
  Ear4 = fLInt,
  Hav1 = fLReal,
  Hav2 = fLReal,
  Hav3 = fLReal,
  Hav4 = fLReal,
  Hbh1 = fLReal,
  Hbh2 = fLReal,
  Hbh3 = fLReal,
  Hbh4 = fLReal,
  Hbh5 = fLInt,
  Htb1 = fLReal,
  Htc1 = fLReal,
  Htc2 = fLReal,
  Htc3 = fLReal,
  Htc4 = fLReal,
  Htc5 = fLReal,
  Had1 = fLReal,
  Had2 = fLInt,
  Hds1 = fLInt,
  Hhb1 = fLReal,
  Hre1 = fLInt,
  Hre2 = fLInt,
  Hca1 = fLReal,
  Hca2 = fLReal,
  Hca3 = fLReal,
  Hca4 = stackFlags,
  Oae1 = fLReal,
  Oae2 = fLReal,
  Ore1 = fLReal,
  Osh1 = fLReal,
  Osh2 = fLReal,
  Osh3 = fLReal,
  Osh4 = fLReal,
  Nfd1 = fLReal,
  Nfd2 = fLReal,
  Nfd3 = fLReal,
  Ndp1 = unitList,
  Ndp2 = fLInt,
  Ndp3 = fLInt,
  Nrc1 = fLInt,
  Nrc2 = fLInt,
  Ams1 = fLReal,
  Ams2 = fLReal,
  Ams3 = fLInt,
  Ams4 = fLInt,
  Apl1 = fLReal,
  Apl2 = fLReal,
  Apl3 = fLReal,
  Aplu = fLInt,
  Oar1 = fLReal,
  Oar2 = fLInt,
  Akb1 = fLReal,
  Adm1 = fLReal,
  Adm2 = fLReal,
  Btl1 = fLInt,
  Btl2 = fLInt,
  Bli1 = fLReal,
  Bli2 = fLInt,
  Bgm1 = fLInt,
  Bgm2 = fLReal,
  Bgm3 = fLInt,
  Bgm4 = fLReal,
  Blo1 = fLReal,
  Blo2 = fLReal,
  Blo3 = fLReal,
  Can1 = fLReal,
  Can2 = fLReal,
  Car1 = fLInt,
  Dev2 = fLReal,
  Dev3 = fLInt,
  Chd1 = fLReal,
  Chd2 = fLReal,
  Chd3 = fLReal,
  Cha1 = fLInt,
  Cri1 = fLReal,
  Cri2 = fLReal,
  Cri3 = fLReal,
  Crs = fLReal,
  Dda1 = fLReal,
  Dda2 = fLReal,
  Dda3 = fLReal,
  Dda4 = fLReal,
  Sds1 = fLReal,
  Sds6 = fLInt,
  Uco5 = fLReal,
  Uco6 = fLReal,
  Def1 = fLReal,
  Def2 = fLReal,
  Def3 = fLReal,
  Def4 = fLReal,
  Def5 = fLReal,
  Def6 = fLReal,
  Def7 = fLReal,
  Def8 = fLReal,
  Dev1 = fLInt,
  Eat1 = fLReal,
  Eat2 = fLReal,
  Eat3 = fLReal,
  Ens1 = fLReal,
  Ens2 = fLReal,
  Ens3 = fLReal,
  ent1 = fLInt,
  Egm1 = fLInt,
  Egm2 = fLReal,
  Fae1 = fLInt,
  Fae2 = fLInt,
  Fla1 = fLInt,
  Fla2 = fLReal,
  Fla3 = fLInt,
  Gld1 = fLInt,
  Gld2 = fLReal,
  Gld3 = fLInt,
  Gyd1 = fLInt,
  Gyd2 = fLReal,
  Gyd3 = fLReal,
  Gydu = fLInt,
  Har1 = fLInt,
  Har2 = fLInt,
  Har3 = fLInt,
  Hea1 = fLReal,
  Inf1 = fLReal,
  Inf2 = fLInt,
  Inf3 = fLReal,
  Inf4 = fLReal,
  Lit1 = fLReal,
  Lit2 = fLReal,
  Lsh1 = fLReal,
  Loa1 = fLInt,
  Mbt1 = fLReal,
  Mbt2 = fLReal,
  Mbt3 = fLReal,
  Mbt4 = fLReal,
  Mbt5 = fLInt,
  Mil1 = fLInt,
  Mil2 = fLInt,
  Min1 = fLReal,
  Min2 = fLReal,
  Neu1 = fLReal,
  Neu2 = fLInt,
  Neu3 = fLInt,
  Neu4 = fLInt,
  Ndt1 = fLInt,
  Ndt2 = fLInt,
  Ndt3 = fLInt,
  Ans5 = ConvertAbilityStringLevelField,
  Ans6 = fLInt,
  Arm1 = fLReal,
  Arm2 = fLInt,
  Poi1 = fLReal,
  Poi2 = fLReal,
  Poi3 = fLReal,
  Poi4 = stackFlags,
  Poa1 = fLReal,
  Poa2 = fLReal,
  Poa3 = fLReal,
  Poa4 = fLReal,
  Poa5 = stackFlags,
  Ply1 = fLInt,
  Ply2 = unitList,
  Ply3 = unitList,
  Ply4 = unitList,
  Ply5 = unitList,
  Pos1 = fLInt,
  Pos2 = fLReal,
  Pos3 = fLInt,
  Pos4 = fLInt,
  War1 = fLReal,
  War2 = fLReal,
  War3 = fLReal,
  War4 = fLReal,
  Prg1 = fLInt,
  Prg2 = fLInt,
  Prg3 = fLReal,
  Prg4 = fLReal,
  Prg5 = fLReal,
  Prg6 = fLInt,
  Rai1 = fLInt,
  Rai2 = fLInt,
  Rai3 = fLInt,
  Rai4 = fLInt,
  Raiu = fLInt,
  Ucb5 = fLInt,
  Ucb6 = fLInt,
  Rej1 = fLReal,
  Rej2 = fLReal,
  Rej3 = fLInt,
  Rej4 = fLInt,
  Rpb3 = fLReal,
  Rpb4 = fLReal,
  Rpb5 = fLInt,
  Rpb6 = fLInt,
  Rep1 = fLReal,
  Rep2 = fLReal,
  Rep3 = fLReal,
  Rep4 = fLReal,
  Rep5 = fLReal,
  Rtn1 = fLInt,
  Rtn2 = fLInt,
  Roa1 = fLReal,
  Roa2 = fLInt,
  Roa3 = fLReal,
  Roa4 = fLReal,
  Roa5 = fLInt,
  Roa6 = fLInt,
  Roa7 = fLInt,
  Nbr1 = fLReal,
  Roo1 = attackBits,
  Roo2 = attackBits,
  Roo3 = fLInt,
  Roo4 = defenseTypeInt,
  Sal1 = fLReal,
  Sal2 = fLInt,
  Esn1 = fLReal,
  Esn2 = fLReal,
  Esn3 = fLReal,
  Esn4 = fLInt,
  Esn5 = fLReal,
  Shm1 = fLReal,
  Shm2 = fLReal,
  Shm3 = fLReal,
  Shm4 = fLInt,
  Slo1 = fLReal,
  Slo2 = fLReal,
  Slo3 = fLInt,
  Spo1 = fLReal,
  Spo2 = fLReal,
  Spo3 = fLReal,
  Spo4 = stackFlags,
  Sod1 = fLInt,
  Sod2 = fLInt,
  Spa1 = fLInt,
  Sta1 = fLReal,
  Sta2 = fLReal,
  Sta3 = fLReal,
  Sta4 = fLReal,
  Sta5 = fLReal,
  Stau = fLInt,
  Uhf1 = fLReal,
  Uhf2 = fLReal,
  Wha1 = fLReal,
  Wha2 = fLInt,
  Wha3 = fLReal,
  Wrp1 = fLReal,
  Wrp2 = fLReal,
  Iagi = fLInt,
  Iint = fLInt,
  Istr = fLInt,
  Ihid = fLInt,
  Iatt = fLInt,
  Idef = fLInt,
  Isn1 = fLInt,
  Ist1 = fLInt,
  Isn2 = fLInt,
  Ist2 = fLInt,
  Ixpg = fLInt,
  Ihpg = fLInt,
  Impg = fLInt,
  Ihp2 = fLInt,
  Imp2 = fLInt,
  Ivam = fLReal,
  Idic = fLInt,
  Iarp = fLInt,
  Idam = fLReal,
  Iob5 = fLInt,
  Iob2 = fLReal,
  Iob3 = fLReal,
  Iob4 = fLReal,
  Iobu = fLInt,
  Ilev = fLInt,
  Ilif = fLInt,
  Iman = fLInt,
  Igol = fLInt,
  Ilum = fLInt,
  Ifa1 = fLInt,
  Idel = fLReal,
  Icre = fLInt,
  Imvb = fLInt,
  Ihpr = fLInt,
  Isib = fLInt,
  Icfd = fLInt,
  Icfm = fLInt,
  Icfx = fLInt,
  Idet = fLInt,
  Idim = fLInt,
  Idid = fLInt,
  Iild = fLReal,
  Iilw = fLReal,
  Irec = fLInt,
  Imrp = fLReal,
  Ircd = fLInt,
  irc2 = fLInt,
  irc3 = fLInt,
  Ihps = fLInt,
  Imps = fLInt,
  Ispi = fLReal,
  Itpm = fLInt,
  Itp2 = fLInt,
  Idps = fLReal,
  Cad1 = fLInt,
  Cac1 = fLReal,
  Cor1 = fLReal,
  Isx1 = fLReal,
  Wrs1 = fLReal,
  Wrs2 = fLReal,
  Wrs3 = fLInt,
  Ctc1 = fLReal,
  Ctc2 = fLReal,
  Ctc3 = fLReal,
  Ctc4 = fLReal,
  Ctb1 = fLReal,
  Ibl1 = unitList,
  Uds1 = fLInt,
  Uds2 = fLReal,
  Ndc1 = unitRace,
  Ndc2 = fLInt,
  Nsl1 = fLInt,
  Chl1 = fLInt,
  Det1 = fLInt,
  Dtn1 = fLReal,
  Dtn2 = fLReal,
  Eth1 = fLInt,
  Eth2 = fLInt,
  Gho1 = fLInt,
  Gho2 = fLInt,
  Gho3 = fLInt,
  Ivs1 = fLReal,
  Nmr1 = fLReal,
  Nsp1 = fLInt,
  Nsp2 = fLInt,
  Nsp3 = fLInt,
  Ssk1 = fLReal,
  Ssk2 = fLReal,
  Ssk3 = fLReal,
  Ssk4 = fLInt,
  Ssk5 = fLInt,
  Hfs1 = fLReal,
  Hfs2 = fLReal,
  Hfs3 = fLReal,
  Hfs4 = fLReal,
  Hfs5 = fLReal,
  Hfs6 = fLReal,
  Nms1 = fLReal,
  Nms2 = fLReal,
  Uim1 = fLReal,
  Uim2 = fLReal,
  Uim3 = fLReal,
  Uim4 = fLReal,
  Uim5 = fLInt,
  Uim6 = fLInt,
  Uls1 = fLInt,
  Uls2 = fLReal,
  Uls3 = fLInt,
  Uls4 = fLReal,
  Uls5 = fLReal,
  Ulsu = fLInt,
  Uts1 = fLReal,
  Uts2 = fLReal,
  Uts3 = fLReal,
  Nba1 = fLReal,
  Nba2 = fLInt,
  Nba3 = fLReal,
  Nbau = fLInt,
  Nch1 = fLInt,
  Cmg2 = fLReal,
  Cmg3 = fLReal,
  Ndr1 = fLReal,
  Ndr2 = fLReal,
  Ndr3 = fLReal,
  Ndr4 = fLReal,
  Ndr5 = fLReal,
  Ndr6 = fLReal,
  Ndr7 = fLReal,
  Ndr8 = fLReal,
  Ndr9 = fLReal,
  NdrA = fLInt,
  Nsi1 = fLInt,
  Nsi2 = fLReal,
  Nsi3 = fLReal,
  Nsi4 = fLReal,
  Ntou = fLInt,
  Tdg1 = fLReal,
  Tdg2 = fLReal,
  Tdg3 = fLReal,
  Tdg4 = fLReal,
  Tdg5 = fLReal,
  Tsp1 = fLReal,
  Tsp2 = fLReal,
  Nbf5 = fLReal,
  Ebl1 = fLReal,
  Ebl2 = fLReal,
  Efk1 = fLReal,
  Efk2 = fLReal,
  Efk3 = fLInt,
  Efk4 = fLReal,
  Esh1 = fLReal,
  Esh2 = fLReal,
  Esh3 = fLReal,
  Esh4 = fLReal,
  Esh5 = fLReal,
  Esv1 = fLInt,
  Esvu = fLInt,
  abs1 = fLReal,
  abs2 = fLReal,
  bsk1 = fLReal,
  bsk2 = fLReal,
  bsk3 = fLReal,
  coau = fLInt,
  coa1 = fLInt,
  coa2 = fLInt,
  cyc1 = fLInt,
  dcp1 = fLInt,
  dcp2 = fLInt,
  dvm1 = fLReal,
  dvm2 = fLReal,
  dvm3 = fLReal,
  dvm4 = fLReal,
  dvm5 = fLReal,
  dvm6 = fLInt,
  exh1 = fLInt,
  exhu = fLInt,
  fak1 = fLReal,
  fak2 = fLReal,
  fak3 = fLReal,
  fak4 = fLReal,
  fak5 = fLReal,
  hwdu = fLInt,
  inv1 = fLInt,
  inv2 = fLInt,
  inv3 = fLInt,
  inv4 = fLInt,
  inv5 = fLInt,
  liq1 = fLReal,
  liq2 = fLReal,
  liq3 = fLReal,
  liq4 = fLInt,
  mim1 = fLReal,
  mfl1 = fLReal,
  mfl2 = fLReal,
  mfl3 = fLReal,
  mfl4 = fLReal,
  mfl5 = fLReal,
  mfl6 = fLInt,
  tpi1 = fLInt,
  tpi2 = fLInt,
  spl1 = fLReal,
  spl2 = fLInt,
  irl1 = fLReal,
  irl2 = fLReal,
  irl3 = fLInt,
  irl4 = fLInt,
  irl5 = fLInt,
  idc1 = fLReal,
  idc2 = fLReal,
  idc3 = fLInt,
  imo1 = fLInt,
  imo2 = fLReal,
  imo3 = fLReal,
  imou = fLInt,
  ict1 = fLInt,
  ict2 = fLInt,
  isr1 = fLReal,
  isr2 = fLReal,
  ipv1 = fLReal,
  ipv2 = fLReal,
  ipv3 = fLInt,
  mec1 = fLInt,
  spb1 = ConvertAbilityStringLevelField,
  spb2 = fLInt,
  spb3 = fLInt,
  spb4 = fLInt,
  spb5 = ConvertAbilityStringLevelField,
  ast1 = fLReal,
  ast2 = fLReal,
  gra1 = fLReal,
  gra2 = fLReal,
  gra3 = fLInt,
  gra4 = fLInt,
  gra5 = fLInt,
  ipmu = fLInt,
  Npr1 = fLInt,
  Nsa1 = fLInt,
  Nsa2 = fLReal,
  Nsa3 = fLReal,
  Nsa4 = fLReal,
  Nsa5 = fLReal,
  Iaa1 = fLInt,
  Ixs1 = fLReal,
  Ixs2 = fLReal,
  Nef1 = unitList,
  Npa5 = fLInt,
  Npa6 = fLReal,
  Igl1 = fLInt,
  Iglu = fLInt,
  Nse1 = fLReal,
  Ndo1 = fLReal,
  Ndo2 = fLInt,
  Ndo3 = fLReal,
  Ndo4 = fLInt,
  Ndo5 = fLReal,
  Ndou = fLInt,
  flk1 = fLReal,
  flk2 = fLReal,
  flk3 = fLReal,
  flk4 = fLReal,
  flk5 = fLReal,
  Hbn1 = fLReal,
  Hbn2 = fLReal,
  fbk1 = fLReal,
  fbk2 = fLReal,
  fbk3 = fLReal,
  fbk4 = fLReal,
  fbk5 = fLReal,
  nca1 = fLReal,
  pxf1 = fLReal,
  pxf2 = fLReal,
  mls1 = fLReal,
  sla1 = fLInt,
  Nst1 = fLInt,
  Nst2 = fLReal,
  Nst3 = fLReal,
  Nst4 = fLReal,
  Nst5 = fLReal,
  sla2 = fLInt,
  Ncl1 = fLReal,
  Ncl2 = fLInt,
  Ncl3 = fLInt,
  Ncl4 = fLReal,
  Ncl5 = fLInt,
  Ncl6 = ConvertAbilityStringLevelField,
  Nab1 = fLReal,
  Nab2 = fLReal,
  Nab3 = fLInt,
  Nab4 = fLReal,
  Nab5 = fLReal,
  Nab6 = fLReal,
  Nhs6 = fLInt,
  Ntm1 = fLReal,
  Ntm2 = fLReal,
  Ntm3 = fLInt,
  Ntm4 = fLInt,
  Neg1 = fLReal,
  Neg2 = fLReal,
  Neg3 = ConvertAbilityStringLevelField,
  Neg4 = ConvertAbilityStringLevelField,
  Neg5 = ConvertAbilityStringLevelField,
  Neg6 = ConvertAbilityStringLevelField,
  Ncs1 = fLReal,
  Ncs2 = fLReal,
  Ncs3 = fLInt,
  Ncs4 = fLReal,
  Ncs5 = fLReal,
  Ncs6 = fLReal,
  Nsy1 = fLReal,
  Nsy2 = fLInt,
  Nsy3 = fLReal,
  Nsy4 = fLReal,
  Nsy5 = fLReal,
  Nsyu = fLInt,
  Nfy1 = fLReal,
  Nfy2 = fLReal,
  Nfyu = fLInt,
  Nde1 = fLReal,
  Nde2 = fLReal,
  Nde3 = fLReal,
  Nde4 = fLReal,
  Nic1 = fLReal,
  Nic2 = fLReal,
  Nic3 = fLReal,
  Nic4 = fLReal,
  Nic5 = fLReal,
  Nic6 = fLReal,
  Nso1 = fLReal,
  Nso2 = fLReal,
  Nso3 = fLReal,
  Nso4 = fLReal,
  Nso5 = fLReal,
  Nlm2 = fLReal,
  Nlm3 = fLInt,
  Nlm4 = fLReal,
  Nlm5 = fLReal,
  Nlm6 = fLInt,
  Nvc1 = fLInt,
  Nvc2 = fLInt,
  Nvc3 = fLReal,
  Nvc4 = fLReal,
  Nvc5 = fLReal,
  Nvc6 = fLReal,
  Nvcu = fLInt,
  Tau1 = fLInt,
  Tau2 = fLInt,
  Tau3 = fLInt,
  Tau4 = fLInt,
  Tau5 = fLReal,
  Idg1 = fLInt,
  Idg2 = fLInt,
  Idg3 = targetList,
  Uuf1 = fLInt,
  Uuf2 = fLInt,
  Uuf3 = targetList,
  Hsb1 = fLReal,
  Hsb2 = fLReal,
  Hsb3 = defenseTypeInt,
  Iofr = fLReal,
  AIvu = fLInt,
  Akb2 = fLInt,
  ausk = unitSkinList,
  Aat1 = fLInt,
  }
end

Changelog


Changes:
V2

Manual Update & Automatic System optional
Some mini optimizations
Migrate from Code Archive

Tags: Ability Field, Custom UI, Hover, Tooltip, Dynamic​
Contents

TasAbilityFieldTooltip (Map)

Reviews
Antares
Migrated resource from the Code Archive. Originally approved by @Bribe Approved
Top