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

[System][vJASS] List World Editor Object IDs

Status
Not open for further replies.
Level 12
Joined
Feb 27, 2019
Messages
399
Looking for
- Your advices to optimize/clean it, and optionally your code-reviews.
- Your ideas of other libraries that can use this one to provide usefull features !
- Your toughts about this library :)

Content
Here is a project of mine of library that lists World Editor Object IDs. World Editor Objects are all 7 types you can see in the Object Editor: Units, Items, Destructibles, Doodads, Abilities, Buffs & Upgrades.

The goal was to make it real-time as much as possible. Currently it requires a few seconds at most depending of the amount of custom IDs in your map. Plus, in case your game as a start phase (pick, settings, ...), you can slow the execution pace with a periodic timer in order to avoid freezes or lags.

How does it work ?
1 - Standard objects IDs are hardcoded.
2 - Custom object IDs are scanned using the following assumptions:
> For each type, IDs start by a set of letter (ex: 'D' for Doodads, 'A' and 'S' for Abilities)
> The 3 other letters are in character set [A-Z0-9]
> By default, World Editor uses '<letter>000' as first custom ID, '<letter>001' then, etc...
3 - Thus, ID scanning jumps from potentiel ID to consecutive potential ID, tests it, and stops after a given number of fails to avoid browsing the whole range ('<letter>000' to '<letter>ZZZ') !
4 - For each type, I tried to find the faster test functions to minimize execution time.
5 - In the end, standard and custom IDs are merged per type, in increasing value order, in globals arrays.
6 - IdScannerEvent's to be notified when scan starts and ends.


Performances

- You can get any or all World Editor Object IDs. Ex below for only Abilities:
upload_2019-11-1_13-35-27.png
- Execution time depends of the amount of custom IDs: depending on the type (all test functions are not equivaly performant), count 2 to 6ms per custom ID. In my case, 278 custom abilities are scanned in approximatively 1,6s.

Code
My teachers always learned me to separate data from treatments, thus there are:
1 - One library "Id" that carries all IDs and make them available for read-only access
2 - One library "IdScanner" with a manager that handles execution and base templates to implement scanners for each type.
3 - Per type, one library "XxxxxxIdScanner" that implements an ID scanner for this type. You can enable only the ones you need to shorten processing time with right-click > Disable Trigger (from Trigger Editor).
4 - (Optional) One very basic library "IdScanLauncher" that starts the processing on map initialization.

Pros
- Execution time goes from real-time to a few seconds.
- Possibility to slow execution pace to hide it behind your map initialization.
- Many potentiel uses:
> Get unit ability ID list
> Get unit buff ID list
> Get items ability ID list
> Indexers
....​

Cons
- Currently coded with 1.31 standard object lists.
- Only works if you let World Editor allocates IDs in Object Editor (default behavior). Do not use the new 1.31 feature that allows to choose manually an ID. Otherwise you will have to hardcoded these ones...
upload_2019-11-1_13-43-26.png
- Currently does not work with Doodads, Buffs and Upgrade whose name is null, because GetObjectName was the only choice to test these types.
- Creates 1 dummy unit for ability IDs scan, and dummy corpses/items/destructibles respectively for units, items and destructibles.

Attached
A test map with the code and some custom object IDs if you want to test/play with the library.

Prerequisites

- Ascii (by Nestharus, Bribe)
- NextPrev ObjectId (originally by IcemanBo, modified by Ricola3D to only browse potential custom IDs)
JASS:
library NextPrevCustomObjectId /* v1.0

    Derivate of NextPrevObjectId but that only considers custom object ids.
    Custom object ids is a subset of all ids:
    - Fourth byte takes values in [0-9A-Za-Z]
    - First 3 bytes take values only in [A-Z0-9]
    Ex:
       - 'A01Z' is a possible custom id
       - 'A01z' is not a possible custom id

    API
    function GetNextCustomObjectId takes integer objectId returns integer
    function GetPrevCustomObjectId takes integer objectId returns integer

*/
    globals
        private integer array pow256
        private integer array gapValue
        private integer array jumpValue
    endglobals

    private function GetNextCustomObjectId_private takes integer objectId, integer bytenumber returns integer
        local integer currentByteValue
        if ( bytenumber > -1 and bytenumber < 4 ) then
            set currentByteValue = ModuloInteger(objectId, pow256[bytenumber + 1])  / pow256[bytenumber]
        else
            return objectId
        endif
        if ( currentByteValue != '9' and currentByteValue != 'Z' and currentByteValue != 'z' ) then
            return objectId + pow256[bytenumber]
        else
            if ( currentByteValue == '9' ) then
                return objectId + gapValue[currentByteValue] * pow256[bytenumber]
            elseif ( currentByteValue == 'Z' ) then
                if ( bytenumber == 3 ) then
                    // 4th byte, allowed to use [a-z]
                    return objectId + gapValue[currentByteValue] * pow256[bytenumber]
                else
                    // First 3 bytes, cannot use [a-z], increase next byte
                    return GetNextCustomObjectId_private(objectId - jumpValue[currentByteValue] * pow256[bytenumber], (bytenumber + 1))
                endif
            else // currentByteValue == 'z' (should never happen)
                return GetNextCustomObjectId_private(objectId - gapValue[currentByteValue] * pow256[bytenumber], (bytenumber + 1))
            endif
        endif
    endfunction
    private function GetPrevCustomObjectId_private takes integer objectId, integer bytenumber returns integer
        local integer currentByteValue
        if ( bytenumber > -1 and bytenumber < 4 ) then
            set currentByteValue = ModuloInteger(objectId, pow256[bytenumber + 1])  / pow256[bytenumber]
        else
            return objectId
        endif
        if ( currentByteValue != '0' and currentByteValue != 'A' and currentByteValue != 'a' ) then
            return objectId - pow256[bytenumber]
        else
            if ( currentByteValue == '0' ) then
                return GetPrevCustomObjectId_private(objectId + jumpValue[currentByteValue] * pow256[bytenumber], (bytenumber + 1))
            elseif ( currentByteValue == 'A' ) then
                return objectId - gapValue[currentByteValue] * pow256[bytenumber]
            else // currentByteValue == 'a' (should never happen)
                return objectId - gapValue[currentByteValue] * pow256[bytenumber]
            endif
        endif
    endfunction
    function GetPrevCustomObjectId takes integer objectId returns integer
        return GetPrevCustomObjectId_private(objectId, 0)
    endfunction
    function GetNextCustomObjectId takes integer objectId returns integer
        return GetNextCustomObjectId_private(objectId, 0)
    endfunction
    private module M
        private static method onInit takes nothing returns nothing
            local integer i = 0
            loop
                exitwhen i > 4
                set pow256[i] = R2I(Pow(256, i))
                set i = i + 1
            endloop
            set gapValue['9'] = 'A' - '9'
            set gapValue['Z'] = 'a' - 'Z'
            set gapValue['z'] = 'z' - '0'
            set gapValue['A'] = gapValue['9']
            set gapValue['a'] = gapValue['Z']
            set gapValue['0'] = gapValue['z']
            set jumpValue['Z'] = 'Z' - '0'
            set jumpValue['0'] = jumpValue['Z']
        endmethod
    endmodule
    private struct S extends array
        implement M
    endstruct
endlibrary

Source code
Id
JASS:
/*
Id lib v1.0.0 (21/10/2019) by Ricola3D

Content:
Very simple library to store all World Editor object ids a in game, and expose it to developers.
This library doesn't retrieve the content, it just stores and exposes it. IdScanner is responsible for filling the lists.

Note: by construction, all lists are sorted by increasing value.

API:
   - staticIdList: simple read-only array struct with size() method and [] operator. Internaly works with a global array, not a hashtable, so access speed is maximal.

   - GetAllUnitIds: takes nothing returns staticIdList
   - GetAllItemIds: takes nothing returns staticIdList
   - GetAllDestructibleIds: takes nothing returns staticIdList
   - GetAllDoodadIds: takes nothing returns staticIdList
   - GetAllAbilityIds: takes nothing returns staticIdList
   - GetAllBuffIds: takes nothing returns staticIdList
   - GetAllUpgradeIds: takes nothing returns staticIdList
*/
library Id

    /*
    Struct-like interface for a read-only integer array. Can be used as function parameter or return.
    */
    interface staticIdList

        method size takes nothing returns integer
        method operator [] takes integer i returns integer

    endinterface

    /*
    Macro to add a new object editor type: Units, Items, Destructibles, ...
    */
    //! textmacro DECL_WORLDEDITOR_TYPE takes TYPE_NAME
        globals
            // All World Editor $TYPE_NAME$ ids
            private integer array $TYPE_NAME$Ids
            private integer $TYPE_NAME$Count = 0

            // Browser for read-only access to all World Editor $TYPE_NAME$ ids
            private staticIdList $TYPE_NAME$IdBrowser
        endglobals

        /*
        A very simple structure that exposes read-only access to a predefined private global dynamic array.
        */
        private struct all$TYPE_NAME$IdBrowser extends staticIdList

            method size takes nothing returns integer
                return $TYPE_NAME$Count
            endmethod
 
            method operator [] takes integer i returns integer
                return $TYPE_NAME$Ids[i]
            endmethod

        endstruct

        /*
        RegisterXxxxxId: function used by scanners to append an Xxxxxx to the list
        */
        function Register$TYPE_NAME$Id takes integer id returns nothing
            set $TYPE_NAME$Ids[$TYPE_NAME$Count] = id
            set $TYPE_NAME$Count = $TYPE_NAME$Count + 1
        endfunction

        /*
        GetAllXxxxxÎds: API function to get all abilities in the game
        */
        function GetAll$TYPE_NAME$Ids takes nothing returns staticIdList
            return $TYPE_NAME$IdBrowser
        endfunction

    private module $TYPE_NAME$Init
        private static method onInit takes nothing returns nothing
            set $TYPE_NAME$IdBrowser = all$TYPE_NAME$IdBrowser.create()
        endmethod
    endmodule
    private struct $TYPE_NAME$Initializer extends array
        implement $TYPE_NAME$Init
    endstruct
    //! endtextmacro

    /*
    Add all editor item types
    */
    //! runtextmacro DECL_WORLDEDITOR_TYPE ("Unit")
    //! runtextmacro DECL_WORLDEDITOR_TYPE ("Item")
    //! runtextmacro DECL_WORLDEDITOR_TYPE ("Destructible")
    //! runtextmacro DECL_WORLDEDITOR_TYPE ("Doodad")
    //! runtextmacro DECL_WORLDEDITOR_TYPE ("Ability")
    //! runtextmacro DECL_WORLDEDITOR_TYPE ("Buff")
    //! runtextmacro DECL_WORLDEDITOR_TYPE ("Upgrade")

endlibrary

IdScanner
JASS:
/*
IdScanner lib v1.0.0 (21/10/2019) by Ricola3D

Content:
Base mechanism to retrieve World Editor object ids and store them in the Id library.
AbstractIdScanner provides a base class to derivate & declare a scanner for 1 type.
IdScannerManager is a singleton class to manage all scanners and launch them on a clock pace (usefull to avoid freezing).
You can activate/unactivate any "XxxxIdScanner" available with right-click > Enable/Disable Trigger.

Configuration:
- real TICK_PERIOD: pace of the execution clock
- integer ITERATIONS_PER_SECOND: max number of IDs tested by second. Per scanner. -1 for no limit.
- integer CONSECUTIVE_FAIL_COUNT_FOR_STOP: for optimization, stops after this number of consecutive unused IDs

API (vJass):
   - real IdScannerEvent: allows to catch the following events
      > IdScannerEvent == 1.0: Scanning starts
      > IdScannerEvent == 2.0: Scanning is complete

API (GUI friendly):
   - real udg_IdScannerEvent: same behavior as above.

*/
library IdScanner requires Id, NextPrevCustomObjectId, Ascii

    globals

        // Configuration
        constant real TICK_PERIOD = 0.04 // Time between 2 ticks
        constant integer ITERATIONS_PER_SECOND = -1 // -1 to disable, positive number to delay the process in several frames.
        constant integer CONSECUTIVE_FAIL_COUNT_FOR_STOP = 31 // -1 to disable. Impact of performances is drastic.

        constant integer ITERATIONS_PER_TICK = R2I(I2R(ITERATIONS_PER_SECOND) * TICK_PERIOD) // DO NOT EDIT

        // Event (JASS)
        real IdScannerEvent = 0.0

    endglobals

    /*
    A base abstract class to implement scanner for one World Editor object type.
    */
    struct AbstractIdScanner

        // Public members
        string scanRangePrefixes // Potentiel first letter of IDs
        readonly integer totalCounter = 0 // counter for total tested IDs
        readonly integer succeedCounter = 0 // counter for total valid IDs
        readonly boolean ended = true // When scan is finished

        // Private members
        private integer currentRangeIndex = -1 // Index of first letter being scanned
        private integer consecutiveFailCounter = 0 // Counter for consecutive fails
        integer startId = -1 // Start ID for the current range
        integer endId = -1 // End ID for the current range

        /*
        Method executed once on scan start
        */
        method start takes nothing returns nothing
            local boolean empty = false
            set ended = false
            set totalCounter = 0
            set succeedCounter = 0
            set consecutiveFailCounter = 0
            set currentRangeIndex = 0
            call onStart()
            set empty = (not setScanRange(currentRangeIndex) )
            call saveStandardRange(currentRangeIndex)
            if ( empty ) then
                call end()
            endif
        endmethod

        /*
        Method executed once on start and once more for each additional range.
        In charge of setting startId & endId for the requested range.
        Returns false after last range, true otherwise.
        */
        method setScanRange takes integer index returns boolean
            local integer length = StringLength(scanRangePrefixes)
            local string firstChar
            local integer firstByte
            if ( length > index ) then
                set firstChar = SubString(scanRangePrefixes, index, index + 1)
                set firstByte = Char2Ascii(firstChar)
                set startId = firstByte * 256 * 256 * 256 + 48 * 256 * 256 + 48 * 256 + 48  // '<Letter>000'
                set endId = firstByte * 256 * 256 * 256 + 57 * 256 * 256 + 90 * 256 + 90 // '<Letter>9ZZ' ( 9=57, Z=90)
            else
                set startId = -1
                set endId = -1
            endif
            return ( -1 != startId )
        endmethod

        /*
        Method executed on each clock tick to scan ITERATIONS_PER_TICK ids of this World Editor object type.
        Calls setScanRange(i) & saveStandardRange(i) at range end.
        Calls end() at last range end or after CONSECUTIVE_FAIL_COUNT_FOR_STOP consecutive fails.
        */
        method tick takes nothing returns nothing
            local integer startCounter = totalCounter
            local integer id = 0
            local integer nextId = startId
            local boolean isValidId = false
            local boolean timeoutCondition = false
            local boolean endCondition = false
            local boolean last = false
            loop
                set id = nextId
                set totalCounter = totalCounter + 1
 
                // Test if this is the ID is valid
                set isValidId = isValidId(id)
 
                if ( isValidId ) then
                    call saveId(succeedCounter, id)
                    set succeedCounter = succeedCounter + 1
                    set consecutiveFailCounter = 0
                else
                    set consecutiveFailCounter = consecutiveFailCounter + 1
                endif
 
                // Next loop index
                set nextId = GetNextCustomObjectId(id)
 
                // Stop loop if timeout or end condition is matched
                set timeoutCondition = ( (ITERATIONS_PER_SECOND >= 0 ) and ( ITERATIONS_PER_TICK <= totalCounter - startCounter ) )
                set endCondition = ( ( id == endId ) or ( CONSECUTIVE_FAIL_COUNT_FOR_STOP == consecutiveFailCounter ) )
                exitwhen( timeoutCondition or endCondition )
            endloop
 
            // Update start point for next tick
            set startId = nextId
 
            // Change scan range when the current range is done
            if ( endCondition ) then
                set currentRangeIndex = currentRangeIndex + 1
                set last = ( not setScanRange(currentRangeIndex) )
                call saveStandardRange(currentRangeIndex)
                if ( last ) then
                    call end()
                endif
            endif
        endmethod

        /*
        Method called at last range end.
        Notifies the manager.
        */
        private method end takes nothing returns nothing
            set ended = true
            call onEnd()
            call IdScannerManager.OnScannerEnd(this)
        endmethod

        /*
        This method is called once per tested ID to check if it is used or not.
        Shall return true is valid, false otherwise.
        Default: return true if GetObjectName does not return null.
        You can overide it with a quicker or more reliable method!
        */
        stub method isValidId takes integer id returns boolean
            local boolean isValid = false
            local string testString = GetObjectName(id)
            if ( null != testString ) then
                set isValid = true
            endif
            return isValid
        endmethod

        /*
        Method called to save the valid IDs in Id library
        */
        stub method saveId takes integer index, integer id returns nothing
        endmethod

        /*
        This method allows to save the standard IDs from a hardcoded list instead of wasting time to scan them.
        Called once per range, before scanning it.
        To respect sort by increasing value, save standard Ids of letter X after scanning range X!
        */
        stub method saveStandardRange takes integer index returns nothing
        endmethod

        /*
        Method called once on scan start.
        Overide it if you need to execute custom code.
        */
        stub method onStart takes nothing returns nothing
        endmethod

        /*
        Method called once on scan end.
        Overide it if you need to execute custom code.
        */
        stub method onEnd takes nothing returns nothing
        endmethod

    endstruct

    /*
    Scan manager. Singleton.
    In charges of:
    - Instanciating & deleting al scanners
    - Executing all scanners on clock pace
    - Firing IdScannerEvent's
    */
    struct IdScannerManager

        private static boolexpr array scannerCreateFuncs // Functions to instanciate scanners
        private static integer lastScannerCreateFuncIndex = -1 // Size of the array above
        private static AbstractIdScanner array scanners // Scanners
        private static integer lastScannerIndex = -1 // Size of the array above

        private static timer clock // Clock used to fix pace
        private static integer pendingScannerCount = 0 // Count of scanners whose execution is not finished.

        /*
        Static method to register a new World Editor ID type scanner.
        */
        static method RegisterScannerType takes boolexpr createFunc returns nothing
            set lastScannerCreateFuncIndex = lastScannerCreateFuncIndex + 1
            set scannerCreateFuncs[lastScannerCreateFuncIndex] = createFunc
        endmethod

        /*
        Static method to register a newly instanciated ID scanner
        */
        static method RegisterScanner takes AbstractIdScanner scanner returns nothing
            set lastScannerIndex = lastScannerIndex + 1
            set scanners[lastScannerIndex] = scanner
        endmethod

        /*
        Static method that fires IdScannerEvent's
        */
        private static method FireScannerEvent takes real eventId returns nothing
            if ( 0.0 != eventId ) then
                // For JASS users
                set IdScannerEvent = 0.0
                set IdScannerEvent = eventId
                set IdScannerEvent = 0.0

                // For GUI users
                set udg_IdScannerEvent = 0.0
                set udg_IdScannerEvent = eventId
                set udg_IdScannerEvent = 0.0
            endif
        endmethod

        /*
        Static method that starts all the ID scanners
        */
        static method Start takes nothing returns nothing
            local integer index
            local trigger t = CreateTrigger()
            local boolean allScannersCreated = false
            call FireScannerEvent(1.0)
            set pendingScannerCount = 0
            if ( -1 != lastScannerCreateFuncIndex ) then
                // Create all scanners
                set index = -1
                loop
                    set index = index + 1
                    call TriggerAddCondition(t, scannerCreateFuncs[index])
                    exitwhen (lastScannerCreateFuncIndex == index)
                endloop
                set allScannersCreated = TriggerEvaluate(t)
                if (allScannersCreated) then
                    // Start all scanners
                    set index = -1
                    loop
                        set index = index + 1
                        call scanners[index].start()
                        set pendingScannerCount = lastScannerIndex + 1
                        exitwhen (lastScannerIndex == index)
                    endloop
                    // Start the tick timer
                    set clock = CreateTimer()
                    call TimerStart(clock, TICK_PERIOD, true, function IdScannerManager.Tick )
                else
                    call BJDebugMsg("IdScannerManager - Failed to create all scanners")
                    call OnScannerEnd(-1)
                endif
            else
                call BJDebugMsg("IdScannerManager - No scanners")
                call OnScannerEnd(-1)
            endif
            call DestroyTrigger(t)
            set t = null
        endmethod

        /*
        Static method that starts all the ID scanners
        */
        private static method Tick takes nothing returns nothing
            local integer index
            if ( 0 < pendingScannerCount ) then
                // Propagate tick to all registered scanners
                set index = -1
                loop
                    set index = index + 1
                    if ( not scanners[index].ended ) then
                        call scanners[index].tick()
                    endif
                    exitwhen (lastScannerIndex == index)
                endloop
            else
                call End()
            endif
        endmethod

        /*
        Static method that is called once each time a scanner ends,
        Updates the pending scanners count.
        */
        static method OnScannerEnd takes AbstractIdScanner scanner returns nothing
            if ( -1 != scanner ) then
                set pendingScannerCount = pendingScannerCount - 1
                // Note: when pending count reachs 0, Tick stops
            endif
        endmethod

        /*
        Static method called once on end of last scanner execution
        In charge of cleaning memory.
        */
        private static method End takes nothing returns nothing
            local integer index
            // Release timer
            call PauseTimer(clock)
            call DestroyTimer(clock)
            // Destroy all scanners
            set index = -1
            loop
               set index = index + 1
               call scanners[index].destroy()
               set scanners[index] = 0
               exitwhen (lastScannerIndex == index)
            endloop
            // Fire end event
            call FireScannerEvent(2.0)
        endmethod

        /*
        Singleton emulated in vJASS: all methods are static, constructor is private and has no effect.
        */
        private static method create takes nothing returns IdScannerManager
            return 0
        endmethod

    endstruct

    /*
    Simple macro to register a new scanner type in the scanner manager
    */
    //! textmacro DECL_NEW_SCANNER_TYPE takes STRUCT_NAME
        function Create$STRUCT_NAME$ takes nothing returns boolean
            local $STRUCT_NAME$ newScanner= $STRUCT_NAME$.create()
            call IdScannerManager.RegisterScanner(newScanner)
            return true
        endfunction

    private module $STRUCT_NAME$Init
        private static method onInit takes nothing returns nothing
            local boolexpr createFunc = Condition(function Create$STRUCT_NAME$)
            call IdScannerManager.RegisterScannerType(createFunc)
        endmethod
    endmodule
    private struct $STRUCT_NAME$Initializer extends array
        implement $STRUCT_NAME$Init
    endstruct
    //! endtextmacro

