Module:WeaponsData: Difference between revisions

From MENACE Official Wiki
No edit summary
No edit summary
Line 138: Line 138:
     -- Find the weapon by name
     -- Find the weapon by name
     for _, weapon in ipairs(weaponsData) do
     for _, weapon in ipairs(weaponsData) do
         if weapon.Name == weaponName then
         if weapon.Title == weaponName then
             return formatWeaponRow(weapon)
             return formatWeaponRow(weapon)
         end
         end

Revision as of 06:01, 3 October 2025

Documentation for this module may be created at Module:WeaponsData/doc

---@class WeaponsData
local WeaponsData = {}

--region Dependencies

local JsonUtils = require("Module:JsonUtils")

--endregion

--region Private constants

local DATA_FILE = "Module:Data/Weapons.json"

--[[local SCHEMA = {
    NAME = "Name",
    SHORTNAME = "ShortName",
    DESCRIPTION = "Description",
    ICON = "Icon",
    TAGS = "Tags",
    RARITY = "Rarity",
    TRADEVALUE = "TradeValue",
    APEN = "IconEquipment",
    SUPPRESS = "IconSkillBar",
    NUM_HITS = "DeployCosts",
    ROF = "SkillsGranted",
    COST = "MinRange",
    IDEALRANGE = "IdealRange",
    IMAGE = "MaxRange",
    ACCURACYBONUS = "AccuracyBonus",
    ACCURACYDROPOFF = "AccuracyDropoff",
    DAMAGE = "Damage",
    DAMAGEDROPOFF = "DamageDropoff",
    DAMAGEPCTCURRENTHITPOINTS = "DamagePctCurrentHitpoints",
    DAMAGEPCTCURRENTHITPOINTSMIN = "DamagePctCurrentHitpointsMin",
    DAMAGEPCTMAXHITPOINTS = "DamagePctMaxHitpoints",
    DAMAGEPCTMAXHITPOINTSMIN = "DamagePctMaxHitpointsMin",
    ARMORPENETRATION = "ArmorPenetration",
    ARMORPENETRATIONDROPOFF = "ArmorPenetrationDropoff",
    DAMAGETOARMORDURABILITY = "DamageToArmorDurability",
    DAMAGETOARMORDURABILITYMULT = "DamageToArmorDurabilityMult",
    DAMAGETOARMORDURABILITY_DROPOFF = "DamageToArmorDurabilityDropoff",
    DAMAGETOARMORDURABILITYDROPOFFMULT = "DamageToArmorDurabilityDropoffMult",
    SUPPRESSION = "Suppression"
}]]

--endregion

--region Private member variables

local weaponsData

--endregion

--region Private methods

local function loadData()
    if not weaponsData then
        weaponsData = JsonUtils.convertJSONToLuaTable(DATA_FILE)
    end
end

--[[local function getTitle(NAME)
    loadDate()
    return SCHEMA.TITLE
end]]

---Formats a single weapon as a wiki table row
---@param weapon table The weapon data
---@return string The formatted table row
local function formatWeaponRow(weapon)
    local row = {}
    -- Add table row start
    table.insert(row, "|-")
    -- Name/Title with link
    table.insert(row, string.format("| [[%s]]", weapon.Title or ""))

    -- ShortName
    table.insert(row, string.format("| %s", weapon.ShortName or ""))

    -- Range (using MaxRange)
    table.insert(row, string.format("| %d", weapon.MaxRange or 0))

    -- Damage
    table.insert(row, string.format("| %.1f", weapon.Damage or 0))

    -- Armor Damage (DamageToArmorDurability)
    table.insert(row, string.format("| %.1f", weapon.DamageToArmorDurability or 0))

    -- Armor Penetration
    table.insert(row, string.format("| %.1f", weapon.ArmorPenetration or 0))

    -- Suppression
    table.insert(row, string.format("| %.1f", weapon.Suppression or 0))

    -- Trade Value
    table.insert(row, string.format("| %d", weapon.TradeValue or 0))

    -- Accuracy Modifier (AccuracyBonus)
    table.insert(row, string.format("| %.1f", weapon.AccuracyBonus or 0))

    return table.concat(row, "\n")
end


--endregion

--region Public Methods
---@public
---gets a table of all weapons
---
---@return table of weapons
function WeaponsData.getAllWeapons()
    loadData()

    local weaponNames = {}
    for name, _ in pairs(weaponsData) do
        table.insert(weaponNames, name)
    end
    return weaponNames
end

---@public
---prints a row of the table given a name
---
---@return string of table row
function WeaponsData.printRow(weapon)
    local weaponNames = WeaponsData.getAllWeapons()
    local tableRow = weaponNames[weapon[SCHEMA.TITLE]] .. "|" .. weaponNames[weapon[SCHEMA.SHORTNAME]] .. "|" .. weaponsNames[weapon[SCHEMA.DAMAGE]] .. "|" .. weaponNames[weapon[SCHEMA.TRADEVALUE]]
    return tableRow
end

---Returns a wiki table row for a weapon by name
---@param weaponName string The name identifier of the weapon
---@return string The formatted wiki table row
function WeaponsData.getWeaponRow(weaponName)
    loadData()

    -- Find the weapon by name
    for _, weapon in ipairs(weaponsData) do
        if weapon.Title == weaponName then
            return formatWeaponRow(weapon)
        end
    end

    return "Weapon not found: " .. (weaponName or "nil")
end

--endregion

return WeaponsData