From 568b8f3eba9ab4620bbcf9eb6cc363e2df635a2f Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 10 Jan 2021 17:33:06 +0100 Subject: [PATCH 1/4] Documentation on displays --- docs/display/index.rst | 55 ++++++++++++++++++++++++++++++++++++------ docs/display/logs.rst | 5 +++- docs/display/map.rst | 11 +++++++-- docs/display/menu.rst | 17 +++++++------ docs/display/stats.rst | 9 +++++-- 5 files changed, 78 insertions(+), 19 deletions(-) diff --git a/docs/display/index.rst b/docs/display/index.rst index 376466c..a32c052 100644 --- a/docs/display/index.rst +++ b/docs/display/index.rst @@ -3,13 +3,6 @@ Gestion de l'affichage .. _curses: https://docs.python.org/3/howto/curses.html -L'intégralité de l'affichage du jeu est géré grâce à la bibliothèque native de -Python curses_. - - -.. warning:: - Plus de documentation à venir. - .. toctree:: :maxdepth: 3 @@ -19,3 +12,51 @@ Python curses_. map stats logs + +L'intégralité de l'affichage du jeu est géré grâce à la bibliothèque native de Python curses_. + +Initialisation du terminal +-------------------------- + +Au lancement du jeu, le terminal est initialisé, les caractères spéciaux sont traduits en abstraction curses, les +caractères tapés par l'utilisateur ne sont plus affichés sur le terminal, on envoie les touches tapées à curses en +permanence sans avoir à taper sur Entrée, le curseur est rendu invisible, on active le support des couleurs et enfin +on déclare vouloir attraper tous les clics de souris. Tout cela est fait dans un contexte Python, qui permet +d'effectuer les opérations inverses lors de la fermeture du programme, même en cas de crash, afin de retrouver un +terminal utilisable. + + +Pads +---- + +Chaque morceau d'affichage est géré dans un *pad*. Un pad est un objet défini par curses, représentant une sous-fenêtre, +qui a l'avantage d'être un peu plus flexible qu'une simple fenêtre. Un pad peut en effet dépasser de l'écran, et on +peut choisir où placer le coin avant gauche et quelle partie du pad il faut dessiner sur la fenêtre. + +Ce projet implémente une couche d'abstraction supplémentaire, afin d'avoir des objets plus utilisables. Chaque partie +d'affichage est réprésentée dans une classé étendant ``Display``. Chaque ``Display`` contient un (ou plusieurs) pads, +et propose une surcouche de certaines fonctions de curses. + +L'affichage de texte par exemple sur un pad est plus sécurisée que celle proposée par curses. Le comportement par défaut +est d'afficher un message à partir d'une position donnée avec des attributs (gras, couleur, ...) donnés sous +forme numérique. Cette implémentation permet de passer les attributs voulus sous forme de paramètres booléens, de +choisir la couleur de front/de fond sans définir de paire curses, mais surtout de tronquer le texte à la place +disponible, afin de ne pas avoir à se soucier d'avoir un message trop grand et éviter des crashs non désirés. + +Les ``Display`` sont gérés par un ``DisplayManager``. C'est lui qui décide, en fonction de l'état actuel du jeu, +d'afficher les bons ``Display`` aux bons endroits et de les redimensionner correctement en fonction de la taille du +terminal. C'est aussi lui qui propage l'information de modifier les attributs d'un ``Display``, si par exemple +l'inventaire du joueur a été mis à jour. + +Il s'occupe enfin de tout redimensionner si jamais le terminal a changé de taille, après une intervention +de l'utilisateur. + + +Interactions avec la souris +--------------------------- + +Le jeu attrape les clics de souris. C'est le ``DisplayManager``, connaissant l'état du jeu et ce qui est affiché à +quel endroit, qui va chercher sur quel ``Display`` on a cliqué. L'information est propagée au bon ``Display``, en +adaptant les coordonnées. + +Tout ``Display`` qui contient un menu procède de la même façon pour propager l'information au bon menu. diff --git a/docs/display/logs.rst b/docs/display/logs.rst index 9e925a3..b46147d 100644 --- a/docs/display/logs.rst +++ b/docs/display/logs.rst @@ -1,4 +1,7 @@ Affichage de l'historique ========================= -L'historique des actions est affiché en bas de l'écran. À chaque action d'une entité, comme frapper quelqu'un, ou lorsque le joueur parle à une entité, cela s'affiche dans l'historique. +L'historique des actions est affiché en bas de l'écran. À chaque action d'une entité, comme frapper quelqu'un, +ou lorsque le joueur parle à une entité, cela s'affiche dans l'historique. + +Il est affiché sur l'écran de jeu, en bas à gauche, occupant 1/5 de la hauteur et 4/5 de la largeur. diff --git a/docs/display/map.rst b/docs/display/map.rst index 749b32c..2b80be5 100644 --- a/docs/display/map.rst +++ b/docs/display/map.rst @@ -1,6 +1,13 @@ Affichage de la carte ===================== -La carte s'affiche dans la partie en haut à gauche de l'écran, sur la plus grande partie de l'écran. On affiche les tuiles une par une, selon le texture pack sélectionné. La map est actualisée à chaque action d'une entité. +La carte s'affiche dans la partie en haut à gauche de l'écran, sur la plus grande partie de l'écran. +On affiche les tuiles une par une. Selon le pack de textures utilisé, les tuiles prennent un ou deux caractères de large. +Selon la visibilité de la case en fonction de la position du joueur, la couleur de la case sera plus ou moins sombre, +voire masquée si le joueur n'a jamais vu la case. Les entités sont ensuite affichées, si elles sont dans le champ de +vision du joueur. -L'afffichage de la carte suit les déplacements du joueur. +La carte est actualisée lorsque cela est nécessaire, à chaque tick de jeu. + +L'afffichage de la carte suit les déplacements du joueur, dans le sens où la caméra est toujours centrée sur lui. +La carte prend 4/5 de l'affichage aussi bien en largeur qu'en hauteur. diff --git a/docs/display/menu.rst b/docs/display/menu.rst index 30c4e98..4282dc3 100644 --- a/docs/display/menu.rst +++ b/docs/display/menu.rst @@ -2,13 +2,16 @@ Affichage des menus =================== Les menus sont affichés dans une boîte. On peut naviguer dedans avec les flèches haut et bas, -et valider avec la touche entrée. +et valider avec la touche entrée. Il est également possible d'intéragir avec la souris. Il y a plusieurs menus dans le jeu : -* Le main menu, qui s'affiche au lancement du jeu. -* Le menu des paramètres : si on sélectionne un choix de touche et qu'on appuie sur entrée, on peut ensuite appuyer sur une touche pour remplacer la touche utilisée. -* Le menu des crédits : ce menu fonctionne avec la souris. En cliquant on affiche une image. -* Le menu d'inventaire : dans l'inventaire, on peut utiliser les touches pour utiliser un item ou l'équiper... -* Le menu de vente : on peut utiliser les touches gauche et droite pour switcher entre l'inventaire du joueur et celui du marchand. -* Menu des warnings : Pas vraiment un menu, mais affiche juste un message dans une petite boite pour prévenir le joueur que quelquechose ne va pas. +* **Le menu principal**, qui s'affiche au lancement du jeu. +* **Le menu des paramètres** : si on sélectionne un choix de touche et qu'on appuie sur entrée, + on peut ensuite appuyer sur une touche pour remplacer la touche utilisée. +* **Le menu des crédits** : ce menu fonctionne avec la souris. En cliquant on affiche une image. +* **Le menu d'inventaire** : dans l'inventaire, on peut utiliser les touches pour utiliser un item ou l'équiper... +* **Le menu de vente** : on peut utiliser les touches gauche et droite pour switcher entre l'inventaire du joueur + et celui du marchand. +* **Menu des warnings** : Pas vraiment un menu, mais affiche juste un message dans une petite boite pour prévenir + le joueur que quelque chose ne va pas. diff --git a/docs/display/stats.rst b/docs/display/stats.rst index e993c7f..9fc9075 100644 --- a/docs/display/stats.rst +++ b/docs/display/stats.rst @@ -4,7 +4,7 @@ Affichage des statistiques .. _Hazel: ../index.html Les statistiques du joueur sont affichées en haut à droite de l'écran -et séparées du reste de l'affichage par une barre verticale. +et séparées du reste de l'affichage par une barre verticale, occupant 1/5 de la place horizontale. Les informations affichées sont : @@ -23,4 +23,9 @@ Les informations affichées sont : * **Equipped armor** - le plastron porté par le joueur. * **Equipped helmet** - le casque porté par le joueur. * **Hazel** - le nombre d'Hazel_ que le joueur possède. -* **Vous êtes mort** - Éventuellement, si le joueur est mort. \ No newline at end of file +* **Vous êtes mort** - Éventuellement, si le joueur est mort. + +Si le joueur possède un `monocle <../entities/items.html#monocle>`_, alors les statistiques d'une entité proche sont +également affichées dessous. + +Des aides de jeu peuvent enfin être affichées en bas, telles que la touche sur laquelle il faut appuyer. From 1795d622945df4fdfe6f4d3693c3bdfd11347e65 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 10 Jan 2021 18:09:09 +0100 Subject: [PATCH 2/4] Update merchant prices --- docs/entities/friendly.rst | 18 +++++++++++++----- squirrelbattle/entities/items.py | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/entities/friendly.rst b/docs/entities/friendly.rst index 9fca40f..fdea174 100644 --- a/docs/entities/friendly.rst +++ b/docs/entities/friendly.rst @@ -42,13 +42,21 @@ En interagissant avec un marchand, il est possible de lui acheter et de lui vendre différents objets contre des Hazels, la monnaie du jeu. Les prix sont fixés : +* Anneau de coup critique : 15 Hazels +* Anneau d'expérience : 25 Hazels +* Arc : 22 Hazels +* Baguette de feu : 36 Hazels * Bombe : 4 Hazels -* Coeur : 3 Hazels -* Potion d'arrachage de corps : 14 Hazels -* Épée : 20 Hazels * Bouclier : 16 Hazels * Casque : 18 Hazels +* Coeur : 3 Hazels +* Épée : 20 Hazels +* Monocle : 10 Hazels +* Parchemin de dégâts : 18 Hazels +* Parchemin de faiblesse : 13 Hazels * Plastron : 30 Hazels +* Potion d'arrachage de corps : 14 Hazels +* Règle : 2 Hazels Le marchand commence avec 75 Hazels en sa possession, contre 42 pour le joueur. @@ -59,11 +67,11 @@ Dans le `pack de textures`_ écureuil, il est représenté par l'émoji ``🦜`` Trompette --------- -Son nom est fixé à 'trumpet'. Une trompette est un familier, c'est à dire que +Son nom est fixé à `trumpet`. Une trompette est un familier, c'est à dire que c'est une entité attaquante qui suit globalement le joueurs et attaque les monstres qui se rapprochent trop du joueur. -Elle a 20 point de vie et une attaque de 3. +Elle a 20 points de vie et une attaque de 3. Dans le `pack de textures`_ ASCII, elle est représentée par le caractère ``/``. diff --git a/squirrelbattle/entities/items.py b/squirrelbattle/entities/items.py index 94a9e36..f96381b 100644 --- a/squirrelbattle/entities/items.py +++ b/squirrelbattle/entities/items.py @@ -521,7 +521,7 @@ class ScrollofWeakening(Item): self.held_by.inventory.remove(self) -class LongRangeWeapon(Item): +class LongRangeWeapon(Weapon): def __init__(self, damage: int = 4, rang: int = 3, *args, **kwargs): super().__init__(*args, **kwargs) From 82421be8bb212400076a4c2ca3af9839ca717c0b Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 10 Jan 2021 18:16:01 +0100 Subject: [PATCH 3/4] Documentation on monocles --- docs/entities/items.rst | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/entities/items.rst b/docs/entities/items.rst index e4f1c0a..57f6a49 100644 --- a/docs/entities/items.rst +++ b/docs/entities/items.rst @@ -100,8 +100,8 @@ Plastron Le plastron est un objet que l'on peut trouver uniquement par achat auprès d'un marchand pour le coût de 30 Hazels. Il s'équippe sur le corps. -Une fois équipé, le casque ajoute 4 de -constitution à son porteur, lui permettant de prendre moins de dêgats. +Une fois équipé, le casque ajoute 4 de constitution à son porteur, +lui permettant de prendre moins de dêgats. Il est représenté par les caractères ``(`` et ``🦺``. @@ -118,4 +118,15 @@ Il y a plusieurs types d'anneaux : * **Anneau de coup critique**, qui augmente la chance de coup critique de 20%. Il coute 15 Hazels. * **Anneau de gain d'expérience amélioré**, qui multiplie le gain d'expérience du joueur par 2. Il coûte 25 Hazels. -Un anneau est représenté par les caractères ``o`` et ``💍``. \ No newline at end of file +Un anneau est représenté par les caractères ``o`` et ``💍``. + +Monocle +------- + +L'anneau est un objet que l'on peut trouver uniquement par achat auprès d'un +marchand pour le prix de 10 Hazels. Il s'équippe sur la main secondaire. + +Une fois porté, il permet de voir les caractéristiques des entités voisines +(nom, force, chance de critique, ...). + +Un monocle est représenté par les caractères ``ô`` et ``🧐``. From bc638b3becf49c52a004c7b0bfb278df9a7262d2 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 10 Jan 2021 18:42:26 +0100 Subject: [PATCH 4/4] Monocles can be found in chests --- docs/entities/items.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/entities/items.rst b/docs/entities/items.rst index 57f6a49..9ca1b39 100644 --- a/docs/entities/items.rst +++ b/docs/entities/items.rst @@ -124,7 +124,8 @@ Monocle ------- L'anneau est un objet que l'on peut trouver uniquement par achat auprès d'un -marchand pour le prix de 10 Hazels. Il s'équippe sur la main secondaire. +marchand pour le prix de 10 Hazels. On peut le trouver sinon dans les coffres. +Il s'équippe sur la main secondaire. Une fois porté, il permet de voir les caractéristiques des entités voisines (nom, force, chance de critique, ...).