diff --git a/code/modules/tram/tram.dm b/code/modules/tram/tram.dm index d706f38946e..8137450331d 100644 --- a/code/modules/tram/tram.dm +++ b/code/modules/tram/tram.dm @@ -2,7 +2,7 @@ name = "" desc = "tram controller" anchored = 1 - simulated = 0 + var/list/tram_floors = list() var/list/tram_walls = list() var/list/controllers = list() @@ -14,57 +14,66 @@ var/list/stored_anchor = list() /obj/tram/tram_controller/New() - init_floors() - init_walls() + init_floors() //Search and link floors + init_walls() //Search and link walls spawn(1) - init_tram() - init_controllers() - gen_collision() - processing_objects.Add(src) + 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_tram() //Update combine to account for new mobs and/or objects + +/obj/tram/tram_controller/proc/update_tram() + tram.Cut() + init_tram() + +//INITIALIZATION PROCS /obj/tram/tram_controller/proc/init_floors() var/turf/T = get_turf(src) if(!T) return - var/obj/tram/floor/TTF = locate(/obj/tram/floor in T) - if(istype(TTF)) add_floor(TTF) + var/obj/tram/floor/TTF = locate(/obj/tram/floor) in T + if(istype(TTF)) add_floor(TTF) //Find and link floor on controller turf for(var/cdir in cardinal) var/turf/T2 = get_step(T,cdir) var/obj/tram/floor/TF = locate(/obj/tram/floor) in T2 if(istype(TF)) if(TF in tram_floors) continue - add_floor(TF) + add_floor(TF) //Find and link all cardinally surrounding floors spawn(1) - TF.spread_floors() + TF.spread_floors() //Do the same thing over again from the floor itself /obj/tram/tram_controller/proc/init_walls() var/turf/T = get_turf(src) if(!T) return if(!tram_floors.len) return - var/obj/tram/floor/TTW = locate(/obj/tram/wall in T) + var/obj/tram/floor/TTW = locate(/obj/tram/wall) in T //Find and link wall on controller turf if(istype(TTW)) add_wall(TTW) for(var/obj/tram/floor/TF in tram_floors) for(var/cdir in cardinal) var/obj/tram/wall/TW = locate(/obj/tram/wall) in get_step(TF,cdir) if(istype(TW)) if(TW in tram_walls) continue - add_wall(TW) + add_wall(TW) //Find and link all cardinally surrounding walls spawn(1) - TW.spread_walls() + TW.spread_walls() //Do the same thing over again from the wall itself /obj/tram/tram_controller/proc/init_tram() - tram = tram_floors + tram_walls + tram = tram_floors + tram_walls //Tram is everything that makes up the tram for(var/obj/tram/OT in tram) var/turf/T = get_turf(OT) - for(var/atom/movable/AM in T) + for(var/atom/movable/AM in T) //Including anything inside of it if(AM in tram) continue tram += AM /obj/tram/tram_controller/proc/init_controllers() for(var/obj/tram/controlpad/CCP in tram) - add_controller(CCP) + add_controller(CCP) //Control pad not necessary until now, easiest to search through tram + +//SYNC PROCS +//These procs are used for un/linking floors, walls, and control pads to the central tram controller /obj/tram/tram_controller/proc/add_floor(var/obj/tram/floor/TF) if(!istype(TF)) return @@ -78,8 +87,6 @@ tram_floors -= TF TF.controller = null - - /obj/tram/tram_controller/proc/add_wall(var/obj/tram/wall/TW) if(!istype(TW)) return if(TW in tram_walls) return @@ -92,8 +99,6 @@ tram_walls -= TW TW.controller = null - - /obj/tram/tram_controller/proc/add_controller(var/obj/tram/controlpad/CCT) if(!istype(CCT)) return if(CCT in controllers) return @@ -106,7 +111,9 @@ controllers -= CCT CCT.tram_linked = null - +//COLLISION & MOVEMENT +//Collision detection system to prevent going through walls +//Tram does not use built-in byond Move(), it uses it's own logic and then forceMove()s itself. /obj/tram/tram_controller/proc/gen_collision() collide_list.Cut() @@ -124,75 +131,12 @@ collisions += cdir collide_list = collisions -/obj/tram/tram_controller/proc/update_tram() - tram.Cut() - init_tram() - /obj/tram/tram_controller/proc/handle_move(var/dir) - gen_collision() - if(dir in collide_list) + gen_collision() //Look for collisions + if(dir in collide_list) //Prevent moving if there are collisions in that direction return 0 for(var/atom/movable/A in tram) var/turf/T = get_step(A,dir) - A.forceMove(T) - gen_collision() - return 1 - -/obj/tram/floor - name = "floor" - icon = 'icons/turf/floors.dmi' - icon_state = "floor" - var/obj/tram/tram_controller/controller - anchored = 1 - -/obj/tram/floor/proc/spread_floors() - var/turf/T = get_turf(src) - if(!T) return - if(!controller) return - for(var/cdir in cardinal) - var/turf/T2 = get_step(T,cdir) - var/obj/tram/floor/TF = locate(/obj/tram/floor) in T2 - if(istype(TF)) - if(TF in controller.tram_floors) continue - controller.add_floor(TF) - TF.spread_floors() - -/obj/tram/wall - name = "reinforced wall" - desc = "A huge chunk of reinforced metal used to seperate rooms." - icon = 'icons/turf/walls.dmi' - icon_state = "r_wall" - var/obj/tram/tram_controller/controller - anchored = 1 - -/obj/tram/wall/proc/spread_walls() - var/turf/T = get_turf(src) - if(!T) return - if(!controller) return - for(var/cdir in cardinal) - var/turf/T2 = get_step(T,cdir) - var/obj/tram/wall/TW = locate(/obj/tram/wall) in T2 - if(istype(TW)) - if(TW in controller.tram_walls) continue - controller.add_wall(TW) - TW.spread_walls() - -/obj/tram/controlpad - name = "tram controller interface" - desc = "Controls the tram." - icon = 'icons/obj/airlock_machines.dmi' - icon_state = "airlock_control_standby" - var/obj/tram/tram_controller/tram_linked - -/obj/tram/controlpad/attack_hand(var/mob/user) - if(!tram_linked) return - var/dat = "Tram Controller" - for(var/cdir in cardinal) - dat += "
Move to: [cdir]" - 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 + A.forceMove(T) //Move everything inside the tram and the tram itself manually + 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 new file mode 100644 index 00000000000..33cc7807bbb --- /dev/null +++ b/code/modules/tram/tram_control_pad.dm @@ -0,0 +1,19 @@ +/obj/tram/controlpad + name = "tram controller interface" + desc = "Controls the tram." + icon = 'icons/obj/airlock_machines.dmi' + icon_state = "airlock_control_standby" + var/obj/tram/tram_controller/tram_linked + +/obj/tram/controlpad/attack_hand(var/mob/user) + if(!tram_linked) return + var/dat = "Tram Controller" + for(var/cdir in cardinal) + dat += "
Move to: [cdir]" + 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 diff --git a/code/modules/tram/tram_floor.dm b/code/modules/tram/tram_floor.dm new file mode 100644 index 00000000000..245136d3c95 --- /dev/null +++ b/code/modules/tram/tram_floor.dm @@ -0,0 +1,18 @@ +/obj/tram/floor + name = "floor" + icon = 'icons/turf/floors.dmi' + icon_state = "floor" + var/obj/tram/tram_controller/controller + anchored = 1 + +/obj/tram/floor/proc/spread_floors() + var/turf/T = get_turf(src) + if(!T) return + if(!controller) return + for(var/cdir in cardinal) + var/turf/T2 = get_step(T,cdir) + var/obj/tram/floor/TF = locate(/obj/tram/floor) in T2 + if(istype(TF)) + if(TF in controller.tram_floors) continue + controller.add_floor(TF) + TF.spread_floors() \ No newline at end of file diff --git a/code/modules/tram/tram_wall.dm b/code/modules/tram/tram_wall.dm new file mode 100644 index 00000000000..ead4f52c5f6 --- /dev/null +++ b/code/modules/tram/tram_wall.dm @@ -0,0 +1,21 @@ +/obj/tram/wall + name = "reinforced wall" + desc = "A huge chunk of reinforced metal used to seperate rooms." + icon = 'icons/turf/walls.dmi' + icon_state = "r_wall" + var/obj/tram/tram_controller/controller + anchored = 1 + density = 1 + opacity = 1 + +/obj/tram/wall/proc/spread_walls() + var/turf/T = get_turf(src) + if(!T) return + if(!controller) return + for(var/cdir in cardinal) + var/turf/T2 = get_step(T,cdir) + var/obj/tram/wall/TW = locate(/obj/tram/wall) in T2 + if(istype(TW)) + if(TW in controller.tram_walls) continue + controller.add_wall(TW) + TW.spread_walls() \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index 3c5efbb2c02..a8aca9daaf6 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1755,6 +1755,9 @@ #include "code\modules\telesci\telepad.dm" #include "code\modules\telesci\telesci_computer.dm" #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_wall.dm" #include "code\modules\vehicle\vehicle.dm" #include "code\modules\vehicle\train\train.dm" #include "code\modules\vehicle\train\trains\ambulance.dm"