模块:Condition

来自乐园数据管理室
ヒカリ​(留言 | 贡献)2020年2月3日 (一) 01:03的版本 (MWBot)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

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

local p = {}
local QueryHelper = require("Module:Xb2QueryHelper")
local html = require("Module:Html")
local loadJson = require("Module:JSON").loadJson
local conditionType = require("Module:BdatEnums").conditionType
local Flag = require("Module:Flag")

local parser = {
  Scenario = function(subCondition)
    local data = subCondition.data
    -- 四个属性都存在,显示两个区间
    if data.ScenarioFlagMin > 0 and data.ScenarioFlagMax > 0 and data.NotScenarioMin > 0 and data.NotScenarioMax > 0 then
      return Flag.scenario(data.ScenarioFlagMin) ..
        " ~ " ..
          Flag.scenario(data.NotScenarioMin) ..
            ", " .. Flag.scenario(data.NotScenarioMax) .. " ~ " .. Flag.scenario(data.ScenarioFlagMax)
    end

    if data.NotScenarioMin > 0 and data.NotScenarioMax > 0 then
      return "~ " .. Flag.scenario(data.NotScenarioMin) .. ", " .. Flag.scenario(data.ScenarioFlagMin) .. " ~"
    end

    if data.ScenarioFlagMin == data.ScenarioFlagMax then
      return Flag.scenario(data.ScenarioFlagMin)
    else
      return Flag.scenario(data.ScenarioFlagMin) .. " ~ " .. Flag.scenario(data.ScenarioFlagMax)
    end
  end,
  -- Quest
  Quest = function(subCondition)
    local data = subCondition.data
    local ira = subCondition.ira

    local q1, q1p = Flag.quest(data.QuestFlag1, ira)
    local q2, q2p = Flag.quest(data.QuestFlag2, ira)
    local q = {
      q1p and (q1 .. "#" .. q1p) or q1,
      q2p and (q2 .. "#" .. q2p) or q2
    }

    local nq1, nq1p = Flag.quest(data.NotQuestFlag1, ira)
    local nq2, nq2p = Flag.quest(data.NotQuestFlag2, ira)
    local notq = {
      nq1p and (nq1 .. "#" .. nq1p) or nq1,
      nq2p and (nq2 .. "#" .. nq2p) or nq2
    }

    local out = ""

    for _, v in pairs(q) do
      out = out  .. v .. " "
    end
    for _, v in pairs(notq) do
      out = out .. "<del>" .. v .. "</del> "
    end

    return out
  end,
  -- Env天气
  Env = function(subCondition)
    return  subCondition.type .. "/" .. subCondition.data.row_id
  end,
  -- Flag标记
  Flag = function(subCondition)
    local data = subCondition.data
    local FlagID = tostring(data.FlagID)
    local title = mw.title.new(FlagID, "FLAG")
    local content = title:getContent()

    local value
    if data.FlagMin == data.FlagMax then
      value = data.FlagMin
    else
      value = data.FlagMin .. "~" .. data.FlagMax
    end
    if content then
      return content .. ": " .. value
    end
    return "[[" .. title.fullText .. "]]" .. ": " .. value
  end,
  -- 道具
  Item = function(subCondition)
    return  subCondition.type .. "/" .. subCondition.data.row_id
  end,
  PT = function(subCondition)
    return  subCondition.type .. "/" .. subCondition.data.row_id
  end,
  Idea = function(subCondition)
    return  subCondition.type .. "/" .. subCondition.data.row_id
  end,
  Level = function(subCondition)
    return  subCondition.type .. "/" .. subCondition.data.row_id
  end,
  Achievement = function(subCondition)
    return  subCondition.type .. "/" .. subCondition.data.row_id
  end,
  FieldSkiiLevel = function(subCondition)
    return  subCondition.type .. "/" .. subCondition.data.row_id
  end
}

function p.getById(id, ira)
  if id <= 0 then
    return nil
  end

  local conditionList = QueryHelper.getConditonList(id)
  local result = {relation, list = {}}
  if conditionList.Premise == 0 then
    result.relation = " | "
  elseif conditionList.Premise == 1 then
    result.relation = " 或 "
  end

  for i = 1, 8 do
    local type = conditionList["ConditionType" .. i]
    local id = conditionList["Condition" .. i]
    if type > 0 then
      local conditionDetail = QueryHelper.getSubCondition(conditionType[type], id)
      table.insert(result.list, {type = conditionType[type], data = conditionDetail, ira = ira})
    end
  end

  -- process result
  local out = {}
  for _, subCondition in ipairs(result.list) do
    table.insert(out, parser[subCondition.type](subCondition))
  end
  out = table.concat(out, result.relation)

  return out
end

return p