Class: Sc2::Player

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
GameState
Defined in:
lib/sc2ai/player.rb,
lib/sc2ai/player/geo.rb,
lib/sc2ai/player/debug.rb,
lib/sc2ai/player/units.rb,
lib/sc2ai/player/actions.rb,
lib/sc2ai/player/game_state.rb,
lib/sc2ai/player/previous_state.rb

Overview

Allows defining Ai, Bot, BotProcess (external), Human or Observer for a Match

Direct Known Subclasses

Bot, BotProcess, Computer, Enemy, Human, Observer

Defined Under Namespace

Modules: Actions, Debug, GameState, Units Classes: Bot, BotProcess, Computer, Enemy, Geo, Human, Observer, PreviousState

Constant Summary collapse

IDENTIFIED_RACES =

Known races for detecting race on Api::Race::RANDOM or nil

Returns:

[Api::Race::PROTOSS, Api::Race::TERRAN, Api::Race::ZERG].freeze

Instance Attribute Summary collapse

Attributes included from GameState

#chats_received, #data, #game_info, #game_info_loop, #game_loop, #observation, #result, #spent_minerals, #spent_supply, #spent_vespene, #status

Connection collapse

Api collapse

Instance Method Summary collapse

Methods included from GameState

#available_abilities, #common, #on_status_change

Methods included from Connection::StatusListener

#on_status_change

Constructor Details

#initialize(race:, name:, type: nil, difficulty: nil, ai_build: nil) ⇒ Player

Returns a new instance of Player.

Parameters:

Raises:

  • (ArgumentError)


80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/sc2ai/player.rb', line 80

def initialize(race:, name:, type: nil, difficulty: nil, ai_build: nil)
  # Be forgiving to symbols
  race = Api::Race.resolve(race) if race.is_a?(Symbol)
  type = Api::PlayerType.resolve(type) if type.is_a?(Symbol)
  difficulty = Api::Difficulty.resolve(difficulty) if difficulty.is_a?(Symbol)
  ai_build = Api::AIBuild.resolve(ai_build) if ai_build.is_a?(Symbol)
  # Yet strict on required fields
  raise ArgumentError, "unknown race: '#{race}'" if race.nil? || Api::Race.lookup(race).nil?
  raise ArgumentError, "unknown type: '#{type}'" if type.nil? || Api::PlayerType.lookup(type).nil?

  @race = race
  @name = name
  @type = type
  @difficulty = difficulty
  @ai_build = ai_build
  @realtime = false
  @step_count = 2

  @enable_feature_layer = false
  @interface_options = {}
end

Instance Attribute Details

#ai_buildInteger

Returns:

  • (Integer)

See Also:



70
71
72
# File 'lib/sc2ai/player.rb', line 70

def ai_build
  @ai_build
end

#apiSc2::Connection

Manages connection to client and performs Requests



33
34
35
# File 'lib/sc2ai/player.rb', line 33

def api
  @api
end

#difficultyInteger

if @type is Api::PlayerType::COMPUTER, set one of Api::Difficulty scale 1 to 10

Returns:

  • (Integer)

See Also:



66
67
68
# File 'lib/sc2ai/player.rb', line 66

def difficulty
  @difficulty
end

#enable_feature_layerBoolean

Enables the feature layer at 1x1 pixels. Adds additional actions (UI and Spatial) at the cost of overall performance. Must be configured before #join_game

Returns:

  • (Boolean)


48
49
50
# File 'lib/sc2ai/player.rb', line 48

def enable_feature_layer
  @enable_feature_layer
end

#IDENTIFIED_RACESArray<Integer>

Known races for detecting race on Api::Race::RANDOM or nil

Returns:



27
# File 'lib/sc2ai/player.rb', line 27

IDENTIFIED_RACES = [Api::Race::PROTOSS, Api::Race::TERRAN, Api::Race::ZERG].freeze

#interface_optionsHash

Returns:

  • (Hash)

See Also:



52
53
54
# File 'lib/sc2ai/player.rb', line 52

def interface_options
  @interface_options
end

#nameString

Returns in-game name.

Returns:

  • (String)

    in-game name



58
59
60
# File 'lib/sc2ai/player.rb', line 58

def name
  @name
end

#opponent_idString

Returns ladder matches will set an opponent id.