endlibrary

UnitIdScanner
JASS:
/*
UnitIdScanner lib v1.0.0 (21/10/2019) by Ricola3D

Content:
Id scanner for World Editor units.
*/
library UnitIdScanner requires IdScanner

    //! runtextmacro DECL_NEW_SCANNER_TYPE ("UnitIdScanner")

    /*
    */
    struct UnitIdScanner extends AbstractIdScanner

        method isValidId takes integer id returns boolean
            local boolean isValid = false
            local string testValue = UnitId2String(id)
            set isValid = ( null != testValue )
            return isValid
        endmethod

        method saveId takes integer index, integer id returns nothing
            call RegisterUnitId(id)
        endmethod

        /*
        836 hardcoded standard units, sorted by increasing value
        */
        method saveStandardRange takes integer index returns nothing
            if ( 1 == index ) then
                // After custom 'E' abilities
                call RegisterUnitId('Ecen')
                call RegisterUnitId('Edem')
                call RegisterUnitId('Edmm')
                call RegisterUnitId('Eevi')
                call RegisterUnitId('Eevm')
                call RegisterUnitId('Efur')
                call RegisterUnitId('Eidm')
                call RegisterUnitId('Eill')
                call RegisterUnitId('Eilm')
                call RegisterUnitId('Ekee')
                call RegisterUnitId('Ekgg')
                call RegisterUnitId('Emfr')
                call RegisterUnitId('Emns')
                call RegisterUnitId('Emoo')
                call RegisterUnitId('Etyr')
                call RegisterUnitId('Ewar')
                call RegisterUnitId('Ewrd')
            elseif ( 2 == index ) then
                // After custom 'H' abilities
                call RegisterUnitId('Hamg')
                call RegisterUnitId('Hant')
                call RegisterUnitId('Hapm')
                call RegisterUnitId('Harf')
                call RegisterUnitId('Hart')
                call RegisterUnitId('Hblm')
                call RegisterUnitId('Hdgo')
                call RegisterUnitId('Hgam')
                call RegisterUnitId('Hhkl')
                call RegisterUnitId('Hjai')
                call RegisterUnitId('Hkal')
                call RegisterUnitId('Hlgr')
                call RegisterUnitId('Hmbr')
                call RegisterUnitId('Hmgd')
                call RegisterUnitId('Hmkg')
                call RegisterUnitId('Hpal')
                call RegisterUnitId('Hpb1')
                call RegisterUnitId('Hpb2')
                call RegisterUnitId('Huth')
                call RegisterUnitId('Hvsh')
                call RegisterUnitId('Hvwd')
            elseif ( 3 == index ) then
                // After custom 'N' abilities
                call RegisterUnitId('Naka')
                call RegisterUnitId('Nal2')
                call RegisterUnitId('Nal3')
                call RegisterUnitId('Nalc')
                call RegisterUnitId('Nalm')
                call RegisterUnitId('Nbbc')
                call RegisterUnitId('Nbrn')
                call RegisterUnitId('Nbst')
                call RegisterUnitId('Nfir')
                call RegisterUnitId('Nkjx')
                call RegisterUnitId('Nklj')
                call RegisterUnitId('Nmag')
                call RegisterUnitId('Nman')
                call RegisterUnitId('Nngs')
                call RegisterUnitId('Npbm')
                call RegisterUnitId('Npld')
                call RegisterUnitId('Nplh')
                call RegisterUnitId('Nrob')
                call RegisterUnitId('Nsjs')
                call RegisterUnitId('Ntin')
            elseif ( 4 == index ) then
                // After custom 'O' abilities
                call RegisterUnitId('Obla')
                call RegisterUnitId('Ocb2')
                call RegisterUnitId('Ocbh')
                call RegisterUnitId('Odrt')
                call RegisterUnitId('Ofar')
                call RegisterUnitId('Ogld')
                call RegisterUnitId('Ogrh')
                call RegisterUnitId('Opgh')
                call RegisterUnitId('Orex')
                call RegisterUnitId('Orkn')
                call RegisterUnitId('Osam')
                call RegisterUnitId('Oshd')
                call RegisterUnitId('Otcc')
                call RegisterUnitId('Otch')
                call RegisterUnitId('Othr')
            elseif ( 5 == index ) then
                // After custom 'U' abilities
                call RegisterUnitId('Uanb')
                call RegisterUnitId('Ubal')
                call RegisterUnitId('Uclc')
                call RegisterUnitId('Ucrl')
                call RegisterUnitId('Udea')
                call RegisterUnitId('Udre')
                call RegisterUnitId('Udth')
                call RegisterUnitId('Uear')
                call RegisterUnitId('Uktl')
                call RegisterUnitId('Ulic')
                call RegisterUnitId('Umal')
                call RegisterUnitId('Usyl')
                call RegisterUnitId('Utic')
                call RegisterUnitId('Uvar')
                call RegisterUnitId('Uvng')
                call RegisterUnitId('Uwar')
            elseif ( 6 == index ) then
                // After custom 'e' abilities
                call RegisterUnitId('eaoe')
                call RegisterUnitId('eaom')
                call RegisterUnitId('eaow')
                call RegisterUnitId('earc')
                call RegisterUnitId('eate')
                call RegisterUnitId('ebal')
                call RegisterUnitId('ebsh')
                call RegisterUnitId('echm')
                call RegisterUnitId('edcm')
                call RegisterUnitId('eden')
                call RegisterUnitId('edes')
                call RegisterUnitId('edob')
                call RegisterUnitId('edoc')
                call RegisterUnitId('edos')
                call RegisterUnitId('edot')
                call RegisterUnitId('edry')
                call RegisterUnitId('edtm')
                call RegisterUnitId('efdr')
                call RegisterUnitId('efon')
                call RegisterUnitId('egol')
                call RegisterUnitId('ehip')
                call RegisterUnitId('ehpr')
                call RegisterUnitId('eilw')
                call RegisterUnitId('emow')
                call RegisterUnitId('emtg')
                call RegisterUnitId('enec')
                call RegisterUnitId('ensh')
                call RegisterUnitId('esen')
                call RegisterUnitId('eshd')
                call RegisterUnitId('eshy')
                call RegisterUnitId('espv')
                call RegisterUnitId('etoa')
                call RegisterUnitId('etoe')
                call RegisterUnitId('etol')
                call RegisterUnitId('etrp')
                call RegisterUnitId('etrs')
                call RegisterUnitId('even')
                call RegisterUnitId('ewsp')
            elseif ( 7 == index ) then
                // After custom 'h' abilities
                call RegisterUnitId('halt')
                call RegisterUnitId('harm')
                call RegisterUnitId('haro')
                call RegisterUnitId('hars')
                call RegisterUnitId('hatw')
                call RegisterUnitId('hbar')
                call RegisterUnitId('hbew')
                call RegisterUnitId('hbla')
                call RegisterUnitId('hbot')
                call RegisterUnitId('hbsh')
                call RegisterUnitId('hcas')
                call RegisterUnitId('hcth')
                call RegisterUnitId('hctw')
                call RegisterUnitId('hdes')
                call RegisterUnitId('hdhw')
                call RegisterUnitId('hfoo')
                call RegisterUnitId('hgra')
                call RegisterUnitId('hgry')
                call RegisterUnitId('hgtw')
                call RegisterUnitId('hgyr')
                call RegisterUnitId('hhdl')
                call RegisterUnitId('hhes')
                call RegisterUnitId('hhou')
                call RegisterUnitId('hkee')
                call RegisterUnitId('hkni')
                call RegisterUnitId('hlum')
                call RegisterUnitId('hmil')
                call RegisterUnitId('hmpr')
                call RegisterUnitId('hmtm')
                call RegisterUnitId('hmtt')
                call RegisterUnitId('hpea')
                call RegisterUnitId('hphx')
                call RegisterUnitId('hprt')
                call RegisterUnitId('hpxe')
                call RegisterUnitId('hrdh')
                call RegisterUnitId('hrif')
                call RegisterUnitId('hrtt')
                call RegisterUnitId('hshy')
                call RegisterUnitId('hsor')
                call RegisterUnitId('hspt')
                call RegisterUnitId('htow')
                call RegisterUnitId('hvlt')
                call RegisterUnitId('hwat')
                call RegisterUnitId('hwt2')
                call RegisterUnitId('hwt3')
                call RegisterUnitId('hwtw')
            elseif ( 8 == index ) then
                // After custom 'n' abilities
                call RegisterUnitId('nadk')
                call RegisterUnitId('nadr')
                call RegisterUnitId('nadw')
                call RegisterUnitId('nahy')
                call RegisterUnitId('nalb')
                call RegisterUnitId('nanb')
                call RegisterUnitId('nanc')
                call RegisterUnitId('nane')
                call RegisterUnitId('nanm')
                call RegisterUnitId('nano')
                call RegisterUnitId('nanw')
                call RegisterUnitId('narg')
                call RegisterUnitId('nass')
                call RegisterUnitId('nba2')
                call RegisterUnitId('nbal')
                call RegisterUnitId('nban')
                call RegisterUnitId('nbda')
                call RegisterUnitId('nbdk')
                call RegisterUnitId('nbdm')
                call RegisterUnitId('nbdo')
                call RegisterUnitId('nbdr')
                call RegisterUnitId('nbds')
                call RegisterUnitId('nbdw')
                call RegisterUnitId('nbee')
                call RegisterUnitId('nbel')
                call RegisterUnitId('nbfl')
                call RegisterUnitId('nbld')
                call RegisterUnitId('nbnb')
                call RegisterUnitId('nbot')
                call RegisterUnitId('nbrg')
                call RegisterUnitId('nbse')
                call RegisterUnitId('nbsm')
                call RegisterUnitId('nbsp')
                call RegisterUnitId('nbsw')
                call RegisterUnitId('nbt1')
                call RegisterUnitId('nbt2')
                call RegisterUnitId('nbwd')
                call RegisterUnitId('nbwm')
                call RegisterUnitId('nbzd')
                call RegisterUnitId('nbzk')
                call RegisterUnitId('nbzw')
                call RegisterUnitId('ncap')
                call RegisterUnitId('ncat')
                call RegisterUnitId('ncaw')
                call RegisterUnitId('ncb0')
                call RegisterUnitId('ncb1')
                call RegisterUnitId('ncb2')
                call RegisterUnitId('ncb3')
                call RegisterUnitId('ncb4')
                call RegisterUnitId('ncb5')
                call RegisterUnitId('ncb6')
                call RegisterUnitId('ncb7')
                call RegisterUnitId('ncb8')
                call RegisterUnitId('ncb9')
                call RegisterUnitId('ncba')
                call RegisterUnitId('ncbb')
                call RegisterUnitId('ncbc')
                call RegisterUnitId('ncbd')
                call RegisterUnitId('ncbe')
                call RegisterUnitId('ncbf')
                call RegisterUnitId('ncea')
                call RegisterUnitId('ncen')
                call RegisterUnitId('ncer')
                call RegisterUnitId('ncfs')
                call RegisterUnitId('ncg1')
                call RegisterUnitId('ncg2')
                call RegisterUnitId('ncg3')
                call RegisterUnitId('ncgb')
                call RegisterUnitId('nchg')
                call RegisterUnitId('nchp')
                call RegisterUnitId('nchr')
                call RegisterUnitId('nchw')
                call RegisterUnitId('ncim')
                call RegisterUnitId('nckb')
                call RegisterUnitId('ncks')
                call RegisterUnitId('ncmw')
                call RegisterUnitId('ncnk')
                call RegisterUnitId('ncnt')
                call RegisterUnitId('ncop')
                call RegisterUnitId('ncp2')
                call RegisterUnitId('ncp3')
                call RegisterUnitId('ncpn')
                call RegisterUnitId('ncrb')
                call RegisterUnitId('nct1')
                call RegisterUnitId('nct2')
                call RegisterUnitId('ncta')
                call RegisterUnitId('ncte')
                call RegisterUnitId('nctl')
                call RegisterUnitId('ndch')
                call RegisterUnitId('nder')
                call RegisterUnitId('ndfl')
                call RegisterUnitId('ndgt')
                call RegisterUnitId('ndh0')
                call RegisterUnitId('ndh1')
                call RegisterUnitId('ndh2')
                call RegisterUnitId('ndh3')
                call RegisterUnitId('ndh4')
                call RegisterUnitId('ndke')
                call RegisterUnitId('ndkw')
                call RegisterUnitId('ndmg')
                call RegisterUnitId('ndmu')
                call RegisterUnitId('ndog')
                call RegisterUnitId('ndqn')
                call RegisterUnitId('ndqp')
                call RegisterUnitId('ndqs')
                call RegisterUnitId('ndqt')
                call RegisterUnitId('ndqv')
                call RegisterUnitId('ndr1')
                call RegisterUnitId('ndr2')
                call RegisterUnitId('ndr3')
                call RegisterUnitId('ndrb')
                call RegisterUnitId('ndrd')
                call RegisterUnitId('ndrf')
                call RegisterUnitId('ndrg')
                call RegisterUnitId('ndrh')
                call RegisterUnitId('ndrj')
                call RegisterUnitId('ndrk')
                call RegisterUnitId('ndrl')
                call RegisterUnitId('ndrm')
                call RegisterUnitId('ndrn')
                call RegisterUnitId('ndro')
                call RegisterUnitId('ndrp')
                call RegisterUnitId('ndrr')
                call RegisterUnitId('ndrs')
                call RegisterUnitId('ndrt')
                call RegisterUnitId('ndru')
                call RegisterUnitId('ndrv')
                call RegisterUnitId('ndrw')
                call RegisterUnitId('ndrz')
                call RegisterUnitId('ndsa')
                call RegisterUnitId('ndt1')
                call RegisterUnitId('ndt2')
                call RegisterUnitId('ndtb')
                call RegisterUnitId('ndth')
                call RegisterUnitId('ndtp')
                call RegisterUnitId('ndtr')
                call RegisterUnitId('ndtt')
                call RegisterUnitId('ndtw')
                call RegisterUnitId('ndwm')
                call RegisterUnitId('nech')
                call RegisterUnitId('necr')
                call RegisterUnitId('nef0')
                call RegisterUnitId('nef1')
                call RegisterUnitId('nef2')
                call RegisterUnitId('nef3')
                call RegisterUnitId('nef4')
                call RegisterUnitId('nef5')
                call RegisterUnitId('nef6')
                call RegisterUnitId('nef7')
                call RegisterUnitId('nefm')
                call RegisterUnitId('negf')
                call RegisterUnitId('negm')
                call RegisterUnitId('negt')
                call RegisterUnitId('negz')
                call RegisterUnitId('nehy')
                call RegisterUnitId('nelb')
                call RegisterUnitId('nele')
                call RegisterUnitId('nemi')
                call RegisterUnitId('nenc')
                call RegisterUnitId('nenf')
                call RegisterUnitId('nenp')
                call RegisterUnitId('nepl')
                call RegisterUnitId('nerd')
                call RegisterUnitId('ners')
                call RegisterUnitId('nerw')
                call RegisterUnitId('net1')
                call RegisterUnitId('net2')
                call RegisterUnitId('nfa1')
                call RegisterUnitId('nfa2')
                call RegisterUnitId('nfac')
                call RegisterUnitId('nfbr')
                call RegisterUnitId('nfel')
                call RegisterUnitId('nfgb')
                call RegisterUnitId('nfgl')
                call RegisterUnitId('nfgo')
                call RegisterUnitId('nfgt')
                call RegisterUnitId('nfgu')
                call RegisterUnitId('nfh0')
                call RegisterUnitId('nfh1')
                call RegisterUnitId('nfnp')
                call RegisterUnitId('nfod')
                call RegisterUnitId('nfoh')
                call RegisterUnitId('nfor')
                call RegisterUnitId('nfot')
                call RegisterUnitId('nfov')
                call RegisterUnitId('nfpc')
                call RegisterUnitId('nfpe')
                call RegisterUnitId('nfpl')
                call RegisterUnitId('nfps')
                call RegisterUnitId('nfpt')
                call RegisterUnitId('nfpu')
                call RegisterUnitId('nfr1')
                call RegisterUnitId('nfr2')
                call RegisterUnitId('nfra')
                call RegisterUnitId('nfrb')
                call RegisterUnitId('nfre')
                call RegisterUnitId('nfrg')
                call RegisterUnitId('nfrl')
                call RegisterUnitId('nfrm')
                call RegisterUnitId('nfro')
                call RegisterUnitId('nfrp')
                call RegisterUnitId('nfrs')
                call RegisterUnitId('nfrt')
                call RegisterUnitId('nfsh')
                call RegisterUnitId('nfsp')
                call RegisterUnitId('nft1')
                call RegisterUnitId('nft2')
                call RegisterUnitId('nftb')
                call RegisterUnitId('nftk')
                call RegisterUnitId('nftr')
                call RegisterUnitId('nftt')
                call RegisterUnitId('nfv0')
                call RegisterUnitId('nfv1')
                call RegisterUnitId('nfv2')
                call RegisterUnitId('nfv3')
                call RegisterUnitId('nfv4')
                call RegisterUnitId('ngad')
                call RegisterUnitId('ngbl')
                call RegisterUnitId('ngdk')
                call RegisterUnitId('nggr')
                call RegisterUnitId('ngh1')
                call RegisterUnitId('ngh2')
                call RegisterUnitId('ngir')
                call RegisterUnitId('nglm')
                call RegisterUnitId('ngme')
                call RegisterUnitId('ngna')
                call RegisterUnitId('ngnb')
                call RegisterUnitId('ngnh')
                call RegisterUnitId('ngni')
                call RegisterUnitId('ngno')
                call RegisterUnitId('ngns')
                call RegisterUnitId('ngnv')
                call RegisterUnitId('ngnw')
                call RegisterUnitId('ngob')
                call RegisterUnitId('ngol')
                call RegisterUnitId('ngrd')
                call RegisterUnitId('ngrk')
                call RegisterUnitId('ngrw')
                call RegisterUnitId('ngsp')
                call RegisterUnitId('ngst')
                call RegisterUnitId('ngt2')
                call RegisterUnitId('ngwr')
                call RegisterUnitId('ngz1')
                call RegisterUnitId('ngz2')
                call RegisterUnitId('ngz3')
                call RegisterUnitId('ngz4')
                call RegisterUnitId('ngza')
                call RegisterUnitId('ngzc')
                call RegisterUnitId('ngzd')
                call RegisterUnitId('nhar')
                call RegisterUnitId('nhcn')
                call RegisterUnitId('nhdc')
                call RegisterUnitId('nhea')
                call RegisterUnitId('nheb')
                call RegisterUnitId('nhef')
                call RegisterUnitId('nhem')
                call RegisterUnitId('nhew')
                call RegisterUnitId('nhfp')
                call RegisterUnitId('nhhr')
                call RegisterUnitId('nhmc')
                call RegisterUnitId('nhns')
                call RegisterUnitId('nhrh')
                call RegisterUnitId('nhrq')
                call RegisterUnitId('nhrr')
                call RegisterUnitId('nhrw')
                call RegisterUnitId('nhyc')
                call RegisterUnitId('nhyd')
                call RegisterUnitId('nhyh')
                call RegisterUnitId('nhym')
                call RegisterUnitId('nico')
                call RegisterUnitId('nina')
                call RegisterUnitId('ninc')
                call RegisterUnitId('ninf')
                call RegisterUnitId('ninm')
                call RegisterUnitId('nitb')
                call RegisterUnitId('nith')
                call RegisterUnitId('nitp')
                call RegisterUnitId('nitr')
                call RegisterUnitId('nits')
                call RegisterUnitId('nitt')
                call RegisterUnitId('nitw')
                call RegisterUnitId('njg1')
                call RegisterUnitId('njga')
                call RegisterUnitId('njgb')
                call RegisterUnitId('njks')
                call RegisterUnitId('nkob')
                call RegisterUnitId('nkog')
                call RegisterUnitId('nkol')
                call RegisterUnitId('nkot')
                call RegisterUnitId('nlds')
                call RegisterUnitId('nlkl')
                call RegisterUnitId('nlpd')
                call RegisterUnitId('nlpr')
                call RegisterUnitId('nlps')
                call RegisterUnitId('nlrv')
                call RegisterUnitId('nlsn')
                call RegisterUnitId('nltc')
                call RegisterUnitId('nltl')
                call RegisterUnitId('nlur')
                call RegisterUnitId('nlv1')
                call RegisterUnitId('nlv2')
                call RegisterUnitId('nlv3')
                call RegisterUnitId('nmam')
                call RegisterUnitId('nmbg')
                call RegisterUnitId('nmcf')
                call RegisterUnitId('nmdm')
                call RegisterUnitId('nmdr')
                call RegisterUnitId('nmed')
                call RegisterUnitId('nmer')
                call RegisterUnitId('nmfs')
                call RegisterUnitId('nmg0')
                call RegisterUnitId('nmg1')
                call RegisterUnitId('nmgd')
                call RegisterUnitId('nmgr')
                call RegisterUnitId('nmgv')
                call RegisterUnitId('nmgw')
                call RegisterUnitId('nmh0')
                call RegisterUnitId('nmh1')
                call RegisterUnitId('nmit')
                call RegisterUnitId('nmmu')
                call RegisterUnitId('nmoo')
                call RegisterUnitId('nmpe')
                call RegisterUnitId('nmpg')
                call RegisterUnitId('nmr0')
                call RegisterUnitId('nmr2')
                call RegisterUnitId('nmr3')
                call RegisterUnitId('nmr4')
                call RegisterUnitId('nmr5')
                call RegisterUnitId('nmr6')
                call RegisterUnitId('nmr7')
                call RegisterUnitId('nmr8')
                call RegisterUnitId('nmr9')
                call RegisterUnitId('nmra')
                call RegisterUnitId('nmrb')
                call RegisterUnitId('nmrc')
                call RegisterUnitId('nmrd')
                call RegisterUnitId('nmre')
                call RegisterUnitId('nmrf')
                call RegisterUnitId('nmrk')
                call RegisterUnitId('nmrl')
                call RegisterUnitId('nmrm')
                call RegisterUnitId('nmrr')
                call RegisterUnitId('nmrv')
                call RegisterUnitId('nmsc')
                call RegisterUnitId('nmsh')
                call RegisterUnitId('nmsn')
                call RegisterUnitId('nmtw')
                call RegisterUnitId('nmyr')
                call RegisterUnitId('nmys')
                call RegisterUnitId('nnad')
                call RegisterUnitId('nndk')
                call RegisterUnitId('nndr')
                call RegisterUnitId('nnfm')
                call RegisterUnitId('nnht')
                call RegisterUnitId('nnmg')
                call RegisterUnitId('nnrg')
                call RegisterUnitId('nnrs')
                call RegisterUnitId('nnsa')
                call RegisterUnitId('nnsg')
                call RegisterUnitId('nnsu')
                call RegisterUnitId('nnsw')
                call RegisterUnitId('nntg')
                call RegisterUnitId('nntt')
                call RegisterUnitId('nnwa')
                call RegisterUnitId('nnwl')
                call RegisterUnitId('nnwq')
                call RegisterUnitId('nnwr')
                call RegisterUnitId('nnws')
                call RegisterUnitId('nnzg')
                call RegisterUnitId('noga')
                call RegisterUnitId('nogl')
                call RegisterUnitId('nogm')
                call RegisterUnitId('nogn')
                call RegisterUnitId('nogo')
                call RegisterUnitId('nogr')
                call RegisterUnitId('nomg')
                call RegisterUnitId('now2')
                call RegisterUnitId('now3')
                call RegisterUnitId('nowb')
                call RegisterUnitId('nowe')
                call RegisterUnitId('nowk')
                call RegisterUnitId('nowl')
                call RegisterUnitId('npfl')
                call RegisterUnitId('npfm')
                call RegisterUnitId('npgf')
                call RegisterUnitId('npgr')
                call RegisterUnitId('npig')
                call RegisterUnitId('nplb')
                call RegisterUnitId('nplg')
                call RegisterUnitId('npn1')
                call RegisterUnitId('npn2')
                call RegisterUnitId('npn3')
                call RegisterUnitId('npn4')
                call RegisterUnitId('npn5')
                call RegisterUnitId('npn6')
                call RegisterUnitId('npng')
                call RegisterUnitId('npnw')
                call RegisterUnitId('nqb1')
                call RegisterUnitId('nqb2')
                call RegisterUnitId('nqb3')
                call RegisterUnitId('nqb4')
                call RegisterUnitId('nqbh')
                call RegisterUnitId('nrac')
                call RegisterUnitId('nrat')
                call RegisterUnitId('nrdk')
                call RegisterUnitId('nrdr')
                call RegisterUnitId('nrel')
                call RegisterUnitId('nrog')
                call RegisterUnitId('nrvd')
                call RegisterUnitId('nrvf')
                call RegisterUnitId('nrvi')
                call RegisterUnitId('nrvl')
                call RegisterUnitId('nrvs')
                call RegisterUnitId('nrwm')
                call RegisterUnitId('nrzb')
                call RegisterUnitId('nrzg')
                call RegisterUnitId('nrzm')
                call RegisterUnitId('nrzs')
                call RegisterUnitId('nrzt')
                call RegisterUnitId('nsat')
                call RegisterUnitId('nsbm')
                call RegisterUnitId('nsbs')
                call RegisterUnitId('nsc2')
                call RegisterUnitId('nsc3')
                call RegisterUnitId('nsca')
                call RegisterUnitId('nscb')
                call RegisterUnitId('nsce')
                call RegisterUnitId('nsea')
                call RegisterUnitId('nsel')
                call RegisterUnitId('nser')
                call RegisterUnitId('nsgb')
                call RegisterUnitId('nsgg')
                call RegisterUnitId('nsgh')
                call RegisterUnitId('nsgn')
                call RegisterUnitId('nsgt')
                call RegisterUnitId('nsha')
                call RegisterUnitId('nshe')
                call RegisterUnitId('nshf')
                call RegisterUnitId('nshp')
                call RegisterUnitId('nshr')
                call RegisterUnitId('nshw')
                call RegisterUnitId('nska')
                call RegisterUnitId('nske')
                call RegisterUnitId('nskf')
                call RegisterUnitId('nskg')
                call RegisterUnitId('nskk')
                call RegisterUnitId('nskm')
                call RegisterUnitId('nsko')
                call RegisterUnitId('nslf')
                call RegisterUnitId('nslh')
                call RegisterUnitId('nsll')
                call RegisterUnitId('nslm')
                call RegisterUnitId('nsln')
                call RegisterUnitId('nslr')
                call RegisterUnitId('nslv')
                call RegisterUnitId('nsno')
                call RegisterUnitId('nsnp')
                call RegisterUnitId('nsns')
                call RegisterUnitId('nsoc')
                call RegisterUnitId('nsog')
                call RegisterUnitId('nspb')
                call RegisterUnitId('nspc')
                call RegisterUnitId('nspd')
                call RegisterUnitId('nspg')
                call RegisterUnitId('nspp')
                call RegisterUnitId('nspr')
                call RegisterUnitId('nsqa')
                call RegisterUnitId('nsqe')
                call RegisterUnitId('nsqo')
                call RegisterUnitId('nsqt')
                call RegisterUnitId('nsra')
                call RegisterUnitId('nsrh')
                call RegisterUnitId('nsrn')
                call RegisterUnitId('nsrv')
                call RegisterUnitId('nsrw')
                call RegisterUnitId('nssn')
                call RegisterUnitId('nssp')
                call RegisterUnitId('nsth')
                call RegisterUnitId('nstl')
                call RegisterUnitId('nsts')
                call RegisterUnitId('nstw')
                call RegisterUnitId('nsty')
                call RegisterUnitId('nsw1')
                call RegisterUnitId('nsw2')
                call RegisterUnitId('nsw3')
                call RegisterUnitId('ntav')
                call RegisterUnitId('nten')
                call RegisterUnitId('nth0')
                call RegisterUnitId('nth1')
                call RegisterUnitId('nthl')
                call RegisterUnitId('nthr')
                call RegisterUnitId('ntka')
                call RegisterUnitId('ntkc')
                call RegisterUnitId('ntkf')
                call RegisterUnitId('ntkh')
                call RegisterUnitId('ntks')
                call RegisterUnitId('ntkt')
                call RegisterUnitId('ntkw')
                call RegisterUnitId('ntn2')
                call RegisterUnitId('ntnt')
                call RegisterUnitId('ntor')
                call RegisterUnitId('ntrd')
                call RegisterUnitId('ntrg')
                call RegisterUnitId('ntrh')
                call RegisterUnitId('ntrs')
                call RegisterUnitId('ntrt')
                call RegisterUnitId('ntrv')
                call RegisterUnitId('ntt1')
                call RegisterUnitId('ntt2')
                call RegisterUnitId('ntws')
                call RegisterUnitId('ntx2')
                call RegisterUnitId('nubk')
                call RegisterUnitId('nubr')
                call RegisterUnitId('nubw')
                call RegisterUnitId('nvde')
                call RegisterUnitId('nvdg')
                call RegisterUnitId('nvdl')
                call RegisterUnitId('nvdw')
                call RegisterUnitId('nvil')
                call RegisterUnitId('nvk2')
                call RegisterUnitId('nvl2')
                call RegisterUnitId('nvlk')
                call RegisterUnitId('nvlw')
                call RegisterUnitId('nvr0')
                call RegisterUnitId('nvr1')
                call RegisterUnitId('nvr2')
                call RegisterUnitId('nvul')
                call RegisterUnitId('nw2w')
                call RegisterUnitId('nwad')
                call RegisterUnitId('nwat')
                call RegisterUnitId('nwc1')
                call RegisterUnitId('nwc2')
                call RegisterUnitId('nwe1')
                call RegisterUnitId('nwe2')
                call RegisterUnitId('nwe3')
                call RegisterUnitId('nwen')
                call RegisterUnitId('nwgs')
                call RegisterUnitId('nwgt')
                call RegisterUnitId('nwiz')
                call RegisterUnitId('nwld')
                call RegisterUnitId('nwlg')
                call RegisterUnitId('nwlt')
                call RegisterUnitId('nwna')
                call RegisterUnitId('nwnr')
                call RegisterUnitId('nwns')
                call RegisterUnitId('nwrg')
                call RegisterUnitId('nws1')
                call RegisterUnitId('nwwd')
                call RegisterUnitId('nwwf')
                call RegisterUnitId('nwwg')
                call RegisterUnitId('nwzd')
                call RegisterUnitId('nwzg')
                call RegisterUnitId('nwzr')
                call RegisterUnitId('nzep')
                call RegisterUnitId('nzin')
                call RegisterUnitId('nzlc')
                call RegisterUnitId('nzom')
            elseif ( 9 == index ) then
                // After custom 'o' abilities
                call RegisterUnitId('oalt')
                call RegisterUnitId('obar')
                call RegisterUnitId('obea')
                call RegisterUnitId('obot')
                call RegisterUnitId('ocat')
                call RegisterUnitId('ocbw')
                call RegisterUnitId('odes')
                call RegisterUnitId('odkt')
                call RegisterUnitId('odoc')
                call RegisterUnitId('oeye')
                call RegisterUnitId('ofor')
                call RegisterUnitId('ofrt')
                call RegisterUnitId('ogre')
                call RegisterUnitId('ogrk')
                call RegisterUnitId('ogru')
                call RegisterUnitId('ohun')
                call RegisterUnitId('ohwd')
                call RegisterUnitId('ojgn')
                call RegisterUnitId('okod')
                call RegisterUnitId('omtg')
                call RegisterUnitId('onzg')
                call RegisterUnitId('oosc')
                call RegisterUnitId('opeo')
                call RegisterUnitId('orai')
                call RegisterUnitId('oshm')
                call RegisterUnitId('oshy')
                call RegisterUnitId('osld')
                call RegisterUnitId('osp1')
                call RegisterUnitId('osp2')
                call RegisterUnitId('osp3')
                call RegisterUnitId('osp4')
                call RegisterUnitId('ospm')
                call RegisterUnitId('ospw')
                call RegisterUnitId('ostr')
                call RegisterUnitId('osw1')
                call RegisterUnitId('osw2')
                call RegisterUnitId('osw3')
                call RegisterUnitId('oswy')
                call RegisterUnitId('otau')
                call RegisterUnitId('otbk')
                call RegisterUnitId('otbr')
                call RegisterUnitId('otot')
                call RegisterUnitId('otrb')
                call RegisterUnitId('otto')
                call RegisterUnitId('ovlj')
                call RegisterUnitId('ovln')
                call RegisterUnitId('owar')
                call RegisterUnitId('ownr')
                call RegisterUnitId('owtw')
                call RegisterUnitId('owyv')
            elseif ( 10 == index ) then
                // After custom 'u' abilities
                call RegisterUnitId('uabc')
                call RegisterUnitId('uabo')
                call RegisterUnitId('uaco')
                call RegisterUnitId('uaod')
                call RegisterUnitId('uarb')
                call RegisterUnitId('uban')
                call RegisterUnitId('ubdd')
                call RegisterUnitId('ubdr')
                call RegisterUnitId('ubon')
                call RegisterUnitId('ubot')
                call RegisterUnitId('ubsp')
                call RegisterUnitId('ucrm')
                call RegisterUnitId('ucry')
                call RegisterUnitId('ucs1')
                call RegisterUnitId('ucs2')
                call RegisterUnitId('ucs3')
                call RegisterUnitId('ucsB')
                call RegisterUnitId('ucsC')
                call RegisterUnitId('udes')
                call RegisterUnitId('ufro')
                call RegisterUnitId('ugar')
                call RegisterUnitId('ugho')
                call RegisterUnitId('ugol')
                call RegisterUnitId('ugrm')
                call RegisterUnitId('ugrv')
                call RegisterUnitId('uktg')
                call RegisterUnitId('uktn')
                call RegisterUnitId('uloc')
                call RegisterUnitId('umtw')
                call RegisterUnitId('unec')
                call RegisterUnitId('unp1')
                call RegisterUnitId('unp2')
                call RegisterUnitId('unpl')
                call RegisterUnitId('uobs')
                call RegisterUnitId('uplg')
                call RegisterUnitId('usap')
                call RegisterUnitId('usep')
                call RegisterUnitId('ushd')
                call RegisterUnitId('ushp')
                call RegisterUnitId('uske')
                call RegisterUnitId('uskm')
                call RegisterUnitId('uslh')
                call RegisterUnitId('uswb')
                call RegisterUnitId('utod')
                call RegisterUnitId('utom')
                call RegisterUnitId('uubs')
                call RegisterUnitId('uzg1')
                call RegisterUnitId('uzg2')
                call RegisterUnitId('uzig')
            elseif ( 11 == index ) then
                // After custom 'z' abilities
                call RegisterUnitId('zcso')
                call RegisterUnitId('zhyd')
                call RegisterUnitId('zjug')
                call RegisterUnitId('zmar')
                call RegisterUnitId('zshv')
                call RegisterUnitId('zsmc')
                call RegisterUnitId('zzrg')
            endif
        endmethod

        method onStart takes nothing returns nothing
            set scanRangePrefixes = "EHNOUehnouz"
        endmethod

        method onEnd takes nothing returns nothing
            local staticIdList units = GetAllUnitIds()
            call BJDebugMsg( "UnitIdScanner - Total ids: " + I2S( units.size() ) + " (" + I2S(succeedCounter) + " customs)" )
        endmethod

    endstruct

