Dead by Daylight Wiki
(Utworzono nową stronę "local p = {} local data = require("Module:Datatable") local bar = "|" -- code for | local nl = "\n" local ntl = "|-" -- new table line local strings = { } functi...")
 
Nie podano opisu zmian
(Nie pokazano 8 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
 
local p = {}
 
local p = {}
  +
local frame = mw.getCurrentFrame()
 
local data = require("Module:Datatable")
 
local data = require("Module:Datatable")
  +
local dataPerks = require("Module:Datatable/Perks")
 
local bar = "|" -- code for |
+
local utils = require("Module:Utils")
local nl = "\n"
+
local str = require("Module:Strings")
local ntl = "|-" -- new table line
 
   
 
local strings = {
 
local strings = {
  +
perkValuesNotFound = "The Values for the perk wasn't found",
  +
unitNotFound = "The Unit value wasn't found",
  +
notUniquePerk = "Perk is not unique to any character, thus no name provided",
  +
several = "several"
 
}
 
}
   
function p.getPerksCount()
+
function getMaxPerkId()
  +
result = 0
return table.getn(perks) + table.getn(commonPerks)
 
  +
for _, perk in ipairs(perks) do
  +
if result < perk.id then result = perk.id end
  +
end
  +
return result
  +
end
  +
  +
function p.getNextFreePerkId()
  +
return getMaxPerkId() + 1
  +
end
  +
  +
function getUnusedPerksCount()
  +
local result = 0
  +
  +
for _, perk in ipairs(perks) do
  +
if perk.unused == true then result = result + 1 end
  +
end
  +
  +
return result
  +
end
  +
  +
function getCommonPerksCount()
  +
local result = 0
  +
  +
for _, perk in ipairs(perks) do
  +
if perk.character == nil and perk.unused ~= true then result = result + 1 end
  +
end
  +
  +
return result
  +
end
  +
  +
function p.getCountPerksByType(pType)
  +
pType = ResolveStringParam(pType)
  +
local result = 0
  +
  +
for _, perk in ipairs(perks) do
  +
if perk.charType == pType and perk.unused ~= true then result = result + 1 end
  +
end
  +
--mw.log(result)
  +
return result
  +
end
  +
  +
local _unusedPerksCount = getUnusedPerksCount()
  +
local _commonPerksCount = getCommonPerksCount()
  +
local _uniquePerksCount = table.getn(perks) - _unusedPerksCount - _commonPerksCount
  +
local _nonUniquePerksCount = _unusedPerksCount + _commonPerksCount
  +
  +
p._nonUniquePerksCount = _nonUniquePerksCount
  +
p._allPerksCount = table.getn(perks)
  +
  +
function p.getPerksCount() --active in game
  +
return _uniquePerksCount + _commonPerksCount
  +
end
  +
  +
function ResolveIntParam(param)
  +
if type(param) == "table" and param.args[1] ~= nil then
  +
return tonumber(param.args[1])
  +
else
  +
return param
  +
end
  +
end
  +
  +
function ResolveStringParam(param)
  +
if type(param) == "table" and param.args[1] ~= nil then
  +
return tostring(param.args[1])
  +
elseif param == nil then
  +
return mw.title.getCurrentTitle().text
  +
else
  +
return param
  +
end
  +
end
  +
  +
function getUnitById(id)
  +
mw.log(id)
  +
for _,unit in ipairs(units) do
  +
if unit.id == id then return unit.value end
  +
end
  +
return unitNotFound
  +
end
  +
  +
--Function that actually returns string that will replace the placeholder
  +
function pl(id, tripplet, mode)
  +
tripplet = tonumber(tripplet)
  +
for _,perk in ipairs(perks) do
  +
if perk.id == id then
  +
if (mode and mode == "teachable") then
  +
return utils.clr(b(strings.several .. space .. getUnitById(perk.units[tripplet])), 13)
  +
else
  +
local index = 1 + ((tripplet - 1) * 3) --tripplet is an offset, +1 is indexing from 1 in LUA, * 3 is because every values are grouped by 3 values/tiers
  +
return "'''" .. utils.clr(perk.values[index], 2) .. "'''/'''" .. utils.clr(perk.values[index + 1], 3) .. "'''/'''" .. utils.clr(perk.values[index + 2], 4) .. " " ..
  +
--I remove the dynamic base level as long as the perks are not diversed anymore and all perks are uncommon/rare/very rare value
  +
--return "'''" .. utils.clr(perk.values[index], perk.baseLevel) .. "'''/'''" .. utils.clr(perk.values[index + 1], perk.baseLevel + 1) .. "'''/'''" .. utils.clr(perk.values[index + 2], perk.baseLevel + 2) .. " " ..
  +
getUnitById(perk.units[tripplet]) .. "'''" --Units, Tripplet is an index in 'units' list
  +
end
  +
end
  +
end
  +
return "'''" .. strings.perkValuesNotFound .. "'''"
  +
end
  +
  +
--Function replaces "#pl(x)" string with tripplet value of according number in brackets
  +
function subValues(perkDesc, mode)
  +
local regexString = "#pl%((%d)%)" -- looking and extracting number from "#pl(x)"
  +
if perkDesc.desc[1][1] ~= nil then
  +
for m in perkDesc.desc[1][1]:gmatch(regexString) do --TODO the first index shouldn't be hardcoded due to history log (if the description will be copied, then it won't be the first)
  +
