模块

Item

来自蒙纳多研究本部

此模块的文档可以在模块:Item/doc创建

local p = {}
local post = require("Module:RequestHelper").post
local getArgs = require("Module:Arguments").getArgs
local html = require("Module:Html")
local compress = html.compress
local addlink = html.addlink

local function itemName(data)
  local name = data.itemID.name
  if data.rankType > 0 then
    name = name .. data.rankType
  end
  return name
end

local function obtain(data)
  -- 获得方式
  local title = mw.title.getCurrentTitle()

  local drop
  do
    local header = {{label = "敌人", scope = "page"}, {label = "等级", scope = "Lv"}, {label = "地区", scope = "Map"}}
    if data.itemID.uni_flag == 0 then
      table.insert(header, {label = "插槽", scope = "slot"})
      drop = {}
      for i = 0, data.itemID.jwl_slot_max do
        local res =
          mw.smw.ask {
          "[[DropWpn::" .. title.text .. "[" .. i .. "] ]] OR [[DropEquip::" .. title.text .. "[" .. i .. "] ]]",
          "?lv",
          "?map",
          "mainlabel=page",
          "sort=id"
        }
        if res then
          for _, v in ipairs(res) do
            v.slot = i
            table.insert(drop, v)
          end
        end
      end
    else
      drop =
        mw.smw.ask {
        "[[DropUniWpn::" .. title.text .. " ]] OR [[DropUniEquip::" .. title.text .. " ]]",
        "?lv",
        "?map",
        "mainlabel=page",
        "sort=id"
      } or {}
    end

    if #drop > 0 then
      for i, _ in ipairs(drop) do
        if type(drop[i].Lv) == "table" then
          drop[i].Lv = table.concat(drop[i].Lv, "<br>")
        end
        if type(drop[i].Map) == "table" then
          drop[i].Map = table.concat(drop[i].Map, "<br>")
        elseif drop[i].Map == nil then
          drop[i].Map = ""
        end
      end

      drop =
        mw.ustring.format([[<div class="large-6 columns">%s</div>]], html.wikitable(header, drop, {class = "xbtable"}))
    else
      drop = ""
    end
  end

  local npc
  do
    local header = {{label = "NPC交换", scope = "page"}, {label = "地区", scope = "Area"}}
    if data.itemID.uni_flag == 0 then
      table.insert(header, {label = "插槽", scope = "slot"})
      npc = {}
      for i = 0, data.itemID.jwl_slot_max do
        local res =
          mw.smw.ask {
          "[[exchange5::" .. title.text .. "[" .. i .. "] ]] OR [[Present::" .. title.text .. "[" .. i .. "] ]]",
          "?Area",
          "mainlabel=page",
          "sort=id"
        }
        if res then
          for _, v in ipairs(res) do
            v.slot = i
            table.insert(npc, v)
          end
        end
      end
    else
      npc =
        mw.smw.ask {
        "[[exchange5::" .. title.text .. " ]] OR [[Present::" .. title.text .. " ]]",
        "?Area",
        "mainlabel=page",
        "sort=id"
      } or {}
    end

    if #npc > 0 then
      for i, _ in ipairs(npc) do
        if type(npc[i].Area) == "table" then
          npc[i].Area = table.concat(npc[i].Area, "<br>")
        elseif npc[i].Area == nil then
          npc[i].Area = ""
        end
      end
      npc =
        mw.ustring.format([[<div class="large-6 columns">%s</div>]], html.wikitable(header, npc, {class = "xbtable"}))
    else
      npc = ""
    end
  end

  local quest
  do
    local header = {{label = "任务报酬", scope = "page"}, {label = "NPC", scope = "Npc"}}
    if data.itemID.uni_flag == 0 then
      table.insert(header, {label = "插槽", scope = "slot"})
      quest = {}
      for i = 0, data.itemID.jwl_slot_max do
        local res =
          mw.smw.ask {
          "[[任务:+]][[Reward::" .. title.text .. "[" .. i .. "] ]]",
          "?Npc",
          "mainlabel=page",
          "sort=id"
        }
        if res then
          for _, v in ipairs(res) do
            v.slot = i
            table.insert(quest, v)
          end
        end
      end
    else
      quest =
        mw.smw.ask {
        "[[任务:+]][[Reward::" .. title.text .. " ]]",
        "?Npc",
        "mainlabel=page",
        "sort=id"
      } or {}
    end

    if #quest > 0 then
      for i, _ in ipairs(quest) do
        if type(quest[i].Npc) == "table" then
          quest[i].Npc = table.concat(quest[i].Npc, "<br>")
        elseif quest[i].Npc == nil then
          quest[i].Npc = ""
        end
      end
      quest =
        mw.ustring.format([[<div class="large-6 columns">%s</div>]], html.wikitable(header, quest, {class = "xbtable"}))
    else
      quest = ""
    end
  end

  local shop
  do
    local header = {{label = "商店", scope = "page"}}
    if data.itemID.uni_flag == 0 then
      table.insert(header, {label = "插槽", scope = "slot"})
      shop = {}
      for i = 0, data.itemID.jwl_slot_max do
        local res =
          mw.smw.ask {
          "[[Item::" .. title.text .. "[" .. i .. "] ]]",
          "mainlabel=page",
          "sort=id"
        }
        if res then
          for _, v in ipairs(res) do
            v.slot = i
            table.insert(shop, v)
          end
        end
      end
    else
      shop =
        mw.smw.ask {
        "[[Item::" .. title.text .. " ]]",
        "mainlabel=page",
        "sort=id"
      } or {}
    end

    if #shop > 0 then
      shop =
        mw.ustring.format([[<div class="large-6 columns">%s</div>]], html.wikitable(header, shop, {class = "xbtable"}))
    else
      shop = ""
    end
  end

  if #drop > 0 or #npc > 0 or #quest > 0 or #shop > 0 then
    return mw.ustring.format(
      [[
            %s
          <div class="row">
            %s %s %s %s
          </div>
        ]],
      html.h2("获得方式"),
      drop,
      npc,
      quest,
      shop
    )
  else
    return ""
  end
