Récompenses de salle terminée

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

Quand tous les monstres d'une salle sont éliminés, le jeu a une chance de donner comme récompense une ressource ou une babiole. De nombreux facteurs influencent ces récompenses, comme la Chance Chance et certains effets d'objets.

Processus

Premièrement, le jeu génère un nombre aléatoire utilisant la formule suivante:

(nombreAléatoire * Chance * 0.1) + ressourcePourcentage

  • nombreAléatoire et ressourcePourcentage sont des nombres aléatoires compris entre 0 et 1.
  • Chance est maintenu à 0 si la chance d'Isaac est inférieure à 0 et 10 si supérieure à 10
  • Cette chance est modifiée par les objets/babioles suivants:
    • Pied Chanceux Pied Chanceux multiplie ressourcePourcentage par 0.9, puis ajoute 0.1.
    • Orteil Porte-BonheurOrteil Porte-Bonheur multiplie la valeur finale par 0.9, puis ajoute 0.1. (Mais si Isaac a aussi Pied Chanceux et sa chance est supérieure à 0, la valeur est à la place multipliée par 0.98, plus 0.02, avec le bonus de Pied Chanceux s'appliquant toujours.)

Ce nombre est ensuite utilisé pour déterminer la récompense donnée après avoir terminé une salle, utilisant l'index suivant:

  • Rien (< 0.22, 22% de chance de base)
  • Une carte de tarot, Pilule pilule ou une babiole (0.22 - 0.3, 8% de chance de base)
    • Les 3 possibilités ont des chances égales d'être choisies, leur donnant 2.66% de chance de base chacune.
  • Une Pièce pièce (0.3 - 0.45, 15% de chance de base)
    • L'intervalle augmente à 0.3 - 0.5 (20% de chance de base) si Isaac a (excepté dans Rebirth)Côte d'AvariceCôte d'Avarice.
  • Un Cœur cœur (0.45 - 0.6, 15% de chance de base)
    • L'intervalle diminue à 0.5 - 0.6 (10% de chance de base) si Isaac a (excepté dans Rebirth)Côte d'AvariceCôte d'Avarice.
    • Si Isaac a Queue de DiablotinQueue de Diablotin, le cœur a 80% de chance d'être remplacé par une clé.
  • Une Clé clé (0.6 - 0.8, 20% de chance de base)
  • Une Bombe bombe (0.8 - 0.95, 15% de chance de base)
  • Un Coffre coffre (> 0.95, 5% de chance de base)
    • Si Isaac a une chance positive, la chance d'avoir un coffre augmente et toutes les autres chances diminuent.
      • Pied Chanceux/Orteil Porte-Bonheur diminuent la chance de ne rien avoir mais n'augmentent pas eux-mêmes la chance de faire apparaître des coffres.


La récompense a ensuite une chance d'être remplacée/modifiée par les ressources suivantes, dans l'ordre:

  • Une Pile pile (5% de chance de base, plus 6.67% de chance si Isaac a (excepté dans Rebirth)Pile BoutonPile Bouton)
  • Un (excepté dans Rebirth)Sachet sachet (2% de chance, toujours en vigueur)
  • Une carte de tarot (10% de chance si Isaac a As de PiqueAs de Pique)
  • Une pilule (10% de chance si Isaac a Bouchon de SécuritéBouchon de Sécurité)
  • Une bombe (10% de chance si Isaac a AllumetteAllumette)
  • Un cœur (10% de chance si Isaac a Cœur d'EnfantCœur d'Enfant ou 2% si Isaac a aussi Queue de DiablotinQueue de Diablotin)
  • Une clé (10% de chance si Isaac a Clé RouilléeClé Rouillée)
    • Si Isaac a plusieurs copies de ces babioles, la première à s'activer est celle qui remplace la récompense de salle.
  • Une babiole (2% de chance si Isaac a (excepté dans Rebirth et Afterbirth)Fondeuse Fondeuse)
  • Queue de Guppy Queue de Guppy a 33% de chance de remplacer la récompense avec un coffre (soit gris soit doré avec des chances égales) et 22% de chance de la remplacer avec rien.
  • Contrat des Profondeurs Contrat des Profondeurs fait apparaître une copie supplémentaire de la récompense mais a 33% de chance de la remplacer avec rien.
    • Chaque contrat qu'Isaac a fait apparaître une autre copie supplémentaire de la récompense et réduit la chance pour la récompense de devenir rien par 2/3.
  • Si la partie est en mode difficile, les récompenses de cœur ont (excepté dans Repentance et Repentance+) 66%/(dans Repentance et Repentance+) 33% de chance d'être remplacé par rien.
  • (excepté dans Rebirth et Afterbirth)Routeur Cassé Routeur Cassé a 25% de chance de créer une copie supplémentaire de la récompense si c'est une clé, pièce, cœur, bombe ou sachet.

Pseudo-code

La logique est contenu dans ce pseudo-code:

local room = Game():GetLevel():GetCurrentRoom()
local awardSeed = room.AwardSeed
local player = Game():GetPlayer(0)
local difficulty = Game().Difficulty

local rng = RNG()
rng:SetSeed(awardSeed, 35) --5, 9, 7

local pickupPercent = rng:RandomFloat()
if (player:HasCollectible(COLLECTIBLE_LUCKYFOOT)) then
	pickupPercent = (pickupPercent * 0.9) + 0.1
end

local luck = math.max(math.min(player.Luck, 10), 0) --Clamp to 0-10

--Max luck increases the pickupPercent range from 0-1 to 0-2
--That means the more luck you have, the more likely you are to get chests.
pickupPercent = rng:RandomFloat() * luck * 0.1 + pickupPercent

if (player:HasTrinket(TRINKET_LUCKY_TOE)) then
	if (player:HasCollectible(COLLECTIBLE_LUCKYFOOT) and luck > 0) then
		pickupPercent = (pickupPercent * 0.98) + 0.02
	else
		pickupPercent = (pickupPercent * 0.9) + 0.1
	end
end

local pickupAward = COLLECTIBLE_NULL
local pickupCount = 1

if (pickupPercent > 0.22) then
	if (pickupPercent < 0.3) then
		if (rng:RandomInt(3) == 0) then
			pickupAward = PICKUP_TAROTCARD
		elseif (rng:RandomInt(2) == 0) then
			pickupAward = PICKUP_TRINKET
		else
			pickupAward = PICKUP_PILL
		end
	elseif (pickupPercent < 0.45) then
		pickupAward = PICKUP_COIN
	elseif (pickupPercent < 0.5 and player:HasTrinket(TRINKET_RIB_OF_GREED)) then
		pickupAward = PICKUP_COIN
	elseif (pickupPercent < 0.6 and (not player:HasTrinket(TRINKET_DAEMONS_TAIL) or rng:RandomInt(5) == 0)) then
		pickupAward = PICKUP_HEART
	elseif (pickupPercent < 0.8) then
		pickupAward = PICKUP_KEY
	elseif (pickupPercent < 0.95) then
		pickupAward = PICKUP_BOMB
	else
		pickupAward = PICKUP_CHEST
	end
	
	if (rng:RandomInt(20) == 0 or (rng:RandomInt(15) == 0 and player:HasTrinket(TRINKET_WATCH_BATTERY))) then
		pickupAward = PICKUP_LIL_BATTERY
	end
	
	if (rng:RandomInt(50) == 0) then
		pickupAward = PICKUP_GRAB_BAG
	end
	
	if (player:HasTrinket(TRINKET_ACE_SPADES) and rng:RandomInt(10) == 0) then
		pickupAward = PICKUP_TAROTCARD
	elseif (player:HasTrinket(TRINKET_SAFETY_CAP) and rng:RandomInt(10) == 0) then
		pickupAward = PICKUP_PILL
	elseif (player:HasTrinket(TRINKET_MATCH_STICK) and rng:RandomInt(10) == 0) then
		pickupAward = PICKUP_BOMB
	elseif (player:HasTrinket(TRINKET_CHILDS_HEART) and rng:RandomInt(10) == 0 and (not player:HasTrinket(TRINKET_DAEMONS_TAIL) or rng:RandomInt(5) == 0)) then
		pickupAward = PICKUP_HEART
	elseif (player:HasTrinket(TRINKET_RUSTED_KEY) and rng:RandomInt(10) == 0) then
		pickupAward = PICKUP_KEY
	end
	
		
	if (player:HasCollectible(COLLECTIBLE_SMELTER) and rng:RandomInt(50) == 0) then
		pickupAward = PICKUP_TRINKET
	end
end


if (player:HasCollectible(COLLECTIBLE_GUPPYS_TAIL)) then
	if (rng:RandomInt(3) != 0) then
		if (rng:RandomInt(3) == 0) then
			pickupAward = PICKUP_NULL
		end
	else
		if (rng:RandomInt(2) != 0) then
			pickupAward = PICKUP_LOCKEDCHEST
		else
			pickupAward = PICKUP_CHEST
		end
	end
end

if (player:HasCollectible(COLLECTIBLE_CONTRACT_FROM_BELOW) and pickupAward != PICKUP_TRINKET) then
	pickupCount = player:GetCollectibleNum(COLLECTIBLE_CONTRACT_FROM_BELOW) + 1
	--The chance of getting nothing goes down with each contract exponentially
	local nothingChance = math.pow(0.666, pickupCount - 1)
	if (nothingChance * 0.5 > rng:NextFloat()) then
		pickupCount = 0
	end
end

if (difficulty == 1 and pickupAward == PICKUP_HEART) then
	if rng:RandomInt(100) >= 35 then
		pickupAward = PICKUP_NULL
	end
end

if (player:HasCollectible(COLLECTIBLE_BROKEN_MODEM) and rng:RandomInt(4) == 0 and pickupCount >= 1 and
		(pickupAward == PICKUP_COIN or pickupAward == PICKUP_HEART or pickupAward == PICKUP_KEY or pickupAward == PICKUP_GRAB_BAG or pickupAward == PICKUP_BOMB) then
	pickupCount = pickupCount + 1
end

if (pickupCount > 0 and pickupAward != PICKUP_NULL) then
	local subType = 0
	for i=1, pickupCount do
		local ent = Game():Spawn(ENTITY_PICKUP, pickupAward, nearCenter, Vector(0, 0), 0, subtype, rng:Next())
		subType = ent.SubType
	end
end

Notes

Ce pseudo-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 afin de créer ce pseudo-code.