diff options
Diffstat (limited to 'advtrains/trainhud.lua')
-rw-r--r-- | advtrains/trainhud.lua | 300 |
1 files changed, 111 insertions, 189 deletions
diff --git a/advtrains/trainhud.lua b/advtrains/trainhud.lua index 6d66618..22aa6cf 100644 --- a/advtrains/trainhud.lua +++ b/advtrains/trainhud.lua @@ -86,18 +86,16 @@ function advtrains.on_control_change(pc, train, flip) end end end -function advtrains.update_driver_hud(pname, train, flip, thud, ghud) +function advtrains.update_driver_hud(pname, train, flip) local inside=train.text_inside or "" - local ft = (thud or advtrains.hud.dtext)(train, flip) - local ht, gs = (ghud or advtrains.hud.dgraphical)(train, flip) - advtrains.set_trainhud(pname, inside.."\n"..ft, ht, gs) + local ft, ht = advtrains.hud_train_format(train, flip) + advtrains.set_trainhud(pname, inside.."\n"..ft, ht) end function advtrains.clear_driver_hud(pname) advtrains.set_trainhud(pname, "") end -function advtrains.set_trainhud(name, text, driver, gs) - gs = gs or 110 +function advtrains.set_trainhud(name, text, driver) local hud = advtrains.hud[name] local player=minetest.get_player_by_name(name) if not player then @@ -119,7 +117,7 @@ function advtrains.set_trainhud(name, text, driver, gs) name = "ADVTRAINS", number = 0xFFFFFF, position = {x=0.5, y=1}, - offset = {x=0, y=-190-gs}, + offset = {x=0, y=-300}, text = text, scale = {x=200, y=60}, alignment = {x=0, y=-1}, @@ -129,7 +127,6 @@ function advtrains.set_trainhud(name, text, driver, gs) else if hud.oldText ~= text then player:hud_change(hud.id, "text", text) - player:hud_change(hud.id, "offset", {x=0, y=-190-gs}) hud.oldText=text end if hud.driver then @@ -178,222 +175,147 @@ Value Disp Control Meaning 4 + W Accelerate ]] -function advtrains.hud.texture_escape(str) - return string.gsub(str, "[%[%()^:]", "\\%1") -end - -function advtrains.hud.dtext(train, flip) - local st = {} - if train.debug then st = {train.debug} end - - st[#st+1] = attrans("Train ID: @1", train.id) +function advtrains.hud_train_format(train, flip) + if not train then return "","" end + local sformat = string.format -- this appears to be faster than (...):format - if res and res == 0 then - st[#st+1] = attrans("OVERRUN RED SIGNAL! Examine situation and reverse train to move again.") - end + local max = train.max_speed or 10 + local res = train.speed_restriction + local vel = advtrains.abs_ceil(train.velocity) + local vel_kmh=advtrains.abs_ceil(advtrains.ms_to_kmh(train.velocity)) - if train.atc_command then - st[#st+1] = string.format("ATC: %s%s", train.atc_delay and advtrains.abs_ceil(train.atc_delay).."s " or "", train.atc_command or "") + local tlev=train.lever or 1 + if train.velocity==0 and not train.active_control then tlev=1 end + if train.hud_lzb_effect_tmr then + tlev=1 end - return table.concat(st, "\n") -end - -function advtrains.hud.sevenseg(digit, x, y, w, h, pc, nc) + local ht = {"[combine:440x110:0,0=(advtrains_hud_bg.png^[resize\\:440x110)"} local st = {} - local sformat = string.format - local f = "%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d%s)" - local segs = { - {h, 0, w, h}, - {0, h, h, w}, - {w+h, h, h, w}, - {h, w+h, w, h}, - {0, w+2*h, h, w}, - {w+h, w+2*h, h, w}, - {h, 2*(w+h), w, h}} - local trans = { - [0] = {true, true, true, false, true, true, true}, - [1] = {false, false, true, false, false, true, false}, - [2] = {true, false, true, true, true, false, true}, - [3] = {true, false, true, true, false, true, true}, - [4] = {false, true, true, true, false, true, false}, - [5] = {true, true, false, true, false, true, true}, - [6] = {true, true, false, true, true, true, true}, - [7] = {true, false, true, false, false, true, false}, - [8] = {true, true, true, true, true, true, true}, - [9] = {true, true, true, true, false, true, true} - } - local ent = trans[digit or 10] - if not ent then return end - for i = 1, 7, 1 do - if ent[i] then - local s = segs[i] - st[#st+1] = sformat(f, x+s[1], y+s[2], s[3], s[4], pc and "^[colorize\\:"..pc or "") - elseif nc then - local s = segs[i] - st[#st+1] = sformat(f, x+s[1], y+s[2], s[3], s[4], "^[colorize\\:"..nc) - end - end - return table.concat(st,":") -end - -function advtrains.hud.number(number, padding, x, y, w, h, margin, pcolor, ncolor) - local st = {} - local number = math.abs(math.floor(number or 0)) - if not padding then - if number == 0 then - padding = 0 - else - padding = math.floor(math.log10(number)) + if train.debug then st = {train.debug} end + + -- seven-segment display + local function sevenseg(digit, x, y, w, h, m) + --[[ + -1- + 2 3 + -4- + 5 6 + -7- + ]] + local segs = { + {h, 0, w, h}, + {0, h, h, w}, + {w+h, h, h, w}, + {h, w+h, w, h}, + {0, w+2*h, h, w}, + {w+h, w+2*h, h, w}, + {h, 2*(w+h), w, h}} + local trans = { + [0] = {true, true, true, false, true, true, true}, + [1] = {false, false, true, false, false, true, false}, + [2] = {true, false, true, true, true, false, true}, + [3] = {true, false, true, true, false, true, true}, + [4] = {false, true, true, true, false, true, false}, + [5] = {true, true, false, true, false, true, true}, + [6] = {true, true, false, true, true, true, true}, + [7] = {true, false, true, false, false, true, false}, + [8] = {true, true, true, true, true, true, true}, + [9] = {true, true, true, true, false, true, true}} + local ent = trans[digit or 10] + if not ent then return end + for i = 1, 7, 1 do + if ent[i] then + local s = segs[i] + ht[#ht+1] = sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d^%s)",x+s[1], y+s[2], s[3], s[4], m) + end end - else - padding = padding - 1 end - for i = padding, 0, -1 do - st[#st+1] = advtrains.hud.sevenseg(math.floor(number/10^i)%10, x+(padding-i)*(w+2*h+margin), y, w, h, pcolor, ncolor) + + -- lever + ht[#ht+1] = "275,10=(advtrains_hud_bg.png^[colorize\\:cyan^[resize\\:5x18)" + ht[#ht+1] = "275,28=(advtrains_hud_bg.png^[colorize\\:white^[resize\\:5x18)" + ht[#ht+1] = "275,46=(advtrains_hud_bg.png^[colorize\\:orange^[resize\\:5x36)" + ht[#ht+1] = "275,82=(advtrains_hud_bg.png^[colorize\\:red^[resize\\:5x18)" + ht[#ht+1] = "292,16=(advtrains_hud_bg.png^[colorize\\:darkslategray^[resize\\:6x78)" + ht[#ht+1] = sformat("280,%s=(advtrains_hud_bg.png^[colorize\\:gray^[resize\\:30x18)",18*(4-tlev)+10) + -- reverser + ht[#ht+1] = sformat("245,10=(advtrains_hud_arrow.png^[transformFY%s)", flip and "" or "^[multiply\\:cyan") + ht[#ht+1] = sformat("245,85=(advtrains_hud_arrow.png%s)", flip and "^[multiply\\:orange" or "") + ht[#ht+1] = "250,35=(advtrains_hud_bg.png^[colorize\\:darkslategray^[resize\\:5x40)" + ht[#ht+1] = sformat("240,%s=(advtrains_hud_bg.png^[resize\\:25x15^[colorize\\:gray)", flip and 65 or 30) + -- train control/safety indication + if train.tarvelocity or train.atc_command then + ht[#ht+1] = "10,10=(advtrains_hud_atc.png^[resize\\:30x30^[multiply\\:cyan)" end - return table.concat(st,":") -end - -function advtrains.hud.leverof(train) - if not train then return nil end - local tlev=train.lever or 3 - if train.velocity==0 and not train.active_control then tlev=1 end if train.hud_lzb_effect_tmr then - tlev=1 + ht[#ht+1] = "50,10=(advtrains_hud_lzb.png^[resize\\:30x30^[multiply\\:red)" end - return tlev -end - -function advtrains.hud.lever(lever, x, y, w1, w2, height) - local sformat = string.format - local hs = height/5 - local st = { - sformat("%d,%d=(advtrains_hud_bg.png^[colorize\\:cyan^[resize\\:%dx%d)", x, y, w1, hs), - sformat("%d,%d=(advtrains_hud_bg.png^[colorize\\:white^[resize\\:%dx%d)", x, y+hs, w1, hs), - sformat("%d,%d=(advtrains_hud_bg.png^[colorize\\:orange^[resize\\:%dx%d)", x, y+hs*2, w1, hs*2), - sformat("%d,%d=(advtrains_hud_bg.png^[colorize\\:red^[resize\\:%dx%d)", x, y+hs*4, w1, hs), - sformat("%d,%d=(advtrains_hud_bg.png^[colorize\\:darkslategray^[resize\\:%dx%d)", x+(w2+w1)/2, y+(hs-w1)/2, w1, hs*4+2*w1), - sformat("%d,%d=(advtrains_hud_bg.png^[colorize\\:gray^[resize\\:%dx%d)", x+w1, y+(4-lever)*hs, w2, hs), - } - return table.concat(st, ":") -end - -function advtrains.hud.door(o, x, y, w, h, m) - local sformat = string.format - local dw = (w-m*2)/4 - local ww = w-(dw+m)*2 - local wh = h/2-m - local st = { - sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d^[colorize\\:white)", x+dw+m, y, ww, h), - sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d)", x+dw+m*2, y+m, ww-2*m, wh), - sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d^[colorize\\:%s)", x, y, dw, h, o==-1 and "white" or "darkslategray"), - sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d)", x+m, y+m, dw-2*m, wh), - sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d^[colorize\\:%s)", x+w-dw, y, dw, h, o==1 and "white" or "darkslategray"), - sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d)", x+w-dw+m, y+m, dw-2*m, wh), - } - return table.concat(st, ":") -end - -function advtrains.hud.speed_horizontal(train, x, y, w, h, m) - local sformat = string.format - local barw, barh = (w-m*19)/20, h-10 - local max = train.max_speed or 10 - local res = train.speed_restriction - local vel = advtrains.abs_ceil(train.velocity) - local tar = train.tarvelocity - local st = {} - for i = 1, vel do - st[i] = sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d^[colorize\\:white)", x+(i-1)*(barw+m), y+5, barw, barh) + if train.is_shunt then + ht[#ht+1] = "90,10=(advtrains_hud_shunt.png^[resize\\:30x30^[multiply\\:orange)" end - for i = vel+1, max do - st[i] = sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d^[colorize\\:darkslategray)", x+(i-1)*(barw+m), y+5, barw, barh) + -- door + ht[#ht+1] = "187,10=(advtrains_hud_bg.png^[resize\\:26x30^[colorize\\:white)" + ht[#ht+1] = "189,12=(advtrains_hud_bg.png^[resize\\:22x11)" + ht[#ht+1] = sformat("170,10=(advtrains_hud_bg.png^[resize\\:15x30^[colorize\\:%s)", train.door_open==-1 and "white" or "darkslategray") + ht[#ht+1] = "172,12=(advtrains_hud_bg.png^[resize\\:11x11)" + ht[#ht+1] = sformat("215,10=(advtrains_hud_bg.png^[resize\\:15x30^[colorize\\:%s)", train.door_open==1 and "white" or "darkslategray") + ht[#ht+1] = "217,12=(advtrains_hud_bg.png^[resize\\:11x11)" + -- speed indication(s) + sevenseg(math.floor(vel/10), 320, 10, 30, 10, "[colorize\\:red\\:255") + sevenseg(vel%10, 380, 10, 30, 10, "[colorize\\:red\\:255") + for i = 1, vel, 1 do + ht[#ht+1] = sformat("%d,65=(advtrains_hud_bg.png^[resize\\:8x20^[colorize\\:white)", i*11-1) end - if res and res > 0 and res < max then - st[#st+1] = sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d^[colorize\\:red)", x+res*(barw+m)-m, y, m, h) + for i = max+1, 20, 1 do + ht[#ht+1] = sformat("%d,65=(advtrains_hud_bg.png^[resize\\:8x20^[colorize\\:darkslategray)", i*11-1) end - if tar then - local tc = math.min(tar, max) - st[#st+1] = sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d^[colorize\\:cyan)", x+tc*(barw+m)-m, y+5+barh, m, 5) + if res and res > 0 then + ht[#ht+1] = sformat("%d,60=(advtrains_hud_bg.png^[resize\\:3x30^[colorize\\:red\\:255)", 7+res*11) + end + if train.tarvelocity then + ht[#ht+1] = sformat("%d,85=(advtrains_hud_arrow.png^[multiply\\:cyan^[transformFY^[makealpha\\:#000000)", 1+train.tarvelocity*11) end - return table.concat(st, ":") -end - -function advtrains.hud.dgraphical(train, flip) - if not train then return "" end - local sformat = string.format -- this appears to be faster than (...):format - - local max = train.max_speed or 10 - local vel = advtrains.abs_ceil(train.velocity) - local res = train.speed_restriction - local tar = train.tarvelocity - - local ht = {"[combine:450x120:0,0=(advtrains_hud_bg.png^[resize\\:450x120)"} - if train.debug then st = {train.debug} end - - ht[#ht+1] = advtrains.hud.lever(advtrains.hud.leverof(train), 275, 10, 5, 30, 100) - -- reverser - ht[#ht+1] = sformat("245,10=(advtrains_hud_arrow.png^[transformFY%s)", flip and "" or "^[multiply\\:cyan") - ht[#ht+1] = sformat("245,95=(advtrains_hud_arrow.png%s)", flip and "^[multiply\\:orange" or "") - ht[#ht+1] = "250,35=(advtrains_hud_bg.png^[colorize\\:darkslategray^[resize\\:5x50)" - ht[#ht+1] = sformat("240,%s=(advtrains_hud_bg.png^[resize\\:25x15^[colorize\\:gray)", flip and 75 or 30) - -- first row - ht[#ht+1] = sformat("10,10=(advtrains_hud_ars.png^[multiply\\:%s)", (not (advtrains.interlocking and train.ars_disable)) and "cyan" or "darkslategray") - ht[#ht+1] = sformat("50,10=(advtrains_hud_lzb.png^[multiply\\:%s)", train.hud_lzb_effect_tmr and "red" or "darkslategray") - ht[#ht+1] = sformat("90,10=(advtrains_hud_shunt.png^[multiply\\:%s)", train.is_shunt and "orange" or "darkslategray") - ht[#ht+1] = sformat("145,10=(advtrains_hud_autocouple.png^[multiply\\:%s)", train.autocouple and "orange" or "darkslategray") - -- second row local lzb = train.lzb - local noupcoming = true if lzb and lzb.checkpoints then local oc = lzb.checkpoints for i = 1, #oc do local spd = oc[i].speed + spd = advtrains.speed.min(spd, train.speed_restriction) + if spd == -1 then spd = nil end local c = not spd and "lime" or (type(spd) == "number" and (spd == 0) and "red" or "orange") or nil if c then - if spd then - ht[#ht+1] = advtrains.hud.number(spd, 2, 10, 45, 5, 2, 2, c, "darkslategray") - ht[#ht+1] = sformat("10,67=(advtrains_hud_ms.png^[multiply\\:%s)", c) - else - ht[#ht+1] = advtrains.hud.number(88, 2, 10, 45, 5, 2, 2, "darkslategray") - ht[#ht+1] = "10,67=(advtrains_hud_ms.png^[multiply\\:darkslategray)" + ht[#ht+1] = sformat("130,10=(advtrains_hud_bg.png^[resize\\:30x5^[colorize\\:%s)",c) + ht[#ht+1] = sformat("130,35=(advtrains_hud_bg.png^[resize\\:30x5^[colorize\\:%s)",c) + if spd and spd~=0 then + ht[#ht+1] = sformat("%d,50=(advtrains_hud_arrow.png^[multiply\\:red^[makealpha\\:#000000)", 1+spd*11) end local floor = math.floor local dist = floor(((oc[i].index or train.index)-train.index)) dist = math.max(0, math.min(999, dist)) - ht[#ht+1] = advtrains.hud.number(dist, 3, 35, 45, 9, 4, 2, c, "darkslategray") - noupcoming = false + for j = 1, 3, 1 do + sevenseg(floor((dist/10^(3-j))%10), 119+j*11, 18, 4, 2, "[colorize\\:"..c) + end break end end end - if noupcoming then - ht[#ht+1] = advtrains.hud.number(88, 2, 10, 45, 5, 2, 2, "darkslategray") - ht[#ht+1] = "10,67=(advtrains_hud_ms.png^[multiply\\:darkslategray)" - ht[#ht+1] = advtrains.hud.number(888, 3, 35, 45, 9, 4, 2, "darkslategray") + + if res and res == 0 then + st[#st+1] = attrans("OVERRUN RED SIGNAL! Examine situation and reverse train to move again.") end - ht[#ht+1] = sformat("100,45=(advtrains_hud_atc.png^[multiply\\:%s)", (train.tarvelocity or train.atc_command) and "cyan" or "darkslategray") - if tar and tar >= 0 then - local tc = math.min(max, tar) - ht[#ht+1] = advtrains.hud.number(tar, 2, 135, 45, 5, 2, 2, "cyan", "darkslategray") - ht[#ht+1] = "135,67=(advtrains_hud_ms.png^[multiply\\:cyan)" - else - ht[#ht+1] = advtrains.hud.number(88, 2, 135, 45, 5, 2, 2, "darkslategray") - ht[#ht+1] = "135,67=(advtrains_hud_ms.png^[multiply\\:darkslategray)" + + if train.atc_command then + st[#st+1] = sformat("ATC: %s%s", train.atc_delay and advtrains.abs_ceil(train.atc_delay).."s " or "", train.atc_command or "") end - ht[#ht+1] = advtrains.hud.door(train.door_open, 167, 45, 60, 30, 2) - -- speed indications - ht[#ht+1] = advtrains.hud.number(vel, 2, 320, 10, 35, 10, 10, "red") - ht[#ht+1] = advtrains.hud.speed_horizontal(train, 10, 80, 217, 30, 3) - return table.concat(ht,":"), 120 + return table.concat(st,"\n"), table.concat(ht,":") end -local texture = advtrains.hud.dgraphical { -- dummy train object to demonstrate the train hud - max_speed = 17, speed_restriction = 15, velocity = 14, tarvelocity = 12, +local _, texture = advtrains.hud_train_format { -- dummy train object to demonstrate the train hud + max_speed = 15, speed_restriction = 15, velocity = 15, tarvelocity = 12, active_control = true, lever = 3, ctrl = {lzb = true}, is_shunt = true, - door_open = 1, lzb = {checkpoints = {{speed=6, index=125.7}}}, index = 0, - hud_lzb_effect_tmr = true, autocouple = true, + door_open = 1, lzb = {oncoming = {{spd=6, idx=125.7}}}, index = 0, } minetest.register_node("advtrains:hud_demo",{ |