endlibrary

ItemIdScanner
JASS:
/*
ItemIdScanner lib v1.0.0 (21/10/2019) by Ricola3D

Content:
Id scanner for World Editor items.
*/
library ItemIdScanner requires IdScanner

    //! runtextmacro DECL_NEW_SCANNER_TYPE ("ItemIdScanner")

    /*
    */
    struct ItemIdScanner extends AbstractIdScanner

        method isValidId takes integer id returns boolean
            local boolean isValid = false
            local item testItem = CreateItem(id, 0, 0)
            if ( null != testItem ) then
                call RemoveItem(testItem)
                set isValid = true
            endif
            return isValid
        endmethod

        method saveId takes integer index, integer id returns nothing
            call RegisterItemId(id)
        endmethod

        /*
        276 hardcoded standard items, sorted by increasing value
        */
        method saveStandardRange takes integer index returns nothing
            if ( 1 == index ) then
                // After custom 'I' abilities
                call RegisterItemId('afac')
                call RegisterItemId('ajen')
                call RegisterItemId('amrc')
                call RegisterItemId('anfg')
                call RegisterItemId('ankh')
                call RegisterItemId('arsc')
                call RegisterItemId('arsh')
                call RegisterItemId('asbl')
                call RegisterItemId('axas')
                call RegisterItemId('azhr')
                call RegisterItemId('belv')
                call RegisterItemId('bfhr')
                call RegisterItemId('bgst')
                call RegisterItemId('blba')
                call RegisterItemId('brac')
                call RegisterItemId('brag')
                call RegisterItemId('bspd')
                call RegisterItemId('btst')
                call RegisterItemId('bzbe')
                call RegisterItemId('bzbf')
                call RegisterItemId('ccmd')
                call RegisterItemId('ches')
                call RegisterItemId('ciri')
                call RegisterItemId('ckng')
                call RegisterItemId('clfm')
                call RegisterItemId('clsd')
                call RegisterItemId('cnhn')
                call RegisterItemId('cnob')
                call RegisterItemId('cosl')
                call RegisterItemId('crdt')
                call RegisterItemId('crys')
                call RegisterItemId('desc')
                call RegisterItemId('dkfw')
                call RegisterItemId('dphe')
                call RegisterItemId('drph')
                call RegisterItemId('dsum')
                call RegisterItemId('dthb')
                call RegisterItemId('dtsb')
                call RegisterItemId('dust')
                call RegisterItemId('engs')
                call RegisterItemId('envl')
                call RegisterItemId('esaz')
                call RegisterItemId('evtl')
                call RegisterItemId('fgdg')
                call RegisterItemId('fgfh')
                call RegisterItemId('fgrd')
                call RegisterItemId('fgrg')
                call RegisterItemId('fgsk')
                call RegisterItemId('fgun')
                call RegisterItemId('flag')
                call RegisterItemId('frgd')
                call RegisterItemId('frhg')
                call RegisterItemId('fwss')
                call RegisterItemId('gcel')
                call RegisterItemId('gemt')
                call RegisterItemId('gfor')
                call RegisterItemId('gldo')
                call RegisterItemId('glsk')
                call RegisterItemId('gmfr')
                call RegisterItemId('gobm')
                call RegisterItemId('gold')
                call RegisterItemId('gomn')
                call RegisterItemId('gopr')
                call RegisterItemId('grsl')
                call RegisterItemId('gsou')
                call RegisterItemId('guvi')
                call RegisterItemId('gvsm')
                call RegisterItemId('hbth')
                call RegisterItemId('hcun')
                call RegisterItemId('hlst')
                call RegisterItemId('horl')
                call RegisterItemId('hslv')
                call RegisterItemId('hval')
                call RegisterItemId('infs')
                call RegisterItemId('iwbr')
                call RegisterItemId('jdrn')
                call RegisterItemId('jpnt')
                call RegisterItemId('k3m1')
                call RegisterItemId('k3m2')
                call RegisterItemId('k3m3')
                call RegisterItemId('kgal')
                call RegisterItemId('klmm')
                call RegisterItemId('kpin')
                call RegisterItemId('ktrm')
                call RegisterItemId('kybl')
                call RegisterItemId('kygh')
                call RegisterItemId('kymn')
                call RegisterItemId('kysn')
                call RegisterItemId('ledg')
                call RegisterItemId('lgdh')
                call RegisterItemId('lhst')
                call RegisterItemId('lmbr')
                call RegisterItemId('lnrn')
                call RegisterItemId('lure')
                call RegisterItemId('manh')
                call RegisterItemId('mcou')
                call RegisterItemId('mcri')
                call RegisterItemId('mgtk')
                call RegisterItemId('mlst')
                call RegisterItemId('mnsf')
                call RegisterItemId('mnst')
                call RegisterItemId('modt')
                call RegisterItemId('moon')
                call RegisterItemId('mort')
                call RegisterItemId('nflg')
                call RegisterItemId('nspi')
                call RegisterItemId('ocor')
                call RegisterItemId('odef')
                call RegisterItemId('ofir')
                call RegisterItemId('oflg')
                call RegisterItemId('ofr2')
                call RegisterItemId('ofro')
                call RegisterItemId('oli2')
                call RegisterItemId('olig')
                call RegisterItemId('oslo')
                call RegisterItemId('oven')
                call RegisterItemId('pams')
                call RegisterItemId('pclr')
                call RegisterItemId('pdiv')
                call RegisterItemId('penr')
                call RegisterItemId('pghe')
                call RegisterItemId('pgin')
                call RegisterItemId('pgma')
                call RegisterItemId('phea')
                call RegisterItemId('phlt')
                call RegisterItemId('pinv')
                call RegisterItemId('plcl')
                call RegisterItemId('pman')
                call RegisterItemId('pmna')
                call RegisterItemId('pnvl')
                call RegisterItemId('pnvu')
                call RegisterItemId('pomn')
                call RegisterItemId('pres')
                call RegisterItemId('prvt')
                call RegisterItemId('pspd')
                call RegisterItemId('rag1')
                call RegisterItemId('ram1')
                call RegisterItemId('ram2')
                call RegisterItemId('ram3')
                call RegisterItemId('ram4')
                call RegisterItemId('rat3')
                call RegisterItemId('rat6')
                call RegisterItemId('rat9')
                call RegisterItemId('ratc')
                call RegisterItemId('ratf')
                call RegisterItemId('rde0')
                call RegisterItemId('rde1')
                call RegisterItemId('rde2')
                call RegisterItemId('rde3')
                call RegisterItemId('rde4')
                call RegisterItemId('rdis')
                call RegisterItemId('rej1')
                call RegisterItemId('rej2')
                call RegisterItemId('rej3')
                call RegisterItemId('rej4')
                call RegisterItemId('rej5')
                call RegisterItemId('rej6')
                call RegisterItemId('rhe1')
                call RegisterItemId('rhe2')
                call RegisterItemId('rhe3')
                call RegisterItemId('rhth')
                call RegisterItemId('rin1')
                call RegisterItemId('ritd')
                call RegisterItemId('rlif')
                call RegisterItemId('rma2')
                call RegisterItemId('rman')
                call RegisterItemId('rnec')
                call RegisterItemId('rnsp')
                call RegisterItemId('rots')
                call RegisterItemId('rre1')
                call RegisterItemId('rre2')
                call RegisterItemId('rreb')
                call RegisterItemId('rres')
                call RegisterItemId('rspd')
                call RegisterItemId('rspl')
                call RegisterItemId('rsps')
                call RegisterItemId('rst1')
                call RegisterItemId('rugt')
                call RegisterItemId('rump')
                call RegisterItemId('rwat')
                call RegisterItemId('rwiz')
                call RegisterItemId('sand')
                call RegisterItemId('sbch')
                call RegisterItemId('sbok')
                call RegisterItemId('schl')
                call RegisterItemId('sclp')
                call RegisterItemId('scul')
                call RegisterItemId('sehr')
                call RegisterItemId('sfog')
                call RegisterItemId('shar')
                call RegisterItemId('shas')
                call RegisterItemId('shcw')
                call RegisterItemId('shdt')
                call RegisterItemId('shea')
                call RegisterItemId('shen')
                call RegisterItemId('shhn')
                call RegisterItemId('shrs')
                call RegisterItemId('shtm')
                call RegisterItemId('shwd')
                call RegisterItemId('silk')
                call RegisterItemId('skrt')
                call RegisterItemId('sksh')
                call RegisterItemId('skul')
                call RegisterItemId('sman')
                call RegisterItemId('sneg')
                call RegisterItemId('sor1')
                call RegisterItemId('sor2')
                call RegisterItemId('sor3')
                call RegisterItemId('sor4')
                call RegisterItemId('sor5')
                call RegisterItemId('sor6')
                call RegisterItemId('sor7')
                call RegisterItemId('sor8')
                call RegisterItemId('sor9')
                call RegisterItemId('sora')
                call RegisterItemId('sorf')
                call RegisterItemId('soul')
                call RegisterItemId('spre')
                call RegisterItemId('sprn')
                call RegisterItemId('spro')
                call RegisterItemId('spsh')
                call RegisterItemId('srbd')
                call RegisterItemId('sreg')
                call RegisterItemId('sres')
                call RegisterItemId('sror')
                call RegisterItemId('srrc')
                call RegisterItemId('srtl')
                call RegisterItemId('ssan')
                call RegisterItemId('ssil')
                call RegisterItemId('stel')
                call RegisterItemId('stpg')
                call RegisterItemId('stre')
                call RegisterItemId('stwa')
                call RegisterItemId('stwp')
                call RegisterItemId('tbak')
                call RegisterItemId('tbar')
                call RegisterItemId('tbsm')
                call RegisterItemId('tcas')
                call RegisterItemId('tdex')
                call RegisterItemId('tdx2')
                call RegisterItemId('tels')
                call RegisterItemId('texp')
                call RegisterItemId('tfar')
                call RegisterItemId('tgrh')
                call RegisterItemId('tgxp')
                call RegisterItemId('thdm')
                call RegisterItemId('thle')
                call RegisterItemId('tin2')
                call RegisterItemId('tint')
                call RegisterItemId('tkno')
                call RegisterItemId('tlum')
                call RegisterItemId('tmmt')
                call RegisterItemId('tmsc')
                call RegisterItemId('totw')
                call RegisterItemId('tpow')
                call RegisterItemId('tret')
                call RegisterItemId('tsct')
                call RegisterItemId('tst2')
                call RegisterItemId('tstr')
                call RegisterItemId('uflg')
                call RegisterItemId('vamp')
                call RegisterItemId('vddl')
                call RegisterItemId('war2')
                call RegisterItemId('ward')
                call RegisterItemId('wcyc')
                call RegisterItemId('whwd')
                call RegisterItemId('wild')
                call RegisterItemId('will')
                call RegisterItemId('wlsd')
                call RegisterItemId('wneg')
                call RegisterItemId('wneu')
                call RegisterItemId('wolg')
                call RegisterItemId('woms')
                call RegisterItemId('wshs')
                call RegisterItemId('wswd')
                call RegisterItemId('wtlg')
            endif
        endmethod

        method onStart takes nothing returns nothing
            set scanRangePrefixes = "I"
        endmethod

        method onEnd takes nothing returns nothing
            local staticIdList items = GetAllItemIds()
            call BJDebugMsg( "ItemIdScanner - Total ids: " + I2S( items.size() ) + " (" + I2S(succeedCounter) + " customs)" )
        endmethod

    endstruct

