Refactoring: Item Reminder feature

- Added Categories
- Added Scrollability
- Refactoring for modularity
This commit is contained in:
Wofsauge committed 2024-03-12 23:56:33 +01:00
1 parent dc9e18b592
commit 0adf6487f4
18 files changed
+568 -300

No files matched your search

+3 -2
View File
@@ -885,9 +885,10 @@ EID.descriptions[languageCode].MCM = {
DemoObjectText = "Това е текст на български#Много яко и дълго описание, автоматично се разпределя на няколко реда заради максималната ширина на кутията!#{{Collectible4}} И това е готин ред#{{Heart}} Този ред те обича#{{AngelDevilChance}} Този ред може да ти е ангел или дявол#\1 {{Damage}} +1 промяна на характеристика",
}
EID.descriptions[languageCode].HoldMapTitle = "Напомняне за вещ"
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " (резултат)" -- this string applies after the item name for example on Teleport 2.0
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " (резултат)",
}
-- https://wofsauge.github.io/IsaacDocs/rep/enums/RoomType.html
-- Includes Repentance room types for localization convenience
+3 -2
View File
@@ -890,9 +890,10 @@ EID.descriptions[languageCode].MCM = {
DemoObjectText = "This text is in english#A very cool and long description to simulate linebreaks caused by EID textbox width!#{{Collectible4}} This is also a cool line#{{Heart}} This line loves you#{{AngelDevilChance}} This line can be your angel or your devil#\1 {{Damage}} +1 Stat Change up",
}
EID.descriptions[languageCode].HoldMapTitle = "Υπενθύμιση Αντικειμένου"
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " Αποτέλεσμα"
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " Αποτέλεσμα",
}
-- https://wofsauge.github.io/IsaacDocs/rep/enums/RoomType.html
-- Includes Repentance room types for localization convenience
+12 -3
View File
@@ -915,9 +915,18 @@ EID.descriptions[languageCode].MCM = {
DemoObjectText = "This text is in english#A very cool and long description to simulate linebreaks caused by EID textbox width!#{{Collectible4}} This is also a cool line#{{Heart}} This line loves you#{{AngelDevilChance}} This line can be your angel or your devil#\1 {{Damage}} +1 Stat Change up",
}
EID.descriptions[languageCode].HoldMapTitle = "Item Reminder"
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " Result"
-- the ItemReminder description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " Result",
CategoryNames = {
Overview = "Inventory Overview",
Special = "Special",
Actives = "Held active items",
Pockets = "Held pocket items",
Trinkets = "Held Trinkets",
Passives = "Held passive items"
}
}
-- https://wofsauge.github.io/IsaacDocs/rep/enums/RoomType.html
-- Includes Repentance room types for localization convenience
+20 -19
View File
@@ -21,7 +21,7 @@ EID.descriptions[languageCode].languageName = "French"
-- Fonts to be used with this language pack
EID.descriptions[languageCode].fonts = {{name="default", textboxWidth = 135}, {name="inverted", textboxWidth = 135}, {name="borderless", textboxWidth = 135}}
EID.descriptions["fr"].collectibles={
EID.descriptions[languageCode].collectibles={
{"1", "Oignon Triste", "↑ Débit {{ColorLime}}+0.7"},
{"2", "Troisième Œil", "Triple tir#↓ Débit diminué"},
{"3", "Cuillère Tordue", "Larmes autoguidées"},
@@ -642,7 +642,7 @@ EID.descriptions[languageCode].carBattery = {
}
---------- Trinkets ----------
EID.descriptions["fr"].trinkets={
EID.descriptions[languageCode].trinkets={
{"1", "Pièce Avalée", "Subir un dégât fait apparaître une pièce"},
{"2", "Caca Pétrifié", "Détruire un caca a 50% de chances de faire apparaître une ressource"},
{"3", "Pile AAA", "Termine de charger l'objet activable s'il lui manque une charge"},
@@ -774,7 +774,7 @@ EID.descriptions["fr"].trinkets={
}
---------- Cards ----------
EID.descriptions["fr"].cards={
EID.descriptions[languageCode].cards={
{"1", "0 - Le Mat", "Téléporte Isaac dans la première salle de l'étage"},
{"2", "I - Le Bateleur", "Larmes autoguidées#{{Timer}} L'effet dure une salle"},
{"3", "II - La Papesse", "Le pied de {{ColorCyan}}Mom{{ColorWhite}} écrase l'ennemi de la salle avec le plus de PV#Dans une salle vide, le pied écrase Isaac"},
@@ -834,9 +834,9 @@ EID.descriptions["fr"].cards={
---------- Pills ----------
EID.descriptions["fr"].unidentifiedPill = "Pilule non identifiée"
EID.descriptions[languageCode].unidentifiedPill = "Pilule non identifiée"
EID.descriptions["fr"].pills={
EID.descriptions[languageCode].pills={
{"0", "Flatulences", "Fait apparaître un nuage de gaz qui inflige 5 dégâts de contact et empoisonne les ennemis"},
{"1", "Coup dur", "Inflige 1 cœur de dégâts à Isaac"},
{"2", "Digoxine", "{{SoulHeart}} +2 cœurs d'âme"},
@@ -887,9 +887,9 @@ EID.descriptions["fr"].pills={
}
---------- Sacrifice Room ----------
EID.descriptions["fr"].sacrificeHeader = "Récompense du prochain sacrifice"
EID.descriptions[languageCode].sacrificeHeader = "Récompense du prochain sacrifice"
EID.descriptions["fr"].sacrifice={
EID.descriptions[languageCode].sacrifice={
{"1", "", "1 pièce {{ColorSilver}}(50%)#Rien {{ColorSilver}}(50%)#1 bombe {{ColorSilver}}(100% au premier étage si le boss a été battu en moins d'une minute)"},
{"2", "", "1 pièce {{ColorSilver}}(50%)#Rien {{ColorSilver}}(50%)#1 bombe {{ColorSilver}}(100% au premier étage si le boss a été battu en moins d'une minute)"},
{"3", "", "Augmente les chances d'ouvrir le Refuge des Anges {{ColorSilver}}(67%)#Rien {{ColorSilver}}(33%)"},
@@ -904,9 +904,9 @@ EID.descriptions["fr"].sacrifice={
{"12", "", "Téléportation à la {{ColorTransform}}Chambre Noire {{ColorSilver}}(50%)#Rien {{ColorSilver}}(50%)"},
}
---------- Dice Room ----------
EID.descriptions["fr"].diceHeader = "[Effet de dé]"
EID.descriptions[languageCode].diceHeader = "[Effet de dé]"
EID.descriptions["fr"].dice={
EID.descriptions[languageCode].dice={
{"1", "", "Rejoue tous les objets d'Isaac"},
{"2", "", "Rejoue toutes les ressources de la salle"},
{"3", "", "Rejoue toutes les ressources de l'étage"},
@@ -916,7 +916,7 @@ EID.descriptions["fr"].dice={
}
---------- Transformations ----------
EID.descriptions["fr"].transformations={
EID.descriptions[languageCode].transformations={
"", -- 0 = none
"Guppy", -- 1
"Fan de Spore", -- 2
@@ -938,28 +938,29 @@ EID.descriptions["fr"].transformations={
---------- MISC ----------
EID.descriptions["fr"].VoidText = "Si absorbé :"
EID.descriptions["fr"].VoidNames = {"Vitesse {{ColorLime}}{1}", "Débit {{ColorLime}}{1}", "Dégâts {{ColorLime}}{1}", "Portée {{ColorLime}}{1}", "Vitesse des tirs {{ColorLime}}{1}", "Chance {{ColorLime}}{1}"}
EID.descriptions[languageCode].VoidText = "Si absorbé :"
EID.descriptions[languageCode].VoidNames = {"Vitesse {{ColorLime}}{1}", "Débit {{ColorLime}}{1}", "Dégâts {{ColorLime}}{1}", "Portée {{ColorLime}}{1}", "Vitesse des tirs {{ColorLime}}{1}", "Chance {{ColorLime}}{1}"}
EID.descriptions["fr"].CollectionPageInfo = "Cet objet n'a encore jamais été ramassé !"
EID.descriptions[languageCode].CollectionPageInfo = "Cet objet n'a encore jamais été ramassé !"
EID.descriptions["fr"].MCM = {
EID.descriptions[languageCode].MCM = {
DemoObjectName = "Nom de l'objet test",
DemoObjectTransformation = "Transformation de test",
DemoObjectText = "Ceci est un texte en français#Une description longue trop cool pour tester les retours à la ligne automatiques !!#{{Collectible4}} Super ligne ici aussi#{{Heart}} Cette ligne t'adore#{{AngelDevilChance}} Cette ligne peut être ton petit ange ou ton petit diable#\1 {{Damage}} {{ColorLime}}+1{{ColorWhite}} statistique",
}
EID.descriptions["fr"].HoldMapTitle = "Objets tenus"
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions["fr"].HoldMapHeader = " Résultat"
-- the ItemReminder description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " Résultat",
}
-- https://wofsauge.github.io/IsaacDocs/rep/enums/RoomType.html
-- Includes Repentance room types for localization convenience
EID.descriptions["fr"].RoomTypeNames = { "Salle normale", "Boutique", "Salle I AM ERROR", "Salle du Trésor", "Salle de Boss", "Salle de Mini-boss", "Salle Secrète", "Salle Super Secrète", "Salle d'Arcade", "Salle Maudite", "Salle de Défi", "Bibliothèque", "Salle de Sacrifice", "Antre du Diable", "Refuge des Anges", "Souterrain", "Ruée des Boss", "Chambre d'Isaac", "Chambre Abandonnée", "Coffre-Fort", "Salle de Dé", "Marché Noir", "Sas de Sortie", "Planétarium", "Téléporteur (Départ)", "Téléporteur (Arrivée)", "Sortie Secrète", "Salle de l'Utérus Bleu", "Salle Ultra Secrète",
EID.descriptions[languageCode].RoomTypeNames = { "Salle normale", "Boutique", "Salle I AM ERROR", "Salle du Trésor", "Salle de Boss", "Salle de Mini-boss", "Salle Secrète", "Salle Super Secrète", "Salle d'Arcade", "Salle Maudite", "Salle de Défi", "Bibliothèque", "Salle de Sacrifice", "Antre du Diable", "Refuge des Anges", "Souterrain", "Ruée des Boss", "Chambre d'Isaac", "Chambre Abandonnée", "Coffre-Fort", "Salle de Dé", "Marché Noir", "Sas de Sortie", "Planétarium", "Téléporteur (Départ)", "Téléporteur (Arrivée)", "Sortie Secrète", "Salle de l'Utérus Bleu", "Salle Ultra Secrète",
-- Not technically room types but still potentially useful to have localized
[666] = "Antre du Diable / Refuge des Anges", [1024] = "Salle Rouge", [1025] = "Salle Rouge Spéciale" }
-- currently used for D1
EID.descriptions["fr"].PickupNames = {
EID.descriptions[languageCode].PickupNames = {
["5.0"] = "Aucun",
["5.10"] = "{{Heart}} Cœur",
+4 -3
View File
@@ -948,9 +948,10 @@ EID.descriptions[languageCode].MCM = {
DemoObjectText = "日本語の表示サンプル {{Collectible36}}{{Collectible36}}{{Collectible36}}{{Collectible36}}{{Collectible36}}{{Collectible36}}{{Collectible36}}{{Collectible36}}{{Collectible36}}#↑ おすすめ設定#アイテム名の言語切替: General→NameLanguage 日本語/英語/    日本語+英語を選べます#戦闘中のみ説明非表示: General→HideInBattle",
}
EID.descriptions[languageCode].HoldMapTitle = "アイテムリマインダー"
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " 結果"
-- the ItemReminder description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " 結果",
}
-- https://wofsauge.github.io/IsaacDocs/rep/enums/RoomType.html
-- Includes Repentance room types for localization convenience
+5 -3
View File
@@ -973,9 +973,11 @@ EID.descriptions[languageCode].MCM={
DemoObjectText = "이 설명은 한국어로 작성되었습니다.#!!! 간단 설정 방법:#{{Collectible182}} 폰트: Visuals→Font Type#{{Freezing}} 텍스트박스 너비: General→Textbox Width#\1 {{Damage}}테스트 공격력 +1#{{AngelDevilChance}} 악마와 천사, 당신의 선택은?#{{DeliriumSmall}} 모두가 싫어하는 델리리움",
}
EID.descriptions[languageCode].HoldMapTitle = "리마인더"
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " 예상 결과"
-- the ItemReminder description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " 예상 결과",
}
-- includes Planetarium even though it's unused in AB+ for convenience
-- Includes Repentance room types for localization convenience
EID.descriptions[languageCode].RoomTypeNames = { "일반방", "상점", "I AM ERROR (오류방)", "보물방", "보스방", "미니보스방", "비밀방", "일급비밀방", "오락실", "저주방", "도전방/보스도전방", "책방", "희생방", "악마방", "천사방", "사다리방", "보스러시", "깨끗한 침대방", "더러운 침대방", "금고방", "주사위방", "블랙마켓", "출구방", "천체관", "텔레포터 입구", "텔레포터 출구", "대체 루트 입구", "파란 방", "특급비밀방",
+4 -3
View File
@@ -887,9 +887,10 @@ EID.descriptions[languageCode].MCM = {
DemoObjectText = "This text is in english#A very cool and long description to simulate linebreaks caused by EID textbox width!#{{Collectible4}} This is also a cool line#{{Heart}} This line loves you#{{AngelDevilChance}} This line can be your angel or your devil#\1 {{Damage}} +1 Stat Change up",
}
EID.descriptions[languageCode].HoldMapTitle = "Item Reminder"
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " Result"
-- the ItemReminder description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " Resultat",
}
-- https://wofsauge.github.io/IsaacDocs/rep/enums/RoomType.html
-- Includes Repentance room types for localization convenience
+4 -2
View File
@@ -884,8 +884,10 @@ EID.descriptions[languageCode].MCM = {
DemoObjectText = "Este texto está em Português brasileiro#Uma descrição muito legal e longa para simular quebras de linha causadas pela largura da caixa de texto do EID!#{{Collectible4}} Esta também é uma linha legal#{{Heart}} Esta linha ama você#{{AngelDevilChance}} Esta linha pode ser seu anjo ou demônio#\1 {{Damage}} +1 Mudança de Status",
}
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " Resultado"
-- the ItemReminder description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " Resultado",
}
-- 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" }
+4 -3
View File
@@ -879,9 +879,10 @@ EID.descriptions[languageCode].MCM = {
EID.descriptions[languageCode].CollectionPageInfo = "¡Debes tomar este objeto para completar la pagina de colección!"
EID.descriptions[languageCode].HoldMapTitle = "Recordatorio"
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " Resultado"
-- the ItemReminder description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " Resultado",
}
-- currently used for D1
EID.descriptions[languageCode].PickupNames = {
+4 -3
View File
@@ -914,9 +914,10 @@ EID.descriptions[languageCode].MCM = {
DemoObjectText = "Це текст українською#Дуже крутий та довгий опис предмета для симуляції переходів на інший рядок, спричинених шириною текстового поля в EID!#{{Collectible4}} Це також крутий рядок#{{Heart}} Цей рядок любить тебе і Україну#{{AngelDevilChance}} Цей рядок може бути ще тим чортиком чи ангелом#\1 {{Damage}} +1 Характеристику збільшено",
}
EID.descriptions[languageCode].HoldMapTitle = "Нагадування"
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " Результат"
-- the ItemReminder description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " Результат",
}
-- https://wofsauge.github.io/IsaacDocs/rep/enums/RoomType.html
-- Includes Repentance room types for localization convenience
+3 -2
View File
@@ -915,9 +915,10 @@ EID.descriptions[languageCode].MCM = {
DemoObjectText = "这份文本是中文的#这是一条非常酷的长文本,用来模拟EID文本框自动分行功能!#\1 这也是一条非常酷的文本#祝使用愉快{{Heart}}",
}
EID.descriptions[languageCode].HoldMapTitle = "道具提示"
-- 长按地图键会以"道具名称的结果"为描述预测结果
EID.descriptions[languageCode].HoldMapHeader = "的结果"
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " 的结果",
}
-- https://wofsauge.github.io/IsaacDocs/rep/enums/RoomType.html
-- 为本地化方便也添加了忏悔的房间类型
+4 -3
View File
@@ -1152,9 +1152,10 @@ end
EID.descriptions[languageCode].ResultsWithX = "(Výsledky s {1})"
EID.descriptions[languageCode].HoldMapTitle = "Item Reminder"
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " Result"
-- the ItemReminder description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " Result",
}
-- https://wofsauge.github.io/IsaacDocs/rep/enums/RoomType.html
-- Includes Repentance room types for localization convenience
+5 -2
View File
@@ -1163,8 +1163,11 @@ end
-- Pandora Box and Strange Key
EID.descriptions[languageCode].PandorasBoxStrangeKeyEffect = "En su lugar, la llave es usada para generar 6 objetos de pools aleatorias"
-- Pandora Box and Strange Key end
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " Resultado"
-- the ItemReminder description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].ItemReminder = {
ResultHeader = " Resultado",
}
EID.descriptions[languageCode].ResultsWithX = "(Resultado con {1})"
+33 -1
View File
@@ -764,12 +764,15 @@ end
function EID:createItemIconObject(str)
local collID,numReplace = string.gsub(str, "Collectible", "")
local item = nil
local subTypeIdentifier = 0
if numReplace > 0 and collID ~= "" and tonumber(collID) ~= nil then
item = EID.itemConfig:GetCollectible(tonumber(collID))
subTypeIdentifier = tonumber(collID)
end
local trinketID,numReplace2 = string.gsub(str, "Trinket", "")
if numReplace2 > 0 and trinketID ~= "" and tonumber(trinketID) ~= nil then
item = EID.itemConfig:GetTrinket(tonumber(trinketID))
subTypeIdentifier = tonumber(trinketID)
end
local cardID,numReplace3 = string.gsub(str, "Card", "")
if numReplace3 > 0 and cardID ~= "" and tonumber(cardID) ~= nil then
@@ -791,7 +794,7 @@ function EID:createItemIconObject(str)
spriteDummy:Load("gfx/eid_inline_icons.anm2", true)
spriteDummy:ReplaceSpritesheet(1, item.GfxFileName)
spriteDummy:LoadGraphics()
local newDynamicSprite = {"ItemIcon", 0, 11, 8, -2, -2, spriteDummy}
local newDynamicSprite = {"ItemIcon", subTypeIdentifier, 11, 8, -2, -2, spriteDummy}
dynamicSpriteCache[str] = newDynamicSprite
return newDynamicSprite
end
@@ -1933,3 +1936,32 @@ end
function EID:GetEntityXMLName(Type, Variant, SubType)
return EID.XMLEntityNames[Type.."."..Variant] or EID.XMLEntityNames[Type.."."..Variant.."."..SubType]
end
-- Get an item's RNG seed. We have no use for the RNG object itself because every other function it can do will advance the item's RNG, altering the game state
function EID:GetItemSeed(player, id, variant)
if player == nil then return game:GetSeeds():GetStartSeed()
elseif variant == nil or variant == 100 then return player:GetCollectibleRNG(id):GetSeed()
elseif variant == 350 then return player:GetTrinketRNG(id):GetSeed()
elseif variant == 300 then return player:GetCardRNG(id):GetSeed()
elseif variant == 70 then return player:GetPillRNG(id):GetSeed() end
end
local variantToName = { [70] = "Pill", [100] = "Collectible", [300] = "Card", [350] = "Trinket" }
function EID:GetIconNameByVariant(variant)
return variantToName[variant]
end
function EID:GetIconStringByDescriptionObject(descObj)
if descObj and descObj.Icon then
if type(descObj.Icon) == "table" then
local iconName = EID:GetIconNameByVariant(descObj.ObjVariant)
if iconName == "Card" or iconName == "Pill" then
return "{{" .. iconName .. (descObj.Icon[2] + 1) .. "}}"
end
return "{{" .. iconName .. descObj.Icon[2] .. "}}"
elseif type(descObj.Icon) == "string" then
return descObj.Icon
end
end
return "{{Blank}}"
end
+18
View File
@@ -318,10 +318,24 @@ EID.UserConfig = {
-- Enable/Disable item reminder feature.
-- Hold Map (or the button action chosen below) to show a description of your active item's effect, recently picked up items, and things like Teleport 2.0's destination and Void's absorbed items
["ItemReminderEnabled"] = true,
-- Display all important descriptions in a single overview category
-- Default = true
["ItemReminderShowOverview"] = true,
-- Disable inputs while Item Reminder is visible
-- Default = true
["ItemReminderDisableInputs"] = true,
-- Set the keybinding that's held to show the Item Reminder description, Flip/Spindown Dice preview descriptions, and interacting with the Bag of Crafting recipe list
-- Look into the AB+ or Repentance documentation for the key names here: https://wofsauge.github.io/IsaacDocs/rep/enums/ButtonAction.html
-- Default = ButtonAction.ACTION_MAP
["BagOfCraftingToggleKey"] = ButtonAction.ACTION_MAP,
-- Set the keybinding that is used to scroll thru the categories in the left direction
-- Look into the AB+ or Repentance documentation for the key names here: https://wofsauge.github.io/IsaacDocs/rep/enums/ButtonAction.html
-- Default = ButtonAction.ACTION_SHOOTLEFT
["ItemReminderNavigateLeftButton"] = ButtonAction.ACTION_SHOOTLEFT,
-- Set the keybinding that is used to scroll thru the categories in the right direction
-- Look into the AB+ or Repentance documentation for the key names here: https://wofsauge.github.io/IsaacDocs/rep/enums/ButtonAction.html
-- Default = ButtonAction.ACTION_SHOOTLEFT
["ItemReminderNavigateRightButton"] = ButtonAction.ACTION_SHOOTRIGHT,
-- Show recently acquired item descriptions in the Item Reminder (good for Curse of the Blind!)
-- Default = 1
["ItemReminderShowRecentItem"] = 1,
@@ -585,7 +599,11 @@ EID.DefaultConfig = {
["CraftingResultButton"] = -1,
["ItemReminderEnabled"] = true,
["ItemReminderShowOverview"] = true,
["ItemReminderDisableInputs"] = true,
["BagOfCraftingToggleKey"] = ButtonAction.ACTION_MAP,
["ItemReminderNavigateLeftButton"] = ButtonAction.ACTION_SHOOTLEFT,
["ItemReminderNavigateRightButton"] = ButtonAction.ACTION_SHOOTRIGHT,
["ItemReminderShowRecentItem"] = 1,
["ItemReminderShowActiveDesc"] = 1,
["ItemReminderShowPocketDesc"] = 1,
+419 -242
View File
@@ -1,88 +1,79 @@
local game = Game()
local blacklist
local holdMapDesc
local currentPlayer
EID.InsideItemReminder = false
local GLITCH_ITEM_FLAG = 4294967296
local currentBlacklist
local lastInputTime = 0
local lastScrollDirection = 1 -- used for automatic scroll feature, if no description is visible for a category
-- Simple function to help with adding properly formatted sections to the desc
local function append(icon, title, newDesc)
holdMapDesc = holdMapDesc .. (icon or "{{Blank}}") .. " {{ColorEIDObjName}}" .. title .. "#" .. newDesc .. "#"
end
EID.ItemReminderBlacklist = { ["5.100.714"] = true, ["5.100.715"] = true } -- Dont display these in the Item reminder view
EID.ItemReminderTempDescriptions = {} -- Temporary stores descriptions that will be displayed after everythng got evaluated
EID.ItemReminderSelectedCategory = 0 -- Currently selected category
EID.InsideItemReminder = false -- Disable some modifiers, when building the Item Reminder description
-- Simple function to quickly get an item's RNG seed. We have no use for the RNG object itself because every other function it can do will advance the item's RNG, altering the game state
local function getSeed(id, variant)
if variant == nil or variant == 100 then return currentPlayer:GetCollectibleRNG(id):GetSeed()
elseif variant == 350 then return currentPlayer:GetTrinketRNG(id):GetSeed()
elseif variant == 300 then return currentPlayer:GetCardRNG(id):GetSeed()
elseif variant == 70 then return currentPlayer:GetPillRNG(id):GetSeed() end
end
-- TODO:
-- crooked penny cheats. 404/liberty cap/broken syringe/etc. "what item is it"
-- pandora's box? it shows the whole desc which is kinda useful but too big
-- Helper function to easily add an item's stock description to the desc
-- Don't use if you need to customize the desc! (Like Sanguine Bond's result highlighting)
-- extraIcon is for when we want a special icon before the line (like {{Dice Bag Icon}} {{Dice Item Icon}})
local variantToName = { [70] = "Pill", [100] = "Collectible", [300] = "Card", [350] = "Trinket" }
local function addObjectDesc(type, variant, subtype, extraIcon)
local objectID = type .. "." .. variant .. "." .. subtype
if not blacklist[objectID] then
blacklist[objectID] = true
local demoDescObj = EID:getDescriptionObj(type, variant, subtype)
local iconString = "{{" .. variantToName[variant] .. subtype .. "}}"
if extraIcon then iconString = extraIcon .. " " .. iconString end
append(iconString, demoDescObj.Name, demoDescObj.Description)
end
end
-- Data Tables --
-- Rainbow Worm's trinket IDs it grants, in order
local rainbowWormEffects = { [0] = 9, 11, 65, 27, 10, 12, 26, 66, 96, 144 }
-- Mysterious Paper does not play well with displaying Error 404's effect
local mysteriousPaperBlacklist = { [23] = true, [48] = true }
-- Format : Table of { id = "Category Name", entryGenerators = table of functions to generate descriptions }
-- Execution order is handles by the order of the table entries.
-- Category name is interpreted as a lookup for the "EID.descriptions.ItemReminder.CategoryNames" table. If no translation is found, use english or the lookup value
EID.ItemReminderCategories = {
{ id = "Overview", entryGenerators = {} }, -- special handling for Overview category
{ id = "Special", entryGenerators = { function(player) EID:ItemReminderHandlePoopSpells(player) end, } },
{ id = "Actives", entryGenerators = { function(player) EID:ItemReminderHandleActiveItems(player) end, } },
{ id = "Pockets", entryGenerators = {
function(player) EID:ItemReminderHandleDiceBag(player) end,
function(player) EID:ItemReminderHandlePocketActive(player) end,
function(player) EID:ItemReminderHandlePocketItems(player) end } },
{ id = "Trinkets", entryGenerators = {
function(player) EID:ItemReminderHandleTrinkets(player) end,
function(player) EID:ItemReminderHandleGulpedModelingClay(player) end } },
{ id = "Passives", entryGenerators = {
function(player) -- Passive item: Zodiac
if EID.isRepentance and player:HasCollectible(392) then
EID:ItemReminderAddDescription(player, 5, 100, 392)
end
end,
function(player) -- Passive item: Echo Chamber
if EID.isRepentance and player:HasCollectible(700) then
EID:ItemReminderAddDescription(player, 5, 100, 700)
end
end,
function(player) EID:ItemReminderHandleRecentItems(player) end } },
}
function EID:getHoldMapDescription(player, checkingTwin)
EID.InsideItemReminder = true
-- Starting Blacklist: Recall, Hold
blacklist = { ["5.100.714"] = true, ["5.100.715"] = true, }
holdMapDesc = ""
currentPlayer = player
-- TODO:
-- crooked penny cheats. 404/liberty cap/broken syringe/etc. "what item is it"
-- pandora's box? it shows the whole desc which is kinda useful but too big
-- Tainted ??? Poop Descriptions
if EID.isRepentance and EID.Config["ItemReminderShowPoopDesc"] > 0 and player:GetPlayerType() == 25 then
for i = 0, EID.Config["ItemReminderShowPoopDesc"]-1 do
local poopInfo = EID:getDescriptionEntry("poopSpells")
local nextPoop = player:GetPoopSpell(i)
append("{{PoopSpell" .. nextPoop .. "}}", poopInfo[nextPoop][1], poopInfo[nextPoop][2])
end
end
-- Recently Acquired Item Descriptions
if EID.Config["ItemReminderShowRecentItem"] > 0 then
local printedItems = 0
local playerNum = EID:getPlayerID(player)
if EID.RecentlyTouchedItems[playerNum] then
for i = #EID.RecentlyTouchedItems[playerNum], 1, -1 do
if printedItems >= EID.Config["ItemReminderShowRecentItem"] then break end
printedItems = printedItems + 1
local recentID = EID.RecentlyTouchedItems[playerNum][i] % 4294967296
addObjectDesc(5, 100, recentID)
-- Format: ItemID = table
-- modifierFunction = function that modifies the original description object of the item
-- isCheat = Only evaluate, if the "ItemReminderShowRNGCheats" config option is enabled
-- isHiddenInfo = Only evaluate, if the "ItemReminderShowHiddenInfo" config option is enabled
-- isRepentance = Only evaluate, if Repentance is installed
EID.ItemReminderDescriptionModifier = {
---------------- Passive Items ----------------
["5.100.392"] = { -- Zodiac
isHiddenInfo = true,
isRepentance = true,
modifierFunction = function(descObj, player)
local zodiacItem = player:GetZodiacEffect()
if zodiacItem > 0 then
local demoDescObj = EID:getDescriptionObj(5, 100, zodiacItem)
EID:ItemReminderAddResultHeaderSuffix(descObj, demoDescObj.Name)
descObj.Icon = demoDescObj.Icon
descObj.Description = demoDescObj.Description
end
end
end
-- Echo Chamber Description
if EID.isRepentance and player:HasCollectible(700) then
local playerID = EID:getPlayerID(player)
local pickupHistory = EID.PlayerItemInteractions[playerID].pickupHistory
-- Dead Tainted Lazarus exception
if player:GetPlayerType() == 38 then
pickupHistory = EID.PlayerItemInteractions[playerID].altPickupHistory or pickupHistory
end
if pickupHistory then
},
["5.100.700"] = { -- Echo Chamber
isRepentance = true,
modifierFunction = function(descObj, player)
local playerID = EID:getPlayerID(player)
local pickupHistory = EID.PlayerItemInteractions[playerID].pickupHistory
-- Dead Tainted Lazarus exception
if player:GetPlayerType() == 38 then
pickupHistory = EID.PlayerItemInteractions[playerID].altPickupHistory or pickupHistory
end
if not pickupHistory then return end
local pickupNames = ""
local pickupsToPrint = 3
for i = 1, #pickupHistory do
@@ -101,213 +92,399 @@ function EID:getHoldMapDescription(player, checkingTwin)
end
end
if pickupNames ~= "" then
append("{{Collectible700}}", EID:getObjectName(5, 100, 700), pickupNames)
EID:ItemReminderAddResultHeaderSuffix(descObj)
descObj.Description = pickupNames
end
end
end
},
-- Bag of Crafting
if EID.isRepentance and player:HasCollectible(710) then
local floorQuery = EID.BoC.FloorOverride or EID.BoC.FloorQuery
local inventoryQuery= EID.BoC.InventoryOverride or EID.BoC.InventoryQuery
local bagItems = EID.BoC.BagItemsOverride or EID.BoC.BagItems
local total = #floorQuery + #inventoryQuery+#bagItems
local text = total.." of 8 items available"
if total < 8 then text = text .. "#{{Warning}} Needs at least 8 to show crafting recipes!" end
blacklist["5.100.710"] = true
append("{{Collectible710}}", EID:getObjectName(5,100,710), text)
end
---------------- Active Items ----------------
-- Active Item Descriptions
if EID.Config["ItemReminderShowActiveDesc"] > 0 then
for i = 0, EID.Config["ItemReminderShowActiveDesc"]-1 do
-- the modulo is to convert negative IDs (glitched items) to positive IDs
local heldActive = player:GetActiveItem(i) % 4294967296
if heldActive > 0 and not blacklist["5.100." .. heldActive] then
-- Metronome result
if heldActive == 488 and EID.Config["ItemReminderShowRNGCheats"] then
blacklist["5.100.488"] = true
addObjectDesc(5, 100, EID:MetronomePrediction(getSeed(488)), "{{Collectible488}}")
-- Teleport! location
elseif heldActive == 44 and EID.Config["ItemReminderShowRNGCheats"] then
blacklist["5.100.44"] = true
-- The result preview changes as soon as we activate Teleport, which looks awkward, so try to not display the result while mid-teleport. Doesn't work perfectly and only in Rep
if not EID.isRepentance or player:GetSprite():GetAnimation() ~= "TeleportUp" then
append("{{Collectible44}}", EID:getObjectName(5,100,44) .. EID:getDescriptionEntry("HoldMapHeader"), EID:Teleport1Prediction(getSeed(44)))
["5.100.44"] = { -- Teleport! location
isCheat = true,
isRepentance = true,
-- The result preview changes as soon as we activate Teleport, which looks awkward, so try to not display the result while mid-teleport.
-- Doesn't work perfectly and only in Rep
modifierFunction = function(descObj, player)
if player:GetSprite():GetAnimation() ~= "TeleportUp" then
EID:ItemReminderAddResultHeaderSuffix(descObj)
descObj.Description = EID:Teleport1Prediction(EID:GetItemSeed(player, 44))
end
end,
},
["5.100.419"] = { -- Teleport 2.0 location
modifierFunction = function(descObj, _)
EID:ItemReminderAddResultHeaderSuffix(descObj)
descObj.Description = EID:Teleport2Prediction()
end
},
["5.100.476"] = { -- D1
isCheat = true,
modifierFunction = function(descObj, player)
EID:ItemReminderAddResultHeaderSuffix(descObj)
descObj.Description = EID:D1Prediction(EID:GetItemSeed(player, 476))
end
},
["5.100.477"] = { -- Void
modifierFunction = function(descObj, player)
local absorbedItems = EID.absorbedItems[tostring(EID:getPlayerID(player))]
if absorbedItems then
local descriptionText = ""
local countItems = 0
for _, _ in pairs(absorbedItems) do
countItems = countItems + 1
end
if countItems > 0 then
if countItems > 5 then
descriptionText = "{{Blank}} "
end
-- Teleport 2.0 location
elseif heldActive == 419 then
blacklist["5.100.419"] = true
append("{{Collectible419}}", EID:getObjectName(5,100,419) .. EID:getDescriptionEntry("HoldMapHeader"), EID:Teleport2Prediction())
-- D Infinity
elseif heldActive == 489 then
blacklist["5.100.489"] = true
addObjectDesc(5, 100, EID:CurrentDInfinity(getSeed(489), player), "{{Collectible489}}")
-- D1
elseif heldActive == 476 and EID.Config["ItemReminderShowRNGCheats"] then
blacklist["5.100.476"] = true
append("{{Collectible476}}", EID:getObjectName(5,100,476) .. EID:getDescriptionEntry("HoldMapHeader"), EID:D1Prediction(getSeed(476)))
-- Void
elseif heldActive == 477 then
local absorbedActives = ""
local printNormalDesc = true
local absorbedItems = EID.absorbedItems[tostring(EID:getPlayerID(player))]
if absorbedItems then
local countItems = 0
for _, _ in pairs(absorbedItems) do
countItems = countItems + 1
end
if countItems > 0 then
if countItems > 5 then
absorbedActives = "{{Blank}} "
end
for k, _ in pairs(absorbedItems) do
absorbedActives = absorbedActives .. "{{Collectible" .. k .. "}} "
if countItems <= 5 then
absorbedActives = absorbedActives .. EID:getObjectName(5, 100, tonumber(k)) .. "#"
end
end
blacklist["5.100.477"] = true
append("{{Collectible477}}", EID:getObjectName(5, 100, 477) .. EID:getDescriptionEntry("HoldMapHeader"), absorbedActives)
printNormalDesc = false
for k, _ in pairs(absorbedItems) do
descriptionText = descriptionText .. "{{Collectible" .. k .. "}} "
if countItems <= 5 then
descriptionText = descriptionText .. EID:getObjectName(5, 100, tonumber(k)) .. "#"
end
end
if printNormalDesc then addObjectDesc(5, 100, heldActive) end
else
addObjectDesc(5, 100, heldActive)
EID:ItemReminderAddResultHeaderSuffix(descObj)
descObj.Description = descriptionText
end
end
end
end
},
["5.100.488"] = { -- Metronome
modifierFunction = function(descObj, player)
local predictionItem = EID:MetronomePrediction(EID:GetItemSeed(player, 488))
local demoDescObj = EID:getDescriptionObj(5, 100, predictionItem)
EID:ItemReminderAddResultHeaderSuffix(descObj, demoDescObj.Name)
descObj.Icon = demoDescObj.Icon
descObj.Description = demoDescObj.Description
end
},
["5.100.489"] = { -- D Infinity
modifierFunction = function(descObj, player)
local predictionItem = EID:CurrentDInfinity(EID:GetItemSeed(player, 489), player)
local demoDescObj = EID:getDescriptionObj(5, 100, predictionItem)
EID:ItemReminderAddResultHeaderSuffix(descObj, demoDescObj.Name)
descObj.Icon = demoDescObj.Icon
descObj.Description = demoDescObj.Description
end
},
["5.100.710"] = { -- Bag of Crafting
isRepentance = true,
modifierFunction = function(descObj, _)
local floorQuery = EID.BoC.FloorOverride or EID.BoC.FloorQuery
local inventoryQuery = EID.BoC.InventoryOverride or EID.BoC.InventoryQuery
local bagItems = EID.BoC.BagItemsOverride or EID.BoC.BagItems
local total = #floorQuery + #inventoryQuery + #bagItems
local text = total .. " of 8 items available"
if total < 8 then text = text .. "#{{Warning}} Needs at least 8 to show crafting recipes!" end
descObj.Description = text
end
},
-- Pocket Item Descriptions
-- Annoying because there's no easy way to just get the info of a slot
if EID.Config["ItemReminderShowPocketDesc"] > 0 then
-- I don't think we can actually know what slot the player is on, so, save these to display (if they exist) for when Card and Pill in a slot are both 0, to attempt to always show them in slot order
local dicePrinted = false
local diceBag = EID.isRepentance and player:GetActiveItem(3) or 0
local pocketPrinted = false
local pocketActive = EID.isRepentance and player:GetActiveItem(2) or 0
for i = 0, EID.Config["ItemReminderShowPocketDesc"]-1 do
local heldCard = player:GetCard(i)
local heldPill = player:GetPill(i)
if heldCard > 0 then
addObjectDesc(5, 300, heldCard)
elseif heldPill > 0 then
-- Check if our held pill is identified
EID.pillPlayer = player
local identified = game:GetItemPool():IsPillIdentified(heldPill)
if EID.isRepentance and heldPill % PillColor.PILL_GIANT_FLAG == PillColor.PILL_GOLD then identified = true end
if (identified or EID.Config["ShowUnidentifiedPillDescriptions"]) then
addObjectDesc(5, 70, heldPill)
end
EID.pillPlayer = nil
elseif diceBag > 0 and not dicePrinted then
dicePrinted = true
addObjectDesc(5, 100, diceBag, "{{Trinket154}}")
elseif pocketActive > 0 and not pocketPrinted then
pocketPrinted = true
addObjectDesc(5, 100, pocketActive)
-- we'll have to add tainted char specific text for their actives with unique effects for that character!
---------------- TRINKETS ----------------
["5.350.4"] = { -- Broken Remote has two possible effects depending on if its doubled
modifierFunction = function(descObj, player)
local originalName = descObj.Name
if player:GetTrinketMultiplier(4) > 1 then
-- Teleport 2.0
local demoDescObj = EID:getDescriptionObj(5, 100, 419)
EID.ItemReminderDescriptionModifier["5.100.419"].modifierFunction(descObj, player)
descObj.Name = originalName
EID:ItemReminderAddResultHeaderSuffix(descObj, demoDescObj.Name)
elseif EID.Config["ItemReminderShowRNGCheats"] then
-- Teleport
local demoDescObj = EID:getDescriptionObj(5, 100, 44)
EID.ItemReminderDescriptionModifier["5.100.44"].modifierFunction(descObj, player)
descObj.Name = originalName
EID:ItemReminderAddResultHeaderSuffix(descObj, demoDescObj.Name)
end
end
end
},
["5.350.64"] = { -- Rainbow Worm
isHiddenInfo = true,
modifierFunction = function(descObj, _)
-- Rainbow Worm's trinket IDs it grants, in order
local rainbowWormEffects = { [0] = 9, 11, 65, 27, 10, 12, 26, 66, 96, 144 }
local trinketID = rainbowWormEffects[math.floor(game.TimeCounter / 30 / 3) % (EID.isRepentance and 10 or 8)]
local demoDescObj = EID:getDescriptionObj(5, 350, trinketID)
EID:ItemReminderAddResultHeaderSuffix(descObj, demoDescObj.Name)
descObj.Icon = demoDescObj.Icon
descObj.Description = demoDescObj.Description
end
},
["5.350.75"] = { -- 404 Error
isHiddenInfo = true,
isRepentance = true, -- HasTrinket can't differentiate between real and fake trinkets in AB+
modifierFunction = function(descObj, player)
-- Unfortunately, includes other temporary trinket givers, such as Glitched Items. We'd need to predict 404's result using RNG to actually know which it specifically is granting
-- Trinket Descriptions
if EID.Config["ItemReminderShowTrinketDesc"] > 0 then
for t = 0, EID.Config["ItemReminderShowTrinketDesc"]-1 do
-- account for Golden Trinket IDs
local heldTrinketTrue = player:GetTrinket(t)
local heldTrinket = heldTrinketTrue
if EID.isRepentance then heldTrinket = heldTrinketTrue & TrinketType.TRINKET_ID_MASK end
if heldTrinket > 0 and not blacklist["5.350." .. heldTrinket] then
if heldTrinket == 4 then
-- Broken Remote has two possible effects depending on if its doubled
if player:GetTrinketMultiplier(heldTrinket) > 1 then
-- Teleport 2.0
blacklist["5.350.4"] = true
append("{{Trinket4}}", EID:getObjectName(5,350,4) .. EID:getDescriptionEntry("HoldMapHeader"), EID:Teleport2Prediction())
elseif EID.Config["ItemReminderShowRNGCheats"] then
-- Teleport (requires cheating option on)
blacklist["5.350.4"] = true
if not EID.isRepentance or player:GetSprite():GetAnimation() ~= "TeleportUp" then
append("{{Trinket4}}", EID:getObjectName(5,350,4) .. EID:getDescriptionEntry("HoldMapHeader"), EID:Teleport1Prediction(getSeed(44)))
end
end
-- Rainbow Worm
elseif EID.Config["ItemReminderShowHiddenInfo"] and heldTrinket == 64 then
blacklist["5.350.64"] = true
local rainbowWormEffect = rainbowWormEffects[math.floor(game.TimeCounter / 30 / 3) % (EID.isRepentance and 10 or 8)]
addObjectDesc(5, 350, rainbowWormEffect, "{{Trinket64}}")
-- 404 Error
-- Unfortunately, includes other temporary trinket givers, such as Glitched Items. We'd need to predict 404's result using RNG to actually know which it specifically is granting
-- And unfortunately, HasTrinket can't differentiate between real and fake trinkets in AB+
elseif EID.Config["ItemReminderShowHiddenInfo"] and EID.isRepentance and heldTrinket == 75 then
blacklist["5.350.75"] = true
-- Don't display Mysterious Paper's 1-frame temporary trinket granting
local hasPaper = player:HasTrinket(21)
for i = 1, TrinketType.NUM_TRINKETS - 1 do
local tempTrinketFound = player:HasTrinket(i, true) ~= player:HasTrinket(i, false)
if tempTrinketFound and (not mysteriousPaperBlacklist[i] or not hasPaper) then
addObjectDesc(5, 350, i, "{{Trinket75}}")
end
end
-- Modeling Clay
elseif heldTrinket == 166 then
local modelingClayItem = player:GetModelingClayEffect()
if modelingClayItem > 0 then
addObjectDesc(5, 100, modelingClayItem, "{{Trinket166}}")
blacklist["5.350.166"] = true
else
addObjectDesc(5, 350, heldTrinketTrue) -- currently no effect applied
end
else
addObjectDesc(5, 350, heldTrinketTrue)
-- Don't display Mysterious Paper's 1-frame temporary trinket granting
local hasPaper = player:HasTrinket(21)
-- Mysterious Paper does not play well with displaying Error 404's effect
local mysteriousPaperBlacklist = { [23] = true, [48] = true }
for i = 1, TrinketType.NUM_TRINKETS - 1 do
local tempTrinketFound = player:HasTrinket(i, true) ~= player:HasTrinket(i, false)
if tempTrinketFound and (not mysteriousPaperBlacklist[i] or not hasPaper) then
local demoDescObj = EID:getDescriptionObj(5, 350, i)
EID:ItemReminderAddResultHeaderSuffix(descObj, demoDescObj.Name)
descObj.Icon = demoDescObj.Icon
descObj.Description = demoDescObj.Description
end
end
end
-- Gulped/unslotted Modeling Clay
-- (Hidden information, because Modeling Clay does not visually show its item when gulped)
if EID.isRepentance and EID.Config["ItemReminderShowHiddenInfo"] and not blacklist["5.350.166"] and player:GetModelingClayEffect() > 0 then
},
["5.350.166"] = { -- Modeling Clay
isRepentance = true,
modifierFunction = function(descObj, player)
local modelingClayItem = player:GetModelingClayEffect()
if modelingClayItem > 0 then
addObjectDesc(5, 100, modelingClayItem, "{{Trinket166}}")
blacklist["5.350.166"] = true
local demoDescObj = EID:getDescriptionObj(5, 100, modelingClayItem)
EID:ItemReminderAddResultHeaderSuffix(descObj, demoDescObj.Name)
descObj.Icon = "{{Collectible" .. modelingClayItem .. "}}"
descObj.Description = demoDescObj.Description
end
end
},
}
-- Simple function to help with adding properly formatted sections to the reminder description
function EID:ItemReminderAddTempDescriptionEntry(icon, title, newDesc)
table.insert(EID.ItemReminderTempDescriptions, { icon or "{{Blank}}", title, newDesc })
end
-- Adds a formatted "Result" text to the item name
function EID:ItemReminderAddResultHeaderSuffix(descObj, newName)
if newName then
local iconString = EID:GetIconStringByDescriptionObject(descObj)
descObj.Name = newName ..
" (" .. iconString .. " " .. descObj.Name .. EID:getDescriptionEntry("ItemReminder", "ResultHeader") .. ")"
else
descObj.Name = descObj.Name .. EID:getDescriptionEntry("ItemReminder", "ResultHeader")
end
end
-- Add item description for a given entity to the reminder. Also tries to apply special modifiers if present
function EID:ItemReminderAddDescription(player, entityType, variant, subType, extraIcon)
local objectID = entityType .. "." .. variant .. "." .. subType
if currentBlacklist[objectID] then return end
local descObj = EID:getDescriptionObj(entityType, variant, subType)
local specialDesc = EID.ItemReminderDescriptionModifier[objectID]
if specialDesc and type(specialDesc.modifierFunction) == "function" then
-- dont add, if description modifier is a cheat and cheats are disabled
local evalShowCheat = not (specialDesc.isCheat and not EID.Config["ItemReminderShowRNGCheats"])
local evalShowHidden = not (specialDesc.isHidden and not EID.Config["ItemReminderShowHiddenInfo"])
if evalShowCheat or evalShowHidden then
specialDesc.modifierFunction(descObj, player)
end
end
-- Zodiac's effect for the current floor
if EID.Config["ItemReminderShowHiddenInfo"] and player:HasCollectible(CollectibleType.COLLECTIBLE_ZODIAC) then
local zodiacItem = player:GetZodiacEffect()
if zodiacItem > 0 then
addObjectDesc(5, 100, zodiacItem, "{{Collectible392}}")
blacklist["5.100.392"] = true
currentBlacklist[objectID] = true
local iconString = extraIcon or EID:GetIconStringByDescriptionObject(descObj)
EID:ItemReminderAddTempDescriptionEntry(iconString, descObj.Name, descObj.Description)
end
-- Recently Acquired Item Descriptions
function EID:ItemReminderHandleRecentItems(player)
if EID.Config["ItemReminderShowRecentItem"] > 0 then
local printedItems = 0
local playerNum = EID:getPlayerID(player)
if EID.RecentlyTouchedItems[playerNum] then
for i = #EID.RecentlyTouchedItems[playerNum], 1, -1 do
if printedItems >= EID.Config["ItemReminderShowRecentItem"] then break end
printedItems = printedItems + 1
local recentID = EID.RecentlyTouchedItems[playerNum][i] % GLITCH_ITEM_FLAG
EID:ItemReminderAddDescription(player, 5, 100, recentID)
end
end
end
end
-- Active Item Descriptions
function EID:ItemReminderHandleActiveItems(player)
-- limit number of active item descriptions to 2, since Slot 3 and 4 are handled seperately
for i = 0, math.min(EID.Config["ItemReminderShowActiveDesc"], 2) - 1 do
-- the modulo is to convert negative IDs (glitched items) to positive IDs
local heldActive = player:GetActiveItem(i) % GLITCH_ITEM_FLAG
if heldActive > 0 then
EID:ItemReminderAddDescription(player, 5, 100, heldActive)
end
end
end
-- pocket active
function EID:ItemReminderHandlePocketActive(player)
if not EID.isRepentance then return end
local pocketActive = player:GetActiveItem(2) or 0
if pocketActive > 0 then
EID:ItemReminderAddDescription(player, 5, 100, pocketActive)
end
end
-- dice bag
function EID:ItemReminderHandleDiceBag(player)
if not EID.isRepentance then return end
local diceBag = player:GetActiveItem(3) or 0
if diceBag > 0 then
EID:ItemReminderAddDescription(player, 5, 100, diceBag, "{{Trinket154}}")
end
end
-- Pocket Item Descriptions
function EID:ItemReminderHandlePocketItems(player)
for i = 0, EID.Config["ItemReminderShowPocketDesc"] - 1 do
local heldCard = player:GetCard(i)
local heldPill = player:GetPill(i)
if heldCard > 0 then
EID:ItemReminderAddDescription(player, 5, 300, heldCard)
elseif heldPill > 0 then
-- Check if our held pill is identified
EID.pillPlayer = player
local identified = game:GetItemPool():IsPillIdentified(heldPill)
if EID.isRepentance and heldPill % PillColor.PILL_GIANT_FLAG == PillColor.PILL_GOLD then identified = true end
if (identified or EID.Config["ShowUnidentifiedPillDescriptions"]) then
EID:ItemReminderAddDescription(player, 5, 70, heldPill)
end
EID.pillPlayer = nil
end
end
end
-- Trinket Descriptions
function EID:ItemReminderHandleTrinkets(player)
for t = 0, EID.Config["ItemReminderShowTrinketDesc"] - 1 do
-- account for Golden Trinket IDs
local heldTrinketTrue = player:GetTrinket(t)
local heldTrinket = heldTrinketTrue
if EID.isRepentance then heldTrinket = heldTrinketTrue & TrinketType.TRINKET_ID_MASK end
if heldTrinket > 0 then
EID:ItemReminderAddDescription(player, 5, 350, heldTrinketTrue)
end
end
end
-- Gulped/unslotted Modeling Clay
-- (Hidden information, because Modeling Clay does not visually show its item when gulped)
function EID:ItemReminderHandleGulpedModelingClay(player)
if EID.isRepentance and EID.Config["ItemReminderShowHiddenInfo"] and player:GetModelingClayEffect() > 0 then
EID:ItemReminderAddDescription(player, 5, 350, 166)
end
end
-- Tainted ??? Poop Descriptions
function EID:ItemReminderHandlePoopSpells(player)
if EID.isRepentance and EID.Config["ItemReminderShowPoopDesc"] > 0 and player:GetPlayerType() == 25 then
local poopInfo = EID:getDescriptionEntry("poopSpells")
for i = 0, EID.Config["ItemReminderShowPoopDesc"] - 1 do
local nextPoop = player:GetPoopSpell(i)
EID:ItemReminderAddTempDescriptionEntry("{{PoopSpell" .. nextPoop .. "}}", poopInfo[nextPoop][1],
poopInfo[nextPoop][2])
end
end
end
-- Handle scroll inputs
function EID:ItemReminderHandleInputs()
if EID.Config["ItemReminderEnabled"] and EID.holdTabCounter >= 30 and EID.TabDescThisFrame == false and EID.holdTabPlayer ~= nil then
if EID.Config["ItemReminderDisableInputs"] then EID.holdTabPlayer.ControlsCooldown = 2 end
if Input.IsActionTriggered(EID.Config["ItemReminderNavigateLeftButton"], EID.holdTabPlayer.ControllerIndex) and Isaac.GetTime() - lastInputTime > 50 then
EID.ItemReminderSelectedCategory = (EID.ItemReminderSelectedCategory - 1) % #EID.ItemReminderCategories
if not EID.Config["ItemReminderShowOverview"] and EID.ItemReminderSelectedCategory == 0 then
EID.ItemReminderSelectedCategory = #EID.ItemReminderCategories
end
EID.ForceRefreshCache = true
lastInputTime = Isaac.GetTime()
lastScrollDirection = -1
elseif Input.IsActionTriggered(EID.Config["ItemReminderNavigateRightButton"], EID.holdTabPlayer.ControllerIndex) and Isaac.GetTime() - lastInputTime > 50 then
EID.ItemReminderSelectedCategory = (EID.ItemReminderSelectedCategory + 1) % #EID.ItemReminderCategories
if not EID.Config["ItemReminderShowOverview"] and EID.ItemReminderSelectedCategory == 0 then EID.ItemReminderSelectedCategory = 1 end
EID.ForceRefreshCache = true
lastInputTime = Isaac.GetTime()
lastScrollDirection = 1
end
end
end
function EID:ItemReminderGetTitle()
local category = EID.ItemReminderCategories[EID.ItemReminderSelectedCategory + 1]
local translatedTitle = EID:getDescriptionEntry("ItemReminder", "CategoryNames")
local translatedTitleEnglish = EID:getDescriptionEntryEnglish("ItemReminder", "CategoryNames")
local title = translatedTitle and translatedTitle[category.id] or
translatedTitleEnglish and translatedTitleEnglish[category.id] or category.id
return "{{ButtonDLeft}}{{ColorText}} " .. title .. " {{CR}}{{ButtonDRight}}"
end
function EID:ItemReminderGetDescription(player, checkingTwin)
EID.InsideItemReminder = true
EID.ItemReminderTempDescriptions = {}
-- empty blacklist and fill with default values
currentBlacklist = {}
for key, _ in pairs(EID.ItemReminderBlacklist) do currentBlacklist[key] = true end
if EID.Config["ItemReminderShowOverview"] and EID.ItemReminderSelectedCategory == 0 then
-- execute all functions defined per category
for _, category in ipairs(EID.ItemReminderCategories) do
for _, func in ipairs(category.entryGenerators) do
func(player)
end
end
else
local category = EID.ItemReminderCategories[EID.ItemReminderSelectedCategory + 1]
for _, func in ipairs(category.entryGenerators) do
func(player)
end
end
-- Skip category if nothing is in it
if #EID.ItemReminderTempDescriptions == 0 and EID.ItemReminderSelectedCategory <= #EID.ItemReminderCategories then
EID.ItemReminderSelectedCategory = (EID.ItemReminderSelectedCategory + lastScrollDirection) %
#EID.ItemReminderCategories
if not EID.Config["ItemReminderShowOverview"] and EID.ItemReminderSelectedCategory == 0 then
EID.ItemReminderSelectedCategory = lastScrollDirection % #EID.ItemReminderCategories
end
return EID:ItemReminderGetDescription(player, checkingTwin)
end
-- put descriptions into one long description
local finalHoldMapDesc = ""
for _, entry in ipairs(EID.ItemReminderTempDescriptions) do
finalHoldMapDesc = finalHoldMapDesc .. entry[1] .. " {{ColorEIDObjName}}" .. entry[2] .. "#" .. entry[3] .. "#"
end
-- Finally, check the twin player of this controller
-- If both twins have a desc, show their player icon / name to separate the two descs
if EID.isRepentance and not checkingTwin then
local twin = player:GetOtherTwin()
local mainTwinDesc = holdMapDesc
local mainTwinDesc = finalHoldMapDesc
local otherTwinDesc = ""
if twin then otherTwinDesc = EID:getHoldMapDescription(twin, true) end
if twin then otherTwinDesc = EID:ItemReminderGetDescription(twin, true) end
if otherTwinDesc ~= "" then
-- Only the other twin had a desc
if mainTwinDesc == "" then holdMapDesc = otherTwinDesc
if mainTwinDesc == "" then
finalHoldMapDesc = otherTwinDesc
else
-- Both twins had a desc; merge them with player icon headers
holdMapDesc = (EID:getIcon("Player"..player:GetPlayerType()) ~= EID.InlineIcons["ERROR"] and "{{Player"..player:GetPlayerType().."}}" or "{{CustomTransformation}}") .. " {{ColorGray}}" .. player:GetName() .. "#" .. mainTwinDesc .. "#"
holdMapDesc = holdMapDesc .. (EID:getIcon("Player"..twin:GetPlayerType()) ~= EID.InlineIcons["ERROR"] and "{{Player"..twin:GetPlayerType().."}}" or "{{CustomTransformation}}") .. " {{ColorGray}}" .. twin:GetName() .. "#" .. otherTwinDesc
finalHoldMapDesc = (EID:getIcon("Player" .. player:GetPlayerType()) ~= EID.InlineIcons["ERROR"] and "{{Player" .. player:GetPlayerType() .. "}}" or "{{CustomTransformation}}") ..
" {{ColorGray}}" .. player:GetName() .. "#" .. mainTwinDesc .. "#"
finalHoldMapDesc = finalHoldMapDesc ..
(EID:getIcon("Player" .. twin:GetPlayerType()) ~= EID.InlineIcons["ERROR"] and "{{Player" .. twin:GetPlayerType() .. "}}" or "{{CustomTransformation}}") ..
" {{ColorGray}}" .. twin:GetName() .. "#" .. otherTwinDesc
end
else
-- Only the main twin had a desc
holdMapDesc = mainTwinDesc
finalHoldMapDesc = mainTwinDesc
end
end
finalHoldMapDesc = "{{Blank}}#" .. finalHoldMapDesc
EID.InsideItemReminder = false
return holdMapDesc
return finalHoldMapDesc
end
+17 -4
View File
@@ -574,14 +574,29 @@ if MCMLoaded then
---------------------------------------------------------------------------
------------------------------Item Reminder--------------------------------
EID:AddBooleanSetting("Reminder", "ItemReminderEnabled", "Item Reminder Description", {displayingTab = "",offText = "Disabled", onText = "Enabled", infoText = "Hold Map to show your active item's effect, recently picked up items, and much more"})
EID:AddBooleanSetting("Reminder", "ItemReminderEnabled", "Item Reminder", {displayingTab = "",offText = "Disabled", onText = "Enabled", infoText = "Hold Map to show your active item's effect, recently picked up items, and much more"})
local itemSlotReminders = { [0] = "No", "Yes (max 1)", "Yes (max 2)", "Yes (max 3)", "Yes (max 4)", "Yes (max 5)", "Yes (max 6)", "Yes (max 7)", "Yes (max 8)" }
MCM.AddSpace("EID", "Reminder")
MCM.AddText("EID", "Reminder", "Options")
EID:AddBooleanSetting("Reminder", "ItemReminderShowOverview", "Show Overview Category", { infoText = "Show category with an overview of items in your inventory"})
EID:AddBooleanSetting("Reminder", "ItemReminderDisableInputs", "Disable Player Inputs", { infoText = "Prevents the player from doing inputs when item reminder is visible"})
EID:AddBooleanSetting("Reminder", "ItemReminderShowHiddenInfo", "Show Hidden Information", { infoText = "Items like Error (404) or Rainbow Worm can have their current granted item revealed in the Item Reminder"})
EID:AddBooleanSetting("Reminder", "ItemReminderShowRNGCheats", "Show RNG Predictions", { infoText = "Some items can have their next random result predicted and shown in the Item Reminder"})
MCM.AddSpace("EID", "Reminder")
MCM.AddText("EID", "Reminder", "Controls")
local actionToName = { [0] = "Move Left", "Move Right", "Move Up", "Move Down", "Shoot Left", "Shoot Right", "Shoot Up", "Shoot Down", "Bomb", "Item", "Pill/Card", "Drop", "Pause", "Map" }
EID:AddNumberSetting("Reminder", "BagOfCraftingToggleKey", "Hold to Show", 8, 13, {displayTable = actionToName,
infoText = {"Hold this key to display the Item Reminder description, show Flip/Spindown previews and control the Bag of Crafting recipe list"}})
local itemSlotReminders = { [0] = "No", "Yes (max 1)", "Yes (max 2)", "Yes (max 3)", "Yes (max 4)", "Yes (max 5)", "Yes (max 6)", "Yes (max 7)", "Yes (max 8)" }
EID:AddNumberSetting("Reminder", "ItemReminderNavigateLeftButton", "Navigate Left", 0, 13, {displayTable = actionToName,
infoText = {"Keybinding that is used to scroll thru the categories in the left direction"}})
EID:AddNumberSetting("Reminder", "ItemReminderNavigateRightButton", "Navigate Right", 0, 13, {displayTable = actionToName,
infoText = {"Keybinding that is used to scroll thru the categories in the left direction"}})
MCM.AddSpace("EID", "Reminder")
MCM.AddText("EID", "Reminder", "Item Descriptions")
@@ -593,8 +608,6 @@ if MCMLoaded then
EID:AddNumberSetting("Reminder", "ItemReminderShowPoopDesc", "Poop Spells", 0, 6, { repOnly = true, displayTable = itemSlotReminders, infoText = "Show Tainted ???'s next Poop Spell descriptions in the Item Reminder"})
EID:AddBooleanSetting("Reminder", "ItemReminderShowHiddenInfo", "Show Hidden Information", { infoText = "Items like Error (404) or Rainbow Worm can have their current granted item revealed in the Item Reminder"})
EID:AddBooleanSetting("Reminder", "ItemReminderShowRNGCheats", "Show RNG Predictions", { infoText = "Some items can have their next random result predicted and shown in the Item Reminder"})
+6 -3
View File
@@ -1316,6 +1316,8 @@ function EID:OnRender()
end
end
EID:ItemReminderHandleInputs()
if EID.ForceRefreshCache then
EID:ResetDescCache()
end
@@ -1574,11 +1576,12 @@ function EID:OnRender()
-- handle showing the Hold Map Helper description
if EID.Config["ItemReminderEnabled"] and EID.holdTabCounter >= 30 and EID.TabDescThisFrame == false and EID.holdTabPlayer ~= nil then
EID:ItemReminderHandleInputs()
local demoDescObj = EID:getDescriptionObj(-999, -1, 1)
demoDescObj.Name = EID:getDescriptionEntry("HoldMapTitle")
demoDescObj.PermanentTextEnglish = EID:getDescriptionEntryEnglish("HoldMapTitle")
demoDescObj.PermanentTextEnglish = EID:getDescriptionEntryEnglish("ItemReminder", "Title")
-- check for scrolling being enabled here and append scroll controls to the title?
demoDescObj.Description = EID:getHoldMapDescription(EID.holdTabPlayer)
demoDescObj.Description = EID:ItemReminderGetDescription(EID.holdTabPlayer)
demoDescObj.Name = EID:ItemReminderGetTitle()
if (demoDescObj.Description ~= "") then EID:addDescriptionToPrint(demoDescObj, 1) end
end