모듈:Ensemblestars

최근 편집: 2022년 9월 6일 (화) 19:03

이 모듈에 대한 설명문서는 모듈:Ensemblestars/설명문서에서 만들 수 있습니다

local p = {}

local function _card(args, frame)
	local returnText, images = '', {}

	if args['이름'] == nil then
		args['이름'] = '없음'
	end

	if args['개화'] == '전' then
		images[#images+1] = '개화 전'
	elseif args['개화'] == '후' then
		images[#images+1] = '개화 후'
	elseif args['개화'] == '전후' then
		images[#images+1] = '개화 전'
		images[#images+1] = '개화 후'
	else
		images[#images+1] = '개화 전'
	end

	local width = 160

	local plain = string.find(args[1], "【") == nil

	returnText = returnText .. '<table style="display:inline-block;"><tr>'

	for i, v in ipairs(images) do
		returnText = returnText .. '<td style="border-width:0;width:' .. width .. 'px;height:' .. (width/4*5) .. ';px;padding:0;">'

		if plain then
			returnText = returnText .. '[[파일:앙상블스타즈 for kakao ' .. args[1] .. ' 카드 ' .. v .. '.png'
		else
			returnText = returnText .. '[[파일:' .. args[1] .. ' ' .. v .. '.png'
		end

		returnText = returnText .. '|' .. width .. 'x' .. (width/4*5) .. '픽셀'

		local link = args['이미지 링크']
		if link ~= nil then 
			returnText = returnText .. '|링크=' .. link
		end

		returnText = returnText .. '|' .. args[1] .. ' ' .. v

		returnText = returnText .. ']]'

		returnText = returnText .. '</td>'
	end
	returnText = returnText .. '</tr>'

	if args['이름'] == '있음' then
		returnText = returnText .. '<tr><td style="border-width:0;width:160px;text-align:center;"'
		if #images == 2 then 
			returnText = returnText .. ' colspan=2'
		end

		if plain then
			returnText = returnText .. '>[[' .. args[1] .. '(앙상블스타즈 for kakao 카드)|' .. args[1] .. ']]'
		else
			returnText = returnText .. '>[[' .. args[1] .. ']]'
		end

		returnText = returnText .. '</td></tr>'
	end
	
	return returnText .. '</table>'
end

local function unitSkillTableStart(label)
	return '<table class = "sortable wikitable full-width-on-mobile">' .. 
		'<tr>' .. 
			'<th>' .. ( label ~= nil and label or '이름' ) .. '/효과</th>' .. 
			'<th>멤버</th>' .. 
			'<th>이벤트</th>' .. 
		'</tr>'
end

local function unitSkillTableEnd()
	return '</table>\n'
end

local function unitSkillRow(datum, frame) 
	local rt = '<tr>'

	--이름/효과 셀을 출력합니다.
	local dataSortValue = math.max(0, datum['댄스'] or 0, datum['보컬'] or 0, datum['퍼포먼스'] or 0, datum['Fantasy'] or 0, datum['Cool'] or 0, datum['Active'] or 0, datum['고평점'] or 0)
	rt = rt .. '<td data-sort-value='.. dataSortValue ..">'''" .. datum['이름'] .. "'''<br/>"

	if datum['아르바이트'] == nil then
		for i, v in ipairs( { '댄스', '보컬', '퍼포먼스' } ) do 
			if datum[v] ~= nil then rt =
				rt .. '<span style="background-color: '
				.. frame:expandTemplate{
					title = '앙상블스타즈 for kakao 속성 색깔',
					args = { v } 
				}
				.. '; color:white;border-radius:.3em;padding:.1em .4em;">'
				.. v .. '</span> '
		 		.. datum[v] .. '% △'
		 	end
		end
	else
		rt = rt .. '「' .. datum['아르바이트'] .. '」 '

		if datum['Fantasy'] ~= nil then rt = rt .. 'Fantasy ' .. datum['Fantasy'] .. '% ' end
		if datum['Cool'] ~= nil then rt = rt .. 'Cool ' .. datum['Cool'] .. '% ' end
		if datum['Active'] ~= nil then rt = rt .. 'Active ' .. datum['Active'] .. '% ' end
		if datum['고평점'] ~= nil then rt = rt .. '고평점 획득 확률 ' .. datum['고평점'] .. '% ' end

		rt = rt .. '상승'
	end

	rt = rt .. '</td>'
	--	
	rt = rt .. '<td style="line-height: 0;" data-sort-value='.. #datum ..'>'
	for i, v in ipairs(datum) do
		if i==math.floor(i) then
			rt = rt .. frame:expandTemplate{
				title = '앙상블스타즈 for kakao 아이돌',
				args = { v, ["이름"] = '아래' }
			}
		end
	end

	rt = rt .. '</td>'

	rt = rt .. '<td>' .. (datum['이벤트'] ~= nil and '[[' .. datum['이벤트'] .. '(앙상블스타즈 for kakao)|'..datum['이벤트']..']]' or '') .. '</td>'

	return rt .. '</tr>\n';
end

local function _unitSkill(args, frame)
	local data, returnText = {}, ''

	for i, v in ipairs(args) do
		data[#data+1] = {}

		for token in string.gmatch(v, '%s*([^,\n]+)%s*') do

			local left, right = string.match(token, '(.+):'), string.match(token, ':(.+)')

			if left ~= nil and right ~= nil then
				data[#data][left] = right
			else
				data[#data][#data[#data]+1] = token
			end
			
		end
	end

	table.sort(data, function (left, right) return #left < #right end)

	returnText = returnText .. '== 효과별 ==\n아래 표에는 종료된 이벤트 유닛 스킬은 제외되어 있다.\n'

	returnText = returnText .. '=== 댄스(레드) ===\n'
	returnText = returnText	 .. unitSkillTableStart('이름')
	for i, v in ipairs(data) do
		if v['댄스'] ~= nil and (v['이벤트'] == nil or v['이벤트'] == args['이벤트']) then 
			returnText = returnText	 .. unitSkillRow(v,frame)
		end
	end
	returnText = returnText	 .. unitSkillTableEnd()

	returnText = returnText .. '=== 보컬(블루) ===\n'
	returnText = returnText	 .. unitSkillTableStart('이름')
	for i, v in ipairs(data) do
		if v['보컬'] ~= nil and (v['이벤트'] == nil or v['이벤트'] == args['이벤트']) then 
			returnText = returnText	 .. unitSkillRow(v,frame)
		end
	end
	returnText = returnText	 .. unitSkillTableEnd()

	returnText = returnText .. '=== 퍼포먼스(옐로) ===\n'
	returnText = returnText	 .. unitSkillTableStart('이름')
	for i, v in ipairs(data) do
		if v['퍼포먼스'] ~= nil and (v['이벤트'] == nil or v['이벤트'] == args['이벤트']) then 
			returnText = returnText	 .. unitSkillRow(v,frame)
		end
	end
	returnText = returnText	 .. unitSkillTableEnd()

	returnText = returnText .. '=== 아르바이트 ===\n'
	returnText = returnText	 .. unitSkillTableStart('이름')
	for i, v in ipairs(data) do
		if v['아르바이트'] ~= nil and (v['이벤트'] == nil or v['이벤트'] == args['이벤트']) then 
			returnText = returnText	 .. unitSkillRow(v,frame)
		end
	end
	returnText = returnText	 .. unitSkillTableEnd()

	returnText = returnText .. '== 조건별 ==\n아래 표에는 종료된 이벤트 유닛 스킬은 제외되어 있다.\n'

	returnText = returnText .. '=== 유닛 ===\n'
	returnText = returnText	 .. unitSkillTableStart('유닛')
	for i, v in ipairs(data) do
		if v['조건'] == '유닛' and v['이벤트'] == nil then 
			returnText = returnText	 .. unitSkillRow(v,frame)
		end
	end
	returnText = returnText	 .. unitSkillTableEnd()

	returnText = returnText .. '=== 동아리 ===\n'
	returnText = returnText	 .. unitSkillTableStart('동아리')
	for i, v in ipairs(data) do
		if v['조건'] == '동아리' and v['이벤트'] == nil then 
			returnText = returnText	 .. unitSkillRow(v,frame)
		end
	end
	returnText = returnText	 .. unitSkillTableEnd()

	returnText = returnText .. '=== 기타 ===\n'
	returnText = returnText	 .. unitSkillTableStart('이름')
	for i, v in ipairs(data) do
		if v['조건'] ~= '유닛' and v['조건'] ~= '동아리' and (v['이벤트'] == nil or v['이벤트'] == args['이벤트']) then 
			returnText = returnText	 .. unitSkillRow(v,frame)
		end
	end
	returnText = returnText	 .. unitSkillTableEnd()

	returnText = returnText .. '== 전체 ==\n아래 표에는 종료된 이벤트 유닛 스킬도 포함되어 있다.\n'
	returnText = returnText	 .. unitSkillTableStart('이름')
	for i, v in ipairs(data) do
		returnText = returnText	 .. unitSkillRow(v,frame)
	end
	returnText = returnText	 .. unitSkillTableEnd()
	
	return returnText
	-- 조건
	-- 	유닛 / 동아리
	-- 효과
	-- 	속성 증가(레드, 블루, 옐로) / 아르바이트
	-- 인원수
	--
end

-------------------------------------
-- 점 항목(2단계부터 시작)으로 된 이벤트 리스트를 만듭니다.
-------------------------------------
local function _eventList(args, frame)
	local data, returnText, ct = {}, '', 0

	for i, v in ipairs(args) do
		if i % 3 == 1 then
			data[#data+1] = {}
			data[#data]['name'] = v
		elseif i % 3 == 2 then
			if v == '' then
				data[#data]['start'] = 0
			else
				data[#data]['start'] = frame:callParserFunction('#time', { 'U', v })+0
			end
		elseif i % 3 == 0 then
			if v == '' or v == '\n' then
				data[#data]['end'] = 0
			else
				data[#data]['end'] = frame:callParserFunction('#time', { 'U', v })+0
			end
		end
	end

	local format = '* [[파일:앙상블스타즈 for kakao %s 배너.png' ..
		'|class=notpageimage' ..
		'|204px|링크=%s(앙상블스타즈 for kakao)]]\n'
	local now = os.time()+60*60*9

	--진행중인 이벤트들을 자례대로 출력합니다.
	ct = 0
	for i, v in ipairs(data) do
		if
			( v['start'] ~= 0 or v['end'] ~= 0 )
			and ( v['start'] == 0 or now > v['start'] ) 
			and ( v['end'] == 0 or now < v['end'] )
			then
			ct = ct + 1
			returnText = returnText .. string.format(format, v['name'], v['name'])
		end
	end

	if ct == 0 then
		returnText = returnText .. '* (없음)\n'
	end

	--아직 진행 전인 이벤들을 시작이 빠른 순으로 출력합니다.
	local notice = ''
	ct = 0
	table.sort(data, function(left, right) return left['start']<right['start'] end)
	for i, v in ipairs(data) do
		if
			( v['start'] == 0 and v['end'] == 0 )
			or (
				( v['start'] ~= 0 and now < v['start'] )
				and ( v['end'] == 0 or now < v['end'] )
			)
			then
			ct = ct + 1
			notice = notice .. string.format(format, v['name'], v['name'])
		end
	end
	if ct ~= 0 then
		returnText = returnText .. '** 예고\n' .. notice
	end

	--종료된 이벤트는 종료가 늦은 순으로 출력합니다.
	returnText = returnText .. '* 지난 이벤트\n'
	table.sort(data, function(left, right) return left['end']>right['end'] end)
	for i, v in ipairs(data) do
		if 
			( v['start'] ~= 0 or v['end'] ~= 0 )
			and ( v['end'] ~= 0 and now > v['end'] )
			and ( v['start'] == 0 or now > v['start'] ) 
			then
			returnText = returnText .. string.format(format, v['name'], v['name'])
		end
	end

	return string.sub(returnText, 1,string.len(returnText)-1) --마지막 문자(\n)는 빼고 출력합니다.
end

-------------------------------------
-- frame 객체가 틀에서 호출되어 생긴 frame인지 바로 모듈이 호출되어 생긴 frame인지와 무관하게 args를 찾습니다.
-- @param frame 호출되면서 자동으로 만들어진 frame 객체.
-- @return args 호출되면서 전달받은 전달인자.
-------------------------------------
local function safeArgs(frame)
	if frame.args[1] ~= nil then --frame은 metatable이라 next(frame.args)가 안 된다고 하여 이리 되었습니다.
		return frame.args
	else
		return frame:getParent().args
	end
end

function p.card(frame)
	return _card(safeArgs(frame), frame)
end

function p.unitSkill(frame)
	return _unitSkill(safeArgs(frame), frame)
end

function p.eventList(frame)
	return _eventList(safeArgs(frame), frame)
end

return p