跳转到内容

Module:Character

来自Deltarune Wiki

用于管理角色数据存储与格式化的方法。

Documentation

Package items

character.act(frame) (function)
格式化信息框中的敌人 ACT 字段。
Parameter: frame Scribunto 框架对象 (table)
Returns: 格式化后的 ACT 列表 (string)
character.paramcat(frame) (function)
当提供 gold 参数时附加“敌人”分类, 当提供 wares 参数时附加“商人”分类。 (通过这些参数判断应应用哪个分类。)
Parameter: frame Scribunto 框架对象 (table)
Returns: 添加分类后的原始内容 (string)
character.undertale(frame) (function)
格式化用于链接回 Undertale Wiki 的参数。 仅在 Deltarune Wiki 使用。
Parameter: frame Scribunto 框架对象 (table)
Returns: 格式化后的回归角色参数 (string)
character.classification(frame) (function)
格式化光之民/暗之民分类字段, 并自动为页面添加分类。 仅在 Deltarune Wiki 使用。
Parameter: frame Scribunto 框架对象 (table)
Returns: 所有主体分类的列表 (string)
--- 用于管理角色数据存储与格式化的方法。
--  @module             character
--  @require            Module:Util
--  @require            Module:Yesno
--  @author             KockaAdmiralac
--  @author             Jacky720

require('strict')
local character = {}

--  导入依赖模块。
local util = require('Module:Util')
local yesno = require('Module:Yesno')

--  模块变量。
local title = mw.title.getCurrentTitle()
local bucket = mw.ext.bucket

--- 格式化信息框中的敌人 ACT 字段。
--  @function           character.act
--  @param              {table} frame Scribunto 框架对象
--  @returns            {string} 格式化后的 ACT 列表
function character.act(frame)
	local str = {}
	local index = 0
	local nocheck = frame.args[2]
	nocheck = mw.text.trim(nocheck)
	nocheck = mw.text.split(nocheck, '%s*,%s*')

	for _, battle in ipairs(mw.text.split(frame.args[1], '*', true)) do
		-- battle:某场战斗对应的 ACT 列表
		--   例如:"Cry (First box encounter)"
		--
		-- acts:除 Check 之外的 ACT
		--   例如:"Cry"
		--
		-- form:这些 ACT 所对应的形态或战斗
		--   例如:"First box encounter"
		--
		-- "nocheck" 参数(frame.args[2])
		-- 用于阻止自动添加 Check。

		battle = mw.text.trim(battle)

		if battle ~= '' then
			index = index + 1

			if index == 2 then
				table.insert(str, '* ')
			end

			if index > 1 then
				table.insert(str, '\n* ')
			end

			local acts, form = mw.ustring.match(
				battle,
				'^([^(]*)%s*%(?([^)]*)%)?$'
			)

			if not yesno(nocheck[index] or nocheck[1], false) then
				if acts ~= '' then
					table.insert(str, '检查、')
				else
					table.insert(str, '检查、')
				end
			end

			table.insert(str, acts)

			if form ~= '' then
				table.insert(str, ' (')
				table.insert(str, form)
				table.insert(str, ')')
			end
		end
	end

	return table.concat(str)
end

--- 当提供 <code>gold</code> 参数时附加“敌人”分类,
--  当提供 <code>wares</code> 参数时附加“商人”分类。
--  (通过这些参数判断应应用哪个分类。)
--
--  @function           character.paramcat
--  @param              {table} frame Scribunto 框架对象
--  @returns            {string} 添加分类后的原始内容
function character.paramcat(frame)
	local param = frame.args[1]

	if param == nil or param == '' then
		return
	end

	local str = {param}
	util.addCategory(str, frame.args[2])

	return table.concat(str)
end

--- 格式化用于链接回 Undertale Wiki 的参数。
--  仅在 Deltarune Wiki 使用。
--
--  @function           character.undertale
--  @param              {table} frame Scribunto 框架对象
--  @returns            {string} 格式化后的回归角色参数
function character.undertale(frame)
	local str = {}
	local names = frame.args[1]

	if names == nil or names == '' then
		return
	end

	if yesno(names, false) then
		if frame.args[2] == '' then
			-- 未指定名称
			names = title.text
		else
			names = frame.args[2]
		end
	end

	-- 遍历多个名称
	local namesList = {}

	for _, splitName in ipairs(mw.text.split(names, '、', true)) do
		local name = mw.text.trim(splitName)
		table.insert(
			namesList,
			string.format('[[ut:%s|%s]]', name, name)
		)
	end

	table.insert(str, table.concat(namesList, '、'))

	if frame.args[2] == '' then
		-- 对拥有独立信息框的 NPC 页面不添加分类
		util.addCategory(str, '回归角色')
	end

	return table.concat(str)
end

--- 格式化光之民/暗之民分类字段,
--  并自动为页面添加分类。
--  仅在 Deltarune Wiki 使用。
--
--  @function           character.classification
--  @param              {table} frame Scribunto 框架对象
--  @returns            {string} 所有主体分类的列表
function character.classification(frame)
	local out = {}

	for cat in mw.text.gsplit(frame.args[1], '、', true) do
		local trimmedCat = mw.text.trim(cat)

		if trimmedCat == 'Lightner' or trimmedCat == '光之民' then
			util.addCategory(out, '光之民')
			table.insert(out, '\n* [[光之民]]')
		elseif trimmedCat == 'Darkner' or trimmedCat == '暗之民' then
			util.addCategory(out, '暗之民')
			table.insert(out, '\n* [[暗之民]]')
		end
	end

	return table.concat(out)
end

return character