local modname = "DeadGod Helper" local mod = RegisterMod(modname, 1) local math = require("math") mod.print = Isaac.ConsoleOutput mod.game = Game() local save = include("save"):new() local json = include("json") local DEBUG = false mod.font = Font() mod.font:Load("font/terminus.fnt") function mod:isCurseBlind() return mod.game:GetLevel():GetCurses() & LevelCurse.CURSE_OF_BLIND > 0 end function mod.isIdNotTakenAlready(id) if id>=1 and id<=save.settings.maxid then return not save.seen[id] end if id>save.settings.maxid and save.settings.showonmodded then local itemconfig = Isaac.GetItemConfig():GetCollectible(id) if itemconfig then local name = itemconfig.Name return not save.seenmodded[name] end end return false end function mod.registerTouched(id) if id>=1 and id<=save.settings.maxid then save:touchid(id) end if id >=save.settings.maxid then -- Modded item, save them by name -- (as IDs are choosen manually by the game, and may vary when changing mods) local itemconfig = Isaac.GetItemConfig():GetCollectible(id) if itemconfig then local name = itemconfig.Name save:touchname(name) end end -- Save mod:save() end -- Used to check if EID's description should be modified function mod.shouldBeModified(descObj) -- Taken from https://github.com/wofsauge/External-Item-Descriptions/wiki/Description-Modifiers -- if entity is a piedestal if descObj.ObjType == 5 and descObj.ObjVariant == 100 then -- Check if item was not already taken in this savefile -- And if item is non-modded (id<= Mom's ring ID) local id = descObj.ObjSubType return mod.isIdNotTakenAlready(id) end end -- Used to modify EID's description function mod.modifierCallback(descObj) if save.settings.eid then local str = "#{{Collectible}} Not picked up yet!#" if descObj.ObjSubType>save.settings.maxid then str = "#{{Trinket}} Not picked up yet!#" end descObj.Description = str..descObj.Description end return descObj end -- Used to detect when an item is picked up function mod:update() for i=0, mod.game:GetNumPlayers()-1 do local player = mod.game:GetPlayer(i) local data = player:GetData() local item = player.QueuedItem.Item if data._deadgodlastid and data._deadgodlastcount and data._deadgodlastid>0 then if item==nil then -- Finished animation if player:GetCollectibleNum(data._deadgodlastid)>data._deadgodlastcount then -- Have it on me -- Then I just picked it up, yay mod.registerTouched(data._deadgodlastid) if DEBUG then mod.print("> "..tostring(data._deadgodlastid).."\n") end data._deadgodlastid = 0 data._deadgodlastcount = 0 end end end if item and item:IsCollectible() then data._deadgodlastid = item.ID data._deadgodlastcount = player:GetCollectibleNum(item.ID) end end end -- Used to draw the ! sign function mod:PickupDrawCallback(pickupEntity, _) if save.settings.visual and (not mod:isCurseBlind() or save.settings.showonblind)then if pickupEntity.Variant==PickupVariant.PICKUP_COLLECTIBLE then if mod.isIdNotTakenAlready(pickupEntity.SubType) then local v = Isaac.WorldToScreen(pickupEntity.Position + pickupEntity.SpriteOffset) local color = KColor(0.98,0.93,0.55,1) if pickupEntity.SubType > save.settings.maxid then -- Modded item color = KColor(0.68,0.88,1,1) end mod.font:DrawString("!", v.X-1, v.Y-52+math.sin(mod.game:GetFrameCount()/10)*2, color , 2, true) end end end end function mod:newrun() if mod:HasData() then local data = mod:LoadData() if DEBUG then mod.print(data.."\n") end save:load(json, data) local c = 0 for _,v in ipairs(save.seen) do if v then c = c+1 end end mod.print(modname.." Loaded, "..c.." items seen\n") end end function mod:save() mod:SaveData(save:dump(json)) end mod:AddCallback(ModCallbacks.MC_POST_GAME_END, mod.save) mod:AddCallback(ModCallbacks.MC_POST_GAME_STARTED, mod.newrun) mod:AddCallback(ModCallbacks.MC_POST_UPDATE, mod.update) mod:AddCallback(ModCallbacks.MC_POST_PICKUP_RENDER, mod.PickupDrawCallback) if EID then EID:addDescriptionModifier( modname, mod.shouldBeModified, mod.modifierCallback ) end if ModConfigMenu then ModConfigMenu.AddSetting( modname, -- This should be unique for your mod nil, { Type = ModConfigMenu.OptionType.BOOLEAN, CurrentSetting = function() return save.settings.eid end, Display = function() return "Show in EID: " .. (save.settings.eid and "on" or "off") end, OnChange = function(b) save.settings.eid = b mod:save() end, } ) ModConfigMenu.AddSetting( modname, -- This should be unique for your mod nil, { Type = ModConfigMenu.OptionType.BOOLEAN, CurrentSetting = function() return save.settings.visual end, Display = function() return "Show on pedestals: " .. (save.settings.visual and "on" or "off") end, OnChange = function(b) save.settings.visual = b mod:save() end, } ) ModConfigMenu.AddSetting( modname, -- This should be unique for your mod nil, { Type = ModConfigMenu.OptionType.BOOLEAN, CurrentSetting = function() return save.settings.showonmodded end, Display = function() return "Also track modded items: " .. (save.settings.showonmodded and "on" or "off") end, OnChange = function(b) save.settings.showonmodded = b mod:save() end, } ) ModConfigMenu.AddSetting( modname, -- This should be unique for your mod nil, { Type = ModConfigMenu.OptionType.BOOLEAN, CurrentSetting = function() return save.settings.showonblind end, Display = function() return "Show while having Curse Of The Blind: " .. (save.settings.showonblind and "on" or "off") end, OnChange = function(b) save.settings.showonblind = b mod:save() end, } ) end