aboutsummaryrefslogtreecommitdiff
path: root/advtrains_interlocking/signal_aspect_ui.lua
blob: d5a7543b23673f39b43535f68f1bccab88aa296c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
local F = advtrains.formspec
local players_aspsel = {}

local function make_signal_aspect_selector_t1(suppasp, purpose, isasp)
	local form = {"size[7,7]"}
	form[#form+1] = F.S_label(0.5, 0.5, "Select signal aspect")
	form[#form+1] = F.label(0.5, 1, purpose)

	form[#form+1] = F.S_label(0.5, 1.5, "Main aspect")
	local entries = {}
	local selid = 1
	for idx, spv in ipairs(suppasp.main) do
		local entry
		if isasp and spv == isasp.main then
			selid = idx
		end
		if spv == 0 then
			entry = attrans("Danger (halt)")
		elseif spv == -1 then
			entry = attrans("Continue at maximum speed")
		elseif not spv then
			entry = attrans("Continue with current speed limit")
		else
			entry = attrans("Continue with the speed limit of @1", spv)
		end
		entries[idx] = entry
	end
	form[#form+1] = F.dropdown(0.5, 2, 6, "main", entries, selid, true)

	form[#form+1] = F.S_label(0.5, 3, "Shunt aspect")
	if suppasp.shunt == nil then
		local st = 1
		if isasp and isasp.shunt then st = 2 end
		local entries = {
			attrans("No shunting"),
			attrans("Shunting allowed"),
		}
		form[#form+1] = F.dropdown(0.5, 3.5, 6, "shunt_free", entries, st, true)
	end

	form[#form+1] = F.S_label(0.5, 4.5, "Distant aspect")
	local entries = {}
	local selid = 1
	for idx, spv in ipairs(suppasp.dst) do
		local entry
		if isasp and spv == isasp.dst then
			selid = idx
		end
		if spv == 0 then
			entry = attrans("Expect to stop at the next signal")
		elseif spv == -1 then
			entry = attrans("Expect to continue at maximum speed")
		elseif not spv then
			entry = attrans("No information on distant signal")
		else
			entry = attrans("Expect to continue with a speed limit of @1", spv)
		end
		entries[idx] = entry
	end
	form[#form+1] = F.dropdown(0.5, 5, 6, "dst", entries, selid, true)

	form[#form+1] = F.S_button_exit(0.5, 6, 5, 1, "save", "Save signal aspect")
	return table.concat(form)
end

function advtrains.interlocking.show_signal_aspect_selector(pname, p_suppasp, p_purpose, callback, isasp)
	local suppasp = p_suppasp or {
		main = {0, -1},
		dst = {false},
		shunt = false,
		info = {},
	}
	local purpose = p_purpose or ""

	local form
	if true then
		form = make_signal_aspect_selector_t1(suppasp, purpose, isasp)
	end

	local token = advtrains.random_id()
	minetest.show_formspec(pname, "at_il_sigaspdia_"..token, form)
	players_aspsel[pname] = {
		suppasp = suppasp,
		callback = callback,
		token = token,
	}
end

local function usebool(sup, val, free)
	if sup == nil then
		return val == free
	else
		return sup
	end
end

local function get_aspect_from_formspec_t1(suppasp, fields)
	local maini = tonumber(fields.main)
	if not maini then return end
	local dsti = tonumber(fields.dst)
	if not dsti then return end
	return {
		main = suppasp.main[maini],
		dst = suppasp.dst[dsti],
		shunt = usebool(suppasp.shunt, fields.shunt_free, "2"),
		info = {},
	}
end

minetest.register_on_player_receive_fields(function(player, formname, fields)
	local pname = player:get_player_name()
	local psl = players_aspsel[pname]
	if psl then
		if formname == "at_il_sigaspdia_"..psl.token then
			if fields.save then
				local asp
				if true then
					asp = get_aspect_from_formspec_t1(psl.suppasp, fields)
					if asp then
						psl.callback(pname, asp)
					end
				end
			end
		else
			players_aspsel[pname] = nil
		end
	end
end)