diff --git a/descriptions/ab+/en_us.lua b/descriptions/ab+/en_us.lua index c31620a7..f48580cd 100644 --- a/descriptions/ab+/en_us.lua +++ b/descriptions/ab+/en_us.lua @@ -770,18 +770,18 @@ EID.descriptions[languageCode].trinkets={ {"31", "Push Pin", "10% chance to shoot piercing + spectral tears#{{Luck}} 100% chance at 18 luck"}, -- Push Pin {"32", "Liberty Cap", "25% chance for a random mushroom effect per room#Can reveal special rooms on the minimap"}, -- Liberty Cap {"33", "Umbilical Cord", "{{Timer}} Spawns {{Collectible100}} Little Steven for the room when Isaac's health is reduced to half a heart"}, -- Umbilical Cord - {"34", "Child's Heart", "{{UnknownHeart}} 10% chance for the room clear reward to be a random heart#{{Heart}} Chance for a bonus heart from chests, tinted rocks and destroyed machines"}, -- Child's Heart + {"34", "Child's Heart", "{{UnknownHeart}} 10% chance for the room clear reward to be a random heart#{{Heart}} 33% chance for a bonus heart from chests, tinted rocks, and destroyed machines"}, -- Child's Heart {"35", "Curved Horn", "↑ {{Damage}} +2 Damage"}, -- Curved Horn - {"36", "Rusted Key", "{{Key}} 10% chance for the room clear reward to be a key#{{Key}} Chance for a bonus key from chests, tinted rocks and destroyed machines"}, -- Rusted Key + {"36", "Rusted Key", "{{Key}} 10% chance for the room clear reward to be a key#{{Key}} 33% chance for a bonus key from chests, tinted rocks, and destroyed machines"}, -- Rusted Key {"37", "Goat Hoof", "↑ {{Speed}} +0.15 Speed"}, -- Goat Hoof {"38", "Mom's Pearl", "+10% chance for heart drops to be {{SoulHeart}} Soul Hearts, {{BlackHeart}} Black Hearts or {{EmptyBoneHeart}} Bone Hearts"}, -- Mom's Pearl {"39", "Cancer", "↑ {{Tears}} -2 Tear delay"}, -- Cancer {"40", "Red Patch", "{{Timer}} Taking damage has a 20% chance to grant ↑ {{Damage}} +1.8 damage for the room#{{Luck}} 100% chance at 8 luck"}, -- Red Patch - {"41", "Match Stick", "{{Bomb}} 10% chance for the room clear reward to be a bomb#{{Bomb}} Chance for a bonus bomb from chests, tinted rocks and destroyed machines#{{Warning}} Removes {{Trinket53}} Tick"}, -- Match Stick - {"42", "Lucky Toe", "↑ {{Luck}} +1 Luck#+8% room clear reward chance#Extra pickups from chests, tinted rocks, and destroyed machines"}, -- Lucky Toe + {"41", "Match Stick", "{{Bomb}} 10% chance for the room clear reward to be a bomb#{{Bomb}} 33% chance for a bonus bomb from chests, tinted rocks, and destroyed machines#{{Warning}} Removes {{Trinket53}} Tick"}, -- Match Stick + {"42", "Lucky Toe", "↑ {{Luck}} +1 Luck#+8% room clear reward chance#33% chance for an extra pickup from chests, tinted rocks, and destroyed machines"}, -- Lucky Toe {"43", "Cursed Skull", "When damaged down to half a heart or less, Isaac is teleported to a random room"}, -- Cursed Skull - {"44", "Safety Cap", "{{Pill}} 10% chance for the room clear reward to be a pill#{{Pill}} Chance for a bonus pill from chests, tinted rocks and destroyed machines"}, -- Safety Cap - {"45", "Ace of Spades", "{{Card}} 10% chance for the room clear reward to be a card#{{Card}} Chance for a bonus card from chests, tinted rocks and destroyed machines"}, -- Ace of Spades + {"44", "Safety Cap", "{{Pill}} 10% chance for the room clear reward to be a pill#{{Pill}} 33% chance for a bonus pill from chests, tinted rocks, and destroyed machines"}, -- Safety Cap + {"45", "Ace of Spades", "{{Card}} 10% chance for the room clear reward to be a card#{{Card}} 33% chance for a bonus card from chests, tinted rocks, and destroyed machines"}, -- Ace of Spades {"46", "Isaac's Fork", "{{HealingRed}} Clearing a room has a 10% chance to heal half a heart#{{Luck}} 100% chance at 18 luck"}, -- Isaac's Fork {"47", "", ""}, {"48", "A Missing Page", "Taking damage has a 5% chance to deal 40 damage to all enemies in the room"}, -- A Missing Page @@ -833,7 +833,7 @@ EID.descriptions[languageCode].trinkets={ {"94", "Fish Tail", "Doubles all blue fly / spider spawns"}, -- Fish Tail {"95", "Black Tooth", "{{Poison}} 3% chance to shoot poison tooth tears"}, -- Black Tooth {"96", "Ouroboros Worm", "↑ {{Range}} +4 Range#↑ +2 Tear height#Spectral tears#Chance for homing tears#{{Luck}} 100% chance at 9 luck#Isaac's tears move quickly in a spiral pattern"}, -- Ouroboros Worm - {"97", "Tonsil", "Taking damage 12-20 times spawns a projectile blocking familiar#Caps at 2 Familiars"}, -- Tonsil + {"97", "Tonsil", "Taking damage 12-20 times spawns a projectile blocking familiar#Caps at 2 familiars"}, -- Tonsil {"98", "Nose Goblin", "10% chance to shoot homing sticky tears#{{Damage}} Boogers deal Isaac's damage once per second#Boogers stick for 60 seconds"}, -- Nose Goblin {"99", "Super Ball", "10% chance to shoot bouncing tears"}, -- Super Ball {"100", "Vibrant Bulb", "Holding a fully charged active item grants:#↑ {{Speed}} +0.25 Speed#↑ {{Tears}} +0.2 Tears#↑ {{Damage}} +0.5 Damage#↑ {{Range}} +0.75 Range#↑ {{Shotspeed}} +0.1 Shot speed#↑ {{Luck}} +1 Luck"}, -- Vibrant Bulb @@ -1232,11 +1232,11 @@ EID.descriptions[languageCode].ConditionalDescs = { ["5.100.246"] = {"{{SuperSecretRoom}} Reveals the Super Secret Room location on the map"}, -- Blue Map (Greed) ["5.100.333"] = {"{{SuperSecretRoom}} Reveals the Super Secret Room location on the map"}, -- The Mind (Greed) ["5.100.514"] = {"Causes some enemies and projectiles to briefly pause at random intervals"}, -- Broken Modem (Greed) - ["5.350.34"] = {"{{Heart}} Chance for a bonus heart from chests, tinted rocks and destroyed machines"}, -- Child's Heart - ["5.350.36"] = {"{{Key}} Chance for a bonus key from chests, tinted rocks and destroyed machines"}, -- Rusted Key - ["5.350.41"] = {"{{Bomb}} Chance for a bonus bomb from chests, tinted rocks and destroyed machines#{{Warning}} Removes {{Trinket53}} Tick"}, -- Match Stick - ["5.350.44"] = {"{{Pill}} Chance for a bonus pill from chests, tinted rocks and destroyed machines"}, -- Safety Cap - ["5.350.45"] = {"{{Card}} Chance for a bonus card from chests, tinted rocks and destroyed machines"}, -- Ace of Spades + ["5.350.34"] = {"{{Heart}} 33% chance for a bonus heart from chests, tinted rocks, and destroyed machines"}, -- Child's Heart + ["5.350.36"] = {"{{Key}} 33% chance for a bonus key from chests, tinted rocks, and destroyed machines"}, -- Rusted Key + ["5.350.41"] = {"{{Bomb}} 33% chance for a bonus bomb from chests, tinted rocks, and destroyed machines#{{Warning}} Removes {{Trinket53}} Tick"}, -- Match Stick + ["5.350.44"] = {"{{Pill}} 33% chance for a bonus pill from chests, tinted rocks, and destroyed machines"}, -- Safety Cap + ["5.350.45"] = {"{{Card}} 33% chance for a bonus card from chests, tinted rocks, and destroyed machines"}, -- Ace of Spades ["5.350.72"] = {"{{Battery}} +10% chance for random pickups to be a battery#{{Battery}} 5% chance to add 1 charge to held active item when clearing a wave"}, -- Watch Battery ["5.100.297 (Greed)"] = {"{{Warning}} SINGLE USE {{Warning}} Spawns rewards based on floor:#Basement: 2{{Bomb}} + 2{{Key}}#Caves: Boss item + 2{{SoulHeart}}#Depths: 20{{Coin}}#Womb: 2 Boss items#Sheol: Devil item + 1{{BlackHeart}}#The Shop/Ultra Greed: 1{{Coin}}"}, -- Pandora's Box @@ -1316,6 +1316,7 @@ EID.descriptions[languageCode].ConditionalDescs = { ["Eye of Belial Dr. Fetus"] = "Bombs pierce, but don't home or do additional damage", ["Epic Fetus Brimstone"] = "{1} has priority#Rockets shoot out 10 beams", ["Epic Fetus Mom's Knife"] = "{1} has priority#Rockets shoot out 10 knives", + ["Haemolacria Brimstone"] = "{1} has priority#Tears split into 4-7 beams", ["Brimstone Mom's Knife"] = "{1} has priority#A barrage of knives shoot out based on charge amount", ["Ludovico Ipecac"] = "The tear gets +4 damage but doesn't explode or poison", ["Technology Ipecac"] = "The laser gets +4 damage and poisons targets", diff --git a/descriptions/rep/en_us.lua b/descriptions/rep/en_us.lua index b34eb471..d077dcd5 100644 --- a/descriptions/rep/en_us.lua +++ b/descriptions/rep/en_us.lua @@ -1236,6 +1236,7 @@ EID.descriptions[languageCode].GlitchedItemText = { ["5.70"] = "pill", ["5.90"] = "battery", ["5.300"] = "card", + ["5.301"] = "rune", -- not a real ID ["9.-1"] = "enemy projectile", ["999.-1"] = "grid object", ["1000.0"] = "effect", @@ -1263,6 +1264,16 @@ EID.descriptions[languageCode].CraftingIsHidden = "Currently Hidden (Unhide with -- {1} will be converted into the name of the key that toggles the BoC Search EID.descriptions[languageCode].CraftingResults = "(Scroll: Hold {{CONFIG_BoC_Toggle}} + {{ButtonY}} {{ButtonA}}, Lock: {{ButtonX}}, Refresh: {{ButtonB}}, Reset Bag: Hold {{ButtonRB}}, Search: {1})" +-- Strings for Tainted Cain's pedestal salvaging; the non-base lines will have the corresponding icon automatically +EID.descriptions[languageCode].TaintedCainPedestalBase = "Turns into 3-8 random pickups on touch" +EID.descriptions[languageCode].TaintedCainPedestalBaseBirthright = "Turns into {{BlinkBirthright}}6-16{{CR}} random pickups on touch" +EID.descriptions[languageCode].TaintedCainPedestalGuaranteed = "Guaranteed to spawn a{n} {1}" -- Room type spawns +EID.descriptions[languageCode].TaintedCainPedestalBonus = "33% chance for a bonus {1}" -- "Safety Cap" type spawns +EID.descriptions[languageCode].TaintedCainPedestalLuckyToe = "66% chance for a bonus pickup" +EID.descriptions[languageCode].TaintedCainPedestalLuckyToeBirthright = "66% chance for {{BlinkBirthright}}2{{CR}} bonus pickups" +EID.descriptions[languageCode].TaintedCainPedestalDaemonsTail = "Hearts are 80% less likely" + + ---------- Misc. Text ---------- EID.descriptions[languageCode].ResultsWithX = "(Results with {1})" @@ -1378,6 +1389,15 @@ local repConditions = { ["Health Up Soul Charges"] = "+{1} soul charges", ["Health Up Blood Charges"] = "+{1} blood charges", + -- Tainted Bethany stuff + ["2 of Hearts Blood Charges"] = "Doubles {1}'s blood charges", + ["Vampire Blood Charges"] = {"↑ {{Damage}} +0.3 Damage#Killing 13 enemies adds 1 blood charge"}, + ["Fork Blood Charges"] = {"Clearing a room has a 10% chance to add 1 blood charge"}, + ["Stem Cell Blood Charges"] = {"Entering a new floor adds 1 blood charge"}, + + ["Salvaging Bonus"] = {"and destroyed machines", "destroyed machines, and salvaged items"}, + ["Salvaging Lucky Toe"] = "66% chance for an extra pickup from salvaged items", + ------ DUPLICATE COPIES OF ITEMS ------ ["5.100.2 (Copies)"] = "Isaac fires 1 more tear#No additional stat decrease", -- The Inner Eye @@ -1399,8 +1419,8 @@ local repConditions = { ["Sacrificial Star"] = "Star of Bethlehem counts as a familiar", ["Sacrificial Clots"] = "Turns Clots into coins", - ["1000.76.0"] = "{{Warning}} Only rerolls the character that activates the dice", -- Dice Room 1 (Co-op) - ["1000.76.5"] = "{{Warning}} All characters' items will be rerolled in co-op!", -- Dice Room 6 (Co-op) + ["1000.76.1"] = "{{Warning}} Only rerolls the character that activates the dice", -- Dice Room 1 (Co-op) + ["1000.76.6"] = "{{Warning}} All characters' items will be rerolled in co-op!", -- Dice Room 6 (Co-op) ["5.100.45"] = "Heals other players for half a heart", -- Yum Heart (Co-Op) ["5.350.125"] = "Beams also arc between players", -- Extension Cord (Co-Op) diff --git a/eid_config.lua b/eid_config.lua index 5a6a3291..e6550759 100644 --- a/eid_config.lua +++ b/eid_config.lua @@ -357,7 +357,15 @@ EID.UserConfig = { -- Some items (like Teleport!) can have their next result predicted and shown in the Item Reminder -- Default = false ["ItemReminderShowRNGCheats"] = false, - + + ---------- Dynamic Descriptions ------------ + -- Some descriptions can be completely different depending on what character you are, here you can disable the most extreme ones + + -- Changes Health Ups and removes healing effect text when playing as a character that can't have red health + ["DynamicHealthUps"] = true, + + -- As Tainted Cain, replaces pedestal descriptions with what they will turn into + ["DynamicSalvageResult"] = true, ---------- Bag of Crafting ------------ @@ -625,7 +633,10 @@ EID.DefaultConfig = { ["ItemReminderMaxEntriesCount"] = 5, ["ItemReminderShowHiddenInfo"] = false, ["ItemReminderShowRNGCheats"] = false, - + + ["DynamicHealthUps"] = true, + ["DynamicSalvageResult"] = true, + ["SpindownDiceResults"] = 3, ["SpindownDiceDisplayID"] = false, ["SpindownDiceDisplayName"] = false, diff --git a/features/eid_api.lua b/features/eid_api.lua index eb1999f1..ad9aedb2 100644 --- a/features/eid_api.lua +++ b/features/eid_api.lua @@ -422,7 +422,8 @@ function EID:getDescriptionObj(Type, Variant, SubType, entity, checkModifiers) description.Quality = EID:getObjectQuality(description) description.Icon = EID:getObjectIcon(description) EID:getObjectItemTypeAndCharge(description) - + + EID.DifferentEffectPlayers = {} if checkModifiers ~= false then description = EID:applyConditionals(description) description = EID:applyDescriptionModifier(description, SubType) @@ -1655,6 +1656,12 @@ end function EID:fixDefinedFont(forceRefresh) local curLang = EID:getLanguage() local curFont = EID.Config["FontType"] + + -- If the textbox width is set to the default, make it match the selected language's default + -- Fixes language selection not respecting the language's textbox width, although it also prevents 130 from being used as the width with those languages + if EID.Config["TextboxWidth"] == EID.DefaultConfig["TextboxWidth"] then + EID.Config["TextboxWidth"] = EID.descriptions[curLang].fonts[1].textboxWidth or EID.DefaultConfig["TextboxWidth"] + end -- If our currently loaded font is still valid, we don't need to reset values for _, v in ipairs(EID.descriptions[curLang].fonts) do diff --git a/features/eid_bagofcrafting.lua b/features/eid_bagofcrafting.lua index 48f2716d..0a04ad44 100644 --- a/features/eid_bagofcrafting.lua +++ b/features/eid_bagofcrafting.lua @@ -219,6 +219,8 @@ function EID:learnBagOfCrafting(componentsTable) local componentsAsString = table.concat(components, ",") local recipe = REPENTOGON and EID.bagPlayer:GetBagOfCraftingOutput() or EID:calculateBagOfCrafting(componentsTable) + if REPENTOGON and recipe == 0 then recipe = EID:calculateBagOfCrafting(componentsTable) end + if (EID.BoC.LearnedRecipes[componentsAsString] ~= recipe) then newRecipeLearned = true end EID.BoC.LearnedRecipes[componentsAsString] = recipe; end @@ -477,6 +479,7 @@ function EID:BoCTrackBagHolding() else if isCardHold and holdCounter >= 30 and (string.match(animationName, "Walk") and not string.match(animationName, "Pickup") or (EID.bagPlayer:GetCollectibleCount() ~= icount)) then holdCounter = 0 + EID:learnBagOfCrafting(EID.BoC.BagItems) EID.BoC.BagItems = {} EID:UpdateAllPlayerPassiveItems() else @@ -597,7 +600,8 @@ local function getFloorItemsString(showPreviews, roomItems) local floorString = "" local bagItems = EID.BoC.BagItemsOverride or EID.BoC.BagItems if #bagItems >0 then - if showPreviews and #bagItems == 8 then + -- Don't show an item preview in Learned Recipe List if Curse of the Blind is active + if showPreviews and #bagItems == 8 and (EID.Config["BagOfCraftingDisplayRecipesMode"] == "Recipe List" or not EID:hasCurseBlind() or not EID.Config["DisableOnCurse"]) then local recipe = REPENTOGON and EID.bagPlayer:GetBagOfCraftingOutput() or EID:calculateBagOfCrafting(bagItems) -- when using REPENTOGON, MCM needs to think its bag is full if EID.BoC.BagItemsOverride then recipe = EID:calculateBagOfCrafting(bagItems) end @@ -608,7 +612,8 @@ local function getFloorItemsString(showPreviews, roomItems) end local curRoomItems = EID.BoC.RoomOverride or roomItems if #curRoomItems >0 then - if showPreviews and #curRoomItems == 8 then + -- Don't show a room/floor item preview in Learned Recipe List mode + if showPreviews and #curRoomItems == 8 and EID.Config["BagOfCraftingDisplayRecipesMode"] == "Recipe List" then local recipe = EID:calculateBagOfCrafting(curRoomItems) floorString = floorString .. "{{Collectible"..recipe.."}} " end @@ -617,7 +622,8 @@ local function getFloorItemsString(showPreviews, roomItems) end local floorQuery = EID.BoC.FloorOverride or EID.BoC.FloorQuery if #floorQuery >0 and #curRoomItems ~= #floorQuery then - if showPreviews and #floorQuery == 8 then + -- Don't show a room/floor item preview in Learned Recipe List mode + if showPreviews and #floorQuery == 8 and EID.Config["BagOfCraftingDisplayRecipesMode"] == "Recipe List" then local recipe = EID:calculateBagOfCrafting(floorQuery) floorString = floorString .. "{{Collectible"..recipe.."}} " end @@ -761,6 +767,7 @@ local function MCMLearnedRecipeList() local recipe = EID:calculateBagOfCrafting({15,15,5,1,10,8,8,9}) table.insert(sortedResults[recipe], {{15,15,5,1,10,8,8,9}, recipe}) currentRecipesList = sortedResults + numResults = 1 bagOfCraftingOffset = 0 bagOfCraftingRefreshes = 0 isRefresh = false @@ -825,7 +832,7 @@ function EID:handleBagOfCraftingUpdating() end end -- Save the result of the 8 items in our bag - if #EID.BoC.BagItems == 8 then + if #EID.BoC.BagItems == 8 and (not EID:hasCurseBlind() or not EID.Config["DisableOnCurse"]) then EID:learnBagOfCrafting(EID.BoC.BagItems) end diff --git a/features/eid_conditionals.lua b/features/eid_conditionals.lua index 306ce0d3..f327ccec 100644 --- a/features/eid_conditionals.lua +++ b/features/eid_conditionals.lua @@ -87,10 +87,10 @@ local SoulBlackChars = EID:ConcatTables(EID.SpecialHeartPlayers["Soul"],EID.Spec ------ NO RED HEALTH PLAYERS ------ EID:AddConditional(81, EID.CheckForNoRedHealthPlayer) -- Dead Cat -EID:AddClosestPlayerConditional({133, 442, 487, "5.350.46", "5.350.107", "5.350.119"}, SoulBlackChars, "No Effect Replace", nil, false) -- Dark Prince's Crown, Crow Heart, Stem Cell, Isaac's Fork, Guppy's Paw, Potato Peeler +EID:AddClosestPlayerConditional({133, 442, 487, "5.350.46", "5.350.107", "5.350.119"}, SoulBlackChars, "No Effect Replace", {layer = 5000}, false) -- Dark Prince's Crown, Crow Heart, Stem Cell, Isaac's Fork, Guppy's Paw, Potato Peeler if EID.isRepentance then - EID:AddClosestPlayerConditional({569, 671, 676}, SoulBlackChars, "No Effect Replace", nil, false) -- Blood Oath, Candy Heart, Empty Heart - EID:AddClosestPlayerConditional(676, 16, "No Effect Replace", nil, false) -- Empty Heart + Forgotten (not Tainted) + EID:AddClosestPlayerConditional({569, 671, 676}, SoulBlackChars, "No Effect Replace", {layer = 5000}, false) -- Blood Oath, Candy Heart, Empty Heart + EID:AddClosestPlayerConditional(676, 16, "No Effect Replace", {layer = 5000}, false) -- Empty Heart + Forgotten (not Tainted) EID:AddClosestPlayerConditional("5.350.156", 14, "Mother's Kiss Coin") -- Mother's Kiss + Keeper EID:AddClosestPlayerConditional("5.350.156", SoulBlackChars, "Mother's Kiss Soul", nil, false) -- Mother's Kiss + Soul/Black (both give a Soul Heart) @@ -152,11 +152,17 @@ if EID.isRepentance then EID:AddPlayerConditional(205, 22, "Tainted Magdalene")-- Tainted Magdalene + Sharp Plug EID:AddPlayerConditional({"5.350.100", "5.350.101"}, 18, "Bethany", nil, false) -- Bethany + Vibrant/Dim Bulb EID:AddPlayerConditional({"5.350.100", "5.350.101"}, 36, "Tainted Bethany") -- Tainted Bethany + Vibrant/Dim Bulb + EID:AddPlayerConditional("5.300.26", 36, "2 of Hearts Blood Charges") -- Tainted Bethany + 2 of Hearts + EID:AddClosestPlayerConditional(62, 36, "Vampire Blood Charges") + EID:AddClosestPlayerConditional("5.350.46", 36, "Fork Blood Charges") + EID:AddClosestPlayerConditional("5.350.119", 36, "Stem Cell Blood Charges") EID:AddClosestPlayerConditional(722, 37) -- TJacob Anima Sola EID:AddClosestPlayerConditional(713, 26) -- TEve Sumptorium EID:AddPlayerConditional(711, 29) -- TLaz Flip EID:AddClosestPlayerConditional(710, 23) -- Tcain Bag of Crafting + EID:AddPlayerConditional({"5.350.34", "5.350.36", "5.350.41", "5.350.44", "5.350.45"}, 23, "Salvaging Bonus") -- Tcain Safety Cap et al. bonus pickup chance + EID:AddPlayerConditional("5.350.42", 23, "Salvaging Lucky Toe") -- Tcain Lucky Toe bonus pickup chance end @@ -187,15 +193,25 @@ EID:AddSynergyConditional({52, 69, 104, 132, 222, 224, 233, 316, 329, 369, 379, EID:AddOneSidedSynergyConditional(168, 118, "Epic Fetus Brimstone", {layer = 900, checkLayers = true}) EID:AddOneSidedSynergyConditional(168, 114, "Epic Fetus Mom's Knife", {layer = 900, checkLayers = true}) EID:AddOneSidedSynergyConditional(168, 330, "Epic Fetus Soy Milk", {layer = 900, checkLayers = true}) +EID:AddPlayerConditional(168, 7, "Overrides", {layer = 890, checkLayers = true, variableText = "{{NameOnlyC118}}"}) -- Epic Fetus overrides Azazel EID:AddSynergyConditional({69, 132, 222, 316, 369, 379, 410, 440, 453, 459, 461, 494, 524, 532, 533, }, 52, "Overridden", "Overrides", {layer = 800, checkLayers = true}) -- Dr. Fetus EID:AddSynergyConditional(462, 52, "Eye of Belial Dr. Fetus", nil, {layer = 800, checkLayers = true}) +EID:AddPlayerConditional(52, 7, "Overrides", {layer = 790, checkLayers = true, variableText = "{{NameOnlyC118}}"}) -- Dr. Fetus overrides Azazel EID:AddSynergyConditional({5, 69, 132, 221, 224, 316, 379, 401, 410, 459, 461, 462, 529, 532, 533, }, 114, "Overridden", "Overrides", {layer = 700, checkLayers = true}) -- Mom's Knife EID:AddOneSidedSynergyConditional(114, 118, "Brimstone Mom's Knife", {layer = 700, checkLayers = true}) +EID:AddPlayerConditional(114, 7, "Overrides", {layer = 690, checkLayers = true, variableText = "{{NameOnlyC118}}"}) -- Mom's Knife overrides Azazel + +EID:AddOneSidedSynergyConditional(531, 118, "Haemolacria Brimstone", {layer = 675, checkLayers = true}) +EID:AddPlayerConditional(531, 7, "Overrides", {layer = 656, checkLayers = true, variableText = "{{NameOnlyC118}}"}) -- Haemolacria overrides Azazel EID:AddSynergyConditional({316, 379, 410, 440, 453, 461, 462, 524, 533, 540, }, 118, "Overridden", "Overrides", {layer = 666, checkLayers = true}) -- Brimstone EID:AddSynergyConditional(118, 149, "Brimstone Ipecac", nil, {layer = 666, checkLayers = true}) +EID:AddPlayerConditional(149, 7, "Brimstone Ipecac", nil, {layer = 656, checkLayers = true}) +EID:AddSynergyConditional(118, 261, "Brimstone Proptosis", nil, {layer = 666, checkLayers = true}) +EID:AddPlayerConditional(261, 7, "Brimstone Proptosis", nil, {layer = 656, checkLayers = true}) +EID:AddPlayerConditional({316, 379, 410, 440, 453, 461, 462, 524, 533, 540, }, 7, "Overridden", {layer = 656, checkLayers = true, variableText = "{{NameOnlyC118}}"}) -- Azazel overrides the same stuff EID:AddSynergyConditional({5, 69, 104, 233, 316, 329, 379, 397, 410, 453, 461, 524, 529, 532, 533, 540, "5.350.26"}, 395, "Overridden", "Overrides", {layer = 600, checkLayers = true}) -- Tech X EID:AddSynergyConditional(149, 395, "Technology Ipecac", nil, {layer = 600, checkLayers = true}) -- Tech X + Ipecac @@ -207,10 +223,12 @@ EID:AddSynergyConditional({69, 222, 224, 316, 394, 397, 410, 532}, 329, "Overrid EID:AddSynergyConditional(149, 329, "Ludovico Ipecac", nil, {layer = 300, checkLayers = true}) -- Ludovico + Ipecac if not EID.isRepentance then + -- AB+ exclusive overrides EID:AddSynergyConditional({374, 429, }, 168, "Overridden", "Overrides", {layer = 900, checkLayers = true}) -- Epic Fetus EID:AddSynergyConditional({374, 401, 429, 444, 461}, 52, "Overridden", "Overrides", {layer = 800, checkLayers = true}) -- Dr. Fetus EID:AddSynergyConditional({104, 150, 374, 394, 443, 453, 463, 494, 496, 503, }, 114, "Overridden", "Overrides", {layer = 700, checkLayers = true}) -- Mom's Knife EID:AddSynergyConditional({104, 224, 369, 374, 394, 401, 429, 444, 459, 463, 494, 532, }, 118, "Overridden", "Overrides", {layer = 666, checkLayers = true}) -- Brimstone + EID:AddPlayerConditional({104, 224, 369, 374, 394, 401, 429, 444, 459, 463, 494, 532, }, 7, "Overridden", {layer = 656, checkLayers = true, variableText = "{{NameOnlyC118}}"}) -- Azazel overrides the same stuff EID:AddSynergyConditional({55, 87, 150, 221, 374, 394, 401, 429, 443, 444, 463, 494, 496, 503, "5.350.96"}, 395, "Overridden", "Overrides", {layer = 600, checkLayers = true}) -- Tech X EID:AddSynergyConditional({69, 104, 222, 224, 245, 316, 369, 374, 394, 429, 494, }, 68, "Overridden", "Overrides", {layer = 400, checkLayers = true}) -- Technology @@ -223,15 +241,20 @@ if EID.isRepentance then EID:AddOneSidedSynergyConditional(579, 114, "Spirit Sword Mom's Knife", {layer = 1000, checkLayers = true}) -- Spirit Sword + Mom's Knife EID:AddOneSidedSynergyConditional(579, 68, "Spirit Sword Technology", {layer = 1000, checkLayers = true}) -- Spirit Sword + Technology EID:AddOneSidedSynergyConditional(579, 149, "Spirit Sword Ipecac", {layer = 1000, checkLayers = true}) -- Spirit Sword + Ipecac + EID:AddPlayerConditional(579, 7, "Overrides", {layer = 990, checkLayers = true, variableText = "{{NameOnlyC118}}"}) -- Spirit Sword overrides Azazel EID:AddSynergyConditional({553, 572, 678, "5.350.144"}, 168, "Overridden", "Overrides", {layer = 900, checkLayers = true}) -- Epic Fetus EID:AddOneSidedSynergyConditional(561, 168, "Epic Fetus Soy Milk", {layer = 900, checkLayers = true}) -- Epic Fetus + Almond Milk EID:AddSynergyConditional({69, 229, 316, 329, 397, 410, 533, 572, 597, }, 678, "Overridden", "Overrides", {layer = 850, checkLayers = true}) -- C Section EID:AddSynergyConditional({68, 118, 572, 597, 637, "5.350.144"}, 52, "Overridden", "Overrides", {layer = 800, checkLayers = true}) -- Dr. Fetus EID:AddSynergyConditional({52, 572, 597}, 114, "Overridden", "Overrides", {layer = 700, checkLayers = true}) -- Mom's Knife - EID:AddSynergyConditional({597}, 118, "Overridden", "Overrides", {layer = 666, checkLayers = true}) -- Brimstone + EID:AddSynergyConditional({597}, 118, "Overridden", "Overrides", {layer = 666, checkLayers = true}) -- Brimstone overrides + EID:AddPlayerConditional({597}, 7, "Overridden", {layer = 656, checkLayers = true, variableText = "{{NameOnlyC118}}"}) -- Azazel overrides the same stuff EID:AddOneSidedSynergyConditional({529, 532}, 118, "Brimstone Pop!", {layer = 666, checkLayers = true}) -- Brimstone + Pop!/Lachryphagy + EID:AddPlayerConditional(529, 7, "Brimstone Pop!", {layer = 656, checkLayers = true, variableText = "{{NameOnlyC529}}"}) -- Azazel + Pop/Lachryphagy + EID:AddPlayerConditional(532, 7, "Brimstone Pop!", {layer = 656, checkLayers = true, variableText = "{{NameOnlyC532}}"}) -- Azazel + Pop/Lachryphagy EID:AddSynergyConditional(572, 118, "Eye of the Occult Beam", nil, {layer = 666}) -- Brimstone + Eye of the Occult + EID:AddPlayerConditional(572, 7, "Eye of the Occult Beam", {layer = 656, checkLayers = true, bulletpoint = "Collectible118"}) -- Azazel + Eye of the Occult EID:AddSynergyConditional({572, 597, "5.350.144"}, 395, "Overridden", "Overrides", {layer = 600, checkLayers = true}) -- Tech X EID:AddSynergyConditional({597}, 68, "Overridden", "Overrides", {layer = 400, checkLayers = true}) -- Technology EID:AddSynergyConditional(572, 68, "Eye of the Occult Beam", nil, {layer = 400}) -- Technology + Eye of the Occult @@ -351,7 +374,7 @@ end if EID.isRepentance then -- Co-op friendly items EID:AddConditional({45, "5.350.125"}, EID.MultiplePlayerCharacters) -- Yum Heart, Extension Cord - EID:AddConditional({"1000.76.0", "1000.76.5"}, EID.MultiplePlayerCharacters) -- Dice Room 1 and 6 + EID:AddConditional({"1000.76.1", "1000.76.6"}, EID.MultiplePlayerCharacters) -- Dice Room 1 and 6 -- Item Synergies EID:AddItemConditional(201, 147) -- Iron Bar refills Notched Axe diff --git a/features/eid_data.lua b/features/eid_data.lua index a85456c3..6c7526e7 100644 --- a/features/eid_data.lua +++ b/features/eid_data.lua @@ -775,6 +775,10 @@ EID.InlineColors = { ["ColorShinyPurple"] = function(_) return SwagColors({KColor(0.812, 0.627, 1, 1), KColor(0.62, 0.251, 1, 1)}, 40) end, + -- Blink between the two shades of tan on Birthright + ["BlinkBirthright"] = function(_) + return SwagColors({KColor(0.831, 0.725, 0.604, 1), KColor(0.671, 0.557, 0.443, 1)}) + end, -- Text will blink frequently ["ColorBlink"] = function(color) local maxAnimTime = 40 @@ -1098,6 +1102,10 @@ end if not EID.isRepentance then return end +EID.SalvageTrinkets = { [34] = "5.10", [36] = "5.30", [41] = "5.40", [44] = "5.70", [45] = "5.300" } +EID.SalvageRoomTypes = { [3] = "5.10.6", [19] = "5.10.6", [4] = "5.10.4", [20] = "5.10.4", [5] = "5.10.11", [22] = "5.10.11", [9] = "5.300.78", [12] = "5.10.12", [21] = "5.10.12", [26] = "5.301" } +EID.PickupStartsWithVowel = { ["5.10.4"] = true } -- this is just for Eternal Heart in salvage descriptions right now... + EID.BoC = {} EID.BoC.PickupValues = { diff --git a/features/eid_mcm.lua b/features/eid_mcm.lua index c30cea5e..a4e20b06 100644 --- a/features/eid_mcm.lua +++ b/features/eid_mcm.lua @@ -388,13 +388,13 @@ if MCMLoaded then -- Simple toggles of what descriptions the user wants displayed - EID:AddBooleanSetting("Display", "DisableStartOfRunWarnings", "Start of Run Warnings", {displayingTab = "", offText = "Enabled", onText = "Disabled", + EID:AddBooleanSetting("Display", "DisableStartOfRunWarnings", "Start of Run Warnings", {offText = "Enabled", onText = "Disabled", repOnly = true, infoText = "Toggles warnings for achievements being disabled, the game being outdated, and modded crafting recipes."}) - MCM.AddSpace("EID", "Display") + if EID.isRepentance then MCM.AddSpace("EID", "Display") end MCM.AddText("EID", "Display", "Gameplay") - EID:AddBooleanSetting("Display", "HideInBattle", "Hide in Battle", {infoText = "Hides descriptions when enemies are present."}) + EID:AddBooleanSetting("Display", "HideInBattle", "Hide in Battle", {displayingTab = "", infoText = "Hides descriptions when enemies are present."}) EID:AddBooleanSetting("Display", "InitiallyHidden", "Is Initially Hidden", {infoText = "Hides descriptions by default. Press the Toggle key to show them again."}) MCM.AddSpace("EID", "Display") @@ -450,10 +450,11 @@ if MCMLoaded then local diceSteps = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} -- Spindown Dice Settings - if EID.isRepentance then MCM.AddSpace("EID", "Display") end - - MCM.AddText("EID", "Display", "Spindown Dice") - + if EID.isRepentance then + MCM.AddSpace("EID", "Display") + MCM.AddText("EID", "Display", "Spindown Dice") + end + EID:AddScrollSetting("Display", "SpindownDiceResults", "Preview rerolls", diceSteps, {repOnly = true, label = " Items", infoText = "Number of item previews to display when holding Spindown Dice."}) @@ -466,7 +467,16 @@ if MCMLoaded then -- Spindown Dice skip locked items EID:AddBooleanSetting("Display", "SpindownDiceSkipLocked", "Skip Locked Items", {repOnly = true, infoText = {"The preview skips locked items, like the dice does.", "(The unlock status check is not perfect and may be wrong)"}}) - + + MCM.AddSpace("EID", "Display") + MCM.AddText("EID", "Display", "Dynamic Descriptions") + + EID:AddBooleanSetting("Display", "DynamicHealthUps", "Dynamic Health Up Text", + {infoText = "Changes Health Ups and removes healing effect text when playing as a character that can't have red health"}) + EID:AddBooleanSetting("Display", "DynamicSalvageResult", "Show Tainted Cain Salvage Result", + {repOnly = true, infoText = "As Tainted Cain, replaces pedestal descriptions with what they will turn into"}) + + --------Obstruction--------- MCM.AddSpace("EID", "Display") MCM.AddText("EID", "Display", "Unreachable items") @@ -883,7 +893,7 @@ if MCMLoaded then else MCM.AddSpace("EID", "Save Game") MCM.AddSpace("EID", "Save Game") - MCM.AddText("EID", "Save Game", "To enable savegame related features,") + MCM.AddText("EID", "Save Game", function() EID.MCMCompat_isDisplayingEIDTab = ""; return "To enable savegame related features," end) MCM.AddText("EID", "Save Game", "please run \"scripts\\savegame_reader.exe\"") MCM.AddText("EID", "Save Game", "found in the EID mod folder.") end diff --git a/features/eid_modifiers.lua b/features/eid_modifiers.lua index 07bc6cd0..5e04a74e 100644 --- a/features/eid_modifiers.lua +++ b/features/eid_modifiers.lua @@ -311,6 +311,7 @@ end -- Handle changing health up text for non-red HP players local function HealthUpCallback(descObj) + if not EID.Config["DynamicHealthUps"] then return descObj end local adjustedSubtype = EID:getAdjustedSubtype(descObj.ObjType, descObj.ObjVariant, descObj.ObjSubType) if descObj.ObjVariant == 70 and descObj.ObjSubType > 2048 then adjustedSubtype = adjustedSubtype + 2048 end -- horsepill exception local typeVarSub = descObj.ObjType.."."..descObj.ObjVariant.."."..adjustedSubtype @@ -318,36 +319,36 @@ local function HealthUpCallback(descObj) local closestPlayer = EID:ClosestPlayerTo(descObj.Entity) local playerType = closestPlayer:GetPlayerType() local heartType = EID.CharacterToHeartType[playerType] or "Red" - if heartType == "Red" then return descObj end - - -- find/replace Health Up lines - local numHearts = EID.HealthUpData[typeVarSub] or 1 - local text = EID:getDescriptionEntry("RedToX", "Red to " .. heartType) - local plural = ""; if numHearts ~= 1 and numHearts ~= -1 then plural = EID:getDescriptionEntry("Pluralize") end - - local pos = 1 - while pos <= #text do - -- replace {1} with the number of hearts and {2} with the plural character - local toFind = EID:ReplaceVariableStr(text[pos], {numHearts, plural}) - if text[pos + 1] then - local replaceWith = EID:ReplaceVariableStr(text[pos + 1], {numHearts, plural}) - descObj.Description = EID:SimpleReplace(descObj.Description, tostring(toFind), replaceWith, 1) + if heartType ~= "Red" then + -- find/replace Health Up lines + local numHearts = EID.HealthUpData[typeVarSub] or 1 + local text = EID:getDescriptionEntry("RedToX", "Red to " .. heartType) + local plural = ""; if numHearts ~= 1 and numHearts ~= -1 then plural = EID:getDescriptionEntry("Pluralize") end + + local pos = 1 + while pos <= #text do + -- replace {1} with the number of hearts and {2} with the plural character + local toFind = EID:ReplaceVariableStr(text[pos], {numHearts, plural}) + if text[pos + 1] then + local replaceWith = EID:ReplaceVariableStr(text[pos + 1], {numHearts, plural}) + descObj.Description = EID:SimpleReplace(descObj.Description, tostring(toFind), replaceWith, 1) + end + pos = pos + 2 + end + + -- remove HealingRed lines entirely for Soul/Black/None health chars + descObj.Description = descObj.Description .. "#" -- gsub finds final lines better if the desc ends with a line break + if heartType == "Soul" or heartType == "Black" or heartType == "None" then + -- Find any lines containing {{HealingRed}} or {{HealingHalfRed}} and remove the line + descObj.Description = descObj.Description:gsub("{{HealingRed}}(.-)#", "") + descObj.Description = descObj.Description:gsub("{{HealingHalfRed}}(.-)#", "") + end + + -- check if we just made the description blank + if descObj.Description:gsub("#", "") == "" then + local noEffectStr = EID:getDescriptionEntry("ConditionalDescs", "No Effect") + descObj.Description = "{{Player" .. playerType .. "}} " .. EID:ReplaceVariableStr(noEffectStr, "{{NameOnlyI" .. playerType .. "}}") end - pos = pos + 2 - end - - -- remove HealingRed lines entirely for Soul/Black/None health chars - descObj.Description = descObj.Description .. "#" -- gsub finds final lines better if the desc ends with a line break - if heartType == "Soul" or heartType == "Black" or heartType == "None" then - -- Find any lines containing {{HealingRed}} or {{HealingHalfRed}} and remove the line - descObj.Description = descObj.Description:gsub("{{HealingRed}}(.-)#", "") - descObj.Description = descObj.Description:gsub("{{HealingHalfRed}}(.-)#", "") - end - - -- check if we just made the description blank - if descObj.Description:gsub("#", "") == "" then - local noEffectStr = EID:getDescriptionEntry("ConditionalDescs", "No Effect") - descObj.Description = "{{Player" .. playerType .. "}} " .. EID:ReplaceVariableStr(noEffectStr, "{{NameOnlyI" .. playerType .. "}}") end -- test the other players for if they have a different effect @@ -366,16 +367,30 @@ if EID.isRepentance then -- Handle Birthright local function BirthrightCallback(descObj) descObj.Description = "" + if EID.InsideItemReminder then + local player = EID.ItemReminderPlayerEntity + local playerID = player:GetPlayerType() + local birthrightDesc = EID:getDescriptionEntry("birthright", playerID+1) + if birthrightDesc ~= nil then + local playerName = birthrightDesc[1] or player:GetName() + EID:appendToDescription(descObj, EID:GetPlayerIcon(playerID) .. " {{ColorIsaac}}"..playerName.."{{CR}}#"..birthrightDesc[3].."#") + end + return descObj + end local describedPlayerTypes = {} for i = 1, #EID.coopAllPlayers do local player = EID.coopAllPlayers[i] local playerID = player:GetPlayerType() - if not player:IsSubPlayer() and player:GetMainTwin( ):GetPlayerType() == playerID and not describedPlayerTypes[playerID] then - describedPlayerTypes[playerID] = true - local birthrightDesc = EID:getDescriptionEntry("birthright", playerID+1) - if birthrightDesc ~=nil then - local playerName = birthrightDesc[1] or player:GetName() - EID:appendToDescription(descObj, EID:GetPlayerIcon(playerID) .. " {{ColorGray}}"..playerName.."{{CR}}#"..birthrightDesc[3].."#") + if descObj.Entity and playerID == PlayerType.PLAYER_CAIN_B and not EID.isDeathCertRoom then + -- Don't add a description if Tainted Cain is looking at a Birthright pedestal, he can't get it... + else + if not player:IsSubPlayer() and player:GetMainTwin( ):GetPlayerType() == playerID and not describedPlayerTypes[playerID] then + describedPlayerTypes[playerID] = true + local birthrightDesc = EID:getDescriptionEntry("birthright", playerID+1) + if birthrightDesc ~= nil then + local playerName = birthrightDesc[1] or player:GetName() + EID:appendToDescription(descObj, EID:GetPlayerIcon(playerID) .. " {{ColorIsaac}}"..playerName.."{{CR}}#"..birthrightDesc[3].."#") + end end end end @@ -820,12 +835,72 @@ if EID.isRepentance then return descObj end - + + -- Handle Tainted Cain pedestals + local function TaintedCainPedestalCallback(descObj) + if EID.isDeathCertRoom or not descObj.Entity or not EID.Config["DynamicSalvageResult"] then return descObj end + local item = EID.itemConfig:GetCollectible(descObj.ObjSubType) + if (item.Tags and item.Tags & ItemConfig.TAG_QUEST == ItemConfig.TAG_QUEST) then return descObj end + + local closestPlayer = EID:ClosestPlayerTo(descObj.Entity) + local playerType = closestPlayer:GetPlayerType() + + if playerType == PlayerType.PLAYER_CAIN_B then + -- Construct the Salvage description + local hasBirthright = closestPlayer:HasCollectible(619) + local salvageDesc = hasBirthright and EID:getDescriptionEntry("TaintedCainPedestalBaseBirthright") or EID:getDescriptionEntry("TaintedCainPedestalBase") + local pickupNames = EID:getDescriptionEntry("PickupNames") + + -- Guaranteed items from room type + local roomType = game:GetLevel():GetCurrentRoomDesc().Data.Type + local roomPool = game:GetItemPool():GetPoolForRoom(roomType, 69) + if roomType ~= RoomType.ROOM_ERROR and EID.SalvageRoomTypes[roomPool] then + local newLine = EID.RoomTypeToMarkup[roomType] .. " " .. EID:getDescriptionEntry("TaintedCainPedestalGuaranteed") + newLine = EID:ReplaceVariableStr(newLine, 1, pickupNames[EID.SalvageRoomTypes[roomPool]]:gsub("{{[.-}}]+ ", "")) + newLine = EID:ReplaceVariableStr(newLine, "n", EID.PickupStartsWithVowel[EID.SalvageRoomTypes[roomPool]] and "n" or "") + salvageDesc = salvageDesc .. "#" .. newLine + end + + -- Bonus items from trinkets + for trinketID,pickupID in pairs(EID.SalvageTrinkets) do + if closestPlayer:HasTrinket(trinketID) then + local newLine = "{{Trinket" .. trinketID .. "}} " .. EID:getDescriptionEntry("TaintedCainPedestalBonus") + newLine = EID:ReplaceVariableStr(newLine, 1, pickupNames[pickupID]:gsub("{{[.-}}]+ ", "")) + salvageDesc = salvageDesc .. "#" .. newLine + end + end + + -- Bonus item from Lucky Toe + if closestPlayer:HasTrinket(42) then + local newLine = "{{Trinket42}} " .. (hasBirthright and EID:getDescriptionEntry("TaintedCainPedestalLuckyToeBirthright") or EID:getDescriptionEntry("TaintedCainPedestalLuckyToe")) + salvageDesc = salvageDesc .. "#" .. newLine + end + + -- Daemon's Tail reduces hearts + if closestPlayer:HasTrinket(22) then + local newLine = "{{Trinket22}} " .. EID:getDescriptionEntry("TaintedCainPedestalDaemonsTail") + salvageDesc = salvageDesc .. "#" .. newLine + end + descObj.Description = salvageDesc + for i = 1, #EID.coopAllPlayers do + local t = EID.coopAllPlayers[i]:GetPlayerType() + if t ~= PlayerType.PLAYER_CAIN_B then + table.insert(EID.DifferentEffectPlayers, t) + end + end + else + table.insert(EID.DifferentEffectPlayers, PlayerType.PLAYER_CAIN_B) + end + + return descObj + end + -- Handle Glitched Crown style pedestals local currentSelection = {} -- keep track of which description we're looking at for a given pedestal local goingToSpindown = false + local inGlitchedCrown = false local function GlitchedCrownCallback(descObj) - if not descObj.Entity then return descObj end + if not descObj.Entity or inGlitchedCrown then return descObj end local entity = descObj.Entity local curRoomIndex = game:GetLevel():GetCurrentRoomDesc().ListIndex @@ -845,6 +920,7 @@ if EID.isRepentance then if #sortedItems < 5 then return descObj end table.sort(sortedItems, function(a, b) return a[2] < b[2] end) + inGlitchedCrown = true currentSelection[pedestalID] = currentSelection[pedestalID] or 0 -- watch for Tab being pressed to advance our selection by 1 @@ -859,14 +935,16 @@ if EID.isRepentance then descObj = EID:getDescriptionObj(5, 100, 689, nil, false) descObj.Description = "" for _, item in ipairs(sortedItems) do - descObj.Description = descObj.Description .. "#{{NameC" .. item[1] .. "}}" + descObj.Description = descObj.Description .. "{{Collectible" .. item[1] .. "}} {{NameOnlyC" .. item[1] .. "}}#" end - -- display a specific description - -- don't replace the desc if the pedestal's already showing the correct item + + -- display a specific description else descObj = EID:getDescriptionObj(5, 100, sortedItems[currentSelection[pedestalID]][1]) end - + + descObj.Entity = entity + local nextIcon = "{{Collectible689}}" if currentSelection[pedestalID] + 1 <= #sortedItems then nextIcon = "{{Collectible" .. sortedItems[currentSelection[pedestalID] + 1][1] .. "}}" end @@ -874,10 +952,14 @@ if EID.isRepentance then "#{{Blank}} " .. EID:ReplaceVariableStr(EID:getDescriptionEntry("GlitchedCrownToggleInfo"), 1, nextIcon)) -- manually apply Flip; changing the description's item stops future callbacks to avoid infinite loops, but we want Flip still, it works fine - descObj.Entity = entity - if EID.collectiblesOwned[711] and descObj.ObjSubType ~= entity.SubType then descObj = FlipCallback(descObj) end + if descObj.ObjSubType ~= entity.SubType then + if EID.collectiblesOwned[711] then descObj = FlipCallback(descObj) end + -- manually apply Tainted Cain + if EID:PlayersHaveCharacter(PlayerType.PLAYER_CAIN_B) then descObj = TaintedCainPedestalCallback(descObj) end + end + end - + inGlitchedCrown = false return descObj end @@ -902,18 +984,19 @@ if EID.isRepentance then -- Check Birthright first because it overwrites the description instead of appending to it if descObj.ObjSubType == 619 then table.insert(callbacks, BirthrightCallback) end if EID.collectiblesOwned[689] then table.insert(callbacks, GlitchedCrownCallback) end + -- Glowing Hourglass overwrites the description when used three times if REPENTOGON and descObj.ObjSubType == 422 then table.insert(callbacks, GlowingHourglassCallback) end if descObj.ObjSubType == 644 then table.insert(callbacks, ConsolationPrizeCallback) end - if EID.collectiblesOwned[584] or descObj.ObjSubType == 584 then table.insert(callbacks, BookOfVirtuesCallback) end - + + if EID:PlayersHaveCharacter(PlayerType.PLAYER_CAIN_B) then table.insert(callbacks, TaintedCainPedestalCallback) end if EID.collectiblesOwned[711] and EID:getEntityData(descObj.Entity, "EID_FlipItemID") then table.insert(callbacks, FlipCallback) end if EID.Config["SpindownDiceResults"] > 0 and (EID.collectiblesOwned[723] or EID.collectiblesAbsorbed[723]) and descObj.ObjSubType ~= 668 then goingToSpindown = true table.insert(callbacks, SpindownDiceCallback) else goingToSpindown = false end - + -- Card / Rune Callbacks elseif descObj.ObjVariant == PickupVariant.PICKUP_TAROTCARD then hasTarot = EID.collectiblesOwned[451] @@ -999,6 +1082,7 @@ local function CoopDifferentEffectCallback(descObj) end displayedChars[v] = true end + EID.DifferentEffectPlayers = {} -- avoid appending this twice return descObj end local function CoopDifferentEffectConditions(_)