Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rewrite scaling and stat mod line conversion to export more stuff #173

Draft
wants to merge 5 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 51 additions & 51 deletions src/Data/ModCharm.lua

Large diffs are not rendered by default.

250 changes: 125 additions & 125 deletions src/Data/ModCorrupted.lua

Large diffs are not rendered by default.

156 changes: 78 additions & 78 deletions src/Data/ModFlask.lua

Large diffs are not rendered by default.

2,930 changes: 1,465 additions & 1,465 deletions src/Data/ModItem.lua

Large diffs are not rendered by default.

7,360 changes: 3,680 additions & 3,680 deletions src/Data/ModItemExlusive.lua

Large diffs are not rendered by default.

648 changes: 324 additions & 324 deletions src/Data/ModJewel.lua

Large diffs are not rendered by default.

39,808 changes: 39,808 additions & 0 deletions src/Data/ModLineStats.lua

Large diffs are not rendered by default.

13,135 changes: 0 additions & 13,135 deletions src/Data/ModScalability.lua

This file was deleted.

74 changes: 74 additions & 0 deletions src/Export/Scripts/modLineStats.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
if not loadStatFile then
dofile("statdesc.lua")
end
loadStatFile("stat_descriptions.csd")

local out = io.open("../Data/ModLineStats.lua", "w")
out:write('-- This file is automatically generated, do not edit!\n')
out:write('-- Item data (c) Grinding Gear Games\n\nreturn {\n')
local statRepresentations = describeModLineStats("stat_descriptions.csd")
local modLines = { }
for modLine, _ in pairs(statRepresentations) do
table.insert(modLines, modLine)
end
table.sort(modLines)
for _, modLine in ipairs(modLines) do
out:write('\t["', modLine, '"] = {\n')
for i, statRepresentation in ipairs(statRepresentations[modLine]) do
out:write('\t\t{ ')
out:write('"', table.concat(statRepresentation, '", "'), '", ')
if #statRepresentation.subsituions > 0 then
out:write('subsituions = { ', table.concat(statRepresentation.subsituions, ', '), ' }, ')
end
if #statRepresentation.hasSign > 0 then
out:write('hasSign = { ', table.concat(statRepresentation.hasSign, ', '), ' }, ')
end
if next(statRepresentation.values) then
out:write('values = { ')
for i, value in pairs(statRepresentation.values) do
out:write('[',i,'] = ',value, ', ')
end
out:write('}, ')
end
if next(statRepresentation.formats) then
out:write('formats = { ')
if statRepresentation.formats.general then
out:write('general = { "', table.concat(statRepresentation.formats.general, '", "'), '" }, ')
statRepresentation.formats.general = nil
end
for i, statFormats in pairs(statRepresentation.formats) do
out:write('[',i,'] = { "', table.concat(statFormats, '", "'), '" }, ')
end
out:write('}, ')
end
out:write('order = ', statRepresentation.order, ', ')
-- can't use concat with booleans
if #statRepresentation.isLocal > 0 then
out:write('isLocal = { ')
for i, v in ipairs(statRepresentation.isLocal) do
out:write(tostring(v))
if i < #statRepresentation.isLocal then
out:write(', ')
end
end
out:write(' }, ')
end
if #statRepresentation.isScalable > 0 then
out:write('isScalable = { ')
for i, v in ipairs(statRepresentation.isScalable) do
out:write(tostring(v))
if i < #statRepresentation.isScalable then
out:write(', ')
end
end
out:write(' }, ')
end
out:write("},\n")
end
out:write("\t},\n")
end

out:write('}')
out:close()

print("ModLine stats exported.")
37 changes: 0 additions & 37 deletions src/Export/Scripts/modScalability.lua

This file was deleted.

30 changes: 0 additions & 30 deletions src/Export/Scripts/mods.lua
Original file line number Diff line number Diff line change
Expand Up @@ -172,36 +172,6 @@ local function writeMods(outName, condFunc)
out:write('nodeType = ', mod.NodeType, ', ')
end