end

function p.weapon(frame, data)
  mw.smw.set {
    id = data.row_id,
    itemType = data.itemType,
    MinAttack = data.itemID.dmg_low,
    MaxAttack = data.itemID.dmg_hi,
    PhysicalDef = data.itemID.arm_phy,
    EtherDef = data.itemID.arm_eth,
    CriticalRate = data.itemID.att_lev,
    BlockRate = data.itemID.grd_rate
  }

  if data.itemID.pcid then
    mw.smw.set {
      pc = data.itemID.pcid.name,
      ["appearance/" .. data.itemID.pcid.row_id] = data.itemID.style and data.itemID.style.name or nil
    }
  end

  local wikitext = ""

  local info = data.comment

  local jwl = ""

  if data.itemID.uni_flag == 0 then
    jwl = data.itemID.jwl_slot_max
  else
    local jwlArr = {}
    for i = 1, 3 do
      local jwl_skill = data.itemID["jwl_skill" .. i]
      if jwl_skill then
        table.insert(jwlArr, jwl_skill.itemID.name .. jwl_skill.rankType .. " (" .. jwl_skill.percent .. "%)")
      end
    end
    jwl = jwl .. table.concat(jwlArr, "<br>")
  end
  mw.smw.set {jwl = jwl}

  info =
    info ..
    html.wikitable(
      {"物品分类", "装备角色", "最小攻击力", "最大攻击力", "物理防御", "以太防御", "暴击率", "格挡率", "插槽(最大数)", "造型"},
      {
        {
          data.itemType,
          data.itemID.pcid and data.itemID.pcid.name or "",
          data.itemID.dmg_low,
          data.itemID.dmg_hi,
          data.itemID.arm_phy,
          data.itemID.arm_eth,
          data.itemID.att_lev,
          data.itemID.grd_rate,
          jwl,
          data.itemID.style and data.itemID.style.name or ""
        }
      },
      {transpose = true, class = "xbtable"}
    )

  wikitext =
    wikitext ..
    mw.ustring.format(
      [[
      <div class="row">
        <div class="large-6 columns">%s</div>
      </div>
    ]],
      info
    )

  wikitext = wikitext .. obtain(data)

  return compress(wikitext)
end

function p.equip(frame, data)
  mw.smw.set {
    id = data.row_id,
    itemType = data.itemType,
    equipType = data.itemID.arm_type,
    PhysicalDef = data.itemID.arm_phy,
    EtherDef = data.itemID.arm_eth,
    Weight = data.itemID.eva_rate
  }

  local info = data.comment
  local jwl = ""
  if data.itemID.uni_flag == 0 then
    jwl = data.itemID.jwl_slot_max
  else
    local jwl_skill = data.itemID.jwl_skill1
    jwl = jwl .. jwl_skill.itemID.name .. jwl_skill.rankType .. " (" .. jwl_skill.percent .. "%)"
  end
  mw.smw.set {jwl = jwl}

  info =
    info ..
    html.wikitable(
      {"物品分类", "装备类别", "物理防御", "以太防御", "重量", "插槽(最大数)"},
      {
        {
          data.itemType,
          data.itemID.arm_type,
          data.itemID.arm_phy,
          data.itemID.arm_eth,
          data.itemID.eva_rate,
          jwl
        }
      },
      {transpose = true, class = "xbtable"}
    )

  local wikitext =
    mw.ustring.format(
    [[
      <div class="row">
        <div class="large-6 columns">%s</div>
      </div>
    ]],
    info
  )

  do
    local header = {}
    local body = {}
    for _, parts in pairs(data.itemID.pc) do
      if parts.style then
        table.insert(header, addlink(parts.pcid.name, "", "造型装备/" .. parts.pcid.name))
        table.insert(body, parts.style.name)
        mw.smw.set {["appearance/" .. parts.pcid.row_id] = parts.style.name}
      end
    end
    if #body > 0 then
      local fashion = html.wikitable(header, {body}, {transpose = true, class = "xbtable"})
      wikitext =
        wikitext ..
        mw.ustring.format(
          [[
          %s
        <div class="row">
          <div class="medium-6 columns">%s</div>
        </div>
      ]],
          html.h2("造型"),
          fashion
        )
    end
  end

  wikitext = wikitext .. obtain(data)

  return compress(wikitext)
