12,814
edits
(getSkillData: Fix) |
(Amend to use alternative data pages) |
||
(6 intermediate revisions by the same user not shown) | |||
Line 4: | Line 4: | ||
local p = {} | local p = {} | ||
local GameData = mw. | local GameData1 = mw.loadJsonData('Module:GameData/data') | ||
local GameData2 = mw.loadJsonData('Module:GameData/data2') | |||
-- Combine data into a single object | |||
local GameData = {} | |||
for _, data in ipairs({GameData1, GameData2}) do | |||
for entityType, entityData in pairs(data) do | |||
GameData[entityType] = entityData | |||
end | |||
end | |||
local indexCache = {} | local indexCache = {} | ||
Line 38: | Line 47: | ||
for i, skillObj in ipairs(GameData.skillData) do | for i, skillObj in ipairs(GameData.skillData) do | ||
local _, localID = p.getLocalID(skillObj.skillID) | local _, localID = p.getLocalID(skillObj.skillID) | ||
if localID ~= nil then | |||
skillData[localID] = skillObj.data | |||
end | |||
end | end | ||
return skillData | |||
end | end | ||
Line 96: | Line 105: | ||
error('Property name must be a string', 2) | error('Property name must be a string', 2) | ||
end | end | ||
local entData, useCache = nil, false | |||
if type(entityType) == 'string' then | |||
entData = GameData[entityType] | |||
useCache = true | |||
else | |||
-- Function was passed a table of entities rather than a entity type | |||
entData = entityType | |||
end | |||
if entData == nil then | if entData == nil then | ||
error('No such entity type: ' .. entityType, 2) | error('No such entity type: ' .. entityType, 2) | ||
elseif type(entData) ~= 'table' then | elseif type(entData) ~= 'table' then | ||
error('Entity data is not a table: ' .. entityType, 2) | error('Entity data is not a table: ' .. entityType, 2) | ||
elseif type(entData[1]) ~= 'table' or entData[1] | elseif type(entData[1]) ~= 'table' or entData[1][propName] == nil then | ||
error('Entity data is not composed of entities: ' .. entityType, 2) | error('Entity data is not composed of entities: ' .. entityType, 2) | ||
end | end | ||
Line 121: | Line 130: | ||
-- Cache miss or property isn't ID, so scan the entity data sequentially | -- Cache miss or property isn't ID, so scan the entity data sequentially | ||
for idx, entity in ipairs(entData) do | for idx, entity in ipairs(entData) do | ||
if useCache then | |||
setCache(entityType, entity.id, idx) | |||
end | |||
if entity[propName] == propValue then | if entity[propName] == propValue then | ||
return entity | return entity | ||
Line 145: | Line 154: | ||
local result = {} | local result = {} | ||
local entityCount = 0 | local entityCount = 0 | ||
if type(entityType) ~= 'string' then | if type(entityType) ~= 'string' and type(entityType) ~= 'table' then | ||
error('Entity type name must be a string', 2) | error('Entity type name must be a string or table', 2) | ||
elseif type(checkFunc) ~= 'function' then | elseif type(checkFunc) ~= 'function' then | ||
error('Check function name must be a function', 2) | error('Check function name must be a function', 2) | ||
end | end | ||
local entData = GameData[entityType] | local entData, useCache = nil, false | ||
if entData == nil then | if type(entityType) == 'string' then | ||
entData = GameData[entityType] | |||
useCache = true | |||
else | |||
-- Function was passed a table of entities rather than a entity type | |||
entData = entityType | |||
end | |||
if entData == nil and type(entityType) == 'string' then | |||
error('No such entity type: ' .. entityType, 2) | error('No such entity type: ' .. entityType, 2) | ||
elseif type(entData) ~= 'table' then | elseif type(entData) ~= 'table' then | ||
error('Entity data is not a table: ' .. entityType, 2) | error('Entity data is not a table: ' .. entityType, 2) | ||
elseif type(entData[1]) ~= 'table' | elseif type(entData[1]) ~= 'table' then | ||
error('Entity data is not composed of entities: ' .. entityType, 2) | error('Entity data is not composed of entities: ' .. entityType, 2) | ||
end | end | ||
for idx, entity in ipairs(entData) do | for idx, entity in ipairs(entData) do | ||
setCache(entityType, entity.id, idx) | if useCache then | ||
setCache(entityType, entity.id, idx) | |||
end | |||
if checkFunc(entity) then | if checkFunc(entity) then | ||
entityCount = entityCount + 1 | entityCount = entityCount + 1 | ||
Line 174: | Line 192: | ||
-- orderFunc specifies a custom order function if the default behaviour is not desired | -- orderFunc specifies a custom order function if the default behaviour is not desired | ||
-- Example - Sorts combat areas into the same order as displayed in game: | -- Example - Sorts combat areas into the same order as displayed in game: | ||
-- | -- p.sortByOrderTable(p.rawData.combatAreas, p.rawData.combatAreaDisplayOrder) | ||
function p.sortByOrderTable(dataTable, orderTable, keepUnsorted, idKey, orderFunc) | function p.sortByOrderTable(dataTable, orderTable, keepUnsorted, idKey, orderFunc) | ||
-- Create index table from orderTable | |||
local orderIdx = {} | |||
for idx, v in ipairs(orderTable) do | |||
orderIdx[v] = idx | |||
end | |||
-- Determine if user-specified or default paramater values are to be used | |||
if type(keepUnsorted) ~= 'boolean' then | |||
keepUnsorted = true | |||
end | |||
if type(idKey) ~= 'string' then | |||
idKey = 'id' | |||
end | |||
if type(orderFunc) ~= 'function' then | |||
orderFunc = function(k1, k2) | |||
local o1, o2 = orderIdx[k1[idKey]], orderIdx[k2[idKey]] | |||
if o1 == nil or o2 == nil then | |||
return false | |||
else | |||
return orderIdx[k1[idKey]] < orderIdx[k2[idKey]] | |||
end | |||
end | |||
end | |||
-- Build unsorted result table, removing unsorted elements if requested | |||
local resultTable = {} | |||
local resultItemCount = 0 | |||
for idx, v in ipairs(dataTable) do | |||
local keyVal = v[idKey] | |||
if keyVal ~= nil then | |||
if keepUnsorted or orderIdx[keyVal] ~= nil then | |||
resultItemCount = resultItemCount + 1 | |||
resultTable[resultItemCount] = v | |||
end | |||
end | |||
end | |||
-- Sort table | |||
table.sort(resultTable, orderFunc) | |||
return resultTable | |||
end | end | ||
return p | return p |