模块:Salvage

来自乐园数据管理室
ヒカリ​(留言 | 贡献)2019年4月3日 (三) 17:41的版本 (创建页面,内容为“local p = {} local loadJson = require("Module:JSON").loadJson function p.getDataByGmkId(gmkId) return loadJson("SalvagePoint/" .. gmkId) end function p.parseSalv…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

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

local p = {}
local loadJson = require("Module:JSON").loadJson

function p.getDataByGmkId(gmkId)
  return loadJson("SalvagePoint/" .. gmkId)
end

function p.parseSalvageTable(SalvageTable)
  -- parse collection
  local collection = {}
  for ColleTableIndex = 1, 3 do
    local ColleTable = SalvageTable["ColleTable" .. ColleTableIndex]
    local ColleTablePercent = SalvageTable["ColleTablePercent" .. ColleTableIndex] / 100

    local collectionStaticPopTable = {}
    local collectionRandomPopTable = {}

    for itmIndex = 1, 8 do -- 单道具行
      if #ColleTable["itm" .. itmIndex .. "ID"] > 0 then
        local itemName = ColleTable["itm" .. itmIndex .. "ID"]
        local itemNum = ColleTable["itm" .. itmIndex .. "Num"]
        local itemPer = ColleTable["itm" .. itmIndex .. "Per"]

        local itemTitle = mw.title.new(itemName, "物品")
        local itemLink = "[[" .. itemTitle.fullText .. "|" .. itemTitle.text .. "]]"

        if tonumber(itemNum) > 0 then
          table.insert(collectionStaticPopTable, itemLink)
          mw.smw.set {["SalvagePop"] = itemTitle.fullText}
        end
        if tonumber(itemPer) > 0 then
          table.insert(collectionRandomPopTable, {itemLink, itemPer})
          mw.smw.set {["SalvagePop"] = itemTitle.fullText}
        end
      end
    end

    local randitmPopNum = {ColleTable["randitmPopMin"], ColleTable["randitmPopMax"]}
    if ColleTable["randitmPopMin"] == ColleTable["randitmPopMax"] then
      randitmPopNum = {ColleTable["randitmPopMin"]}
    end

    table.insert(
      collection,
      {
        ["colleTablePercent"] = ColleTablePercent,
        ["staticPop"] = collectionStaticPopTable,
        ["randomPop"] = collectionRandomPopTable,
        ["randitmPopNum"] = randitmPopNum
      }
    )
  end

  -- parse treasure
  local treasure = {}
  for TresureTableIndex = 1, 3 do
    local TresureTable = SalvageTable["TresureTable" .. TresureTableIndex]
    local TresureTablePercent = SalvageTable["TresureTablePercent" .. TresureTableIndex] / 100

    local treasureStaticPopTable = {}
    local treasureRandomPopTable = {}
    local treasureGold = {0}

    for itmIndex = 1, 8 do -- 单道具行
      if #TresureTable["itm" .. itmIndex .. "ID"] > 0 then
        local itemName = TresureTable["itm" .. itmIndex .. "ID"]
        local itemNum = TresureTable["itm" .. itmIndex .. "Num"]
        local itemPer = TresureTable["itm" .. itmIndex .. "Per"]

        local itemTitle = mw.title.new(itemName, "物品")
        local itemLink = "[[" .. itemTitle.fullText .. "|" .. itemTitle.text .. "]]"

        if tonumber(itemNum) > 0 then
          table.insert(treasureStaticPopTable, itemLink)
          mw.smw.set {["SalvagePop"] = itemTitle.fullText}
        end
        if tonumber(itemPer) > 0 then
          table.insert(treasureRandomPopTable, {itemLink, itemPer})
          mw.smw.set {["SalvagePop"] = itemTitle.fullText}
        end
        if tonumber(TresureTable["goldPopMin"]) > 0 and tonumber(TresureTable["goldMax"]) > 0 then
          treasureGold = {TresureTable["goldMin"], TresureTable["goldMax"]}
        end
      end
    end

    local tboxImage
    if TresureTable["RSC_ID"] == "4" then
      tboxImage = "[[文件:Mnu064 image 1.png|136px]]"
    elseif TresureTable["RSC_ID"] == "5" then
      tboxImage = "[[文件:Mnu064 image 2.png|136px]]"
    elseif TresureTable["RSC_ID"] == "6" then
      tboxImage = "[[文件:Mnu064 image 4.png|136px]]"
    else
      error("No valid RSC_ID")
    end

    table.insert(
      treasure,
      {
        ["treasureTablePercent"] = TresureTablePercent,
        ["staticPop"] = treasureStaticPopTable,
        ["randomPop"] = treasureRandomPopTable,
        ["randitmPopNum"] = TresureTable["randitmPopMin"] == TresureTable["randitmPopMax"] and
          {TresureTable["randitmPopMin"]} or
          {TresureTable["randitmPopMin"], TresureTable["randitmPopMax"]},
        ["tboxImage"] = tboxImage,
        ["treasureGold"] = treasureGold
      }
    )
  end

  -- enemy
  local enemy = {}
  for EnemyPopTableIndex = 1, 3 do
    local EnemyPopTable = SalvageTable["EnemyPopTable" .. EnemyPopTableIndex]
    local EnemyPopTablePercent = SalvageTable["EnemyPopTablePercent" .. EnemyPopTableIndex] / 100
    local enemyPop = {}

    if EnemyPopTablePercent > 0 then
      for eneIndex = 1, 4 do
        if #EnemyPopTable["ene" .. eneIndex .. "ID"] > 0 then
          local eneName = EnemyPopTable["ene" .. eneIndex .. "ID"]
          local eneLv = EnemyPopTable["ene" .. eneIndex .. "Lv"]
          local enePer = EnemyPopTable["ene" .. eneIndex .. "Per"]

          local eneTitle = mw.title.new(eneName, "敌人")
          local eneLink = "[[" .. eneTitle.fullText .. "|" .. eneTitle.text .. "]]"

          if tonumber(enePer) > 0 then
            table.insert(enemyPop, {eneLink, enePer})
            mw.smw.set {["SalvageEnemyPop"] = eneTitle.fullText}
          end
        end
      end

      table.insert(
        enemy,
        {
          ["EnemyPopTablePercent"] = EnemyPopTablePercent,
          ["enemyPop"] = enemyPop
        }
      )
    end
  end

  return {
    ["collection"] = collection,
    ["treasure"] = treasure,
    ["TresureBoxHit"] = SalvageTable["TresureBoxHit"] / 100,
    ["enemy"] = enemy,
    ["EnemyPopHit"] = SalvageTable["EnemyPopHit"] / 100
  }
end

function DisplayTable(SalvageTable)
  local tableBody = ""
  local result = p.parseSalvageTable(SalvageTable)

  -- collection
  for i, v in ipairs(result["collection"]) do
    local ColleTablePercent = v["colleTablePercent"]
    local StaticPop = table.concat(v["staticPop"], "<br>")
    local randitmPopNum = table.concat(v["randitmPopNum"], " ~ ")
    local RandomPop = {}
    for i, v in ipairs(v["randomPop"]) do
      table.insert(RandomPop, table.concat(v, " ") .. "%")
    end
    RandomPop = table.concat(RandomPop, "<br>")

    tableBody =
      tableBody .. mw.ustring.format([[|-
|%s%%
|%s
|%s
|%s
]], ColleTablePercent, StaticPop, randitmPopNum, RandomPop)
  end

  local collectionTable =
    mw.ustring.format([[{| class="wikitable"
|+
! colspan="4" |收藏道具
|+
!概率
!必出道具
! colspan="2" |额外道具
%s|}
]], tableBody)

  -- treasure
  tableBody = ""
  for i, v in ipairs(result["treasure"]) do
    local StaticPop = table.concat(v["staticPop"], "<br>")
    local randitmPopNum = table.concat(v["randitmPopNum"], " ~ ")
    local treasureGold = table.concat(v["treasureGold"], " ~ ")
    local RandomPop = {}
    for i, v in ipairs(v["randomPop"]) do
      table.insert(RandomPop, table.concat(v, " ") .. "%")
    end
    RandomPop = table.concat(RandomPop, "<br>")

    tableBody =
      tableBody ..
      mw.ustring.format(
        [[|-
|%s%%
|%s
|%s
|%s
|%s
|%s
]],
        v["treasureTablePercent"],
        v["tboxImage"],
        treasureGold,
        StaticPop,
        randitmPopNum,
        RandomPop
      )
  end

  local treasureTable =
    mw.ustring.format(
    [[{| class="wikitable"
|+
! colspan="6" |宝藏 基础出现率:%s%%
|+
!概率
!宝箱类型
!金币
!必出道具
! colspan="2" |额外道具
%s|}
]],
    result["TresureBoxHit"],
    tableBody
  )

  -- enemy
  local enemyTable = ""
  if #result["enemy"] > 0 then
    tableBody = ""
    for i, v in ipairs(result["enemy"]) do
      local EnemyPopTablePercent = v["EnemyPopTablePercent"]
      local enemyPop = {}
      for i, v in ipairs(v["enemyPop"]) do
        table.insert(enemyPop, table.concat(v, " ") .. "%")
      end
      enemyPop = table.concat(enemyPop, "<br>")

      tableBody = tableBody .. mw.ustring.format([[|-
|%s%%
|%s
]], EnemyPopTablePercent, enemyPop)
    end

    enemyTable =
      mw.ustring.format(
      [[{| class="wikitable"
|+
! colspan="2" |敌人 基础出现率:%s%%
|+
!概率
!名称
%s|}
]],
      result["EnemyPopHit"],
      tableBody
    )
  end

  return '<div style="display:flex;flex-wrap:wrap;">\n' .. collectionTable .. enemyTable .. treasureTable .. "</div>\n"
end

function p.popTable(frame)
  local args = frame.args
  local data = p.getDataByGmkId(args[1])
  local output = ""

  -- 按键
  local button1 = data["BtnChallenge0"]["BtnType1"]
  local button2 = data["BtnChallenge1"]["BtnType1"]
  local button3 = data["BtnChallenge2"]["BtnType1"]

  if button1 == "Random" then
    output = output .. "按键:随机" .. "\n\n"
  else
    output = output .. "按键:" .. button1 .. button2 .. button3 .. "\n\n"
  end

  output = output .. "=== 普通气瓶 ===\n\n"
  output = output .. DisplayTable(data["SalvageTable1"])
  output = output .. "=== 白银气瓶 ===\n\n"
  output = output .. DisplayTable(data["SalvageTable2"])
  output = output .. "=== 黄金气瓶 ===\n\n"
  output = output .. DisplayTable(data["SalvageTable3"])
  output = output .. "=== 极品气瓶 ===\n\n"
  output = output .. DisplayTable(data["SalvageTable4"])

  if data["SalvageTable5"] ~= "" then
    output = output .. "=== 增幅气瓶 ===\n\n"
    output = output .. DisplayTable(data["SalvageTable5"])
  end
  return output
end

return p