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")