打开/关闭菜单
331
1.7K
131
11.8K
星露谷物语扩展百科
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

模块:GiftsByItem:修订间差异

来自星露谷物语扩展百科
SummerFleur留言 | 贡献
无编辑摘要
Sizau留言 | 贡献
无编辑摘要
 
(未显示2个用户的10个中间版本)
第1行: 第1行:
local Utils = require("Module:Utils")
local ID = require("Module:ID")
local GiftsByItemData = Utils.LazyLoad('Module:GiftsByItem/data')
local p = {}
local p = {}
local predefinedOrder = {
    "阿比盖尔", "亚历克斯", "安迪", "苹果", "卡洛琳", "克莱尔", "克林特",
    "德米特里厄斯", "矮人", "艾利欧特", "艾米丽", "艾芙琳", "乔治",
    "冈瑟", "格斯", "海莉", "哈维", "仆从", "贾斯", "乔迪", "肯特",
    "科罗布斯", "兰斯", "莉亚", "雷欧", "刘易斯", "莱纳斯", "马格努斯",
    "马龙", "玛妮", "马丁", "玛鲁", "摩根", "摩根", "莫里斯", "奥利维亚",
    "潘姆", "潘妮", "皮埃尔", "罗宾", "山姆", "桑迪", "斯嘉丽",
    "塞巴斯蒂安", "谢恩", "索菲娅", "苏珊", "维克多", "文森特", "威利"


-- 预定义排序顺序
p.predefinedOrder = {
    "哈维", "山姆", "谢恩", "亚历克斯", "艾利欧特",
    "塞巴斯蒂安", "海莉", "莉亚", "玛鲁", "潘妮", "艾米丽",
    "阿比盖尔", "皮埃尔", "卡洛琳", "刘易斯", "玛妮", "罗宾",
    "德米特里厄斯", "艾芙琳", "乔治", "贾斯", "文森特",
    "乔迪", "肯特", "威利", "格斯", "潘姆", "莱纳斯", "克林特",
    "法师", "矮人", "科罗布斯", "桑迪", "雷欧"
}
}


--tssve = translate & sort for sve
-- 英文到中文的翻译映射表
p.translation = {
    ["Alex"] = "亚历克斯",
    ["Elliott"] = "艾利欧特",
    ["Harvey"] = "哈维",
    ["Sam"] = "山姆",
    ["Sebastian"] = "塞巴斯蒂安",
    ["Shane"] = "谢恩",
    ["Abigail"] = "阿比盖尔",
    ["Emily"] = "艾米丽",
    ["Haley"] = "海莉",
    ["Leah"] = "莉亚",
    ["Maru"] = "玛鲁",
    ["Penny"] = "潘妮",
    ["Caroline"] = "卡洛琳",
    ["Clint"] = "克林特",
    ["Demetrius"] = "德米特里厄斯",
    ["Dwarf"] = "矮人",
    ["Evelyn"] = "艾芙琳",
    ["George"] = "乔治",
    ["Gus"] = "格斯",
    ["Jas"] = "贾斯",
    ["Jodi"] = "乔迪",
    ["Kent"] = "肯特",
    ["Krobus"] = "科罗布斯",
    ["Leo"] = "雷欧",
    ["Lewis"] = "刘易斯",
    ["Linus"] = "莱纳斯",
    ["Marnie"] = "玛妮",
    ["Pam"] = "潘姆",
    ["Pierre"] = "皮埃尔",
    ["Robin"] = "罗宾",
    ["Sandy"] = "桑迪",
    ["Vincent"] = "文森特",
    ["Willy"] = "威利",
    ["Wizard"] = "法师"
}
 
-- 生成中文到英文的反向映射表
p.original = {}
for en, zh in pairs(p.translation) do p.original[zh] = en end
 
-- 创建排序索引映射表
p.orderIndex = {}
for i, name in ipairs(p.predefinedOrder) do p.orderIndex[name] = i end
 
-- 通用工具函数
function p.removeDuplicates(list)
    local seen = {}
    local result = {}
    for _, item in ipairs(list) do
        if not seen[item] then
            table.insert(result, item)
            seen[item] = true
        end
    end
    return result
end
 
function p.translateVillagers(villagers, translationMap)
    for i, villager in ipairs(villagers) do
        villagers[i] = translationMap[villager] or villager
    end
end
 
function p.customSort(villagers, orderIndexMap)
    table.sort(villagers, function(a, b)
        local indexA = orderIndexMap[a] or math.huge
        local indexB = orderIndexMap[b] or math.huge
        return indexA < indexB
    end)
end
 
