sc2ai 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/data/sc2ai/protocol/common.proto +6 -6
  3. data/data/sc2ai/protocol/data.proto +23 -20
  4. data/data/sc2ai/protocol/debug.proto +25 -21
  5. data/data/sc2ai/protocol/error.proto +217 -215
  6. data/data/sc2ai/protocol/query.proto +1 -1
  7. data/data/sc2ai/protocol/raw.proto +16 -14
  8. data/data/sc2ai/protocol/sc2api.proto +108 -94
  9. data/data/sc2ai/protocol/score.proto +4 -3
  10. data/data/sc2ai/protocol/spatial.proto +6 -5
  11. data/data/sc2ai/protocol/ui.proto +17 -14
  12. data/exe/sc2ai +0 -3
  13. data/lib/docker_build/Dockerfile.ruby +4 -2
  14. data/lib/sc2ai/api/ability_id.rb +6 -1
  15. data/lib/sc2ai/api/data.rb +18 -3
  16. data/lib/sc2ai/api/tech_tree.rb +1 -1
  17. data/lib/sc2ai/api/tech_tree_data.rb +54 -3
  18. data/lib/sc2ai/connection/connection_listener.rb +3 -3
  19. data/lib/sc2ai/connection/requests.rb +31 -35
  20. data/lib/sc2ai/connection/status_listener.rb +1 -1
  21. data/lib/sc2ai/connection.rb +1 -2
  22. data/lib/sc2ai/local_play/client.rb +2 -2
  23. data/lib/sc2ai/local_play/match.rb +7 -2
  24. data/lib/sc2ai/overrides/async/process/child.rb +1 -1
  25. data/lib/sc2ai/paths.rb +12 -2
  26. data/lib/sc2ai/player/actions.rb +54 -35
  27. data/lib/sc2ai/player/debug.rb +54 -20
  28. data/lib/sc2ai/player/game_state.rb +11 -18
  29. data/lib/sc2ai/player/geo.rb +56 -66
  30. data/lib/sc2ai/player/units.rb +41 -17
  31. data/lib/sc2ai/player.rb +104 -47
  32. data/lib/sc2ai/ports.rb +1 -2
  33. data/lib/sc2ai/protocol/_meta_documentation.rb +270 -25
  34. data/lib/sc2ai/protocol/common_pb.rb +3862 -33
  35. data/lib/sc2ai/protocol/data_pb.rb +9106 -36
  36. data/lib/sc2ai/protocol/debug_pb.rb +10434 -45
  37. data/lib/sc2ai/protocol/error_pb.rb +1084 -29
  38. data/lib/sc2ai/protocol/extensions/ability_remapable.rb +9 -9
  39. data/lib/sc2ai/protocol/extensions/action.rb +60 -0
  40. data/lib/sc2ai/protocol/extensions/point_2_d.rb +9 -0
  41. data/lib/sc2ai/protocol/extensions/position.rb +11 -36
  42. data/lib/sc2ai/protocol/extensions/power_source.rb +3 -0
  43. data/lib/sc2ai/protocol/extensions/unit.rb +61 -36
  44. data/lib/sc2ai/protocol/extensions/unit_type_data.rb +8 -0
  45. data/lib/sc2ai/protocol/query_pb.rb +5022 -36
  46. data/lib/sc2ai/protocol/raw_pb.rb +18347 -46
  47. data/lib/sc2ai/protocol/sc2api_pb.rb +48424 -126
  48. data/lib/sc2ai/protocol/score_pb.rb +5965 -30
  49. data/lib/sc2ai/protocol/spatial_pb.rb +11941 -37
  50. data/lib/sc2ai/protocol/ui_pb.rb +12924 -46
  51. data/lib/sc2ai/unit_group/action_ext.rb +0 -2
  52. data/lib/sc2ai/unit_group/filter_ext.rb +24 -8
  53. data/lib/sc2ai/unit_group/geo_ext.rb +0 -2
  54. data/lib/sc2ai/unit_group.rb +1 -1
  55. data/lib/sc2ai/version.rb +2 -3
  56. data/lib/sc2ai.rb +10 -11
  57. data/lib/templates/ladderzip/bin/ladder.tt +0 -3
  58. data/lib/templates/new/.ladderignore +15 -5
  59. data/lib/templates/new/api/common.proto +6 -6
  60. data/lib/templates/new/api/data.proto +23 -20
  61. data/lib/templates/new/api/debug.proto +25 -21
  62. data/lib/templates/new/api/error.proto +217 -215
  63. data/lib/templates/new/api/query.proto +1 -1
  64. data/lib/templates/new/api/raw.proto +16 -14
  65. data/lib/templates/new/api/sc2api.proto +108 -94
  66. data/lib/templates/new/api/score.proto +4 -3
  67. data/lib/templates/new/api/spatial.proto +6 -5
  68. data/lib/templates/new/api/ui.proto +17 -14
  69. data/lib/templates/new/boot.rb.tt +1 -1
  70. data/lib/templates/new/my_bot.rb.tt +2 -2
  71. data/lib/templates/new/run_example_match.rb.tt +2 -2
  72. data/sig/sc2ai.rbs +11072 -1651
  73. metadata +31 -26
  74. data/lib/sc2ai/overrides/kernel.rb +0 -33
  75. data/lib/sc2ai/protocol/extensions/unit_type.rb +0 -9