Returns:

  • (String)

    ladder matches will set an opponent id



73
74
75
# File 'lib/sc2ai/player.rb', line 73

def opponent_id
  @opponent_id
end

#raceInteger

Returns Api::Race enum.

Returns:

  • (Integer)

    Api::Race enum



55
56
57
# File 'lib/sc2ai/player.rb', line 55

def race
  @race
end

#realtimeBoolean

Realtime mode does not require stepping. When you observe the current step is returned.

Returns:

  • (Boolean)

    whether realtime is enabled (otherwise step-mode)



38
39
40
# File 'lib/sc2ai/player.rb', line 38

def realtime
  @realtime
end

#step_countInteger

Returns number of frames to step in step-mode, default 1.

Returns:

  • (Integer)

    number of frames to step in step-mode, default 1



42
43
44
# File 'lib/sc2ai/player.rb', line 42

def step_count
  @step_count
end

#typeInteger

Returns Api::PlayerType::PARTICIPANT, Api::PlayerType::COMPUTER, Api::PlayerType::OBSERVER.

Returns:

  • (Integer)

    Api::PlayerType::PARTICIPANT, Api::PlayerType::COMPUTER, Api::PlayerType::OBSERVER



61
62
63
# File 'lib/sc2ai/player.rb', line 61

def type
  @type
end

Instance Method Details

#connect(host:, port:) ⇒ Sc2::Connection

Creates a new connection to Sc2 client

Parameters:

  • host (String)
  • port (Integer)

Returns:

See Also:



117
118
119
120
121
122
123
124
# File 'lib/sc2ai/player.rb', line 117

def connect(host:, port:)
  @api&.close
  @api = Sc2::Connection.new(host:, port:)
  # @api.add_listener(self, klass: Connection::ConnectionListener)
  @api.add_listener(self, klass: Connection::StatusListener)
  @api.connect
  @api
end

#create_game(map:, players:, realtime: false) ⇒ Object

Parameters:



141
142
143
144
# File 'lib/sc2ai/player.rb', line 141

def create_game(map:, players:, realtime: false)
  Sc2.logger.debug { "Creating game..." }
  @api.create_game(map:, players:, realtime:)
end

#disconnectvoid

This method returns an undefined value.

Terminates connection to Sc2 client



128
129
130
# File 'lib/sc2ai/player.rb', line 128

def disconnect
  @api&.close
end

#join_game(server_host:, port_config:) ⇒ Object

Parameters:



148
149
150
151
152
153
154
155
156
# File 'lib/sc2ai/player.rb', line 148

def join_game(server_host:, port_config:)
  Sc2.logger.debug { "Player \"#{@name}\" joining game..." }
  response = @api.join_game(name: @name, race: @race, server_host:, port_config:, enable_feature_layer: @enable_feature_layer, interface_options: @interface_options)
  if response.error != :ENUM_RESPONSE_JOIN_GAME_ERROR_UNSET && response.error != :MISSING_PARTICIPATION
    raise Sc2::Error, "Player \"#{@name}\" join_game failed: #{response.error}"
  end
  add_listener(self, klass: Connection::StatusListener)
  response
end

#leave_gameObject

Multiplayer only. Disconnects from a multiplayer game, equivalent to surrender. Keeps client alive.



159
160
161
# File 'lib/sc2ai/player.rb', line 159

def leave_game
  @api.leave_game
end

#race_unknown?Boolean

Checks whether the Player#race is known. This is false on start for Random until scouted.

Returns:

  • (Boolean)

    true if the race is Terran, Protoss or Zerg, or false unknown



503
504
505
# File 'lib/sc2ai/player.rb', line 503

def race_unknown?
  !IDENTIFIED_RACES.include?(race)
end

#refresh_game_infovoid

This method returns an undefined value.

Refreshes bot#game_info ignoring all caches



639
640
641
642
643
644
# File 'lib/sc2ai/player.rb', line 639

public def refresh_game_info
  @game_info_task = Async do
    self.game_info = @api.game_info
    @game_info_task = nil
  end
end

#requires_client?Boolean

Returns whether or not the player requires a sc2 instance

Returns:

  • (Boolean)

    Sc2 client needed or not



108
109
110
# File 'lib/sc2ai/player.rb', line 108

def requires_client?
  true
end