The Alchemist Code Wiki

READ MORE

The Alchemist Code Wiki
mNo edit summary
(using mw.html)
Line 4: Line 4:
 
local render_unit_icon = require('Module:Render/Unit')._icon
 
local render_unit_icon = require('Module:Render/Unit')._icon
 
local model = require('Module:Data').model
 
local model = require('Module:Data').model
  +
  +
local function makeInfobox(args)
  +
local root = mw.html.create('div')
  +
root:addClass('infobox')
  +
root:addClass(args.class)
  +
root:css{
  +
['float'] = 'right',
  +
['margin-left'] = '15px',
  +
['width'] = '300px',
  +
['border'] = '1px solid #aaa',
  +
['background'] = '#eee',
  +
['font-size'] = '12px',
 
}
  +
local heading = root:tag('div')
  +
heading:addClass('heading')
  +
heading:css{
  +
['background'] = 'goldenrod',
  +
['font-weight'] = 700,
  +
['font-size'] = '140%',
  +
['line-height'] = '1.25em',
  +
['display'] = 'flex',
  +
['flex-direction'] = 'row',
  +
['justify-items'] = 'flex-start',
  +
['text-align'] = 'center',
  +
['min-height'] = '64px',
 
}
  +
local icon = heading:tag('div')
  +
icon:addClass('infobox-icon')
  +
icon:css{
  +
['flex'] = '0 0 64px',
  +
['padding'] = '0.25rem',
 
}
  +
icon:node(args.icon)
  +
local name = heading:tag('div')
  +
name:addClass('name')
  +
name:css{
  +
['flex'] = '1 1 100%',
  +
['display'] = 'flex',
  +
['text-align'] = 'center',
  +
['align-items'] = 'center',
  +
['justify-content'] = 'center',
  +
['margin'] = '0',
  +
['padding'] = '0.25rem',
 
}
  +
name:wikitext(args.name)
  +
local wrapper = root:tag('div')
  +
wrapper:addClass('wrapper')
  +
wrapper:css{
  +
['flex'] = '1 1 100%',
  +
['overflow']='hidden',
 
}
  +
local dl = wrapper:tag('dl')
  +
dl:css{
  +
['display'] = 'grid',
  +
['grid-template-columns'] = '100px 1fr',
 
}
  +
  +
local function printRow(t, label, content)
  +
if content == nil then return end
 
local dt = t:tag('dt')
  +
dt:css{
  +
['grid-column-start'] = 1,
  +
['padding'] = '2px 8px 2px 3px',
  +
['text-align'] = 'right',
  +
['border-right'] = '2px solid #aaa',
  +
['margin'] = '0 -2px 0 0',
  +
}
  +
dt:wikitext(label)
  +
local dd = t:tag('dd')
  +
dd:css{
  +
['grid-column-start'] = 2,
  +
['margin'] = 0,
  +
['padding'] = '2px 7px',
  +
['border-left'] = '2px solid #aaa',
  +
}
  +
dd:wikitext(content)
 
end
 
  +
for i, label in ipairs(args.labels) do
  +
printRow(dl, label, args.rows[label])
 
end
  +
  +
return tostring(root)
 
end
   
 
local p = {}
 
local p = {}
Line 43: Line 127:
 
local data = rows[1]
 
local data = rows[1]
 
local getLoc = function(param) return model.getLoc(data._pageName, param) end
 
local getLoc = function(param) return model.getLoc(data._pageName, param) end
  +
local name = getLoc('name')
 
local sb = {}
+
local icon = mw.html.create('div')
  +
icon:addClass('item-icon')
  +
local img = icon:tag('div')
  +
img:addClass('img x-'..data.rare..' y-4')
  +
img:css{
  +
['width'] = '57px',
  +
['height'] = '57px',
  +
['padding'] = '3.5px',
  +
}
  +
img:wikitext('[[File:Game,ConceptCardIcon,',data.icon,'.png|57px]]')
 
local maxLevels = {1, 25, 30, 35, 40}
 
-- Memento extra data
 
local extra = mw.loadData("Module:Data/Extra/Memento")[iname] or {}
  +
