Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:Weapon/opis
--
local weapon_data = mw.loadData("Module:Weapon/data")
local icon = require("Module:I")
local utils = require("Module:Utils")
local module_export = {}
local physical_damage_types = { "impact", "puncture", "slash" }
local elemental_damage_types = { "" }
local weapon_names = utils.table_keys(weapon_data["weapons"])
local function get_weapon_data(weapon_name)
return weapon_data["weapons"][weapon_name] or {}
end
local function is_weapon(name)
return utils.contains(weapon_names, name)
end
local function is_melee(weapon_name)
local weap_data = get_weapon_data(weapon_name)
return weap_data.typ == "Broń Biała Archwing" or weap_data.typ == "Broń Biała"
end
local function is_physical(val)
return utils.contains(physical_damage_types, val)
end
local function is_elemental(val)
return not is_physical(val)
end
local function get_damage_bias(damage)
local max_damage = 0
local max_damage_type = nil
local total_damage = utils.sum(utils.unpack_any_table(damage))
for k, v in pairs(damage) do
if(max_damage < v) then
max_damage = v
max_damage_type = k
end
end
return max_damage / total_damage, max_damage_type
end
local function get_elemental_type(weapon_name, attack_type)
local data = get_weapon_data(weapon_name)[attack_type .. "_attack"]
if(data == nil or data["damage"] == nil) then return nil end
for k, v in pairs(data["damage"]) do
if is_elemental(k) then
return k
end
end
return nil -- no elemental damage
end
local getters = {
-- Image
["image"] = function(weapon_name)
local image = get_weapon_data(weapon_name)["image"]
return image or "Panel.png"
end,
-- Headers
["header"] = function(weapon_name, type)
return (get_weapon_data(weapon_name)[type .. "_attack"] or {})["header"]
end,
-- Fields
["mastery"] = function(weapon_name)
local mastery = get_weapon_data(weapon_name)["mastery"]
return mastery or 0
end,
["category"] = function(weapon_name)
return get_weapon_data(weapon_name)["category"]
end,
["type"] = function(weapon_name)
return get_weapon_data(weapon_name)["type"]
end,
["trigger"] = function(weapon_name)
return get_weapon_data(weapon_name)["trigger"]
end,
["ammo_type"] = function(weapon_name)
return get_weapon_data(weapon_name)["ammo_type"]
end,
["projectile_speed"] = function(weapon_name)
local bullet_speed = get_weapon_data(weapon_name)["normal_attack"]["projectile_speed"]
if(bullet_speed == "Hit-Scan") then
return bullet_speed
else
return bullet_speed and bullet_speed .. "m/s" -- Ensure bullet_speed is not nil
end
end,
["range"] = function(weapon_name)
local range = get_weapon_data(weapon_name)["range"]
return range and range .. "m"
end,
["noise_level"] = function(weapon_name)
return get_weapon_data(weapon_name)["noise_level"]
end,
["fire_rate"] = function(weapon_name)
local weap_data = get_weapon_data(weapon_name)
if(is_melee(weapon_name)) then
return weap_data["normal_attack"]["fire_rate"]
else
return weap_data["normal_attack"]["fire_rate"] .. " pocisków na sekundę"
end
end,
["multishot"] = function(weapon_name)
local pellet_count = get_weapon_data(weapon_name)["normal_attack"]["multishot"]
return pellet_count and pellet_count .. " odłamków" -- Ensure pellet_count is not nil
end,
["accuracy"] = function(weapon_name)
return get_weapon_data(weapon_name)["normal_attack"]["accuracy"]
end,
["zoom"] = function(weapon_name)
local zoom = get_weapon_data(weapon_name)["zoom"]
if(type(zoom) == "table") then
return table.concat(zoom, '<br>')
else
return get_weapon_data(weapon_name)["zoom"]
end
end,
["mag_capacity"] = function(weapon_name)
local mag = get_weapon_data(weapon_name)["mag_capacity"]
return mag and mag .. " pocisków" -- Ensure mag is not nil
end,
["max_ammo"] = function(weapon_name)
local max_ammo = get_weapon_data(weapon_name)["max_ammo"]
return max_ammo and max_ammo .. " pocisków" -- Ensure max_ammo is not nil
end,
["reload"] = function(weapon_name)
local reload = get_weapon_data(weapon_name)["normal_attack"]["reload"]
return reload and reload .. "s" -- Ensure reload is not nil
end,
["spool"] = function(weapon_name)
return get_weapon_data(weapon_name)["spool"];
end,
["damage"] = function(weapon_name, attack_type)
local damage = (get_weapon_data(weapon_name)[attack_type .. "_attack"] or {})["damage"]
if(damage == nil) then return nil end
local damage_bias, damage_bias_attack_type = get_damage_bias(damage)
return utils.sum(utils.unpack_any_table(damage)) .. " (" .. icon.proc(utils.proc_to_polish(damage_bias_attack_type)) .. " " .. utils.to_percent(damage_bias) ..")"
end,
["elemental_type"] = get_elemental_type,
["elemental"] = function(weapon_name, attack_type)
local data = get_weapon_data(weapon_name)[attack_type .. "_attack"] or {}
local element_type = get_elemental_type(weapon_name, attack_type)
return element_type and data["damage"][element_type]
end,
["slash"] = function(weapon_name, attack_type)
local data = get_weapon_data(weapon_name)[attack_type .. "_attack"] or {}
return data["damage"]["slash"]
end,
["impact"] = function(weapon_name, attack_type)
local data = get_weapon_data(weapon_name)[attack_type .. "_attack"] or {}
return data["damage"]["impact"]
end,
["puncture"] = function(weapon_name, attack_type)
local data = get_weapon_data(weapon_name)[attack_type .. "_attack"] or {}
return data["damage"]["puncture"]
end,
}
local function get_value(weapon_name, field_name)
return getters[field_name:lower()](weapon_name)
end
local function get_attack_value(weapon_name, attack_type, field_name)
return getters[field_name:lower()](weapon_name, attack_type:lower())
end
function module_export.get_value(frame)
-- Unpack params
local weapon_name = frame.args[1]
local field_name = frame.args[2]
local attack_field_name = frame.args[3]
if(weapon_name == nil or not is_weapon(weapon_name)) then
return nil
end
-- Offload work to local func
if(attack_field_name ~= nil and attack_field_name ~= "") then
return get_attack_value(weapon_name, field_name, attack_field_name)
else
return get_value(weapon_name, field_name);
end
end
function module_export.is_melee(frame)
return is_melee(frame.args[1])
end
function module_export.zoom(frame)
local weapon_name = frame.args[1]
local zoom = get_weapon_data(weapon_name)["zoom"]
return zoom[1] .. "<br>" .. zoom[2]
-- if(type(zoom) == "table") then
-- return table.concat(zoom, '<br>')
-- else
-- return get_weapon_data(weapon_name)["zoom"]
-- end
end
return module_export