全站通知:
模块:GiftsByItem
刷
历
编
跳到导航
跳到搜索
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
-- 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 = linkPrefix ~= "" and (linkPrefix .. ":" .. villager) or
villager
local html = string.format(
'<span class="no-wrap">[[File:%s Icon.png|24px|link=%s]] [[%s|%s]]</span>',
iconName, villager, 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
-- 获取当前模块的处理函数(用于 generateGiftTable 调用)
function p.getCurrentProcessor() return p.ts end
-- 获取当前模块的 ID 函数(用于 generateGiftTable 调用)
function p.getCurrentIDFunction() return ID.id 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 frame:getParent().args.alt or itemName
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%)', '')
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