Merge pull request #479 from Buurazu/master

Teleport/Metronome prediction + Sanguine improvement
This commit is contained in:
Buurazu authored and GitHub committed 2022-06-16 15:15:13 -04:00
commit 7da3ded473
12 files changed
+208 -58

No files matched your search

+8 -4
View File
@@ -873,7 +873,8 @@ EID.descriptions[languageCode].transformations={
---------- MISC ----------
EID.descriptions[languageCode].VoidText = "If absorbed, gain:"
EID.descriptions[languageCode].VoidNames = {"Speed up", "Tears up", "Damage up", "Range up", "Shot Speed up", "Luck up"}
-- {1} will become the number text (like "{1} Tears up" -> "+0.5 Tears up")
EID.descriptions[languageCode].VoidNames = {"{1} Speed up", "{1} Tears up", "{1} Damage up", "{1} Range up", "{1} Shot Speed up", "{1} Luck up"}
EID.descriptions[languageCode].CollectionPageInfo = "This item needs to be picked up for the collection page!"
@@ -885,6 +886,9 @@ EID.descriptions[languageCode].MCM = {
-- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " Result"
-- includes Planetarium even though it's unused in AB+ for convenience
EID.descriptions[languageCode].Teleport2RoomNames = { "Normal Room","Boss Room","Super Secret Room","Shop","Treasure Room","Sacrifice Room","Dice Room","Library","Curse Room","Miniboss Room","Challenge/Boss Challenge Room","Isaac's Room","Barren Room","Arcade Room","Chest Room","Planetarium","Secret Room","Special Red Room","Angel/Devil Room","I AM ERROR Room" }
EID.descriptions[languageCode].Teleport2GreedRoomNames = { "Main Room", "Boss Room", "Shop", "Silver/Gold Treasure Room", "Curse Room", "Exit Room", "Super Secret Room", "Angel/Devil Room", "I AM ERROR Room" }
-- https://wofsauge.github.io/IsaacDocs/rep/enums/RoomType.html
-- Includes Repentance room types for localization convenience
EID.descriptions[languageCode].RoomTypeNames = { "Normal Room", "Shop", "I AM ERROR Room", "Treasure Room", "Boss Room", "Miniboss Room", "Secret Room", "Super Secret Room", "Arcade Room", "Curse Room", "Challenge Room", "Library", "Sacrifice Room", "Devil Room", "Angel Room", "Crawlspace Room", "Boss Rush Room", "Isaac's Room", "Barren Room", "Chest Room", "Dice Room", "Black Market", "Exit Room", "Planetarium", "Teleporter Entrance", "Teleporter Exit", "Alt Path Trapdoor", "Blue Key Room", "Ultra Secret Room",
-- Not technically room types but still potentially useful to have localized
[666] = "Angel/Devil Room", [1024] = "Red Room", [1025] = "Special Red Room" }
+3 -3
View File
@@ -35,7 +35,7 @@ local repCollectibles={
[52] = {"52", "Dr. Fetus", "{{Bomb}} Bomb tears#{{Damage}} Each bomb deals 10x your damage#If that results in over 60 damage, it instead deals 5x your damage + 30#↓ {{Tears}} -60% Fire Rate down"}, --Dr. Fetus
[53] = {"53", "Magneto", "Magnetic attraction for pickups#Opens chests remotely, ignoring damage of spike chests"}, -- Magneto
[55] = {"55", "Mom's Eye", "50% chance to shoot a tear backwards#{{Luck}} 100% chance at 5 Luck"}, -- Mom's Eye
[59] = {"59", "The Book of Belial", "<Item not obtainable>"}, -- The Book of Belial (Judas's Birthright Version)
[59] = {"59", "The Book of Belial", "↑ {{Damage}} +2 Damage up#{{Collectible7}} +50% Damage if you have Blood of the Martyr#{{AngelDevilChance}} +12.5% Devil/Angel Room chance while held"}, -- The Book of Belial (Judas's Birthright Version)
[62] = {"62", "Charm of the Vampire", "↑ {{Damage}} +0.3 Damage up#{{HalfHeart}} Heals half a heart for every 13 enemies killed"}, -- Charm of the Vampire
[64] = {"64", "Steam Sale", "{{Shop}} -50% discount on Shop items#Getting this item multiple times reduces the price further"}, -- Steam Sale
[67] = {"67", "Sister Maggy", "Normal tear familiar#Deals 6 damage per tear"}, -- Sister Maggy
@@ -326,7 +326,7 @@ local repCollectibles={
[653] = {"653", "Vade Retro", "While held, non-ghost enemies spawn small red ghosts on death#On use, causes the ghosts to explode"}, -- Vade Retro
[654] = {"654", "False PHD", "{{BlackHeart}} +1 Black Heart#{{Pill}} Identifies all pills#Converts good pills into bad pills#↑ {{Damage}} Stat down pills also grant Damage up#{{BlackHeart}} Other bad pills drop Black Hearts on use"}, -- False PHD
[655] = {"655", "Spin to Win", "Adds spinning top orbital that blocks enemy shots#Deals 10.5 contact damage per second#When used, {{Speed}} ↑ +0.5 speed and greatly increases the rotation speed of orbitals"}, -- Spin to Win
[656] = {"656", "Damocles", "<Item not obtainable>"}, -- Damocles
[656] = {"656", "Damocles", "Spawns a sword above your head, which doubles all item pedestals#Does not double Shop, Chest, or Devil deal items#!!! Kills you at a random time after taking damage from an enemy"}, -- Damocles
[657] = {"657", "Vasculitis", "Enemies explode into tears upon death, which inherit the effects of Isaac's tears"}, -- Vasculitis
[658] = {"658", "Giant Cell", "Spawn Minisaacs when taking damage#They chase and shoot at nearby enemies"}, -- Giant Cell
[659] = {"659", "Tropicamide", "↑ {{Range}} +1.5 Range up#↑ {{Tearsize}} Tear Size up"}, -- Tropicamide
@@ -1066,7 +1066,7 @@ EID.descriptions[languageCode].poopSpells = {
EID.descriptions[languageCode].VoidShopText = "If absorbed right after pickup, gain:"
EID.descriptions[languageCode].VoidOptionText = " will be absorbed instead"
EID.descriptions[languageCode].VoidNames = {"Speed up", "Fire Rate up", "Damage up", "Range up", "Shot Speed up", "Luck up"}
EID.descriptions[languageCode].VoidNames[2] = "{1} Fire Rate up"
EID.descriptions[languageCode].spindownError = "Item disappears"
+5 -4
View File
@@ -1711,10 +1711,11 @@ function EID:AddIconToObject(eType, eVariant, eSubType, iconName)
end
-- reimplementation of RNG Seed shift feature used by the game. Mostly used for RNG Prediction features
-- Default RNG shift values for many things are 5, 9, 7
function EID:RNGNext(rngNum, shift1, shift2, shift3)
rngNum = rngNum ~ ((rngNum >> shift1) & 4294967295)
rngNum = rngNum ~ ((rngNum << shift2) & 4294967295)
rngNum = rngNum ~ ((rngNum >> shift3) & 4294967295)
rngNum = rngNum ~ ((rngNum >> (shift1 or 5)) & 4294967295)
rngNum = rngNum ~ ((rngNum << (shift2 or 9)) & 4294967295)
rngNum = rngNum ~ ((rngNum >> (shift3 or 7)) & 4294967295)
return rngNum >> 0;
end
@@ -1722,4 +1723,4 @@ end
function EID:SeedToFloat(seed)
local multi = 2.3283061589829401E-10;
return seed * multi;
end
end
+4 -1
View File
@@ -217,6 +217,7 @@ local recheckPickups = false
local customRNGSeed = 0x77777770
local customRNGShift = {0,0,0}
-- Use local RNG functions to possibly reduce processing time a little bit
local function RNGNext()
local num = customRNGSeed
num = num ~ ((num >> customRNGShift[1]) & 4294967295)
@@ -542,7 +543,9 @@ local function GameStartCrafting()
for i=1,EID.XMLMaxItemID do itemPool:AddRoomBlacklist(i) end
local collID = itemPool:GetCollectible(poolNum, false, 1, 25)
while collID ~= 25 and collID > 0 do
local attempts = CraftingMaxItemID
while collID ~= 25 and collID ~= 642 and collID > 0 and attempts > 0 do
attempts = attempts - 1
table.insert(CraftingItemPools[poolNum+1], {collID, 1.0})
itemPool:AddRoomBlacklist(collID)
collID = itemPool:GetCollectible(poolNum, false, 1, 25)
+16 -3
View File
@@ -264,6 +264,17 @@ EID.UserConfig = {
-- Default = true
["DisplaySacrificeInfo"] = true,
---------- Sanguine Bond ----------
-- Toggle display of Sanguine Bond's list of possible payouts in Devil Rooms
-- REPENTANCE ONLY!
-- Default = true
["DisplaySanguineInfo"] = true,
-- Highlight what Sanguine Bond's next payout will be
-- REPENTANCE ONLY!
-- Default = false
["PredictionSanguineBond"] = false,
---------- Dice Room ----------
-- Toggle display of Dice Room descriptions
@@ -309,9 +320,9 @@ EID.UserConfig = {
-- Items that grant you items without saying what they are (like Zodiac, Liberty Cap) can have their current granted item revealed in the Item Reminder
-- Default = false
["ItemReminderShowHiddenInfo"] = false,
-- Some items (like Sanguine Bond) can have their next result predicted and shown in the Item Reminder
-- Some items (like Teleport!) can have their next result predicted and shown in the Item Reminder
-- Default = false
["PredictionSanguineBond"] = false,
["ItemReminderShowRNGCheats"] = false,
---------- Bag of Crafting ------------
@@ -513,6 +524,8 @@ EID.DefaultConfig = {
["ShowUnidentifiedPillDescriptions"] = false,
["DisplayGlitchedItemInfo"] = debug and true or false,
["DisplaySacrificeInfo"] = true,
["DisplaySanguineInfo"] = true,
["PredictionSanguineBond"] = false,
["DisplayDiceInfo"] = true,
["DisplayBagOfCrafting"] = "always",
["DisplayCraneInfo"] = true,
@@ -538,7 +551,7 @@ EID.DefaultConfig = {
["ItemReminderShowTrinketDesc"] = 2,
["ItemReminderShowPoopDesc"] = 1,
["ItemReminderShowHiddenInfo"] = false,
["PredictionSanguineBond"] = false,
["ItemReminderShowRNGCheats"] = false,
["SpindownDiceResults"] = 3,
["SpindownDiceDisplayID"] = false,
+10
View File
@@ -133,6 +133,12 @@ EID.InlineIcons = {
["ArrowDown"] = {"ArrowDown", 0, 10, 9, 1},
["Warning"] = {"Warning", 0, 10, 9, 3},
["Blank"] = {"Blank", 0, 0, 0},
["ArrowGrayUp"] = {"ArrowGray", 0, 10, 9, 1},
["ArrowGrayRight"] = {"ArrowGray", 1, 10, 9, 1},
["ArrowGrayDown"] = {"ArrowGray", 2, 10, 9, 1},
["ArrowGrayLeft"] = {"ArrowGray", 3, 10, 9, 1},
["IconGreenTint"] = function(_)
EID._NextIconModifier = function(sprite)
sprite.Color = Color(1, 1, 1, EID.Config["Transparency"] * 0.5, 0, 0.5, 0)
@@ -803,3 +809,7 @@ EID.TransformationData = {
[tostring(EID.TRANSFORMATION.SUPERBUM)] = {},
[tostring(EID.TRANSFORMATION.STOMPY)] = {VanillaForm = REPENTANCE and PlayerForm.PLAYERFORM_STOMPY}
}
EID.RoomShapeToMarkup = { "{{Room}}", "{{RoomSmallHorizontal}}", "{{RoomSmallVertical}}", "{{RoomLongVertical}}", "{{RoomLongThinVertical}}","{{RoomLongHorizontal}}", "{{RoomLongThinHorizontal}}", "{{RoomXL}}", "{{RoomLTopLeft}}", "{{RoomL}}", "{{RoomLBottomLeft}}", "{{RoomLBottomRight}}" }
EID.RoomTypeToMarkup = { "{{Room}}", "{{Shop}}", "{{ErrorRoom}}", "{{TreasureRoom}}", "{{BossRoom}}", "{{MiniBoss}}", "{{SecretRoom}}", "{{SuperSecretRoom}}", "{{ArcadeRoom}}", "{{CursedRoom}}", "{{ChallengeRoom}}", "{{Library}}", "{{SacrificeRoom}}", "{{DevilRoom}}", "{{AngelRoom}}", "{{LadderRoom}}", "{{Room}}" --[[boss rush]], "{{IsaacsRoom}}", "{{BarrenRoom}}", "{{ChestRoom}}", "{{DiceRoom}}", "{{Shop}}", "{{Room}}", --[[Black Market / Greed Exit]] "{{Planetarium}}", "{{Teleporter}}","{{Teleporter}}", "{{Room}}", "{{Room}}" --[[Blue Key rooms]], "{{UltraSecretRoom}}" }
+113 -29
View File
@@ -3,6 +3,7 @@ local level
local currentRoom
local blacklist
local holdMapDesc
local currentPlayer
-- Rainbow Worm's trinket IDs it grants, in order
local rainbowWormEffects = { [0] = 9, 11, 65, 27, 10, 12, 26, 66, 96, 144 }
@@ -29,23 +30,96 @@ local function addObjectDesc(type, variant, subtype, extraIcon)
end
end
-- General RNG functions for RNG predicting
local function RNGNext(num, shift1, shift2, shift3)
num = num ~ ((num >> shift1) & 4294967295)
num = num ~ ((num << shift2) & 4294967295)
num = num ~ ((num >> shift3) & 4294967295)
return num >> 0;
-- Banned items: Metronome, Plan C, Glowing Hour Glass, Breath of Life, Clicker, R Key
-- Reduced chance: Death Certificate (15%), Genesis (25%)
-- I saw something in the code about rerolling Forget Me Now but not sure what the criteria was
local metronomeBlacklist = {[488] = 1, [475] = 1, [422] = 1} --AB+ can choose Clicker lol rip
if REPENTANCE then metronomeBlacklist = {[488] = 1, [475] = 1, [422] = 1, [326] = 1, [482] = 1, [636] = 1, [628] = 0.85, [622] = 0.75 } end
-- Should we account for Car Battery? (Both if we have it, and if it grants it which immediately uses it again)
function EID:MetronomePrediction()
local itemConfig = Isaac.GetItemConfig()
local numCollectibles = EID:GetMaxCollectibleID()
local metronomeRNG = currentPlayer:GetCollectibleRNG(CollectibleType.COLLECTIBLE_METRONOME):GetSeed()
local rerollChance = 0
if REPENTANCE then
metronomeRNG = EID:RNGNext(metronomeRNG)
rerollChance = metronomeRNG
end
local attempts = 15
while attempts > 0 do
attempts = attempts - 1
metronomeRNG = EID:RNGNext(metronomeRNG)
local sel = metronomeRNG % numCollectibles + 1
if itemConfig:GetCollectible(sel) ~= nil then
if metronomeBlacklist[sel] then
-- A few items have a reroll chance in Repentance
if metronomeBlacklist[sel] < 1 then
rerollChance = EID:RNGNext(rerollChance, 0x02, 0x0F, 0x11)
local rerollFloat = EID:SeedToFloat(rerollChance)
if rerollFloat < 1 - metronomeBlacklist[sel] then
-- We succeeded the reroll chance
return "{{Collectible" .. sel .. "}} {{ColorGray}}" .. EID:getObjectName(5,100,sel) .. "#" .. EID:getDescriptionObj(5,100,sel).Description
end
end
else
return "{{Collectible" .. sel .. "}} {{ColorGray}}" .. EID:getObjectName(5,100,sel) .. "#" .. EID:getDescriptionObj(5,100,sel).Description
end
end
end
-- as the code puts it, [warn] No Collectible found for Metronome!
return "None"
end
local function SeedToFloat(seed)
local multi = 2.3283061589829401E-10;
return seed * multi;
-- Teleport! Destination Prediction --
local function teleport1Prediction()
if REPENTANCE and currentPlayer:GetSprite():GetAnimation() == "TeleportUp" then return end
local level = game:GetLevel()
local currentRoomIndex = level:GetCurrentRoomDesc().SafeGridIndex
local possibleRooms = {}
for i = 0, 168 do
local room = level:GetRoomByIdx(i)
-- Currently, any non-red room on the grid that we aren't in is a valid choice
-- Is there more criteria to look out for?
if room.GridIndex >= 0 and room.SafeGridIndex ~= currentRoomIndex and room.Data.Type ~= 29 and (not REPENTANCE or room.Flags & 1024 ~= 1024) then
table.insert(possibleRooms, i)
end
end
local teleSeed = currentPlayer:GetCollectibleRNG(CollectibleType.COLLECTIBLE_TELEPORT):GetSeed()
teleSeed = EID:RNGNext(teleSeed, 5, 9, 7)
teleSeed = EID:RNGNext(teleSeed, 0x02, 0x0F, 0x19) -- magic disassembled numbers!
local resultRoomIndex = possibleRooms[(teleSeed % #possibleRooms) + 1]
local resultRoom = level:GetRoomByIdx(resultRoomIndex)
local resultSafeIndex = resultRoom.SafeGridIndex
local roomIcon = EID.RoomTypeToMarkup[resultRoom.Data.Type]
if resultRoom.Data.Type == 1 then roomIcon = EID.RoomShapeToMarkup[resultRoom.Data.Shape] end
local roomNames = EID:getDescriptionEntry("RoomTypeNames")
local roomName = roomNames[resultRoom.Data.Type]
-- Find our X/Y difference from the target location, if we're on the map
local d = ""
if currentRoomIndex >= 0 then
local myPos = Vector(currentRoomIndex % 13, math.floor(currentRoomIndex / 13))
local newPos = Vector(resultSafeIndex % 13, math.floor(resultSafeIndex / 13))
local diffX = math.floor(newPos.X - myPos.X)
local diffY = math.floor(newPos.Y - myPos.Y)
if diffY > 0 then d = d .. "{{ArrowGrayDown}} " .. diffY
elseif diffY < 0 then d = d .. "{{ArrowGrayUp}} " .. math.abs(diffY) end
if d ~= "" and diffX ~= 0 then d = d .. "," end
if diffX > 0 then d = d .. "{{ArrowGrayRight}} " .. diffX
elseif diffX < 0 then d = d .. "{{ArrowGrayLeft}} " .. math.abs(diffX) end
end
if d ~= "" then d = "#{{Blank}} " .. d end
append("{{Collectible44}}", EID:getObjectName(5, 100, 44) .. EID:getDescriptionEntry("HoldMapHeader"), roomIcon .. " " .. roomName .. d)
end
-- Teleport 2 Destination Prediction --
local teleport2Order = { 1,5,8,2,4,13,21,12,10,6,11,18,19,9,20,24,7,666,14,3 }
local teleport2GreedOrder = { 1,5,2,4,10,23,8,14,3 }
local teleport2Icons = { "{{Room}}","{{BossRoom}}","{{SuperSecretRoom}}","{{Shop}}","{{TreasureRoom}}","{{SacrificeRoom}}","{{DiceRoom}}","{{Library}}","{{CursedRoom}}","{{MiniBoss}}","{{ChallengeRoom}}","{{IsaacsRoom}}","{{BarrenRoom}}","{{ArcadeRoom}}","{{ChestRoom}}","{{Planetarium}}","{{SecretRoom}}","{{RedRoom}}","{{AngelDevilChance}}","{{ErrorRoom}}" }
local teleport2GreedIcons = { "{{RoomLongVertical}}","{{BossRoom}}","{{Shop}}","{{TreasureRoom}}","{{CursedRoom}}","{{Room}}","{{SuperSecretRoom}}","{{AngelDevilChance}}","{{ErrorRoom}}" }
local teleport2Order = { 1,5,8,2,4,13,21,12,10,6,11,18,19,9,20,24,7,1025,666,3 }
local teleport2GreedOrder = { 1,5,2,4,10,23,8,666,3 }
local teleport2Icons = { [1025] = "{{RedRoom}}", [666] = "{{AngelDevilChance}}" }
local function teleport2Prediction()
local level = game:GetLevel()
@@ -57,21 +131,23 @@ local function teleport2Prediction()
if not room.Clear then
-- Check for Special Red Rooms, which get ordered differently than their non-red version
if REPENTANCE and room.Data.Type ~= 1 and room.Flags & 1024 == 1024 then unclearedTypes[666] = true
if REPENTANCE and room.Data.Type ~= 1 and room.Flags & 1024 == 1024 then unclearedTypes[1025] = true
else unclearedTypes[room.Data.Type] = true end
end
end
--Angel/Devil Room check (it lives off the map)
if not level:GetRoomByIdx(-1).Clear then unclearedTypes[14] = true end
if not level:GetRoomByIdx(-1).Clear then unclearedTypes[666] = true end
local greed = game:IsGreedMode()
local roomOrder = (greed and teleport2GreedOrder) or teleport2Order
local roomIcons = (greed and teleport2GreedIcons) or teleport2Icons
local roomNames = (greed and EID:getDescriptionEntry("Teleport2GreedRoomNames")) or EID:getDescriptionEntry("Teleport2RoomNames")
local roomNames = EID:getDescriptionEntry("RoomTypeNames")
for i,v in ipairs(roomOrder) do
if unclearedTypes[v] then
append("{{Collectible419}}", EID:getObjectName(5, 100, 419) .. EID:getDescriptionEntry("HoldMapHeader"), roomIcons[i] .. " " .. roomNames[i])
local descString = (teleport2Icons[v] or EID.RoomTypeToMarkup[v]) .. " " .. roomNames[v]
-- Tall Vertical Main Greed Room exception, because why not, attention to detail
if v == 1 and greed then descString = "{{RoomLongVertical}} " .. roomNames[v] end
append("{{Collectible419}}", EID:getObjectName(5, 100, 419) .. EID:getDescriptionEntry("HoldMapHeader"), descString)
return
end
end
@@ -81,22 +157,23 @@ end
--order of checking: 15% Pennies, 48% Damage, 58% Hearts, 63% Item, 65% Leviathan, 100% Nothing
local sanguineResults = { { 0.15, 3 }, { 0.48, 2 }, { 0.58, 4 }, { 0.63, 5 }, { 0.65, 6 }, { 1, 1 } }
local function sanguinePrediction()
-- this isn't even used in this file anymore, it's in main, but there isn't really a better place to put it yet
function EID:trimSanguineDesc(descObj)
local currentRoom = game:GetLevel():GetCurrentRoom()
local spikes = currentRoom:GetGridEntity(67)
if not spikes then return end -- don't display anything if we can't find the spikes!
if not spikes then return "" end -- don't display anything if we can't find the spikes!
local cheatResult = nil
if spikes and EID.Config["PredictionSanguineBond"] then
local spikeSeed = currentRoom:GetGridEntity(67):GetRNG():GetSeed()
spikeSeed = RNGNext(spikeSeed, 5, 9, 7)
spikeSeed = RNGNext(spikeSeed, 1, 5, 0x13)
local nextFloat = SeedToFloat(spikeSeed)
spikeSeed = EID:RNGNext(spikeSeed, 5, 9, 7)
spikeSeed = EID:RNGNext(spikeSeed, 0x01, 0x05, 0x13) -- magic disassembled numbers!
local nextFloat = EID:SeedToFloat(spikeSeed)
for _,v in ipairs(sanguineResults) do
if nextFloat < v[1] then cheatResult = v[2] break end
end
end
local descObj = EID:getDescriptionObj(5, 100, 692)
local resultsDesc = ""
local lineCount = 0
@@ -109,8 +186,7 @@ local function sanguinePrediction()
resultsDesc = resultsDesc .. w .. "#"
end
end
append("{{Collectible692}}", descObj.Name, resultsDesc)
return resultsDesc
end
function EID:getHoldMapDescription(player, checkingTwin)
@@ -120,6 +196,7 @@ function EID:getHoldMapDescription(player, checkingTwin)
level = game:GetLevel()
currentRoom = level:GetCurrentRoom()
currentPlayer = player
-- TODO:
-- D1, crooked penny cheats. 404/liberty cap/etc. "what item is it"
@@ -137,9 +214,16 @@ function EID:getHoldMapDescription(player, checkingTwin)
end
end
-- Sanguine Bond Possible Results
if REPENTANCE and player:HasCollectible(CollectibleType.COLLECTIBLE_SANGUINE_BOND) and game:GetRoom():GetType() == RoomType.ROOM_DEVIL then
sanguinePrediction()
-- Metronome result
if player:HasCollectible(CollectibleType.COLLECTIBLE_METRONOME) and EID.Config["ItemReminderShowRNGCheats"] then
blacklist["5.100.488"] = true
append("{{Collectible488}}", EID:getObjectName(5,100,488) .. EID:getDescriptionEntry("HoldMapHeader"), EID:MetronomePrediction())
end
-- Teleport! location
if player:HasCollectible(CollectibleType.COLLECTIBLE_TELEPORT) and EID.Config["ItemReminderShowRNGCheats"] then
blacklist["5.100.44"] = true
teleport1Prediction()
end
-- Teleport 2.0 location
+6 -5
View File
@@ -409,6 +409,8 @@ if MCMLoaded then
EID:AddBooleanSetting("Display", "DisplayDiceInfo", "Dice Room Infos")
EID:AddBooleanSetting("Display", "DisplayCraneInfo", "Crane Game Infos", {repOnly = true})
EID:AddBooleanSetting("Display", "DisplayVoidStatInfo", "Void Stat Increase Infos")
EID:AddBooleanSetting("Display", "DisplaySanguineInfo", "Sanguine Bond Infos", {repOnly = true})
EID:AddBooleanSetting("Display", "PredictionSanguineBond", "Predict Sanguine Bond Result", {repOnly = true, infoText = "The next reward from Sanguine Bond can be predicted and highlighted in the description"})
local diceSteps = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
-- Spindown Dice Settings
@@ -545,20 +547,19 @@ if MCMLoaded then
---------------------------------------------------------------------------
------------------------------Item Reminder--------------------------------
EID:AddBooleanSetting("Reminder", "ItemReminderEnabled", "Item Reminder Description", {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 Description", {displayingTab = "",offText = "Disabled", onText = "Enabled", infoText = "Hold Map to show your active item's effect, recently picked up items, and much more"})
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)" }
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", "Item Descriptions")
-- should these be organized in the order they're shown in the map desc code?
EID:AddNumberSetting("Reminder", "ItemReminderShowRecentItem", "Recent Items", 0, 4, { displayTable = itemSlotReminders, infoText = {"Show recently acquired item descriptions in the Item Reminder (good for Curse of the Blind!)"}})
EID:AddNumberSetting("Reminder", "ItemReminderShowRecentItem", "Recent Items", 0, 8, { displayTable = itemSlotReminders, infoText = {"Show recently acquired item descriptions in the Item Reminder (good for Curse of the Blind!)"}})
EID:AddNumberSetting("Reminder", "ItemReminderShowActiveDesc", "Active Items", 0, 2, { displayTable = itemSlotReminders, infoText = "Show your active item descriptions in the Item Reminder"})
EID:AddNumberSetting("Reminder", "ItemReminderShowPocketDesc", "Pocket Items", 0, 4, { displayTable = itemSlotReminders, infoText = "Show your pocket item (card, pill, active) descriptions in the Item Reminder"})
EID:AddNumberSetting("Reminder", "ItemReminderShowTrinketDesc", "Trinkets", 0, 2, { displayTable = itemSlotReminders, infoText = "Show your trinket descriptions in the Item Reminder"})
@@ -566,7 +567,7 @@ 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", "PredictionSanguineBond", "Highlight Sangine Bond Prediction", { infoText = "Highlights the next payout of Sangine Bond"})
EID:AddBooleanSetting("Reminder", "ItemReminderShowRNGCheats", "Show RNG Predictions", { infoText = "Some items can have their next random result predicted and shown in the Item Reminder"})
+8 -4
View File
@@ -5,6 +5,8 @@ EID.TabPreviewID = 0
EID.inModifierPreview = false
-- The "Hold Map Helper" needs to know if it shouldn't display because we're in a Hold Tab desc
EID.TabDescThisFrame = false
-- ...and likewise we need to know when we're in the Item Reminder (this is getting out of hand)
EID.ReminderThisFrame = false
-- List of collectible IDs for us to check if a player owns them; feel free to add to this in mods that add description modifiers!
EID.collectiblesToCheck = { CollectibleType.COLLECTIBLE_VOID, }
@@ -116,8 +118,6 @@ local function VoidCallback(descObj, isRune)
local voidIntro = ((shopItem or isAltOption) and EID:getDescriptionEntry("VoidShopText")) or EID:getDescriptionEntry("VoidText")
local voidNames = EID:getDescriptionEntry("VoidNames")
-- Replace "Tears" with "Fire Rate"
if REPENTANCE then voidNames[2] = EID:getDescriptionEntry("GlitchedItemText", 1) end
local eidTable = (isRune and EID.BlackRuneStatIncreases) or EID.VoidStatIncreases
local increases = ((isAltOption or not descObj.Entity) and eidTable[3]) or (shopItem and eidTable[2]) or eidTable[1]
@@ -125,7 +125,11 @@ local function VoidCallback(descObj, isRune)
EID:appendToDescription(descObj, "#" .. prefix .. voidIntro .. "#")
for i,v in ipairs(increases) do
if v > 0 then
EID:appendToDescription(descObj, "↑ " .. voidStatIcons[i] .. " +" .. string.format("%.4g",v*voidStatUps[i]) .. " " .. voidNames[i] .. "#")
local statIncreaseStr = "↑ " .. voidStatIcons[i] .. " " .. voidNames[i] .. "#"
local replaceCount = 0
statIncreaseStr, replaceCount = string.gsub(statIncreaseStr, "{1}", "+" .. string.format("%.4g",v*voidStatUps[i]))
if replaceCount == 0 then statIncreaseStr = "↑ " .. voidStatIcons[i] .. " +" .. string.format("%.4g",v*voidStatUps[i]) .. " " .. voidNames[i] .. "#" end
EID:appendToDescription(descObj, statIncreaseStr)
end
end
-- Print unique synergies with Void and Active Items
@@ -318,7 +322,7 @@ if REPENTANCE then
if hasCarBattery then
EID:appendToDescription(descObj, " (Results with {{Collectible356}})")
end
if firstID ~= 0 and EID.TabPreviewID == 0 then
if not EID.ReminderThisFrame and firstID ~= 0 and EID.TabPreviewID == 0 then
EID.TabPreviewID = firstID
EID:appendToDescription(descObj, "#{{Blank}} ".. EID:getDescriptionEntry("FlipItemToggleInfo"))
end
+19 -5
View File
@@ -30,6 +30,7 @@ EID.permanentDisplayTextObj = nil
EID.lastDescriptionEntity = nil
EID.lineHeight = 11
EID.sacrificeCounter = {}
local spikePos = Vector(320, 280)
EID.itemConfig = Isaac.GetItemConfig()
EID.itemUnlockStates = {}
EID.CraneItemType = {}
@@ -1212,6 +1213,7 @@ local function onRender(t)
end
EID.TabPreviewID = 0
EID.TabDescThisFrame = false
EID.ReminderThisFrame = false
-- If MCM is open, don't show anything unless we're in a tab labeled as "Visuals" or "Crafting"
if ModConfigMenu and ModConfigMenu.IsVisible and ModConfigMenu.Config["Mod Config Menu"].HideHudInMenu and EID.MCMCompat_isDisplayingEIDTab ~= "Visuals" and EID.MCMCompat_isDisplayingEIDTab ~= "Crafting" then
@@ -1292,6 +1294,8 @@ local function onRender(t)
playerSearch = EID.players
end
local playerNearSacrificeSpikes = false
-- Check for descriptions to print per player
for i,player in ipairs(playerSearch) do
local displayedDesc = false
@@ -1335,6 +1339,12 @@ local function onRender(t)
end
end
end
-- Test if the player is closer to the center of the room (Sacrifice/Sanguine Spikes) than any other entity
-- If there's more Grid Positions we want to check in the future, this could for example be generalized to a gridPosToCheck table which sets closeToGridPos flags
local spikeDiff = spikePos:__sub(sourcePos)
if EID.lastDist ~= 10000 and spikeDiff:Length() < EID.lastDist then
playerNearSacrificeSpikes = true
end
if EID.Config["DisplayAllNearby"] then
-- make the closest entity the first to get drawn
@@ -1489,20 +1499,24 @@ local function onRender(t)
end
end
-- if no entities to display, display Sacrifice Room information
-- it will be last priority for the main spot if DisplayAllNearby is on
if #EID.descriptionsToPrint == 0 or EID.Config["DisplayAllNearby"] then
-- if no entities to display, or we're close to the spikes, display Sacrifice Room information
-- it will be last priority for the main spot if DisplayAllNearby is on and we aren't near them
if (#EID.descriptionsToPrint == 0 or playerNearSacrificeSpikes) or EID.Config["DisplayAllNearby"] then
if game:GetRoom():GetType() == RoomType.ROOM_SACRIFICE and EID.Config["DisplaySacrificeInfo"] then
local curRoomIndex = game:GetLevel():GetCurrentRoomIndex()
local curCounter = EID.sacrificeCounter[curRoomIndex] or 1
local sacrificeDesc = EID:getDescriptionObj(-999, -1, curCounter)
EID:addDescriptionToPrint(sacrificeDesc)
EID:addDescriptionToPrint(sacrificeDesc, playerNearSacrificeSpikes and 1 or nil)
elseif REPENTANCE and EID.Config["DisplaySanguineInfo"] and game:GetRoom():GetType() == RoomType.ROOM_DEVIL and EID:PlayersHaveCollectible(CollectibleType.COLLECTIBLE_SANGUINE_BOND) then
local sanguineDesc = EID:getDescriptionObj(5, 100, 692, nil, false)
sanguineDesc.Description = EID:trimSanguineDesc(sanguineDesc)
if sanguineDesc.Description ~= "" then EID:addDescriptionToPrint(sanguineDesc, playerNearSacrificeSpikes and 1 or nil) end
end
end
-- handle showing the Hold Map Helper description
if EID.Config["ItemReminderEnabled"] and EID.holdTabCounter >= 30 and EID.TabDescThisFrame == false and EID.holdTabPlayer ~= nil then
--have we done anything that makes AB+ get angry? still need to test AB+!
EID.ReminderThisFrame = true
local demoDescObj = EID:getDescriptionObj(-999, -1, 1)
demoDescObj.Name = ""
demoDescObj.Description = EID:getHoldMapDescription(EID.holdTabPlayer)
+16
View File
@@ -125,6 +125,22 @@
<NullAnimations/>
<Triggers/>
</Animation>
<Animation Name="ArrowGray" FrameNum="4" Loop="false">
<RootAnimation>
<Frame XPosition="0" YPosition="0" XScale="100" YScale="100" Delay="1" Visible="true" RedTint="255" GreenTint="255" BlueTint="255" AlphaTint="255" RedOffset="0" GreenOffset="0" BlueOffset="0" Rotation="0" Interpolated="false"/>
</RootAnimation>
<LayerAnimations>
<LayerAnimation LayerId="0" Visible="true">
<Frame XPosition="0" YPosition="0" XPivot="0" YPivot="0" XCrop="99" YCrop="32" Width="8" Height="11" XScale="100" YScale="100" Delay="1" Visible="true" RedTint="255" GreenTint="255" BlueTint="255" AlphaTint="255" RedOffset="0" GreenOffset="0" BlueOffset="0" Rotation="0" Interpolated="false"/>
<Frame XPosition="0" YPosition="0" XPivot="0" YPivot="0" XCrop="109" YCrop="32" Width="9" Height="11" XScale="100" YScale="100" Delay="1" Visible="true" RedTint="255" GreenTint="255" BlueTint="255" AlphaTint="255" RedOffset="0" GreenOffset="0" BlueOffset="0" Rotation="0" Interpolated="false"/>
<Frame XPosition="0" YPosition="0" XPivot="0" YPivot="0" XCrop="119" YCrop="32" Width="8" Height="11" XScale="100" YScale="100" Delay="1" Visible="true" RedTint="255" GreenTint="255" BlueTint="255" AlphaTint="255" RedOffset="0" GreenOffset="0" BlueOffset="0" Rotation="0" Interpolated="false"/>
<Frame XPosition="0" YPosition="0" XPivot="0" YPivot="0" XCrop="129" YCrop="32" Width="9" Height="11" XScale="100" YScale="100" Delay="1" Visible="true" RedTint="255" GreenTint="255" BlueTint="255" AlphaTint="255" RedOffset="0" GreenOffset="0" BlueOffset="0" Rotation="0" Interpolated="false"/>
</LayerAnimation>
<LayerAnimation LayerId="1" Visible="true"/>
</LayerAnimations>
<NullAnimations/>
<Triggers/>
</Animation>
<Animation Name="pickups" FrameNum="11" Loop="false">
<RootAnimation>
<Frame XPosition="0" YPosition="0" XScale="100" YScale="100" Delay="1" Visible="true" RedTint="255" GreenTint="255" BlueTint="255" AlphaTint="255" RedOffset="0" GreenOffset="0" BlueOffset="0" Rotation="0" Interpolated="false"/>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB