aboutsummaryrefslogtreecommitdiff
path: root/advtrains_interlocking/signal_aspect_ui.lua
blob: 472155a18e2049acf639b3a96b74088e97560481 (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
local F = advtrains.formspec
local players_aspsel = {}

local function make_signal_aspect_selector_t1(suppasp, purpose, isasp)
	local form = {"size[7,7.5]"}
	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, 6, 1, "save", "Save signal aspect")
	return table.concat(form)
end

local function make_signal_aspect_selector_t2(suppasp, purpose, isasp)
	local form = {"size[7,4]"}
	local def = advtrains.interlocking.aspects.get_type2_definition(suppasp.group)
	if not def then
		return nil
	end
	form[#form+1] = F.S_label(0.5, 0.5, "Select signal aspect")
	form[#form+1] = F.label(0.5, 1, purpose)

	local entries = {}
	local selid = 1
	for idx, spv in ipairs(def.main) do
		if isasp and isasp.type2name == spv.name then
			selid = idx
		end
		entries[idx] = spv.label
	end
	form[#form+1] = F.dropdown(0.5, 1.5, 6, "asp", entries, selid, true)
	form[#form+1] = F.S_button_exit(0.5, 2.5, 6, 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 suppasp.type == 2 then
		form = make_signal_aspect_selector_t2(suppasp, purpose, isasp)
	else
		form = make_signal_aspect_selector_t1(suppasp, purpose, isasp)
	end
	if not form then
		return
	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

local function get_aspect_from_formspec_t2(suppasp, fields)
	local asp = advtrains.interlocking.aspects.type2main_to_type1(suppasp.group, tonumber(fields.asp))
	return asp
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
			local suppasp = psl.suppasp
			if fields.save then
				local asp
				if suppasp.type == 2 then
					asp = get_aspect_from_formspec_t2(suppasp, fields)
				else
					asp = get_aspect_from_formspec_t1(suppasp, fields)
				end
				if asp then
					psl.callback(pname, asp)
				end
			end
		else
			players_aspsel[pname] = nil
		end
	end
end)