Module:Akcharinfo
跳到导航
跳到搜索
-- This is to to make T:Akcharinfo slightly less dirty. -- Crappy code originally by U:公的驱逐舰(One-Six) of Moegirlpedia. -- Gotta praise the Crocc. local p = {} -- 使函数从全局变量变成upvalue,加快速度 local ipairs = ipairs local tonumber = tonumber local format = string.format local getArgs = require('Module:Arguments').getArgs local disam = require('Module:Akdisam').disam local function roundToString(num, numDecimalPlaces) return format("%."..(numDecimalPlaces or 0).."f", num) end --- get arguments, alias-aware. Aliases towards the front of the array have priority. -- @param args table[string | number, string] 参数表 -- @param aliasArray table[string] 参数别名表 -- @param denyEmptyString boolean 是否将空字符串当作nil local function getArgFromAlias(args, aliasArray, denyEmptyString) for _, argsAlias in ipairs(aliasArray) do local arg = args[argsAlias] if arg and not (denyEmptyString and arg == '') then return arg end end return nil end function p.main(frame) local args = getArgs(frame, {wrappers = {"Template:沙盒", "Template:Akcharinfo"}}) return p._main(frame, args) end function p._main(frame, args) local name = getArgFromAlias(args, {"name", "干员名", "1", 1}) assert(name, "干员名不能为空") local elv = tonumber(getArgFromAlias(args, {"elite-lv", "精英等级", "elite", "精英", "2", 2})) or 0 local skill = getArgFromAlias(args, {"skill", "技能", "3", 3}, true) or "无技能" local sklv = tonumber(getArgFromAlias(args, {"skill-lv", "技能等级", "sklv", "4", 4})) or 0 local oplv = tonumber(getArgFromAlias(args, {"level", "干员等级", "lv", "等级", "5", 5})) or 1 local pot = tonumber(getArgFromAlias(args, {"potential", "潜能", "pot", "6", 6})) or 0 local support = string.lower(getArgFromAlias(args, {"support", "支援", "7", 7}) or "") == "true" and true or false local width = tonumber(getArgFromAlias(args, {"width", "size", "8", 8})) or 100 local skin = getArgFromAlias(args, {"skin", "皮肤", "9", 9}, true) local output = {} local n = 0 -- 缓存 output 长度,避免频繁调用 #output --- 将所有参数加入 output 表中 -- @param ... string | number local function append(...) local elems = {...} for i, v in ipairs(elems) do output[n + i] = v end n = n + #elems end append('<div style="width:', width, 'px;height:', width * 1.2, 'px;position:relative;display:inline-block">') -- 头像背景 append( '<span style="', 'position:absolute;top:0;left:0;', 'width:', width, 'px;', 'height:', width, 'px;', 'background:linear-gradient(to right,', support and '#c81, #543' or '#555, #333',')', '"></span>' ) -- 头像图片 local avatarFileNameSuffix = '' if skin then avatarFileNameSuffix = '_'..skin elseif elv == 2 then avatarFileNameSuffix = '_2' end append( '<span style="position:absolute;top:0;left:0">', '[[File:明日方舟 tx ', name, avatarFileNameSuffix, '.png|', roundToString(width, 0), 'px|link=', disam(name), ']]', '</span>' ) -- 信息背景 append( '<span style="', 'position:absolute;top:', width * 0.7, 'px;left:0;width:', width, 'px;height:', width * 0.5, 'px;background:linear-gradient(to bottom, transparent, rgba(0,0,0,.8) 60%, black 60%)', '"></span>' ) -- 技能图标 append( '<span style="position:absolute;bottom:', width * 0.05, 'px;left:', width * 0.05, 'px">', '[[File:明日方舟技能 ', skill, '.png|', roundToString(width * 0.25, 0), 'px|link=]]', '</span>' ) -- 精英等级 local fileNameElv = ({[0] = '1', [1] = '1+', [2] = '2'})[elv] or '' append( '<span style="position:absolute;bottom:', width * 0.05, 'px;left:', width * 0.33, 'px">', '[[File:精英', fileNameElv, '_图标.png|', roundToString(width * 0.2, 0), 'px|link=]]', '</span>' ) -- 干员等级 append( '<span style="', 'position:absolute;top:', width * 0.965, 'px;left:', width * 0.635, 'px;width:max-content;font-weight:bold;color:#ccc;font-size:30px;transform:translate(-50%,-50%) scale(', width * 0.002, ')', '">L V</span>' ) append( '<span style="position:absolute;bottom:0;left:', width * 0.53, 'px;width:', width * 0.2, 'px;text-align:center;vertical-align:bottom;color:white;font-size:', width * 0.16, 'px">', oplv, '</span>' ) -- 技能等级 local smallTextRefererWidth = width >= 100 and width or 100 if sklv >= 1 and sklv <= 7 then append( '<span style="position:absolute;bottom:', width * 0.24, 'px;left:0;width:', smallTextRefererWidth * 0.12, 'px;height:', smallTextRefererWidth * 0.12, 'px;background:#333;color:white;font-size:', smallTextRefererWidth * 0.07, 'px;text-align:center;line-height:', smallTextRefererWidth * 0.12, 'px;font-weight:bold;">', sklv, '</span>' ) elseif sklv >= 8 and sklv <= 10 then append( '<div style="position:absolute;bottom:', width * 0.24, 'px;left:0;width:', smallTextRefererWidth * 0.12, 'px;height:', smallTextRefererWidth * 0.12, 'px;overflow:hidden;">', '<img style="position:absolute;height:', smallTextRefererWidth * 0.12, 'px;top:0;left:', (8 - sklv) * 0.12 * smallTextRefererWidth, 'px;" src="', frame:callParserFunction("filepath:AkSkillMasterDots.svg", {}), '"><div style="display:none;">[[File:AkSkillMasterDots.svg]]</div></div>' ) end -- 潜能 if pot >= 1 and pot <= 5 then append( '<span style="', 'position:absolute;bottom:', width * 0.05, 'px;right:', width * 0.25, 'px;width:', width * 0.01, 'px;height:', width * 0.2, 'px;background:linear-gradient(to bottom, transparent, white 50%, rgba(255,255,255,.8)', '"></span>' ) end append('<span style="position:absolute;bottom:', width * 0.05, 'px;right:', width * 0.03, 'px">') if pot >= 1 and pot <= 5 then append('[[File:明日方舟潜能_', pot, '.png|', roundToString(width * 0.2, 0), 'px|link=]]') end append('</span>') append('</div>') return table.concat(output) end return p