As mentioned before, it's hard to give good, general advice. AI is a big field with lots of techniques, algorithms and challenges. The correct approach for your game depends on your specific needs and your capabilities.
I still haven't gotten a clear idea of what you want from your AI. You mentioned earlier that you wanted complex/interesting behaviour. But your videos makes the fighting mechanics look very simple. This isn't a bad thing, but it limits the possibilities for "interesting" behaviour from your AI. My impression is that the fighting focuses on mechanical skill and fast reaction speeds (running, shooting, dodging). This kind of AI behaviour is well suited for a manually coded AI.
I imagine that you could get a competent AI by just handling a number of cases:
doAIMove() {
// 1. Try to dodge enemy bullets
for bullet in enemyBullets {
if willHitMe(bullet) and canDodge(bullet) {
moveToDodge(bullet)
return
}
}
// 2. Run away from enemy if you have to
if enemyTooClose() {
moveAwayFromEnemy()
return
}
// 3. Shoot enemy if you can
if enemyInRange() {
shootAtEmeny()
return
}
// 4. If all else fails, get to where you can shoot at the enemy
moveToShootPosition()
return
}
If you want a more interesting/skilled/advanced enemy, you just add more special cases or improve the methods. If you for example discover that it sucks at running away, you just have to improve the heuristic used in runAway(). Or if you want it to behave more cautiously when hurt, just add a special case for that.