Base/Core abilities of the game

Status
Not open for further replies.
Level 10
Joined
Aug 1, 2023
Messages
48
Warcraft 3 provides many abilities that can be seen in the Object Editor/Abilities tab. But some of these abilities are just copies of some other base/core ability.

For example, the 'ANrf' (Rain of Fire) ability is based on the 'AHbz' (Blizzard) ability but uses different numbers for damage and different buffs/effects.
Both 'AHwe' (Summon Water Elemental) and 'AOsf' (Feral Spirit) are the exact same ability but they summon different types and number of units.
I think the following abilities are variations of the 'Adef' (Defend) ability: 'Amdf' (Magic Defense), 'AIdd' (Defend (item)), 'Aegr' (Elune's Grace).
'ACbf' (Breath of Frost), 'ANbf' (Breath of Fire) and 'ACbc' (Breath of Fire (Neutral Hostile) are just variations of some base ability.
And so on, and so on.

My question is, which are the base/core abilities of the game?
 
Level 19
Joined
Mar 16, 2008
Messages
798
I think the best way to answer this question is how do AI Players treat each ability. Each spell has a certain condition that it will be cast. Perhaps we can group spells by similar conditions and then determine what ones are base. I kinda agree with the above post tho.

 
Why would they copy the code of the "base/core" ability, when they can just add an entry in some '.slk' files (abilitydata.slk?) and somehow link it to the "base/core" ability?
As an example, Feral Spirit and the Summon Water Elemental skill are not the same in the manner you suggested. Feral Spirit will kill/dispel previously summoned units when cast a second time, whereas Summon Water Elemental is a repeatable skill that leaves behind previously summoned elementals.

As Uncle mentioned, I would much prefer that these functionality differences were available to modders both to view the code and also to alter them from maps or mods. To that end, I have been building an open source game client to play a Warcraft 3 style experience but entirely from moddifiable code, so that modding would be easier.

This video might be an example why a programmer in 2003 might have just copy-pasted one of his files to make a modified version. It is simply a "pretty easy" thing to do.

Here you can see that my Summon Water Elemental implementation was indeed copied to make my Feral Spirit, but I added a kill function to previously summoned units on Feral Spirit:

Summon Water Elemental:
Summon Feral Spirit:

However, as a note, I am not Blizzard Entertainment and I do not have access to their original game code, nor have I spent time trying to gain access. So, for all I know, the idea that these are a "copy paste" job might only be a user assumption. What if they were not a copy paste, but rather two code files that shared behavior using the class hierarchy?

As an example, my Summon Owl Scout code did not need special behaviors, unlike Feral Spirit. So, rather than to copy Summon Water Elemental, I simply extended its class and modified the base order id. Who knows if Blizzard did this in 2002, but the point is that they could have and we would not know.

Summon Owl Scout (super tiny file for above listed reason!):

Why would they copy the code of the "base/core" ability, when they can just add an entry in some '.slk' files (abilitydata.slk?) and somehow link it to the "base/core" ability?
Basically, I think my Owl Scout example above answers this question. Let me know if that makes sense. For the internal Blizzard programmer, he can link the C++ classes using standard code sharing practices -- such as classes that extend other classes or simply calling shared utility functions/subroutines.

Edit: As another example, although this does not exactly match Warcraft 3 behaviors, I was too lazy to even make a code file for the Firebolt skill and instead in my table of possible "base" skills available to SLK, I put the Storm Bolt code file (currently named Thunder Bolt) as the one used for both AHtb but also for ANfb:
So, with that in mind, I do not even really know for certain if Warcraft 3 requires each base skill to have its own code file. Maybe some of them reuse files.
 
Last edited:
Level 10
Joined
Aug 1, 2023
Messages
48
As an example, Feral Spirit and the Summon Water Elemental skill are not the same in the manner you suggested. Feral Spirit will kill/dispel previously summoned units when cast a second time, whereas Summon Water Elemental is a repeatable skill that leaves behind previously summoned elementals.
Right. Bad example.

Edit: As another example, although this does not exactly match Warcraft 3 behaviors, I was too lazy to even make a code file for the Firebolt skill and instead in my table of possible "base" skills available to SLK, I put the Storm Bolt code file (currently named Thunder Bolt) as the one used for both AHtb but also for ANfb:

Okay let's look at all these "storm bolt like" abilities:
* 'AHtb' (Storm Bolt)
* 'ACtb' (Hurl Boulder)
* 'ACfb' (Firebolt (Neutral Hostile))
* 'ANfb' (Firebolt (Neutral Hostile))
* 'Awfb' (Firebolt (Warlock))

In the "abilitydata.slk" file the first 2 columns are "alias" and "code".
The 'AHtb' ability has alias='AHtb' and code='AHtb'.
The 'ACtb' ability has alias='ACtb' and code='ACtb'.
The 'ACfb' ability has alias='ACfb' and code='ANfb'.
The 'ANfb' ability has alias='ANfb' and code='ANfb'.
The 'Awfb' ability has alias='Awfb' and code='ANfb'.

My guess is that when these 2 columns have the same value then this is an ability that is implemented in the game engine, otherwise the ability is just an "alias" for the other ability.
Of course, the game engine could just be calling the same functions internally, but that's outside of the scope of this thread.

So, if that's the case, then these are the "base/core" abilities from the perspective of the Object Editor:
AHbz
AHab
AHmt
AHwe
ANst
ANsg
ANsq
ANsw
AOww
AOcr
AOmi
AOwk
AHbn
AHfs
AHdr
AHpx
AUcb
AUim
AUls
AUts
ANba
ANch
ANsi
AUan
AUdc
AUdp
AUau
AEev
AEim
AEmb
AEme
AUsl
AUav
AUcs
AUin
AOcl
AOeq
AOfs
AOsf
AEer
AEfn
AEah
AEtq
AUdr
AUdd
AUfa
AUfu
AUfn
AHav
AHbh
AHtb
AHtc
ANfl
ANto
ANms
AHad
AHds
AHhb
AHre
ANbf
ANdb
ANdh
ANef
ANdo
ANht
ANca
ANrf
AHfa
AEst
AEsf
AEar
AOae
AOre
AOsh
AOws
AOhw
AOhx
AOvd
AEbl
AEfk
AEsh
AEsv
ANab
ANcr
ANhs
ANtm
ANeg
ANcs
ANrg
ANsy
ANde
ANic
ANia
ANso
ANlm
ANvc
ANin
ANfb
ANfd
ANdp
ANrc
ANdc
ANsl
ANmo
AEpa
ANwm
AHca
ANbr
Aamk
ANcl
Aadm
Aabs
Aaha
Aalr
Aall
Aast
ACad
Aams
Aatk
Aoar
Aabr
Aasl
Aakb
Aave
Aawa
Abof
Abtl
Abrf
Absk
Abgm
Ablo
ACbf
ANbu
AHbu
AObu
AEbu
AUbu
AGbu
Abur
Abdt
Acan
Abun
Advc
Aenc
Achd
Achl
Aclf
Acmg
Acpf
Acor
Acoa
Acoh
ACsp
Acri
Acrs
Acyc
Adda
Adec
Adef
Atru
Agyv
Adts
Adtn
Adev
ACdv
Advm
Adch
Adis
Adri
Adro
Atdp
Aeat
Aens
Aent
Aegm
Aetl
Aetf
Aexh
ANfy
Afae
Afbk
Aflk
Afla
Afsh
Afrz
Afzy
Afra
Afrb
Agho
Aeth
Agld
Agra
Agyd
Agyb
Assk
Ahar
Ahrl
Ahea
Anhe
Ahwd
AHer
Aimp
Ainf
Aivs
AInv
Avul
Alit
Alsh
Aliq
Aloa
Atlp
Aloc
Amdf
Amim
Amls
Ambt
Amfl
Amed
Amel
Amil
Amic
ANmr
Amin
Amgl
Amov
Aneu
Andt
AAns
Ansp
Afak
Afir
Afih
Afio
Afin
Afiu
ANpa
ANpi
Apig
Apiv
Apsh
Aphx
Apxf
Apts
Apoi
Aply
Apos
Aps2
Awar
Apit
Aprg
Arai
ARal
Arav
ACrn
Arbr
Arej
Aren
Arep
Arpb
Arpl
Arpm
Arsk
Arst
Arng
Arev
Aroa
Aroc
Asac
Asal
Alam
Asds
Asid
Asud
Aesn
Aeye
Ashm
Ahid
Asla
Aslo
Aspo
Asod
Assp
Aspd
Asps
Asph
Aspa
Aspi
Aspl
Astd
Asta
Astn
Asth
Attu
Atau
ACtb
ACtc
Atdg
Atsp
Atwa
Atol
Ault
Auhf
Auco
Auns
Avng
Awan
Awha
Aven
Awrp
Aweb
AIxm
AIam
AIim
AIsm
AIaa
AIat
AIva
AIbl
AIem
AIfs
AIfl
AIfm
AIfo
AIfn
AIfe
AIfa
AIlm
AIlp
AIms
ANbs
AIcb
AIfb
AIzb
AIob
AIlb
AIsb
AIpb
Apo2
Arel
AIsi
AIso
Asou
AIcf
AIco
AIdm
AIda
AIta
AIdi
AIha
AIil
AIvu
AImr
AIpm
AIrt
AIrm
AIrc
AIre
AIra
AIsp
AIsa
AItp
AIan
AIrs
AIgo
AIlu
AIrv
AIdc
AIwb
AImo
AIct
AIri
AIsr
Ablp
AIpv
Aste
Amec
Ashs
ANpr
ANsa
ANss
ANse
Aret
Aspb
AIrd
AItb
AIrb
AUds
AIdd
AIsh
389

PS: It seems to me that you've got the real thing, not modding, you've written an alternative game engine that implements the graphics and mechanics of Warcraft 3, that is very very cool.

Edit: this is a list of the abilities that appear in the second column ("code"), but not in the first ("alias"):
AOwd
AOac
Aapl
Acha
Abli
Amtc
Acar
Acoi
Adet
Aarm
Artn
Aroo
ANsu
AIab
AIde
AIgl
AIml
AIhe
AIvi
AIma
Aami
AImi
AImm
AIas
AIrg
 
Last edited:
Level 7
Joined
Sep 4, 2016
Messages
116
This makes me think of the option that you can see when setting up a trigger to order units to do something. I think the 'code' you are referring to may align with the base orders available to give a unit a command via trigger (or via clicking a button in the gui). Maybe these (or the codes they mask) are what you are looking for.
Note that there are different orders for targeting a unit, a point, a destructible, an item, or a variety of others that without targets.

1691123118711.png
 
Last edited:
Level 10
Joined
Aug 1, 2023
Messages
48
This makes me think of the option that you can see when setting up a trigger to order units to do something. I think the 'code' you are referring to may align with the base orders available to give a unit a command via trigger (or via clicking a button in the gui).
That's a good point. This gives a lower bound on the number of abilities (243, see spoiler) when the "on/off" orders are excluded. It's a lower bound because some abilities (those that give stats, for example) don't have order ids.
smart = 851971
stop = 851972
setrally = 851980
getitem = 851981
attack = 851983
attackground = 851984
move = 851986
AImove = 851988
patrol = 851990
build = 851994
humanbuild = 851995
orcbuild = 851996
nightelfbuild = 851997
undeadbuild = 851998
resumebuild = 851999
dropitem = 852001
detectaoe = 852015
resumeharvesting = 852017
harvest = 852018
returnresources = 852020
autoharvestgold = 852021
autoharvestlumber = 852022
neutraldetectaoe = 852023
repair = 852024
revive = 852039
selfdestruct = 852040
board = 852043
forceboard = 852044
load = 852046
unload = 852047
unloadall = 852048
unloadallinstant = 852049
loadcorpse = 852050
loadcorpseinstant = 852053
unloadallcorpses = 852054
defend = 852055
undefend = 852056
dispel = 852057
flare = 852060
heal = 852063
innerfire = 852066
invisibility = 852069
militia = 852072
polymorph = 852074
slow = 852075
tankdroppilot = 852079
tankloadpilot = 852080
tankpilot = 852081
avatar = 852086
unavatar = 852087
blizzard = 852089
divineshield = 852090
undivineshield = 852091
holybolt = 852092
massteleport = 852093
thunderbolt = 852095
thunderclap = 852096
waterelemental = 852097
berserk = 852100
bloodlust = 852101
devour = 852104
evileye = 852105
ensnare = 852106
healingward = 852109
lightningshield = 852110
purge = 852111
standdown = 852113
stasistrap = 852114
chainlightning = 852119
earthquake = 852121
farsight = 852122
mirrorimage = 852123
shockwave = 852125
spiritwolf = 852126
stomp = 852127
whirlwind = 852128
windwalk = 852129
unwindwalk = 852130
ambush = 852131
autodispel = 852132
barkskin = 852135
bearform = 852138
unbearform = 852139
corrosivebreath = 852140
loadarcher = 852142
mounthippogryph = 852143
eattree = 852146
entangle = 852147
entangleinstant = 852148
faeriefire = 852149
ravenform = 852155
unravenform = 852156
recharge = 852157
renew = 852161
roar = 852164
root = 852165
unroot = 852166
entanglingroots = 852171
flamingarrowstarg = 852173
flamingarrows = 852174
unflamingarrows = 852175
forceofnature = 852176
manaburn = 852179
metamorphosis = 852180
scout = 852181
sentinel = 852182
starfall = 852183
tranquility = 852184
acolyteharvest = 852185
antimagicshell = 852186
blight = 852187
cannibalize = 852188
cripple = 852189
curse = 852190
freezingbreath = 852195
raisedead = 852197
instant = 852200
requestsacrifice = 852201
sacrifice = 852205
unholyfrenzy = 852209
web = 852211
wispharvest = 852214
auraunholy = 852215
auravampiric = 852216
animatedead = 852217
darkritual = 852219
deathanddecay = 852221
deathcoil = 852222
deathpact = 852223
dreadlordinferno = 852224
frostarmor = 852225
frostnova = 852226
sleep = 852227
darkportal = 852229
fingerofdeath = 852230
firebolt = 852231
inferno = 852232
gold2lumber = 852233
lumber2gold = 852234
spies = 852235
rainofchaos = 852237
request_hero = 852239
disassociate = 852240
revenge = 852241
coldarrowstarg = 852243
coldarrows = 852244
uncoldarrows = 852245
creepanimatedead = 852246
creepdevour = 852247
creepheal = 852248
creepthunderbolt = 852252
creepthunderclap = 852253
awaken = 852466
nagabuild = 852467
mount = 852469
dismount = 852470
magicdefense = 852478
magicundefense = 852479
magicleash = 852480
phoenixfire = 852481
phoenixmorph = 852482
spellsteal = 852483
banish = 852486
drain = 852487
flamestrike = 852488
ancestralspirit = 852490
ancestralspirittarget = 852491
corporealform = 852493
uncorporealform = 852494
disenchant = 852495
etherealform = 852496
unetherealform = 852497
spiritlink = 852499
healingwave = 852501
hex = 852502
voodoo = 852503
ward = 852504
autoentangle = 852505
autoentangleinstant = 852506
coupletarget = 852507
coupleinstant = 852508
decouple = 852509
grabtree = 852511
phaseshift = 852514
phaseshiftinstant = 852517
taunt = 852520
vengeance = 852521
vengeanceinstant = 852524
blink = 852525
fanofknives = 852526
shadowstrike = 852527
spiritofvengeance = 852528
absorb = 852529
avengerform = 852531
unavengerform = 852532
burrow = 852533
unburrow = 852534
devourmagic = 852536
flamingattacktarg = 852539
flamingattack = 852540
unflamingattack = 852541
replenish = 852542
replenishlife = 852545
replenishmana = 852548
impale = 852555
locustswarm = 852556
frenzy = 852561
mechanicalcritter = 852564
mindrot = 852565
neutralinteract = 852566
sanctuary = 852569
shadowsight = 852570
spellshield = 852571
spellshieldaoe = 852572
spirittroll = 852573
steal = 852574
attributemodskill = 852576
blackarrow = 852577
charm = 852581
doom = 852583
drunkenhaze = 852585
elementalfury = 852586
forkedlightning = 852587
howlofterror = 852588
silence = 852592
stampede = 852593
tornado = 852597
battleroar = 852599
channel = 852600
parasite = 852601
submerge = 852604
unsubmerge = 852605
neutralspell = 852630
clusterrockets = 852652
robogoblin = 852656
unrobogoblin = 852657
acidbomb = 852662
chemicalrage = 852663
healingspray = 852664
transmute = 852665
soulburn = 852668
volcano = 852669
incineratearrow = 852670

Edit: Now, I really don't know, because, from the object editor's perspective and from the game engine perspective the following abilities are different, but from a map maker's perspective they are pretty much the same (a unit target spell that stuns it's target):
* 'AHtb' (Storm Bolt, order: thunderbolt = 852095)
* 'ACtb' (Hurl Boulder, order: creepthunderbolt = 852252)
* 'ACfb' (Firebolt (Neutral Hostile), order: firebolt = 852231)
 
Last edited:
One time on Blizzard's World Editor I did an experiment where I changed AbilityMetaData.slk that defines which properties of abilities can be modified, and made the code column a modifiable property. After doing that, similar to how there is an "effect ability" option on Item Attack Black Arrow Bonus and similar skills, every ability in the game had a modifiable effect ability stat. I think I might have named it Stats - Behavior or whatever but it was really the code column like I said.

Fasinatingly enough, it did actually work. So, you could go to Firebolt in the Ability Editor and then double click on the row for Stats - Behavior and pick Avatar or something, and then this custom skill copied from Firebolt would be an instant cast ability that provided stat benefits to the caster for a duration, or whatever. But because the World Editor was not designed to support this, it would still show the incorrect "Data - " fields for that ability, making it very difficult to customize the functionality of a skill with a modified code column like this.
 
Status
Not open for further replies.
Top