195 lines
7.5 KiB
Lua
195 lines
7.5 KiB
Lua
module 'disenchant'
|
|
|
|
UNCOMMON, RARE, EPIC = 2, 3, 4
|
|
|
|
do
|
|
local data = {
|
|
[10940] = {'DUST', '1-20'},
|
|
[11083] = {'DUST', '21-30'},
|
|
[11137] = {'DUST', '31-40'},
|
|
[11176] = {'DUST', '41-50'},
|
|
[16204] = {'DUST', '51-60'},
|
|
|
|
[10938] = {'ESSENCE', '1-10'},
|
|
[10939] = {'ESSENCE', '11-15'},
|
|
[10998] = {'ESSENCE', '16-20'},
|
|
[11082] = {'ESSENCE', '21-25'},
|
|
[11134] = {'ESSENCE', '26-30'},
|
|
[11135] = {'ESSENCE', '31-35'},
|
|
[11174] = {'ESSENCE', '36-40'},
|
|
[11175] = {'ESSENCE', '41-45'},
|
|
[16202] = {'ESSENCE', '46-50'},
|
|
[16203] = {'ESSENCE', '51-60'},
|
|
|
|
[10978] = {'SHARD', '1-20'},
|
|
[11084] = {'SHARD', '21-25'},
|
|
[11138] = {'SHARD', '26-30'},
|
|
[11139] = {'SHARD', '31-35'},
|
|
[11177] = {'SHARD', '36-40'},
|
|
[11178] = {'SHARD', '41-45'},
|
|
[14343] = {'SHARD', '46-50'},
|
|
[14344] = {'SHARD', '51-60'},
|
|
|
|
[20725] = {'CRYSTAL', '51+'},
|
|
}
|
|
|
|
function public.source(item_id)
|
|
return unpack(data[item_id] or tt)
|
|
end
|
|
end
|
|
|
|
function LOAD()
|
|
ARMOR = -set
|
|
'INVTYPE_HEAD'
|
|
'INVTYPE_NECK'
|
|
'INVTYPE_SHOULDER'
|
|
'INVTYPE_BODY'
|
|
'INVTYPE_CHEST'
|
|
'INVTYPE_ROBE'
|
|
'INVTYPE_WAIST'
|
|
'INVTYPE_LEGS'
|
|
'INVTYPE_FEET'
|
|
'INVTYPE_WRIST'
|
|
'INVTYPE_HAND'
|
|
'INVTYPE_FINGER'
|
|
'INVTYPE_TRINKET'
|
|
'INVTYPE_CLOAK'
|
|
'INVTYPE_HOLDABLE'
|
|
WEAPON = -set
|
|
'INVTYPE_2HWEAPON'
|
|
'INVTYPE_WEAPONMAINHAND'
|
|
'INVTYPE_WEAPON'
|
|
'INVTYPE_WEAPONOFFHAND'
|
|
'INVTYPE_SHIELD'
|
|
'INVTYPE_RANGED'
|
|
'INVTYPE_RANGEDRIGHT'
|
|
end
|
|
|
|
function public.value(slot, quality, level)
|
|
local expectation
|
|
for _, event in distribution(slot, quality, level) do
|
|
local value = history.value(event.item_id..':'..0)
|
|
if not value then
|
|
return
|
|
else
|
|
expectation = (expectation or 0) + event.probability * (event.min_quantity + event.max_quantity) / 2 * value
|
|
end
|
|
end
|
|
return expectation
|
|
end
|
|
|
|
function public.distribution(slot, quality, level)
|
|
if not (ARMOR[slot] or WEAPON[slot]) or level == 0 then
|
|
return t
|
|
end
|
|
|
|
local function p(probability_armor, probability_weapon)
|
|
if ARMOR[slot] then
|
|
return probability_armor
|
|
elseif WEAPON[slot] then
|
|
return probability_weapon
|
|
end
|
|
end
|
|
|
|
if quality == UNCOMMON then
|
|
if level <= 10 then
|
|
return {
|
|
{item_id=10940, min_quantity=1, max_quantity=2, probability=p(0.8, 0.2)},
|
|
{item_id=10938, min_quantity=1, max_quantity=2, probability=p(0.2, 0.8)},
|
|
}
|
|
elseif level <= 15 then
|
|
return {
|
|
{item_id=10940, min_quantity=2, max_quantity=3, probability=p(0.75, 0.2)},
|
|
{item_id=10939, min_quantity=1, max_quantity=2, probability=p(0.2, 0.75)},
|
|
{item_id=10978, min_quantity=1, max_quantity=1, probability=0.05},
|
|
}
|
|
elseif level <= 20 then
|
|
return {
|
|
{item_id=10940, min_quantity=4, max_quantity=6, probability=p(0.75, 0.15)},
|
|
{item_id=10998, min_quantity=1, max_quantity=2, probability=p(0.15, 0.75)},
|
|
{item_id=10978, min_quantity=1, max_quantity=1, probability=0.10},
|
|
}
|
|
elseif level <= 25 then
|
|
return {
|
|
{item_id=11083, min_quantity=1, max_quantity=2, probability=p(0.75, 0.2)},
|
|
{item_id=11082, min_quantity=1, max_quantity=2, probability=p(0.2, 0.75)},
|
|
{item_id=11084, min_quantity=1, max_quantity=1, probability=0.05},
|
|
}
|
|
elseif level <= 30 then
|
|
return {
|
|
{item_id=11083, min_quantity=2, max_quantity=5, probability=p(0.75, 0.2)},
|
|
{item_id=11134, min_quantity=1, max_quantity=2, probability=p(0.2, 0.75)},
|
|
{item_id=11138, min_quantity=1, max_quantity=1, probability=0.05},
|
|
}
|
|
elseif level <= 35 then
|
|
return {
|
|
{item_id=11137, min_quantity=1, max_quantity=2, probability=p(0.75, 0.2)},
|
|
{item_id=11135, min_quantity=1, max_quantity=2, probability=p(0.2, 0.75)},
|
|
{item_id=11139, min_quantity=1, max_quantity=1, probability=0.05},
|
|
}
|
|
elseif level <= 40 then
|
|
return {
|
|
{item_id=11137, min_quantity=2, max_quantity=5, probability=p(0.75, 0.2)},
|
|
{item_id=11174, min_quantity=1, max_quantity=2, probability=p(0.2, 0.75)},
|
|
{item_id=11177, min_quantity=1, max_quantity=1, probability=0.05},
|
|
}
|
|
elseif level <= 45 then
|
|
return {
|
|
{item_id=11176, min_quantity=1, max_quantity=2, probability=p(0.75, 0.2)},
|
|
{item_id=11175, min_quantity=1, max_quantity=2, probability=p(0.2, 0.75)},
|
|
{item_id=11178, min_quantity=1, max_quantity=1, probability=0.05},
|
|
}
|
|
elseif level <= 50 then
|
|
return {
|
|
{item_id=11176, min_quantity=2, max_quantity=5, probability=p(0.75, 0.22)},
|
|
{item_id=16202, min_quantity=1, max_quantity=2, probability=p(0.2, 0.75)},
|
|
{item_id=14343, min_quantity=1, max_quantity=1, probability=p(0.05, 0.03)},
|
|
}
|
|
elseif level <= 55 then
|
|
return {
|
|
{item_id=16204, min_quantity=1, max_quantity=2, probability=p(0.75, 0.22)},
|
|
{item_id=16203, min_quantity=1, max_quantity=2, probability=p(0.2, 0.75)},
|
|
{item_id=14344, min_quantity=1, max_quantity=1, probability=p(0.05, 0.03)},
|
|
}
|
|
elseif level <= 60 then
|
|
return {
|
|
{item_id=16204, min_quantity=2, max_quantity=5, probability=p(0.75, 0.22)},
|
|
{item_id=16203, min_quantity=2, max_quantity=3, probability=p(0.2, 0.75)},
|
|
{item_id=14344, min_quantity=1, max_quantity=1, probability=p(0.05, 0.03)},
|
|
}
|
|
end
|
|
elseif quality == RARE then
|
|
if level <= 20 then
|
|
return {{item_id=10978, min_quantity=1, max_quantity=1, probability=1}}
|
|
elseif level <= 25 then
|
|
return {{item_id=11084, min_quantity=1, max_quantity=1, probability=1}}
|
|
elseif level <= 30 then
|
|
return {{item_id=11138, min_quantity=1, max_quantity=1, probability=1}}
|
|
elseif level <= 35 then
|
|
return {{item_id=11139, min_quantity=1, max_quantity=1, probability=1}}
|
|
elseif level <= 40 then
|
|
return {{item_id=11177, min_quantity=1, max_quantity=1, probability=1}}
|
|
elseif level <= 45 then
|
|
return {{item_id=11178, min_quantity=1, max_quantity=1, probability=1}}
|
|
elseif level <= 50 then
|
|
return {{item_id=14343, min_quantity=1, max_quantity=1, probability=1}}
|
|
elseif level <= 55 then
|
|
return {{item_id=14344, min_quantity=1, max_quantity=1, probability=0.995}, {item_id=20725, min_quantity=1, max_quantity=1, probability=0.005}}
|
|
elseif level <= 60 then
|
|
return {{item_id=14344, min_quantity=1, max_quantity=1, probability=0.995}, {item_id=20725, min_quantity=1, max_quantity=1, probability=0.005}}
|
|
end
|
|
elseif quality == EPIC then
|
|
if level <= 40 then
|
|
return {{item_id=11177, min_quantity=2, max_quantity=4, probability=1}}
|
|
elseif level <= 45 then
|
|
return {{item_id=11178, min_quantity=2, max_quantity=4, probability=1}}
|
|
elseif level <= 50 then
|
|
return {{item_id=14343, min_quantity=2, max_quantity=4, probability=1}}
|
|
elseif level <= 55 then
|
|
return {{item_id=20725, min_quantity=1, max_quantity=1, probability=1}}
|
|
elseif level <= 60 then
|
|
return {{item_id=20725, min_quantity=1, max_quantity=2, probability=1}}
|
|
end
|
|
end
|
|
return t
|
|
end |