Jump to content

Module:Industries

From Steam & Steel
Revision as of 02:52, 20 September 2024 by en>Saismee
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Documentation for this module may be created at Module:Industries/doc

local module = {}

local maps = require("Module:Maps")
local cargo_module = require("Module:Cargo")

module.industries = {
	-- TIER 1 --
	["Water Pumping Station"] = {
		tier = 1,
		required_cargo = {},
		bonus_cargo = {"Machinery", "Cordwood"},
		produced_cargo = {"Water"}
	},
	["Farm"] = {
		tier = 1,
		required_cargo = {},
		bonus_cargo = {"Tools", "Water"},
		produced_cargo = {"Cattle", "Grain"}
	},
	["Ranch"] = {
		tier = 1,
		required_cargo = {},
		bonus_cargo = {"Tools"},
		produced_cargo = {"Cattle"}
	},
	["Forest Camp"] = {
		tier = 1,
		required_cargo = {},
		bonus_cargo = {"Tools"},
		produced_cargo = {"Logs", "Cordwood"}
	},
	["Fishery"] = {
		tier = 1,
		required_cargo = {},
		bonus_cargo = {"Tools", "Cordwood", "Machinery"},
		produced_cargo = {"Fish"}
	},
	["Sand Bar"] = {
		tier = 1,
		required_cargo = {},
		bonus_cargo = {"Tools", "Cordwood", "Machinery"},
		produced_cargo = {"Sand"}
	},
	["Clay Pit"] = {
		tier = 1,
		required_cargo = {},
		bonus_cargo = {"Tools", "Cordwood", "Machinery"},
		produced_cargo = {"Clay"}
	},

	-- TIER 2 --
	["Distillery"] = {
		tier = 2,
		required_cargo = {{"Grain"}, {"Cordwood"}, {"Water"}},
		bonus_cargo = {"Pipes", "Iron Ingots"},
		produced_cargo = {"Rum"}
	},
	["Lumber Mill"] = {
		tier = 2,
		required_cargo = {{"Logs"}},
		bonus_cargo = {"Coal", "Machinery"},
		produced_cargo = {"Lumber", "Beams", "Wood Pulp"}
	},
	["Pulp Mill"] = {
		tier = 2,
		required_cargo = {{"Logs"}},
		bonus_cargo = {"Coal", "Machinery"},
		produced_cargo = {"Wood Pulp"}
	},
	["Slaughterhouse"] = {
		tier = 2,
		required_cargo = {{"Cattle"}, {"Cordwood"}},
		bonus_cargo = {"Tools"},
		produced_cargo = {"Leather", "Food", "Grease"}
	},
	["Food Factory"] = {
		tier = 2,
		required_cargo = {{"Cordwood"}, {"Grain", "Fish"}},
		bonus_cargo = {"Tools", "Machinery"},
		produced_cargo = {"Food"}
	},
	["Brickworks"] = {
		tier = 2,
		required_cargo = {{"Clay"}, {"Gravel"}, {"Cordwood", "Coal"}},
		bonus_cargo = {"Tools"},
		produced_cargo = {"Bricks"}
	},

	-- TIER 3 --
	["Paper Mill"] = {
		tier = 3,
		required_cargo = {{"Water"}, {"Wood Pulp"}},
		bonus_cargo = {"Coal", "Machinery"},
		produced_cargo = {"Paper"}
	},
	["Iron Mine"] = {
		tier = 3,
		required_cargo = {{"Lumber"}, {"Beams"}},
		bonus_cargo = {"Tools", "Rails", "Kerosene"},
		produced_cargo = {"Iron Ore", "Gravel", "Water"}
	},
	["Gold Mine"] = {
		tier = 3,
		required_cargo = {{"Lumber"}, {"Beams"}},
		bonus_cargo = {"Tools", "Rails", "Kerosene"},
		produced_cargo = {"Gold Ore", "Gravel", "Water"}
	},
	["Copper Mine"] = {
		tier = 3,
		required_cargo = {{"Lumber"}, {"Coal", "Cordwood"}},
		bonus_cargo = {"Machinery", "Tools", "Rails", "Kerosene"},
		produced_cargo = {"Copper Ore", "Gravel", "Water"}
	},
	["Bauxite Mine"] = {
		tier = 3,
		required_cargo = {{"Beams"}},
		bonus_cargo = {"Tools", "Lumber"},
		produced_cargo = {"Bauxite Ore", "Gravel", "Water"}
	},
	["Quarry"] = {
		tier = 3,
		required_cargo = {{"Beams"}},
		bonus_cargo = {"Tools", "Kerosene"},
		produced_cargo = {"Cut Stone", "Gravel", "Coal"}
	},
	["Tannery"] = {
		tier = 3,
		required_cargo = {{"Leather"}, {"Cordwood"}},
		bonus_cargo = {"Tools", "Chemicals"},
		produced_cargo = {"Textiles"}
	},
	
	-- TIER 4 --
	["Iron Works"] = {
		tier = 4,
		required_cargo = {{"Iron Ore"}, {"Cordwood", "Coal"}},
		bonus_cargo = {"Tools", "Kerosene"},
		produced_cargo = {"Iron Ingots", "Rails"}
	},
	["Copper Works"] = {
		tier = 4,
		required_cargo = {{"Copper Ore"}, {"Cordwood", "Coal"}},
		bonus_cargo = {"Tools", "Kerosene"},
		produced_cargo = {"Copper Ingots", "Pipes"}
	},
	["Aluminium Plant"] = {
		tier = 4,
		required_cargo = {{"Bauxite Ore"}, {"Cordwood", "Coal"}},
		bonus_cargo = {"Tools"},
		produced_cargo = {"Aluminium Ingots"}
	},
	
	-- TIER 5 --
	["Machine Shop"] = {
		tier = 5,
		required_cargo = {{"Coal"}, {"Copper Ingots", "Aluminium Ingots", "Iron Ingots"}},
		bonus_cargo = {"Grease"},
		produced_cargo = {"Tools", "Machinery"}
	},
	
	-- TIER 6 --
	["Coal Mine"] = {
		tier = 6,
		required_cargo = {{"Rails"}, {"Lumber"}, {"Tools"}, {"Beams"}},
		bonus_cargo = {"Machinery", "Kerosene"},
		produced_cargo = {"Coal", "Gravel", "Uncut Gems", "Water"}
	},
	["Shipyard"] = {
		tier = 6,
		required_cargo = {{"Machinery"}, {"Tools"}, {"Coal"}, {"Iron Ingots"}},
		bonus_cargo = {},
		produced_cargo = {}
	},

	-- TIER 7 --
	["Gold Smith"] = {
		tier = 7,
		required_cargo = {{"Gold Ore"}, {"Uncut Gems"}, {"Cordwood", "Coal"}},
		bonus_cargo = {"Tools"},
		produced_cargo = {"Jewelry"}
	},
	["Oil Well"] = {
		tier = 7,
		required_cargo = {{"Pipes"}, {"Machinery"}, {"Beams"}, {"Tools"}},
		bonus_cargo = {"Grease"},
		produced_cargo = {"Crude Oil"}
	},

	-- TIER 8 --
	["Oil Refinery"] = {
		tier = 8,
		required_cargo = {{"Coal"}, {"Crude Oil"}, {"Cordwood"}},
		bonus_cargo = {"Pipes", "Machinery", "Iron Ingots"},
		produced_cargo = {"Grease", "Kerosene", "Chemicals"}
	},
}
module.industries["Cactus Camp"] = module.industries["Forest Camp"]
module.industries["Smelter"] = module.industries["Iron Works"]
module.industries["Copper Smelter"] = module.industries["Copper Works"]

