--------------------------------------------------------------------------------------------------- -- metrosigns mod for minetest by A S Lewis -- https://github.com/axcore/metrosigns -- Licence: GNU Affero GPL --------------------------------------------------------------------------------------------------- -- Includes code/textures from advtrains_subwayblocks by gpcf/orwell -- https://git.gpcf.eu/?p=advtrains_subwayblocks.git -- Licence: GNU Affero GPL -- -- Includes code/textures from trainblocks by Maxx -- https://github.com/maxhipp/trainblocks_bc -- https://forum.minetest.net/viewtopic.php?t=19743 -- Licence: GNU Affero GPL -- -- Includes code/textures from roads by cheapie -- https://cheapiesystems.com/git/roads/ -- https://forum.minetest.net/viewtopic.php?t=13904 -- Licence: CC-BY-SA 3.0 Unported -- -- Includes various fixes/additions by Guill4um --------------------------------------------------------------------------------------------------- -- Do you want to add signs for a a new city/server? This is how to do it: -- 1. Add a new flag in the 'Load Settings' section below, e.g. -- metrosigns.create_mycity_flag -- 2. Edit settingtypes.txt to add the same flag there -- 3. Edit settings.lua to add the same flag there -- 4. Add a new section to citysigns.lua or serversigns.lua, using the existing code as a template -- 5. Add new textures to the /textures folder -- 6. If a city's name contains more than one word (e.g. "San Francisco", you'll need to edit the -- capitalise() function below -- 7. That's it! --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- -- Create namespaces --------------------------------------------------------------------------------------------------- metrosigns = {} metrosigns.name = "metrosigns" metrosigns.ver_max = 1 metrosigns.ver_min = 28 metrosigns.ver_rev = 0 metrosigns.writer = {} --------------------------------------------------------------------------------------------------- -- Constants --------------------------------------------------------------------------------------------------- metrosigns.path_mod = minetest.get_modpath(minetest.get_current_modname()) -- If default and basic_materials are loaded, the sign writer and cartridges are craftable if minetest.get_modpath("default") then HAVE_DEFAULT_FLAG = true else HAVE_DEFAULT_FLAG = false end if minetest.get_modpath("basic_materials") then HAVE_BASIC_MATERIALS_FLAG = true else HAVE_BASIC_MATERIALS_FLAG = false end -- If signs_api from display_modpack is loaded, create signs with customisable text if minetest.get_modpath("signs_api") then HAVE_SIGNS_API_FLAG = true else HAVE_SIGNS_API_FLAG = false end -- If advtrains_subwayblocks is loaded, we don't create duplicate blocks if minetest.get_modpath("advtrains_subwayblocks") then HAVE_SUBWAYBLOCKS_FLAG = true else HAVE_SUBWAYBLOCKS_FLAG = false end -- If trainblocks is loaded, we don't create duplicate blocks if minetest.get_modpath("trainblocks") then HAVE_TRAINBLOCKS_FLAG = true else HAVE_TRAINBLOCKS_FLAG = false end -- Cartridge ink levels are implemented using wear -- Ink capacity of a cartridge metrosigns.writer.cartridge_max = 60000 -- Amount of ink used for one unit metrosigns.writer.cartridge_min = 1000 -- Number of units used for printing various kinds of sign -- (The printing capacity of a cartridge was doubled in v1.12.0, but reduced slightly in v1.28.0) metrosigns.writer.box_units = 15 metrosigns.writer.sign_units = 5 metrosigns.writer.map_units = 10 metrosigns.writer.text_units = 10 -- Used in material copied from advtrains_subwayblocks and trainblocks box_groups = {cracky = 3} box_light_source = 10 --------------------------------------------------------------------------------------------------- -- Variables --------------------------------------------------------------------------------------------------- -- Signs are divided into categories. Each category represents a single city (or server). There are -- are also some special categories not related to a city or a server, e.g. "Signs with text" -- A category's name is the same as the city description (i.e. "London Underground" rather than -- "London") -- An ordered list of categories, as displayed in the sign-writing machine's dropdrown box, e.g. -- categories[1] = "London Underground", categories[2] = "Paris Metro" metrosigns.writer.categories = {} -- The current category; one of the values in metrosigns.writer.categories. Only signs in this -- category are visible in the sign-writing machine's list metrosigns.writer.current_category = nil -- Ordered list of signs in each category and their properties. The properties are arranged in a -- table: -- -- category - one of the values in metrosigns.writer.current_category -- name - the name of the sign's node, e.g. "metrosigns:map_london_bakerloo_line" -- ink_needed - the amount of ink removed from each cartridge when printing the sign, e.g. 10 -- Thus we have, e.g. -- signtypes["London Underground"][1] = property_table, -- signtypes["London Underground"][2] = property_table, etc metrosigns.writer.signtypes = {} -- The number of signs in each category, e.g. signcounts["London Underground"] = 20 metrosigns.writer.signcounts = {} --------------------------------------------------------------------------------------------------- -- Load settings --------------------------------------------------------------------------------------------------- -- Load settings from Minetest's main menu metrosigns.create_all_flag = minetest.settings:get("metrosigns_create_all") or false metrosigns.create_subwayblocks_flag = minetest.settings:get("metrosigns_create_subwayblocks") or false metrosigns.create_trainblocks_flag = minetest.settings:get("metrosigns_create_trainblocks") or false metrosigns.create_ext_line_flag = minetest.settings:get("metrosigns_create_ext_line") or true metrosigns.ext_line_min = minetest.settings:get("metrosigns_ext_line_min") or 11 metrosigns.ext_line_max = minetest.settings:get("metrosigns_ext_line_min") or 20 metrosigns.create_ext_platform_flag = minetest.settings:get("metrosigns_create_ext_platform") or true metrosigns.ext_platform_min = minetest.settings:get("metrosigns_ext_platform_min") or 11 metrosigns.ext_platform_max = minetest.settings:get("metrosigns_ext_platform_min") or 20 metrosigns.create_text_flag = minetest.settings:get("metrosigns_create_text") or true metrosigns.create_athens_flag = minetest.settings:get("metrosigns_create_athens") or false metrosigns.create_bangkok_flag = minetest.settings:get("metrosigns_create_bangkok") or false metrosigns.create_berlin_flag = minetest.settings:get("metrosigns_create_berlin") or false metrosigns.create_bucharest_flag = minetest.settings:get("metrosigns_create_bucharest") or false metrosigns.create_budapest_flag = minetest.settings:get("metrosigns_create_budapest") or false metrosigns.create_glasgow_flag = minetest.settings:get("metrosigns_create_glasgow") or false metrosigns.create_hcmc_flag = minetest.settings:get("metrosigns_create_hcmc") or false metrosigns.create_london_flag = minetest.settings:get("metrosigns_create_london") or true metrosigns.create_luton_flag = minetest.settings:get("metrosigns_create_luton") or false metrosigns.create_madrid_flag = minetest.settings:get("metrosigns_create_madrid") or false metrosigns.create_moscow_flag = minetest.settings:get("metrosigns_create_moscow") or false metrosigns.create_newyork_flag = minetest.settings:get("metrosigns_create_newyork") or false metrosigns.create_paris_flag = minetest.settings:get("metrosigns_create_paris") or false metrosigns.create_prague_flag = minetest.settings:get("metrosigns_create_prague") or false metrosigns.create_rome_flag = minetest.settings:get("metrosigns_create_rome") or false metrosigns.create_stockholm_flag = minetest.settings:get("metrosigns_create_stockholm") or false metrosigns.create_taipei_flag = minetest.settings:get("metrosigns_create_taipei") or false metrosigns.create_tokyo_flag = minetest.settings:get("metrosigns_create_tokyo") or false metrosigns.create_toronto_flag = minetest.settings:get("metrosigns_create_toronto") or false metrosigns.create_vienna_flag = minetest.settings:get("metrosigns_create_vienna") or false metrosigns.create_tabyss_flag = minetest.settings:get("metrosigns_create_tabyss") or false -- Override one or more of these settings by uncommenting the lines in this file dofile(metrosigns.path_mod.."/settings.lua") --------------------------------------------------------------------------------------------------- -- General functions --------------------------------------------------------------------------------------------------- function capitalise(str) -- Returns a capitalised city name. At the moment, only one city name contains more than one -- word, so we create an exception for that -- -- Args: -- str (string): The lower-case city name used by this mod, e.g. "london" or "newyork" -- -- Return values: -- Returns the capitalised city name, e.g. "London" or "New York" if str == "newyork" then return "New York" elseif str == "tabyss" then return "TA" else return (str:gsub("^%l", string.upper)) end end function isint(n) return n==math.floor(n) end function metrosigns.register_category(category) -- Adds a new category (representing a single city, or a single server) -- -- Args: -- category (string): The category name, which will be visible in the sign-writing -- machine's dropdown box. See the category-naming hints above; i.e. the calling -- function should specify "London Underground" rather than "London" table.insert(metrosigns.writer.categories, category) metrosigns.writer.signcounts[category] = 0 metrosigns.writer.signtypes[category] = {} if metrosigns.writer.current_category == nil then metrosigns.writer.current_category = category end end function metrosigns.register_sign(category, node, ink_needed) -- Registers a sign. All types of sign - lightboxes, line/platform signs, map signs and text -- signs - are registered via a call to this function -- -- Args: -- category (string): The category to which the sign belongs. Must be one of the items in -- metrosigns.writer.categories -- node (string): The node name, e.g. "metrosigns:map_london_wlcity_line" -- ink_needed (int): The amount of ink required to write the sign; should be consistent -- with the values specified above (i.e. metrosigns.writer.box_units, -- metrosigns.writer.sign_units, metrosigns.writer.map_units or -- metrosigns.writer.text_units) local data = {category=category, name=node, ink_needed=ink_needed} table.insert(metrosigns.writer.signtypes[category], data) metrosigns.writer.signcounts[category] = metrosigns.writer.signcounts[category] + 1 end --------------------------------------------------------------------------------------------------- -- Original material from advtrains_subwayblocks by gpcf/orwell --------------------------------------------------------------------------------------------------- dofile(metrosigns.path_mod.."/subwayblocks.lua") --------------------------------------------------------------------------------------------------- -- Original material from trainblocks by Maxx --------------------------------------------------------------------------------------------------- dofile(metrosigns.path_mod.."/trainblocks.lua") --------------------------------------------------------------------------------------------------- -- Extended line and platform signs --------------------------------------------------------------------------------------------------- dofile(metrosigns.path_mod.."/extsigns.lua") --------------------------------------------------------------------------------------------------- -- Signs with customisable text (designed to be used alongside the map nodes). Requires signs_api -- from display_modpack --------------------------------------------------------------------------------------------------- dofile(metrosigns.path_mod.."/customsigns.lua") --------------------------------------------------------------------------------------------------- -- Generic functions used by city-specific and server-specific signs --------------------------------------------------------------------------------------------------- dofile(metrosigns.path_mod.."/generic.lua") --------------------------------------------------------------------------------------------------- -- City-specific signs --------------------------------------------------------------------------------------------------- dofile(metrosigns.path_mod.."/citysigns.lua") --------------------------------------------------------------------------------------------------- -- Server-specific signs --------------------------------------------------------------------------------------------------- dofile(metrosigns.path_mod.."/serversigns.lua") --------------------------------------------------------------------------------------------------- -- Sign-writing machines and ink cartridges --------------------------------------------------------------------------------------------------- dofile(metrosigns.path_mod.."/machine.lua")