Aller au contenu

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.
  • 900002 et 900003 : 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.

➡️ Les règles du script Lua