sc2ai 0.0.0.pre → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/data/data.json +1 -0
  3. data/data/data_readable.json +22842 -0
  4. data/data/sc2ai/protocol/common.proto +59 -0
  5. data/data/sc2ai/protocol/data.proto +120 -0
  6. data/data/sc2ai/protocol/debug.proto +127 -0
  7. data/data/sc2ai/protocol/error.proto +221 -0
  8. data/data/sc2ai/protocol/query.proto +55 -0
  9. data/data/sc2ai/protocol/raw.proto +202 -0
  10. data/data/sc2ai/protocol/sc2api.proto +718 -0
  11. data/data/sc2ai/protocol/score.proto +108 -0
  12. data/data/sc2ai/protocol/spatial.proto +115 -0
  13. data/data/sc2ai/protocol/ui.proto +145 -0
  14. data/data/setup/setup.SC2Map +0 -0
  15. data/data/setup/setup.SC2Replay +0 -0
  16. data/data/stableid.json +35730 -0
  17. data/data/versions.json +554 -0
  18. data/exe/sc2ai +35 -0
  19. data/lib/docker_build/Dockerfile.ruby +74 -0
  20. data/lib/docker_build/docker-compose-base-image.yml +10 -0
  21. data/lib/docker_build/docker-compose-ladderzip.yml +9 -0
  22. data/lib/sc2ai/api/ability_id.rb +1644 -0
  23. data/lib/sc2ai/api/buff_id.rb +306 -0
  24. data/lib/sc2ai/api/data.rb +101 -0
  25. data/lib/sc2ai/api/effect_id.rb +20 -0
  26. data/lib/sc2ai/api/tech_tree.rb +83 -0
  27. data/lib/sc2ai/api/tech_tree_data.rb +2338 -0
  28. data/lib/sc2ai/api/unit_type_id.rb +2022 -0
  29. data/lib/sc2ai/api/upgrade_id.rb +310 -0
  30. data/lib/sc2ai/cli/cli.rb +175 -0
  31. data/lib/sc2ai/cli/ladderzip.rb +154 -0
  32. data/lib/sc2ai/cli/new.rb +88 -0
  33. data/lib/sc2ai/configuration.rb +145 -0
  34. data/lib/sc2ai/connection/connection_listener.rb +30 -0
  35. data/lib/sc2ai/connection/requests.rb +417 -0
  36. data/lib/sc2ai/connection/status_listener.rb +15 -0
  37. data/lib/sc2ai/connection.rb +146 -0
  38. data/lib/sc2ai/local_play/client/configurable_options.rb +115 -0
  39. data/lib/sc2ai/local_play/client.rb +159 -0
  40. data/lib/sc2ai/local_play/client_manager.rb +70 -0
  41. data/lib/sc2ai/local_play/map_file.rb +48 -0
  42. data/lib/sc2ai/local_play/match.rb +184 -0
  43. data/lib/sc2ai/overrides/array.rb +14 -0
  44. data/lib/sc2ai/overrides/async/process/child.rb +31 -0
  45. data/lib/sc2ai/overrides/kernel.rb +33 -0
  46. data/lib/sc2ai/paths.rb +294 -0
  47. data/lib/sc2ai/player/actions.rb +386 -0
  48. data/lib/sc2ai/player/debug.rb +224 -0
  49. data/lib/sc2ai/player/game_state.rb +131 -0
  50. data/lib/sc2ai/player/geometry.rb +766 -0
  51. data/lib/sc2ai/player/previous_state.rb +49 -0
  52. data/lib/sc2ai/player/units.rb +337 -0
  53. data/lib/sc2ai/player.rb +661 -0
  54. data/lib/sc2ai/ports.rb +152 -0
  55. data/lib/sc2ai/protocol/_meta_documentation.rb +39 -0
  56. data/lib/sc2ai/protocol/common_pb.rb +43 -0
  57. data/lib/sc2ai/protocol/data_pb.rb +47 -0
  58. data/lib/sc2ai/protocol/debug_pb.rb +56 -0
  59. data/lib/sc2ai/protocol/error_pb.rb +36 -0
  60. data/lib/sc2ai/protocol/extensions/color.rb +20 -0
  61. data/lib/sc2ai/protocol/extensions/point.rb +23 -0
  62. data/lib/sc2ai/protocol/extensions/point_2_d.rb +26 -0
  63. data/lib/sc2ai/protocol/extensions/position.rb +202 -0
  64. data/lib/sc2ai/protocol/extensions/power_source.rb +19 -0
  65. data/lib/sc2ai/protocol/extensions/unit.rb +489 -0
  66. data/lib/sc2ai/protocol/query_pb.rb +47 -0
  67. data/lib/sc2ai/protocol/raw_pb.rb +57 -0
  68. data/lib/sc2ai/protocol/sc2api_pb.rb +130 -0
  69. data/lib/sc2ai/protocol/score_pb.rb +40 -0
  70. data/lib/sc2ai/protocol/spatial_pb.rb +48 -0
  71. data/lib/sc2ai/protocol/ui_pb.rb +56 -0
  72. data/lib/sc2ai/unit_group/action_ext.rb +74 -0
  73. data/lib/sc2ai/unit_group/filter_ext.rb +379 -0
  74. data/lib/sc2ai/unit_group.rb +277 -0
  75. data/lib/sc2ai/version.rb +2 -1
  76. data/lib/sc2ai.rb +93 -2
  77. data/lib/templates/ladderzip/bin/ladder.tt +23 -0
  78. data/lib/templates/new/.ladderignore +20 -0
  79. data/lib/templates/new/Gemfile.tt +7 -0
  80. data/lib/templates/new/api/common.proto +59 -0
  81. data/lib/templates/new/api/data.proto +120 -0
  82. data/lib/templates/new/api/debug.proto +127 -0
  83. data/lib/templates/new/api/error.proto +221 -0
  84. data/lib/templates/new/api/query.proto +55 -0
  85. data/lib/templates/new/api/raw.proto +202 -0
  86. data/lib/templates/new/api/sc2api.proto +718 -0
  87. data/lib/templates/new/api/score.proto +108 -0
  88. data/lib/templates/new/api/spatial.proto +115 -0
  89. data/lib/templates/new/api/ui.proto +145 -0
  90. data/lib/templates/new/boot.rb.tt +6 -0
  91. data/lib/templates/new/my_bot.rb.tt +23 -0
  92. data/lib/templates/new/run_example_match.rb.tt +14 -0
  93. data/sc2ai.gemspec +80 -0
  94. metadata +344 -13
