模块

Quest

来自蒙纳多研究本部

此模块的文档可以在模块:Quest/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 getArgs = require("Module:Arguments").getArgs

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

local function slot(data)
  if data.itemID.uni_flag == 0 then
    return "[" .. data.itemID.jwl_slot .. "]"
  end
  return ""
end

function p.template(frame, data)
  local questInfo = ""
  do -- 任务内容
    local infoReport =
      #data.menu.info_report > 0 and [[<div class="light-box">]] .. data.menu.info_report .. [[</div>]] or ""

    local succ = {}
    for _, v in ipairs({"A1", "A2", "A3", "A4", "B1", "B2", "B3", "B4"}) do
      succ[v] = ""
      if data["type_succ_" .. v] == "KillEnemy" then
        succ[v] =
          mw.ustring.format(
          [[<div style="text-align: right;">%s 0/%s</div>]],
          addlink(data["cnd_succ_" .. v].name, "敌人"),
          data["num_succ_" .. v]
        )
      elseif data["type_succ_" .. v] == "GetItem" then
        succ[v] =
          mw.ustring.format(
          [[<div style="text-align: right;">%s 0/%s</div>]],
          addlink(itemName(data["cnd_succ_" .. v]), "物品"),
          data["num_succ_" .. v]
        )
      elseif data["type_succ_" .. v] == "TalkNpc" then
        succ[v] =
          data["cnd_succ_" .. v] and
          mw.ustring.format(
            [[<div style="text-align: right;">与 %s 对话</div>]],
            addlink(data["cnd_succ_" .. v].name, "NPC")
          ) or
          ""
      end
    end

    local questProg = {A = "", B = ""}

    for k, _ in pairs(questProg) do
      for i = 1, 3 do
        if #data.menu["info_succ_" .. k .. i] > 0 then
          questProg[k] =
            questProg[k] ..
            '<div class="light-box">' .. data.menu["info_succ_" .. k .. i] .. succ[k .. (i + 1)] .. "</div>"
        end
      end
    end

    if #data.menu.info_end_B > 0 then
      questInfo =
        mw.ustring.format(
        [[<ul class="tabs" data-tab>
          <li class="tab-title active">A</li>
          <li class="tab-title">B</li>
        </ul>
        <div class="tabs-content">
          <div class="content active" id="prog-a">
            <div class="light-box">%s</div>
            %s
            %s
            <div class="light-box">%s</div>
          </div>
          <div class="content" id="prog-b">
            <div class="light-box">%s</div>
            %s
            %s
            <div class="light-box">%s</div>
          </div>
        </div>]],
        data.menu.info_prog .. succ.A1,
        questProg.A,
        infoReport,
        data.menu.info_end_A,
        data.menu.info_prog .. succ.B1,
        questProg.B,
        infoReport,
        data.menu.info_end_B
      )
    else
      questInfo =
        mw.ustring.format(
        [[<div>
            <div class="light-box">%s</div>
            %s
            %s
            <div class="light-box">%s</div>
          </div>]],
        data.menu.info_prog .. succ.A1,
        questProg.A,
        infoReport,
        data.menu.info_end_A
      )
    end
  end

  local reward_A =
    data.reward_A1 and
    mw.ustring.format(
      [[<div class="medium-6 columns">
        <div class="light-box">
          <div style="text-align: center">A</div>
            <hr />
            <div style="padding: 0 8px">%s</div>
            <hr />
            <div style="padding: 0 8px">%s</div>
            <hr />
            <div style="padding: 0 8px">%s</div>
          </div>
        </div>]],
      data.reward_A1 and addlink(itemName(data.reward_A1), "物品") .. slot(data.reward_A1) or "------",
      data.reward_A2 and addlink(itemName(data.reward_A2), "物品") .. slot(data.reward_A2) or "&nbsp;",
      data.reward_A3 and addlink(itemName(data.reward_A3), "物品") .. slot(data.reward_A3) or "&nbsp;"
    ) or
    ""

  local reward_B =
    data.reward_B1 and
    mw.ustring.format(
      [[<div class="medium-6 columns">
          <div class="light-box">
            <div style="text-align: center">B</div>
              <hr />
              <div style="padding: 0 8px">%s</div>
              <hr />
              <div style="padding: 0 8px">%s</div>
              <hr />
              <div style="padding: 0 8px">%s</div>
            </div>
          </div>]],
      data.reward_B1 and addlink(itemName(data.reward_B1), "物品") .. slot(data.reward_B1) or "------",
      data.reward_B2 and addlink(itemName(data.reward_B2), "物品") .. slot(data.reward_B1) or "&nbsp;",
      data.reward_B3 and addlink(itemName(data.reward_B3), "物品") .. slot(data.reward_B1) or "&nbsp;"
    ) or
    ""

  local otherCondition = ""
  if data.cnd_famous > 0 then
    otherCondition =
      otherCondition ..
      mw.ustring.format([[
        <hr /><div style="text-align: center;">评价值 %s 以上</div>
        ]], data.cnd_famous)
  end
  if data.npcmeetID1 then
    otherCondition =
      otherCondition ..
      mw.ustring.format(
        [[
        <hr /><div style="text-align: center;">牵绊图已登记 %s</div>
        ]],
        addlink(data.npcmeetID1.name, "NPC")
      )
  end
  if data.npcmeetID2 then
    otherCondition =
      otherCondition ..
      mw.ustring.format(
        [[
        <hr /><div style="text-align: center;">牵绊图已登记: %s</div>
        ]],
        addlink(data.npcmeetID2.name, "NPC")
      )
  end
  if data.cnd_questID then
    otherCondition =
      otherCondition ..
      mw.ustring.format(
        [[
        <hr /><div style="text-align: center;">前置任务: %s</div>
        ]],
        addlink(
          data.cnd_questID.title,
          "任务",
          data.cnd_questID.npc_id.rlt_lnd.mapID.name .. "/" .. data.cnd_questID.title
        )
      )
  end
  if data.flg_s > 0 then
    otherCondition =
      otherCondition .. mw.ustring.format([[<hr /><div style="text-align: center;">主线进度: %s</div>]], data.flg_s)
  end

  local npcName = ""
  if #data.npc_id.mob_name > 0 then
    npcName = data.npc_id.mob_name
  else
    npcName = addlink(data.npc_id.name, "NPC")
  end
  if data.npc_id.range_s ~= data.npc_id.range_e and npcName ~= "剧情任务" then
    npcName = npcName .. " " .. data.npc_id.range_s .. ":00 - " .. data.npc_id.range_e .. ":00"
  end

  local timeLimitQuest = ""
  if data.qst_genre == "限时任务" then
    timeLimitQuest = [[<div style="text-align: center;">限时任务</div><hr />]]
  end

  local wikitext =
    mw.ustring.format(
    [[
      <div class="row">
      <div class="large-6 columns">
        <div class="quest-box">
          <div class="dark-box">
            %s
            <div class="content" >
              %s
              <div style="text-align: center;">%s</div>
              <hr />
              <div style="text-align: center;">%s %s</div>
              <hr />
              <div>%s</div>
              %s
            </div>
          </div>
        </div>
        <div class="quest-box">
          <div class="dark-box">
            %s
            <div class="content">

                <div class="row">
                  <div class="medium-6 columns">
                    <div class="light-box">MONEY<div style="float:right">%s</div></div>
                    <div class="light-box">EXP<div style="float:right">%s</div></div>
                    <div class="light-box">评价<div style="float:right">%s</div></div>
                  </div>
                  %s
                  %s
                </div>

            </div>
          </div>
        </div>
      </div>
      <div class="large-6 columns">
        <div class="quest-box">
          <div class="dark-box">
            %s
            <div class="content">

              %s

            </div>
          </div>
        </div>
      </div>
    </div>
]],
    frame:expandTemplate {title = "QuestBox/title", args = {"委托条件"}},
    timeLimitQuest,
    npcName,
    addlink(data.npc_id.rlt_lnd.mapID.name, "任务"),
    data.npc_id.rlt_lnd.name,
    data.menu.purpose,
    otherCondition,
    frame:expandTemplate {title = "QuestBox/title", args = {"任务报酬"}},
    data.reward_money * 10 or "",
    data.reward_exp * 10 or "",
    data.up_famous_A or "",
    reward_A,
    reward_B,
    frame:expandTemplate {title = "QuestBox/title", args = {"任务内容"}},
    questInfo
  )

  return compress(wikitext)
