|
|
(21 intermediate revisions by 5 users not shown) |
Line 1: |
Line 1: |
| -- Credit: Original Infobox (now known as Infobox_Item) created by Pradoxzon was then edited by Nesphit and TreeNuts0. Fyre (FishAus) and Scotty (ZeelNightwolf) further edited the Infobox_Item. They then duplicated and used as a base for Infobox_Skill, Infobox_Plant, and Infobox_Animal.
| | local p = {} |
|
| |
|
| local p = {}
| |
| local Utils = require('Module:Utils') | | local Utils = require('Module:Utils') |
| | local IconUtils = require('Module:IconUtils') |
| local L = require('Module:Localization') | | local L = require('Module:Localization') |
|
| |
| -- Build an Item Infobox
| |
| function itemBox(args, itemData)
| |
| -- check that all necessary arguments are passed correctly
| |
| if args.name == nil or args.name == '' then
| |
| return '\'name\' must be specified.'
| |
| end
| |
|
| |
| local item = args.name
| |
| local itemTable = itemData.items[item]
| |
|
| |
| if itemTable == nil then
| |
| return item .. ' could not be found in Module:ItemData.'
| |
| end
| |
|
| |
| local itemType = itemTable.type
| |
| local itemEN = string.sub(itemType, 1, -5)
| |
| local itemimagename = string.gsub(itemEN, ' ', '')
| |
|
| |
| -- string used to build the infobox
| |
| local infobox = '{| class=\"infobox\"\n'
| |
|
| |
| -- 'Name and Image' section
| |
| -- name of the item
| |
| infobox = infobox .. '|- style=\"color: white; background-color: #1165AF; text-align: center;\"\n| colspan=\"2\" | \'\'\'<big>' .. item .. '</big>\'\'\'\n'
| |
|
| |
| -- the item's type (ItemData - group)
| |
| infobox = infobox .. '|- style=\"text-align: center; color: white; background-color: '
| |
|
| |
| local text_colour = '#78B1FF'
| |
|
| |
| if itemTable.group == L.t('Food') then
| |
| text_colour = '#85D66B'
| |
| elseif itemTable.group == L.t('Skill Books') or itemTable.group == L.t('Skill Scrolls') then
| |
| text_colour = '#FFCF4D'
| |
| elseif itemTable.group == L.t('Skill Scrolls') then
| |
| text_colour = '#FFCF4D'
| |
| end
| |
|
| |
| infobox = infobox .. text_colour .. ';\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
| |
| local icon = Utils.build_icon(item)
| |
| infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | '..icon .. '\n'
| |
|
| |
| -- 'Description' section header
| |
| infobox = infobox .. sectionHeader('Description')
| |
|
| |
| if itemTable.description == nil or itemTable.description == '' then
| |
| infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | \'\'\'' .. L.t('None') .. '\'\'\'\n'
| |
| else
| |
| infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | ' .. itemTable.description .. '\n'
| |
| end
| |
|
| |
| --Crafting
| |
| local craftingRecipes = mw.loadData("Module:CraftingRecipes")
| |
|
| |
| infobox = infobox .. generalSection(item, itemTable, craftingRecipes, args)
| |
|
| |
| infobox = infobox .. IDsSection(itemTable)
| |
|
| |
| -- Tags Header
| |
| if itemTable.tagGroups ~= nil and itemTable.tagGroups ~= {} then
| |
| infobox = infobox .. tagSection(itemTable, itemData)
| |
| end
| |
|
| |
| -- 'Item' World Object header (if itemTable.group = Placeable or Blocks)
| |
| if itemTable.group == L.t('Block Items') or itemTable.group == L.t('World Object Items') then
| |
| infobox = infobox .. placementSection(itemTable, itemimagename)
| |
|
| |
| -- Object Form Image
| |
| if itemTable.group == L.t('Block Items') then
| |
| infobox = infobox .. objectFormSection(itemTable, itemimagename)
| |
| end
| |
|
| |
| -- 'Housing' section (if there is a Room Category)
| |
| if itemTable.roomCategory ~= nil then
| |
| infobox = infobox .. housingSection(itemTable)
| |
| end
| |
|
| |
| -- 'Storage' Section (if inventorySlots is not nil)
| |
| if itemTable.inventorySlots ~= nil then
| |
| infobox = infobox .. storageSection(itemTable)
| |
| end
| |
|
| |
| -- 'Power' section (if EngeryType is ``not nil)
| |
| if itemTable.energyType ~= nil then
| |
| infobox = infobox .. powerSection(itemTable)
| |
|
| |
| end
| |
|
| |
| -- 'Fuel' Section (if fuelsUsed by Object)
| |
| if itemTable.fuelsUsed ~= nil then
| |
| infobox = infobox .. fuelsSection(itemTable)
| |
| end
| |
|
| |
| -- 'Fluid' section (if fludisUsed is not nil)
| |
| if itemTable.fluidsUsed ~= nil or itemTable.fluidsProduced ~= nil then
| |
| infobox = infobox .. fluidsSection(itemTable)
| |
| end
| |
| end
| |
|
| |
| -- Road Object header (if group == Road Items)
| |
| if itemTable.group == L.t('Road Items') then
| |
| infobox = infobox .. roadItemsSection(itemTable, itemimagename)
| |
| end
| |
| infobox = infobox .. '|}'
| |
| return infobox
| |
| end
| |
|
| |
| function sectionHeader(title, count)
| |
| return "|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | '''" .. L.t(title, count) .. "'''\n"
| |
| end
| |
|
| |
| function sectionRow(label, content, count, unit)
| |
| if unit ~= nil then
| |
| content = tonumber(content)
| |
| unit = L.t(unit, content)
| |
| local lang = mw.getContentLanguage()
| |
| content = lang:formatNum(content)
| |
| else
| |
| unit = ''
| |
| end
| |
| return '|-\n| ' .. L.t(label, count) .. ':\n| style=\"text-align: right; padding: 3px;\" | ' .. content .. unit .. '\n'
| |
| end
| |
|
| |
| function sectionImage(imageName, suffix)
| |
| local image = checkImage(imageName, suffix)
| |
| return '|-\n| colspan=\"2\" style=\"padding: 10px;\" | [[File:' .. image .. '|center|border|240px]]\n'
| |
| end
| |
|
| |
| local function addToSet(set, key)
| |
| set[key] = true
| |
| end
| |
|
| |
| local function setNotContains(set, key)
| |
| return set[key] == nil
| |
| end
| |
|
| |
| local function craftingSubSection(title, item, productsOrIngredients, recipes)
| |
| local stations = {}
| |
| local sortStations = {}
| |
| local stationString = ''
| |
| for _, recipeName in ipairs(productsOrIngredients[item]) do
| |
| local currentRecipe = recipes[recipeName]
| |
| if currentRecipe ~= nil then
| |
| if currentRecipe.variants[recipeName] ~= nil then
| |
| local currentStation = currentRecipe.craftStn[1][1]
| |
| if setNotContains(stations, currentStation) then
| |
| addToSet(stations, currentStation)
| |
| end
| |
| end
| |
| end
| |
| end
| |
|
| |
| if stations then
| |
| for a, _ in pairs(stations) do
| |
| table.insert(sortStations, a)
| |
| end
| |
| table.sort(sortStations)
| |
| for i, n in ipairs(sortStations) do
| |
| stationString = stationString .. ' [[' .. n .. ']]'
| |
| if (n ~= sortStations[#sortStations]) then
| |
| -- add a comma
| |
| stationString = stationString .. ', '
| |
| end
| |
| end
| |
| return sectionRow(title, stationString)
| |
| else
| |
| return sectionRow(title, L.t('N/A'))
| |
| end
| |
| end
| |
|
| |
| function generalSection(item, itemTable, craftingRecipes, args)
| |
| -- 'General' section header
| |
| section = sectionHeader('General')
| |
|
| |
| -- Is a product at these tables
| |
| if craftingRecipes.products[item] ~= nil and Utils.tableLen(craftingRecipes.products[item]) >= 1 then
| |
| section = section .. craftingSubSection('Created at', item, craftingRecipes.products, craftingRecipes.recipes)
| |
| end
| |
|
| |
| -- Is an ingredient at these tables
| |
| if craftingRecipes.ingredients[item] ~= nil and Utils.tableLen(craftingRecipes.ingredients[item]) >= 1 then
| |
| section = section .. craftingSubSection('Used at', item, craftingRecipes.ingredients, craftingRecipes.recipes)
| |
| end
| |
|
| |
| -- calories and nutrients (if itemTable.group == 'Food')
| |
| if itemTable.group == L.t('Food') then
| |
| section = section .. sectionRow('Calorie', itemTable.calories, tonumber(itemTable.calories), 'cal')
| |
| section = section .. '|- valign=\"center\"\n| rowspan=\"4\" | ' .. L.t('Nutrients') .. ':\n'
| |
| section = section .. '| style=\"color: red; text-align: right; padding: 3px;\" | ' .. L.t('Carbs') .. ': ' .. itemTable.carbs .. '\n'
| |
| section = section .. '|- valign=\"center\"\n| style=\"color: orange; text-align: right; padding: 3px;\" | ' .. L.t('Protein') .. ': ' .. itemTable.protein .. '\n'
| |
| section = section .. '|- valign=\"center\"\n| style=\"color: darkkhaki; text-align: right; padding: 3px;\" | ' .. L.t('Fat') .. ': ' .. itemTable.fat .. '\n'
| |
| section = section .. '|- valign=\"center\"\n| style=\"color: limegreen; text-align: right; padding: 3px;\" | ' .. L.t('Vitamins') .. ': ' .. itemTable.vitamins .. '\n'
| |
| section = section .. sectionRow('Nutrition Density', L.t('%s per 100 cals'):format(itemTable.density))
| |
| end
| |
|
| |
| -- carried
| |
| local carried
| |
| if args.carried ~= nil and args.carried ~= '' then
| |
| carried = args.carried
| |
| else
| |
| carried = itemTable.carried
| |
| end
| |
| section = section .. sectionRow('Carried in', carried)
| |
|
| |
| -- weight
| |
| local weight
| |
| if itemTable.weight ~= nil then
| |
| weight = itemTable.weight
| |
| else
| |
| weight = '0.0'
| |
| end
| |
| section = section .. sectionRow('Weight', weight, nil, 'kg')
| |
|
| |
| -- stack limit
| |
| if itemTable.maxStack ~= nil then
| |
| section = section .. sectionRow('Stack limit', itemTable.maxStack)
| |
| end
| |
|
| |
| -- yield
| |
| if itemTable.yield ~= nil then
| |
| section = section .. sectionRow('Improve Gathering', itemTable.yield)
| |
| end
| |
|
| |
| -- fuel
| |
| if itemTable.fuel ~= nil then
| |
| section = section .. sectionRow('Fuel energy', itemTable.fuel, nil, 'J')
| |
| end
| |
|
| |
| -- currency
| |
| if itemTable.currency ~= nil then
| |
| section = section .. "|- style=\"text-align: center;\"\n| colspan=\"2\" | " .. L.t('Can back a currency') .. "\n"
| |
| end
| |
| return section
| |
| end
| |
|
| |
| function IDsSection(itemTable)
| |
| -- 'IDs' section header
| |
| section = sectionHeader('ID', 2)
| |
|
| |
| -- item id (type)
| |
| section = section .. sectionRow('Item ID', itemTable.type)
| |
|
| |
| -- id number (type id)
| |
| section = section .. sectionRow('ID Number', itemTable.typeID)
| |
|
| |
| return section
| |
| end
| |
|
| |
| function tagSection(itemTable, itemData)
| |
| -- Tags Header
| |
| local tags = itemTable.tagGroups
| |
| section = sectionHeader('Tag', Utils.tableLen(tags))
| |
| local list = ''
| |
| -- for each item in the list (a is position, b is value)
| |
| for a, b in ipairs(tags) do
| |
| --if not these tags listed here
| |
| if (b ~= L.t('Object') or b ~= L.t('World Object') or b ~= L.t('Housing Object')) then
| |
| -- add the tag to the list
| |
| -- HACK: Some tag localisations have spaces in the tag name, but not in the tag data
| |
| local tagLink
| |
| -- Some tags have multiple spaces? Possible data quality issue
| |
| bClean = b:gsub("%s+", " ")
| |
| if itemData.tags[bClean] ~= nil then
| |
| tagLink = L.t('%s Tag'):format(bClean)
| |
| else
| |
| tagLink = L.t('%s Tag'):format(bClean:gsub(' ', ''))
| |
| end
| |
|
| |
| list = list .. '[[' .. tagLink .. '|' .. bClean .. ']][[Category:' .. bClean .. ']]'
| |
| end
| |
| -- if not the last item in the list
| |
| if (b ~= tags[#tags]) then
| |
| -- add a comma
| |
| list = list .. ', '
| |
| end
| |
| end
| |
| -- Now the list is made add it to the infobox
| |
| section = section .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | ' .. list .. '\n'
| |
|
| |
| return section
| |
| end
| |
|
| |
| function placementSection(itemTable, itemImageName)
| |
| section = sectionHeader('World Object')
| |
| -- Object Placed Image
| |
| section = section .. sectionImage(itemImageName, 'Placed')
| |
|
| |
| -- 'Placement' section
| |
| --Placement Header
| |
| section = section .. sectionHeader('Placement')
| |
|
| |
| --Vechile
| |
| if itemTable.mobile ~= nil then
| |
| section = section .. sectionRow('Vehicle/Mobile Object', itemTable.mobile)
| |
| end
| |
|
| |
| --Dimensions
| |
| if itemTable.footprint ~= nil then
| |
| section = section .. sectionRow('Dimensions (X,Y,Z)', itemTable.footprint)
| |
| end
| |
|
| |
| --Material Tier
| |
| if itemTable.materialTier ~= nil or itemTable.materialTier == 0 then
| |
| section = section .. sectionRow('Room Material', itemTable.materialTier) .. '[[Category:Tier ' .. itemTable.materialTier .. ']]\n'
| |
| end
| |
|
| |
| --Room Req.
| |
| if itemTable.roomContainReq ~= nil then
| |
| section = section .. sectionRow('Room Required', itemTable.roomContainReq)
| |
| end
| |
|
| |
| --Room Size. Req.
| |
| if itemTable.roomSizeReq ~= nil then
| |
| section = section .. sectionRow('Room Size', itemTable.roomSizeReq, nil, 'm³')
| |
| end
| |
|
| |
| --Room Mat. Req.
| |
| if itemTable.roomMatReq ~= nil then
| |
| section = section .. sectionRow('Room Materials', itemTable.roomMatReq)
| |
| end
| |
| return section
| |
| end
| |
|
| |
| function objectFormSection(itemTable, itemImageName)
| |
| return sectionImage(itemImageName, 'Form')
| |
| end
| |
|
| |
| function housingSection(itemTable)
| |
| -- Housing Header
| |
| section = sectionHeader('Housing')
| |
|
| |
| --roomCategory
| |
| section = section .. sectionRow('Room Category', itemTable.roomCategory) .. '[[Category:' .. itemTable.roomCategory .. ']]\n'
| |
|
| |
| if itemTable.roomCategory ~= L.t('Industrial') then
| |
| if itemTable.furnitureType ~= nil then
| |
| --furnitureType
| |
| section = section .. sectionRow('Furniture Type', itemTable.furnitureType) .. '[[Category:' .. itemTable.furnitureType .. ']]\n'
| |
|
| |
| --Value of the object
| |
| section = section .. sectionRow('Value', itemTable.skillValue)
| |
|
| |
| --Dim. Return % of Object
| |
| section = section .. sectionRow('Dim. Return %', itemTable.repeatsDepreciation * 100, nil, '%')
| |
| end
| |
| end
| |
|
| |
| if itemTable.roomCategory == L.t('Industrial') then
| |
| section = section .. "|- style=\"background-color: #red; text-align: center;\"\n| colspan=\"2\" | '''" .. L.t('ALL ROOM VALUE LOST') .. "'''\n"
| |
| end
| |
|
| |
| return section
| |
| end
| |
|
| |
| function storageSection(itemTable)
| |
| -- Storage Header
| |
| section = sectionHeader('Storage')
| |
|
| |
| --Inventory Slots
| |
| section = section .. sectionRow('Inventory Slots', itemTable.inventorySlots)
| |
|
| |
| --inventoryMaxWeight
| |
| if itemTable.inventoryMaxWeight ~= nil then
| |
| maxWeightKg = itemTable.inventoryMaxWeight / 1000
| |
| section = section .. sectionRow('Inventory Max Weight', maxWeightKg, nil, 'kg')
| |
| else
| |
| section = section .. sectionRow('Inventory Max Weight', L.t('Unlimited'))
| |
| end
| |
|
| |
| return section
| |
| end
| |
|
| |
| function powerSection(itemTable)
| |
| -- Power Header
| |
| section = sectionHeader('Power')
| |
|
| |
| --EngergyType
| |
| section = section .. sectionRow('Energy Type', itemTable.energyType) .. '[[Category:' .. itemTable.energyType .. ']]\n'
| |
|
| |
| --Grid Radius
| |
| section = section .. sectionRow('Grid Radius', itemTable.gridRadius, nil, 'm')
| |
|
| |
| --Energy Produced
| |
| section = section .. sectionRow('Energy Produced', itemTable.energyProduced, nil, 'w')
| |
|
| |
| --Energy Used
| |
| section = section .. sectionRow('Energy Used', itemTable.energyUsed, nil, 'w')
| |
|
| |
| return section
| |
| end
| |
|
| |
| function fuelsSection(itemTable)
| |
| -- Fuel Header
| |
| section = sectionHeader('Fuel')
| |
|
| |
| --Fuels Used by Object
| |
| section = section .. sectionRow('Fuels Used', '[[' .. L.t('%s Tag'):format(itemTable.fuelsUsed:gsub('[%[%]]+', '')) .. ']]')
| |
|
| |
| return section
| |
| end
| |
|
| |
| function fluidsSection(itemTable)
| |
| -- Liquid/Gas Header
| |
| section = sectionHeader('Liquid/Gas')
| |
|
| |
| --Input (fludisUsed)
| |
| if itemTable.fluidsUsed ~= nil then
| |
| local list = ''
| |
| for a, b in ipairs(itemTable.fluidsUsed) do
| |
| local acceptedType = b[1]
| |
| local cRateString = string.gsub(b[2], "%s+", "")
| |
| local consumingRate = tonumber(cRateString)
| |
| list = list .. L.t('%s at %sL'):format(acceptedType, consumingRate)
| |
|
| |
| if (a ~= #itemTable.fluidsUsed) then
| |
| list = list .. ', '
| |
| end
| |
| end
| |
| section = section .. sectionRow('Input', list)
| |
| end
| |
|
| |
| --Output (liquidProduced)
| |
| if itemTable.fluidsProduced ~= nil then
| |
| local list = ''
| |
| for a, b in ipairs(itemTable.fluidsProduced) do
| |
| local producedType = b[1]
| |
| local pRateString = string.gsub(b[2], "%s+", "")
| |
| local producingRate = tonumber(pRateString)
| |
| if (producingRate == 0) then
| |
| producingRate = 'Rate of Input'
| |
| end
| |
| list = list .. L.t('%s at %sL'):format(producedType, producingRate)
| |
| if (a ~= #itemTable.fluidsProduced) then
| |
| list = list .. ', '
| |
| end
| |
| end
| |
| section = section .. sectionRow('Output', list)
| |
| end
| |
|
| |
| return section
| |
| end
| |
|
| |
| function roadItemsSection(itemTable, itemImageName)
| |
| section = sectionHeader('Road Object')
| |
|
| |
| -- Object Placed Image
| |
| section = section .. sectionImage(itemImageName, 'Placed')
| |
| return section
| |
| end
| |
|
| |
| function checkImage(imageName, suffix)
| |
| local image = 'NoImage.png|link=https://wiki.play.eco/index.php?title=Special:Upload&wpDestFile=' .. imageName .. '_' .. suffix .. '.png|[[Category:Pages_with_missing_' .. suffix:lower() .. ']]'
| |
| if mw.title.makeTitle('File', imageName .. '_' .. suffix .. '.png').file.exists then
| |
| image = imageName .. '_' .. suffix .. '.png'
| |
| elseif mw.title.makeTitle('File', imageName .. '_' .. suffix .. '.jpg').file.exists then
| |
| image = imageName .. '_' .. suffix .. '.jpg'
| |
| end
| |
| return image
| |
| end
| |
|
| |
|
| -- Main entry point for the Module | | -- Main entry point for the Module |
| function p.ItemMain(frame) | | function p.main(frame) |
| -- get args from the Template
| | -- get args from the Template |
| local args = Utils.normaliseArgs(frame)
| | local args = Utils.normaliseArgs(frame) |
| | | local text = '' |
| -- get item data
| | |
| local itemData = mw.loadData("Module:ItemData")
| | return text |
| return itemBox(args, itemData) | |
| end | | end |
|
| |
|
| return p | | return p |