.. _tba-07-quests: Ajouter des quêtes ================== L'objectif de cette partie est d'ajouter des quêtes au jeu. Les quêtes permettront de guider le joueur dans son aventure en lui donnant des objectifs à atteindre. Initial GitHub stuff -------------------- Ouvrir le codespace associé au repo que vous avez *forké* ou le dossier local si vous avez cloné le dépôt. Vous pouvez travailler alternativement dans le codespace ou en local si vous avez synchronisé votre travail avec le repo forké à la fin de chaque chapitre (section "Final GitHub Stuff" du chapitre précédent). A partir du terminal, récupérer la dernière version du jeu depuis votre dépôt :: $ git pull Utiliser l'extension ``GitLens`` pour examiner l'historique des commits, et en particulier les différences entre la version actuelle et la version précédente. **Pour ce chapitre vous devez récupérer une nouvelle branche depuis le dépôt initial** (le dépôt que vous avez forké au tout début du projet). Suivez les instructions ci-dessous pour ajouter cette branche à votre dépôt local et à votre fork sur GitHub. Vérifier que le dépôt initial est bien configuré comme dépôt distant nommé ``upstream`` :: $ git remote -v origin git@github.com:username/TBA.git (fetch) origin git@github.com:username/TBA.git (push) upstream https://github.com/DanielCourivaud/TBA.git (fetch) upstream https://github.com/DanielCourivaud/TBA.git (push) Si le dépôt ``upstream`` n'apparaît pas, l'ajouter avec la commande :: $ git remote add upstream https://github.com/DanielCourivaud/TBA.git Maintenant que le dépôt ``upstream`` est configuré, récupérer la nouvelle branche nommée ``tba-quests`` depuis ce dépôt :: $ git fetch upstream Switcher sur la nouvelle branche ``tba-quests`` :: $ git switch tba-quests Votre dépôt local pointe maintenant sur la branche ``tba-quests`` qui contient les modifications apportées pour ce chapitre. .. note:: La branche ``main`` est toujours présente dans le dépôt local mais ce n'est plus elle qui est active :: $ git branch main * tba-quests ``main`` contient le travail jusqu'au chapitre précédent. On peut changer de branche à tout moment avec la commande ``git switch ``. Sur la branche ``tba-quests``, vérifier qu'un fichier ``quest.py`` est présent dans le répertoire. Ce fichier est fourni et contient les classes ``Quest`` et ``QuestManager`` qui permettront de gérer les quêtes dans le jeu :: $ ls -1 actions.py command.py game.py player.py quest.py README.md room.py Observations des modifications globales --------------------------------------- Pour observer les modifications apportées dans cette branche, identifier d'abord les fichiers mis en jeu. Ici la branche ``main`` est utilisée comme référence :: $ git diff --name-status main tba-quests A .gitignore M actions.py M command.py M game.py M player.py A quest.py M room.py .. note:: Par rapport à la branche ``main``, la lettre ``A`` indique qu'un fichier a été ajouté, la lettre ``D`` indique qu'un fichier a été supprimé, et la lettre ``M`` indique qu'un fichier a été modifié. On observe que les fichiers ``.gitignore`` et ``quest.py`` ont été ajoutés, et que les autres fichiers ont été modifiés. .. admonition:: A faire Se renseigner sur le rôle du fichier ``.gitignore`` et examiner son contenu. Quelle est la signification des lignes ajoutées ? Le fichier ``quest.py`` contient les classes nécessaires pour gérer les quêtes dans le jeu. On examinera son contenu ultérieurement. Observation des fichiers modifiés --------------------------------- Les modifications des fichiers ``command.py`` et ``room.py`` ne modifient pas leur comportement. Elles ajoutent quelques doctest et implémentent de manière plus satisfaisante aux bonnes pratiques de codage. On peut examiner les modifications apportées aux fichiers modifiés dans le terminal en utilisant la commande :: $ git diff main tba-quests command.py $ git diff main tba-quests room.py .. tip:: Pour une meilleure lisibilité, on peut utiliser l'extension ``GitLens`` et sa fonctionnalité ``SEARCH & COMPARE > Compare References...`` pour examiner les différences entre les versions des fichiers. .. image:: images/tba-07-quests-gitlens-diff.png :width: 300px :align: center Vérifier **à la lecture du code** que les modifications n'impactent pas le fonctionnement du jeu. Ajout des quêtes ---------------- La principale modification concerne l'ajout du fichier ``quest.py``. Observer attentivement sa structure et son contenu. .. quiz:: quizz-01 :title: Les quêtes .. warning:: Quelques indications pour les réponses à apporter : - Les lignes consécutives doivent être séparées par un tiret. Exemple : ``10-15`` ; - Les lignes non consécutives doivent être séparées par des virgules suivies d'un seul espace. Exemple : ``10, 11, 13, 17`` ; - Les objets doivent être décrits par la chaine de caractères utilisée par la commande :command:`type()`. Exemple : si la commande :command:`type()` retourne ````, la réponse est ``list``; - Lorsqu'il y a plusieurs réponses à fournir, elles doivent être dans l'ordre d'apparition dans le code et séparées par des virgules suivies d'un seul espace. Exemple : ``obj1, obj2, obj3`` ; - Les fonctions et les méthodes doivent comporter les parenthèses. Exemple : ``__init__()``. #. :quiz:`{"type":"FB","answer":"2", "size":5}` Combien y a t-il de classes dans ce fichier ? #. :quiz:`{"type":"FB","answer":"Quest, QuestManager", "size":20}` Quelles sont elles ? #. :quiz:`{"type":"FB","answer":"Quest", "size":15}` Quelle est la classe principale ? #. :quiz:`{"type":"FB","answer":"7", "size":5}` Combien a t-elle d'attributs ? #. :quiz:`{"type":"FB","answer":"12", "size":5}` Combien a t-elle de méthodes ? #. :quiz:`{"type":"FB","answer":"activate()", "size":15}` Quelle méthode permet de rendre une quête active ? #. :quiz:`{"type":"FB","answer":"complete_objective()", "size":15}` Quelle méthode permet de marquer un objectif de la quête comme atteint ? #. :quiz:`{"type":"FB","answer":"100", "size":5}` A quelle ligne vérifie t-on que la quête est terminée ? #. :quiz:`{"type":"FB","answer":"get_status()", "size":15}` Quelle méthode permet de suivre la complétude de la quête ? #. :quiz:`{"type":"FB","answer":"_", "size":15}` Certaines méthodes ne sont pas appelées directement sur l'objet Quest. Par quel caractère sont elles préfixées ? #. :quiz:`{"type":"FB","answer":"QuestManager", "size":15}` Quelle classe permet de gérer l'ensemble des quêtes du jeu ? #. :quiz:`{"type":"FB","answer":"3", "size":5}` Combien a t-elle d'attributs ? #. :quiz:`{"type":"FB","answer":"12", "size":5}` Combien a t-elle de méthodes ? #. :quiz:`{"type":"FB","answer":"complete_objective()", "size":15}` Quelle méthode permet de suivre la complétude des quêtes disponibles ? Connexion avec les autres classes --------------------------------- Pour intégrer les quêtes dans le jeu, plusieurs modifications ont été apportées aux autres fichiers du projet (``actions.py``, ``game.py``, et ``player.py``). Observer les modifications apportées à ces fichiers en utilisant l'extension ``GitLens``. .. quiz:: quizz-02 :title: Les actions #. :quiz:`{"type":"FB","answer":"actions.py", "size":20}` Quel est le fichier concerné par les actions ? #. :quiz:`{"type":"FB","answer":"1", "size":5}` Combien y a t-il de classes dans ce fichier ? #. :quiz:`{"type":"FB","answer":"0", "size":5}` Combien y a t-il de méthodes d'instance ? #. :quiz:`{"type":"FB","answer":"7", "size":5}` Combien y a t-il de méthodes static ? #. :quiz:`{"type":"FB","answer":"4", "size":5}` Combien y a t-il de méthodes supplémentaires ? #. :quiz:`{"type":"FB","answer":"quests()", "size":15}` Quelle méthode permet de lister toutes les quêtes ? #. :quiz:`{"type":"FB","answer":"quest()", "size":15}` Quelle méthode permet de donner les détails d'une quête ? #. :quiz:`{"type":"FB","answer":"activate()", "size":15}` Quelle méthode permet d'activer une quête ? #. :quiz:`{"type":"FB","answer":"rewards()", "size":15}` Quelle méthode permet de lister les récompenses ? .. quiz:: quizz-03 :title: Le joueur #. :quiz:`{"type":"FB","answer":"player.py", "size":20}` Quel est le fichier concerné par le joueur ? #. :quiz:`{"type":"FB","answer":"1", "size":5}` Combien y a t-il de classes dans ce fichier ? #. :quiz:`{"type":"FB","answer":"3", "size":5}` Combien y a t-il de méthodes d'instance ? #. :quiz:`{"type":"FB","answer":"0", "size":5}` Combien y a t-il de méthodes static ? #. :quiz:`{"type":"FB","answer":"2", "size":5}` Combien y a t-il de méthodes supplémentaires ? #. :quiz:`{"type":"FB","answer":"add_reward()", "size":15}` Quelle méthode permet de récompenser le joueur ? #. :quiz:`{"type":"FB","answer":"show_rewards()", "size":15}` Quelle méthode permet de lister les récompenses du joueur ? .. quiz:: quizz-04 :title: Le jeu #. :quiz:`{"type":"FB","answer":"game.py", "size":20}` Quel est le fichier concerné par le moteur de jeu ? #. :quiz:`{"type":"FB","answer":"1", "size":5}` Combien y a t-il de classes dans ce fichier ? #. :quiz:`{"type":"FB","answer":"4", "size":5}` Combien y a t-il de méthodes d'instance ? #. :quiz:`{"type":"FB","answer":"4", "size":5}` Combien y a t-il de méthodes privées (préfixées par _ ) ? #. :quiz:`{"type":"FB","answer":"0", "size":5}` Combien y a t-il de méthodes d'instance supplémentaires ? #. :quiz:`{"type":"FB","answer":"103", "size":5}` A quelle ligne définit on le lieu de départ ? #. :quiz:`{"type":"FB","answer":"108, 119, 126", "size":5}` A quelles lignes sont définies les quêtes ? Maintenant vous avez une bonne idée de comment ajouter des quêtes à votre jeu. Fonctionnement des quêtes ------------------------- Pour comprendre le fonctionnement des quêtes, lancer le jeu avec la commande habituelle :: $ python game.py Parcourez la map initiale et réalisant chacune des quêtes proposées. Faites vous une idée de comment vous pourriez intégrer des quêtes dans votre propre jeu. .. admonition:: A faire Les modifications observées dans la branche ``tba-quests`` doivent être intégrées dans la branche ``main``. Il faut donc s'assurer de revenir sur la branche ``main`` avant d'apporter la moindre modification. .. tip:: Utiliser l'extension ``GitLens`` et sa fonctionnalité ``SEARCH & COMPARE > Compare References...`` pour porter le code pertinent de la branche ``tba-quests`` vers la branche ``main`` par copier/coller. Ajouter des quêtes à votre jeu en vous inspirant de ce qui a été fait ici. Vous pouvez créer vos propres quêtes en utilisant la classe ``Quest`` et les gérer avec la classe ``QuestManager``. N'oubliez pas d'ajouter les actions associées dans le fichier ``actions.py`` pour permettre au joueur d'interagir avec les quêtes. Pensez à récompenser le joueur lorsqu'il complète une quête en utilisant la méthode ``add_reward()`` de la classe ``Player``. Final GitHub stuff ------------------ Enregistrer les modifications apportées aux fichiers dans le repo local (codespace ou machine locale) :: $ git add . .. important:: Vous pouvez vérifier les statistiques de commit avec la commande :: $ git shortlog -s -n Ajouter un commit à l'historique :: $ git commit -m "Add quests and quest management" Votre historique doit ressembler à ceci : .. image:: images/tba-07-quests-gitgraph-01.png :width: 600px :align: center Pour référencer plus facilement cette version dans le futur, créer un tag :: $ git tag v5 Synchroniser votre codespace avec votre dépôt GitHub :: $ git push origin main --tags Vérifier que les modifications sont bien présentes dans le dépôt GitHub.