end

function p.setSmw(data)
  mw.smw.set(
    {
      id = data.row_id,
      npc = #data.npc_id.mob_name == 0 and data.npc_id.name or data.npc_id.mob_name,
      money = data.reward_money * 10,
      exp = data.reward_exp * 10,
      famous = data.up_famous_A,
      genre = data.qst_genre
    }
  )

  for _, v in ipairs({"A1", "A2", "A3", "B1", "B2", "B3"}) do
    mw.smw.set({reward = data["reward_" .. v] and itemName(data["reward_" .. v]) .. slot(data["reward_" .. v])})
  end

  for _, v in ipairs({"A1", "A2", "A3", "A4", "B1", "B2", "B3", "B4"}) do
    if data["type_succ_" .. v] == "KillEnemy" then
      mw.smw.set({questEnemy = data["cnd_succ_" .. v].name})
    elseif data["type_succ_" .. v] == "GetItem" then
      mw.smw.set({questItem = itemName(data["cnd_succ_" .. v])})
    elseif data["type_succ_" .. v] == "TalkNpc" then
      mw.smw.set({questNpc = data["cnd_succ_" .. v] and data["cnd_succ_" .. v].name})
    end
  end
end

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

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

  for _, id in ipairs(args) do
    local data = p.fetchDataById(id)
    if args[2] then
      out = out .. html.h2(data.npc_id.name)
    end
    out = out .. p.template(frame, data)
    p.setSmw(data)
  end
  -- mw.log(mw.text.jsonEncode(data, mw.text.JSON_PRETTY))

  return out
end

return p