Donjons générés
Un donjon généré n'a pas de monde modèle. Vous construisez une fois de petites salles, vous décrivez comment elles se raccordent, et un générateur assemble un nouvel agencement pour chaque partie : d'une salle de départ, en passant par des salles normales, au trésor et secrètes, jusqu'à une salle de boss.
Les donjons fixes et générés partagent les mêmes parties, menus, coffres, PNJ, mobs, événements et facts. Seule change la provenance des salles.
Les pièces
| Pièce | Entrée | Ce que c'est |
|---|---|---|
| Type de porte | Dungeon Connector Type | La taille de l'ouverture d'une porte, le bloc qui scelle une porte inutilisée, et les types qui peuvent être reliés. |
| Salle | Dungeon Room Template | Une structure enregistrée (une structure Paper .nbt conservée comme artifact) avec sa catégorie, ses portes et ses marqueurs. |
| Pool | Dungeon Room Pool | Une liste pondérée de modèles de salles. |
| Générateur | Dungeon Generator | Les règles : quels pools, combien de salles, à quelle profondeur se trouve le boss, à quelle fréquence un chemin se ramifie. |
| Affixe | Dungeon Affix | Un modificateur de la partie tiré au hasard, comme « mobs rapides ». |
| Donjon | Dungeon Instance | Son champ generator en fait un donjon généré. |
En construire un, pas à pas
- Types de porte. Ajoutez au moins un Dungeon Connector Type. Définissez ses
widthetheight(3 sur 3 par défaut), lesealBlockqui ferme une porte inutilisée (minecraft:stone_brickspar défaut) et, si vous avez plusieurs types,compatibleWith. Un type peut toujours être relié à lui-même. - Salles. Pour chaque salle, ajoutez un Dungeon Room Template et utilisez l'éditeur en jeu pour capturer ses blocs et placer ses portes et ses marqueurs. Choisissez sa
category. - Pools. Ajoutez un Dungeon Room Pool pour les salles de départ, un pour les salles de boss, un (ou plusieurs) pour les autres salles, et éventuellement un pour les couloirs. Un pool de départ, de boss ou de couloir ne contient que des modèles de cette catégorie. Un pool normal peut mélanger des modèles
NORMAL,TREASUREetSECRET. - Générateur. Ajoutez un Dungeon Generator et définissez
startPool,bossPool, éventuellementcorridorPool, etnormalPoolsavec un poids chacun. - Donjon. Sur votre Dungeon Instance, définissez
generator. LaisseztemplateWorldvide : un donjon généré n'a pas de monde modèle. L'isolation doit êtreAUTOouWORLD_PER_RUN. - Logique de jeu. Utilisez les déclencheurs
onEnteretonCleardes modèles de salles, les marqueurs TRIGGER, les événements de salle, les entrées Dungeon Mob Spawn sur les marqueurs MOB, et terminez la partie avec Dungeon Complete.
Si les pools et les modèles ne peuvent pas produire un donjon, le lancement est refusé et le journal du serveur en donne la raison (par exemple un pool sans salle de départ, ou un modèle sans capture lisible). Le champ messages du générateur contient les raisons qui vous sont signalées, à vous l'auteur. Le joueur ne voit qu'un court texte tiré des snippets content.dungeon_generated.refusal.setup (les pools et les modèles ne peuvent pas produire un donjon) et content.dungeon_generated.refusal.paste (les salles n'ont pas pu être collées), que vous pouvez modifier dans le panel web. Rien n'est prélevé. La ligne qui annonce les affixes d'une partie est le snippet content.dungeon_generated.affix.announcement.
Catégories de salles
La category d'un modèle de salle indique le rôle qu'il peut jouer.
| Catégorie | Rôle |
|---|---|
START | La partie commence ici. Une par donjon. Elle doit contenir un marqueur SPAWN. |
NORMAL | Une salle ordinaire. |
TREASURE | Toujours sur une branche, jamais sur le chemin vers le boss. |
CORRIDOR | Insérée entre deux salles qui ne peuvent pas se toucher directement. |
SECRET | Toujours une impasse. |
BOSS | La dernière salle. Une par donjon. |
Les salles sont reliées porte à porte : une salle sans porte ne peut donc être qu'un START en impasse. Une porte avec required activé doit être reliée à une autre salle : un modèle qui ne peut pas remplir toutes ses portes requises n'est jamais utilisé. Une porte que personne n'a franchie est fermée avec le sealBlock de son type.
Marqueurs
Un marqueur est un point d'intérêt à l'intérieur d'une salle. Chacun a un kind :
| Type | Ce qu'il fait | Champ à remplir |
|---|---|---|
SPAWN | Où les joueurs apparaissent au début de la partie. Seul le premier SPAWN de la salle de départ est utilisé. | aucun |
CHEST | Un coffre de butin est placé ici. Sa position et son yaw remplacent la position de l'entrée. Un coffre nommé par un marqueur est toujours placé, même si son entrée est en manualMode. | chest : un Dungeon Loot Chest |
TRIGGER | Les déclencheurs sont lancés pour le joueur qui atteint la salle. | triggers |
NPC | Un Dungeon NPC Instance se tient ici, montré aux membres de la partie. | npc |
MOB | Un Dungeon Mob Spawn fait apparaître ses mobs ici, la première fois qu'un membre de la partie entre dans la salle. | mob |
Le yaw d'un marqueur oriente un coffre (il fait face au yaw) et un PNJ (il regarde vers lui). Le marqueur est relié à son entrée par sa place dans la liste markers.
Les salles en jeu
Quand un joueur entre dans une salle d'un donjon généré, les déclencheurs onEnter de son modèle se lancent, puis les déclencheurs de ses marqueurs TRIGGER et les mobs de ses marqueurs MOB. Avec enterOnce activé (la valeur par défaut des modèles), ils ne se lancent que la première fois que chaque joueur entre dans la salle au cours d'une partie.
Les déclencheurs onClear se lancent une fois par partie quand une action Dungeon Clear Room s'exécute pendant que le joueur se trouve dans la salle. La plateforme ne décide jamais seule qu'une salle est vidée : c'est vous qui le décidez, par exemple depuis l'événement de mort d'un mob quand le dernier monstre meurt.
Les déclencheurs d'une salle lisent ces valeurs dans le contexte (avec une interaction_context_variable) :
| Clé | Valeur |
|---|---|
RUN_ID | Id de la partie. |
SEED | Graine du donjon, en décimal. |
ROOM | Numéro de la salle : 0 est la salle de départ, puis dans l'ordre où le générateur les a placées. |
ROOM_TEMPLATE | Id de l'entrée du modèle de salle. |
DIFFICULTY | Le difficulty du générateur. |
POSITION | Le bloc du marqueur pour un marqueur TRIGGER, sinon la position du joueur. |
Les déclencheurs d'un affixe ne lisent que RUN_ID, SEED et DIFFICULTY. Un donjon fixe ne fournit aucune de ces clés.
Graines, affixes et difficulté
La même graine donne toujours le même donjon : un agencement peut donc être rejoué. Une nouvelle graine est tirée pour chaque partie. La graine est enregistrée avec la partie, de sorte qu'un rechargement reconstruit le même donjon en mémoire. S'il ne peut pas être reconstruit, la partie est fermée au démarrage au lieu d'être adoptée avec des salles que personne ne connaît.
Les affixes sont tirés après l'agencement, parmi les affixes du générateur selon leur weight, affixCount d'entre eux sans répétition. Le tirage suit la graine mais ne change jamais l'agencement. Leurs modificateurs et déclencheurs s'appliquent à chaque membre au démarrage de la partie.
difficulty n'est qu'un nombre transmis à vos déclencheurs par le contexte : il ne change pas l'agencement par lui-même.
Réglages du générateur qui comptent
| Champ | Par défaut | Notes |
|---|---|---|
minRooms, maxRooms | 6, 10 | Nombre total de salles, départ et boss compris, couloirs exclus. Plage autorisée : 2 à 256. |
minBossDepth | 3 | Le boss est à au moins ce nombre d'étapes du départ. |
branchRatePercent | 40 | Probabilité, en pourcentage, qu'une salle située au-delà du chemin principal ouvre une branche latérale. |
quotas | aucun | Bornes sur le nombre de salles NORMAL, TREASURE et SECRET. Une catégorie sans borne est illimitée. |
trialBudget, replans | 20000, 5 | L'effort que fait la recherche avant d'échouer. Le budget d'essais multiplié par (replans + 1) doit rester inférieur ou égal à 5 000 000. |
baseY | 64 | Hauteur du sol de la salle de départ dans le monde de la partie. |
roomsPerTick | 4 | Salles collées par tick du serveur. Plus bas garde les ticks courts ; plus haut va plus vite. |
pasteTimeoutSeconds | 120 | Passé ce délai, le lancement est annulé, le coût remboursé et le monde jeté. |
naturalSpawning | off | Les monstres et les animaux apparaissent d'eux-mêmes dans le monde de la partie. Désactivé par défaut. |
verticalMargin | 1.0 | Blocs ajoutés au-dessus du plafond et sous le sol de chaque salle pour décider si un joueur est à l'intérieur. |
paster | STRUCTURE | Utilise l'API de structures de Paper : aucun autre plugin n'est nécessaire. |
Un modèle de salle fait au plus 256 blocs sur chaque côté, avec au plus 64 portes et 1024 marqueurs.
L'éditeur en jeu
Ouvrez un Dungeon Room Template dans le panel web et cliquez sur l'éditeur de contenu du champ artifactId. Vous obtenez un jeu d'outils dans votre barre rapide :
| Outil | Usage |
|---|---|
| Baguette de coins | Clic gauche sur un bloc pour le coin A, clic droit sur un bloc pour le coin B. |
| Capture | Enregistre les blocs de la boîte comme structure du modèle. |
| Outil de porte | Clic droit sur un bloc d'un mur pour ajouter une porte (le bloc est le centre bas de l'ouverture). Clic gauche pour retirer les portes à cet endroit. |
| Type de porte | Clic droit pour le type de connecteur suivant, clic gauche pour le précédent. |
| Bascule requis | Bascule le caractère requis des prochaines portes. |
| Outil de marqueur | Clic droit sur un bloc pour ajouter un marqueur devant lui. Clic gauche pour retirer les marqueurs à cet endroit. |
| Type de marqueur | Clic droit pour le type suivant, clic gauche pour le précédent. |
| Enregistrer | Écrit les portes et les marqueurs dans l'entrée. |
Une barre de boss affiche la taille de la boîte, le nombre de portes et de marqueurs, et si vous avez du travail non enregistré. La taille de la salle est lue depuis la structure enregistrée, jamais saisie. Vous devez créer et publier au moins un type de connecteur avant de pouvoir ajouter une porte.
Les captures ignorent les entités par défaut, car une entité vivante change la salle à chaque capture et revient comme un mob isolé dans chaque copie. Ces comportements et tous les textes de l'éditeur sont des snippets Typewriter sous content.dungeon_room_template., que vous pouvez donc modifier ou traduire dans le panel web :
| Snippet | Par défaut | Signification |
|---|---|---|
capture.include_entities | false | Indique si une capture enregistre les entités de la boîte. |
capture.max_volume | 262144 | Nombre maximal de blocs lus par une capture. Elle est lue en un seul tick du serveur : une très grande boîte monopolise ce tick. |
capture.timeout_seconds | 30 | Secondes d'attente d'une capture avant d'abandonner. |
sound.confirm | entity.experience_orb.pickup | Son après une capture ou un enregistrement. Vide : aucun. |
Limites et bonnes pratiques
- Les donjons générés n'utilisent que
WORLD_PER_RUN: chaque partie crée un monde et le supprime ensuite. - L'éditeur des salles fixes (nœuds) a ses propres snippets sous
content.dungeon_room.(messagesnode.*,save.*,editor.*, outilstool.add,tool.remove,tool.save). - Construisez les salles de sorte que deux portes reliées du même type s'alignent. Une largeur d'ouverture paire a son bloc supplémentaire du côté du x ou du z le plus élevé du modèle. Le générateur décale une salle d'un bloc quand une ouverture paire l'exige.
- Tout le donjon doit tenir entre le bloc le plus bas et le plus haut du monde, en comptant à partir de
baseY. - Ne comptez pas sur un nombre fixe de salles : utilisez des marqueurs et des événements plutôt que des numéros de salle.