diff --git a/code/modules/tram/tram.dm b/code/modules/tram/tram.dm
index 8137450331d..b5186662811 100644
--- a/code/modules/tram/tram.dm
+++ b/code/modules/tram/tram.dm
@@ -12,23 +12,44 @@
var/list/collide_list = list()
var/list/stored_anchor = list()
+ var/last_played_rail
+
+ var/automode = 0
+ var/list/blacklist = list(/obj/tram/rail,/atom/movable/lighting_overlay)
/obj/tram/tram_controller/New()
- init_floors() //Search and link floors
- init_walls() //Search and link walls
spawn(1)
- init_tram() //Combine walls and floors and anything inside the tram
- init_controllers() //Find control pads
- gen_collision() //Generate collision system
- processing_objects.Add(src) //Add to processing objects manually
+ init_floors() //Search and link floors
+ init_walls() //Search and link walls
+ spawn(1)
+ init_tram() //Combine walls and floors and anything inside the tram
+ init_controllers() //Find control pads
+ gen_collision() //Generate collision system
+ processing_objects.Add(src) //Add to processing objects manually
/obj/tram/tram_controller/process()
update_tram() //Update combine to account for new mobs and/or objects
+ if(automode)
+ tram_rail_follow()
/obj/tram/tram_controller/proc/update_tram()
tram.Cut()
init_tram()
+/obj/tram/tram_controller/proc/tram_rail_follow()
+ var/stored_rail = null
+ for(var/obj/tram/rail/RT in get_turf(src))
+ if(RT.godir)
+ handle_move(RT.godir)
+ last_played_rail = RT
+ return
+ stored_rail = RT
+ for(var/cdir in cardinal)
+ for(var/obj/tram/rail/R in get_step(src,cdir))
+ if(R != last_played_rail)
+ handle_move(get_dir(src,R))
+ last_played_rail = stored_rail
+
//INITIALIZATION PROCS
/obj/tram/tram_controller/proc/init_floors()
@@ -66,6 +87,7 @@
var/turf/T = get_turf(OT)
for(var/atom/movable/AM in T) //Including anything inside of it
if(AM in tram) continue
+ if(is_type_in_list(AM, blacklist)) continue
tram += AM
/obj/tram/tram_controller/proc/init_controllers()
@@ -129,6 +151,17 @@
if(A.density)
if(tram.Find(A)) continue
collisions += cdir
+ for(var/obj/tram/floor/F in tram_floors)
+ for(var/cdir in cardinal)
+ var/turf/T = get_step(F, cdir)
+ if(istype(T))
+ if(T.density)
+ collisions += cdir
+ if(!T.density)
+ for(var/atom/movable/A in T)
+ if(A.density)
+ if(tram.Find(A)) continue
+ collisions += cdir
collide_list = collisions
/obj/tram/tram_controller/proc/handle_move(var/dir)
@@ -138,5 +171,7 @@
for(var/atom/movable/A in tram)
var/turf/T = get_step(A,dir)
A.forceMove(T) //Move everything inside the tram and the tram itself manually
+ if(A.light_range)
+ A.set_light()
gen_collision() //Generate collision again
return 1
\ No newline at end of file
diff --git a/code/modules/tram/tram_control_pad.dm b/code/modules/tram/tram_control_pad.dm
index 33cc7807bbb..1176ae5a3a9 100644
--- a/code/modules/tram/tram_control_pad.dm
+++ b/code/modules/tram/tram_control_pad.dm
@@ -4,16 +4,28 @@
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "airlock_control_standby"
var/obj/tram/tram_controller/tram_linked
+ var/list/cdir2readable = list("North","South",null,"East",null,null,null,"West")
/obj/tram/controlpad/attack_hand(var/mob/user)
+ usr.set_machine(src)
if(!tram_linked) return
var/dat = "Tram Controller"
- for(var/cdir in cardinal)
- dat += "
Move to: [cdir]"
+ dat += "
Tram engine: [tram_linked.automode ? "On" : "Off"]"
+ dat += "
Close console"
user << browse(dat, "window=trampad")
onclose(user,"trampad")
/obj/tram/controlpad/Topic(href, href_list)
- if(href_list["movedir"])
- var/dir = text2num(href_list["movedir"])
- tram_linked.handle_move(dir)
\ No newline at end of file
+ if(..())
+ usr << browse(null, "window=publiclibrary")
+ onclose(usr, "publiclibrary")
+ return
+
+ if(href_list["engine_toggle"])
+ tram_linked.automode = !tram_linked.automode
+ else if(href_list["close"])
+ usr.unset_machine()
+ usr << browse(null, "window=trampad")
+
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
\ No newline at end of file
diff --git a/code/modules/tram/tram_floor.dm b/code/modules/tram/tram_floor.dm
index 245136d3c95..74c863dde53 100644
--- a/code/modules/tram/tram_floor.dm
+++ b/code/modules/tram/tram_floor.dm
@@ -4,6 +4,7 @@
icon_state = "floor"
var/obj/tram/tram_controller/controller
anchored = 1
+ layer = TURF_LAYER + 0.2
/obj/tram/floor/proc/spread_floors()
var/turf/T = get_turf(src)
diff --git a/code/modules/tram/tram_rail.dm b/code/modules/tram/tram_rail.dm
new file mode 100644
index 00000000000..bf14d23fea3
--- /dev/null
+++ b/code/modules/tram/tram_rail.dm
@@ -0,0 +1,6 @@
+/obj/tram/rail
+ name = "tram rail"
+ desc = "A guiding rail for trams"
+ icon = 'icons/obj/tram/tram_rail.dmi'
+ icon_state = "rail"
+ var/godir = null
\ No newline at end of file
diff --git a/icons/obj/tram/tram_rail.dmi b/icons/obj/tram/tram_rail.dmi
new file mode 100644
index 00000000000..abe799beef2
Binary files /dev/null and b/icons/obj/tram/tram_rail.dmi differ
diff --git a/paradise.dme b/paradise.dme
index a8aca9daaf6..c5628c027ab 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1757,6 +1757,7 @@
#include "code\modules\tram\tram.dm"
#include "code\modules\tram\tram_control_pad.dm"
#include "code\modules\tram\tram_floor.dm"
+#include "code\modules\tram\tram_rail.dm"
#include "code\modules\tram\tram_wall.dm"
#include "code\modules\vehicle\vehicle.dm"
#include "code\modules\vehicle\train\train.dm"