More docs #147

Merged
ynerant merged 5 commits from moredocs into EvenmoreDoc 2021-01-10 17:56:16 +00:00
8 changed files with 109 additions and 28 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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 :
@ -24,3 +24,8 @@ Les informations affichées sont :
* **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.
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.

View File

@ -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 ``/``.

View File

@ -103,8 +103,10 @@ Il est représenté par les caractères ``0`` et ``⛑️``.
Plastron
--------
Le plastron est un type d'armure que l'on peut trouver uniquement par achat auprès d'un marchand pour le coût de 30 Hazels ou dans un coffre. Il s'équippe sur le corps.
Une fois équipé, le casque ajoute 4 de constitution à son porteur, lui permettant de prendre moins de dégâts.
Le plastron est un type d'armure que l'on peut trouver uniquement par achat
auprès d'un marchand pour le coût de 30 Hazels ou dans un coffre. Il s'équippe sur le corps.
Une fois équipé, le casque ajoute 4 de constitution à son porteur,
lui permettant de prendre moins de dégâts.
Il est représenté par les caractères ``(`` et ``🦺``.
@ -123,6 +125,18 @@ Il y a plusieurs types d'anneaux :
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. 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, ...).
Un monocle est représenté par les caractères ``ô`` et ``🧐``.
Parchemin
---------

View File

@ -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)