Aller au contenu

fight — Combat

API combat MoonBot Lua : lancer un sort, déplacement en combat, ciblage, IA de combat (72 fonctions).

87 fonctions dans ce namespace.

Index


Référence

fight.isInFight

fight.isInFight()

returns boolean

True si en combat.


fight.isMyTurn

fight.isMyTurn()

returns boolean

True si c'est notre tour.


fight.getTurnNumber

fight.getTurnNumber()

returns number

Numero du tour (1, 2, 3...).


fight.getCurrentFighterId

fight.getCurrentFighterId()

returns number

ID de l'entite dont c'est le tour.


fight.getTurnOrder

fight.getTurnOrder()

returns table of number

IDs des combattants dans l'ordre de jeu.


fight.myId

fight.myId()

returns number

ID de notre personnage en combat.


fight.myCell

fight.myCell()

returns number

Cellule de notre personnage (depuis les donnees fighter, plus precis).


fight.myAP

fight.myAP()

returns number

PA actuels.


fight.myMP

fight.myMP()

returns number

PM actuels.


fight.myHP

fight.myHP()

returns number, number

Retourne 2 valeurs : (pv_actuels, pv_max). Exemple : local hp, hpMax = fight.myHP()


fight.myLifePercent

fight.myLifePercent()

returns number

Pourcentage de PV (0-100).


fight.myRange

fight.myRange()

returns number

Portee du personnage.


fight.myLevel

fight.myLevel()

returns number

Niveau du personnage.


fight.myBreed

fight.myBreed()

returns number

Classe (1=Feca, 2=Osa, 3=Enu, 4=Sram, 5=Xelor, 6=Eca, 7=Eni, 8=Iop, 9=Cra, 10=Sadi, 11=Sacri, 12=Panda).


fight.myTeamId

fight.myTeamId()

returns number

Equipe (0 ou 1).


fight.getEnemies

fight.getEnemies()

returns table of fighter

Ennemis vivants. Chaque fighter : {id, cellId, hp, hpMax, hpPercent, ap, mp, isEnemy, alive, name, teamId, level, summonerId, isSummon, invisible, templateId, distance, resistances}.


fight.getAllies

fight.getAllies()

returns table of fighter

Allies vivants (y compris nous).


fight.getAllFighters

fight.getAllFighters()

returns table of fighter

Tous les combattants (vivants et morts).


fight.getResistances

fight.getResistances(fighterId: number)

returns table | nil

Pourcentages de resistance actuels : {neutral, earth, fire, water, air}. Egalement disponibles dans fighter.resistances et via fightAction.getResistances(id). Base recue dans les paquets GM et bonus/malus elementaires actifs (GA/GIE 210 a 219), avec expiration et desenvoûtement. Les valeurs negatives et superieures a 100 sont conservees. Retourne nil si le combattant ou sa base de resistances est inconnu (paquet court/incomplet) ; nil ne signifie pas 0 %. Relire apres une action : les tables sont des instantanes.


Exemple — résistances des monstres

-- Dans fightManagement(), avant vos actions de combat.
for _, monstre in ipairs(fight.getEnemies()) do
    local r = fight.getResistances(monstre.id)
    if r then
        global.printMessage(string.format(
            "%s : neutre %d%%, terre %d%%, feu %d%%, eau %d%%, air %d%%",
            monstre.name, r.neutral, r.earth, r.fire, r.water, r.air))
    else
        global.printMessage(monstre.name .. " : résistances inconnues")
    end
end

Affiche les cinq pourcentages de chaque ennemi vivant. monstre.resistances donne le meme instantane ; refaire fight.getResistances(monstre.id) apres une action pour actualiser les valeurs. nil = inconnu ; une valeur negative est une faiblesse. API ajoutee dans les sources, disponible apres mise a jour du moteur.


fight.getFighter

fight.getFighter(id: number)

returns fighter | nil

Combattant par ID.


fight.getFighterOnCell

fight.getFighterOnCell(cellId: number)

returns fighter | nil

Combattant vivant sur une cellule.


