aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authororwell96 <orwell@bleipb.de>2021-02-10 18:27:09 +0100
committerorwell96 <orwell@bleipb.de>2021-02-10 18:27:09 +0100
commit96bb7d5e7edfde49f639f797ed71087d70470386 (patch)
treebfbd786b2a5e8449391770ca772144a281cc923d
parent0859e50c6ea514dd5329ecc12581e0b01d1c981e (diff)
downloadadvtrains-96bb7d5e7edfde49f639f797ed71087d70470386.tar.gz
advtrains-96bb7d5e7edfde49f639f797ed71087d70470386.tar.bz2
advtrains-96bb7d5e7edfde49f639f797ed71087d70470386.zip
LZB: don't look ahead past red signal
-rw-r--r--advtrains/lzb.lua16
1 files changed, 13 insertions, 3 deletions
diff --git a/advtrains/lzb.lua b/advtrains/lzb.lua
index 15d217e..f24ab4b 100644
--- a/advtrains/lzb.lua
+++ b/advtrains/lzb.lua
@@ -75,6 +75,12 @@ local function resolve_latest_lzbdata(ckp, index)
end
local function look_ahead(id, train)
+ local lzb = train.lzb
+ if lzb.zero_checkpoint then
+ -- if the checkpoints list contains a zero checkpoint, don't look ahead
+ -- in order to not trigger approach callbacks on the wrong path
+ return
+ end
local acc = advtrains.get_acceleration(train, 1)
-- worst-case: the starting point is maximum speed
@@ -88,7 +94,6 @@ local function look_ahead(id, train)
--local aware_i = advtrains.path_get_index_by_offset(train, brake_i, AWARE_ZONE)
- local lzb = train.lzb
local trav = lzb.trav_index
-- retrieve latest lzbdata
if not lzb.trav_lzbdata then
@@ -99,7 +104,7 @@ local function look_ahead(id, train)
--previous position was off track, do not scan any further
end
- while trav <= brake_i do
+ while trav <= brake_i and not lzb.zero_checkpoint do
local pos = advtrains.path_get(train, trav)
-- check offtrack
if trav - 1 == train.path_trk_f then
@@ -147,6 +152,11 @@ local function apply_checkpoint_to_path(train, checkpoint)
return
end
atprint("LZB: applying checkpoint: i=",checkpoint.index,"s=",checkpoint.speed)
+
+ if checkpoint.speed == 0 then
+ train.lzb.zero_checkpoint = true
+ end
+
-- make sure path exists until checkpoint
local pos = advtrains.path_get(train, checkpoint.index)
@@ -172,7 +182,6 @@ local function apply_checkpoint_to_path(train, checkpoint)
c_speed = math.sqrt( (c_speed * c_speed) - (2 * brake_accel * eldist) )
index = index - 1
end
-
end
--[[
@@ -209,6 +218,7 @@ function advtrains.lzb_invalidate_ahead(train, start_idx)
train.lzb.trav_lzbdata = nil
-- re-apply all checkpoints to path_speed
train.path_speed = {}
+ train.lzb.zero_checkpoint = false
for _,ckp in ipairs(train.lzb.checkpoints) do
apply_checkpoint_to_path(train, ckp)
end
/a> 211 212 213
--trainhud.lua: holds all the code for train controlling

advtrains.hud = {}
advtrains.hhud = {}

minetest.register_on_leaveplayer(function(player)
advtrains.hud[player:get_player_name()] = nil
advtrains.hhud[player:get_player_name()] = nil
end)

local mletter={[1]="F", [-1]="R", [0]="N"}
local doorstr={[-1]="|<>| >|<", [0]=">|< >|<", [1]=">|< |<>|"}

function advtrains.on_control_change(pc, train, flip)
   	local maxspeed = train.max_speed or 10
	if pc.sneak then
		if pc.up then
			train.tarvelocity = maxspeed
		end
		if pc.down then
			train.tarvelocity = 0
		end
		if pc.left then
			train.tarvelocity = 4
		end
		if pc.right then
			train.tarvelocity = 8
		end
		--[[if pc.jump then
			train.brake = true
			--0: released, 1: brake and pressed, 2: released and brake, 3: pressed and brake
			if not train.brake_hold_state or train.brake_hold_state==0 then
				train.brake_hold_state = 1
			elseif train.brake_hold_state==2 then
				train.brake_hold_state = 3
			end
		elseif train.brake_hold_state==1 then
			train.brake_hold_state = 2
		elseif train.brake_hold_state==3 then
			train.brake = false
			train.brake_hold_state = 0
		end]]
		--shift+use:see wagons.lua
	else
		local act=false
		if pc.jump then
			train.ctrl.user = 1
			act=true
		end
		-- If atc command set, only "Jump" key can clear command. To prevent accidental control.
		if train.tarvelocity or train.atc_command then
			return
		end
		if pc.up then
		   train.ctrl.user=4
		   act=true
		end
		if pc.down then
			if train.velocity>0 then
				if pc.jump then
					train.ctrl.user = 0
				else
					train.ctrl.user = 2
				end
				act=true
			else
				advtrains.invert_train(train.id)
				advtrains.atc.train_reset_command(train)
			end
		end
		if pc.left then
			if train.door_open ~= 0 then
				train.door_open = 0
			else
				train.door_open = -1
			end
		end
		if pc.right then
			if train.door_open ~= 0 then
				train.door_open = 0
			else
				train.door_open = 1
			end
		end
		if not act then
			train.ctrl.user = nil
		end
	end
end
function advtrains.update_driver_hud(pname, train, flip)
	local inside=train.text_inside or ""
	advtrains.set_trainhud(pname, inside.."\n"..advtrains.hud_train_format(train, flip))
end
function advtrains.clear_driver_hud(pname)
	advtrains.set_trainhud(pname, "")
end

function advtrains.set_trainhud(name, text)
	local hud = advtrains.hud[name]
	local player=minetest.get_player_by_name(name)
	if not player then
	   return
	end
	if not hud then
		hud = {}
		advtrains.hud[name] = hud
		hud.id = player:hud_add({
			hud_elem_type = "text",
			name = "ADVTRAINS",
			number = 0xFFFFFF,
			position = {x=0.5, y=0.7},
			offset = {x=0, y=0},
			text = text,
			scale = {x=200, y=60},
			alignment = {x=0, y=0},
		})
		hud.oldText=text
		return
	elseif hud.oldText ~= text then
		player:hud_change(hud.id, "text", text)
		hud.oldText=text
	end
end
function advtrains.set_help_hud(name, text)
	local hud = advtrains.hhud[name]
	local player=minetest.get_player_by_name(name)
	if not player then
	   return
	end
	if not hud then
		hud = {}
		advtrains.hhud[name] = hud
		hud.id = player:hud_add({
			hud_elem_type = "text",
			name = "ADVTRAINS_HELP",
			number = 0xFFFFFF,
			position = {x=1, y=0.3},
			offset = {x=0, y=0},
			text = text,
			scale = {x=200, y=60},
			alignment = {x=1, y=0},
		})
		hud.oldText=text
		return
	elseif hud.oldText ~= text then
		player:hud_change(hud.id, "text", text)
		hud.oldText=text
	end
end

--train.lever:
--Speed control lever in train, for new train control system.
--[[
Value	Disp	Control	Meaning
0		BB		S+Space	Emergency Brake
1		B		Space	Normal Brake
2		-		S		Roll
3		o		<none>	Stay at speed
4		+		W		Accelerate
]]

function advtrains.hud_train_format(train, flip)
	local fct=flip and -1 or 1
	if not train then return "" end
	
	local max = train.max_speed or 10
	local res = train.speed_restriction or max
	local vel = advtrains.abs_ceil(train.velocity)
	local vel_kmh=advtrains.abs_ceil(advtrains.ms_to_kmh(train.velocity))
	
	local levers = "B - o +"
	local tlev=train.lever
	if train.velocity==0 and not train.active_control then tlev=1 end
	if tlev == 0 then levers = ">BB< - o +" end
	if tlev == 1 then levers = ">B< - o +" end
	if tlev == 2 then levers = "B >-< o +" end
	if tlev == 3 then levers = "B - >o< +" end
	if tlev == 4 then levers = "B - o >+<" end
	
	local topLine, firstLine
	
	local secondLine
	if train.tarvelocity or train.atc_command then
		local b="   "
		local tvels=""
		if train.tarvelocity then
			local tvel = advtrains.abs_ceil(train.tarvelocity)
			tvels = "|"..string.rep("+", tvel)..string.rep("_", max-tvel)
		end
		if train.atc_brake_target then
			b="-B-"
		end
		local ad = ""
		if train.atc_delay then
			ad = " "..advtrains.abs_ceil(train.atc_delay).."s "
		end
		secondLine="ATC"..b..": "..tvels..ad..(train.atc_command or "")
	else
		secondLine = "Manual operation"
		if train.ctrl.lzb then
			secondLine = "-!- Safety override -!-"
		end
	end
	local shtind = train.is_shunt and "S" or ">"
	
	topLine="  ["..mletter[fct].."]  {"..levers.."} "..doorstr[(train.door_open or 0) * fct].."  "..(train.line and "L: "..train.line or "")
	firstLine=attrans("Speed:").." |"..string.rep("+", vel)..string.rep("_", res-vel).."|"..string.rep("_", max-res)..shtind.." "..vel_kmh.." km/h"
	if train.speed_restriction == 0 then
		firstLine = "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
	end
	
	return (train.debug or "").."\n"..topLine.."\n"..firstLine.."\n"..secondLine
end