end

function p.collection(frame, data)
  local title = mw.title.getCurrentTitle()
  local isMelia = "相连的未来" == mw.ustring.sub(tostring(title), 1, 5)
  local wikitext = ""

  local area = data.itemID.mapID and data.itemID.mapID.name or "其他"
  mw.smw.set {
    id = data.row_id,
    itemType = data.itemType,
    area = area,
    collectionType = data.itemID.type
  }

  local info = data.comment

  info =
    info ..
    html.wikitable(
      {"物品分类", "种类", "产地"},
      {
        {
          "收藏品",
          data.itemID.type,
          area
        }
      },
      {transpose = true, class = "xbtable"}
    )

  wikitext =
    wikitext ..
    mw.ustring.format(
      [[
      <div class="row">
        <div class="large-6 columns">%s</div>
      </div>
      ]],
      info
    )

  if not isMelia then
    wikitext = wikitext .. html.h2("礼物")
    wikitext =
      wikitext ..
      mw.ustring.format(
        [[
          <div class="row">
            <div class="large-6 columns">%s</div>
          </div>
        ]],
        html.wikitable(
          {"角色", "牵绊值"},
          {
            {"修尔克", data.itemID.FSplus1},
            {"莱恩", data.itemID.FSplus2},
            {"菲奥伦", data.itemID.FSplus3},
            {"丹邦", data.itemID.FSplus4},
            {"卡露娜", data.itemID.FSplus5},
            {"力奇", data.itemID.FSplus6},
            {"梅莉亚", data.itemID.FSplus7}
          },
          {class = "xbtable"}
        )
      )

    mw.smw.set {
      FSplus1 = data.itemID.FSplus1,
      FSplus2 = data.itemID.FSplus2,
      FSplus3 = data.itemID.FSplus3,
      FSplus4 = data.itemID.FSplus4,
      FSplus5 = data.itemID.FSplus5,
      FSplus6 = data.itemID.FSplus6,
      FSplus7 = data.itemID.FSplus7
    }
  end

  wikitext = wikitext .. obtain(data)

  if data.itemID.mapID then
    wikitext = wikitext .. html.h2("地图")
    wikitext =
      wikitext ..
      '<div class="xb1map-collection" data-map-name="' ..
        data.itemID.mapID.id_name .. '" data-highlight-collection="' .. mw.title.getCurrentTitle().text .. '" ></div>'

    local c6ExtraCollection = {
      1854,
      1863,
      1864,
      1868,
      1875,
      1876,
      1877,
      1880,
      1881,
      1882,
      1883,
      1884,
      1885,
      1895,
      1904,
      1905,
      1910,
      1913,
      1914,
      1915,
      1916,
      1920,
      1921,
      1922,
      1923,
      1926,
      1927,
      1933,
      1936,
      1941,
      1942,
      1951,
      1952,
      1953,
      1954,
      1955,
      1956,
      1957,
      1958,
      1959,
      1968,
      1975,
      1980,
      1986,
      1990,
      1991,
      1992,
      2003,
      2008,
      2021,
      2022,
      2023,
      2024,
      2025,
      2026,
      2027,
      2028,
      2029,
      2036,
      2046,
      2055,
      2059,
      2060,
      2061,
      2062,
      2063,
      2064,
      2065,
      2066,
      2067,
      2071,
      2072,
      2083,
      2084,
      2085,
      2086,
      2087,
      2088,
      2091,
      2092,
      2093,
      2094,
      2095,
      2096,
      2097,
      2098,
      2099,
      2100,
      2105,
      2114,
      2119,
      2129,
      2134,
      2135,
      2136,
      2137,
      2138,
      2141,
      2142,
      2143,
      2144,
      2145,
      2146,
      2147,
      2149
    }

    for _, id in ipairs(c6ExtraCollection) do
      if id == data.row_id then
        wikitext =
          wikitext ..
          "<hr>" ..
            '<div class="xb1map-collection" data-map-name="ma0401" data-highlight-collection="' ..
              mw.title.getCurrentTitle().text .. '" ></div>'
      end
    end
  end

  return compress(wikitext)
end

function p.fetchDataById(id)
  return post("bdat_common.ITM_itemlist", id)
end

function p.main(frame)
  local args = getArgs(frame)
  local out = ""

  local id = args[1]
  local data = p.fetchDataById(id)

  -- mw.log(mw.text.jsonEncode(data, mw.text.JSON_PRETTY))

  if data.itemType == "武器" then
    out = out .. p.weapon(frame, data)
  elseif
    data.itemType == "头部防具" or data.itemType == "身体防具" or data.itemType == "手臂防具" or data.itemType == "腰部防具" or
      data.itemType == "腿部防具"
   then
    out = out .. p.equip(frame, data)
  elseif data.itemType == "收藏品" then
    out = out .. p.collection(frame, data)
  end

  return out
end

return p