Génération d'étage

De The Binding of Isaac: Rebirth Wiki
Aller à la navigation Aller à la recherche

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 Curse of the Labyrinth.png Fléau du Labyrinthe rend l'étage beaucoup plus grand.

  • Si l'étage n'est pas un XL ou Ajouté dans Afterbirth † 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.
    • Ajouté dans Repentance 1 impasse est ajoutée si Isaac a Tête Réduite Tête Réduite.

Ensuite, les salles spéciales sont générées dans les impasses.

Les salles spéciales sont générées dans l'ordre suivant:

  • Salle du Boss Salle du Boss (garantie).
    • Si l'étage est un XL, deux salles du boss seront générées côte-à-côte.
    • Ajouté dans Afterbirth † Plusieurs salles du boss sont générées dans Néant.
  • Salle Super Secrète Salle Super Secrète (garantie).
    • Ajouté dans Repentance Deux salles super secrètes sont générées si Isaac a Luna Luna.
  • Boutique Boutique (garantie pour les 3 premiers Chapitres).
  • Salle du Trésor Salle du Trésor (garantie pour les 3 premiers Chapitres).
  • Ajouté dans Repentance Planétarium 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é Salle de Dé ou Salle de Sacrifice 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 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 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 Antre du Diable cette partie).
    • Ajouté dans Repentance Une salle maudite additionnelle est générée à chaque étage si Isaac a Tête Réduite Tête Réduite. Une impasse supplémentaire est aussi générée pour pouvoir la placer.
  • Salle du Mini-Boss 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 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 Salle de Défi Royale dans le deuxième étage du chapitre et une salle de Défi normale autrement.
  • Coffre-Fort Coffre-Fort ou Salle d'Arcade 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.
    • Ajouté dans Repentance 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 Chambre Propre ou Chambre Sale 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 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 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.
    • Ajouté dans Afterbirth † Une salle secrète additionnelle sera générée si Isaac a Carte Scindée Carte Scindée.
    • Ajouté dans Repentance Une salle secrète additionnelle sera générée si Isaac a Luna Luna, 3 s'il a aussi la Carte Scindée.
  • Ajouté dans Repentance Salle Ultra Secrète Salle Ultra Secrète (garantie).
  • Ajouté dans Afterbirth † 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: Retiré dans Repentance 5 seulement / Ajouté dans Repentance 1-10 (1 et 10 sont plus rares)
      • 2ème étage du chapitre en mode difficile: Retiré dans Afterbirth † 10 / Ajouté dans Afterbirth † / Retiré dans Repentance 10-15 / Ajouté dans Repentance 5-15 (5 est plus rare)
      • Les étages XL comptent comme Retiré dans Repentance le 1er étage du chapitre / Ajouté dans Repentance les deux
      • Les chapitres 5 et 6 comptent comme Retiré dans Repentance le 1er étage du chapitre / Ajouté dans Repentance le 2ème
      • Néant en mode normal: 5-10 (Ajouté dans Repentance et 20)
      • Néant en mode difficile: 5-15 / Ajouté dans Repentance 5-20

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.