-- SVE 新增人物
local newVillagers = {
    ["Lance"] = "兰斯", ["Magnus"] = "马格努斯", ["Marlon"] = "马龙",
    ["Martin"] = "马丁", ["Morgan"] = "摩根", ["Morris"] = "莫里斯",
    ["Olivia"] = "奥利维亚", ["Andy"] = "安迪", ["Scarlett"] = "斯嘉丽",
    ["Sophia"] = "索菲娅", ["Susan"] = "苏珊", ["Victor"] = "维克多",
    ["Henchman"] = "仆从", ["Claire"] = "克莱尔", ["Gunther"] = "冈瑟",
    ["Apples"] = "苹果"
}
 
local orderAdditions = {
    "索菲娅", "维克多", "克莱尔", "马丁", "安迪", "苏珊", "奥利维亚", "兰斯", "斯嘉丽", "莫里斯", "马龙", "冈瑟", "仆从", "马格努斯", "摩根", "苹果"
}
 
-- 缓存合并后的数据
local translationMap
local orderList
local originalMap
local orderIndexMap
 
-- 初始化函数
local function initializeData()
    if translationMap then return end
   
    translationMap = {}
    for k, v in pairs(p.translation) do
        translationMap[k] = v
    end
    for k, v in pairs(newVillagers) do
        translationMap[k] = v
    end
   
    orderList = {}
    for _, name in ipairs(p.predefinedOrder) do
        table.insert(orderList, name)
    end
    for _, name in ipairs(orderAdditions) do
        table.insert(orderList, name)
    end
   
    originalMap = {}
    for en, zh in pairs(translationMap) do
        originalMap[zh] = en
    end
   
    orderIndexMap = {}
    for i, name in ipairs(orderList) do
        orderIndexMap[name] = i
    end
end
 
-- HTML 生成函数
function p.generateHTML(villagers, originalMap, linkPrefix)
    linkPrefix = linkPrefix or "" -- 默认无前缀
    local result = {}
    for i, villager in ipairs(villagers) do
        local iconName = originalMap[villager] or villager
        local link = villager
        local html = string.format(
            '<span class="no-wrap">[[File:%s Icon.png|24px|link=%s]]&nbsp;[[%s|%s]]</span>',
            iconName, link, link, villager)
        table.insert(result, html)
    end
    return table.concat(result, " • ")
end
 
-- 通用处理函数
function p.processVillagers(villagerlist, translationMap, orderIndexMap,
                            originalMap, linkPrefix)
    if not villagerlist then return "" end
 
    -- 解析输入
    local villagers = {}
    for villager in villagerlist:gmatch("[^,]+") do
        villager = mw.text.trim(villager)
        if villager ~= "" then table.insert(villagers, villager) end
    end
 
    -- 处理流程
    villagers = p.removeDuplicates(villagers)
    table.sort(villagers) -- 先按字母排序
    p.translateVillagers(villagers, translationMap)
    p.customSort(villagers, orderIndexMap)
 
    return p.generateHTML(villagers, originalMap, linkPrefix)
end
 
-- 主函数
function p.ts(frame)
    local villagerlist = frame.args[1]
    return p.processVillagers(villagerlist, p.translation, p.orderIndex,
        p.original)
end
 
function p.tssve(frame)
function p.tssve(frame)
    initializeData()
     local villagerlist = frame.args[1]
     local villagerlist = frame.args[1]
    return p.processVillagers(villagerlist, translationMap, orderIndexMap, originalMap, "SVE")
end
-- 获取当前模块的处理函数(用于 generateGiftTable 调用)
function p.getCurrentProcessor() return p.tssve end
-- 获取当前模块的 ID 函数(用于 generateGiftTable 调用)
function p.getCurrentIDFunction() return ID.getId end
-- 获取当前模块的数据源(用于 generateGiftTable 调用)
function p.getCurrentDataSource()
    return Utils.LazyLoad('Module:GiftsByItem/data')
end
-- 通用的礼物表格生成函数
function p.generateGiftTableWithProcessor(frame, processorFunc, idFunc, dataSource)
    local itemName = frame.args[1] or frame:getParent().args[1] or
        mw.title.getCurrentTitle().text
