Corrigindo apenas a verificação que você fez ali em "move[1].level", ele vai sempre puxar o level da primeira "spell" apenas, dessa maneira aqui ele vai puxar da "spell" que o player usar:
if move[i].level > player:getSummonLevelFromBall() then
player:sendCancelMessage("Your "..summonName.." must be level "..move[i].level.." or higher to use this move.")
player:getPosition():sendMagicEffect(CONST_ME_POFF)
break
end
Neste caso ta sendo verificado o level do pokémon, não o do player! o/
---
Dei uma boa reformulada do sistema de Pokémon passive e agressive, onde o pokémon só atacava no momento que perdia life.
Agora ao ser targetado ou hitado por qualquer skill do summon ele já ira atacar.