data/lib/sc2ai/player.rb CHANGED
@@ -21,10 +21,10 @@ module Sc2
21
21
  extend Forwardable
22
22
  def_delegators :@api, :add_listener
23
23
 
24
- # Known races for detecting race on Api::Race::Random or nil
24
+ # Known races for detecting race on Api::Race::RANDOM or nil
25
25
  # @!attribute IDENTIFIED_RACES
26
- # @return [Array<Integer>]
27
- IDENTIFIED_RACES = [Api::Race::Protoss, Api::Race::Terran, Api::Race::Zerg].freeze
26
+ # @return [Array<Integer>]
27
+ IDENTIFIED_RACES = [Api::Race::PROTOSS, Api::Race::TERRAN, Api::Race::ZERG].freeze
28
28
 
29
29
  # @!attribute api
30
30
  # Manages connection to client and performs Requests
@@ -51,27 +51,22 @@ module Sc2
51
51
  # @return [Hash]
52
52
  attr_accessor :interface_options
53
53
 
54
- # @return [Api::Race::NoRace] if Observer
55
- # @return [Api::Race::Terran] if is_a? Bot, Human, BotProcess
56
- # @return [Api::Race::Zerg] if is_a? Bot, Human, BotProcess
57
- # @return [Api::Race::Protoss] if is_a? Bot, Human, BotProcess
58
- # @return [Api::Race::Random] if specified random and in-game race hasn't been scouted yet
59
- # @return [nil] if is_a? forgetful person
54
+ # @return [Integer] Api::Race enum
60
55
  attr_accessor :race
61
56
 
62
57
  # @return [String] in-game name
63
58
  attr_accessor :name
64
59
 
65
- # @return [Api::PlayerType::Participant, Api::PlayerType::Computer, Api::PlayerType::Observer] PlayerType
60
+ # @return [Integer] Api::PlayerType::PARTICIPANT, Api::PlayerType::COMPUTER, Api::PlayerType::OBSERVER
66
61
  attr_accessor :type
67
62
 
68
- # if @type is Api::PlayerType::Computer, set one of Api::Difficulty scale 1 to 10
63
+ # if @type is Api::PlayerType::COMPUTER, set one of Api::Difficulty scale 1 to 10
69
64
  # @see Api::Difficulty for options
70
- # @return [Api::Difficulty::VeryEasy] if easiest, int 1
71
- # @return [Api::Difficulty::CheatInsane] if toughest, int 10
65
+ # @return [Integer]
72
66
  attr_accessor :difficulty
73
67
 
74
68
  # @see Api::AIBuild proto for options
69
+ # @return [Integer]
75
70
  attr_accessor :ai_build
76
71
 
77
72
  # @return [String] ladder matches will set an opponent id
@@ -153,7 +148,7 @@ module Sc2
153
148
  def join_game(server_host:, port_config:)
154
149
  Sc2.logger.debug { "Player \"#{@name}\" joining game..." }
155
150
  response = @api.join_game(name: @name, race: @race, server_host:, port_config:, enable_feature_layer: @enable_feature_layer, interface_options: @interface_options)
156
- if !response.error.nil? && response.error != :MissingParticipation
151
+ if response.error != :ENUM_RESPONSE_JOIN_GAME_ERROR_UNSET && response.error != :MISSING_PARTICIPATION
157
152
  raise Sc2::Error, "Player \"#{@name}\" join_game failed: #{response.error}"
158
153
  end
159
154
  add_listener(self, klass: Connection::StatusListener)
@@ -172,7 +167,7 @@ module Sc2
172
167
  # Bot
173
168
  # race != None
174
169
  # name=''
175
- # type: Api::PlayerType::Participant
170
+ # type: Api::PlayerType::PARTICIPANT
176
171
 
177
172
  # An object which interacts with an SC2 client and is game-aware.
178
173
  class Bot < Player
@@ -193,7 +188,7 @@ module Sc2
193
188
  attr_accessor :geo
194
189
 
195
190
  def initialize(race:, name:)
196
- super(race:, name:, type: Api::PlayerType::Participant, difficulty: nil, ai_build: nil)
191
+ super(race:, name:, type: Api::PlayerType::PARTICIPANT, difficulty: nil, ai_build: nil)
197
192
  @previous = Sc2::Player::PreviousState.new
198
193
  @geo = Sc2::Player::Geo.new(self)
199
194
 
@@ -211,11 +206,12 @@ module Sc2
211
206
  # end
212
207
  def configure
213
208
  end
209
+
214
210
  alias_method :before_join, :configure
215
211
 
216
212
  # TODO: If this suffices for Bot and Observer, they should share this code.
217
213
  # Initializes and refreshes game data and runs the game loop
218
- # @return [Api::Result::Victory, Api::Result::Defeat, Api::Result::Tie, Api::Result::Undecided] result
214
+ # @return [Integer] One of Api::Result::VICTORY, Api::Result::DEFEAT, Api::Result::TIE, Api::Result::UNDECIDED
219
215
  def play
220
216
  # Step 0
221
217
  prepare_start
@@ -227,16 +223,45 @@ module Sc2
227
223
  # Callback for step 0
228
224
  on_step
229
225
 
226
+ # Local play prints out avg times
227
+ unless Sc2.ladder?
228
+ running_avg_step_times = []
229
+ average_runtime = 0.0
230
+ end
231
+
230
232
  puts ""
