Génération d'étage
La génération d'étage est le processus que le jeu utilise pour créer chaque étage. Chaque étage a ses propres exigences de taille, du nombre de salles spéciales et du nombre d'impasses qu'il faut.
Processus
Premièrement, le jeu détermine combien de salles vont être générées dans l'étage. Les derniers étages ont plus de salles et Fléau du Labyrinthe rend l'étage beaucoup plus grand.
- Si l'étage n'est pas un XL ou
Néant:
- NombreDeSalles = 3.33 × ProfondeurÉtage + 5-6 (maximum de 20)
- Si l'étage est un XL:
- NombreDeSalles = 1.8 × (3.33 × ProfondeurÉtage + 5-6) (maximum de 45)
- Si l'étage est le Néant:
- NombreDeSalles = 50-59
- 2-3 salles en plus sont ajoutées si le joueur joue en mode difficile
- 4 salles en plus sont ajoutées si l'étage a Fléau de L'Égaré.
Puis le nombre minimum d'impasses que l'étage doit générer.
- Tous les étages doivent avoir au moins 5 impasses:
- 1 impasse est ajoutée à tous les étages sauf le premier.
- 1 impasse est ajoutée aux étages XL.
- 2 impasses sont ajoutées au Néant.
1 impasse est ajoutée si Isaac a
Tête Réduite.
Ensuite, les salles spéciales sont générées dans les impasses.
- Les salles spéciales sont placées dans l'ordre depuis l'impasse la plus loin de la salle de départ à la plus proche.
- Si toutes les impasses dans un étage sont occupées par des salles spéciales, plus aucune salle spéciale ne peut être générée.
Coffre,
Chambre Noire et
Néant génèrent seulement des
salles du boss et des
salles secrètes/
salles super secrètes (et un Cimetière dans la Chambre Noire).
Les salles spéciales sont générées dans l'ordre suivant:
Salle du Boss (garantie).
- Si l'étage est un XL, deux salles du boss seront générées côte-à-côte.
Plusieurs salles du boss sont générées dans
Néant.
Salle Super Secrète (garantie).
Deux salles super secrètes sont générées si Isaac a
Luna.
Boutique (garantie pour les 3 premiers Chapitres).
Aussi garantie dans le Chapitre 4 si Isaac a
Pièce d'Argent.
Aussi garantie dans le Chapitre 5 si Isaac a
Couronne Sacrée ou
Couronne Impure).
Ne sera pas générée dans les troisième Tour d'Honneur et plus.
Salle du Trésor (garantie pour les 3 premiers Chapitres).
Aussi garantie dans le Chapitre 4 si Isaac a
Couronne Sanglante.
Aussi garantie dans le Chapitre 5 si Isaac a
Couronne Sacrée ou
Couronne Impure).
- Si l'étage est un XL, deux salles du Trésor seront générées.
Planétarium (1% de chance de base d'être généré dans les 3 premiers chapitres mais ne sera pas généré au-delà. Éviter de rentrer dans les salles du Trésor et obtenir certains objets et babioles peuvent augmenter cette chance).
Salle de Dé ou
Salle de Sacrifice (1 chance sur 7 (~14%) de base, plus 1 chance sur 4 indépendante pour un total de 5 chances sur 14 (~36%) si la vie totale d'Isaac est égale ou plus grande que son nombre de réceptacles de cœur).
- Si une salle de Sacrifice est générée, elle a 1 chance sur 50 de base de devenir une salle de Dé, plus 1 chance sur 5 indépendante pour un total de 27 chances sur 125 (~22%) si Isaac a 2 clés ou plus.
Bibliothèque (1 chance sur 20).
- Le code regarde une variable spécifique qui est supposée augmenter les chances de génération de Bibliothèque si un livre a été touché mais cette variable n'est jamais définie.
Salle Maudite (1 chance sur 2, plus 1 chance sur 4 indépendante pour un total de 5 chances sur 8 (~63%) si Isaac est entré dans un
Antre du Diable cette partie).
Une salle maudite additionnelle est générée à chaque étage si Isaac a
Tête Réduite. Une impasse supplémentaire est aussi générée pour pouvoir la placer.
Salle du Mini-Boss (1 chance sur 4, plus 1 chance sur 3 indépendante pour un total d'une chance sur 2 (50%) si c'est le premier étage).
Salle de Défi (garantie si la vie totale d'Isaac est égale ou plus grande que son nombre de réceptacles de cœur. Ne sera pas générée autrement).
- Ne sera pas généré dans le premier étage et a 50% de chance dans le deuxième étage.
- Sera toujours une
Salle de Défi Royale dans le deuxième étage du chapitre et une salle de Défi normale autrement.
Coffre-Fort ou
Salle d'Arcade (garantie si Isaac a 5 pièces ou plus et que c'est le deuxième étage du chapitre. Ne sera pas générée autrement).
- Si une salle d'Arcade est générée, elle a 1 chance sur 10 d'être un Coffre-Fort à la place, plus 1 chance sur 3 indépendante pour un total de 2 chances sur 5 (40%) si Isaac a 2 clés ou plus.
Si Isaac a 2 clés ou plus mais moins de 5 pièces, un Coffre-Fort sera généré à la place. Si Isaac a 5 pièces ou plus mais moins de 2 clés et et si la chance sur 10 de devenir un Coffre-Fort passe, ni salle d'Arcade ni Coffre-Fort ne seront générés.
Chambre Propre ou
Chambre Sale (1 chance sur 50, plus 1 chance sur 5 indépendante pour un total de 27/125 (~22%) si Isaac a un demi-cœur rouge ou moins et pas de
cœur d'âme ou 1 cœur d'âme ou moins et aucun cœur rouge/d'os).
- Les chances d'avoir une chambre propre ou sale sont égales.
- Seront uniquement générées dans les 3 premiers Chapitres.
Salle Secrète (garantie).
- Chaque position potentielle a un poids de départ entre 10 et 14, réduit de 3 si elle n'a que 2 salles avoisinantes et réduit de 6 si elle n'a qu'une salle avoisinante. La position avec le plus de poids sera choisie.
- En pratique, cela veut dire qu'une salle secrète sera extrêmement susceptible d'avoir au moins 2 salles adjacentes, à moins que ce soit le premier étage, où occasionnellement une sera placée dans une impasse à cause du manque de position pour la placer.
- Ne sera jamais placée à côté d'une salle du boss, salle super secrète, une autre salle secrète ou la salle de départ si l'étage est le Coffre ou la Chambre Noire.
Une salle secrète additionnelle sera générée si Isaac a
Carte Scindée.
Une salle secrète additionnelle sera générée si Isaac a
Luna, 3 s'il a aussi la Carte Scindée.
- Chaque position potentielle a un poids de départ entre 10 et 14, réduit de 3 si elle n'a que 2 salles avoisinantes et réduit de 6 si elle n'a qu'une salle avoisinante. La position avec le plus de poids sera choisie.
Salle Ultra Secrète (garantie).
Un cimetière sera placé si l'étage est la Chambre Noire.
- Puis enfin, les salles normales sont choisies.
- Chaque salle a un niveau de difficulté, qui est choisi selon l'étage actuel du chapitre et si le joueur joue en mode difficile ou pas.
- 1er étage du chapitre en mode normal: 1-5
- 2ème étage du chapitre en mode normal: 5-10
- 1er étage du chapitre en mode difficile:
5 seulement /
1-10 (1 et 10 sont plus rares)
- 2ème étage du chapitre en mode difficile:
10 /
10-15 /
5-15 (5 est plus rare)
- Les étages XL comptent comme
le 1er étage du chapitre /
les deux
- Les chapitres 5 et 6 comptent comme
le 1er étage du chapitre /
le 2ème
- Néant en mode normal: 5-10 (
et 20)
- Néant en mode difficile: 5-15 /
5-20
- Chaque salle a un niveau de difficulté, qui est choisi selon l'étage actuel du chapitre et si le joueur joue en mode difficile ou pas.
Pseudo-Code
Certaines parties de la génération d'étage sont basées sur le pseudo-code suivant:
--Pseudo lua code pour le nombre de salles d'un étage. NumberOfRooms = Min(20, Rand(0, 1) + 5 + Floor(StageId * 10 / 3)) if CurseOfTheLabyrinth then NumberOfRooms = Min(45, Floor(NumberOfRooms * 1.8)) elseif CurseOfTheLost then NumberOfRooms += 4 end if StageId == 12 then --The Void NumberOfRooms = 50 + (Rand() % 10) end if IsHardDifficulty then NumberOfRooms += 2 + Rand(0, 1) end --Pseudo lua code pour le nombre d'impasses qu'un étage doit avoir. MinDeadEnds = 5 if StageId ~= 1 then MinDeadEnds += 1 end if CurseOfTheLabyrinth then MinDeadEnds += 1 end if StageId == 12 then MinDeadEnds += 2 end --Les impasses sont triées par la distance depuis la salle de départ. --Par exemple, la salle de boss dans l'impasse la plus loin, la super secrète est placée dans la prochaine impasse la plus loin. --DequeueDeadend redimensionne l'impasse. C'est important de le noter car cela veut dire que la plupart des impasses sont changées en une salle 1x1 à la fin. PlaceRoom(ROOM_BOSS, DequeueDeadend()) --Super Secret PlaceRoom(ROOM_SUPERSECRET, DequeueDeadend()) --Shop if StageId < 7 or (StageId < 9 and HasTrinket(SilverDollar)) and VictoryLap < 3 then PlaceRoom(ROOM_SHOP, DequeueDeadend()) end --Treasure if StageId < 7 or (StageId < 9 and HasTrinket(BloodyCrown)) then PlaceRoom(ROOM_TREASURE, DequeueDeadend()) end --Dice and Sacrifice if StageId < 12 then local deadend = DequeueDeadend() --resizes the room :( if deadend ~= nil then local roomType = nil if Rng() % 50 == 0 or (Rng() % 5 == 0 and GetNumKeys() > 1) then roomType = ROOM_DICE else roomType = ROOM_SACRIFICE end if Rng() % 7 == 0 or (Rng() & 3 == 0 and GetHearts() + GetSoulHearts() >= GetMaxHearts()) then PlaceRoom(roomType) else QueueDeadend(deadend) end end end --Bibliothèque local deadend = DequeueDeadend() if deadend ~= nil then if Rng() % 20 == 0 or (Rng() & 3 == 0 and GetStateFlag(STATE_BOOK_PICKED_UP)) then PlaceRoom(ROOM_LIBRARY, deadend) else QueueDeadend(deadend) end end --Salle Maudite local deadend = DequeueDeadend() if deadend ~= nil then if Rng() & 1 == 0 or (Rng() & 3 == 0 and GetStateFlag(STATE_DEVILROOM_VISITED)) then PlaceRoom(ROOM_CURSE, deadend) else QueueDeadend(deadend) end end --Mini-Boss local boss = GetMiniBossRoom() --mini boss is picked based on floor, STATE_ULTRAPRIDE_SPAWNED and rng local deadend = DequeueDeadend() if deadend ~= nil then if Rng() & 3 == 0 or (Rng() & 2 == 0 and StageId == 1) then PlaceRoom(boss, deadend) else QueueDeadend(deadend) end end --Salle de Défi local deadend = DequeueDeadend() if deadend ~= nil then if (Rng() & 1 == 0 or StageId > 2) and GetHearts() + GetSoulHearts() >= GetMaxHearts() and StageId > 1 then PlaceRoom(boss, deadend) else QueueDeadend(deadend) end end --Coffre-Fort et Arcade local deadend = DequeueDeadend() if deadend ~= nil then local roomType = nil if Rng() % 10 == 0 or (Rng() % 3 == 0 and GetNumKeys() > 1) then roomType = ROOM_CHEST else roomType = ROOM_ARCADE end if GetNumCoins() >= 5 and (StageId == 2 or StageId == 4 or StageId == 6 or StageId == 8) then PlaceRoom(roomType) else QueueDeadend(deadend) end end --Chambre if StageId < 7 then local deadend = DequeueDeadend() if deadend ~= nil then local roomType = nil if Rng() & 1 == 0 then roomType = ROOM_ISAACS else roomType = ROOM_BARREN end local maxHearts = nil if GetPlayerType() == PLAYER_THELOST or GetPlayerType() == PLAYER_XXX or GetPlayerType() == PLAYER_THESOUL then maxHearts = GetMaxHearts() else maxHearts = GetMaxHearts() + GetBoneHearts() * 2 end local second = false if (GetHearts() < 2 and GetSoulHearts() <= 0) or (maxHearts <= 0 and GetSoulHearts() <= 2) then second = true end if Rng() % 50 == 0 or (Rng() % 5 == 0 and second) then PlaceRoom(roomType) else QueueDeadend(deadend) end end end --Salle Secrète TryPlacingSecret() if HasTrinket(TRINKET_FRAGMENTED_CARD) or HasItem(ITEM_LUNA) then TryPlacingSecret() end --Cimetière if StageId == 11 and StageType == 0 then --Dark Room PlaceGrave(DequeueDeadend()) end
Notes
Ce code vient du dépôt GitHub de Blade. (Blade est aussi connu sous le nom de blcd / Will.) Il a fait de l'ingénierie inverse sur le jeu utilisant un désassembleur pour créer ce pseudo-code.