<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.jcraft-eoe.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AChestLoot</id>
	<title>Module:ChestLoot - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.jcraft-eoe.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AChestLoot"/>
	<link rel="alternate" type="text/html" href="https://wiki.jcraft-eoe.com/index.php?title=Module:ChestLoot&amp;action=history"/>
	<updated>2026-05-21T02:27:25Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.jcraft-eoe.com/index.php?title=Module:ChestLoot&amp;diff=154&amp;oldid=prev</id>
		<title>KasaneTetoLover: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.jcraft-eoe.com/index.php?title=Module:ChestLoot&amp;diff=154&amp;oldid=prev"/>
		<updated>2026-04-25T00:39:12Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:39, 25 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>KasaneTetoLover</name></author>
	</entry>
	<entry>
		<id>https://wiki.jcraft-eoe.com/index.php?title=Module:ChestLoot&amp;diff=153&amp;oldid=prev</id>
		<title>Fandom Import&gt;KasaneTetoLover at 16:09, 23 April 2026</title>
		<link rel="alternate" type="text/html" href="https://wiki.jcraft-eoe.com/index.php?title=Module:ChestLoot&amp;diff=153&amp;oldid=prev"/>
		<updated>2026-04-23T16:09:59Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local lootData = require(&amp;#039;Module:ChestLoot/Data&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local name = args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local data = lootData[name]&lt;br /&gt;
    if not data then &lt;br /&gt;
        return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Chest &amp;quot;&amp;#039; .. tostring(name) .. &amp;#039;&amp;quot; not found.&amp;lt;/span&amp;gt;&amp;#039; &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local itemList = {}&lt;br /&gt;
    &lt;br /&gt;
    for _, pool in ipairs(data.pools or {}) do&lt;br /&gt;
        local r = pool.rolls or {1, 1}&lt;br /&gt;
        local rMin, rMax&lt;br /&gt;
        &lt;br /&gt;
        if type(r) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            rMin = r.min or r[1] or 1&lt;br /&gt;
            rMax = r.max or r[2] or 1&lt;br /&gt;
        else&lt;br /&gt;
            rMin = r&lt;br /&gt;
            rMax = r&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        local avgRolls = (rMin + rMax) / 2&lt;br /&gt;
        local totalWeight = 0&lt;br /&gt;
        for _, entry in ipairs(pool.entries or {}) do&lt;br /&gt;
            totalWeight = totalWeight + (entry[2] or 1)&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        for _, entry in ipairs(pool.entries or {}) do&lt;br /&gt;
            local itemName = tostring(entry[1])&lt;br /&gt;
            local weight = entry[2] or 1&lt;br /&gt;
            local weightFraction = weight / totalWeight&lt;br /&gt;
            &lt;br /&gt;
            -- Quantity &amp;amp; Average Quantity Logic &lt;br /&gt;
            local quantityStr = &amp;quot;1&amp;quot;&lt;br /&gt;
            local avgQuantity = 1&lt;br /&gt;
            if entry.count then&lt;br /&gt;
                if type(entry.count) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                    local qMin = entry.count.min or entry.count[1] or 1&lt;br /&gt;
                    local qMax = entry.count.max or entry.count[2] or 1&lt;br /&gt;
                    quantityStr = qMin .. &amp;quot;-&amp;quot; .. qMax&lt;br /&gt;
                    avgQuantity = (qMin + qMax) / 2&lt;br /&gt;
                else&lt;br /&gt;
                    quantityStr = tostring(entry.count)&lt;br /&gt;
                    avgQuantity = tonumber(entry.count) or 1&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            -- Statistical Calculations factoring in Quantity &lt;br /&gt;
            local avgPerChest = weightFraction * avgRolls * avgQuantity&lt;br /&gt;
            local chance = (1 - (1 - weightFraction)^rMax) * 100&lt;br /&gt;
            local avgChestsToSearch = avgPerChest &amp;gt; 0 and (1 / avgPerChest) or 0&lt;br /&gt;
            &lt;br /&gt;
            table.insert(itemList, {&lt;br /&gt;
                name = itemName,&lt;br /&gt;
                chance = chance,&lt;br /&gt;
                avgPer = avgPerChest,&lt;br /&gt;
                avgSearch = avgChestsToSearch,&lt;br /&gt;
                quantity = quantityStr&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Sorting: Chance (High to Low), then Natural Name Sort (Double digits first)&lt;br /&gt;
    table.sort(itemList, function(a, b)&lt;br /&gt;
        if math.abs(a.chance - b.chance) &amp;gt; 0.0001 then &lt;br /&gt;
            return a.chance &amp;gt; b.chance&lt;br /&gt;
        else&lt;br /&gt;
            local aNum = tonumber(a.name:match(&amp;quot;(%d+)&amp;quot;))&lt;br /&gt;
            local bNum = tonumber(b.name:match(&amp;quot;(%d+)&amp;quot;))&lt;br /&gt;
            if aNum and bNum and aNum ~= bNum then&lt;br /&gt;
                return aNum &amp;gt; bNum &lt;br /&gt;
            else&lt;br /&gt;
                return a.name &amp;gt; b.name &lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    &lt;br /&gt;
    local html = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
        :addClass(&amp;#039;wikitable sortable mw-collapsible mw-collapsed&amp;#039;) &lt;br /&gt;
        :css(&amp;#039;border-collapse&amp;#039;, &amp;#039;collapse&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;width&amp;#039;, &amp;#039;100%&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;border&amp;#039;, &amp;#039;1px solid #444&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;background-color&amp;#039;, &amp;#039;#1e1e1e&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;font-size&amp;#039;, &amp;#039;0.9em&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    local cleanChestName = name:gsub(&amp;quot;_&amp;quot;, &amp;quot; &amp;quot;):gsub(&amp;quot;^%l&amp;quot;, string.upper)&lt;br /&gt;
    html:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
        :tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
            :attr(&amp;#039;colspan&amp;#039;, &amp;#039;5&amp;#039;)&lt;br /&gt;
            :wikitext(&amp;quot;Loot Table: &amp;quot; .. cleanChestName)&lt;br /&gt;
            :css(&amp;#039;background-color&amp;#039;, &amp;#039;#3d3d3d&amp;#039;)&lt;br /&gt;
            :css(&amp;#039;color&amp;#039;, &amp;#039;#58d68d&amp;#039;)&lt;br /&gt;
            :css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    local headerRow = html:tag(&amp;#039;tr&amp;#039;):css(&amp;#039;background-color&amp;#039;, &amp;#039;#2d2d2d&amp;#039;):css(&amp;#039;border-bottom&amp;#039;, &amp;#039;2px solid #444&amp;#039;)&lt;br /&gt;
    headerRow:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Item&amp;#039;):css(&amp;#039;padding&amp;#039;, &amp;#039;0.6em&amp;#039;):css(&amp;#039;text-align&amp;#039;, &amp;#039;left&amp;#039;):css(&amp;#039;color&amp;#039;, &amp;#039;#fff&amp;#039;)&lt;br /&gt;
    headerRow:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Qty&amp;#039;):css(&amp;#039;padding&amp;#039;, &amp;#039;0.6em&amp;#039;):css(&amp;#039;color&amp;#039;, &amp;#039;#fff&amp;#039;)&lt;br /&gt;
    headerRow:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;data-sort-type&amp;#039;, &amp;#039;number&amp;#039;):wikitext(&amp;#039;Chance&amp;#039;):css(&amp;#039;padding&amp;#039;, &amp;#039;0.6em&amp;#039;):css(&amp;#039;color&amp;#039;, &amp;#039;#fff&amp;#039;)&lt;br /&gt;
    headerRow:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;data-sort-type&amp;#039;, &amp;#039;number&amp;#039;):wikitext(&amp;#039;Avg. Per Chest&amp;#039;):css(&amp;#039;padding&amp;#039;, &amp;#039;0.6em&amp;#039;):css(&amp;#039;color&amp;#039;, &amp;#039;#fff&amp;#039;)&lt;br /&gt;
    headerRow:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;data-sort-type&amp;#039;, &amp;#039;number&amp;#039;):wikitext(&amp;#039;Avg. # Chests&amp;#039;):css(&amp;#039;padding&amp;#039;, &amp;#039;0.6em&amp;#039;):css(&amp;#039;color&amp;#039;, &amp;#039;#fff&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    for _, item in ipairs(itemList) do&lt;br /&gt;
        if item.name ~= &amp;quot;Air&amp;quot; then&lt;br /&gt;
            local cleanName = item.name:gsub(&amp;quot;_&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            -- Updated Whitelist to include Cinderella Mask &lt;br /&gt;
            local linkedItems = { &lt;br /&gt;
                [&amp;quot;Stone_Mask&amp;quot;] = true, &lt;br /&gt;
                [&amp;quot;Stand_Arrow&amp;quot;] = true, &lt;br /&gt;
                [&amp;quot;Stand_Arrowhead&amp;quot;] = true, &lt;br /&gt;
                [&amp;quot;Requiem_Arrow&amp;quot;] = true,&lt;br /&gt;
                [&amp;quot;Cinderella_Mask&amp;quot;] = true &lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            local displayCell = linkedItems[item.name] and (&amp;#039;[[&amp;#039; .. item.name .. &amp;#039;|&amp;#039; .. cleanName .. &amp;#039;]]&amp;#039;) or (&amp;#039;&amp;lt;span style=&amp;quot;color:white !important;&amp;quot;&amp;gt;&amp;#039; .. cleanName .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
            local row = html:tag(&amp;#039;tr&amp;#039;):css(&amp;#039;border-bottom&amp;#039;, &amp;#039;1px solid #333&amp;#039;)&lt;br /&gt;
            row:tag(&amp;#039;td&amp;#039;):wikitext(displayCell):css(&amp;#039;padding&amp;#039;, &amp;#039;0.4em 0.6em&amp;#039;)&lt;br /&gt;
            row:tag(&amp;#039;td&amp;#039;):wikitext(item.quantity):css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;):css(&amp;#039;color&amp;#039;, &amp;#039;#bbb&amp;#039;)&lt;br /&gt;
            row:tag(&amp;#039;td&amp;#039;):wikitext(string.format(&amp;quot;%.1f%%&amp;quot;, item.chance)):css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;):css(&amp;#039;color&amp;#039;, &amp;#039;#bbb&amp;#039;)&lt;br /&gt;
            row:tag(&amp;#039;td&amp;#039;):wikitext(string.format(&amp;quot;%.3f&amp;quot;, item.avgPer)):css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;):css(&amp;#039;color&amp;#039;, &amp;#039;#bbb&amp;#039;)&lt;br /&gt;
            row:tag(&amp;#039;td&amp;#039;):wikitext(string.format(&amp;quot;%.1f&amp;quot;, item.avgSearch)):css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;):css(&amp;#039;color&amp;#039;, &amp;#039;#bbb&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Fandom Import&gt;KasaneTetoLover</name></author>
	</entry>
</feed>