endlibrary

DestructibleIdScanner
JASS:
/*
DestructibleIdScanner lib v1.0.0 (21/10/2019) by Ricola3D

Content:
Id scanner for World Editor destructibles.
*/
library DestructibleIdScanner requires IdScanner

    //! runtextmacro DECL_NEW_SCANNER_TYPE ("DestructibleIdScanner")

    /*
    */
    struct DestructibleIdScanner extends AbstractIdScanner

        method isValidId takes integer id returns boolean
            local boolean isValid = false
            local destructable testDestructible = CreateDeadDestructable(id, 0, 0, 0, 1, 0)
            if ( null != testDestructible ) then
                call RemoveDestructable(testDestructible)
                set isValid = true
            endif
            return isValid
        endmethod

        method saveId takes integer index, integer id returns nothing
            call RegisterDestructibleId(id)
        endmethod

        /*
        247 hardcoded standard destructibles, sorted by increasing value
        */
        method saveStandardRange takes integer index returns nothing
            if ( 0 == index ) then
                // Before custom 'B' abilities
                call RegisterDestructibleId('ATg1')
                call RegisterDestructibleId('ATg2')
                call RegisterDestructibleId('ATg3')
                call RegisterDestructibleId('ATg4')
                call RegisterDestructibleId('ATt0')
                call RegisterDestructibleId('ATt1')
                call RegisterDestructibleId('ATtc')
                call RegisterDestructibleId('ATtr')
                call RegisterDestructibleId('ATwf')
            elseif ( 1 == index ) then
                // After custom 'B' abilities
                call RegisterDestructibleId('BTrs')
                call RegisterDestructibleId('BTrx')
                call RegisterDestructibleId('BTsc')
                call RegisterDestructibleId('BTtc')
                call RegisterDestructibleId('BTtw')
                call RegisterDestructibleId('CTtc')
                call RegisterDestructibleId('CTtr')
                call RegisterDestructibleId('DTc1')
                call RegisterDestructibleId('DTc2')
                call RegisterDestructibleId('DTep')
                call RegisterDestructibleId('DTes')
                call RegisterDestructibleId('DTfp')
                call RegisterDestructibleId('DTfx')
                call RegisterDestructibleId('DTg1')
                call RegisterDestructibleId('DTg2')
                call RegisterDestructibleId('DTg3')
                call RegisterDestructibleId('DTg4')
                call RegisterDestructibleId('DTg5')
                call RegisterDestructibleId('DTg6')
                call RegisterDestructibleId('DTg7')
                call RegisterDestructibleId('DTg8')
                call RegisterDestructibleId('DTlv')
                call RegisterDestructibleId('DTrc')
                call RegisterDestructibleId('DTrf')
                call RegisterDestructibleId('DTrx')
                call RegisterDestructibleId('DTs1')
                call RegisterDestructibleId('DTs2')
                call RegisterDestructibleId('DTs3')
                call RegisterDestructibleId('DTsb')
                call RegisterDestructibleId('DTsh')
                call RegisterDestructibleId('DTsp')
                call RegisterDestructibleId('Dofv')
                call RegisterDestructibleId('Dofw')
                call RegisterDestructibleId('FTtw')
                call RegisterDestructibleId('GTsh')
                call RegisterDestructibleId('IOt0')
                call RegisterDestructibleId('IOt1')
                call RegisterDestructibleId('IOt2')
                call RegisterDestructibleId('ITag')
                call RegisterDestructibleId('ITcr')
                call RegisterDestructibleId('ITf1')
                call RegisterDestructibleId('ITf2')
                call RegisterDestructibleId('ITf3')
                call RegisterDestructibleId('ITf4')
                call RegisterDestructibleId('ITg1')
                call RegisterDestructibleId('ITg2')
                call RegisterDestructibleId('ITg3')
                call RegisterDestructibleId('ITg4')
                call RegisterDestructibleId('ITi2')
                call RegisterDestructibleId('ITi3')
                call RegisterDestructibleId('ITi4')
                call RegisterDestructibleId('ITib')
                call RegisterDestructibleId('ITig')
                call RegisterDestructibleId('ITtc')
                call RegisterDestructibleId('ITtg')
                call RegisterDestructibleId('ITtw')
                call RegisterDestructibleId('ITw0')
                call RegisterDestructibleId('ITw1')
                call RegisterDestructibleId('ITw2')
                call RegisterDestructibleId('ITw3')
                call RegisterDestructibleId('ITx1')
                call RegisterDestructibleId('ITx2')
                call RegisterDestructibleId('ITx3')
                call RegisterDestructibleId('ITx4')
                call RegisterDestructibleId('JTct')
                call RegisterDestructibleId('JTtw')
                call RegisterDestructibleId('KTtw')
                call RegisterDestructibleId('LOcg')
                call RegisterDestructibleId('LT00')
                call RegisterDestructibleId('LT01')
                call RegisterDestructibleId('LT02')
                call RegisterDestructibleId('LT03')
                call RegisterDestructibleId('LT04')
                call RegisterDestructibleId('LT05')
                call RegisterDestructibleId('LT06')
                call RegisterDestructibleId('LT07')
                call RegisterDestructibleId('LT08')
                call RegisterDestructibleId('LT09')
                call RegisterDestructibleId('LT10')
                call RegisterDestructibleId('LT11')
                call RegisterDestructibleId('LTba')
                call RegisterDestructibleId('LTbr')
                call RegisterDestructibleId('LTbs')
                call RegisterDestructibleId('LTbx')
                call RegisterDestructibleId('LTcr')
                call RegisterDestructibleId('LTe1')
                call RegisterDestructibleId('LTe2')
                call RegisterDestructibleId('LTe3')
                call RegisterDestructibleId('LTe4')
                call RegisterDestructibleId('LTex')
                call RegisterDestructibleId('LTg1')
                call RegisterDestructibleId('LTg2')
                call RegisterDestructibleId('LTg3')
                call RegisterDestructibleId('LTg4')
                call RegisterDestructibleId('LTlt')
                call RegisterDestructibleId('LTr1')
                call RegisterDestructibleId('LTr2')
                call RegisterDestructibleId('LTr3')
                call RegisterDestructibleId('LTr4')
                call RegisterDestructibleId('LTr5')
                call RegisterDestructibleId('LTr6')
                call RegisterDestructibleId('LTr7')
                call RegisterDestructibleId('LTr8')
                call RegisterDestructibleId('LTrc')
                call RegisterDestructibleId('LTs1')
                call RegisterDestructibleId('LTs2')
                call RegisterDestructibleId('LTs3')
                call RegisterDestructibleId('LTs4')
                call RegisterDestructibleId('LTs5')
                call RegisterDestructibleId('LTs6')
                call RegisterDestructibleId('LTs7')
                call RegisterDestructibleId('LTs8')
                call RegisterDestructibleId('LTt0')
                call RegisterDestructibleId('LTt1')
                call RegisterDestructibleId('LTt2')
                call RegisterDestructibleId('LTt3')
                call RegisterDestructibleId('LTt4')
                call RegisterDestructibleId('LTt5')
                call RegisterDestructibleId('LTtc')
                call RegisterDestructibleId('LTtx')
                call RegisterDestructibleId('LTw0')
                call RegisterDestructibleId('LTw1')
                call RegisterDestructibleId('LTw2')
                call RegisterDestructibleId('LTw3')
                call RegisterDestructibleId('NTbd')
                call RegisterDestructibleId('NTtc')
                call RegisterDestructibleId('NTtw')
                call RegisterDestructibleId('OTds')
                call RegisterDestructibleId('OTip')
                call RegisterDestructibleId('OTis')
                call RegisterDestructibleId('OTsp')
                call RegisterDestructibleId('OTtw')
                call RegisterDestructibleId('VTlt')
                call RegisterDestructibleId('Volc')
                call RegisterDestructibleId('WTst')
                call RegisterDestructibleId('WTtw')
                call RegisterDestructibleId('XOk1')
                call RegisterDestructibleId('XOk2')
                call RegisterDestructibleId('XOkt')
                call RegisterDestructibleId('XTbd')
                call RegisterDestructibleId('XTm5')
                call RegisterDestructibleId('XTmp')
                call RegisterDestructibleId('XTmx')
                call RegisterDestructibleId('XTvt')
                call RegisterDestructibleId('XTx5')
                call RegisterDestructibleId('YSdb')
                call RegisterDestructibleId('YSdc')
                call RegisterDestructibleId('YT00')
                call RegisterDestructibleId('YT01')
                call RegisterDestructibleId('YT02')
                call RegisterDestructibleId('YT03')
                call RegisterDestructibleId('YT04')
                call RegisterDestructibleId('YT05')
                call RegisterDestructibleId('YT06')
                call RegisterDestructibleId('YT07')
                call RegisterDestructibleId('YT08')
                call RegisterDestructibleId('YT09')
                call RegisterDestructibleId('YT10')
                call RegisterDestructibleId('YT11')
                call RegisterDestructibleId('YT12')
                call RegisterDestructibleId('YT13')
                call RegisterDestructibleId('YT14')
                call RegisterDestructibleId('YT15')
                call RegisterDestructibleId('YT16')
                call RegisterDestructibleId('YT17')
                call RegisterDestructibleId('YT18')
                call RegisterDestructibleId('YT19')
                call RegisterDestructibleId('YT20')
                call RegisterDestructibleId('YT21')
                call RegisterDestructibleId('YT22')
                call RegisterDestructibleId('YT23')
                call RegisterDestructibleId('YT24')
                call RegisterDestructibleId('YT25')
                call RegisterDestructibleId('YT26')
                call RegisterDestructibleId('YT27')
                call RegisterDestructibleId('YT28')
                call RegisterDestructibleId('YT29')
                call RegisterDestructibleId('YT30')
                call RegisterDestructibleId('YT31')
                call RegisterDestructibleId('YT32')
                call RegisterDestructibleId('YT33')
                call RegisterDestructibleId('YT34')
                call RegisterDestructibleId('YT35')
                call RegisterDestructibleId('YT36')
                call RegisterDestructibleId('YT37')
                call RegisterDestructibleId('YT38')
                call RegisterDestructibleId('YT39')
                call RegisterDestructibleId('YT40')
                call RegisterDestructibleId('YT41')
                call RegisterDestructibleId('YT42')
                call RegisterDestructibleId('YT43')
                call RegisterDestructibleId('YT44')
                call RegisterDestructibleId('YT45')
                call RegisterDestructibleId('YT46')
                call RegisterDestructibleId('YT47')
                call RegisterDestructibleId('YT48')
                call RegisterDestructibleId('YT49')
                call RegisterDestructibleId('YT50')
                call RegisterDestructibleId('YT51')
                call RegisterDestructibleId('YTab')
                call RegisterDestructibleId('YTac')
                call RegisterDestructibleId('YTce')
                call RegisterDestructibleId('YTct')
                call RegisterDestructibleId('YTcx')
                call RegisterDestructibleId('YTfb')
                call RegisterDestructibleId('YTfc')
                call RegisterDestructibleId('YTft')
                call RegisterDestructibleId('YTlb')
                call RegisterDestructibleId('YTpb')
                call RegisterDestructibleId('YTpc')
                call RegisterDestructibleId('YTst')
                call RegisterDestructibleId('YTwt')
                call RegisterDestructibleId('Ytlc')
                call RegisterDestructibleId('ZTd1')
                call RegisterDestructibleId('ZTd2')
                call RegisterDestructibleId('ZTd3')
                call RegisterDestructibleId('ZTd4')
                call RegisterDestructibleId('ZTd5')
                call RegisterDestructibleId('ZTd6')
                call RegisterDestructibleId('ZTd7')
                call RegisterDestructibleId('ZTd8')
                call RegisterDestructibleId('ZTg1')
                call RegisterDestructibleId('ZTg2')
                call RegisterDestructibleId('ZTg3')
                call RegisterDestructibleId('ZTg4')
                call RegisterDestructibleId('ZTnc')
                call RegisterDestructibleId('ZTr0')
                call RegisterDestructibleId('ZTr1')
                call RegisterDestructibleId('ZTr2')
                call RegisterDestructibleId('ZTr3')
                call RegisterDestructibleId('ZTsg')
                call RegisterDestructibleId('ZTsx')
                call RegisterDestructibleId('ZTtc')
                call RegisterDestructibleId('ZTtw')
                call RegisterDestructibleId('ZTw0')
                call RegisterDestructibleId('ZTw1')
                call RegisterDestructibleId('ZTw2')
                call RegisterDestructibleId('ZTw3')
            endif
        endmethod

        method onStart takes nothing returns nothing
            set scanRangePrefixes = "B"
        endmethod

        method onEnd takes nothing returns nothing
            local staticIdList destructibles = GetAllDestructibleIds()
            call BJDebugMsg( "DestructibleIdScanner - Total ids: " + I2S( destructibles.size() ) + " (" + I2S(succeedCounter) + " customs)" )
        endmethod

    endstruct

