Please note that some information on this wiki is still based on the demo version.
If you notice any errors, feel free to correct them.

Module:LevelStats: Difference between revisions

From Super Fantasy Kingdom Official Wiki
wgg>Cadaei
typo
wgg>Cadaei
moved indicators to one column
Line 31: Line 31:
local headers = {'<th>Stats</th>'}
local headers = {'<th>Stats</th>'}
if useBaseIndicator then
if useBaseIndicator then
table.insert(headers, '<th>Base</th>')
if useGainIndicator then
end
table.insert(headers, '<th>Base Gain</th>')
if useGainIndicator then
else
table.insert(headers, '<th>Base</th>')
end
elseif useGainIndicator then
table.insert(headers, '<th>Gain</th>')
table.insert(headers, '<th>Gain</th>')
end
end
Line 55: Line 58:
valLast = tonumber(valLast)
valLast = tonumber(valLast)
if useBaseIndicator then
if useBaseIndicator or useGainIndicator then
local base = 0
local baseIndicatorImage = ''
if val > 0 then
local gainIndicatorImage = ''
if val < 10 then base = 1
elseif val < 50 then base = 2
if useBaseIndicator then
else base = 3 end
local baseIndicator = 0
if val > 0 then
if val < 10 then baseIndicator = 1
elseif val < 50 then baseIndicator = 2
else baseIndicator = 3 end
end
baseIndicatorImage = '[[File:StatBase'..base..'.png|12px]]'
end
if useGainIndicator then
local gainIndicator = 0
if valLast > val and val > 0 then
local gainFactor = valLast / val
if gainFactor > 10 then gainIndicator = 3
elseif gainFactor > 5 then gainIndicator = 2
elseif gainFactor > 1 then gainIndicator = 1 end
end
gainIndicatorImage = '[[File:StatGain'..gain..'.png|12px]]'
end
end
table.insert(statColumns, '<td style="text-align:center;">[[File:StatBase'..base..'.png|12px]]</td>')
end
if useGainIndicator then
table.insert(statColumns, '<td style="text-align:center;">'..baseIndicatorImage..gainIndicatorImage..'</td>')
local gain = 0
if valLast > val and val > 0 then
local gainFactor = valLast / val
if gainFactor > 10 then gain = 3
elseif gainFactor > 5 then gain = 2
elseif gainFactor > 1 then gain = 1 end
end
table.insert(statColumns, '<td style="text-align:center;">[[File:StatGain'..gain..'.png|12px]]</td>')
end
end

Revision as of 12:26, 12 November 2023

Displays a stat table for units for multiple levels. Parameter names are the stat abbreviations, for the first level just the two letters, for the 10th level the stat abbreviation with suffix 10, e.g. dm=5 for damage 5 in level 1 and dm10=20 for damage 20 in level 10. Values are interpreted linerarly for the other levels.

For units use exp=true for exponential stat growth.

To display a gain indicator, use gainIndicator=true.

{{LevelStats
|pw=5|pw10=53
|hp=11|hp10=50
|sh=13|sh10=100
|cr=5%
|pd=0
|md=0
}}
Stats12345678910
Power5101621263237424853
Health11152024283337414650
Shield132332425261718190100
Critical Chance5%5%5%5%5%5%5%5%5%5%
Armor0000000000
Resistance0000000000
{{LevelStats
|exp=true
|pw=5|pw10=63
|hp=10|hp10=68
|sh=19|sh10=116
|cr=0%
|pd=0
|md=0
}}
Stats12345678910
Power581318243138465463
Health10131823293643515968
Shield1925324151627588101116
Critical Chance0%0%0%0%0%0%0%0%0%0%
Armor0000000000
Resistance0000000000
{{LevelStats
|exp=true
|baseIndicator=true
|gainIndicator=true
|pw=5|pw10=63
|hp=10|hp10=68
|sh=19|sh10=116
|cr=0%
|pd=0
|md=0
}}

Lua error at line 71: attempt to concatenate global 'base' (a nil value).

for copy pasting units

{{LevelStats
|exp=true
|baseIndicator=true
|gainIndicator=true
|pw=  |pw10=
|hp=  |hp10=
|ma=  |ma10=
|sh=  |sh10=
|rg=  |rg10=
|cr=0%
|pd=0
|md=0
}}

