vendredi 25 mars 2011

Réflexions sur la création d'une passerelle "Online" pour Rpg Maker

Aujourd'hui, j'ai eu l'occasion de lire un topic d'entraide sur Oniromancie. La question portait sur la réalisation d'un système "Online". Comme toujours, En Ligne rime avec MMO, alors que le terme Massive Multi joueur n'a même pas été prononcé.
J'ai décidé de rédiger un petit article qui explore la thématique du "Online". Les propos ci-dessous ne seront évidemment issu de ma propre recherche et le module commentaire est prévu pour exposer votre désaccord/accord.

Avant toute chose
Effectivement, créer un MMORPG semble impossible sur RPG MAKER car la gestion des écouteurs/processus interne à RM n'est pas adapté. Cependant, créer une passerelle Internet est tout à fait envisageable.
Cet article n'est absolument pas un tutoriel mais plus une mise à plat d'expériences.

Mais "En ligne" ?
Avant de prouver pleins de choses avec amphigourisme :), qu'entendons-nous par En ligne? Personnellement, lorsque je joue à 128 de Zeus81, le fait que les informations soient transmises sur un serveur tierce prouve que oui, c'est tout à fait faisable. De plus, Berka ayant déjà sortit un script de "navigateur web" (ici). Encore une preuve qu'il est possible d'être rattaché à Internet.
Mais au delà de ces exemples ponctuels, est-il possible de créer un jeu ou une interaction serait possible?

L'interaction entre les joueurs
Tonyryu prouve qu'il est évidemment possible de créer un jeu multi-joueur avec son projet Olympe. Cependant, ce n'est pas mon code et je vais donc vous exposer ma méthode pour permettre de créer un mutli-joueur.

Choix de la technologie
Avant de me lancer dans le code, il fallait comprendre la logique du mode "En ligne". Pour créer un système en ligne, il nous faut 2 choses: Un client, un Serveur.

Nous aurons donc un serveur qui relayera des informations entre les différents clients connectés.
Pour nous connecter il existe plusieurs manière. J'ai choisis les Sockets via le protocole TCP/IP. Il existe d'autre manière mais celle que j'ai choisi est celle-ci.
Pour la rédaction du serveur, j'ai utilisé le langage Erlang, pour ses hautes performances, sa gestion des processus avancée et concurrentielle et son approche Fonctionnelle qui limite les effets de bords. C'est un choix (et Erlang à déjà fait ses preuves dans le monde du jeu en réseau). N'importe quel langage permettant de manipuler des Sockets est cependant envisageable.
Maintenant que notre serveur est écrit , nous sommes confronté à un premier problème, Le RGSS n'admet pas de librairie manipulant les Sockets, donc il faut passer par une librairie externe. Soit une DLL pour être utilisée par Rpg Maker via les WIN32API. Tout ce qui touche à la connexion au serveur devra donc se passer dans une DLL C ou C++ (personnellement j'ai choisi le C).
Après, ce sera a Rpg Maker de récupérer les informations fournie par le serveur (donc par la fonction comprise dans la DLL) et utiliser une fonction comprise dans la DLL pour envoyer les mises à jours.

Où vont nos données ?
Maintenant que l'on sait qu'il est possible de communiquer entre un serveur, comment réussir à garder des données pendant une session de jeu? Et bien une fois de plus, les possibilités sont multiple, cependant, j'ai choisi de passer par une Base de données. Alors là, je sens déjà plusieurs personnes qui vont hurler en me disant que c'est stupide et que c'est beaucoup trop lent. Et bien non, il faut savoir que j'utilise Erlang, donc sa base de données embarquée Mnesia qui est non-relationnel (par défaut mais peu le devenir), et est, sur la longue utilisation, beaucoup plus rapide qu'une base de données SQL classique et correspond parfaitement à ce que je veux faire. Donc je me contente de créer des profile que je met à jours en leur attribuant des ID's en fonctions de leur connexion (et je vide mes tables quand un client quitte le jeu).
Je vais donc récapituler avec un schéma le déroulement de mon jeu:




