Module:Goodbox: Difference between revisions
From Against the Storm Official Wiki
Created for infoboxes on goods' pages |
was calling the wrong species link template. fixed now; icons should be bigger |
||
| (28 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
--- | --- | ||
-- | --- Retrieves data for the specified resource and sends the data over to the view, another template. | ||
-- | --- | ||
-- @module | --- @module Goodbox | ||
local Goodbox = {} | local Goodbox = {} | ||
-- Dependencies | |||
--region Dependencies | |||
local GoodsData = require("Module:GoodsData") | local GoodsData = require("Module:GoodsData") | ||
local SpeciesData = mw.loadData("Module:SpeciesData") | |||
local ControllerUtilities = require("Module:ControllerUtilities") | |||
local ViewTemplate = "Template:Goodbox/view" | |||
--endregion | |||
--region Private constants | |||
local ARG_NAME = "name" | |||
local PARAM_TITLE = "title" | |||
local PARAM_SUBTITLE = "subtitle" | |||
local PARAM_DESCRIPTION = "description" | |||
local PARAM_ICON_FILENAME = "iconfilename" | |||
local PARAM_PREFERENCES = "preferences" | |||
local PARAM_RECIPES = "recipes" | |||
local PARAM_BURN_TIME = "burntime" | |||
local PARAM_SELL_VALUE = "sellvalue" | |||
local PARAM_SELL_VALUE_AFTER_PRESTIGE_PENALTY = "sellvaluep10" | |||
local PARAM_BUY_VALUE = "buyvalue" | |||
local PARAM_ID = "id" | |||
--endregion | |||
--region Private methods | |||
--- | ---renderPreferences takes the ID of a resource and looks up what species prefers it to satisfy one of their needs, calls external view templates to convert those species into usable content strings for display, and returns those strings concatenated together for display by the calling scope. | ||
-- | ---@param id string the unique ID of the resource | ||
--- | ---@return string a content string ready for display | ||
local | local function renderPreferences(id) | ||
local | local frame = mw.getCurrentFrame() | ||
local | local goodName = GoodsData.getGoodNameByID(id) | ||
local | local concatenatedStrings = "" | ||
for speciesID, species in pairs(SpeciesData.species) do | |||
for _, need in ipairs(species[SpeciesData.NEEDS]) do | |||
if need[SpeciesData.NEED_NAME] == goodName then | |||
local | local speciesString = frame:expandTemplate{ | ||
title = "Species_link/view", | |||
args = { | |||
["iconfilename"] = species[SpeciesData.ICON_FILENAME] .. ".png", | |||
["name"] = speciesID, | |||
["iconsize"] = "medium", | |||
["display"] = "notext", | |||
}, } | |||
-- Separate multiple entries with a space | |||
if #concatenatedStrings > 1 then | |||
concatenatedStrings = concatenatedStrings .. " " | |||
end | |||
concatenatedStrings = concatenatedStrings .. speciesString | |||
end | |||
end | |||
end | |||
if #concatenatedStrings < 1 then | |||
return nil | |||
end | |||
return concatenatedStrings | |||
end | end | ||
--- | -- Building interface: | ||
-- | -- getCategory | ||
-- | -- getCityScore | ||
-- | -- getConstructionCosts (as [goodName] = stack size) | ||
-- | -- getConstructionTime | ||
-- | -- getDescription | ||
function | -- getIcon | ||
-- isMovable | |||
-- getName | |||
-- getNumberOfWorkplaces | |||
-- getSize (as "X x Y") | |||
-- getStorage | |||
local function buildViewParameters(id) | |||
local frame = mw.getCurrentFrame() | |||
local viewParameters = {} | |||
viewParameters[PARAM_TITLE] = GoodsData.getName(id) | |||
viewParameters[PARAM_SUBTITLE] = GoodsData.getCategory(id) | |||
viewParameters[PARAM_DESCRIPTION] = ControllerUtilities.findAndReplaceSpriteTagsWithFiles(GoodsData.getDescription(id), frame) | |||
viewParameters[PARAM_ICON_FILENAME] = GoodsData.getIcon(id) | |||
viewParameters[PARAM_PREFERENCES] = renderPreferences(id) | |||
viewParameters[PARAM_RECIPES] = frame:expandTemplate{ title = "Recipe", args = { ["product"] = GoodsData.getName(id), ["display"] = "list", }, } | |||
local burnTime = GoodsData.getBurnTime(id) or 0 | |||
local timeString = string.format( "%02d:%02d", math.floor(burnTime/60), math.fmod(burnTime, 60) ) | |||
viewParameters[PARAM_BURN_TIME] = burnTime ~= 0 and timeString | |||
viewParameters[PARAM_SELL_VALUE] = GoodsData.getSellValue(id) | |||
viewParameters[PARAM_SELL_VALUE_AFTER_PRESTIGE_PENALTY] = GoodsData.getSellValueAfterPrestigePenalty(id) | |||
viewParameters[PARAM_BUY_VALUE] = GoodsData.getBuyValue(id) | |||
viewParameters[PARAM_ID] = id | |||
-- Augment the subtitle according to preferences. This is hard-code-y, but it's simple and won't break if the categories change, it'll just get skipped. | |||
if viewParameters[PARAM_PREFERENCES] then | |||
if viewParameters[PARAM_SUBTITLE] == "Food" then | |||
viewParameters[PARAM_SUBTITLE] = "Food (Complex Food)" | |||
else | |||
if viewParameters[PARAM_SUBTITLE] == "Consumable Items" then | |||
viewParameters[PARAM_SUBTITLE] = "Consumable Items (Service Goods)" | |||
end | |||
end | |||
end | |||
return viewParameters | |||
end | end | ||
function | ---findBoxData | ||
--- Handles data only, does not interface with the view. | |||
---@param name string the name of the resource about which to retrieve data | |||
---@return table the essential data about the resource extracted | |||
local function findBoxData(name) | |||
local id = GoodsData.getGoodID(name) | |||
if not id then | |||
error("No resource found with name: " .. name .. ".") | |||
end | |||
local viewParameters = buildViewParameters(id) | |||
if not viewParameters then | |||
error("No resource found with name: " .. name .. ".") | |||
end | |||
return viewParameters | |||
end | end | ||
--endregion | |||
--region Public methods | |||
---main | |||
--- For calling from Template:Goodbox. After handling the frame, forwards control to the primary method, findBoxData, then calls the view template with the compiled box data. Does not interface with any data modules. | |||
--- | --- | ||
- | ---@param frame table the calling template's context | ||
---@return string wiki markup, constructed with the template view | |||
-- @param | function Goodbox.main(frame) | ||
-- @return the | |||
function | local name = frame.args[ARG_NAME] | ||
if not name then | |||
error("You must specify the name of the good or resource. Please see the template documentation for how to use the parameters.") | |||
end | |||
local viewParameters = findBoxData(name) | |||
return frame:expandTemplate{ title = ViewTemplate, args = viewParameters } | |||
end | end | ||
--endregion | |||
return Goodbox | return Goodbox | ||
Latest revision as of 20:14, 23 October 2024
Documentation for this module may be created at Module:Goodbox/doc
---
--- Retrieves data for the specified resource and sends the data over to the view, another template.
---
--- @module Goodbox
local Goodbox = {}
--region Dependencies
local GoodsData = require("Module:GoodsData")
local SpeciesData = mw.loadData("Module:SpeciesData")
local ControllerUtilities = require("Module:ControllerUtilities")
local ViewTemplate = "Template:Goodbox/view"
--endregion
--region Private constants
local ARG_NAME = "name"
local PARAM_TITLE = "title"
local PARAM_SUBTITLE = "subtitle"
local PARAM_DESCRIPTION = "description"
local PARAM_ICON_FILENAME = "iconfilename"
local PARAM_PREFERENCES = "preferences"
local PARAM_RECIPES = "recipes"
local PARAM_BURN_TIME = "burntime"
local PARAM_SELL_VALUE = "sellvalue"
local PARAM_SELL_VALUE_AFTER_PRESTIGE_PENALTY = "sellvaluep10"
local PARAM_BUY_VALUE = "buyvalue"
local PARAM_ID = "id"
--endregion
--region Private methods
---renderPreferences takes the ID of a resource and looks up what species prefers it to satisfy one of their needs, calls external view templates to convert those species into usable content strings for display, and returns those strings concatenated together for display by the calling scope.
---@param id string the unique ID of the resource
---@return string a content string ready for display
local function renderPreferences(id)
local frame = mw.getCurrentFrame()
local goodName = GoodsData.getGoodNameByID(id)
local concatenatedStrings = ""
for speciesID, species in pairs(SpeciesData.species) do
for _, need in ipairs(species[SpeciesData.NEEDS]) do
if need[SpeciesData.NEED_NAME] == goodName then
local speciesString = frame:expandTemplate{
title = "Species_link/view",
args = {
["iconfilename"] = species[SpeciesData.ICON_FILENAME] .. ".png",
["name"] = speciesID,
["iconsize"] = "medium",
["display"] = "notext",
}, }
-- Separate multiple entries with a space
if #concatenatedStrings > 1 then
concatenatedStrings = concatenatedStrings .. " "
end
concatenatedStrings = concatenatedStrings .. speciesString
end
end
end
if #concatenatedStrings < 1 then
return nil
end
return concatenatedStrings
end
-- Building interface:
-- getCategory
-- getCityScore
-- getConstructionCosts (as [goodName] = stack size)
-- getConstructionTime
-- getDescription
-- getIcon
-- isMovable
-- getName
-- getNumberOfWorkplaces
-- getSize (as "X x Y")
-- getStorage
local function buildViewParameters(id)
local frame = mw.getCurrentFrame()
local viewParameters = {}
viewParameters[PARAM_TITLE] = GoodsData.getName(id)
viewParameters[PARAM_SUBTITLE] = GoodsData.getCategory(id)
viewParameters[PARAM_DESCRIPTION] = ControllerUtilities.findAndReplaceSpriteTagsWithFiles(GoodsData.getDescription(id), frame)
viewParameters[PARAM_ICON_FILENAME] = GoodsData.getIcon(id)
viewParameters[PARAM_PREFERENCES] = renderPreferences(id)
viewParameters[PARAM_RECIPES] = frame:expandTemplate{ title = "Recipe", args = { ["product"] = GoodsData.getName(id), ["display"] = "list", }, }
local burnTime = GoodsData.getBurnTime(id) or 0
local timeString = string.format( "%02d:%02d", math.floor(burnTime/60), math.fmod(burnTime, 60) )
viewParameters[PARAM_BURN_TIME] = burnTime ~= 0 and timeString
viewParameters[PARAM_SELL_VALUE] = GoodsData.getSellValue(id)
viewParameters[PARAM_SELL_VALUE_AFTER_PRESTIGE_PENALTY] = GoodsData.getSellValueAfterPrestigePenalty(id)
viewParameters[PARAM_BUY_VALUE] = GoodsData.getBuyValue(id)
viewParameters[PARAM_ID] = id
-- Augment the subtitle according to preferences. This is hard-code-y, but it's simple and won't break if the categories change, it'll just get skipped.
if viewParameters[PARAM_PREFERENCES] then
if viewParameters[PARAM_SUBTITLE] == "Food" then
viewParameters[PARAM_SUBTITLE] = "Food (Complex Food)"
else
if viewParameters[PARAM_SUBTITLE] == "Consumable Items" then
viewParameters[PARAM_SUBTITLE] = "Consumable Items (Service Goods)"
end
end
end
return viewParameters
end
---findBoxData
--- Handles data only, does not interface with the view.
---@param name string the name of the resource about which to retrieve data
---@return table the essential data about the resource extracted
local function findBoxData(name)
local id = GoodsData.getGoodID(name)
if not id then
error("No resource found with name: " .. name .. ".")
end
local viewParameters = buildViewParameters(id)
if not viewParameters then
error("No resource found with name: " .. name .. ".")
end
return viewParameters
end
--endregion
--region Public methods
---main
--- For calling from Template:Goodbox. After handling the frame, forwards control to the primary method, findBoxData, then calls the view template with the compiled box data. Does not interface with any data modules.
---
---@param frame table the calling template's context
---@return string wiki markup, constructed with the template view
function Goodbox.main(frame)
local name = frame.args[ARG_NAME]
if not name then
error("You must specify the name of the good or resource. Please see the template documentation for how to use the parameters.")
end
local viewParameters = findBoxData(name)
return frame:expandTemplate{ title = ViewTemplate, args = viewParameters }
end
--endregion
return Goodbox


