模块:CharactersAppearanceNodes

来自有兽档案馆
文档图示 模块文档[创建] [跳转到代码]

本模块还没有文档页面。

您可以创建文档以让编者更好地理解本模块的用途。
编者可以在本模块的沙盒创建 | 镜像和测试样例创建页面进行实验。
请将模块自身所属的分类添加在文档中。本模块的子页面
local p = {}
--当角色列表更新时请更改这里
local namelist={"天禄","辟邪","辟邪的小鸡","四不像","兔爷","青鸟","二两","八斤","瓦猫","Lady瓦","吐宝神鼬","獬豸","谢兰兰","小山雀","刍狗","小山雀的孩子们","兜兜","小勺","巴陵君","巴狗蛋","巴赫","永夜","壮壮","盘湖","猫猫泪","慕容雪川","花椒","天尊","金角","银角","土蝼","英招","谛听","擎火","阿飘","骷髅猫","骷髅鼠","骷髅鱼头","芝麻","骷猫猫","魔王松鼠","小饼","嗷嗷","福仔","翔太","牧","犬张子","战虎","核桃","夹竹桃","棉桃","云豆","始麒麟","玉麒麟","四不相","糖麒麟","四一星","兔三星","皮七星","凤星星","荔枝","葡萄","花蕊鸟","凤皇","经纪鸽","风凰","金翅大鹏","经纪鸦","孔雀","比比","克里斯蒂娜","饕餮","梼杌","穷奇","穷大长","混沌","帝江","三足金乌","金十","擎天树","老金人","白泽","小白泽","地藏菩萨","九月","哪吒","敖烈","哮天","大毛","敖丙","豆豆","安东尼","麒麟舅舅","徐哼唧","苍天","大地","徐大山","睚眦","金沙","米乌拉","猫大爷","青子","虹虹","彩虹云","双皮奶","黄四","黄五","陈思德","耳鼠","乐乐","鲶鱼精","宇佐见","绿子","智纪","小樱","狐狸长老","当康","小沙","水萝卜精","骷髅锦鲤","储备粮","喳喳","诸犍","老八哥","波波","米糖","令狐紫"}
local function inlist(value)
	for _, v in ipairs(namelist) do
		if v == value then
			return true
		end
	end
	return false
