De la récupération de MapID & CellID au pathfinding

A

Anonymous

Invité
#1
Bonsoir,
je ne me suis encore pas plongé dans la communauté, pour diverse raison, j'étais principalement absorber à lire le maximum de chose sur les bots dofus pour comprendre leurs fonctionnement, et leurs mécanique, réalisé un bot est plus pour moi un défis personnel qu'une réel utilité.

Et là une question me trotte dans la tête, et je n'arrive pas à y répondre :

Actuellement à ce que j'ai compris, les dev' savent gérer le pathfinding une fois la zone chargé, mais ils sont obligé de scripté des "trajets" à exécuter.
On sait aussi bouger d'une carte vers une autre facilement.

Mais que ce passe-t-il si l'on arrive dans une région et que l'on veut allé au nord alors que ce chemin est humainement impossible (block & eau & montagne, etc...) ?

J'ai compris que pour palier à ce problème on rentre des trajets pré fait dans le code.

Mais pourquoi ? Ne peut-on pas trouver un moyen de contourner l'obstacle par des maps secondaire? par exemple en passant deux fois a droite puis une fois en haut pour retourné a gauche?

Une autre petite question qui fait un peu plus je suis paummé :
Comment ont-ils réussis à obtenir cette carte : http://dofustools.everhate.com/index.php?page=carte est-elle telechargeable ou exploitable algorithmiquement pour résoudre les problèmes énoncé ci dessus ?
Si oui avez vous une idée?

Je maitrise bien tout ce qui est algorithme mais j'aime bien réfléchir au problème avant de coder...

Cordialement,
JohnRamus.
 
Inscrit
19 Juillet 2011
Messages
38
Reactions
0
#2
La carte je sais que avant on pouvais la trouver dans les dossiers sources de dofus divisé en 20 image si ne me trompe pas et il y a un tutoriel sur le forum qui explique comment faire pour afficher les 20 images et rajoute une grille et les positions mais je crois qu'il y avait un problème avec les possiton
 
A

Anonymous

Invité
#3
Finalement je me suis renseigné, et j'ai réfléchis avec les info piocher de part et d'autre du forum,
je me suis dit : je peux monter à l'aide d'un algorithme un graphe artificiel que je pourrais exploiter plus tard via mon programme.
Pour monter se graphe je dois ceci dit faire plusieurs étape :

- Obtenir la carte de Dofus 2.0 (existe en local)
- L'extraire (fichier .d2p)
- l'analysé
- La transformé en graphe exploitable

Je bloque à la séquence analysé. je l'ai extraite avec D2PTool.exe un utilitaire trouvé sur le net, mais je n'obtient que du .dlm
j'ai trouvé certain truc sur le forum :https://cadernis.fr/index.php?threads/[sourcesbinary]-d2p-reader-lecteur-de-maps-dofus-2.904/
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
Bonsoir,

pour ta premiere question ce qu'il faudrait faire c'est un pathfinding en en definissant chaque map comme x obstacle sauf que c'est assez embettant dans le cas ou cette map x est compris dans le chemin. Mais c'est tres simplement fesable. Des bots ont déja intégré ce genre de fonctionnalité.

Pour ta seconde question, ce tool a été crée par les devs d'ankama et les cartes se trouvent dans les sources du jeu.
C'est pas du tout compliqué à faire. Tu ajoutes une grilles, les positions et de quoi te déplacer dans la carte.
De plus c'est en as, tu peux recuperer le swf et le décompiler. Je l'avais fait pour le tool des personnages ;)
 
A

Anonymous

Invité
#5
Okey merci beaucoup de votre aide, j'ai trouver comment faire,
je dois donc décompiler les map, et les analysés.
Quels démarche suivre pour une fois décompiler lires les fichiers .dml que j'obtiens ?

Cordialement,
JohnRamus.
 

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#6
Regarde dans la section c# unknowhacker a poster un lecteur de maps fonctionelle (ou si non tu va directement voire dans les sources du jeux et tu refait le lecteur de maps mais bon) ,est enfaite la plus part des lecteur de map décompresse eux même les fichier dlm (du coup plus besoin de les decompresser au préalable avec dlmExtractor)
 
A

Anonymous

Invité
#7
Merci beaucoup, excuse moi de vous rederangez encore un peu :/
mais je suis un peu néophyte et je suis tombé sur le cul :

je ne vois pas comment utiliser le .dll ... (je demande le fouet s'il vous plait!)

peut-on me l'expliquer ^^'

Sur le coup j'ai l'impression d'être un gros noob...
mais je ne demande qu'a apprendre...

Cordialement,
JohnRamus.
 
A

Anonymous

Invité
#8
Ma question était vraiment débile, ça fonctionne désormais,

une petite question : je n'ai pas trouvé dans MAP.cs un moyen de récupéré la position X&Y d'une map, est-ce possible?

Edit : décidément je poste plus vite que je ne réfléchis... Trouvé!
 

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#9
C'est un calcule a partire de la mapId voici comment il font dans BIM

Code:
   public int X
        {
            get
            {
                m_x = (Id & 0x3FE00) >> 9; // 9 higher bits
                if ((m_x & 0x100) == 0x100) // 9th bit is the sign. 1 means it's minus
                {
                    m_x = -(X & 0xFF); // just take the 8 first bits and take the opposite number
                }
                return m_x.Value;
            }
        }

        public int Y
        {
            get
            {
                m_y = Id & 0x01FF; // 9 lower bits
                if ((m_y & 0x100) == 0x100) // 9th bit is the sign. 1 means it's minus
                {
                    m_y = -(X & 0xFF); // just take the 8 first bits and take the opposite number
                }
                return m_y.Value;
            }
        }
 
A

Anonymous

Invité
#10
Merci beaucoup j'ai enfin compris le fonctionnement, je m'amuse beaucoup à manipuler les maps et jouer avec les variables & fonction.

Une petite dernière question que je pose comme ça sans avoir encore tout fouiller sur la masse d'information qu'est ce forum et la puissance de la dll.

Peut-on savoir si, l'on peut changé de carte? Par exemple certaine carte on ne peut pas aller au nord car il y a un mur, peut-on savoir si justement il y a un mur dans une map qui nous empeche d'aller vers le nord? sans passer par l'analyse de tout les Cell Id pour check s'il y a un obstacle sur toute la partie supérieur ?
 

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#11
Alors oui il y a un moyent mais comme je suit par sur mon pc la je peut pas trop te dire , si je me trompe pas tu doit pouvoire trouver sa dans les d2p (donc dans la dll que tu utilise)
 
A

Anonymous

Invité
#12
Encore merci, je vais essayé de chercher, mais si tu trouves avant moi n'hésite pas :D
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#13
bonjours , d'apres mes souvenirs il y'a dans une map 4 (ou plus ?) variables (qui ne varient jamais) neighbourg , une pour chaque point cardinal et si je me souviens toujours bien quand on ne peut pas aller sur la map du dessus (par exemple) cette variable est vide donc en se deplaceant avec les neighbourgs on est toujours sur de pouvoir passer d'une map a l'autre (reste a trouver le meilleur chemin pour le faire)
 
A

Anonymous

Invité
#14
Merci beaucoup !

Pour trouver le bon chemin, si je dev' A* ça devrait le faire non ? En créant un graphe a partir des Cells non ?

Autre petite question : J'ai cru comprendre que le graphe a partir de cell de dofus n'est pas exactement comme un graphe, il est légèrement décalé, comment palier au problème ? est ce que je me trompe ?
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#15
Bonjour,

oui un A* suffira mais faudra que tu fasses des adaptations avec celui de dofus.
Un exemple parmi l'une des nombreuses modifications à faire.
Quand le pathfinding trouve plusieurs chemins avec le nombres de cellules identiques à parcourir, il fait un random pour savoir le quel prendre.
D'ou le fait que deux personnages partant du même endroit pour atteindre une même cellule ne parcourent pas forcément le même chemin.

Oui la grille de dofus c'est pas une grille composé de carré mais de losange d'ou de légers décalage.

Je te redirige vers ce mini tuto qui explique les différents calcul à faire pour obtenir le numéro de la cellule du haut/bas/gauche/droite/diagonales.
-deplacements-et-changements-de-map-d-en-socket.101/]viewtopic.php?f=27&t=168

Et enfin je te file le calcul des coordonnées en fonction de la cellid que j'avais fait ya longtemps en VB.

Code:
Private Function GetCoord(ByVal Cellid As UInteger)
            Dim X As Integer
            Dim Y As Integer

            Y = CInt(Math.Floor(Cellid / 14))
            If Y < 0 Then
                Y = 0
            End If
            If Y And 1 Then
                X = (Cellid - Y * 14) * 2 + 1
            Else
                X = (Cellid - Y * 14) * 2
            End If

            Return New Point(X, Y)
        End Function
 
A

Anonymous

Invité
#16
Merci infiniment, j'ai déjà implémenter A* dans plusieurs projet de jeu que j'avais dev',
je vais juste apporté ces quelques modification, je vous tiens au courant.

Merci beaucoup !
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#17
sur dofus c'est une grille mais isometrique , si on descend d'une case on ai pas vraiment en dessous mais décalé un peu sur la droite ou la gauche d'ou l'importance de savoir si on se trouve sur une ligne paire ou impaire
 
A

Anonymous

Invité
#18
Merci beaucoup, grace à vos conseils, c'est bon mon pathfinding marche je sais exactement si je peux traversé une carte ou non, maintenant une autre petite question, je voudrais approfondir l'interaction avec les PNJ.

Pour ce faire j'ai utilisé :
MyCell.NonWalkableDuringRP

Qui me renvoie un true quand la cellId est occupé par un PNJ, mais comment interagir avec lui, ou simplement connaitre la catégorie de ce pnj ? (vendeur, quete, etc...)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#19
Grace au 226 :) ta la liste des PNJ et grace au protocolId t'arrive a savoir si c'est un PNJ ou non.
Pour la catégorie c'est soit un enum, soit dans les D2O.
 
A

Anonymous

Invité
#20
Okey, j'ai presque finis ce que je voulais faire :D !
Merci encore, une dernière question (avant la prochaine :3), je n'ai pas trouvé de moyen de récupéré une MapId a partir de coordonnée,
Par exemple j'ai une mapId je sais récup, les coordonnées, mais pas l'inverse... je n'arrive pas à établir, la fonction qui permet de le faire à l'inverse...
Si jamais vous connaissait ?
 
Haut Bas