Code at Module:LevelStats, doc at Template:LevelStats/doc.


local p = {}

local statNames = require ('Module:Stats/StatNames')

function p.levelStats(f)
	return p.create(f:getParent().args)
end

function p.create(args)	
	local statRows = {}
	
	local levelCount = 10
	local useExponentialGain = args.exp ~= nil
	local useGainIndicator = args.gainIndicator ~= nil
	local useBaseIndicator = args.baseIndicator ~= nil
	
	for _, statAbbName in ipairs(statNames) do
		local statAbbreviation = statAbbName[1]
		local statValue = args[statAbbreviation]
		if statValue ~= nil and statValue ~= '' then
			local statName = statAbbName[2]
			local statValueLast = args[statAbbreviation..levelCount] or statValue
			table.insert(statRows, p.StatEntryRow(statName, statValue, statValueLast, levelCount, useExponentialGain, useBaseIndicator, useGainIndicator))
		end
	end
	
	if #statRows == 0 then
	  return ''
	end
	
	local headers = {'<th>Stats</th>'}
	if useBaseIndicator then
		if useGainIndicator then
			table.insert(headers, '<th>Base Gain</th>')
		else
			table.insert(headers, '<th>Base</th>')
		end
	elseif useGainIndicator then
		table.insert(headers, '<th>Gain</th>')
	end
	
	for i=1,levelCount do
		table.insert(headers, '<th>'..i..'</th>')
	end
	
	return '<table class="wikitable right"><tr>'..table.concat(headers, '')..'</tr>'..
	  table.concat(statRows, '')..'</table>'
end

function p.StatEntryRow(name, val, valLast, levelCount, useExponentialGain, useBaseIndicator, useGainIndicator)
	local statColumns = {'<td style="text-align:left;">[[File:'..name..'.png|16x16px]] [['..name..']]</td>'}
	
	-- parsing value
	local val, unit  = string.match(val, '^(%d*%.?%d*) ?(.*)$')
	local valLast, _  = string.match(valLast, '^(%d*%.?%d*) ?(.*)$')
	
	val = tonumber(val)
	valLast = tonumber(valLast)
	
	if useBaseIndicator or useGainIndicator then
		local baseIndicatorImage = ''
		local gainIndicatorImage = ''
		
		if useBaseIndicator then
			local baseIndicator = 0
			if val > 0 then
				if val < 10 then baseIndicator = 1
				elseif val < 50 then baseIndicator = 2
				else baseIndicator = 3 end
			end
			baseIndicatorImage = '[[File:StatBase'..base..'.png|12px]]'
		end
		
		if useGainIndicator then
			local gainIndicator = 0
			if valLast > val and val > 0 then
				local gainFactor = valLast / val
				if gainFactor > 10 then gainIndicator = 3
				elseif gainFactor > 5 then gainIndicator = 2
				elseif gainFactor > 1 then gainIndicator = 1 end
			end
			gainIndicatorImage = '[[File:StatGain'..gain..'.png|12px]]'
		end
	
		table.insert(statColumns, '<td style="text-align:center;">'..baseIndicatorImage..gainIndicatorImage..'</td>')
	end
	
	local rowClass = ''
	
	if val == valLast then
		for i=1,levelCount do
			table.insert(statColumns, '<td>'..val..unit..'</td>')
		end
		if useGainIndicator then
			rowClass = ' class="grey-from4"'
		else
			rowClass = ' class="grey-from3"'
		end
	else
		if useExponentialGain then
			-- first calculate true base value, level 1 already has a bonus applied
			local gainLastLevel = math.floor((valLast - val)/(1-(1/levelCount)^1.5) + 0.5)
			local baseValue = valLast - gainLastLevel
			for i=1,levelCount do
				table.insert(statColumns, '<td>'..(baseValue + math.floor(gainLastLevel * (i/levelCount)^1.5 + 0.5))..unit..'</td>')
			end
		else
			-- stat value increase linearly by level
			local gainPerLevel = (valLast - val)/(levelCount-1)
			for i=0,levelCount-1 do
				table.insert(statColumns, '<td>'..(val + math.floor(i*gainPerLevel + 0.5))..unit..'</td>')
			end
		end
	end
	
	return '<tr'..rowClass..'>'..table.concat(statColumns, '')..'</tr>'
end

return p