if mod.Stat5 and mod.Stat4 and mod.Stat3 and mod.Stat2 then
local part_1 = intToBytes(mod.Stat1.Hash)
local part_2 = intToBytes(mod.Stat2.Hash)
local part_3 = intToBytes(mod.Stat3.Hash)
local part_4 = intToBytes(mod.Stat4.Hash)
local part_5 = intToBytes(mod.Stat5.Hash)
local trade_hash = murmurHash2(part_1..part_2..part_3..part_4..part_5, 0x02312233)
out:write('tradeHash = ', trade_hash, ', ')
elseif mod.Stat4 and mod.Stat3 and mod.Stat2 then
local part_1 = intToBytes(mod.Stat1.Hash)
local part_2 = intToBytes(mod.Stat2.Hash)
local part_3 = intToBytes(mod.Stat3.Hash)
local part_4 = intToBytes(mod.Stat4.Hash)
local trade_hash = murmurHash2(part_1..part_2..part_3..part_4, 0x02312233)
out:write('tradeHash = ', trade_hash, ', ')
elseif mod.Stat3 and mod.Stat2 then
local part_1 = intToBytes(mod.Stat1.Hash)
local part_2 = intToBytes(mod.Stat2.Hash)
local part_3 = intToBytes(mod.Stat3.Hash)
local trade_hash = murmurHash2(part_1..part_2..part_3, 0x02312233)
out:write('tradeHash = ', trade_hash, ', ')
elseif mod.Stat2 then
local part_1 = intToBytes(mod.Stat1.Hash)
local part_2 = intToBytes(mod.Stat2.Hash)
local trade_hash = murmurHash2(part_1..part_2, 0x02312233)
out:write('tradeHash = ', trade_hash, ', ')
elseif mod.Stat1 then
local trade_hash = murmurHash2(intToBytes(mod.Stat1.Hash), 0x02312233)
out:write('tradeHash = ', trade_hash, ', ')
end
out:write('},\n')
else
print("Mod '"..mod.Id.."' has no stats")
Expand Down
113 changes: 94 additions & 19 deletions src/Export/statdesc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -407,41 +407,116 @@ function describeMod(mod)
out.modTags = describeModTags(mod.ImplicitTags)
return out, orders
end

