diff --git a/descriptions/ab+/en_us.lua b/descriptions/ab+/en_us.lua index f5f98c1e..f6798ff3 100644 --- a/descriptions/ab+/en_us.lua +++ b/descriptions/ab+/en_us.lua @@ -496,7 +496,7 @@ EID.descriptions[languageCode].collectibles={ {"474", "Tonsil", "Blocks enemy projectiles"}, {"475", "Plan C", "!!! SINGLE USE !!!#Deals 9,999,999 damage to all enemies and kills you 3 seconds later"}, {"476", "D1", "Duplicates 1 random pickup in the current room"}, - {"477", "Void", "!!! When used, consume any pedestal items in the room#Active item: Its effect will be added to Void's effect (Stacking the effects)#↑ Passive item: Small stat upgrade to a random stat"}, + {"477", "Void", "!!! When used, consumes all pedestal items in the room#Active item: Its effect activates, and will activate every future use of Void#↑ Passive item: Small stat upgrade to two random stats"}, {"478", "Pause", "Freezes all enemies in the room until you start shooting again#Touching a frozen enemy will hurt you#Enemies unfreeze after 30 seconds"}, {"479", "Smelter", "Consumes your trinket and gives you the effect permanently#More trinkets appear"}, {"480", "Compost", "Converts pickups into blue flies or spiders#Doubles your current blue flies/spiders#Spawns 1 blue fly or spider when you don't have any"}, @@ -870,6 +870,9 @@ EID.descriptions[languageCode].transformations={ ---------- MISC ---------- +EID.descriptions[languageCode].VoidText = "If absorbed, gain:" +EID.descriptions[languageCode].VoidNames = {"Speed", "Tears", "Damage", "Range", "Shot Speed", "Luck"} + EID.descriptions[languageCode].MCM = { DemoObjectName = "Demo Object Name", DemoObjectTransformation = "Demo Transformation", diff --git a/descriptions/ab+/zh_cn.lua b/descriptions/ab+/zh_cn.lua index 7c8de5c3..20ec1055 100644 --- a/descriptions/ab+/zh_cn.lua +++ b/descriptions/ab+/zh_cn.lua @@ -2,7 +2,7 @@ ----- Basic Chinese descriptions --- -------------------------------------- --- Last Sync Revise: 2022.01.20 +-- Last Update: 2022.01.26 -- Last Full Check: N/A -- I will have a full check someday else. -- FORMAT: Item ID | Name | Description @@ -282,7 +282,7 @@ EID.descriptions[languageCode].collectibles={ {"257", "火焰意志", "眼泪会点燃敌人#击中敌人时眼泪有几率爆炸#运气13:100%几率#!!! 爆炸也会伤到自己!"}, {"258", "编号丢失", "每换一层重置一次持有道具和掉落物#同时重置角色属性"}, {"259", "暗物质", "↑ +1伤害#33%几率发射恐惧眼泪"}, - {"260", "黑蜡烛", "免疫诅咒#+1黑心#{{DevilRoom}}恶魔房/{{AngelRoom}}天使房出现几率更高"}, + {"260", "黑蜡烛", "免疫诅咒#+1黑心#+15%{{DevilRoom}}恶魔房/{{AngelRoom}}天使房几率"}, {"261", "眼球突出", "↑ +100%伤害#↓ 眼泪走得越远伤害越低"}, {"262", "遗失的书页2", "+1黑心#当降至1心时,对房间内所有敌人造成40伤害"}, {"263", "", "<道具不存在>"}, @@ -465,7 +465,7 @@ EID.descriptions[languageCode].collectibles={ {"440", "肾结石", "大约每25秒停止发射,此时可发射1个肾结石,随后的眼泪会很快速喷射#↓ -0.2移速#↓ -17射程#↑ +2.0眼泪高度"}, {"441", "超级喷射", "发射超级撒但激光15秒#激光在房间和层之间持续存在"}, {"442", "黑王子之冠", "!!! 仅有1红心时:#↑ +1.5射程#↑ +0.75射速#↑ +0.2弹速#↑ +1眼泪高度#没有红心的角色无效"}, - {"443", "苹果!", "随机发射造成四倍伤害的刀片#↑ +0.3射程"}, + {"443", "苹果!", "随机发射造成四倍伤害的刀片#↑ +0.3射速"}, {"444", "铅笔", "每发射15颗眼泪,发射一串眼泪#眼泪串中的眼泪造成双倍伤害"}, {"445", "狗牙", "↑ +0.3伤害#↑ +0.1移速#如果角色在{{SecretRoom}}{{SuperSecretRoom}}隐藏房旁则有一声狼嚎#当进入有暗门的房间时则有一声吠叫"}, {"446", "烂牙", "发射眼泪时角色周围会有绿环,在其中的敌人会中毒#伤害与角色伤害一致"}, @@ -600,7 +600,7 @@ EID.descriptions[languageCode].trinkets={ {"19", "回形针", "不用钥匙就能开箱子"}, {"20", "猴爪", "受伤后血量不多于半心则生成1黑心#!!! 只能用3次"}, {"21", "神秘纸片", "随机模仿:#{{Blank}} {{Collectible327}}全家福#{{Blank}} {{Collectible328}}底片#{{Blank}} {{Trinket48}}遗失书页#{{Blank}} {{Trinket23}}寻人启事"}, - {"22", "恶魔的尾巴", "心的掉率降至20%#钥匙掉率提升#心掉落物全变为黑心"}, + {"22", "恶魔的尾巴", "心掉落物有80%几率被钥匙取代#心掉落物变为黑心"}, {"23", "寻人启事", "在{{SacrificeRoom}}献祭房死亡则以游魂重生#如果解锁过,在献祭房之外也会以他重生"}, {"24", "屁股硬币", "便便产生硬币的几率+20%#捡起硬币时放屁#屁只会击退敌人"}, {"25", "神秘糖果", "每30秒放屁或生成便便"}, diff --git a/descriptions/rep/en_us.lua b/descriptions/rep/en_us.lua index 2b60fdc9..06a05636 100644 --- a/descriptions/rep/en_us.lua +++ b/descriptions/rep/en_us.lua @@ -188,6 +188,7 @@ local repCollectibles={ [472] = {"472", "King Baby", "Other familiars follow it and shoot automatically at enemies#Stops moving when you are shooting#Will teleport back to you when you stop shooting"}, -- King Baby [474] = {"474", "Broken Glass Cannon", "Turns into Glass Cannon when used"}, -- Broken Glass Cannon [476] = {"476", "D1", "Duplicates 1 random pickup in the current room#Duplicated pickups may not be identical to the original"}, -- D1 + [477] = {"477", "Void", "!!! When used, consumes all pedestal items in the room#Active item: Its effect will activate every future use of Void#↑ Passive item: Small stat upgrade to two random stats"}, [489] = {"489", "D Infinity", "Acts as any die item except for {{Collectible723}}Spindown Dice#Change the current die with the drop key#Charge time varies based on the current die and updates when used"}, -- D Infinity [491] = {"491", "Acid Baby", "Drops a random pill every 7 rooms#Using a pill poisons all enemies in the room"}, -- Acid Baby [493] = {"493", "Adrenaline", "↑ Damage up for every empty Red Heart container#Follows a formula, some examples are:#+0.3 at 1#+0.92 at 2#+1.76 at 3#+2.79 at 4#+3.98 at 5"}, -- Adrenaline @@ -1011,6 +1012,9 @@ EID.descriptions[languageCode].GlitchedItemText = { ---------- Misc. Text ---------- +-- Void stat names: Replace "Tears" with "Fire Rate" +EID.descriptions[languageCode].VoidNames[2] = EID.descriptions[languageCode].GlitchedItemText[1] + EID.descriptions[languageCode].spindownError = "Item disappears" EID.descriptions[languageCode].CraftingBagContent = "Bag:" @@ -1030,7 +1034,7 @@ EID.descriptions[languageCode].BlankCardCharge = "Blank Card charge:" 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].FlipItemToggleInfo = "(Hold {{ButtonSelect}} to show description)" +EID.descriptions[languageCode].FlipItemToggleInfo = "(Hold {{ButtonSelect}} (Map) to show description)" EID.descriptions[languageCode].FalsePHDHeart = "Spawns 1 Black Heart" diff --git a/descriptions/rep/en_us_detailed.lua b/descriptions/rep/en_us_detailed.lua index 8037189d..e6df7645 100644 --- a/descriptions/rep/en_us_detailed.lua +++ b/descriptions/rep/en_us_detailed.lua @@ -266,8 +266,8 @@ local repCollectibles={ {"248", "" ,"Blue spiders and flies deal 2x damage and are larger. #Also effects locusts. #Doubles the spider limit of Mom's Wig to 10. #Fly and Spider familiars become stronger, just like BFFS! #Does not stack with BFFS! "}, {"249", "" ,"Spawns an extra item after boss fights. #After choosing one, the other disappears. #The second item is always picked from the Boss Item Pool instead of whichever item pool normally used. #Does not effect the Krampus fight."}, {"250", "" ,"All bombs become 1+1 bomb pickups."}, - {"251", "" ,"Spawns a random card. #Allows the player to hold two cards. #Replaces all cards with pills. #The only exception is the single pill dropped by the item Caffeine Pill. #By default, the key to cycle between cards is Control (PC), R2 (PlayStation) or RT (XBox). #Having Little Baggy will allow both cards and pills to appear again."}, - {"252", "" ,"Spawns a random pill. #Allows the player to hold two pills. #Replaces all pills with cards. #By default, the key to cycle between pills is Control (PC), R2 (PlayStation) or RT (XBox). #Cracked Key counts as a card and will be converted. #Blowing up the skull marked with an X guarantees a telepills drop."}, + {"251", "" ,"Spawns a random card. #Allows the player to hold two cards. #Replaces all pills with cards. #The only exception is the single pill dropped by the item Caffeine Pill. #By default, the key to cycle between cards is Control (PC), R2 (PlayStation) or RT (XBox). #Having Little Baggy will allow both cards and pills to appear again."}, + {"252", "" ,"Spawns a random pill. #Allows the player to hold two pills. #Replaces all cards and runes with pills. #By default, the key to cycle between pills is Control (PC), R2 (PlayStation) or RT (XBox). #Cracked Key counts as a card and will be converted. #Blowing up the skull marked with an X guarantees a telepills drop."}, {"253", "" ,"Grants one red heart container. #+1 Luck up."}, {"254", "" ,"+1 Flat damage up.#+5 Range up.#Only applies to tears fired from the player's left eye. #Damage bonus is unaffected by any damage multipliers. #Azazel has a chance to fire a beam with the damage bonus and gains no range. #Cain has a 50% chance to fire a shot with the bonus. #Every other set of tears The Keeper fires is effected. #Stacks with Chemical Peel."}, {"255", "" ,"+0.5 Tears up.#+0.2 Shot speed up."}, diff --git a/descriptions/rep/zh_cn.lua b/descriptions/rep/zh_cn.lua index d77edeaa..e2ce64d1 100644 --- a/descriptions/rep/zh_cn.lua +++ b/descriptions/rep/zh_cn.lua @@ -2,7 +2,7 @@ ----- Basic Chinese descriptions --- -------------------------------------- --- Last Sync Revise: 2022.01.22 +-- Last Update: 2022.01.26 -- Last Full Check: N/A -- I will have a full check someday else. -- FORMAT: Item ID | Name | Description @@ -46,7 +46,7 @@ local repCollectibles={ [71] = {"71", "小蘑菇", "↑ +0.3移速#↑ +1.5射程#↑ 体型缩小"}, -- Mini Mush [72] = {"72", "念珠", "+3魂心#↑ +0.5射速#{{Collectible33}}圣经添加至所有道具池"}, -- Rosary [77] = {"77", "彩虹独角兽", "无敌#每秒造成20接触伤害"}, -- My Little Unicorn - [78] = {"78", "启示录", "+1魂心#使用后天启骑士会替代本层Boss#↑ +17.5% {{DevilRoom}}恶魔房或{{AngelRoom}}天使房几率"}, -- Book of Revelations + [78] = {"78", "启示录", "+1魂心#使用后天启骑士会替代本层Boss#↑ +17.5% {{DevilRoom}}恶魔房/{{AngelRoom}}天使房几率"}, -- Book of Revelations [79] = {"79", "咒印", "↑ +1.0伤害#↑ +0.2移速#+1黑心"}, -- The Mark [80] = {"80", "契约", "↑ +0.5伤害#↑ +0.7射速#+2黑心"}, -- The Pact [83] = {"83", "钉子", "+半黑心#↑ +2.0伤害#↓ -0.18移速#造成接触伤害#粉碎经过的岩石"}, -- The Nail @@ -168,7 +168,7 @@ local repCollectibles={ [415] = {"415", "光明之冠", "+2魂心#如果没有不满的心之容器:#↑ +100%伤害#↑ +1.5射程#↓ -0.3弹速#受伤后,当前房间无论心之容器是否是满的,效果消失"}, -- Crown Of Light [416] = {"416", "深口袋", "如果房间没有奖励,生成1-3硬币#提高硬币上限为999"}, -- Deep Pockets [417] = {"417", "魅魔", "在房间内漂浮的跟班,产生伤害光环,每秒造成7-10的伤害#↑ 站在光环中+50%伤害"}, -- Succubus - [419] = {"419", "传送2.0", "传送至另1个未探索的随机房间#等级:{{Room}}>{{BossRoom}}>{{SuperSecretRoom}}>{{Shop}}>{{TreasureRoom}}>{{SacrificeRoom}}>{{DiceRoom}}> {{Library}}>{{CursedRoom}}>{{MiniBoss}}>{{ChallengeRoom}}>{{IsaacsRoom}}>{{ArcadeRoom}}>{{ChestRoom}}>{{Planetarium}}>{{SecretRoom}}>{{DevilRoom}}/{{AngelRoom}}>错误房"}, + [419] = {"419", "传送2.0", "传送至另1个未探索的随机房间#等级:{{Room}}>{{BossRoom}}>{{SuperSecretRoom}}>{{Shop}}>{{TreasureRoom}}>{{Planetarium}}>{{SacrificeRoom}}>{{DiceRoom}}> {{Library}}>{{CursedRoom}}>{{MiniBoss}}>{{ChallengeRoom}}>{{IsaacsRoom}}>{{ArcadeRoom}}>{{ChestRoom}}>{{SecretRoom}}>{{DevilRoom}}/{{AngelRoom}}>错误房"}, [421] = {"421", "腰豆", "使用时将任何范围内的敌人魅惑"}, -- Kidney Bean [426] = {"426", "狂热粉丝", "跟随角色移动的跟班,有0.66秒延迟#每秒造成30接触伤害"}, -- Obsessed Fan [430] = {"430", "狙击蝇老爹", "跟随角色移动的跟班,有0.66秒延迟#向附近敌人发射眼泪,造成与角色伤害相等的伤害"}, -- Papa Fly @@ -235,7 +235,7 @@ local repCollectibles={ [581] = {"581", "灵能苍蝇", "环绕苍蝇跟班#自动反弹附近的弹幕#造成接触伤害"}, -- Psy Fly [582] = {"582", "迷幻蘑菇", "↑ +0.75发射速度#↓ -0.03移速#扭曲画面#效果可叠加"}, -- Wavy Cap [583] = {"583", "罐中火箭", "+5炸弹#若发射时放置炸弹,改为向发射的方向发射火箭"}, -- Rocket in a Jar - [584] = {"584", "美德之书", "使用时生成1个魂火环绕跟班,发射幽灵眼泪,但可被摧毁#与其它主动道具结合时可产生特殊魂火#将第一个{{DevilRoom}}恶魔房变成{{AngelRoom}}天使房,并提升{{AngelRoom}}天使房几率#恶魔交易后仍会出现天使房"}, -- Book of Virtues + [584] = {"584", "美德之书", "使用时生成1个魂火环绕跟班,发射幽灵眼泪,但可被摧毁#与其它主动道具结合时可产生特殊魂火#将第一个{{DevilRoom}}恶魔房变成{{AngelRoom}}天使房,并提升{{AngelRoom}}天使房几率25%#恶魔交易后仍会出现天使房"}, -- Book of Virtues [585] = {"585", "白玉香膏盒", "使用时生成3魂心和2个天使房道具#只能通过捡起魂心充能#若已进行过恶魔交易,则生成2魂心和1个天使房道具"}, -- Alabaster Box [586] = {"586", "天堂阶梯", "在每一层的初始房间生成梯子,通向1个特殊的天使房道具商店"}, -- The Stairway [587] = {"587", "", "<道具不存在>"}, -- Menorah (Unused but skripted) @@ -252,7 +252,7 @@ local repCollectibles={ [598] = {"598", "冥王星", "↑ +0.7射速#体积缩小,可以挤进障碍物间隙#弹幕会从头顶飞过"}, -- Pluto [599] = {"599", "巫毒娃娃头", "每层额外生成1个{{CursedRoom}}诅咒房"}, -- Voodoo Head [600] = {"600", "眼药水", "!!! 只对左眼有效:#↑ +28%发射速度#一段时间内第一次发射总是双发"}, -- Eye Drops - [601] = {"601", "痛悔短祷", "↑ +0.7射速#+1永恒之心#进行过恶魔交易后天使房仍然会出现#减缓受红心伤害减少恶魔房和天使房的几率"}, -- Act of Contrition + [601] = {"601", "痛悔短祷", "↑ +0.7射速#+1永恒之心#进行过恶魔交易后天使房仍然会出现#减缓受红心伤害减少{{DevilRoom}}恶魔房/{{AngelRoom}}天使房的几率"}, -- Act of Contrition [602] = {"602", "会员卡", "在商店内生成1个暗门,通向高级商店"}, -- Member Card [603] = {"603", "电池组", "生成2-4电池#对当前主动道具充能"}, -- Battery Pack [604] = {"604", "老妈的手镯", "可以捡起岩石,TNT,便便,友好粪滴,寄居骷髅等障碍物进行投掷#捡起的东西可以带入下1个房间"}, -- Mom's Bracelet @@ -320,7 +320,7 @@ local repCollectibles={ [666] = {"666", "", "<道具不存在>"}, [667] = {"667", "稻草人", "+1炸弹#生成店主作为第二个角色#店主死亡时生成蓝蜘蛛#店主死亡时该道具消失#店主活着时恶魔交易花费硬币#!!! 店主能够捡起道具,包括剧情道具,死亡时也会永久移除"}, -- Strawman [668] = {"668", "老爸的便条", "踏上回家的路#留在之前{{TreasureRoom}}道具房或{{BossRoom}}Boss房的饰品会变成 {{Card78}} 破裂的钥匙"}, -- Dad's Note - [669] = {"669", "腊肠", "↑ +1心之容器#满血#↑ +0.5伤害#↑ +0.2移速#↑ +1.2弹速#↑ +0.16射程#↑ +1运气#↑ +6.9%{{DevilRoom}}恶魔房或{{AngelRoom}}天使房几率#↑ +6.9%{{Planetarium}}星象房几率"}, -- Sausage + [669] = {"669", "腊肠", "↑ +1心之容器#满血#↑ +0.5伤害#↑ +0.2移速#↑ +1.2弹速#↑ +0.16射程#↑ +1运气#↑ +6.9%{{DevilRoom}}恶魔房/{{AngelRoom}}天使房几率#↑ +6.9%{{Planetarium}}星象房几率"}, -- Sausage [670] = {"670", "选择?", "如果清理的房间有奖励,产生2种不同的奖励#捡起其一后另1个奖励消失"}, -- Options? [671] = {"671", "糖心", "捡起红心时获得永久的属性提升"}, -- Candy Heart [672] = {"672", "一磅肉", "恶魔交易消耗硬币#商店里的道具消耗心之容器#商店里的 其它物品免费,但被尖刺环绕"}, -- A Pound of Flesh @@ -747,7 +747,7 @@ local repTrinkets={ [171] = {"171", "店主的协议", "50%几率使恶魔交易花费硬币而不是心"}, -- Keeper's Bargain [172] = {"172", "诅咒硬币", "捡起硬币时传送至随机房间#可以传送到隐藏房"}, -- Cursed Penny [173] = {"173", "你的灵魂", "免费进行一次恶魔交易"}, -- Your Soul - [174] = {"174", "数字冰箱贴", "+10%恶魔房几率"}, -- Number Magnet + [174] = {"174", "数字冰箱贴", "+10%恶魔房几率#防止恶魔交易中出现坎卜斯"}, -- Number Magnet [175] = {"175", "奇怪的钥匙", "解锁窒息胎战通道,不再限时#使用{{Collectible297}}潘多拉的盒子时从随机道具池生成6个道具,原效果失效#使用后两者都会被消耗"}, -- Strange Key [176] = {"176", "小血团", "生成1个血块跟班,模仿角色的行动,发射方向和眼泪效果#如果跟班死亡则在下一个房间重生"}, -- Lil Clot [177] = {"177", "纹身贴", "清理{{ChallengeRoom}}挑战房后生成1箱子,清理{{BossRushRoom}}Boss挑战房后生成1道具"}, -- Temporary Tattoo diff --git a/eid_config.lua b/eid_config.lua index c93bb898..b776121a 100644 --- a/eid_config.lua +++ b/eid_config.lua @@ -30,9 +30,9 @@ EID.UserConfig = { -- Change the size of the info boxes. Range: [0,...,1] -- Default = 1 ["Scale"] = 1, - -- Press or hold the key to change scale. - -- Default = Keyboard.KEY_F5 - ["ScaleKey"] = Keyboard.KEY_F5, + -- Press or hold the key to change scale. Keyboard.KEY_F5 is recommended + -- Default = none + ["ScaleKey"] = -1, -- Set the background transparency. Range: [0,...,1] -- Default = 0.75 ["Transparency"] = 0.75, @@ -226,6 +226,11 @@ EID.UserConfig = { -- REPENTANCE ONLY!!! -- Default = true ["DisplayCraneInfo"] = true, + + ---------- Void Stat Increases ---------- + -- Toggle display of what stats will increase on Void absorption + -- Default = false + ["DisplayVoidStatInfo"] = false, ---------- Bag of Crafting ------------ @@ -347,7 +352,7 @@ EID.DefaultConfig = { ["FontType"] = "default", ["TextboxWidth"] = 130, ["Scale"] = 1, - ["ScaleKey"] = Keyboard.KEY_F5, + ["ScaleKey"] = -1, ["Transparency"] = 0.75, ["HUDOffset"] = 10, ["XPosition"] = 60, @@ -396,6 +401,7 @@ EID.DefaultConfig = { ["DisplayDiceInfo"] = true, ["DisplayBagOfCrafting"] = "always", ["DisplayCraneInfo"] = true, + ["DisplayVoidStatInfo"] = false, ["BagOfCraftingResults"] = 7, ["BagOfCraftingCombinationMax"] = 12, ["BagOfCraftingRandomResults"] = 400, diff --git a/eid_modifiers.lua b/eid_modifiers.lua index 7b92ebd6..20cbb65c 100644 --- a/eid_modifiers.lua +++ b/eid_modifiers.lua @@ -1,6 +1,107 @@ -if REPENTANCE then - local game = Game() +local game = Game() +-- Afterbirth+ modifiers +local collectiblesToCheck = { CollectibleType.COLLECTIBLE_VOID, } +-- Repentance modifiers +if REPENTANCE then 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, + CollectibleType.COLLECTIBLE_BLANK_CARD, CollectibleType.COLLECTIBLE_CLEAR_RUNE, CollectibleType.COLLECTIBLE_PLACEBO, + CollectibleType.COLLECTIBLE_FALSE_PHD, CollectibleType.COLLECTIBLE_ABYSS, CollectibleType.COLLECTIBLE_FLIP, +} end +local collectiblesOwned = {} +local blackRuneOwned = false +local lastCheck = 0 + +local function CheckPlayersCollectibles() + -- recheck the players' owned collectibles periodically, not every frame + if EID.GameUpdateCount >= lastCheck + 15 then + lastCheck = EID.GameUpdateCount + local numPlayers = game:GetNumPlayers() + local players = {}; for i = 0, numPlayers - 1 do players[i] = Isaac.GetPlayer(i) end + for _,v in ipairs(collectiblesToCheck) do + collectiblesOwned[v] = false + for i = 0, numPlayers - 1 do + if players[i]:HasCollectible(v) then + collectiblesOwned[v] = true + break + end + end + end + blackRuneOwned = false + for i = 0, numPlayers - 1 do + for j = 0, 1 do + if players[i]:GetCard(j) == Card.RUNE_BLACK then + blackRuneOwned = true + break + end + end + end + -- Birthright Book of Belial + -- Could this be changed to just checking for having Collectible 59? (Check interaction with Clicker etc) + if REPENTANCE then + collectiblesOwned[59] = false + for i = 0, numPlayers - 1 do + local playerType = players[i]:GetPlayerType() + if (playerType == PlayerType.PLAYER_JUDAS or playerType == PlayerType.PLAYER_BLACKJUDAS) and players[i]:HasCollectible(CollectibleType.COLLECTIBLE_BIRTHRIGHT) then + collectiblesOwned[59] = true + break + end + end + end + end +end + +-- Handle Void (the only modifier that is applied to AB+ at the moment) +-- Speed, Tears, Damage, Range, Shot Speed, Luck +local voidIntro = EID:getDescriptionEntry("VoidText") +local voidNames = EID:getDescriptionEntry("VoidNames") +local voidStatUps = { 0.2, 0.5, 1, 0.5, 0.2, 1 } +if REPENTANCE then voidStatUps[4] = 1.5 end + +local function VoidCallback(descObj) + if EID.itemConfig:GetCollectible(descObj.ObjSubType).Type ~= 3 then + EID:appendToDescription(descObj, "#{{Collectible477}} " .. voidIntro .. "#") + for i,v in ipairs(EID.VoidStatIncreases) do + if v > 0 then + EID:appendToDescription(descObj, "{{Collectible477}} +" .. v*voidStatUps[i] .. " " .. voidNames[i] .. "#") + end + end + end + return descObj +end +local function BlackRuneCallback(descObj) + EID:appendToDescription(descObj, "#{{Card41}} " .. voidIntro .. "#") + for i,v in ipairs(EID.BlackRuneStatIncreases) do + if v > 0 then + EID:appendToDescription(descObj, "{{Card41}} +" .. v*voidStatUps[i] .. " " .. voidNames[i] .. "#") + end + end + return descObj +end + +local function EIDConditionsAB(descObj) + -- currently, only pickup descriptions have modifiers + if descObj.ObjType ~= 5 then return false end + + CheckPlayersCollectibles() + + local callbacks = {} + + -- Collectible Pedestal Callbacks + if descObj.ObjVariant == PickupVariant.PICKUP_COLLECTIBLE then + if EID.Config["DisplayVoidStatInfo"] then + if collectiblesOwned[477] then table.insert(callbacks, VoidCallback) end + if blackRuneOwned then table.insert(callbacks, BlackRuneCallback) end + end + end + + return callbacks +end +EID:addDescriptionModifier("EID Afterbirth+", EIDConditionsAB, nil) + + +if REPENTANCE then -- Handle Birthright local function BirthrightCallback(descObj) descObj.Description = "" @@ -50,6 +151,7 @@ if REPENTANCE then return descObj end + local inSpindownPreview = false -- Handle Spindown Dice description addition local function SpindownDiceCallback(descObj) EID:appendToDescription(descObj, "#{{Collectible723}} :") @@ -63,6 +165,12 @@ if REPENTANCE then end refID = spinnedID if refID > 0 and refID < 4294960000 then + if i == 1 and Input.IsActionPressed(ButtonAction.ACTION_MAP, EID.player.ControllerIndex) then + inSpindownPreview = true + local descEntry = EID:getDescriptionObj(5, 100, refID) + inSpindownPreview = false + return descEntry + end EID:appendToDescription(descObj, "{{Collectible"..refID.."}}") if EID.itemUnlockStates[refID] == false then EID:appendToDescription(descObj, "?") end if i ~= EID.Config["SpindownDiceResults"] then @@ -77,6 +185,7 @@ if REPENTANCE then if hasCarBattery then EID:appendToDescription(descObj, " (Results with {{Collectible356}})") end + EID:appendToDescription(descObj, "#{{Blank}} ".. EID:getDescriptionEntry("FlipItemToggleInfo")) return descObj end @@ -267,42 +376,11 @@ if REPENTANCE then -- This one-condition setup fixes that and can only help performance -- It also allows us to pick the order that modifiers are appended to descriptions (stats/effects first, then reroll/flip/recharge info) - local collectiblesToCheck = { CollectibleType.COLLECTIBLE_BINGE_EATER, CollectibleType.COLLECTIBLE_BOOK_OF_VIRTUES, - CollectibleType.COLLECTIBLE_SPINDOWN_DICE, CollectibleType.COLLECTIBLE_VOID, - CollectibleType.COLLECTIBLE_TAROT_CLOTH, CollectibleType.COLLECTIBLE_MOMS_BOX, - CollectibleType.COLLECTIBLE_BLANK_CARD, CollectibleType.COLLECTIBLE_CLEAR_RUNE, CollectibleType.COLLECTIBLE_PLACEBO, - CollectibleType.COLLECTIBLE_FALSE_PHD, CollectibleType.COLLECTIBLE_ABYSS, CollectibleType.COLLECTIBLE_FLIP, - } - local collectiblesOwned = {} - local function EIDConditions(descObj) -- currently, only pickup descriptions have modifiers if descObj.ObjType ~= 5 then return false end - -- recheck the players' owned collectibles periodically, not every frame - if game:GetFrameCount() % 10 == 0 then - local numPlayers = game:GetNumPlayers() - local players = {}; for i = 0, numPlayers - 1 do players[i] = Isaac.GetPlayer(i) end - for _,v in ipairs(collectiblesToCheck) do - collectiblesOwned[v] = false - for i = 0, numPlayers - 1 do - if players[i]:HasCollectible(v) then - collectiblesOwned[v] = true - break - end - end - end - -- Birthright Book of Belial - collectiblesOwned[59] = false - for i = 0, numPlayers - 1 do - local playerType = players[i]:GetPlayerType() - if (playerType == PlayerType.PLAYER_JUDAS or playerType == PlayerType.PLAYER_BLACKJUDAS) and players[i]:HasCollectible(CollectibleType.COLLECTIBLE_BIRTHRIGHT) then - collectiblesOwned[59] = true - break - end - end - - end + CheckPlayersCollectibles() local callbacks = {} @@ -317,7 +395,7 @@ if REPENTANCE then if collectiblesOwned[584] then table.insert(callbacks, BookOfVirtuesCallback) end if collectiblesOwned[706] then table.insert(callbacks, AbyssCallback) end - if collectiblesOwned[723] or (EID.absorbedSpindown and collectiblesOwned[477]) then table.insert(callbacks, SpindownDiceCallback) end + if (collectiblesOwned[723] or (EID.absorbedSpindown and collectiblesOwned[477])) and not inSpindownPreview then table.insert(callbacks, SpindownDiceCallback) end if collectiblesOwned[711] and EID:getEntityData(descObj.Entity, "EID_FlipItemID") then table.insert(callbacks, FlipCallback) end -- Card / Rune Callbacks elseif descObj.ObjVariant == PickupVariant.PICKUP_TAROTCARD then diff --git a/eid_tmtrainer.lua b/eid_tmtrainer.lua index 7ff5ee72..54155d65 100644 --- a/eid_tmtrainer.lua +++ b/eid_tmtrainer.lua @@ -127,10 +127,10 @@ local function CheckLogForItems(_) numEffects = numEffects - 1 eidDesc = eidDesc .. parseEffectLine(line) if numEffects == 0 then - -- Glowing Hour Glass type effects seem to cause the game to reload all items, check if our desc is equal to the first one + eidDesc = EID:CheckGlitchedItemConfig(maxNumber - spawnedItems) .. eidDesc + -- Glowing Hour Glass type effects cause the game to reload all items, check if our desc is equal to the first one if (descOne == eidDesc) then spawnedItems = 1 end - eidDesc = EID:CheckGlitchedItemConfig(maxNumber - spawnedItems) .. eidDesc EID:addCollectible(maxNumber - spawnedItems, eidDesc) if spawnedItems == 1 then descOne = eidDesc end end diff --git a/main.lua b/main.lua index ad75fd8e..c4f3a0e1 100644 --- a/main.lua +++ b/main.lua @@ -628,16 +628,7 @@ end local isMirrorRoom = false local isDeathCertRoom = false if REPENTANCE then - function EID:onNewRoom() - isMirrorRoom = game:GetLevel():GetCurrentRoom():IsMirrorWorld() - - local level = game:GetLevel() - local id = level:GetCurrentRoomIndex() - isDeathCertRoom = (id >=0 and GetPtrHash(level:GetRoomByIdx(id)) == GetPtrHash(level:GetRoomByIdx(id, 2))) - - -- Handle Flip Item - initialItemNext = false - flipItemNext = false + function EID:AssignFlipItems() EID.flipMaxIndex = -1 local curRoomIndex = game:GetLevel():GetCurrentRoomIndex() if EID.flipItemPositions[curRoomIndex] then @@ -651,6 +642,18 @@ if REPENTANCE then end end end + function EID:onNewRoom() + isMirrorRoom = game:GetLevel():GetCurrentRoom():IsMirrorWorld() + + local level = game:GetLevel() + local id = level:GetCurrentRoomIndex() + isDeathCertRoom = (id >=0 and GetPtrHash(level:GetRoomByIdx(id)) == GetPtrHash(level:GetRoomByIdx(id, 2))) + + -- Handle Flip Item + initialItemNext = false + flipItemNext = false + EID:AssignFlipItems() + end EID:AddCallback(ModCallbacks.MC_POST_NEW_ROOM, EID.onNewRoom) end --------------------------------------------------------------------------- @@ -815,14 +818,47 @@ end -- Runs 30 times a second; doesn't update while paused local collSpawned = false + +EID.VoidStatIncreases = {} +EID.BlackRuneStatIncreases = {} +local function VoidRNGNext(num) + num = num ~ ((num >> 5) & 4294967295) + num = num ~ ((num << 9) & 4294967295) + num = num ~ ((num >> 7) & 4294967295) + return num >> 0; +end +local function GetTwoIncreases(rng, tbl) + local statTable = {1,2,3,4,5,6} + -- perform 5 random swaps of our stat table + for i = 6, 2, -1 do + rng = VoidRNGNext(rng) + local result = (rng % i) + 1 + local temp = statTable[i] + statTable[i] = statTable[result] + statTable[result] = temp + end + -- the first two entries in the stat table get increased + tbl[statTable[1]] = tbl[statTable[1]] + 1 + tbl[statTable[2]] = tbl[statTable[2]] + 1 + return rng +end + function EID:onGameUpdate() EID.GameUpdateCount = EID.GameUpdateCount + 1 - -- Fix Overlapping Pedestals if a collectible spawned this frame (needed for Mega Chest) if collSpawned then collSpawned = false + local numVoidable = 0 + local numBlackRunable = 0 + -- THIS INCLUDES UNPURCHASED SHOP ITEMS??? and both choice items also, which is OK for AB+ but not for Rep! local curPositions = {} for _, entity in ipairs(Isaac.FindByType(5, 100, -1, true, false)) do + if entity.SubType > 0 then + numBlackRunable = numBlackRunable + 1 + if EID.itemConfig:GetCollectible(entity.SubType).Type ~= 3 then numVoidable = numVoidable + 1 end + end + + -- Fix Overlapping Pedestals if a collectible spawned this frame (needed for Mega Chest) local pos = entity.Position for _, otherPos in ipairs(curPositions) do if pos:Distance(otherPos[2]) == 0 then @@ -832,6 +868,26 @@ function EID:onGameUpdate() end table.insert(curPositions, {entity, entity.Position}) end + + -- Recalculate our total Void stat-ups if a collectible spawned this frame + -- THIS COULD APPLY TO BLACK RUNE AS WELL + if EID:PlayersHaveCollectible(CollectibleType.COLLECTIBLE_VOID) then + local curRoomIndex = game:GetLevel():GetCurrentRoomIndex() + local increases = {0, 0, 0, 0, 0, 0} + local runeIncreases = {0, 0, 0, 0, 0, 0} + --CHANGE THIS TO THE PLAYER THAT HAS VOID + local startRNG = Isaac.GetPlayer(0):GetCollectibleRNG(CollectibleType.COLLECTIBLE_VOID):GetSeed() + local runeRNG = Isaac.GetPlayer(0):GetCardRNG(Card.RUNE_BLACK):GetSeed() + -- in Repentance, an additional RNG call is done before the 5 for stat ups + if REPENTANCE then startRNG = VoidRNGNext(startRNG) end + for pedestals = 1, 1 do + startRNG = GetTwoIncreases(startRNG, increases) + runeRNG = GetTwoIncreases(runeRNG, runeIncreases) + break -- only doing 1 preview for now + end + EID.VoidStatIncreases = increases + EID.BlackRuneStatIncreases = runeIncreases + end end -- Remove Crane Game item data if it's giving the prize out @@ -862,7 +918,8 @@ local function attemptPathfind(entity) pathsChecked[entity.InitSeed] = true return true end - if EID.GameUpdateCount - lastPathfindFrame < 10 then return false end + -- Don't reattempt pathfinding more than 3 times a second, unless this is a new entity + if pathsChecked[entity.InitSeed] == false and EID.GameUpdateCount - lastPathfindFrame < 10 then return false end -- Spawn a custom NPC entity to attempt a pathfind to the target pickup, then remove it afterwards pathCheckerEntity = game:Spawn(17, 3169, EID.player.Position, nullVector, EID.player, 0, 4354) @@ -1234,6 +1291,7 @@ if EID.MCMLoaded or REPENTANCE then for k, _ in pairs(configIgnoreList) do savedEIDConfig[k] = nil end + EID:AssignFlipItems() end end diff --git a/mod_config_menu.lua b/mod_config_menu.lua index be873c43..1c182126 100644 --- a/mod_config_menu.lua +++ b/mod_config_menu.lua @@ -115,27 +115,28 @@ function EID:buildColorArray() table.sort(colorNameArray) end -function EID:AddBooleanSetting(category, optionName, displayText, onText, offText, infoText) - if (type(infoText) == "string") then infoText = {infoText} end +function EID:AddBooleanSetting(category, optionName, displayText, params) + if type(params) ~= "table" then params = {} end + if params.repOnly and not REPENTANCE then return end MCM.AddSetting( - "EID", - category, + "EID", category, { Type = ModConfigMenu.OptionType.BOOLEAN, - CurrentSetting = function() + CurrentSetting = params.currentSettingFunc or function() return EID.Config[optionName] end, - Display = function() - local onOff = offText + Display = params.displayFunc or function() + if params.displayingTab then EID.MCMCompat_isDisplayingEIDTab = params.displayingTab end + local onOff = params.offText or "False" if EID.Config[optionName] then - onOff = onText + onOff = params.onText or "True" end return displayText .. ": " .. onOff end, - OnChange = function(currentBool) + OnChange = params.onChangeFunc or function(currentBool) EID.Config[optionName] = currentBool end, - Info = infoText + Info = params.infoText or {} } ) end @@ -579,190 +580,21 @@ if MCMLoaded then --------------------------------------------------------------------------- ---------------------------------Display----------------------------------- - - ------------Collectibles-------------- - - MCM.AddSetting( - "EID", - "Display", - { - Type = ModConfigMenu.OptionType.BOOLEAN, - CurrentSetting = function() - return EID.Config["DisplayItemInfo"] - end, - Display = function() - EID.MCMCompat_isDisplayingEIDTab = ""; - local onOff = "False" - if EID.Config["DisplayItemInfo"] then - onOff = "True" - end - return "Collectible Infos: " .. onOff - end, - OnChange = function(currentBool) - EID.Config["DisplayItemInfo"] = currentBool - end - } - ) - ------------Trinkets-------------- - - MCM.AddSetting( - "EID", - "Display", - { - Type = ModConfigMenu.OptionType.BOOLEAN, - CurrentSetting = function() - return EID.Config["DisplayTrinketInfo"] - end, - Display = function() - local onOff = "False" - if EID.Config["DisplayTrinketInfo"] then - onOff = "True" - end - return "Trinket Infos: " .. onOff - end, - OnChange = function(currentBool) - EID.Config["DisplayTrinketInfo"] = currentBool - end - } - ) - ------------CARDS-------------- - - MCM.AddSetting( - "EID", - "Display", - { - Type = ModConfigMenu.OptionType.BOOLEAN, - CurrentSetting = function() - return EID.Config["DisplayCardInfo"] - end, - Display = function() - local onOff = "False" - if EID.Config["DisplayCardInfo"] then - onOff = "True" - end - return "Card Infos: " .. onOff - end, - OnChange = function(currentBool) - EID.Config["DisplayCardInfo"] = currentBool - end - } - ) - - ------------PILLS-------------- - MCM.AddSetting( - "EID", - "Display", - { - Type = ModConfigMenu.OptionType.BOOLEAN, - CurrentSetting = function() - return EID.Config["DisplayPillInfo"] - end, - Display = function() - local onOff = "False" - if EID.Config["DisplayPillInfo"] then - onOff = "True" - end - return "Pill Infos: " .. onOff - end, - OnChange = function(currentBool) - EID.Config["DisplayPillInfo"] = currentBool - end - } - ) - if REPENTANCE then - ------------Glitched Items-------------- - MCM.AddSetting( - "EID", - "Display", - { - Type = ModConfigMenu.OptionType.BOOLEAN, - CurrentSetting = function() - return EID.Config["DisplayGlitchedItemInfo"] - end, - Display = function() - local onOff = "False" - if EID.Config["DisplayGlitchedItemInfo"] then - onOff = "True" - end - return "Glitched Item Infos: " .. onOff - end, - OnChange = function(currentBool) - EID.Config["DisplayGlitchedItemInfo"] = currentBool - end, - Info = {"Note: The --luadebug launch option is required for more detailed glitched item descriptions"} - } - ) - end - --------Sacrifice Room--------- - MCM.AddSetting( - "EID", - "Display", - { - Type = ModConfigMenu.OptionType.BOOLEAN, - CurrentSetting = function() - return EID.Config["DisplaySacrificeInfo"] - end, - Display = function() - local onOff = "False" - if EID.Config["DisplaySacrificeInfo"] then - onOff = "True" - end - return "Sacrifice Room Infos: " .. onOff - end, - OnChange = function(currentBool) - EID.Config["DisplaySacrificeInfo"] = currentBool - end - } - ) - - --------Dice Room--------- - MCM.AddSetting( - "EID", - "Display", - { - Type = ModConfigMenu.OptionType.BOOLEAN, - CurrentSetting = function() - return EID.Config["DisplayDiceInfo"] - end, - Display = function() - local onOff = "False" - if EID.Config["DisplayDiceInfo"] then - onOff = "True" - end - return "Dice Room Infos: " .. onOff - end, - OnChange = function(currentBool) - EID.Config["DisplayDiceInfo"] = currentBool - end - } - ) - + -- Simple toggles of what descriptions the user wants displayed + EID:AddBooleanSetting("Display", "DisplayItemInfo", "Collectible Infos", {displayingTab = ""}) + EID:AddBooleanSetting("Display", "DisplayTrinketInfo", "Trinket Infos") + EID:AddBooleanSetting("Display", "DisplayCardInfo", "Card Infos") + EID:AddBooleanSetting("Display", "DisplayPillInfo", "Pill Infos") + EID:AddBooleanSetting("Display", "DisplayGlitchedItemInfo", "Glitched Item Infos", {repOnly = true, + infoText = "Note: The --luadebug launch option is required for more detailed glitched item descriptions; this can be dangerous!"}) + EID:AddBooleanSetting("Display", "DisplaySacrificeInfo", "Sacrifice Room Infos") + EID:AddBooleanSetting("Display", "DisplayDiceInfo", "Dice Room Infos") + EID:AddBooleanSetting("Display", "DisplayCraneInfo", "Crane Game Infos", {repOnly = true}) + EID:AddBooleanSetting("Display", "DisplayVoidStatInfo", "Void Stat Increase Infos") local diceSteps = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} if REPENTANCE then - - --------Crane Game--------- - MCM.AddSetting( - "EID", - "Display", - { - Type = ModConfigMenu.OptionType.BOOLEAN, - CurrentSetting = function() - return EID.Config["DisplayCraneInfo"] - end, - Display = function() - local onOff = "False" - if EID.Config["DisplayCraneInfo"] then - onOff = "True" - end - return "Crane Game Infos: " .. onOff - end, - OnChange = function(currentBool) - EID.Config["DisplayCraneInfo"] = currentBool - end - } - ) MCM.AddSpace("EID", "Display") @@ -788,27 +620,8 @@ if MCMLoaded then -- -- Spindown Dice skip locked items - MCM.AddSetting( - "EID", - "Display", - { - Type = ModConfigMenu.OptionType.BOOLEAN, - CurrentSetting = function() - return EID.Config["SpindownDiceSkipLocked"] - end, - Display = function() - local onOff = "False" - if EID.Config["SpindownDiceSkipLocked"] then - onOff = "True" - end - return "Skip Locked Items: " .. onOff - end, - OnChange = function(currentBool) - EID.Config["SpindownDiceSkipLocked"] = currentBool - end, - Info = {"Skip locked items in the preview just as the dice will; the method to check for unlock status is not perfect, though"} - } - ) + EID:AddBooleanSetting("Display", "SpindownDiceSkipLocked", "Skip Locked Items", + {repOnly = true, infoText = "Skip locked items in the preview just as the dice will; the method to check for unlock status is not perfect, though"}) end --------Obstruction--------- @@ -1369,15 +1182,13 @@ if MCMLoaded then } ) -- Bag of Crafting Hide in Battle - EID:AddBooleanSetting("Crafting", - "BagOfCraftingHideInBattle", - "Hide in Battle", "Yes", "No", - "Hides the recipe list when in a fight") + EID:AddBooleanSetting("Crafting", "BagOfCraftingHideInBattle", "Hide in Battle", + {onText = "Yes", offText = "No", + infoText = "Hides the recipe list when in a fight"}) -- Bag of Crafting 8 icons toggle - EID:AddBooleanSetting("Crafting", - "BagOfCraftingDisplayIcons", - "Show Recipes/Best Bag as", "8 Icons", "Groups", - "Choose if you want recipes (and the Best Quality bag in No Recipes Mode) shown as 8 icons, or as grouped ingredients") + EID:AddBooleanSetting("Crafting", "BagOfCraftingDisplayIcons", "Show Recipes/Best Bag as", + {onText = "8 Icons", offText = "Groups", + infoText = "Choose if you want recipes (and the Best Quality bag in No Recipes Mode) shown as 8 icons, or as grouped ingredients"}) MCM.AddSpace("EID", "Crafting") MCM.AddText("EID", "Crafting", function() return "Recipe List Options" end)