From 2b31d1b9eeb0cb8e61e2607f2b3fc4e4bc77290a Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 18 May 2015 09:07:19 -0700 Subject: [PATCH 1/5] Initial commit of MT/TS. --- code/modules/tram/tram.dm | 198 ++++++++++++++++++++++++++++++++++++++ paradise.dme | 1 + 2 files changed, 199 insertions(+) create mode 100644 code/modules/tram/tram.dm diff --git a/code/modules/tram/tram.dm b/code/modules/tram/tram.dm new file mode 100644 index 00000000000..d706f38946e --- /dev/null +++ b/code/modules/tram/tram.dm @@ -0,0 +1,198 @@ +/obj/tram/tram_controller + name = "" + desc = "tram controller" + anchored = 1 + simulated = 0 + var/list/tram_floors = list() + var/list/tram_walls = list() + var/list/controllers = list() + + var/list/tram = list() + + var/list/collide_list = list() + + var/list/stored_anchor = list() + +/obj/tram/tram_controller/New() + init_floors() + init_walls() + spawn(1) + init_tram() + init_controllers() + gen_collision() + processing_objects.Add(src) + +/obj/tram/tram_controller/process() + update_tram() + +/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) + 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) + spawn(1) + TF.spread_floors() + +/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) + 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) + spawn(1) + TW.spread_walls() + +/obj/tram/tram_controller/proc/init_tram() + tram = tram_floors + tram_walls + for(var/obj/tram/OT in tram) + var/turf/T = get_turf(OT) + for(var/atom/movable/AM in T) + 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) + +/obj/tram/tram_controller/proc/add_floor(var/obj/tram/floor/TF) + if(!istype(TF)) return + if(TF in tram_floors) return + tram_floors += TF + TF.controller = src + +/obj/tram/tram_controller/proc/remove_floor(var/obj/tram/floor/TF) + if(!istype(TF)) return + if(TF in tram_floors) + 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 + tram_walls += TW + TW.controller = src + +/obj/tram/tram_controller/proc/remove_wall(var/obj/tram/wall/TW) + if(!istype(TW)) return + if(TW in tram_walls) + 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 + controllers += CCT + CCT.tram_linked = src + +/obj/tram/tram_controller/proc/remove_controller(var/obj/tram/controlpad/CCT) + if(!istype(CCT)) return + if(CCT in controllers) + controllers -= CCT + CCT.tram_linked = null + + + +/obj/tram/tram_controller/proc/gen_collision() + collide_list.Cut() + var/list/collisions = list() + for(var/obj/tram/wall/W in tram_walls) + for(var/cdir in cardinal) + var/turf/T = get_step(W, 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/update_tram() + tram.Cut() + init_tram() + +/obj/tram/tram_controller/proc/handle_move(var/dir) + gen_collision() + if(dir in collide_list) + 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 diff --git a/paradise.dme b/paradise.dme index 7932c736306..3c5efbb2c02 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1754,6 +1754,7 @@ #include "code\modules\telesci\gps.dm" #include "code\modules\telesci\telepad.dm" #include "code\modules\telesci\telesci_computer.dm" +#include "code\modules\tram\tram.dm" #include "code\modules\vehicle\vehicle.dm" #include "code\modules\vehicle\train\train.dm" #include "code\modules\vehicle\train\trains\ambulance.dm" From 22fd91853fe98c49a8f98da41cb7c4e0e87a1d60 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 18 May 2015 09:22:36 -0700 Subject: [PATCH 2/5] Split tram module into files, Document tram module --- code/modules/tram/tram.dm | 126 +++++++------------------- code/modules/tram/tram_control_pad.dm | 19 ++++ code/modules/tram/tram_floor.dm | 18 ++++ code/modules/tram/tram_wall.dm | 21 +++++ paradise.dme | 3 + 5 files changed, 96 insertions(+), 91 deletions(-) create mode 100644 code/modules/tram/tram_control_pad.dm create mode 100644 code/modules/tram/tram_floor.dm create mode 100644 code/modules/tram/tram_wall.dm 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" From f9a3951139b9909a77e80be3fc0bda49bf15842c Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 18 May 2015 15:24:35 -0700 Subject: [PATCH 3/5] MT/TS: Rails This commit converts the MT/TS control system from a debugging move panel to a on-rails system. The controlpad has been repurposed as an on/off button. --- code/modules/tram/tram.dm | 47 ++++++++++++++++++++++---- code/modules/tram/tram_control_pad.dm | 22 +++++++++--- code/modules/tram/tram_floor.dm | 1 + code/modules/tram/tram_rail.dm | 6 ++++ icons/obj/tram/tram_rail.dmi | Bin 0 -> 1471 bytes paradise.dme | 1 + 6 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 code/modules/tram/tram_rail.dm create mode 100644 icons/obj/tram/tram_rail.dmi 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 0000000000000000000000000000000000000000..abe799beef24f9d432be7290052cfd3a7d411f42 GIT binary patch literal 1471 zcmZ{kc`(}x5XXOs7iXpFj3W085=Rwv1SLTmv?3_sDUqVlc&<8H9mlA< zw2nH*T~#_f+PdPZlvEIBg=k6QCdCr>3x%>lZCPl6EyJRi~`6v`>)Y5F=k|jSh@4DbAXdC3!A(t4C3ZC3H>Zg_ z*K6l5CIQDGY|eUGZK3sF90AO)FSxa&4Zy!0szUw`mHGQgZwHq~vCNo=!xILsMcMRv zeh{s6t{4e0!`tmn&eta0o7z6W%qIydGHhB*TY*V>*c9)n>}n!wh8-DZawI-7JQmfL z#X5Dj>*c0L540pCPQ_0-jHsg+SH$d8SBl)*5OO_|^Z%$l9c^!D!n7my-}1}UvEVjl z8D-1WW6N`}>32?gfEJ-vwdICS4zlclw@xIYQeA)VMn^R0%M$n7&d4xvWrIZMe+`{3d_Zj73_A2m^yUIaz*O^pO zp5NivRgAacjN7%>Xc8uC`@6e5S~PuO5jiDt!_rfznj@>AO@c;|YKZR*L6J2Au4w~l zQYvZCD2q8*nhfbR)ai$go(lkH0&d)_aPXR|P&JGquW12;r#3WSf}IDbpk#h&VJb)= zT%Jkl=dZk+MW@f4aOh|b&-+X(E}*wXLdo2OS=vF!p2x!T>?&w81>#tDfxe>o9o6JM zIdt(-(+6{C209nNRE72s0A1*4b(yF37+W`@2CBcZq%o7`Z)RuZ*}h};JIYTzmg>hm z;z`6OyJ~DYJ%HnMEX*V5^S*Vp)r!zE*z|q8%?aw{G>gTOS`AG9-FM&b-0{^R)~)dw z>y=yU)9tp3=piFa_JZihNRlI}?JjYWcVJM}9v&c=UX@i@jo*ne+ zg}niAwor`~Si`^!K&9CDDE%7M*iDDPpGknDLwi&3tgYhJ;9k2=ER&F(7?(|+q{fL% z>x}?-Wb7__N*wvXo$4sjO6!W^sTNV!7rP+Z4CWlAaDp6Cr7^u3G!#BPva;9Yyiuk_ zeopFg{444+%9||DMY^o&dsSi<>L~QMg7$>w$H!zSE11dqWW8NjJAwR7$9f0;%KlWa zZs_5Dc+a&3^SSr5(=f)wB)2S`0}(H>_77e%BEjke9{rCW%BZs-selS6FaAdcY_B>Z J>MSvde*+in#)SX? literal 0 HcmV?d00001 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" From 7ad2127464c3a8468c1ef080311342fdd7882396 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 18 May 2015 16:25:13 -0700 Subject: [PATCH 4/5] MT/TS: Damage procs This commit adds missing damage procs to the /obj/tram/ type, including - ex_act - emp_act - meteorhit - attack_animal - bullet_act It also refactors the "don't steal this" code to make a bit more sense. --- code/modules/tram/tram.dm | 57 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/code/modules/tram/tram.dm b/code/modules/tram/tram.dm index b5186662811..b6edcbf0838 100644 --- a/code/modules/tram/tram.dm +++ b/code/modules/tram/tram.dm @@ -1,3 +1,40 @@ +/obj/tram/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if(prob(50)) + qdel(src) + return + if(3.0) + if(prob(25)) + qdel(src) + return + +/obj/tram/blob_act() + if(prob(50)) + qdel(src) + +/obj/tram/meteorhit() + qdel(src) + +/obj/tram/attack_animal(var/mob/living/simple_animal/M as mob) + if(M.melee_damage_upper == 0) return + if(prob(M.melee_damage_upper)) + qdel(src) + src.visible_message("\red [M] has [M.attacktext] [src]!") + M.attack_log += text("\[[time_stamp()]\] attacked [src.name]") + +/obj/tram/bullet_act(var/obj/item/projectile/proj) + if(prob(proj.damage)) + qdel(src) + ..() + +/obj/tram/emp_act(severity) + if(automode) automode = 0 + ..() + /obj/tram/tram_controller name = "" desc = "tram controller" @@ -27,6 +64,15 @@ gen_collision() //Generate collision system processing_objects.Add(src) //Add to processing objects manually +/obj/tram/tram_controller/Destroy() + for(var/obj/tram/floor/F in tram_floors) + remove_floor(F) + for(var/obj/tram/wall/TW in tram_walls) + remove_wall(TW) + for(var/obj/tram/controlpad/CP in controllers) + remove_controller(CP) + ..() + /obj/tram/tram_controller/process() update_tram() //Update combine to account for new mobs and/or objects if(automode) @@ -87,9 +133,18 @@ 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 + if(!check_validity(AM)) continue tram += AM +/obj/tram/tram_controller/proc/check_validity(var/atom/movable/AM) + if(!AM) return 0 + if(is_type_in_list(AM, blacklist)) return 0 + if(!AM.simulated) return 0 + if(AM.anchored) + if(!istype(AM,/obj/tram) || !istype(AM,/obj/vehicle)) + return 0 + return 1 + /obj/tram/tram_controller/proc/init_controllers() for(var/obj/tram/controlpad/CCP in tram) add_controller(CCP) //Control pad not necessary until now, easiest to search through tram From c96631c6bd3d2ceac346259e6ef764062550c7e5 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 18 May 2015 17:47:00 -0700 Subject: [PATCH 5/5] MT/TS: Added to map, fluffy cleanup, icon fix This commit adds an MT/TS to the research department, changes the names and descriptions of the tram parts to have a little more care, and slightly fixes the rail icon. --- _maps/map_files/cyberiad/cyberiad.dmm | 59 ++++++++++++++------------ code/modules/tram/tram.dm | 16 ++++--- code/modules/tram/tram_control_pad.dm | 2 +- code/modules/tram/tram_floor.dm | 3 +- code/modules/tram/tram_rail.dm | 3 +- code/modules/tram/tram_wall.dm | 4 +- icons/obj/tram/tram_rail.dmi | Bin 1471 -> 1467 bytes 7 files changed, 48 insertions(+), 39 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 4bfb4f022ad..ac5ef5da60d 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -4477,10 +4477,10 @@ "bIe" = (/obj/structure/closet/wardrobe/robotics_black,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bIf" = (/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bIg" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bIh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) -"bIi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/noticeboard{pixel_y = 28},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"bIh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/tram/rail{tag = "icon-rail (NORTHWEST)"; icon_state = "rail"; dir = 9},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"bIi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/tram/rail{tag = "icon-rail (EAST)"; icon_state = "rail"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bIj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bIk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"bIk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/noticeboard{pixel_y = 28},/obj/tram/rail{tag = "icon-rail (EAST)"; icon_state = "rail"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bIl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) "bIm" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "bIn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) @@ -4555,7 +4555,7 @@ "bJE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/assembly/robotics) "bJF" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bJG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bJH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"bJH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/tram/rail{dir = 4; godir = 8; icon_state = "rail"; tag = "icon-rail (EAST)"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bJI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bJJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bJK" = (/obj/machinery/camera{c_tag = "Research Hallway North"; dir = 1; network = list("Research","SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -4643,7 +4643,7 @@ "bLo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whiteredcorner"},/area/medical/research{name = "Research Division"}) "bLp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bLq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/effect/landmark/nations{name = "Scientopia"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bLr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"bLr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/tram/rail,/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bLs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/crew_quarters/hor) "bLt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/hor) "bLu" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/hor) @@ -4732,7 +4732,7 @@ "bMZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bNa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bNb" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bNc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"bNc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/tram/rail,/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bNd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/crew_quarters/hor) "bNe" = (/obj/machinery/door_control{id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = -4; pixel_y = 6; req_access_txt = "47"},/obj/item/weapon/folder/white{pixel_x = 4},/obj/item/weapon/stamp/rd{pixel_x = 5; pixel_y = -2},/obj/structure/table/glass,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bNf" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the RD's goons from the safety of his office."; name = "Research Monitor"; network = list("Research","Research Outpost","RD"); pixel_x = 0; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/glass,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) @@ -4809,7 +4809,7 @@ "bOy" = (/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bOz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bOA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bOB" = (/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"bOB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/tram/rail,/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bOC" = (/obj/item/weapon/paper/monitorkey,/obj/item/device/megaphone,/obj/structure/table/glass,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bOD" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Research Director"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bOE" = (/obj/machinery/computer/robotics,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) @@ -4894,7 +4894,7 @@ "bQf" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/storage) "bQg" = (/obj/machinery/portable_atmospherics/scrubber/huge,/obj/structure/sign/nosmoking_2{pixel_x = 28},/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/storage) "bQh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) -"bQi" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"bQi" = (/obj/tram/rail,/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bQj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/hor) "bQk" = (/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/structure/table/glass,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bQl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) @@ -4966,7 +4966,7 @@ "bRz" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/storage) "bRA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bRB" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/wrapsortjunction{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bRC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"bRC" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/tram/rail,/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bRD" = (/obj/machinery/door/airlock/glass_command{name = "Research Director"; req_access_txt = "30"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bRE" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bRF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) @@ -5041,7 +5041,7 @@ "bSW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/toxins/storage) "bSX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bSY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bSZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"bSZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/tram/rail,/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bTa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/crew_quarters/hor) "bTb" = (/obj/machinery/power/apc{dir = 8; name = "RD Office APC"; pixel_x = -25},/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/flora/kirbyplants,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bTc" = (/obj/machinery/hologram/holopad,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/obj/structure/table/glass,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) @@ -5123,7 +5123,7 @@ "bUA" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/storage) "bUB" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bUC" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bUD" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"bUD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/tram/rail,/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bUE" = (/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/camera{c_tag = "Research Toxins Mixing North"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor{icon_state = "white"},/area/toxins/mixing) "bUF" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 6},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor{icon_state = "white"},/area/toxins/mixing) "bUG" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 4},/turf/simulated/wall/r_wall{desc = "A specially coated wall that resists temperatures for Science"; max_temperature = 1e+009; name = "Coated Reinforced Wall"},/area/toxins/mixing) @@ -5538,7 +5538,7 @@ "ccz" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/storage) "ccA" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "ccB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"ccC" = (/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"ccC" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/tram/rail,/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "ccD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"}) "ccE" = (/obj/effect/decal/warning_stripes/northwestcorner,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/mixing) "ccF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/mixing) @@ -8067,6 +8067,9 @@ "cZg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/aisat/maintenance) "cZh" = (/turf/space,/area/shuttle/derelict/ship/station) "cZi" = (/obj/structure/table,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/tape_roll,/obj/item/stack/tape_roll,/turf/simulated/floor,/area/engine/equipmentstorage) +"cZj" = (/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/tram/rail,/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"cZk" = (/obj/tram/rail,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"cZl" = (/obj/tram/rail{godir = 1},/obj/tram/floor{icon_state = "whitepurplefull"},/obj/tram/controlpad{pixel_x = -10},/obj/tram/tram_controller,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8206,22 +8209,22 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBzaFxbBAbBAbBBbepbBCaIfazEbBDbBCbpSbBEbBFbBGbBHbpSaaaaaaaaaaaaaaabzObzObzObzObzObzObzOaaaaaabBIbBJbydbBKbBLbBLbBLbBLbBLbBMbBNbBLbBObBPbBQbBRbBSbBTbBUbkXbBVbnCbBWbBXbBYbBZbCabCbbAgbAgbAmbCcbCdbCebCfbCgbAmbtgbyDbthbChbCibCjbCkbClbthaaabCmbyIbCnbCobCpbCqbCrbCqbCsbCtbCubttbCvbsdbCwbCxbCybCzbCAbCBbCCbCDbCEbCFbCGbCGbCHbCIbCJbCKbsibAQbCLbCMbsibsibsjbCNbCObCPbsjbslbslbslbCQbCRbtVbCSbzjbzkbCTbBdbCUbCVbCWbCWbCXbvIbCYbCZbDabDbbvObDcbstbDdbDebvTbDfbDgbDhbstbxLbDibumbumaaaaaaaaaaaaaabbDjbDkbDlbDmbDnbDobDjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObDrbDsbDtbDubDvbDwbDxbDxbDxbDvbydbwubyebydbydbyfbDybDzbDAbDBbDCbDDbDEbnCbnCbDFbDGbBZbCabDHbDIbDJbDKbDLbDMbDNbDObDPbAmbDQbDRbuQbDSbDTbDUbDVbDWbuWbuXbDXbyIbDYbDZbEabCqbEbbCqbEcbCtbEdbttbEebsdbEfbEgbEhbEibEjbEkbElbEmbEnbEnbEobEpbEnbEnbEqbErbEsbEtbEubEvbEwbExbEybEzbEAbEBbECbEDbEEbEFbEGbEHbtVbEIbEJbEKbELbEMbvFbENbCWbCWbEObEPbCYbEQbsqbERbERbESbstbETbEUcHibEWbvTbEXbstbxLbEYbumaaaaaaaaaaaaaaaaabbEZbFabDlbDnbDlbFbbBxaabaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObFcbFdbFcbFebFfbFgbFfbFfbFfbFfbFhbwubyebFibkRbkRbFjbnCbyhbDBbFkbFlbFmbFnbFnbFobFpbFqbFrbFsbFtbFubFvbFwbFxbFybFzbFAbAmbAnbyDbthbFBbFCbFDbFEbFFbthaaabCmbFGbFHbFGbFGbFGbFGbFGbFIbFGbFJbttbEebsdbFKbFLbFLbFMbFNbCBbFObFPbFQbFRbFSbFTbFUbFQbFVbFWbFXbFYbFZbGabGbbGbbGcbGdbGebGfbGgbGhbGibGjbGkbGlbGmbGnbGnbGobGpbGqbvFbGrbvIbvIbGsbGtbCYbGubGvbGwbGxbGybGzbGAbGBbGCbGDbGEbstbstbGFbDbbDbbGGbGHbGHbGHbGIbDbbDjbDnbDlbDnbDnbGJbDjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObGKbGLbGKbGMbydbDwbDxbDxbDxbydbydbwubyebGNbGObkRbGPbnCbyhbDBbGQbGRbGSbnCbplbnCbGTbBZbttbGUbGVbFubGWbGXbGYbGZbHabHbbHcbHdbHebHfbHfbHgbHhbHibthbthaaabCmbFGbHjbHkbHlbHmbHnbHobHpbHqbHrbttbEebAEbHsbHtbHubHvbHwbCBbHxbHybHzbHAbHBbHCbHDbHEbHFbHGbHHbHIbHJbHKbHLbHMbHNbHObHPbHQbHRbEDbHSbHTbHUbHVbtWbHWbHXbHYbHZbHZbvFbIabIbbIcbvFbIdbCYbIebvFbIfbIgbIhbIibIjbIkbIlbImbInbIobIpbIqbIrbIsbItbItbIubIvbIwbIxbIybBwbBxbIzbBxbBwbIAaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObIBbDsbICbIDbydbDwbydbydbydbydbydbwubyebGNbIEbkRbIFbnCbIGbIHbnCbIIbnBbnCbnCbIJbBYbBZbttbGUbGVbFubAmbIKbILbIMbINbIObIPbIQbIRbISbITbuWbIUbIVbuWbuXbuXbIWbFGbIXbIYbIZbJabJbbJbbJcbJdbJebttbJfbsdbCBbJgbJhbJibJjbCBbHxbJkbJlbJmbJnbJobJpbJlbHxbJqbJrbJsbJsbJsbJtbJsbJubJubJvbJwbJxbJybJybJzbJxbJxbJybJybJAbJBbJAbJAbvFbvFbvFbvFbvFbJCbJDbJEbvFbJFbJGbJHbJIbJIbJJbJKbJLbJMbJNbJObJPbJQbJRbJSbJSbJTbIjbJUbDbbJVbJWbJXbJYbDbbJZaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObGKbGLbGKbDubKabKbbydbydbydbKabydbwubyebGNbKcbkRbKdbnCbyhbDBbnCbrMbKebnCbnCbKfbDGbBZbttbKgbKhbKibAmbKjbKkbKlbKmbKnbIPbKobKpbKqbKrbKsbKtbKubKvaaaaaaaaabFGbKwbKxbKybKybKzbKAbKBbFGbKCbKDbEebKEbKFbKGbKHbKIbKJbKKbKLbHybKMbKNbKObKPbKQbKMbHxbJqbKRbKSbKTbKUbKVbKWbJubKXbKYbKZbJxbLabLbbLcbLdbLebLfbLgbIobLhbJIbJIbLibLjbJIbLkbLlbLmbLnbLobJIbLpbLqbLrbLsbLtbLubLvbLwbLvbLvbLvbGFbDbbDbbGGbGIbDbbLxbLybLzbLAbLBbLCbLDbLEaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObLFbLGbLFbLHbLIbLJbLJbLJbLJbLJbLKbLLbLMbGNbLNbkRbLObLPbLQbLRbLSbLTbLUbLVbLWbLXbLXbLYbttbLZbMabFubAmbMbbMcbMdbILbMebIPbMfbMgbMhbMibMjbDUbMkbKvaaaaaaaaabFGbMlbMmbMnbMobKzbKAbKBbFGbMpbMqbMrbMsbMtbMubMvbMwbMxbMybMzbMAbJlbJlbMBbMCbJlbJlbHxbJqbMDbMEbMFbMGbMHbMIbJubMJbMKbMLbMMbMNbMObMPbMPbMQbMRbMSbMTbMUbIjbIjbMVbIjbMWbIjbMXbIjbMYbMZbMZbNabNbbNcbNdbNebNfbNgbNhbNibNjbLvbNkbNlaaaaaaaaabDbbNmbNnbNobNpbNqbNrbNsbDbaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObNtbNubNvbkRbkRbNwbDsbDsbDsbNxbkRbkRbNybNzbNAbkRbNBbNBbNBbNCbNBbLXbNDbNEbNFbNGbLXbBZbttbNHbNIbNIbAmbAmbAmbAmbAmbNJbIPbHfbHebNKbNLbNMbNNbKvbKvbthbthbthbFGbFHbFGbFGbFGbFGbFGbFGbFGbNObttbNPbNQbNRbNSbNTbNRbNRbNUbNVbNWbNXbNYbNZbOabObbOcbKLbOdbOebOfbOgbOhbOibOjbOkbOlbOmbOnbOobOpbOqbOrbLcbOsbJybJybOtbOtbOtbOtbOubOtbOtbOtbOvbOwbOxbOxbOybOzbOAbOBbNdbOCbODbOEbOFbOGbOHbLvbNkbOIaaaaaaaaabDbbOJbOKbDbbIxbDbbDbbIxbDbaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOLaabaaaaaaaaaaaabNBbOMbONbOObOPbLXbOQbORbOSbOTbLXbBZbttbOUbOVbOWbOXbOYbOZbPabPbbPcbPdbPebPfbPgbPhbPibPjbPkbPlbPmbPnbPobPpbPqbPrbPsbscbPtbttbPubPvbPwbttbPxbNRbPybPzbPAbPBbPCbHxbPDbPEbPFbPGbPHbPIbPJbPKbPLbPMbPNbJsbPObMGbPPbPQbPRbPSbPTbPUbJxbPVbLcbLcbLcbPWbJybOtbPXbPYbPZbQabQbbQcbQdbOtbQebQfbQgbOxbOxbQhbOAbQibQjbQkbQlbQmbQnbQobQpbLvbQqbumaaaaaaaaabDbbDbbDbbDbaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNBbQrbQsbQtbQubQvbQwbQxbQybQzbLXbBZbQAbQBbttbttbEebQCbscbPsbPrbQDbQEbQDbQFbQGbQGbQHbQIbQJbQGbQGbQKbQGbQLbQGbPrbPsbscbQMbQNbQObQPbQQbQRbttbNRbQSbPzbQTbQUbQVbHxbQWbQXbQYbQZbRabRbbRcbRdbHxbRebRfbJsbRgbRhbRhbRibRjbRkbRlbRmbJxbRnbRobLcbRpbRqbJybOtbRrbRsbRtbRubRvbRwbRxbOtbRybQfbRzbRzbOxbRAbRBbRCbRDbREbRFbRGbRHbRIbRJbLvbNkbumbRKaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzOaaaaaaaaaaaaaaaaaaaaaaaabRLbRMbRNbRMbROaaaaaaaaabNBbNBbRPbRQbQtbRRbRSbRTbOSbRUbRVbLXbBZbRWbRXbRYbRZbSabSbbScbSdbSebSfbSgbShbSibSjbSjbSkbSlbSlbSlbSlbSlbSlbSmbSnbSobSpbSqbSrbRZbSsbStbSubSvbSwbNRbSxbPzbPAbSybQVbHxbQWbQXbSzbSAbSBbSCbSDbSEbHFbSFbSGbJsbJsbSHbSIbJsbRjbJubSJbSKbJxbSLbSMbSNbSObSPbJybOtbSQbSRbPZbSSbSTbSUbSVbOtbSWbQfbRzbRzbOxbSXbSYbSZbTabTbbTcbTdbTebTfbTgbLvbNkbThbTibThbTjbTkbTjbTjbTjaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTlbTmbTnbTobTlbTpbTqbTrbNBbTsbTtbTubTvbTwbTxbTybTzbTzbTAbLXbTBbTCbTDbTEbTEbTFbTGbTHbTEbTIbTIbTJbTKbTLbTIbTIbTMbPrbPrbTNbTObTObTObTPbTQbTObTObTRbTSbTTbTTbTUbTTbTVbTWbTTbTXbTYbTZbNRbUabUbbQWbUcbUdbUebUfbUgbUhbUdbHxbRebUibUjbUkbUlbUmbUnbUobUpbUqbUrbUsbUtbUubUvbUwbUxbJybOtbOtbOtbOtbOtbOtbOtbOtbOtbUybUzbUAbUAbOxbUBbUCbUDbLvbLvbLvbLvbLvbLvbLvbLvbNkbThbUEbUFbUGbUHbUHbUIbTjaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbUJbUKbUKbULbUMbUMbUNbUNbUNbUNbUOaabaabaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRNbUPbUQbUPbRNbURbUSbUTbUUbUVbUWbUXbUYbUZbLXbVabVbbVcbVdbLXbTCbTCbVebTEbVfbVgbVhbVibVjbTIbVkbVlbVmbVnbVobTIbVpbVqbVrbTObVsbVtbVubVvbVwbVxbVybVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbVMbVNbVObQXbVPbVQbVRbVSbVTbVUbHFbVVbVWbVXbVYbUmbVZbVZbWabWbbJxbWcbWdbWebWfbWgbWhbWibJybWjbWkbWlbWmbWlbWlbWnbWobWpbWqbWrbWsbWtbOxbWubWvbOBbDbbvWbWwbWxbWybWybWxbWybWzbThbWAbWBbUGbUHbWCbWDbTjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWEbWFbWGbWFbUMbUNbUNbWHbWIbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTlbWJbUPbUPbWKbWLbRQbWMbWNbWObRQbUXbWPbWQbLXbLXbLXbLXbLXbLXbWRbTCbWSbWTbWUbWVbWVbWVbWWbTIbWXbWYbWYbWYbWZbXabXbbXcbXdbXebXfbXgbXhbXibXjbXkbTObTRbXlbTTbXmbXnbXobXpbXqbTTbQSbPAbQTbQUbXrbXsbXtbXubXvbXwbXxbXybXzbUdbXAbXBbXCbXDbXEbXFbXGbXHbXIbXJbJxbJxbJxbJxbJxbXKbXLbXMbJybXNbWlbWlbXObWlbXPbXQbXRbXSbXTbQfbXUbXUbOxbOzbXVbOBbDbbThbXWbThbThbThbThbThbThbThbXXbXYbTjbXZbYabYbbTjaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbYcbWFbWFbYdbUNbUNbWHbWHbYebWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRNbUQbUQbUQbRNbYfbYgbYhbYibYjbRQbYkbYlbYmbYnbYobYobYobYpbTCbTCbTCbVebTEbYqbWVbYrbWVbYsbTIbYtbWYbYubWYbYvbTIbYwbYxbYybTObYzbYAbYBbYCbYDbYEbYFbYGbYHbYIbYJbYKbYLbYMbYNbTTbSxbPAbPAbYObXrbXsbYPbYQbYRbVQbYSbYTbYUbYVbYWbYXbYYbYZbZabZbbZcbZcbVZbZdbUjbZebZfbZgbZhbZibZjbZkbXRbXNbZlbWlbWlbWlbZmbZnbXRbXSbZobQfbXUbXUbOxbZpbZqbOBbDbbZrbZsbZtbThbZubZvbZwbZxbZybZzbZAbTjbZBbZCbZDbTjbThbThbThbThbThbThbThbThaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabZEbUNbYcbUNbUNbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaabTlbZFbZGbZHbTlbZIbTqbTrbNBbNBbZJbZJbZJbNBbNBbTCbZKbZKbZLbZMbTCbZNbZObTEbYqbWVbWVbWVbZPbTIbYtbWYbWYbZQbZRbZSbZTbZUbZVbTObTObTObTObTObZWbTObTObZXbZYbTTbTTbZZbTTbTWbTTbTTbNRcaacaabNRbNRcabcaccadcaecafcagcahcaicajcakcalbYYcamcancaocapcaqcarcasbUjcatcaucavcawcaxcaycazcaAcaBcaAcaCcaDcaEcaAcaFcaAcaAcaGcaHbXUbXUbOxcaIbXVbOBcaJcaKcaLcaMcaNcaOcaPcaPcaQcaRcaScaTcaUcaVcaWcaXcaYcaZcbacbbcbccbdcbecbfcbgaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaabUMbUNcbhcbicbibWHbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbjbRMcbkbRMcblcbmaabaaaaaabNBcbncbocbpbNBaaabTCcbqcbrcbscbtbYocbucbvbTEcbwcbxcbybWVcbzcbAcbBcbCcbDcbEcbFbTIcbGcbHcbIcbJcbKcbKcbKcbKcbLcbMcbNcbOcbOcbPcbPcbQcbRcbSbTRbNRcbTcbUcbVcbWcbXbXscbYcadcbZccaccbcccbRcccdcceccfccgcchcchccicchcchcchccjbUjcckcclccmccnccoccpccqcaAccrccscctccuccvccsccwccxccsccycczbQgbOxbOxccAccBccCccDccEccFccGccHccIccJccKccLccMccNccOccPccQccRccQccSccRccRccRccTccUccVccWccXaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabUNbUNccYbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabccZbTCbTCbTCcdabTCbTCcdbbTEcdccddcdecdfcdgcdhcdicdjcdkcdlcdmcbAcdncdocdpcdqcdrcdrcdrcdrcdscdtcducdvcdwcdvcdxcdycdzcdAcdBcdCcdDcdEcdFcdGcdHcdIcdJcdKcdLcdMcdNcdOcdPcdQcdRcdScdTcdTcdTcdUcdVcdWcdXcdYcdZcdZceacdZcebceccedceecaAcefcegcehceicehcejcekcelccsbOxcembOxbOxcenceobXVbzwbDbbThcepbThbThceqcercescetceuccRcevcewcexccKcexccKceyccKccKbThcezceAceBceCaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaabUNbWHbWHbWHbWHbWHbWHceDbWHceEbWHbWHbWHbWHbWHbUNbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccZceFceGceHbTCceIbTEceJceKceLbYqceMceNceObYtcePceQceRceNceSceTceUceVceVceWceXceYceZcfacfbcfcbHTcfdbTRcfebHTbHTcffcfgcfhcficfjcdGcfkcflcfmcfncfocfpcfqcfrcfscfpcfpcftcfucfucfucfvcfucfwcfucfxcfycfzcfAcfBcfCcfDcfEcfFcaAcfGcfHcfIcfJcfIcfKcfLcehcfMcfNcfObzwcfPbzwceobXVbzwbDbcfQcfRcfSbThbThbThbThbThcfTccKcfUcfVceyccKcfWccKbXXccKcfXbThcfYcfZcgabThaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabUNcgbcgbcgbcgbcgbcgbcgcbWHcgdcgbceEbWHbWHbWHbWHbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObGKbGLbGKbGMbydbDwbDxbDxbDxbydbydbwubyebGNbGObkRbGPbnCbyhbDBbGQbGRbGSbnCbplbnCbGTbBZbttbGUbGVbFubGWbGXbGYbGZbHabHbbHcbHdbHebHfbHfbHgbHhbHibthbthaaabCmbFGbHjbHkbHlbHmbHnbHobHpbHqbHrbttbEebAEbHsbHtbHubHvbHwbCBbHxbHybHzbHAbHBbHCbHDbHEbHFbHGbHHbHIbHJbHKbHLbHMbHNbHObHPbHQbHRbEDbHSbHTbHUbHVbtWbHWbHXbHYbHZbHZbvFbIabIbbIcbvFbIdbCYbIebvFbIfbIgbIhbIkbIibJHbIlbImbInbIobIpbIqbIrbIsbItbItbIubIvbIwbIxbIybBwbBxbIzbBxbBwbIAaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObIBbDsbICbIDbydbDwbydbydbydbydbydbwubyebGNbIEbkRbIFbnCbIGbIHbnCbIIbnBbnCbnCbIJbBYbBZbttbGUbGVbFubAmbIKbILbIMbINbIObIPbIQbIRbISbITbuWbIUbIVbuWbuXbuXbIWbFGbIXbIYbIZbJabJbbJbbJcbJdbJebttbJfbsdbCBbJgbJhbJibJjbCBbHxbJkbJlbJmbJnbJobJpbJlbHxbJqbJrbJsbJsbJsbJtbJsbJubJubJvbJwbJxbJybJybJzbJxbJxbJybJybJAbJBbJAbJAbvFbvFbvFbvFbvFbJCbJDbJEbvFbJFbJGbLrbJIbJIbJJbJKbJLbJMbJNbJObJPbJQbJRbJSbJSbJTbIjbJUbDbbJVbJWbJXbJYbDbbJZaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObGKbGLbGKbDubKabKbbydbydbydbKabydbwubyebGNbKcbkRbKdbnCbyhbDBbnCbrMbKebnCbnCbKfbDGbBZbttbKgbKhbKibAmbKjbKkbKlbKmbKnbIPbKobKpbKqbKrbKsbKtbKubKvaaaaaaaaabFGbKwbKxbKybKybKzbKAbKBbFGbKCbKDbEebKEbKFbKGbKHbKIbKJbKKbKLbHybKMbKNbKObKPbKQbKMbHxbJqbKRbKSbKTbKUbKVbKWbJubKXbKYbKZbJxbLabLbbLcbLdbLebLfbLgbIobLhbJIbJIbLibLjbJIbLkbLlbLmbLnbLobJIbLpbLqbNcbLsbLtbLubLvbLwbLvbLvbLvbGFbDbbDbbGGbGIbDbbLxbLybLzbLAbLBbLCbLDbLEaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObLFbLGbLFbLHbLIbLJbLJbLJbLJbLJbLKbLLbLMbGNbLNbkRbLObLPbLQbLRbLSbLTbLUbLVbLWbLXbLXbLYbttbLZbMabFubAmbMbbMcbMdbILbMebIPbMfbMgbMhbMibMjbDUbMkbKvaaaaaaaaabFGbMlbMmbMnbMobKzbKAbKBbFGbMpbMqbMrbMsbMtbMubMvbMwbMxbMybMzbMAbJlbJlbMBbMCbJlbJlbHxbJqbMDbMEbMFbMGbMHbMIbJubMJbMKbMLbMMbMNbMObMPbMPbMQbMRbMSbMTbMUbIjbIjbMVbIjbMWbIjbMXbIjbMYbMZbMZbNabNbbOBbNdbNebNfbNgbNhbNibNjbLvbNkbNlaaaaaaaaabDbbNmbNnbNobNpbNqbNrbNsbDbaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObNtbNubNvbkRbkRbNwbDsbDsbDsbNxbkRbkRbNybNzbNAbkRbNBbNBbNBbNCbNBbLXbNDbNEbNFbNGbLXbBZbttbNHbNIbNIbAmbAmbAmbAmbAmbNJbIPbHfbHebNKbNLbNMbNNbKvbKvbthbthbthbFGbFHbFGbFGbFGbFGbFGbFGbFGbNObttbNPbNQbNRbNSbNTbNRbNRbNUbNVbNWbNXbNYbNZbOabObbOcbKLbOdbOebOfbOgbOhbOibOjbOkbOlbOmbOnbOobOpbOqbOrbLcbOsbJybJybOtbOtbOtbOtbOubOtbOtbOtbOvbOwbOxbOxbOybOzbOAbQibNdbOCbODbOEbOFbOGbOHbLvbNkbOIaaaaaaaaabDbbOJbOKbDbbIxbDbbDbbIxbDbaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOLaabaaaaaaaaaaaabNBbOMbONbOObOPbLXbOQbORbOSbOTbLXbBZbttbOUbOVbOWbOXbOYbOZbPabPbbPcbPdbPebPfbPgbPhbPibPjbPkbPlbPmbPnbPobPpbPqbPrbPsbscbPtbttbPubPvbPwbttbPxbNRbPybPzbPAbPBbPCbHxbPDbPEbPFbPGbPHbPIbPJbPKbPLbPMbPNbJsbPObMGbPPbPQbPRbPSbPTbPUbJxbPVbLcbLcbLcbPWbJybOtbPXbPYbPZbQabQbbQcbQdbOtbQebQfbQgbOxbOxbQhbOAbRCbQjbQkbQlbQmbQnbQobQpbLvbQqbumaaaaaaaaabDbbDbbDbbDbaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNBbQrbQsbQtbQubQvbQwbQxbQybQzbLXbBZbQAbQBbttbttbEebQCbscbPsbPrbQDbQEbQDbQFbQGbQGbQHbQIbQJbQGbQGbQKbQGbQLbQGbPrbPsbscbQMbQNbQObQPbQQbQRbttbNRbQSbPzbQTbQUbQVbHxbQWbQXbQYbQZbRabRbbRcbRdbHxbRebRfbJsbRgbRhbRhbRibRjbRkbRlbRmbJxbRnbRobLcbRpbRqbJybOtbRrbRsbRtbRubRvbRwbRxbOtbRybQfbRzbRzbOxbRAbRBbSZbRDbREbRFbRGbRHbRIbRJbLvbNkbumbRKaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzOaaaaaaaaaaaaaaaaaaaaaaaabRLbRMbRNbRMbROaaaaaaaaabNBbNBbRPbRQbQtbRRbRSbRTbOSbRUbRVbLXbBZbRWbRXbRYbRZbSabSbbScbSdbSebSfbSgbShbSibSjbSjbSkbSlbSlbSlbSlbSlbSlbSmbSnbSobSpbSqbSrbRZbSsbStbSubSvbSwbNRbSxbPzbPAbSybQVbHxbQWbQXbSzbSAbSBbSCbSDbSEbHFbSFbSGbJsbJsbSHbSIbJsbRjbJubSJbSKbJxbSLbSMbSNbSObSPbJybOtbSQbSRbPZbSSbSTbSUbSVbOtbSWbQfbRzbRzbOxbSXbSYbUDbTabTbbTcbTdbTebTfbTgbLvbNkbThbTibThbTjbTkbTjbTjbTjaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTlbTmbTnbTobTlbTpbTqbTrbNBbTsbTtbTubTvbTwbTxbTybTzbTzbTAbLXbTBbTCbTDbTEbTEbTFbTGbTHbTEbTIbTIbTJbTKbTLbTIbTIbTMbPrbPrbTNbTObTObTObTPbTQbTObTObTRbTSbTTbTTbTUbTTbTVbTWbTTbTXbTYbTZbNRbUabUbbQWbUcbUdbUebUfbUgbUhbUdbHxbRebUibUjbUkbUlbUmbUnbUobUpbUqbUrbUsbUtbUubUvbUwbUxbJybOtbOtbOtbOtbOtbOtbOtbOtbOtbUybUzbUAbUAbOxbUBbUCccCbLvbLvbLvbLvbLvbLvbLvbLvbNkbThbUEbUFbUGbUHbUHbUIbTjaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbUJbUKbUKbULbUMbUMbUNbUNbUNbUNbUOaabaabaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRNbUPbUQbUPbRNbURbUSbUTbUUbUVbUWbUXbUYbUZbLXbVabVbbVcbVdbLXbTCbTCbVebTEbVfbVgbVhbVibVjbTIbVkbVlbVmbVnbVobTIbVpbVqbVrbTObVsbVtbVubVvbVwbVxbVybVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbVMbVNbVObQXbVPbVQbVRbVSbVTbVUbHFbVVbVWbVXbVYbUmbVZbVZbWabWbbJxbWcbWdbWebWfbWgbWhbWibJybWjbWkbWlbWmbWlbWlbWnbWobWpbWqbWrbWsbWtbOxbWubWvbQibDbbvWbWwbWxbWybWybWxbWybWzbThbWAbWBbUGbUHbWCbWDbTjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWEbWFbWGbWFbUMbUNbUNbWHbWIbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTlbWJbUPbUPbWKbWLbRQbWMbWNbWObRQbUXbWPbWQbLXbLXbLXbLXbLXbLXbWRbTCbWSbWTbWUbWVbWVbWVbWWbTIbWXbWYbWYbWYbWZbXabXbbXcbXdbXebXfbXgbXhbXibXjbXkbTObTRbXlbTTbXmbXnbXobXpbXqbTTbQSbPAbQTbQUbXrbXsbXtbXubXvbXwbXxbXybXzbUdbXAbXBbXCbXDbXEbXFbXGbXHbXIbXJbJxbJxbJxbJxbJxbXKbXLbXMbJybXNbWlbWlbXObWlbXPbXQbXRbXSbXTbQfbXUbXUbOxbOzbXVbQibDbbThbXWbThbThbThbThbThbThbThbXXbXYbTjbXZbYabYbbTjaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbYcbWFbWFbYdbUNbUNbWHbWHbYebWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRNbUQbUQbUQbRNbYfbYgbYhbYibYjbRQbYkbYlbYmbYnbYobYobYobYpbTCbTCbTCbVebTEbYqbWVbYrbWVbYsbTIbYtbWYbYubWYbYvbTIbYwbYxbYybTObYzbYAbYBbYCbYDbYEbYFbYGbYHbYIbYJbYKbYLbYMbYNbTTbSxbPAbPAbYObXrbXsbYPbYQbYRbVQbYSbYTbYUbYVbYWbYXbYYbYZbZabZbbZcbZcbVZbZdbUjbZebZfbZgbZhbZibZjbZkbXRbXNbZlbWlbWlbWlbZmbZnbXRbXSbZobQfbXUbXUbOxbZpbZqbQibDbbZrbZsbZtbThbZubZvbZwbZxbZybZzbZAbTjbZBbZCbZDbTjbThbThbThbThbThbThbThbThaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabZEbUNbYcbUNbUNbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaabTlbZFbZGbZHbTlbZIbTqbTrbNBbNBbZJbZJbZJbNBbNBbTCbZKbZKbZLbZMbTCbZNbZObTEbYqbWVbWVbWVbZPbTIbYtbWYbWYbZQbZRbZSbZTbZUbZVbTObTObTObTObTObZWbTObTObZXbZYbTTbTTbZZbTTbTWbTTbTTbNRcaacaabNRbNRcabcaccadcaecafcagcahcaicajcakcalbYYcamcancaocapcaqcarcasbUjcatcaucavcawcaxcaycazcaAcaBcaAcaCcaDcaEcaAcaFcaAcaAcaGcaHbXUbXUbOxcaIbXVbQicaJcaKcaLcaMcaNcaOcaPcaPcaQcaRcaScaTcaUcaVcaWcaXcaYcaZcbacbbcbccbdcbecbfcbgaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaabUMbUNcbhcbicbibWHbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbjbRMcbkbRMcblcbmaabaaaaaabNBcbncbocbpbNBaaabTCcbqcbrcbscbtbYocbucbvbTEcbwcbxcbybWVcbzcbAcbBcbCcbDcbEcbFbTIcbGcbHcbIcbJcbKcbKcbKcbKcbLcbMcbNcbOcbOcbPcbPcbQcbRcbSbTRbNRcbTcbUcbVcbWcbXbXscbYcadcbZccaccbcccbRcccdcceccfccgcchcchccicchcchcchccjbUjcckcclccmccnccoccpccqcaAccrccscctccuccvccsccwccxccsccycczbQgbOxbOxccAccBcZjccDccEccFccGccHccIccJccKccLccMccNccOccPccQccRccQccSccRccRccRccTccUccVccWccXaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabUNbUNccYbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabccZbTCbTCbTCcdabTCbTCcdbbTEcdccddcdecdfcdgcdhcdicdjcdkcdlcdmcbAcdncdocdpcdqcdrcdrcdrcdrcdscdtcducdvcdwcdvcdxcdycdzcdAcdBcdCcdDcdEcdFcdGcdHcdIcdJcdKcdLcdMcdNcdOcdPcdQcdRcdScdTcdTcdTcdUcdVcdWcdXcdYcdZcdZceacdZcebceccedceecaAcefcegcehceicehcejcekcelccsbOxcembOxbOxcenceobXVcZkbDbbThcepbThbThceqcercescetceuccRcevcewcexccKcexccKceyccKccKbThcezceAceBceCaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaabUNbWHbWHbWHbWHbWHbWHceDbWHceEbWHbWHbWHbWHbWHbUNbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccZceFceGceHbTCceIbTEceJceKceLbYqceMceNceObYtcePceQceRceNceSceTceUceVceVceWceXceYceZcfacfbcfcbHTcfdbTRcfebHTbHTcffcfgcfhcficfjcdGcfkcflcfmcfncfocfpcfqcfrcfscfpcfpcftcfucfucfucfvcfucfwcfucfxcfycfzcfAcfBcfCcfDcfEcfFcaAcfGcfHcfIcfJcfIcfKcfLcehcfMcfNcfObzwcfPbzwceobXVcZlbDbcfQcfRcfSbThbThbThbThbThcfTccKcfUcfVceyccKcfWccKbXXccKcfXbThcfYcfZcgabThaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabUNcgbcgbcgbcgbcgbcgbcgcbWHcgdcgbceEbWHbWHbWHbWHbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccZcgecgfcggbTCceIcghcghcghcghcghcghbTIbTIbTIbTIbTIbTIbTIcgicgjcgkcglcgmcgncgocgocgpcgqcfbbHTbHTcgrcgscgtbHTbHTbHTcgucgvcgwcdEcgxcgycgzcfucgAcgBcgCbQWcgBcgDcdTcdTcdTcdTcdTcdTcgBcdTcdTcdTbQWcgEcgFcgGcgHcgIcgJcgKcgLcaAcgMcgNcehcgOcehcgPcgQcgRcgScgTcgUcgVbzwcgWceobXVcgXbDbbDicgYcgZchabumbvWbvWbThchbchcchdchechfchgchhchichjchkchlbThchmchnchochpaacaacaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaachqbWFbWFbWFbWFbWFbWFbWFchrchsbWHbWHbWHbWHchtbWIbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccZccZccZccZbTCceIccZaaaaaaaaaaaachuchvchwchxchychzchAchBchCchDchEchFchGchHchIchIchJchKchLchMchMchMchMchNchMbHTbHTbNRchOchPchQchRchSchTcgIchUchVchWchXchYchZciacdTcdTcibciccidciecidcicbEDcifcigcigcihciicijcakcikcilcaAcimcinciocipciqcirciscaAcaAbDbcitbDbbDbbDbciucivciwbDbbvWcgYcixciybumbumbumbThbThbThbThbThbThbThbThbThbThbThbThbThbThbThbThbThaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabUNcbicbicbicbicbicbicizbWHcbhcbiciAbWHbWHbWHbWHbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciBaaaaabaabciCciCciCciCciCciCciDciCbTCcdbciEaaaciFciGciHciIciJciKciLciMciNciOciPciQciRciSciTciUciVciWciXciYciZchLcjacjbcjbcjbcjcchMbHTbHTcjdcjdcjdcjdcjecjdcjfcjfcjgcjdcjdcjhcjdcjicjjcjkcjlcjkcjmcjncjocjpcjqbuXbuXcjrcjscjtcjucjvcjwcjxcbScaAcaAcjycaAcjzcaAcjAcjBcjCcjDcjEcjFcjGcjHcjIcjJcjKcjLcjIbvWcgYcjMbvWcjNcjOcjPcjQbvWbvWbvWbvWbvWbvWbvWbvWcjRcjSbNlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUNbWHbWHbWHbWHbWHbWHceDbWHciAbWHbWHbWHbWHbWHbUNbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/modules/tram/tram.dm b/code/modules/tram/tram.dm index b6edcbf0838..8b4e91e541e 100644 --- a/code/modules/tram/tram.dm +++ b/code/modules/tram/tram.dm @@ -31,10 +31,6 @@ qdel(src) ..() -/obj/tram/emp_act(severity) - if(automode) automode = 0 - ..() - /obj/tram/tram_controller name = "" desc = "tram controller" @@ -73,6 +69,10 @@ remove_controller(CP) ..() +/obj/tram/tram_controller/emp_act(severity) + if(automode) automode = 0 + ..() + /obj/tram/tram_controller/process() update_tram() //Update combine to account for new mobs and/or objects if(automode) @@ -92,6 +92,7 @@ stored_rail = RT for(var/cdir in cardinal) for(var/obj/tram/rail/R in get_step(src,cdir)) + if(!istype(R)) continue if(R != last_played_rail) handle_move(get_dir(src,R)) last_played_rail = stored_rail @@ -135,14 +136,17 @@ if(AM in tram) continue if(!check_validity(AM)) continue tram += AM + if(!(src in tram)) + tram += src /obj/tram/tram_controller/proc/check_validity(var/atom/movable/AM) if(!AM) return 0 if(is_type_in_list(AM, blacklist)) return 0 if(!AM.simulated) return 0 if(AM.anchored) - if(!istype(AM,/obj/tram) || !istype(AM,/obj/vehicle)) - return 0 + if(istype(AM,/obj/tram) || istype(AM,/obj/vehicle)) + return 1 + return 0 return 1 /obj/tram/tram_controller/proc/init_controllers() diff --git a/code/modules/tram/tram_control_pad.dm b/code/modules/tram/tram_control_pad.dm index 1176ae5a3a9..36f40beee30 100644 --- a/code/modules/tram/tram_control_pad.dm +++ b/code/modules/tram/tram_control_pad.dm @@ -1,6 +1,6 @@ /obj/tram/controlpad name = "tram controller interface" - desc = "Controls the tram." + desc = "Controls a tram." icon = 'icons/obj/airlock_machines.dmi' icon_state = "airlock_control_standby" var/obj/tram/tram_controller/tram_linked diff --git a/code/modules/tram/tram_floor.dm b/code/modules/tram/tram_floor.dm index 74c863dde53..fc3b1d162d5 100644 --- a/code/modules/tram/tram_floor.dm +++ b/code/modules/tram/tram_floor.dm @@ -1,5 +1,6 @@ /obj/tram/floor - name = "floor" + name = "tram platform" + desc = "A holding space for a tram system." icon = 'icons/turf/floors.dmi' icon_state = "floor" var/obj/tram/tram_controller/controller diff --git a/code/modules/tram/tram_rail.dm b/code/modules/tram/tram_rail.dm index bf14d23fea3..fb63df62617 100644 --- a/code/modules/tram/tram_rail.dm +++ b/code/modules/tram/tram_rail.dm @@ -3,4 +3,5 @@ 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 + var/godir = null + layer = TURF_LAYER + 0.1 \ No newline at end of file diff --git a/code/modules/tram/tram_wall.dm b/code/modules/tram/tram_wall.dm index ead4f52c5f6..bfde77f6a4c 100644 --- a/code/modules/tram/tram_wall.dm +++ b/code/modules/tram/tram_wall.dm @@ -1,6 +1,6 @@ /obj/tram/wall - name = "reinforced wall" - desc = "A huge chunk of reinforced metal used to seperate rooms." + name = "reinforced tram wall" + desc = "A huge chunk of reinforced metal used to shield a tram system." icon = 'icons/turf/walls.dmi' icon_state = "r_wall" var/obj/tram/tram_controller/controller diff --git a/icons/obj/tram/tram_rail.dmi b/icons/obj/tram/tram_rail.dmi index abe799beef24f9d432be7290052cfd3a7d411f42..348d87ebd28f61908b1a30ae734ddc7854297314 100644 GIT binary patch delta 1325 zcmV+|1=9Mz3%d)DpMM8QL_t(|ob8=4Xxvs9$NxIt8G;No#$b}OGa8JyQfO&uqOoKP zbi2@kagHpZT#~_q#||Bm9K}nx1Vc)0bGRv`-EK)pA!H~RgU2KqN{wm3qEH*IgDagR zbhe~>(*HgC`+*1R`SgA7{Vl!klivHz>i7Fdi{m(}_a81kUVmDyVPSp--`+R?0C=7U z&-2jjcCFMW%K_Vd5mfSi(C@rY>#jYvGbY(rMJ@qaw+|z~w>N4^oH50|N-_)3e&9uZ zfBI}nnKLHXS559)5Ww#|+rA2N3lQ&o{6Dj3*!ESCOMv)2H-1kp8n%6vWELPEZN#II zqG8)t%~*2)yMOa+`znw;fQ;k;WF!wDBY6OsYTgef#o^uV*#4Am|IORxAby@O@wr8H zdoBUkakxtROUuJ^wQe86wub|jWJh&-W&zl7xN7?g^E1JDY2nhYL`49;XFx$ zS5*7C&jXl)59FK!j_+l|%c;Fl!_Ibj^MFeGo;REn+kYE1y#KHtu@k0<_RIpbA9#_8 z)wm!WJbeDe5kCFwqu}^y{k2~Fx*P~_+P#(CzVgi;s?{n+b-qjiM*R~U z9UWowr`gEgpVTkw_w6qS0DqNmn)bcDJ$%=?0KZ&~f4uB+HQ~q6zMuZ%=pWnvV0Lyk zb$|aVCpDh-VOINT$IB$GZ=?ED(QR<^4!(|gK$^Z;i;KfaShstAy#1?d2e^EB3Y|xY zEK&ddhkvoNeTYv!?v!#1dh@n9SX!=OeQmf$!Sg&cZvpS#9pIOrW8vuu{j%!y`T)=? z+8Nazj)Ib22bL{BQrR>=3QF5Q3&3g_PJfp{Sxe0w$5A$BR+gfDf_jY3gwFyZ02vX0 zj0iwR1Rx^9UlfmxZWY4ibV|H8In|EcU`El?$SLT-T+3|767<%+90ZQttjwXMb}# z7-+x!;-v{Kb}1&U3%z)0B3QB*_`EqC?NdTKn@ZTB^|eVX%+CZrTfMo6!@cJd0J!^f zN3AFAJ)em9y49PD^ksc*GO?XaCF^SCQOC>Jsh)O!Sl&J{r~vsL)@g&>sN*^hK9F&X z5_^k~%B?|u`|j>8brP&N{2$dLBIajAT5vnk@cJx^oe89l!=}9(q2`Ten-1i6QP%lm;Mty^Z4ki(pY9tRJ jBY6NB$pgqp9zfrIB62T1`@HRL51v){bLU zU8PNGU6}@HHKij-0SEpliWTej7L%H{drhe9O7|`7JONFPa6LTiQDuU_4#1E3pm)_qT>)#Ug z5QQtF1$$PArez(VBQG3PhvcYMIy)y)Q$glTR4yz&Fux?Quy-Dr$|GG@e9Z}1y+tACa*c&V&ePS0k8 zeaebe30VCu@@1<77MUZ3F=ZXp85S~5&j5z=@jDXXy@GalxDANOA0H~)C=wu!0kNR| zOHGxsoEL)&BUo|94_j&>uFKr@Vr3$~ex?=yhzSg&`gmK;j}xn#nAsdHQ=wm%Yd63Z zq)e#p8Huu`Q}Wal__jW0cr@)ti)*4Sq+55!J^ zd7OU~wcmVLE&|>tMG90O4cx9>Bt-}KyCYXpR1G}*|NCko^wL*YakX2FpyK(WXE(0@nxVZi) zv2+#-t3WpLr>gX^VH(eBX4foppBbZT7dl?MLyFMl_=RS4xCZFN)9#R2UcZZPJBr=% zQF;i&b$>oRZ6c2u4Olb37rsCr4Zlet{km=?7YO1NK|4AsqJ!#lZ%>;pzep~S;r-Mo z^**UoNx+>rF@*p%<$)#XWszbSgi8B;p9hr`JUMD<)JaaEg+%?v`k zR$+5VQwx4A!)frgWdu2eJ(Fgy8BU^<2R0#a~9p| zc!>$+uJApFjtj4s;V5t&7$|0dfC_ zkQGCMNs3t>*PX0!I~Mf62zIuA$xgET@?;Zi*lvT39?TD>NlI0!hDArLVEJpvMDAR^!=qi)ykwj+wS`@r^CDh*lu{Q}HNIO-y_lWHns#?5C3Zk2eH_`EggAFd#ZuJJ+IJyC-JilnOZ`0cQ1e&nl48Z9( zSb2EqO06h~g?uZ8C$D9Md{P~-Q5%xGFU7-BGuP1*`iNU$yg-9)es7w}vWB-j->YdS z6wl;Wk5iMIZ6-e@4iP3fiyIxmk_Wcb`;^|mKhxf!qNpZHM2N^CvI#Rs%NJx-G02^F zcc>6)l34ZDceT209PypK?;7lJz}}=&H@0Mi{tI*NGq3pjpu%yk@Z(P!X gGX+Z1xcwh}HAfu*9gJ@biUfAY|6HIC%?p$L7vuw%Q~&?~