Créatures contrôlables

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:

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 :

fightBasic

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

Dernière mise à jour