local releaseDates
  +
for _, region in ipairs{'jp', 'gl'} do
  +
local date = extra[region..'Date']
 
if date then
  +
releaseDates = releaseDates or mw.html.create('ul')
  +
releaseDates:tag('li'):wikitext(region:upper(), ': ', date)
 
end
 
end
  +
 
local cats = {
 
local cats = {
 
'Memento'
 
'Memento'
 
}
 
}
  +
local root = mw.html.create()
 
-- Info Box
 
-- Info Box
  +
local infobox = makeInfobox{
table.insert(sb, '{| class="wikitable unit ibox" style="float:right; margin-left: 15px;margin-bottom:0; width: 482px"\n| style="padding:0;width:128px;white-space: nowrap" | ')
 
local name = getLoc('name')
+
name = name,
  +
icon = icon,
table.insert(sb, render_memento_icon({iname, data=data, size='large', name='none', link='none'}))
 
  +
labels = {
table.insert(sb, '\n! colspan="2" style="padding:12px;font-size:140%;" | ')
 
  +
'Type',
table.insert(sb, name)
 
  +
'Rank',
table.insert(sb, '<span style="font-size:65%"><br/>\n')
 
  +
'Max level',
table.insert(sb, data.rare + 1)
 
  +
'Enhancer cost',
table.insert(sb, '★ Memento<br/>\n')
 
  +
'Enhancer EXP',
table.insert(sb, '[http://www.alchemistcodedb.com/card/' .. string.lower(string.gsub(iname, '_', '-')) .. ' See on Alchemist Code Database]\n')
 
  +
'Enhancer trust',
if data.type then
 
 
'Vision Clear Reward',
table.insert(sb, '|-\n!colspan="2"|Type\n|')
 
  +
'Gives unit',
local typeMap = {
 
['1'] = 'Equipment',
+
'Source',
['2'] = 'Enhance EXP',
+
'Release dates',
['3'] = 'Enhance Trust',
+
'Global only',
  +
'External links',
  +
},
  +
rows = {
 
['Type'] = typeMap[data.type],
  +
['Rank'] = (data.rare + 1)..'★',
 
['Max level'] = maxLevels[data.rare + 1],
 
['Enhancer cost'] = data.en_cost, -- zeni required to upgrade a memento with this memento
 
['Enhancer EXP'] = data.en_exp, -- EXP given by this memento
 
['Enhancer trust'] = data.en_trust,
  +
['Vision Clear Reward'] = getVCR(data),
 
['Gives unit'] = getUnitReward(data),
  +
['Source'] = extra.source or 'Unreleased',
  +
['Release dates'] = releaseDates and tostring(releaseDates) or nil,
  +
['Global only'] = extra.glOnly and 'Yes' or nil,
  +
['External links'] = '[http://www.alchemistcodedb.com/card/'..iname:gsub('_','-'):lower()..' AlchemistCodeDB]',
 
}
 
}
  +
}
table.insert(sb, typeMap[data.type])
 
  +
root:node(infobox)
table.insert(sb, '\n')
 
 
if data.type and typeMap[data.type] then
 
