Caranille 3.5 - Éditeur de MMORPG en PHP

Posté par . Édité par Nÿco, Benoît Sibaud, fravashyo, Nicolas Casanova et Xavier Claude. Modéré par Xavier Claude. Licence CC by-sa
10
8
mai
2013
Jeu

Voici un projet qui me tient à cœur et que j'ai commencé il y a de cela presque 3 ans : ce projet se nomme Caranille. Pourquoi un tel nom ? Caranille est la contraction de Caramel et Vanille qui sont deux animaux que j'ai perdus il y a longtemps mais que j'ai énormément adorés.

Pour vous présenter Caranille sachez que c'est un logiciel/programme/script qui a pour but de vous aider à bâtir rapidement et gratuitement votre propre MMORPG ( massively multiplayer online role-playing game, c'est-à-dire jeu de rôle en ligne massivement multijoueur) pour votre site web personnel, pour une animation ou autres… Étant une personne qui utilise uniquement GNU/Linux et appréciant sa façon d'être (à savoir le partage des sources), j'ai décidé de mettre Caranille sous licence GNU GPL, ce qui permettra aux utilisateurs avancés de le modifier, de rajouter des modules et de les redistribuer selon la licence Creative Commons.

Possibilités

Fonctionnalités JdR :

  • une histoire principale pour votre jeu
  • plusieurs villes (qui peuvent être débloquées en fonction de l'avancée dans l'histoire)
  • des missions propre à chaque ville
  • des monstres et de choisir les objets qui pourront être gagnés lors de la victoire du joueur
  • des objets (armes, protection, objets de soin comme des potions etc.)
  • des chimères à invoquer lors des combats

Fonctionnalités MMORPG :

  • faire du PVP (Player Versus Player)
  • fonder sa propre guilde
  • discuter en direct avec tous les autres joueurs

De plus pour les habitués des grands JdR de Square Enix (ou anciennement SquareSoft) le menu de combat est présenté de la même façon à savoir :

  • Attaquer (porter une attaque physique)
  • Magie (lancer un sort sur ennemi)
  • Invocation (invoquer une puissante chimère)
  • Objets (utiliser un objet comme une potion)
  • Fuir (trop faible face à l’ennemi ? Fuyiez)

Avantages

Le gros avantage de Caranille est dans sa simplicité d'utilisation, celui-ci a été conçu de façon à ce qu'une personne ne connaissant rien en développement puisse l’utiliser et créer son MMORPG et sa communauté de joueurs.

Caranille est programmé en PHP5 et utilise MySQL pour le stockage des données ce qui vous permet de l'utiliser sur tous les hébergements mutualisés actuellement proposés ou pourquoi pas sur votre propre ordinateur avec un serveur WAMPP ou LAMPP.

L'un des principes fondamentaux de Caranille est de fonctionner sur tous les appareils disposant d'un navigateur internet (même des plus anciens).

Cela permet pour l'utilisateur final d'y jouer sur (presque) tous les terminaux confondus à savoir :

  • Un ordinateur (Fixe ou portable)
  • Un smartphone voir même téléphone
  • Toutes les dernières consoles de jeu portables ou fixes

En conclusion le but de Caranille est de fournir une plate-forme complète de développement de MMORPG gratuits et ces derniers pourront être joués partout comme chez vous, dans le bus pendant vos vacances via un cybercafé et même au travail, la seule condition étant de posséder un navigateur web et internet.

FAQ

Voici les questions les plus fréquentes :

À qui est destiné Caranille ?

  • Caranille est destiné à toutes les personnes ou entités qui souhaitent mettre en place un MMORPG sur leur site web.

Pourquoi n'y a-t'il pas de 2D, voir même 3D ?

  • Simplement car les éditeurs de MMORPG actuel qui utilisent de la 2D ou 3D utilisent forcément du javascript ainsi que la technologie AJAX. Ce qui au final ne permettrait plus à Caranille de fonctionner sur tous les terminaux ce qui est l'un des principes fondamentaux de l'éditeur.

Quels sont les cycles de sortie des nouvelles versions ?

  • Il sort une nouvelle version en moyenne tous les 3 mois, le temps de corriger les derniers bogues de la version actuelle et de mettre en place les nouveautés de la prochaine version

