def update_variables():
    gc = variables.gc 

    ## **************************************** GENERAL **************************************** ## 

    ## Constants
    variables.curr_round = gc.round()
    variables.num_enemies = 0
    variables.print_count = 0
    variables.research = gc.research_info()

    ## Battle locations
    variables.last_turn_battle_locs = variables.next_turn_battle_locs.copy()
    variables.next_turn_battle_locs = {}

    if variables.curr_round % 3 == 0: 
        variables.update_quadrant_healer_loc = True
    else:
        variables.update_quadrant_healer_loc = False


    # variables.quadrant_battle_locs = {}

    ## Units
    variables.my_units = gc.my_units()
    variables.my_unit_ids = set([unit.id for unit in variables.my_units])
    variables.units = gc.units()
    num_workers= num_knights=num_rangers= num_mages= num_healers= num_factory= num_rocket = 0
    if variables.ranged_enemies >= 5: 
        variables.ranged_enemies = 5
    else: 
        variables.ranged_enemies = 0

    if variables.switch_to_rangers:
        current = gc.research_info()
        if current.get_level(variables.unit_types["knight"]) < 2:
            gc.reset_research()
        if variables.curr_planet == bc.Planet.Earth and len(variables.dists) == 0:
            gc.queue_research(bc.UnitType.Rocket)
        if current.get_level(variables.unit_types["worker"]) != 1:
            gc.queue_research(bc.UnitType.Worker)
        if current.get_level(variables.unit_types["ranger"]) != 1:
            gc.queue_research(bc.UnitType.Ranger)  # 25: 50
        gc.queue_research(bc.UnitType.Healer)  # 25:  75
        if current.get_level(variables.unit_types["rocket"]) != 1:
            gc.queue_research(bc.UnitType.Rocket)  # 50:  125
        gc.queue_research(bc.UnitType.Healer)  # 100: 225
        gc.queue_research(bc.UnitType.Healer)  # 100: 325
        gc.queue_research(bc.UnitType.Ranger)  # 100: 425
        gc.queue_research(bc.UnitType.Ranger)  # 200: 625
        gc.queue_research(bc.UnitType.Worker)  # 75: 700
        variables.switch_to_rangers = False

    # Update which ally unit id's are still alive & deaths per quadrant
    # start_time = time.time()
    update_quadrants() # Updates enemies in quadrant & resets num dead allies
    # print('update quadrants time: ', time.time()-start_time)

    if variables.curr_planet == bc.Planet.Earth: 
        quadrant_size = variables.earth_quadrant_size
    else:
        quadrant_size = variables.mars_quadrant_size

    remove = set()
    for unit_id in variables.unit_locations: 
        if unit_id not in variables.my_unit_ids: 
            remove.add(unit_id)

    for unit_id in remove: 
        loc = variables.unit_locations[unit_id]
        del variables.unit_locations[unit_id]

        f_f_quad = (int(loc[0] / quadrant_size), int(loc[1] / quadrant_size))
        variables.quadrant_battle_locs[f_f_quad].remove_ally(unit_id)

    # Update % health of fighting allies in quadrant
    for quadrant in variables.quadrant_battle_locs: 
        q_info = variables.quadrant_battle_locs[quadrant]
        q_info.update_ally_health_coefficient(gc)

    # Something something enemies
    for poss_enemy in variables.units:
        if poss_enemy.team != variables.my_team and poss_enemy.unit_type in variables.attacker:
            variables.num_enemies += 1

    # Update num of ally units of each type
    unit_types = variables.unit_types
    variables.producing = [0, 0, 0, 0, 0]
    variables.in_order_units = []
    workers = []
    rangers = []
    knights = []
    mages = []
    healers = []
    factories = []
    rockets = []
    for unit in variables.my_units:
        if unit.unit_type == unit_types["worker"]:
            num_workers+=1
            workers.append(unit)
        elif unit.unit_type == unit_types["knight"]:
            num_knights+=1
            rangers.append(unit)
        elif unit.unit_type == unit_types["ranger"]:
            num_rangers+=1
            knights.append(unit)
        elif unit.unit_type == unit_types["mage"]:
            num_mages+=1
            mages.append(unit)
        elif unit.unit_type == unit_types["healer"]:
            num_healers+=1
            healers.append(unit)
        elif unit.unit_type == unit_types["factory"]:
            num_factory+=1
            factories.append(unit)
            if unit.is_factory_producing():
                type = unit.factory_unit_type()
                if type == variables.unit_types["worker"]:
                    variables.producing[0]+=1
                elif type == variables.unit_types["knight"]:
                    variables.producing[1]+=1
                elif type == variables.unit_types["ranger"]:
                    variables.producing[2]+=1
                elif type == variables.unit_types["mage"]:
                    variables.producing[3]+=1
                else:
                    variables.producing[4]+=1
        elif unit.unit_type == unit_types["rocket"]:
            num_rocket+=1
            rockets.append(unit)
    variables.info = [num_workers, num_knights, num_rangers, num_mages, num_healers, num_factory, num_rocket]
    variables.in_order_units.extend(rangers)
    variables.in_order_units.extend(workers)
    variables.in_order_units.extend(knights)
    variables.in_order_units.extend(mages)
    variables.in_order_units.extend(healers)
    variables.in_order_units.extend(factories)
    variables.in_order_units.extend(rockets)
    ## **************************************** UNITS **************************************** ## 

    ## Worker 
    variables.my_karbonite = gc.karbonite()


    ## Income
    variables.worker_harvest_amount = 0
    variables.past_karbonite_gain = variables.current_karbonite_gain + max(0,10 - int(variables.my_karbonite/40))
    variables.current_karbonite_gain = 0 # reset counter



    if not worker.check_if_saviour_died():
        variables.saviour_worker_id = None
        variables.saviour_worker = False
        variables.saviour_blueprinted = False
        variables.saviour_blueprinted_id = None
        variables.num_unsuccessful_savior = 0
        variables.saviour_time_between = 0

    # start_time = time.time()
    worker.designate_roles()
    # print("designating roles time: ",time.time() - start_time)

    ## Rangers
    variables.targeting_units = {}
    ranger.update_rangers()

    ## Knights
    knight.update_battles()

    ## Healers
    healer.update_healers()

    ## Rockets
    rocket.update_rockets()

    ## Factories
    factory.evaluate_stockpile()
