Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.


From https://kenshi.fandom.com/wiki/Module:Stats


local p = {}

local groupKeys = { 'Humans', 'Shek', 'Hive', 'Fogmen', 'Skeletons', 'Cannibals', 'Fishmen' }
local raceKeys = { 'greenlander', 'scorchlander', 'shek', 'hive prince', 'hive soldier drone', 'hive worker drone', 'hive prince south hive', 'hive soldier drone south hive', 'hive worker drone south hive', 'hive queen', 'deadhive prince', 'deadhive soldier', 'deadhive worker', 'p4 unit', 'skeleton p4mkii', 'screamer mki', 'skeleton mkii screamer', 'skeleton', 'skeleton log-head mkii', 'skeleton no-head mkii', 'soldierbot', 'cannibal', 'cannibal skav', 'fishman', 'alpha fishman' }

local races = {
    ['greenlander'] = {
        group = 'Humans',
        name = 'Greenlander'
    },
    ['scorchlander'] = {
        group = 'Humans',
        name = 'Scorchlander'
    },
    ['shek'] = {
        group = 'Shek',
        name = 'Shek'
    },
    ['hive soldier drone'] = {
        group = 'Hive',
        name = 'Hive Soldier Drone'
    },
    ['hive prince'] = {
        group = 'Hive',
        name = 'Hive Prince'
    },
    ['hive worker drone'] = {
        group = 'Hive',
        name = 'Hive Worker Drone'
    },
    ['hive prince south hive'] = {
        group = 'Hive',
        name = 'Southern Hive Prince'
    },
    ['hive soldier drone south hive'] = {
        group = 'Hive',
        name = 'Southern Hive Soldier Drone'
    },
    ['hive worker drone south hive'] = {
        group = 'Hive',
        name = 'Southern Hive Worker Drone'
    },
    ['hive queen'] = {
        group = 'Hive',
        name = 'Hive Queen'
    },
    ['deadhive prince'] = {
        group = 'Fogmen',
        name = 'Deadhive Prince'
    },
    ['deadhive soldier'] = {
        group = 'Fogmen',
        name = 'Deadhive Soldier'
    },
    ['deadhive worker'] = {
        group = 'Fogmen',
        name = 'Deadhive Worker'
    },
    ['p4 unit'] = {
        group = 'Skeletons',
        name = 'P4 Unit'
    },
    ['skeleton p4mkii'] = {
        group = 'Skeletons',
        name = 'Skeleton P4MkII'
    },
    ['screamer mki'] = {
        group = 'Skeletons',
        name = 'Screamer MkI'
    },
    ['skeleton mkii screamer'] = {
        group = 'Skeletons',
        name = 'Skeleton MKII Screamer'
    },
    ['skeleton'] = {
        group = 'Skeletons',
        name = 'Skeleton'
    },
    ['skeleton log-head mkii'] = {
        group = 'Skeletons',
        name = 'Skeleton Log-Head MkII'
    },
    ['skeleton no-head mkii'] = {
        group = 'Skeletons',
        name = 'Skeleton No-Head MkII '
    },
    ['soldierbot'] = {
        group = 'Skeletons',
        name = 'Soldierbot'
    },
    ['cannibal'] = {
        group = 'Cannibals',
        name = 'Cannibal'
    },
    ['cannibal skav'] = {
        group = 'Cannibals',
        name = 'Cannibal Skav'
    },
    ['fishman'] = {
        group = 'Fishmen',
        name = 'Fishman'
    },
    ['alpha fishman'] = {
        group = 'Fishmen',
        name = 'Alpha Fishman'
    }
}

function p.main(frame)
    local args = frame:getParent().args
    
    return p._main(frame, args)
end

function p._main(frame, args)
    local template = ''
    if string.trim(args[1]) == 'calculated' then
        template = 'Stats/Calculated'
    else
        template = 'Stats/Base'
    end
    
    if args['Races'] == nil then
        return frame:expandTemplate { title = template, args = args }
    end
    
    return p._generate_tabber(frame, args, template)
end

function p._generate_tabber(frame, args, template)
    local tabberArgs = {}
    
    local racesArg = args['Races'] or ''
    racesArg = string.lower(racesArg)

    local _, racesCount = string.gsub(racesArg, ",", "")
    if racesCount > 4 then
        tabberArgs = p._generate_categorized_tabber(frame, args, template, racesArg)
    else
        tabberArgs = p._generate_uncategorized_tabber(frame, args, template, racesArg)
    end

    return frame:expandTemplate { title = 'Tabber', args = tabberArgs }
end

function p._generate_categorized_tabber(frame, args, template, racesArg)
    local groups = {}

    for i, raceKey in ipairs(raceKeys) do
    	for raceArg in string.gmatch(racesArg, '([^,]+)') do
    		if raceKey == raceArg then
    			local details = races[raceKey]
		    	local templateArgs = table.shallow_copy(args)
		    	
		    	templateArgs['Race'] = raceKey
		    	
		    	local statsTemplate = frame:expandTemplate { title = template, args = templateArgs }

                if groups[details.group] == nil then
                    groups[details.group] = {}
                end

                table.insert(groups[details.group], details.name)
                table.insert(groups[details.group], statsTemplate)
    		end
		end
    end
    
    local results = {}
    
    for i, groupKey in ipairs(groupKeys) do
        if groups[groupKey] ~= nil then
            local groupArgs = groups[groupKey]
            table.insert(results, groupKey)
            table.insert(results, frame:expandTemplate { title = 'Tabber', args = groupArgs })
        end
    end

    return results
end

function p._generate_uncategorized_tabber(frame, args, template, racesArg)
    local results = {}

    for i, raceKey in ipairs(raceKeys) do
    	for raceArg in string.gmatch(racesArg, '([^,]+)') do
    		if raceKey == raceArg then
    			local details = races[raceKey]
		    	local templateArgs = table.shallow_copy(args)
		    	
		    	templateArgs['Race'] = raceKey
		    	
		    	local statsTemplate = frame:expandTemplate { title = template, args = templateArgs }
		    	table.insert(results, details.name)
		    	table.insert(results, statsTemplate)
    		end
		end
    end

    return results
end

function table.shallow_copy(t)
    local t2 = {}
    for k,v in pairs(t) do
        t2[k] = v
    end
    return t2
end

function string.trim(arg)
	if arg == nil then
		return nil
	end
	
	return string.gsub(arg, "%s+", "")
end

return p