local roman_numerals = { "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X" }

local function wrapLink(text)
	return "[["..text.."]]"	
end

function getIndustryPageRow(frame)
	-- Industry Name|Map Name?
	local info, map = module.industries[frame.args[1]], frame.args[2]
	local out = "|-\n| style=\"text-align:left;\"|" .. roman_numerals[info.tier]
	.. "\n| style=\"text-align:left;\"|'''<span id=" .. frame.args[1]:gsub(" ", "_") .. ">" .. frame.args[1] .. "</span>'''"
	
	if #info.required_cargo == 0 then
		out = out .. "\n| style=\"text-align:left;color: green\"|''No Items Required''"
	else
		out = out .. "\n| style=\"text-align:left;\"|"
		
		local text_list = {}
		
		for _, cargo_list in pairs(info.required_cargo) do
			local text = ""
			if #cargo_list > 1 then text = text .. "<br>" end
			local index = 1
			for _, cargo in pairs(cargo_list) do
				assert(cargo_module.cargo[cargo], "invalid:" .. cargo)
				if (not map) or cargo_module.cargo[cargo].maps[map] then
					if index > 1 then text = text .. " '''OR''' " end
					index = index + 1
					text = text .. wrapLink(cargo)	
				end
			end
			table.insert(text_list, text)
		end
		
		out = out .. table.concat(text_list, ", ")
	end
	
	out = out .. "\n| style=\"text-align:left;\"|"
	local index = 1
	for _, cargo in pairs(info.bonus_cargo) do
		assert(cargo_module.cargo[cargo], "invalid:" .. cargo)
		if (not map) or cargo_module.cargo[cargo].maps[map] then
			if index > 1 then out = out .. ", " end
			index = index + 1
			out = out .. wrapLink(cargo)
		end
	end
	
	out = out .. "\n| style=\"text-align:left;\"|"
	index = 1
	for _, cargo in pairs(info.produced_cargo) do
		assert(cargo_module.cargo[cargo], "invalid:" .. cargo)
		if (not map) or cargo_module.cargo[cargo].maps[map] then
			if index > 1 then out = out .. ", " end
			index = index + 1
			out = out .. wrapLink(cargo)
		end
	end
	
	return out
end

function module.getIndustryPage(frame)
	-- Map Name?
	local map = frame.args[1]
	
	local out = ""
	local sortable_industries = {}
	local invalid_industries = {}
	if map then
		for name in pairs(maps.maps[map].industries) do
			if not module.industries[name] then
				table.insert(invalid_industries, name)
			else
				local info = module.industries[name]
				info.name = name
				table.insert(sortable_industries, info)
			end
		end
	else
		for name, info in pairs(module.industries) do
			info.name = name
			table.insert(sortable_industries, info)
		end
	end
	
	table.sort(sortable_industries, function(a, b) return a.tier < b.tier end)
	
	for _, info in pairs(sortable_industries) do
		out = out .. getIndustryPageRow({args = {info.name, map}}) .. "\n"
	end
	
	if #invalid_industries > 0 then
		-- :c
		out = out .. "<br> invalid:" .. table.concat(invalid_industries, ", ")
	end
	
	return out
end

return module