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¶
fight.isInFightfight.isMyTurnfight.getTurnNumberfight.getCurrentFighterIdfight.getTurnOrderfight.myIdfight.myCellfight.myAPfight.myMPfight.myHPfight.myLifePercentfight.myRangefight.myLevelfight.myBreedfight.myTeamIdfight.getEnemiesfight.getAlliesfight.getAllFightersfight.getResistancesExemple — résistances des monstresfight.getFighterfight.getFighterOnCellfight.getNearestEnemyfight.getWeakestEnemyEntites — aliases historiquesfight.enemyCountfight.allyCountFiltrer les invocationsInvisibiliteLimitations protocolefight.castSpellfight.lastCastCritFailedfight.movefight.moveTo / moveTowardCellfight.passTurnfight.readyfight.abandonfight.blockSpectatorsfight.lockFightfight.groupOnlyExemple — combat reserve au groupe DOFUSfight.placeOnCellfightAction:chooseCellfightAction:exchangePlacefight.getPlacementCellsfight.getEnemyPlacementCellsfight.getSpellsfight.getSpellfight.spellCooldownfight.canCastSpellfight.canCastSpellOnCellfight.getTargetableCellsfight.getSpellZoneCellsfight.getEnemiesInZonefight.getBestZoneTargetfight.cellDistancefight.distanceTofight.getReachableCellsfight.getPathfight.pathLengthfight.isLineOfSightfight.adjacentCellsfight.isCellWalkablefight.isCellFreeDistances — aliases historiquesfight.getSummonsfight.hasSummonsfight.getSummonByIdfight.summonfight.summonCountfight.summonMaxCombattants esclavesBonus et effets actifsGetters historiques du joueurfight.hasChallengesfight.getChallengeIdsfight.getChallengeCountfight.isChallengeActivefight.challengeNamefight.getActiveChallengesfight.addSpellfight.clearSpellsfight.playTurnfight.waitForTurnfight.waitForFightEndfight.delayfight.log
Référence¶
fight.isInFight¶
returns boolean
True si en combat.
fight.isMyTurn¶
returns boolean
True si c'est notre tour.
fight.getTurnNumber¶
returns number
Numero du tour (1, 2, 3...).
fight.getCurrentFighterId¶
returns number
ID de l'entite dont c'est le tour.
fight.getTurnOrder¶
returns table of number
IDs des combattants dans l'ordre de jeu.
fight.myId¶
returns number
ID de notre personnage en combat.
fight.myCell¶
returns number
Cellule de notre personnage (depuis les donnees fighter, plus precis).
fight.myAP¶
returns number
PA actuels.
fight.myMP¶
returns number
PM actuels.
fight.myHP¶
returns number, number
Retourne 2 valeurs : (pv_actuels, pv_max). Exemple : local hp, hpMax = fight.myHP()
fight.myLifePercent¶
returns number
Pourcentage de PV (0-100).
fight.myRange¶
returns number
Portee du personnage.
fight.myLevel¶
returns number
Niveau du personnage.
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¶
returns number
Equipe (0 ou 1).
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¶
returns table of fighter
Allies vivants (y compris nous).
fight.getAllFighters¶
returns table of fighter
Tous les combattants (vivants et morts).
fight.getResistances¶
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¶
returns fighter | nil
Combattant par ID.
fight.getFighterOnCell¶
returns fighter | nil
Combattant vivant sur une cellule.
fight.getNearestEnemy¶
returns fighter | nil
Ennemi vivant le plus proche en cases.
fight.getWeakestEnemy¶
returns fighter | nil
Ennemi vivant avec le moins de PV.
Entites — aliases historiques¶
returns table / fighter | nil
Aliases historiques de getAllFighters, getFighterOnCell et getFighter.
fight.enemyCount¶
returns number
Nombre d'ennemis vivants.
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¶
returns boolean
true si l'entite est invisible. Les entites invisibles ne bloquent pas la ligne de vue.
Limitations protocole¶
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¶
returns boolean
Lance un sort sur une cellule.
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¶
returns boolean
Deplacement en combat vers une cellule.
fight.moveTo / moveTowardCell¶
returns boolean
Aliases de deplacement en combat vers la cellule cible.
fight.passTurn¶
returns boolean
Passe le tour.
fight.ready¶
returns boolean
Signal pret (phase de placement).
fight.abandon¶
returns boolean
Abandonne le combat. Le personnage quitte immediatement.
fight.blockSpectators¶
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¶
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¶
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¶
returns boolean
Se placer sur une cellule pendant la phase de placement (envoie Gp
fightAction:chooseCell¶
returns boolean
Equivalent de fight.placeOnCell. Se placer sur une cellule pendant la phase de placement.
fightAction:exchangePlace¶
returns boolean
Phase de placement : echange ta cellule avec celle de l'allie cible (envoie fE
fight.getPlacementCells¶
returns table of number
Cellules de placement de notre equipe (TOUTES les cellules de spawn, y compris les occupees).
fight.getEnemyPlacementCells¶
returns table of number
Cellules de placement ennemies.
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¶
returns spell | nil
Donnees d'un sort.
fight.spellCooldown¶
returns number
Tours de recharge restants (0 = pret).
fight.canCastSpell¶
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¶
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¶
returns table of number
Toutes les cellules ciblables par ce sort actuellement.
fight.getSpellZoneCells¶
returns table of number
Cellules dans la zone d'effet du sort.
fight.getEnemiesInZone¶
returns table of fighter
Ennemis touches par la zone d'effet.
fight.getBestZoneTarget¶
returns number, number
Retourne (cellId, count) : cellule optimale pour toucher le plus d'ennemis. nil si aucun ennemi.
fight.cellDistance¶
returns number
Distance Manhattan isometrique entre deux cellules.
fight.distanceTo¶
returns number
Distance depuis notre cellule.
fight.getReachableCells¶
returns table of number
Cellules accessibles avec nos PM (BFS).
fight.getPath¶
returns table of number
Chemin A* entre deux cellules. Table vide si aucun chemin.
fight.pathLength¶
returns number
Nombre de cases du chemin (0 = inaccessible).
fight.isLineOfSight¶
returns boolean
True si vue degagee (pas de combattant bloquant).
fight.adjacentCells¶
returns table of number
4 cellules voisines.
fight.isCellWalkable¶
returns boolean
True si la cellule est marchable.
fight.isCellFree¶
returns boolean
True si marchable ET aucune entite vivante dessus.
Distances — aliases historiques¶
returns number
Aliases de cellDistance. setFightSpeed(speed) est conserve comme stub sans effet.
fight.getSummons¶
returns table of fighter
Nos invocations vivantes (allies avec ID negatif).
fight.hasSummons¶
returns boolean
True si on a des invocations en vie.
fight.getSummonById¶
returns fighter | nil
Invocation par ID.
fight.summon¶
returns boolean
Lance un sort d'invocation sur une cellule.
fight.summonCount¶
returns number
Nombre d'invocations actuelles.
fight.summonMax¶
returns number
Nombre max d'invocations.
Combattants esclaves¶
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¶
returns boolean
True si des defis sont actifs.
fight.getChallengeIds¶
returns table of number
IDs des defis actifs.
fight.getChallengeCount¶
returns number
Nombre de defis.
fight.isChallengeActive¶
returns boolean
True si le defi est actif.
fight.challengeName¶
returns string
Nom du defi.
fight.getActiveChallenges¶
returns table of {id, name, active}
Tous les defis avec nom et statut.
fight.addSpell¶
Ajoute un sort a la liste auto-play.
fight.clearSpells¶
Vide la liste auto-play.
fight.playTurn¶
Lance tous les sorts de la liste sur l'ennemi le plus proche puis passe le tour.
fight.waitForTurn¶
blocking · returns boolean
Bloque jusqu'a ce que ce soit notre tour. False si timeout ou fin de combat. Defaut 60s.
fight.waitForFightEnd¶
blocking · returns boolean
Bloque jusqu'a la fin du combat. Retourne true si victoire. Defaut 5min.
fight.delay¶
blocking
Pause de ms millisecondes.
fight.log¶
Log un message pendant le combat.