diff options
Diffstat (limited to 'advtrains_signals_ks/init.lua')
-rwxr-xr-x | advtrains_signals_ks/init.lua | 273 |
1 files changed, 234 insertions, 39 deletions
diff --git a/advtrains_signals_ks/init.lua b/advtrains_signals_ks/init.lua index b05506e..e97eb77 100755 --- a/advtrains_signals_ks/init.lua +++ b/advtrains_signals_ks/init.lua @@ -4,28 +4,78 @@ -- Note that the group value of advtrains_signal is 2, which means "step 2 of signal capabilities" -- advtrains_signal=1 is meant for signals that do not implement set_aspect. +local function asp_to_zs3type(asp) + local n = tonumber(asp) + if not n or n < 4 then return "off" end + if n < 8 then return 2*math.floor(n/2) end + return math.min(16,4*math.floor(n/4)) +end + +local function setzs3(msp, lim, rot) + local pos = {x = msp.x, y = msp.y+1, z = msp.z} + local node = advtrains.ndb.get_node(pos) + local asp = asp_to_zs3type(lim) + if node.name:find("^advtrains_signals_ks:zs3_") then + advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:zs3_"..asp.."_"..rot, param2 = node.param2}) + end +end + +local function getzs3(msp) + local pos = {x = msp.x, y = msp.y+1, z = msp.z} + local nodename = advtrains.ndb.get_node(pos).name + local speed = nodename:match("^advtrains_signals_ks:zs3_(%w+)_%d+$") + if not speed then return nil end + speed = tonumber(speed) + if not speed then return false end + return speed +end + +local function setzs3v(msp, lim, rot) + local pos = {x = msp.x, y = msp.y-1, z = msp.z} + local node = advtrains.ndb.get_node(pos) + local asp = asp_to_zs3type(lim) + if node.name:find("^advtrains_signals_ks:zs3v_") then + advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:zs3v_"..asp.."_"..rot, param2 = node.param2}) + end +end + +local function getzs3v(msp) + local pos = {x = msp.x, y = msp.y-1, z = msp.z} + local nodename = advtrains.ndb.get_node(pos).name + local speed = nodename:match("^advtrains_signals_ks:zs3v_(%w+)_%d+$") + if not speed then return nil end + speed = tonumber(speed) + if not speed then return false end + return speed +end + local setaspectf = function(rot) return function(pos, node, asp) + setzs3(pos, asp.main, rot) if asp.main == 0 then if asp.shunt then advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_shunt_"..rot, param2 = node.param2}) else advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_danger_"..rot, param2 = node.param2}) end + setzs3v(pos, nil, rot) else - if asp.dst ~= 0 and asp.main == -1 then + if not asp.dst or asp.dst == -1 then advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_free_"..rot, param2 = node.param2}) - else + elseif asp.dst == 0 then advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_slow_"..rot, param2 = node.param2}) + else + advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_nextslow_"..rot, param2 = node.param2}) end + setzs3v(pos, asp.dst, rot) end end end local suppasp = { - main = {0, 6, -1}, - dst = {0, false}, + main = {0, 4, 6, 8, 12, 16, -1}, + dst = {0, 4, 6, 8, 12, 16, -1, false}, shunt = nil, proceed_as_main = true, info = { @@ -66,6 +116,10 @@ local suppasp_ra = { advtrains.trackplacer.register_tracktype("advtrains_signals_ks:hs") advtrains.trackplacer.register_tracktype("advtrains_signals_ks:ra") advtrains.trackplacer.register_tracktype("advtrains_signals_ks:sign") +advtrains.trackplacer.register_tracktype("advtrains_signals_ks:sign_lf") +advtrains.trackplacer.register_tracktype("advtrains_signals_ks:sign_lf7") +advtrains.trackplacer.register_tracktype("advtrains_signals_ks:zs3") +advtrains.trackplacer.register_tracktype("advtrains_signals_ks:zs3v") advtrains.trackplacer.register_tracktype("advtrains_signals_ks:mast") for _, rtab in ipairs({ @@ -76,16 +130,48 @@ for _, rtab in ipairs({ }) do local rot = rtab.rot for typ, prts in pairs({ - danger = {asp = advtrains.interlocking.DANGER, n = "slow", ici=true}, - slow = {asp = { main = 6, proceed_as_main = true} , n = "free"}, - free = {asp = { main = -1, proceed_as_main = true} , n = "shunt"}, - shunt = {asp = { main = 0, shunt = true} , n = "danger"}, + danger = {asp = advtrains.interlocking.DANGER, n = "slow", ici=true}, + slow = { + asp = function(pos) + return { main = getzs3(pos) or -1, proceed_as_main = true, dst = 0 } + end, + n = "nextslow" + }, + nextslow = { + asp = function(pos) + return { main = getzs3(pos) or -1, proceed_as_main = true, dst = getzs3v(pos) or 6 } + end, + n = "free" + }, + free = { + asp = function(pos) + return { main = getzs3(pos) or -1, proceed_as_main = true, dst = -1 } + end, + n = "shunt" + }, + shunt = {asp = { main = 0, shunt = true} , n = "danger"}, }) do + local tile = "advtrains_signals_ks_ltm_"..typ..".png" + local afunc = prts.asp + if type(afunc) == "table" then + afunc = function() return prts.asp end + end + if typ == "nextslow" then + tile = { + name = tile, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 1, + } + } + end minetest.register_node("advtrains_signals_ks:hs_"..typ.."_"..rot, { description = "Ks Main Signal", drawtype = "mesh", mesh = "advtrains_signals_ks_main_smr"..rot..".obj", - tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_ltm_"..typ..".png"}, + tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_head.png", tile}, paramtype="light", sunlight_propagates=true, @@ -108,16 +194,14 @@ for _, rtab in ipairs({ advtrains = { set_aspect = setaspectf(rot), supported_aspects = suppasp, - get_aspect = function(pos, node) - return prts.asp - end, + get_aspect = afunc, }, on_rightclick = advtrains.interlocking.signal_rc_handler, can_dig = advtrains.interlocking.signal_can_dig, after_dig_node = advtrains.interlocking.signal_after_dig, }) -- rotatable by trackworker - advtrains.trackplacer.add_worked("advtrains_signals_ks:hs", typ, "_"..rot, prts.n) + advtrains.trackplacer.add_worked("advtrains_signals_ks:hs", typ, "_"..rot) end @@ -162,26 +246,16 @@ for _, rtab in ipairs({ after_dig_node = advtrains.interlocking.signal_after_dig, }) -- rotatable by trackworker - advtrains.trackplacer.add_worked("advtrains_signals_ks:ra", typ, "_"..rot, prts.n) + advtrains.trackplacer.add_worked("advtrains_signals_ks:ra", typ, "_"..rot) end - - --Schilder: - for typ, prts in pairs({ - -- Speed restrictions: - ["8"] = {asp = { main = 8, shunt = true }, n = "12", ici=true}, - ["12"] = {asp = { main = 12, shunt = true }, n = "16"}, - ["16"] = {asp = { main = 16, shunt = true }, n = "e"}, - -- Speed restriction lifted - ["e"] = {asp = { main = -1, shunt = true }, n = "hfs"}, - -- Halt for shunt moves: - ["hfs"] = {asp = { main = false, shunt = false }, n = "pam"}, - ["pam"] = {asp = { main = -1, shunt = false, proceed_as_main = true}, n = "8"}, - }) do - minetest.register_node("advtrains_signals_ks:sign_"..typ.."_"..rot, { - description = "Signal Sign", + + -- Schilder: + local function register_sign(prefix, typ, nxt, description, mesh, tile2, dtyp, inv, asp) + minetest.register_node("advtrains_signals_ks:"..prefix.."_"..typ.."_"..rot, { + description = description, drawtype = "mesh", - mesh = "advtrains_signals_ks_sign_smr"..rot..".obj", - tiles = {"advtrains_signals_ks_signpost.png", "advtrains_signals_ks_sign_"..typ..".png"}, + mesh = "advtrains_signals_ks_"..mesh.."_smr"..rot..".obj", + tiles = {"advtrains_signals_ks_signpost.png", tile2}, paramtype="light", sunlight_propagates=true, @@ -197,22 +271,123 @@ for _, rtab in ipairs({ advtrains_signal = 2, not_blocking_trains = 1, save_in_at_nodedb = 1, - not_in_creative_inventory = (rtab.ici and prts.ici) and 0 or 1, + not_in_creative_inventory = (rtab.ici and typ == dtyp) and 0 or 1, }, - drop = "advtrains_signals_ks:sign_8_0", - inventory_image = "advtrains_signals_ks_sign_8.png", + drop = "advtrains_signals_ks:"..prefix.."_"..dtyp.."_0", + inventory_image = inv, advtrains = { - -- This is a static signal! No set_aspect - get_aspect = function(pos, node) - return prts.asp - end, + get_aspect = function() return asp end }, on_rightclick = advtrains.interlocking.signal_rc_handler, can_dig = advtrains.interlocking.signal_can_dig, after_dig_node = advtrains.interlocking.signal_after_dig, }) -- rotatable by trackworker - advtrains.trackplacer.add_worked("advtrains_signals_ks:sign", typ, "_"..rot, prts.n) + advtrains.trackplacer.add_worked("advtrains_signals_ks:"..prefix, typ, "_"..rot, nxt) + end + + for typ, prts in pairs { + ["hfs"] = {asp = {main = false, shunt = false}, n = "pam", mesh = "_hfs"}, + ["pam"] = {asp = {main = -1, shunt = false, proceed_as_main = true}, n = "hfs"} + } do + local mesh = prts.mesh or "" + local tile2 = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_"..typ..".png^[makealpha:255,255,255)" + if typ == "hfs" then + tile2 = "advtrains_signals_ks_sign_hfs.png" + end + register_sign("sign", typ, prts.n, "Signal Sign", "sign"..mesh, tile2, "hfs", "advtrains_signals_ks_sign_lf7.png", prts.asp) + end + + for typ, prts in pairs { + -- Speed restrictions: + ["4"] = {asp = { main = 4, shunt = true }, n = "6"}, + ["6"] = {asp = { main = 6, shunt = true }, n = "8"}, + ["8"] = {asp = { main = 8, shunt = true }, n = "12"}, + ["12"] = {asp = { main = 12, shunt = true }, n = "16"}, + ["16"] = {asp = { main = 16, shunt = true }, n = "e"}, + -- Speed restriction lifted + ["e"] = {asp = { main = -1, shunt = true }, n = "4", mesh = "_zs10"}, + } do + local mesh = tonumber(typ) and "_zs3" or prts.mesh or "" + local tile2 = "[combine:40x40:0,0=\\(advtrains_signals_ks_sign_off.png\\^[resize\\:40x40\\):3,-2=advtrains_signals_ks_sign_"..typ..".png^[invert:rgb" + if typ == "e" then + tile2 = "advtrains_signals_ks_sign_zs10.png" + end + register_sign("sign", typ, prts.n, "Permanent local speed restriction sign", "sign"..mesh, tile2, "8", "advtrains_signals_ks_sign_8.png^[invert:rgb", prts.asp) + end + + for typ, prts in pairs { + ["4"] = {main = 4, n = "6"}, + ["6"] = {main = 6, n = "8"}, + ["8"] = {main = 8, n = "12"}, + ["12"] = {main = 12, n = "16"}, + ["16"] = {main = 16, n = "e"}, + ["e"] = {main = -1, n = "4"}, + } do + local tile2 = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_"..typ..".png^[makealpha:255,255,255)"..(typ == "e" and "" or "^[multiply:orange") + local inv = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_8.png^[makealpha:255,255,255)^[multiply:orange" + register_sign("sign_lf", typ, prts.n, "Temporary local speed restriction sign", "sign", tile2, "8", inv, {main = prts.main, shunt = true, type = "temp"}) + end + + for typ, prts in pairs { + ["4"] = {main = 4, n = "6"}, + ["6"] = {main = 6, n = "8"}, + ["8"] = {main = 8, n = "12"}, + ["12"] = {main = 12, n = "16"}, + ["16"] = {main = 16, n = "20"}, + ["20"] = {main = 20, n = "4"}, + } do + local tile2 = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_"..typ..".png^[makealpha:255,255,255)" + local inv = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_8.png^[makealpha:255,255,255)" + register_sign("sign_lf7", typ, prts.n, "Line speed restriction sign", "sign", tile2, "8", inv, {main = prts.main, shunt = true, type = "line"}) + end + + -- Geschwindigkeits(vor)anzeiger für Ks-Signale + for typ, prts in pairs({ + ["off"] = {n = "4", ici = true}, + ["4"] = {n = "6"}, + ["6"] = {n = "8"}, + ["8"] = {n = "12"}, + ["12"] = {n = "16"}, + ["16"] = {n = "off"}, + }) do + local def = { + drawtype = "mesh", + tiles = {"advtrains_signals_ks_mast.png","advtrains_signals_ks_head.png","advtrains_signals_ks_sign_"..typ..".png^[invert:rgb^[noalpha"}, + paramtype = "light", + sunlight_propagates = true, + light_source = 4, + paramtype2 = "facedir", + selection_box = { + type = "fixed", + fixed = {rtab.sbox, {-1/4, -1/2, -1/4, 1/4, -7/16, 1/4}} + }, + groups = { + cracky = 2, + not_blocking_trains = 1, + save_in_at_nodedb = 1, + not_in_creative_inventory = (rtab.ici and prts.ici) and 0 or 1, + }, + after_dig_node = function(pos) advtrains.ndb.update(pos) end + } + + -- Zs 3 + local t = table.copy(def) + t.description = "Ks speed limit indicator" + t.mesh = "advtrains_signals_ks_zs_top_smr"..rot..".obj" + t.drop = "advtrains_signals_ks:zs3_off_0" + t.selection_box.fixed[1][5] = 0 + minetest.register_node("advtrains_signals_ks:zs3_"..typ.."_"..rot, t) + advtrains.trackplacer.add_worked("advtrains_signals_ks:zs3", typ, "_"..rot) + + -- Zs 3v + local t = table.copy(def) + t.description = "Ks distant speed limit indicator" + t.mesh = "advtrains_signals_ks_zs_bottom_smr"..rot..".obj" + t.drop = "advtrains_signals_ks:zs3v_off_0" + t.tiles[3] = t.tiles[3] .. "^[multiply:yellow" + minetest.register_node("advtrains_signals_ks:zs3v_"..typ.."_"..rot, t) + advtrains.trackplacer.add_worked("advtrains_signals_ks:zs3v", typ, "_"..rot) end minetest.register_node("advtrains_signals_ks:mast_mast_"..rot, { @@ -284,3 +459,23 @@ minetest.register_craft({ }, }) sign_material = nil + +minetest.register_craft{ + output = "advtrains_signals_ks:sign_8_0 1", + recipe = {{"advtrains_signals_ks:sign_lf7_8_0"}} +} + +minetest.register_craft{ + output = "advtrains_signals_ks:sign_hfs_0 1", + recipe = {{"advtrains_signals_ks:sign_8_0"}} +} + +minetest.register_craft{ + output = "advtrains_signals_ks:sign_lf_8_0 1", + recipe = {{"advtrains_signals_ks:sign_hfs_0"}} +} + +minetest.register_craft{ + output = "advtrains_signals_ks:sign_lf7_8_0 1", + recipe = {{"advtrains_signals_ks:sign_lf_8_0"}} +} |