[TUTORIEL] Trouver la meilleure cellule pour attaquer

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Dampen_59

Membre
Feb 3, 2019
22
37
84
Discord
Dampen59 #4187
Bonjour la communauté :bravo:

Je reviens aujourd'hui pour vous mettre à disposition une fonction assez avancée.
Celle-ci permet de vous retourner l'identifiant de cellule à partir de laquelle un sort de zone touchera le plus de monstres. (Exemple : Flèche Explosive)

Attention : la fonction FindBestCircleSpellZone fonctionne uniquement avec les sorts disposant d'une zone d'effet de type "cercle". Néanmoins, les sorts "croix" d'une case comme la zone d'effet du sort Tumulte (Iop) fonctionnent avec cette fonction.



Cette fonction a été crée et testée par mes soins d'une part :
- Avec des données de test
- et de l'autre, directement en jeu

Le code n'est pas commenté mais j'ai au moins eu le courage de créer un entête de fonction.



Code:
-- @author: Dampen59
-- @name  : FindBestCircleSpellZone
-- @params: - prmRadius (The spell effect radius, example : Fleche explosive is radius 3)
-- @return: The best CellID to attack, containing the most mobs in the spell area
--          -1 in case of wrong or missing prmRadius
function FindBestCircleSpellZone(prmRadius)

    if (prmRadius == nil or prmRadius < 1) then
        return -1
    end

    local bestCellId = 0
    local numberOfMobsInZone = 0
    local numberOfMobsInZoneTemp = 0

    local entitiesList = fight:getAllEntities()
    local entitiesCount = fight:getEntitiesCount()

    local cellIdAroundCellTable = {}
    local cellIdAroundCellTableIndex = 1

    local cellIdsToCheckTable = {}
    local cellIdsToCheckTableIndex = 1


    for i = 0, entitiesCount - 1 do
        if (entitiesList[i].Team ~= 0) then
            cellIdsToCheckTable[cellIdsToCheckTableIndex] = entitiesList[i].CellId
            cellIdsToCheckTableIndex = cellIdsToCheckTableIndex + 1
        end
    end

    for j,cell in ipairs(cellIdsToCheckTable) do

        numberOfMobsInZoneTemp = 0

        local r = prmRadius

        for x = -r, r do
            for y = -r, r do
                if math.abs(x) + math.abs(y) <= r then
                    local new_cell = cell + 29 * math.floor(x / 2) - 27 * math.floor(y / 2) + (x + y) % 2 * (math.floor(cell / 14) % 2 + 14 * (x % 2 - y % 2)) + x * (x + y + 1) % 2
                    cellIdAroundCellTable[cellIdAroundCellTableIndex] = new_cell
                    cellIdAroundCellTableIndex = cellIdAroundCellTableIndex + 1
                end
            end
        end

        for k = 0, entitiesCount - 1 do
            for j,v in ipairs(cellIdAroundCellTable) do
                if (entitiesList[k].CellId == v and entitiesList[k].Team ~= 0) then
                    numberOfMobsInZoneTemp = numberOfMobsInZoneTemp + 1
                end
            end
        end

        if (numberOfMobsInZoneTemp > numberOfMobsInZone) then
            numberOfMobsInZone = numberOfMobsInZoneTemp
            bestCellId = cell
        end

    end

    return bestCellId

end

Et surtout, happy botting !

Si vous avez des questions ou des remarques, comme d'habitude, n'hésitez pas à apposer une réponse sur ce sujet.​
 
Last edited:
  • Like
Reactions: Shoto_Todoroki, Lucide, izumisan and 1 other person

isoso

Membre
Mar 5, 2019
9
0
61
31
Salut Dampen, j'ai une petite question.
je joue actuellement le nouvel osa et j'aimerais savoir si c'est possible de gerer les invocs (vu quelles sont controlables maintenant) et si oui, est ce difficile et avec quelle fonction ? merci
 

mamynova

Membre
Jul 4, 2019
30
3
39
35
Salut Dampen, une petite question avant de le tester en jeu, mais est ce que ta formule prend en compte notre perso ?
Par exemple si l'IA a le choix entre :
- toucher 2 mobs
- toucher 3 mobs MAIS se toucher avec la zone d'effet de la fleche explosive
Laquelle des deux solutions il va préférer ?
Merci d'avance pour ta réponse !