aboutsummaryrefslogtreecommitdiff
path: root/ch_core/shapes_db.lua
diff options
context:
space:
mode:
Diffstat (limited to 'ch_core/shapes_db.lua')
-rw-r--r--ch_core/shapes_db.lua1332
1 files changed, 1332 insertions, 0 deletions
diff --git a/ch_core/shapes_db.lua b/ch_core/shapes_db.lua
new file mode 100644
index 0000000..a2814ca
--- /dev/null
+++ b/ch_core/shapes_db.lua
@@ -0,0 +1,1332 @@
+ch_core.open_submod("shapes_db", {lib = true})
+
+local assembly_groups = ch_core.assembly_groups
+local ifthenelse = ch_core.ifthenelse
+
+local function set(...)
+ local i, result, t = 1, {}, {...}
+ while t[i] ~= nil do
+ if type(t[i]) == "table" then
+ for k, v in pairs(t[i]) do
+ result[k] = v
+ end
+ else
+ result[t[i]] = true
+ end
+ i = i + 1
+ end
+ return result
+end
+
+local function union(...)
+ local i, result, t = 1, {}, {...}
+ while t[i] ~= nil do
+ for k, v in pairs(t[i]) do
+ result[k] = v
+ end
+ i = i + 1
+ end
+ return result
+end
+
+local materials_kp = set(
+ -- základní seznam materiálů na kotoučovou pilu (budou povoleny obvyklé tvary)
+"artdeco:1a",
+"artdeco:1b",
+"artdeco:1c",
+"artdeco:1d",
+"artdeco:1e",
+"artdeco:1f",
+"artdeco:1g",
+"artdeco:1h",
+"artdeco:1i",
+"artdeco:1j",
+"artdeco:1k",
+"artdeco:1l",
+"artdeco:2a",
+"artdeco:2b",
+"artdeco:2c",
+"artdeco:2d",
+"artdeco:tile1",
+"artdeco:tile2",
+"artdeco:tile3",
+"artdeco:tile4",
+"artdeco:tile5",
+"artdeco:brownwalltile",
+"artdeco:greenwalltile",
+"artdeco:ceilingtile",
+"artdeco:decoblock1",
+"artdeco:decoblock2",
+"artdeco:decoblock3",
+"artdeco:decoblock4",
+"artdeco:decoblock5",
+"artdeco:decoblock6",
+"artdeco:stonewall",
+"bakedclay:black",
+"bakedclay:blue",
+"bakedclay:brown",
+"bakedclay:cyan",
+"bakedclay:dark_green",
+"bakedclay:dark_grey",
+"bakedclay:green",
+"bakedclay:grey",
+"bakedclay:magenta",
+"bakedclay:natural",
+"bakedclay:orange",
+"bakedclay:pink",
+"bakedclay:red",
+"bakedclay:violet",
+"bakedclay:white",
+"bakedclay:yellow",
+"basic_materials:brass_block",
+"basic_materials:cement_block",
+"basic_materials:concrete_block",
+"bridger:block_green",
+"bridger:block_red",
+"bridger:block_steel",
+"bridger:block_white",
+"bridger:block_yellow",
+"building_blocks:Adobe",
+"building_blocks:Tar",
+"building_blocks:fakegrass",
+"ch_core:plaster_blue",
+"ch_core:plaster_cyan",
+"ch_core:plaster_dark_green",
+"ch_core:plaster_dark_grey",
+"ch_core:plaster_green",
+"ch_core:plaster_grey",
+"ch_core:plaster_medium_amber_s50",
+"ch_core:plaster_orange",
+"ch_core:plaster_pink",
+"ch_core:plaster_red",
+"ch_core:plaster_white",
+"ch_core:plaster_yellow",
+"ch_extras:marble",
+"ch_extras:particle_board_grey",
+"ch_extras:scorched_tree",
+"ch_extras:scorched_tree_noface",
+"cottages:black",
+"cottages:brown",
+"cottages:red",
+"cottages:reet",
+"darkage:basalt",
+"darkage:basalt_brick",
+"darkage:basalt_cobble",
+"darkage:chalk",
+"darkage:glass",
+"darkage:glow_glass",
+"darkage:gneiss",
+"darkage:gneiss_brick",
+"darkage:gneiss_cobble",
+"darkage:marble",
+"darkage:marble_tile",
+"darkage:ors",
+"darkage:ors_brick",
+"darkage:ors_cobble",
+"darkage:schist",
+"darkage:serpentine",
+"darkage:slate",
+"darkage:slate_brick",
+"darkage:slate_cobble",
+"darkage:slate_tile",
+"darkage:stone_brick",
+"default:acacia_wood",
+"default:aspen_wood",
+"default:brick",
+"default:bronzeblock",
+"default:cobble",
+"default:copperblock",
+"default:coral_skeleton",
+"default:desert_cobble",
+"default:desert_sandstone",
+"default:desert_sandstone_block",
+"default:desert_sandstone_brick",
+"default:desert_stone",
+"default:desert_stone_block",
+"default:desert_stonebrick",
+"default:dirt",
+"default:goldblock",
+"default:ice",
+"default:junglewood",
+"default:meselamp",
+"default:obsidian",
+"default:obsidian_block",
+"default:obsidianbrick",
+"default:pine_wood",
+"default:silver_sandstone",
+"default:silver_sandstone_block",
+"default:silver_sandstone_brick",
+"default:steelblock",
+"default:stone",
+"default:stone_block",
+"default:stonebrick",
+"default:wood",
+"moreblocks:acacia_tree_noface",
+"moreblocks:aspen_tree_noface",
+"moreblocks:cactus_brick",
+"moreblocks:cactus_checker",
+"moreblocks:checker_stone_tile",
+"moreblocks:circle_stone_bricks",
+"moreblocks:coal_checker",
+"moreblocks:coal_stone",
+"moreblocks:coal_stone_bricks",
+"moreblocks:cobble_compressed",
+"moreblocks:copperpatina",
+"moreblocks:desert_cobble_compressed",
+"moreblocks:grey_bricks",
+"moreblocks:iron_checker",
+"moreblocks:iron_stone",
+"moreblocks:iron_stone_bricks",
+"moreblocks:jungletree_allfaces",
+"moreblocks:jungletree_noface",
+"moreblocks:pine_tree_noface",
+"moreblocks:plankstone",
+"moreblocks:stone_tile",
+"moreblocks:tree_allfaces",
+"moreblocks:tree_noface",
+"moreblocks:wood_tile",
+"moreblocks:wood_tile_center",
+"moreblocks:wood_tile_full",
+"moretrees:apple_tree_planks",
+"moretrees:apple_tree_trunk_noface",
+"moretrees:birch_planks",
+"moretrees:birch_trunk_noface",
+"moretrees:cedar_planks",
+"moretrees:cedar_trunk_noface",
+"moretrees:cherrytree_planks",
+"moretrees:cherrytree_trunk_noface",
+"moretrees:chestnut_tree_planks",
+"moretrees:chestnut_tree_trunk_noface",
+"moretrees:date_palm_planks",
+"moretrees:date_palm_trunk_noface",
+"moretrees:ebony_planks",
+"moretrees:ebony_trunk_noface",
+"moretrees:fir_planks",
+"moretrees:fir_trunk_noface",
+"moretrees:oak_planks",
+"moretrees:oak_trunk_noface",
+"moretrees:palm_trunk_noface",
+"moretrees:plumtree_planks",
+"moretrees:plumtree_trunk_noface",
+"moretrees:poplar_planks",
+"moretrees:poplar_trunk_noface",
+"moretrees:rubber_tree_planks",
+"moretrees:rubber_tree_trunk_noface",
+"moretrees:sequoia_planks",
+"moretrees:sequoia_trunk_noface",
+"moretrees:spruce_planks",
+"moretrees:spruce_trunk_noface",
+"moretrees:willow_planks",
+"moretrees:willow_trunk_noface",
+"streets:asphalt_blue",
+"streets:asphalt_red",
+"summer:granite",
+"summer:graniteA",
+"summer:graniteB",
+"summer:graniteBC",
+"summer:graniteP",
+"summer:graniteR",
+"technic:blast_resistant_concrete",
+"technic:carbon_steel_block",
+"technic:cast_iron_block",
+"technic:granite",
+"technic:marble",
+"technic:marble_bricks",
+"technic:warning_block",
+"technic:zinc_block",
+"xdecor:wood_tile"
+)
+
+local materials_no_kp = set(
+ -- materiály vyloučené z kotoučové pily (nebudou povoleny žádné tvary):
+ "moretrees:palm_planks"
+)
+
+local materials_glass = set(
+ -- sklo (kromě středověkého):
+ "building_blocks:smoothglass",
+ "building_blocks:woodglass",
+ "default:glass",
+ "default:obsidian_glass",
+ "moreblocks:clean_glass",
+ "moreblocks:clean_glow_glass",
+ "moreblocks:clean_super_glow_glass",
+ "moreblocks:glow_glass",
+ "moreblocks:super_glow_glass"
+)
+
+local materials_crumbly = set(
+ -- sypké materiály (např. písek, hlína, štěrk):
+ "artdeco:whitegardenstone",
+ "charcoal:charcoal_block",
+ "ch_extras:bright_gravel",
+ "ch_extras:railway_gravel",
+ "default:coalblock",
+ "default:desert_sand",
+ "default:dirt_with_coniferous_litter",
+ "default:dirt_with_grass",
+ "default:dirt_with_rainforest_litter",
+ "default:dry_dirt",
+ "default:dry_dirt_with_dry_grass",
+ "default:gravel",
+ "default:sand",
+ "default:silver_sand",
+ "default:snowblock",
+ "farming:hemp_block",
+ "farming:straw",
+ "summer:sabbia_mare"
+)
+
+local materials_sns = set(
+ -- materiály s omezeným sortimentem tvarů:
+ "mobs:honey_block",
+ "moretrees:ebony_trunk_allfaces",
+ "moretrees:poplar_trunk_allfaces"
+)
+
+local materials_wool = set(
+ -- vlna (+ split_stone_tile)
+ "wool:black",
+ "wool:blue",
+ "wool:brown",
+ "wool:cyan",
+ "wool:dark_green",
+ "wool:dark_grey",
+ "wool:green",
+ "wool:grey",
+ "wool:magenta",
+ "wool:orange",
+ "wool:pink",
+ "wool:red",
+ "wool:violet",
+ "wool:white",
+ "wool:yellow",
+ "moreblocks:split_stone_tile" -- the same shapes as wool
+)
+
+local materials_cnc = set(
+ -- materiály na kotoučovou pilu
+"bakedclay:black",
+"bakedclay:blue",
+"bakedclay:brown",
+"bakedclay:cyan",
+"bakedclay:dark_green",
+"bakedclay:dark_grey",
+"bakedclay:green",
+"bakedclay:grey",
+"bakedclay:magenta",
+"bakedclay:natural",
+"bakedclay:orange",
+"bakedclay:pink",
+"bakedclay:red",
+"bakedclay:violet",
+"bakedclay:white",
+"bakedclay:yellow",
+"basic_materials:brass_block",
+"basic_materials:cement_block",
+"basic_materials:concrete_block",
+"building_blocks:fakegrass",
+"cottages:black",
+"cottages:brown",
+"cottages:red",
+"cottages:reet",
+"darkage:slate_tile",
+"default:acacia_wood",
+"default:aspen_wood",
+"default:brick",
+"default:bronzeblock",
+"default:cobble",
+"default:copperblock",
+"default:desert_cobble",
+"default:desert_sandstone",
+"default:desert_sandstone_block",
+"default:desert_sandstone_brick",
+"default:desert_stone",
+"default:desert_stone_block",
+"default:desert_stonebrick",
+"default:dirt",
+"default:glass",
+"default:goldblock",
+"default:ice",
+"default:junglewood",
+"default:leaves",
+"default:meselamp",
+"default:obsidian_block",
+"default:obsidian_glass",
+"default:pine_wood",
+"default:silver_sandstone",
+"default:silver_sandstone_block",
+"default:silver_sandstone_brick",
+"default:steelblock",
+"default:stone",
+"default:stone_block",
+"default:stonebrick",
+"default:tree",
+"default:wood",
+"farming:straw",
+"moreblocks:cactus_brick",
+"moreblocks:cactus_checker",
+"moreblocks:copperpatina",
+"moreblocks:glow_glass",
+"moreblocks:grey_bricks",
+"moreblocks:super_glow_glass",
+"technic:blast_resistant_concrete",
+"technic:cast_iron_block",
+"technic:granite",
+"technic:marble",
+"technic:warning_block",
+"technic:zinc_block"
+)
+
+local materials_pillars = set(
+ -- materiály na pilíře
+ "bakedclay:black",
+ "basic_materials:brass_block",
+ "basic_materials:cement_block",
+ "basic_materials:concrete_block",
+ "bridger:block_white",
+ "bridger:block_steel",
+ "bridger:block_red",
+ "bridger:block_green",
+ "bridger:block_yellow",
+ "ch_core:plaster_blue",
+ "ch_core:plaster_cyan",
+ "ch_core:plaster_dark_green",
+ "ch_core:plaster_dark_grey",
+ "ch_core:plaster_green",
+ "ch_core:plaster_grey",
+ "ch_core:plaster_medium_amber_s50",
+ "ch_core:plaster_orange",
+ "ch_core:plaster_pink",
+ "ch_core:plaster_red",
+ "ch_core:plaster_white",
+ "ch_core:plaster_yellow",
+ "ch_extras:marble",
+ "darkage:basalt",
+ "darkage:basalt_brick",
+ "darkage:basalt_cobble",
+ "darkage:marble",
+ "darkage:ors_brick",
+ "darkage:serpentine",
+ "darkage:stone_brick",
+ "default:acacia_wood",
+ "default:aspen_wood",
+ "default:bronzeblock",
+ "default:copperblock",
+ "default:desert_cobble",
+ "default:desert_sandstone",
+ "default:desert_sandstone_brick",
+ "default:desert_stone",
+ "default:desert_stonebrick",
+ "default:goldblock",
+ "default:junglewood",
+ "default:obsidian",
+ "default:pine_wood",
+ "default:silver_sandstone",
+ "default:silver_sandstone_brick",
+ "default:steelblock",
+ "default:stone",
+ "default:stonebrick",
+ "default:wood",
+ "moreblocks:copperpatina",
+ "moretrees:date_palm_planks",
+ "moretrees:ebony_planks",
+ "moretrees:plumtree_planks",
+ "moretrees:poplar_planks",
+ "moretrees:spruce_planks",
+ "technic:cast_iron_block",
+ "technic:marble"
+)
+
+local materials_for_arcades = set(
+ -- materiály na překlady zdí:
+ "bakedclay:black",
+ "bakedclay:blue",
+ "bakedclay:brown",
+ "bakedclay:cyan",
+ "bakedclay:dark_green",
+ "bakedclay:dark_grey",
+ "bakedclay:green",
+ "bakedclay:grey",
+ "bakedclay:magenta",
+ "bakedclay:natural",
+ "bakedclay:orange",
+ "bakedclay:pink",
+ "bakedclay:red",
+ "bakedclay:violet",
+ "bakedclay:white",
+ "bakedclay:yellow",
+ "basic_materials:cement_block",
+ "basic_materials:concrete_block",
+ "bridger:block_green",
+ "bridger:block_red",
+ "bridger:block_steel",
+ "bridger:block_white",
+ "bridger:block_yellow",
+ "ch_core:plaster_blue",
+ "ch_core:plaster_cyan",
+ "ch_core:plaster_dark_green",
+ "ch_core:plaster_dark_grey",
+ "ch_core:plaster_green",
+ "ch_core:plaster_grey",
+ "ch_core:plaster_medium_amber_s50",
+ "ch_core:plaster_orange",
+ "ch_core:plaster_pink",
+ "ch_core:plaster_red",
+ "ch_core:plaster_white",
+ "ch_core:plaster_yellow",
+ "ch_extras:marble",
+ "cottages:black",
+ "cottages:brown",
+ "cottages:red",
+ "cottages:reet",
+ "darkage:marble",
+ "default:acacia_wood",
+ "default:aspen_wood",
+ "default:copperblock",
+ "default:desert_stone",
+ "default:goldblock",
+ "default:ice",
+ "default:junglewood",
+ "default:meselamp",
+ "default:pine_wood",
+ "default:silver_sandstone",
+ "default:steelblock",
+ "default:stone",
+ "default:wood",
+ "summer:granite",
+ "summer:graniteA",
+ "summer:graniteB",
+ "summer:graniteBC",
+ "summer:graniteP",
+ "summer:graniteR",
+ "technic:marble",
+ "technic:warning_block"
+)
+
+local materials_for_bank_slopes = set(
+ -- materiály podporující pobřežní svahy:
+ "basic_materials:cement_block",
+ "default:dirt",
+ "default:gravel",
+ "default:sand",
+ "summer:sabbia_mare"
+)
+
+local materials_roof = set(
+ -- materiály podporující střešní tvary:
+ "bakedclay:black",
+ "bakedclay:blue",
+ "basic_materials:cement_block",
+ "basic_materials:concrete_block",
+ "cottages:black",
+ "cottages:brown",
+ "cottages:red",
+ "cottages:reet",
+ "darkage:glass",
+ "darkage:glow_glass",
+ "darkage:slate_tile",
+ "default:acacia_wood",
+ "default:aspen_wood",
+ "default:copperblock",
+ "default:junglewood",
+ "default:obsidian_glass",
+ "default:pine_wood",
+ "default:steelblock",
+ "default:wood",
+ "farming:straw",
+ "moreblocks:cactus_checker",
+ "moreblocks:copperpatina",
+ "moretrees:ebony_planks",
+ "technic:cast_iron_block",
+ "technic:zinc_block"
+)
+
+local materials_zdlazba = set(
+ -- zámková dlažba:
+ "ch_extras:cervzdlazba",
+ "ch_extras:zdlazba"
+)
+
+local materials_tombs = set(
+ -- materiály podporující náhrobky:
+ "bakedclay:black",
+ "bakedclay:blue",
+ "bakedclay:cyan",
+ "bakedclay:dark_green",
+ "bakedclay:dark_grey",
+ "bakedclay:green",
+ "bakedclay:grey",
+ "bakedclay:magenta",
+ "bakedclay:orange",
+ "bakedclay:pink",
+ "bakedclay:red",
+ "bakedclay:violet",
+ "bakedclay:white",
+ "basic_materials:concrete_block",
+ "default:desert_stone",
+ "default:goldblock",
+ "default:steelblock",
+ "default:stone",
+ "default:mossycobble",
+ "default:wood",
+ "ch_extras:marble",
+ "moreblocks:copperpatina",
+ "technic:granite",
+ "technic:marble"
+)
+
+local materials_for_manholes = set(
+ -- materiály podporující oba druhy průlezů:
+ "bakedclay:black",
+ "bakedclay:blue",
+ "bakedclay:brown",
+ "bakedclay:cyan",
+ "bakedclay:dark_green",
+ "bakedclay:dark_grey",
+ "bakedclay:green",
+ "bakedclay:grey",
+ "bakedclay:magenta",
+ "bakedclay:natural",
+ "bakedclay:orange",
+ "bakedclay:pink",
+ "bakedclay:red",
+ "bakedclay:violet",
+ "bakedclay:white",
+ "bakedclay:yellow",
+ "basic_materials:brass_block",
+ "basic_materials:cement_block",
+ "basic_materials:concrete_block",
+ "building_blocks:Adobe",
+ "building_blocks:Tar",
+ "ch_core:plaster_blue",
+ "ch_core:plaster_cyan",
+ "ch_core:plaster_dark_green",
+ "ch_core:plaster_dark_grey",
+ "ch_core:plaster_green",
+ "ch_core:plaster_grey",
+ "ch_core:plaster_medium_amber_s50",
+ "ch_core:plaster_orange",
+ "ch_core:plaster_pink",
+ "ch_core:plaster_red",
+ "ch_core:plaster_white",
+ "ch_core:plaster_yellow",
+ "ch_extras:marble",
+ "ch_extras:particle_board_grey",
+ "darkage:basalt",
+ "darkage:basalt_brick",
+ "darkage:basalt_cobble",
+ "darkage:chalk",
+ "darkage:gneiss",
+ "darkage:gneiss_brick",
+ "darkage:gneiss_cobble",
+ "darkage:marble",
+ "darkage:marble_tile",
+ "darkage:ors",
+ "darkage:ors_brick",
+ "darkage:ors_cobble",
+ "darkage:schist",
+ "darkage:serpentine",
+ "darkage:slate",
+ "darkage:slate_brick",
+ "darkage:slate_cobble",
+ "darkage:slate_tile",
+ "darkage:stone_brick",
+ "default:brick",
+ "default:cobble",
+ "default:obsidian",
+ "default:obsidian_block",
+ "default:obsidianbrick",
+ "default:silver_sandstone",
+ "default:silver_sandstone_block",
+ "default:silver_sandstone_brick",
+ "default:steelblock",
+ "default:stone",
+ "default:stone_block",
+ "default:stonebrick",
+ "moreblocks:cactus_brick",
+ "moreblocks:cactus_checker",
+ "moreblocks:circle_stone_bricks",
+ "moreblocks:coal_checker",
+ "moreblocks:coal_stone",
+ "moreblocks:coal_stone_bricks",
+ "moreblocks:cobble_compressed",
+ "moreblocks:copperpatina",
+ "moreblocks:desert_cobble_compressed",
+ "moreblocks:iron_stone",
+ "moreblocks:iron_stone_bricks",
+ "streets:asphalt_blue",
+ "streets:asphalt_red",
+ "summer:granite",
+ "summer:graniteA",
+ "summer:graniteB",
+ "summer:graniteBC",
+ "summer:graniteP",
+ "summer:graniteR",
+ "technic:blast_resistant_concrete",
+ "technic:carbon_steel_block",
+ "technic:cast_iron_block",
+ "technic:granite",
+ "technic:marble",
+ "technic:marble_bricks",
+ "technic:warning_block",
+ "xdecor:wood_tile",
+ "ch_extras:cervzdlazba",
+ "ch_extras:zdlazba"
+)
+
+--[[
+local materials_asphalt = set(
+ -- asfalt:
+ "building_blocks:Tar",
+ "streets:asphalt_blue",
+ "streets:asphalt_red"
+)
+]]
+
+local materials_for_manholes_only = set(
+ -- materiály podporující pouze jeden druh průlezu:
+ "default:wood",
+ "default:acacia_wood",
+ "default:aspen_wood",
+ "default:junglewood",
+ "default:pine_wood")
+
+local platform_materials = set(
+ -- materiály podporující nástupní hrany:
+ "basic_materials:cement_block",
+ "basic_materials:concrete_block",
+ "ch_core:plaster_blue",
+ "ch_core:plaster_cyan",
+ "ch_core:plaster_dark_green",
+ "ch_core:plaster_dark_grey",
+ "ch_core:plaster_green",
+ "ch_core:plaster_grey",
+ "ch_core:plaster_medium_amber_s50",
+ "ch_core:plaster_orange",
+ "ch_core:plaster_pink",
+ "ch_core:plaster_red",
+ "ch_core:plaster_white",
+ "ch_core:plaster_yellow",
+ "darkage:basalt",
+ "darkage:basalt_brick",
+ "darkage:gneiss_brick",
+ "darkage:marble",
+ "darkage:ors_brick",
+ "darkage:serpentine",
+ "darkage:slate_brick",
+ "darkage:stone_brick",
+ "default:desert_stone",
+ "default:desert_stone_block",
+ "default:steelblock",
+ "default:stone",
+ "default:stonebrick",
+ "default:stone_block",
+ "technic:marble"
+)
+local platform_materials_exceptions = set(
+ -- materiály podporující vybrané druhy nástupních hran:
+ "default:wood",
+ "default:junglewood",
+ "moretrees:oak_planks"
+)
+
+local materials_for_diagfillers = set(
+ -- materiály podporující diagonální výplně:
+ "building_blocks:Tar",
+ "default:dry_dirt",
+ "ch_extras:bright_gravel",
+ "ch_extras:railway_gravel",
+ "default:gravel",
+ "streets:asphalt_blue",
+ "streets:asphalt_red"
+)
+
+local materials_for_si_frames = set(
+ -- materiály podporující okenní rámy:
+ "default:acacia_wood",
+ "default:aspen_wood",
+ "default:junglewood",
+ "default:pine_wood",
+ "default:wood",
+ "bakedclay:black",
+ "bakedclay:blue",
+ "bakedclay:brown",
+ "bakedclay:cyan",
+ "bakedclay:dark_green",
+ "bakedclay:dark_grey",
+ "bakedclay:green",
+ "bakedclay:grey",
+ "bakedclay:magenta",
+ "bakedclay:natural",
+ "bakedclay:orange",
+ "bakedclay:pink",
+ "bakedclay:red",
+ "bakedclay:violet",
+ "bakedclay:white",
+ "bakedclay:yellow"
+)
+
+local materials_all = union(materials_cnc, materials_kp, materials_no_kp, materials_glass, materials_crumbly, materials_sns,
+ materials_wool, materials_roof, materials_zdlazba, platform_materials, platform_materials_exceptions,
+ set("default:sandstone", "default:sandstonebrick", "default:sandstone_block", "ch_extras:rope_block"))
+
+local roof_slopes = set("_roof22", "_roof22_raised", "_roof22_3", "_roof22_raised_3", "_roof45", "_roof45_3")
+
+local alts_micro = set("", "_1", "_2", "_4", "_12", "_15")
+
+local alts_panel = set("", "_1", "_2", "_4", "_12", "_15",
+ "_special", -- vychýlená tyč I
+ "_l", -- vychýlená tyč L
+ "_l1", -- rohový panel do tvaru L
+ "_wide",
+ "_wide_1",
+ "_wall",
+ "_wall_flat",
+ "_element",
+ "_element_flat",
+ "_pole",
+ "_pole_flat",
+ "_pole_thin",
+ "_pole_thin_flat")
+ -- "_banister" (zatím jen pro kámen)
+
+local alts_slab = set("", "_quarter", "_three_quarter", "_1", "_2", "_14", "_15",
+ "_two_sides", --deska L (dvě strany)
+ "_three_sides", -- deska rohová (tři strany)
+ "_three_sides_u", -- deska U (tři strany)
+ "_triplet", -- trojitá deska
+ "_cube", -- kvádr
+ "_two_sides_half", -- deska L (dvě strany, seříznutá)
+ "_three_sides_half", -- deska rohová (tři strany, seříznutá)
+ "_rcover", -- kryt na koleje
+ "_table", -- stůl
+ "_bars" -- zábradlí či mříž
+)
+
+local alts_slope = set("", "_half", "_half_raised",
+ "_inner", "_inner_half", "_inner_half_raised", "_inner_cut", "_inner_cut_half", "_inner_cut_half_raised",
+ "_outer", "_outer_half", "_outer_half_raised", "_outer_cut", "_outer_cut_half", "_cut",
+ "_slab", -- trojúhelník
+ "_tripleslope",
+ "_cut2", -- šikmá hradba
+ "_beveled", -- zkosená deska
+ "_valley"
+ -- , "_quarter"
+ -- , "_quarter_raised"
+)
+
+local alts_stair = set("", "_inner", "_outer", "_alt", "_alt_1", "_alt_2", "_alt_4",
+ "_triple", -- schody (schod 1/3 m)
+ "_chimney", -- úzký komín
+ "_wchimney") -- široký komín/průlez
+
+local no_cnc = set(
+ -- vypnuté tvary soustruhu:
+ "technic_cnc_d45_slope_216",
+ "technic_cnc_element_end_double",
+ "technic_cnc_element_cross_double",
+ "technic_cnc_element_t_double",
+ "technic_cnc_element_edge_double",
+ "technic_cnc_element_straight_double",
+ "technic_cnc_element_end",
+ "technic_cnc_element_cross",
+ "technic_cnc_element_t",
+ "technic_cnc_element_edge",
+ "technic_cnc_element_straight",
+ "technic_cnc_stick",
+ "technic_cnc_cylinder_horizontal"
+)
+
+local alts_cnc = set(
+ "technic_cnc_oblate_spheroid",
+ "technic_cnc_sphere",
+ "technic_cnc_cylinder",
+ "technic_cnc_twocurvededge",
+ "technic_cnc_onecurvededge",
+ "technic_cnc_spike",
+ "technic_cnc_pyramid",
+ "technic_cnc_arch216",
+ "technic_cnc_arch216_flange",
+ "technic_cnc_sphere_half",
+ "technic_cnc_block_fluted",
+ "technic_cnc_diagonal_truss",
+ "technic_cnc_diagonal_truss_cross",
+ "technic_cnc_opposedcurvededge",
+ "technic_cnc_cylinder_half",
+ "technic_cnc_cylinder_half_corner",
+ "technic_cnc_circle",
+ "technic_cnc_oct",
+ "technic_cnc_peek",
+-- "technic_cnc_valley",
+ "technic_cnc_bannerstone"
+)
+
+local alts_tombs = set("_0", "_1", "_2", "_5", "_7", "_8", "_9", "_10", "_12", "_13", "_14")
+
+local alts_fence = set("fence", "rail", "mesepost", "fencegate")
+
+local alts_advtrains = set("platform_high", "platform_low", "platform_45_high", "platform_45_low")
+
+local alts_diagfiller = set("_diagfiller22a", "_diagfiller22b", "_diagfiller45")
+
+local alts_si_frames = set("wfs", "wfq", "wfqd", "wfr")
+
+local wool_panels = set("", "_1", "_2", "_4", "_l", "_special")
+
+local wool_slabs = set("", "_quarter", "_three_quarter", "_1", "_2", "_14", "_15")
+
+local glass_micro = set("_1", "_2")
+
+local glass_panel = set("_1", "_2", "_special", "_l", "_wide_1")
+local glass_slab = set("", "_1", "_2", "_two_sides", "_three_sides", "_three_sides_u", "_triplet", "_two_sides_half", "_three_sides_half")
+local glass_slope = set("", "_half", "_half_raised", "_outer", "_outer_half", "_outer_half_raised", "_tripleslope", "_cut2", roof_slopes)
+
+local glass_no_cnc = set(
+ "technic_cnc_circle",
+ "technic_cnc_cylinder_half_corner",
+ "technic_cnc_diagonal_truss",
+ "technic_cnc_diagonal_truss_cross",
+ "technic_cnc_oblate_spheroid",
+ "technic_cnc_peek",
+ "technic_cnc_spike",
+ "technic_cnc_pyramid",
+ "technic_cnc_sphere_half",
+ "technic_cnc_sphere",
+ "technic_cnc_stick",
+ "technic_cnc_element_end_double",
+ "technic_cnc_element_cross_double",
+ "technic_cnc_element_t_double",
+ "technic_cnc_element_edge_double",
+ "technic_cnc_element_straight_double",
+ "technic_cnc_element_end",
+ "technic_cnc_element_cross",
+ "technic_cnc_element_t",
+ "technic_cnc_element_edge",
+ "technic_cnc_element_straight"
+)
+
+local sns_micro = set("_1", "_2")
+local sns_slabs = set("", "_quarter", "_three_quarter", "_1", "_2", "_14", "_15", "_rcover")
+
+local sns_slopes = set("", "_half", "_half_raised",
+ "_inner", "_inner_half", "_inner_half_raised", "_inner_cut", "_inner_cut_half", "_inner_cut_half_raised",
+ "_outer", "_outer_half", "_outer_half_raised", "_outer_cut", "_outer_cut_half", "_cut",
+ "_tripleslope")
+
+local crumbly_micro = sns_micro
+local crumbly_slabs = sns_slabs
+local crumbly_slopes = set(sns_slopes, "_quarter", "_quarter_raised")
+
+local wool_slopes = set("", "_half", "_half_raised")
+
+local bank_slopes = set(
+ "", "_cut", "_half", "_half_raised",
+ "_inner", "_inner_half", "_inner_half_raised", "_inner_cut", "_inner_cut_half", "_inner_cut_half_raised",
+ "_outer", "_outer_half", "_outer_half_raised")
+
+-- ============================================================================
+local rules = {
+ -- {materials, categories, alternates, true/false [, comment]}
+ -- materials, categories and alternates may be:
+ -- a) string (exact match)
+ -- b) table (query)
+ -- c) "*" (always match)
+ {materials_no_kp, set("micro", "panel", "slab", "slope", "stair"), "*", false},
+ {"*", "cnc", no_cnc, false}, -- vypnuté tvary (nesmí se generovat pro žádný materiál)
+ {materials_all, "slab", "_1", true}, -- "slab/_1 pro všechny materiály kromě zakázaných"
+ {"default:stone", "*", "*", true}, -- kámen je referenční materiál, musí podporovat všechny tvary
+
+ {materials_glass, {
+ micro = {glass_micro, true},
+ panel = {glass_panel, true},
+ slab = {glass_slab, true},
+ slope = {glass_slope, true},
+ stair = {"*", false}, -- no stairs...
+ cnc = {glass_no_cnc, false},
+ }},
+ {materials_wool, {
+ panel = {wool_panels, true},
+ slab = {wool_slabs, true},
+ slope = {wool_slopes, true},
+ stair = {"", true}, -- single shape only
+ }},
+ {materials_zdlazba, {
+ micro = {set("_1", "_2", "", "_15"), true},
+ panel = {set("_1", "_special", "_wide_1"), true},
+ slab = {sns_slabs, true},
+ slope = {alts_slope, true},
+ stair = {"_alt_1", true}, -- single shape only
+ }},
+ {materials_kp, {
+ micro = {alts_micro, true},
+ panel = {alts_panel, true},
+ slab = {alts_slab, true},
+ slope = {alts_slope, true},
+ stair = {alts_stair, true},
+ }},
+ {materials_sns, {
+ micro = {sns_micro, true},
+ slab = {sns_slabs, true},
+ slope = {sns_slopes, true},
+ }},
+ {materials_crumbly, {
+ micro = {crumbly_micro, true},
+ slab = {crumbly_slabs, true},
+ slope = {crumbly_slopes, true},
+ }},
+
+ {"streets:asphalt_yellow", "streets", "*", false},
+
+ -- speciality:
+ {materials_for_arcades, "slab", set("_arcade", "_arcade_flat"), true},
+ {materials_for_bank_slopes, "bank_slope", bank_slopes, true},
+ {materials_roof, "slope", roof_slopes, true}, -- roofs
+ {materials_pillars, "pillar", "*", true }, -- zatím bez omezení
+ {materials_tombs, "tombs", alts_tombs, true},
+ {materials_for_manholes, "streets", set("manhole", "stormdrain"), true},
+ {materials_for_manholes_only, "streets", "manhole", true},
+ {materials_for_si_frames, "si_frames", alts_si_frames, true},
+ {materials_for_diagfillers, "slope", alts_diagfiller, true},
+ {set("default:gravel", "ch_extras:railway_gravel"), "slope", "_slab", true},
+
+ {platform_materials_exceptions , "advtrains", set("platform_high", "platform_low"), true},
+ {platform_materials, "advtrains", alts_advtrains, true},
+ {platform_materials, "slope", set("_quarter", "_quarter_raised"), true},
+
+ -- žlutý pískovec (omezený sortiment tvarů):
+ {set("default:sandstone", "default:sandstonebrick", "default:sandstone_block"), {
+ slab = {set("", "_1", "_triplet"), true},
+ slope = {set("", "_half", "_half_raised"), true},
+ }},
+ {set("ch_extras:rope_block"), {
+ cnc = {set("technic_cnc_diagonal_truss", "technic_cnc_diagonal_truss_cross"), true},
+ panel = {set("_l", "pole", "pole_flat", "_pole_thin", "_pole_thin_flat", "_special"), true},
+ slab = {"_1", true},
+ stair = {"chimney", true},
+ }},
+
+
+-- CNC:
+ {"default:dirt", "cnc",
+ set("technic_cnc_oblate_spheroid", "technic_cnc_slope_upsdown", "technic_cnc_edge", "technic_cnc_inner_edge",
+ "technic_cnc_slope_edge_upsdown", "technic_cnc_slope_inner_edge_upsdown", "technic_cnc_stick", "technic_cnc_cylinder_horizontal"),
+ false}, -- zakázat vybrané tvary z hlíny
+ {materials_cnc, "cnc", alts_cnc, true}, -- výchozí pravidlo pro CNC
+-- fence:
+ {"*", "fence", alts_fence, true}, -- [ ] TODO
+-- catch-all rules:
+ {materials_all, set("micro", "panel", "slab", "slope", "stair", "cnc", "bank_slope", "advtrains", "pillar", "streets"), "*", false},
+}
+-- ============================================================================
+
+
+-- Cache in format:
+-- [category.."@"..alternate] = {[material] = true, ...}
+local query_cache = {}
+
+local custom_list_shapes -- list of shapes for More Blocks
+
+function ch_core.get_stairsplus_custom_shapes(recipeitem)
+ if custom_list_shapes == nil then
+ error("custom_list_shapes are not initialized yet!")
+ end
+ if recipeitem == nil then
+ -- special case: return all possible shapes
+ return table.copy(custom_list_shapes)
+ end
+ local result = {}
+ for _, shape in ipairs(custom_list_shapes) do
+ if ch_core.is_shape_allowed(recipeitem, shape[1], shape[2]) then
+ table.insert(result, shape)
+ end
+ end
+ -- print("ch_core.get_stairsplus_custom_shapes(): "..#result.." shapes generated for "..recipeitem)
+ return ifthenelse(#result > 0, result, nil) -- return nil when no shapes are allowed
+end
+
+function ch_core.get_materials_from_shapes_db(key)
+ local mset
+ if key == "advtrains" then
+ mset = union(platform_materials, platform_materials_exceptions)
+ elseif key == "si_frames" then
+ mset = materials_for_si_frames
+ elseif key == "streets" then
+ mset = union(materials_for_manholes, materials_for_manholes_only)
+ end
+ if mset == nil then
+ error("ch_core.get_materials_from_shapes_db(): unsupported key \""..key.."\"!")
+ end
+ local result = {}
+ for name, _ in pairs(mset) do
+ table.insert(result, name)
+ end
+ if not mset["default:stone"] then
+ table.insert(result, "default:stone")
+ end
+ return result
+end
+
+function ch_core.init_stairsplus_custom_shapes(defs)
+ local key_set = {}
+ custom_list_shapes = {}
+ for category, cdef in pairs(defs) do
+ for alternate, _ in pairs(cdef) do
+ local key = category.."/"..alternate
+ if key_set[key] == nil then
+ key_set[key] = true
+ table.insert(custom_list_shapes, {category, alternate})
+ end
+ end
+ end
+end
+
+local function is_match(s, pattern)
+ if type(pattern) == "string" then
+ return pattern == "*" or s == pattern
+ elseif type(pattern) == "table" then
+ return pattern[s] ~= nil
+ elseif type(pattern) == "number" then
+ return s == tostring(pattern)
+ else
+ error("Invalid pattern type '"..type(pattern).."'!")
+ end
+end
+
+function ch_core.is_shape_allowed(recipeitem, category, alternate)
+ if type(recipeitem) ~= "string" or type(category) ~= "string" or type(alternate) ~= "string" then
+ error("Invalid argument type: "..dump2({
+ func = "ch_core.is_shape_allowed",
+ recipeitem = recipeitem, category = category, alternate = alternate,
+ ["type(recipeitem)"] = type(recipeitem),
+ ["type(category)"] = type(category),
+ ["type(alternate)"] = type(alternate),
+ }))
+ end
+ local shapeinfo = query_cache[category.."@"..alternate]
+ local result
+ if shapeinfo ~= nil then
+ result = shapeinfo[recipeitem]
+ if result ~= nil then
+ return result
+ end
+ end
+ -- perform full resolution:
+ for _, rule in ipairs(rules) do
+ if #rule == 4 then
+ -- starší formát pravidla
+ if is_match(category, rule[2]) and is_match(recipeitem, rule[1]) and is_match(alternate, rule[3]) then
+ -- match
+ result = ifthenelse(rule[4], true, false)
+ break
+ end
+ elseif #rule == 2 and type(rule[2]) == "table" then
+ -- novější formát pravidla
+ local subrule = rule[2][category]
+ if subrule ~= nil and is_match(recipeitem, rule[1]) then
+ if #subrule ~= 2 then
+ error("Invalid subrule found:"..dump2(rule))
+ end
+ if is_match(alternate, subrule[1]) then
+ result = ifthenelse(subrule[2], true, false)
+ break
+ end
+ end
+ end
+ end
+ if result == nil then
+ error("Shapes DB resolution failed for "..recipeitem.."/"..category.."/"..alternate.."!")
+ -- result = true
+ -- minetest.log("warning", "Shapes DB resolution failed for "..recipeitem.."/"..category.."/"..alternate.."! Will allow the shape.")
+ end
+ if shapeinfo == nil then
+ shapeinfo = {}
+ query_cache[category.."@"..alternate] = shapeinfo
+ end
+ shapeinfo[recipeitem] = result
+ return result
+end
+
+function ch_core.get_comboblock_index(v1, v2)
+ error("not implemented yet")
+end
+
+local function get_single_texture(tiles)
+ if type(tiles) == "string" then
+ return tiles
+ elseif type(tiles) == "table" then
+ tiles = tiles[1]
+ if type(tiles) == "string" then
+ return tiles
+ elseif type(tiles) == "table" then
+ return tiles.name or tiles.image or "blank.png"
+ end
+ end
+ return "blank.png"
+end
+
+local function get_six_textures(tiles)
+ if type(tiles) == "string" then
+ return {tiles, tiles, tiles, tiles, tiles, tiles}
+ elseif type(tiles) == "table" then
+ tiles = table.copy(tiles)
+ for i = 1, #tiles do
+ if type(tiles[i]) ~= "table" then
+ tiles[i] = {name = tiles[i]}
+ end
+ end
+ if #tiles < 6 then
+ for i = #tiles, 5 do
+ tiles[i + 1] = table.copy(tiles[i])
+ end
+ end
+ return tiles
+ end
+ return {
+ {name = "blank.png"},
+ {name = "blank.png"},
+ {name = "blank.png"},
+ {name = "blank.png"},
+ {name = "blank.png"},
+ {name = "blank.png"},
+ }
+end
+
+local groups_to_inherit = {"choppy", "crumbly", "snappy", "oddly_breakable_by_hand", "flammable"}
+
+local default_fence_defs = {
+ fence = true,
+ rail = true,
+ mesepost = false,
+ fencegate = true,
+}
+
+local function assembly_name(matmod, prefix, matname, info, foreign_names)
+ if type(info) == "table" and info.name ~= nil then
+ return info.name
+ end
+ return ifthenelse(foreign_names, ":"..matmod, matmod)..":"..prefix..matname
+end
+
+function ch_core.register_fence(material, defs)
+ local matmod, matname = string.match(material, "([^:]+):([^:]+)$")
+ local ndef = minetest.registered_nodes[material]
+ local empty_table = {}
+ if ndef == nil then
+ error("Fence material "..material.." is not a registered node!")
+ end
+ if matmod == nil or matname == nil then
+ error("Invalid material syntax: "..material.."!")
+ end
+ if defs == nil then
+ defs = default_fence_defs
+ end
+
+ local info, def
+ local name
+ local tiles = ndef.tiles or {{name = "blank.png"}}
+ local texture = get_single_texture(tiles)
+ local groups = assembly_groups(nil, nil, ndef.groups, groups_to_inherit)
+
+ -- FENCE
+ -- ===============================================================================
+ if defs.fence ~= nil and ch_core.is_shape_allowed(material, "fence", "fence") then
+ -- fence block ('fence')
+ -- example: default:fence_wood
+ info = ifthenelse(type(defs.fence) == "table", defs.fence, empty_table)
+ name = assembly_name(matmod, "fence_", matname, info, defs.foreign_names)
+ def = {
+ material = material,
+ groups = table.copy(groups),
+ sounds = ndef.sounds,
+ }
+ if info.texture ~= nil then
+ def.texture = defs.fence.texture
+ else
+ def.texture = ""
+ def.tiles = tiles
+ def.inventory_image = "default_fence_overlay.png^"..texture.."^default_fence_overlay.png^[makealpha:255,126,126"
+ def.wield_image = def.inventory_image
+ end
+ default.register_fence(name, def)
+ end
+
+ -- FENCE RAIL
+ -- ===============================================================================
+ if defs.rail ~= nil and ch_core.is_shape_allowed(material, "fence", "rail") then
+ -- fence rail ('rail')
+ -- example: default:fence_rail_wood
+ info = ifthenelse(type(defs.rail) == "table", defs.rail, empty_table)
+ name = assembly_name(matmod, "fence_rail_", matname, info, defs.foreign_names)
+ def = {
+ material = material,
+ groups = table.copy(groups),
+ sounds = ndef.sounds,
+ }
+ if info.texture ~= nil then
+ def.texture = info.texture
+ else
+ def.texture = ""
+ def.tiles = tiles
+ def.inventory_image = "default_fence_rail_overlay.png^"..texture.."^default_fence_rail_overlay.png^[makealpha:255,126,126"
+ def.wield_image = def.inventory_image
+ end
+ default.register_fence_rail(name, def)
+ end
+
+ -- MESE POST LIGHT
+ -- ===============================================================================
+ if defs.mesepost ~= nil and ch_core.is_shape_allowed(material, "fence", "mesepost") then
+ -- post_light ('post_light')
+ -- example: default:mese_post_light
+ info = ifthenelse(type(defs.mesepost) == "table", defs.mesepost, empty_table)
+ name = assembly_name(matmod, "mese_post_light_", matname, defs.mesepost, defs.foreign_names)
+ local mp_tiles = get_six_textures(ndef.tiles)
+ for i = 3, 4 do
+ mp_tiles[i].name = mp_tiles[i].name.."^default_mese_post_light_side.png^[makealpha:0,0,0"
+ end
+ for i = 5, 6 do
+ mp_tiles[i].name = mp_tiles[i].name.."^default_mese_post_light_side_dark.png^[makealpha:0,0,0"
+ end
+ def = {
+ material = material,
+ texture = info.texture or texture,
+ description = (ndef.description or "neznámý materiál")..": sloupek s meseovým světlem",
+ tiles = mp_tiles,
+ groups = table.copy(groups),
+ sounds = ndef.sounds,
+ }
+ default.register_mesepost(name, def)
+ end
+ if defs.fencegate ~= nil and ch_core.is_shape_allowed(material, "fence", "fencegate") then
+ -- fence gate ('gate')
+ -- example: doors:gate_wood_closed
+ info = ifthenelse(type(defs.fencegate) == "table", defs.fencegate, empty_table)
+ name = info.name or "doors:gate_"..matname
+ def = {
+ material = material,
+ texture = info.texture or texture,
+ groups = ch_core.assembly_groups({}, {oddly_breakable_by_hand = 2}, ndef.groups, groups_to_inherit),
+ }
+ doors.register_fencegate(name, def)
+ end
+end
+
+ch_core.register_fence("default:wood", {
+ fence = true,
+ rail = true,
+ mesepost = {name = ":default:mese_post_light"},
+ fencegate = true,
+ foreign_names = true,
+})
+
+local defs = {
+ fence = true, rail = true, mesepost = true, fencegate = true, foreign_names = true
+}
+
+ch_core.register_fence("default:acacia_wood", defs)
+ch_core.register_fence("default:junglewood", defs)
+ch_core.register_fence("default:aspen_wood", defs)
+ch_core.register_fence("default:pine_wood", defs)
+
+ch_core.close_submod("shapes_db")