data/lib/sc2ai.rb CHANGED
@@ -1,9 +1,100 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "sc2ai/version"
3
+ # TODO: MOVE RUBY_GC_* to load into shell ENV, because they apparently can't be set at runtime.
4
+ # Arbitrary very large numbers which should not be reached
5
+ # RUBY_GC_MALLOC_LIMIT=128000000000;
6
+ # RUBY_GC_OLDMALLOC_LIMIT=128000000000;
7
+ # RUBY_GC_OLDMALLOC_LIMIT_MAX=128000000000;
8
+ # RUBY_GC_HEAP_INIT_SLOTS=329375
4
9
 
10
+ # In the event major runs, let it compact
11
+ GC.auto_compact = true
12
+
13
+ # For Numo linear algebra, fix paths for specific macOS's and on ladder
14
+ library_paths = if ENV["LD_LIBRARY_PATH"].nil?
15
+ []
16
+ else
17
+ ENV["LD_LIBRARY_PATH"].split(":")
18
+ end
19
+ library_paths << [
20
+ # MacOS
21
+ "/opt/homebrew/opt/lapack/lib",
22
+ "/opt/homebrew/opt/lapack/lib",
23
+ "/opt/homebrew/opt/openblas/lib",
24
+ # Ladder deploy
25
+ RbConfig::CONFIG["libdir"]
26
+ ]
27
+ ENV["LD_LIBRARY_PATH"] = library_paths.compact.join(":")
28
+
29
+ begin
30
+ require "numo/linalg/autoloader"
31
+ rescue => e
32
+ puts "Error from numo-linalg: #{e}"
33
+ puts "Lets get some linear algebra on your system..."
34
+ puts 'Mac: "brew install openblas"'
35
+ puts 'Debian/Ubuntu and WSL2: "apt install libopenblas0"'
36
+ if Gem.win_platform?
37
+ puts 'Windows: from CMD "ridk enable & pacman -S mingw-w64-ucrt-x86_64-openblas --noconfirm".'
38
+ end
39
+ puts 'That should be enough. If you still experience issues, "bundle install --redownload" to rebuild dependencies anew'
40
+ exit
41
+ end
42
+
43
+ # noinspection RubyMismatchedArgumentType
44
+ Dir.glob(File.join(__dir__, "sc2ai", "overrides", "**", "*.rb")).each do |file|
45
+ require(file)
46
+ end
47
+
48
+ # Protobuf internals don't allow sharing enums in the same package,
49
+ # so Blizzard under_scored some names. This throws errors when defining constants
50
+ # during packing/unpacking, because they dont start capitalized, so we silence temporarily.
51
+ silence_warnings do
52
+ require "rumale"
53
+ require_relative "sc2ai/protocol/sc2api_pb"
54
+ end
55
+ # noinspection RubyMismatchedArgumentType
56
+ Dir[File.join(__dir__, "sc2ai", "*.rb")].each { |file| require(file) }
57
+ # The upper include can probably preload everything it needs
58
+ # noinspection RubyMismatchedArgumentType
59
+ Dir[File.join(__dir__, "sc2ai", "protocol", "extensions", "**", "*.rb")].each { |file| require(file) }
60
+ # noinspection RubyMismatchedArgumentType
61
+ Dir[File.join(__dir__, "sc2ai", "local_play", "**", "*.rb")].each { |file| require(file) }
62
+
63
+ # Facilitates StarCraft 2 AI
5
64
  module Sc2