233
+
231
234
  # Step 1 to n
235
+ i = 0
232
236
  loop do
237
+ if i >= 5
238
+ i = 0
239
+ end
233
240
  r = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
234
241
  perform_actions
235
242
  perform_debug_commands unless Sc2.ladder?
236
243
  step_forward
237
- print "\e[2K#{game_loop - @previous.game_loop} Steps Took (ms): #{(::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - r) * 1000}\n\e[1A\r"
244
+
245
+ unless Sc2.ladder?
246
+ time_delta = (::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - r) * 1000
247
+ step_delta = game_loop - @previous.game_loop
248
+ # running_avg_step_times.shift if running_avg_step_times.size == 5
249
+ running_avg_step_times << [time_delta, step_delta]
250
+
251
+ if i == 0
252
+ sum_t, sum_s = running_avg_step_times.each_with_object([0, 0]) do |n, total|
253
+ total[0] += n[0]
254
+ total[1] += n[1]
255
+ end
256
+ average_runtime = sum_t / sum_s
257
+ running_avg_step_times.clear
258
+ end
259
+ print "\e[2K#{step_delta} Step(s) Took (ms): #{"%.2f" % time_delta} | Avg (ms/frame): #{"%.2f" % average_runtime}\n\e[1A\r"
260
+ end
261
+
262
+ i += 1
238
263
  return @result unless @result.nil?
239
- break if @status != :in_game
264
+ break if @status != :IN_GAME
240
265
  end
241
266
  end
242
267
 
@@ -261,11 +286,11 @@ module Sc2
261
286
  # Callbacks ---
262
287
 
263
288
  # Override to handle game result (:Victory/:Loss/:Tie)
264
- # Called when game has ended with a result, i.e. result = ::Victory
265
- # @param result [Symbol] Api::Result::Victory or Api::Result::Victory::Defeat or Api::Result::Victory::Undecided
289
+ # Called when game has ended with a result, i.e. result = :Victory
290
+ # @param result [Symbol] Api::Result::VICTORY or Api::Result::DEFEAT or Api::Result::UNDECIDED
266
291
  # @example
267
292
  # def on_finish(result)
268
- # if result == :Victory
293
+ # if result == :VICTORY
269
294
  # puts "Yay!"
270
295
  # else
271
296
  # puts "Lets try again!"
@@ -277,7 +302,7 @@ module Sc2
277
302
 
278
303
  # Called when Random race is first detected.
279
304
  # Override to handle race identification of random enemy.
280
- # @param race [Integer] Api::Race::* excl *::Random
305
+ # @param race [Integer] see {Api::Race}
281
306
  def on_random_race_detected(race)
282
307
  end
283
308
 
@@ -301,9 +326,9 @@ module Sc2
301
326
  # @example
302
327
  # alerts.each do |alert|
303
328
  # case alert
304
- # when :NuclearLaunchDetected
329
+ # when :NUCLEAR_LAUNCH_DETECTED
305
330
  # pp "TAKE COVER!"
306
- # when :NydusWormDetected
331
+ # when :NYDUS_WORM_DETECTED
307
332
  # pp "FIND THE WORM!"
308
333
  # end
309
334
  # end
@@ -423,26 +448,26 @@ module Sc2
423
448
  # Allows using CLI launch options hash or "laddorconfig.json"-complient launcher.
424
449
  class BotProcess < Player
425
450
  def initialize(race:, name:)
426
- super(race:, name:, type: Api::PlayerType::Participant)
451
+ super(race:, name:, type: Api::PlayerType::PARTICIPANT)
427
452
  raise "not implemented"
428
453
  end
429
454
  end
430
455
 
431
456
  # A Computer opponent using the game's built-in AI for a Match
432
457
  class Computer < Player
433
- # @param race [Integer] (see Api::Race)
434
- # @param difficulty [Integer] see Api::Difficulty::VeryEasy,Api::Difficulty::VeryHard,etc.)
435
- # @param ai_build [Api::AIBuild::RandomBuild] (see Api::AIBuild)
458
+ # @param race [Integer] see {Api::Race}
459
+ # @param difficulty [Integer] Api::Difficulty::VERY_EASY, Api::Difficulty::VERY_HARD,etc.
460
+ # @param ai_build [Integer] default: Api::AIBuild::RANDOM_BUILD
436
461
  # @param name [String]
437
462
  # @return [Sc2::Computer]
