239 lines
11 KiB
Lua
239 lines
11 KiB
Lua
---------------------------------------------------------------------------------------------------
|
|
-- metrosigns mod for minetest by A S Lewis
|
|
-- https://github.com/axcore/metrosigns
|
|
-- Licence: GNU Affero GPL
|
|
---------------------------------------------------------------------------------------------------
|
|
|
|
---------------------------------------------------------------------------------------------------
|
|
-- Generic functions used by city-specific and server-specific signs
|
|
---------------------------------------------------------------------------------------------------
|
|
|
|
function add_lightbox(city, city_descrip)
|
|
|
|
-- Adds a lightbox node (every city usually has at least one)
|
|
--
|
|
-- Args:
|
|
-- city (string): The short city name, e.g. "london"
|
|
-- city_descrip (string): The long city name, e.g. "London Underground"; should be the
|
|
-- one of the categories specified by metrosigns.writer.categories
|
|
|
|
minetest.register_node("metrosigns:box_"..city, {
|
|
description = city_descrip.." lightbox",
|
|
tiles = {
|
|
"metrosigns_box_"..city.."_top.png",
|
|
"metrosigns_box_"..city.."_top.png",
|
|
"metrosigns_box_"..city.."_side.png",
|
|
"metrosigns_box_"..city.."_side.png",
|
|
"metrosigns_box_"..city.."_side.png",
|
|
"metrosigns_box_"..city.."_side.png",
|
|
},
|
|
groups = box_groups,
|
|
light_source = box_light_source,
|
|
})
|
|
metrosigns.register_sign(city_descrip, "metrosigns:box_"..city, metrosigns.writer.box_units)
|
|
|
|
end
|
|
|
|
function add_sign(city, city_descrip, line, line_descrip, extra_width, extra_height)
|
|
|
|
-- Adds a line sign
|
|
--
|
|
-- Args:
|
|
-- city (string): The short city name, e.g. "london"
|
|
-- city_descrip (string): The long city name, e.g. "London Underground"; should be the
|
|
-- one of the categories specified by metrosigns.writer.categories
|
|
-- line (string): The short line name/number, used in the node name (e.g. "1", "a1",
|
|
-- "bakerloo"
|
|
-- line_descrip (string): The long line name/number, used in the node description (so it
|
|
-- should be capitalised, e.g. "1", "A1", "Bakerloo Line"
|
|
-- extra_width (int): The sign can be made wider (minimum value 1), or given its default
|
|
-- length (0)
|
|
-- extra_height (int): The sign can be made higher (minimum value 1), or given its default
|
|
-- height (0)
|
|
|
|
local cap_city = capitalise(city)
|
|
local node = "metrosigns:sign_"..city.."_line_"..line
|
|
|
|
-- Convert (e.g.) 1 pixel to the node box equivalent, 1/16
|
|
extra_width = (4 + extra_width) / 16
|
|
extra_height = (4 + extra_height) / 16
|
|
|
|
minetest.register_node(node, {
|
|
description = cap_city.." Line "..line_descrip.." sign",
|
|
tiles = {"metrosigns_sign_"..city.."_line_"..line..".png"},
|
|
inventory_image = "metrosigns_sign_"..city.."_line_"..line.."_inv.png",
|
|
groups = {attached_node = 1, choppy = 2, flammable = 2, oddly_breakable_by_hand = 3},
|
|
light_source = 12,
|
|
drawtype = "nodebox",
|
|
is_ground_content = false,
|
|
legacy_wallmounted = true,
|
|
node_box = {
|
|
type = "wallmounted",
|
|
wall_top = {-8/16, -4/16, -4/16, -7/16, 4/16, 4/16},
|
|
wall_bottom = {-8/16, -4/16, -4/16, -7/16, 4/16, 4/16},
|
|
wall_side = {
|
|
-8/16, (extra_height)*(-1), (extra_width)*(-1), -7/16, extra_height, extra_width
|
|
}
|
|
},
|
|
paramtype = "light",
|
|
paramtype2 = "wallmounted",
|
|
sunlight_propagates = true,
|
|
walkable = false
|
|
})
|
|
metrosigns.register_sign(city_descrip, node, metrosigns.writer.sign_units)
|
|
|
|
end
|
|
|
|
function add_sign_special(city, city_descrip, route, route_descrip)
|
|
|
|
-- Modified version of add_sign(); used for New York and Stockholm, which have multiple routes
|
|
-- on each line
|
|
-- Adds a line sign
|
|
--
|
|
-- Args:
|
|
-- city (string): The short city name, e.g. "london"
|
|
-- city_descrip (string): The long city name, e.g. "London Underground"; should be the
|
|
-- one of the categories specified by metrosigns.writer.categories
|
|
-- route (string): The short route name/number, used in the node name (e.g. "1", "a1",
|
|
-- "bakerloo"
|
|
-- route_descrip (string): The long route name/number, used in the node description (so it
|
|
-- should be capitalised, e.g. "1", "A1", "Bakerloo Line"
|
|
|
|
local cap_city = capitalise(city)
|
|
local node = "metrosigns:sign_"..city.."_route_"..route
|
|
|
|
minetest.register_node(node, {
|
|
description = cap_city.." Route "..route_descrip.." sign",
|
|
tiles = {"metrosigns_sign_"..city.."_route_"..route..".png"},
|
|
inventory_image = "metrosigns_sign_"..city.."_route_"..route.."_inv.png",
|
|
groups = {attached_node = 1, choppy = 2, flammable = 2, oddly_breakable_by_hand = 3},
|
|
light_source = 12,
|
|
drawtype = "nodebox",
|
|
is_ground_content = false,
|
|
legacy_wallmounted = true,
|
|
node_box = {
|
|
type = "wallmounted",
|
|
wall_top = {-8/16, -4/16, -4/16, -7/16, 4/16, 4/16},
|
|
wall_bottom = {-8/16, -4/16, -4/16, -7/16, 4/16, 4/16},
|
|
wall_side = {-8/16, -7/16, -7/16, -7/16, 7/16, 7/16}
|
|
},
|
|
paramtype = "light",
|
|
paramtype2 = "wallmounted",
|
|
sunlight_propagates = true,
|
|
walkable = false
|
|
})
|
|
metrosigns.register_sign(city_descrip, node, metrosigns.writer.sign_units)
|
|
|
|
end
|
|
|
|
function add_map_unit(
|
|
city, city_descrip, line, line_descrip, unit, unit_descrip, terminus, terminus_descrip
|
|
)
|
|
|
|
-- Usually called by add_map(), but can be called by each city/server as required (see examples
|
|
-- in the code below)
|
|
-- Adds a single map sign
|
|
--
|
|
-- Args:
|
|
-- city (string): The short city name, e.g. "london"
|
|
-- city_descrip (string): The long city name, e.g. "London Underground"; should be the
|
|
-- one of the categories specified by metrosigns.writer.categories
|
|
-- line (string): The short line name/number, used in the node name (e.g. "1", "a1",
|
|
-- "bakerloo"
|
|
-- line_descrip (string): The long line name/number, used in the node description (so it
|
|
-- should be capitalised, e.g. "1", "A1", "Bakerloo Line"
|
|
-- unit (string): The type of map sign. Typical values include "line" for a section of the
|
|
-- line without a station, "station" for a section of the line with a normal station,
|
|
-- "cstation" for an interchange station. Any non-empty string is acceptable, and some
|
|
-- cities/servers may use their own custom values (e.g. the London Underground has
|
|
-- different signs for stations which are wheelchair-accessible)
|
|
-- unit_descrip (string): A description for the map sign, used in the node description
|
|
-- (e.g. "Line", "Station", "Interchange")
|
|
-- terminus (string): Default value is an empty string. Four other values are used to
|
|
-- modify a map sign to show a terminus (the end of the line): "terml" and "termr" for
|
|
-- normal stations, and "termlc" and "termrc" for interchange stations. The map sign
|
|
-- is modified by applying a blank texture over a part of the original texture, hiding
|
|
-- the line on the far left or far right side of the sign
|
|
-- terminus_descrip (string): A description for the terminus map sign, used in the node
|
|
-- description (e.g. "left terminus", "right terminus"
|
|
|
|
local cap_city, node, description, img
|
|
|
|
cap_city = capitalise(city)
|
|
if terminus == "" then
|
|
node = "metrosigns:map_"..city.."_"..line.."_"..unit
|
|
description = cap_city.." "..line_descrip.. " "..unit_descrip.." sign"
|
|
img = "metrosigns_map_"..city.."_"..line.."_"..unit..".png"
|
|
else
|
|
node = "metrosigns:map_"..city.."_"..line.."_"..unit.."_"..terminus
|
|
description = cap_city.." "..line_descrip.. " "..unit_descrip.." sign ("
|
|
..terminus_descrip..")"
|
|
img = "metrosigns_map_"..city.."_"..line.."_"..unit..".png^metrosigns_map_"..city.."_"
|
|
..terminus..".png"
|
|
end
|
|
|
|
minetest.register_node(node, {
|
|
description = description,
|
|
-- Reverse the back image, so map signs can be viewed from the front or back
|
|
tiles = {img, img, img, img, img.."^[transform4", img},
|
|
inventory_image = img,
|
|
groups = {cracky = 3},
|
|
light_source = 5,
|
|
drawtype = "nodebox",
|
|
is_ground_content = false,
|
|
legacy_wallmounted = true,
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{ -8/16, -8/16, 6/16, 8/16, 8/16, 8/16},
|
|
},
|
|
},
|
|
paramtype = "light",
|
|
paramtype2 = "facedir",
|
|
walkable = false
|
|
})
|
|
metrosigns.register_sign(city_descrip, node, metrosigns.writer.map_units)
|
|
|
|
end
|
|
|
|
function add_map(city, city_descrip, line_table, type_table)
|
|
|
|
-- Adds one or more map signs. The signs to add are specified by two tables. The tables can
|
|
-- contain any values (but you should follow the examples below as closely as possible)
|
|
--
|
|
-- Args:
|
|
-- city (string): The short city name, e.g. "london"
|
|
-- city_descrip (string): The long city name, e.g. "London Underground"; should be the
|
|
-- one of the categories specified by metrosigns.writer.categories
|
|
-- line_table (table): A set of lines or routes for a city/server
|
|
-- type_table (table): A set of map sign types. For every line/route, there are typically
|
|
-- several types - a normal station, an interchange station, a section of the line
|
|
-- with no station, and so on
|
|
|
|
for line, line_descrip in pairs(line_table) do
|
|
for unit, unit_descrip in pairs(type_table) do
|
|
add_map_unit(city, city_descrip, line, line_descrip, unit, unit_descrip, "", "")
|
|
if unit == "cstation" then
|
|
add_map_unit(
|
|
city, city_descrip, line, line_descrip, unit, unit_descrip,
|
|
"termlc", "left terminus"
|
|
)
|
|
add_map_unit(
|
|
city, city_descrip, line, line_descrip, unit, unit_descrip,
|
|
"termrc", "right terminus"
|
|
)
|
|
elseif string.find(unit, "station") then
|
|
add_map_unit(
|
|
city, city_descrip, line, line_descrip, unit, unit_descrip,
|
|
"terml", "left terminus"
|
|
)
|
|
add_map_unit(
|
|
city, city_descrip, line, line_descrip, unit, unit_descrip,
|
|
"termr", "right terminus"
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|