fight.getNearestEnemy

fight.getNearestEnemy()

returns fighter | nil

Ennemi vivant le plus proche en cases.


fight.getWeakestEnemy

fight.getWeakestEnemy()

returns fighter | nil

Ennemi vivant avec le moins de PV.


Entites — aliases historiques

fight.getAllEntities() / getEntityOnCell(cellId) / getEntityById(id)

returns table / fighter | nil

Aliases historiques de getAllFighters, getFighterOnCell et getFighter.


fight.enemyCount

fight.enemyCount()

returns number

Nombre d'ennemis vivants.


fight.allyCount

fight.allyCount()

returns number

Nombre d'allies vivants (y compris nous).


Filtrer les invocations

for _, e in ipairs(fight.getAllFighters()) do
  if e.isSummon and e.summonerId == fight.myId() then
    -- c'est notre invoc
  end
end

isSummon=true si invocation, summonerId=ID de l'invocateur. Permet de distinguer les invocations de chaque joueur/monstre.


Invisibilite

fighter.invisible

returns boolean

true si l'entite est invisible. Les entites invisibles ne bloquent pas la ligne de vue.


Limitations protocole

-- Limitations Dofus Retro 1.29

Les paquets GM etendus transmettent les resistances ; les paquets courts peuvent les omettre. Utiliser fight.getResistances(id) et verifier nil. Les caracteristiques elementaires completes des monstres ne sont pas disponibles. Les etats annonces par GA;950 sont suivis pour la validation des sorts ; le serveur reste autoritaire sur leur lancement.


fight.castSpell

fight.castSpell(spellId: number, cellId: number)

returns boolean

Lance un sort sur une cellule.


fight.lastCastCritFailed

fight.lastCastCritFailed()

returns boolean

true si le dernier sort lance s'est solde par un echec critique (GA;302). Remis a zero au debut de chaque cast. Permet de distinguer un echec critique d'un refus serveur quand castSpell retourne false.


fight.move

fight.move(cellId: number)

returns boolean

Deplacement en combat vers une cellule.


fight.moveTo / moveTowardCell

fight.moveTo(cellId) / fight.moveTowardCell(cellId)

returns boolean

Aliases de deplacement en combat vers la cellule cible.


fight.passTurn

fight.passTurn()

returns boolean

Passe le tour.


fight.ready

fight.ready()

returns boolean

Signal pret (phase de placement).


fight.abandon

fight.abandon()

returns boolean

Abandonne le combat. Le personnage quitte immediatement.


fight.blockSpectators

fight.blockSpectators(blocked: boolean = true)

returns boolean

Bloque (true) ou autorise (false) le mode spectateur pour CE combat — paquet fS. Surcharge la case 'Supprimer le mode spectateur' de l'onglet Combat jusqu'a la fin du combat. Les paquets fS/fN bruts via bot:sendPacket sont refuses : ce sont des toggles a etat, le moteur suit leur etat via Im039/Im040 et corrige tout ecart, un envoi brut le desynchroniserait.


fight.lockFight

fight.lockFight(locked: boolean = true)

returns boolean

Verrouille (true) ou rouvre (false) le combat aux nouveaux arrivants pour CE combat — paquet fN. Surcharge la case 'Verrouiller le combat'. En groupe configure, le verrou n'est reellement envoye qu'au moment ou le chef passe pret, une fois toutes les mules entrees (elles rejoignent via GA903).


fight.groupOnly

fight.groupOnly(enabled: boolean = true)

returns boolean

Reserve l'entree au groupe DOFUS pour CE combat. Utiliser pendant le placement, depuis le lanceur du combat, qui peut differer du chef du groupe DOFUS. Si un groupe MoonBot est configure, seul son chef peut faire cette demande. Aucun groupe MoonBot n'est necessaire. true active la restriction puis leve automatiquement la fermeture totale une fois la restriction confirmee ; inutile d'appeler fight.lockFight(false). false retire la restriction sans retablir le verrou total. Les appels repetes avec la meme valeur ne basculent pas l'option. Retourne true a la mise en file, false si l'action est indisponible ; le moteur suit les confirmations serveur. Accepte aussi fight:groupOnly(enabled).