local currentRegexString = "#pl%(" .. tonumber(m) .. "%)" --you need to replace ONLY CURRENT INDEX, otherwise you'll get replaced all #pl(x) at once when going through the first time (i.e. the first tripplet will replace all #pl() in text
  +
perkDesc.desc[1][1] = perkDesc.desc[1][1]:gsub(currentRegexString, pl(perkDesc.id, tonumber(m), mode))
  +
--mw.log(perkDesc.desc[1][1])
  +
end
  +
end
  +
--mw.log("PL: " .. pl)
  +
return perkDesc
  +
end
  +
  +
function subNames(perkDesc)
  +
local regexString = "#pn"
  +
if perkDesc.desc[1][1] ~= nil then
  +
for m in perkDesc.desc[1][1]:gmatch(regexString) do --TODO the first index shouldn't be hardcoded due to history log (if the description will be copied, then it won't be the first)
  +
perkDesc.desc[1][1] = perkDesc.desc[1][1]:gsub(regexString, "''".. p.GetPerkById(perkDesc.id).name .. "''")
  +
end
  +
end
  +
return perkDesc
  +
end
  +
  +
function p.GetPerkById(id)
  +
for _, perk in ipairs(perks) do
  +
if perk.id == id then
  +
return perk
  +
end
  +
end
  +
end
  +
  +
function p.getPerkByName(name)
  +
name = utils.resolveParameter(args)
  +
for _, perk in ipairs(perks) do
  +
if perk.name == name then
  +
return perk
  +
end
  +
end
  +
end
  +
  +
function p.getPerkDescription(id, mode)
  +
id = ResolveIntParam(id)
  +
for _, perkDesc in ipairs(perkDescription) do
  +
if perkDesc.id == id then
  +