438
- def initialize(race:, difficulty: Api::Difficulty::VeryEasy, ai_build: Api::AIBuild::RandomBuild,
463
+ def initialize(race:, difficulty: Api::Difficulty::VERY_EASY, ai_build: Api::AIBuild::RANDOM_BUILD,
439
464
  name: "Computer")
440
- difficulty = Api::Difficulty::VeryEasy if difficulty.nil?
441
- ai_build = Api::AIBuild::RandomBuild if ai_build.nil?
465
+ difficulty = Api::Difficulty::VERY_EASY if difficulty.nil?
466
+ ai_build = Api::AIBuild::RANDOM_BUILD if ai_build.nil?
442
467
  raise Error, "unknown difficulty: '#{difficulty}'" if Api::Difficulty.lookup(difficulty).nil?
443
468
  raise Error, "unknown difficulty: '#{ai_build}'" if Api::AIBuild.lookup(ai_build).nil?
444
469
 
445
- super(race:, name:, type: Api::PlayerType::Computer, difficulty:, ai_build:)
470
+ super(race:, name:, type: Api::PlayerType::COMPUTER, difficulty:, ai_build:)
446
471
  end
447
472
 
448
473
  # Returns whether or not the player requires a sc2 instance
@@ -460,14 +485,14 @@ module Sc2
460
485
  # A human player for a Match
461
486
  class Human < Player
462
487
  def initialize(race:, name:)
463
- super(race:, name:, type: Api::PlayerType::Participant)
488
+ super(race:, name:, type: Api::PlayerType::PARTICIPANT)
464
489
  end
465
490
  end
466
491
 
467
492
  # A spectator for a Match
468
493
  class Observer < Player
469
494
  def initialize(name: nil)
470
- super(race: Api::Race::NoRace, name:, type: Api::PlayerType::Observer)
495
+ super(race: Api::Race::NO_RACE, name:, type: Api::PlayerType::OBSERVER)
471
496
  end
472
497
  end
473
498
 
@@ -481,6 +506,29 @@ module Sc2
481
506
 
482
507
  private
483
508
 
509
+ # @private
510
+ CALLBACK_METHODS = %i[on_finish
511
+ on_random_race_detected
512
+ on_action_errors
513
+ on_actions_performed
514
+ on_alerts
515
+ on_upgrades_completed
516
+ on_parse_observation_unit
517
+ on_unit_destroyed
518
+ on_unit_created
519
+ on_unit_type_changed
520
+ on_structure_started
521
+ on_structure_completed
522
+ on_unit_damaged]
523
+
524
+ # @private
525
+ # Checks if callback method is defined on our bot
526
+ # Used to skip processing on unused callbacks
527
+ # @param callback [Symbol]
528
+ def callback_defined?(callback)
529
+ CALLBACK_METHODS.include?(callback)
530
+ end
531
+
484
532
  # Initialize data on step 0 before stepping and before on_start is called
485
533
  def prepare_start
486
534
  @data = Sc2::Data.new(@api.data)
@@ -525,6 +573,10 @@ module Sc2
525
573
 
526
574
  # Save previous frame before continuing
527
575
  @previous.reset(self)
576
+
577
+ # We can request game info async, while we process observation
578
+ refresh_game_info
579
+
528
580
  # Reset
529
581
  self.observation = response_observation.observation
530
582
  self.game_loop = observation.game_loop
@@ -532,17 +584,14 @@ module Sc2
532
584
  self.spent_minerals = 0
533
585
  self.spent_vespene = 0
534
586
  self.spent_supply = 0
535
- # Geometric/map
536
- if observation.raw_data.map_state.visibility != previous.observation&.raw_data&.map_state&.visibility
537
- @parsed_visibility_grid = nil
538
- end
587
+ geo.reset
539
588
 
540
- # Only grab game_info if unset (loop 0 or first realtime loop). It's lazily loaded otherwise as needed
541
- # This is heavy processing, because it contains image data
542
- if game_info.nil?
543
- refresh_game_info
589
+ # First game-loop: set enemy and our race if random
590
+ if enemy.nil?
591
+ # Finish game_info load immediately, because we need it's info
592
+ game_info
544
593
  set_enemy
545
- set_race_for_random if race == Api::Race::Random
594
+ set_race_for_random if race == Api::Race::RANDOM
546
595
  end
547
596
 
548
597
  parse_observation_units(response_observation.observation)
@@ -554,7 +603,12 @@ module Sc2
554
603
 
555
604
  # Actions performed and errors (only if implemented)
556
605
  on_actions_performed(response_observation.actions) unless response_observation.actions.empty?
557
- on_action_errors(response_observation.action_errors) unless response_observation.action_errors.empty?
606
+ if callback_defined?(:on_action_errors)
607
+ unless response_observation.action_errors.empty?
608
+ @action_errors.concat(response_observation.action_errors.to_a)
609
+ end
610
+ on_action_errors(@action_errors) unless @action_errors&.empty?
611
+ end
558
612
  on_alerts(observation.alerts) unless observation.alerts.empty?
559
613
 
560
614
  # Diff previous observation upgrades to see if anything new completed
@@ -583,7 +637,10 @@ module Sc2
583
637
  # Refreshes bot#game_info ignoring all caches
584
638
  # @return [void]
585
639
  public def refresh_game_info
586
- self.game_info = @api.game_info
640
+ @game_info_task = Async do
641
+ self.game_info = @api.game_info
642
+ @game_info_task = nil
643
+ end
587
644
  end
588
645
 
589
646
  # Enemy -----------------------
@@ -600,7 +657,7 @@ module Sc2
600
657
  self.enemy = Sc2::Player::Enemy.from_proto(player_info: enemy_player_info)
601
658
 
602
659
  if enemy.nil?
603
- self.enemy = Sc2::Player::Enemy.new(name: "Unknown", race: Api::Race::Random)
660
+ self.enemy = Sc2::Player::Enemy.new(name: "Unknown", race: Api::Race::RANDOM)
604
661
  end
605
662
  if enemy.race_unknown?
606
663
  detected_race = enemy.detect_race_from_units
data/lib/sc2ai/ports.rb CHANGED
@@ -124,7 +124,6 @@ module Sc2
124
124
  ensure
125
125
  # noinspection RubyScope
126
126
  socket&.close
127
- false
128
127
  end
129
128
  end
130
129
  end
@@ -136,7 +135,7 @@ module Sc2
136
135
  def initialize(start_port:, num_players:, ports: [])
137
136
  @start_port = start_port
138
137
  @server_port_set = nil
139
- @client_port_sets = nil
138
+ @client_port_sets = []
140
139
  return if num_players <= 1
141
140
 
142
141
  return if ports.empty?
@@ -6,39 +6,39 @@
6
6
  # @!parse
7
7
  # module Api;
8
8
  # # Protobuf virtual class.
9
- # class Color < Google::Protobuf::AbstractMessage; end;
9
+ # class Color end;
10
10
  # # Protobuf virtual class.
11
- # class Point < Google::Protobuf::AbstractMessage; end;
11
+ # class Point end;
12
12
  # # Protobuf virtual class.
13
- # class Point2D < Google::Protobuf::AbstractMessage; end;
13
+ # class Point2D end;
14
14
  # # Protobuf virtual class.
15
- # class PointI < Google::Protobuf::AbstractMessage; end;
15
+ # class PointI end;
16
16
  # # Protobuf virtual class.
17
- # class PowerSource < Google::Protobuf::AbstractMessage; end;
17
+ # class PowerSource end;
18
18
  # # Protobuf virtual class.
19
- # class Size2DI < Google::Protobuf::AbstractMessage; end;
19
+ # class Size2DI end;
20
20
  # # Protobuf virtual class.
21
- # class Point < Google::Protobuf::AbstractMessage; end;
21
+ # class Point end;
22
22
  # # Protobuf virtual class.
23
- # class Unit < Google::Protobuf::AbstractMessage; end;
23
+ # class Unit end;
24
24
  # # Protobuf virtual class.
25
- # class UnitTypeData < Google::Protobuf::AbstractMessage; end;
25
+ # class UnitTypeData end;
26
26
  # # Protobuf virtual class.
27
- # class AvailableAbility < Google::Protobuf::AbstractMessage; end;
27
+ # class AvailableAbility end;
28
28
  # # Protobuf virtual class.
29
- # class UnitOrder < Google::Protobuf::AbstractMessage; end;
29
+ # class UnitOrder end;
30
30
  # # Protobuf virtual class.
31
- # class ActionRawUnitCommand < Google::Protobuf::AbstractMessage; end;
31
+ # class ActionRawUnitCommand end;
32
32
  # # Protobuf virtual class.
33
- # class ActionRawToggleAutocast < Google::Protobuf::AbstractMessage; end;
33
+ # class ActionRawToggleAutocast end;
34
34
  # # Protobuf virtual class.
35
- # class ActionError < Google::Protobuf::AbstractMessage; end;
35
+ # class ActionError end;
36
36
  # # Protobuf virtual class.
37
- # class ActionSpatialUnitCommand < Google::Protobuf::AbstractMessage; end;
37
+ # class ActionSpatialUnitCommand end;
38
38
  # # Protobuf virtual class.
39
- # class BuildItem < Google::Protobuf::AbstractMessage; end;
39
+ # class BuildItem end;
40
40
  # # Protobuf virtual class.
41
- # class ActionToggleAutocast < Google::Protobuf::AbstractMessage; end;
41
+ # class ActionToggleAutocast end;
42
42
  # end
43
43
 
44
44
 
@@ -47,13 +47,258 @@
47
47
  # Protobuf classes
48
48
  # @!parse
49
49
  # module Api;
50
- # # Protobuf virtual enum.
51
- # class Race < Google::Protobuf::AbstractMessage; end;
52
- # # Protobuf virtual enum.
53
- # class PlayerType < Google::Protobuf::AbstractMessage; end;
54
- # # Protobuf virtual enum.
55
- # class Difficulty < Google::Protobuf::AbstractMessage; end;
56
- # # Protobuf virtual enum.
57
- # class AIBuild < Google::Protobuf::AbstractMessage; end;
50
+ # # PROTOBUF VIRTUAL ENUM.
51
+ # module Race
52
+ # NO_RACE = 0
53
+ # TERRAN = 1
54
+ # ZERG = 2
55
+ # PROTOSS = 3
56
+ # RANDOM = 4
57
+ # end
58
+ # # PROTOBUF VIRTUAL ENUM.
59
+ # module PlayerType
60
+ # PARTICIPANT = 1
61
+ # COMPUTER = 2
62
+ # OBSERVER = 3
63
+ # end
64
+ # # PROTOBUF VIRTUAL ENUM.
65
+ # module Difficulty
66
+ # VERY_EASY = 1
67
+ # EASY = 2
68
+ # MEDIUM = 3
69
+ # MEDIUM_HARD = 4
70
+ # HARD = 5
71
+ # HARDER = 6
72
+ # VERY_HARD = 7
73
+ # CHEAT_VISION = 8
74
+ # CHEAT_MONEY = 9
75
+ # CHEAT_INSANE = 10
76
+ # end
77
+ # # PROTOBUF VIRTUAL ENUM.
78
+ # module AIBuild
79
+ # RANDOM_BUILD = 1
80
+ # RUSH = 2
81
+ # TIMING = 3
82
+ # POWER = 4
83
+ # MACRO = 5
84
+ # AIR = 6
85
+ # end
86
+ # # PROTOBUF VIRTUAL ENUM.
87
+ # module ActionResult
88
+ # SUCCESS = 1;
89
+ # NOT_SUPPORTED = 2;
90
+ # ERROR = 3;
91
+ # CANT_QUEUE_THAT_ORDER = 4;
92
+ # RETRY = 5;
93
+ # COOLDOWN = 6;
94
+ # QUEUE_IS_FULL = 7;
95
+ # RALLY_QUEUE_IS_FULL = 8;
96
+ # NOT_ENOUGH_MINERALS = 9;
97
+ # NOT_ENOUGH_VESPENE = 10;
98
+ # NOT_ENOUGH_TERRAZINE = 11;
99
+ # NOT_ENOUGH_CUSTOM = 12;
100
+ # NOT_ENOUGH_FOOD = 13;
101
+ # FOOD_USAGE_IMPOSSIBLE = 14;
102
+ # NOT_ENOUGH_LIFE = 15;
103
+ # NOT_ENOUGH_SHIELDS = 16;
104
+ # NOT_ENOUGH_ENERGY = 17;
105
+ # LIFE_SUPPRESSED = 18;
106
+ # SHIELDS_SUPPRESSED = 19;
107
+ # ENERGY_SUPPRESSED = 20;
108
+ # NOT_ENOUGH_CHARGES = 21;
109
+ # CANT_ADD_MORE_CHARGES = 22;
110
+ # TOO_MUCH_MINERALS = 23;
111
+ # TOO_MUCH_VESPENE = 24;
112
+ # TOO_MUCH_TERRAZINE = 25;
113
+ # TOO_MUCH_CUSTOM = 26;
114
+ # TOO_MUCH_FOOD = 27;
115
+ # TOO_MUCH_LIFE = 28;
116
+ # TOO_MUCH_SHIELDS = 29;
117
+ # TOO_MUCH_ENERGY = 30;
118
+ # MUST_TARGET_UNIT_WITH_LIFE = 31;
119
+ # MUST_TARGET_UNIT_WITH_SHIELDS = 32;
120
+ # MUST_TARGET_UNIT_WITH_ENERGY = 33;
121
+ # CANT_TRADE = 34;
122
+ # CANT_SPEND = 35;
123
+ # CANT_TARGET_THAT_UNIT = 36;
124
+ # COULDNT_ALLOCATE_UNIT = 37;
125
+ # UNIT_CANT_MOVE = 38;
126
+ # TRANSPORT_IS_HOLDING_POSITION = 39;
127
+ # BUILD_TECH_REQUIREMENTS_NOT_MET = 40;
128
+ # CANT_FIND_PLACEMENT_LOCATION = 41;
129
+ # CANT_BUILD_ON_THAT = 42;
130
+ # CANT_BUILD_TOO_CLOSE_TO_DROP_OFF = 43;
131
+ # CANT_BUILD_LOCATION_INVALID = 44;
132
+ # CANT_SEE_BUILD_LOCATION = 45;
133
+ # CANT_BUILD_TOO_CLOSE_TO_CREEP_SOURCE = 46;
134
+ # CANT_BUILD_TOO_CLOSE_TO_RESOURCES = 47;
135
+ # CANT_BUILD_TOO_FAR_FROM_WATER = 48;
136
+ # CANT_BUILD_TOO_FAR_FROM_CREEP_SOURCE = 49;
137
+ # CANT_BUILD_TOO_FAR_FROM_BUILD_POWER_SOURCE = 50;
138
+ # CANT_BUILD_ON_DENSE_TERRAIN = 51;
139
+ # CANT_TRAIN_TOO_FAR_FROM_TRAIN_POWER_SOURCE = 52;
140
+ # CANT_LAND_LOCATION_INVALID = 53;
141
+ # CANT_SEE_LAND_LOCATION = 54;
142
+ # CANT_LAND_TOO_CLOSE_TO_CREEP_SOURCE = 55;
143
+ # CANT_LAND_TOO_CLOSE_TO_RESOURCES = 56;
144
+ # CANT_LAND_TOO_FAR_FROM_WATER = 57;
145
+ # CANT_LAND_TOO_FAR_FROM_CREEP_SOURCE = 58;
146
+ # CANT_LAND_TOO_FAR_FROM_BUILD_POWER_SOURCE = 59;
147
+ # CANT_LAND_TOO_FAR_FROM_TRAIN_POWER_SOURCE = 60;
148
+ # CANT_LAND_ON_DENSE_TERRAIN = 61;
149
+ # ADD_ON_TOO_FAR_FROM_BUILDING = 62;
150
+ # MUST_BUILD_REFINERY_FIRST = 63;
151
+ # BUILDING_IS_UNDER_CONSTRUCTION = 64;
152
+ # CANT_FIND_DROP_OFF = 65;
153
+ # CANT_LOAD_OTHER_PLAYERS_UNITS = 66;
154
+ # NOT_ENOUGH_ROOM_TO_LOAD_UNIT = 67;
155
+ # CANT_UNLOAD_UNITS_THERE = 68;
156
+ # CANT_WARP_IN_UNITS_THERE = 69;
157
+ # CANT_LOAD_IMMOBILE_UNITS = 70;
158
+ # CANT_RECHARGE_IMMOBILE_UNITS = 71;
159
+ # CANT_RECHARGE_UNDER_CONSTRUCTION_UNITS = 72;
160
+ # CANT_LOAD_THAT_UNIT = 73;
161
+ # NO_CARGO_TO_UNLOAD = 74;
162
+ # LOAD_ALL_NO_TARGETS_FOUND = 75;
163
+ # NOT_WHILE_OCCUPIED = 76;
164
+ # CANT_ATTACK_WITHOUT_AMMO = 77;
165
+ # CANT_HOLD_ANY_MORE_AMMO = 78;
166
+ # TECH_REQUIREMENTS_NOT_MET = 79;
167
+ # MUST_LOCKDOWN_UNIT_FIRST = 80;
168
+ # MUST_TARGET_UNIT = 81;
169
+ # MUST_TARGET_INVENTORY = 82;
170
+ # MUST_TARGET_VISIBLE_UNIT = 83;
171
+ # MUST_TARGET_VISIBLE_LOCATION = 84;
172
+ # MUST_TARGET_WALKABLE_LOCATION = 85;
173
+ # MUST_TARGET_PAWNABLE_UNIT = 86;
174
+ # YOU_CANT_CONTROL_THAT_UNIT = 87;
175
+ # YOU_CANT_ISSUE_COMMANDS_TO_THAT_UNIT = 88;
176
+ # MUST_TARGET_RESOURCES = 89;
177
+ # REQUIRES_HEAL_TARGET = 90;
178
+ # REQUIRES_REPAIR_TARGET = 91;
179
+ # NO_ITEMS_TO_DROP = 92;
180
+ # CANT_HOLD_ANY_MORE_ITEMS = 93;
181
+ # CANT_HOLD_THAT = 94;
182
+ # TARGET_HAS_NO_INVENTORY = 95;
183
+ # CANT_DROP_THIS_ITEM = 96;
184
+ # CANT_MOVE_THIS_ITEM = 97;
185
+ # CANT_PAWN_THIS_UNIT = 98;
186
+ # MUST_TARGET_CASTER = 99;
187
+ # CANT_TARGET_CASTER = 100;
188
+ # MUST_TARGET_OUTER = 101;
189
+ # CANT_TARGET_OUTER = 102;
190
+ # MUST_TARGET_YOUR_OWN_UNITS = 103;
191
+ # CANT_TARGET_YOUR_OWN_UNITS = 104;
192
+ # MUST_TARGET_FRIENDLY_UNITS = 105;
193
+ # CANT_TARGET_FRIENDLY_UNITS = 106;
194
+ # MUST_TARGET_NEUTRAL_UNITS = 107;
195
+ # CANT_TARGET_NEUTRAL_UNITS = 108;
196
+ # MUST_TARGET_ENEMY_UNITS = 109;
197
+ # CANT_TARGET_ENEMY_UNITS = 110;
198
+ # MUST_TARGET_AIR_UNITS = 111;
199
+ # CANT_TARGET_AIR_UNITS = 112;
200
+ # MUST_TARGET_GROUND_UNITS = 113;
201
+ # CANT_TARGET_GROUND_UNITS = 114;
202
+ # MUST_TARGET_STRUCTURES = 115;
203
+ # CANT_TARGET_STRUCTURES = 116;
204
+ # MUST_TARGET_LIGHT_UNITS = 117;
205
+ # CANT_TARGET_LIGHT_UNITS = 118;
206
+ # MUST_TARGET_ARMORED_UNITS = 119;
207
+ # CANT_TARGET_ARMORED_UNITS = 120;
208
+ # MUST_TARGET_BIOLOGICAL_UNITS = 121;
209
+ # CANT_TARGET_BIOLOGICAL_UNITS = 122;
210
+ # MUST_TARGET_HEROIC_UNITS = 123;
211
+ # CANT_TARGET_HEROIC_UNITS = 124;
212
+ # MUST_TARGET_ROBOTIC_UNITS = 125;
213
+ # CANT_TARGET_ROBOTIC_UNITS = 126;
214
+ # MUST_TARGET_MECHANICAL_UNITS = 127;
215
+ # CANT_TARGET_MECHANICAL_UNITS = 128;
216
+ # MUST_TARGET_PSIONIC_UNITS = 129;
217
+ # CANT_TARGET_PSIONIC_UNITS = 130;
218
+ # MUST_TARGET_MASSIVE_UNITS = 131;
219
+ # CANT_TARGET_MASSIVE_UNITS = 132;
220
+ # MUST_TARGET_MISSILE = 133;
221
+ # CANT_TARGET_MISSILE = 134;
222
+ # MUST_TARGET_WORKER_UNITS = 135;
223
+ # CANT_TARGET_WORKER_UNITS = 136;
224
+ # MUST_TARGET_ENERGY_CAPABLE_UNITS = 137;
225
+ # CANT_TARGET_ENERGY_CAPABLE_UNITS = 138;
226
+ # MUST_TARGET_SHIELD_CAPABLE_UNITS = 139;
227
+ # CANT_TARGET_SHIELD_CAPABLE_UNITS = 140;
228
+ # MUST_TARGET_FLYERS = 141;
229
+ # CANT_TARGET_FLYERS = 142;
230
+ # MUST_TARGET_BURIED_UNITS = 143;
231
+ # CANT_TARGET_BURIED_UNITS = 144;
232
+ # MUST_TARGET_CLOAKED_UNITS = 145;
233
+ # CANT_TARGET_CLOAKED_UNITS = 146;
234
+ # MUST_TARGET_UNITS_IN_A_STASIS_FIELD = 147;
235
+ # CANT_TARGET_UNITS_IN_A_STASIS_FIELD = 148;
236
+ # MUST_TARGET_UNDER_CONSTRUCTION_UNITS = 149;
237
+ # CANT_TARGET_UNDER_CONSTRUCTION_UNITS = 150;
238
+ # MUST_TARGET_DEAD_UNITS = 151;
239
+ # CANT_TARGET_DEAD_UNITS = 152;
240
+ # MUST_TARGET_REVIVABLE_UNITS = 153;
241
+ # CANT_TARGET_REVIVABLE_UNITS = 154;
242
+ # MUST_TARGET_HIDDEN_UNITS = 155;
243
+ # CANT_TARGET_HIDDEN_UNITS = 156;
244
+ # CANT_RECHARGE_OTHER_PLAYERS_UNITS = 157;
245
+ # MUST_TARGET_HALLUCINATIONS = 158;
246
+ # CANT_TARGET_HALLUCINATIONS = 159;
247
+ # MUST_TARGET_INVULNERABLE_UNITS = 160;
248
+ # CANT_TARGET_INVULNERABLE_UNITS = 161;
249
+ # MUST_TARGET_DETECTED_UNITS = 162;
250
+ # CANT_TARGET_DETECTED_UNITS = 163;
251
+ # CANT_TARGET_UNIT_WITH_ENERGY = 164;
252
+ # CANT_TARGET_UNIT_WITH_SHIELDS = 165;
253
+ # MUST_TARGET_UNCOMMANDABLE_UNITS = 166;
254
+ # CANT_TARGET_UNCOMMANDABLE_UNITS = 167;
255
+ # MUST_TARGET_PREVENT_DEFEAT_UNITS = 168;
256
+ # CANT_TARGET_PREVENT_DEFEAT_UNITS = 169;
257
+ # MUST_TARGET_PREVENT_REVEAL_UNITS = 170;
258
+ # CANT_TARGET_PREVENT_REVEAL_UNITS = 171;
259
+ # MUST_TARGET_PASSIVE_UNITS = 172;
260
+ # CANT_TARGET_PASSIVE_UNITS = 173;
261
+ # MUST_TARGET_STUNNED_UNITS = 174;
262
+ # CANT_TARGET_STUNNED_UNITS = 175;
263
+ # MUST_TARGET_SUMMONED_UNITS = 176;
264
+ # CANT_TARGET_SUMMONED_UNITS = 177;
265
+ # MUST_TARGET_USER1 = 178;
266
+ # CANT_TARGET_USER1 = 179;
267
+ # MUST_TARGET_UNSTOPPABLE_UNITS = 180;
268
+ # CANT_TARGET_UNSTOPPABLE_UNITS = 181;
269
+ # MUST_TARGET_RESISTANT_UNITS = 182;
270
+ # CANT_TARGET_RESISTANT_UNITS = 183;
271
+ # MUST_TARGET_DAZED_UNITS = 184;
272
+ # CANT_TARGET_DAZED_UNITS = 185;
273
+ # CANT_LOCKDOWN = 186;
274
+ # CANT_MIND_CONTROL = 187;
275
+ # MUST_TARGET_DESTRUCTIBLES = 188;
276
+ # CANT_TARGET_DESTRUCTIBLES = 189;
277
+ # MUST_TARGET_ITEMS = 190;
278
+ # CANT_TARGET_ITEMS = 191;
279
+ # NO_CALLDOWN_AVAILABLE = 192;
280
+ # WAYPOINT_LIST_FULL = 193;
281
+ # MUST_TARGET_RACE = 194;
282
+ # CANT_TARGET_RACE = 195;
283
+ # MUST_TARGET_SIMILAR_UNITS = 196;
284
+ # CANT_TARGET_SIMILAR_UNITS = 197;
285
+ # CANT_FIND_ENOUGH_TARGETS = 198;
286
+ # ALREADY_SPAWNING_LARVA = 199;
287
+ # CANT_TARGET_EXHAUSTED_RESOURCES = 200;
288
+ # CANT_USE_MINIMAP = 201;
289
+ # CANT_USE_INFO_PANEL = 202;
290
+ # ORDER_QUEUE_IS_FULL = 203;
291
+ # CANT_HARVEST_THAT_RESOURCE = 204;
292
+ # HARVESTERS_NOT_REQUIRED = 205;
293
+ # ALREADY_TARGETED = 206;
294
+ # CANT_ATTACK_WEAPONS_DISABLED = 207;
295
+ # COULDNT_REACH_TARGET = 208;
296
+ # TARGET_IS_OUT_OF_RANGE = 209;
297
+ # TARGET_IS_TOO_CLOSE = 210;
298
+ # TARGET_IS_OUT_OF_ARC = 211;
299
+ # CANT_FIND_TELEPORT_LOCATION = 212;
300
+ # INVALID_ITEM_CLASS = 213;
301
+ # CANT_FIND_CANCEL_ORDER = 214;
302
+ # end
58
303
  # end
59
304
  # @!parse