Вопросы о синтаксисе Python в CodeCombat

Затрудняюсь с вопросом сюда писать или новую тему создавать . В общем мне кажется что упустил что то важное . К примеру в как понять в каких случаях будет работать hero.say(i,j,k) а в каких hero.say(i + j+ k) , как мне нужно догадываться что команда hero.command(unit, event, evntTarget ) в случае buildXY записывается как (unit, event, evntTarget, evntTarget.pos.x,evntTarget.pos.y )??? есть какой то полный список команд ??? чем дальше тем больше похоже на заклинание дождя (делаешь все как научили шаманы если не работает действуешь методом научного тыка … заработало непонятно как ) очень сильно выводит из себя . была тема со ссылкой на документацию к мозиле но там для javaScript я же начинаю заниматься пайтоном . Если есть справочная информация дайте линк пожалуйста

Доброго времени суток !
Я в тупике .
https://codecombat.com/play/level/grim-determination?

# Твоя цель - защитить Рейнальдо.

# Найди паладина с самым низким здоровьем.
def lowestHealthPaladin():
    lowestHealth = 99999
    lowestFriend = None
    friends = hero.findFriends()
    for friend in friends:
        if friend.type != "paladin":
            continue
        if friend.health < lowestHealth and friend.health < friend.maxHealth:
            lowestHealth = friend.health
            lowestFriend = friend
    return lowestFriend

def commandPaladin(paladin):
    little = lowestHealthPaladin()
    if little:
        if little.canCast("heal") and paladin.canCast("heal"):
            hero.command(paladin, "cast", "heal", little)
            hero.command(little, "cast", "heal", little)
    # enemy = paladin.findNearestEnemy()
    # enemy = hero.findNearestEnemy()
    enemy = low()
    if enemy:
        hero.command(paladin, "attack", enemy)
    if paladin.health < 200:
        hero.command(paladin, "shield")

def commandFriends():
    # Управляй своими союзниками.
    friends = hero.findFriends()
    peasantIndex = 0
    for friend in friends:
        if friend.type == "peasant":
            commandPeasant(friend,peasantIndex)
            peasantIndex += 1
        elif friend.type == "griffin-rider":
            commandGriffin(friend)
        elif friend.type == "paladin":
            commandPaladin(friend)

def commandPeasant(friend,index):
    coins = hero.findItems()
    coin = coins[index]
    hero.command(friend, "move", coin.pos)
    if hero.canCast("goldstorm"):
        hero.cast("goldstorm")

def low():
    enemies = hero.findEnemies()
    lowVAlue= 9999
    lowEnemy = None
    for enemy in enemies:
        if enemy.health < lowVAlue and enemy.type!= "warlock":
            lowVAlue = enemy.health
            lowEnemy = enemy
    return lowEnemy


def commandGriffin(friend):
    enemy = low()
    if enemy:
        hero.command(friend, "attack", enemy)


while True:
    commandFriends()
    # Призывай наездников!
    if hero.gold > hero.costOf("griffin-rider"):
        hero.summon("griffin-rider")

 

Что я пробовал :

  1. List item
    собирать больше золота +
  2. List item
    бить врагов с самым малым либо большим здоровьем +(отсев по самому малому здоровью увеличил время жизни паладинов )
  3. List item
    приказывать всем биль одного либо каждому своего врага
  4. List item
    пробовал смухлевать и телепортировать героя командой swap (работает но героя телепортирует на изначальную площадку спустя доли секунды - бесполезно )
  5. List item
    пробовал применять flame armor несмотря на то что дальность не указана на паладинов нельзя повесить это заклинание
  6. List item
    пробовал бить варлока - контрпродуктивно
  7. List item
    пробовал максимально сократить код убрать побольше условий - не сработало
  8. List item
    пытался методом научного тыка вызвать функцию cleave у паладинов но она не работает ))
  9. List item
    Много ругался и смотрел в окно - в Санкт-Петербурге из за этого в мае пошел снег. (тут точно не на шаманов учат ?)

Итог: я понял что проблема в функции управления паладинами . Но не могу понять как ее надо изменить что бы пройти уровень .
Прошу помощи буду рад разъяснениям

Как и ожидалось проблема в умравлении паладинами …

def commandPaladin(paladin):
    little = lowestHealthPaladin()
    if little:
        if little.canCast("heal") and paladin.canCast("heal"):
            hero.command(paladin, "cast", "heal", little)
            hero.command(little, "cast", "heal", little)
    # enemy = paladin.findNearestEnemy()
    # enemy = hero.findNearestEnemy()
    enemy = low()
    if enemy:
        hero.command(paladin, "attack", enemy)
    if paladin.health < 200:
        hero.command(paladin, "shield")

методом поиска на гитхабе нашел такую реализацию :

def commandPaladin(paladin):
    if paladin.canCast("heal"):
        target = lowestHealthPaladin()
        if target:
            hero.command(paladin, "cast", "heal", target)
    elif (paladin.health < 200):
        hero.command(paladin, "shield")
    else:
        target = paladin.findNearestEnemy()
        if (target):
            hero.command(paladin, "attack", target)

тоесть код выполняет все то же самое за исключением
hero.command(little, “cast”, “heal”, little)
значит проблемма в оптимизации , потому как даже без этой команды уровень не проходился .
проблемма тут :

def commandPaladin(paladin):
    little = lowestHealthPaladin()
    if little:
        if little.canCast("heal") and paladin.canCast("heal"):

для сравнения :

def commandPaladin(paladin):
    if paladin.canCast("heal"):
        target = lowestHealthPaladin()
        if target:

тоесть в этом отрезке у меня код делает 4 действия а в найденом примере 3 … это на 25 или 30 % в зависимости от точки зрения разница …

p.s. Считаю что стоило указать в манулале что оптимизация тут крайне важна …