endlibrary

DoodadIdScanner
JASS:
/*
DoodadIdScanner lib v1.0.0 (21/10/2019) by Ricola3D

Content:
Id scanner for World Editor doodads.
*/
library DoodadIdScanner requires IdScanner

    //! runtextmacro DECL_NEW_SCANNER_TYPE ("DoodadIdScanner")

    /*
    */
    struct DoodadIdScanner extends AbstractIdScanner

        method saveId takes integer index, integer id returns nothing
            call RegisterDoodadId(id)
        endmethod

        /*
        469 hardcoded standard Doodads, sorted by increasing value
        */
        method saveStandardRange takes integer index returns nothing
            if ( 0 == index ) then
                // Before custom 'D' abilities
                call RegisterDoodadId('AObd')
                call RegisterDoodadId('AObo')
                call RegisterDoodadId('AObr')
                call RegisterDoodadId('AOgs')
                call RegisterDoodadId('AOhs')
                call RegisterDoodadId('AOks')
                call RegisterDoodadId('AOla')
                call RegisterDoodadId('AOlg')
                call RegisterDoodadId('AOnt')
                call RegisterDoodadId('AOob')
                call RegisterDoodadId('AOsk')
                call RegisterDoodadId('AOsr')
                call RegisterDoodadId('APbs')
                call RegisterDoodadId('APct')
                call RegisterDoodadId('APms')
                call RegisterDoodadId('APtv')
                call RegisterDoodadId('ARrk')
                call RegisterDoodadId('ASbc')
                call RegisterDoodadId('ASbl')
                call RegisterDoodadId('ASbr')
                call RegisterDoodadId('ASpr')
                call RegisterDoodadId('ASpt')
                call RegisterDoodadId('ASr1')
                call RegisterDoodadId('ASra')
                call RegisterDoodadId('ASv0')
                call RegisterDoodadId('ASv1')
                call RegisterDoodadId('ASv2')
                call RegisterDoodadId('ASv3')
                call RegisterDoodadId('ASv4')
                call RegisterDoodadId('ASwt')
                call RegisterDoodadId('ASx0')
                call RegisterDoodadId('ASx1')
                call RegisterDoodadId('ASx2')
                call RegisterDoodadId('AWfl')
                call RegisterDoodadId('AWfs')
                call RegisterDoodadId('AWlp')
                call RegisterDoodadId('AZrf')
                call RegisterDoodadId('BObo')
                call RegisterDoodadId('BOct')
                call RegisterDoodadId('BOth')
                call RegisterDoodadId('BOtt')
                call RegisterDoodadId('BPca')
                call RegisterDoodadId('BPtw')
                call RegisterDoodadId('BRcr')
                call RegisterDoodadId('BRfs')
                call RegisterDoodadId('BRgs')
                call RegisterDoodadId('BRrk')
                call RegisterDoodadId('BRrp')
                call RegisterDoodadId('BRrs')
                call RegisterDoodadId('BRsp')
                call RegisterDoodadId('BSar')
                call RegisterDoodadId('BSr1')
                call RegisterDoodadId('BSra')
                call RegisterDoodadId('BSrc')
                call RegisterDoodadId('BSrv')
                call RegisterDoodadId('BSrw')
                call RegisterDoodadId('CObl')
                call RegisterDoodadId('CObo')
                call RegisterDoodadId('COdf')
                call RegisterDoodadId('COhs')
                call RegisterDoodadId('COla')
                call RegisterDoodadId('COlg')
                call RegisterDoodadId('COob')
                call RegisterDoodadId('CPbs')
                call RegisterDoodadId('CPct')
                call RegisterDoodadId('CPlp')
                call RegisterDoodadId('CPms')
                call RegisterDoodadId('CRfs')
                call RegisterDoodadId('CRrk')
                call RegisterDoodadId('CRrs')
                call RegisterDoodadId('CSbc')
                call RegisterDoodadId('CSbl')
                call RegisterDoodadId('CSbr')
                call RegisterDoodadId('CSr1')
                call RegisterDoodadId('CSra')
            elseif ( 1 == index ) then
                // After custom 'D' abilities
                call RegisterDoodadId('DOab')
                call RegisterDoodadId('DOas')
                call RegisterDoodadId('DObh')
                call RegisterDoodadId('DObk')
                call RegisterDoodadId('DObw')
                call RegisterDoodadId('DOch')
                call RegisterDoodadId('DOcp')
                call RegisterDoodadId('DOcr')
                call RegisterDoodadId('DOim')
                call RegisterDoodadId('DOjp')
                call RegisterDoodadId('DOkb')
                call RegisterDoodadId('DOlc')
                call RegisterDoodadId('DOmc')
                call RegisterDoodadId('DOme')
                call RegisterDoodadId('DOob')
                call RegisterDoodadId('DOsv')
                call RegisterDoodadId('DOsw')
                call RegisterDoodadId('DOtb')
                call RegisterDoodadId('DOtc')
                call RegisterDoodadId('DOtp')
                call RegisterDoodadId('DOtt')
                call RegisterDoodadId('DRfc')
                call RegisterDoodadId('DRrk')
                call RegisterDoodadId('DRst')
                call RegisterDoodadId('DSa1')
                call RegisterDoodadId('DSa2')
                call RegisterDoodadId('DSah')
                call RegisterDoodadId('DSar')
                call RegisterDoodadId('DSp0')
                call RegisterDoodadId('DSp9')
                call RegisterDoodadId('GOlc')
                call RegisterDoodadId('GOob')
                call RegisterDoodadId('GPsh')
                call RegisterDoodadId('GRfc')
                call RegisterDoodadId('GRrk')
                call RegisterDoodadId('GRst')
                call RegisterDoodadId('GSa1')
                call RegisterDoodadId('GSa2')
                call RegisterDoodadId('GSah')
                call RegisterDoodadId('GSar')
                call RegisterDoodadId('GSp0')
                call RegisterDoodadId('GSp9')
                call RegisterDoodadId('IOch')
                call RegisterDoodadId('IOic')
                call RegisterDoodadId('IOob')
                call RegisterDoodadId('IOpr')
                call RegisterDoodadId('IOsl')
                call RegisterDoodadId('IOsm')
                call RegisterDoodadId('IOss')
                call RegisterDoodadId('IOst')
                call RegisterDoodadId('IRcy')
                call RegisterDoodadId('IRgc')
                call RegisterDoodadId('IRic')
                call RegisterDoodadId('IRrk')
                call RegisterDoodadId('IRrs')
                call RegisterDoodadId('ISa1')
                call RegisterDoodadId('ISar')
                call RegisterDoodadId('ISrb')
                call RegisterDoodadId('ISs1')
                call RegisterDoodadId('ISsr')
                call RegisterDoodadId('IWbg')
                call RegisterDoodadId('IWie')
                call RegisterDoodadId('IWw0')
                call RegisterDoodadId('IZft')
                call RegisterDoodadId('IZrw')
                call RegisterDoodadId('IZww')
                call RegisterDoodadId('JOgr')
                call RegisterDoodadId('JSar')
                call RegisterDoodadId('JSax')
                call RegisterDoodadId('JSc2')
                call RegisterDoodadId('JSc3')
                call RegisterDoodadId('JSc4')
                call RegisterDoodadId('JSco')
                call RegisterDoodadId('JScs')
                call RegisterDoodadId('JScx')
                call RegisterDoodadId('JSr6')
                call RegisterDoodadId('JSrc')
                call RegisterDoodadId('JZif')
                call RegisterDoodadId('JZud')
                call RegisterDoodadId('KOdr')
                call RegisterDoodadId('KOst')
                call RegisterDoodadId('LCc0')
                call RegisterDoodadId('LCc2')
                call RegisterDoodadId('LOam')
                call RegisterDoodadId('LOar')
                call RegisterDoodadId('LObr')
                call RegisterDoodadId('LObz')
                call RegisterDoodadId('LOca')
                call RegisterDoodadId('LOcb')
                call RegisterDoodadId('LOce')
                call RegisterDoodadId('LOch')
                call RegisterDoodadId('LOct')
                call RegisterDoodadId('LOfl')
                call RegisterDoodadId('LOgr')
                call RegisterDoodadId('LOh1')
                call RegisterDoodadId('LOhb')
                call RegisterDoodadId('LOhc')
                call RegisterDoodadId('LOhp')
                call RegisterDoodadId('LOic')
                call RegisterDoodadId('LOlp')
                call RegisterDoodadId('LOo1')
                call RegisterDoodadId('LOo2')
                call RegisterDoodadId('LOpg')
                call RegisterDoodadId('LOrb')
                call RegisterDoodadId('LOrc')
                call RegisterDoodadId('LOrh')
                call RegisterDoodadId('LOsc')
                call RegisterDoodadId('LOsh')
                call RegisterDoodadId('LOsk')
                call RegisterDoodadId('LOsm')
                call RegisterDoodadId('LOsp')
                call RegisterDoodadId('LOss')
                call RegisterDoodadId('LOsw')
                call RegisterDoodadId('LOt1')
                call RegisterDoodadId('LOth')
                call RegisterDoodadId('LOtr')
                call RegisterDoodadId('LOtz')
                call RegisterDoodadId('LOwb')
                call RegisterDoodadId('LOwf')
                call RegisterDoodadId('LOwp')
                call RegisterDoodadId('LOwr')
                call RegisterDoodadId('LOxx')
                call RegisterDoodadId('LPcr')
                call RegisterDoodadId('LPcw')
                call RegisterDoodadId('LPfp')
                call RegisterDoodadId('LPlp')
                call RegisterDoodadId('LPrs')
                call RegisterDoodadId('LPwb')
                call RegisterDoodadId('LPwh')
                call RegisterDoodadId('LRrk')
                call RegisterDoodadId('LSba')
                call RegisterDoodadId('LSeb')
                call RegisterDoodadId('LSgr')
                call RegisterDoodadId('LSgs')
                call RegisterDoodadId('LSin')
                call RegisterDoodadId('LSr1')
                call RegisterDoodadId('LSra')
                call RegisterDoodadId('LSrg')
                call RegisterDoodadId('LSsb')
                call RegisterDoodadId('LSsf')
                call RegisterDoodadId('LSsi')
                call RegisterDoodadId('LSst')
                call RegisterDoodadId('LSwb')
                call RegisterDoodadId('LSwl')
                call RegisterDoodadId('LSwm')
                call RegisterDoodadId('LWw0')
                call RegisterDoodadId('LZth')
                call RegisterDoodadId('NOal')
                call RegisterDoodadId('NObc')
                call RegisterDoodadId('NObk')
                call RegisterDoodadId('NObo')
                call RegisterDoodadId('NObt')
                call RegisterDoodadId('NOfg')
                call RegisterDoodadId('NOfl')
                call RegisterDoodadId('NOfp')
                call RegisterDoodadId('NOft')
                call RegisterDoodadId('NOgv')
                call RegisterDoodadId('NOok')
                call RegisterDoodadId('NOtb')
                call RegisterDoodadId('NPth')
                call RegisterDoodadId('NRfs')
                call RegisterDoodadId('NRic')
                call RegisterDoodadId('NRrk')
                call RegisterDoodadId('NRwr')
                call RegisterDoodadId('NSct')
                call RegisterDoodadId('NSr1')
                call RegisterDoodadId('NSra')
                call RegisterDoodadId('NSrb')
                call RegisterDoodadId('NWf1')
                call RegisterDoodadId('NWf2')
                call RegisterDoodadId('NWf3')
                call RegisterDoodadId('NWf4')
                call RegisterDoodadId('NWfb')
                call RegisterDoodadId('NWfp')
                call RegisterDoodadId('NWi1')
                call RegisterDoodadId('NWi2')
                call RegisterDoodadId('NWi3')
                call RegisterDoodadId('NWi4')
                call RegisterDoodadId('NWpa')
                call RegisterDoodadId('NWrd')
                call RegisterDoodadId('NWrw')
                call RegisterDoodadId('NWsd')
                call RegisterDoodadId('NWsp')
                call RegisterDoodadId('NWwh')
                call RegisterDoodadId('OOal')
                call RegisterDoodadId('OOgr')
                call RegisterDoodadId('OOob')
                call RegisterDoodadId('OOsd')
                call RegisterDoodadId('OOsk')
                call RegisterDoodadId('OOst')
                call RegisterDoodadId('OPop')
                call RegisterDoodadId('ORfk')
                call RegisterDoodadId('ORmk')
                call RegisterDoodadId('ORrk')
                call RegisterDoodadId('ORrr')
                call RegisterDoodadId('ORrs')
                call RegisterDoodadId('OSa1')
                call RegisterDoodadId('OSar')
                call RegisterDoodadId('OZfc')
                call RegisterDoodadId('OZsp')
                call RegisterDoodadId('VOal')
                call RegisterDoodadId('VOas')
                call RegisterDoodadId('VOfl')
                call RegisterDoodadId('VOfs')
                call RegisterDoodadId('VSvb')
                call RegisterDoodadId('XOcl')
                call RegisterDoodadId('XOcs')
                call RegisterDoodadId('XOmr')
                call RegisterDoodadId('YCc1')
                call RegisterDoodadId('YCc2')
                call RegisterDoodadId('YCc3')
                call RegisterDoodadId('YCc4')
                call RegisterDoodadId('YCd1')
                call RegisterDoodadId('YCd2')
                call RegisterDoodadId('YCd3')
                call RegisterDoodadId('YCd4')
                call RegisterDoodadId('YCg1')
                call RegisterDoodadId('YCg2')
                call RegisterDoodadId('YCg3')
                call RegisterDoodadId('YCg4')
                call RegisterDoodadId('YCl1')
                call RegisterDoodadId('YCl2')
                call RegisterDoodadId('YCl3')
                call RegisterDoodadId('YCl4')
                call RegisterDoodadId('YCo1')
                call RegisterDoodadId('YCo2')
                call RegisterDoodadId('YCo3')
                call RegisterDoodadId('YCo4')
                call RegisterDoodadId('YCp1')
                call RegisterDoodadId('YCp2')
                call RegisterDoodadId('YCp3')
                call RegisterDoodadId('YCp4')
                call RegisterDoodadId('YCr1')
                call RegisterDoodadId('YCr2')
                call RegisterDoodadId('YCr3')
                call RegisterDoodadId('YCr4')
                call RegisterDoodadId('YCs1')
                call RegisterDoodadId('YCs2')
                call RegisterDoodadId('YCs3')
                call RegisterDoodadId('YCs4')
                call RegisterDoodadId('YCt1')
                call RegisterDoodadId('YCt2')
                call RegisterDoodadId('YCt3')
                call RegisterDoodadId('YCt4')
                call RegisterDoodadId('YCu1')
                call RegisterDoodadId('YCu2')
                call RegisterDoodadId('YCu3')
                call RegisterDoodadId('YCu4')
                call RegisterDoodadId('YCx1')
                call RegisterDoodadId('YCx2')
                call RegisterDoodadId('YCx3')
                call RegisterDoodadId('YCx4')
                call RegisterDoodadId('YCx5')
                call RegisterDoodadId('YCx6')
                call RegisterDoodadId('YCx7')
                call RegisterDoodadId('YCx8')
                call RegisterDoodadId('YObb')
                call RegisterDoodadId('YObg')
                call RegisterDoodadId('YObs')
                call RegisterDoodadId('YObw')
                call RegisterDoodadId('YOcp')
                call RegisterDoodadId('YOec')
                call RegisterDoodadId('YOf1')
                call RegisterDoodadId('YOf2')
                call RegisterDoodadId('YOf3')
                call RegisterDoodadId('YOfb')
                call RegisterDoodadId('YOfn')
                call RegisterDoodadId('YOfr')
                call RegisterDoodadId('YOfs')
                call RegisterDoodadId('YOgr')
                call RegisterDoodadId('YOks')
                call RegisterDoodadId('YOlb')
                call RegisterDoodadId('YOlp')
                call RegisterDoodadId('YOob')
                call RegisterDoodadId('YOr1')
                call RegisterDoodadId('YOr2')
                call RegisterDoodadId('YOsa')
                call RegisterDoodadId('YOst')
                call RegisterDoodadId('YOsw')
                call RegisterDoodadId('YOta')
                call RegisterDoodadId('YOtf')
                call RegisterDoodadId('YOth')
                call RegisterDoodadId('YOts')
                call RegisterDoodadId('YOwa')
                call RegisterDoodadId('YOwb')
                call RegisterDoodadId('YOws')
                call RegisterDoodadId('YPbs')
                call RegisterDoodadId('YPfa')
                call RegisterDoodadId('YPfs')
                call RegisterDoodadId('YPpp')
                call RegisterDoodadId('YS00')
                call RegisterDoodadId('YS01')
                call RegisterDoodadId('YS02')
                call RegisterDoodadId('YS03')
                call RegisterDoodadId('YS04')
                call RegisterDoodadId('YS05')
                call RegisterDoodadId('YS06')
                call RegisterDoodadId('YS07')
                call RegisterDoodadId('YS08')
                call RegisterDoodadId('YS09')
                call RegisterDoodadId('YS10')
                call RegisterDoodadId('YS11')
                call RegisterDoodadId('YS12')
                call RegisterDoodadId('YS13')
                call RegisterDoodadId('YS14')
                call RegisterDoodadId('YS15')
                call RegisterDoodadId('YSa1')
                call RegisterDoodadId('YSaw')
                call RegisterDoodadId('YSc2')
                call RegisterDoodadId('YSc3')
                call RegisterDoodadId('YSc4')
                call RegisterDoodadId('YSc5')
                call RegisterDoodadId('YSca')
                call RegisterDoodadId('YScd')
                call RegisterDoodadId('YSco')
                call RegisterDoodadId('YScr')
                call RegisterDoodadId('YScs')
                call RegisterDoodadId('YSll')
                call RegisterDoodadId('YSls')
                call RegisterDoodadId('YSlt')
                call RegisterDoodadId('YSlx')
                call RegisterDoodadId('YSr0')
                call RegisterDoodadId('YSr1')
                call RegisterDoodadId('YSr2')
                call RegisterDoodadId('YSr3')
                call RegisterDoodadId('YSr4')
                call RegisterDoodadId('YSr5')
                call RegisterDoodadId('YSr6')
                call RegisterDoodadId('YSr7')
                call RegisterDoodadId('YSr8')
                call RegisterDoodadId('YSr9')
                call RegisterDoodadId('YSra')
                call RegisterDoodadId('YSrb')
                call RegisterDoodadId('YSrc')
                call RegisterDoodadId('YSrd')
                call RegisterDoodadId('YSre')
                call RegisterDoodadId('YSrf')
                call RegisterDoodadId('YSta')
                call RegisterDoodadId('YSw0')
                call RegisterDoodadId('YSw1')
                call RegisterDoodadId('YSw2')
                call RegisterDoodadId('YSw3')
                call RegisterDoodadId('YZef')
                call RegisterDoodadId('ZCv1')
                call RegisterDoodadId('ZCv2')
                call RegisterDoodadId('ZOba')
                call RegisterDoodadId('ZObz')
                call RegisterDoodadId('ZOd2')
                call RegisterDoodadId('ZOdt')
                call RegisterDoodadId('ZOfo')
                call RegisterDoodadId('ZOfp')
                call RegisterDoodadId('ZOls')
                call RegisterDoodadId('ZOob')
                call RegisterDoodadId('ZOrb')
                call RegisterDoodadId('ZOrc')
                call RegisterDoodadId('ZOrp')
                call RegisterDoodadId('ZOrt')
                call RegisterDoodadId('ZOsb')
                call RegisterDoodadId('ZOsh')
                call RegisterDoodadId('ZOss')
                call RegisterDoodadId('ZOst')
                call RegisterDoodadId('ZOt2')
                call RegisterDoodadId('ZOtb')
                call RegisterDoodadId('ZOtr')
                call RegisterDoodadId('ZOvr')
                call RegisterDoodadId('ZPfw')
                call RegisterDoodadId('ZPlp')
                call RegisterDoodadId('ZPms')
                call RegisterDoodadId('ZPru')
                call RegisterDoodadId('ZPsh')
                call RegisterDoodadId('ZPtw')
                call RegisterDoodadId('ZPvp')
                call RegisterDoodadId('ZRbd')
                call RegisterDoodadId('ZRbs')
                call RegisterDoodadId('ZRrk')
                call RegisterDoodadId('ZRrs')
                call RegisterDoodadId('ZRsp')
                call RegisterDoodadId('ZSa1')
                call RegisterDoodadId('ZSab')
                call RegisterDoodadId('ZSar')
                call RegisterDoodadId('ZSas')
                call RegisterDoodadId('ZSb1')
                call RegisterDoodadId('ZSrb')
                call RegisterDoodadId('ZSs1')
                call RegisterDoodadId('ZWbg')
                call RegisterDoodadId('ZWca')
                call RegisterDoodadId('ZWcl')
                call RegisterDoodadId('ZWfs')
                call RegisterDoodadId('ZWsf')
                call RegisterDoodadId('ZWsw')
                call RegisterDoodadId('ZZcd')
                call RegisterDoodadId('ZZdt')
                call RegisterDoodadId('ZZgr')
                call RegisterDoodadId('ZZys')
            endif
        endmethod

        method onStart takes nothing returns nothing
            set scanRangePrefixes = "D"
        endmethod

        method onEnd takes nothing returns nothing
            local staticIdList Doodads = GetAllDoodadIds()
            call BJDebugMsg( "DoodadIdScanner - Total ids: " + I2S( Doodads.size() ) + " (" + I2S(succeedCounter) + " customs)" )
        endmethod

    endstruct

