diff --git a/eid_tmtrainer.lua b/eid_tmtrainer.lua index 18c08136..8a7ad49a 100644 --- a/eid_tmtrainer.lua +++ b/eid_tmtrainer.lua @@ -21,18 +21,26 @@ local logCursor = 0 local debugLogLocation = os.getenv("SYSTEMDRIVE") .. "/Users/" .. os.getenv("USERNAME") .. "/Documents/My Games/Binding of Isaac Repentance/tmtrainerlog.txt" local debugLog = io.open(debugLogLocation, "w+") +-- all possible attributes +--local itemConfigItemAttributes = { "AchievementID", "AddBlackHearts", "AddBombs", "AddCoins", "AddHearts", "AddKeys", "AddMaxHearts", "AddSoulHearts", "CacheFlags", "ChargeType", "ClearEffectsOnRemove", "Costume", "Description", "DevilPrice", "Discharged", "GfxFileName", "Hidden", "ID", "InitCharge", "MaxCharges", "MaxCooldown", "Name", "PassiveCache", "PersistentEffect", "Quality", "ShopPrice", "Special", "Tags", "Type" } +-- the traits here will be listed in this order +local itemConfigItemAttributes = { "AddMaxHearts", "AddHearts", "AddSoulHearts", "AddBlackHearts", "AddBombs", "AddCoins", "AddKeys", "CacheFlags" } +local cacheFlagNames = { [0] = "Damage", "Fire Delay", "Shot Speed", "Range", "Speed", "Tear Effects", "Tear Color", "Flying", "Weapon", "Familiars", "Luck", "Size", "Color", "Pickup Vision", [16] = "All Stats" } + +-- cache flags: math.pow(2, i) | flags ~= 0 + --currently english only local attributeConversions = { --chain = "Then: ", chain = "", active = "On use:", - pickup_collected = "When you collect a pickup:", + pickup_collected = "When you collect a pickup:", --chance to? enemy_kill = "On kill, chance to:", - damage_taken = "When you take damage:", + damage_taken = "When you take damage:", --chance to? entity_spawned = "When a {{ColorGray}}{T1}{{ColorText}} is spawned, chance to:", tear_fire = "When you fire a tear, chance to:", enemy_hit = "On hitting an enemy, chance to:", - room_clear = "On room clear:", + room_clear = "On room clear:", --chance to? area_damage = "Deal {1} damage in an area around you", add_temporary_effect = "Gain {1} for the room", @@ -40,34 +48,52 @@ local attributeConversions = { use_active_item = "Use {1}", spawn_entity = "Spawn a {{ColorGray}}{1}{{ColorText}}", fart = "Fart with size {1}", + + AddBlackHearts = "{1} Black Heart", + AddBombs = "{1} Bomb", + AddCoins = "{1} Coin", + AddHearts = "Heals {1} Red Heart", + AddKeys = "{1} Key", + AddMaxHearts = "{1} Heart Container", + AddSoulHearts = "{1} Soul Heart", + } --999.-1? +--1000.50: Laser Impact? It couldn't find that? local genericEntityNames = { - ["4.-1"] = "lit Bombs", - ["5.-1"] = "pickups", - ["5.10"] = "Hearts", - ["5.20"] = "Coins", - ["5.30"] = "Keys", - ["5.40"] = "Bomb pickups", - ["5.70"] = "Pills", - ["5.300"] = "Cards", + ["2.-1"] = "tear", + ["4.-1"] = "lit Bomb", + ["5.-1"] = "pickup", + ["5.10"] = "Heart", + ["5.20"] = "Coin", + ["5.30"] = "Key", + ["5.40"] = "Bomb pickup", + ["5.69"] = "Grab Bag", + ["5.70"] = "Pill", + ["5.300"] = "Card", - ["9.-1"] = "projectiles", - ["1000.-1"] = "effects", + ["9.-1"] = "projectile", + ["999.-1"] = "grid-aligned object", + ["1000.0"] = "effect", } local lastEffectTrigger = "chain" -local function entityToName(e) - --local name = "" - local name = genericEntityNames[e] or EID.XMLEntityNames[e] or "NO NAME" +local function entityToName(e, plural) + -- -1 is often used as an "any of this type", so converting it to 0 can help + local eWithZero = string.gsub(e, "-1", "0") + plural = plural or false + local name = genericEntityNames[e] or EID.XMLEntityNames[e] or genericEntityNames[eWithZero] or EID.XMLEntityNames[eWithZero] or "NO NAME" if name == "NO NAME" then - debugLog:write(e .. " (" .. name .. ")\n") + debugLog:write(e .. "\n") debugLog:flush() + print(e) + elseif plural then + name = name .. "s" end - --if name == "" then return e end - return genericEntityNames[e] or EID.XMLEntityNames[e] or name + if name == "NO NAME" then return e end + return name end local function parseEffectLine(raw) @@ -102,7 +128,7 @@ local function parseEffectLine(raw) replacements[1] = "{{Collectible" .. Isaac.GetItemIdByName(name) .. "}}" .. name elseif effectType == "convert_entities" then - replacements[1] = entityToName(words[6]) + replacements[1] = entityToName(words[6], true) replacements[2] = entityToName(words[8]) elseif effectType == "spawn_entity" then replacements[1] = entityToName(words[6]) @@ -152,6 +178,46 @@ local function CheckLogForItems(_) if numEffects == 0 then -- Glowing Hour Glass type effects will cause the game to reload all items, check if our desc is equal to the first one if (EID:getDescriptionObj(5, 100, maxNumber - 1).Description == eidDesc) then spawnedItems = 1 end + + -- check for the item's ItemConfig attributes + local config = Isaac.GetItemConfig() + local item = config:GetCollectible(maxNumber - spawnedItems) + print(item) + debugLog:write((maxNumber - spawnedItems) .. "\n") + local attributes = "" + for k,v in ipairs(itemConfigItemAttributes) do + local attrib = item[v] + if attrib ~= 0 then + if (v == "CacheFlags") then + local flagString = "Might affect " + if attrib == CacheFlag.CACHE_ALL then + flagString = flagString .. cacheFlagNames[16] + else + for i=0, 13 do + if 2^i & attrib ~= 0 then + flagString = flagString .. cacheFlagNames[i] .. ", " + end + end + flagString = string.sub(flagString, 0, -3) + end + attributes = attributes .. flagString .. "#" + else + -- the Add Heart attributes count half a heart as 1, so divide the value in half + if string.find(v, "Hearts") then attrib = attrib / 2 end + -- the g flag removes .0 in numbers like 1.0 (caused by the hearts division) + local s = string.format("%.4g",attrib) + if attrib > 0 then s = "+" .. s end + attributes = attributes .. string.gsub(attributeConversions[v], "{1}", s) + --things like this don't localize well at all... + if attrib > 1 or attrib < -1 then attributes = attributes .. "s" end + attributes = attributes .. "#" + end + end + debugLog:write(v .. ": " .. tostring(item[v]) .. "\n") + end + eidDesc = attributes .. eidDesc + debugLog:flush() + EID:addCollectible(maxNumber - spawnedItems, eidDesc) --print("adding " .. (maxNumber - spawnedItems)) end