模块:GiftsByItem:修订间差异
来自星露谷物语扩展百科
更多操作
删除的内容 添加的内容
SummerFleur(留言 | 贡献) 创建页面,内容为“local p = {} local predefinedOrder = { "阿比盖尔", "亚历克斯", "安迪", "苹果", "卡洛琳", "克莱尔", "克林特", "德米特里厄斯", "矮人", "艾利欧特", "艾米丽", "艾芙琳", "乔治", "冈瑟", "格斯", "海莉", "哈维", "仆从", "贾斯", "乔迪", "肯特", "科罗布斯", "兰斯", "莉亚", "雷欧", "刘易斯", "莱纳斯", "马格努斯", "马龙", "玛妮", "马丁", "玛鲁", "摩根", "摩根",…” |
无编辑摘要 |
||
| (未显示2个用户的13个中间版本) | |||
| 第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]] [[%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 调用) |
|||
if villagerlist ~= nil then |
|||
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 |
|||
local villagers = mw.text.split(villagerlist, ",", true) |
|||
if item["Love"] then |
|||
for i = 1, #villagers do |
|||
local npcList = {} |
|||
for i, npc in pairs(item["Love"]) do |
|||
if type(i) == "number" and i > 0 then |
|||
table.insert(npcList, npc) |
|||
end |
end |
||
end |
end |
||
if #npcList > 0 then |
|||
flag = true |
|||
local |
local loveList = table.concat(npcList, ",") |
||
local points = "+80" |
|||
if |
if itemName == "星之果茶" or itemName == "StardropTea" then points = "+250" end |
||
table.insert(villagertable, vtable[i]) |
|||
local mockFrame = { args = { [1] = loveList } } |
|||
local processedList = processorFunc(mockFrame) |
|||
end |
|||
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 |
||
end |
|||
table.sort(villagertable) |
|||
if item["Like"] then |
|||
local npcList = {} |
|||
for i, npc in pairs(item["Like"]) do |
|||
if v == "Alex" then villagertable[k] = "亚历克斯" end |
|||
if |
if type(i) == "number" and i > 0 then |
||
table.insert(npcList, npc) |
|||
end |
|||
if v == "Sebastian" then villagertable[k] = "塞巴斯蒂安" end |
|||
if v == "Shane" then villagertable[k] = "谢恩" end |
|||
if v == "Abigail" then villagertable[k] = "阿比盖尔" end |
|||
if v == "Emily" then villagertable[k] = "艾米丽" end |
|||
if v == "Haley" then villagertable[k] = "海莉" end |
|||
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 |
||
if #npcList > 0 then |
|||
flag = true |
|||
table.sort(villagertable, function(a, b) |
|||
local |
local likeList = table.concat(npcList, ",") |
||
local indexB = 0 |
|||
local mockFrame = { args = { [1] = likeList } } |
|||
local processedList = processorFunc(mockFrame) |
|||
if a == name then indexA = i end |
|||
if b == name then indexB = i end |
|||
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 |
|||
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>') |
|||
--put the table "villagertable" back into a string blob |
|||
table.insert(result, |
|||
'<th><span class="no-wrap">普通</span><br><span style="font-size:smaller;">+20</span></th>') |
|||
villagerlist = "" |
|||
table.insert(result, '<td>' .. processedList .. '</td>') |
|||
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] .. ']] [[SVE:' .. villagertable[i] .. ']]</span> • ' |
|||
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] .. ']] [[SVE:' .. villagertable[#villagertable] .. ']]</span>' |
|||
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 |
|||
--Now that we've sorted by the native language, |
|||
flag = true |
|||
--fix icons whose names are all in English |
|||
local dislikeList = table.concat(npcList, ",") |
|||
--so I don't have to write an entire substitution table for accented chars |
|||
local mockFrame = { args = { [1] = dislikeList } } |
|||
villagerlist = string.gsub(villagerlist, "亚历克斯 Icon", "Alex Icon") |
|||
local processedList = processorFunc(mockFrame) |
|||
villagerlist = string.gsub(villagerlist, "艾利欧特 Icon", "Elliott Icon") |
|||
villagerlist = string.gsub(villagerlist, "哈维 Icon", "Harvey Icon") |
|||
table.insert(result, '<tr>') |
|||
villagerlist = string.gsub(villagerlist, "山姆 Icon", "Sam Icon") |
|||
table.insert(result, |
|||
villagerlist = string.gsub(villagerlist, "塞巴斯蒂安 Icon", "Sebastian Icon") |
|||
'<th><span class="no-wrap">不喜欢</span><br><span style="font-size:smaller;">-20</span></th>') |
|||
villagerlist = string.gsub(villagerlist, "谢恩 Icon", " Shane Icon") |
|||
table.insert(result, '<td>' .. processedList .. '</td>') |
|||
villagerlist = string.gsub(villagerlist, "阿比盖尔 Icon", "Abigail Icon") |
|||
table.insert(result, '</tr>') |
|||
villagerlist = string.gsub(villagerlist, "艾米丽 Icon", "Emily Icon") |
|||
end |
|||
villagerlist = string.gsub(villagerlist, "海莉 Icon", "Haley Icon") |
|||
end |
|||
villagerlist = string.gsub(villagerlist, "莉亚 Icon", "Leah Icon") |
|||
villagerlist = string.gsub(villagerlist, "玛鲁 Icon", "Maru Icon") |
|||
if item["Hate"] then |
|||
villagerlist = string.gsub(villagerlist, "潘妮 Icon", "Penny Icon") |
|||
local npcList = {} |
|||
villagerlist = string.gsub(villagerlist, "卡洛琳 Icon", "Caroline Icon") |
|||
for i, npc in pairs(item["Hate"]) do |
|||
villagerlist = string.gsub(villagerlist, "克林特 Icon", "Clint Icon") |
|||
if type(i) == "number" and i > 0 then |
|||
villagerlist = string.gsub(villagerlist, "德米特里厄斯 Icon", "Demetrius Icon") |
|||
table.insert(npcList, npc) |
|||
villagerlist = string.gsub(villagerlist, "矮人 Icon", "Dwarf Icon") |
|||
end |
|||
villagerlist = string.gsub(villagerlist, "艾芙琳 Icon", "Evelyn Icon") |
|||
end |
|||
villagerlist = string.gsub(villagerlist, "乔治 Icon", "George Icon") |
|||
villagerlist = string.gsub(villagerlist, "格斯 Icon", "Gus Icon") |
|||
if #npcList > 0 then |
|||
villagerlist = string.gsub(villagerlist, "贾斯 Icon", "Jas Icon") |
|||
flag = true |
|||
villagerlist = string.gsub(villagerlist, "乔迪 Icon", "Jodi Icon") |
|||
local hateList = table.concat(npcList, ",") |
|||
villagerlist = string.gsub(villagerlist, "科罗布斯 Icon", "Krobus Icon") |
|||
local mockFrame = { args = { [1] = hateList } } |
|||
villagerlist = string.gsub(villagerlist, "雷欧 Icon", "Leo Icon") |
|||
local processedList = processorFunc(mockFrame) |
|||
villagerlist = string.gsub(villagerlist, "刘易斯 Icon", "Lewis Icon") |
|||
villagerlist = string.gsub(villagerlist, "莱纳斯 Icon", "Linus Icon") |
|||
table.insert(result, '<tr>') |
|||
villagerlist = string.gsub(villagerlist, "玛妮 Icon", "Marnie Icon") |
|||
table.insert(result, |
|||
villagerlist = string.gsub(villagerlist, "潘姆 Icon", "Pam Icon") |
|||
'<th><span class="no-wrap">讨厌</span><br><span style="font-size:smaller;">-40</span></th>') |
|||
villagerlist = string.gsub(villagerlist, "皮埃尔 Icon", "Pierre Icon") |
|||
table.insert(result, '<td>' .. processedList .. '</td>') |
|||
villagerlist = string.gsub(villagerlist, "罗宾 Icon", "Robin Icon") |
|||
table.insert(result, '</tr>') |
|||
villagerlist = string.gsub(villagerlist, "桑迪 Icon", "Sandy Icon") |
|||
end |
|||
villagerlist = string.gsub(villagerlist, "文森特 Icon", "Vincent Icon") |
|||
end |
|||
villagerlist = string.gsub(villagerlist, "威利 Icon", "Willy Icon") |
|||
villagerlist = string.gsub(villagerlist, "法师 Icon", "Wizard Icon") |
|||
table.insert(result, '</table>') |
|||
villagerlist = string.gsub(villagerlist, "兰斯 Icon", "Lance Icon") |
|||
villagerlist = string.gsub(villagerlist, "马格努斯 Icon", "Magnus Icon") |
|||
if not flag then table.insert(result, '[[分类:礼物喜好解析存在问题的物品]]') end |
|||
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 |
|||
function p.generateGiftTable(frame) |
|||
end --if villagerlist == nil, then do nothing but return p |
|||
return p.generateGiftTableWithProcessor(frame, p.getCurrentProcessor(), p.getCurrentIDFunction(), p.getCurrentDataSource()) |
|||
end --end function p.tssve() |
|||
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]] [[%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