Récompenses de salle terminée
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 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 multiplie ressourcePourcentage par 0.9, puis ajoute 0.1.
Orteil 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 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 (0.3 - 0.45, 15% de chance de base)
- L'intervalle augmente à 0.3 - 0.5 (20% de chance de base) si Isaac a
Côte d'Avarice.
- L'intervalle augmente à 0.3 - 0.5 (20% de chance de base) si Isaac a
- Un
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
Côte d'Avarice.
- Si Isaac a
Queue de Diablotin, le cœur a 80% de chance d'être remplacé par une clé.
- L'intervalle diminue à 0.5 - 0.6 (10% de chance de base) si Isaac a
- Une
clé (0.6 - 0.8, 20% de chance de base)
- Une
bombe (0.8 - 0.95, 15% de chance de base)
- Un
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.
- Si Isaac a une chance positive, la chance d'avoir un coffre augmente et toutes les autres chances diminuent.
La récompense a ensuite une chance d'être remplacée/modifiée par les ressources suivantes, dans l'ordre:
- Une
pile (5% de chance de base, plus 6.67% de chance si Isaac a
Pile Bouton)
- Un
sachet (2% de chance, toujours en vigueur)
- Une carte de tarot (10% de chance si Isaac a
As de Pique)
- Une pilule (10% de chance si Isaac a
Bouchon de Sécurité)
- Une bombe (10% de chance si Isaac a
Allumette)
- Un cœur (10% de chance si Isaac a
Cœur d'Enfant ou 2% si Isaac a aussi
Queue de Diablotin)
- Une clé (10% de chance si Isaac a
Clé 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
Fondeuse)
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 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
66%/
33% de chance d'être remplacé par rien.
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.