-- Run this over the entire DoW/WA/DC Data\attrib folder
output_file = [[dps.html]]
-- ^^ change as needed ^^
-- 0. Set globals
armour_types = setmetatable({},{__index = [(t,k) t[k] = {} | rawget(t,k)]})
-- 1. Get a list of all files
function each_file(rgd)
local map_part = _G
local key = "filemap"
for _,part in ipairs(rgd.path:lower():after"\\attrib\\":split"\\")
map_part = map_part[key]
key = part
end
map_part[key] = rgd
end
-- 2. Iterate over the RaceBPs folder
function at_end()
print_info ""
print("
DoW DPS" .. the_css .. "")
for _,armour_type in ipairs(armour_types)
print("\t\n\t| " .. armour_type.nice_name .. " | " .. table.concat(armour_type.units,", ") .. " | \n\t
")
end
print "
"
return do_weapons()
end
-- 3. Iterate over the EBPs folder, getting the armour types of units
function do_ebps_folder(path)
if not path then return nil end
for filename,rgd in pairs_recursive(filemap_folder("ebps\\" .. path)) do
local armour_type = rgd:GET("GameData","type_ext","type_armour")
if armour_type then
local armour_table = armour_types[armour_type["$REF"]:lower()]
local neat_filename = rgd.name:beforelast".":gsub("_", " ")
local screen_name = rgd:GET("GameData","ui_ext","ui_info","screen_name_id")
if screen_name and (screen_name ~= "$0") then
neat_filename = UCS(screen_name) .. " (" .. neat_filename .. ")"
end
table.insert(armour_table, neat_filename)
end
end
end
-- 4. Iterate over the weapons folder
function do_weapons()
local header_row_n = 23
local weapons = {}
for filename,rgd in pairs_recursive(filemap.weapon) do
table.insert(weapons, rgd)
end
table.sort(weapons, [(a,b) | a.path < b.path ])
for _,rgd in ipairs(weapons) do
local armour_damage = rgd:GET("GameData","area_effect","weapon_damage","armour_damage")
if armour_damage then
local weapon = {}
weapon.reload_time = rgd.GameData.reload_time
if weapon.reload_time and weapon.reload_time > 0.0001 then
weapon.accuracy = rgd.GameData.accuracy
weapon.min_damage = armour_damage.min_damage_value
weapon.damage = (armour_damage.max_damage + armour_damage.min_damage) / 2
weapon.armour_piercing = armour_damage.armour_piercing
weapon.ap = {}
for key,ap_entry in armour_damage.armour_piercing_types do
if key ~= "$REF" then
weapon.ap[ap_entry.armour_type["$REF"]:lower()] = ap_entry.armour_piercing_value
end
end
for key,armour_type in ipairs(armour_types) do
local apval = math.clamp(weapon.ap[armour_type.name:lower()] or weapon.armour_piercing, 0, 100) / 100
local damage = weapon.damage * apval
if weapon.min_damage > damage then damage = weapon.min_damage end
weapon.ap[key] = string.format("%.3f",(damage * weapon.accuracy) / weapon.reload_time)
end
-- Print
header_row_n = header_row_n + 1
if header_row_n == 24 then
header_row_n = 0
print("\t\n\t| File | " .. table.concat(armour_type_names, " | ") .. " | \n\t
")
end
local td = (((header_row_n % 2) == 1) and "") or " | "
print("\t | \n\t" .. td .. rgd.name .. " " .. td .. table.concat(weapon.ap, " " .. td) .. " \n\t
")
end
end
end
print "
"
filemap = nil
if print_file
print_file:close()
end
print_info "\n"
end
-- Util: output
print_info = print
print_file = io.open(output_file, "w")
if print_file then
print = [ | print_file:write(...,"\n") ]
else
print("\n")
end
-- Util: filemap
function filemap_autotable(t,k)
if filemap_autotable
t[k] = setmetatable({}, {__index = filemap_autotable})
return t[k]
end
end
filemap_autotable(_G, "filemap")
function filemap_folder(path)
local map_part = filemap
for k,part in ipairs(path:lower():split"[/\\]")
map_part = map_part[part]
end
return map_part
end
-- Util: tables
function pairs_recursive(t)
| [ (state, v1)
local k,v = next(state[#state], v1)
local f = [
if type(v) == "table"
state[#state] = {state[#state], k}
state[1+#state] = v
k,v = next(state[#state])
| 1
elseif type(v) == "nil"
state[#state] = nil
if not state[#state] | nil end
v1 = state[#state][2]
state[#state] = state[#state][1]
k,v = next(state[#state], v1)
| 1
end ]
while f() end
| k,v
], {t}
end
-- Util : css
the_css = [==[
]==]