Example #2
0
    time_factories = 0
    unit_types = variables.unit_types
    info = variables.info

    #print('TIME LEFT', gc.get_time_left_ms())
    ##print("past karbonite gain",variables.past_karbonite_gain)

    try:
        for unit in variables.in_order_units:
            if gc.get_time_left_ms() < 250:
                break
            # respective unit types execute their own AI
            if unit.unit_type == unit_types["worker"]:
                try:
                    start_time = time.time()
                    worker.timestep(unit)
                    time_workers += (time.time() - start_time)

                except Exception as e:
                    print('Error:', e)
                    # use this to show where the error was
                    traceback.print_exc()
            elif unit.unit_type == unit_types["knight"]:
                #start_time = time.time()
                knight.timestep(unit)
                #time_knights+=(time.time()-start_time)
            elif unit.unit_type == unit_types["ranger"]:
                try:
                    start_time = time.time()
                    ranger.timestep(unit)
                    time_rangers += (time.time() - start_time)
def update_variables():
    gc = variables.gc 

    ## **************************************** GENERAL **************************************** ## 

    ## Constants 
    variables.curr_round = gc.round()
    variables.num_enemies = 0
    variables.print_count = 0
    variables.research = gc.research_info()

    ## Battle locations 
    variables.last_turn_battle_locs = variables.next_turn_battle_locs.copy()
    variables.next_turn_battle_locs = {}
    # variables.quadrant_battle_locs = {}

    ## Units 
    variables.my_units = gc.my_units()
    variables.my_unit_ids = set([unit.id for unit in variables.my_units])
    variables.units = gc.units()
    num_workers= num_knights=num_rangers= num_mages= num_healers= num_factory= num_rocket = 0

    # Update which ally unit id's are still alive & deaths per quadrant
    update_quadrants() # Updates enemies in quadrant & resets num dead allies

    if variables.curr_planet == bc.Planet.Earth: 
        quadrant_size = variables.earth_quadrant_size
    else:
        quadrant_size = variables.mars_quadrant_size

    remove = set()
    for unit_id in variables.unit_locations: 
        if unit_id not in variables.my_unit_ids: 
            remove.add(unit_id)
    for unit_id in remove: 
        loc = variables.unit_locations[unit_id]
        del variables.unit_locations[unit_id]

        f_f_quad = (int(loc[0] / quadrant_size), int(loc[1] / quadrant_size))
        variables.quadrant_battle_locs[f_f_quad].remove_ally(unit_id)

    # Update % health of fighting allies in quadrant
    for quadrant in variables.quadrant_battle_locs: 
        q_info = variables.quadrant_battle_locs[quadrant]
        q_info.update_ally_health_coefficient(gc)

    # Something something enemies
    for poss_enemy in variables.units:
        if poss_enemy.team != variables.my_team and poss_enemy.unit_type in variables.attacker:
            variables.num_enemies += 1

    # Update num of ally units of each type
    unit_types = variables.unit_types
    for unit in variables.my_units:
        if unit.unit_type == unit_types["worker"]:
            num_workers+=1
        elif unit.unit_type == unit_types["knight"]:
            num_knights+=1
        elif unit.unit_type == unit_types["ranger"]:
            num_rangers+=1
        elif unit.unit_type == unit_types["mage"]:
            num_mages+=1
        elif unit.unit_type == unit_types["healer"]:
            num_healers+=1
        elif unit.unit_type == unit_types["factory"]:
            num_factory+=1
        elif unit.unit_type == unit_types["rocket"]:
            num_rocket+=1
    variables.info = [num_workers, num_knights, num_rangers, num_mages, num_healers, num_factory, num_rocket]

    ## **************************************** UNITS **************************************** ## 

    ## Worker 
    variables.my_karbonite = gc.karbonite()
    variables.producing= [0, 0, 0, 0, 0]

    if not worker.check_if_saviour_died():
        variables.saviour_worker_id = None
        variables.saviour_worker = False
        variables.saviour_blueprinted = False
        variables.saviour_blueprinted_id = None
        variables.num_unsuccessful_savior = 0
        variables.saviour_time_between = 0

    worker.designate_roles()

    ## Rangers
    variables.targeting_units = {}
    ranger.update_rangers()

    ## Knights
    knight.update_battles()

    ## Healers
    healer.update_healers()

    # Rockets
    rocket.update_rockets()

    ## Mages


    ## Factories
    factory.evaluate_stockpile()
