Je voudrais archiver ici mes réflexions et apprentissages durant le développement de ce projet.
Description du projet
Faire un roguelike, un jeu dâexploration de donjon en TypeScript avec plusieurs moteurs de rendu. Le moteur de jeu Ă©tant commun Ă tous les moteurs de rendu.
Mes buts sont :
- Apprendre plus TypeScript dont je ne connais que les bases
- Apprendre Ă utiliser node pour faire des interfaces CLI
- Apprendre Ă utiliser Phaser
- Mâamuser
Moteur de jeu
Actuellement les fonctionnalités planifiées sont :
- Génération aléatoire de niveau : https://roguebasin.com/index.php/Basic\_BSP\_Dungeon\_generation
- Utilisation de niveaux prédéfinis
- Zones visibles, zones visités
- Points de vie
- Armure / Arme
- Inventaire
- Nourriture / items
- Ennemis
- Expérience
- PNJ
- Sources de lumiĂšre
- Sources de son
Moteurs de rendu
Actuellement les moteurs de rendu planifiés sont :
- ASCII comme le rogue classique
- Vue 2D plate

- Vue isométrique à la Diablo https://phaser.io/examples/v3.85.0/tilemap/isometric/view/create-isometric-manually

- Vue 3D Ă la Lands of Lore: The Throne of Chaos

- Vue 3D Ă la DOOM https://phaser.io/news/2026/04/twopointfive-pseudo-3d-phaser-3-plugin

- Vue 3D https://enable3d.io/

Journal
2026/04/06
Début du projet.
Pour commencer je vais développer en parallÚle le moteur de rendu ASCII et le moteur de jeu mais ensuite il faudra les séparer en module avec des dépendances séparées.
Packages
Pour utiliser un package dans TypeScript via import il faut aussi installer le package @types/[package] :
npm install --save readline-sync
npm install --save-dev @types/readline-sync--save-dev car on nâen a besoin que pour le dĂ©veloppement. En production on a directement du JavaScript donc on utilise le package directement.
Ce qui permet de faire
import * as readline from 'readline-sync';Pour lâinstant le moteur de rendu va utiliser node pour lâaccĂšs au terminal, readline-sync pour la gestion des touches, chalk pour la couleur de texte. Donc package.json ressemble Ă
{
"dependencies": {
"chalk": "^5.6.2",
"readline-sync": "^1.4.10"
},
"devDependencies": {
"@types/chalk": "^0.4.31",
"@types/node": "^25.5.2",
"@types/readline-sync": "^1.4.8"
}
}Edit: finalement readline-sync nâest pas utile. Je nâarrivais pas Ă faire fonctionner les flĂšches avec et readline, de base dans node, fonctionne bien.
Donc pour lâinstant
- les deux moteurs sont bien sĂ©parĂ©s, il nây a que les dĂ©finitions des interfaces qui sont communes mais on verra cela plus tard.
- Le moteur de jeu créé un niveau vide, je regarderai la génération des salles plus tard mais il gÚre déjà les différentes tuiles et différentes entités
- Le moteur de rendu affiche le niveau, les entités capture les appuis sur les flÚches, transmet au moteur de jeu qui gÚre les déplacements et demande un nouveau rendu.
2026/04/08
Le mot âdungeonâ est un faux ami qui signifie âcachotâ. Je pensais quâil y avait une confusion entre un niveau du donjon, appelĂ© âdungeonâ et le donjon tout entier mais le monde du jeu est un ensemble de cachots, au sens large, que le joueur explore. Câest aussi pour cela que le joueur descend, il va dans des cachots de plus en plus profonds et dangereux.
https://github.com/halftheopposite/bsp-dungeon-generator créé des donjons trÚs avancés. Idées à retenir :
- roomTemplate : les monstres et objets ne peuvent pas apparaitre dans nâimporte quelle salle. Comme une plante au fond dâune cave ou un troll des caverne dans un chateau. ça permet de lister les possibilitĂ©s dâune salle pour quâelle reste logique.
- seed: pour sauvegarder un monde il suffit dâenregistrer la seed qui a Ă©tĂ© utilisĂ©e pour le gĂ©nĂ©rer.