Code et documentation du projet Odyssée
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

284 lines
14 KiB

2 years ago
2 years ago
  1. # Odyssée
  2. Odyssée est un jeu de rôle collaboratif regroupant une petite dizaine de personnes pour bâtir ce qui sera un des plus grand jeu de rôle jamais fait… Entre maps géante et gestion du gris, nous essayons de construire un jeu complet et propre.
  3. Avant de vous lancer dans la lecture attentive de cette petite bible du projet Odyssée, quelques notes…
  4. Ce document contient la documentation nécessaire à l'élaboration de ce projet commun, il doit donc être exhaustif. D'où l'interêt de modifier ce document au fur et à mesure de nos avancées.
  5. N'hésitez donc pas à modifier des parties entières si elles sont obsolètes ou erronées.
  6. Merci d'avance !
  7. Le [Framapad de l'équipe](https://mypads.framapad.org/mypads/?/mypads/group/odyssee-8dyaa7jo/view) sert à éditer des textes à plusieurs et en temps réel. Utile pour mener des débats autour du projet, mais aussi dans l'élaboration des articles pour la RdP.
  8. ### Intrigue
  9. Vous êtes aubergiste, comme votre père avant vous. Votre mère est morte à votre naissance et votre père vient de s'éteindre dans sa gargote à Cirtes… Sur le chemin de la capitale d'Erb-Hugoul, l'hypothèse d'une mort naturelle s'évade pour laisser place à des choses plus sombrese encore… Vous devrez remonter les indices laissés par feu votre père pour décourvrir la vérité, quitte à faire remonter des démons que tous croyaient enfouis depuis longtemps… Saurez vous déjouer les pièges que vous tendront vos ennemis invisibles ? A faire face à des êtres oubliés et pourtant jamais aussi omniprésent ? A mettre au jour une vérité niée ?
  10. ## L'équipe
  11. L'équipe doit être constitué d'un nombre réduit de personnes avec des tâches définies qui conviennent à tous le monde. Les différentes fonctions sont cumulables, mais il faut veiller à ce que chacun ait quelque chose à faire qui lui plait et que personne ne fasse tout.
  12. ### Répartition de l'équipe
  13. Il y a besoin de :
  14. - ~~Programmeur~~ (pas pour l'instant)
  15. - ~~Graphiste~~ (pas pour l'instant)
  16. - ~~Scénariste~~ (pas pour l'instant)
  17. ### Rôles des membres de l'équipe
  18. #### Les programmeurs
  19. Les programmeurs sont chargés du gitea et du code du projet, ceux-ci doivent rester à l'écoute des scénaristes et des graphistes de manière à rester dans l'esprit du jeu. Ils sont chargés de programmer le jeu et ses moteurs. Ils seront amené à coder les moteurs proposés par les scénaristes ainsi que les moteurs physiques des graphistes. Ces moteurs seront élaborés par l'équipe pour le jeu et devront s'adapter aux contraintes.
  20. #### Les graphistes
  21. Les graphistes sont à la recherches du design du jeu, avoir des objets petits, qui évoquent des choses au joueur. Ils doivent pouvoir communiquer avec les scénaristes et les programmeurs pour permettre une meilleur expérience de jeu, quitte à modifier le scénario pour que les graphismes soit le mieux possible. Il seront également en charge de faire des animations notamment lors des cinématiques du jeu, déterminées avec les scénaristes et les programmeurs.
  22. Les graphistes doivent être en mesure de se servir du git et d'être capable de modifier les sources qui touchent aux images pour avancer rapidement dans le projet. Les graphistes seront à même de concevoir le moteur de physique du jeu en théorie et de l'expliquer.
  23. #### Les scénaristes
  24. Les scénaristes doivent créer le scénario. Ils géreront également l'avancée du scénario et choisiront les points clés. Les dialogues seront élaborés par eux ainsi que les rencontres (combat, PnJ,…). Les quêtes du jeu seront planifiées par eux. Ils devront rester en contact avec les dessinateurs et les programmeurs de manière à rester dans les limites du jeu et de l'équipe.
  25. ### Les membres de l'équipe
  26. - KikooDX (Programmeur)
  27. - Shadow15510 (Scénariste, Graphiste)
  28. - Rader (Graphiste)
  29. - Massena (Graphiste, Scénariste)
  30. - Leno (Programmeur)
  31. - Milang (Programmeur)
  32. - Filoji (Graphiste)
  33. - Math680 (Programmeur)
  34. ## Le cahier des charges et tâches
  35. Se trouve ici toutes les indications pour la réalisation du projet. Ce document servira donc de référence.
  36. ### Les sprites
  37. - Taille des tiles : 24 par 24
  38. - Taille du personnage : ?
  39. - Couleurs : 16 bits R5 G6 B5
  40. ### Le code
  41. - Taille maximale : ∞
  42. - Langage utilisé : C
  43. - Compatiblité : Graph 90+E
  44. - Outil : Gint
  45. ### TODO list
  46. #### Code
  47. 1. [ ] Architecture du code à préciser
  48. 3. [ ] Appliquer le début du jeu : écran d'acceuil
  49. 4. [ ] Faire le moteur de lecture de la map et des collisions
  50. 5. [ ] Prendre des renseignements sur la gestion du clavier par timer et l'appliquer
  51. 6. [ ] Gérer l'affichage de la map
  52. 7. [ ] Faire le moteur de combat du jeu
  53. 8. [ ] Concevoir le système des interactions
  54. #### Graphismes
  55. 1. [ ] Faire les tiles de base du jeu
  56. 2. [ ] Faire le personnage principal
  57. 3. [ ] Dessiner le mobilier
  58. 4. [ ] Faire les monstres animés
  59. 5. [ ] Continuer les artéfacts
  60. 6. [ ] Constituer les designs des maps
  61. 7. [ ] Faire la carte du monde du jeu (esquisse à la main dispo dans le second dépôt archivé)
  62. 8. [ ] Faire des PnJ (animés ou pas)
  63. 9. [ ] Concevoir les interfaces utilisateurs et l'écran d'accueil
  64. 10. [ ] Concevoir une police
  65. #### Scénario
  66. 1. [ ] Faire le scénario
  67. 2. [ ] Isoler les points-clés
  68. 3. [ ] Revoir ou créer les dialogues
  69. 4. [ ] Continuer à accumuler des idées diverses
  70. #### Général
  71. 1. [ ] Décider des cinématiques : endroit, actions,… etc
  72. 2. [ ] Constituer une équipe
  73. 3. [ ] Continuer la doc
  74. ## Architecture du code
  75. ```
  76. Auto-chargement du dossier de sauvegarde (sinon, nouvelle partie)
  77. |
  78. |
  79. Lancement du jeu
  80. |
  81. +-- Ecran d'accueil (on attend une touche pressée, Si [EXIT] on quitte le jeu)
  82. |
  83. +-+
  84. | |-+ timer et gestion du clavier (et si il y a un input :)
  85. | | |
  86. | | +-- Test de la map (voire interaction s'il y a)
  87. | | |
  88. | | +-- Mise à jour de la map en cas de sortie de l'écran
  89. | |
  90. | +-- Déplacement des IAs (Adversaires)
  91. | |
  92. | +-- Rafraichissement de l'écran
  93. | |
  94. | +-+ Touches spéciales
  95. | | |
  96. | | +-- Ecran statistique (quête en cours, capacité du joueur, nom, argent,…)
  97. | | |
  98. | | +-- Sortie du jeu : sauvegarde et retour à l'écran d'accueil
  99. | |
  100. | +-- On retourne au timer
  101. |
  102. +-- Fin du jeu
  103. ```
  104. La gestion du timer pour le clavier est extrêmement importante ! Elle va permettre un système de combat en temps réel proche des RpG classiques.
  105. ## Gestions des maps
  106. ### Le principe de 'matrice virtuelle'
  107. #### Théorie
  108. Lorsque vous êtes dans une map, une matrice représente l'écran et affiche les éléments du décors avec cette matrice.
  109. Lorsque vous quittez cette map, vous arrivez en toute logique dans… une autre map ! (Si si ça marche !!) Et c'est cette gestion qui m'intéresse.
  110. #### Représentation
  111. Vous avez ci-dessous une matrice qui représente toutes le maps du jeu et l'aggrandissment montre une map du jeu :
  112. ```
  113. +--Matrice de toutes les map du jeu
  114. |
  115. v
  116. +-+-+-+-+-+ +-+-+-+-+-+-+-+
  117. | | | | | | / | | | | | | | | <-- Matrice d'une map du jeu
  118. +-+-+-+-+-+/ +-+-+-+-+-+-+-+
  119. | | | | |X| | | | | | | | |
  120. +-+-+-+-+-+\ +-+-+-+-+-+-+-+
  121. | | | | | | \ | | | | | | | |
  122. +-+-+-+-+-+ +-+-+-+-+-+-+-+
  123. ```
  124. La matrice qui contient toutes les map du jeu sait dans quelle map on est grâce au couple (x ; y) unique de la map en cours. Mais les cases de la matrice ne servent à rien. Donc on peut enlever la matrice et garder uniquement le couple x y pour savoir dans quelle map on est. Par un emboîtement de `switch` on retrouve quelle map il faut afficher.
  125. À partir de là on remplit la matrice qui contient l'écran et on l'affiche par deux `for` imbriqués.
  126. ### Le moteur physique du jeu
  127. #### Principe
  128. #### Code commenté sur un exemple
  129. ## Tiles du jeu
  130. Il existe trois type de dessins :
  131. - Le joueur (8x12): 8 dessins de marche normale animée (deux pour chaque direction), 4 dessins avec épée (un par direction)
  132. - Les éléments du décors (8x8): murs, fenêtres, portes, toits, plante, poteaux, pancarte et autres dessins qui serviront à créer les décors du jeu.
  133. - Les objets (8x8): petits dessins qui seront utilisés lors de récompense de combat, d'achat ou autre interaction rapportant des objets ou autre chose.
  134. ## Les capacités
  135. ### Du joueur
  136. Le joueurs a trois capacités distinctes :
  137. - Les points de Vie
  138. - Les points de Force
  139. - Les points d'Expérience
  140. Les points de Vie caractérisent la santé physique du joueurs ainsi, si cette capacité est à 0, le joueur perd 1 point de Force et récupère 3 points de Vie. Si il est à 0 point de Vie et 0 point de Force, il a perdu. Les points de Vie peuvent chuter à la suite d'un combat et augmenter suite à la découverte de cœurs (coffre, achat)
  141. Les points de force peuvent augmenter grâce à des potions trouvées ou achetées.
  142. Les points d'Xp permettent de débloquer des parties du jeu ou des dialogues, le joueur peut consulter son Xp à titre d'indice sur son avancé dans le jeu. Cette capacité peut augmenter suite à un combat, un dialogue, une action, … etc
  143. ### Des Adversaires
  144. Les Adversaires ont des Points de Vie et de Force. Ces points symbolisent les mêmes choses, mais les capacités des Adversaires ne peuvent pas augmenter. Seulement diminuer lors d'un combat.
  145. ### Les bornes
  146. Les capacités doivent avoir des bornes, Pour la vie [0 ; 20] semble être fonctionnel. Les points de Forces sont plus flous pour l'instant.
  147. L'expérience maximale dépendra de l'usage que l'on en fera dans le jeu, ce nombre sera donc fixé à la fin.
  148. Les monstres ! Les capacités aléatoire des monstres c'est pas top, donc je propose d'avoir plusieurs monstres différents et en fonction de l'image affichée (donc du n° contenu dans la matrice) on affecte certaines capacités au monstre en présence.
  149. Après quelques tests, je trouve 4 schémas de monstres, du plus gentil au plus dur avec la récompense entre parenthèse en rubis :
  150. > Niveau 1 : 4 Pv / 2 Pf (+2 rubis) -> 2
  151. > Niveau 2 : 6 Pv / 6Pf (+4 rubis) -> 2 dés
  152. > Niveau 3 : 7 Pv / 10 Pf (+6 rubis) -> 3 dés
  153. > Niveau 4 : 12 Pv / 14 pf (+6 rubis) -> 3 dés
  154. le nombre de dé est indiqué ici mais peut être calculé par la formule donnée dans [Les combats](https://gitea.planet-casio.com/Equipe_Odyssee/Odyssee#le-probl%C3%A8me-du-nombre-de-d%C3%A9) :
  155. Exemple :
  156. ```
  157. 4 Pv
  158. 2 + int(Pv / 7)
  159. 2 + int(4 / 7)
  160. = 2 + 0
  161. = 2 dés
  162. ```
  163. ## Les combats
  164. C'est un peu complexe car je mélange des techniques de moteurs de combat qui tiennent et du RpG en temps réel et du combat au tour par tour.
  165. ### Comment les combats se déclenchent ?
  166. Les Adversaires se déplacent avec le timer, si aucune touche n'est pressée. Si la case où veut aller l'Adversaire est occupée par le joueur, cela déclenche un combat.
  167. À l'inverse, si le joueurs frappe un case occupée par un Adversaire ou essaie de se rendre sur une case déjà occupée par un Adversaire, cela déclenche également un combat.
  168. Ça c'est pour la partie 'temps réel'.
  169. ### Comment se fait le combat d'un point de vue du code ?
  170. À chaque combat, le programme récupère les points de Vie et de Force du joueur et de l'Adversaire, et il fait une somme `S` pour chacun des deux protagonistes telle que :
  171. `S = Pts de Force + dé`
  172. Où 'dé' est une variable qui contient le plus haut résultat obtenu au lancer de dé. Ce lancer est simulé par le programme qui prend un nombre au hasard entre 1 et 6 un nombre déterminé de fois. Ce nombre de lancer dépend directement du niveau de vie du joueur (ou de l'Adversaire qui est soumis aux même règles).
  173. Donc, les deux combattants ont chacun une somme qui leurs est attribuée. Par convention et par soucis de simplicité, on notera `Sj` la somme du joueur et `Sa` la somme de l'Adversaire. On calcule ensuite la différence D entre ces deux sommes :
  174. `D = Sj - S`
  175. Si `D < 0` l'Adversaire est plus fort donc le joueur perd D Points de Vie. A l'inverse, si `D > 0` l'Adversaire perd la différence.
  176. Ses calculs se font dans le dos du joueur qui ne voit rien sinon qu'il frappe un ennemis qui le frappe aussi. Les combats peuvent donc se retourner contre le joueur : il peut attaque mais perdre des points de Vie.
  177. L'avantage de ce système somme toute relativement simple est qu'il prend en compte l'état de santé du joueur ce qui poussera celui-ci à la prudence : ne pas faire de combat avec peu de vie. En effet du point de vue du code, avoir peu de Vie équivaut à peu de simulation de lancer de dés, donc il y a moins de chance d'avoir le dessus.
  178. ### Subtilité des combats
  179. On peut par exemple prévoir une potion ou un sort qui permettrait de multiplier par deux le score du dé.
  180. Cette partie du jeu (sorts et potions) n'est pas encore ébauchée.
  181. Vu que le nombre le lancer dépend de la vie une vie extrêmement élevée donnera beaucoup de dé. Cela pourrait rendre les combats rébarbatif par une victoire certaine. C'est pourquoi, il faut maintenir un faible niveau de vie en se détachant des '100 Pv' traditionnel. On pourrait opter pour un nombre compris entre 0 et 20.
  182. ### Le problème du nombre de dé
  183. En supposant que le nombre de dé soit égal au points de Vie divisé par 5. Si le joueur a 4 points de Vie, il ne peut plus gagner de combats ce qui serait très vite rageant. D'où l'interêt de rajouter un (ou deux) dé(s) gratuit et indépendant des points de Vie de manière à garantir un succès minimum même avec très peu de points de vie. Des premiers tests ont été satisfaisants avec cette formule :
  184. `Nbr de lancer de dé = 2 + int (Pts de vie / 7) avec la vie comprise dans l'intervalle [0 ; 20]`
  185. L'écran des statistiques affiche les points de Force, de Vie, et d'Xp sur une barre. Il est donc indispensable d'avoir un maximum dans ces 3 capacités.