Example #4
0
    knight.update_battles()
    #if time.time()-start_time > 0.02:
    #    print('KNIGHT UPDATE BATTLES:', time.time()-start_time)

    start_time = time.time()
    healer.update_healers()
    #if time.time() - start_time > 0.02:
    #    print('HEALER UPDATE TIME:', time.time()-start_time)

    start_time = time.time()
    ranger.update_rangers()
    #if time.time() - start_time > 0.02:
    #    print('RANGER UPDATE TIME: ', time.time()-start_time)

    start_time = time.time()
    worker.designate_roles()
    #if time.time() - start_time > 0.02:
    #    print('DESIGNATING ROLES TIME:', time.time()-start_time)

    factory.evaluate_stockpile()
    #time_workers = 0
    #time_rangers = 0
    #time_healers = 0
    # time_factories = 0
    # time_knights = 0

    #print("current worker roles: ", variables.current_worker_roles)

    try:
        # walk through our units:
        #start_time = time.time()
Example #5
0
         num_mages += 1
     elif unit.unit_type == bc.UnitType.Healer:
         num_healers += 1
     elif unit.unit_type == bc.UnitType.Factory:
         num_factory += 1
     elif unit.unit_type == bc.UnitType.Rocket:
         num_rocket += 1
 info = [
     num_workers, num_knights, num_rangers, num_mages, num_healers,
     num_factory, num_rocket
 ]
 for unit in gc.my_units():
     # resepective unit types execute their own AI
     if unit.unit_type == bc.UnitType.Worker:
         worker.timestep(gc, unit, info, karbonite_locations,
                         locs_next_to_terrain, blueprinting_queue,
                         building_assignment, current_worker_roles)
     elif unit.unit_type == bc.UnitType.Knight:
         knight.timestep(gc, unit, info, knight_to_cluster,
                         seen_knights_ids, KNIGHT_CLUSTER_MIN)
     elif unit.unit_type == bc.UnitType.Ranger:
         ranger.timestep(gc, unit, info, last_turn_battle_locs,
                         next_turn_battle_locs, queued_paths,
                         ranger_roles)
     elif unit.unit_type == bc.UnitType.Mage:
         mage.timestep(gc, unit, info, last_turn_battle_locs,
                       next_turn_battle_locs, queued_paths)
     elif unit.unit_type == bc.UnitType.Healer:
         healer.timestep(gc, unit, info, last_turn_battle_locs)
     elif unit.unit_type == bc.UnitType.Factory:
         factory.timestep(gc,
Example #6
0
    #Update knight cluster min
    """
    try: 
        my_knights = list(filter(lambda x: x.unit_type == bc.UnitType.Knight, gc.my_units()))
        if len(my_knights) > 25: 
            KNIGHT_CLUSTER_MIN =8
        elif len(my_knights) > 15:
            KNIGHT_CLUSTER_MIN = 5
        else: 
            KNIGHT_CLUSTER_MIN = 2
    except: 
        pass
    """
    worker.designate_roles(gc, blueprinting_queue, blueprinting_assignment,
                           building_assignment, current_worker_roles,
                           karbonite_locations)
    # print("current worker roles: ",current_worker_roles)
    try:
        # walk through our units:
        num_workers = num_knights = num_rangers = num_mages = num_healers = num_factory = num_rocket = 0
        for unit in gc.my_units():
            if unit.unit_type == bc.UnitType.Worker:
                num_workers += 1
            elif unit.unit_type == bc.UnitType.Knight:
                num_knights += 1
            elif unit.unit_type == bc.UnitType.Ranger:
                num_rangers += 1
            elif unit.unit_type == bc.UnitType.Mage:
                num_mages += 1
            elif unit.unit_type == bc.UnitType.Healer: