# English

The Guild was made for the Gamecodeur Jam #15 with the following theme in mind: management/simulation.

The result is a prototype where you manage your guild of adventurers, sending members on quests to pay their salaries. The game is over if you don't have enough gold to pay them.

It's playable with the mouse on desktop and It's also mobile friendly.

# Français

The Guild a été fait pour la Gamecodeur Jam #15 avec le thème suivant à l'esprit: gestion/simulation.

Le résultat est un prototype où l'on gère sa guilde d'aventuriers, en envoyant ses membres faire des quêtes pour payer leurs salaires. La partie se termine si on n'a plus assez d'or pour les payer.

Le jeu est jouable à la souris sur ordinateur et compatible mobiles/tablettes.

  • Élève Premium de Gamecodeur
    • oui
  • Langage et Framework utilisés
  • Code par ... / Graphismes par ... (peut être "téléchargés sur xxx") / Musique et sons par ...
    • Code: moi
  • Temps passé
    • Une grosse quinzaine d'heures
  • Comment as-tu (ou pas) abordé la contrainte du thème
    • Après une semaine et avec une idée irréalisable, j'ai dû en trouver une qui le serait... et ce concept de gestion de guilde me trottait dans la tête depuis quelques semaines, largement inspiré par les clans de Final Fantasy Tactics Advance.
      En est ressorti quelque chose qui se rapproche du clicker, je suppose.
  • Petit postmortem (avis sur le langage/framework utilisés, difficultés, succès, choix, bilan personnel rapide, etc...)
    • Je suis resté avec Phaser 2 (Community Edition), n'ayant pas envie de passer mon temps à creuser dans le code source du framework ou les exemples de Phaser 3. Le passage à cette nouvelle version sera peut-être pour la prochaine fois.
      Au lieu de ça, je suis donc parti sur un boilerplate que j'avais fait précédemment. En quelques lignes de commande, j'étais prêt à passer à l'action.
    • Et action il y a eu, à défaut de réelle réflexion. Pour les éditions précédentes de la GC Jam, j'avais pris l'habitude d'utiliser Trello pour ordonner mes idées et, ensuite, poser clairement les tâches à effectuer et en assurer le suivi. Cette fois-ci, après un brainstorm initial, j'ai foncé directement dans le code.
      J'ai commencé par faire vite-fait des mockups avec des valeurs bidons des données que je comptais manipuler (quête, guilde, personnage), et en avant toute.
    • Pendant les deux premiers jours, je n'avais même pas de visuels; tout ce passait dans la console. Une fois que j'ai eu une base fonctionnelle (création d'une guilde avec des membres générés aléatoirement ainsi que de quêtes aussi générées aléatoirement), j'ai entamé le boulot sur l'interface qui allait tout afficher.
    • Sur l'interface, j'aurais aussi bien pu passer directement par le DOM plutôt que d'utiliser Phaser (qui, lui, repose sur un canvas), ça m'aurait évité pas mal de boulot, pour notamment gérer les états (ce que j'ai pas totalement ou très mal fait, en plus).
      L'affichage passe par deux carrousels: un pour les membres et un pour les quêtes. Le carrousel reçoit ce que j'ai appelé un displayObject et une liste (de personnages ou de quêtes) et c'est lui qui va passer l'élément actuel au displayObject pour qu'il l'affiche.
    • La génération aléatoire repose sur un système de dés (de 1 à plusieurs).
    • Les personnages sont générés avec un équipement complet (tête, torse, jambes et arme(s)) dont chaque pièce modifies les attributs. Par faute de temps, l'inventaire n'est pas visible mais les armes sont quand même affichées dans la fiche de personnage et les attributs affichés sont calculés en conséquence.
      Chaque personnage a aussi un nom, qui n'est pas généré mais pioché dans un fichier JSON avec une petite liste de plus de 190 prénoms.
    • La renommée de la guilde est calculée à partir de la renommée individuelle de chaque personnage.
    • Les quêtes sont générées avec une liste de prérequis, ainsi qu'une autre de liste avec les récompenses. Elles ne sont disponibles que pendant un certain temps et ont une durée déterminée.
      J'avais peur pour ce qui est de la gestion de la quête en elle-même (temps qui passe, résolution) mais ça a dû prendre 1h à mettre en place au final. Les personnages prennent de l'expérience et montent de niveau, le montant d'or est bien incrémenté de l'or promise.
      J'avais aussi dans l'idée d'implémenter le fait qu'un personnage pourrait mourir lors d'une quête mais par faute de temps...
    • Les prérequis peuvent demander des compétences particulières et elles sont bien prises en compte (mais un bug apparaissant parfois au moment de l'achat de quête me fait penser que j'ai dû rater quelque chose dans mes conditions). Une partie est déjà mise en place pour gérer la montée en niveau des catégories.
    • J'aurais voulu gérer des objets (consommables, pièces d'équipement, de quête) mais le temps à clairement manqué sur ce point-là. Ça aurait aussi collé plus au thème avec un vrai aspect gestion de la fiche des personnages.
    • J'avais aussi en tête une gestion plus poussée des membres de la guilde avec, en plus de la mort des personnages, le recrutement de nouveaux membres (c'est là que la renommée de la guilde aurait joué quelque chose).
    • J'avais aussi en tête l'idée de générer des petits textes décrivant les quêtes et posant un semblant de background mais je n'ai pas eu le temps de tester mes idées.
    • Tout ayant été fait "au feeling", le code est devenu un énorme bordel sur la fin, mais je suis le premier surpris d'avoir posé les bases aussi "facilement" et "proprement" pour que ça puisse fonctionner quasiment tout seul, en dehors du jeu (avec quand même une grosse dépendance au module RandomDataGenerator de Phaser, mais rien d'irremplaçable).
    • Reste aussi que j'ai fait beaucoup usage du random et qu'il faudrait encore balancer et revoir pas mal de choses pour que tout puisse bien fonctionner.
    • J'ai quand même pris le temps de gérer le multilingue avec l'anglais et le français, mais il suffirait de rajouter une ligne pour inclure une autre langue (en plus du fichier JSON qui va bien).
    • Pour conclure, j'ai l'impression d'avoir fait un gros boulot qui reste invisible au vu du résultat obtenu. Très déçu sur ce point, même si c'était juste libérateur de simplement coder au rythme des idées/envies, sans poser aucun plan sur le papier. J'espère quand même produire quelque chose de plus abouti à l'avenir... en mettant l'accent sur la pré-prod.