Les sources sont mises à disposition en temps réel, dès qu'une modification a lieu dans sur la version stable ou instable. Les utilisateurs peuvent télécharger à tout moment la dernière version.

  • # AJAX

    Posté par . Évalué à 5.

    Si on en crois cette page http://www.tutorialspoint.com/ajax/ajax_browser_support.htm il faut remonter à de sacrées vieilles versions de navigateurs pour ne pas avoir AJAX dispo.
    Après pour faire de la 3D, c'est pas vraiment l'indispo d'AJAX qui va te manquer.

    • [^] # Re: AJAX

      Posté par . Évalué à 1.

      Je suis bien d'accord avec toi, mais néamoins je sais que j'ai déjà eu quelques souçit avec la version actuelle sur de vieux terminaux (Par exemple la PSP avec son très très vieux navigateur).

      Mais l'utilisation de l'ajax est déjà prévu j'attends que la version 3.5 GOLD edition sorte pour que je passe à la prochaine version la 4.0 qui aurà des fonctionnalitées qui utiliseront un peu de Javascript et du AJAX (pour le chat en temps réelle par exemple).

      Cordialement, Jérémy

      Merci de ton commentaire qui peut me donner des idées ;)

  • # Et la qualité ?

    Posté par . Évalué à 7. Dernière modification le 08/05/13 à 22:40.

    Bonjour,

    Sur le fond, l'idée de ce projet a l'air sympa, il y a juste un truc qui cloche : le code est monstrueux.

    Je passerai sur le fait que cela ne soit pas du MVC, ce qui en 2013 est quand même assez hallucinant pour une appli web, mais quand en plus on trouve des trous de sécurité béants comme ça je reste pantois :

    modules/temple/index.php:80

    $id_chimere = $_POST['idc'];
    $recherche_chimere = $bdd->query("SELECT * FROM caranille_chimeres
    WHERE id_chimere='$id_chimere'");

    Je veux bien que ce ne soit pas une appli pro et qu'on ne peut pas demander le même niveau d'exigence mais dans ce cas là il vaut mieux le garder pour soi plutôt que de le publier.

    Le problème c'est que ce genre de code accrédite l'idée que PHP est un langage d'amateurs et que ses utilisateurs en sont.

    Mon conseil, surtout si tu cherches du boulot en tant que développeur PHP, c'est de tout casser et de refaire ça propre avec un framework ; Symfony / Zend / CakePHP, t'as le choix.
    La courbe d'apprentissage va être un peu rude mais au final tu vas gagner du temps et ça sera beaucoup plus clean.

    • [^] # Re: Et la qualité ?

      Posté par . Évalué à 3.

      J'en suis bien d'accord avec toi. Caranille 3.5 est une surcouche ajoutée à la version 2 qui en est elle-même une de la version 1.0

      J'admet que depuis sa version 3 le code est ce qui me chagrine le plus.

      Pour symfony j'ai déjà essayé mais bon comme tu le dit si bien il y a une sacré courbe d'apprentissage, mais je ne peux rester sur des acquis que j'ai eu il y a plus de 5 ans, PHP à bien évolué depuis.

      Je penses plutôt essayer Zend qui est très réputé.

    • [^] # Re: Et la qualité ?

      Posté par (page perso) . Évalué à 5.

      Sans forcément parler de framework, pour les accès à la BDD utiliser PDO avec le bind de paramètres faciliterait les choses.

      Quelque chose comme ça, dans la version de base :
      $recherche_chimere = $bdd->prepare("SELECT * FROM caranille_chimeres
      WHERE id_chimere = ?");
      $recherche_chimere->execute(array($_POST['idc']));

      Ça ne nécessite aucun framework, et pose déjà quelques problèmes en moins.

      alf.life

      • [^] # Re: Et la qualité ?

        Posté par . Évalué à 4.

        Comme je disait je comptes sortir la version 3.5 qui sera la version ou justement je corrige et j'aère le code pour ensuite passer à une étape complète d'optimisation.

        Je connais plus que les bases de la POO de PHP mais c'est juste qu'il est dur de modifier un projet qui a encore beaucoup de soucis majeur qui sont pour moi des choses qui ralentisse l'évolution du projet et qui au finale finisse par me prendre tout mon temps rien que pour leurs correction.

        Repartir de zéro j'y ai déjà pensé, mais j'ai peur que ce soit perdre plus de temps qu'autre chose

      • [^] # Re: Et la qualité ?

        Posté par (page perso) . Évalué à 2.

        Ce sera plus lent, car il faudra attendre un aller-retour avec la BDD pour compiler et rendre disponible la prepared statement.

        • [^] # Re: Et la qualité ?

          Posté par (page perso) . Évalué à 2. Dernière modification le 09/05/13 à 18:07.

          Pas nécessairement. PDO a une option d'émulation des «prepared statement», servant essentiellement à la sécurité (PDO::ATTR_EMULATE_PREPARES).

          Il me semble même que dans le cas de MySQL, cette option est active par défaut (PDO::MYSQL_ATTR_DIRECT_QUERY à true).

          alf.life

    • [^] # Re: Et la qualité ?

      Posté par . Évalué à 10.

      Je veux bien que ce ne soit pas une appli pro et qu'on ne peut pas demander le même niveau d'exigence mais dans ce cas là il vaut mieux le garder pour soi plutôt que de le publier.

      Ça c'est méchant ☹…

      Plus sérieusement, le fait qu'il distribue son code permet justement de voir ces erreurs, et peut le pousser à les corriger bien mieux que s'il restait dans son coin sans partager, non ?

      C'est d'ailleurs confirmé par le reste de ton message : aurais-tu critiqué son projet et proposé des solutions (même théoriques) si tu n'avais pas jeté un coup d'œil aux sources ?

      C'est peut-être une mauvaise pub pour lui, et pour PHP, mais justement, on ne peut corriger la mauvaise pub pour PHP qu'en corrigeant le projet, pas en le cachant… Sinon, autant dire : « C'est un langage de merde, il n'y a personne de compétent pour éduquer ceux qui utilisent mal le langage. »…

    • [^] # Re: Et la qualité ?

      Posté par . Évalué à 10.

      Je veux bien que ce ne soit pas une appli pro et qu'on ne peut pas demander le même niveau d'exigence mais dans ce cas là il vaut mieux le garder pour soi plutôt que de le publier.

      Bah j'en connais qui codent toujours comme ça, même après 10 ans de métier, et qui ne voient toujours pas où est le problème…

    • [^] # Re: Et la qualité ?

      Posté par (page perso) . Évalué à 3.

      MVC n'est pas une obligation. D'ailleurs, c'est impossible d'appliquer le pattern MVC dans le web de manière intégrale. Mais je suis d'accord pour dire que garder à l'esprit de séparer les responsabilités reste une bonne idée.

      La manière de fabriquer les requêtes SQL est une horreur. Venir expliquer que c'est une surcouche de surcouche est une mauvaise justification. mysqli_real_escape_string est un ami. Mais ce n'est pas le seul problème : htmlentities n'est jamais employé pour échapper les données intégrées au HTML ; aucune protection contre les CSRF n'est mise en place ; c'est codé en français ; un zip est fournit plutôt qu'un tarball (mais le développeur se prévaut d'être un Linux power user, va comprendre :D) ; où est le repo ? ; usage idiot de addslashes pour fournir une pseudo-sécurité (c'est encore pire que de ne rien faire) ; stockage des mots de passe en clair ; avec possibilité de les récupérer via une SQL injection ; le style employé est confus entraînant une complexité inutile [1] ; les commentaires qui paraphrase le code sont inutiles [2] ; utiliser des loops, c'est bien [3] ; pourquoi htmlspecialchars est parfois utilisé avant insertion en BDD ? ; beaucoup de code dupliqué ; pourquoi tous les scripts s'appellent index.php ?

      Bref, tu as du pain sur la planche :) Personnellement je ne t'encourage pas à utiliser de Framework PHP, ils sont tous pourris ou lourds. Rationaliser le code (créer une routine de routage/dispatch, ségréguer le code relatif à la logique métier dans une unité logique de code, etc) est une première étape.

      Utilises-tu Git pour gérer ton développement ?

      [1]
      php
      if($success)
      if($otherSuccess)
      doSomething;
      else
      echo 'message à l'utilisateur';
      else
      echo 'message à l'utilisateur';

      Je préfère, pour des raison de clarté, écrire mon code ainsi :
      ```php
      if(!$success)
      {
      echo 'message à l'utilisateur';
      return;
      }

      if(!$otherSuccess)
      {
      echo 'message à l'utilisateur';
      return;
      }

      doSomething;
      ```

      [2]
      php
      //Si l'utilisateur décide de quitter la ville
      if (isset($_POST['quitter_ville']))

      [3]
      php
      {
      $_SESSION['id'] = $donnees_compte['id_compte'];
      $_SESSION['id_guilde'] = $donnees_compte['id_guilde_compte'];
      $_SESSION['pseudo'] = $donnees_compte['pseudo_compte'];
      $_SESSION['mdp'] = $donnees_compte['mdp_compte'];
      $_SESSION['mail'] = $donnees_compte['mail_compte'];
      $_SESSION['force'] = $donnees_compte['force_compte'];
      $_SESSION['magie'] = $donnees_compte['magie_compte'];
      $_SESSION['defense'] = $donnees_compte['defense_compte'];
      $_SESSION['pv'] = $donnees_compte['pv_restant_compte'];
      $_SESSION['pv_max'] = $donnees_compte['pv_max_compte'];
      $_SESSION['pm'] = $donnees_compte['pm_restant_compte'];
      $_SESSION['pm_max'] = $donnees_compte['pm_max_compte'];
      $_SESSION['pc'] = $donnees_compte['pc_compte'];
      $_SESSION['po'] = $donnees_compte['po_compte'];
      $_SESSION['notoriete'] = $donnees_compte['notoriete_compte'];
      $_SESSION['chapitre'] = $donnees_compte['chapitre_compte'];
      $_SESSION['mission'] = $donnees_compte['mission_compte'];
      $_SESSION['status'] = $donnees_compte['status_compte'];

      deviens :
      php
      foreach(array('id', 'id_guilde'
      , 'pseudo', 'mdp', 'mail', 'force', 'magie', 'defense'
      , 'pv', 'pv_max', 'pm', 'pm_max', 'pc', 'po'
      , 'notoriete', 'chapitre', 'mission', 'status'
      ) as $param_name)
      $_SESSION[$param_name] = $donnees_compte[$param_name];

      On pourrait aussi utiliser array_merge, mais j'ai comme dans l'idée que c'est une mauvaise idée que de polluer le scope de la session.

      DISCLAIMER: je hais Markdown quand ça ne semble pas marcher, aussi, veuillez me pardonner pour ce message très mal formaté :D

      • [^] # Re: Et la qualité ?

        Posté par . Évalué à -1.

        En fait, il ne le sait peut être pas, mais il semble vouloir de l'aide constructive?
        … Et vous savez comment lui donner, je pense.
        Avoir besoin de réinventer la roue pour la comprendre, ca arrive à des gens.
        donc il lui faut un système de versionning de son code, pour commencer.

        • [^] # Re: Et la qualité ?

          Posté par (page perso) . Évalué à 1.

          C'est un peu le but de ma dernière question, s'il utilise Git (non, il n'en existe pas d'autre :-D ).

          Mon aide est très constructive. D'accord, c'est mal formaté, je n'ai pas réussi à retrouver comment faire fonctionner cette connerie, mais les exemples que j'ai donné sont caractéristiques de ce qu'il doit commencer par corriger. Et j'ai donné quelques mots-clés important qu'il devra aller chercher. Il peut aussi poser la question, et je lui répondrais avec toute l'amabilité dont je peux faire preuve.

          Réinventer la roue est une nécessité pour tous les développeurs, pour découvrir et comprendre un cheminement intellectuel. Et une fois qu'on a saisit les enjeux, on jette et on utilise une solution éprouvée. Ceux qui ne sont pas arrivé à cette conclusion ne sont pas des développeurs, mais des intégrateurs. Le monde a besoin de ces gens qui peuvent assembler des systèmes, mais ce ne sont pas des développeurs.

          • [^] # Re: Et la qualité ?

            Posté par . Évalué à -1.

            Nous sommes 100% d'accord, et j'ai lu les posts plus récents que mon précédent mien:
            si la perfection était de ce monde, ou dans un unique cerveau, ça se saurait!

      • [^] # Re: Et la qualité ?

        Posté par (page perso) . Évalué à 4.

        Je préfère, pour des raison de clarté, écrire mon code ainsi :
        ```php
        if(!$success)
        {
        echo 'message à l'utilisateur';
        return;
        }

        if(!$otherSuccess)
        {
        echo 'message à l'utilisateur';
        return;
        }

        doSomething;
        ```

        On va sombrer dans le troll, mais placer des return à tout va dans une méthode est une très mauvaise pratique quant à la maintenance de ladite méthode.

        Il est bien plus pratique (et à peine moins clair) de ne créer qu'une "porte de sortie". J'en ai passé des heures à chercher la raison d'un bug avant de trouver un "return" caché au détour d'un if qui avait été oublié…

        • [^] # Re: Et la qualité ?

          Posté par (page perso) . Évalué à 2.

          C'est une question de style. Il y en a, pour éviter ça, vont faire une variable et complexifier le code inutilement.

          Je préfère chercher dix return dans une fonction plutôt que 10 accolades fermantes.

          C'est surtout que ça donne une approche séquentielle : dès qu'on peut, on sort. Par contre, il faut être cohérent : soit on applique la méthode du point de sortie unique, soit on applique la politique de sortie au plus tôt possible. Et surtout, on évite de mettre des return dans la quatrième imbrication de code, ça fait mauvais genre. Les return doivent toujours être à un niveau accessible, sinon c'est illisible.

          Ceci dit, la plupart de mes fonctions n'ont qu'un point de sortie, puisque lorsqu'il y a une erreur, je lève une exception plutôt que de retourner un résultat que personne ne vérifiera :) Mais ça reste des points de sortie multiple.

  • # problème de droit

    Posté par (page perso) . Évalué à 2.

    Bonsoir,

    Je n'ai pas l'utilité d'un tel programme, mais merci pour le partage.

    Qqs petits soucis à l'installation, problème de droit il me semble.

    Bonne continuation.

    Pas besoin d'être un pro pour aider la communauté Débiane : utilisez simplement apt-p2p

  • # Commentaire supprimé

    Posté par . Évalué à 1.

    Ce commentaire a été supprimé par l'équipe de modération.

  • # Courage !

    Posté par . Évalué à 7.

    Salut !

    Ton code me rappelle avec nostalgie mes premiers émois de développeur…

    Il mériterait (et toi aussi) d'avoir de l'aide en ce qui concerne la conception (notamment les design pattern), la qualité et les bonnes pratiques (notamment un logiciel de gestion de versions).

    Lis, instruis-toi et fais évoluer ton code, tout le monde (ou presque…) est passé par là.
    Et surtout, n'hésite pas à tout recommencer avec un cahier des charges et une conception du projet.

    C'est un travail de titan, c'est clair, mais plus tu te tourneras (et reposeras) sur des technos connues et éprouvées, plus tu auras des gens susceptibles de t'aider. En tous cas, c'est un beau projet et peu importe les critiques (constructives ou non), ne lâche pas l'affaire !

    C'est en faisant des erreurs qu'on apprend.
    Et ça, beaucoup de monde et surtout beaucoup de développeurs semblent l'oublier.

    • [^] # Re: Courage !

      Posté par . Évalué à 1.

      C'est en faisant des erreurs qu'on apprend.
      Et ça, beaucoup de monde et surtout beaucoup de développeurs semblent l'oublier.

      Non, personne ne l'oublie, c'est un trait de notre condition qui nous est rappelé à chaque build, à chaque refresh. Par contre moi je ne code pas pour apprendre, mais pour réaliser. Le plus vite j'ai un résultat, le mieux je me porte.
      La qualité oui, mais le résultat d'abord.

      • [^] # Re: Courage !

        Posté par . Évalué à 2.

        Ba tant que certains principes éprouvés sont gardés en tête, ça peut être pas mal non plus, et ça peut permettre d'atteindre la qualité ET le résultat?

        • [^] # Re: Courage !

          Posté par . Évalué à 1.

          quand tu commences depuis le debut oui, mais là c'est pas le cas, tout le monde lui prend la tête en cours de route, pour un projet qui à encore tout à faire pour prouver son utilité.
          Qu'il fasse un projet que le monde juge intéressant et là oui on s'occupera de se prendre la tête à fixer ces petits problèmes de coding.

          Ceci mis à part,
          Et puis franchement se cogner de la ligne sql en php (je précise) à longueur de journée c'est pas super motivant.
          Pour cela ils sont vraiment naze les dev de la core team php, pas foutu de fournir des outils pour parcourir les fichiers php et y appliquer des transformations de code.

  • # Tient, j'ai une petite faim

    Posté par (page perso) . Évalué à 1.

    ce projet se nomme Caranille. Pourquoi un tel nom ? Caranille est la contraction de Caramel et Vanille qui sont deux animaux que j'ai perdus il y a longtemps mais que j'ai énormément adorés.

    snif, les pauvres … donner des noms comme ça à des animaux, ça n'a pas du être du gâteau pour eux.

    /* Lundi matin, je suis méchant et pas rigolo */

    PS : À quand un Chocolat ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.