Module:Slots: Difference between revisions
From Stationeers Community Wiki
More actions
Update slots module to include information on slot logic values |
m Rewrite to use UTF-8 markers instead of ASCII |
||
| (2 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local ROW_MARKER = | -- U+E000 / U+E001: valid UTF-8 private-use characters, cannot appear in template content | ||
local FIELD_SEP = | local ROW_MARKER = string.char(0xEE, 0x80, 0x80) | ||
local FIELD_SEP = string.char(0xEE, 0x80, 0x81) | |||
local function splitOn(str, sep) | |||
local parts = {} | |||
local sepLen = mw.ustring.len(sep) | |||
local start = 1 | |||
while true do | |||
local pos = mw.ustring.find(str, sep, start, true) | |||
if not pos then | |||
table.insert(parts, mw.ustring.sub(str, start)) | |||
break | |||
end | |||
table.insert(parts, mw.ustring.sub(str, start, pos - 1)) | |||
start = pos + sepLen | |||
end | |||
return parts | |||
end | |||
local BASE_PARAMS = { | local BASE_PARAMS = { | ||
| Line 24: | Line 41: | ||
end | end | ||
function p.row(frame) | function p.row(frame) | ||
local args | local args = frame:getParent().args | ||
local name | local name = mw.text.trim(args.name or '') | ||
local slotType | local slotType = mw.text.trim(args.type or 'None') | ||
local index | local index = mw.text.trim(args.index or '') | ||
local logicParams = mw.text.trim(args.logicParams or '') | local logicParams = mw.text.trim(args.logicParams or '') | ||
return ROW_MARKER .. table.concat({index, name, slotType, logicParams}, FIELD_SEP) | return ROW_MARKER .. table.concat({index, name, slotType, logicParams}, FIELD_SEP) | ||
end | end | ||
function p.render(frame) | function p.render(frame) | ||
local args = frame:getParent().args | local args = frame:getParent().args | ||
local showLogic = args['logic'] ~= nil and args['logic'] ~= '' | local showLogic = args['logic'] ~= nil and args['logic'] ~= '' | ||
local markerLen = mw.ustring.len(ROW_MARKER) | |||
local rows = {} | local rows = {} | ||
for i, v in ipairs(args) do | for i, v in ipairs(args) do | ||
local parts | if mw.ustring.sub(v, 1, markerLen) == ROW_MARKER then | ||
local parts = splitOn(mw.ustring.sub(v, markerLen + 1), FIELD_SEP) | |||
local index = mw.text.trim(parts[1] or '') | |||
local name = mw.text.trim(parts[2] or '') | |||
local slotType = mw.text.trim(parts[3] or 'None') | |||
local logicParams = mw.text.trim(parts[4] or '') | |||
if index == '' then index = tostring(i - 1) end | |||
if name ~= '' then | |||
local row = '|-\n| ' .. index .. ' || ' .. name .. ' || ' .. slotType | |||
if showLogic then | |||
local params = logicParams ~= '' and logicParams or getLogicParams(slotType) | |||
row = row .. ' || ' .. params | |||
end | |||
table.insert(rows, row) | |||
end | end | ||
end | end | ||
end | end | ||
Latest revision as of 01:19, 13 April 2026
Documentation for this module may be created at Module:Slots/doc
local p = {}
-- U+E000 / U+E001: valid UTF-8 private-use characters, cannot appear in template content
local ROW_MARKER = string.char(0xEE, 0x80, 0x80)
local FIELD_SEP = string.char(0xEE, 0x80, 0x81)
local function splitOn(str, sep)
local parts = {}
local sepLen = mw.ustring.len(sep)
local start = 1
while true do
local pos = mw.ustring.find(str, sep, start, true)
if not pos then
table.insert(parts, mw.ustring.sub(str, start))
break
end
table.insert(parts, mw.ustring.sub(str, start, pos - 1))
start = pos + sepLen
end
return parts
end
local BASE_PARAMS = {
'Class', 'Damage', 'MaxQuantity', 'Occupied', 'OccupantHash', 'Quantity', 'ReferenceId'
}
local EXTRA_PARAMS = {
Battery = {'Charge', 'ChargeRatio'},
GasCanister = {'Pressure', 'Temperature'},
GasFilter = {'FilterType'},
}
local function getLogicParams(slotType)
local params = {}
for _, v in ipairs(BASE_PARAMS) do table.insert(params, v) end
if EXTRA_PARAMS[slotType] then
for _, v in ipairs(EXTRA_PARAMS[slotType]) do table.insert(params, v) end
end
table.sort(params)
return table.concat(params, ', ')
end
function p.row(frame)
local args = frame:getParent().args
local name = mw.text.trim(args.name or '')
local slotType = mw.text.trim(args.type or 'None')
local index = mw.text.trim(args.index or '')
local logicParams = mw.text.trim(args.logicParams or '')
return ROW_MARKER .. table.concat({index, name, slotType, logicParams}, FIELD_SEP)
end
function p.render(frame)
local args = frame:getParent().args
local showLogic = args['logic'] ~= nil and args['logic'] ~= ''
local markerLen = mw.ustring.len(ROW_MARKER)
local rows = {}
for i, v in ipairs(args) do
if mw.ustring.sub(v, 1, markerLen) == ROW_MARKER then
local parts = splitOn(mw.ustring.sub(v, markerLen + 1), FIELD_SEP)
local index = mw.text.trim(parts[1] or '')
local name = mw.text.trim(parts[2] or '')
local slotType = mw.text.trim(parts[3] or 'None')
local logicParams = mw.text.trim(parts[4] or '')
if index == '' then index = tostring(i - 1) end
if name ~= '' then
local row = '|-\n| ' .. index .. ' || ' .. name .. ' || ' .. slotType
if showLogic then
local params = logicParams ~= '' and logicParams or getLogicParams(slotType)
row = row .. ' || ' .. params
end
table.insert(rows, row)
end
end
end
local header = '{| class="wikitable"\n|-\n! Index !! Slot Name !! Type'
if showLogic then
header = header .. ' !! Logic Parameters'
end
return header .. '\n' .. table.concat(rows, '\n') .. '\n|}'
end
return p