diff --git a/aurora.dme b/aurora.dme
index 652e5b0e..9f82c22e 100644
--- a/aurora.dme
+++ b/aurora.dme
@@ -842,6 +842,7 @@
#include "code\modules\clothing\under\ties.dm"
#include "code\modules\clothing\under\jobs\civilian.dm"
#include "code\modules\clothing\under\jobs\engineering.dm"
+#include "code\modules\clothing\under\jobs\ert.dm"
#include "code\modules\clothing\under\jobs\medsci.dm"
#include "code\modules\clothing\under\jobs\security.dm"
#include "code\modules\customitems\item_defines.dm"
diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm.mytry b/code/game/machinery/computer/syndicate_specops_shuttle.dm.mytry
new file mode 100644
index 00000000..0dffac9c
--- /dev/null
+++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm.mytry
@@ -0,0 +1,584 @@
+//Config stuff
+#define SYNDICATE_ELITE_MOVETIME 600 //Time to station is milliseconds. 60 seconds, enough time for everyone to be on the shuttle before it leaves.
+#define SYNDICATE_ELITE_STATION_AREATYPE "/area/shuttle/syndicate_elite/station" //Type of the spec ops shuttle area for station
+#define SYNDICATE_ELITE_DOCK_AREATYPE "/area/shuttle/syndicate_elite/mothership" //Type of the spec ops shuttle area for dock
+#define SYNDICATE_ELITE_RETURN_DELAY 6000 //Time between the shuttle is capable of moving.
+
+var/syndicate_elite_shuttle_moving_to_station = 0
+var/syndicate_elite_shuttle_moving_to_mothership = 0
+var/syndicate_elite_shuttle_at_station = 0
+var/syndicate_elite_shuttle_can_send = 1
+var/syndicate_elite_shuttle_time = 0
+var/syndicate_elite_shuttle_timeleft = 0
+
+/obj/machinery/computer/syndicate_elite_shuttle
+ name = "Elite Syndicate Squad Shuttle Console"
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "syndishuttle"
+ req_access = list(access_cent_specops)
+ var/temp = null
+ var/hacked = 0
+ var/allowedtocall = 0
+
+/proc/syndicate_elite_return()
+ var/area/syndicate_mothership/control = locate()//To find announcer. This area should exist for this proc to work.
+ var/area/syndicate_mothership/elite_squad = locate()//Where is the specops area located?
+ var/mob/living/silicon/decoy/announcer = locate() in syndicate_ship//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
+
+ var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values.
+ var/message = "\"THE SPECIAL OPERATIONS SHUTTLE IS PREPARING TO RETURN\""//Initial message shown.
+ if(announcer)
+ announcer.autosay(message, "GLaDOS", "Syndicate Elite Team")
+
+ while(syndicate_elite_shuttle_time - world.timeofday > 0)
+ var/ticksleft = syndicate_elite_shuttle_time - world.timeofday
+
+ if(ticksleft > 1e5)
+ syndicate_elite_shuttle_time = world.timeofday + 10 // midnight rollover
+ syndicate_elite_shuttle_timeleft = (ticksleft / 10)
+
+ //All this does is announce the time before launch.
+ if(announcer)
+ var/rounded_time_left = round(syndicate_elite_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
+ if(rounded_time_left in message_tracker)//If that time is in the list for message announce.
+ message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\""
+ if(rounded_time_left==0)
+ message = "\"ALERT: TAKEOFF\""
+ announcer.autosay(message, "GLaDOS", "Syndicate Elite Team")
+ message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle.
+ //Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that.
+
+ sleep(5)
+
+ syndicate_elite_shuttle_moving_to_station = 0
+ syndicate_elite_shuttle_moving_to_centcom = 0
+
+ syndicate_elite_shuttle_at_station = 1
+
+ var/area/start_location = locate(/area/shuttle/syndicate_elite/station)
+ var/area/end_location = locate(/area/shuttle/syndicate_elite/mothership)
+
+ var/list/dstturfs = list()
+ var/throwy = world.maxy
+
+ for(var/turf/T in end_location)
+ dstturfs += T
+ if(T.y < throwy)
+ throwy = T.y
+
+ // hey you, get out of the way!
+ for(var/turf/T in dstturfs)
+ // find the turf to move things to
+ var/turf/D = locate(T.x, throwy - 1, 1)
+ //var/turf/E = get_step(D, SOUTH)
+ for(var/atom/movable/AM as mob|obj in T)
+ AM.Move(D)
+ if(istype(T, /turf/simulated))
+ del(T)
+
+ for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area...
+ bug.gib()
+
+ for(var/mob/living/simple_animal/pest in end_location) // And for the other kind of bug...
+ pest.gib()
+
+ start_location.move_contents_to(end_location)
+
+ for(var/turf/T in get_area_turfs(end_location) )
+ var/mob/M = locate(/mob) in T
+ M << "\red You have arrived at Central Command. Operation has ended!"
+
+ syndicate_elite_shuttle_at_station = 0
+
+ for(var/obj/machinery/computer/syndicate_elite_shuttle/S in world)
+ S.syndicate_elite_shuttle_timereset = world.time + SYNDICATE_ELITE_RETURN_DELAY
+
+ del(announcer)
+
+/proc/syndicate_elite_process()
+ var/area/syndicate_mothership/elite_squad = locate()//Where is the specops area located?
+ var/obj/item/device/radio/intercom/announcer = new /obj/item/device/radio/intercom(null)//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
+ announcer.config(list("Syndicate Elite Team" = 0))
+
+ var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values.
+ var/message = "\"THE SPECIAL OPERATIONS SHUTTLE IS PREPARING FOR LAUNCH\""//Initial message shown.
+ if(announcer)
+ announcer.autosay(message, "GLaDOS", "Syndicate Elite Team")
+// message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD"
+// announcer.autosay(message, "GLaDOS", "Syndicate Elite Team")
+
+ while(syndicate_elite_shuttle_time - world.timeofday > 0)
+ var/ticksleft = syndicate_elite_shuttle_time - world.timeofday
+
+ if(ticksleft > 1e5)
+ syndicate_elite_shuttle_time = world.timeofday + 10 // midnight rollover
+ syndicate_elite_shuttle_timeleft = (ticksleft / 10)
+
+ //All this does is announce the time before launch.
+ if(announcer)
+ var/rounded_time_left = round(syndicate_elite_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
+ if(rounded_time_left in message_tracker)//If that time is in the list for message announce.
+ message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\""
+ if(rounded_time_left==0)
+ message = "\"ALERT: TAKEOFF\""
+ announcer.autosay(message, "GLaDOS", "Syndicate Elite Team")
+ message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle.
+ //Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that.
+
+ sleep(5)
+
+ syndicate_elite_shuttle_moving_to_station = 0
+ syndicate_elite_shuttle_moving_to_centcom = 0
+
+ syndicate_elite_shuttle_at_station = 1
+ if (syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_centcom) return
+
+ if (!syndicate_elite_can_move())
+ usr << "\red The Special Operations shuttle is unable to leave."
+ return
+
+/* Begin Marauder launchpad.
+ spawn(0)So it parallel processes it.
+ for(var/obj/machinery/door/poddoor/M in special_ops)
+ switch(M.id)
+ if("ASSAULT0")
+ spawn(10)1 second delay between each.
+ M.open()
+ if("ASSAULT1")
+ spawn(20)
+ M.open()
+ if("ASSAULT2")
+ spawn(30)
+ M.open()
+ if("ASSAULT3")
+ spawn(40)
+ M.open()
+
+ sleep(10)
+
+ var/spawn_marauder[] = new()
+ for(var/obj/effect/landmark/L in world)
+ if(L.name == "Marauder Entry")
+ spawn_marauder.Add(L)
+ for(var/obj/effect/landmark/L in world)
+ if(L.name == "Marauder Exit")
+ var/obj/effect/portal/P = new(L.loc)
+ P.invisibility = 101So it is not seen by anyone.
+ P.failchance = 0So it has no fail chance when teleporting.
+ P.target = pick(spawn_marauder)Where the marauder will arrive.
+ spawn_marauder.Remove(P.target)
+
+ sleep(10)
+
+ for(var/obj/machinery/mass_driver/M in special_ops)
+ switch(M.id)
+ if("ASSAULT0")
+ spawn(10)
+ M.drive()
+ if("ASSAULT1")
+ spawn(20)
+ M.drive()
+ if("ASSAULT2")
+ spawn(30)
+ M.drive()
+ if("ASSAULT3")
+ spawn(40)
+ M.drive()
+
+ sleep(50)Doors remain open for 5 seconds.
+
+ for(var/obj/machinery/door/poddoor/M in special_ops)
+ switch(M.id)//Doors close at the same time.
+ if("ASSAULT0")
+ spawn(0)
+ M.close()
+ if("ASSAULT1")
+ spawn(0)
+ M.close()
+ if("ASSAULT2")
+ spawn(0)
+ M.close()
+ if("ASSAULT3")
+ spawn(0)
+ M.close()
+ special_ops.readyreset()Reset firealarm after the team launched.
+ End Marauder launchpad. */
+
+ var/area/start_location = locate(/area/shuttle/syndicate_elite/mothership)
+ var/area/end_location = locate(/area/shuttle/syndicate_elite/station)
+
+ var/list/dstturfs = list()
+ var/throwy = world.maxy
+
+ for(var/turf/T in end_location)
+ dstturfs += T
+ if(T.y < throwy)
+ throwy = T.y
+
+ // hey you, get out of the way!
+ for(var/turf/T in dstturfs)
+ // find the turf to move things to
+ var/turf/D = locate(T.x, throwy - 1, 1)
+ //var/turf/E = get_step(D, SOUTH)
+ for(var/atom/movable/AM as mob|obj in T)
+ AM.Move(D)
+ if(istype(T, /turf/simulated))
+ del(T)
+
+ start_location.move_contents_to(end_location)
+
+ for(var/turf/T in get_area_turfs(end_location) )
+ var/mob/M = locate(/mob) in T
+ M << "\red You have arrived to [station_name]. Commence operation!"
+
+ for(var/obj/machinery/computer/syndicate_elite_shuttle/S in world)
+ S.syndicate_elite_shuttle_timereset = world.time + SYNDICATE_ELITE_RETURN_DELAY
+
+ del(announcer)
+
+/proc/syndicate_elite_can_move()
+ if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_centcom)
+ return 0
+ for(var/obj/machinery/computer/syndicate_elite_shuttle/S in world)
+ if(world.timeofday <= S.syndicate_elite_shuttle_timereset)
+ return 0
+ return 1
+
+/obj/machinery/computer/syndicate_elite_shuttle/attack_ai(var/mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/syndicate_elite_shuttle/attack_paw(var/mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/syndicate_elite_shuttle/attackby(I as obj, user as mob)
+ if(istype(I,/obj/item/weapon/card/emag))
+ user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals."
+ else
+ return attack_hand(user)
+
+/obj/machinery/computer/syndicate_elite_shuttle/attack_hand(var/mob/user as mob)
+ if(!allowed(user))
+ user << "\red Access Denied."
+ return
+
+//Commented out so admins can do shenanigans at their leisure. Also makes the force-spawned admin ERTs able to use the shuttle.
+// if (sent_strike_team == 0 && send_emergency_team == 0)
+// usr << "\red The strike team has not yet deployed."
+// return
+
+ if(..())
+ return
+
+ user.machine = src
+ var/dat
+ if (temp)
+ dat = temp
+ else
+ dat += {"
Special Operations Shuttle
+ \nLocation: [syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_centcom ? "Departing for [station_name] in ([syndicate_elite_shuttle_timeleft] seconds.)":syndicate_elite_shuttle_at_station ? "Station":"Dock"]
+ [syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_centcom ? "\n*The Special Ops. shuttle is already leaving.*
\n
":syndicate_elite_shuttle_at_station ? "\nShuttle standing by...
\n
":"\nDepart to [station_name]
\n
"]
+ \nClose"}
+
+ user << browse(dat, "window=computer;size=575x450")
+ onclose(user, "computer")
+ return
+
+/obj/machinery/computer/syndicate_elite_shuttle/Topic(href, href_list)
+ if(..())
+ return
+
+ if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ usr.machine = src
+
+ if (href_list["sendtodock"])
+ if(!syndicate_elite_shuttle_at_station|| syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_centcom) return
+
+ if (!syndicate_elite_can_move())
+ usr << "\blue Central Command will not allow the Special Operations shuttle to return yet."
+ if(world.timeofday <= syndicate_elite_shuttle_timereset)
+ if (((world.timeofday - syndicate_elite_shuttle_timereset)/10) > 60)
+ usr << "\blue [-((world.timeofday - syndicate_elite_shuttle_timereset)/10)/60] minutes remain!"
+ usr << "\blue [-(world.timeofday - syndicate_elite_shuttle_timereset)/10] seconds remain!"
+ return
+
+ usr << "\blue The Special Operations shuttle will arrive at Central Command in [(SYNDICATE_ELITE_MOVETIME/10)] seconds."
+
+ temp += "Shuttle departing.
OK"
+ updateUsrDialog()
+
+ syndicate_elite_shuttle_moving_to_centcom = 1
+ syndicate_elite_shuttle_time = world.timeofday + SYNDICATE_ELITE_MOVETIME
+ spawn(0)
+ syndicate_elite_return()
+
+ else if (href_list["sendtostation"])
+ if(syndicate_elite_shuttle_at_station || syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_centcom) return
+
+ if (!syndicate_elite_can_move())
+ usr << "\red The Special Operations shuttle is unable to leave."
+ return
+
+ usr << "\blue The Special Operations shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds."
+
+ temp += "Shuttle departing.
OK"
+ updateUsrDialog()
+
+ var/area/centcom/specops/special_ops = locate()
+ if(special_ops)
+ special_ops.readyalert()//Trigger alarm for the spec ops area.
+ syndicate_elite_shuttle_moving_to_station = 1
+
+ syndicate_elite_shuttle_time = world.timeofday + SYNDICATE_ELITE_MOVETIME
+ spawn(0)
+ specops_process()
+
+ else if (href_list["mainmenu"])
+ temp = null
+
+ add_fingerprint(usr)
+ updateUsrDialog()
+ return
+
+/*Config stuff
+#define SYNDICATE_ELITE_MOVETIME 600 //Time to station is milliseconds. 60 seconds, enough time for everyone to be on the shuttle before it leaves.
+#define SYNDICATE_ELITE_STATION_AREATYPE "/area/shuttle/syndicate_elite/station" //Type of the spec ops shuttle area for station
+#define SYNDICATE_ELITE_DOCK_AREATYPE "/area/shuttle/syndicate_elite/mothership" //Type of the spec ops shuttle area for dock
+
+var/syndicate_elite_shuttle_moving_to_station = 0
+var/syndicate_elite_shuttle_moving_to_centcom = 0
+var/syndicate_elite_shuttle_at_station = 0
+var/syndicate_elite_shuttle_can_send = 1
+var/syndicate_elite_shuttle_time = 0
+var/syndicate_elite_shuttle_timeleft = 0
+
+/obj/machinery/computer/syndicate_elite_shuttle
+ name = "Spec. Ops. Shuttle Console"
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "shuttle"
+ req_access = list(access_cent_specops)
+ var/temp = null
+ var/hacked = 0
+ var/allowedtocall = 0
+
+/proc/syndicate_elite_process()
+ area/syndicate_mothership/control = locate()//To find announcer. This area should exist for this proc to work.
+ var/area/syndicate_mothership/elite_squad = locate()//Where is the specops area located?
+ var/mob/living/silicon/decoy/announcer = locate() in cent_com//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
+
+ var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values.
+ var/message = "THE SPECIAL OPERATIONS SHUTTLE IS PREPARING FOR LAUNCH"//Initial message shown.
+ if(announcer)
+ announcer.say(message)
+ message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD"
+ announcer.say(message)
+
+ while(syndicate_elite_shuttle_time - world.timeofday > 0)
+ var/ticksleft = syndicate_elite_shuttle_time - world.timeofday
+
+ if(ticksleft > 1e5)
+ syndicate_elite_shuttle_time = world.timeofday + 10 // midnight rollover
+ syndicate_elite_shuttle_timeleft = (ticksleft / 10)
+
+ //All this does is announce the time before launch.
+ if(announcer)
+ var/rounded_time_left = round(syndicate_elite_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
+ if(rounded_time_left in message_tracker)//If that time is in the list for message announce.
+ message = "ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN"
+ if(rounded_time_left==0)
+ message = "ALERT: TAKEOFF"
+ announcer.say(message)
+ message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle.
+ //Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that.
+
+ sleep(5)
+
+ syndicate_elite_shuttle_moving_to_station = 0
+ syndicate_elite_shuttle_moving_to_centcom = 0
+
+ syndicate_elite_shuttle_at_station = 1
+ if (syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_centcom) return
+
+ if (!syndicate_elite_can_move())
+ usr << "\red The Special Operations shuttle is unable to leave."
+ return
+
+ //Begin Marauder launchpad.
+ spawn(0)//So it parallel processes it.
+ for(var/obj/machinery/door/poddoor/M in special_ops)
+ switch(M.id)
+ if("ASSAULT0")
+ spawn(10)//1 second delay between each.
+ M.open()
+ if("ASSAULT1")
+ spawn(20)
+ M.open()
+ if("ASSAULT2")
+ spawn(30)
+ M.open()
+ if("ASSAULT3")
+ spawn(40)
+ M.open()
+
+ sleep(10)
+
+ var/spawn_marauder[] = new()
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(L.name == "Marauder Entry")
+ spawn_marauder.Add(L)
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(L.name == "Marauder Exit")
+ var/obj/effect/portal/P = new(L.loc)
+ P.invisibility = 101//So it is not seen by anyone.
+ P.failchance = 0//So it has no fail chance when teleporting.
+ P.target = pick(spawn_marauder)//Where the marauder will arrive.
+ spawn_marauder.Remove(P.target)
+
+ sleep(10)
+
+ for(var/obj/machinery/mass_driver/M in special_ops)
+ switch(M.id)
+ if("ASSAULT0")
+ spawn(10)
+ M.drive()
+ if("ASSAULT1")
+ spawn(20)
+ M.drive()
+ if("ASSAULT2")
+ spawn(30)
+ M.drive()
+ if("ASSAULT3")
+ spawn(40)
+ M.drive()
+
+ sleep(50)//Doors remain open for 5 seconds.
+
+ for(var/obj/machinery/door/poddoor/M in special_ops)
+ switch(M.id)//Doors close at the same time.
+ if("ASSAULT0")
+ spawn(0)
+ M.close()
+ if("ASSAULT1")
+ spawn(0)
+ M.close()
+ if("ASSAULT2")
+ spawn(0)
+ M.close()
+ if("ASSAULT3")
+ spawn(0)
+ M.close()
+ special_ops.readyreset()//Reset firealarm after the team launched.
+ //End Marauder launchpad.
+
+ var/area/start_location = locate(/area/shuttle/syndicate_elite/mothership)
+ var/area/end_location = locate(/area/shuttle/syndicate_elite/station)
+
+ var/list/dstturfs = list()
+ var/throwy = world.maxy
+
+ for(var/turf/T in end_location)
+ dstturfs += T
+ if(T.y < throwy)
+ throwy = T.y
+
+ // hey you, get out of the way!
+ for(var/turf/T in dstturfs)
+ // find the turf to move things to
+ var/turf/D = locate(T.x, throwy - 1, 1)
+ //var/turf/E = get_step(D, SOUTH)
+ for(var/atom/movable/AM as mob|obj in T)
+ AM.Move(D)
+ if(istype(T, /turf/simulated))
+ del(T)
+
+ start_location.move_contents_to(end_location)
+
+ for(var/turf/T in get_area_turfs(end_location) )
+ var/mob/M = locate(/mob) in T
+ M << "\red You have arrived to [station_name]. Commence operation!"
+
+/proc/syndicate_elite_can_move()
+ if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_centcom) return 0
+ else return 1
+
+/obj/machinery/computer/syndicate_elite_shuttle/attackby(I as obj, user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/syndicate_elite_shuttle/attack_ai(var/mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/syndicate_elite_shuttle/attack_paw(var/mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/syndicate_elite_shuttle/attackby(I as obj, user as mob)
+ if(istype(I,/obj/item/weapon/card/emag))
+ user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals."
+ else
+ return attack_hand(user)
+
+/obj/machinery/computer/syndicate_elite_shuttle/attack_hand(var/mob/user as mob)
+ if(!allowed(user))
+ user << "\red Access Denied."
+ return
+
+// if (sent_strike_team == 0)
+// usr << "\red The strike team has not yet deployed."
+// return
+
+ if(..())
+ return
+
+ user.set_machine(src)
+ var/dat
+ if (temp)
+ dat = temp
+ else
+ dat += {"
Special Operations Shuttle
+ \nLocation: [syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_centcom ? "Departing for [station_name] in ([syndicate_elite_shuttle_timeleft] seconds.)":syndicate_elite_shuttle_at_station ? "Station":"Dock"]
+ [syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_centcom ? "\n*The Special Ops. shuttle is already leaving.*
\n
":syndicate_elite_shuttle_at_station ? "\nShuttle Offline
\n
":"\nDepart to [station_name]
\n
"]
+ \nClose"}
+
+ user << browse(dat, "window=computer;size=575x450")
+ onclose(user, "computer")
+ return
+
+/obj/machinery/computer/syndicate_elite_shuttle/Topic(href, href_list)
+ if(..())
+ return
+
+ if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ usr.set_machine(src)
+
+ if (href_list["sendtodock"])
+ if(!syndicate_elite_shuttle_at_station|| syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_centcom) return
+
+ usr << "\blue Central Command will not allow the Special Operations shuttle to return."
+ return
+
+ else if (href_list["sendtostation"])
+ if(syndicate_elite_shuttle_at_station || syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_centcom) return
+
+ if (!syndicate_elite_can_move())
+ usr << "\red The Special Operations shuttle is unable to leave."
+ return
+
+ usr << "\blue The Special Operations shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds."
+
+ temp += "Shuttle departing.
OK"
+ updateUsrDialog()
+
+ var/area/centcom/specops/special_ops = locate()
+ if(special_ops)
+ special_ops.readyalert()//Trigger alarm for the spec ops area.
+ specops_shuttle_moving_to_station = 1
+
+ specops_shuttle_time = world.timeofday + SYNDICATE_ELITE_MOVETIME
+ spawn(0)
+ syndicate_elite_process()
+
+ else if (href_list["mainmenu"])
+ temp = null
+
+ add_fingerprint(usr)
+ updateUsrDialog()
+ return
+ */
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 10d12c9d..5c58ee46 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -87,7 +87,12 @@
icon_opened = "ertopen"
/obj/structure/closet/ertcloset/New()
- new /obj/item/clothing/mask/balaclava(src)
new /obj/item/clothing/gloves/combat(src)
new /obj/item/clothing/shoes/combat(src)
new /obj/item/device/radio/headset/ert(src)
+ new /obj/item/clothing/under/rank/ert_soldier(src)
+ new /obj/item/clothing/under/rank/ert_soldier(src)
+ new /obj/item/clothing/under/rank/ert_nco(src)
+ new /obj/item/clothing/under/rank/ert_nco(src)
+ new /obj/item/clothing/under/rank/ert_officer(src)
+ new /obj/item/clothing/under/rank/ert_officer(src)
\ No newline at end of file
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index b2afab74..b8df2fa6 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -183,4 +183,40 @@
desc = "Pukish armor."
icon_state = "tdgreen"
item_state = "tdgreen"
- siemens_coefficient = 1
\ No newline at end of file
+ siemens_coefficient = 1
+
+/obj/item/clothing/suit/armor/vest/ert_soldier
+ name = "ERT trooper vest"
+ desc = "A platecarrier worns by the troopers of NanoTrasen's Emergency Response Teams."
+ icon_state = "ert_soldier"
+ item_state = "ert_soldier"
+ blood_overlay_type = "armor"
+ flags = FPRINT | TABLEPASS | ONESIZEFITSALL
+ armor = list(melee = 65, bullet = 25, laser = 65, energy = 25, bomb = 35, bio = 0, rad = 0)
+
+/obj/item/clothing/suit/armor/vest/ert_nco
+ name = "ERT leading trooper vest"
+ desc = "A platecarrier worns by the leading troopers of NanoTrasen's Emergency Response Teams."
+ icon_state = "ert_nco"
+ item_state = "ert_nco"
+ blood_overlay_type = "armor"
+ flags = FPRINT | TABLEPASS | ONESIZEFITSALL
+ armor = list(melee = 65, bullet = 25, laser = 65, energy = 25, bomb = 35, bio = 0, rad = 0)
+
+/obj/item/clothing/suit/armor/vest/ert_officer
+ name = "ERT sub-officer vest"
+ desc = "A platecarrier worns by the sub-officers of NanoTrasen's Emergency Response Teams."
+ icon_state = "ert_officer"
+ item_state = "ert_ófficer"
+ blood_overlay_type = "armor"
+ flags = FPRINT | TABLEPASS | ONESIZEFITSALL
+ armor = list(melee = 65, bullet = 25, laser = 65, energy = 25, bomb = 35, bio = 0, rad = 0)
+
+/obj/item/clothing/suit/armor/vest/ert_commander
+ name = "ERT commander vest"
+ desc = "A platecarrier worns by the commanders of NanoTrasen's Emergency Response Teams."
+ icon_state = "ert_cdr"
+ item_state = "ert_cdr"
+ blood_overlay_type = "armor"
+ flags = FPRINT | TABLEPASS | ONESIZEFITSALL
+ armor = list(melee = 65, bullet = 25, laser = 65, energy = 25, bomb = 35, bio = 0, rad = 0)
\ No newline at end of file
diff --git a/code/modules/clothing/under/jobs/ert.dm b/code/modules/clothing/under/jobs/ert.dm
new file mode 100644
index 00000000..63e32955
--- /dev/null
+++ b/code/modules/clothing/under/jobs/ert.dm
@@ -0,0 +1,40 @@
+/obj/item/clothing/under/rank/ert_soldier
+ desc = "An under-armour combat shirt worn by troopers of the NanoTrasen Emergency Response Teams."
+ name = "ERT trooper jumpsuit"
+ icon_state = "ert_soldier"
+ item_state = "ert_soldier"
+ item_color = "ert_soldier"
+ armor = list(melee = 10, bullet = 0, laser = 10,energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags = FPRINT | TABLEPASS
+ siemens_coefficient = 0.8
+
+/obj/item/clothing/under/rank/ert_nco
+ desc = "An under-armour combat shirt worn by the leading troopers of the NanoTrasen Emergency Response Teams."
+ name = "ERT leading trooper jumpsuit"
+ icon_state = "ert_nco"
+ item_state = "ert_nco"
+ item_color = "ert_nco"
+ armor = list(melee = 10, bullet = 0, laser = 10,energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags = FPRINT | TABLEPASS
+ siemens_coefficient = 0.8
+
+/obj/item/clothing/under/rank/ert_officer
+ desc = "An under-armour combat shirt worn by the sub-officers of the NanoTrasen Emergency Response Teams."
+ name = "ERT sub-officer jumpsuit"
+ icon_state = "ert_officer"
+ item_state = "ert_officer"
+ item_color = "ert_officer"
+ armor = list(melee = 10, bullet = 0, laser = 10,energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags = FPRINT | TABLEPASS
+ siemens_coefficient = 0.8
+
+/obj/item/clothing/under/rank/ert_commander
+ desc = "An under-armour combat shirt worn by the commanders of the NanoTrasen Emergency Response Teams."
+ name = "ERT commander jumpsuit"
+ icon_state = "ert_cdr"
+ item_state = "ert_cdr"
+ item_color = "ert_cdr"
+ armor = list(melee = 10, bullet = 0, laser = 10,energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags = FPRINT | TABLEPASS
+ siemens_coefficient = 0.8
+
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 95a7a85e..16ff016c 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 00188b87..4c4b3653 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 03418ee8..3ddbc967 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 0421e18a..6aa198de 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 2ccda9b5..19ebaaac 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