endlibrary

AbilityIdScanner
JASS:
/*
AbilityIdScanner lib v1.0.0 (21/10/2019) by Ricola3D

Content:
Id scanner for World Editor abilities.
*/
library AbilityIdScanner requires IdScanner

    //! runtextmacro DECL_NEW_SCANNER_TYPE ("AbilityIdScanner")

    /*
    */
    struct AbilityIdScanner extends AbstractIdScanner

        static constant string UNSET_ABILITY_ICON_VALUE = "ReplaceableTextures\\CommandButtons\\BTNTemp.blp"
        static constant integer DUMMY_UNIT_ID = 'n00E'

        private static unit DummyUnit

        method isValidId takes integer id returns boolean
            /*
            Notes:
            - GetObjectName (=GetAbilityName) and 'UnitAddAbility or UnitRemoveAbility' are slow (1-5ms).
            - Abilities can have null name, icon, tooltips, ...
            - 'UnitAddAbility or UnitRemoveAbility' crashes for unused IDs
            - BlzGetAbility<string attribute> functions cannot differenciate unused IDs from abilities with default empty value
            - BlzSetAbility<string attribute> does not work on custom abilities with field whose value is default empty
            - BlzSetAbilityPoxX works even for unused IDs too
            */
            local boolean isValid = false
            local string testValue = null
            // Quick test - get all abilities with an icon
            set testValue = BlzGetAbilityIcon(id)
            if ( UNSET_ABILITY_ICON_VALUE != testValue ) then
                // Enough, this ID is a valid ability
                set isValid = true
            else
                // Slow test - test abilities without icons or unused IDs
                set isValid = ( UnitAddAbility(DummyUnit,id) or UnitRemoveAbility(DummyUnit, id) )
            endif
            return isValid
        endmethod

        method saveId takes integer index, integer id returns nothing
            call RegisterAbilityId(id)
        endmethod

        /*
        803 hardcoded standard abilities, sorted by increasing value
        */
        method saveStandardRange takes integer index returns nothing
            if ( 1 == index ) then
                // After custom 'A' abilities
                call RegisterAbilityId('AAns')
                call RegisterAbilityId('ACac')
                call RegisterAbilityId('ACad')
                call RegisterAbilityId('ACah')
                call RegisterAbilityId('ACam')
                call RegisterAbilityId('ACat')
                call RegisterAbilityId('ACav')
                call RegisterAbilityId('ACba')
                call RegisterAbilityId('ACbb')
                call RegisterAbilityId('ACbc')
                call RegisterAbilityId('ACbf')
                call RegisterAbilityId('ACbh')
                call RegisterAbilityId('ACbk')
                call RegisterAbilityId('ACbl')
                call RegisterAbilityId('ACbn')
                call RegisterAbilityId('ACbz')
                call RegisterAbilityId('ACc2')
                call RegisterAbilityId('ACc3')
                call RegisterAbilityId('ACca')
                call RegisterAbilityId('ACcb')
                call RegisterAbilityId('ACce')
                call RegisterAbilityId('ACch')
                call RegisterAbilityId('ACcl')
                call RegisterAbilityId('ACcn')
                call RegisterAbilityId('ACcr')
                call RegisterAbilityId('ACcs')
                call RegisterAbilityId('ACct')
                call RegisterAbilityId('ACcv')
                call RegisterAbilityId('ACcw')
                call RegisterAbilityId('ACcy')
                call RegisterAbilityId('ACd2')
                call RegisterAbilityId('ACdc')
                call RegisterAbilityId('ACde')
                call RegisterAbilityId('ACdm')
                call RegisterAbilityId('ACdr')
                call RegisterAbilityId('ACds')
                call RegisterAbilityId('ACdv')
                call RegisterAbilityId('ACen')
                call RegisterAbilityId('ACes')
                call RegisterAbilityId('ACev')
                call RegisterAbilityId('ACf2')
                call RegisterAbilityId('ACf3')
                call RegisterAbilityId('ACfa')
                call RegisterAbilityId('ACfb')
                call RegisterAbilityId('ACfd')
                call RegisterAbilityId('ACff')
                call RegisterAbilityId('ACfl')
                call RegisterAbilityId('ACfn')
                call RegisterAbilityId('ACfr')
                call RegisterAbilityId('ACfs')
                call RegisterAbilityId('ACfu')
                call RegisterAbilityId('AChv')
                call RegisterAbilityId('AChw')
                call RegisterAbilityId('AChx')
                call RegisterAbilityId('ACif')
                call RegisterAbilityId('ACim')
                call RegisterAbilityId('ACls')
                call RegisterAbilityId('ACm2')
                call RegisterAbilityId('ACm3')
                call RegisterAbilityId('ACmf')
                call RegisterAbilityId('ACmi')
                call RegisterAbilityId('ACmo')
                call RegisterAbilityId('ACmp')
                call RegisterAbilityId('ACnr')
                call RegisterAbilityId('ACpa')
                call RegisterAbilityId('ACps')
                call RegisterAbilityId('ACpu')
                call RegisterAbilityId('ACpv')
                call RegisterAbilityId('ACpy')
                call RegisterAbilityId('ACr1')
                call RegisterAbilityId('ACr2')
                call RegisterAbilityId('ACrd')
                call RegisterAbilityId('ACrf')
                call RegisterAbilityId('ACrg')
                call RegisterAbilityId('ACrj')
                call RegisterAbilityId('ACrk')
                call RegisterAbilityId('ACrn')
                call RegisterAbilityId('ACro')
                call RegisterAbilityId('ACs7')
                call RegisterAbilityId('ACs8')
                call RegisterAbilityId('ACs9')
                call RegisterAbilityId('ACsa')
                call RegisterAbilityId('ACsf')
                call RegisterAbilityId('ACsh')
                call RegisterAbilityId('ACsi')
                call RegisterAbilityId('ACsk')
                call RegisterAbilityId('ACsl')
                call RegisterAbilityId('ACsm')
                call RegisterAbilityId('ACsp')
                call RegisterAbilityId('ACss')
                call RegisterAbilityId('ACst')
                call RegisterAbilityId('ACsw')
                call RegisterAbilityId('ACt2')
                call RegisterAbilityId('ACtb')
                call RegisterAbilityId('ACtc')
                call RegisterAbilityId('ACtn')
                call RegisterAbilityId('ACua')
                call RegisterAbilityId('ACuf')
                call RegisterAbilityId('ACvp')
                call RegisterAbilityId('ACvs')
                call RegisterAbilityId('ACwb')
                call RegisterAbilityId('ACwe')
                call RegisterAbilityId('AEIl')
                call RegisterAbilityId('AEah')
                call RegisterAbilityId('AEar')
                call RegisterAbilityId('AEbl')
                call RegisterAbilityId('AEbu')
                call RegisterAbilityId('AEer')
                call RegisterAbilityId('AEev')
                call RegisterAbilityId('AEfk')
                call RegisterAbilityId('AEfn')
                call RegisterAbilityId('AEim')
                call RegisterAbilityId('AEmb')
                call RegisterAbilityId('AEme')
                call RegisterAbilityId('AEpa')
                call RegisterAbilityId('AEsb')
                call RegisterAbilityId('AEsf')
                call RegisterAbilityId('AEsh')
                call RegisterAbilityId('AEst')
                call RegisterAbilityId('AEsv')
                call RegisterAbilityId('AEtq')
                call RegisterAbilityId('AEvi')
                call RegisterAbilityId('AGbu')
                call RegisterAbilityId('AHab')
                call RegisterAbilityId('AHad')
                call RegisterAbilityId('AHav')
                call RegisterAbilityId('AHbh')
                call RegisterAbilityId('AHbn')
                call RegisterAbilityId('AHbu')
                call RegisterAbilityId('AHbz')
                call RegisterAbilityId('AHca')
                call RegisterAbilityId('AHdr')
                call RegisterAbilityId('AHds')
                call RegisterAbilityId('AHer')
                call RegisterAbilityId('AHfa')
                call RegisterAbilityId('AHfs')
                call RegisterAbilityId('AHhb')
                call RegisterAbilityId('AHmt')
                call RegisterAbilityId('AHpx')
                call RegisterAbilityId('AHre')
                call RegisterAbilityId('AHta')
                call RegisterAbilityId('AHtb')
                call RegisterAbilityId('AHtc')
                call RegisterAbilityId('AHwe')
                call RegisterAbilityId('AI2m')
                call RegisterAbilityId('AIa1')
                call RegisterAbilityId('AIa3')
                call RegisterAbilityId('AIa4')
                call RegisterAbilityId('AIa6')
                call RegisterAbilityId('AIaa')
                call RegisterAbilityId('AIad')
                call RegisterAbilityId('AIae')
                call RegisterAbilityId('AIam')
                call RegisterAbilityId('AIan')
                call RegisterAbilityId('AIar')
                call RegisterAbilityId('AIat')
                call RegisterAbilityId('AIau')
                call RegisterAbilityId('AIav')
                call RegisterAbilityId('AIaz')
                call RegisterAbilityId('AIba')
                call RegisterAbilityId('AIbb')
                call RegisterAbilityId('AIbf')
                call RegisterAbilityId('AIbg')
                call RegisterAbilityId('AIbh')
                call RegisterAbilityId('AIbk')
                call RegisterAbilityId('AIbl')
                call RegisterAbilityId('AIbm')
                call RegisterAbilityId('AIbr')
                call RegisterAbilityId('AIbs')
                call RegisterAbilityId('AIbt')
                call RegisterAbilityId('AIbx')
                call RegisterAbilityId('AIcb')
                call RegisterAbilityId('AIcd')
                call RegisterAbilityId('AIcf')
                call RegisterAbilityId('AIcl')
                call RegisterAbilityId('AIcm')
                call RegisterAbilityId('AIco')
                call RegisterAbilityId('AIcs')
                call RegisterAbilityId('AIct')
                call RegisterAbilityId('AIcy')
                call RegisterAbilityId('AId0')
                call RegisterAbilityId('AId1')
                call RegisterAbilityId('AId2')
                call RegisterAbilityId('AId3')
                call RegisterAbilityId('AId4')
                call RegisterAbilityId('AId5')
                call RegisterAbilityId('AId7')
                call RegisterAbilityId('AId8')
                call RegisterAbilityId('AIda')
                call RegisterAbilityId('AIdb')
                call RegisterAbilityId('AIdc')
                call RegisterAbilityId('AIdd')
                call RegisterAbilityId('AIdf')
                call RegisterAbilityId('AIdg')
                call RegisterAbilityId('AIdi')
                call RegisterAbilityId('AIdm')
                call RegisterAbilityId('AIdn')
                call RegisterAbilityId('AIdp')
                call RegisterAbilityId('AIds')
                call RegisterAbilityId('AIdv')
                call RegisterAbilityId('AIe2')
                call RegisterAbilityId('AIem')
                call RegisterAbilityId('AIev')
                call RegisterAbilityId('AIfa')
                call RegisterAbilityId('AIfb')
                call RegisterAbilityId('AIfd')
                call RegisterAbilityId('AIfe')
                call RegisterAbilityId('AIff')
                call RegisterAbilityId('AIfg')
                call RegisterAbilityId('AIfh')
                call RegisterAbilityId('AIfl')
                call RegisterAbilityId('AIfm')
                call RegisterAbilityId('AIfn')
                call RegisterAbilityId('AIfo')
                call RegisterAbilityId('AIfr')
                call RegisterAbilityId('AIfs')
                call RegisterAbilityId('AIft')
                call RegisterAbilityId('AIfu')
                call RegisterAbilityId('AIfw')
                call RegisterAbilityId('AIfx')
                call RegisterAbilityId('AIfz')
                call RegisterAbilityId('AIg2')
                call RegisterAbilityId('AIgd')
                call RegisterAbilityId('AIgf')
                call RegisterAbilityId('AIgm')
                call RegisterAbilityId('AIgo')
                call RegisterAbilityId('AIgu')
                call RegisterAbilityId('AIgx')
                call RegisterAbilityId('AIh1')
                call RegisterAbilityId('AIh2')
                call RegisterAbilityId('AIh3')
                call RegisterAbilityId('AIha')
                call RegisterAbilityId('AIhb')
                call RegisterAbilityId('AIhl')
                call RegisterAbilityId('AIhm')
                call RegisterAbilityId('AIhw')
                call RegisterAbilityId('AIhx')
                call RegisterAbilityId('AIi1')
                call RegisterAbilityId('AIi3')
                call RegisterAbilityId('AIi4')
                call RegisterAbilityId('AIi6')
                call RegisterAbilityId('AIil')
                call RegisterAbilityId('AIim')
                call RegisterAbilityId('AIin')
                call RegisterAbilityId('AIir')
                call RegisterAbilityId('AIl1')
                call RegisterAbilityId('AIl2')
                call RegisterAbilityId('AIlb')
                call RegisterAbilityId('AIlf')
                call RegisterAbilityId('AIll')
                call RegisterAbilityId('AIlm')
                call RegisterAbilityId('AIlp')
                call RegisterAbilityId('AIls')
                call RegisterAbilityId('AIlu')
                call RegisterAbilityId('AIlx')
                call RegisterAbilityId('AIlz')
                call RegisterAbilityId('AIm1')
                call RegisterAbilityId('AIm2')
                call RegisterAbilityId('AImb')
                call RegisterAbilityId('AImh')
                call RegisterAbilityId('AImo')
                call RegisterAbilityId('AImr')
                call RegisterAbilityId('AIms')
                call RegisterAbilityId('AImt')
                call RegisterAbilityId('AImv')
                call RegisterAbilityId('AImx')
                call RegisterAbilityId('AImz')
                call RegisterAbilityId('AInd')
                call RegisterAbilityId('AInm')
                call RegisterAbilityId('AInv')
                call RegisterAbilityId('AIob')
                call RegisterAbilityId('AIos')
                call RegisterAbilityId('AIp1')
                call RegisterAbilityId('AIp2')
                call RegisterAbilityId('AIp3')
                call RegisterAbilityId('AIp4')
                call RegisterAbilityId('AIp5')
                call RegisterAbilityId('AIp6')
                call RegisterAbilityId('AIpb')
                call RegisterAbilityId('AIpg')
                call RegisterAbilityId('AIpl')
                call RegisterAbilityId('AIpm')
                call RegisterAbilityId('AIpr')
                call RegisterAbilityId('AIps')
                call RegisterAbilityId('AIpv')
                call RegisterAbilityId('AIpx')
                call RegisterAbilityId('AIpz')
                call RegisterAbilityId('AIra')
                call RegisterAbilityId('AIrb')
                call RegisterAbilityId('AIrc')
                call RegisterAbilityId('AIrd')
                call RegisterAbilityId('AIre')
                call RegisterAbilityId('AIri')
                call RegisterAbilityId('AIrl')
                call RegisterAbilityId('AIrm')
                call RegisterAbilityId('AIrn')
                call RegisterAbilityId('AIrr')
                call RegisterAbilityId('AIrs')
                call RegisterAbilityId('AIrt')
                call RegisterAbilityId('AIrv')
                call RegisterAbilityId('AIrx')
                call RegisterAbilityId('AIs1')
                call RegisterAbilityId('AIs2')
                call RegisterAbilityId('AIs3')
                call RegisterAbilityId('AIs4')
                call RegisterAbilityId('AIs6')
                call RegisterAbilityId('AIsa')
                call RegisterAbilityId('AIsb')
                call RegisterAbilityId('AIse')
                call RegisterAbilityId('AIsh')
                call RegisterAbilityId('AIsi')
                call RegisterAbilityId('AIsl')
                call RegisterAbilityId('AIsm')
                call RegisterAbilityId('AIso')
                call RegisterAbilityId('AIsp')
                call RegisterAbilityId('AIsr')
                call RegisterAbilityId('AIsw')
                call RegisterAbilityId('AIsx')
                call RegisterAbilityId('AIsz')
                call RegisterAbilityId('AIt6')
                call RegisterAbilityId('AIt9')
                call RegisterAbilityId('AIta')
                call RegisterAbilityId('AItb')
                call RegisterAbilityId('AItc')
                call RegisterAbilityId('AItf')
                call RegisterAbilityId('AItg')
                call RegisterAbilityId('AIth')
                call RegisterAbilityId('AIti')
                call RegisterAbilityId('AItj')
                call RegisterAbilityId('AItk')
                call RegisterAbilityId('AItl')
                call RegisterAbilityId('AItm')
                call RegisterAbilityId('AItn')
                call RegisterAbilityId('AItp')
                call RegisterAbilityId('AItx')
                call RegisterAbilityId('AIuf')
                call RegisterAbilityId('AIuv')
                call RegisterAbilityId('AIuw')
                call RegisterAbilityId('AIv1')
                call RegisterAbilityId('AIv2')
                call RegisterAbilityId('AIva')
                call RegisterAbilityId('AIvl')
                call RegisterAbilityId('AIvu')
                call RegisterAbilityId('AIwb')
                call RegisterAbilityId('AIwd')
                call RegisterAbilityId('AIwm')
                call RegisterAbilityId('AIx1')
                call RegisterAbilityId('AIx2')
                call RegisterAbilityId('AIx3')
                call RegisterAbilityId('AIx4')
                call RegisterAbilityId('AIx5')
                call RegisterAbilityId('AIxk')
                call RegisterAbilityId('AIxm')
                call RegisterAbilityId('AIxs')
                call RegisterAbilityId('AIzb')
                call RegisterAbilityId('ANab')
                call RegisterAbilityId('ANak')
                call RegisterAbilityId('ANav')
                call RegisterAbilityId('ANb2')
                call RegisterAbilityId('ANba')
                call RegisterAbilityId('ANbf')
                call RegisterAbilityId('ANbh')
                call RegisterAbilityId('ANbl')
                call RegisterAbilityId('ANbr')
                call RegisterAbilityId('ANbs')
                call RegisterAbilityId('ANbu')
                call RegisterAbilityId('ANc1')
                call RegisterAbilityId('ANc2')
                call RegisterAbilityId('ANc3')
                call RegisterAbilityId('ANca')
                call RegisterAbilityId('ANcf')
                call RegisterAbilityId('ANch')
                call RegisterAbilityId('ANcl')
                call RegisterAbilityId('ANcr')
                call RegisterAbilityId('ANcs')
                call RegisterAbilityId('ANd1')
                call RegisterAbilityId('ANd2')
                call RegisterAbilityId('ANd3')
                call RegisterAbilityId('ANdb')
                call RegisterAbilityId('ANdc')
                call RegisterAbilityId('ANde')
                call RegisterAbilityId('ANdh')
                call RegisterAbilityId('ANdo')
                call RegisterAbilityId('ANdp')
                call RegisterAbilityId('ANdr')
                call RegisterAbilityId('ANef')
                call RegisterAbilityId('ANeg')
                call RegisterAbilityId('ANen')
                call RegisterAbilityId('ANfa')
                call RegisterAbilityId('ANfb')
                call RegisterAbilityId('ANfd')
                call RegisterAbilityId('ANfl')
                call RegisterAbilityId('ANfs')
                call RegisterAbilityId('ANfy')
                call RegisterAbilityId('ANg1')
                call RegisterAbilityId('ANg2')
                call RegisterAbilityId('ANg3')
                call RegisterAbilityId('ANha')
                call RegisterAbilityId('ANhs')
                call RegisterAbilityId('ANht')
                call RegisterAbilityId('ANhw')
                call RegisterAbilityId('ANhx')
                call RegisterAbilityId('ANia')
                call RegisterAbilityId('ANic')
                call RegisterAbilityId('ANin')
                call RegisterAbilityId('ANlm')
                call RegisterAbilityId('ANmo')
                call RegisterAbilityId('ANmr')
                call RegisterAbilityId('ANms')
                call RegisterAbilityId('ANpa')
                call RegisterAbilityId('ANpi')
                call RegisterAbilityId('ANpr')
                call RegisterAbilityId('ANr2')
                call RegisterAbilityId('ANr3')
                call RegisterAbilityId('ANrc')
                call RegisterAbilityId('ANre')
                call RegisterAbilityId('ANrf')
                call RegisterAbilityId('ANrg')
                call RegisterAbilityId('ANrn')
                call RegisterAbilityId('ANs1')
                call RegisterAbilityId('ANs2')
                call RegisterAbilityId('ANs3')
                call RegisterAbilityId('ANsa')
                call RegisterAbilityId('ANsb')
                call RegisterAbilityId('ANse')
                call RegisterAbilityId('ANsg')
                call RegisterAbilityId('ANsh')
                call RegisterAbilityId('ANsi')
                call RegisterAbilityId('ANsl')
                call RegisterAbilityId('ANso')
                call RegisterAbilityId('ANsq')
                call RegisterAbilityId('ANss')
                call RegisterAbilityId('ANst')
                call RegisterAbilityId('ANsw')
                call RegisterAbilityId('ANsy')
                call RegisterAbilityId('ANt2')
                call RegisterAbilityId('ANta')
                call RegisterAbilityId('ANth')
                call RegisterAbilityId('ANtm')
                call RegisterAbilityId('ANto')
                call RegisterAbilityId('ANtr')
                call RegisterAbilityId('ANvc')
                call RegisterAbilityId('ANwk')
                call RegisterAbilityId('ANwm')
                call RegisterAbilityId('AOae')
                call RegisterAbilityId('AObu')
                call RegisterAbilityId('AOcl')
                call RegisterAbilityId('AOcr')
                call RegisterAbilityId('AOeq')
                call RegisterAbilityId('AOfs')
                call RegisterAbilityId('AOhw')
                call RegisterAbilityId('AOhx')
                call RegisterAbilityId('AOls')
                call RegisterAbilityId('AOmi')
                call RegisterAbilityId('AOr2')
                call RegisterAbilityId('AOr3')
                call RegisterAbilityId('AOre')
                call RegisterAbilityId('AOs2')
                call RegisterAbilityId('AOsf')
                call RegisterAbilityId('AOsh')
                call RegisterAbilityId('AOsw')
                call RegisterAbilityId('AOvd')
                call RegisterAbilityId('AOw2')
                call RegisterAbilityId('AOwk')
                call RegisterAbilityId('AOws')
                call RegisterAbilityId('AOww')
                call RegisterAbilityId('APdi')
                call RegisterAbilityId('APh1')
                call RegisterAbilityId('APh2')
                call RegisterAbilityId('APh3')
                call RegisterAbilityId('APmg')
                call RegisterAbilityId('APmr')
                call RegisterAbilityId('APra')
                call RegisterAbilityId('APrl')
                call RegisterAbilityId('APrr')
                call RegisterAbilityId('APsa')
                call RegisterAbilityId('APwt')
                call RegisterAbilityId('ARal')
                call RegisterAbilityId('AUan')
                call RegisterAbilityId('AUau')
                call RegisterAbilityId('AUav')
                call RegisterAbilityId('AUbu')
                call RegisterAbilityId('AUcb')
                call RegisterAbilityId('AUcs')
                call RegisterAbilityId('AUdc')
                call RegisterAbilityId('AUdd')
                call RegisterAbilityId('AUdp')
                call RegisterAbilityId('AUdr')
                call RegisterAbilityId('AUds')
                call RegisterAbilityId('AUfa')
                call RegisterAbilityId('AUfn')
                call RegisterAbilityId('AUfu')
                call RegisterAbilityId('AUim')
                call RegisterAbilityId('AUin')
                call RegisterAbilityId('AUls')
                call RegisterAbilityId('AUsl')
                call RegisterAbilityId('AUts')
                call RegisterAbilityId('Aabr')
                call RegisterAbilityId('Aabs')
                call RegisterAbilityId('Aadm')
                call RegisterAbilityId('Aaha')
                call RegisterAbilityId('Aakb')
                call RegisterAbilityId('Aall')
                call RegisterAbilityId('Aalr')
                call RegisterAbilityId('Aam2')
                call RegisterAbilityId('Aamk')
                call RegisterAbilityId('Aams')
                call RegisterAbilityId('Aap1')
                call RegisterAbilityId('Aap2')
                call RegisterAbilityId('Aap3')
                call RegisterAbilityId('Aap4')
                call RegisterAbilityId('Aasl')
                call RegisterAbilityId('Aast')
                call RegisterAbilityId('Aatk')
                call RegisterAbilityId('Aave')
                call RegisterAbilityId('Aawa')
                call RegisterAbilityId('Abdl')
                call RegisterAbilityId('Abds')
                call RegisterAbilityId('Abdt')
                call RegisterAbilityId('Abgl')
                call RegisterAbilityId('Abgm')
                call RegisterAbilityId('Abgs')
                call RegisterAbilityId('Ablo')
                call RegisterAbilityId('Ablp')
                call RegisterAbilityId('Abof')
                call RegisterAbilityId('Abrf')
                call RegisterAbilityId('Absk')
                call RegisterAbilityId('Abtl')
                call RegisterAbilityId('Abu2')
                call RegisterAbilityId('Abu3')
                call RegisterAbilityId('Abu5')
                call RegisterAbilityId('Abun')
                call RegisterAbilityId('Abur')
                call RegisterAbilityId('Acan')
                call RegisterAbilityId('Acdb')
                call RegisterAbilityId('Acdh')
                call RegisterAbilityId('Acef')
                call RegisterAbilityId('Achd')
                call RegisterAbilityId('Ache')
                call RegisterAbilityId('Achl')
                call RegisterAbilityId('Acht')
                call RegisterAbilityId('Aclf')
                call RegisterAbilityId('Acmg')
                call RegisterAbilityId('Acn2')
                call RegisterAbilityId('Acny')
                call RegisterAbilityId('Aco2')
                call RegisterAbilityId('Aco3')
                call RegisterAbilityId('Acoa')
                call RegisterAbilityId('Acoh')
                call RegisterAbilityId('Acor')
                call RegisterAbilityId('Acpf')
                call RegisterAbilityId('Acri')
                call RegisterAbilityId('Acrs')
                call RegisterAbilityId('Acyc')
                call RegisterAbilityId('Adch')
                call RegisterAbilityId('Adcn')
                call RegisterAbilityId('Adda')
                call RegisterAbilityId('Adec')
                call RegisterAbilityId('Adef')
                call RegisterAbilityId('Adev')
                call RegisterAbilityId('Adis')
                call RegisterAbilityId('Adri')
                call RegisterAbilityId('Adro')
                call RegisterAbilityId('Adsm')
                call RegisterAbilityId('Adt1')
                call RegisterAbilityId('Adtg')
                call RegisterAbilityId('Adtn')
                call RegisterAbilityId('Adts')
                call RegisterAbilityId('Advc')
                call RegisterAbilityId('Advm')
                call RegisterAbilityId('Aeat')
                call RegisterAbilityId('Aegm')
                call RegisterAbilityId('Aegr')
                call RegisterAbilityId('Aenc')
                call RegisterAbilityId('Aenr')
                call RegisterAbilityId('Aens')
                call RegisterAbilityId('Aent')
                call RegisterAbilityId('Aenw')
                call RegisterAbilityId('Aesn')
                call RegisterAbilityId('Aesr')
                call RegisterAbilityId('Aetf')
                call RegisterAbilityId('Aeth')
                call RegisterAbilityId('Aetl')
                call RegisterAbilityId('Aexh')
                call RegisterAbilityId('Aeye')
                call RegisterAbilityId('Afa2')
                call RegisterAbilityId('Afae')
                call RegisterAbilityId('Afak')
                call RegisterAbilityId('Afbb')
                call RegisterAbilityId('Afbk')
                call RegisterAbilityId('Afbt')
                call RegisterAbilityId('Afih')
                call RegisterAbilityId('Afin')
                call RegisterAbilityId('Afio')
                call RegisterAbilityId('Afir')
                call RegisterAbilityId('Afiu')
                call RegisterAbilityId('Afla')
                call RegisterAbilityId('Aflk')
                call RegisterAbilityId('Afod')
                call RegisterAbilityId('Afr2')
                call RegisterAbilityId('Afra')
                call RegisterAbilityId('Afrb')
                call RegisterAbilityId('Afrz')
                call RegisterAbilityId('Afsh')
                call RegisterAbilityId('Afzy')
                call RegisterAbilityId('Agho')
                call RegisterAbilityId('Agld')
                call RegisterAbilityId('Agra')
                call RegisterAbilityId('Agyb')
                call RegisterAbilityId('Agyd')
                call RegisterAbilityId('Agyv')
                call RegisterAbilityId('Ahar')
                call RegisterAbilityId('Ahea')
                call RegisterAbilityId('Ahid')
                call RegisterAbilityId('Ahnl')
                call RegisterAbilityId('Ahr2')
                call RegisterAbilityId('Ahr3')
                call RegisterAbilityId('Ahrl')
                call RegisterAbilityId('Ahrp')
                call RegisterAbilityId('Ahwd')
                call RegisterAbilityId('Aien')
                call RegisterAbilityId('Aihn')
                call RegisterAbilityId('Aimp')
                call RegisterAbilityId('Ainf')
                call RegisterAbilityId('Aion')
                call RegisterAbilityId('Aiun')
                call RegisterAbilityId('Aivs')
                call RegisterAbilityId('Alam')
                call RegisterAbilityId('Aliq')
                call RegisterAbilityId('Alit')
                call RegisterAbilityId('Aloa')
                call RegisterAbilityId('Aloc')
                call RegisterAbilityId('Alsh')
                call RegisterAbilityId('Amb2')
                call RegisterAbilityId('Ambb')
                call RegisterAbilityId('Ambd')
                call RegisterAbilityId('Ambt')
                call RegisterAbilityId('Amdf')
                call RegisterAbilityId('Amec')
                call RegisterAbilityId('Amed')
                call RegisterAbilityId('Amel')
                call RegisterAbilityId('Amfl')
                call RegisterAbilityId('Amgl')
                call RegisterAbilityId('Amgr')
                call RegisterAbilityId('Amic')
                call RegisterAbilityId('Amil')
                call RegisterAbilityId('Amim')
                call RegisterAbilityId('Amin')
                call RegisterAbilityId('Amls')
                call RegisterAbilityId('Amnb')
                call RegisterAbilityId('Amnx')
                call RegisterAbilityId('Amnz')
                call RegisterAbilityId('Amov')
                call RegisterAbilityId('Amrf')
                call RegisterAbilityId('Andm')
                call RegisterAbilityId('Andt')
                call RegisterAbilityId('Ane2')
                call RegisterAbilityId('Aneu')
                call RegisterAbilityId('Anh1')
                call RegisterAbilityId('Anh2')
                call RegisterAbilityId('Anhe')
                call RegisterAbilityId('Ansk')
                call RegisterAbilityId('Ansp')
                call RegisterAbilityId('Aoar')
                call RegisterAbilityId('Apak')
                call RegisterAbilityId('Apg2')
                call RegisterAbilityId('Aphx')
                call RegisterAbilityId('Apig')
                call RegisterAbilityId('Apit')
                call RegisterAbilityId('Apiv')
                call RegisterAbilityId('Aply')
                call RegisterAbilityId('Apmf')
                call RegisterAbilityId('Apo2')
                call RegisterAbilityId('Apoi')
                call RegisterAbilityId('Apos')
                call RegisterAbilityId('Aprg')
                call RegisterAbilityId('Aps2')
                call RegisterAbilityId('Apsh')
                call RegisterAbilityId('Apts')
                call RegisterAbilityId('Apxf')
                call RegisterAbilityId('Ara2')
                call RegisterAbilityId('Arai')
                call RegisterAbilityId('Arav')
                call RegisterAbilityId('Arbr')
                call RegisterAbilityId('Arej')
                call RegisterAbilityId('Arel')
                call RegisterAbilityId('Aren')
                call RegisterAbilityId('Arep')
                call RegisterAbilityId('Aret')
                call RegisterAbilityId('Arev')
                call RegisterAbilityId('Argd')
                call RegisterAbilityId('Argl')
                call RegisterAbilityId('Arll')
                call RegisterAbilityId('Arlm')
                call RegisterAbilityId('Arng')
                call RegisterAbilityId('Aro1')
                call RegisterAbilityId('Aro2')
                call RegisterAbilityId('Aroa')
                call RegisterAbilityId('Aroc')
                call RegisterAbilityId('Arpb')
                call RegisterAbilityId('Arpl')
                call RegisterAbilityId('Arpm')
                call RegisterAbilityId('Arsg')
                call RegisterAbilityId('Arsk')
                call RegisterAbilityId('Arsp')
                call RegisterAbilityId('Arsq')
                call RegisterAbilityId('Arst')
                call RegisterAbilityId('Arsw')
                call RegisterAbilityId('Asac')
                call RegisterAbilityId('Asal')
                call RegisterAbilityId('Asb1')
                call RegisterAbilityId('Asb2')
                call RegisterAbilityId('Asb3')
                call RegisterAbilityId('Asd2')
                call RegisterAbilityId('Asd3')
                call RegisterAbilityId('Asdg')
                call RegisterAbilityId('Asds')
                call RegisterAbilityId('Ashm')
                call RegisterAbilityId('Ashs')
                call RegisterAbilityId('Asid')
                call RegisterAbilityId('Asla')
                call RegisterAbilityId('Aslo')
                call RegisterAbilityId('Aslp')
                call RegisterAbilityId('Asod')
                call RegisterAbilityId('Asou')
                call RegisterAbilityId('Asp1')
                call RegisterAbilityId('Asp2')
                call RegisterAbilityId('Asp3')
                call RegisterAbilityId('Asp4')
                call RegisterAbilityId('Asp5')
                call RegisterAbilityId('Asp6')
                call RegisterAbilityId('Aspa')
                call RegisterAbilityId('Aspb')
                call RegisterAbilityId('Aspd')
                call RegisterAbilityId('Asph')
                call RegisterAbilityId('Aspi')
                call RegisterAbilityId('Aspl')
                call RegisterAbilityId('Aspo')
                call RegisterAbilityId('Aspp')
                call RegisterAbilityId('Asps')
                call RegisterAbilityId('Aspt')
                call RegisterAbilityId('Aspy')
                call RegisterAbilityId('Assk')
                call RegisterAbilityId('Assp')
                call RegisterAbilityId('Asta')
                call RegisterAbilityId('Astd')
                call RegisterAbilityId('Aste')
                call RegisterAbilityId('Asth')
                call RegisterAbilityId('Astn')
                call RegisterAbilityId('Asud')
                call RegisterAbilityId('Atau')
                call RegisterAbilityId('Atdg')
                call RegisterAbilityId('Atdp')
                call RegisterAbilityId('Atlp')
                call RegisterAbilityId('Atol')
                call RegisterAbilityId('Atru')
                call RegisterAbilityId('Atsp')
                call RegisterAbilityId('Attu')
                call RegisterAbilityId('Atwa')
                call RegisterAbilityId('Auco')
                call RegisterAbilityId('Auhf')
                call RegisterAbilityId('Ault')
                call RegisterAbilityId('Auns')
                call RegisterAbilityId('Aven')
                call RegisterAbilityId('Avng')
                call RegisterAbilityId('Avul')
                call RegisterAbilityId('Awan')
                call RegisterAbilityId('Awar')
                call RegisterAbilityId('Aweb')
                call RegisterAbilityId('Awfb')
                call RegisterAbilityId('Awh2')
                call RegisterAbilityId('Awha')
                call RegisterAbilityId('Awrg')
                call RegisterAbilityId('Awrh')
                call RegisterAbilityId('Awrp')
                call RegisterAbilityId('Awrs')
            elseif ( 2 == index ) then
                // After custom 'S' abilities
                call RegisterAbilityId('SCae')
                call RegisterAbilityId('SCc1')
                call RegisterAbilityId('SCva')
                call RegisterAbilityId('SNdc')
                call RegisterAbilityId('SNdd')
                call RegisterAbilityId('SNeq')
                call RegisterAbilityId('SNin')
                call RegisterAbilityId('Sbsk')
                call RegisterAbilityId('Sbtl')
                call RegisterAbilityId('Sca1')
                call RegisterAbilityId('Sca2')
                call RegisterAbilityId('Sca3')
                call RegisterAbilityId('Sca4')
                call RegisterAbilityId('Sca5')
                call RegisterAbilityId('Sca6')
                call RegisterAbilityId('Sch2')
                call RegisterAbilityId('Sch3')
                call RegisterAbilityId('Sch4')
                call RegisterAbilityId('Sch5')
                call RegisterAbilityId('Scri')
                call RegisterAbilityId('Sdro')
                call RegisterAbilityId('Slo2')
                call RegisterAbilityId('Slo3')
                call RegisterAbilityId('Sloa')
                call RegisterAbilityId('Srtt')
                call RegisterAbilityId('Sshm')
                call RegisterAbilityId('Suhf')
            endif
        endmethod

        method onStart takes nothing returns nothing
            set DummyUnit = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), DUMMY_UNIT_ID, 0, 0, 0)
            set scanRangePrefixes = "AS"
        endmethod

        method onEnd takes nothing returns nothing
            local staticIdList abilities = GetAllAbilityIds()
            call BJDebugMsg( "AbilityIdScanner - Total ids: " + I2S( abilities.size() ) + " (" + I2S(succeedCounter) + " customs)" )
            call RemoveUnit(DummyUnit)
        endmethod


    endstruct

