Créatures contrôlables = companion ou invocation qu'on peut contrôler.
Dans ce paragraphe nous allons apprendre comment contrôler ce type de créature avec AnkaBot.
Récupérer l'identifiant et les sorts
Créer et charger le script suivant :
function fightManagement()
global:printSuccess("TOUR : "..fightAction:getCurrentTurn())
if fightCharacter:isItMyTurn() then
global:printSuccess("C'est le tour de mon personnage !")
global:delay(5000)
else
global:printMessage("C'est le tour de "..fightSlave:name().." !")
local slave = fightSlave:entity()
if slave ~= nil then
global:printSuccess("Id :"..slave.Id)
global:printSuccess("CreatureGenericId :"..slave.CreatureGenericId)
global:printSuccess("LifePoints :"..slave.LifePoints)
global:printSuccess("AP :"..slave.AP)
global:printSuccess("MP :"..slave.MP)
global:printSuccess("CellId :"..slave.CellId)
global:printSuccess("Level :"..slave.Level)
global:printSuccess("Nearest Enemy :"..fightSlave:getNearestEnemy())
global:printSuccess("Nearest Ally :"..fightSlave:getNearestAlly())
global:printSuccess("Invocateur :"..slave.Stats.summoner)
fightSlave:showSpells()
else
global:printError("Une erreur est survenue !")
end
global:delay(5000)
end
end
Puis choisissez "IA Avancée dans le meme script" :
Lancer un combat avec n'importe quel monstre, le script va vous afficher quelques informations :
Nous allons récupérer les informations utiles suivants :
Un identifiant : 1 (Celui du companion Lumino)
Les identifiants des sorts du Lumino.
Exemple d'IA (Dofus 2.0)
La réalisation de l'IA pour un companion ou une invocation, se fait exactement de la meme manière que la réalisation de l'IA pour votre personnage, la seule différence c'est que au lieu d'utiliser les méthode fightAction: ou fightCharacter: il faut utiliser fightSlave:
Lorsque vous utiliser une IA avancée pour votre companion, vous pouvez continuer à utiliser l'IA intégrée dans l'interface d'AnkaBot pour votre personnage, voir :
Maintenant l'exemple :
Ci-dessous l'exemple d'une IA qui :
Votre personnage principale va jouer avec l'IA intégrée dans l'interface d'AnkaBot.
Votre companion Lumino va jouer le sort "Tambourino" le maximum de fois possible.
Tout est expliqué avec des commentaires.
function fightManagement()
-- Vérifier que c'est le tour de mon personnage principale.
if fightCharacter:isItMyTurn() then
-- Jouer le tour de mon personnage avec l'IA configurée dans l'interface
global:printMessage("C'est mon tour, je joue avec l'IA configurée dans l'interface !")
fightBasic:playTurn(1)
else
-- L'entité qui joue le tour
local slave = fightSlave:entity()
if slave == nil then
global:printSuccess("Une erreur est survenue, impossible de récupérer l'entité qui joue le tour !")
end
-- Tour de qui ?
global:printMessage("C'est le tour de "..fightSlave:name().." !")
-- Vérifier que c'est Lumino (1 = Lumino)
if slave.CreatureGenericId == 1 then
-- Lancer le maximum de fois possible le sort "Tambourino" (ID: 4204) du Lumino
while spell_Tambourino() do end
-- On se rapproche de l'ennemi le plus proche
fightSlave:moveTowardCell(fightSlave:getNearestEnemy())
end
end
end
function spell_Tambourino()
-- Récupérer la cellule de l'ennemi le plus proche
local enemyCell = fightSlave:getNearestEnemy()
-- Chercher une cellule où on peut lancer le sort "Tambourino" (ID: 4204) du Lumino
local moveCell = -1
local realReachableCells = fightSlave:getRealReachableCells()
for _, cell in ipairs(realReachableCells) do
if fightSlave:canCastSpellOnCellAfterMove(cell, 4204, enemyCell) == 0 then
if moveCell == -1 then
moveCell = cell
else
if fightAction:getDistance(cell, fightSlave:cellId()) < fightAction:getDistance(moveCell, fightSlave:cellId()) then
moveCell = cell
end
end
end
end
-- Vérifier et lancer
if moveCell ~= -1 then
-- Se déplacer
global:printSuccess("Je me déplace à la cellule "..moveCell.." pour lancer le sort !")
fightSlave:moveTowardCell(moveCell)
if fightSlave:cellId() ~= moveCell then
global:printError("Le déplacement a échoué !")
return false
end
-- Lancer
global:printSuccess("Je lance le sort !")
if fightSlave:castSpellOnCell(4204, enemyCell) then
return true
end
end
return false
end
Exemple du "Chaton" (Dofus Touch)
Ci-dessous l'exemple d'une IA qui :
Votre personnage principale va jouer avec l'IA intégrée dans l'interface d'AnkaBot.
Votre invocation "Chaton" va jouer le sort "Chatataque" le maximum de fois possible.
Tout est expliqué avec des commentaires.
function fightManagement()
-- Vérifier que c'est le tour de mon personnage principale.
if fightCharacter:isItMyTurn() then
-- Jouer le tour de mon personnage avec l'IA configurée dans l'interface
global:printMessage("C'est mon tour, je joue avec l'IA configurée dans l'interface !")
fightBasic:playTurn(1)
else
-- L'entité qui joue le tour
local slave = fightSlave:entity()
if slave == nil then
global:printSuccess("Une erreur est survenue, impossible de récupérer l'entité qui joue le tour !")
end
-- Tour de qui ?
global:printMessage("C'est le tour de "..fightSlave:name().." !")
-- Vérifier que c'est Chaton (45 = Chaton)
if slave.CreatureGenericId == 45 then
-- Lancer le maximum de fois possible le sort "Chatataque" (ID: 209) du Chaton
while spell_Chatataque() do end
-- On se rapproche de l'ennemi le plus proche
fightSlave:moveTowardCell(fightSlave:getNearestEnemy())
end
end
end
function spell_Chatataque()
-- Récupérer la cellule de l'ennemi le plus proche
local enemyCell = fightSlave:getNearestEnemy()
-- Chercher une cellule où on peut lancer le sort "Chatataque" (ID: 209) du Chaton
local moveCell = -1
local realReachableCells = fightSlave:getRealReachableCells()
for _, cell in ipairs(realReachableCells) do
if fightSlave:canCastSpellOnCellAfterMove(cell, 209, enemyCell) == 0 then
if moveCell == -1 then
moveCell = cell
else
if fightAction:getDistance(cell, fightSlave:cellId()) < fightAction:getDistance(moveCell, fightSlave:cellId()) then
moveCell = cell
end
end
end
end
-- Vérifier et lancer
if moveCell ~= -1 then
-- Se déplacer
global:printSuccess("Je me déplace à la cellule "..moveCell.." pour lancer le sort !")
fightSlave:moveTowardCell(moveCell)
if fightSlave:cellId() ~= moveCell then
global:printError("Le déplacement a échoué !")
return false
end
-- Lancer
global:printSuccess("Je lance le sort !")
if fightSlave:castSpellOnCell(209, enemyCell) then
return true
end
end
return false
end