aboutsummaryrefslogtreecommitdiff
path: root/advtrains/atc.lua
diff options
context:
space:
mode:
Diffstat (limited to 'advtrains/atc.lua')
-rw-r--r--advtrains/atc.lua294
1 files changed, 0 insertions, 294 deletions
diff --git a/advtrains/atc.lua b/advtrains/atc.lua
deleted file mode 100644
index f070b20..0000000
--- a/advtrains/atc.lua
+++ /dev/null
@@ -1,294 +0,0 @@
---atc.lua
---registers and controls the ATC system
-
-local atc={}
--- ATC persistence table
-atc.controllers = {}
---contents: {command="...", arrowconn=0-15 where arrow points}
-
-advtrains.fpath_atc=minetest.get_worldpath().."/advtrains_atc"
-local file, err = io.open(advtrains.fpath_atc, "r")
-if not file then
- local er=err or "Unknown Error"
- print("[advtrains]Failed loading advtrains atc save file "..er)
-else
- local tbl = minetest.deserialize(file:read("*a"))
- if type(tbl) == "table" then
- atc.controllers=tbl.controllers
- end
- file:close()
-end
-function atc.save()
- --leave space for more save data.
- local datastr = minetest.serialize({controllers = atc.controllers})
- if not datastr then
- minetest.log("error", "[advtrains] Failed to serialize trackdb data!")
- return
- end
- local file, err = io.open(advtrains.fpath_atc, "w")
- if err then
- return err
- end
- file:write(datastr)
- file:close()
-end
-
---call from advtrains.detector subprogram
-
-function atc.trigger_controller_train_enter(pos, train_id)
- atc.send_command(pos)
-end
-
---general
-
-function atc.send_command(pos)
- local pts=minetest.pos_to_string(pos)
- if atc.controllers[pts] then
- print("Called send_command at "..pts)
- local train_id = advtrains.detector.on_node[pts]
- if train_id then
- if advtrains.trains[train_id] then
- print("send_command inside if: "..sid(train_id))
- atc.train_reset_command(train_id)
- local arrowconn=atc.controllers[pts].arrowconn
- local train=advtrains.trains[train_id]
- for index, ppos in pairs(train.path) do
- if vector.equals(advtrains.round_vector_floor_y(ppos), pos) then
- advtrains.trains[train_id].atc_arrow =
- vector.equals(
- advtrains.dirCoordSet(pos, arrowconn),
- advtrains.round_vector_floor_y(train.path[index+train.movedir])
- )
- advtrains.trains[train_id].atc_command=atc.controllers[pts].command
- print("Sending ATC Command: "..atc.controllers[pts].command)
- end
- end
- end
- end
- end
- return false
-end
-
-function atc.train_reset_command(train_id)
- advtrains.trains[train_id].atc_command=nil
- advtrains.trains[train_id].atc_delay=0
- advtrains.trains[train_id].atc_brake_target=nil
- advtrains.trains[train_id].atc_wait_finish=nil
- advtrains.trains[train_id].atc_arrow=nil
-end
-
---nodes
-local idxtrans={static=1, mesecon=2, digiline=3}
-local apn_func=function(pos)
- advtrains.reset_trackdb_position(pos)
- local meta=minetest.get_meta(pos)
- if meta then
- meta:set_string("infotext", "ATC controller, unconfigured.")
- meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta))
- end
-end
-
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_atc",
- texture_prefix="advtrains_dtrack_atc",
- models_prefix="advtrains_dtrack_detector",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_rail_atc.png",
- description="ATC controller",
- formats={},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return {
- after_place_node=apn_func,
- on_place_rail=apn_func,
- after_dig_node=function(pos)
- advtrains.invalidate_all_paths()
- advtrains.reset_trackdb_position(pos)
- local pts=minetest.pos_to_string(pos)
- atc.controllers[pts]=nil
- end,
- on_receive_fields = function(pos, formname, fields, player)
- if minetest.is_protected(pos, player:get_player_name()) then
- minetest.chat_send_player(player:get_player_name(), "This position is protected!")
- return
- end
- local meta=minetest.get_meta(pos)
- if meta then
- if not fields.save then
- --maybe only the dropdown changed
- if fields.mode then
- meta:set_string("mode", idxtrans[fields.mode])
- meta:set_string("infotext", "ATC controller, mode "..fields.mode.."\n"..( fields.mode=="digiline" and "Channel: "..meta:get_string("channel") or "Command: "..meta:get_string("command") ) )
- meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta))
- end
- return
- end
- meta:set_string("mode", idxtrans[fields.mode])
- meta:set_string("command", fields.command)
- meta:set_string("command_on", fields.command_on)
- meta:set_string("channel", fields.channel)
- meta:set_string("infotext", "ATC controller, mode "..fields.mode.."\n"..( fields.mode=="digiline" and "Channel: "..meta:get_string("channel") or "Command: "..meta:get_string("command") ) )
- meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta))
-
- local pts=minetest.pos_to_string(pos)
- local _, conn1=advtrains.get_rail_info_at(pos, advtrains.all_tracktypes)
- atc.controllers[pts]={command=fields.command, arrowconn=conn1}
- atc.send_command(pos)
- end
- end,
- }
- end
-}, advtrains.trackpresets.t_30deg_straightonly)
-
-
-function atc.get_atc_controller_formspec(pos, meta)
- local mode=tonumber(meta:get_string("mode")) or 1
- local command=meta:get_string("command")
- local command_on=meta:get_string("command_on")
- local channel=meta:get_string("channel")
- local formspec="size[8,6]"..
- "dropdown[0,0;3;mode;static,mesecon,digiline;"..mode.."]"
- if mode<3 then
- formspec=formspec.."field[0.5,1.5;7,1;command;Command;"..minetest.formspec_escape(command).."]"
- if tonumber(mode)==2 then
- formspec=formspec.."field[0.5,3;7,1;command_on;Command (on);"..minetest.formspec_escape(command_on).."]"
- end
- else
- formspec=formspec.."field[0.5,1.5;7,1;channel;Digiline channel;"..minetest.formspec_escape(channel).."]"
- end
- return formspec.."button_exit[0.5,4.5;7,1;save;Save]"
-end
-
---from trainlogic.lua train step
-local matchptn={
- ["SM"]=function(id, train)
- train.tarvelocity=train.max_speed
- return 2
- end,
- ["S([0-9]+)"]=function(id, train, match)
- train.tarvelocity=tonumber(match)
- return #match+1
- end,
- ["B([0-9]+)"]=function(id, train, match)
- if train.velocity>tonumber(match) then
- train.atc_brake_target=tonumber(match)
- if train.tarvelocity>train.atc_brake_target then
- train.tarvelocity=train.atc_brake_target
- end
- end
- return #match+1
- end,
- ["W"]=function(id, train)
- train.atc_wait_finish=true
- return 1
- end,
- ["D([0-9]+)"]=function(id, train, match)
- train.atc_delay=tonumber(match)
- return #match+1
- end,
- ["R"]=function(id, train)
- if train.velocity<=0 then
- train.movedir=train.movedir*-1
- train.atc_arrow = not train.atc_arrow
- else
- print("ATC Reverse command warning: didn't reverse train!")
- end
- return 1
- end,
-}
-
-function atc.execute_atc_command(id, train)
- --strip whitespaces
- local command=string.match(train.atc_command, "^%s*(.*)$")
-
-
- if string.match(command, "^%s*$") then
- train.atc_command=nil
- return
- end
- --conditional statement?
- local is_cond, cond_applies
- local cond, rest=string.match(command, "^I([%+%-])(.+)$")
- if cond then
- is_cond=true
- if cond=="+" then
- cond_applies=train.atc_arrow
- end
- if cond=="-" then
- cond_applies=not train.atc_arrow
- end
- else
- cond, compare, rest=string.match(command, "^I([<>]=?)([0-9]+)(.+)$")
- if cond and compare then
- is_cond=true
- if cond=="<" then
- cond_applies=train.velocity<tonumber(compare)
- end
- if cond==">" then
- cond_applies=train.velocity>tonumber(compare)
- end
- if cond=="<=" then
- cond_applies=train.velocity<=tonumber(compare)
- end
- if cond==">=" then
- cond_applies=train.velocity>=tonumber(compare)
- end
- end
- end
- if is_cond then
- print("Evaluating if statement: "..command)
- print("Cond: "..(cond or "nil"))
- print("Applies: "..(cond_applies and "true" or "false"))
- print("Rest: "..rest)
- --find end of conditional statement
- local nest, pos, elsepos=0, 1
- while nest>=0 do
- if pos>#rest then
- print("ATC command syntax error: I statement not closed: "..command)
- atc.train_reset_command(id)
- return
- end
- local char=string.sub(rest, pos, pos)
- if char=="I" then
- nest=nest+1
- end
- if char==";" then
- nest=nest-1
- end
- if nest==0 and char=="E" then
- elsepos=pos+0
- end
- pos=pos+1
- end
- if not elsepos then elsepos=pos-1 end
- if cond_applies then
- command=string.sub(rest, 1, elsepos-1)..string.sub(rest, pos)
- else
- command=string.sub(rest, elsepos+1, pos-2)..string.sub(rest, pos)
- end
- print("Result: "..command)
- train.atc_command=command
- atc.execute_atc_command(id, train)
- return
- else
- for pattern, func in pairs(matchptn) do
- local match=string.match(command, "^"..pattern)
- if match then
- local patlen=func(id, train, match)
-
- print("Executing: "..string.sub(command, 1, patlen))
-
- train.atc_command=string.sub(command, patlen+1)
- if train.atc_delay<=0 and not train.atc_wait_finish then
- --continue (recursive, cmds shouldn't get too long, and it's a end-recursion.)
- atc.execute_atc_command(id, train)
- end
- return
- end
- end
- end
- print("ATC command parse error: "..command)
- atc.train_reset_command(id)
-end
-
---move table to desired place
-advtrains.atc=atc