endlibrary

BuffIdScanner
JASS:
/*
BuffIdScanner lib v1.0.0 (21/10/2019) by Ricola3D

Content:
Id scanner for World Editor buffs.
*/
library BuffIdScanner requires IdScanner

    //! runtextmacro DECL_NEW_SCANNER_TYPE ("BuffIdScanner")

    /*
    */
    struct BuffIdScanner extends AbstractIdScanner

        method saveId takes integer index, integer id returns nothing
            call RegisterBuffId(id)
        endmethod

        /*
        239 hardcoded standard Buffs, sorted by increasing value
        */
        method saveStandardRange takes integer index returns nothing
            if ( 0 == index ) then
                // Before custom 'B' abilities
                call RegisterBuffId('AEsd')
                call RegisterBuffId('AEtr')
                call RegisterBuffId('ANmd')
            elseif ( 1 == index ) then
                // Between custom 'B' and 'X' abilities
                call RegisterBuffId('BCbf')
                call RegisterBuffId('BCtc')
                call RegisterBuffId('BEah')
                call RegisterBuffId('BEar')
                call RegisterBuffId('BEer')
                call RegisterBuffId('BEfn')
                call RegisterBuffId('BEia')
                call RegisterBuffId('BEim')
                call RegisterBuffId('BEme')
                call RegisterBuffId('BEsh')
                call RegisterBuffId('BEst')
                call RegisterBuffId('BEsv')
                call RegisterBuffId('BFig')
                call RegisterBuffId('BHab')
                call RegisterBuffId('BHad')
                call RegisterBuffId('BHav')
                call RegisterBuffId('BHbd')
                call RegisterBuffId('BHbn')
                call RegisterBuffId('BHbz')
                call RegisterBuffId('BHca')
                call RegisterBuffId('BHds')
                call RegisterBuffId('BHfs')
                call RegisterBuffId('BHtc')
                call RegisterBuffId('BHwe')
                call RegisterBuffId('BIcb')
                call RegisterBuffId('BIcf')
                call RegisterBuffId('BIhm')
                call RegisterBuffId('BIil')
                call RegisterBuffId('BImo')
                call RegisterBuffId('BIpv')
                call RegisterBuffId('BIrb')
                call RegisterBuffId('BIrg')
                call RegisterBuffId('BIrl')
                call RegisterBuffId('BIrm')
                call RegisterBuffId('BIsh')
                call RegisterBuffId('BIsv')
                call RegisterBuffId('BIwb')
                call RegisterBuffId('BNab')
                call RegisterBuffId('BNba')
                call RegisterBuffId('BNbf')
                call RegisterBuffId('BNbr')
                call RegisterBuffId('BNcg')
                call RegisterBuffId('BNcr')
                call RegisterBuffId('BNcs')
                call RegisterBuffId('BNdc')
                call RegisterBuffId('BNdh')
                call RegisterBuffId('BNdi')
                call RegisterBuffId('BNdm')
                call RegisterBuffId('BNdo')
                call RegisterBuffId('BNef')
                call RegisterBuffId('BNeg')
                call RegisterBuffId('BNfy')
                call RegisterBuffId('BNhs')
                call RegisterBuffId('BNht')
                call RegisterBuffId('BNic')
                call RegisterBuffId('BNin')
                call RegisterBuffId('BNlm')
                call RegisterBuffId('BNmr')
                call RegisterBuffId('BNms')
                call RegisterBuffId('BNpa')
                call RegisterBuffId('BNpi')
                call RegisterBuffId('BNpm')
                call RegisterBuffId('BNrd')
                call RegisterBuffId('BNrf')
                call RegisterBuffId('BNsa')
                call RegisterBuffId('BNsg')
                call RegisterBuffId('BNsi')
                call RegisterBuffId('BNsl')
                call RegisterBuffId('BNso')
                call RegisterBuffId('BNsq')
                call RegisterBuffId('BNss')
                call RegisterBuffId('BNst')
                call RegisterBuffId('BNsw')
                call RegisterBuffId('BNtm')
                call RegisterBuffId('BNto')
                call RegisterBuffId('BNva')
                call RegisterBuffId('BNvc')
                call RegisterBuffId('BNwm')
                call RegisterBuffId('BOac')
                call RegisterBuffId('BOae')
                call RegisterBuffId('BOea')
                call RegisterBuffId('BOeq')
                call RegisterBuffId('BOhx')
                call RegisterBuffId('BOmi')
                call RegisterBuffId('BOsf')
                call RegisterBuffId('BOsh')
                call RegisterBuffId('BOvc')
                call RegisterBuffId('BOvd')
                call RegisterBuffId('BOwd')
                call RegisterBuffId('BOwk')
                call RegisterBuffId('BOww')
                call RegisterBuffId('BPSE')
                call RegisterBuffId('BSTN')
                call RegisterBuffId('BUad')
                call RegisterBuffId('BUan')
                call RegisterBuffId('BUau')
                call RegisterBuffId('BUav')
                call RegisterBuffId('BUcb')
                call RegisterBuffId('BUcs')
                call RegisterBuffId('BUdd')
                call RegisterBuffId('BUfa')
                call RegisterBuffId('BUim')
                call RegisterBuffId('BUsl')
                call RegisterBuffId('BUsp')
                call RegisterBuffId('BUst')
                call RegisterBuffId('BUts')
                call RegisterBuffId('Babr')
                call RegisterBuffId('Bakb')
                call RegisterBuffId('Bam2')
                call RegisterBuffId('Bams')
                call RegisterBuffId('Bapl')
                call RegisterBuffId('Barm')
                call RegisterBuffId('Basl')
                call RegisterBuffId('Bbar')
                call RegisterBuffId('Bblo')
                call RegisterBuffId('Bbof')
                call RegisterBuffId('Bbsk')
                call RegisterBuffId('Bchd')
                call RegisterBuffId('Bclf')
                call RegisterBuffId('Bcmg')
                call RegisterBuffId('Bcor')
                call RegisterBuffId('Bcri')
                call RegisterBuffId('Bcrs')
                call RegisterBuffId('Bcsd')
                call RegisterBuffId('Bcsi')
                call RegisterBuffId('Bcy2')
                call RegisterBuffId('Bcyc')
                call RegisterBuffId('Bdcb')
                call RegisterBuffId('Bdcl')
                call RegisterBuffId('Bdcm')
                call RegisterBuffId('Bdef')
                call RegisterBuffId('Bdet')
                call RegisterBuffId('Bdig')
                call RegisterBuffId('Bdtb')
                call RegisterBuffId('Bdtl')
                call RegisterBuffId('Bdtm')
                call RegisterBuffId('Bdvv')
                call RegisterBuffId('Beat')
                call RegisterBuffId('Bena')
                call RegisterBuffId('Beng')
                call RegisterBuffId('Bens')
                call RegisterBuffId('Beye')
                call RegisterBuffId('Bfae')
                call RegisterBuffId('Bfre')
                call RegisterBuffId('Bfro')
                call RegisterBuffId('Bfrz')
                call RegisterBuffId('Bfzy')
                call RegisterBuffId('Bgra')
                call RegisterBuffId('Bhea')
                call RegisterBuffId('Bhwd')
                call RegisterBuffId('Binf')
                call RegisterBuffId('Binv')
                call RegisterBuffId('Bivs')
                call RegisterBuffId('Bliq')
                call RegisterBuffId('Blsa')
                call RegisterBuffId('Blsh')
                call RegisterBuffId('Bmec')
                call RegisterBuffId('Bmfa')
                call RegisterBuffId('Bmfl')
                call RegisterBuffId('Bmil')
                call RegisterBuffId('Bmlc')
                call RegisterBuffId('Bmlt')
                call RegisterBuffId('Boar')
                call RegisterBuffId('Bphx')
                call RegisterBuffId('Bpig')
                call RegisterBuffId('Bplg')
                call RegisterBuffId('Bply')
                call RegisterBuffId('Bpoc')
                call RegisterBuffId('Bpoi')
                call RegisterBuffId('Bpos')
                call RegisterBuffId('Bprg')
                call RegisterBuffId('Bps1')
                call RegisterBuffId('Bpsd')
                call RegisterBuffId('Bpsh')
                call RegisterBuffId('Bpsi')
                call RegisterBuffId('Bpxf')
                call RegisterBuffId('Brai')
                call RegisterBuffId('Brej')
                call RegisterBuffId('Broa')
                call RegisterBuffId('Brpb')
                call RegisterBuffId('Brpl')
                call RegisterBuffId('Brpm')
                call RegisterBuffId('Bsha')
                call RegisterBuffId('Bshs')
                call RegisterBuffId('Bslo')
                call RegisterBuffId('Bspa')
                call RegisterBuffId('Bspe')
                call RegisterBuffId('Bspl')
                call RegisterBuffId('Bspo')
                call RegisterBuffId('Bssd')
                call RegisterBuffId('Bssi')
                call RegisterBuffId('Bstt')
                call RegisterBuffId('Btdg')
                call RegisterBuffId('Btrv')
                call RegisterBuffId('Btsa')
                call RegisterBuffId('Btsp')
                call RegisterBuffId('Buhf')
                call RegisterBuffId('Bult')
                call RegisterBuffId('Buns')
                call RegisterBuffId('Bvng')
                call RegisterBuffId('Bvul')
                call RegisterBuffId('Bwea')
                call RegisterBuffId('Bweb')
            elseif ( 2 == index ) then
                // After custom 'X' abilities
                call RegisterBuffId('XErc')
                call RegisterBuffId('XErf')
                call RegisterBuffId('XEsf')
                call RegisterBuffId('XEtq')
                call RegisterBuffId('XHbz')
                call RegisterBuffId('XHfs')
                call RegisterBuffId('XIct')
                call RegisterBuffId('XNcs')
                call RegisterBuffId('XNhs')
                call RegisterBuffId('XNmo')
                call RegisterBuffId('XNvc')
                call RegisterBuffId('XOeq')
                call RegisterBuffId('XOre')
                call RegisterBuffId('XUdd')
                call RegisterBuffId('Xbdt')
                call RegisterBuffId('Xbli')
                call RegisterBuffId('Xbof')
                call RegisterBuffId('Xclf')
                call RegisterBuffId('Xdis')
                call RegisterBuffId('Xesn')
                call RegisterBuffId('Xfhl')
                call RegisterBuffId('Xfhm')
                call RegisterBuffId('Xfhs')
                call RegisterBuffId('Xfla')
                call RegisterBuffId('Xfnl')
                call RegisterBuffId('Xfnm')
                call RegisterBuffId('Xfns')
                call RegisterBuffId('Xfol')
                call RegisterBuffId('Xfom')
                call RegisterBuffId('Xfos')
                call RegisterBuffId('Xful')
                call RegisterBuffId('Xfum')
                call RegisterBuffId('Xfus')
            endif
        endmethod

        method onStart takes nothing returns nothing
            set scanRangePrefixes = "BX"
        endmethod

        method onEnd takes nothing returns nothing
            local staticIdList Buffs = GetAllBuffIds()
            call BJDebugMsg( "BuffIdScanner - Total ids: " + I2S( Buffs.size() ) + " (" + I2S(succeedCounter) + " customs)" )
        endmethod

    endstruct

