Level generation is the process the game uses to create each floor. Each floor has its own requirements of size, special rooms, and dead ends that must be met.
Process[ | ]
First, the game determines how many rooms will generate on the floor. Later floors have more rooms, and Curse of the Labyrinth makes the floor much larger.
- If the floor is not XL or The Void:
- NumberOfRooms = 3.33 × FloorDepth + 5-6 (maximum of 20)
- If the floor is an XL floor:
- NumberOfRooms = 1.8 × (3.33 × FloorDepth + 5-6) (maximum of 45)
- If the floor is The Void:
- NumberOfRooms = 50-59
- 2-3 more rooms are added if playing on Hard Mode
- 4 more rooms are added if the floor has Curse of the Lost.
Then the minimum number of dead ends the floor must generate is set.
- All floors have at least 5 dead ends:
- 1 dead end is added to all floors except the first floor.
- 1 dead end is added to XL floors.
- 2 dead ends are added to The Void.
- 1 dead end is added if Isaac has Voodoo Head.
Next, special rooms are generated in dead ends.
- Special rooms are placed in order from the dead end farthest from the starting room to the closest.
- If all dead ends on a floor become occupied by special rooms, no more special rooms can generate.
- Chest, Dark Room, and The Void only generate Boss Rooms and Secret Rooms/Super Secret Rooms (and a Grave Room in the Dark Room).
Special rooms generate in the following order:
- Boss Room (guaranteed).
- If it is an XL floor, two boss rooms will be generated back to back.
- Multiple Boss Rooms are generated in The Void.
- Super Secret Room (guaranteed).
- Two Super Secret Rooms will be generated if Isaac has Luna.
- Shop (guaranteed for the first 3 Chapters).
- Also guaranteed in Chapter 4 if Isaac has Silver Dollar.
- Also guaranteed in Chapter 5 if Isaac has Holy Crown or Wicked Crown).
- Will not be generated on the third and subsequent Victory Laps.
- Treasure Room (guaranteed for the first 3 Chapters).
- Also guaranteed in Chapter 4 if Isaac has Bloody Crown.
- Also guaranteed in Chapter 5 if Isaac has Holy Crown or Wicked Crown).
- If it is an XL floor, two Treasure Rooms will be generated.
- Planetarium (base 1% chance to be generated in Chapter 1 through Chapter 3, but will not be generated in later chapters; skipping Treasure Rooms, and obtaining one of a number of items and trinkets will modify this chance).
- Dice Room or Sacrifice Room (1/7 (~14%) base chance, plus a second 1/4 chance for a total of 5/14 (~36%) if Isaac’s total health is equal to or greater than his total Heart Containers).
- If a Sacrifice Room is successfully generated, it has a 1/50 base chance to become a Dice Room instead, plus a second 1/5 chance for a total of 27/125 (~22%) if Isaac has 2 or more Keys.
- Library (1/20 chance).
- The code specifically checks for a flag that is supposed to increase Library generation rate if a book was touched, but the flag is never set.
- Curse Room (1/2 chance, plus a second 1/4 chance for a total of 5/8 (~63%) if Isaac has entered a Devil Room this run).
- An additional Curse Room is generated on each floor if Isaac has Voodoo Head; an extra dead end is also generated to accommodate it.
- Mini-Boss Room (1/4 chance, plus a second 1/3 chance for a total of 1/2 (50%) if it is the first floor).
- Challenge Room (guaranteed if Isaac’s total health is equal to or greater than his total heart containers; will not be generated otherwise).
- Will not be generated on the first floor, and has a 50% chance on the second floor.
- Will always be a Boss Challenge Room on the second floor of a chapter, and a normal Challenge Room otherwise.
- Vault or Arcade (guaranteed if Isaac has 5 or more Coins and it’s the second floor of a Chapter; will not be generated otherwise).
- If an Arcade is successfully generated, it has a 1/10 chance to be a Vault instead, plus a second 1/3 chance for a total of 2/5 (40%) if Isaac has 2 or more Keys.
- If Isaac has 2 or more Keys but less than 5 Coins, a Vault can still be generated. If Isaac has 5 or more Coins but less than 2 Keys, and if the 1/10 chance to become a Vault passes, then neither an Arcade or a Vault will be generated.
- Clean Bedroom or Dirty Bedroom (1/50 chance, plus a second 1/5 chance for a total of 27/125 (~22%) if Isaac has 1/2 or fewer Red Hearts and no Soul Hearts, or 1 or fewer Soul Hearts and no Red/ Bone Hearts).
- Equal chance to be a Clean or Dirty Bedroom.
- Will only be generated in the first 3 Chapters.
- Secret Room (guaranteed).
- Each location candidate is given a starting weight of 10-14, reduced by 3 if it has only 2 neighboring rooms, and reduced by 6 if it has only 1 neighboring room. The highest weight candidate is picked.
- In practice, this means a Secret Room will be extremely likely to have at least 2 rooms adjacent to it, unless it's the very first floor, where occasionally one will be placed at a dead end for lack of anywhere else to put it.
- Will not be placed next to a Boss Room, Super Secret Room, another Secret Room, or the starting room if it's The Chest or Dark Room.
- An additional Secret Room will be generated if Isaac has Fragmented Card.
- An additional Secret Room will be generated if Isaac has Luna, three if he also has Fragmented Card.
- Each location candidate is given a starting weight of 10-14, reduced by 3 if it has only 2 neighboring rooms, and reduced by 6 if it has only 1 neighboring room. The highest weight candidate is picked.
- Ultra Secret Room (guaranteed).
- A Grave Room is placed if the floor is Dark Room.
- Normal Room layouts are chosen.
- Each room has a set difficulty number, which is chosen based on the current floor of the chapter and if it's Hard Mode or not.
- Normal Mode floor 1: 1-5
- Normal Mode floor 2: 5-10
- Hard Mode floor 1: 5 only / 1-10 (1 and 10 are less common)
- Hard Mode floor 2: 10 / 10-15 / 5-15 (5 is less common)
- XL Floors count as floor 1 / both floors
- Chapters 5 and 6 count as floor 1 / floor 2
- The Void on Normal Mode: 5-10 ( and 20)
- The Void on Hard Mode: 5-15 / 5-20
- Each room has a set difficulty number, which is chosen based on the current floor of the chapter and if it's Hard Mode or not.
Pseudo-Code[ | ]
Some parts of the level generation are based on the following pseudo-code:
--Pseudo lua code for getting the number of rooms for a floor. 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 for getting the number of deadends a floor must have. MinDeadEnds = 5 if StageId ~= 1 then MinDeadEnds += 1 end if CurseOfTheLabyrinth then MinDeadEnds += 1 end if StageId == 12 then MinDeadEnds += 2 end --Deadends are sorted by distance from the starting room descending. --e.g. Boss room is placed in the farthest deadend, super secret is placed in the next farthest deadend --DequeueDeadend also resizes the deadend. This is important to note because that means most deadends get changed to a 1x1 by the end of this. 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 --Library 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 --Curse 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 --MiniBoss 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 --Challenge 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 --Chest and 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 --Bedroom 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 --Secret TryPlacingSecret() if HasTrinket(TRINKET_FRAGMENTED_CARD) or HasItem(ITEM_LUNA) then TryPlacingSecret() end -- Grave Room if StageId == 11 and StageType == 0 then --Dark Room PlaceGrave(DequeueDeadend()) end
Notes[ | ]
- The algorithm is from Blade's GitHub Gist, also known as blcd / Will. He reverse engineered the game using a disassembler in order to create the pseudo-code.
- The second chances for certain types of rooms are separate, independent rolls: the probabilities are not added together directly.
The Binding of Isaac: Rebirth |
---|