Exemples avancés¶
Voici trois fichiers complets pour ajouter des captures, une banque ou un donjon. Choisis un exemple, puis adapte ses cartes, sorties, objets et dialogues à ton parcours. Ne colle pas les trois fichiers à la suite : garde un seul bloc route et une seule définition de chaque fonction.
Capturer des monstres¶
Cet exemple attaque des groupes de trois monstres maximum et capture ceux qui contiennent au moins deux Abraknydes (numéro 47). Active la capture dans la fiche du personnage et prévois des pierres d'âme vides adaptées.
route = {
followLeader = true,
lostMember = "wait",
}
function shouldEngage(monstres)
return monstres:size() <= 3
end
function shouldCapture(monstres)
return monstres:count(47) >= 2
end
function move()
if map:currentMapId() == "6733" then return "done" end
return {
{ map = "4604", fight = true, changeMap = "top" },
{ map = "4605", fight = true, changeMap = "right" },
}
end
true demande une capture avec une pierre vide disponible. Pour choisir une pierre précise, renvoie son numéro ; pour plusieurs choix, une liste comme { 9686, 7007 }. La première disponible est utilisée.
Sans pierre adaptée, le bot combat sans capturer et le signale. Il prépare la pierre avant « Prêt » et lance le sort quand il reste un seul monstre. Après le combat, il ne remet pas automatiquement ton arme : character:equipWeapon(numero) peut la remettre dans onFightEnd.
Déposer et reprendre des potions¶
Ici, le personnage combat sur une seule carte et part à Bonta quand ses pods atteignent le seuil du panel. Il dépose les équipements et ressources, complète son stock à 10 potions de rappel, puis revient.
Remplace 900010 par la carte d'arrivée de ton rappel, où tu veux combattre. Le personnage doit commencer sur cette carte. Prévois des potions de Bonta et de rappel, ainsi que le stock de rappel en banque. Les cartes et cases de Bonta ci-dessous sont à vérifier pour ton parcours.
CARTE_FARM = "900010" -- À remplacer par la carte de ton rappel.
route = {
followLeader = true,
lostMember = "wait",
}
function shouldEngage(monstres)
return monstres:size() <= 3
end
function move()
return { { map = CARTE_FARM, fight = true } }
end
function prendreZaapi()
return map:useZaapi(239, "Divers", "Banque")
end
function deposer()
if not map:openBank(154) then return false end
if not inventory:putAllInBank(1) then return false end
if not inventory:putAllInBank(3) then return false end
inventory:takeFromBank(548, 2, { toHave = 10 })
if inventory:count(548) < 10 then return false end
if not global:useRecallPotion() then return false end
return "done"
end
ETAPES_BANQUE = {
{ map = "6159", custom = prendreZaapi },
{ map = "4308", changeMap = "363" },
{ map = "10215", custom = deposer },
}
function bank()
local carte = map:currentMapId()
for _, etape in ipairs(ETAPES_BANQUE) do
if etape.map == carte then return ETAPES_BANQUE end
end
if not global:useBontaPotion() then return false end
if not control:waitMapId("6159", 5000) then return false end
return ETAPES_BANQUE
end
L'onglet 1 contient les équipements, 2 les consommables, 3 les ressources et 4 les pierres d'âme. Le numéro 548 désigne la potion de rappel. { toHave = 10 } complète le sac : avec quatre potions, le bot en retire six. Le script vérifie le stock final avant de repartir.
return "done" termine la banque ; return false l'abandonne et met le bot en pause. Pour demander la banque avant le seuil de pods, utilise global:requestBank("raison") dans une fonction du trajet. Prévois toi-même les retraits nécessaires : la banque par défaut dépose, sans réapprovisionner ton script.
Entrer dans un donjon avec le groupe¶
Cet exemple montre une entrée par PNJ, deux salles de combat et une sortie où le bot s'arrête. Les quatre numéros de carte, la case du PNJ et la réponse sont fictifs : remplace-les par ceux de ton donjon. Chaque personnage doit avoir sa clé.
L'exemple convient à un dialogue où une seule réponse fait entrer dans la première salle. Si ton PNJ pose plusieurs questions, complète parlerAuGardien() avec les réponses nécessaires.
route = {
followLeader = true,
lostMember = "wait",
dungeon = { "900002", "900003" },
}
function parlerAuGardien()
local carte = map:currentMapId()
if carte == "900002" then return true end -- Déjà entré.
if carte ~= "900001" then return false end
if not npc:talk(123) then return false end -- Case du gardien.
if not npc:answer(456) then return false end -- Réponse pour entrer.
return control:waitMapId("900002", 5000)
end
function entrerDonjon()
return global:runGroupFn("parlerAuGardien")
end
function move()
if map:currentMapId() == "900004" then return "done" end
return {
{ map = "900001", custom = entrerDonjon },
{ map = "900002", fight = true },
{ map = "900003", fight = true },
}
end
900001: entrée devant le gardien.900002et900003: salles de combat ; le jeu passe à la suivante après la victoire.900004: carte de sortie où le trajet termine.
global:runGroupFn fait jouer la fonction à chaque membre dans sa fenêtre. Chacun vérifie d'abord s'il est déjà entré, pour éviter de recommencer le dialogue.
Déclare toutes les salles intérieures dans route.dungeon. Le bot n'y déclenche ni banque ni potion de rappel. Si ton donjon a une porte, un PNJ ou une autre action pour sortir d'une salle, ajoute-la au trajet.
Pour aller plus loin¶
Le catalogue Doc API Lua fournit un exemple et le résultat de chaque fonction. Tu peux notamment utiliser phenix() pour prévoir la résurrection, onLevelUp() pour équiper tes personnages et onLost() pour les ramener sur le trajet.
Les rôles se choisissent dans Combat → Ajustements → Rôles dans le trajet. character:hasRole("nom") permet de réserver une action aux personnages qui portent ce rôle. Le rôle invocateur, utilisé en arène, doit être porté par le meneur.