def execute(soldier): # Stop attacking if soldier.worker: if Pos.getDistance(soldier.getPosition(), soldier.worker.getPosition()) > Soldier.guardRange: soldier.changeState(LifeGuarding) elif Pos.getDistance(soldier.getPosition(), BuildingManager.getCastle()) > Soldier.guardRange: soldier.changeState(Guarding)
def enter(unit): pos = Pos( random.randint(unit.target.x - Charge.enemyRadius, unit.target.x + Charge.enemyRadius), random.randint(unit.target.z - Charge.enemyRadius, unit.target.z + Charge.enemyRadius)) unit.setTarget(pos)
def detectAttacks(): return False soldiers = 0 castlePos = BuildingManager.getCastle() for id in EntityManager.enemySoldiers: if Pos.getDistance(castlePos, EntityManager.enemySoldiers[id]. getPosition()) < StrategyManager.defendRadius: soldiers += 1 return soldiers >= StrategyManager.defendCount
def getNearestSoldier(pos, radius=None): if radius: for id in EntityManager.enemySoldiers: enemySoldier = EntityManager.enemySoldiers[id] if Pos.getDistance(pos, enemySoldier.getPosition()) < radius: return enemySoldier else: best = None bestDistance = 1000 for id in EntityManager.enemySoldiers: enemySoldier = EntityManager.enemySoldiers[id] if Pos.getDistance(pos, enemySoldier.getPosition()) < bestDistance: best = enemySoldier bestDistance = Pos.getDistance(pos, enemySoldier.getPosition()) return best
def getExplorePosition(explorer): # Make sure explorers are not exploring the same area # Try to explore enemy base as fast as possible to avoid being killed # Avoid enemy base when they have soldiers explorer.x -= EntityManager.deltaExploreX explorer.z -= EntityManager.deltaExploreZ if EntityManager.deltaExploreX > 0: if explorer.x < -1: explorer.x += EntityManager.deltaExploreX if EntityManager.setExploreArea(explorer): return EntityManager.getExplorePosition(explorer) if explorer.x < 3: explorer.x = 3 else: if explorer.x > EntityManager.mapSize + 1: explorer.x += EntityManager.deltaExploreX if EntityManager.setExploreArea(explorer): return EntityManager.getExplorePosition(explorer) if explorer.x > EntityManager.mapSize - 3: explorer.x = EntityManager.mapSize - 3 if EntityManager.deltaExploreZ > 0: if explorer.z < -1: explorer.z += EntityManager.deltaExploreZ if EntityManager.setExploreArea(explorer): return EntityManager.getExplorePosition(explorer) if explorer.z < 3: explorer.z = 3 else: if explorer.z > EntityManager.mapSize + 1: explorer.z += EntityManager.deltaExploreZ if EntityManager.setExploreArea(explorer): return EntityManager.getExplorePosition(explorer) if explorer.z > EntityManager.mapSize - 3: explorer.z = EntityManager.mapSize - 3 return Pos(explorer.x, explorer.z)
def attackIntruders(): return castlePos = BuildingManager.getCastle() # Attack with guarding soldiers when enemy soldiers near base for id in EntityManager.enemySoldiers: enemySoldier = EntityManager.enemySoldiers[id] if Pos.getDistance( castlePos, enemySoldier.getPosition()) < Soldier.guardRange: for soldierId in EntityManager.soldiers: soldier = EntityManager.soldiers[soldierID] if soldier.state == Guarding: soldier.enemy = enemySoldier soldier.changeState(Attack)
def findOre(pos = None): # Resource distance priority # Close faster # Far away safer early if len(ResourceManager.ironOre): if pos == None: pos = BuildingManager2.BuildingManager.getCastle() bestOre = None bestDistance = 1000 for ore in ResourceManager.ironOre: if not ore.worker: d = Pos.getDistance(ore.pos, pos) if d < bestDistance: bestDistance = d bestOre = ore return bestOre
def findTree(pos = None): # Resource distance priority # Close faster # Far away safer early if len(ResourceManager.trees): if pos == None: pos = BuildingManager2.BuildingManager.getCastle() bestTree = None bestDistance = 1000 for tree in ResourceManager.trees: if not tree.worker: d = Pos.getDistance(tree.pos, pos) if d < bestDistance: bestDistance = d bestTree = tree return bestTree
def execute(): building = BuildingManager.buildingNeeded() if building: castlePos = BuildingManager.getCastle() if castlePos: if building == BuildingType.camp: if castlePos.x < 50: dx = 1 else: dx = -1 if castlePos.z < 50: dz = 1 else: dz = -1 if dx < 0: x = random.randint(-BuildingManager.buildRange, 0) else: x = random.randint(0, BuildingManager.buildRange) if dz < 0: z = random.randint(-BuildingManager.buildRange, 0) else: z = random.randint(0, BuildingManager.buildRange) BuildingManager.createWorksite( building, Pos(castlePos.x + x, castlePos.z + z)) elif len(BuildingManager.camps) == 0: if castlePos.x > 50: dx = 1 else: dx = -1 if castlePos.z > 50: dz = 1 else: dz = -1 if dx < 0: x = random.randint(-BuildingManager.buildRange, 0) else: x = random.randint(0, BuildingManager.buildRange) if dz < 0: z = random.randint(-BuildingManager.buildRange, 0) else: z = random.randint(0, BuildingManager.buildRange) BuildingManager.createWorksite( building, Pos(castlePos.x + x, castlePos.z + z)) else: BuildingManager.createWorksite( building, Pos( random.randint( castlePos.x - BuildingManager.buildRange, castlePos.x + BuildingManager.buildRange), random.randint( castlePos.z - BuildingManager.buildRange, castlePos.z + BuildingManager.buildRange)))
def getPosition(self): return Pos.tilePos(self.pos)