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