<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.hoodedhorse.com/Against_the_Storm/index.php?action=history&amp;feed=atom&amp;title=Module%3AWorkshopsData2</id>
	<title>Module:WorkshopsData2 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hoodedhorse.com/Against_the_Storm/index.php?action=history&amp;feed=atom&amp;title=Module%3AWorkshopsData2"/>
	<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Against_the_Storm/index.php?title=Module:WorkshopsData2&amp;action=history"/>
	<updated>2026-10-18T12:15:36Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.5</generator>
	<entry>
		<id>https://wiki.hoodedhorse.com/Against_the_Storm/index.php?title=Module:WorkshopsData2&amp;diff=9109&amp;oldid=prev</id>
		<title>76561197969631737: renamed the return value to be clearer</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Against_the_Storm/index.php?title=Module:WorkshopsData2&amp;diff=9109&amp;oldid=prev"/>
		<updated>2024-10-25T15:15:43Z</updated>

		<summary type="html">&lt;p&gt;renamed the return value to be clearer&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 15:15, 25 October 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l8&quot;&gt;Line 8:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 8:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;baseDataModel &lt;/del&gt;= BaseDataModel.new(DATA_FILE)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;workshopsDataModel &lt;/ins&gt;= BaseDataModel.new(DATA_FILE)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- Return the instance for workshops data, not this module itself!&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- Return the instance for workshops data, not this module itself!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;return &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;baseDataModel&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;return &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;workshopsDataModel&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key ATS_:diff:1.41:old-9102:rev-9109:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>76561197969631737</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Against_the_Storm/index.php?title=Module:WorkshopsData2&amp;diff=9102&amp;oldid=prev</id>
		<title>76561197969631737: Created to instantiate a data model instance for workshops data</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Against_the_Storm/index.php?title=Module:WorkshopsData2&amp;diff=9102&amp;oldid=prev"/>
		<updated>2024-10-24T21:44:55Z</updated>

		<summary type="html">&lt;p&gt;Created to instantiate a data model instance for workshops data&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:44, 24 October 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l3&quot;&gt;Line 3:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 3:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;-- Initialize a new instance of the BaseDataModel, configured to load the workshops data&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local BaseDataModel = require(&amp;quot;Module:BaseDataModel&amp;quot;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local BaseDataModel = require(&amp;quot;Module:BaseDataModel&amp;quot;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local DATA_FILE = &amp;quot;Module:WorkshopsData/Workshops.json&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local DATA_FILE = &amp;quot;Module:WorkshopsData/Workshops.json&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local baseDataModel = BaseDataModel.new(DATA_FILE)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local baseDataModel = BaseDataModel.new(DATA_FILE)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;-- Return the instance for workshops data, not this module itself!&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;return baseDataModel&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;return baseDataModel&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key ATS_:diff:1.41:old-9099:rev-9102:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>76561197969631737</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Against_the_Storm/index.php?title=Module:WorkshopsData2&amp;diff=9099&amp;oldid=prev</id>
		<title>76561197969631737: Testing</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Against_the_Storm/index.php?title=Module:WorkshopsData2&amp;diff=9099&amp;oldid=prev"/>
		<updated>2024-10-24T20:47:07Z</updated>

		<summary type="html">&lt;p&gt;Testing&lt;/p&gt;
&lt;a href=&quot;https://wiki.hoodedhorse.com/Against_the_Storm/index.php?title=Module:WorkshopsData2&amp;amp;diff=9099&amp;amp;oldid=9016&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>76561197969631737</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Against_the_Storm/index.php?title=Module:WorkshopsData2&amp;diff=9016&amp;oldid=prev</id>
		<title>76561197969631737: Created as next version where the data is loaded from json instead of separate csvs for buildings and recipes</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Against_the_Storm/index.php?title=Module:WorkshopsData2&amp;diff=9016&amp;oldid=prev"/>
		<updated>2024-10-20T18:17:01Z</updated>

		<summary type="html">&lt;p&gt;Created as next version where the data is loaded from json instead of separate csvs for buildings and recipes&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--- @module WorkshopsData&lt;br /&gt;
local WorkshopsData = {}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--region Dependencies&lt;br /&gt;
&lt;br /&gt;
local DATA_MODULE = &amp;quot;Module:WorkshopsData/Workshops.json&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local JsonUtils = require(&amp;quot;Module:JsonUtils&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Some dependencies are loaded lazily&lt;br /&gt;
local GoodsData&lt;br /&gt;
&lt;br /&gt;
--endregion&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--region Private member variables&lt;br /&gt;
&lt;br /&gt;
--- Main data table, like this: table[ID] = table containing data for that ID&lt;br /&gt;
local workshopsTable&lt;br /&gt;
&lt;br /&gt;
--- Supporting table, list of names table[i] = name.&lt;br /&gt;
local workshopsNames&lt;br /&gt;
&lt;br /&gt;
--- Lookup map. Built once and reused on all subsequent calls within this&lt;br /&gt;
--- session, like this: table[displayName] = workshopID&lt;br /&gt;
local mapNamesToIDs&lt;br /&gt;
&lt;br /&gt;
--- Lookup map. Built once and reused on all subsequent calls within this&lt;br /&gt;
--- session, like this: table[recipeID] = { workshopName1, workshopName2, ... }&lt;br /&gt;
local mapRecipeIDsToWorkshopNames&lt;br /&gt;
&lt;br /&gt;
--endregion&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--region Private constants&lt;br /&gt;
&lt;br /&gt;
local INDEX_CATEGORY = &amp;quot;category&amp;quot;&lt;br /&gt;
local INDEX_CITY_SCORE = &amp;quot;cityScore&amp;quot;&lt;br /&gt;
local INDEX_CONSTRUCTION_TIME = &amp;quot;constructionTime&amp;quot;&lt;br /&gt;
local INDEX_DESCRIPTION = &amp;quot;description&amp;quot;&lt;br /&gt;
local INDEX_NAME = &amp;quot;displayName&amp;quot;&lt;br /&gt;
local INDEX_ID = &amp;quot;id&amp;quot;&lt;br /&gt;
local INDEX_IS_ESSENTIAL = &amp;quot;initiallyEssential&amp;quot;&lt;br /&gt;
local INDEX_IS_MOVABLE = &amp;quot;movable&amp;quot;&lt;br /&gt;
local INDEX_RECIPES = &amp;quot;recipes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local INDEX_RECIPE_GRADE = &amp;quot;grade&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local INDEX_RECIPE_INGREDIENTS = &amp;quot;ingredients&amp;quot;&lt;br /&gt;
local INDEX_RECIPE_INGREDIENT_AMOUNT = &amp;quot;amount&amp;quot;&lt;br /&gt;
local INDEX_RECIPE_INGREDIENT_ID = &amp;quot;name&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local INDEX_RECIPE_PRODUCT = &amp;quot;product&amp;quot;&lt;br /&gt;
local INDEX_RECIPE_PRODUCT_AMOUNT = &amp;quot;amount&amp;quot;&lt;br /&gt;
local INDEX_RECIPE_PRODUCT_ID = &amp;quot;name&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local INDEX_RECIPE_TIME = &amp;quot;productionTime&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local INDEX_CONSTRUCTION_GOODS = &amp;quot;requiredGoods&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local INDEX_CONSTRUCTION_GOODS_AMOUNT = &amp;quot;amount&amp;quot;&lt;br /&gt;
local INDEX_CONSTRUCTION_GOODS_ID = &amp;quot;name&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local INDEX_SIZE_X = &amp;quot;sizeX&amp;quot;&lt;br /&gt;
local INDEX_SIZE_Y = &amp;quot;sizeY&amp;quot;&lt;br /&gt;
local INDEX_STORAGE_CAP = &amp;quot;storage&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local INDEX_WORKPLACES = &amp;quot;workplaces&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--endregion&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--region Private methods&lt;br /&gt;
&lt;br /&gt;
local function load()&lt;br /&gt;
	if not workshopsTable then&lt;br /&gt;
		-- Utility module loads the data from JSON.&lt;br /&gt;
		workshopsTable = JsonUtils.convertJSONToLuaTable(DATA_MODULE)&lt;br /&gt;
	end&lt;br /&gt;
	--return workshopsTable if debugging&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---findID loops through the table to find the id, then returns the record&lt;br /&gt;
---@param id string the ID&lt;br /&gt;
---@return table the record with that ID, or nil if not found&lt;br /&gt;
local function findID(id)&lt;br /&gt;
	load()&lt;br /&gt;
	for _, workshop in ipairs(workshopsTable) do&lt;br /&gt;
		if workshop[INDEX_ID] == id then&lt;br /&gt;
			return workshop&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---findName loops through the table to find the name, then returns the record&lt;br /&gt;
---@param name string the display name&lt;br /&gt;
---@return table the record with that name, or nil if not found&lt;br /&gt;
local function findName(name)&lt;br /&gt;
	load()&lt;br /&gt;
	for _, workshop in ipairs(workshopsTable) do&lt;br /&gt;
		if workshop[INDEX_NAME] == name then&lt;br /&gt;
			return workshop&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--endregion&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--region Public methods&lt;br /&gt;
&lt;br /&gt;
--- DEPRECATED --- DO NOT USE ---&lt;br /&gt;
---@deprecated&lt;br /&gt;
function WorkshopsData.getAllWorkshopRecipes(displayName)&lt;br /&gt;
&lt;br /&gt;
	if not displayName or displayName == &amp;quot;&amp;quot; then&lt;br /&gt;
		error(&amp;quot;Parameter is nil or empty for display name.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	load()&lt;br /&gt;
&lt;br /&gt;
	local id = mapNamesToIDs[displayName]&lt;br /&gt;
	if not id then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local workshop = workshopsTable[id]&lt;br /&gt;
	if not workshop then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return workshop[INDEX_RECIPES]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- DEPRECATED --- DO NOT USE ---&lt;br /&gt;
---@deprecated&lt;br /&gt;
function WorkshopsData.getWorkshopIcon(displayName)&lt;br /&gt;
&lt;br /&gt;
	if not displayName or displayName == &amp;quot;&amp;quot; then&lt;br /&gt;
		error(&amp;quot;Parameter is nil or empty for display name.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	load()&lt;br /&gt;
&lt;br /&gt;
	local id = mapNamesToIDs[displayName]&lt;br /&gt;
	if not id then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- the base string of the icon is the ID. It has to be not nil to&lt;br /&gt;
	-- concatenate&lt;br /&gt;
	return id .. &amp;quot;_icon.png&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- DEPRECATED --- DO NOT USE ---&lt;br /&gt;
---@deprecated&lt;br /&gt;
function WorkshopsData.getWorkshopNamesWithRecipeID(recipeID)&lt;br /&gt;
&lt;br /&gt;
	-- At runtime, this should never be nil or empty.&lt;br /&gt;
	if not recipeID or recipeID == &amp;quot;&amp;quot; then&lt;br /&gt;
		error(&amp;quot;Parameter is nil or empty for product ID.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	load()&lt;br /&gt;
&lt;br /&gt;
	return mapRecipeIDsToWorkshopNames[recipeID]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--endregion&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--region Public building interface&lt;br /&gt;
&lt;br /&gt;
-- getID(displayName)&lt;br /&gt;
-- getCategory(id)&lt;br /&gt;
-- getCityScore(id)&lt;br /&gt;
-- getConstructionCosts(id) -- returns { [goodName] = stack size }&lt;br /&gt;
-- getConstructionTime(id)&lt;br /&gt;
-- getDescription(id)&lt;br /&gt;
-- getIcon(id)&lt;br /&gt;
-- isMovable(id)&lt;br /&gt;
-- getName(id)&lt;br /&gt;
-- getNumberOfWorkplaces(id)&lt;br /&gt;
-- getSize(id) -- returns string &amp;quot;X x Y&amp;quot;&lt;br /&gt;
-- getStorage(id)&lt;br /&gt;
&lt;br /&gt;
---getID finds the specified name and returns the associated ID&lt;br /&gt;
---@param name string the display name&lt;br /&gt;
---@return string the ID, or nil if not found&lt;br /&gt;
function WorkshopsData.getID(name)&lt;br /&gt;
	local workshop = findName(name)&lt;br /&gt;
	if workshop then&lt;br /&gt;
		return workshop[INDEX_ID]&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---getCategory from an ID&lt;br /&gt;
---@param id string the ID&lt;br /&gt;
---@return string the category, or nil if not found&lt;br /&gt;
function WorkshopsData.getCategory(id)&lt;br /&gt;
	local workshop = findID(id)&lt;br /&gt;
	if workshop then&lt;br /&gt;
		return workshop[INDEX_CATEGORY]&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---getCityScore from an ID&lt;br /&gt;
---@param id string the ID&lt;br /&gt;
---@return number the city score, or nil if not found&lt;br /&gt;
function WorkshopsData.getCityScore(id)&lt;br /&gt;
	local workshop = findID(id)&lt;br /&gt;
	if workshop then&lt;br /&gt;
		return workshop[INDEX_CITY_SCORE]&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---getConstructionCosts in the form of an array of short tables describing goods required for construction.&lt;br /&gt;
---	example = {&lt;br /&gt;
---		[1] = {&lt;br /&gt;
---			[&amp;quot;amount&amp;quot;] = 5,&lt;br /&gt;
---			[&amp;quot;name&amp;quot;] = &amp;quot;[Mat Processed] Planks&amp;quot;, -- note that this is NOT a name, but an ID&lt;br /&gt;
---		},&lt;br /&gt;
---		[2] = {&lt;br /&gt;
---			[&amp;quot;amount&amp;quot;] = 2,&lt;br /&gt;
---			[&amp;quot;name&amp;quot;] = &amp;quot;[Mat Processed] Bricks&amp;quot;, -- note that this is NOT a name, but an ID&lt;br /&gt;
---		},&lt;br /&gt;
---	}&lt;br /&gt;
---@param id string the ID&lt;br /&gt;
---@return table an array of tables with amount and ID&lt;br /&gt;
function WorkshopsData.getConstructionCosts(id)&lt;br /&gt;
	local workshop = findID(id)&lt;br /&gt;
	if workshop then&lt;br /&gt;
		return workshop[INDEX_CONSTRUCTION_GOODS]&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---getConstructionTime from an ID&lt;br /&gt;
---@param id string the ID&lt;br /&gt;
---@return number the number of seconds, or nil if not found&lt;br /&gt;
function WorkshopsData.getConstructionTime(id)&lt;br /&gt;
	local workshop = findID(id)&lt;br /&gt;
	if workshop then&lt;br /&gt;
		return workshop[INDEX_CONSTRUCTION_TIME]&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---getDescription from an ID&lt;br /&gt;
---@param id string the ID&lt;br /&gt;
---@return string the description including sprite markup, or nil if not found&lt;br /&gt;
function WorkshopsData.getDescription(id)&lt;br /&gt;
	local workshop = findID(id)&lt;br /&gt;
	if workshop then&lt;br /&gt;
		return workshop[INDEX_DESCRIPTION]&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---getIcon from an ID&lt;br /&gt;
---@param id string the ID&lt;br /&gt;
---@return string the icon filename, or nil if not found&lt;br /&gt;
function WorkshopsData.getIcon(id)&lt;br /&gt;
	local workshop = findID(id)&lt;br /&gt;
	if workshop then&lt;br /&gt;
		return id .. &amp;quot;_icon.png&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---isMovable from an ID&lt;br /&gt;
---@param id string the ID&lt;br /&gt;
---@return boolean true if the building can be moved, false if not (or nil if not found)&lt;br /&gt;
function WorkshopsData.isMovable(id)&lt;br /&gt;
	local workshop = findID(id)&lt;br /&gt;
	if workshop then&lt;br /&gt;
		return workshop[INDEX_IS_MOVABLE]&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---getName from an ID&lt;br /&gt;
---@param id string the ID&lt;br /&gt;
---@return string the name, or nil if not found&lt;br /&gt;
function WorkshopsData.getName(id)&lt;br /&gt;
	local workshop = findID(id)&lt;br /&gt;
	if workshop then&lt;br /&gt;
		return workshop[INDEX_NAME]&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---getNumberOfWorkplaces from an ID&lt;br /&gt;
---@param id string the ID&lt;br /&gt;
---@return number how many worker slots, or nil if not found&lt;br /&gt;
function WorkshopsData.getNumberOfWorkplaces(id)&lt;br /&gt;
	local workshop = findID(id)&lt;br /&gt;
	if workshop then&lt;br /&gt;
		return workshop[INDEX_WORKPLACES]&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---getSize from an ID&lt;br /&gt;
---@param id string the ID&lt;br /&gt;
---@return string as x-by-y, or nil if not found&lt;br /&gt;
function WorkshopsData.getSize(id)&lt;br /&gt;
	local workshop = findID(id)&lt;br /&gt;
	if workshop then&lt;br /&gt;
		return workshop[INDEX_SIZE_X] .. &amp;quot; × &amp;quot; .. workshop[INDEX_SIZE_Y]&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---getStorage from an ID&lt;br /&gt;
---@param id string the ID&lt;br /&gt;
---@return number the storage capacity, or nil if not found&lt;br /&gt;
function WorkshopsData.getStorage(id)&lt;br /&gt;
	local workshop = findID(id)&lt;br /&gt;
	if workshop then&lt;br /&gt;
		return workshop[INDEX_STORAGE_CAP]&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--endregion&lt;br /&gt;
&lt;br /&gt;
return WorkshopsData&lt;/div&gt;</summary>
		<author><name>76561197969631737</name></author>
	</entry>
</feed>