cats[#cats+1] = typeMap[data.type] .. ' memento'
 
cats[#cats+1] = typeMap[data.type] .. ' memento'
end
 
table.insert(sb, '|-\n!colspan="2"|Max Level\n|')
 
local maxLevels = {1, 25, 30, 35, 40}
 
table.insert(sb, maxLevels[data.rare + 1])
 
table.insert(sb, '\n')
 
-- The amount of zeni required to upgrade another memento with this memento
 
table.insert(sb, '|-\n!colspan="2"|Enhancer Cost (Zeni)\n|')
 
table.insert(sb, data.en_cost)
 
table.insert(sb, '\n')
 
-- Enhancer EXP is the amount of EXP this memento gives
 
table.insert(sb, '|-\n!colspan="2"|Enhancer EXP\n|')
 
table.insert(sb, data.en_exp)
 
table.insert(sb, '\n')
 
if data.en_trust then
 
table.insert(sb, '|-\n!colspan="2"|Enhancer Trust\n|')
 
table.insert(sb, data.en_trust)
 
table.insert(sb, '\n')
 
 
end
 
end
   
-- Vision Clear Reward
 
local vcr = getVCR(data)
 
if vcr then
 
table.insert(sb, '|-\n!colspan="2"|Vision Clear Reward\n|')
 
table.insert(sb, vcr)
 
table.insert(sb, '\n')
 
end
 
 
-- Unit reward
 
local unit_reward = getUnitReward(data)
 
if unit_reward then
 
table.insert(sb, '|-\n!colspan="2"|Gives Unit\n|')
 
table.insert(sb, unit_reward)
 
table.insert(sb, '\n')
 
end
 
 
-- Memento extra data
 
local mementoExtra = mw.loadData("Module:Data/Extra/Memento")
 
 
table.insert(sb, '|-\n!colspan="2"|Source\n|')
 
 
if mementoExtra[iname] and mementoExtra[iname]['source'] then
 
table.insert(sb, mementoExtra[iname]['source'])
 
else
 
table.insert(sb, 'Unreleased')
 
end
 
 
table.insert(sb, '\n')
 
 
if mementoExtra[iname] then
 
if mementoExtra[iname]['glDate'] then
 
table.insert(sb, '|-\n!colspan="2"|Release Date\n| '..mementoExtra[iname]['glDate'].."\n")
 
end
 
if mementoExtra[iname]['jpDate'] then
 
table.insert(sb, '|-\n!colspan="2"|JP Release Date\n| '..mementoExtra[iname]['jpDate'].."\n")
 
end
 
if mementoExtra[iname]['glOnly'] then
 
table.insert(sb, '|-\n!colspan="2"|Global Only\n| Yes\n')
 
end
 
end
 
 
 
-- Body
 
-- Body
 
-- Card Image + Flavor
 
-- Card Image + Flavor
  +
root:tag('div'):addClass('responsive-img')
table.insert(sb, '|}\n<div class="responsive-img" style="margin:auto;width:fit-content">[[File:Game,ConceptCard,')
 
  +
:css{
table.insert(sb, data.icon)
 
  +
['margin'] = 'auto',
table.insert(sb, '.png]]<div style="max-width:1024px;padding:8px;">')
 
  +
['width'] = 'fit-content',
table.insert(sb, getLoc('flavor'))
 
  +
}
table.insert(sb, '</div></div>')
 
  +
:wikitext('[[File:Game,ConceptCard,', data.icon, '.png]]')
 
  +
:tag('div'):addClass('flavor')
  +
:css{
  +
['max-width'] = '1024px',
  +
['padding'] = '8px',
  +
}
 
:wikitext(getLoc('flavor'))
  +
-- TODO: Stats + Effects
  +
 
-- Category
 
-- Category
 
for i, cat in ipairs(cats) do
 
for i, cat in ipairs(cats) do
table.insert(sb, '\n[[Category:'.. cat ..']]')
+
root:wikitext('[[Category:', cat, ']]')
 
end
 
end
 
-- TODO Implement http://cdn.alchemistcodedb.com/assets/big-card-frames-b34ac394d6035fb657d491b956e2c4764836b51b9361fccc4b31e722a27df510.png
 
-- TODO Implement http://cdn.alchemistcodedb.com/assets/big-card-frames-b34ac394d6035fb657d491b956e2c4764836b51b9361fccc4b31e722a27df510.png
 
 
return table.concat(sb)
+
return tostring(root)
 
end
 
end
   
Line 189: Line 261:
 
if content == nil then return end
 
if content == nil then return end
 
t:tag('dt')
 
t:tag('dt')
-- :cssText('grid-column-start:1;border-right:2px solid #999;margin:0 -2px 0 0;padding:2px 8px 2px 3px;text-align:right')
+
-- :css{['grid-column-start']='1',['border-right']='2px solid #999',['margin']='0 -2px 0 0',['padding']='2px 8px 2px 3px',['text-align']='right'}
 
:wikitext(label)
 
:wikitext(label)
 
t:tag('dd')
 
t:tag('dd')
-- :cssText('grid-column-start:2;border-left:2px solid #999;margin:0;padding:2px 7px;text-align:left')
+
-- :css{['grid-column-start']='2',['border-left']='2px solid #999',['margin']='0',['padding']='2px 7px',['text-align']='left'}
 
:wikitext(content)
 
:wikitext(content)
 
end
 
end

Revision as of 03:57, 14 February 2020

Documentation for this module may be created at Module:Page/Memento/doc

local render_item_icon = require('Module:Render/Item')._icon
local render_gear_icon = require('Module:Render/Gear')._icon
local render_memento_icon = require('Module:Render/Memento')._icon
local render_unit_icon = require('Module:Render/Unit')._icon
local model = require('Module:Data').model

local function makeInfobox(args)
	local root = mw.html.create('div')
	root:addClass('infobox')
	root:addClass(args.class)
	root:css{
		['float'] = 'right',
		['margin-left'] = '15px',
		['width'] = '300px',
		['border'] = '1px solid #aaa',
		['background'] = '#eee',
		['font-size'] = '12px',
	}
	local heading = root:tag('div')
	heading:addClass('heading')
	heading:css{
		['background'] = 'goldenrod',
		['font-weight'] = 700,
		['font-size'] = '140%',
		['line-height'] = '1.25em',
		['display'] = 'flex',
		['flex-direction'] = 'row',
		['justify-items'] = 'flex-start',
		['text-align'] = 'center',
		['min-height'] = '64px',
	}
	local icon = heading:tag('div')
	icon:addClass('infobox-icon')
	icon:css{
		['flex'] = '0 0 64px',
		['padding'] = '0.25rem',
	}
	icon:node(args.icon)
	local name = heading:tag('div')
	name:addClass('name')
	name:css{
		['flex'] = '1 1 100%',
		['display'] = 'flex',
		['text-align'] = 'center',
		['align-items'] = 'center',
		['justify-content'] = 'center',
		['margin'] = '0',
		['padding'] = '0.25rem',
	}
	name:wikitext(args.name)
	local wrapper = root:tag('div')
	wrapper:addClass('wrapper')
	wrapper:css{
		['flex'] = '1 1 100%',
		['overflow']='hidden',
	}
	local dl = wrapper:tag('dl')
	dl:css{
		['display'] = 'grid',
		['grid-template-columns'] = '100px 1fr',
	}

	local function printRow(t, label, content)
		if content == nil then return end
		local dt = t:tag('dt')
		dt:css{
			['grid-column-start'] = 1,
			['padding'] = '2px 8px 2px 3px',
			['text-align'] = 'right',
			['border-right'] = '2px solid #aaa',
			['margin'] = '0 -2px 0 0',
		}
		dt:wikitext(label)
		local dd = t:tag('dd')
		dd:css{
			['grid-column-start'] = 2,
			['margin'] = 0,
			['padding'] = '2px 7px',
			['border-left'] = '2px solid #aaa',
		}
		dd:wikitext(content)
	end
	
	for i, label in ipairs(args.labels) do
		printRow(dl, label, args.rows[label])
	end

	return tostring(root)
end

local p = {}

local typeMap = {
	['1'] = 'Equipment',
	['2'] = 'Enhance EXP',
	['3'] = 'Enhance Trust',
}

local maxLevels = {1, 25, 30, 35, 40}

local function getVCR(data)
	local t = {}
	local f = function(s, render_icon)
		local counts = data['trust_'..s..'_counts']
		for i, v in ipairs(data['trust_'..s..'_names']) do
			-- table.insert(sb2, i)
			-- table.insert(sb2, (counts[i] > 1) and counts[i] or nil)
			table.insert(t, render_icon({v, name = 'none', count = counts[i] > 1 and counts[i] or nil}))
		end
	end
	f('item', render_item_icon)
	f('artifact', render_gear_icon)
	return #t > 0 and table.concat(t) or nil
end

local function getUnitReward(data)
	local iname = data.first_get_unit or ''
	if iname == '' then return nil end
	return render_unit_icon{iname, size='small'}
end

local renderPage = function(iname)
	local rows = model.query('ConceptCard','_pageName,server,rare,icon,en_cost,en_exp,en_trust,first_get_unit,trust_item_names,trust_item_counts,trust_artifact_names,trust_artifact_counts,type',{where='iname="'..iname..'"'})
	if #rows == 0 then
		return '`'..iname..'` not found in ConceptCard table.'
	end
	local data = rows[1]
	local getLoc = function(param) return model.getLoc(data._pageName, param) end
	local name = getLoc('name')
	local icon = mw.html.create('div')
	icon:addClass('item-icon')
	local img = icon:tag('div')
	img:addClass('img x-'..data.rare..' y-4')
	img:css{
		['width'] = '57px',
		['height'] = '57px',
		['padding'] = '3.5px',
	}
	img:wikitext('[[File:Game,ConceptCardIcon,',data.icon,'.png|57px]]')
	local maxLevels = {1, 25, 30, 35, 40}
	-- Memento extra data
	local extra = mw.loadData("Module:Data/Extra/Memento")[iname] or {}
	local releaseDates
	for _, region in ipairs{'jp', 'gl'} do
		local date = extra[region..'Date']
		if date then
			releaseDates = releaseDates or mw.html.create('ul')
			releaseDates:tag('li'):wikitext(region:upper(), ': ', date)
		end
	end

	local cats = {
		'Memento'
	}
	local root = mw.html.create()
	-- Info Box
	local infobox = makeInfobox{
		name = name,
		icon = icon,
		labels = {
			'Type',
			'Rank',
			'Max level',
			'Enhancer cost',
			'Enhancer EXP',
			'Enhancer trust',
			'Vision Clear Reward',
			'Gives unit',
			'Source',
			'Release dates',
			'Global only',
			'External links',
		},
		rows = {
			['Type'] = typeMap[data.type],
			['Rank'] = (data.rare + 1)..'★',
			['Max level'] = maxLevels[data.rare + 1],
			['Enhancer cost'] = data.en_cost, -- zeni required to upgrade a memento with this memento
			['Enhancer EXP'] = data.en_exp, -- EXP given by this memento
			['Enhancer trust'] = data.en_trust,
			['Vision Clear Reward'] = getVCR(data),
			['Gives unit'] = getUnitReward(data),
			['Source'] = extra.source or 'Unreleased',
			['Release dates'] = releaseDates and tostring(releaseDates) or nil,
			['Global only'] = extra.glOnly and 'Yes' or nil,
			['External links'] = '[http://www.alchemistcodedb.com/card/'..iname:gsub('_','-'):lower()..' AlchemistCodeDB]',
		}
	}
	root:node(infobox)
	if data.type and typeMap[data.type] then
		cats[#cats+1] = typeMap[data.type] .. ' memento'
	end

	-- Body
	-- Card Image + Flavor
	root:tag('div'):addClass('responsive-img')
		:css{
			['margin'] = 'auto',
			['width'] = 'fit-content',
		}
		:wikitext('[[File:Game,ConceptCard,', data.icon, '.png]]')
		:tag('div'):addClass('flavor')
			:css{
				['max-width'] = '1024px',
				['padding'] = '8px',
			}
			:wikitext(getLoc('flavor'))
	-- TODO: Stats + Effects

	-- Category
	for i, cat in ipairs(cats) do
		root:wikitext('[[Category:', cat, ']]')
	end
	-- TODO Implement http://cdn.alchemistcodedb.com/assets/big-card-frames-b34ac394d6035fb657d491b956e2c4764836b51b9361fccc4b31e722a27df510.png
	
	return tostring(root)
end

local function renderPage2(iname)
	local rows = model.query('ConceptCard','_pageName,server,iname,rare,icon,en_cost,en_exp,en_trust,first_get_unit,trust_item_names,trust_item_counts,trust_artifact_names,trust_artifact_counts,type',{where='iname="'..iname..'"'})
	if #rows == 0 then
		return '`'..iname..'` not found in ConceptCard table.'
	end
	local data = rows[1]
	local getLoc = function(param) return model.getLoc(data._pageName, param) end
	local function releaseDates(data)
		local jp = data.jpDate or ''
		local gl = data.glDate or ''
		if jp == '' and gl == '' then return end
		local root = mw.html.create('ul')
		if jp ~= '' then root:tag('li'):wikitext('JP: ' .. jp) end
		if gl ~= '' then root:tag('li'):wikitext('GL: ' .. gl) end
		return tostring(root)
	end

	local cats = {'Memento'}

	local name = getLoc('name')
	local icon = 'Game,ConceptCardIcon,'..data.icon..'.png'
	local typeName = typeMap[data.type]
	cats[#cats+1] = typeName .. ' mementos'
	local rank = data.rare + 1
	local maxLevel = maxLevels[rank]
	local enhancer_cost = data.en_cost
	local enhancer_exp = data.en_exp
	local enhancer_trust = data.en_trust
	local vcr = getVCR(data)
	local unit_reward = getUnitReward(data)

	local extra = mw.loadData("Module:Data/Extra/Memento")[iname] or {}
	local source = extra.source or 'Unreleased'
	local glDate = extra.glDate
	local jpDate = extra.jpDate
	local glOnly = extra.glOnly

	local artwork = '[[File:Game,ConceptCard,'..data.icon..'.png]]'
	local flavor = getLoc('flavor')

	-- Render
	local function printRow(t, label, content)
		if content == nil then return end
		t:tag('dt')
			-- :css{['grid-column-start']='1',['border-right']='2px solid #999',['margin']='0 -2px 0 0',['padding']='2px 8px 2px 3px',['text-align']='right'}
			:wikitext(label)
		t:tag('dd')
			-- :css{['grid-column-start']='2',['border-left']='2px solid #999',['margin']='0',['padding']='2px 7px',['text-align']='left'}
			:wikitext(content)
	end
	local root = mw.html.create()
	local infobox = root:tag('div'):addClass('infobox memento')
	infobox:tag('div'):addClass('icon infobox-icon'):wikitext('[[File:'..icon..'|64px]]')
	infobox:tag('div'):addClass('name'):wikitext(name)
	local wrapper = infobox:tag('div'):addClass('wrapper')
	local dl = wrapper:tag('dl')
	printRow(dl, 'Type', typeName)
	printRow(dl, 'Rank', rank .. '★')
	printRow(dl, 'Max Level', maxLevel)
	printRow(dl, 'Enhancer cost', enhancer_cost)
	printRow(dl, 'Enhancer EXP', enhancer_exp)
	printRow(dl, 'Enhancer trust', enhancer_trust)
	printRow(dl, 'VCR', vcr)
	printRow(dl, 'Gives Unit', unit_reward)
	printRow(dl, 'Source', source)
	printRow(dl, 'Release date', releaseDates(extra))
	printRow(dl, 'Global only', glOnly and 'Yes' or nil)
	printRow(dl, 'External links', '[http://www.alchemistcodedb.com/card/'..iname:gsub('_','-'):lower()..' AlchemistCodeDB]')

	root
		:tag('div')
		:addClass('responsive-img')
		:wikitext(artwork)
			:tag('div')
			:addClass('flavor')
			:wikitext(flavor)

	for i, cat in ipairs(cats) do
		root:wikitext('[[Category:'..cat..']]')
	end

	return tostring(root)
end

local renderFuncs = {}
renderFuncs.Icon = render_memento_icon

local renderTransclude = function(iname, args)
	local type = mw.text.trim(args[1])
	args[1] = iname
	return (renderFuncs[type] or renderFuncs.Name)(args)
end

function p._main(iname, args)
	if not args or args.isPage then
		return renderPage(iname)
	else
		return renderTransclude(iname, args)
	end
end

p.renderPage = renderPage

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {parentFirst = true})
	return renderPage(args[1])
end

function p.test(frame)
	local args = require('Module:Arguments').getArgs(frame, {parentFirst = true})
	return renderPage2(args[1])
end

return p