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 ---------- ---------- MISC ----------
EID.descriptions[languageCode].VoidText = "If absorbed, gain:" 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!" 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" -- the Hold Map description will predict the abilities of items with a header like "Item Name Result"
EID.descriptions[languageCode].HoldMapHeader = " 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" } -- https://wofsauge.github.io/IsaacDocs/rep/enums/RoomType.html
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" } -- 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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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].VoidShopText = "If absorbed right after pickup, gain:"
EID.descriptions[languageCode].VoidOptionText = " will be absorbed instead" 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" EID.descriptions[languageCode].spindownError = "Item disappears"
+5 -4
View File
@@ -1711,10 +1711,11 @@ function EID:AddIconToObject(eType, eVariant, eSubType, iconName)
end end
-- reimplementation of RNG Seed shift feature used by the game. Mostly used for RNG Prediction features -- 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) function EID:RNGNext(rngNum, shift1, shift2, shift3)
rngNum = rngNum ~ ((rngNum >> shift1) & 4294967295) rngNum = rngNum ~ ((rngNum >> (shift1 or 5)) & 4294967295)
rngNum = rngNum ~ ((rngNum << shift2) & 4294967295) rngNum = rngNum ~ ((rngNum << (shift2 or 9)) & 4294967295)
rngNum = rngNum ~ ((rngNum >> shift3) & 4294967295) rngNum = rngNum ~ ((rngNum >> (shift3 or 7)) & 4294967295)
return rngNum >> 0; return rngNum >> 0;
end end
@@ -1722,4 +1723,4 @@ end
function EID:SeedToFloat(seed) function EID:SeedToFloat(seed)
local multi = 2.3283061589829401E-10; local multi = 2.3283061589829401E-10;
return seed * multi; return seed * multi;
end end
+4 -1
View File
@@ -217,6 +217,7 @@ local recheckPickups = false
local customRNGSeed = 0x77777770 local customRNGSeed = 0x77777770
local customRNGShift = {0,0,0} local customRNGShift = {0,0,0}
-- Use local RNG functions to possibly reduce processing time a little bit
local function RNGNext() local function RNGNext()
local num = customRNGSeed local num = customRNGSeed
num = num ~ ((num >> customRNGShift[1]) & 4294967295) num = num ~ ((num >> customRNGShift[1]) & 4294967295)
@@ -542,7 +543,9 @@ local function GameStartCrafting()
for i=1,EID.XMLMaxItemID do itemPool:AddRoomBlacklist(i) end for i=1,EID.XMLMaxItemID do itemPool:AddRoomBlacklist(i) end
local collID = itemPool:GetCollectible(poolNum, false, 1, 25) 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}) table.insert(CraftingItemPools[poolNum+1], {collID, 1.0})
itemPool:AddRoomBlacklist(collID) itemPool:AddRoomBlacklist(collID)
collID = itemPool:GetCollectible(poolNum, false, 1, 25) collID = itemPool:GetCollectible(poolNum, false, 1, 25)
+16 -3
View File
@@ -264,6 +264,17 @@ EID.UserConfig = {
-- Default = true -- Default = true
["DisplaySacrificeInfo"] = 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 ---------- ---------- Dice Room ----------
-- Toggle display of Dice Room descriptions -- 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 -- 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 -- Default = false
["ItemReminderShowHiddenInfo"] = 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 -- Default = false
["PredictionSanguineBond"] = false, ["ItemReminderShowRNGCheats"] = false,
---------- Bag of Crafting ------------ ---------- Bag of Crafting ------------
@@ -513,6 +524,8 @@ EID.DefaultConfig = {
["ShowUnidentifiedPillDescriptions"] = false, ["ShowUnidentifiedPillDescriptions"] = false,
["DisplayGlitchedItemInfo"] = debug and true or false, ["DisplayGlitchedItemInfo"] = debug and true or false,
["DisplaySacrificeInfo"] = true, ["DisplaySacrificeInfo"] = true,
["DisplaySanguineInfo"] = true,
["PredictionSanguineBond"] = false,
["DisplayDiceInfo"] = true, ["DisplayDiceInfo"] = true,
["DisplayBagOfCrafting"] = "always", ["DisplayBagOfCrafting"] = "always",
["DisplayCraneInfo"] = true, ["DisplayCraneInfo"] = true,
@@ -538,7 +551,7 @@ EID.DefaultConfig = {
["ItemReminderShowTrinketDesc"] = 2, ["ItemReminderShowTrinketDesc"] = 2,
["ItemReminderShowPoopDesc"] = 1, ["ItemReminderShowPoopDesc"] = 1,
["ItemReminderShowHiddenInfo"] = false, ["ItemReminderShowHiddenInfo"] = false,
["PredictionSanguineBond"] = false, ["ItemReminderShowRNGCheats"] = false,
["SpindownDiceResults"] = 3, ["SpindownDiceResults"] = 3,
["SpindownDiceDisplayID"] = false, ["SpindownDiceDisplayID"] = false,
+10
View File
@@ -133,6 +133,12 @@ EID.InlineIcons = {
["ArrowDown"] = {"ArrowDown", 0, 10, 9, 1}, ["ArrowDown"] = {"ArrowDown", 0, 10, 9, 1},
["Warning"] = {"Warning", 0, 10, 9, 3}, ["Warning"] = {"Warning", 0, 10, 9, 3},
["Blank"] = {"Blank", 0, 0, 0}, ["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(_) ["IconGreenTint"] = function(_)
EID._NextIconModifier = function(sprite) EID._NextIconModifier = function(sprite)
sprite.Color = Color(1, 1, 1, EID.Config["Transparency"] * 0.5, 0, 0.5, 0) 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.SUPERBUM)] = {},
[tostring(EID.TRANSFORMATION.STOMPY)] = {VanillaForm = REPENTANCE and PlayerForm.PLAYERFORM_STOMPY} [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 currentRoom
local blacklist local blacklist
local holdMapDesc local holdMapDesc
local currentPlayer
-- Rainbow Worm's trinket IDs it grants, in order -- Rainbow Worm's trinket IDs it grants, in order
local rainbowWormEffects = { [0] = 9, 11, 65, 27, 10, 12, 26, 66, 96, 144 } 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
end end
-- General RNG functions for RNG predicting -- Banned items: Metronome, Plan C, Glowing Hour Glass, Breath of Life, Clicker, R Key
local function RNGNext(num, shift1, shift2, shift3) -- Reduced chance: Death Certificate (15%), Genesis (25%)
num = num ~ ((num >> shift1) & 4294967295) -- I saw something in the code about rerolling Forget Me Now but not sure what the criteria was
num = num ~ ((num << shift2) & 4294967295) local metronomeBlacklist = {[488] = 1, [475] = 1, [422] = 1} --AB+ can choose Clicker lol rip
num = num ~ ((num >> shift3) & 4294967295) if REPENTANCE then metronomeBlacklist = {[488] = 1, [475] = 1, [422] = 1, [326] = 1, [482] = 1, [636] = 1, [628] = 0.85, [622] = 0.75 } end
return num >> 0;
-- 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 end
local function SeedToFloat(seed)
local multi = 2.3283061589829401E-10; -- Teleport! Destination Prediction --
return seed * multi; 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 end
-- Teleport 2 Destination Prediction -- -- 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 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,14,3 } local teleport2GreedOrder = { 1,5,2,4,10,23,8,666,3 }
local teleport2Icons = { "{{Room}}","{{BossRoom}}","{{SuperSecretRoom}}","{{Shop}}","{{TreasureRoom}}","{{SacrificeRoom}}","{{DiceRoom}}","{{Library}}","{{CursedRoom}}","{{MiniBoss}}","{{ChallengeRoom}}","{{IsaacsRoom}}","{{BarrenRoom}}","{{ArcadeRoom}}","{{ChestRoom}}","{{Planetarium}}","{{SecretRoom}}","{{RedRoom}}","{{AngelDevilChance}}","{{ErrorRoom}}" } local teleport2Icons = { [1025] = "{{RedRoom}}", [666] = "{{AngelDevilChance}}" }
local teleport2GreedIcons = { "{{RoomLongVertical}}","{{BossRoom}}","{{Shop}}","{{TreasureRoom}}","{{CursedRoom}}","{{Room}}","{{SuperSecretRoom}}","{{AngelDevilChance}}","{{ErrorRoom}}" }
local function teleport2Prediction() local function teleport2Prediction()
local level = game:GetLevel() local level = game:GetLevel()
@@ -57,21 +131,23 @@ local function teleport2Prediction()
if not room.Clear then if not room.Clear then
-- Check for Special Red Rooms, which get ordered differently than their non-red version -- 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 else unclearedTypes[room.Data.Type] = true end
end end
end end
--Angel/Devil Room check (it lives off the map) --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 greed = game:IsGreedMode()
local roomOrder = (greed and teleport2GreedOrder) or teleport2Order local roomOrder = (greed and teleport2GreedOrder) or teleport2Order
local roomIcons = (greed and teleport2GreedIcons) or teleport2Icons local roomNames = EID:getDescriptionEntry("RoomTypeNames")
local roomNames = (greed and EID:getDescriptionEntry("Teleport2GreedRoomNames")) or EID:getDescriptionEntry("Teleport2RoomNames")
for i,v in ipairs(roomOrder) do for i,v in ipairs(roomOrder) do
if unclearedTypes[v] then 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 return
end end
end end
@@ -81,22 +157,23 @@ end
--order of checking: 15% Pennies, 48% Damage, 58% Hearts, 63% Item, 65% Leviathan, 100% Nothing --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 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) 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 local cheatResult = nil
if spikes and EID.Config["PredictionSanguineBond"] then if spikes and EID.Config["PredictionSanguineBond"] then
local spikeSeed = currentRoom:GetGridEntity(67):GetRNG():GetSeed() local spikeSeed = currentRoom:GetGridEntity(67):GetRNG():GetSeed()
spikeSeed = RNGNext(spikeSeed, 5, 9, 7) spikeSeed = EID:RNGNext(spikeSeed, 5, 9, 7)
spikeSeed = RNGNext(spikeSeed, 1, 5, 0x13) spikeSeed = EID:RNGNext(spikeSeed, 0x01, 0x05, 0x13) -- magic disassembled numbers!
local nextFloat = SeedToFloat(spikeSeed) local nextFloat = EID:SeedToFloat(spikeSeed)
for _,v in ipairs(sanguineResults) do for _,v in ipairs(sanguineResults) do
if nextFloat < v[1] then cheatResult = v[2] break end if nextFloat < v[1] then cheatResult = v[2] break end
end end
end end
local descObj = EID:getDescriptionObj(5, 100, 692)
local resultsDesc = "" local resultsDesc = ""
local lineCount = 0 local lineCount = 0
@@ -109,8 +186,7 @@ local function sanguinePrediction()
resultsDesc = resultsDesc .. w .. "#" resultsDesc = resultsDesc .. w .. "#"
end end
end end
return resultsDesc
append("{{Collectible692}}", descObj.Name, resultsDesc)
end end
function EID:getHoldMapDescription(player, checkingTwin) function EID:getHoldMapDescription(player, checkingTwin)
@@ -120,6 +196,7 @@ function EID:getHoldMapDescription(player, checkingTwin)
level = game:GetLevel() level = game:GetLevel()
currentRoom = level:GetCurrentRoom() currentRoom = level:GetCurrentRoom()
currentPlayer = player
-- TODO: -- TODO:
-- D1, crooked penny cheats. 404/liberty cap/etc. "what item is it" -- D1, crooked penny cheats. 404/liberty cap/etc. "what item is it"
@@ -137,9 +214,16 @@ function EID:getHoldMapDescription(player, checkingTwin)
end end
end end
-- Sanguine Bond Possible Results -- Metronome result
if REPENTANCE and player:HasCollectible(CollectibleType.COLLECTIBLE_SANGUINE_BOND) and game:GetRoom():GetType() == RoomType.ROOM_DEVIL then if player:HasCollectible(CollectibleType.COLLECTIBLE_METRONOME) and EID.Config["ItemReminderShowRNGCheats"] then
sanguinePrediction() 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 end
-- Teleport 2.0 location -- 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", "DisplayDiceInfo", "Dice Room Infos")
EID:AddBooleanSetting("Display", "DisplayCraneInfo", "Crane Game Infos", {repOnly = true}) EID:AddBooleanSetting("Display", "DisplayCraneInfo", "Crane Game Infos", {repOnly = true})
EID:AddBooleanSetting("Display", "DisplayVoidStatInfo", "Void Stat Increase Infos") 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} local diceSteps = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
-- Spindown Dice Settings -- Spindown Dice Settings
@@ -545,20 +547,19 @@ if MCMLoaded then
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
------------------------------Item Reminder-------------------------------- ------------------------------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" } 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, 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"}}) 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)", 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)" }
"Yes (max 6)", "Yes (max 7)", "Yes (max 8)" }
MCM.AddSpace("EID", "Reminder") MCM.AddSpace("EID", "Reminder")
MCM.AddText("EID", "Reminder", "Item Descriptions") MCM.AddText("EID", "Reminder", "Item Descriptions")
-- should these be organized in the order they're shown in the map desc code? -- 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", "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", "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"}) 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: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", "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 EID.inModifierPreview = false
-- The "Hold Map Helper" needs to know if it shouldn't display because we're in a Hold Tab desc -- The "Hold Map Helper" needs to know if it shouldn't display because we're in a Hold Tab desc
EID.TabDescThisFrame = false 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! -- 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, } 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 voidIntro = ((shopItem or isAltOption) and EID:getDescriptionEntry("VoidShopText")) or EID:getDescriptionEntry("VoidText")
local voidNames = EID:getDescriptionEntry("VoidNames") 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 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] 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 .. "#") EID:appendToDescription(descObj, "#" .. prefix .. voidIntro .. "#")
for i,v in ipairs(increases) do for i,v in ipairs(increases) do
if v > 0 then 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
end end
-- Print unique synergies with Void and Active Items -- Print unique synergies with Void and Active Items
@@ -318,7 +322,7 @@ if REPENTANCE then
if hasCarBattery then if hasCarBattery then
EID:appendToDescription(descObj, " (Results with {{Collectible356}})") EID:appendToDescription(descObj, " (Results with {{Collectible356}})")
end 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.TabPreviewID = firstID
EID:appendToDescription(descObj, "#{{Blank}} ".. EID:getDescriptionEntry("FlipItemToggleInfo")) EID:appendToDescription(descObj, "#{{Blank}} ".. EID:getDescriptionEntry("FlipItemToggleInfo"))
end end
+19 -5
View File
@@ -30,6 +30,7 @@ EID.permanentDisplayTextObj = nil
EID.lastDescriptionEntity = nil EID.lastDescriptionEntity = nil
EID.lineHeight = 11 EID.lineHeight = 11
EID.sacrificeCounter = {} EID.sacrificeCounter = {}
local spikePos = Vector(320, 280)
EID.itemConfig = Isaac.GetItemConfig() EID.itemConfig = Isaac.GetItemConfig()
EID.itemUnlockStates = {} EID.itemUnlockStates = {}
EID.CraneItemType = {} EID.CraneItemType = {}
@@ -1212,6 +1213,7 @@ local function onRender(t)
end end
EID.TabPreviewID = 0 EID.TabPreviewID = 0
EID.TabDescThisFrame = false 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 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 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 playerSearch = EID.players
end end
local playerNearSacrificeSpikes = false
-- Check for descriptions to print per player -- Check for descriptions to print per player
for i,player in ipairs(playerSearch) do for i,player in ipairs(playerSearch) do
local displayedDesc = false local displayedDesc = false
@@ -1335,6 +1339,12 @@ local function onRender(t)
end end
end 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 if EID.Config["DisplayAllNearby"] then
-- make the closest entity the first to get drawn -- make the closest entity the first to get drawn
@@ -1489,20 +1499,24 @@ local function onRender(t)
end end
end end
-- if no entities to display, display Sacrifice Room information -- 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 -- it will be last priority for the main spot if DisplayAllNearby is on and we aren't near them
if #EID.descriptionsToPrint == 0 or EID.Config["DisplayAllNearby"] then if (#EID.descriptionsToPrint == 0 or playerNearSacrificeSpikes) or EID.Config["DisplayAllNearby"] then
if game:GetRoom():GetType() == RoomType.ROOM_SACRIFICE and EID.Config["DisplaySacrificeInfo"] then if game:GetRoom():GetType() == RoomType.ROOM_SACRIFICE and EID.Config["DisplaySacrificeInfo"] then
local curRoomIndex = game:GetLevel():GetCurrentRoomIndex() local curRoomIndex = game:GetLevel():GetCurrentRoomIndex()
local curCounter = EID.sacrificeCounter[curRoomIndex] or 1 local curCounter = EID.sacrificeCounter[curRoomIndex] or 1
local sacrificeDesc = EID:getDescriptionObj(-999, -1, curCounter) 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
end end
-- handle showing the Hold Map Helper description -- handle showing the Hold Map Helper description
if EID.Config["ItemReminderEnabled"] and EID.holdTabCounter >= 30 and EID.TabDescThisFrame == false and EID.holdTabPlayer ~= nil then 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) local demoDescObj = EID:getDescriptionObj(-999, -1, 1)
demoDescObj.Name = "" demoDescObj.Name = ""
demoDescObj.Description = EID:getHoldMapDescription(EID.holdTabPlayer) demoDescObj.Description = EID:getHoldMapDescription(EID.holdTabPlayer)
+16
View File
@@ -125,6 +125,22 @@
<NullAnimations/> <NullAnimations/>
<Triggers/> <Triggers/>
</Animation> </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"> <Animation Name="pickups" FrameNum="11" Loop="false">
<RootAnimation> <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"/> <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