Bonjour la commu,
Étant en ce moment entrain de coder mon propre émulateur Dofus 2.X, je me disais pourquoi pas partager avec vous un peu mon parcours sur le projet !
Je vais donc commencer cette série par vous parler des choses pour moi essentiels à connaitre ou à savoir faire afin de faire ne serait ce qu'un prototype d'ému.
Je précise que ce que je vais vous mettre est pour moi le strict minimum certaines choses peuvent être améliorés en utilisant des technos ou mode de fonctionnement différents.
Réseau :
Et oui ce n'est pas nouveau, dans un émulateur il y a bien sûr un système de réseau, afin de réaliser votre serveur (objet servant à recevoir les connexions et à les manage), vous aurez besoin de connaitre quelques notions juste primordial :
- Le protocol TCP : Dofus fonctionne avec le protocole réseau (Un protocole réseau est un protocole de communication mis en œuvre sur un réseau informatique ou un réseau de télécommunications. Il est fréquent que plusieurs protocoles réseau forment des couches de protocoles. src: Wikipedia) TCP (Transmission Control Protocol),
il vous faudra donc savoir codé un serveur TCP (il existe de nombreux tutos sur le net je ne m'y attarderais pas), en utilisant des sockets (objet permettant d'automatiser la construction des différentes couches d'un envoi de données sur le réseaux en fonction du protocol) de préférence afin d'obtenir un control plus dense sur le fonctionnement.
- L'Endianess : Le sens de lecture des bytes sur le réseau, en effet les données reçu lors d'un envoi de ce qu'on appel paquet sont une suite de byte c'est à dire une suite de valeur entre 0 et 255 qui sont de manière général capturés dans un stream. Il existe 2 endianess le Big et le Little, d'où le BigEndianReader que vous pouvez trouver par exemple dans stump ! Vous vous en doutez pour notre émulateur nous allons donc avoir besoin d'utiliser le big endian.
- Comprendre et connaitre le protocole de Dofus : cf le tutoriel de Bouh² : https://cadernis.com/d/115-comprendre-le-protocole-de-dofus
L'asynchronisme et le multi threading :
Il vous faudra nécessairement connaitre un minimum l'asynchronisme et le multi threading, j'avouerais moi même être assez fragile sur ses notions.
- Le multi threading : Cela consiste à exécuter du code sur un nouveau thread (c'est à dire ouvrir un nouveau "canal" d'exécution de code).
- L'asynchronisme : Cela consiste à exécuter du code sur le même thread sur les temps morts de chaque exécutions.
SQL :
Vous aurez logiquement besoin de stocker vos datas, comme par exemple les données des joueurs, d'ailleurs petit conseil toutes datas non mutable (qui ne changera pas), ne sont pas nécessairement à stocké en base de données. Il vous faudra donc vous munir d'un moyen de stocker vos données ( ex : NoSQL, MySQL, PostgreSQL...)
- Maitriser les requêtes SQL : Il est important de savoir utiliser votre langage de stockage de données (dans mon cas MySQL), afin de ne pas surcharger votre base de données de requêtes, car cela ralentit énormément l'exécution de votre application, certaines requêtes peuvent être compacté en une seule pensez y donc.
- ORM (Object Relational Mapping) : Concevoir un programme capable de faire une sorte de liaison automatique entre votre données en base de données et une instance d'un objet. Cela permettra d'exécuter des requêtes dans votre BD et d'en ressortir une instance d'une classe avec les valeurs bindés automatiquement.
ex :
En BD : Table User
Id | Name
1 Neyzu
2 CadernisUser
Résultat de votre fonction :
new User()
{
Id = 1,
Name = "Neyzu"
};
et
new User()
{
Id = 2,
Name = "CadernisUser"
};
Programmation :
Cela parait logique mais ce n'est pas à la porté d'un débutant, il vous faudra de bonnes bases en programmation.
- La réflexion : Afin de faire des parcours de votre projet, comme par exemple listé tous les paquets du protocole du jeu, il vous faudra maitrisé la réflexion. Attention la réflexion est un processus plus que gourmand, utilisez le donc de manière approprié. Petit tips : stockés les informations de vos assembly à l'avance afin de ne pas rechercher de nouveau tous vos type.
- La généricité : Afin d'avoir un projet modulable et propre, il sera important d'utiliser la généricité, c'est à dire faire des classes à utilisation flexible. Pour ceux qui ne voit pas ce que c'est, cela consiste à utiliser le lambda type (le type T généralement).
- Les variables et leur taille en mémoire : il vous faudra connaitre la taille de chaque variable en mémoire, afin de pouvoir lire vos données reçu par le flux réseau, par exemple un int (Integer ou Int32) est stocké sur 4 bytes il vous faudra donc consommer 4 bytes de votre flux réseau pour obtenir votre int.
- Mettre en place une architecture solide et des patterns : Tous projet pour convenir aux normes doit se baser sur un pattern. Il en existe une multitude que je vous invite à consulter sur le net (mot clefs : programmation design pattern).
- Maitriser votre langage : Eeet oui on ne fait pas de miracle il sera nécessaire d'être à l'aise avec votre langage de programmation préféré et avec la POO (Programmation Orienté Objet) si votre langage le permet.
Algorithmie :
Vous aurez besoin d'implémenter certains algorithmes durant le développement de votre émulateur, certains requiert quelques notions de maths un peu poussé mais rien d'inatteignable en soit.
- Un algorithme de path finding : Il vous faudra un algorithme qui permet de vérifier si le joueur peut se rendre du point A au B, ou bien de manière plus général si B est atteignable en partant de A et si oui quel est le chemin. Je vous conseil d'utiliser l'algorithme A* qui est le plus performant à l'heure actuel. Cf: youtube : Computerfill A star algorithm.
- Utilisation de la récursivité : Savoir utiliser la récursivité peut permettre de compacter certains algorithmes, cela consiste à appeler une fonction à l'intérieur d'elle même afin d'obtenir le résultat des exécutions enfants afin de retourner un résultat.
- Manipuler les strings : Vous serez amené à manipuler de nombreuses chaines de texte, je vous conseil personnellement d'apprendre à vous servir des Regex pour vous faciliter la tâche.
Vous me direz : "Eh bah dis donc ça fait beaucoup de choses à savoir, comment je vais faire..."
A cela je vous répond : "Du travail et du travail" nan je rigole xD
Vrai conseil :
Décomposer chaque choses en mini projet indépendant les uns des autres, pour apprendre la notion en elle même faites vous pleins de mini projet de plus en plus poussés et complexes afin de vérifier que vous maitrisez bien. En programmation plus vous codez plus vous serez bon !
Bon code à tous !
Neyzu