Exemple — combat reserve au groupe DOFUS

function prefightManagement()
  assert(fight.groupOnly(true), "Restriction de groupe indisponible")
end

Selectionner la tactique Script et constituer le groupe DOFUS avant le combat. Le personnage qui pilote les options execute ce callback pendant le placement. Ce seul appel gere la restriction et l'ouverture aux membres du groupe pour le combat courant. Guide : docs/combat-groupe.md.


fight.placeOnCell

fight.placeOnCell(cellId: number)

returns boolean

Se placer sur une cellule pendant la phase de placement (envoie Gp).


fightAction:chooseCell

fightAction:chooseCell(cellId: number)

returns boolean

Equivalent de fight.placeOnCell. Se placer sur une cellule pendant la phase de placement.


fightAction:exchangePlace

fightAction:exchangePlace(fighterId: number)

returns boolean

Phase de placement : echange ta cellule avec celle de l'allie cible (envoie fE). Utile quand une mule est deja sur la cellule que tu veux : tu echanges, et elle se retrouve sur ton ancienne cellule. Le serveur repond avec deux GIC qui mettent a jour les positions automatiquement.


fight.getPlacementCells

fight.getPlacementCells()

returns table of number

Cellules de placement de notre equipe (TOUTES les cellules de spawn, y compris les occupees).


fight.getEnemyPlacementCells

fight.getEnemyPlacementCells()

returns table of number

Cellules de placement ennemies.


fight.getSpells

fight.getSpells()

returns table of spell

Tous nos sorts. Chaque spell : {id, name, level, position, cdRemaining, castsThisTurn, apCost, minRange, maxRange, needLos, needLine, freeCell, rangeBoostable, maxPerTurn, maxPerTarget, cooldown, isSummon, zoneType ('P'=point, 'X'=croix, 'C'=cercle, 'L'=ligne, 'D'=anneau), zoneSize}.


fight.getSpell

fight.getSpell(spellId: number)

returns spell | nil

Donnees d'un sort.


fight.spellCooldown

fight.spellCooldown(spellId: number)

returns number

Tours de recharge restants (0 = pret).


fight.canCastSpell

fight.canCastSpell(spellId: number)

returns boolean, string

Retourne (true, "ok") ou (false, raison). Raisons : "spell_not_found", "no_spell_data", "not_enough_ap", "cooldown", "max_per_turn", "summon_limit".


fight.canCastSpellOnCell

fight.canCastSpellOnCell(spellId: number, cellId: number)

returns string

Retourne "ok" ou la raison du refus : "not_enough_ap", "cooldown_N", "max_per_turn", "max_per_target", "too_close", "out_of_range", "not_in_line", "no_los", "cell_occupied", "summon_limit".


fight.getTargetableCells

fight.getTargetableCells(spellId: number)

returns table of number

Toutes les cellules ciblables par ce sort actuellement.


fight.getSpellZoneCells

fight.getSpellZoneCells(spellId: number, targetCell: number)

returns table of number

Cellules dans la zone d'effet du sort.


fight.getEnemiesInZone

fight.getEnemiesInZone(spellId: number, targetCell: number)

returns table of fighter

Ennemis touches par la zone d'effet.


fight.getBestZoneTarget

fight.getBestZoneTarget(spellId: number)

returns number, number

Retourne (cellId, count) : cellule optimale pour toucher le plus d'ennemis. nil si aucun ennemi.


fight.cellDistance

fight.cellDistance(cellA: number, cellB: number)

returns number

Distance Manhattan isometrique entre deux cellules.


fight.distanceTo

fight.distanceTo(cellId: number)

returns number

Distance depuis notre cellule.


fight.getReachableCells

fight.getReachableCells()

returns table of number

Cellules accessibles avec nos PM (BFS).


fight.getPath

fight.getPath(fromCell: number, toCell: number)

returns table of number

