aboutsummaryrefslogtreecommitdiff
path: root/advtrains_signals_japan/init.lua
diff options
context:
space:
mode:
authorY. Wang <yw05@forksworld.de>2022-04-11 16:55:50 +0200
committerY. Wang <yw05@forksworld.de>2023-03-23 20:06:02 +0100
commit5c8962b39bd4f6871ec87a988ac43d7bfad04d2b (patch)
treeb30a30fdfa905ef5eabce1528829fa41a8c127a3 /advtrains_signals_japan/init.lua
parent0b4cdbb455b5ba43b3c8d3fd7af5112021144eaa (diff)
Implement basic route signaling with Japanese signals for demo
Diffstat (limited to 'advtrains_signals_japan/init.lua')
-rw-r--r--advtrains_signals_japan/init.lua419
1 files changed, 419 insertions, 0 deletions
diff --git a/advtrains_signals_japan/init.lua b/advtrains_signals_japan/init.lua
new file mode 100644
index 0000000..9ccf66b
--- /dev/null
+++ b/advtrains_signals_japan/init.lua
@@ -0,0 +1,419 @@
+local pole_texture = "advtrains_hud_bg.png^[colorize:#858585:255"
+local signal_face_texture = "advtrains_hud_bg.png^[colorize:#000000:255"
+local pole_radius = 1/16
+local pole_box = {-pole_radius,-1/2,-pole_radius,pole_radius,1/2,pole_radius}
+local light_radius = 1/20
+local signal_width = 6*light_radius
+local signal_thickness = pole_radius*3
+local signal_height = {}
+local signal_box = {}
+local light_red = "advtrains_hud_bg.png^[colorize:red:255"
+local light_yellow = "advtrains_hud_bg.png^[colorize:orange:255"
+local light_green = "advtrains_hud_bg.png^[colorize:lime:255"
+local light_purple = "advtrains_hud_bg.png^[colorize:purple:255"
+local light_distant = light_purple
+local light_off = signal_face_texture
+
+do
+ local model_path_prefix = table.concat({minetest.get_modpath("advtrains_signals_japan"), "models", "advtrains_signals_japan_"}, DIR_DELIM)
+
+ local function vertex(x, y, z)
+ return string.format("v %f %f %f", x, y, z)
+ end
+ local function texture(u, v)
+ return string.format("vt %f %f", u, v)
+ end
+ local function face_element(v, vt)
+ if vt then
+ return string.format("%d/%d", v, vt)
+ end
+ return tonumber(v)
+ end
+ local function face_elements(...)
+ local st = {"f"}
+ local args = {...}
+ local len = #args
+ for i = 1, len, 2 do
+ st[(i+3)/2] = face_element(args[i], args[i+1])
+ end
+ return table.concat(st, " ")
+ end
+ local function sequential_elements(v0, vt0, count)
+ local st = {}
+ for i = 1, count do
+ st[i] = face_element(v0+i, vt0+i)
+ end
+ return table.concat(st, " ")
+ end
+ local function mod_lower(min, a, b)
+ return min + (a-min)%b
+ end
+ local function connect_circular(v0, vt0, count)
+ return "f " .. sequential_elements(v0, vt0, count)
+ end
+ local function connect_cylindrical(v0, vt0, count)
+ local st = {}
+ for i = 0, count-1 do
+ local j = (i+1)%count
+ local v1 = v0+i+1
+ local v2 = v1+count
+ local v3 = v0+j+1
+ local v4 = v3+count
+ local vt1 = vt0+i+1
+ local vt2 = vt1+count+1
+ st[i+1] = face_elements(v1, vt1, v3, vt1+1, v4, vt2+1, v2, vt2)
+ end
+ return table.concat(st, "\n")
+ end
+ local function circular_textures(u0, v0, r, count, total, angular_offset, direction)
+ local st = {}
+ if not angular_offset then
+ angular_offset = 0
+ end
+ if not total then
+ total = count
+ end
+ if not direction then
+ direction = 1
+ end
view_offset={x=0, y=0, z=0}, group="pass", }, { name="2", attach_offset={x=4, y=8, z=0}, view_offset={x=0, y=0, z=0}, group="pass", }, { name="3", attach_offset={x=-4, y=8, z=-8}, view_offset={x=0, y=0, z=0}, group="pass", }, { name="4", attach_offset={x=4, y=8, z=-8}, view_offset={x=0, y=0, z=0}, group="pass", }, }, seat_groups = { dstand={ name = "Driver Stand", access_to = {"pass"}, require_doors_open=true, }, pass={ name = "Passenger area", access_to = {"dstand"}, require_doors_open=true, }, }, assign_to_seat_group = {"dstand", "pass"}, doors={ open={ [-1]={frames={x=0, y=20}, time=1}, [1]={frames={x=40, y=60}, time=1} }, close={ [-1]={frames={x=20, y=40}, time=1}, [1]={frames={x=60, y=80}, time=1} } }, door_entry={-1}, visual_size = {x=1, y=1}, wagon_span=2.5, is_locomotive=true, collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, drops={"default:steelblock 4"}, }, S("Japanese Train Engine"), "advtrains_engine_japan_inv.png") advtrains.register_wagon("wagon_japan", { mesh="advtrains_wagon_japan.b3d", textures = {"advtrains_wagon_japan.png"}, drives_on={default=true}, max_speed=20, seats = { { name="1", attach_offset={x=-4, y=8, z=8}, view_offset={x=0, y=0, z=0}, group="pass", }, { name="2", attach_offset={x=4, y=8, z=8}, view_offset={x=0, y=0, z=0}, group="pass", }, { name="1a", attach_offset={x=-4, y=8, z=0}, view_offset={x=0, y=0, z=0}, group="pass", }, { name="2a", attach_offset={x=4, y=8, z=0}, view_offset={x=0, y=0, z=0}, group="pass", }, { name="3", attach_offset={x=-4, y=8, z=-8}, view_offset={x=0, y=0, z=0}, group="pass", }, { name="4", attach_offset={x=4, y=8, z=-8}, view_offset={x=0, y=0, z=0}, group="pass", }, }, seat_groups = { pass={ name = "Passenger area", access_to = {}, require_doors_open=true, }, }, assign_to_seat_group = {"pass"}, doors={ open={ [-1]={frames={x=0, y=20}, time=1}, [1]={frames={x=40, y=60}, time=1} }, close={ [-1]={frames={x=20, y=40}, time=1}, [1]={frames={x=60, y=80}, time=1} } }, door_entry={-1, 1}, visual_size = {x=1, y=1}, wagon_span=2.3, collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, drops={"default:steelblock 4"}, }, S("Japanese Train Wagon"), "advtrains_wagon_japan_inv.png")
"facedir",
+ selection_box = {
+ type = "fixed",
+ fixed = {pole_box, signal_box[lightcount]},
+ },
+ collision_box = {
+ type = "fixed",
+ fixed = {pole_box, signal_box[lightcount]},
+ },
+ groups = {
+ cracky = 2,
+ advtrains_signal = 2,
+ not_blocking_trains = 1,
+ save_in_at_nodedb = 1,
+ not_in_creative_inventory = rtab.ici and asp == "danger" and 0 or 1,
+ },
+ inventory_image = siginfo.inventory_image,
+ drop = "advtrains_signals_japan:"..sigtype.."_danger_0",
+ advtrains = {
+ supported_aspects = {
+ type = 2,
+ group = siginfo.typename,
+ },
+ get_aspect = function()
+ return asp
+ end,
+ set_aspect = function(pos, node, asp)
+ advtrains.ndb.swap_node(pos, {name = "advtrains_signals_japan:"..sigtype.."_"..asp.."_"..rot, param2 = node.param2})
+ end,
+ },
+ on_rightclick = advtrains.interlocking.signal_rc_handler,
+ can_dig = advtrains.interlocking.signal_can_dig,
+ after_dig_node = advtrains.interlocking.signal_after_dig,
+ })
+ advtrains.trackplacer.add_worked("advtrains_signals_japan:"..sigtype, asp, "_"..rot)
+ end
+ end
+end