模块

模块:Item

来自蒙纳多研究本部

Monado​(留言 | 贡献)2020年6月22日 (一) 19:39的版本 (MWBot)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

此模块的文档可以在模块: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

    mw.logObject(npc)

    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"
        }
        mw.logObject(res)
        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
      quest =
        mw.ustring.format([[<div class="large-6 columns">%s</div>]], html.wikitable(header, quest, {class = "xbtable"}))
    else
      quest = ""
    end
  end

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

  return out
end

return p