end
function p.list( frame )
	--查询角色是否符合规定的函数
	
	local char1=frame.args[1]
	-- 判断如果角色名1是空值则返回“输入角色名称”
	if char1=="" or nil then
		return frame:expandTemplate{title="Error", args={"请输入角色名称"}}
	end
	if inlist(char1)==false then
		return frame:expandTemplate{title="Error", args={'以下角色不在[[属性:OnCamera:character name]]规定的角色列表内:' .. char1}}
	end
	local char2=frame.args[2]
	if char2 ~= "" then
		if inlist(char2)==false then
			return frame:expandTemplate{title="Error", args={'以下角色不在[[属性:OnCamera:character name]]规定的角色列表内:' .. char2}}
		end
	end
	-- 定义话别个数查询函数,character为角色名,kind为出场类型。下同
	local function askcount(char1,char2)
		local countlist={}
		local summarylist={}
		local character=nil
		local askkind=nil
		local summaryall=nil
		-- 如果角色名2为空,则只查询角色名1,否则同时查询二者
		if char2=="" then
			character=char1
		else
			character=char1.."||"..char2
		end
		-- 根据kind不同的值对askkind(话别出场类型的查询参数)赋不同的值
		local kindlist={"全部","主要","次要","背景"}
		for _,i in ipairs(kindlist) do
			if i == "全部" then
				askkind = ""
			else
				askkind = "[[OnCamera:type::"..i.."]]"
			end
			countlist[i] = mw.smw.ask("[[OnCamera:character name::"..character.."]]"..askkind.."|?OnCamera:number=|mainlabel=-|sort=OnCamera:number|limit=1000|format=count")
			if i == "全部" then
				summaryall=char1.."在档案馆已有条目的漫画中一共出现了"..countlist["全部"].."话,其中有"
			else
				if countlist[i]==0 then
					summarylist[i]=""
				else
					if i=="主要" then
						summarylist[i]=countlist[i].."话作为"..i.."角色出场"
					else
						summarylist[i]=",有"..countlist[i].."话作为"..i.."角色出场"
					end
				end
			end
		end
		result=summaryall..summarylist["主要"]..summarylist["次要"]..summarylist["背景"].."。\n"
		return result
	end
	local function asklist(char1,char2,kind)
		local character=nil
		-- 如果角色名2为空,则只查询角色名1,否则同时查询二者
		if char2=="" then
			character=char1
		else
			character=char1.."||"..char2
		end
		local res = mw.smw.ask("[[OnCamera:character name::"..character.."]][[OnCamera:type::"..kind.."]]|?OnCamera:number=|mainlabel=-|sort=OnCamera:number|limit=1000")
		return res
	end
	local function listoutput(nlist)
		-- 创建一个空的字符串result
		local result = ""
		-- 创建一个空的table类型的变量groups,用来存放不同范围的数字序列
		local groups = {}
		-- 遍历nlist中的每个元素,判断它属于哪个范围,并加入到相应的序列中
		for _, v in ipairs(nlist) do
			local num=tonumber(v[1])
			if num then
				-- 检查数值是否为整百
				local isWholeHundred = num % 100 == 0
				-- 计算元素所属的范围的索引,例如100以内的索引是1,100-200之间的索引是2,以此类推
				local index = math.floor(num / 100) + (isWholeHundred and 0 or 1)
				-- 如果索引在1到9之间,才进行处理
				-- 当最新话别的整百话出现变更时(如8xx到9xx),请更改这里
				if index >= 1 and index <= 10 then
					-- 如果groups中还没有该索引对应的序列,就创建一个空的序列
					if not groups[index] then
						groups[index] = {}
					end
				-- 把元素加入到该索引对应的序列中
				table.insert(groups[index], num)
				end
			end
		end
		-- 遍历groups中的每个序列,如果有值,就用符号“·”拼接为字符串,并加入到result中
		-- 当最新话别的整百话出现变更时(如8xx到9xx),请更改这里
		for i = 1, 10 do
			-- 如果groups中有该索引对应的序列,就进行处理
			if groups[i] then
				if i==1 then
						period="第1~100话"
					-- 当最新话别的整百话出现变更时(如8xx到9xx),请更改这里
					elseif i==10 then
						period="第901话及以后"
					else
						period="第"..tostring(i-1).."01~"..tostring(i).."00话"	
				end
				result = result ..frame:expandTemplate{title="Hide", args={period,"[[第"..table.concat(groups[i], "话]]·[[第").."话]]"}}
			end
		end
		return result
	end
	-- 程序正式开始
	output=askcount(char1,char2)
	local typelist={"主要","次要","背景"}
	for _,i in ipairs(typelist) do
		nodes=asklist(char1,char2,i)
		if nodes~=nil then
			output=output..frame:expandTemplate{title="Hide", args={"作为"..i.."角色出场",listoutput(nodes)}}
		end
	end
	return output
end
function p.appearance( frame )
	local kind=frame.args[1]
	local ordertype=""
	if kind=="first" then
		ordertype=""
	end
	if kind=="latest" then
		ordertype="|order=desc"
	end
	local character=frame.args[2]
	if character=="" or nil then
		return frame:expandTemplate{title="Error", args={"请输入角色名称"}}
	end
	if inlist(character)==false then
		return frame:expandTemplate{title="Error", args={'以下角色不在[[属性:OnCamera:character name]]规定的角色列表内:' .. character}}
	end
	local res=mw.smw.ask("{{#ask:[[OnCamera:character name::"..character.."]]|mainlabel=-|?OnCamera:number=|sort=OnCamera:number"..ordertype.."|limit=1|searchlabel=}}")
	return "[[第"..res[1][1].."话]]"
end
return p