Voici une schéma rapide du processus de jeu. En Erlang, chaque joueur correspond à un processus et dés qu'un client entame une action (déplacement, attaque etc.) une fonction envoi un signal au serveur qui effectue un traitement sur la base de données et qui renvoi presque instantanément les modifications à effectuer et c'est en Ruby qui se déroule les modifications. Grâce aux performances de Erlang, tout ça s'exécute très rapidement.

Fin donc conclusion :)
Voici donc un aperçu (fort succinct, j'en convient)  des démarches entreprise pour créer un mini jeu de combat sur internet. La présentation n'est pas détaillé et n'a pas pour vocation d'être un tutoriel.
J'espère seulement que vous aurez pu voir que faire un mode multi joueur est envisageable.
Bien à vous, NUKI.

13 commentaires:

  1. Il pourrait être intéressant dans l'avenir de mettre des parcelles d'exemples de ton code !

    Ça pourrait-être fort intéressant, d'autant plus que tu explique ceci avec une aisance certaine !

    Bonne continuation

    RépondreSupprimer
  2. Merci beaucoup Jérémy, effectivement, il serait envisageable de poster des portions de code, mais cependant, cet article n'est pas un tutoriel et il n'est mis à plat que pour "prouver" que le Online n'est pas un rêve mystérieux et innaccessible.
    Merci pour les compliments.
    Bien à toi, Nuki.

    RépondreSupprimer
  3. J'avais fait ça pour RMXP :
    http://trotter.poulpe.free.fr/RPGXPmultir2.rar

    Déplacement, changement de map, messagerie, transmission des interrupteurs OK.

    Les clients écrivaient les infos dans un fichier texte lu par RMXP, donc pas besoin de DLL.

    Par contre je me suis rendu compte un peu tard que *RMXP devient inactif lorsqu'il perd le focus*.

    Ca peut poser problème lorsqu'il s'agit de rester attentif à ce que dit le serveur, donc à prendre en compte !

    (Sympa ce blog.)

    RépondreSupprimer
  4. Oui, concernant le focus, c'est assez énervant.
    Pour ce qui est de l'écriture de fichier, ta solution est bonne mais par défaut, j'ai préféré jouer avec une base de données non relationnelle, c'est une question de choix. Ceci dit, beau travail. N'hésite pas à venir partager ton travail ici.

    Merci, Nuki.

    RépondreSupprimer
  5. il est très simple de créer une intéraction entre un serveur et rm grâce au script http/ftp de berka qui permet simplement de reçevoir et d'envoyer des données, néanmoins, je ne sait pas si le transfert serai assez rapide pour se baser dessus pour faire un mmo.

    RépondreSupprimer
  6. non, d'ailleurs, comme je le dit dans l'article, un MMO est, a priori, impossible à coder.
    Merci pour la suggestion.
    Nuki.

    RépondreSupprimer
  7. je programme en ce moment un petit moeteur de jeu en ligne pour rpg maker par mysql, et ça fonctionne !
    en revanche les données ne sont pas transférées et temps réel mais toutes les 30 secondes...

    RépondreSupprimer
  8. Excellente initiative, tu utilises le système de berka ?
    Si oui, j'ai bien peur qu'a long terme, le système ne soit pas viable ... manque de sécurité et MySQL n'est pas vraiment adapté pour ce genre de chose.
    Bonne chance !

    RépondreSupprimer
  9. merci ^^ en fait l'astuce provient du fait que tout ce que le joueur voit sur la map a sont tempo d'actualisation propre c'est à dire en quelque sorte que l'actualisation se fait en canon , le joueur a donc toujours l'impression de voir du mouvement à l'écran.

    mais pourquoi moins sécurisé qu'autre chose ?

    RépondreSupprimer
  10. Parce qu'il est possible de décrypter le projet et donc d'accéder aux identifiants/password de la BDD.

    RépondreSupprimer
  11. je crois avoir aperçu un utilitaire sur un site permettant de crypter ses jeux rm xp

    RépondreSupprimer
  12. Oui oui on peut, le soucis c'est qu'ils sont décryptables.

    RépondreSupprimer