65
+ # Generic, single error for everything Sc2
6
66
  class Error < StandardError; end
7
67
 
8
- # You just unpacked a new board game. What do you do before you play?
68
+ class << self
69
+ # Instantiate the Configuration singleton or return it.
70
+ # Remember that the instance has attribute readers so that we can access the configured values
71
+ def config
72
+ @config ||= Configuration.new
73
+ yield @config if block_given?
74
+ @config
75
+ end
76
+
77
+ # Set to new Sc2::Configuration
78
+ attr_writer :config
79
+
80
+ # Sets logger singleton
81
+ attr_writer :logger
82
+
83
+ # @return [Logger] a logger instance or a new $stdout logger if undefined
84
+ def logger
85
+ return @logger if @logger
86
+
87
+ require "logger"
88
+
89
+ @logger = Logger.new($stdout)
90
+ @logger.level = :debug
91
+ @logger
92
+ end
93
+
94
+ # Returns whether we are on the ladder or not
95
+ # @return [Boolean]
96
+ def ladder?
97
+ @is_live ||= ENV.has_key?("AIARENA")
98
+ end
99
+ end
9
100
  end
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Ladder startup
4
+
5
+ # Sets Ruby path to local folder, env vars and
6
+ base_dir=$(realpath ${0%/*}/)
7
+ ruby_dir=$base_dir/.ruby
8
+ export PATH=$ruby_dir/bin:$PATH
9
+ export LD_LIBRARY_PATH=$(ruby -e 'puts RbConfig::CONFIG["libdir"]')
10
+
11
+ # Conservative heap sizes are based on 2x a tested medium-sized game
12
+ export RUBY_GC_HEAP_INIT_SIZE_40_SLOTS=340000
13
+ export RUBY_GC_HEAP_INIT_SIZE_80_SLOTS=50000
14
+ export RUBY_GC_HEAP_INIT_SIZE_160_SLOTS=18000
15
+ export RUBY_GC_HEAP_INIT_SIZE_320_SLOTS=2000
16
+ export RUBY_GC_HEAP_INIT_SIZE_640_SLOTS=1000
17
+
18
+ # Maxime <3
19
+ export RUBY_YJIT_ENABLE=true
20
+
21
+ export AIARENA=true
22
+ sc2ai ladderconfig
23
+ exec sc2ai laddermatch "$@" 1>&2
@@ -0,0 +1,20 @@
1
+ # SC2 artifacts
2
+ **/replays/*
3
+ *.SC2Replay
4
+ *.SC2Map
5
+ *.proto
6
+ *.zip
7
+
8
+
9
+ # Gem-specific ignores
10
+ .build/
11
+ data/debug_observation.json
12
+
13
+ # Other
14
+ .idea/
15
+ vendor/bundle
16
+ spec/
17
+ test/
18
+
19
+ # My ignores
20
+
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem 'sc2ai'
6
+
7
+
@@ -0,0 +1,59 @@
1
+
2
+ syntax = "proto2";
3
+
4
+ package Api;
5
+
6
+ message AvailableAbility {
7
+ optional int32 ability_id = 1;
8
+ optional bool requires_point = 2;
9
+ }
10
+
11
+ message ImageData {
12
+ optional int32 bits_per_pixel = 1; // Number of bits per pixel; 8 bits for a byte etc.
13
+ optional Size2DI size = 2; // Dimension in pixels.
14
+ optional bytes data = 3; // Binary data; the size of this buffer in bytes is width * height * bits_per_pixel / 8.
15
+ }
16
+
17
+ // Point on the screen/minimap (e.g., 0..64).
18
+ // Note: bottom left of the screen is 0, 0.
19
+ message PointI {
20
+ optional int32 x = 1;
21
+ optional int32 y = 2;
22
+ }
23
+
24
+ // Screen space rectangular area.
25
+ message RectangleI {
26
+ optional PointI p0 = 1;
27
+ optional PointI p1 = 2;
28
+ }
29
+
30
+ // Point on the game board, 0..255.
31
+ // Note: bottom left of the screen is 0, 0.
32
+ message Point2D {
33
+ optional float x = 1;
34
+ optional float y = 2;
35
+ }
36
+
37
+ // Point on the game board, 0..255.
38
+ // Note: bottom left of the screen is 0, 0.
39
+ message Point {
40
+ optional float x = 1;
41
+ optional float y = 2;
42
+ optional float z = 3;
43
+ }
44
+
45
+ // Screen dimensions.
46
+ message Size2DI {
47
+ optional int32 x = 1;
48
+ optional int32 y = 2;
49
+ }
50
+
51
+ enum Race {
52
+ NoRace = 0;
53
+ Terran = 1;
54
+ Zerg = 2;
55
+ Protoss = 3;
56
+ Random = 4;
57
+ }
58
+
59
+
@@ -0,0 +1,120 @@
1
+
2
+ syntax = "proto2";
3
+
4
+ package Api;
5
+
6
+ import "common.proto";
7
+
8
+ // May not relevant: queueable (everything is queueable).
9
+ // May not be important: AbilSetId - marine stim, marauder stim.
10
+ // Stuff omitted: transient.
11
+ // Stuff that may be important: cost, range, Alignment, targetfilters.
12
+ message AbilityData {
13
+ optional uint32 ability_id = 1; // Stable ID.
14
+ optional string link_name = 2; // Catalog name of the ability.
15
+ optional uint32 link_index = 3; // Catalog index of the ability.
16
+ optional string button_name = 4; // Name used for the command card. May not always be set.
17
+ optional string friendly_name = 5; // A human friendly name when the button name or link name isn't descriptive.
18
+ optional string hotkey = 6; // Hotkey. May not always be set.
19
+ optional uint32 remaps_to_ability_id = 7; // This ability id may be represented by the given more generic id.
20
+
21
+ enum Target {
22
+ None = 1; // Does not require a target.
23
+ Point = 2; // Requires a target position.
24
+ Unit = 3; // Requires a unit to target. Given by position using feature layers.
25
+ PointOrUnit = 4; // Requires either a target point or target unit.
26
+ PointOrNone = 5; // Requires either a target point or no target. (eg. building add-ons)
27
+ }
28
+
29
+ optional bool available = 8; // If true, the ability may be used by this set of mods/map.
30
+ optional Target target = 9; // Determines if a point is optional or required.
31
+ optional bool allow_minimap = 10; // Can be cast in the minimap.
32
+ optional bool allow_autocast = 11; // Autocast can be set.
33
+ optional bool is_building = 12; // Requires placement to construct a building.
34
+ optional float footprint_radius = 13; // Estimation of the footprint size. Need a better footprint.
35
+ optional bool is_instant_placement = 14; // Placement next to an existing structure, e.g., an add-on like a Tech Lab.
36
+ optional float cast_range = 15; // Range unit can cast ability without needing to approach target.
37
+ }
38
+
39
+ enum Attribute {
40
+ Light = 1;
41
+ Armored = 2;
42
+ Biological = 3;
43
+ Mechanical = 4;
44
+ Robotic = 5;
45
+ Psionic = 6;
46
+ Massive = 7;
47
+ Structure = 8;
48
+ Hover = 9;
49
+ Heroic = 10;
50
+ Summoned = 11;
51
+ }
52
+
53
+ message DamageBonus {
54
+ optional Attribute attribute = 1;
55
+ optional float bonus = 2;
56
+ }
57
+
58
+ message Weapon {
59
+ enum TargetType {
60
+ Ground = 1;
61
+ Air = 2;
62
+ Any = 3;
63
+ }
64
+ optional TargetType type = 1;
65
+ optional float damage = 2;
66
+ repeated DamageBonus damage_bonus = 3;
67
+ optional uint32 attacks = 4; // Number of hits per attack. (eg. Colossus has 2 beams)
68
+ optional float range = 5;
69
+ optional float speed = 6; // Time between attacks.
70
+ }
71
+
72
+ message UnitTypeData {
73
+ optional uint32 unit_id = 1; // Stable ID.
74
+ optional string name = 2; // Catalog name of the unit.
75
+ optional bool available = 3; // If true, the ability may be used by this set of mods/map.
76
+ optional uint32 cargo_size = 4; // Number of cargo slots it occupies in transports.
77
+ optional uint32 mineral_cost = 12;
78
+ optional uint32 vespene_cost = 13;
79
+ optional float food_required = 14;
80
+ optional float food_provided = 18;
81
+ optional uint32 ability_id = 15; // The ability that builds this unit.
82
+ optional Race race = 16;
83
+ optional float build_time = 17;
84
+ optional bool has_vespene = 19;
85
+ optional bool has_minerals = 20;
86
+ optional float sight_range = 25; // Range unit reveals vision.
87
+
88
+ repeated uint32 tech_alias = 21; // Other units that satisfy the same tech requirement.
89
+ optional uint32 unit_alias = 22; // The morphed variant of this unit.
90
+
91
+ optional uint32 tech_requirement = 23; // Structure required to build this unit. (Or any with the same tech_alias)
92
+ optional bool require_attached = 24; // Whether tech_requirement is an add-on.
93
+
94
+ // Values include changes from upgrades
95
+ repeated Attribute attributes = 8;
96
+ optional float movement_speed = 9;
97
+ optional float armor = 10;
98
+ repeated Weapon weapons = 11;
99
+ }
100
+
101
+ message UpgradeData {
102
+ optional uint32 upgrade_id = 1; // Stable ID.
103
+ optional string name = 2;
104
+ optional uint32 mineral_cost = 3;
105
+ optional uint32 vespene_cost = 4;
106
+ optional float research_time = 5;
107
+ optional uint32 ability_id = 6;
108
+ }
109
+
110
+ message BuffData {
111
+ optional uint32 buff_id = 1; // Stable ID.
112
+ optional string name = 2;
113
+ }
114
+
115
+ message EffectData {
116
+ optional uint32 effect_id = 1; // Stable ID.
117
+ optional string name = 2;
118
+ optional string friendly_name = 3;
119
+ optional float radius = 4;
120
+ }
@@ -0,0 +1,127 @@
1
+
2
+ syntax = "proto2";
3
+
4
+ package Api;
5
+
6
+ import "common.proto";
7
+
8
+ // Issue various useful commands to the game engine.
9
+ message DebugCommand {
10
+ oneof command {
11
+ DebugDraw draw = 1;
12
+ DebugGameState game_state = 2;
13
+ DebugCreateUnit create_unit = 3;
14
+ DebugKillUnit kill_unit = 4;
15
+ DebugTestProcess test_process = 5;
16
+ DebugSetScore score = 6; // Useful only for single-player "curriculum" maps.
17
+ DebugEndGame end_game = 7;
18
+ DebugSetUnitValue unit_value = 8;
19
+ }
20
+ }
21
+
22
+ message DebugDraw {
23
+ repeated DebugText text = 1;
24
+ repeated DebugLine lines = 2;
25
+ repeated DebugBox boxes = 3;
26
+ repeated DebugSphere spheres = 4;
27
+ }
28
+
29
+ message Line {
30
+ optional Point p0 = 1;
31
+ optional Point p1 = 2;
32
+ }
33
+
34
+ message Color {
35
+ optional uint32 r = 1;
36
+ optional uint32 g = 2;
37
+ optional uint32 b = 3;
38
+ }
39
+
40
+ // Display debug text on screen.
41
+ message DebugText {
42
+ optional Color color = 1;
43
+ optional string text = 2; // Text to display.
44
+ optional Point virtual_pos = 3; // Virtualized position in 2D (the screen is 0..1, 0..1 for any resolution).
45
+ optional Point world_pos = 4; // Position in the world.
46
+ optional uint32 size = 5; // Pixel height of the text. Defaults to 8px.
47
+ }
48
+
49
+ // Display debug lines on screen.
50
+ message DebugLine {
51
+ optional Color color = 1;
52
+ optional Line line = 2; // World space line.
53
+ }
54
+
55
+ // Display debug boxes on screen.
56
+ message DebugBox {
57
+ optional Color color = 1;
58
+ optional Point min = 2;
59
+ optional Point max = 3;
60
+ }
61
+
62
+ // Display debug spheres on screen.
63
+ message DebugSphere {
64
+ optional Color color = 1;
65
+ optional Point p = 2;
66
+ optional float r = 3;
67
+ }
68
+
69
+ enum DebugGameState {
70
+ show_map = 1;
71
+ control_enemy = 2;
72
+ food = 3;
73
+ free = 4;
74
+ all_resources = 5;
75
+ god = 6;
76
+ minerals = 7;
77
+ gas = 8;
78
+ cooldown = 9;
79
+ tech_tree = 10;
80
+ upgrade = 11;
81
+ fast_build = 12;
82
+ }
83
+
84
+ message DebugCreateUnit {
85
+ optional uint32 unit_type = 1;
86
+ optional int32 owner = 2;
87
+ optional Point2D pos = 3;
88
+ optional uint32 quantity = 4;
89
+ }
90
+
91
+ message DebugKillUnit {
92
+ repeated uint64 tag = 1;
93
+ }
94
+
95
+ message DebugTestProcess {
96
+ enum Test {
97
+ hang = 1;
98
+ crash = 2;
99
+ exit = 3;
100
+ }
101
+ optional Test test = 1;
102
+ optional int32 delay_ms = 2;
103
+ }
104
+
105
+ message DebugSetScore {
106
+ optional float score = 1;
107
+ }
108
+
109
+ message DebugEndGame {
110
+ enum EndResult {
111
+ Surrender = 1; // Default if nothing is set. The current player admits defeat.
112
+ DeclareVictory = 2;
113
+ }
114
+ optional EndResult end_result = 1;
115
+ }
116
+
117
+ message DebugSetUnitValue {
118
+ enum UnitValue {
119
+ Energy = 1;
120
+ Life = 2;
121
+ Shields = 3;
122
+ }
123
+ optional UnitValue unit_value = 1;
124
+ optional float value = 2;
125
+ optional uint64 unit_tag = 3;
126
+ }
127
+
@@ -0,0 +1,221 @@
1
+
2
+ syntax = "proto2";
3
+
4
+ package Api;
5
+
6
+ enum ActionResult {
7
+ Success = 1;
8
+ NotSupported = 2;
9
+ Error = 3;
10
+ CantQueueThatOrder = 4;
11
+ Retry = 5;
12
+ Cooldown = 6;
13
+ QueueIsFull = 7;
14
+ RallyQueueIsFull = 8;
15
+ NotEnoughMinerals = 9;
16
+ NotEnoughVespene = 10;
17
+ NotEnoughTerrazine = 11;
18
+ NotEnoughCustom = 12;
19
+ NotEnoughFood = 13;
20
+ FoodUsageImpossible = 14;
21
+ NotEnoughLife = 15;
22
+ NotEnoughShields = 16;
23
+ NotEnoughEnergy = 17;
24
+ LifeSuppressed = 18;
25
+ ShieldsSuppressed = 19;
26
+ EnergySuppressed = 20;
27
+ NotEnoughCharges = 21;
28
+ CantAddMoreCharges = 22;
29
+ TooMuchMinerals = 23;
30
+ TooMuchVespene = 24;
31
+ TooMuchTerrazine = 25;
32
+ TooMuchCustom = 26;
33
+ TooMuchFood = 27;
34
+ TooMuchLife = 28;
35
+ TooMuchShields = 29;
36
+ TooMuchEnergy = 30;
37
+ MustTargetUnitWithLife = 31;
38
+ MustTargetUnitWithShields = 32;
39
+ MustTargetUnitWithEnergy = 33;
40
+ CantTrade = 34;
41
+ CantSpend = 35;
42
+ CantTargetThatUnit = 36;
43
+ CouldntAllocateUnit = 37;
44
+ UnitCantMove = 38;
45
+ TransportIsHoldingPosition = 39;
46
+ BuildTechRequirementsNotMet = 40;
47
+ CantFindPlacementLocation = 41;
48
+ CantBuildOnThat = 42;
49
+ CantBuildTooCloseToDropOff = 43;
50
+ CantBuildLocationInvalid = 44;
51
+ CantSeeBuildLocation = 45;
52
+ CantBuildTooCloseToCreepSource = 46;
53
+ CantBuildTooCloseToResources = 47;
54
+ CantBuildTooFarFromWater = 48;
55
+ CantBuildTooFarFromCreepSource = 49;
56
+ CantBuildTooFarFromBuildPowerSource = 50;
57
+ CantBuildOnDenseTerrain = 51;
58
+ CantTrainTooFarFromTrainPowerSource = 52;
59
+ CantLandLocationInvalid = 53;
60
+ CantSeeLandLocation = 54;
61
+ CantLandTooCloseToCreepSource = 55;
62
+ CantLandTooCloseToResources = 56;
63
+ CantLandTooFarFromWater = 57;
64
+ CantLandTooFarFromCreepSource = 58;
65
+ CantLandTooFarFromBuildPowerSource = 59;
66
+ CantLandTooFarFromTrainPowerSource = 60;
67
+ CantLandOnDenseTerrain = 61;
68
+ AddOnTooFarFromBuilding = 62;
69
+ MustBuildRefineryFirst = 63;
70
+ BuildingIsUnderConstruction = 64;
71
+ CantFindDropOff = 65;
72
+ CantLoadOtherPlayersUnits = 66;
73
+ NotEnoughRoomToLoadUnit = 67;
74
+ CantUnloadUnitsThere = 68;
75
+ CantWarpInUnitsThere = 69;
76
+ CantLoadImmobileUnits = 70;
77
+ CantRechargeImmobileUnits = 71;
78
+ CantRechargeUnderConstructionUnits = 72;
79
+ CantLoadThatUnit = 73;
80
+ NoCargoToUnload = 74;
81
+ LoadAllNoTargetsFound = 75;
82
+ NotWhileOccupied = 76;
83
+ CantAttackWithoutAmmo = 77;
84
+ CantHoldAnyMoreAmmo = 78;
85
+ TechRequirementsNotMet = 79;
86
+ MustLockdownUnitFirst = 80;
87
+ MustTargetUnit = 81;
88
+ MustTargetInventory = 82;
89
+ MustTargetVisibleUnit = 83;
90
+ MustTargetVisibleLocation = 84;
91
+ MustTargetWalkableLocation = 85;
92
+ MustTargetPawnableUnit = 86;
93
+ YouCantControlThatUnit = 87;
94
+ YouCantIssueCommandsToThatUnit = 88;
95
+ MustTargetResources = 89;
96
+ RequiresHealTarget = 90;
97
+ RequiresRepairTarget = 91;
98
+ NoItemsToDrop = 92;
99
+ CantHoldAnyMoreItems = 93;
100
+ CantHoldThat = 94;
101
+ TargetHasNoInventory = 95;
102
+ CantDropThisItem = 96;
103
+ CantMoveThisItem = 97;
104
+ CantPawnThisUnit = 98;
105
+ MustTargetCaster = 99;
106
+ CantTargetCaster = 100;
107
+ MustTargetOuter = 101;
108
+ CantTargetOuter = 102;
109
+ MustTargetYourOwnUnits = 103;
110
+ CantTargetYourOwnUnits = 104;
111
+ MustTargetFriendlyUnits = 105;
112
+ CantTargetFriendlyUnits = 106;
113
+ MustTargetNeutralUnits = 107;
114
+ CantTargetNeutralUnits = 108;
115
+ MustTargetEnemyUnits = 109;
116
+ CantTargetEnemyUnits = 110;
117
+ MustTargetAirUnits = 111;
118
+ CantTargetAirUnits = 112;
119
+ MustTargetGroundUnits = 113;
120
+ CantTargetGroundUnits = 114;
121
+ MustTargetStructures = 115;
122
+ CantTargetStructures = 116;
123
+ MustTargetLightUnits = 117;
124
+ CantTargetLightUnits = 118;
125
+ MustTargetArmoredUnits = 119;
126
+ CantTargetArmoredUnits = 120;
127
+ MustTargetBiologicalUnits = 121;
128
+ CantTargetBiologicalUnits = 122;
129
+ MustTargetHeroicUnits = 123;
130
+ CantTargetHeroicUnits = 124;
131
+ MustTargetRoboticUnits = 125;
132
+ CantTargetRoboticUnits = 126;
133
+ MustTargetMechanicalUnits = 127;
134
+ CantTargetMechanicalUnits = 128;
135
+ MustTargetPsionicUnits = 129;
136
+ CantTargetPsionicUnits = 130;
137
+ MustTargetMassiveUnits = 131;
138
+ CantTargetMassiveUnits = 132;
139
+ MustTargetMissile = 133;
140
+ CantTargetMissile = 134;
141
+ MustTargetWorkerUnits = 135;
142
+ CantTargetWorkerUnits = 136;
143
+ MustTargetEnergyCapableUnits = 137;
144
+ CantTargetEnergyCapableUnits = 138;
145
+ MustTargetShieldCapableUnits = 139;
146
+ CantTargetShieldCapableUnits = 140;
147
+ MustTargetFlyers = 141;
148
+ CantTargetFlyers = 142;
149
+ MustTargetBuriedUnits = 143;
150
+ CantTargetBuriedUnits = 144;
151
+ MustTargetCloakedUnits = 145;
152
+ CantTargetCloakedUnits = 146;
153
+ MustTargetUnitsInAStasisField = 147;
154
+ CantTargetUnitsInAStasisField = 148;
155
+ MustTargetUnderConstructionUnits = 149;
156
+ CantTargetUnderConstructionUnits = 150;
157
+ MustTargetDeadUnits = 151;
158
+ CantTargetDeadUnits = 152;
159
+ MustTargetRevivableUnits = 153;
160
+ CantTargetRevivableUnits = 154;
161
+ MustTargetHiddenUnits = 155;
162
+ CantTargetHiddenUnits = 156;
163
+ CantRechargeOtherPlayersUnits = 157;
164
+ MustTargetHallucinations = 158;
165
+ CantTargetHallucinations = 159;
166
+ MustTargetInvulnerableUnits = 160;
167
+ CantTargetInvulnerableUnits = 161;
168
+ MustTargetDetectedUnits = 162;
169
+ CantTargetDetectedUnits = 163;
170
+ CantTargetUnitWithEnergy = 164;
171
+ CantTargetUnitWithShields = 165;
172
+ MustTargetUncommandableUnits = 166;
173
+ CantTargetUncommandableUnits = 167;
174
+ MustTargetPreventDefeatUnits = 168;
175
+ CantTargetPreventDefeatUnits = 169;
176
+ MustTargetPreventRevealUnits = 170;
177
+ CantTargetPreventRevealUnits = 171;
178
+ MustTargetPassiveUnits = 172;
179
+ CantTargetPassiveUnits = 173;
180
+ MustTargetStunnedUnits = 174;
181
+ CantTargetStunnedUnits = 175;
182
+ MustTargetSummonedUnits = 176;
183
+ CantTargetSummonedUnits = 177;
184
+ MustTargetUser1 = 178;
185
+ CantTargetUser1 = 179;
186
+ MustTargetUnstoppableUnits = 180;
187
+ CantTargetUnstoppableUnits = 181;
188
+ MustTargetResistantUnits = 182;
189
+ CantTargetResistantUnits = 183;
190
+ MustTargetDazedUnits = 184;
191
+ CantTargetDazedUnits = 185;
192
+ CantLockdown = 186;
193
+ CantMindControl = 187;
194
+ MustTargetDestructibles = 188;
195
+ CantTargetDestructibles = 189;
196
+ MustTargetItems = 190;
197
+ CantTargetItems = 191;
198
+ NoCalldownAvailable = 192;
199
+ WaypointListFull = 193;
200
+ MustTargetRace = 194;
201
+ CantTargetRace = 195;
202
+ MustTargetSimilarUnits = 196;
203
+ CantTargetSimilarUnits = 197;
204
+ CantFindEnoughTargets = 198;
205
+ AlreadySpawningLarva = 199;
206
+ CantTargetExhaustedResources = 200;
207
+ CantUseMinimap = 201;
208
+ CantUseInfoPanel = 202;
209
+ OrderQueueIsFull = 203;
210
+ CantHarvestThatResource = 204;
211
+ HarvestersNotRequired = 205;
212
+ AlreadyTargeted = 206;
213
+ CantAttackWeaponsDisabled = 207;
214
+ CouldntReachTarget = 208;
215
+ TargetIsOutOfRange = 209;
216
+ TargetIsTooClose = 210;
217
+ TargetIsOutOfArc = 211;
218
+ CantFindTeleportLocation = 212;
219
+ InvalidItemClass = 213;
220
+ CantFindCancelOrder = 214;
221
+ }