ATTENTION! The process of updating WiKi to version Eco 10.x has begun. Those wishing to participate can find out more Information on our ECO Contribution Wiki Discord.
From April 26 to May 12, errors may occur in the Wiki, as we will be carrying out a major update to the information processing modules.

Module:Infobox Item

From Eco - English Wiki
Revision as of 00:50, 1 March 2021 by Avaren (talk | contribs) (Refactor infobox)

Documentation

This module provides the back end functionality of the Template:Infobox_Item.

If the template is passed an Infobox will be made using details from the following Modules:

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.


-- 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 Utils = require('Module:Utils')
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: '

  if itemTable.group == 'Food' then
    infobox = infobox .. '#85D66B;\"\n| colspan=\"2\" | \'\'\'Food\'\'\'\n'
    -- Items:Food Icon Image
    local image = checkImage(itemimagename, 'Icon')

    infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | <div class="iconContainer"><div class="iconStack">[[File:' .. image .. '|frameless|class=iconGreen]]</div><div class=iconBorder style=\"position:absolute;\"></div></div> \n'

  elseif itemTable.group == 'Skill Books' then
    infobox = infobox .. '#FFCF4D;\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
    -- Items:Skill Book Icon Image
    infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | <div class="iconContainer"><div class="iconStack">[[File:SkillBook.png|link=https://wiki.play.eco/File:SkillBook.png|frameless|class=iconGold]]</div><div class=iconBorder style=\"position:absolute;\"></div></div> \n'

  elseif itemTable.group == 'Skill Scrolls' then
    infobox = infobox .. '#FFCF4D;\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
    -- Items:Skill Scrolls Icon Image
    infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | <div class="iconContainer"><div class="iconStack">[[File:SkillScroll.png|link=https://wiki.play.eco/File:SkillScroll.png|frameless|class=iconGold]]</div><div class=iconBorder style=\"position:absolute;\"></div></div> \n'

  else
    infobox = infobox .. '#78B1FF;\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
    -- Items: Other Icon Image
    local image = 'NoImage.png|link=https://wiki.play.eco/index.php?title=Special:Upload&wpDestFile=' .. itemimagename .. '_Icon.png|[[Category:Pages_with_missing_icon]]'
    if mw.title.makeTitle('File', itemimagename .. '_Icon.png').file.exists then
      image = itemimagename .. '_Icon.png'
    elseif mw.title.makeTitle('File', itemimagename .. '_Icon.jpg').file.exists then
      image = itemimagename .. '_Icon.jpg'
    end
    infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | <div class="iconContainer"><div class="iconStack">[[File:' .. image .. '|frameless|class=iconBlue]]</div><div class=iconBorder style=\"position:absolute;\"></div></div> \n'
  end

  -- 'Description' section header
  infobox = infobox .. sectionHeader('Description')

  if itemTable.description == nil then
    infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | \'\'\'None\'\'\'\n'
  elseif itemTable.description == '' then
    infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | \'\'\'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 .. 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 == 'Block Items' or itemTable.group == 'World Object Items' then
    infobox = infobox .. placementSection(itemTable, itemimagename)				

    -- Object Form Image
    if itemTable.group == '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 == 'Road Items' then
    infobox = infobox .. roadItemsSection(itemTable, itemimagename)
  end
  infobox = infobox .. '|}'
  return infobox
end

local function addToSet(set, key)
  set[key] = true
end

local function setNotContains(set, key)
  return set[key] == nil
end

function generalSection(itemTable, craftingRecipes)
-- 'General' section header
  section = sectionHeader('General')

  local recipes = craftingRecipes.recipes


  -- Is a product at these tables
  if craftingRecipes.products[item] ~= nil and #craftingRecipes.products[item] >= 1 then
    local count = 0
    local stations = {}
    local sortStations = {}
    local stationString = ''
    local found = false
    for k, v in ipairs( craftingRecipes.products[item] ) do
      if recipes[v] ~= nil then
        for num = 1, #recipes[v].numberOfVariants do	
          if (recipes[v].variants[v] ~= nil and recipes[v].numberOfVariants <= tostring(1)) then
            if setNotContains(stations, recipes[v].craftStn[1][1]) then
              addToSet(stations, recipes[v].craftStn[1][1])
              count = count + 1
            end	
            if found == false then
              found = true
              infobox = infobox .. '|-\n| Created At:\n| style=\"text-align: right; padding: 3px;\" |'
            end
          end
        end
      end
    end

    local track = 0

    if found == true then
      for a, b in pairs(stations) do
        table.insert(sortStations, a)
      end
      table.sort(sortStations)
      for i, n in ipairs(sortStations) do				
        stationString = stationString .. ' [[' .. n .. ']]'
        track = track + 1
        if track ~= count then -- Changed these line to produce comma if not last table.
          stationString = stationString .. ','
        end
      end
      infobox = infobox .. stationString .. '\n'		
    else
      infobox = infobox .. '|-\n| Created at:\n| style=\"text-align: right; padding: 3px;\" | N/A\n'
    end
  end

  -- Is an ingredient at these tables
  if craftingRecipes.ingredients[item] ~= nil and #craftingRecipes.ingredients[item] >= 1 then
    local count = 0
    local stations = {}
    local sortStations = {}
    local stationString = ''
    local found = false
    for k, v in ipairs( craftingRecipes.ingredients[item] ) do
      if recipes[v] ~= nil then
        for num = 1, #recipes[v].numberOfVariants do	
          if (recipes[v].variants[v] ~= nil and recipes[v].numberOfVariants <= tostring(1)) then
            if setNotContains(stations, recipes[v].craftStn[1][1]) then
              addToSet(stations, recipes[v].craftStn[1][1])
              count = count + 1
            end	
            if found == false then
              found = true
              infobox = infobox .. '|-\n| Used At:\n| style=\"text-align: right; padding: 3px;\" |'
            end
          end
        end
      end
    end

    local track = 0

    if found == true then
      for a, b in pairs(stations) do
        table.insert(sortStations, a)
      end
      table.sort(sortStations)
      for i, n in ipairs(sortStations) do				
        stationString = stationString .. ' [[' .. n .. ']]'
        track = track + 1
        if track ~= count then -- Changed these line to produce comma if not last table.
          stationString = stationString .. ','
        end
      end
      infobox = infobox .. stationString .. '\n'		
    else
      infobox = infobox .. '|-\n| Used at:\n| style=\"text-align: right; padding: 3px;\" | N/A\n'
    end
  end

  -- calories and nutrients (if itemTable.group == 'Food')
  if itemTable.group == 'Food' then
    infobox = infobox .. '|-\n| Calories:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.calories .. '\n|- valign=\"center\"\n| rowspan=\"4\" | Nutrients:\n'
    infobox = infobox .. '| style=\"color: red; text-align: right; padding: 3px;\" | Carbs: ' .. itemTable.carbs .. '\n'
    infobox = infobox .. '|- valign=\"center\"\n| style=\"color: orange; text-align: right; padding: 3px;\" | Protein: ' .. itemTable.protein .. '\n'
    infobox = infobox .. '|- valign=\"center\"\n| style=\"color: yellow; text-align: right; padding: 3px;\" | Fat: ' .. itemTable.fat .. '\n'
    infobox = infobox .. '|- valign=\"center\"\n| style=\"color: limegreen; text-align: right; padding: 3px;\" | Vitamins: ' .. itemTable.vitamins .. '\n'
    infobox = infobox .. '|-\n| Nutrition Density:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.density .. ' per 100 cals\n'
  end

  -- carried
  if args.carried ~= nil and args.carried ~= '' then
    infobox = infobox .. '|-\n| Carried in:\n| style=\"text-align: right; padding: 3px;\" | ' .. args.carried .. '\n'
  else
    infobox = infobox .. '|-\n| Carried in:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.carried .. '\n'
  end

  -- weight
  if itemTable.weight ~= nil then
    infobox = infobox .. '|-\n| Weight:\n| style="text-align: right; padding: 3px;" | ' .. itemTable.weight .. ' kg\n'
  else
    infobox = infobox .. '|-\n| Weight:\n| style="text-align: right; padding: 3px;" | 0.00kg\n'
  end

  -- stack limit
  if itemTable.maxStack ~= nil then
    infobox = infobox .. '|-\n| Stack limit:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.maxStack .. '\n'
  end

  -- yield 
  if itemTable.yield ~= nil then
    infobox = infobox .. '|-\n| Improve Gathering: \n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.yield .. '\n'
  end 	

  -- fuel
  if itemTable.fuel ~= nil then
    infobox = infobox .. '|-\n| Fuel energy:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.fuel .. ' J\n'
  end

  -- currency
  if itemTable.currency ~= nil then
    infobox = infobox .. '|-\n| Used as Currency:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.currency .. '\n'
  end
  return section
end

function sectionHeader(title, count)
  return [[|- style="background-color: #4688C0; text-align: center;"\n| colspan="2" | ''']] .. L.t(title, count) .. [['''\n]]
end

function IDsSection(itemTable)
  -- 'IDs' section header
  section = sectionHeader('ID', 2)

  -- item id (type)
  section = section .. '|- valign=\"center\"\n| Item ID:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.type .. '\n'

  -- id number (type id)
  section = section .. '|- valign=\"center\"\n| ID Number:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.typeID .. '\n'

  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 = bClean .. L.t('Tag')
      else
        tagLink = bClean:gsub(' ', '') .. L.t('Tag')
      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
  local image = checkImage(itemImageName, 'Placed')
  section = section .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | [[File:' .. image .. '|center|border|240px]]\n'

  -- 'Placement' section
  --Placement Header
  section = section .. sectionHeader('Placement')

  --Vechile
  if itemTable.mobile ~= nil then
    section = section .. '|-\n| Vehicle/Mobile Object:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.mobile .. '\n'
  end			

  --Dimensions 
  if itemTable.footprint ~= nil then
    section = section .. '|-\n| Dimensions (X,Y,Z):\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.footprint .. '\n'
  end

  --Material Tier
  if itemTable.materialTier ~= nil or itemTable.materialTier == 0 then
    section = section .. '|-\n| Room Material:\n| style=\"text-align: right; padding: 3px;\" | Tier ' .. itemTable.materialTier .. '[[Category:Tier '.. itemTable.materialTier ..']]\n'
  end

  --Room Req.
  if itemTable.roomContainReq ~= nil then
    section = section .. '|-\n| Room Required:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.roomContainReq .. '\n'
  end	

  --Room Size. Req.
  if itemTable.roomSizeReq ~= nil then
    section = section .. '|-\n| Room Size:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.roomSizeReq .. ' m³\n'
  end

  --Room Mat. Req.
  if itemTable.roomMatReq ~= nil then
    section = section .. '|-\n| Room Materials:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.roomMatReq .. '\n'
  end	
  return section
end

function objectFormSection(itemTable, itemImageName)
  local image = checkImage(itemImageName, '_Form')
  return '|-\n| colspan=\"2\" style=\"padding: 10px;\" | [[File:' .. image .. '|center|border|240px]]\n'
end

function housingSection(itemTable)
-- Housing Header
  section = sectionHeader('Housing')

  --roomCategory
  section = section .. '|-\n| Room Category:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.roomCategory .. '[[Category:' .. itemTable.roomCategory .. ']]\n'

  if section.roomCategory ~= 'Industrial' then
    if section.furnitureType ~= nil then 
      --furnitureType
      section = section .. '|-\n| Furniture Type:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.furnitureType .. '[[Category:' .. itemTable.furnitureType .. ']]\n'

      --Value of the object
      section = section .. '|-\n| Value:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.skillValue .. '\n'

      --Dim. Return % of Object  
      section = section .. '|-\n| Dim. Return %:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.repeatsDepreciation .. '\n'    
    end
  end

  if itemTable.roomCategory == 'Industrial' then
    section = section .. '|- style=\"background-color: red; text-align: center;\"\n| colspan=\"2\" | \'\'\'ALL ROOM VALUE LOST\'\'\'\n'
  end

  return section
end

function storageSection(itemTable)
  -- Storage Header
  section = sectionHeader('Storage')

  --Inventory Slots
  section = section .. '|-\n| Inventory Slots:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.inventorySlots .. '\n'

  --inventoryMaxWeight
  if itemTable.inventoryMaxWeight ~= nil then
    maxWeightKg = itemTable.inventoryMaxWeight/1000
    section = section .. '|-\n| Inventory Max Weight:\n| style=\"text-align: right; padding: 3px;\" | ' .. maxWeightKg .. ' Kg\n'
  else
    section = section .. '|-\n| Inventory Max Weight:\n| style=\"text-align: right; padding: 3px;\" | Unlimited \n'
  end

  return section
end


function powerSection(itemTable)
  -- Power Header
  section = sectionHeader('Power')

  --EngergyType 
  section = section .. '|-\n| Energy Type:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.energyType .. '[[Category:' .. itemTable.energyType .. ']]\n'

  --Grid Radius
  section = section .. '|-\n| Grid Radius:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.gridRadius .. ' m\n'

  --Energy Produced
  section = section .. '|-\n| Energy Produced:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.energyProduced .. 'W\n'

  --Energy Used
  section = section .. '|-\n| Energy Used:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.energyUsed .. 'W\n'	

  return section
end

function fuelsSection(itemTable)
  -- Fuel Header
  section = sectionHeader('Fuel')

  --Fuels Used by Object
  section = section .. '|-\n| Fuels Used:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.fuelsUsed .. '\n'

  return section
end

function fluidsSection(itemTable)
-- Liquid/Gas Header
  section = sectionHeader('Liquid/Gas')

--Input (fludisUsed) 
  if itemTable.fluidsUsed ~= nil then
    section = section .. '|-\n| Input: \n| style=\"text-align: right; padding: 3px;\" | ' 
    if itemTable.fluidsUsed ~= nil then
      for a,b in ipairs(itemTable.fluidsUsed) do
        local acceptedType =  b[1]
        local cRateString = string.gsub(b[2], "%s+", "")
        local consumingRate = tonumber(cRateString)
        section = section .. acceptedType .. ' at ' .. consumingRate .. ' L'
        if (a ~= #itemTable.fluidsUsed) then
          section = section .. ', '
        end
      end
    end
    section = section .. '\n'
  end

--Output (liquidProduced)
  if itemTable.fluidsProduced ~= nil then
    section = section .. '|-\n| Output: \n| style=\"text-align: right; padding: 3px;\" | '
    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
      section = section .. producedType .. ' at ' .. producingRate .. ' L'
      if (a ~= #itemTable.fluidsProduced) then
        section = section .. ', '
      end
    end
    section = section .. '\n'
  end


return section
end

function roadItemsSection(itemTable, itemImageName)
  section = sectionHeader('Road Object')

  -- Object Placed Image
  local image = checkImage(itemImageName, 'Placed')
  section = section .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | [[File:' .. image .. '|center|border|240px]]\n'
  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
function p.ItemMain(frame)
  -- get args from the Template
  local args = Utils.normaliseArgs(frame)

  -- get item data
  local itemData = mw.loadData( "Module:ItemData" )
  return itemBox( args, itemData )
end

return p