function describeScalability(fileName)
function describeModLineStats(fileName)
local out = { }
local stats = dat("stats")
for stat, statDescription in pairs(statDescriptors[fileName]) do
local scalability = { }
local uniqueStatDescriptors = {}
for _, statDescription in pairs(statDescriptors[fileName]) do
uniqueStatDescriptors[statDescription] = true
end
for statDescription, _ in pairs(uniqueStatDescriptors) do
if statDescription.stats then
for i, stat in ipairs(statDescription.stats) do
table.insert(scalability, stats:GetRow("Id", stat).IsScalable)
local isLocal = { }
local isScalable = { }
for _, stat in ipairs(statDescription.stats) do
local stat = stats:GetRow("Id", stat)
table.insert(isScalable, stat.IsScalable)
table.insert(isLocal, stat.Local)
end
for _, wordings in ipairs(statDescription[1]) do
local wordingFormats = {}
local inOrderScalability = { }
local formats = {}
local subsituions = { }
local hasSign = { }
for _, format in ipairs(wordings) do
if type(format.v) == "number" then
if wordingFormats[tonumber(format.v)] then
table.insert(wordingFormats[tonumber(format.v)], format.k)
if formats[tonumber(format.v)] then
table.insert(formats[tonumber(format.v)], format.k)
else
formats[tonumber(format.v)] = { format.k }
end
else
if formats.general then
table.insert(formats.general, format.k)
else
wordingFormats[tonumber(format.v)] = { format.k }
formats.general = { format.k }
end
end
end
local strippedLine = wordings.text:gsub("[%+%-]?(%b{})", function(num)
local strippedLine = wordings.text:gsub("([%+%-]?)(%b{})", function(sign, num)
local statNum = (num:match("%d") or 0) + 1
table.insert(inOrderScalability, { isScalable = scalability[statNum], formats = wordingFormats[statNum] })
if sign == "+" or num:match("%+") then table.insert(hasSign, statNum) end
table.insert(subsituions, statNum)
return "#"
end)
if out[strippedLine] then -- we want to use the format with the least oddites in it. If their are less formats then that will be used instead.
for j, priorScalability in ipairs(out[strippedLine]) do
if (priorScalability.formats and #priorScalability.formats or 0) > (wordingFormats[j] and #wordingFormats[j] or 0) then
out[strippedLine][j] = inOrderScalability[j]
-- find values that are set and not present on the item.
local values = { }
for i, limit in ipairs(wordings.limit) do
local present
for _, statNum in ipairs(subsituions) do
if statNum == i then
present = true
end
end
if not present then
values[i] = { }
if limit[1] == "#" and limit[2] == "#" then
values[i].min = -math.huge
values[i].max = math.huge
elseif limit[1] == "#" then
values[i].min = -math.huge
values[i].max = limit[2]
elseif limit[2] == "#" then
values[i].min = limit[1]
values[i].max = math.huge
elseif limit[1] ~= "!" then
values[i].min = limit[1]
values[i].max = limit[2]
break -- won't get smaller
else
values[i] = nil
break
end
for _, wordings in ipairs(statDescription[1]) do
for j, limit in ipairs(wordings.limit) do
if i ~= j then
if limit[1] == "#" and type(limit[2]) == "number" then
if limit[2] > values[i].min and limit[2] < values[i].max then
values[i].min = limit[2] + 1
end
elseif type(limit[1]) == "number" and limit[2] == "#" then
if limit[1] > values[i].min and limit[1] < values[i].max then
values[i].max = limit[1] - 1
end
elseif type(limit[1]) == "number" and type(limit[2]) == "number" then
if limit[2] > values[i].min and limit[2] < values[i].max then
values[i].min = limit[2] + 1
end
if limit[1] > values[i].min and limit[1] < values[i].max then
values[i].max = limit[1] - 1
end
end
end
end
end
end
end
for i = 1, #values do
if values[i] then
if values[i].max == values[i].min then
values[i] = values[i].min
elseif values[i].min == -math.huge and values[i].max ~= math.huge then
values[i] = values[i].max
elseif values[i].min ~= -math.huge and values[i].max == math.huge then
values[i] = values[i].min
else
values[i] = nil
end
end
else -- no present
out[strippedLine] = inOrderScalability
end
if out[strippedLine] then
table.insert(out[strippedLine], { subsituions = subsituions, hasSign = hasSign, formats = formats, values = values, order = statDescription.order, isLocal = isLocal, isScalable = isScalable, unpack(statDescription.stats)})
else
out[strippedLine] = { { subsituions = subsituions, hasSign = hasSign, formats = formats, values = values, order = statDescription.order, isLocal = isLocal, isScalable = isScalable, unpack(statDescription.stats)} }
end
end
end
Expand Down
27 changes: 24 additions & 3 deletions src/Modules/ItemTools.lua
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ local function antonymFunc(num, word)
return antonym and (num.." "..antonym) or ("-"..num.." "..word)
end

-- Apply range value (0 to 1) to a modifier that has a range: "(x-x)" or "(x-x) to (x-x)"
function itemLib.applyRange(line, range, valueScalar, baseValueScalar)
-- takes a line and a given ranges and returns the given line with the values that refer to given stats and a string where these values have been replace by #, it will return nothing if it can find a valid match.
function itemLib.getStrippedLine(line, range)
-- stripLines down to # inplace of any number and store numbers inside values also remove all + signs are kept if value is positive
local values = { }
local strippedLine = line:gsub("([%+-]?)%((%-?%d+%.?%d*)%-(%-?%d+%.?%d*)%)", function(sign, min, max)
Expand Down Expand Up @@ -158,7 +158,13 @@ function itemLib.applyRange(line, range, valueScalar, baseValueScalar)
return
end

local scalableLine, scalableValues = findScalableLine(strippedLine, values)
return findScalableLine(strippedLine, values)
end


-- Apply range value (0 to 1) to a modifier that has a range: "(x-x)" or "(x-x) to (x-x)"
function itemLib.applyRange(line, range, valueScalar, baseValueScalar)
local scalableLine, scalableValues = itemLib.getStrippedLine(line, range)

if scalableLine then -- found scalability data
for i, scalability in ipairs(data.modScalability[scalableLine:gsub("+#", "#")]) do
Expand Down Expand Up @@ -335,6 +341,21 @@ function itemLib.formatModLine(modLine, dbMode)
return colorCode..line
end

function itemLib.calculateTradeHash(stats, nodeType)
local partial = ""
for _, stat in ipairs(stats) do
partial = partial..intToBytes(murmurHash2(stat, 0xC58F1A7B))
end
if nodeType then
if nodeType == 1 then
partial = partial..intToBytes(murmurHash2("local_jewel_mod_stats_added_to_small_passives", 0xC58F1A7B))
elseif nodeType == 2 then
partial = partial..intToBytes(murmurHash2("local_jewel_mod_stats_added_to_notable_passives", 0xC58F1A7B))
end
end
return murmurHash2(partial, 0x02312233)
end

itemLib.wiki = {
key = "F1",
openGem = function(gemData)
Expand Down
Loading