local displayName = frame.args.alt or itemName or ''
    if not itemName or itemName == "" then return "" end
    local itemID
    local itemNameToIDMapping = {
        ["诡异玩偶(绿)"] = "126",
        ["诡异玩偶(黄)"] = "127",
        ["Joja可乐"] = "167",
        ["垃圾(物品)"] = "168",
        ["破损的CD"] = "171",
        ["鱼饵(物品)"] = "685",
        ["针对性鱼饵"] = "SpecificBait",
        ["熏鱼"] = "Smoked",
        ["果干"] = "DriedFruit",
        ["蘑菇干"] = "DriedMushrooms",
        ["青蛙蛋"] = "FrogEgg"
    }
    if itemNameToIDMapping[itemName] then
        itemID = itemNameToIDMapping[itemName]
    end
    if not itemID then
        itemID = idFunc(itemName):gsub('%(O%)', ''):gsub('%(TR%)', '')
    end
    local item = dataSource[itemID] or dataSource[itemName]
    if not item then return "" end
    local hasPreferences = false
    for _, category in ipairs({ "Love", "Like", "Neutral", "Dislike", "Hate" }) do
        if item[category] then
            local count = 0
            for i, _ in pairs(item[category]) do
                if type(i) == "number" and i > 0 then
                    count = count + 1
                end
            end


     if villagerlist ~= nil then
            if count > 0 then
                hasPreferences = true
                break
            end
        end
    end
 
     if not hasPreferences then return "" end
 
    local result = {}
 
    -- 开始构建表格
    table.insert(result, '<table class="wikitable roundedborder">')
    table.insert(result, '<tr>')
    table.insert(result, '<th colspan="2">收到' .. displayName .. '后</th>')
    table.insert(result, '</tr>')
      
      
        local vtable = {}
    local flag = false
         local villagers = mw.text.split(villagerlist, ",", true)
 
         for i = 1, #villagers do
    if item["Love"] then
            local v = mw.text.trim(villagers[i])
         local npcList = {}
             if v ~= "" then
         for i, npc in pairs(item["Love"]) do
                 table.insert(vtable, v)
             if type(i) == "number" and i > 0 then
                 table.insert(npcList, npc)
             end
             end
         end
         end
          
 
        --remove duplicate entries
         if #npcList > 0 then
        local dupes = {}
        flag = true
         local villagertable = {}
            local loveList = table.concat(npcList, ",")
         for i = 1, #vtable do
            local points = "+80"
          if not dupes[vtable[i]] then
            if itemName == "星之果茶" or itemName == "StardropTea" then points = "+250" end
              table.insert(villagertable, vtable[i])
 
              dupes[vtable[i]] = true
            local mockFrame = { args = { [1] = loveList } }
          end
            local processedList = processorFunc(mockFrame)
 
            table.insert(result, '<tr>')
            table.insert(result,
                '<th><span class="no-wrap">最爱</span><br><span style="font-size:smaller;">' ..
                points .. '</span></th>')
            table.insert(result, '<td>' .. processedList .. '</td>')
            table.insert(result, '</tr>')
        end
    end
 
    if item["Like"] then
         local npcList = {}
         for i, npc in pairs(item["Like"]) do
            if type(i) == "number" and i > 0 then
                table.insert(npcList, npc)
            end
        end
 
        if #npcList > 0 then
        flag = true
            local likeList = table.concat(npcList, ",")
 
            local mockFrame = { args = { [1] = likeList } }
            local processedList = processorFunc(mockFrame)
 
            table.insert(result, '<tr>')
            table.insert(result,
                '<th><span class="no-wrap">喜欢</span><br><span style="font-size:smaller;">+45</span></th>')
            table.insert(result, '<td>' .. processedList .. '</td>')
            table.insert(result, '</tr>')
        end
    end
 
    if item["Neutral"] then
        local npcList = {}
        for i, npc in pairs(item["Neutral"]) do
            if type(i) == "number" and i > 0 then
                table.insert(npcList, npc)
            end
         end
         end
   
 
         table.sort(villagertable)
         if #npcList > 0 then
       
        flag = true
        for k,v in pairs(villagertable) do
             local neutralList = table.concat(npcList, ",")
            if v == "Alex" then villagertable[k] = "亚历克斯" end
 
            if v == "Elliott" then villagertable[k] = "艾利欧特" end
             local mockFrame = { args = { [1] = neutralList } }
             if v == "Harvey" then villagertable[k] = "哈维" end
             local processedList = processorFunc(mockFrame)
            if v == "Sam" then villagertable[k] = "山姆" end
 
             if v == "Sebastian" then villagertable[k] = "塞巴斯蒂安" end
             table.insert(result, '<tr>')
             if v == "Shane" then villagertable[k] = "谢恩" end
             table.insert(result,
            if v == "Abigail" then villagertable[k] = "阿比盖尔" end
                '<th><span class="no-wrap">普通</span><br><span style="font-size:smaller;">+20</span></th>')
            if v == "Emily" then villagertable[k] = "艾米丽" end
             table.insert(result, '<td>' .. processedList .. '</td>')
             if v == "Haley" then villagertable[k] = "海莉" end
             table.insert(result, '</tr>')
             if v == "Leah" then villagertable[k] = "莉亚" end
            if v == "Maru" then villagertable[k] = "玛鲁" end
            if v == "Penny" then villagertable[k] = "潘妮" end
            if v == "Caroline" then villagertable[k] = "卡洛琳" end
            if v == "Clint" then villagertable[k] = "克林特" end
            if v == "Demetrius" then villagertable[k] = "德米特里厄斯" end
            if v == "Dwarf" then villagertable[k] = "矮人" end
            if v == "Evelyn" then villagertable[k] = "艾芙琳" end
            if v == "George" then villagertable[k] = "乔治" end
            if v == "Gus" then villagertable[k] = "格斯" end
            if v == "Jas" then villagertable[k] = "贾斯" end
            if v == "Jodi" then villagertable[k] = "乔迪" end
            if v == "Kent" then villagertable[k] = "肯特" end
            if v == "Krobus" then villagertable[k] = "科罗布斯" end
            if v == "Leo" then villagertable[k] = "雷欧" end
            if v == "Lewis" then villagertable[k] = "刘易斯" end
            if v == "Linus" then villagertable[k] = "莱纳斯" end
            if v == "Marnie" then villagertable[k] = "玛妮" end
            if v == "Pam" then villagertable[k] = "潘姆" end
            if v == "Pierre" then villagertable[k] = "皮埃尔" end
            if v == "Robin" then villagertable[k] = "罗宾" end
            if v == "Sandy" then villagertable[k] = "桑迪" end
            if v == "Vincent" then villagertable[k] = "文森特" end
            if v == "Willy" then villagertable[k] = "威利" end
            -- new in sve
            if v == "Lance" then villagertable[k] = "兰斯" end
             if v == "Magnus" then villagertable[k] = "马格努斯" end
            if v == "Marlon" then villagertable[k] = "马龙" end
            if v == "Martin" then villagertable[k] = "马丁" end
            if v == "Morgan" then villagertable[k] = "摩根" end
            if v == "Morris" then villagertable[k] = "莫里斯" end
            if v == "Olivia" then villagertable[k] = "奥利维亚" end
            if v == "Andy" then villagertable[k] = "安迪" end
            if v == "Scarlett" then villagertable[k] = "斯嘉丽" end
            if v == "Sophia" then villagertable[k] = "索菲娅" end
            if v == "Susan" then villagertable[k] = "苏珊" end
            if v == "Victor" then villagertable[k] = "维克多" end
            if v == "Henchman" then villagertable[k] = "仆从" end
            if v == "Claire" then villagertable[k] = "克莱尔" end
            if v == "Gunther" then villagertable[k] = "冈瑟" end
            if v == "Morgan" then villagertable[k] = "摩根" end
            if v == "Apples" then villagertable[k] = "苹果" end
              
         end
         end
    end


        -- Custom sort
    if item["Dislike"] then
         table.sort(villagertable, function(a, b)
         local npcList = {}
            local indexA = 0
        for i, npc in pairs(item["Dislike"]) do
            local indexB = 0
            if type(i) == "number" and i > 0 then
            for i, name in ipairs(predefinedOrder) do
                 table.insert(npcList, npc)
                if a == name then indexA = i end
                 if b == name then indexB = i end
             end
             end
            return indexA < indexB
         end
         end)


        if #npcList > 0 then
        flag = true
            local dislikeList = table.concat(npcList, ",")


        --put the table "villagertable" back into a string blob
            local mockFrame = { args = { [1] = dislikeList } }
        --table.concat( table, sep, i, j ) DOES NOT WORK
            local processedList = processorFunc(mockFrame)
        villagerlist = ""
 
        for i = 1, (#villagertable-1) do
            table.insert(result, '<tr>')
             villagerlist = villagerlist .. '<span class="no-wrap">[[File:' .. villagertable[i] .. ' Icon.png|24px|link=' .. villagertable[i] .. ']]&nbsp;[[SVE:' .. villagertable[i] .. '|' .. villagertable[i] .. ']]</span> • '
             table.insert(result,
                '<th><span class="no-wrap">不喜欢</span><br><span style="font-size:smaller;">-20</span></th>')
            table.insert(result, '<td>' .. processedList .. '</td>')
            table.insert(result, '</tr>')
        end
    end
 
    if item["Hate"] then
        local npcList = {}
        for i, npc in pairs(item["Hate"]) do
            if type(i) == "number" and i > 0 then
                table.insert(npcList, npc)
            end
         end
         end
        --We don't want a trailing bullet at the end of the list
        villagerlist = villagerlist .. '<span class="no-wrap">[[File:' .. villagertable[#villagertable] .. ' Icon.png|24px|link=' .. villagertable[#villagertable] .. ']]&nbsp;[[SVE:' .. villagertable[#villagertable] .. '|' .. villagertable[#villagertable] .. ']]</span>'


        if #npcList > 0 then
        flag = true
            local hateList = table.concat(npcList, ",")
            local mockFrame = { args = { [1] = hateList } }
            local processedList = processorFunc(mockFrame)
            table.insert(result, '<tr>')
            table.insert(result,
                '<th><span class="no-wrap">讨厌</span><br><span style="font-size:smaller;">-40</span></th>')
            table.insert(result, '<td>' .. processedList .. '</td>')
            table.insert(result, '</tr>')
        end
    end


        --Now that we've sorted by the native language,
    table.insert(result, '</table>')
        --fix icons whose names are all in English
   
        --Also add the é to Leo for French
    if not flag then table.insert(result, '[[分类:礼物喜好解析存在问题的物品]]') end
        --so I don't have to write an entire substitution table for accented chars
        villagerlist = string.gsub(villagerlist, "亚历克斯 Icon", "Alex Icon")
        villagerlist = string.gsub(villagerlist, "艾利欧特 Icon", "Elliott Icon")
        villagerlist = string.gsub(villagerlist, "哈维 Icon", "Harvey Icon")
        villagerlist = string.gsub(villagerlist, "山姆 Icon", "Sam Icon")
        villagerlist = string.gsub(villagerlist, "塞巴斯蒂安 Icon", "Sebastian Icon")
        villagerlist = string.gsub(villagerlist, "谢恩 Icon", " Shane Icon")
        villagerlist = string.gsub(villagerlist, "阿比盖尔 Icon", "Abigail Icon")
        villagerlist = string.gsub(villagerlist, "艾米丽 Icon", "Emily Icon")
        villagerlist = string.gsub(villagerlist, "海莉 Icon", "Haley Icon")
        villagerlist = string.gsub(villagerlist, "莉亚 Icon", "Leah Icon")
        villagerlist = string.gsub(villagerlist, "玛鲁 Icon", "Maru Icon")
        villagerlist = string.gsub(villagerlist, "潘妮 Icon", "Penny Icon")
        villagerlist = string.gsub(villagerlist, "卡洛琳 Icon", "Caroline Icon")
        villagerlist = string.gsub(villagerlist, "克林特 Icon", "Clint Icon")
        villagerlist = string.gsub(villagerlist, "德米特里厄斯 Icon", "Demetrius Icon")
        villagerlist = string.gsub(villagerlist, "矮人 Icon", "Dwarf Icon")
        villagerlist = string.gsub(villagerlist, "艾芙琳 Icon", "Evelyn Icon")
        villagerlist = string.gsub(villagerlist, "乔治 Icon", "George Icon")
        villagerlist = string.gsub(villagerlist, "格斯 Icon", "Gus Icon")
        villagerlist = string.gsub(villagerlist, "贾斯 Icon", "Jas Icon")
        villagerlist = string.gsub(villagerlist, "乔迪 Icon", "Jodi Icon")
        villagerlist = string.gsub(villagerlist, "肯特 Icon", "Kent Icon")
        villagerlist = string.gsub(villagerlist, "科罗布斯 Icon", "Krobus Icon")
        villagerlist = string.gsub(villagerlist, "雷欧 Icon", "Leo Icon")
        villagerlist = string.gsub(villagerlist, "刘易斯 Icon", "Lewis Icon")
        villagerlist = string.gsub(villagerlist, "莱纳斯 Icon", "Linus Icon")
        villagerlist = string.gsub(villagerlist, "玛妮 Icon", "Marnie Icon")
        villagerlist = string.gsub(villagerlist, "潘姆 Icon", "Pam Icon")
        villagerlist = string.gsub(villagerlist, "皮埃尔 Icon", "Pierre Icon")
        villagerlist = string.gsub(villagerlist, "罗宾 Icon", "Robin Icon")
        villagerlist = string.gsub(villagerlist, "桑迪 Icon", "Sandy Icon")
        villagerlist = string.gsub(villagerlist, "文森特 Icon", "Vincent Icon")
        villagerlist = string.gsub(villagerlist, "威利 Icon", "Willy Icon")
        villagerlist = string.gsub(villagerlist, "法师 Icon", "Wizard Icon")
        villagerlist = string.gsub(villagerlist, "兰斯 Icon", "Lance Icon")
        villagerlist = string.gsub(villagerlist, "马格努斯 Icon", "Magnus Icon")
        villagerlist = string.gsub(villagerlist, "马龙 Icon", "Marlon Icon")
        villagerlist = string.gsub(villagerlist, "马丁 Icon", "Martin Icon")
        villagerlist = string.gsub(villagerlist, "摩根 Icon", "Morgan Icon")
        villagerlist = string.gsub(villagerlist, "莫里斯 Icon", "Morris Icon")
        villagerlist = string.gsub(villagerlist, "奥利维亚 Icon", "Olivia Icon")
        villagerlist = string.gsub(villagerlist, "安迪 Icon", "Andy Icon")
        villagerlist = string.gsub(villagerlist, "斯嘉丽 Icon", "Scarlett Icon")
        villagerlist = string.gsub(villagerlist, "索菲娅 Icon", "Sophia Icon")
        villagerlist = string.gsub(villagerlist, "苏珊 Icon", "Susan Icon")
        villagerlist = string.gsub(villagerlist, "维克多 Icon", "Victor Icon")
        villagerlist = string.gsub(villagerlist, "仆从 Icon", "Henchman Icon")
        villagerlist = string.gsub(villagerlist, "克莱尔 Icon", "Claire Icon")
        villagerlist = string.gsub(villagerlist, "冈瑟 Icon", "Gunther Icon")
        villagerlist = string.gsub(villagerlist, "摩根 Icon", "Morgan Icon")
        villagerlist = string.gsub(villagerlist, "苹果 Icon", "Apples Icon")  


    return table.concat(result, '\n')
end


        return villagerlist
-- 输出完整的礼物喜好表格
     end --if villagerlist == nil, then do nothing but return p
function p.generateGiftTable(frame)
end --end function p.tssve()
     return p.generateGiftTableWithProcessor(frame, p.getCurrentProcessor(), p.getCurrentIDFunction(), p.getCurrentDataSource())
end
-- =p.generateGiftTable { args = { "骆驼毛" } }


return p
return p

2025年12月20日 (六) 23:21的最新版本

描述

当前模块用于物品的人物喜好列表的生成,能够根据导出的数据进行全自动的格式化、排序和输出。

人物按照一定的逻辑排序,此外还对排版显示上进行了一定的优化。

如果该模块存在任何问题,请在{{GiftsByItem}}对应的讨论页中反馈。

模块使用的数据见模块:GiftsByItem/data,相关数据是通过由中文社区维护的模组导出的,相关代码见 Github 仓库中的 GetNPCGiftTastes 部分

[ 查看 | 编辑 | 历史 | 刷新 ]上述文档的内容来自模块:GiftsByItem/doc
local Utils = require("Module:Utils")
local ID = require("Module:ID")
local GiftsByItemData = Utils.LazyLoad('Module:GiftsByItem/data')

local p = {}

-- 预定义排序顺序
p.predefinedOrder = {
    "哈维", "山姆", "谢恩", "亚历克斯", "艾利欧特",
    "塞巴斯蒂安", "海莉", "莉亚", "玛鲁", "潘妮", "艾米丽",
    "阿比盖尔", "皮埃尔", "卡洛琳", "刘易斯", "玛妮", "罗宾",
    "德米特里厄斯", "艾芙琳", "乔治", "贾斯", "文森特",
    "乔迪", "肯特", "威利", "格斯", "潘姆", "莱纳斯", "克林特",
    "法师", "矮人", "科罗布斯", "桑迪", "雷欧"
}

-- 英文到中文的翻译映射表
p.translation = {
    ["Alex"] = "亚历克斯",
    ["Elliott"] = "艾利欧特",
    ["Harvey"] = "哈维",
    ["Sam"] = "山姆",
    ["Sebastian"] = "塞巴斯蒂安",
    ["Shane"] = "谢恩",
    ["Abigail"] = "阿比盖尔",
    ["Emily"] = "艾米丽",
    ["Haley"] = "海莉",
    ["Leah"] = "莉亚",
    ["Maru"] = "玛鲁",
    ["Penny"] = "潘妮",
    ["Caroline"] = "卡洛琳",
    ["Clint"] = "克林特",
    ["Demetrius"] = "德米特里厄斯",
    ["Dwarf"] = "矮人",
    ["Evelyn"] = "艾芙琳",
    ["George"] = "乔治",
    ["Gus"] = "格斯",
    ["Jas"] = "贾斯",
    ["Jodi"] = "乔迪",
    ["Kent"] = "肯特",
    ["Krobus"] = "科罗布斯",
    ["Leo"] = "雷欧",
    ["Lewis"] = "刘易斯",
    ["Linus"] = "莱纳斯",
    ["Marnie"] = "玛妮",
    ["Pam"] = "潘姆",
    ["Pierre"] = "皮埃尔",
    ["Robin"] = "罗宾",
    ["Sandy"] = "桑迪",
    ["Vincent"] = "文森特",
    ["Willy"] = "威利",
    ["Wizard"] = "法师"
}

-- 生成中文到英文的反向映射表
p.original = {}
for en, zh in pairs(p.translation) do p.original[zh] = en end

-- 创建排序索引映射表
p.orderIndex = {}
for i, name in ipairs(p.predefinedOrder) do p.orderIndex[name] = i end

-- 通用工具函数
function p.removeDuplicates(list)
    local seen = {}
    local result = {}
    for _, item in ipairs(list) do
        if not seen[item] then
            table.insert(result, item)
            seen[item] = true
        end
    end
    return result
end

function p.translateVillagers(villagers, translationMap)
    for i, villager in ipairs(villagers) do
        villagers[i] = translationMap[villager] or villager
    end
end

function p.customSort(villagers, orderIndexMap)
    table.sort(villagers, function(a, b)
        local indexA = orderIndexMap[a] or math.huge
        local indexB = orderIndexMap[b] or math.huge
        return indexA < indexB
    end)
end

-- SVE 新增人物
local newVillagers = {
    ["Lance"] = "兰斯", ["Magnus"] = "马格努斯", ["Marlon"] = "马龙",
    ["Martin"] = "马丁", ["Morgan"] = "摩根", ["Morris"] = "莫里斯",
    ["Olivia"] = "奥利维亚", ["Andy"] = "安迪", ["Scarlett"] = "斯嘉丽",
    ["Sophia"] = "索菲娅", ["Susan"] = "苏珊", ["Victor"] = "维克多",
    ["Henchman"] = "仆从", ["Claire"] = "克莱尔", ["Gunther"] = "冈瑟",
    ["Apples"] = "苹果"
}

local orderAdditions = {
    "索菲娅", "维克多", "克莱尔", "马丁", "安迪", "苏珊", "奥利维亚", "兰斯", "斯嘉丽", "莫里斯", "马龙", "冈瑟", "仆从", "马格努斯", "摩根", "苹果"
}

-- 缓存合并后的数据
local translationMap
local orderList
local originalMap
local orderIndexMap

-- 初始化函数
local function initializeData()
    if translationMap then return end
    
    translationMap = {}
    for k, v in pairs(p.translation) do
        translationMap[k] = v
    end
    for k, v in pairs(newVillagers) do
        translationMap[k] = v
    end
    
    orderList = {}
    for _, name in ipairs(p.predefinedOrder) do
        table.insert(orderList, name)
    end
    for _, name in ipairs(orderAdditions) do
        table.insert(orderList, name)
    end
    
    originalMap = {}
    for en, zh in pairs(translationMap) do
        originalMap[zh] = en
    end
    
    orderIndexMap = {}
    for i, name in ipairs(orderList) do
        orderIndexMap[name] = i
    end
end

-- HTML 生成函数
function p.generateHTML(villagers, originalMap, linkPrefix)
    linkPrefix = linkPrefix or "" -- 默认无前缀
    local result = {}
    for i, villager in ipairs(villagers) do
        local iconName = originalMap[villager] or villager
        local link = villager
        local html = string.format(
            '<span class="no-wrap">[[File:%s Icon.png|24px|link=%s]]&nbsp;[[%s|%s]]</span>',
            iconName, link, link, villager)
        table.insert(result, html)
    end
    return table.concat(result, " • ")
end

-- 通用处理函数
function p.processVillagers(villagerlist, translationMap, orderIndexMap,
                            originalMap, linkPrefix)
    if not villagerlist then return "" end

    -- 解析输入
    local villagers = {}
    for villager in villagerlist:gmatch("[^,]+") do
        villager = mw.text.trim(villager)
        if villager ~= "" then table.insert(villagers, villager) end
    end

    -- 处理流程
    villagers = p.removeDuplicates(villagers)
    table.sort(villagers) -- 先按字母排序
    p.translateVillagers(villagers, translationMap)
    p.customSort(villagers, orderIndexMap)

    return p.generateHTML(villagers, originalMap, linkPrefix)
end

-- 主函数
function p.ts(frame)
    local villagerlist = frame.args[1]
    return p.processVillagers(villagerlist, p.translation, p.orderIndex,
        p.original)
end

function p.tssve(frame)
    initializeData()
    local villagerlist = frame.args[1]
    return p.processVillagers(villagerlist, translationMap, orderIndexMap, originalMap, "SVE")
end

-- 获取当前模块的处理函数(用于 generateGiftTable 调用)
function p.getCurrentProcessor() return p.tssve end

-- 获取当前模块的 ID 函数(用于 generateGiftTable 调用)
function p.getCurrentIDFunction() return ID.getId end

-- 获取当前模块的数据源(用于 generateGiftTable 调用)
function p.getCurrentDataSource() 
    return Utils.LazyLoad('Module:GiftsByItem/data')
end

-- 通用的礼物表格生成函数
function p.generateGiftTableWithProcessor(frame, processorFunc, idFunc, dataSource)
    local itemName = frame.args[1] or frame:getParent().args[1] or
        mw.title.getCurrentTitle().text
	local displayName = frame.args.alt or itemName or ''
    if not itemName or itemName == "" then return "" end

    local itemID
    local itemNameToIDMapping = {
        ["诡异玩偶(绿)"] = "126",
        ["诡异玩偶(黄)"] = "127",
        ["Joja可乐"] = "167",
        ["垃圾(物品)"] = "168",
        ["破损的CD"] = "171",
        ["鱼饵(物品)"] = "685",
        ["针对性鱼饵"] = "SpecificBait",
        ["熏鱼"] = "Smoked",
        ["果干"] = "DriedFruit",
        ["蘑菇干"] = "DriedMushrooms",
        ["青蛙蛋"] = "FrogEgg"
    }

    if itemNameToIDMapping[itemName] then
        itemID = itemNameToIDMapping[itemName]
    end

    if not itemID then 
        itemID = idFunc(itemName):gsub('%(O%)', ''):gsub('%(TR%)', '')
    end

    local item = dataSource[itemID] or dataSource[itemName]
    if not item then return "" end

    local hasPreferences = false
    for _, category in ipairs({ "Love", "Like", "Neutral", "Dislike", "Hate" }) do
        if item[category] then
            local count = 0
            for i, _ in pairs(item[category]) do
                if type(i) == "number" and i > 0 then
                    count = count + 1
                end
            end

            if count > 0 then
                hasPreferences = true
                break
            end
        end
    end

    if not hasPreferences then return "" end

    local result = {}

    -- 开始构建表格
    table.insert(result, '<table class="wikitable roundedborder">')
    table.insert(result, '<tr>')
    table.insert(result, '<th colspan="2">收到' .. displayName .. '后</th>')
    table.insert(result, '</tr>')
    
    local flag = false

    if item["Love"] then
        local npcList = {}
        for i, npc in pairs(item["Love"]) do
            if type(i) == "number" and i > 0 then
                table.insert(npcList, npc)
            end
        end

        if #npcList > 0 then
        	flag = true
            local loveList = table.concat(npcList, ",")
            local points = "+80"
            if itemName == "星之果茶" or itemName == "StardropTea" then points = "+250" end

            local mockFrame = { args = { [1] = loveList } }
            local processedList = processorFunc(mockFrame)

            table.insert(result, '<tr>')
            table.insert(result,
                '<th><span class="no-wrap">最爱</span><br><span style="font-size:smaller;">' ..
                points .. '</span></th>')
            table.insert(result, '<td>' .. processedList .. '</td>')
            table.insert(result, '</tr>')
        end
    end

    if item["Like"] then
        local npcList = {}
        for i, npc in pairs(item["Like"]) do
            if type(i) == "number" and i > 0 then
                table.insert(npcList, npc)
            end
        end

        if #npcList > 0 then
        	flag = true
            local likeList = table.concat(npcList, ",")

            local mockFrame = { args = { [1] = likeList } }
            local processedList = processorFunc(mockFrame)

            table.insert(result, '<tr>')
            table.insert(result,
                '<th><span class="no-wrap">喜欢</span><br><span style="font-size:smaller;">+45</span></th>')
            table.insert(result, '<td>' .. processedList .. '</td>')
            table.insert(result, '</tr>')
        end
    end

    if item["Neutral"] then
        local npcList = {}
        for i, npc in pairs(item["Neutral"]) do
            if type(i) == "number" and i > 0 then
                table.insert(npcList, npc)
            end
        end

        if #npcList > 0 then
        	flag = true
            local neutralList = table.concat(npcList, ",")

            local mockFrame = { args = { [1] = neutralList } }
            local processedList = processorFunc(mockFrame)

            table.insert(result, '<tr>')
            table.insert(result,
                '<th><span class="no-wrap">普通</span><br><span style="font-size:smaller;">+20</span></th>')
            table.insert(result, '<td>' .. processedList .. '</td>')
            table.insert(result, '</tr>')
        end
    end

    if item["Dislike"] then
        local npcList = {}
        for i, npc in pairs(item["Dislike"]) do
            if type(i) == "number" and i > 0 then
                table.insert(npcList, npc)
            end
        end

        if #npcList > 0 then
        	flag = true
            local dislikeList = table.concat(npcList, ",")

            local mockFrame = { args = { [1] = dislikeList } }
            local processedList = processorFunc(mockFrame)

            table.insert(result, '<tr>')
            table.insert(result,
                '<th><span class="no-wrap">不喜欢</span><br><span style="font-size:smaller;">-20</span></th>')
            table.insert(result, '<td>' .. processedList .. '</td>')
            table.insert(result, '</tr>')
        end
    end

    if item["Hate"] then
        local npcList = {}
        for i, npc in pairs(item["Hate"]) do
            if type(i) == "number" and i > 0 then
                table.insert(npcList, npc)
            end
        end

        if #npcList > 0 then
        	flag = true
            local hateList = table.concat(npcList, ",")

            local mockFrame = { args = { [1] = hateList } }
            local processedList = processorFunc(mockFrame)

            table.insert(result, '<tr>')
            table.insert(result,
                '<th><span class="no-wrap">讨厌</span><br><span style="font-size:smaller;">-40</span></th>')
            table.insert(result, '<td>' .. processedList .. '</td>')
            table.insert(result, '</tr>')
        end
    end

    table.insert(result, '</table>')
    
    if not flag then table.insert(result, '[[分类:礼物喜好解析存在问题的物品]]') end

    return table.concat(result, '\n')
end

-- 输出完整的礼物喜好表格
function p.generateGiftTable(frame)
    return p.generateGiftTableWithProcessor(frame, p.getCurrentProcessor(), p.getCurrentIDFunction(), p.getCurrentDataSource())
end
-- =p.generateGiftTable { args = { "骆驼毛" } }

return p