def useAtPosition(x, y, func): xDiff = selfX//ai.blockSize() - x yDiff = selfY//ai.blockSize() - y targetDirection = math.atan2(yDiff, xDiff) ai.turnToRad(targetDirection) func() sendMessage("teacherbot")
def useMine(x, y): if distance((selfX//ai.blockSize(), selfY//ai.blockSize()), (x, y)) < 1: ai.dropMine() sendMessage("teacherbot") return "idle" else: return [y,x]
def pixelsToBlockSize(mapWidth, mapHeight): playerX = int(ai.selfX() // ai.blockSize())-0 playerY = mapHeight-1 - int((ai.selfY() // ai.blockSize())-1) return (playerY, playerX)
def checkDistance(x, y, dist): if distance((selfX//ai.blockSize(), selfY//ai.blockSize()), (x, y)) < dist: return True return False
def tick(): #NO EXCEPTION HANDLING try: # #GLOBAL VARIABLES # #XPILOT-SPEC global tickCount global mode global selfVelX, selfVelY global selfX, selfY global selfSpeed global selfTracking #ITEMS global item global itemId global lastItemCount #COMMUNICATION global latestTask #A* global mapWidth global mapHeight global maplist global finalPath global finalPosition #REFUELING global fuelIndex global stationId #MULTITHREADING global maplistQueue global searchForPath global searchQueue global pathQueue #RESET IF DEAD if not ai.selfAlive(): tickCount = 0 #CLEAR A* finalPosition = [] finalPath = [] mode = "idle" return tickCount += 1 # #SENSORS READINGS # #XPILOT-SPEC selfX = ai.selfX() selfY = (mapHeight * ai.blockSize()) - ai.selfY() selfVelX = ai.selfVelX() selfVelY = ai.selfVelY() selfSpeed = ai.selfSpeed() selfTracking = ai.selfTrackingRad() selfHeading = ai.selfHeadingRad() #DOES NOT EXIST FIRST TICKS if tickCount > 6: mass = ai.selfMass() thrustPower = ai.getPower() friction = ai.getOption("friction") mapWidth = ai.getOption("mapwidth") mapHeight = ai.getOption("mapheight") print ("tick count:", tickCount, "mode", mode) #IN THIS MODE WE ARE WAITING FOR THE PLAYER TO GIVE THE BOT INSTRUCTIONS if mode == "idle": mode, value, latestTask = getMessage() if mode == "move": finalPosition = value elif mode == "collect": item = value elif mode == "refuel": fuelIndex = value #IN THIS MODE WE ARE CALUCLATING PATH USING ASTAR elif mode == "move": #MULTITHREADING searchForPath = True searchQueue.put(searchForPath) try: finalPath = pathQueue.get(timeout=1) maplist = maplistQueue.get(timeout=1) except queue.Empty: pass #SEARCH-PATH-PART if not finalPath: print("CALCULATING PATH") maplist, finalPath = getPath(pixelsToBlockSize(mapWidth, mapHeight), tuple(finalPosition), mapWidth, mapHeight) print("CALCULATED MAPLIST LENGTH:", len(maplist)) print("CALCULATED FINAL PATH:", len(finalPath)) else: if maplist: printMap(finalPath, True) #MULTITHREADING searchForPath = False searchQueue.put(searchForPath) print("Final Path:", finalPath) print("Player Pos:","(",selfY // ai.blockSize(), selfX // ai.blockSize(),")") targetPosition = finalPath[0] if finalPath[0][1] == selfX // ai.blockSize() and finalPath[0][0] == selfY // ai.blockSize(): if len(finalPath) > 1: finalPath = finalPath[1:] else: print("REACHED TARGETPOS") sendMessage("teacherbot") finalX = finalPosition[1] finalY = finalPosition[0] finalPosition = [] finalPath = [] print(latestTask) if "refuel" in latestTask: mode = "refueling" elif latestTask == "use-item mine": mode = useMine(finalX, finalY) elif latestTask == "use-item missile": mode = useMissile(finalX, finalY) elif latestTask == "use-item laser": mode = useLaser(finalX, finalY) else: mode = "idle" #MOVE-PART if finalPosition: stoppingDist = stopping_distance(mass, friction, thrustPower, selfSpeed) moveToPos(selfX, selfY, [targetPosition[1]*ai.blockSize(), targetPosition[0]*ai.blockSize()], stoppingDist) #IF OTHER PLAYER IS SHOOTING TOWARDS YOU FLEE elif mode == "flee": if ai.selfItem(18): usePhasing(0, 0) elif ai.selfItem(17): useHyperJump(0, 0) elif ai.selfItem(10): useEcm(0,0) elif ai.selfItem(15): useEmergencyShield(0, 0) else: ai.shield() #IN THIS MODE WE ARE REFUELING elif mode == "refuel": mode, finalPath, finalPosition = moveToFuelStation() elif mode == "refueling": '''Amount of fuel in station''' if ai.fuelstationFuel(fuelIndex) > 0: '''Keep calling to refuel''' ai.refuel() else: mode = "idle" #IN THIS MODE WE ARE COLLECTING ITEMS elif mode == "collect": if ai.itemCountScreen() > 0: itemOnScreen = False for i in range(ai.itemCountScreen()): if ai.itemType(i) == item: itemId = i itemOnScreen = True break if not itemOnScreen: print("No item of type " + str(item) + " on screen") mode = "idle" collectAim(itemId) if selfSpeed < 10: thrust(10) else: brake(2) except: print(traceback.print_exc())
def tick(): #NO EXCEPTION HANDLING try: #GLOBAL VARIABLES global tickCount global mode global item global itemId global lastItemCount global latestTask global mapWidth global mapHeight global maplist global finalPath global pathThread # Does not need to be global at the moment global searchForPath, searchQueue global selfVelX, selfVelY global selfSpeed global selfTracking global finalPosition #RESET IF DEAD if not ai.selfAlive(): tickCount = 0 #Create a clear function targetPos = [] finalPath = [] mode = "idle" return tickCount += 1 #SENSORS READINGS selfX = ai.selfX() selfY = (mapHeight * ai.blockSize()) - ai.selfY() selfVelX = ai.selfVelX() selfVelY = ai.selfVelY() selfSpeed = ai.selfSpeed() selfTracking = ai.selfTrackingRad() selfHeading = ai.selfHeadingRad() mass = ai.selfMass() friction = ai.getOption("friction") thrustPower = ai.getPower() mapWidth = ai.getOption("mapwidth") mapHeight = ai.getOption("mapheight") print ("tick count:", tickCount, "mode", mode) #IN THIS MODE WE ARE WAITING FOR THE PLAYER TO GIVE THE BOT INSTRUCTIONS if mode == "idle": mode, value = getMessage() if mode == "move": finalPosition = value elif mode == "collect": item = value #IN THIS MODE WE ARE CALUCLATING PATH USING ASTAR elif mode == "move": #GET PATH searchForPath = True searchQueue.put(searchForPath) try: finalPath = pathQueue.get(timeout=1) except queue.Empty: pass #if not finalPath: #print("CALCULATING PATH") #finalPath = getPath(pixelsToBlockSize(mapWidth, mapHeight), tuple(finalPosition), mapWidth, mapHeight) # else: #SEARCH print("final path", finalPath) if finalPath: print("I HAVE A FINAL PATH!") print("FINAL PATH: ", finalPath) searchForPath = False # We have now found a path searchQueue.put(searchForPath) print("Final Path:", finalPath) print("Player Pos:","(",selfY // ai.blockSize(), selfX // ai.blockSize(),")") targetPosition = finalPath[0] if finalPath[0][1] == selfX // ai.blockSize() and finalPath[0][0] == selfY // ai.blockSize(): if len(finalPath) > 1: finalPath = finalPath[1:] else: print("REACHED TARGETPOS") sendMessage("teacherbot") finalPosition = [] finalPath = [] mode = "idle" #MOVES if finalPath and finalPosition: print("I HAVE A FINAL POSITION!") stoppingDist = stopping_distance(mass, friction, thrustPower, selfSpeed) moveToPos(selfX, selfY, [targetPosition[1]*ai.blockSize(), targetPosition[0]*ai.blockSize()], stoppingDist) else: print("NO FINAL POSITION") #TODO: Search and destroy elif mode == "destroy": pass #TODO: Astar safe path elif mode == "refuel": fuelIndex = random.randint(0, ai.fuelstationCount()) refueling = False #GET FEULSTATION X AND Y POS finalxPosition = ai.fuelstationBlockX(fuelIndex) finalyPosition = mapHeight - ai.fuelstationBlockY(fuelIndex) finalxAndyPosition = [finalyPosition - 1, finalxPosition] targetPos = finalxAndyPosition mode = "move" #TODO: USE WITH ASTAR if refueling: '''Amount of fuel in station''' if ai.fuelstationFuel(fuelIndex) > 0: '''Keep calling to refuel''' ai.refuel() else: mode = "idle" '''Number of fueltanks on server''' #ai.tankCountServer() '''Number of fuelstations on server''' #ai.fuelstationCount() #IN THIS MODE WE ARE COLLECTING ITEMS elif mode == "collect": if ai.itemCountScreen() > 0: itemOnScreen = False for i in range(ai.itemCountScreen()): if ai.itemType(i) == item: itemId = i itemOnScreen = True break if not itemOnScreen: print("No item of type " + str(item) + " on screen") mode = "idle" itemX = ai.itemX(itemId) itemY = ai.itemY(itemId) itemVelX = ai.itemVelX(itemId) itemVelY = ai.itemVelY(itemId) deltaPosX = itemX - selfX deltaPosY = itemY - ai.selfY() deltaVelX = itemVelX - selfVelX deltaVelY = itemVelY - selfVelY time = time_of_impact(deltaPosX, deltaPosY, itemVelX, itemVelY, 10) targetPosition = vector_sum((deltaPosX, deltaPosY), scalar_product((deltaVelX, deltaVelY), time)) ai.turnToRad(math.atan2(targetPosition[1], targetPosition[0])) if selfSpeed < 10: thrust(10) else: brake(2) except: print(traceback.print_exc())