Kelvintaph Burgler Can't read protected property: findEnemyMissiles

Hello, i have problem

def evade():
    x, y = getPos(hero)
    orbs = hero.findEnemyMissiles()
    if len(orbs):
        orb = hero.findNearest(orbs)
        if hero.distanceTo(orb) < 3:
            if y > 14:
                hero.moveXY(x, y - 7)
            else:
                hero.moveXY(x, y + 7)

error Line 45: TypeError: Can’t read protected property: findEnemyMissiles

1 Like

Hmmm… I am not advanced for this yet… I would reccomend that you message @dedreous.

@dedreous is one of the more advanced “Python Specialists” as I refer to them as.

1 Like

Thanks for that @TheBredMeister!

@Alex_M, do you have the Twilight Glasses equipped? Either way, please post all of your code. Since this level is a ‘challenge’ level (no code or guidance), it will help to see what else you’ve come up with.

Oh…and welcome to the forum!

thanks, i buy glasses, it’s ok!!!

I have a problem again, tell me what to do with this passage.

excepE = ['tower']
dest = {'x': 78, 'y': 39}
done = False


def getPos(obj):
    return obj.pos.x, obj.pos.y


def toPos(x, y):
    return {'x': x, 'y': y}


def rushTo(xy):
    if hero.isReady("jump"):
        hero.jumpTo(xy)
    hero.move(xy)


def exclude(units, exceps):
    return [u for u in units if u.type not in exceps]


def farthest(enemies):
    farthestD = 0
    for enemy in enemies:
        d = hero.distanceTo(enemy)
        if d > farthestD and enemy.health > 0:
            farthestD = d
            farthest = enemy
    return farthest


def nearby(enemies, dis):
    return sum([hero.distanceTo(e) < dis for e in enemies])


def selfDying(self):
    if self.health < self.maxHealth / 2:
        hero.command(self, "move", {'x': self.pos.x - 1, 'y': self.pos.y})


def evade():
    x, y = getPos(hero)
    orbs = hero.findEnemyMissiles()
    if len(orbs):
        orb = hero.findNearest(orbs)
        if hero.distanceTo(orb) < 3:
            if y > 14:
                hero.moveXY(x, y - 7)
            else:
                hero.moveXY(x, y + 7)


def lowHP():
    friends = hero.findFriends()
    lowest = 9999
    dying = None
    if len(friends):
        for friend in friends:
            hp = friend.health
            if hp < friend.maxHealth / 3 and hp < lowest and hp > 0:
                lowest = hp
                dying = friend
    return dying


def soldierAtk(soldier):
    selfDying(soldier)
    enemies = hero.findByType("ogre")
    if not len(enemies):
        enemy = soldier.findNearestEnemy()
    else:
        enemy = enemies[0]
    if enemy:
        hero.command(soldier, "attack", enemy)
    else:
        hero.command(soldier, "move", soldier.pos)


def archerAtk(archer):
    enemies = hero.findByType("chieftain")
    if not len(enemies):
        enemy = archer.findNearestEnemy()
    else:
        enemy = enemies[0]
    if enemy and archer.pos.x > 53 and archer.pos.y < 40:
        hero.command(archer, "attack", enemy)
    elif hero.time > 6:
        hero.command(archer, "move", dest)


def riderAtk(rider):
    enemies = hero.findByType("robot-walker")
    if len(enemies):
        hero.command(rider, "move", {'x': enemies[0].pos.x / 2 + enemies[1].pos.x / 2,
                                     'y': enemies[0].pos.y / 2 + enemies[1].pos.y / 2})


def palaAtk(pala):
    selfDying(pala)
    dying = lowHP()
    enemies = hero.findByType("witch")
    if not len(enemies):
        enemy = pala.findNearestEnemy()
    else:
        enemy = enemies[0]
    if dying and pala.canCast('heal'):
        hero.command(pala, "cast", 'heal', dying)
    else:
        hero.command(pala, "move", dest)
    if pala.canCast('heal') and hero.health < 2 * hero.maxHealth / 3:
        hero.command(pala, "cast", 'heal', hero)
    if pala.pos == dest:
        hero.command(pala, "shield")


def summon(soldier):
    while hero.gold >= hero.costOf(soldier):
        hero.summon(soldier)


def command():
    for unit in hero.findFriends():
        t = unit.type
        if t == 'griffin-rider':
            riderAtk(unit)
        elif t == 'soldier':
            soldierAtk(unit)
        elif t == 'paladin':
            palaAtk(unit)
        elif t == 'archer':
            archerAtk(unit)


def atk():
    if hero.gold > hero.costOf('griffin-rider'):
        hero.summon('griffin-rider')
    command()

    enemies = hero.findByType("robot-walker")
    if len(enemies):
        pass
    else:
        enemy = hero.findNearest([e for e in hero.findEnemies() if e.type not in ['ice-yak', 'cow']])
        if enemy:
            command()
            if hero.canCast("chain-lightning", enemy) and hero.time > 1:
                hero.cast("chain-lightning", enemy)
        elif not len(enemies):
            hero.move({'x': 78, 'y': 14})
    return True


def run():
    while True:
        evade()
        atk()


run()

I copied your code and ran it. The hero never moved, so was taken out very quickly by the ‘orbs’. The tactic I used in my code was to wait for the robots to fire, determine the individual coordinates of the closest missile and then just hop up and down…in other words, detect incoming missiles, determine their trajectory and move opposite that (only changing the hero pos.y):


With that being said, in your evade function, rather than detecting distance, try determining the pos.y of the missile and then move up, or down as needed. I just moved between “x”: hero.pos.x, “y”: 10 (or 20)

Meanwhile, up top…keep all of your friends still, except for the paladin. Use him to lure the chieftan to the yak…once the yak attacks, send the paladin directly against the witch. Once both of those are dead, send him to the exit.

Then, command the remaining friends to head for the exit too.

At the same time, summon your soldiers, have them attack the nearest robot and have your hero high tail it out of there:

SUCCESS!

But I can’t get the ice gates to open…

You must kill both of the ogres for that to happen. I just realized I could have worded my last better. Please understand that I am intending to share my method/tactics…there are soo many ways to complete this level, these ideas are what worked for me.

How about:

Meanwhile, up top…keep all of your friends still, except for the paladin. Use him to lure the chieftain to the yak…once the yak attacks, send the paladin directly against the witch. Once both of those are dead, send the paladin to the exit. Then, command the remaining friends to head for the exit too.

Once both ogres are dead, summon your soldiers, have them attack the nearest robot and have your hero high tail it out of there.

I noticed that the initial comments are missing, which is where it tells you to kill both ogres to open the door…

# What eldritch artifacts are these? Don"t let them blast you!
# The ice gate will open when both ogres are defeated

Therefore, I kept my hero dancing up and down until the door opened, then summoned and ran for it.