From ac2aecae924d085989f4df90ab3a0425e01fcd3b Mon Sep 17 00:00:00 2001 From: Buurazu Date: Sun, 9 Jun 2024 11:59:56 -0400 Subject: [PATCH] Conditionals overhaul (#666) * more general type check * conditional work + characterInfo * conditional work + characterInfo * conditional overhaul WIP * fix typo with BagLearnedRecipes * Cursed Eye + Black Candle synergy * conditional stuff * Change Brittle wording * Teleport 2.0 Red Room check * Changed collectiblesToCheck format, moved some mods to conds * Add getPlayerName, tweak replaceNameMarkupStrings * massive conditional overhaul * AB+ birthright check fix * oh yeah birthright isn't zero-indexed yet * update with mirades * update with mirades * Move blank card / rune IDs * move rune IDs, reduce reused code * Add {{NameOnlyX###}} markup * more conditionals * more conditionals * Update eid_conditionals.lua * separate icon from name in variablecharge * keep old localizations working * split Dead Cat so it doesn't have a variable text * Blank Card + ? Card * moving Blank Card + ? Card * Pretend english detailed doesn't exist * Oops! No Comma! * milk override * Placenta no red hp * actually no placenta still gives +1 health * Dark Arts conditional * Marbles percentage * Dark Arts conditional --- descriptions/ab+/cs_cz.lua | 8 + descriptions/ab+/de.lua | 8 + descriptions/ab+/en_us.lua | 107 +++++++-- descriptions/ab+/fr.lua | 6 +- descriptions/ab+/ja_jp.lua | 6 +- descriptions/ab+/ko_kr.lua | 6 +- descriptions/ab+/pt_br.lua | 8 + descriptions/ab+/ru.lua | 8 + descriptions/ab+/spa.lua | 8 + descriptions/ab+/uk_ua.lua | 8 + descriptions/ab+/zh_cn.lua | 8 + descriptions/rep/cs_cz.lua | 6 +- descriptions/rep/de.lua | 1 - descriptions/rep/en_us.lua | 110 ++++++--- descriptions/rep/fr.lua | 5 +- descriptions/rep/ja_jp.lua | 5 +- descriptions/rep/ko_kr.lua | 1 - descriptions/rep/pt_br.lua | 1 - descriptions/rep/ru.lua | 1 - descriptions/rep/spa.lua | 1 - descriptions/rep/uk_ua.lua | 1 - descriptions/rep/zh_cn.lua | 5 +- eid_config.lua | 2 +- features/eid_api.lua | 29 ++- features/eid_conditionals.lua | 401 +++++++++++++++++++++++--------- features/eid_data.lua | 20 +- features/eid_debugging.lua | 8 +- features/eid_itemprediction.lua | 10 +- features/eid_modifiers.lua | 182 +++------------ main.lua | 2 +- 30 files changed, 614 insertions(+), 358 deletions(-) diff --git a/descriptions/ab+/cs_cz.lua b/descriptions/ab+/cs_cz.lua index b5636366..2b9e9270 100644 --- a/descriptions/ab+/cs_cz.lua +++ b/descriptions/ab+/cs_cz.lua @@ -910,4 +910,12 @@ EID.descriptions[languageCode].PickupNames = { ["5.301"] = "{{Rune}} Rune", -- not a real id ["5.350"] = "{{Trinket}} Trinket", +} + +-- Conditional descriptions +-- Strings will be appended to the original description +-- Tables with one entry will completely replace the original description +-- Tables with two or more entries are find-replace pairs +EID.descriptions[languageCode].ConditionalDescs = { + ["5.300.48"] = "Teleportuje tě do JSEM ERROR místnosti#Prázdná Karta a ?-Karta bude zničena", -- Blank Card + Q Card } \ No newline at end of file diff --git a/descriptions/ab+/de.lua b/descriptions/ab+/de.lua index 2304bbd9..8f36be06 100644 --- a/descriptions/ab+/de.lua +++ b/descriptions/ab+/de.lua @@ -641,3 +641,11 @@ EID.descriptions[languageCode].VoidText = "Wenn absorbiert, erhalte:" EID.descriptions[languageCode].VoidNames = {"{1} Tempo", "{1} Tränen", "{1} Schaden", "{1} Reichweite", "{1} Schusstempo", "{1} Glück"} -- Not yet Translated! -- Copy & Paste entries from en_us and continue translating from that + +-- Conditional descriptions +-- Strings will be appended to the original description +-- Tables with one entry will completely replace the original description +-- Tables with two or more entries are find-replace pairs +EID.descriptions[languageCode].ConditionalDescs = { + ["5.300.48"] = "Teleport zum I AM ERROR-Raum#Blanko-Karte und ?-Karte werden zerstört", -- Blank Card + Q Card +} \ No newline at end of file diff --git a/descriptions/ab+/en_us.lua b/descriptions/ab+/en_us.lua index 32dcc919..f72e3b8b 100644 --- a/descriptions/ab+/en_us.lua +++ b/descriptions/ab+/en_us.lua @@ -27,7 +27,7 @@ EID.descriptions[languageCode].collectibles={ {"4", "Cricket's Head", "↑ {{Damage}} +0.5 Damage#↑ {{Damage}} x1.5 Damage multiplier"}, -- Cricket's Head {"5", "My Reflection", "↑ {{Range}} +1.5 Range#↑ +1 Tear height#↑ {{Shotspeed}} +0.6 Shot speed#Tears get a boomerang effect"}, -- My Reflection {"6", "Number One", "↑ {{Tears}} +1.5 Tears#↑ +0.76 Tear height#↓ {{Range}} -17.62 Range"}, -- Number One - {"7", "Blood of the Martyr", "↑ {{Damage}} +1 Damage#{{Collectible34}} x1.5 Damage multiplier if \"The Book of Belial\" or \"XV - The Devil\" effect is active"}, -- Blood of the Martyr + {"7", "Blood of the Martyr", "↑ {{Damage}} +1 Damage"}, -- Blood of the Martyr {"8", "Brother Bobby", "Shoots normal tears#Deals 3.5 damage per tear"}, -- Brother Bobby {"9", "Skatole", "All fly enemies are friendly"}, -- Skatole {"10", "Halo of Flies", "+2 Fly orbitals#Blocks enemy projectiles"}, -- Halo of Flies @@ -54,7 +54,7 @@ EID.descriptions[languageCode].collectibles={ {"31", "Mom's Lipstick", "↑ {{Range}} +5.25 Range#↑ +0.5 Tear height"}, -- Mom's Lipstick {"32", "Wire Coat Hanger", "↑ {{Tears}} +0.7 Tears"}, -- Wire Coat Hanger {"33", "The Bible", "{{Timer}} Flight for the room#{{MomsHeart}} Kills Mom's Foot and Mom's Heart instantly#{{Warning}} Kills Isaac when used on Satan"}, -- The Bible - {"34", "The Book of Belial", "{{AngelDevilChance}} +12.5% Devil/Angel Room chance while held#{{Timer}} Receive for the room:#↑ {{Damage}} +2 Damage#{{Collectible7}} x1.5 Damage multiplier if Isaac has \"Blood of the Martyr\""}, -- The Book of Belial + {"34", "The Book of Belial", "{{AngelDevilChance}} +12.5% Devil/Angel Room chance while held#{{Timer}} Receive for the room:#↑ {{Damage}} +2 Damage"}, -- The Book of Belial {"35", "The Necronomicon", "Deals 40 damage to all enemies in the room"}, -- The Necronomicon {"36", "The Poop", "Spawns one poop and knocks back enemies#Can be placed next to a pit and destroyed with a bomb to make a bridge"}, -- The Poop {"37", "Mr. Boom", "Drops a large bomb below Isaac which deals 110 damage"}, -- Mr. Boom @@ -69,7 +69,7 @@ EID.descriptions[languageCode].collectibles={ {"46", "Lucky Foot", "↑ {{Luck}} +1 Luck#+8% room clear reward chance#Better chance to win while gambling"}, -- Lucky Foot {"47", "Doctor's Remote", "{{Collectible168}} On use, start aiming a crosshair#A missile lands on the crosshair after 1.5 seconds#Deals 20x Isaac's damage"}, -- Doctor's Remote {"48", "Cupid's Arrow", "Piercing tears"}, -- Cupid's Arrow - {"49", "Shoop da Whoop!", "{{Collectible118}} Using the item and shooting in a direction fires a high damage Brimstone beam"}, -- Shoop da Whoop! + {"49", "Shoop da Whoop!", "{{Collectible118}} Using the item and shooting in a direction fires a 2x damage laser"}, -- Shoop da Whoop! {"50", "Steven", "↑ {{Damage}} +1 Damage"}, -- Steven {"51", "Pentagram", "↑ {{Damage}} +1 Damage#{{AngelDevilChance}} +10% Devil/Angel Room chance"}, -- Pentagram {"52", "Dr. Fetus", "↓ {{Tears}} x2.5 Tear delay multiplier#{{Bomb}} Isaac shoots bombs instead of tears#{{Damage}} Those bombs deal 5x Isaac's damage + 30"}, -- Dr. Fetus @@ -95,7 +95,7 @@ EID.descriptions[languageCode].collectibles={ {"72", "Rosary", "{{SoulHeart}} +3 Soul Hearts#{{Collectible33}} The Bible is added to all item pools"}, -- Rosary {"73", "Cube of Meat", "Lv1: Orbital#Lv2: Shooting orbital#Lv3: Meat Boy#Lv4: Super Meat Boy"}, -- Cube of Meat {"74", "A Quarter", "{{Coin}} +25 Coins"}, -- A Quarter - {"75", "PHD", "{{Heart}} Heals 2 hearts#{{Pill}} Spawns 1 pill#{{Pill}} Changes bad pills into good pills#{{BloodDonationMachine}} Blood Donation Machines and {{Collectible135}} IV Bag give more {{Coin}} coins"}, -- PHD + {"75", "PHD", "{{Heart}} Heals 2 hearts#{{Pill}} Spawns 1 pill#{{Pill}} Changes bad pills into good pills#{{BloodDonationMachine}} Blood Donation Machines give more {{Coin}} coins"}, -- PHD {"76", "X-Ray Vision", "{{SecretRoom}} Opens all secret room entrances"}, -- X-Ray Vision {"77", "My Little Unicorn", "{{Timer}} Receive for 6 seconds:#↑ {{Speed}} +0.28 Speed#Invincibility#Isaac can't shoot but deals 40 contact damage per second"}, -- My Little Unicorn {"78", "Book of Revelations", "{{SoulHeart}} +1 Soul Heart#{{AngelDevilChance}} +17.5% Devil/Angel Room chance while held#Using the item has a high chance to replace the floor's boss with a horseman"}, -- Book of Revelations @@ -128,7 +128,7 @@ EID.descriptions[languageCode].collectibles={ {"105", "The D6", "Rerolls pedestal items in the room"}, -- The D6 {"106", "Mr. Mega", "↑ {{Bomb}} x1.83 Bomb damage#{{Bomb}} +5 Bombs"}, -- Mr. Mega {"107", "The Pinking Shears", "{{Timer}} Receive for the room:#Flight#Isaac's body separates from his head and attacks enemies with 82.5 contact damage per second"}, -- The Pinking Shears - {"108", "The Wafer", "Reduces most damage taken to half a heart#{{Player14}} Doesn't work for Keeper"}, -- The Wafer + {"108", "The Wafer", "Reduces most damage taken to half a heart"}, -- The Wafer {"109", "Money = Power", "↑ {{Damage}} +0.04 Damage for every {{Coin}} coin Isaac has"}, -- Money = Power {"110", "Mom's Contacts", "↑ {{Range}} +0.25 Range#↑ +0.5 Tear height#20% chance to shoot petrifying tears#{{Luck}} 50% chance at 20 luck"}, -- Mom's Contacts {"111", "The Bean", "{{Poison}} Farts a poison cloud#The poison deals Isaac's damage 6 times"}, -- The Bean @@ -247,7 +247,7 @@ EID.descriptions[languageCode].collectibles={ {"224", "Cricket's Body", "↑ {{Tears}} -1 Tear delay#↑ {{Tearsize}} x1.2 Tear size#↓ {{Range}} -10 Range#Tears split up in 4 on hit#Split tears deal half damage"}, -- Cricket's Body {"225", "Gimpy", "{{SoulHeart}} Taking damage has a chance to spawn a Soul Heart#{{HalfHeart}} Enemies have a chance to drop a half Red Heart on death"}, -- Gimpy {"226", "Black Lotus", "↑ {{Heart}} +1 Health#{{SoulHeart}} +1 Soul Heart#{{BlackHeart}} +1 Black Heart"}, -- Black Lotus - {"227", "Piggy Bank", "{{Coin}} +3 Coins#{{Coin}} Taking damage spawns 1-2 coins#{{Player14}} 0-1 Coin as Keeper"}, -- Piggy Bank + {"227", "Piggy Bank", "{{Coin}} +3 Coins#{{Coin}} Taking damage spawns 1-2 coins"}, -- Piggy Bank {"228", "Mom's Perfume", "↑ {{Tears}} -1 Tear delay#{{Fear}} 15% chance to shoot fear tears"}, -- Mom's Perfume {"229", "Monstro's Lung", "↓ {{Tears}} x4.3 Tear delay multiplier#{{Chargeable}} Tears are charged and released in a shotgun style attack"}, -- Monstro's Lung {"230", "Abaddon", "↑ {{Speed}} +0.2 Speed#↑ {{Damage}} +1.5 Damage#↓ {{EmptyHeart}} Removes all heart containers#{{BlackHeart}} +6 Black Hearts#{{Fear}} 15% chance to shoot fear tears"}, -- Abaddon @@ -338,7 +338,7 @@ EID.descriptions[languageCode].collectibles={ {"313", "Holy Mantle", "Negates the first hit taken once per room"}, -- Holy Mantle {"314", "Thunder Thighs", "↑ {{Heart}} +1 Health#↓ {{Speed}} -0.4 Speed#Isaac can destroy rocks by walking into them"}, -- Thunder Thighs {"315", "Strange Attractor", "Isaac's tears attract enemies, pickups and trinkets"}, -- Strange Attractor - {"316", "Cursed Eye", "Charged wave of 4 tears#{{Warning}} Taking damage while partially charged teleports Isaac to a random room#{{Collectible260}} Black Candle removes the teleportation effect"}, -- Cursed Eye + {"316", "Cursed Eye", "Charged wave of 4 tears#{{Warning}} Taking damage while partially charged teleports Isaac to a random room"}, -- Cursed Eye {"317", "Mysterious Liquid", "Isaac's tears leave creep#The creep deals 30 damage per second"}, -- Mysterious Liquid {"318", "Gemini", "Close combat familiar#Deals 6 contact damage per second"}, -- Gemini {"319", "Cain's Other Eye", "Bounces around the room#Shoots towards Isaac#{{Damage}} Deals the same damage as Isaac"}, -- Cain's Other Eye @@ -523,7 +523,7 @@ EID.descriptions[languageCode].collectibles={ {"498", "Duality", "{{AngelDevilChance}} Spawns both an Angel and Devil Room if either would have spawned#Entering one makes the other disappear"}, -- Duality {"499", "Eucharist", "{{AngelChance}} 100% chance for Angel Rooms to spawn"}, -- Eucharist {"500", "Sack of Sacks", "Spawns a sack every 5-6 rooms"}, -- Sack of Sacks - {"501", "Greed's Gullet", "{{Heart}} +1 Heart container for every 25 coins gained after getting Greed's Gullet#{{Player14}} Keeper can gain additional coin containers"}, -- Greed's Gullet + {"501", "Greed's Gullet", "{{Heart}} +1 Heart container for every 25 coins gained after getting Greed's Gullet"}, -- Greed's Gullet {"502", "Large Zit", "{{Slow}} Firing occasionally shoots a white creep tear that deals double damage and slows enemies#Taking damage shoots a white creep tear"}, -- Large Zit {"503", "Little Horn", "5% chance to shoot tears that instantly kill enemies#{{Luck}} 20% chance at 15 luck#Isaac deals 3.5 contact damage"}, -- Little Horn {"504", "Brown Nugget", "Spawns a fly turret that shoots at enemies#Each shot deals 2 damage"}, -- Brown Nugget @@ -560,7 +560,7 @@ EID.descriptions[languageCode].collectibles={ {"535", "Blanket", "{{Heart}} Heals 1 heart#{{SoulHeart}} +1 Soul Heart#{{HolyMantle}} Entering a boss room grants a Holy Mantle shield (prevents damage once)"}, -- Blanket {"536", "Sacrificial Altar", "{{Warning}} SINGLE USE {{Warning}}#Sacrifices up to 2 familiars and spawns a devil item for each sacrifice#{{Coin}} Turns blue spiders/flies into coins"}, -- Sacrificial Altar {"537", "Lil Spewer", "{{Pill}} Spawns a random pill on pickup#Fires a line of creep#The type of creep changes with each pill use"}, -- Lil Spewer - {"538", "Marbles", "{{Trinket}} Spawns 3 random trinkets#{{Collectible479}} Taking damage can remove Isaac's held trinket and grant its effects permanently"}, -- Marbles + {"538", "Marbles", "{{Trinket}} Spawns 3 random trinkets#{{Collectible479}} Taking damage has a 10% chance to consume Isaac's held trinket and grant its effects permanently"}, -- Marbles {"539", "Mystery Egg", "Taking damage spawns a charmed enemy#Spawns stronger friends the more rooms are cleared without taking damage"}, -- Mystery Egg {"540", "Flat Stone", "Isaac's tears bounce off the floor and cause splash damage on every bounce"}, -- Flat Stone {"541", "Marrow", "{{Heart}} Spawns 3 Red Hearts#{{EmptyBoneHeart}} +1 Bone Heart"}, -- Marrow @@ -972,14 +972,71 @@ EID.descriptions[languageCode].PickupNames = { } +-- Card Buffs caused by Tarot Cloth (separate table from Rep due to how different they are) +-- Strings will be appended to the original description (with line breaks replaced with a Tarot Cloth icon) +-- Tables with one entry will completely replace the original description +-- Tables with two or more entries are find-replace pairs (the new text will be colored Shiny Purple) +EID.descriptions[languageCode].tarotClothBuffsAB = { + [4] = {0.3, 0.6, 1.5, 3}, -- III - The Empress + [6] = {2, 4}, -- V - The Hierophant + [7] = {2, 4}, -- VI - The Lovers + [8] = {6, 12}, -- VII - The Chariot + [9] = {"Spawns {{ColorShinyPurple}}2{{CR}} random {{UnknownHeart}} hearts, {{Coin}} coins, {{Bomb}} bombs and {{Key}} keys"}, -- VIII - Justice + [11] = {"Spawns {{ColorShinyPurple}}2{{CR}} {{Slotmachine}} Slot Machines or {{FortuneTeller}} Fortune Machines"}, -- X - Wheel of Fortune + [12] = {1, 2, 0.3, 0.6, 0.3, 0.6, 5.25, 10.5}, -- XI - Strength + [14] = {40, 80}, -- XIII - Death + [15] = {"{{DonationMachine}} Spawns {{ColorShinyPurple}}2{{CR}} Blood Donation Machines"}, -- XIV - Temperance + [17] = {6, 12}, -- XVI - The Tower + [20] = {100, 200}, -- XIX - The Sun + [21] = {"Spawns {{ColorShinyPurple}}2{{CR}} Beggars or Devil Beggars#2% chance to spawn a special Beggar"}, -- XX - Judgement + [23] = {"Doubles", "Quadruples"}, -- 2 of Clubs + [24] = {"Doubles", "Quadruples"}, -- 2 of Diamonds + [25] = {"Doubles", "Quadruples"}, -- 2 of Spades + [26] = {"Doubles", "Quadruples"}, -- 2 of Hearts + [33] = {"Doubles", "Quadruples"}, -- Jera + [35] = {1, 2}, -- Dagaz + [37] = "Rerolls twice", -- Perthro + [38] = {3, 6, 3, 6}, -- Berkano + [39] = {30, 60}, -- Algiz + [40] = "Triggers 2 rune effects and tries to duplicate itself twice", -- Blank Rune + [41] = {40, 80}, -- Black Rune + [46] = {10, 20}, -- Suicide King + [48] = "Uses it twice", -- ? Card + [53] = {3, 6}, -- Ancient Recall +} + +-- Conditional descriptions +-- Strings will be appended to the original description +-- Tables with one entry will completely replace the original description +-- Tables with two or more entries are find-replace pairs EID.descriptions[languageCode].ConditionalDescs = { + ["Overridden"] = "Overridden by {1}", + ["Overrides"] = "Overrides {1}", + ["No Effect"] = "No effect for {1}", + + ["No Red"] = "No effect for characters that can't have Red Hearts", ["5.100.81"] = "Characters that can't have Red Hearts get set to 1 Soul/Black Heart", -- Dead Cat + + ["5.100.7"] = "x1.5 Damage multiplier while The Book of Belial or XV - The Devil effect is active", -- Blood of the Martyr + ["5.100.34"] = "x1.5 Damage multiplier", -- Book of Belial + ["5.300.16"] = "x1.5 Damage multiplier", -- The Devil + + ["5.100.135 (PHD)"] = "Spawns 2-3 coins if you have {1}", -- IV Bag PHD + ["Keeper 0-1"] = "Spawns 0-1 coin as {1}", -- IV Bag/Piggy Bank Keeper + ["5.100.241"] = "{{GreedMode}} Doesn't affect Greed Mode", -- Contract From Below - ["5.100.135 (Keeper)"] = "{{Player14}} Spawns 0-1 coin as Keeper", -- IV Bag Keeper - ["5.100.135 (PHD)"] = "{{Collectible75}} Spawns 2-3 coins if you have PHD", -- IV Bag PHD - ["5.100.442"] = "No effect for characters that can't have Red Hearts", -- Dark Prince's Crown - ["5.300.15"] = "{{DemonBeggar}} Spawns a Devil Beggar", -- Temperance (Greed Mode effect) + ["5.300.15"] = {"{{DemonBeggar}} Spawns a Devil Beggar"}, -- Temperance (Greed Mode effect) + ["5.300.15 (Tarot)"] = {"{{DemonBeggar}} Spawns {{ColorShinyPurple}}2{{CR}} Devil Beggars"}, -- Temperance (Greed Mode + Tarot Cloth effect) + ["5.350.23"] = "{{Warning}} Dying in a {{SacrificeRoom}} Sacrifice Room while holding this trinket unlocks The Lost", -- Missing Poster (Unlock The Lost) + + ["5.100.549"] = "{1} simply gets ↑ {{Tears}} +0.4 Tears on pickup", -- Brittle Bones (Keeper+Lost) + + ["5.100.316"] = "{1} removes the teleportation effect", -- Cursed Eye + ["5.100.260"] = "Removes the teleportation effect of {1}", -- Black Candle + ["5.100.501"] = "{1} can gain additional coin containers", -- Greed's Gullet + ["5.100.230 (Keeper)"] = "{1} just dies", -- Abaddon + ["5.300.48"] = "Teleport to I AM ERROR Room#Blank Card and ? Card will be destroyed", -- Blank Card + Q Card } EID.descriptions[languageCode].BFFSSynergies = { @@ -992,3 +1049,27 @@ EID.descriptions[languageCode].BFFSSynergies = { ["5.100.537"] = "Increases pool size, but not damage", -- Lil Spewer ["5.100.539"] = "Spawns a champion variant of the enemy", -- Mystery Egg } + +-- TODO: make these more consistent with other descs, add icons, and is there any traits of the characters missing? +-- Soon, these descriptions, along with their starting item descriptions, will be in a tab in the Item Reminder +-- The character names here are also used in getPlayerName to provide localized character names +EID.descriptions[languageCode].characterInfo = { + [0] = {"Isaac", ""}, + {"Magdalene", ""}, + {"Cain", ""}, + {"Judas", ""}, + {"???", "Can't have Red Hearts"}, + {"Eve", "Eve's Whore of Babylon triggers at 1 Red Heart or less"}, --this could just be desc modifier? + {"Samson", ""}, + {"Azazel", "Flight#Short range Brimstone instead of tears"}, + {"Lazarus", "When you die, resurrect as Lazarus Risen with 1 Red Heart container"}, + {"Eden", "Start with random stats and items each run"}, + {"The Lost", "Flight#Spectral tears#No health#One devil deal per room can be taken for free"}, + {"Lazarus Risen", "Increased stats and 1.2x damage multiplier"}, + {"Dark Judas", "2x Damage multiplier"}, + {"Lilith", "Cannot shoot tears"}, + {"Keeper", "Heal by picking up coins#Heart pickups are turned into Blue Flies"}, + {"Apollyon", ""}, + {"The Forgotten", "You have a melee attack#Can have up to 6 Bone Hearts#Press {{ButtonRT}} to switch to The Soul#The Soul can have up to 6 Soul/Black Hearts and has flight and spectral tears#The Soul is chained to The Forgotten, and can only move in a small radius around him"}, + {"The Forgotten Soul", "You have a melee attack#Can have up to 6 Bone Hearts#Press {{ButtonRT}} to switch to The Soul#The Soul can have up to 6 Soul/Black Hearts and has flight and spectral tears#The Soul is chained to The Forgotten, and can only move in a small radius around him"}, +} diff --git a/descriptions/ab+/fr.lua b/descriptions/ab+/fr.lua index 587fb6b0..2ce5498e 100644 --- a/descriptions/ab+/fr.lua +++ b/descriptions/ab+/fr.lua @@ -991,11 +991,13 @@ EID.descriptions[languageCode].PickupNames = { } EID.descriptions[languageCode].ConditionalDescs = { + ["5.300.48"] = "Téléporte Isaac dans la salle d'erreur#La {{ColorYellow}}Carte Blanche{{ColorWhite}} et la {{ColorYellow}}Carte ?{{ColorWhite}} seront détruites", -- Blank Card + Q Card + ["5.100.81"] = "Retire tous les cœurs sauf 1 aux personnages qui ne peuvent pas avoir de cœurs rouges", -- Dead Cat ["5.100.241"] = "{{Warning}} Sans effet en mode Avarice", -- Contract From Below - ["5.100.135 (Keeper)"] = "{{Player14}} Peut ne pas faire apparaître de pièce", -- IV Bag Keeper + ["Keeper 0-1"] = "{{Player14}} Peut ne pas faire apparaître de pièce", -- IV Bag Keeper ["5.100.135 (PHD)"] = "Fait apparaître 2 ou 3 pièces avec {{ColorYellow}}Doctorat {{Collectible75}}", -- IV Bag PHD - ["5.100.442"] = "{{Warning}} Aucun effet pour les personnages qui ne peuvent pas avoir de cœurs rouges", -- Dark Prince's Crown + ["No Red"] = "{{Warning}} Aucun effet pour les personnages qui ne peuvent pas avoir de cœurs rouges", -- Dark Prince's Crown ["5.300.15"] = "Invoque un mendiant diabolique {{DemonBeggar}}", -- Temperance (Greed Mode effect) ["5.350.23"] = "{{Warning}} Mourir dans une Salle de Sacrifice {{SacrificeRoom}} en portant cette babiole débloque {{ColorLightOrange}}L'Égaré", -- Missing Poster (Unlock The Lost) } \ No newline at end of file diff --git a/descriptions/ab+/ja_jp.lua b/descriptions/ab+/ja_jp.lua index e2f100d8..b7b5cc47 100644 --- a/descriptions/ab+/ja_jp.lua +++ b/descriptions/ab+/ja_jp.lua @@ -991,11 +991,13 @@ EID.descriptions[languageCode].PickupNames = { } EID.descriptions[languageCode].ConditionalDescs = { + ["5.300.48"] = "I AM ERRORにテレポート#白紙のカードと?カード 両方が消失する", -- Blank Card + Q Card + ["5.100.81"] = "赤ハートを持てない キャラクターの場合、 青/黒ハートを1個に 設定・復活", -- Dead Cat ["5.100.241"] = "{{GreedMode}} グリードモードでは 効果なし", -- Contract From Below - ["5.100.135 (Keeper)"] = "{{Player14}} キーパー使用時は0~1コイン", -- IV Bag Keeper + ["Keeper 0-1"] = "{{Player14}} キーパー使用時は0~1コイン", -- IV Bag Keeper ["5.100.135 (PHD)"] = "{{Collectible75}} PHD所有時は2~3コイン", -- IV Bag PHD - ["5.100.442"] = "赤ハートを持てない キャラクターの場合、 効果なし", -- Dark Prince's Crown + ["No Red"] = "赤ハートを持てない キャラクターの場合、 効果なし", -- Dark Prince's Crown ["5.300.15"] = "{{DemonBeggar}} 悪魔乞食をスポーン", -- Temperance (Greed Mode effect) ["5.350.23"] = "{{Warning}} 保持中に生贄部屋で死ぬと ザ・ロストをアンロック", -- Missing Poster (Unlock The Lost) } diff --git a/descriptions/ab+/ko_kr.lua b/descriptions/ab+/ko_kr.lua index 060e1a58..b0c65b42 100644 --- a/descriptions/ab+/ko_kr.lua +++ b/descriptions/ab+/ko_kr.lua @@ -1025,11 +1025,13 @@ EID.descriptions[languageCode].PickupNames = { } EID.descriptions[languageCode].ConditionalDescs = { + ["5.300.48"] = "오류방으로 순간이동합니다.#Blank Card와 ? 카드가 제거됩니다.", -- Blank Card + Q Card + ["5.100.81"] = "!!! 최대 체력 = 소울하트 보정을 받는 캐릭터는 소울하트가 1칸이 됩니다.", -- Dead Cat ["5.100.241"] = "{{GreedModeSmall}} Greed 모드의 동전 보상은 영향 없음", -- Contract From Below - ["5.100.135 (Keeper)"] = "{{Player14}}Keeper: 0~1개", -- IV Bag Keeper + ["Keeper 0-1"] = "{{Player14}}Keeper: 0~1개", -- IV Bag Keeper ["5.100.135 (PHD)"] = "{{Collectible75}} PHD 소지 시 2-3개로 증가", -- IV Bag PHD - ["5.100.442"] = "빨간하트를 소지할 수 없는 캐릭터는 무효과", -- Dark Prince's Crown + ["No Red"] = "빨간하트를 소지할 수 없는 캐릭터는 무효과", -- Dark Prince's Crown ["5.300.15"] = "{{DemonBeggar}} 악마거지를 소환합니다.", -- Temperance (Greed Mode effect) -- ["5.350.23"] = "", -- Missing Poster (Unlock The Lost) } diff --git a/descriptions/ab+/pt_br.lua b/descriptions/ab+/pt_br.lua index dad944be..6de70c9e 100644 --- a/descriptions/ab+/pt_br.lua +++ b/descriptions/ab+/pt_br.lua @@ -891,3 +891,11 @@ EID.descriptions[languageCode].ItemReminder = { -- includes Planetarium even though it's unused in AB+ for convenience EID.descriptions[languageCode].Teleport2RoomNames = { "Sala Normal","Sala do Chefe","Sala Super Secreta","Loja","Sala do Tesouro","Sala de Sacrifício","Sala do Dado","Biblioteca","Sala da Maldição","Sala do Mini-Chefe","Sala do Desafio/Desafio do Chefe","Sala do Isaac","Sala Estéril","Sala do Jogos","Sala do Baú","Planetário","Sala Secreta","Sala Vermelha Especial","Sala do Anjo/Diabo","Sala I AM ERROR" } EID.descriptions[languageCode].Teleport2GreedRoomNames = { "Sala Principal", "Sala do Chefe", "Loja", "Sala do Tesouro Prateada/Dourada", "Sala da Maldição", "Sala da Saída", "Sala Super Secreta", "Sala do Anjo/Diabo", "Sala I AM ERROR" } + +-- Conditional descriptions +-- Strings will be appended to the original description +-- Tables with one entry will completely replace the original description +-- Tables with two or more entries are find-replace pairs +EID.descriptions[languageCode].ConditionalDescs = { + ["5.300.48"] = "Teleporta para a Sala I AM Error#Blank Card e ?-Carta serão destruídas", -- Blank Card + Q Card +} \ No newline at end of file diff --git a/descriptions/ab+/ru.lua b/descriptions/ab+/ru.lua index c5d9088c..3fa24719 100644 --- a/descriptions/ab+/ru.lua +++ b/descriptions/ab+/ru.lua @@ -894,4 +894,12 @@ EID.descriptions[languageCode].ItemReminder = { Trinkets = "Брелоки", Passives = "Пассивные предметы" } +} + +-- Conditional descriptions +-- Strings will be appended to the original description +-- Tables with one entry will completely replace the original description +-- Tables with two or more entries are find-replace pairs +EID.descriptions[languageCode].ConditionalDescs = { + ["5.300.48"] = "Телепортирует в комнату Я-ОШИБКА#Пустая карта и ?-карта будут уничтожены", -- Blank Card + Q Card } \ No newline at end of file diff --git a/descriptions/ab+/spa.lua b/descriptions/ab+/spa.lua index 9fbb17e5..134b8229 100644 --- a/descriptions/ab+/spa.lua +++ b/descriptions/ab+/spa.lua @@ -919,4 +919,12 @@ EID.descriptions[languageCode].MCM = { DemoObjectName = "Nombre de objeto demostrativo", DemoObjectTransformation = "Transformación demostrativa", DemoObjectText = "Este texto está en español#¡Una larga y genial descripción para demostrar los saltos de línea causados por la anchura de texto de EID!#\1 Esta linea también es genial#Esta linea te ama {{Heart}}", +} + +-- Conditional descriptions +-- Strings will be appended to the original description +-- Tables with one entry will completely replace the original description +-- Tables with two or more entries are find-replace pairs +EID.descriptions[languageCode].ConditionalDescs = { + ["5.300.48"] = "Te teletransporta a la habitación de I Am Error#Tanto Carta en blanco como la ¿? carta se destruirán", -- Blank Card + Q Card } \ No newline at end of file diff --git a/descriptions/ab+/uk_ua.lua b/descriptions/ab+/uk_ua.lua index d654d2ae..6bc7fa7b 100644 --- a/descriptions/ab+/uk_ua.lua +++ b/descriptions/ab+/uk_ua.lua @@ -955,3 +955,11 @@ EID.descriptions[languageCode].PickupNames = { ["5.350"] = "{{Trinket}} Брелок", } + +-- Conditional descriptions +-- Strings will be appended to the original description +-- Tables with one entry will completely replace the original description +-- Tables with two or more entries are find-replace pairs +EID.descriptions[languageCode].ConditionalDescs = { + ["5.300.48"] = "Телепортує до кімнати Я - ПОМИЛКА#Пуста Карта та ?-Карта будуть знищені", -- Blank Card + Q Card +} \ No newline at end of file diff --git a/descriptions/ab+/zh_cn.lua b/descriptions/ab+/zh_cn.lua index 773e1a35..3fc519cb 100644 --- a/descriptions/ab+/zh_cn.lua +++ b/descriptions/ab+/zh_cn.lua @@ -956,3 +956,11 @@ EID.descriptions[languageCode].PickupNames = { ["5.350"] = "{{Trinket}} 饰品", } + +-- Conditional descriptions +-- Strings will be appended to the original description +-- Tables with one entry will completely replace the original description +-- Tables with two or more entries are find-replace pairs +EID.descriptions[languageCode].ConditionalDescs = { + ["5.300.48"] = "传送至错误房#空白卡牌和?卡牌会被摧毁", -- Blank Card + Q Card +} \ No newline at end of file diff --git a/descriptions/rep/cs_cz.lua b/descriptions/rep/cs_cz.lua index 83599220..b7aa457f 100644 --- a/descriptions/rep/cs_cz.lua +++ b/descriptions/rep/cs_cz.lua @@ -1120,10 +1120,8 @@ EID.descriptions[languageCode].CraftingPreviewKey = "Náhled:" EID.descriptions[languageCode].CraftingResults = "(Posouvání: Podrž {{CONFIG_BoC_Toggle}} + {{ButtonY}} {{ButtonA}}, Uzamknout: {{ButtonX}}, Obnovit: {{ButtonB}}, Resetovat pytlík: Podržet {{ButtonRB}})" -EID.descriptions[languageCode].BlankCardCharge = "Nabití Prázdné Karty:" -EID.descriptions[languageCode].BlankCardQCard = "Teleportuje tě do JSEM ERROR místnosti#Prázdná Karta a ?-Karta bude zničena" -EID.descriptions[languageCode].ClearRuneCharge = "Nabití Čisté Runy:" -EID.descriptions[languageCode].PlaceboCharge = "Nabití Placeba:" +EID.descriptions[languageCode].VariableCharge = "Nabití {1}:" + EID.descriptions[languageCode].FlipItemToggleInfo = "(Podržením tlačítka {{ButtonSelect}} (Mapa) zobrazíš popis)" diff --git a/descriptions/rep/de.lua b/descriptions/rep/de.lua index 8c0f04f3..b4092ff1 100644 --- a/descriptions/rep/de.lua +++ b/descriptions/rep/de.lua @@ -1163,7 +1163,6 @@ EID.descriptions[languageCode].CraftingResults = "(Scrollen: Halte {{CONFIG_BoC_ EID.descriptions[languageCode].BlankCardCharge = "Blanko-Kartenladung:" EID.descriptions[languageCode].BlankCardEffect = "Effekt der Blanko-Karte:" -EID.descriptions[languageCode].BlankCardQCard = "Teleport zum I AM ERROR-Raum#Blanko-Karte und ?-Karte werden zerstört" EID.descriptions[languageCode].ClearRuneCharge = "Ladezeit der leeren Rune:" EID.descriptions[languageCode].PlaceboCharge = "Placebo-Ladezeit:" EID.descriptions[languageCode].FlipItemToggleInfo = "(Halte {{CONFIG_BoC_Toggle}} gedrückt, um die Beschreibung anzuzeigen)" diff --git a/descriptions/rep/en_us.lua b/descriptions/rep/en_us.lua index 3aed1f83..5b9d0272 100644 --- a/descriptions/rep/en_us.lua +++ b/descriptions/rep/en_us.lua @@ -37,7 +37,7 @@ local repCollectibles={ [52] = {"52", "Dr. Fetus", "↓ {{Tears}} x0.4 Fire rate multiplier#{{Bomb}} Isaac shoots bombs instead of tears#{{Damage}} Those bombs deal 10x Isaac's tear damage#If that results in over 60 damage, they instead deal 5x damage +30"}, -- Dr. Fetus [53] = {"53", "Magneto", "Pickups are attracted to Isaac#Opens chests from 2 tiles away, ignoring damage of Spike Chests"}, -- Magneto [55] = {"55", "Mom's Eye", "50% chance to shoot an extra tear backwards#{{Luck}} 100% chance at 5 luck"}, -- Mom's Eye - [59] = {"59", "The Book of Belial", "{{AngelDevilChance}} +12.5% Devil/Angel Room chance while held#{{Timer}} Receive for the room:#↑ {{Damage}} +2 Damage#{{Collectible7}} x1.5 Damage multiplier if Isaac has Blood of the Martyr"}, -- The Book of Belial (Judas' Birthright) + [59] = {"59", "The Book of Belial", "{{AngelDevilChance}} +12.5% Devil/Angel Room chance while held#{{Timer}} Receive for the room:#↑ {{Damage}} +2 Damage"}, -- The Book of Belial (Judas' Birthright) [62] = {"62", "Charm of the Vampire", "↑ {{Damage}} +0.3 Damage#{{HalfHeart}} Killing 13 enemies heals half a heart"}, -- Charm of the Vampire [64] = {"64", "Steam Sale", "{{Shop}} Shop items cost 50% less#Owning this item multiple times reduces the price further"}, -- Steam Sale [67] = {"67", "Sister Maggy", "Shoots normal tears#Deals 6 damage per tear"}, -- Sister Maggy @@ -55,7 +55,6 @@ local repCollectibles={ [98] = {"98", "The Relic", "{{SoulHeart}} Spawns 1 Soul Heart every 7-8 rooms"}, -- The Relic [101] = {"101", "The Halo", "↑ {{Heart}} +1 Health#↑ {{Speed}} +0.3 Speed#↑ {{Tears}} +0.2 Tears#↑ {{Damage}} +0.3 Damage#↑ {{Range}} +1.5 Range#{{Heart}} Heals 1 heart"}, -- The Halo [106] = {"106", "Mr. Mega", "↑ x1.85 Bomb damage#{{Bomb}} +5 Bombs"}, -- Mr. Mega - [108] = {"108", "The Wafer", "Reduces most damage taken to half a heart#{{Player14}} Doesn't work for Keeper or Tainted Keeper"}, -- The Wafer [110] = {"110", "Mom's Contacts", "↑ {{Range}} +1.5 Range#20% chance to shoot petrifying tears#{{Luck}} 50% chance at 20 luck"}, -- Mom's Contacts [114] = {"114", "Mom's Knife", "Isaac's tears are replaced by a throwable knife#{{Damage}} The knife deals 2x Isaac's damage while held and caps at 6x damage at 1/3 charge#Charging further only increases throwing range#Damage reduces to 2x when returning to Isaac"}, -- Mom's Knife [115] = {"115", "Ouija Board", "↑ {{Tears}} +0.5 Tears#Spectral tears"}, -- Ouija Board @@ -84,7 +83,7 @@ local repCollectibles={ [182] = {"182", "Sacred Heart", "↑ {{Heart}} +1 Health#↑ {{Damage}} x2.3 Damage multiplier#↑ {{Damage}} +1 Damage#↓ {{Tears}} -0.4 Tears#↓ {{Shotspeed}} -0.25 Shot speed#{{Heart}} Full health#Homing tears"}, -- Sacred Heart [184] = {"184", "Holy Grail", "↑ {{Heart}} +1 Health#{{Heart}} Heals 1 heart#Flight"}, -- Holy Grail [186] = {"186", "Blood Rights", "Deals 40 damage to every enemy#{{Warning}} Deals 1 heart of damage to Isaac#After the first use in a room, deals half a heart instead#{{Heart}} Removes Red Hearts first"}, -- Blood Rights - [188] = {"188", "Abel", "Mirrors Isaac's movement#Shoots towards Isaac#Deals 3.5 damage per tear#{{Player2}} Deals 7.5 damage as Cain"}, -- Abel + [188] = {"188", "Abel", "Mirrors Isaac's movement#Shoots towards Isaac#Deals 3.5 damage per tear"}, -- Abel [189] = {"189", "SMB Super Fan", "↑ {{Heart}} +1 Health#↑ {{Speed}} +0.2 Speed#↑ {{Tears}} +0.2 Tears#↑ {{Damage}} +0.3 Damage#↑ {{Range}} +2.5 Range#{{Heart}} Full health"}, -- SMB Super Fan [192] = {"192", "Telepathy for Dummies", "{{Timer}} Receive for the room:#↑ {{Range}} +3 Range#Homing tears"}, -- Telepathy for Dummies [193] = {"193", "MEAT!", "↑ {{Heart}} +1 Health#↑ {{Damage}} +0.3 Damage#{{Heart}} Heals 1 heart"}, -- MEAT! @@ -106,7 +105,7 @@ local repCollectibles={ [230] = {"230", "Abaddon", "↑ {{Speed}} +0.2 Speed#↑ {{Damage}} +1.5 Damage#{{BlackHeart}} Converts all heart containers into Black Hearts#{{BlackHeart}} +2 Black Hearts#{{Fear}} 15% chance to shoot fear tears"}, -- Abaddon [232] = {"232", "Stop Watch", "↑ {{Speed}} +0.3 Speed#{{Slow}} Enemies are permanently slowed down to 80% of their attack and movement speed"}, -- Stop Watch [233] = {"233", "Tiny Planet", "↑ {{Range}} +6.5 Range#Spectral tears#Isaac's tears orbit around him"}, -- Tiny Planet - [245] = {"245", "20/20", "↓ {{Damage}} x0.8 Damage multiplier#Isaac shoots 2 tears at once#Removes the tear rate penalty of {{Collectible153}} Mutant Spider, {{Collectible2}} The Inner Eye and {{Collectible169}} Polyphemus"}, -- 20/20 + [245] = {"245", "20/20", "↓ {{Damage}} x0.8 Damage multiplier#Isaac shoots 2 tears at once"}, -- 20/20 [248] = {"248", "Hive Mind", "Blue spiders and flies deal double damage#Spider and fly familiars become stronger"}, -- Hive Mind [253] = {"253", "Magic Scab", "↑ {{Heart}} +1 Health#↑ {{Luck}} +1 Luck#{{Heart}} Heals 1 heart"}, -- Magic Scab [254] = {"254", "Blood Clot", "↑ {{Damage}} +1 Damage for the left eye#↑ {{Range}} +2.75 Range for the left eye"}, -- Blood Clot @@ -142,7 +141,7 @@ local repCollectibles={ [310] = {"310", "Eve's Mascara", "↑ {{Damage}} x2 Damage multiplier#↓ {{Tears}} x0.66 Tear multiplier#↓ {{Shotspeed}} -0.5 Shot speed"}, -- Eve's Mascara [314] = {"314", "Thunder Thighs", "↑ {{Heart}} +1 Health#↓ {{Speed}} -0.4 Speed#{{Heart}} Heals 1 heart#Isaac can destroy rocks by walking into them"}, -- Thunder Thighs [315] = {"315", "Strange Attractor", "Isaac's tears attract enemies, pickups and trinkets#The attraction effect is much stronger at the end of the tears' path"}, -- Strange Attractor - [316] = {"316", "Cursed Eye", "Charged wave of 5 tears#{{Warning}} Taking damage while partially charged teleports Isaac to a random room#{{Collectible260}} Black Candle removes the teleportation effect"}, -- Cursed Eye + [316] = {"316", "Cursed Eye", "Charged wave of 5 tears#{{Warning}} Taking damage while partially charged teleports Isaac to a random room"}, -- Cursed Eye [319] = {"319", "Cain's Other Eye", "Shoots tears in random directions with the same effects as Isaac#{{Damage}} Deals 75% of Isaac's damage"}, -- Cain's Other Eye [320] = {"320", "???'s Only Friend", "Controllable fly#Deals 15 contact damage per second"}, -- ???'s Only Friend [323] = {"323", "Isaac's Tears", "Shoots 8 tears in all directions#The tears copy Isaac's tear effects, plus 5 damage#Recharges by shooting tears"}, -- Isaac's Tears @@ -160,7 +159,7 @@ local repCollectibles={ [352] = {"352", "Glass Cannon", "{{Damage}} Shoots a large piercing spectral tear that does 10x Isaac's damage#{{Warning}} While held, taking damage:#↓ Removes an extra 2 hearts of health#↓ Breaks the cannon for a few rooms#↑ {{Range}} +1.5 Range and leaves a blood trail for the room#The extra damage can't kill Isaac#Self-damage does not trigger the effect"}, -- Glass Cannon [354] = {"354", "Crack Jacks", "↑ {{Heart}} +1 Health#{{Heart}} Heals 1 heart#{{Trinket}} Spawns a trinket"}, -- Crack Jacks [355] = {"355", "Mom's Pearls", "↑ {{Range}} +2.5 Range#↑ {{Luck}} +1 Luck#{{SoulHeart}} +1 Soul Heart"}, -- Mom's Pearls - [360] = {"360", "Incubus", "Shoots tears with the same effects as Isaac#{{Damage}} Deals 75% of Isaac's damage#{{Player13}} Deals 100% damage while playing as Lilith"}, -- Incubus + [360] = {"360", "Incubus", "Shoots tears with the same effects as Isaac#{{Damage}} Deals 75% of Isaac's damage"}, -- Incubus [365] = {"365", "Lost Fly", "Moves along walls/obstacles in the room#Deals 30 contact damage per second#Nearby enemies target the fly"}, -- Lost Fly [366] = {"366", "Scatter Bombs", "{{Bomb}} +5 Bombs#Isaac's bombs scatter into 4-5 tiny bombs"}, -- Scatter Bombs [367] = {"367", "Sticky Bombs", "{{Bomb}} +5 Bombs#{{Slow}} Isaac's bombs stick to enemies and leave white slowing creep#Killing an enemy with a bomb spawns blue spiders"}, -- Sticky Bombs @@ -198,17 +197,17 @@ local repCollectibles={ [433] = {"433", "My Shadow", "A small shadow follows Isaac#{{Timer}} When an enemy touches the shadow a friendly black charger spawns for the room#The charger deals 8.7 damage per hit"}, -- My Shadow [437] = {"437", "D7", "Restarts a room and respawns all enemies#Can be used to get multiple room clear rewards from a single room"}, -- D7 [440] = {"440", "Kidney Stone", "Isaac occasionally stops firing and charges an attack that releases a burst of tears and a kidney stone"}, -- Kidney Stone - [442] = {"442", "Dark Prince's Crown", "While at 1 full Red Heart:#↑ {{Tears}} +2 Fire rate#↑ {{Range}} +1.5 Range#↑ {{Shotspeed}} +0.2 Shot speed#Does not work on characters without Red Hearts"}, -- Dark Prince's Crown + [442] = {"442", "Dark Prince's Crown", "While at 1 full Red Heart:#↑ {{Tears}} +2 Fire rate#↑ {{Range}} +1.5 Range#↑ {{Shotspeed}} +0.2 Shot speed"}, -- Dark Prince's Crown [444] = {"444", "Lead Pencil", "Isaac shoots a cluster of tears every 15 tears"}, -- Lead Pencil [448] = {"448", "Shard of Glass", "Upon taking damage:#{{Heart}} 25% chance to spawn a Red Heart#{{BleedingOut}} Isaac bleeds, spewing tears in the direction he is shooting#The bleeding does half a Red Heart of damage every 20 seconds#The bleeding stops if a Red Heart is healed, all Red Hearts are empty, or the next damage would kill Isaac"}, -- Shard of Glass [450] = {"450", "Eye of Greed", "{{Damage}} Every 20 tears, Isaac shoots a coin tear that deals x1.5 +10 damage#Enemies hit with the coin turn into gold#{{Coin}} Killing a gold enemy drops 1-3 coins#{{Warning}} Firing a coin tear costs 1 coin"}, -- Eye of Greed - [451] = {"451", "Tarot Cloth", "{{Card}} Spawns a card#{{Card}} Tarot cards effects are doubled or enhanced"}, -- Tarot Cloth + [451] = {"451", "Tarot Cloth", "{{Card}} Spawns a card#{{Card}} Tarot card effects are doubled or enhanced"}, -- Tarot Cloth [453] = {"453", "Compound Fracture", "↑ {{Range}} +1.5 Range#Tears shatter into 1-3 bone shards upon hitting anything"}, -- Compound Fracture [455] = {"455", "Dad's Lost Coin", "↑ {{Range}} +2.5 Range#{{Luck}} Spawns a Lucky Penny"}, -- Dad's Lost Coin [456] = {"456", "Midnight Snack", "↑ {{Heart}} +1 Health#{{Heart}} Heals 1 heart"}, -- Midnight Snack [459] = {"459", "Sinus Infection", "20% chance to shoot a sticky booger#{{Damage}} Boogers deal Isaac's damage once a second and stick for 10 seconds#{{Luck}} Not affected by luck"}, -- Sinus Infection [462] = {"462", "Eye of Belial", "↑ {{Range}} +1.5 Range#Piercing tears#Hitting an enemy makes the tear homing and doubles its damage"}, -- Eye of Belial - [464] = {"464", "Glyph of Balance", "{{SoulHeart}} +2 Soul Hearts#Champion enemy drops and room clear rewards become whatever pickup Isaac needs the most"}, -- Glyph of Balance + [464] = {"464", "Glyph of Balance", "{{SoulHeart}} +2 Soul Hearts#Room clear rewards and champion enemy drops become whatever pickup Isaac needs the most"}, -- Glyph of Balance [468] = {"468", "Shade", "Follows Isaac's movement on a 1 second delay#Deals 75 contact damage per second#After it deals 666 damage, it is absorbed by Isaac, increasing his contact damage"}, -- Shade [472] = {"472", "King Baby", "Other familiars follow it and automatically shoot at enemies#Stops moving when Isaac shoots#Teleports back to Isaac when he stops shooting"}, -- King Baby [474] = {"474", "Broken Glass Cannon", "Using the item turns it back into Glass Cannon"}, -- Broken Glass Cannon @@ -222,7 +221,7 @@ local repCollectibles={ [495] = {"495", "Ghost Pepper", "8.33% chance to shoot a blue fire that blocks enemy shots and deals contact damage#{{Luck}} 50% chance at 10 luck#Fires shrink and disappear after 2 seconds"}, -- Ghost Pepper [496] = {"496", "Euthanasia", "3.33% chance to shoot a needle#{{Luck}} 25% chance at 13 luck#Needles kill normal enemies instantly, bursting them into 10 tears#{{Damage}} Needles deal 3x Isaac's damage against bosses"}, -- Euthanasia [497] = {"497", "Camo Undies", "{{Confusion}} Entering a room camouflages Isaac and confuses all enemies until a tear is shot#↑ {{Speed}} +0.5 Speed while cloaked#Uncloaking deals damage around Isaac and grants a very brief fire rate and damage up"}, -- Camo Undies - [501] = {"501", "Greed's Gullet", "{{Heart}} +1 Heart container for every 25 coins Isaac has#{{Collectible416}} +1 Heart container for every 100 coins past 99#{{Player14}} Keeper can gain additional coin containers"}, -- Greed's Gullet + [501] = {"501", "Greed's Gullet", "{{Heart}} +1 Heart container for every 25 coins Isaac has"}, -- Greed's Gullet [503] = {"503", "Little Horn", "5% chance to shoot a tear that summons a Big Horn hand#{{Luck}} 20% chance at 15 luck#The hand instantly kills enemies and deals 36 damage to bosses#Isaac deals 7 contact damage per second"}, -- Little Horn [504] = {"504", "Brown Nugget", "Spawns a fly that shoots at enemies#Each shot deals 3.5 damage"}, -- Brown Nugget [506] = {"506", "Backstabber", "{{BleedingOut}} Hitting an enemy in the back deals double damage and causes bleeding, which makes enemies leave creep and take damage when they move"}, -- Backstabber @@ -271,7 +270,7 @@ local repCollectibles={ [584] = {"584", "Book of Virtues", "{{AngelChance}} +12.5% Angel Room chance while held#Spawns an orbital wisp familiar that shoots spectral tears but can be destroyed#Can be combined with a second active item to create special wisps#{{AngelRoom}} Turns the first Devil Room into an Angel Room#{{AngelRoom}} Allows Angel Rooms to spawn after taking a Devil deal"}, -- Book of Virtues [585] = {"585", "Alabaster Box", "Must be charged by picking up Soul Hearts, then spawns:#{{SoulHeart}} Three Soul Hearts#{{AngelRoom}} Two Angel Room items#{{DevilRoom}} Only spawns 2 Soul Hearts and 1 Angel item if a Devil deal was taken previously"}, -- Alabaster Box [586] = {"586", "The Stairway", "Spawns a ladder in the first room of every floor that leads to a unique {{AngelRoom}} Angel Room shop with items and pickups"}, -- The Stairway - [587] = {"587", "Menorah (Unused but scripted)", ""}, + [587] = {"587", "", ""}, [588] = {"588", "Sol", "{{BossRoom}} Reveals the location of the Boss Room#{{Timer}} When the floor boss is defeated, receive for the floor:#↑ {{Damage}} +3 Damage#↑ {{Luck}} +1 Luck#{{Card20}} The Sun effect#{{Battery}} Fully recharges the active item#{{CurseBlind}} Removes any curses"}, -- Sol [589] = {"589", "Luna", "Adds an extra {{SecretRoom}} Secret Room and {{SuperSecretRoom}} Super Secret Room to each floor#Reveals one Secret Room each floor#{{Timer}} Secret Rooms contain a beam of light that grant for the floor:#↑ {{Tears}} +0.5 Fire rate#↑ {{Tears}} Additional +0.5 Fire rate from the first beam per floor#{{HalfSoulHeart}} Half a Soul Heart"}, -- Luna [590] = {"590", "Mercurius", "↑ {{Speed}} +0.4 Speed#Most doors stay permanently open"}, -- Mercurius @@ -326,7 +325,7 @@ local repCollectibles={ [639] = {"639", "Yuck Heart", "{{RottenHeart}} +1 Rotten Heart"}, -- Yuck Heart [640] = {"640", "Urn of Souls", "Spews a stream of flames#Killing an enemy adds a charge to the urn"}, -- Urn of Souls [641] = {"641", "Akeldama", "Creates a chain of tears behind Isaac in hostile rooms#The tears deal 3.5 damage"}, -- Akeldama - [642] = {"642", "Magic Skin", "Spawns an item from the current room's item pool#{{BrokenHeart}} Turns 1 heart container or 1 Bone Heart or 2 Soul Hearts into a Broken Heart#{{Warning}} Replaces future items if Isaac isn't holding it {{ColorSilver}}(33% after 1 use, 50% after 2, 100% after 3)#Lower chance if Magic Skin is on a pedestal on the current floor#{{Player10}} Single use for The Lost"}, -- Magic Skin + [642] = {"642", "Magic Skin", "Spawns an item from the current room's item pool#{{BrokenHeart}} Turns 1 heart container or 1 Bone Heart or 2 Soul Hearts into a Broken Heart#{{Warning}} Replaces future items if Isaac isn't holding it {{ColorSilver}}(33% after 1 use, 50% after 2, 100% after 3)#Lower chance if Magic Skin is on a pedestal on the current floor"}, -- Magic Skin [643] = {"643", "Revelation", "{{SoulHeart}} +2 Soul Hearts#Flight#{{Chargeable}} Chargeable high damage holy beam#Does not replace Isaac's tears"}, -- Revelation [644] = {"644", "Consolation Prize", "↑ Increases Isaac's lowest stat out of Speed, Fire rate, Damage, and Range#Spawns either 3 {{Coin}} coins, 1 {{Bomb}} bomb, or 1 {{Key}} key depending on what Isaac has the least of"}, -- Consolation Prize [645] = {"645", "Tinytoma", "Large orbital that blocks shots#Deals 3.5 contact damage per second#Splits into smaller versions of itself upon taking 3 hits#The smaller versions break into blue spiders#Respawns 5 seconds after fully disappearing"}, -- Tinytoma @@ -388,7 +387,7 @@ local repCollectibles={ [701] = {"701", "Isaac's Tomb", "Spawns an {{DirtyChest}} Old Chest at the start of every floor#Old Chests require a key to unlock and can contain {{SoulHeart}} Soul Hearts, {{Trinket}} trinkets or Mom, Dad and Angel items"}, -- Isaac's Tomb [702] = {"702", "Vengeful Spirit", "Taking damage spawns an orbital wisp#Wisps shoot tears, do not block shots and disappear on the next floor#Caps at 6 wisps"}, -- Vengeful Spirit [703] = {"703", "Esau Jr.", "Swaps between the current character and Esau Jr.#Esau Jr. has {{BlackHeart}} 3 Black Hearts, {{Damage}} +2 Damage, flight, and random items equal to the number of items the player has the first time this item is used#Characters have independent items and health#{{Warning}} Dying as either character ends the run"}, -- Esau Jr. - [704] = {"704", "Berserk!", "{{Battery}} Charges with damage dealt#{{Timer}} Receive for 5 seconds:#↑ {{Speed}} +0.4 Speed#↓ {{Tears}} x0.5 Fire rate multiplier#↑ {{Tears}} +2 Fire rate#↑ {{Damage}} +3 Damage#Restricts attacks to a melee#{{Timer}} Each kill increases the duration by 1 second"}, -- Berserk! + [704] = {"704", "Berserk!", "{{Battery}} Charges with damage dealt#{{Timer}} Receive for 5 seconds:#↑ {{Speed}} +0.4 Speed#↓ {{Tears}} x0.5 Fire rate multiplier#↑ {{Tears}} +2 Fire rate#↑ {{Damage}} +3 Damage#Restricts attacks to a melee that reflects shots#{{Timer}} Each kill increases the duration by 1 second and grants brief invincibility"}, -- Berserk! [705] = {"705", "Dark Arts", "{{Timer}} Receive for 1 second (or until shooting):↑ {{Speed}} +1 Speed#Isaac can pass through enemies/projectiles and paralyzes them#When the effect ends, damages paralyzed enemies, removes paralyzed projectiles and creates a blast at Isaac's location#The attacks and blast are more powerful the more enemies/projectiles have been hit"}, -- Dark Arts [706] = {"706", "Abyss", "Consumes all item pedestals in the room and spawns an attack fly familiar for each one#Some items spawn a special fly when consumed"}, -- Abyss [707] = {"707", "Supper", "↑ {{Heart}} +1 Health#{{Heart}} Heals 1 heart"}, -- Supper @@ -429,12 +428,12 @@ EID.descriptions[languageCode].birthright ={ {"Cain", "", "↑ {{Luck}} +1 Luck#{{Arcade}} All future floors will contain an upgraded Arcade Room (except for Dark Room and Chest)#{{Collectible46}} Greatly increases Lucky Foot's chances of winning effect"}, {"Judas", "", "{{Collectible34}} The Book of Belial becomes a passive item similar to {{Collectible584}} Book of Virtues#{{Collectible34}} Grants The Book of Belial if Judas is not currently holding it#↑ {{Damage}} The damage boost it grants scales with the amount of charges the active item combined with it has#Grants special effects for certain active items"}, {"???", "", "{{SoulHeart}} Soul Hearts gained from health upgrades are doubled"}, - {"Eve", "", "{{Collectible122}} Whore of Babylon is active regardless of health#Dead Bird is always active"}, + {"Eve", "", "{{Collectible122}} Whore of Babylon is active regardless of health#{{Collectible117}} Dead Bird is always active"}, {"Samson", "", "{{Collectible157}} Bloody Lust can trigger 4 more times per floor, up to +14 damage after 10 triggers"}, {"Azazel", "", "Azazel's Brimstone beam becomes much wider#Does not increase damage"}, {"Lazarus", "", "↑ Resurrecting as Lazarus Risen grants {{Damage}} +7.2 damage#{{Timer}} Damage up wears off over 60 seconds#{{Blank}} Killing enemies while the effect is active extends it"}, {"Eden", "", "Spawns 3 random items from random item pools#Only one can be taken"}, - {"The Lost", "", "Prevents items useless to The Lost from spawning#Examples: items that only give health, flight, and/or spectral tears or activate upon taking damage"}, + {"The Lost", "", "Prevents items useless to The Lost from spawning#Examples: items that only give health, flight, spectral tears, or activate upon taking damage"}, {"Lazarus Risen", "", "↑ {{Damage}} +7.2 Damage#Damage up wears off over 60 seconds#Killing enemies while the effect is active extends it#The effect triggers each time Lazarus revives as Lazarus Risen"}, {"Black Judas", "", "{{Collectible34}} The Book of Belial becomes a passive item similar to {{Collectible584}} Book of Virtues#{{Collectible34}} Grants The Book of Belial if Judas is not currently holding it#↑ {{Damage}} The damage boost it grants scales with the amount of charges the active item combined with it has#Grants special effects for certain active items"}, {"Lilith", "", "Familiars are positioned in front of Lilith's face"}, @@ -785,7 +784,7 @@ local repTrinkets={ [153] = {"153", "Mom's Lock", "25% chance for a random Mom item effect each room"}, -- Mom's Lock [154] = {"154", "Dice Bag", "50% chance per new room to grant a single use die consumable item#The die disappears when leaving#The die does not take up a pill/card slot"}, -- Dice Bag [155] = {"155", "Holy Crown", "Spawns a {{TreasureRoom}} Treasure Room and {{Shop}} Shop in Cathedral"}, -- Holy Crown - [156] = {"156", "Mother's Kiss", "{{Heart}} +1 Heart container while held#{{Player14}} +1 Coin container for Keeper"}, -- Mother's Kiss + [156] = {"156", "Mother's Kiss", "{{Heart}} +1 Heart container while held"}, -- Mother's Kiss [157] = {"157", "Torn Card", "Every 15 shots, Isaac shoots an {{Collectible149}} Ipecac + {{Collectible5}} My Reflection tear with a very high range value"}, -- Torn Card [158] = {"158", "Torn Pocket", "Taking damage makes Isaac drop 2 of his coins, keys or bombs#The pickups can be replaced with other variants, such as golden keys, nickels, dimes, etc."}, -- Torn Pocket [159] = {"159", "Gilded Key", "{{Key}} +1 Key on pickup#{{GoldenChest}} Replaces all chests (except Old/Mega) with golden chests#{{GoldenChest}} Golden chests can contain extra cards, pills or trinkets"}, -- Gilded Key @@ -914,7 +913,7 @@ local repCards={ [77] = {"77", "XXI - The World?", "{{LadderRoom}} Spawns a trapdoor to a crawlspace"}, -- XXI - The World? [78] = {"78", "Cracked Key", "{{Collectible580}} Single-use Red Key"}, -- Cracked Key [79] = {"79", "Queen of Hearts", "{{Heart}} Spawns 1-20 Red Hearts"}, -- Queen of Hearts - [80] = {"80", "Wild Card", "Copies the effect of the most recently used pill, card, rune, soul stone or activated item"}, -- Wild Card + [80] = {"80", "Wild Card", "Copies the effect of your most recently used pill, card, rune, soul stone or activated item"}, -- Wild Card [81] = {"81", "Soul of Isaac", "Makes all item pedestals in the room cycle between two different items"}, -- Soul of Isaac [82] = {"82", "Soul of Magdalene", "{{Timer}} Effect lasts for the room:#{{HalfHeart}} Enemies killed drop half Red Hearts that disappear after 2 seconds"}, -- Soul of Magdalene [83] = {"83", "Soul of Cain", "Opens all doors in the room#{{Collectible580}} Creates red rooms on every wall possible"}, -- Soul of Cain @@ -1169,11 +1168,9 @@ EID.descriptions[languageCode].CraftingIsHidden = "Currently Hidden (Unhide with EID.descriptions[languageCode].CraftingResults = "(Scroll: Hold {{CONFIG_BoC_Toggle}} + {{ButtonY}} {{ButtonA}}, Lock: {{ButtonX}}, Refresh: {{ButtonB}}, Reset Bag: Hold {{ButtonRB}}, Search: {{ButtonEnter}})" -EID.descriptions[languageCode].BlankCardCharge = "Blank Card charge:" EID.descriptions[languageCode].BlankCardEffect = "Blank Card effect:" -EID.descriptions[languageCode].BlankCardQCard = "Teleport to I AM ERROR Room#Blank Card and ?-Card will be destroyed" -EID.descriptions[languageCode].ClearRuneCharge = "Clear Rune charge:" -EID.descriptions[languageCode].PlaceboCharge = "Placebo charge:" +EID.descriptions[languageCode].VariableCharge = "{1} charge:" + EID.descriptions[languageCode].FlipItemToggleInfo = "(Hold {{CONFIG_BoC_Toggle}} to show description)" EID.descriptions[languageCode].GlowingHourglassTransformed = "Will change back to Glowing Hourglass next floor" @@ -1192,21 +1189,40 @@ EID.descriptions[languageCode].AchievementWarningText = "Achievements are disabl EID.descriptions[languageCode].OldGameVersionWarningText = "EID is updated for the newest Steam version#Your game version is not officially supported, so some descriptions and features will be inaccurate#(This warning can be disabled in the config)" -EID.descriptions[languageCode].ModdedRecipesWarningText = "Modded items could make the crafting recipe calculation inaccurate!#Install REPENTOGON for modded recipe support#(This warning can be disabled in the config)" +EID.descriptions[languageCode].ModdedRecipesWarningText = "Modded items could make the crafting recipe calculation inaccurate!#Install REPENTOGON for improved modded recipe support#(This warning can be disabled in the config)" EID.descriptions[languageCode].ResultsWithX = "(Results with {1})" +-- Conditional descriptions +-- Strings will be appended to the original description +-- Tables with one entry will completely replace the original description +-- Tables with two or more entries are find-replace pairs local repConditions={ - ["5.100.161"] = "{{Player25}} Tainted ??? simply revives", -- Ankh - ["5.350.28"] = "{{Player25}} Tainted ??? simply revives", -- Broken Ankh - ["5.100.311"] = "{{Player24}} Tainted Judas simply revives", -- Judas' Shadow - ["5.100.332"] = "{{Player29}} Tainted Lazarus simply revives", -- Lazarus' Rags - ["5.350.23 (Tainted Lost)"] = "{{Player31}} Tainted Lost simply revives", -- Missing Poster - ["5.100.676"] = "No effect for characters that can't have Red Hearts", -- Empty Heart - ["5.300.15 (Tarot)"] = "{{DemonBeggar}} Spawns {{ColorShinyPurple}}2{{CR}} Devil Beggars", -- Temperance (Greed Mode + Tarot Cloth effect) - ["5.350.1"] = "{{Player14}} Spawns 0-1 coin as Keeper", -- Swallowed Penny + ["Tainted Revive"] = "{1} simply revives", + ["5.100.135 (Hard Mode)"] = {"1-2 coins", "1 coin", "2-3 coins", "2 coins"}, -- IV Bag Hard Mode (modify the PHD text too) + ["5.100.642"] = "Single use for {1}", -- Magic Skin + ["5.100.240"] = "{1} keeps the stat changes when he drops it", -- Experimental Treatment + ["5.100.644"] = "{1} keeps the stat increase when he drops it", -- Consolation Prize + + ["5.100.549"] = "{1} simply gets ↑ {{Tears}} +0.4 Fire rate on pickup", -- Brittle Bones (Keeper+Lost) + ["5.100.694"] = "Works for {1}, letting him survive 4 hits", -- Heartbreak + + ["5.100.201"] = "Refills {1}'s charge on pickup", --Iron Bar + ["5.350.172"] = "{1} removes the teleportation effect", -- Cursed Penny + ["5.100.188"] = "Deals 7.5 damage as {1}", -- Cain + Abel + ["5.100.360"] = "Deals 100% damage as {1}", -- Lilith + Incubus + ["5.100.501 (Deep Pockets)"] = "+1 Heart container for every 100 coins past 99", -- Greed's Gullet + Deep Pockets + ["5.350.156"] = "+1 Coin container for {1}", -- Mother's Kiss + ["5.100.230 (Keeper)"] = "{1} is left with 1 coin container", -- Abaddon + ["5.100.230 (Bethany)"] = "{1} is left with half a heart", -- Abaddon + ["5.100.230 (Tainted Bethany)"] = "{1} doesn't lose her blood charges", -- Abaddon + + ["5.100.245"] = "Removes the fire rate penalty of {1}", -- 20/20 + Mutant Spider, The Inner Eye, Polyphemus + ["5.100.245 (Keeper)"] = "Fire rate up and decreased tear spread for {1}", -- 20/20 + Keeper + ["20/20"] = "No fire rate penalty with {1}", -- 20/20 + Mutant Spider, The Inner Eye, Polyphemus + ["5.100.705"] = "Temporary +1 damage up for each bullet/enemy", -- Dark Arts + Dark/Tainted Judas } EID:updateDescriptionsViaTable(repConditions, EID.descriptions[languageCode].ConditionalDescs) @@ -1221,6 +1237,40 @@ local repBFFSSynergies = { } EID:updateDescriptionsViaTable(repBFFSSynergies, EID.descriptions[languageCode].BFFSSynergies) +-- TODO: make these more consistent with other descs, add icons, and is there any traits of the characters missing? +local repCharacterInfo = { + [4] = {"???", "Can't have Red Hearts#Devil deals that would cost 1 or 2 Red Hearts will cost 1 or 2 Soul Hearts instead#Destroying poop spawns 1 blue fly"}, + [8] = {"Lazarus", "Once per floor, when you die:#Resurrect as Lazarus Risen#Lose 1 Red Heart container#↑ {{Damage}} 0.5 Damage up"}, + [11] = {"Lazarus Risen", "Increased stats and 1.4x damage multiplier#When entering a new floor, turn back into Lazarus"}, + [12] = {"Dark Judas", "Can't have Red Hearts#Health ups grant Black Hearts#2x Damage multiplier"}, + [14] = {"Keeper", "Heal by picking up coins#Heart pickups are turned into Blue Flies#Devil deals cost 15 or 30 coins"}, + [18] = {"Bethany", "Use Soul Hearts to charge your active item#Can't use Soul Hearts as health#The first Devil room is guaranteed to be an Angel room instead"}, + [19] = {"Jacob", "Control Jacob and Esau at the same time#Both characters drop a bomb when one is used#Esau stays in place while holding {{ButtonRT}}#When there's a choice between items, Jacob and Esau can grab two simultaneously"}, + [20] = {"Esau", ""}, + + [21] = {"Tainted Isaac", "Item pedestals cycle between 2 options#You can only carry 8 passive items#Cycle which item will be dropped for a 9th item with {{ButtonRT}}"}, + [22] = {"Tainted Magdalene", "Health above 2 Red Hearts will slowly drain#On contact, do a melee swing#Chance for enemies to drop Half Red Hearts that disappear in 2 seconds#Drop is guaranteed on melee kill#Heal twice as much from non-pickup sources#Damage taken to draining hearts doesn't affect Devil Deal chance"}, + [23] = {"Tainted Cain", "Touching an item pedestal turns it into a variety of pickups#Gain collectibles by crafting 8 pickups together in the Bag of Crafting#The Bag's contents can be shifted with {{ButtonRT}} to replace specific pickups when full"}, + [24] = {"Tainted Judas", "Can't have Red Hearts#Health ups grant Black Hearts"}, + [25] = {"Tainted ???", "Bombs are replaced with Poop Spells#Doing damage spawns poop pickups#The HUD has a preview of your upcoming poop spells#You can store the next spell for later by using Hold#Can't have Red Hearts"}, + [26] = {"Tainted Eve", "Holding Fire will convert your hearts into Clot familiars#Different Heart types spawn Clots with more health and tear effects#Clots lose health over time#Using Sumptorium will absorb the Clots back into your health, if possible#Clots stay in place while holding {{ButtonRT}}"}, + [27] = {"Tainted Samson", "Dealing or taking damage builds up Berserk mode#{{Timer}} When you go berserk, receive for 5 seconds:#↑ {{Speed}} +0.4 Speed#↓ {{Tears}} x0.5 Fire rate multiplier#↑ {{Tears}} +2 Fire rate#↑ {{Damage}} +3 Damage#Restricts attacks to a melee that reflects shots#{{Timer}} Each kill increases the duration by 1 second and grants brief invincibility"}, + [28] = {"Tainted Azazel", "When you start charging, you sneeze blood#Hitting an enemy with the sneeze halves your charge time#The sneeze deals 1.5x Azazel's damage#{{BrimstoneCurse}} Affected enemies take extra damage from Brimstone beams#On death, cursed enemies explode and pass on the curse to nearby enemies"}, + [29] = {"Tainted Lazarus", "Lazarus has two states, each with their own items and health#Whenever you clear a room/wave or use Flip, you're switched to the other state"}, + [30] = {"Tainted Eden", "When you take damage, reroll your stats, items, trinket, and consumables#Items reroll into an item from the same item pool#Self-damage doesn't reroll"}, + [31] = {"Tainted Lost", "Cards that spawn have a 10% chance to be Holy Card#Quality {{Quality2}} or less items have a 20% chance to be rerolled#Only \"offensive\" items can spawn"}, + [32] = {"Tainted Lilith", "Pressing Fire launches a short-range fetus melee attack that does 3x damage#Holding Fire keeps the fetus out shooting tears"}, + [33] = {"Tainted Keeper", "Enemies drop coins that disappear in 2 seconds#Most item pedestals cost 15 coins#Devil deals and Angel items cost 15 or 30 coins#Shops don't require a key and have increased stock"}, + [34] = {"Tainted Apollyon", ""}, + [35] = {"Tainted Forgotten", "The Forgotten is an immobile bone pile that is picked up and thrown by The Soul for 3x damage#Only The Soul can take damage#Bombs are placed at Forgotten's location#Can't have Red Hearts"}, + [36] = {"Tainted Bethany", "Use Red Hearts to charge your active item#Can't have Red Hearts"}, + [37] = {"Tainted Jacob", "Dark Esau chases you, charging towards you when close#Anima Sola will chain Dark Esau down briefly, charging at you after 5(?) seconds or on using Anima Sola again#Dark Esau's charge does a lot of damage to enemies and ignores Boss Armor#If he hits you, you turn into a ghost that dies in one hit for the rest of the floor#While a ghost, one devil deal per room can be taken for free"}, + [38] = {"Dead Tainted Lazarus", "Lazarus has two states, each with their own items and health#Whenever you clear a room/wave or use Flip, you're switched to the other state"}, + [39] = {"Tainted Jacob 2", ""}, + [40] = {"Tainted Forgotten Soul", "The Forgotten is an immobile bone pile that is picked up and thrown by The Soul for 3x damage#Only The Soul can take damage#Bombs are placed at Forgotten's location#Can't have Red Hearts"}, +} +EID:updateDescriptionsViaTable(repCharacterInfo, EID.descriptions[languageCode].characterInfo) + -- If Debug enabled, add overwrite tables to the languagepack in order for the language completion script to be able to compare them if EID.enableDebug then EID.descriptions[languageCode].repCollectibles = repCollectibles diff --git a/descriptions/rep/fr.lua b/descriptions/rep/fr.lua index b20d1b6f..39fbc20b 100644 --- a/descriptions/rep/fr.lua +++ b/descriptions/rep/fr.lua @@ -1315,10 +1315,7 @@ EID.descriptions[languageCode].CraftingPreviewKey = "Prévisualiser:" EID.descriptions[languageCode].CraftingResults = "(Défiler: maintenir {{CONFIG_BoC_Toggle}} + {{ButtonY}} {{ButtonA}},#Verrouiller: {{ButtonX}}, Rafraîchir: {{ButtonB}})" -EID.descriptions[languageCode].BlankCardCharge = "Temps de charge avec {{ColorYellow}}Carte Blanche{{ColorWhite}} :" -EID.descriptions[languageCode].BlankCardQCard = "Téléporte Isaac dans la salle d'erreur#La {{ColorYellow}}Carte Blanche{{ColorWhite}} et la {{ColorYellow}}Carte ?{{ColorWhite}} seront détruites" -EID.descriptions[languageCode].ClearRuneCharge = "Temps de charge avec {{ColorYellow}}Rune de Cristal{{ColorWhite}} :" -EID.descriptions[languageCode].PlaceboCharge = "Temps de charge avec {{ColorYellow}}Placebo{{ColorWhite}} :" +EID.descriptions[languageCode].VariableCharge = "Temps de charge avec {{ColorYellow}}{1}{{ColorWhite}} :" EID.descriptions[languageCode].FlipItemToggleInfo = "( {{ButtonSelect}} : description)" EID.descriptions[languageCode].GlowingHourglassTransformed = "Redeviendra le Sablier Luisant au prochain étage" diff --git a/descriptions/rep/ja_jp.lua b/descriptions/rep/ja_jp.lua index cc6ffe22..6ab0b3ca 100644 --- a/descriptions/rep/ja_jp.lua +++ b/descriptions/rep/ja_jp.lua @@ -1188,11 +1188,8 @@ EID.descriptions[languageCode].CraftingPreviewKey = "アイテムの確認:" EID.descriptions[languageCode].CraftingResults = "レシピ操作:マップ表示中、#{{Blank}}  {{ButtonY}} {{ButtonA}} でスクロール#{{Blank}}  {{ButtonX}} でレシピ固定#{{Blank}}  {{ButtonB}} でレシピ更新" -EID.descriptions[languageCode].BlankCardCharge = "白紙のカードチャージ:" +EID.descriptions[languageCode].VariableCharge = "{1}チャージ:" EID.descriptions[languageCode].BlankCardEffect = "白紙のカードで使用時:" -EID.descriptions[languageCode].BlankCardQCard = "I AM ERRORにテレポート#白紙のカードと?カード 両方が消失する" -EID.descriptions[languageCode].ClearRuneCharge = "クリアルーンチャージ:" -EID.descriptions[languageCode].PlaceboCharge = "プラシーボチャージ:" EID.descriptions[languageCode].FlipItemToggleInfo = "(マップボタンで確認)" diff --git a/descriptions/rep/ko_kr.lua b/descriptions/rep/ko_kr.lua index 8c7cd375..b608f6e1 100644 --- a/descriptions/rep/ko_kr.lua +++ b/descriptions/rep/ko_kr.lua @@ -1286,7 +1286,6 @@ EID.descriptions[languageCode].CraftingResults = "목록 스크롤: {{CONFIG_BoC EID.descriptions[languageCode].BlankCardCharge = "Blank Card 충전량:" EID.descriptions[languageCode].BlankCardEffect = "Blank Card로 사용 시:" -EID.descriptions[languageCode].BlankCardQCard = "오류방으로 순간이동합니다.#Blank Card와 ? 카드가 제거됩니다." EID.descriptions[languageCode].ClearRuneCharge = "Clear Rune 충전량:" EID.descriptions[languageCode].PlaceboCharge = "Placebo 충전량:" EID.descriptions[languageCode].FlipItemToggleInfo = "( {{CONFIG_BoC_Toggle}} (맵 펼치기) 버튼을 꾹 눌러 설명 보기)" diff --git a/descriptions/rep/pt_br.lua b/descriptions/rep/pt_br.lua index 502d3343..2dc2c776 100644 --- a/descriptions/rep/pt_br.lua +++ b/descriptions/rep/pt_br.lua @@ -1083,7 +1083,6 @@ EID.descriptions[languageCode].CraftingPreviewKey = "Visualizar:" EID.descriptions[languageCode].CraftingResults = "(Rolar: Segurar {{CONFIG_BoC_Toggle}} + {{ButtonY}} {{ButtonA}}, Travar: {{ButtonX}}, Atualizar: {{ButtonB}}, Redefinir a Bolsa: Hold {{ButtonRB}})" EID.descriptions[languageCode].BlankCardCharge = "Carga do Blank Card:" -EID.descriptions[languageCode].BlankCardQCard = "Teleporta para a Sala I AM Error#Blank Card e ?-Carta serão destruídas" EID.descriptions[languageCode].ClearRuneCharge = "Limpar carga da Runa:" EID.descriptions[languageCode].PlaceboCharge = "Carga do Placebo:" EID.descriptions[languageCode].FlipItemToggleInfo = "(Segure {{CONFIG_BoC_Toggle}} para mostrar a descrição)" diff --git a/descriptions/rep/ru.lua b/descriptions/rep/ru.lua index c9b6b98f..5695d646 100644 --- a/descriptions/rep/ru.lua +++ b/descriptions/rep/ru.lua @@ -1070,7 +1070,6 @@ EID.descriptions[languageCode].CraftingPreviewKey = "Показать:" EID.descriptions[languageCode].CraftingResults = "(Листать: зажать {{CONFIG_BoC_Toggle}} + {{ButtonY}} {{ButtonA}},#Заблокировать: {{ButtonX}}, Обновить: {{ButtonB}})" EID.descriptions[languageCode].BlankCardCharge = "Заряд Пустой карты:" -EID.descriptions[languageCode].BlankCardQCard = "Телепортирует в комнату Я-ОШИБКА#Пустая карта и ?-карта будут уничтожены" EID.descriptions[languageCode].ClearRuneCharge = "Заряд Чистой руны:" EID.descriptions[languageCode].PlaceboCharge = "Заряд Плацебо:" EID.descriptions[languageCode].FlipItemToggleInfo = "(Зажми {{ButtonSelect}} чтобы показать описание)" diff --git a/descriptions/rep/spa.lua b/descriptions/rep/spa.lua index 633a334e..bc72b075 100644 --- a/descriptions/rep/spa.lua +++ b/descriptions/rep/spa.lua @@ -1130,7 +1130,6 @@ EID.descriptions[languageCode].CraftingResults = "(Desplazar: mantén {{CONFIG_B -- Mimic items charges EID.descriptions[languageCode].BlankCardCharge = "Cargas de Carta en Blanco:" -EID.descriptions[languageCode].BlankCardQCard = "Te teletransporta a la habitación de I Am Error#Tanto Carta en blanco como la ¿? carta se destruirán" EID.descriptions[languageCode].ClearRuneCharge = "Cargas de Runa limpia:" EID.descriptions[languageCode].PlaceboCharge = "Cargas de Placebo:" -- Mimic items charges end diff --git a/descriptions/rep/uk_ua.lua b/descriptions/rep/uk_ua.lua index 28bc6137..08ffe80b 100644 --- a/descriptions/rep/uk_ua.lua +++ b/descriptions/rep/uk_ua.lua @@ -1193,7 +1193,6 @@ EID.descriptions[languageCode].CraftingPreviewKey = "Показати:" EID.descriptions[languageCode].CraftingResults = "(Гортати: Утримуйте {{CONFIG_BoC_Toggle}} + {{ButtonY}} {{ButtonA}}, Закріпити: {{ButtonX}}, Оновити: {{ButtonB}}, Скинути: Утримуйте {{ButtonRB}})" EID.descriptions[languageCode].BlankCardCharge = "Заряд Пустої карти:" -EID.descriptions[languageCode].BlankCardQCard = "Телепортує до кімнати Я - ПОМИЛКА#Пуста Карта та ?-Карта будуть знищені" EID.descriptions[languageCode].ClearRuneCharge = "Заряд Чистої руни:" EID.descriptions[languageCode].PlaceboCharge = "Заряд Плацебо:" EID.descriptions[languageCode].FlipItemToggleInfo = "(Утримуйте {{ButtonSelect}} щоб побачити опис)" diff --git a/descriptions/rep/zh_cn.lua b/descriptions/rep/zh_cn.lua index 1b7795d0..ef046411 100644 --- a/descriptions/rep/zh_cn.lua +++ b/descriptions/rep/zh_cn.lua @@ -1097,10 +1097,7 @@ EID.descriptions[languageCode].itemPoolFor = "所属道具池:" EID.descriptions[languageCode].itemPoolNames = { [0] = "宝箱房", "商店", "头目房", "恶魔房", "天使房", "隐藏房", "图书馆", "赌博乞丐", "金箱子", "红箱子", "乞丐", "恶魔乞丐", "诅咒房", "钥匙乞丐", "电池乞丐", "妈妈的箱子", "贪婪模式宝箱房", "贪婪模式头目房", "贪婪模式商店", "贪婪模式恶魔房", "贪婪模式天使房", "贪婪模式诅咒房", "贪婪模式隐藏房", "抓娃娃机", "究极隐藏房", "炸弹乞丐", "星象房", "旧箱子", "宝宝商店", "木箱子", "腐烂乞丐", } -EID.descriptions[languageCode].BlankCardCharge = "空白卡牌充能:" -EID.descriptions[languageCode].BlankCardQCard = "传送至错误房#空白卡牌和?卡牌会被摧毁" -EID.descriptions[languageCode].ClearRuneCharge = "透明符文充能:" -EID.descriptions[languageCode].PlaceboCharge = "安慰剂充能:" +EID.descriptions[languageCode].VariableCharge = "{1}充能:" EID.descriptions[languageCode].FlipItemToggleInfo = "(按住 {{ButtonSelect}}(地图)来显示其描述)" EID.descriptions[languageCode].FalsePHDHeart = "生成1黑心" diff --git a/eid_config.lua b/eid_config.lua index a7007615..0c1b7142 100644 --- a/eid_config.lua +++ b/eid_config.lua @@ -6,7 +6,7 @@ EID.UserConfig = { -- Chinese = "zh_cn" SPECIAL THANKS TO Xheepey87, frto027 -- Czech = "cs_cz" SPECIAL THANKS TO domcizzz -- Dutch = "nl_nl" SPECIAL THANKS TO SomethingMax - -- English = "en_us", "en_us_detailed" (More detailed descriptions) + -- English = "en_us" SPECIAL THANKS TO everyone! -- French = "fr" SPECIAL THANKS TO biobak -- German = "de" SPECIAL THANKS TO Jake -- Greek = "el_gr" SPECIAL THANKS TO vanillarat diff --git a/features/eid_api.lua b/features/eid_api.lua index 62015430..b06e07b9 100644 --- a/features/eid_api.lua +++ b/features/eid_api.lua @@ -617,6 +617,12 @@ function EID:getObjectName(Type, Variant, SubType) return Type.."."..Variant.."."..SubType end +function EID:getPlayerName(id) + local playerInfo = EID:getDescriptionEntry("characterInfo")[id] + local birthrightInfo = EID.isRepentance and EID:getDescriptionEntry("birthright")[id+1] + return (playerInfo and playerInfo[1]) or (birthrightInfo and birthrightInfo[1]) or "???" +end + -- returns the name of a pill based on the pilleffect id function EID:getPillName(pillID, isHorsepill) local moddedDesc = EID:getDescriptionEntry("custom", "5.70."..pillID) @@ -713,6 +719,12 @@ end function EID:replaceNameMarkupStrings(text) for word in string.gmatch(text, "{{Name.-}}") do local strTrimmed = string.gsub(word, "{{Name(.-)}}", function(a) return a end) + local showIcon = true + -- If the markup is {{NameOnlyX###}}, do not print an icon before the name + if string.find(text, "NameOnly") then + strTrimmed = string.gsub(word, "{{NameOnly(.-)}}", function(a) return a end) + showIcon = false + end local indicator = string.sub(strTrimmed, 1, 1) local id = tonumber(string.sub(strTrimmed, 2, -1)) local name = "" @@ -723,15 +735,17 @@ function EID:replaceNameMarkupStrings(text) end name = EID:getObjectName(entityID[1], entityID[2], entityID[3]) elseif indicator == "C" then -- Collectible - name = "{{Collectible"..id.."}}"..EID:getObjectName(5, 100, id) + name = (showIcon and "{{Collectible"..id.."}} " or "")..EID:getObjectName(5, 100, id) elseif indicator == "T" then -- Trinket - name = "{{Trinket"..id.."}}"..EID:getObjectName(5, 350, id) + name = (showIcon and "{{Trinket"..id.."}} " or "")..EID:getObjectName(5, 350, id) elseif indicator == "P" then -- Pills - name = "{{Pill"..id.."}}"..EID:getPillName(id, false) + name = (showIcon and "{{Pill"..id.."}} " or "")..EID:getPillName(id, false) elseif indicator == "K" then -- Card - name = "{{Card"..id.."}}"..EID:getObjectName(5, 300, id) + name = (showIcon and "{{Card"..id.."}} " or "")..EID:getObjectName(5, 300, id) + elseif indicator == "I" then -- Player (I for Isaac) + name = (showIcon and "{{Player"..id.."}} " or "")..EID:getPlayerName(id) end - text = string.gsub(text, word, "{{ColorYellow}}"..name.."{{CR}}", 1) + text = string.gsub(text, word, name, 1) end return text end @@ -1179,7 +1193,7 @@ function EID:PlayersHaveCharacter(playerType, includeTainted) if player:GetPlayerType() == playerType then return true, player end - if includeTainted and REPENTANCE and Isaac.GetPlayerTypeByName(player:GetName()) == playerType then + if includeTainted and EID.isRepentance and Isaac.GetPlayerTypeByName(player:GetName()) == playerType then return true, player end end @@ -1586,7 +1600,7 @@ function EID:getLanguage() end function EID:AddToCollectiblesToCheckList(itemID) - table.insert(EID.collectiblesToCheck, itemID) + EID.collectiblesToCheck[itemID] = true end -- Add a specific entity to be ignored by EID. Set entitySubType to -1 in order to ignore all entities with this type+variant combi @@ -2057,5 +2071,6 @@ end -- Replaces Variable placeholders in string with a given value -- Example: "My {1} message" --> "My test message" function EID:ReplaceVariableStr(str, varID, newString) + if type(str) ~= "string" or newString == nil then return str end return str:gsub("{"..varID.."}", newString) end diff --git a/features/eid_conditionals.lua b/features/eid_conditionals.lua index e8fc27d1..805bb744 100644 --- a/features/eid_conditionals.lua +++ b/features/eid_conditionals.lua @@ -1,27 +1,220 @@ local game = Game() ---[[ Descs that need a variant: - respawn items that respawn you as the tainted version of yourself - tainted isaac Consolation Prize, Experimental Treatment - things that apply only to Lost/Tainted Lost (broken heart card, magic skin) - spoilers descs - lachyphragy in co-op? tech zero in co-op? yum heart and such obviously - black candle + cursed penny / cursed eye - healing stuff for keeper? - iron bar + notched axe - IV bag in hard mode - IV bag for keeper (hmm, two different modifiers needed!) - swallowed penny keeper - experimental pill phd / false phd / phd + falsephd prints nothing - iv bag also has interaction with PHD... - Items that have synergies with other specific items - Items that override other items (brimstone, mom's knife, epic fetus stuff) +EID.DescriptionConditions = {} +-- table of collectible IDs to periodically check if the players own. used by eid_modifiers.lua +EID.collectiblesToCheck = {} + +--[[ + Argument 1: The item ID + For convenience, numbers are assumed to be a collectible ID; strings in Type.Var.Sub format can be used as well + If you're adding a condition that applies to many items, you can pass in a table of IDs + If you're adding a condition that applies to an entire type of item, pass in a string in Type.Var format + Argument 2: The function that will apply the condition if it returns true - TODO: new config options for spoiler descs, and for hiding the "needed for collection" stuff + Argument 3 (optional): Additional text for finding the string in the localization file + For example, if you put "Overridden" here, modifying Tech X, it will look for ConditionalDescs["5.100.395 (Overridden)"] AND ConditionalDescs["Overridden"] + + Argument 4 (optional): Table with any additional options, usually not needed: + variableText: If there's a {1} in the desc, it will be replaced with this; can be a function for more dynamic text results, it will get descObj passed into it + variableText2: If there's a {2} in the desc, it will be replaced with this; can be a function + locTable: Specify a different table to look for the localization string in, rather than ConditionalDescs + noTable: Set to true to look in the base localizations only (requires modText) (not used yet...) + lineColor: Appended lines will be highlighted with this color + replaceColor: Find/replace text will be highlighted with this color + bulletpoint: Appended lines will begin with this bulletpoint + noFallback: Don't fallback to English if this isn't localized; by default, conditionals don't fallback, to avoid printing English text in unupdated languages + + Argument 5 (very optional): The position in the table to insert this new condition, in case mods want to insert modifiers before our base ones +]] +function EID:AddConditional(IDs, funcText, modText, extraTable, insertPoint) + if type(IDs) ~= "table" then IDs = {IDs} end + if modText == "" then modText = nil end + extraTable = extraTable or {} + -- make a shallow copy of the passed-in table + local newTable = {}; for k,v in pairs(extraTable) do newTable[k] = v end + newTable.func = funcText; + newTable.modifierText = modText; + if newTable.noFallback == nil then newTable.noFallback = true end + for _, id in ipairs(IDs) do + if type(id) ~= "string" then id = "5.100." .. id end + -- Check for only one period in the id string to mark it as being a general condition + local _, count = string.gsub(id, "%.", "") + if count == 1 then newTable.general = true end + EID.DescriptionConditions[id] = EID.DescriptionConditions[id] or {} + if insertPoint then table.insert(EID.DescriptionConditions[id], insertPoint, newTable) + else table.insert(EID.DescriptionConditions[id], newTable) end + end +end + +-- Easy to use functions for conditionals that rely on having a specific collectible/character +-- By default, they'll have a bulletpoint for the coll/char, and {1} becomes the coll/char's name + +-- checkInReminder is for if a synergy is no longer relevant once the item isn't obtainable (e.g. Abyss locusts) (true by default) +function EID:AddCollectibleConditional(IDs, ownedIDs, modText, extraTable, checkInReminder) + if type(ownedIDs) ~= "table" then ownedIDs = {ownedIDs} end + if checkInReminder == nil then checkInReminder = true end + extraTable = extraTable or {} + for _, ownedID in ipairs(ownedIDs) do + EID.collectiblesToCheck[ownedID] = true + if extraTable.variableText == nil then extraTable.variableText = "{{NameOnlyC" .. ownedID .. "}}" end + if extraTable.bulletpoint == nil then extraTable.bulletpoint = "Collectible" .. ownedID end + EID:AddConditional(IDs, function() return EID:ConditionalCollCheck(ownedID,checkInReminder) end, modText, extraTable) + end +end + +-- For adding pairs of abilities to collectibles; you can define a different modifier text for each of them +-- example: EID:AddSynergyConditional({list of IDs overridden by Brimstone}, Brimstone, "Overridden", "Overrides") +function EID:AddSynergyConditional(IDs, ownedIDs, modText1, modText2, extraTable1, extraTable2, checkInReminder) + EID:AddCollectibleConditional(IDs, ownedIDs, modText1, extraTable1, checkInReminder) + EID:AddCollectibleConditional(ownedIDs, IDs, modText2 or modText1, extraTable2 or extraTable1, checkInReminder) +end + +-- includeTainted is for if you want to check the normal and tainted version of a character (true by default) +function EID:AddPlayerConditional(IDs, charIDs, modText, extraTable, includeTainted) + if type(charIDs) ~= "table" then charIDs = {charIDs} end + if includeTainted == nil then includeTainted = true end + extraTable = extraTable or {} + for _, charID in ipairs(charIDs) do + if extraTable.variableText == nil then extraTable.variableText = "{{NameOnlyI" .. charID .. "}}" end + if extraTable.bulletpoint == nil then extraTable.bulletpoint = "Player" .. charID end + EID:AddConditional(IDs, function() return EID:ConditionalCharCheck(charID,includeTainted) end, modText, extraTable) + end +end + +-- Adding our conditionals (should this be its own file away from the functions that add/print conditionals?) + +--[[ +TODO STUFF: + +new config options for spoiler-heavy descriptions if we make any (chaos card and plan C?) +CO-OP BENEFIT ITEMS! tech zero / extension cord in co-op? yum heart and such +Items that override other items (brimstone, mom's knife, epic fetus stuff) +BFFs / the fly booster + Tainted Apollyon, Tainted Eve; melody trinket + Tainted Eve; these are insane synergies that deserve attention +TODO: Make some of these coll/char IDs be from the enum for readability? or just keep it to comments +TODO: A find/replace pair for some Keeper descriptions that talk about Red hearts but work for him, Red -> Coin or Red/Coin; Could be good for Dead Cat +TODO: AB+ tarot cloth buffs table? +-- hey what if all these Luck addons that I kinda don't like instead showed an accurate percentage of what they do at your current luck (although this is Modifier territory, with a per character display) +-- todo: TrinketConditional, use it for the crystal key + pandora's box or whichever key it is, and Black Feather items maybe +-- todo: Vibrant/Dim Bulb + doesn't work with pocket consumables. could be conditional actually if we have a list of char IDs with pocket actives +-- todo: idk about the BFFs synergy stuff but I noticed that Brown Nugget is incorrectly dealt with, it gained double damage in rep +-- hive mind and BFFs synergy has a lot of overlap also +-- brown nugget + sacrificial altar in AB+?! +-- ? Card + single use actives in Repentance? Alabaster Box +-- unrelated to conditionals: Glyph of Balance prediction in Item Reminder? + +-- meta todo: Put a 100% save file for AB+ and for Rep on my flash drive + ]] --- silly function but I don't want to mess with Game() colon functions in the conditions table +-- General conditions +-- Tarot Cloth (AB+ and Rep) (fallback to English because most are just find+replace) +EID:AddCollectibleConditional("5.300", 451, nil, {locTable = "tarotClothBuffsAB", replaceColor = "ColorShinyPurple", noFallback = false}) +if EID.isRepentance then EID:AddCollectibleConditional("5.300", 451, nil, {locTable = "tarotClothBuffs", replaceColor = "ColorShinyPurple", noFallback = false}) end +EID:AddCollectibleConditional("5.100", 356, nil, {locTable = "carBattery", replaceColor = "BlinkYellowGreen"}) -- Car Battery + +-- IV Bag conditions (need to be applied in a specific order) +EID:AddCollectibleConditional(135, 75, "PHD") -- PHD improves IV Bag +EID:AddPlayerConditional(135, 14, "Keeper 0-1") -- Keeper gets 0-1 coins +if EID.isRepentance then EID:AddConditional(135, function() return EID:IsHardMode() end, "Hard Mode") end -- Hard Mode pays out less + +-- Greed Mode +EID:AddConditional({241, "5.300.15"}, function() return game:IsGreedMode() end) -- Contract From Below, Temperance +EID:AddConditional("5.300.15", function() return game:IsGreedMode() and EID:PlayersHaveCollectible(451) end, "Tarot") -- Temperance + Greed + Tarot + +-- Different effect for No Red Health players +-- TODO: separate this into a Rep-only part, and figure out what they do exactly with Keeper/Forgotten +EID:AddConditional({442, 676}, function() return EID:CheckForNoRedHealthPlayer() end, "No Red") -- Dark Prince's Crown, Empty Heart +EID:AddConditional(81, function() return EID:CheckForNoRedHealthPlayer() end) -- Dead Cat +--TODO: Keeper/Forgotten DON'T benefit from Empty Heart but DO benefit from Dark Prince's Crown? Nothing's consistent... does the Soul benefit while Forgotten does + +-- Achievement checks (these always return true without REPENTOGON) +EID:AddConditional("5.350.23", function() return EID:HaveNotUnlockedAchievement(82) end) -- Sacrifice Poster unlocks The Lost + +-- Specific character synergies/changes +EID:AddPlayerConditional(549, {10,14})-- Keeper/Lost + Brittle Bones +EID:AddPlayerConditional(108, 14, "No Effect") -- Keeper + The Wafer +EID:AddPlayerConditional(227, 14, "Keeper 0-1") -- Keeper + Piggy Bank +EID:AddPlayerConditional(501, 14) -- Keeper + Greed's Gullet +EID:AddPlayerConditional(230, 14, "Keeper") -- Keeper + Abaddon + +-- Item Synergies +EID:AddSynergyConditional(7, 34); EID:AddCollectibleConditional("5.300.16", 7) -- Martyr + Book of Belial/The Devil +EID:AddSynergyConditional(316, 260) -- Black Candle + Cursed Eye +EID:AddCollectibleConditional("5.300.48", 286, nil, {lineColor = "ColorSilver"}) -- Blank Card + ? Card + +-- Overridden by Brimstone +-- Haven't done it yet but I'm sure preparing the system for it +-- Remember most of these will be AB+ only (not EID.isRepentance) + + +if EID.isRepentance then + -- General conditions + EID:AddCollectibleConditional("5.100", 706, nil, {locTable = "abyssSynergies", lineColor = "ColorRed"}, false) -- Abyss (no item reminder) + EID:AddCollectibleConditional("5.100", 59, nil, {locTable = "bookOfBelialBuffs"}) -- Belial Birthright + EID:AddCollectibleConditional("5.100", 664, nil, {locTable = "bingeEaterBuffs"}) -- Binge Eater + + -- Co-op friendly items + -- todo (yum heart, extension cord) + + -- Tainted characters reviving as themselves + EID:AddPlayerConditional({161, "5.350.28"}, 25, "Tainted Revive") -- Ankh, Broken Ankh + EID:AddPlayerConditional(311, 24, "Tainted Revive") -- Judas's Shadow + EID:AddPlayerConditional(332, {29, 38}, "Tainted Revive") -- Lazarus's Rags + EID:AddPlayerConditional("5.350.23", 31, "Tainted Revive") -- Sacrifice Poster + + -- Specific character synergies/changes + EID:AddPlayerConditional("5.350.1", 14, "Keeper 0-1") -- Keeper + Swallowed Penny + EID:AddPlayerConditional(188, 2) -- Cain + Abel + EID:AddPlayerConditional(360, 13) -- Incubus + Lilith + EID:AddPlayerConditional({240, 644}, 21) -- Tainted Isaac + Experimental Treatment, Consolation Prize + EID:AddPlayerConditional({642, 694}, 10) -- Lost + Magic Skin, Heartbreak + EID:AddPlayerConditional("5.350.156", 14) -- Keeper + Mother's Kiss + EID:AddPlayerConditional(230, 18, "Bethany", nil, false) -- Bethany + Abaddon + EID:AddPlayerConditional(230, 36, "Tainted Bethany") -- Tainted Bethany + Abaddon + EID:AddPlayerConditional(245, 14, "Keeper") -- 20/20 + Keeper + EID:AddPlayerConditional(705, {12, 24}) -- Dark Arts + Dark/Tainted Judas + + -- Item Synergies + EID:AddCollectibleConditional(201, 147) -- Iron Bar refills Notched Axe + EID:AddCollectibleConditional("5.350.172", 260) -- Black Candle + Cursed Penny + EID:AddCollectibleConditional(501, 416) -- Greed's Gullet + Deep Pockets + EID:AddSynergyConditional(245, {2, 153, 169}, nil, "20/20") -- 20/20 + Mutant Spider, The Inner Eye, Polyphemus + EID:AddSynergyConditional(330, 561, "Overridden", "Overrides") -- Soy+Almond Milk +end + +----- Evaluation Functions ----- + +function EID:ConditionalCharCheck(playerType, includeTainted) + -- We don't want to display irrelevant item info inside the Item Reminder + if EID.InsideItemReminder then + local player = EID:ItemReminderGetAllPlayers()[EID.ItemReminderSelectedPlayer + 1] or EID.player + if player:GetPlayerType() == playerType then return true + elseif includeTainted and EID.isRepentance and Isaac.GetPlayerTypeByName(player:GetName()) == playerType then return true + else return false end + else + return EID:PlayersHaveCharacter(playerType, includeTainted) + end +end +function EID:ConditionalCollCheck(collectibleID, checkInReminder) + -- We don't want to display irrelevant item info inside the Item Reminder + if EID.InsideItemReminder then + if not checkInReminder then return false end + local player = EID:ItemReminderGetAllPlayers()[EID.ItemReminderSelectedPlayer + 1] or EID.player + if player:HasCollectible(collectibleID) then return true end + -- Check for the item being inside the Item Reminder player's Void (not sure if this is ever relevant...) + if player:HasCollectible(477) then + local playerID = EID:getPlayerID(player) + if EID.absorbedItems[tostring(playerID)] and EID.absorbedItems[tostring(playerID)][tostring(collectibleID)] then + return true + end + end + else + return EID.collectiblesOwned[collectibleID] or EID.collectiblesAbsorbed[collectibleID] + end + return false +end + function EID:IsGreedMode() return game:IsGreedMode() end @@ -32,10 +225,15 @@ end -- Check if we have any characters that can't have Red Health, to print additions to descs like Dead Cat function EID:CheckForNoRedHealthPlayer() - for i = 0, game:GetNumPlayers() - 1 do - local player = Isaac.GetPlayer(i) - if EID.NoRedHeartsPlayerIDs[player:GetPlayerType()] then - return true + if EID.InsideItemReminder then + local player = EID:ItemReminderGetAllPlayers()[EID.ItemReminderSelectedPlayer + 1] or EID.player + return EID.NoRedHeartsPlayerIDs[player:GetPlayerType()] + else + for i = 0, game:GetNumPlayers() - 1 do + local player = Isaac.GetPlayer(i) + if EID.NoRedHeartsPlayerIDs[player:GetPlayerType()] then + return true + end end end return false @@ -66,53 +264,8 @@ function EID:HaveNotUnlockedAchievement(achID) return not EID:HaveUnlockedAchievement(achID) end ---EID:PlayersHaveCharacter is already in the api to use for things like Swallowed Penny - - ---[[ (The conditions table has to be down here so that the functions exist) - -func: The function that will be called to check if the condition is true -vars: A table of values that will be passed into func -type: A string denoting what kind of description change this is - "append": Add new lines to the end of the description (default) - "replaceAll": The entire description is replaced with a new one - "findReplace": Find a phrase and replace it with a new one (the text in the localization file will be a table) -repOnly: Don't check this on Afterbirth+ (not always necessary, because AB+ won't have the text anyway) -abpOnly: Don't check this on Repentance -modifierText: Text to add to find a specific string in the localization file (for items with multiple modifiers) - -Due to co-op, it's best for replacing text in descriptions to only be used for things like Greed/Hard Mode -Otherwise, appending is better so that players not affected by the change can still see what it will be for them -]] -EID.DescriptionConditions = { - -- No Red HP - ["5.100.81"] = {func = EID.CheckForNoRedHealthPlayer}, -- Dead Cat - ["5.100.442"] = {func = EID.CheckForNoRedHealthPlayer}, -- Dark Prince's Crown - ["5.100.676"] = {func = EID.CheckForNoRedHealthPlayer}, -- Empty Heart - - -- Keeper - ["5.100.135"] = { -- IV Bag is complicated - {func = EID.PlayersHaveCollectible, vars = {75}, modifierText = "PHD"}, - {func = EID.PlayersHaveCharacter, vars = {14, true}, modifierText = "Keeper"}, - {func = EID.IsHardMode, type = "findReplace", modifierText = "Hard Mode"}, }, - ["5.350.1"] = {func = EID.PlayersHaveCharacter, vars = {14, true}}, -- Swallowed Penny - - -- Revives - ["5.100.161"] = {func = EID.PlayersHaveCharacter, vars = {25}}, -- Ankh - ["5.350.28"] = {func = EID.PlayersHaveCharacter, vars = {25}}, -- Broken Ankh - ["5.100.311"] = {func = EID.PlayersHaveCharacter, vars = {24}}, -- Judas's Shadow - ["5.100.332"] = {func = EID.PlayersHaveCharacter, vars = {29}}, -- Lazarus's Rags - ["5.350.23"] = { -- Missing Poster (revive, plus Unlock The Lost text if he's not unlocked) - {func = EID.PlayersHaveCharacter, vars = {31}, modifierText = "Tainted Lost"}, - {func = EID.HaveNotUnlockedAchievement, vars = {82} } }, - - -- Greed Mode - ["5.100.241"] = {func = EID.IsGreedMode}, -- Contract From Below - ["5.300.15"] = {func = EID.IsGreedMode, type = "replaceAll"}, -- Temperance: spawns beggar in greed mode - ["5.300.15 (Tarot)"] = {func = EID.IsGreedMode, type = "replaceAll"}, -- Temperance + Tarot Cloth + Greed Mode - -} +----- Apply Conditionals ----- -- thing to fix find/replace pairs with hyphens (like "1-2") breaking because hyphen is a special char -- https://stackoverflow.com/questions/29072601/lua-string-gsub-with-a-hyphen @@ -121,51 +274,81 @@ local function replace(str, what, with, count) with = string.gsub(with, "[%%]", "%%%%") -- escape replacement return string.gsub(str, what, with, count) end +-- super simple table concatenation: https://www.tutorialspoint.com/concatenation-of-tables-in-lua-programming +local function TableConcat(t1,t2) + for i=1,#t2 do + t1[#t1+1] = t2[i] + end + return t1 +end -function EID:applyConditionals(descObj, modifierText) - local typeVarSub = descObj.ObjType.."."..descObj.ObjVariant.."."..descObj.ObjSubType - if modifierText then typeVarSub = typeVarSub .. " (" .. modifierText .. ")" end +function EID:applyConditionals(descObj) + EID:CheckPlayersCollectibles() - local conds = EID.DescriptionConditions[typeVarSub] - if not conds then return descObj end - - -- Check every condition we need to check for this item (usually 1) - if #conds == 0 then conds = { conds } end + local typeVar = descObj.ObjType.."."..descObj.ObjVariant -- for general conditions (Tarot Cloth, Book of Virtues) + local typeVarSub = descObj.fullItemString -- for specific conditions + -- Combine general+specific conditions into one table + local conds = {} + if EID.DescriptionConditions[typeVar] then TableConcat(conds, EID.DescriptionConditions[typeVar]) end + if EID.DescriptionConditions[typeVarSub] then TableConcat(conds, EID.DescriptionConditions[typeVarSub]) end + -- Check every condition we need to check for this item for _, cond in ipairs(conds) do - local tvs = typeVarSub - if cond.modifierText then tvs = tvs .. " (" .. cond.modifierText .. ")" end - -- Don't fall back to English if the current language doesn't have the entry - local text = EID:getDescriptionEntry("ConditionalDescs", tvs, true) - if (text ~= nil) and (not repOnly or REPENTANCE) and (not abpOnly or not REPENTANCE) then - -- is there a way to pass all a table's values into a function aside from this? it's fine for now... - cond.vars = cond.vars or {} - if cond.func(EID, cond.vars[1], cond.vars[2], cond.vars[3], cond.vars[4]) then - if (cond.type == "append" or cond.type == nil) then - descObj.Description = descObj.Description .. "#" .. text - elseif (cond.type == "replaceAll") then - descObj.Description = text - elseif (cond.type == "findReplace") then - -- Entry 1 is replaced with entry 2, entry 3 is replaced with entry 4, etc. - local pos = 1 - while pos < #text do - local toFind = text[pos] - local replaceWith = text[pos+1] - - --"%d*%.?%d+" will grab every number group (1, 10, 0.5), this will allow us to not replace the "1" in "10" erroneously - if (type(toFind) == "number") then - local count = 0 - descObj.Description = string.gsub(descObj.Description, "%d*%.?%d+", function(s) - if (s == tostring(toFind) and count == 0) then - count = count + 1 - return replaceWith - end - end) - -- Basic find+replace for non-numbers - else - descObj.Description = replace(descObj.Description, tostring(toFind), replaceWith, 1) - end - pos = pos + 2 + -- Search for the localization string; "S" (for generals) or "T.V.S" or "T.V.S (Modifier)" or "Modifier" + local locTable = cond.locTable or "ConditionalDescs" + local text = nil + + if cond.noTable then + text = EID:getDescriptionEntry(cond.modifierText, nil, cond.noFallback) + elseif cond.general then + text = EID:getDescriptionEntry(locTable, descObj.ObjSubType, cond.noFallback) + elseif cond.modifierText then + text = EID:getDescriptionEntry(locTable, typeVarSub .. " (" .. cond.modifierText .. ")", cond.noFallback) + if text == nil then text = EID:getDescriptionEntry(locTable, cond.modifierText, cond.noFallback) end + else + text = EID:getDescriptionEntry(locTable, typeVarSub, cond.noFallback) + end + + -- If we find the localization string for this condition, and it passes the test, modify the description text + if text ~= nil and cond.func() then + local variableText = type(cond.variableText) == "function" and cond.variableText(descObj) or cond.variableText + local variableText2 = type(cond.variableText2) == "function" and cond.variableText2(descObj) or cond.variableText2 + + -- String = append + if type(text) == "string" then + text = EID:ReplaceVariableStr(text, 1, variableText) + text = EID:ReplaceVariableStr(text, 2, variableText2) + local iconStr = "#" + if cond.bulletpoint then iconStr = iconStr .. "{{" .. cond.bulletpoint .. "}} " end + if cond.lineColor then iconStr = iconStr .. "{{" .. cond.lineColor .. "}}" end + EID:appendToDescription(descObj, iconStr..text:gsub("#",iconStr)) + + -- Table with 1 entry = replace + elseif #text == 1 then + descObj.Description = EID:ReplaceVariableStr(EID:ReplaceVariableStr(text[1], 1, variableText), 2, variableText2) + + -- Table with 2+ entries = find and replace pairs + -- Entry 1 is replaced with entry 2, entry 3 is replaced with entry 4, etc. + else + local pos = 1 + while pos < #text do + local toFind = text[pos] + local replaceWith = EID:ReplaceVariableStr(text[pos+1], 1, variableText) + replaceWith = EID:ReplaceVariableStr(replaceWith, 2, variableText2) + if cond.replaceColor then replaceWith = "{{" .. cond.replaceColor .. "}}" .. replaceWith .. "{{CR}}" end + --"%d*%.?%d+" will grab every number group (1, 10, 0.5), this will allow us to not replace the "1" in "10" erroneously + if (type(toFind) == "number") then + local count = 0 + descObj.Description = string.gsub(descObj.Description, "%d*%.?%d+", function(s) + if (s == tostring(toFind) and count == 0) then + count = count + 1 + return replaceWith + end + end) + -- Basic find+replace for non-numbers + else + descObj.Description = replace(descObj.Description, tostring(toFind), replaceWith, 1) end + pos = pos + 2 end end end diff --git a/features/eid_data.lua b/features/eid_data.lua index eca1a9f0..f67e09c2 100644 --- a/features/eid_data.lua +++ b/features/eid_data.lua @@ -918,6 +918,14 @@ EID.LocalModePositionOffset = { -- Items that dont have an effect with BFFS! item EID.BFFSNoSynergy = {[11] = true, [81] = true, [238] = true, [239] = true, [243] = true, [265] = true, [268] = true, [269] = true, [278] = true, [280] = true, [281] = true, [387] = true, [404] = true, [405] = true, [431] = true, [436] = true, [469] = true, [472] = true, [492] = true, [516] = true, [528] = true, [542] = true, [543] = true } +-- todo: this table is wrong, for instance brown nugget didnt have one and then got one +if REPENTANCE then + EID.BFFSNoSynergy[504] = true -- Brown Nugget + EID.BFFSNoSynergy[567] = true -- Paschal Candle + EID.BFFSNoSynergy[651] = true -- Star of Bethlehem + EID.BFFSNoSynergy[697] = true -- Vanishing Twin +end + -- Character IDs that aren't allowed to have Red Health: ???, The Lost, The Soul EID.NoRedHeartsPlayerIDs = { [4] = true, [10] = true, [17] = true } if REPENTANCE then @@ -925,12 +933,10 @@ if REPENTANCE then EID.NoRedHeartsPlayerIDs = { [4] = true, [10] = true, [12] = true, [17] = true, [24] = true, [25] = true, [31] = true, [35] = true, [36] = true, [40] = true } end -if REPENTANCE then - EID.BFFSNoSynergy[504] = true -- Brown Nugget - EID.BFFSNoSynergy[567] = true -- Paschal Candle - EID.BFFSNoSynergy[651] = true -- Star of Bethlehem - EID.BFFSNoSynergy[697] = true -- Vanishing Twin -end +-- Cards that don't work with Blank Card in Repentance (Note: ? Card is blacklisted here, don't use this for determining what is a card) +EID.blankCardHidden = {[32]=true,[33]=true,[34]=true,[35]=true,[36]=true,[37]=true,[38]=true,[39]=true,[40]=true,[41]=true,[48]=true,[49]=true,[50]=true,[55]=true,[78]=true,[81]=true,[82]=true,[83]=true,[84]=true,[85]=true,[86]=true,[87]=true,[88]=true,[89]=true,[90]=true,[91]=true,[92]=true,[93]=true,[94]=true,[95]=true,[96]=true,[97]=true,} +-- Cards that are treated as runes +EID.runeIDs = {[32]=true,[33]=true,[34]=true,[35]=true,[36]=true,[37]=true,[38]=true,[39]=true,[40]=true,[41]=true,[55]=true,[81]=true,[82]=true,[83]=true,[84]=true,[85]=true,[86]=true,[87]=true,[88]=true,[89]=true,[90]=true,[91]=true,[92]=true,[93]=true,[94]=true,[95]=true,[96]=true,[97]=true,} @@ -1104,4 +1110,4 @@ EID.BoC.ComponentShifts = { {0x00000011, 0x0000000F, 0x00000014}, {0x00000011, 0x0000000F, 0x00000017}, {0x00000011, 0x0000000F, 0x0000001A} -} \ No newline at end of file +} diff --git a/features/eid_debugging.lua b/features/eid_debugging.lua index 9b8fda83..1cb6ea58 100644 --- a/features/eid_debugging.lua +++ b/features/eid_debugging.lua @@ -28,11 +28,11 @@ for _,lang in ipairs(languageFilesToCheck) do if not table2[k] then print(" Table '" .. prevKey .. "' does not contain key: " .. k) progress[2] = progress[2] + 1 + elseif type(table2[k]) ~= type(table1[k]) then + print("Type mismatch in table '" .. prevKey .. "', key: " .. k) + progress[2] = progress[2] + 1 elseif type(table2[k]) == "table" then - if type(table1[k]) ~= "table" then - print("Type mismatch in table '" .. prevKey .. "', key: " .. k) - progress[2] = progress[2] + 1 - else EID:compareTables(table1[k], table2[k], k, progress) end + EID:compareTables(table1[k], table2[k], k, progress) end else -- check for broken markup stuff local filteredText = EID:replaceShortMarkupStrings(table2[k]) diff --git a/features/eid_itemprediction.lua b/features/eid_itemprediction.lua index e7108115..c827f74b 100644 --- a/features/eid_itemprediction.lua +++ b/features/eid_itemprediction.lua @@ -170,9 +170,9 @@ function EID:Teleport1Prediction(rng) end -- Teleport 2 Destination Prediction -- -local teleport2Order = { 1,5,8,2,4,13,21,12,10,6,11,18,19,9,20,24,7,1025,666,3 } +local teleport2Order = { 1,1024,5,8,2,4,13,21,12,10,6,11,18,19,9,20,24,7,1025,666,3 } local teleport2GreedOrder = { 1,5,2,4,10,23,8,666,3 } -local teleport2Icons = { [1025] = "{{RedRoom}}", [666] = "{{AngelDevilChance}}" } +local teleport2Icons = { [1024] = "{{RedRoom}}", [1025] = "{{RedRoom}}", [666] = "{{AngelDevilChance}}" } function EID:Teleport2Prediction() local level = game:GetLevel() @@ -186,8 +186,10 @@ function EID:Teleport2Prediction() local gridIndex = room.SafeGridIndex local roomDesc = level:GetRoomByIdx(gridIndex, curDimension) if roomDesc.ListIndex == i and not room.Clear then - -- Check for Special Red Rooms, which get ordered differently than their non-red version - if EID.isRepentance and room.Data.Type ~= 1 and room.Flags & 1024 == 1024 then unclearedTypes[1025] = true + -- Check for Red Rooms and Special Red Rooms, which get ordered differently than their non-red version + if EID.isRepentance and room.Flags & 1024 == 1024 then + if room.Data.Type ~= 1 then unclearedTypes[1025] = true + else unclearedTypes[1024] = true end else unclearedTypes[room.Data.Type] = true end end end diff --git a/features/eid_modifiers.lua b/features/eid_modifiers.lua index 736c70d6..f7b0db86 100644 --- a/features/eid_modifiers.lua +++ b/features/eid_modifiers.lua @@ -7,38 +7,37 @@ EID.inModifierPreview = false EID.TabDescThisFrame = false -- List of collectible IDs for us to check if a player owns them; feel free to add to this in mods that add description modifiers! -EID.collectiblesToCheck = { CollectibleType.COLLECTIBLE_VOID, CollectibleType.COLLECTIBLE_CAR_BATTERY, CollectibleType.COLLECTIBLE_BFFS } +EID.collectiblesToCheck[CollectibleType.COLLECTIBLE_VOID] = true +EID.collectiblesToCheck[CollectibleType.COLLECTIBLE_BFFS] = true local maxSlot = 1 -- Repentance modifiers if EID.isRepentance then maxSlot = 3 - --include the AB+ collectiblesToCheck in this table! (wish there was an easy way to merge two tables) - EID.collectiblesToCheck = { CollectibleType.COLLECTIBLE_VOID, - CollectibleType.COLLECTIBLE_BINGE_EATER, CollectibleType.COLLECTIBLE_BOOK_OF_VIRTUES, CollectibleType.COLLECTIBLE_SPINDOWN_DICE, - CollectibleType.COLLECTIBLE_TAROT_CLOTH, CollectibleType.COLLECTIBLE_MOMS_BOX, 59, --Birthright Belial - CollectibleType.COLLECTIBLE_BLANK_CARD, CollectibleType.COLLECTIBLE_CLEAR_RUNE, CollectibleType.COLLECTIBLE_PLACEBO, - CollectibleType.COLLECTIBLE_FALSE_PHD, CollectibleType.COLLECTIBLE_ABYSS, CollectibleType.COLLECTIBLE_FLIP, CollectibleType.COLLECTIBLE_CAR_BATTERY, - CollectibleType.COLLECTIBLE_GLOWING_HOUR_GLASS, CollectibleType.COLLECTIBLE_BFFS - } + EID.collectiblesToCheck[CollectibleType.COLLECTIBLE_BOOK_OF_VIRTUES] = true + EID.collectiblesToCheck[CollectibleType.COLLECTIBLE_SPINDOWN_DICE] = true + EID.collectiblesToCheck[CollectibleType.COLLECTIBLE_MOMS_BOX] = true + EID.collectiblesToCheck[CollectibleType.COLLECTIBLE_BLANK_CARD] = true + EID.collectiblesToCheck[CollectibleType.COLLECTIBLE_CLEAR_RUNE] = true + EID.collectiblesToCheck[CollectibleType.COLLECTIBLE_PLACEBO] = true + EID.collectiblesToCheck[CollectibleType.COLLECTIBLE_FALSE_PHD] = true + EID.collectiblesToCheck[CollectibleType.COLLECTIBLE_FLIP] = true + EID.collectiblesToCheck[CollectibleType.COLLECTIBLE_GLOWING_HOUR_GLASS] = true end EID.collectiblesOwned = {} EID.collectiblesAbsorbed = {} EID.blackRuneOwned = false -EID.blankCardHidden = {[32]=true,[33]=true,[34]=true,[35]=true,[36]=true,[37]=true,[38]=true,[39]=true,[40]=true,[41]=true,[49]=true,[50]=true,[55]=true,[78]=true,[81]=true,[82]=true,[83]=true,[84]=true,[85]=true,[86]=true,[87]=true,[88]=true,[89]=true,[90]=true,[91]=true,[92]=true,[93]=true,[94]=true,[95]=true,[96]=true,[97]=true,} -EID.runeIDs = {[32]=true,[33]=true,[34]=true,[35]=true,[36]=true,[37]=true,[38]=true,[39]=true,[40]=true,[41]=true,[55]=true,[81]=true,[82]=true,[83]=true,[84]=true,[85]=true,[86]=true,[87]=true,[88]=true,[89]=true,[90]=true,[91]=true,[92]=true,[93]=true,[94]=true,[95]=true,[96]=true,[97]=true,} EID.blackFeatherItems = {[215]=true,[216]=true,[230]=true,[260]=true,[262]=true,[339]=true,[344]=true,[654]=true,} EID.blackFeatherTrinkets = {[17]=true,[22]=true} -local lastCheck = 0 - +EID.LastCollectibleCheck = 0 function EID:CheckPlayersCollectibles() -- recheck the players' owned collectibles periodically, not every frame -- (has to be checked regularly due to mechanics like D4 / Tainted Eden) - if EID.GameUpdateCount >= lastCheck + 15 then - lastCheck = EID.GameUpdateCount + if EID.GameUpdateCount >= EID.LastCollectibleCheck + 15 then + EID.LastCollectibleCheck = EID.GameUpdateCount local numPlayers = game:GetNumPlayers() local players = {}; for i = 0, numPlayers - 1 do players[i] = Isaac.GetPlayer(i) end - for _,v in ipairs(EID.collectiblesToCheck) do + for v,_ in pairs(EID.collectiblesToCheck) do EID.collectiblesOwned[v] = false EID.collectiblesAbsorbed[v] = false for i = 0, numPlayers - 1 do @@ -230,45 +229,6 @@ local function SacrificeRoomCallback(descObj) return descObj end --- Handle Car Battery description addition -local function CarBatteryCallback(descObj) - local carBatteryBuff = EID:getDescriptionEntry("carBattery", descObj.ObjSubType) - if carBatteryBuff ~= nil then - -- String = append - if type(carBatteryBuff) == "string" then - local iconStr = "#{{Collectible356}} " - EID:appendToDescription(descObj, iconStr..carBatteryBuff:gsub("#",iconStr)) - -- Table with 1 entry = replace - elseif #carBatteryBuff == 1 then - descObj.Description = carBatteryBuff[1] - -- Table with 2+ entries = find and replace - -- Entry 1 is replaced with entry 2, entry 3 is replaced with entry 4, etc. - else - local pos = 1 - while pos < #carBatteryBuff do - local toFind = carBatteryBuff[pos] - local replaceWith = carBatteryBuff[pos+1] - - --"%d*%.?%d+" will grab every number group (1, 10, 0.5), this will allow us to not replace the "1" in "10" erroneously - if (type(toFind) == "number") then - local count = 0 - descObj.Description = string.gsub(descObj.Description, "%d*%.?%d+", function(s) - if (s == tostring(toFind) and count == 0) then - count = count + 1 - return "{{BlinkYellowGreen}}" .. replaceWith .. "{{CR}}" - end - end) - -- Basic find+replace for non-numbers - else - descObj.Description = string.gsub(descObj.Description, tostring(toFind), "{{BlinkYellowGreen}}" .. replaceWith .. "{{CR}}", 1) - end - pos = pos + 2 - end - end - end - return descObj -end - local function BlackFeatherCallback(descObj) local itemCounter = 0 for itemID, _ in pairs(EID.blackFeatherItems) do @@ -339,27 +299,6 @@ if EID.isRepentance then return descObj end - - -- Handle Bingeeater description addition - local function BingeEaterCallback(descObj) - local bingeBuff = EID:getDescriptionEntry("bingeEaterBuffs", descObj.ObjSubType) - if bingeBuff ~= nil then - local iconStr = "#{{Collectible664}} " - EID:appendToDescription(descObj, iconStr..bingeBuff:gsub("#",iconStr)) - end - return descObj - end - - -- Handle Book of Belial description for Judas' Birthright addition - local function BookOfBelialCallback(descObj) - local belialBuff = EID:getDescriptionEntry("bookOfBelialBuffs", descObj.ObjSubType) - if belialBuff ~= nil then - local iconStr = "#{{Collectible34}} " - EID:appendToDescription(descObj, iconStr..belialBuff:gsub("#",iconStr)) - end - return descObj - end - -- Handle Book of Virtues description addition local function BookOfVirtuesCallback(descObj) -- Display players' current active item's wisp effect when looking at a Book of Virtues pedestal @@ -515,45 +454,6 @@ if EID.isRepentance then return descObj end - -- Handle Tarot Cloth description addition - local function TarotClothCallback(descObj) - local clothBuff = EID:getDescriptionEntry("tarotClothBuffs", descObj.ObjSubType) - if clothBuff ~= nil then - -- String = append - if type(clothBuff) == "string" then - local iconStr = "#{{Collectible451}} " - EID:appendToDescription(descObj, iconStr..clothBuff:gsub("#",iconStr)) - -- Table with 1 entry = replace - elseif #clothBuff == 1 then - descObj.Description = clothBuff[1] - -- Table with 2+ entries = find and replace - -- Entry 1 is replaced with entry 2, entry 3 is replaced with entry 4, etc. - else - local pos = 1 - while pos < #clothBuff do - local toFind = clothBuff[pos] - local replaceWith = clothBuff[pos+1] - - --"%d*%.?%d+" will grab every number group (1, 10, 0.5), this will allow us to not replace the "1" in "10" erroneously - if (type(toFind) == "number") then - local count = 0 - descObj.Description = string.gsub(descObj.Description, "%d*%.?%d+", function(s) - if (s == tostring(toFind) and count == 0) then - count = count + 1 - return "{{ColorShinyPurple}}" .. replaceWith .. "{{CR}}" - end - end) - -- Basic find+replace for non-numbers - else - descObj.Description = string.gsub(descObj.Description, tostring(toFind), "{{ColorShinyPurple}}" .. replaceWith .. "{{CR}}", 1) - end - pos = pos + 2 - end - end - end - return EID:applyConditionals(descObj,"Tarot") - end - local hasBox = false local isGolden = false @@ -640,48 +540,37 @@ if EID.isRepentance then local hasTarot = false + + local function VariableCharge(descObj, metadata, collID, chargeText) + local text = EID:getDescriptionEntry(chargeText or "VariableCharge") + if text ~= nil and metadata ~= nil and metadata.mimiccharge and metadata.mimiccharge ~= -1 then + text = EID:ReplaceVariableStr(text, 1, "{{NameOnlyC" .. collID .. "}}") + EID:appendToDescription(descObj, "#{{ColorSilver}}{{Collectible" .. collID .. "}} " .. text .. " {{"..metadata.mimiccharge.."}}{{Battery}}") + end + end + -- Handle Blank Card description addition local function BlankCardCallback(descObj) - local text = EID:getDescriptionEntry("BlankCardCharge") - local charge = EID.cardMetadata[descObj.ObjSubType] - local iconStr = "#{{Collectible286}} {{ColorSilver}}" - if text ~= nil and charge ~= nil and charge.mimiccharge and charge.mimiccharge ~= -1 then - if descObj.ObjSubType == 48 then -- ? card - text = EID:getDescriptionEntry("BlankCardQCard") - EID:appendToDescription(descObj, iconStr..text:gsub("#",iconStr)) - else - EID:appendToDescription(descObj, iconStr..text.." {{"..charge.mimiccharge.."}}{{Battery}}") - end - end + VariableCharge(descObj, EID.cardMetadata[descObj.ObjSubType], 286, "BlankCardCharge") -- If the player has Tarot Cloth and Blank Card, display additional text if hasTarot then text = EID:getDescriptionEntry("BlankCardEffect") local buffText = EID:getDescriptionEntry("tarotClothBlankCardBuffs", descObj.ObjSubType) - if buffText then EID:appendToDescription(descObj, iconStr .. text .. " " .. buffText) end + if buffText then EID:appendToDescription(descObj, "#{{ColorSilver}}{{Collectible286}} " .. text .. " " .. buffText) end end return descObj end -- Handle Clear Rune description addition local function ClearRuneCallback(descObj) - local text = EID:getDescriptionEntry("ClearRuneCharge") - local charge = EID.cardMetadata[descObj.ObjSubType] - if text ~= nil and charge ~= nil and charge.mimiccharge and charge.mimiccharge ~= -1 then - local iconStr = "#{{Collectible263}} {{ColorSilver}}" - EID:appendToDescription(descObj, iconStr..text.." {{"..charge.mimiccharge.."}}{{Battery}}") - end + VariableCharge(descObj, EID.cardMetadata[descObj.ObjSubType], 263, "ClearRuneCharge") return descObj end -- Handle Placebo description addition local function PlaceboCallback(descObj) - local text = EID:getDescriptionEntry("PlaceboCharge") local adjustedID = EID:getAdjustedSubtype(descObj.ObjType, descObj.ObjVariant, descObj.ObjSubType) - local charge = EID.pillMetadata[adjustedID-1] - if text ~= nil and charge ~= nil and charge.mimiccharge and charge.mimiccharge ~= -1 then - local iconStr = "#{{Collectible348}} {{ColorSilver}}" - EID:appendToDescription(descObj, iconStr..text.." {{"..charge.mimiccharge.."}}{{Battery}}") - end + VariableCharge(descObj, EID.pillMetadata[adjustedID-1], 348, "PlaceboCharge") return descObj end @@ -811,16 +700,6 @@ if EID.isRepentance then return descObj end - -- Handle Abyss description addition - local function AbyssCallback(descObj) - local text = EID:getDescriptionEntry("abyssSynergies", descObj.ObjSubType) - if text ~= nil then - local iconStr = "#{{Collectible706}} {{ColorRed}}" - EID:appendToDescription(descObj, iconStr..text) - end - return descObj - end - -- Handle Flip description addition local function FlipCallback(descObj) local flipItemID = EID:getEntityData(descObj.Entity, "EID_FlipItemID") @@ -866,10 +745,7 @@ if EID.isRepentance then 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[664] then table.insert(callbacks, BingeEaterCallback) end - if EID.collectiblesOwned[59] then table.insert(callbacks, BookOfBelialCallback) end if EID.collectiblesOwned[584] or descObj.ObjSubType == 584 then table.insert(callbacks, BookOfVirtuesCallback) end - if EID.collectiblesOwned[706] or EID.collectiblesAbsorbed[706] then table.insert(callbacks, AbyssCallback) 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 table.insert(callbacks, SpindownDiceCallback) end @@ -877,7 +753,6 @@ if EID.isRepentance then -- Card / Rune Callbacks elseif descObj.ObjVariant == PickupVariant.PICKUP_TAROTCARD then hasTarot = EID.collectiblesOwned[451] - if hasTarot then table.insert(callbacks, TarotClothCallback) end if EID.collectiblesOwned[286] and not EID.blankCardHidden[descObj.ObjSubType] and EID.cardMetadata[descObj.ObjSubType] then table.insert(callbacks, BlankCardCallback) end if EID.collectiblesOwned[263] and EID.runeIDs[descObj.ObjSubType] and EID.cardMetadata[descObj.ObjSubType] then table.insert(callbacks, ClearRuneCallback) end @@ -926,7 +801,6 @@ local function EIDConditionsAB(descObj) if EID.collectiblesOwned[477] then table.insert(callbacks, VoidCallback) end if EID.blackRuneOwned then table.insert(callbacks, BlackRuneCallback) end end - if EID.collectiblesOwned[356] then table.insert(callbacks, CarBatteryCallback) end -- BFF Synergy check if EID.collectiblesOwned[247] then diff --git a/main.lua b/main.lua index 1432bb78..96732eb7 100644 --- a/main.lua +++ b/main.lua @@ -1682,7 +1682,7 @@ local json = require("json") local configIgnoreList = { ["BagContent"] = true, ["BagFloorContent"] = true, - ["LearnedRecipes"] = true, + ["BagLearnedRecipes"] = true, ["CraneItemType"] = true, ["FlipItemPositions"] = true, ["AbsorbedItems"] = true,