lib/sc2ai/connection/requests.rb in sc2ai-0.0.5 vs lib/sc2ai/connection/requests.rb in sc2ai-0.0.7
- old
+ new
@@ -277,79 +277,97 @@
end
# Advances the game simulation by step_count. Not used in realtime mode.
# Only constant step size supported - subsequent requests use cache.
def step(step_count = 1)
- @_cached_request_step ||= Api::Request.new(
+ @_cached_request_step ||= {}
+ @_cached_request_step[step_count] ||= Api::Request.new(
step: Api::RequestStep.new(count: step_count)
).to_proto
- send_request_and_ignore(@_cached_request_step)
+ send_request_and_ignore(@_cached_request_step[step_count])
end
# Additional methods for inspecting game state. Synchronous and must wait on response
# @param pathing [Array<Api::RequestQueryPathing>]
# @param abilities [Array<Api::RequestQueryAvailableAbilities>]
# @param placements [Array<Api::RequestQueryBuildingPlacement>]
# @param ignore_resource_requirements [Boolean] Ignores requirements like food, minerals and so on.
# @return [Api::ResponseQuery]
- def query(pathing: nil, abilities: nil, placements: nil, ignore_resource_requirements: true)
+ def query(pathing: nil, abilities: nil, placements: nil, ignore_resource_requirements: false)
send_request_for query: Api::RequestQuery.new(
pathing:,
abilities:,
placements:,
ignore_resource_requirements:
)
end
# Queries one or more pathing queries
- # @param queries [Array<Api::RequestQueryPathing>, Api::RequestQueryPathing] one or more pathing queries
- # @return [Array<Api::ResponseQueryPathing>, Api::ResponseQueryPathing] one or more results depending on input size
+ # @param queries [Array<Api::RequestQueryPathing>] one or more pathing queries
+ # @return [Array<Api::ResponseQueryPathing>] one or more results depending on input size
def query_pathings(queries)
arr_queries = queries.is_a?(Array) ? queries : [queries]
response = send_request_for query: Api::RequestQuery.new(
pathing: arr_queries
)
- (arr_queries.size > 1) ? response.pathing : response.pathing.first
+ response.pathing
end
# Queries one or more ability-available checks
- # @param queries [Array<Api::RequestQueryAvailableAbilities>, Api::RequestQueryAvailableAbilities] one or more pathing queries
+ # @param queries [Array<Api::RequestQueryAvailableAbilities>] one or more pathing queries
# @param ignore_resource_requirements [Boolean] Ignores requirements like food, minerals and so on.
- # @return [Array<Api::ResponseQueryAvailableAbilities>, Api::ResponseQueryAvailableAbilities] one or more results depending on input size
- def query_abilities(queries, ignore_resource_requirements: true)
+ # @return [Array<Api::ResponseQueryAvailableAbilities>] one or more results depending on input size
+ def query_abilities(queries, ignore_resource_requirements: false)
arr_queries = queries.is_a?(Array) ? queries : [queries]
response = send_request_for query: Api::RequestQuery.new(
abilities: arr_queries,
ignore_resource_requirements:
)
- (arr_queries.size > 1) ? response.abilities : response.abilities.first
+ response.abilities
end
# Queries available abilities for units
- # @param unit_tags [Array<Integer>, Integer] an array of unit tags or a single tag
+ # @param unit_tags [Array<Integer>] an array of unit tags or a single tag
# @param ignore_resource_requirements [Boolean] Ignores requirements like food, minerals and so on.
- # @return [Array<Api::ResponseQueryAvailableAbilities>, Api::ResponseQueryAvailableAbilities] one or more results depending on input size
- def query_abilities_for_unit_tags(unit_tags, ignore_resource_requirements: true)
+ # @return [Array<Api::ResponseQueryAvailableAbilities>] one or more results depending on input size
+ def query_abilities_for_unit_tags(unit_tags, ignore_resource_requirements: false)
+ return [] if unit_tags.nil?
queries = []
unit_tags = [unit_tags] unless unit_tags.is_a? Array
unit_tags.each do |unit_tag|
queries << Api::RequestQueryAvailableAbilities.new(unit_tag: unit_tag)
end
query_abilities(queries, ignore_resource_requirements:)
end
+ # Queries available ability ids for one unit
+ # Shortened response over #query_abilities_for_unit_tags, since we know the tag already
+ # and can just return an array of ability ids.
+ # Note: Querying single units are expensive and should be batched with #query_abilities_for_unit_tags
+ # @param unit [Api::Unit, Integer] a unit or a tag.
+ # @return [Array<Integer>] array of ability ids
+ def query_ability_ids_for_unit(unit, ignore_resource_requirements: false)
+ tag = unit.is_a?(Api::Unit) ? unit.tag : unit
+ result = query_abilities_for_unit_tags([tag], ignore_resource_requirements:)
+ if result.nil?
+ []
+ else
+ result.first.abilities.map(&:ability_id)
+ end
+ end
+
# Queries one or more pathing queries
- # @param queries [Array<Api::RequestQueryBuildingPlacement>, Api::RequestQueryBuildingPlacement] one or more placement queries
- # @return [Array<Api::ResponseQueryBuildingPlacement>, Api::ResponseQueryBuildingPlacement] one or more results depending on input size
+ # @param queries [Array<Api::RequestQueryBuildingPlacement>] one or more placement queries
+ # @return [Array<Api::ResponseQueryBuildingPlacement>] one or more results depending on input size
def query_placements(queries)
arr_queries = queries.is_a?(Array) ? queries : [queries]
response = query(placements: arr_queries)
- (arr_queries.size > 1) ? response.placements : response.placements.first
+ response.placements
end
# Generates a replay.
def save_replay
send_request_for save_replay: Api::RequestSaveReplay.new