perkDesc = subValues(perkDesc, mode) --pl(#) => Perk # trio Values
  +
perkDesc = subNames(perkDesc) -- #pn => Perk Name
  +
  +
mw.log(perkDesc.desc[1][1])
  +
return perkDesc.desc[1][1]
  +
end
  +
end
  +
return ""
  +
end
  +
  +
function p.getPerkTeachableDescription(id)
  +
id = ResolveIntParam(id)
  +
  +
for _, perkDesc in ipairs(perkDescription) do
  +
if perkDesc.id == id then
  +
mw.log(perkDesc.teachDesc[1])
  +
return perkDesc.teachDesc[1]
  +
end
  +
end
  +
end
  +
  +
function p.getPerkDescriptionByName(name)
  +
name = ResolveStringParam(name)
  +
  +
for _, perk in ipairs(perks) do
  +
if perk.name == name then
  +
return p.getPerkDescription(perk.id)
  +
end
  +
end
  +
end
  +
  +
function p.getPerkOwnerByPerk(perk)
  +
if perk.character == nil then return notUniquePerk end
  +
if perk.charType == 'S' then
  +
return utils.getCharacterById(perk.character, survivors)
  +
elseif perk.charType == 'K' then
  +
return utils.getCharacterById(perk.character, killers)
  +
else
  +
return "Unknown Character"
  +
end
  +
end
  +
  +
function p.getPerksOwnerNameByPerk(perk) --Name
  +
return p.getPerkOwnerByPerk(perk).name
  +
end
  +
  +
function p.getPortraitOfPerkOwnerByPerk(perk)
  +
return perk.charType .. string.format("%02d", p.getPerkOwnerByPerk(perk).id) .. '_charSelect_portrait.png'
  +
end
  +
  +
--cat = category
  +
--solution = defines which way the category should be processed
  +
--charType = 'K' - Only Killers, 'S' - Only survivors, skipped - Both
  +
function p.resolvePerkCategory(cat, solution, charType)
  +
category = utils.resolveParameter(cat)
  +
solution = solution or utils.resolveParameter(cat, 2)
  +
charType = charType or utils.resolveParameter(cat, 3, true)
  +
  +
if solution == "table" then return getPerksTableByCategory(category, charType)
  +
--elseif solution == "secondApproach" then return functionReturningCategorisedPerks(cat, charType)
  +
else return solution
  +
end
  +
end
  +
  +
function getPerksTableByCategory(cat, charType)
  +
local result = ''
  +
local perkList = getPerksByCategory(cat, charType)
  +
  +
for _, perk in ipairs(perkList) do
  +
result = result .. getTableRowPerk(perk)
  +
if perk.id ~= perkList[#perkList].id then
  +
result = result .. ntl .. nl
  +
end
  +
end
  +
  +
result = utils.wrapBasicTable(result)
  +
  +
mw.log(result)
  +
return result
  +
end
  +
  +
function getTableRowPerk(perk)
  +
result = ''
  +
  +
result = result .. hl .. '[[' .. cstr.file .. utils.getIcon(perk.name) .. '| ' .. perk.name .. ' | 100px]]' .. nl ..
  +
hl .. '[[' .. perk.name .. ']]' .. nl ..
  +
'| ' .. (p.getPerkDescription(perk.id) or '') .. nl
  +
  +
return result
  +
end
  +
  +
function getPerksByCategory(cat, charType)
  +
local result = {}
  +
  +
for _, perk in ipairs(perks) do
  +
if perk.tags ~= nil then
  +
for _, category in ipairs(perk.tags) do
  +
if category == cat and (charType == nil or perk.charType == charType) then
  +
result[#result + 1] = perk
  +
break
  +
end
  +
end
  +
end
  +
end
  +
  +
return result
  +
end
  +
  +
function p.getPerkDescriptions(params, last) --temporary function, not used anywhere permanently
  +
first = tonumber(utils.resolveParameter(params))
  +
last = tonumber(last or utils.resolveParameter(params, 2))
  +
local result = ''
  +
  +
utils.sortTableById(perks)
  +
for _, perk in ipairs(perks) do
  +
if perk.id >= first and perk.id <= last then
  +
result = result .. hl .. perk.id .. nl ..
  +
hl .. perk.name .. nl ..
  +
'| ' .. p.getPerkDescription(perk.id) .. nl
  +
if perk.id ~= last then
  +
result = result .. ntl .. nl
  +
end
  +
end
  +
end
  +
  +
result = utils.wrapBasicTable(result)
  +
mw.log(result)
  +
return result
  +
end
  +
  +
function p.getPerkIconFilename(args)
  +
local name = utils.resolveParameter(args)
  +
local ext = utils.resolveParameter(args, 2, true)
  +
  +
return utils.resolveFileName(name) .. ((ext and '.' .. ext) or '')
  +
end
  +
  +
function p.getTeachablePerkIconFilename(args)
  +
return "Teachable_" .. utils.FirstLetterLower(p.getPerkIconFilename(args))
  +
end
  +
  +
function p.getTeachableDescriptionById(id)
  +
return p.getPerkDescription(id, "teachable")
 
end
 
end
   

Wersja z 09:30, 9 paź 2021


local p = {}
local frame = mw.getCurrentFrame()
local data = require("Module:Datatable")
local dataPerks = require("Module:Datatable/Perks")
local utils = require("Module:Utils")
local str = require("Module:Strings")

local strings = {
	perkValuesNotFound = "The Values for the perk wasn't found",
	unitNotFound = "The Unit value wasn't found",
	notUniquePerk = "Perk is not unique to any character, thus no name provided",
	several = "several"
}

function getMaxPerkId()
	result = 0
	for _, perk in ipairs(perks) do
		if result < perk.id then result = perk.id end
	end
	return result
end

function p.getNextFreePerkId()
	return getMaxPerkId() + 1
end

function getUnusedPerksCount()
	local result = 0
	
	for _, perk in ipairs(perks) do
		if perk.unused == true then result = result + 1 end
	end

	return result
end

function getCommonPerksCount()
	local result = 0
	
	for _, perk in ipairs(perks) do
		if perk.character == nil and perk.unused ~= true then result = result + 1 end
	end
	
	return result
end

function p.getCountPerksByType(pType)
	pType = ResolveStringParam(pType)
	local result = 0
	
	for _, perk in ipairs(perks) do
		if perk.charType == pType and perk.unused ~= true then result = result + 1 end
	end
	--mw.log(result)
	return result
end

local _unusedPerksCount = getUnusedPerksCount()
local _commonPerksCount = getCommonPerksCount()
local _uniquePerksCount = table.getn(perks) - _unusedPerksCount - _commonPerksCount
local _nonUniquePerksCount = _unusedPerksCount + _commonPerksCount

p._nonUniquePerksCount = _nonUniquePerksCount
p._allPerksCount = table.getn(perks)

function p.getPerksCount() --active in game
	return _uniquePerksCount + _commonPerksCount
end

function ResolveIntParam(param)
	if type(param) == "table" and param.args[1] ~= nil then
		return tonumber(param.args[1])
	else
		return param
	end
end

function ResolveStringParam(param)
	if type(param) == "table" and param.args[1] ~= nil then
		return tostring(param.args[1])
	elseif param == nil then
		return mw.title.getCurrentTitle().text
	else
		return param
	end
end

function getUnitById(id)
	mw.log(id)
	for _,unit in ipairs(units) do
		if unit.id == id then return unit.value end
	end
	return unitNotFound
end

--Function that actually returns string that will replace the placeholder
function pl(id, tripplet, mode)
	tripplet = tonumber(tripplet)
	for _,perk in ipairs(perks) do
		if perk.id == id then
			if (mode and mode == "teachable") then
				return utils.clr(b(strings.several .. space .. getUnitById(perk.units[tripplet])), 13)
			else
				local index = 1 + ((tripplet - 1) * 3) --tripplet is an offset, +1 is indexing from 1 in LUA, * 3 is because every values are grouped by 3 values/tiers
				return "'''" .. utils.clr(perk.values[index], 2) .. "'''/'''" .. utils.clr(perk.values[index + 1], 3) .. "'''/'''" .. utils.clr(perk.values[index + 2], 4) .. " " ..
				--I remove the dynamic base level as long as the perks are not diversed anymore and all perks are uncommon/rare/very rare value
				--return "'''" .. utils.clr(perk.values[index], perk.baseLevel) .. "'''/'''" .. utils.clr(perk.values[index + 1], perk.baseLevel + 1) .. "'''/'''" .. utils.clr(perk.values[index + 2], perk.baseLevel + 2) .. " " ..
					getUnitById(perk.units[tripplet]) .. "'''" --Units, Tripplet is an index in 'units' list
			end
		end
	end
	return "'''" .. strings.perkValuesNotFound .. "'''"
end

--Function replaces "#pl(x)" string with tripplet value of according number in brackets
function subValues(perkDesc, mode)
	local regexString = "#pl%((%d)%)" -- looking and extracting number from "#pl(x)"
	if perkDesc.desc[1][1] ~= nil then
		for m in perkDesc.desc[1][1]:gmatch(regexString) do --TODO the first index shouldn't be hardcoded due to history log (if the description will be copied, then it won't be the first)
			local currentRegexString = "#pl%(" .. tonumber(m) .. "%)" --you need to replace ONLY CURRENT INDEX, otherwise you'll get replaced all #pl(x) at once when going through the first time (i.e. the first tripplet will replace all #pl() in text
			perkDesc.desc[1][1] = perkDesc.desc[1][1]:gsub(currentRegexString, pl(perkDesc.id, tonumber(m), mode))
			--mw.log(perkDesc.desc[1][1])
		end
	end
	--mw.log("PL: " .. pl)
	return perkDesc
end

function subNames(perkDesc)
	local regexString = "#pn"
	if perkDesc.desc[1][1] ~= nil then
		for m in perkDesc.desc[1][1]:gmatch(regexString) do --TODO the first index shouldn't be hardcoded due to history log (if the description will be copied, then it won't be the first)
			perkDesc.desc[1][1] = perkDesc.desc[1][1]:gsub(regexString, "''".. p.GetPerkById(perkDesc.id).name .. "''")
		end
	end
	return perkDesc
end

function p.GetPerkById(id)
	for _, perk in ipairs(perks) do
		if perk.id == id then
			return perk
		end
	end
end

function p.getPerkByName(name)
	name = utils.resolveParameter(args)
	for _, perk in ipairs(perks) do
		if perk.name == name then
			return perk
		end
	end
end

function p.getPerkDescription(id, mode)
	id = ResolveIntParam(id)
	for _, perkDesc in ipairs(perkDescription) do
		if perkDesc.id == id then
			perkDesc = subValues(perkDesc, mode) --pl(#) => Perk # trio Values
			perkDesc = subNames(perkDesc) -- #pn => Perk Name
			
			mw.log(perkDesc.desc[1][1])
			return perkDesc.desc[1][1]
		end
	end
	return ""
end

function p.getPerkTeachableDescription(id)
	id = ResolveIntParam(id)
	
	for _, perkDesc in ipairs(perkDescription) do
		if perkDesc.id == id then
			mw.log(perkDesc.teachDesc[1])
			return perkDesc.teachDesc[1]
		end
	end
end

function p.getPerkDescriptionByName(name)
	name = ResolveStringParam(name)

	for _, perk in ipairs(perks) do
		if perk.name == name then
			return p.getPerkDescription(perk.id)
		end
	end
end

function p.getPerkOwnerByPerk(perk)
	if perk.character == nil then return notUniquePerk end
	if perk.charType == 'S' then
		return utils.getCharacterById(perk.character, survivors)
	elseif perk.charType == 'K' then
		return utils.getCharacterById(perk.character, killers)
	else
		return "Unknown Character"
	end
end

function p.getPerksOwnerNameByPerk(perk) --Name
	return p.getPerkOwnerByPerk(perk).name
end

function p.getPortraitOfPerkOwnerByPerk(perk)
	return perk.charType .. string.format("%02d", p.getPerkOwnerByPerk(perk).id) .. '_charSelect_portrait.png'
end

--cat = category
--solution = defines which way the category should be processed
--charType = 'K' - Only Killers, 'S' - Only survivors, skipped - Both
function p.resolvePerkCategory(cat, solution, charType)
	category = utils.resolveParameter(cat)
	solution = solution or utils.resolveParameter(cat, 2)
	charType = charType or utils.resolveParameter(cat, 3, true)

	if		solution == "table"		then return getPerksTableByCategory(category, charType)
	--elseif	solution == "secondApproach"	then return functionReturningCategorisedPerks(cat, charType)
	else return solution
	end
end

function getPerksTableByCategory(cat, charType)
	local result = ''
	local perkList = getPerksByCategory(cat, charType)

	for _, perk in ipairs(perkList) do
		result = result .. getTableRowPerk(perk)
		if perk.id ~= perkList[#perkList].id then
			result = result .. ntl .. nl
		end
	end
	
	result = utils.wrapBasicTable(result)
	
	mw.log(result)
	return result
end

function getTableRowPerk(perk)
	result = ''
	
	result = result .. hl .. '[[' .. cstr.file .. utils.getIcon(perk.name) .. '| ' .. perk.name .. ' | 100px]]' .. nl ..
	hl .. '[[' .. perk.name .. ']]' .. nl ..
	'| ' .. (p.getPerkDescription(perk.id) or '') .. nl
	
	return result
end

function getPerksByCategory(cat, charType)
	local result = {}
	
	for _, perk in ipairs(perks) do
		if perk.tags ~= nil then
			for _, category in ipairs(perk.tags) do
				if category == cat and (charType == nil or perk.charType == charType) then
					result[#result + 1] = perk
					break
				end
			end
		end
	end

	return result
end

function p.getPerkDescriptions(params, last) --temporary function, not used anywhere permanently
	first = tonumber(utils.resolveParameter(params))
	last = tonumber(last or utils.resolveParameter(params, 2))
	local result = ''
	
	utils.sortTableById(perks)
	for _, perk in ipairs(perks) do
		if perk.id >= first and perk.id <= last then
			result = result .. hl .. perk.id .. nl .. 
			hl .. perk.name .. nl ..
			'| ' .. p.getPerkDescription(perk.id) .. nl
			if perk.id ~= last then
				result = result .. ntl .. nl
			end
		end
	end
	
	result = utils.wrapBasicTable(result)
	mw.log(result)
	return result
end

function p.getPerkIconFilename(args)
	local name = utils.resolveParameter(args)
	local ext = utils.resolveParameter(args, 2, true)

	return utils.resolveFileName(name) .. ((ext and  '.' .. ext) or '')
end

function p.getTeachablePerkIconFilename(args)
	return "Teachable_" ..	utils.FirstLetterLower(p.getPerkIconFilename(args))
end

function p.getTeachableDescriptionById(id)
	return p.getPerkDescription(id, "teachable")
end

return p