endlibrary

UpgradeIdScanner
JASS:
/*
UpgradeIdScanner lib v1.0.0 (21/10/2019) by Ricola3D

Content:
Id scanner for World Editor upgrades.
*/
library UpgradeIdScanner requires IdScanner

    //! runtextmacro DECL_NEW_SCANNER_TYPE ("UpgradeIdScanner")

    /*
    */
    struct UpgradeIdScanner extends AbstractIdScanner

        method saveId takes integer index, integer id returns nothing
            call RegisterUpgradeId(id)
        endmethod

        /*
        90 hardcoded standard Upgrades, sorted by increasing value
        */
        method saveStandardRange takes integer index returns nothing
            if ( 1 == index ) then
                // After custom 'R' abilities
                call RegisterUpgradeId('Recb')
                call RegisterUpgradeId('Redc')
                call RegisterUpgradeId('Redt')
                call RegisterUpgradeId('Reeb')
                call RegisterUpgradeId('Reec')
                call RegisterUpgradeId('Rehs')
                call RegisterUpgradeId('Reht')
                call RegisterUpgradeId('Reib')
                call RegisterUpgradeId('Rema')
                call RegisterUpgradeId('Remg')
                call RegisterUpgradeId('Remk')
                call RegisterUpgradeId('Renb')
                call RegisterUpgradeId('Repb')
                call RegisterUpgradeId('Repm')
                call RegisterUpgradeId('Rerh')
                call RegisterUpgradeId('Rers')
                call RegisterUpgradeId('Resc')
                call RegisterUpgradeId('Resi')
                call RegisterUpgradeId('Resm')
                call RegisterUpgradeId('Resw')
                call RegisterUpgradeId('Reuv')
                call RegisterUpgradeId('Rews')
                call RegisterUpgradeId('Rgfo')
                call RegisterUpgradeId('Rguv')
                call RegisterUpgradeId('Rhac')
                call RegisterUpgradeId('Rhan')
                call RegisterUpgradeId('Rhar')
                call RegisterUpgradeId('Rhcd')
                call RegisterUpgradeId('Rhde')
                call RegisterUpgradeId('Rhfc')
                call RegisterUpgradeId('Rhfl')
                call RegisterUpgradeId('Rhfs')
                call RegisterUpgradeId('Rhgb')
                call RegisterUpgradeId('Rhhb')
                call RegisterUpgradeId('Rhla')
                call RegisterUpgradeId('Rhlh')
                call RegisterUpgradeId('Rhme')
                call RegisterUpgradeId('Rhpm')
                call RegisterUpgradeId('Rhpt')
                call RegisterUpgradeId('Rhra')
                call RegisterUpgradeId('Rhri')
                call RegisterUpgradeId('Rhrt')
                call RegisterUpgradeId('Rhsb')
                call RegisterUpgradeId('Rhse')
                call RegisterUpgradeId('Rhss')
                call RegisterUpgradeId('Rhst')
                call RegisterUpgradeId('Rnam')
                call RegisterUpgradeId('Rnat')
                call RegisterUpgradeId('Rnen')
                call RegisterUpgradeId('Rnsb')
                call RegisterUpgradeId('Rnsi')
                call RegisterUpgradeId('Rnsw')
                call RegisterUpgradeId('Roar')
                call RegisterUpgradeId('Robf')
                call RegisterUpgradeId('Robk')
                call RegisterUpgradeId('Robs')
                call RegisterUpgradeId('Roch')
                call RegisterUpgradeId('Roen')
                call RegisterUpgradeId('Rolf')
                call RegisterUpgradeId('Rome')
                call RegisterUpgradeId('Ropg')
                call RegisterUpgradeId('Ropm')
                call RegisterUpgradeId('Rora')
                call RegisterUpgradeId('Rorb')
                call RegisterUpgradeId('Rosp')
                call RegisterUpgradeId('Rost')
                call RegisterUpgradeId('Rotr')
                call RegisterUpgradeId('Rovs')
                call RegisterUpgradeId('Rowd')
                call RegisterUpgradeId('Rows')
                call RegisterUpgradeId('Rowt')
                call RegisterUpgradeId('Ruac')
                call RegisterUpgradeId('Ruar')
                call RegisterUpgradeId('Ruba')
                call RegisterUpgradeId('Rubu')
                call RegisterUpgradeId('Rucr')
                call RegisterUpgradeId('Ruex')
                call RegisterUpgradeId('Rufb')
                call RegisterUpgradeId('Rugf')
                call RegisterUpgradeId('Rume')
                call RegisterUpgradeId('Rune')
                call RegisterUpgradeId('Rupc')
                call RegisterUpgradeId('Rupm')
                call RegisterUpgradeId('Rura')
                call RegisterUpgradeId('Rusf')
                call RegisterUpgradeId('Rusl')
                call RegisterUpgradeId('Rusm')
                call RegisterUpgradeId('Rusp')
                call RegisterUpgradeId('Ruwb')
                call RegisterUpgradeId('Rwdm')
            endif
        endmethod

        method onStart takes nothing returns nothing
            set scanRangePrefixes = "R"
        endmethod

        method onEnd takes nothing returns nothing
            local staticIdList Upgrades = GetAllUpgradeIds()
            call BJDebugMsg( "UpgradeIdScanner - Total ids: " + I2S( Upgrades.size() ) + " (" + I2S(succeedCounter) + " customs)" )
        endmethod

    endstruct

endlibrary

IdScanLauncher
JASS:
/*
IdScanLauncher lib v1.0.0 (21/10/2019) by Ricola3D

Content:
Minimalist library to launch ID scan as soon as game starts and all scanners are registered.
If you want to control when scan starts, disable this trigger, and call IdScannerManager.Start() yourself.
*/
library IdScanLauncher requires IdScanner, optional UnitIdScanner, optional ItemIdScanner, optional DestructibleIdScanner, optional DoodadIdScanner, optional AbilityIdScanner, optional BuffIdScanner, optional UpgradeIdScanner


    private module M
        private static method onInit takes nothing returns nothing
            call IdScannerManager.Start()
        endmethod
    endmodule
    private struct S extends array
        implement M
    endstruct

endlibrary

Similar project I was inspired of
List Unit Abilities (by IcemanBo)
 

Attachments

  • Test Id Lib.w3x
    267.5 KB · Views: 88
Last edited:
Level 39
Joined
Feb 27, 2007
Messages
4,994
As a developer I have access to all of this information in the OE already. What is a use case where I would need to know this information at runtime and couldn't just hardcode with the info I know from the OE? I really don't see it.
  • Cloning a unit that has arbitrary abilities? List Unit Abilities does that already.
  • Check what buffs a unit has? No, I would just check for the few specific buffs relevant to the code I'm running.
  • Counting unit buffs? Okay but why would that be needed?
  • Randomize a doodad from all the extant destructibles in a map? But that would include all the default OE destructibles which might not be present in the map.
  • Doodads? They can't be placed or modified with code, only have their animation set.
  • Place random item? Again this includes all default wc3 items. There are also itempools for that.
  • Check which item types a unit has? There are already ways to get this info and doing that 6 times is trivial.
  • Unit ids: already easy to get, and placing a random one would again include wc3 defaults which I might or might not want.
I'm aware it's easy to comment out any/all of the default objects in the setup modules.
 
I'm also not sure of a use case for all object ids of all types, but I still find it cool. :D

Maybe there can be a seperate getter for a list for custom-only ids? For a custom map I think it's good practice in general to create new abilities instead of modifying standard ones. And so for example it would make it easy to preload all custom abilities, without having to loop over standard abilities.

From Id scanner docu:
// You cannot activate/unactivate any "XxxxIdScanner" available with right-click > Enable/Disable Trigger.
"cannot" should maybe be "can". :p
 
Level 12
Joined
Feb 27, 2019
Messages
399
As a developer I have access to all of this information in the OE already. [...]

Hardcoding custom objects would be very demanding to maintain and very likely for errors/memory lapses ^^
List Unit Abilities currently requires an very long freeze at game start to compute all ability IDs (>30s)
Indeed for Doodads I don't think it is usefull currently, so you can disable it ^^

Here are the uses I see for the moment:
- Get unit ability ID list
- Get unit buff ID list
- Get unit upgrade ID list & levels
- Get items ability ID list
- Indexers for abilities/buffs (for systems that prefer arrays on hashtables)
- Automatically spend hero skill-points
- System to unlearn/learn hero abilities

I'm also not sure of a use case for all object ids of all types, but I still find it cool. :D [...]

Indeed it would be easy to separate standard and custom IDs with 2 getters.
Thanks for seeing the "cannot" error :)
 
Status
Not open for further replies.
Top