-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathcommon.ai
4994 lines (4505 loc) · 119 KB
/
common.ai
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
//==================================================================================================
// $Id: common.ai,v 1.68 2003/05/12 02:34:18 bfitch Exp $
//==================================================================================================
/**
@patch 1.00
*/
native DebugS takes string str returns nothing
/**
@patch 1.00
*/
native DebugFI takes string str, integer val returns nothing
/**
@patch 1.00
*/
native DebugUnitID takes string str, integer val returns nothing
/**
@patch 1.00
*/
native DisplayText takes integer p, string str returns nothing
/**
@patch 1.00
*/
native DisplayTextI takes integer p, string str, integer val returns nothing
/**
@patch 1.07
*/
native DisplayTextII takes integer p, string str, integer v1, integer v2 returns nothing
/**
Does nothing in release build v1.33.
@patch 1.07
*/
native DisplayTextIII takes integer p, string str, integer v1, integer v2, integer v3 returns nothing
/**
@patch 1.00
*/
native DoAiScriptDebug takes nothing returns boolean
/**
@patch 1.00
*/
native GetAiPlayer takes nothing returns integer
/**
Returns the ID of the leveled up hero, so it can be used in the heroes levels code function
(probably `SetHeroLevels`).
@patch 1.00
*/
native GetHeroId takes nothing returns integer
/**
Returns the level of the leveling hero so it can be used in the heroes levels code function
(probably `SetHeroLevels`).
@patch 1.00
*/
native GetHeroLevelAI takes nothing returns integer
/**
Counts units of type for the AI player whether it is trained/built or in progress.
@param unitid Rawcode to specify unit type to count
@note See: `GetUnitCountDone`
@patch 1.00
*/
native GetUnitCount takes integer unitid returns integer
/**
Returns how many `unit`s of a certain type a `player` has.
@commonai
@patch 1.00
*/
native GetPlayerUnitTypeCount takes player p, integer unitid returns integer
/**
Counts units of type for the AI player that is trained/built or in progress.
@param unitid Rawcode to specify unit type to count
@note See: `GetUnitCount`
@patch 1.00
*/
native GetUnitCountDone takes integer unitid returns integer
/**
Counts buildings of specific type for the AI player in a town.
@param id Rawcode to specify unit type to count
@param tn ID of target town
@param dn If true: only count finished units
@note This will return 0 for `tn = -1` and will only work for buildings; normal units will always return 0.
@patch 1.00
*/
native GetTownUnitCount takes integer id, integer tn, boolean dn returns integer
/**
Gets the gold cost of a unit-type.
@param unitid Rawcode to specify unit type
@bug Crashes the game for hero ids (tested in a normal script).
@commonai
@patch 1.00
*/
native GetUnitGoldCost takes integer unitid returns integer
/**
Gets the lumber cost of a unit-type.
@param unitid Rawcode to specify unit type
@bug Crashes the game for hero ids (tested in a normal script).
@commonai
@patch 1.00
*/
native GetUnitWoodCost takes integer unitid returns integer
/**
Gets the building time of a unit-type.
@param unitid Rawcode to specify unit type
@commonai
@patch 1.07
*/
native GetUnitBuildTime takes integer unitid returns integer
/**
@patch 1.00
*/
native GetMinesOwned takes nothing returns integer
/**
@patch 1.00
*/
native GetGoldOwned takes nothing returns integer
/**
@patch 1.00
*/
native TownWithMine takes nothing returns integer
/**
@patch 1.00
*/
native TownHasMine takes integer townid returns boolean
/**
@patch 1.00
*/
native TownHasHall takes integer townid returns boolean
/**
@patch 1.00
*/
native GetUpgradeLevel takes integer id returns integer
/**
@patch 1.00
*/
native GetUpgradeGoldCost takes integer id returns integer
/**
@patch 1.00
*/
native GetUpgradeWoodCost takes integer id returns integer
/**
@patch 1.00
*/
native GetNextExpansion takes nothing returns integer
/**
@patch 1.00
*/
native GetMegaTarget takes nothing returns unit
/**
Get the last constructed or pre-placed building for the given player.
@note For pre-placed buildings the order is the number that you find in the WE.
Example: Blacksmith_0023, Workshop_0065, then the last building will be Workshop_0065,
but if a peasent in game constructed an altar then that will be the last building.
@note Player `p` can be a human controlled player not necessarily computer.
@param p Target player
@commonai
@patch 1.00
*/
native GetBuilding takes player p returns unit
/**
@patch 1.00
*/
native GetEnemyPower takes nothing returns integer
/**
@patch 1.00
*/
native SetAllianceTarget takes unit id returns nothing
/**
@patch 1.00
*/
native GetAllianceTarget takes nothing returns unit
/**
Trains unit(s) of specified type at target town.
Returns true if the unit can be trained successfully, i.e. the AI player has all the resources and requirments of the training as well as the building that will start the training.
@note The parameter `qty` will only work if the player has `qty` amount of buildings that can train this unit.
However this action *will not queue*.
Example: the player has 1 barracks and `qty = 3` then 1 unit will be trained.
Lets suppose that another barracks is built then 2 units will be trained.
@param qty Select this many buildings (e.g. Barracks) to train units in
@param id Rawcode to specify unit type to train
@param town Index of town
@patch 1.00
*/
native SetProduce takes integer qty, integer id, integer town returns boolean
/**
@patch 1.00
*/
native Unsummon takes unit unitid returns nothing
/**
@patch 1.00
*/
native SetExpansion takes unit peon, integer id returns boolean
/**
Starts an upgrade for the AI player.
Return true if the upgrade has started successfully, i.e. the AI player has all the resources and requirments of the upgrade as well as the building that will start the upgrade.
@param id Rawcode of the upgrade to be researched
@patch 1.00
*/
native SetUpgrade takes integer id returns boolean
/**
This native will set how the heroes of the AI player will allocate their skill points as defined in the code function `func`.
@patch 1.00
*/
native SetHeroLevels takes code func returns nothing
/**
@patch 1.00
*/
native SetNewHeroes takes boolean state returns nothing
/**
Purchace a zeppelin, must be called when a hero is standing near a goblin lab.
@patch 1.00
*/
native PurchaseZeppelin takes nothing returns nothing
/**
Merges two units, who can be merged, like the hippogryph rider. The use of this native gives better response if called from inside a loop.
@patch 1.00
*/
native MergeUnits takes integer qty, integer a, integer b, integer make returns boolean
/**
This native have the same effect on units like the obsidian statue when converted to destroyer. The use of this native gives better response if called from inside a loop.
@patch 1.07
*/
native ConvertUnits takes integer qty, integer id returns boolean
/**
@patch 1.00
*/
native SetCampaignAI takes nothing returns nothing
/**
@patch 1.00
*/
native SetMeleeAI takes nothing returns nothing
/**
Toggle the feature of making the AI target heroes.
Gives priority to target heroes if enabled.
@param state True: turned on. False: turned off.
@patch 1.00
*/
native SetTargetHeroes takes boolean state returns nothing
/**
Toggle the feature of making peons to repair damaged structures and mechanical units.
@param state True: turned on. False: turned off.
@patch 1.00
*/
native SetPeonsRepair takes boolean state returns nothing
/**
@patch 1.07
*/
native SetRandomPaths takes boolean state returns nothing
/**
@patch 1.07
*/
native SetDefendPlayer takes boolean state returns nothing
/**
Toggle the feature of making the heroes flee when they are seriously damaged.
@param state True: turned on. False: turned off.
@patch 1.00
*/
native SetHeroesFlee takes boolean state returns nothing
/**
Toggle the feature of making the heroes buy items.
@param state True: turned on. False: turned off.
@patch 1.07
*/
native SetHeroesBuyItems takes boolean state returns nothing
/**
@patch 1.00
*/
native SetWatchMegaTargets takes boolean state returns nothing
/**
@patch 1.00
*/
native SetIgnoreInjured takes boolean state returns nothing
/**
Toggle the feature of making the heroes take items.
@param state True: turned on. False: turned off.
@patch 1.00
*/
native SetHeroesTakeItems takes boolean state returns nothing
/**
Toggle the feature of making the units flee when they are seriously damaged.
@param state True: turned on. False: turned off.
@patch 1.00
*/
native SetUnitsFlee takes boolean state returns nothing
/**
Toggle the feature of making the entire group flee when it is seriously damaged.
@param state True: turned on. False: turned off.
@patch 1.00
*/
native SetGroupsFlee takes boolean state returns nothing
/**
If true the gold harvested by the AI player peons will be 1 per period, instead of 10 per period for false state.
@patch 1.00
*/
native SetSlowChopping takes boolean state returns nothing
/**
@patch 1.00
*/
native SetCaptainChanges takes boolean allow returns nothing
/**
@patch 1.00
*/
native SetSmartArtillery takes boolean state returns nothing
/**
Replaces every AI's player pre-placed units or units that are assigned to a guard posts N times when it is killed.
@note This only works for units not classified as workers and will not work for peon-type (Peasants, Peons, Acolytes, Wisps and Mur'gul Slaves) even if not classified as workers.
@patch 1.00
*/
native SetReplacementCount takes integer qty returns nothing
/**
@patch 1.00
*/
native GroupTimedLife takes boolean allow returns nothing
/**
@patch 1.00
*/
native RemoveInjuries takes nothing returns nothing
/**
@patch 1.00
*/
native RemoveSiege takes nothing returns nothing
/**
@patch 1.00
*/
native InitAssault takes nothing returns nothing
/**
Creates a group from already-existing units that can be assigned to attack a specific target.
When `AttackMoveXY` is called then this group will attack the specified target.
@note Important: in order to use this native, `CreateCaptains` must be called first or the game will crash. It is already called in the function `CampaignAI` found in `common.ai`.
@patch 1.00
*/
native AddAssault takes integer qty, integer id returns boolean
/**
Creates a group from already-existing units to guard the AI player town. The units assemble around the most important building in the town with no specific formation.
@note Important: in order to use this native, `CreateCaptains` must be called first or the game will crash. It is already called in the function `CampaignAI` found in `common.ai`.
@patch 1.00
*/
native AddDefenders takes integer qty, integer id returns boolean
/**
Searches for the nearest creep camp, the parameters defines the power of the camp.
The power is the total level of all creeps. For example, lets say `min = 3` and `max = 3` then the camp that will be detected will have 3 possibilities:
1. 3 creeps of level 1
2. 1 creep of level 3
3. 1 creep of level 2 and 1 creep of level 1
@param min Minimal power allowed
@param max Maximum power allowed
@param flyers_ok Filter by flying units in the camp. Set to true to allow flying and false for ground units only.
@patch 1.00
*/
native GetCreepCamp takes integer min, integer max, boolean flyers_ok returns unit
/**
Must be called before using the native `GetEnemyBase` in order to make it work.
@patch 1.00
*/
native StartGetEnemyBase takes nothing returns nothing
/**
@patch 1.00
*/
native WaitGetEnemyBase takes nothing returns boolean
/**
Returns the enemy base unit. Must call `StartGetEnemyBase` first or it will return null.
@patch 1.00
*/
native GetEnemyBase takes nothing returns unit
/**
Returns an enemy unit near the expansion location, whether this unit is a creep or belong to an enemy to the AI player.
@note Important: in order to use this native, `CreateCaptains` must be called first or the game will crash. It is already called in the function `CampaignAI` found in `common.ai`.
@patch 1.00
*/
native GetExpansionFoe takes nothing returns unit
/**
Returns the enemy expansion base.
@patch 1.00
*/
native GetEnemyExpansion takes nothing returns unit
/**
Returns the integer X coordinate of the AI player expansion location whether it is constructed or not.
@note Important: in order to use this native, `CreateCaptains` must be called first or the game will crash. It is already called in the function `CampaignAI` found in `common.ai`.
@patch 1.00
*/
native GetExpansionX takes nothing returns integer
/**
Returns the integer Y coordinate of the AI player expansion location whether it is constructed or not.
@note Important: in order to use this native, `CreateCaptains` must be called first or the game will crash. It is already called in the function `CampaignAI` found in `common.ai`.
@patch 1.00
*/
native GetExpansionY takes nothing returns integer
/**
@patch 1.00
*/
native SetStagePoint takes real x, real y returns nothing
/**
@patch 1.00
*/
native AttackMoveKill takes unit target returns nothing
/**
Pings a location on the mini-map where 'unit' intends to attack-move this unit.
If `AddAssault` is not called before this one, then the units (**if any**) will remain at their position and will not attack-move the signaled unit. Once the units go to the unit they will return to the base when the unit is killed.
If they didn't find any enemy on their route or it if is destroyed and at least one unit survived in the group.
@note Important: in order to use this native, the native `CreateCaptains` must be called first or the game will crash. It is already added in the function CampaignAI found at `common.ai`
@patch 1.00
*/
native AttackMoveXY takes integer x, integer y returns nothing
/**
@patch 1.07
*/
native LoadZepWave takes integer x, integer y returns nothing
/**
@patch 1.00
*/
native SuicidePlayer takes player id, boolean check_full returns boolean
/**
@patch 1.07
*/
native SuicidePlayerUnits takes player id, boolean check_full returns boolean
/**
@patch 1.00
*/
native CaptainInCombat takes boolean attack_captain returns boolean
/**
Returns either true if the parameter target is guarded by a tower, the tower can be a custom-made unit but there are rules when checking if the target is guarded or not; the target has to be in the proximity of a base and a tower belonging to the AI player, however acquisition range and attack range of the tower doesn't affect whether the target is defended or not.
@patch 1.00
*/
native IsTowered takes unit target returns boolean
/**
@patch 1.00
*/
native ClearHarvestAI takes nothing returns nothing
/**
Order peons to harvest a gold mine in the town.
@param town Index ID of town
@param peons Amount of peons
@patch 1.00
*/
native HarvestGold takes integer town, integer peons returns nothing
/**
Order peons to harvest trees near the town.
@param town Index ID of town
@param peons Amount of peons
@patch 1.00
*/
native HarvestWood takes integer town, integer peons returns nothing
/**
Returns the peon unit that will start a new expansion for the AI player, however, it will return null if there is no gold mine (excluding a gold mine the AI player already own) found on the map.
@note Important: in order to use this native, `CreateCaptains` must be called first or the game will crash. It is already called in the function `CampaignAI` found in `common.ai`.
@patch 1.00
*/
native GetExpansionPeon takes nothing returns unit
/**
This native must be called at the start of an AI file so that the following native `FillGuardPosts` works, if not then `FillGuardPosts` will continuosly train units if it is nested in a loop and also will cause the trained units not to go to replace the killed ones, instead they will remain near the building that trained them.
@patch 1.00
*/
native StopGathering takes nothing returns nothing
/**
This marks a spot at point (x,y) as a guard post and a unit of specified type will be
guarding that spot.
The spot will remain empty until the function `FillGuardPosts` is called, after that
the specified unit will go to guard that spot. If the unit is killed another one will replace it.
However, this process is not unlimited, by default, the unit is replaced 3 times
but if the native `SetReplacementCount(N)` is called in the AI script the unit will be
replaced N times. Note that if this is used on heroes they will be trained only but will not
go to the post.
@param id Rawcode for unit type of the guard unit
@patch 1.00
*/
native AddGuardPost takes integer id, real x, real y returns nothing
/**
When called, a unit of the same type of the last killed unit that belong to the AI player will be trained and replace the previous one.
@note This native is instant and will not queue, so in order to keep replacing killed units,
it has to be nested inside a continuous loop.
@patch 1.00
*/
native FillGuardPosts takes nothing returns nothing
/**
Order every unit that is assigned a guard post to return to it. This native works for pre-placed units and newly trained ones.
@note There is a small tolerance of 82.006 radius offset to the guard post.
@patch 1.00
*/
native ReturnGuardPosts takes nothing returns nothing
/**
@patch 1.00
*/
native CreateCaptains takes nothing returns nothing
/**
@patch 1.00
*/
native SetCaptainHome takes integer which, real x, real y returns nothing
/**
@patch 1.07
*/
native ResetCaptainLocs takes nothing returns nothing
/**
@patch 1.00
*/
native ShiftTownSpot takes real x, real y returns nothing
/**
@patch 1.00
*/
native TeleportCaptain takes real x, real y returns nothing
/**
@patch 1.00
*/
native ClearCaptainTargets takes nothing returns nothing
/**
@patch 1.00
*/
native CaptainAttack takes real x, real y returns nothing
/**
@patch 1.00
*/
native CaptainVsUnits takes player id returns nothing
/**
@patch 1.00
*/
native CaptainVsPlayer takes player id returns nothing
/**
@patch 1.00
*/
native CaptainGoHome takes nothing returns nothing
/**
@patch 1.00
*/
native CaptainIsHome takes nothing returns boolean
/**
@patch 1.00
*/
native CaptainIsFull takes nothing returns boolean
/**
@patch 1.00
*/
native CaptainIsEmpty takes nothing returns boolean
/**
@patch 1.00
*/
native CaptainGroupSize takes nothing returns integer
/**
@patch 1.00
*/
native CaptainReadiness takes nothing returns integer
/**
@patch 1.00
*/
native CaptainRetreating takes nothing returns boolean
/**
@patch 1.00
*/
native CaptainReadinessHP takes nothing returns integer
/**
@patch 1.00
*/
native CaptainReadinessMa takes nothing returns integer
/**
@patch 1.00
*/
native CaptainAtGoal takes nothing returns boolean
/**
Returns `true` if any units of any level on the map have the classification of creep.
@commonai
@patch 1.00
*/
native CreepsOnMap takes nothing returns boolean
/**
@patch 1.00
*/
native SuicideUnit takes integer count, integer unitid returns nothing
/**
@patch 1.00
*/
native SuicideUnitEx takes integer ct, integer uid, integer pid returns nothing
/**
@patch 1.00
*/
native StartThread takes code func returns nothing
/**
@patch 1.00
*/
native Sleep takes real seconds returns nothing
/**
Checks if a unit is alive.
@commonai
@patch 1.00
*/
native UnitAlive takes unit id returns boolean
/**
Checks if a unit is invisible.
@commonai
@patch 1.07
*/
native UnitInvis takes unit id returns boolean
/**
@patch 1.00
*/
native IgnoredUnits takes integer unitid returns integer
/**
Although the name suggests otherwise, this returns true if any unit (building or unit) for the AI player is being attacked.
@patch 1.07
*/
native TownThreatened takes nothing returns boolean
/**
@patch 1.07
*/
native DisablePathing takes nothing returns nothing
/**
@patch 1.07
*/
native SetAmphibious takes nothing returns nothing
/**
Every time you use the trigger action 'Send AI Command' the command queue counter
increases by 1.
This has nothing to do with the value of the command in the argument of the
trigger action; so sending an AI signal with (1,0) is like (5,0) everyone will increase the
counter by 1.
@note See: `GetLastCommand`, `GetLastData`, `PopLastCommand`
@patch 1.00
*/
native CommandsWaiting takes nothing returns integer
/**
When an AI signal is sent via triggers, this returns the command value.
So sending an AI signal of (5,3) returns 5.
@note See: `CommandsWaiting` `GetLastData`, `PopLastCommand`
@patch 1.00
*/
native GetLastCommand takes nothing returns integer
/**
The same as `GetLastCommand` but it returns the data value.
For the previous example, it will return 3.
@note See: `CommandsWaiting`, `GetLastCommand`, `PopLastCommand`
@patch 1.00
*/
native GetLastData takes nothing returns integer
/**
Reduce the command queue counter by 1. It's important to pop last command because many sleep function in `common.ai` exits when the value of the command counter not equal to zero.
@note See: `CommandsWaiting`, `GetLastCommand`, `GetLastData`
@patch 1.00
*/
native PopLastCommand takes nothing returns nothing
/**
@patch 1.03
*/
native MeleeDifficulty takes nothing returns integer
//============================================================================
// Globals for all AI scripts
//============================================================================
globals
//--------------------------------------------------------------------
// HUMANS
//--------------------------------------------------------------------
// human heroes
/**
@patch 1.00
*/
constant integer ARCHMAGE = 'Hamg'
/**
@patch 1.00
*/
constant integer PALADIN = 'Hpal'
/**
@patch 1.00
*/
constant integer MTN_KING = 'Hmkg'
/**
@patch 1.07
*/
constant integer BLOOD_MAGE = 'Hblm'
// human hero abilities
/**
@patch 1.00
*/
constant integer AVATAR = 'AHav'
/**
@patch 1.00
*/
constant integer BASH = 'AHbh'
/**
@patch 1.00
*/
constant integer THUNDER_BOLT = 'AHtb'
/**
@patch 1.00
*/
constant integer THUNDER_CLAP = 'AHtc'
/**
@patch 1.00
*/
constant integer DEVOTION_AURA = 'AHad'
/**
@patch 1.00
*/
constant integer DIVINE_SHIELD = 'AHds'
/**
@patch 1.00
*/
constant integer HOLY_BOLT = 'AHhb'
/**
@patch 1.00
*/
constant integer RESURRECTION = 'AHre'
/**
@patch 1.00
*/
constant integer BLIZZARD = 'AHbz'
/**
@patch 1.00
*/
constant integer BRILLIANCE_AURA = 'AHab'
/**
@patch 1.00
*/
constant integer MASS_TELEPORT = 'AHmt'
/**
@patch 1.00
*/
constant integer WATER_ELEMENTAL = 'AHwe'
/**
@patch 1.07
*/
constant integer BANISH = 'AHbn'
/**
@patch 1.07
*/
constant integer FLAME_STRIKE = 'AHfs'
/**
@patch 1.07
*/
constant integer SUMMON_PHOENIX = 'AHpx'
/**
@patch 1.07
*/
constant integer SIPHON_MANA = 'AHdr'
// special human heroes
/**
@patch 1.00
*/
constant integer JAINA = 'Hjai'
/**
@patch 1.00
*/
constant integer MURADIN = 'Hmbr'
/**
@patch 1.07
*/
constant integer GARITHOS = 'Hlgr'
/**
@patch 1.07
*/
constant integer KAEL = 'Hkal'
// human units
/**
@patch 1.00
*/
constant integer COPTER = 'hgyr'
/**
@patch 1.07
*/
constant integer GYRO = COPTER
/**
@patch 1.00
*/
constant integer ELEMENTAL = 'hwat'
/**
@patch 1.00
*/
constant integer FOOTMAN = 'hfoo'
/**
@patch 1.00
*/
constant integer FOOTMEN = FOOTMAN
/**
@patch 1.00
*/
constant integer GRYPHON = 'hgry'
/**
@patch 1.00
*/
constant integer KNIGHT = 'hkni'
/**
@patch 1.00
*/
constant integer MORTAR = 'hmtm'
/**
@patch 1.00
*/
constant integer PEASANT = 'hpea'
/**
@patch 1.00
*/
constant integer PRIEST = 'hmpr'
/**
@patch 1.00
*/
constant integer RIFLEMAN = 'hrif'
/**
@patch 1.00
*/
constant integer RIFLEMEN = RIFLEMAN
/**
@patch 1.00
*/
constant integer SORCERESS = 'hsor'
/**
@patch 1.00
*/
constant integer TANK = 'hmtt'
/**
@patch 1.07
*/
constant integer STEAM_TANK = TANK
/**
@patch 1.07
*/
constant integer ROCKET_TANK = 'hrtt'
/**
@patch 1.00
*/
constant integer MILITIA = 'hmil'
/**
@patch 1.07
*/
constant integer SPELL_BREAKER = 'hspt'
/**
@patch 1.07
*/
constant integer HUMAN_DRAGON_HAWK = 'hdhw'
// special human units
/**
@patch 1.07
*/
constant integer BLOOD_PRIEST = 'hbep'
/**
@patch 1.07
*/
constant integer BLOOD_SORCERESS = 'hbes'
/**
@patch 1.07
*/
constant integer BLOOD_PEASANT = 'nhew'
// human buildings
/**
@patch 1.00
*/
constant integer AVIARY = 'hgra'
/**
@patch 1.00
*/
constant integer BARRACKS = 'hbar'
/**
@patch 1.00
*/
constant integer BLACKSMITH = 'hbla'
/**
@patch 1.00
*/
constant integer CANNON_TOWER = 'hctw'
/**
@patch 1.00
*/
constant integer CASTLE = 'hcas'
/**
@patch 1.00
*/
constant integer CHURCH = 'htws'
/**
@patch 1.00
*/
constant integer MAGE_TOWER = CHURCH
/**
@patch 1.00
*/
constant integer GUARD_TOWER = 'hgtw'
/**
@patch 1.00
*/
constant integer HOUSE = 'hhou'
/**
@patch 1.00