Chemin A* entre deux cellules. Table vide si aucun chemin.


fight.pathLength

fight.pathLength(fromCell: number, toCell: number)

returns number

Nombre de cases du chemin (0 = inaccessible).


fight.isLineOfSight

fight.isLineOfSight(fromCell: number, toCell: number)

returns boolean

True si vue degagee (pas de combattant bloquant).


fight.adjacentCells

fight.adjacentCells(cellId: number)

returns table of number

4 cellules voisines.


fight.isCellWalkable

fight.isCellWalkable(cellId: number)

returns boolean

True si la cellule est marchable.


fight.isCellFree

fight.isCellFree(cellId: number)

returns boolean

True si marchable ET aucune entite vivante dessus.


Distances — aliases historiques

fight.distanceBetween(cellA, cellB) / fightBasic:getDistance(cellA, cellB)

returns number

Aliases de cellDistance. setFightSpeed(speed) est conserve comme stub sans effet.


fight.getSummons

fight.getSummons()

returns table of fighter

Nos invocations vivantes (allies avec ID negatif).


fight.hasSummons

fight.hasSummons()

returns boolean

True si on a des invocations en vie.


fight.getSummonById

fight.getSummonById(id: number)

returns fighter | nil

Invocation par ID.


fight.summon

fight.summon(spellId: number, cellId: number)

returns boolean

Lance un sort d'invocation sur une cellule.


fight.summonCount

fight.summonCount()

returns number

Nombre d'invocations actuelles.


fight.summonMax

fight.summonMax()

returns number

Nombre max d'invocations.


Combattants esclaves

fight.getSlaves() / hasSlaves() / getSlaveById(id) / invokeSlave(spellId, cellId)

returns table / boolean / fighter | nil / boolean

Lecture des combattants esclaves et lancement d'une invocation. moveSlaveToCell, slavePassTurn et slaveCastSpell retournent false car les invocations Retro sont controlees par l'IA.


Bonus et effets actifs

fight.myRangeBonus() / myDamageBonus() / myDamagePct() / myDamageReduction() / myCritBonus() / myCritFailureBonus() / myActiveEffects() / activeEffectsOn(fighterId)

returns number / table

Bonus de combat courants et effets actifs connus : {effectId, casterId, value, remainingTurns}.


Getters historiques du joueur

fight.getAP() / getMP() / getCellId() / getLifePoints() / getMaxLifePoints() / getLifePointsP() / getRange() / getBreed() / getTeamId()

returns number

Aliases historiques des getters fight.my* correspondants.


fight.hasChallenges

fight.hasChallenges()

returns boolean

True si des defis sont actifs.


fight.getChallengeIds

fight.getChallengeIds()

returns table of number

IDs des defis actifs.


fight.getChallengeCount

fight.getChallengeCount()

returns number

Nombre de defis.


fight.isChallengeActive

fight.isChallengeActive(id: number)

returns boolean

True si le defi est actif.


fight.challengeName

fight.challengeName(id: number)

returns string

Nom du defi.


fight.getActiveChallenges

fight.getActiveChallenges()

returns table of {id, name, active}

Tous les defis avec nom et statut.


fight.addSpell

fight.addSpell(spellId: number)

Ajoute un sort a la liste auto-play.


fight.clearSpells

fight.clearSpells()

Vide la liste auto-play.


fight.playTurn

fight.playTurn()

Lance tous les sorts de la liste sur l'ennemi le plus proche puis passe le tour.


fight.waitForTurn

fight.waitForTurn(timeoutMs?: number)

blocking · returns boolean

Bloque jusqu'a ce que ce soit notre tour. False si timeout ou fin de combat. Defaut 60s.


fight.waitForFightEnd

fight.waitForFightEnd(timeoutMs?: number)

blocking · returns boolean

Bloque jusqu'a la fin du combat. Retourne true si victoire. Defaut 5min.


fight.delay

fight.delay(ms: number)

blocking

Pause de ms millisecondes.


fight.log

fight.log(msg: string)

Log un message pendant le combat.