def mineral_worker(agent): camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs) # print(camera_on_base) if not camera_on_base: return gas_pos = U.judge_gas_worker(agent.obs, agent.env.game_info) if gas_pos: probe = U.get_mineral_probe(agent.obs) probe_pos = T.world_to_screen_pos(agent.env.game_info, probe.pos, agent.obs) if probe else None move_worker(agent, gas_pos, probe_pos) if U.judge_gas_worker_too_many(agent.obs): probe = U.get_gas_probe(agent.obs) probe_pos = T.world_to_screen_pos(agent.env.game_info, probe.pos, agent.obs) if probe else None # print('probe_pos', probe_pos) mineral = U.find_unit_on_screen(agent.obs, C._MINERAL_TYPE_INDEX) mineral_pos = T.world_to_screen_pos(agent.env.game_info, mineral.pos, agent.obs) if mineral else None move_worker(agent, mineral_pos, probe_pos) # move_worker(agent, C.mineral_pos, probe_pos) else: # train_worker(agent, C.base_pos, C._TRAIN_PROBE) base = U.find_unit_on_screen(agent.obs, C._NEXUS_TYPE_INDEX) base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos, agent.obs) if base else None train_worker(agent, base_pos, C._TRAIN_PROBE)
def tech_step(self, tech_action): # to execute a tech_action # [pylon, gas1, gas2, gateway, cyber] if tech_action == 0: # pylon no_unit_index = U.get_unit_mask_screen(self.obs, size=2) pos = U.get_pos(no_unit_index) M.build_by_idle_worker(self, C._BUILD_PYLON_S, pos) elif tech_action == 1 and not U.find_gas(self.obs, 1): # gas_1 gas_1 = U.find_geyser_pos(self.obs, 1) gas_1_pos = T.world_to_screen_pos(self.env.game_info, gas_1.pos, self.obs) M.build_by_idle_worker(self, C._BUILD_ASSIMILATOR_S, gas_1_pos) elif tech_action == 1 and not U.find_gas(self.obs, 2): # gas_2 gas_2 = U.find_geyser_pos(self.obs, 2) gas_2_pos = T.world_to_screen_pos(self.env.game_info, gas_2.pos, self.obs) M.build_by_idle_worker(self, C._BUILD_ASSIMILATOR_S, gas_2_pos) elif tech_action == 2: # gateway power_index = U.get_power_mask_screen(self.obs, size=5) pos = U.get_pos(power_index) M.build_by_idle_worker(self, C._BUILD_GATEWAY_S, pos) elif tech_action == 3: # cyber power_index = U.get_power_mask_screen(self.obs, size=3) pos = U.get_pos(power_index) M.build_by_idle_worker(self, C._BUILD_CYBER_S, pos) else: self.safe_action(C._NO_OP, 0, [])
def gather_resource(agent, resource='gas'): camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs) if not camera_on_base: return if resource == 'gas': gas_pos = U.judge_gas_worker(agent.obs, agent.env.game_info) drone = U.get_mineral_drone(agent.obs) drone_pos = T.world_to_screen_pos(agent.env.game_info, drone.pos, agent.obs) if drone else None if gas_pos and drone_pos: agent.select(C._SELECT_POINT, C._SCV_TYPE_INDEX, [C._CLICK, drone_pos]) agent.safe_action(C._HARVEST_S, C._SCV_TYPE_INDEX, [C._NOT_QUEUED, gas_pos]) if resource == 'mineral': mineral_pos = U.find_mineral(agent.obs) mineral_pos = T.world_to_screen_pos(agent.env.game_info, mineral_pos, agent.obs) drone = U.get_gas_drone(agent.obs) drone_pos = T.world_to_screen_pos(agent.env.game_info, drone.pos, agent.obs) if drone else None if mineral_pos and drone_pos: agent.select(C._SELECT_POINT, C._SCV_TYPE_INDEX, [C._CLICK, drone_pos]) agent.safe_action(C._HARVEST_S, C._SCV_TYPE_INDEX, [C._NOT_QUEUED, mineral_pos]) return
def mineral_worker_only(agent): camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs) assert camera_on_base, 'not camera_on_base!' probe = U.get_gas_probe(agent.obs) probe_pos = T.world_to_screen_pos(agent.env.game_info, probe.pos, agent.obs) if probe else None mineral = U.find_unit_on_screen(agent.obs, C._MINERAL_TYPE_INDEX) mineral_pos = T.world_to_screen_pos(agent.env.game_info, mineral.pos, agent.obs) if mineral else None move_worker(agent, mineral_pos, probe_pos)
def mini_step(self, action): if action == ProtossAction.Build_probe.value: M.mineral_worker(self) elif action == ProtossAction.Build_zealot.value: M.train_army(self, C._TRAIN_ZEALOT) elif action == ProtossAction.Build_Stalker.value: M.train_army(self, C._TRAIN_STALKER) elif action == ProtossAction.Build_pylon.value: no_unit_index = U.get_unit_mask_screen(self.obs, size=2) pos = U.get_pos(no_unit_index) M.build_by_idle_worker(self, C._BUILD_PYLON_S, pos) elif action == ProtossAction.Build_gateway.value: power_index = U.get_power_mask_screen(self.obs, size=5) pos = U.get_pos(power_index) M.build_by_idle_worker(self, C._BUILD_GATEWAY_S, pos) elif action == ProtossAction.Build_Assimilator.value: if self._gases is not None: #U.find_gas_pos(self.obs, 1) gas_1 = self._gases[0] gas_2 = self._gases[1] if gas_1 is not None and not U.is_assimilator_on_gas( self.obs, gas_1): gas_1_pos = T.world_to_screen_pos(self.env.game_info, gas_1.pos, self.obs) M.build_by_idle_worker(self, C._BUILD_ASSIMILATOR_S, gas_1_pos) elif gas_2 is not None and not U.is_assimilator_on_gas( self.obs, gas_2): gas_2_pos = T.world_to_screen_pos(self.env.game_info, gas_2.pos, self.obs) M.build_by_idle_worker(self, C._BUILD_ASSIMILATOR_S, gas_2_pos) elif action == ProtossAction.Build_CyberneticsCore.value: power_index = U.get_power_mask_screen(self.obs, size=3) pos = U.get_pos(power_index) M.build_by_idle_worker(self, C._BUILD_CYBER_S, pos) elif action == ProtossAction.Attack.value: M.attack_step(self) elif action == ProtossAction.Retreat.value: M.retreat_step(self) elif action == ProtossAction.Do_nothing.value: self.safe_action(C._NO_OP, 0, [])
def mini_step(self, action): if action == TerranAction.Build_SCV.value: M.mineral_worker(self) elif action == TerranAction.Build_Refinery.value: if self._gases is not None: # U.find_gas_pos(self.obs, 1) gas_1 = self._gases[0] gas_2 = self._gases[1] if gas_1 is not None and not U.is_Refinery_on_gas(self.obs, gas_1): gas_1_pos = T.world_to_screen_pos(self.env.game_info, gas_1.pos, self.obs) M.build_by_idle_worker(self, C._BUILD_REFINERY_S, gas_1_pos) elif gas_2 is not None and not U.is_Refinery_on_gas(self.obs, gas_2): gas_2_pos = T.world_to_screen_pos(self.env.game_info, gas_2.pos, self.obs) M.build_by_idle_worker(self, C._BUILD_REFINERY_S, gas_2_pos) elif action == TerranAction.Gather_gas.value: M.gather_resource(self, 'gas') elif action == TerranAction.Gather_mineral.value: M.gather_resource(self, 'mineral') elif action == TerranAction.Build_Marine.value: M.train_army(self, C._TRAIN_MARINE) elif action == TerranAction.Build_Reaper.value: M.train_army(self, C._TRAIN_REAPER) elif action == TerranAction.Build_SupplyDepot.value: valid_index = U.get_valid_mask_screen(self.obs, size=3) pos = U.get_pos(valid_index) M.build_by_idle_worker(self, C._BUILD_SUPPLYDEPOT_S, pos) elif action == TerranAction.Build_Barracks.value: valid_index = U.get_valid_mask_screen(self.obs, size=3) pos = U.get_pos(valid_index) M.build_by_idle_worker(self, C._BUILD_BARRACKS_S, pos) elif action == TerranAction.Attack.value: self.is_attack = True elif action == TerranAction.Defend.value: M.retreat_step(self) else: self.safe_action(C._NO_OP, 0, []) if self.is_attack: M.attack_step(self)
def mineral_worker(agent): camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs) # print(camera_on_base) if not camera_on_base: return # gas_pos = U.judge_gas_worker(agent.obs, agent.env.game_info) # if gas_pos: # drone = U.get_mineral_drone(agent.obs) # drone_pos = T.world_to_screen_pos(agent.env.game_info, drone.pos, agent.obs) if drone else None # move_worker(agent, gas_pos, drone_pos) # if U.judge_gas_worker_too_many(agent.obs): # drone = U.get_gas_drone(agent.obs) # drone_pos = T.world_to_screen_pos(agent.env.game_info, drone.pos, agent.obs) if drone else None # mineral = U.find_unit_on_screen(agent.obs, C._MINERAL_TYPE_INDEX) # mineral_pos = T.world_to_screen_pos(agent.env.game_info, mineral.pos, agent.obs) if mineral else None # move_worker(agent, mineral_pos, drone_pos) # move_worker(agent, C.mineral_pos, probe_pos) # else: # train_worker(agent, C.base_pos, C._TRAIN_PROBE) base = U.find_unit_on_screen(agent.obs, C._COMMANDCENTER_TYPE_INDEX) base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos, agent.obs) if base else None train_worker(agent, base_pos, C._TRAIN_SCV)
def set_source(agent): agent.safe_action(C._NO_OP, 0, []) base = U.find_unit_on_screen(agent.obs, C._NEXUS_TYPE_INDEX) base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos, agent.obs) agent.select(C._SELECT_POINT, C._NEXUS_TYPE_INDEX, [C._CLICK, base_pos]) agent.safe_action(C._CONTROL_GROUP, C._NEXUS_TYPE_INDEX, [C._SET_GROUP, C._BASE_GROUP_ID])
def judge_gas_worker(obs, game_info): gas_1 = find_gas(obs, 1) gas_2 = find_gas(obs, 2) if gas_1: a = gas_1.assigned_harvesters i = gas_1.ideal_harvesters if a < i: return T.world_to_screen_pos(game_info, gas_1.pos, obs) # return C.gas1_pos if gas_2: a = gas_2.assigned_harvesters i = gas_2.ideal_harvesters if a < i: return T.world_to_screen_pos(game_info, gas_2.pos, obs) # return C.gas2_pos return None
def train_worker_only(agent): camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs) assert camera_on_base, 'not camera_on_base!' # train_worker(agent, C.base_pos, C._TRAIN_PROBE) base = U.find_unit_on_screen(agent.obs, C._NEXUS_TYPE_INDEX) base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos, agent.obs) if base else None train_worker(agent, base_pos, C._TRAIN_PROBE)
def get_back_pos(obs, game_info): # if have resources, back to base buff = None unit_set = obs.raw_observation.observation.raw_data.units for unit in unit_set: if unit.unit_type == C._PROBE_TYPE_INDEX and unit.is_selected == True: buff = unit.buff_ids # print('buff:', buff) if buff and buff[0] > 0: # return C.base_pos base = find_unit_on_screen(obs, C._NEXUS_TYPE_INDEX) base_pos = T.world_to_screen_pos(game_info, base.pos, obs) if base else None return base_pos base = find_unit_on_screen(obs, C._NEXUS_TYPE_INDEX) # number of probe for mineral and the ideal num if base: a = base.assigned_harvesters i = base.ideal_harvesters if a < i: mineral = find_unit_on_screen(obs, C._MINERAL_TYPE_INDEX) mineral_pos = T.world_to_screen_pos(game_info, mineral.pos, obs) if mineral else None return mineral_pos # return C.mineral_pos gas_1 = find_gas(obs, 1) gas_2 = find_gas(obs, 2) if gas_1: a = gas_1.assigned_harvesters i = gas_1.ideal_harvesters if a < i: return T.world_to_screen_pos(game_info, gas_1.pos, obs) # return C.gas1_pos if gas_2: a = gas_2.assigned_harvesters i = gas_2.ideal_harvesters if a < i: return T.world_to_screen_pos(game_info, gas_2.pos, obs) # return C.gas2_pos return T.world_to_screen_pos(game_info, base.pos, obs) if base else None
def inject_larva(agent): base = U.find_unit_on_screen(agent.obs, C._HATCHERY_TYPE_INDEX) queen_pos = select_unit(agent, C._QUEEN_TYPE_INDEX) camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs) if not camera_on_base or queen_pos is None or base is None: return base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos, agent.obs) agent.select(C._SELECT_POINT, C._QUEEN_TYPE_INDEX, [C._CLICK, queen_pos]) agent.safe_action(C._E_INJECT_LARVA, C._QUEEN_TYPE_INDEX, [C._NOT_QUEUED, base_pos])
def gas_worker_only(agent): camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs) assert camera_on_base, 'not camera_on_base!' gas_pos = U.judge_gas_worker(agent.obs, agent.env.game_info) if gas_pos: probe = U.get_mineral_probe(agent.obs) probe_pos = T.world_to_screen_pos(agent.env.game_info, probe.pos, agent.obs) if probe else None move_worker(agent, gas_pos, probe_pos)
def train_army(agent, train_action): base = U.find_unit_on_screen(agent.obs, C._HATCHERY_TYPE_INDEX) camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs) if (not camera_on_base) or (base is None): return base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos, agent.obs) agent.select(C._SELECT_POINT, C._HATCHERY_TYPE_INDEX, [C._DBL_CLICK, base_pos]) if train_action != C._TRAIN_QUEEN: agent.select(C._SELECT_LARVA, C._LARVA_TYPE_INDEX, []) agent.safe_action(train_action, C._LARVA_TYPE_INDEX, [C._NOT_QUEUED]) else: agent.safe_action(C._TRAIN_QUEEN, C._HATCHERY_TYPE_INDEX, [C._NOT_QUEUED])
def train_army(agent, train_action): # select multi building and train # count = U.get_unit_num(agent.obs, C._BARRACKS_TYPE_INDEX) # pos = selectGateway(agent) # camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs) # # print(camera_on_base) barracks = U.find_unit_on_screen(agent.obs, C._BARRACKS_TYPE_INDEX) camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs) if (not camera_on_base) or (barracks is None): return barracks_pos = T.world_to_screen_pos(agent.env.game_info, barracks.pos, agent.obs) agent.select(C._SELECT_POINT, C._BARRACKS_TYPE_INDEX, [C._DBL_CLICK, barracks_pos]) # agent.safe_action(C._RALLY_UNITS_M, C._BARRACKS_TYPE_INDEX, [C._NOT_QUEUED, C.rally_pos]) agent.safe_action(train_action, C._BARRACKS_TYPE_INDEX, [C._NOT_QUEUED])
def get_back_pos(obs, game_info): # if have resources, back to base # buff = None # unit_set = obs.raw_observation.observation.raw_data.units # for unit in unit_set: # if unit.unit_type == C._SCV_TYPE_INDEX and unit.is_selected is True: # buff = unit.buff_ids # # print('buff:', buff) # # # if buff and buff[0] > 0: # # return C.base_pos # # base = find_unit_on_screen(obs, C._COMMANDCENTER_TYPE_INDEX) # # base_pos = T.world_to_screen_pos(game_info, base.pos, obs) if base else None # # return base_pos # # base = find_unit_on_screen(obs, C._COMMANDCENTER_TYPE_INDEX) # # number of probe for mineral and the ideal num # if base: # a = base.assigned_harvesters # i = base.ideal_harvesters # if a < i: mineral = find_unit_on_screen(obs, C._MINERAL_TYPE_INDEX) mineral_pos = T.world_to_screen_pos(game_info, mineral.pos, obs) if mineral else None return mineral_pos
def set_rally_point(agent, pos): base = U.find_unit_on_screen(agent.obs, C._HATCHERY_TYPE_INDEX) base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos, agent.obs) agent.select(C._SELECT_POINT, C._HATCHERY_TYPE_INDEX, [C._DBL_CLICK, base_pos]) agent.safe_action(C._RALLY_UNITS_M, C._HATCHERY_TYPE_INDEX, [C._NOT_QUEUED, C.rally_pos])
def selectGateway(agent): # random select a Gateway gateway = U.get_best_gateway(agent.obs) pos = T.world_to_screen_pos(agent.env.game_info, gateway.pos, agent.obs) if gateway else None return pos
def mini_step(self, action): if action == ZergAction.Build_drone.value: M.mineral_worker(self) elif action == ZergAction.Build_extractor.value: if self._gases is not None: #U.find_gas_pos(self.obs, 1) gas_1 = self._gases[0] gas_2 = self._gases[1] if gas_1 is not None and not U.is_extractor_on_gas( self.obs, gas_1): gas_1_pos = T.world_to_screen_pos(self.env.game_info, gas_1.pos, self.obs) M.build_by_idle_worker(self, C._BUILD_EXTRACTOR_S, gas_1_pos) elif gas_2 is not None and not U.is_extractor_on_gas( self.obs, gas_2): gas_2_pos = T.world_to_screen_pos(self.env.game_info, gas_2.pos, self.obs) M.build_by_idle_worker(self, C._BUILD_EXTRACTOR_S, gas_2_pos) elif action == ZergAction.Gather_gas.value: M.gather_resource(self, 'gas') elif action == ZergAction.Gather_mineral.value: M.gather_resource(self, 'mineral') elif action == ZergAction.Build_queen.value: M.train_army(self, C._TRAIN_QUEEN) elif action == ZergAction.Build_zergling.value: M.train_army(self, C._TRAIN_ZERGLING) elif action == ZergAction.Build_roach.value: M.train_army(self, C._TRAIN_ROACH) elif action == ZergAction.Build_overlord.value: M.train_army(self, C._TRAIN_OVERLORD) elif action == ZergAction.Build_spawningpool.value: creep_index = U.get_creep_mask_screen(self.obs, size=2) pos = U.get_pos(creep_index) M.build_by_idle_worker(self, C._BUILD_SPAWNINGPOOL_S, pos) elif action == ZergAction.Build_roachwarren.value: creep_index = U.get_creep_mask_screen(self.obs, size=2) pos = U.get_pos(creep_index) M.build_by_idle_worker(self, C._BUILD_ROACHWARREN_S, pos) elif action == ZergAction.Build_evolutionchamber.value: creep_index = U.get_creep_mask_screen(self.obs, size=2) pos = U.get_pos(creep_index) M.build_by_idle_worker(self, C._BUILD_EVOLUTIONCHAMBER_S, pos) elif action == ZergAction.Build_spinecrawler.value: creep_index = U.get_creep_mask_screen(self.obs, size=2) pos = U.get_pos(creep_index) M.build_by_idle_worker(self, C._BUILD_SPINECRAWLER_S, pos) elif action == ZergAction.Attack.value: self.is_attack = True elif action == ZergAction.Defend.value: M.retreat_step(self) else: self.safe_action(C._NO_OP, 0, []) if self.is_attack: M.attack_step(self) # if any queen exists, try to inject lavra to hatchery. M.inject_larva(self)