Préparer un déplacement et un tir en Lua
Ces fonctions nécessitent une version de Jitsuri intégrant la recherche tactique avancée. Utilisez-les dans onTurn, avec le moteur de combat Lua. En équipe, elles concernent le personnage dont le tour est exécuté.
La liste de toutes les méthodes, le cycle des callbacks et les plans d'attaque natifs se trouvent dans IA de combat avancée.
getTacticalCells autorise le recul ainsi qu'une approche contrôlée vers une position de tir. L'approche doit conserver, sur tout le chemin, une distance au moins égale au minimum entre la distance initiale et 6 cases, sans entrer dans une nouvelle zone de tacle. Les contrôles de repli et de pertes supplémentaires au tacle restent conservés. C'est une recherche prudente, pas une liste exhaustive de tous les déplacements que le serveur pourrait autoriser. Cette API ne limite pas automatiquement les déplacements selon les challenges.
Les entités de fightAction:getAllEntities() exposent ActionPoints et MovementPoints, ou nil si les caractéristiques ne sont pas connues. Le contrôle canCastSpellOnCell et l'envoi avancé vérifient les PA disponibles en plus des restrictions de lancer.
Exemple générique
Challenges et déplacement d'un pas
Ces fonctions concernent le personnage dont le tour Lua est exécuté, y compris lorsqu'un seul trajet pilote une équipe. Le suivi est remis à zéro au changement de combat. Elles ne sélectionnent pas de challenge et n'imposent aucune stratégie automatiquement.
Pour une règle limitant le déplacement, le script doit compter ses actions par personnage et par tour, contrôler tous ses chemins de déplacement et éviter de renvoyer une demande après une confirmation incertaine. Déplacer un pas avant une attaque potentiellement finale évite de terminer volontairement le combat avant d'avoir effectué ce déplacement. Les pertes au tacle, les effets différés et les actions des autres combattants nécessitent également une stratégie adaptée.
Abri et fuite au tacle
Une ligne de vue bloquée depuis la position actuelle d'un ennemi ne garantit pas qu'il ne puisse pas la rouvrir en se déplaçant. Ces fonctions ne prédisent ni ses sorts ni ses déplacements.
Après une arrivée partielle, une perte inattendue de PA ou une confirmation incertaine, ne relancez pas aveuglément une fuite. Conservez un verrou pour le tour et réévaluez les sorts disponibles depuis la position réellement observée. Une fuite au contact peut déjà avoir consommé des PA/PM même si la destination n'a pas été atteinte.
Exemple de recherche
Les identifiants ci-dessous sont fictifs et doivent être remplacés par ceux de votre stratégie.
local SORT = 123456 -- fictif
local cible = 250 -- exemple seulement : lire la position réelle de la cible
local cout = fightAction:getSpellApCost(SORT)
if cout > 0 then
for _, position in ipairs(fightAction:getTacticalCells(cout, 1)) do
if fightAction:canCastSpellOnCell(position, SORT, cible) == 0 then
local zone = fightAction:getSpellZoneFromCell(SORT, position, cible)
-- Comparer les positions et les zones ; vérifier les alliés.
-- Ce calcul seul ne déplace pas et ne lance pas le sort.
end
end
end
Après chaque déplacement ou sort, relisez les positions, les états et les PA/PM. Revalidez le prochain lancer depuis la position réellement atteinte. Une simulation de poussée ne garantit ni le déplacement du monstre ni les dégâts : collisions, immunités, morts et événements serveur peuvent changer le résultat.
La simulation remplace seulement l'occupation géométrique : elle ne simule pas les états, les dégâts ni l'historique futur des lancers par cible. Gardez des limites de calcul et revalidez toujours sur l'état réel avant d'agir.