diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index c429e40cce4..aa084b42614 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -652,13 +652,11 @@ REAGENT SCANNER
var/time_to_use = 0 // How much time remaining before next scan is available.
var/usecharge = 750
-/obj/item/bodyanalyzer/New(cell)
+/obj/item/bodyanalyzer/advanced
+ cell_type = /obj/item/stock_parts/cell/upgraded/plus
+
+/obj/item/bodyanalyzer/New()
..()
- if(cell && istype(cell, /obj/item/stock_parts/cell))
- power_supply = new cell(src)
- else
- power_supply = new cell_type(src)
- power_supply.give(power_supply.maxcharge)
update_icon()
/obj/item/bodyanalyzer/proc/setReady()
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 9d4481952f5..b1694c6435f 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -210,6 +210,13 @@
new /obj/item/grenade/flashbang(src)
update_icon()
+/obj/item/storage/belt/security/response_team/gamma/New()
+ new /obj/item/melee/classic_baton(src)
+ new /obj/item/reagent_containers/spray/pepper(src)
+ new /obj/item/flash(src)
+ new /obj/item/grenade/flashbang(src)
+ new /obj/item/grenade/flashbang(src)
+
/obj/item/storage/belt/soulstone
name = "soul stone belt"
desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away"
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index d4482c55f14..d461700695d 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -123,3 +123,13 @@
new /obj/item/clothing/accessory/medal/conduct(src)
new /obj/item/clothing/accessory/medal/conduct(src)
new /obj/item/clothing/accessory/medal/gold/captain(src)
+
+/obj/item/storage/lockbox/t4
+ name = "lockbox (T4)"
+ desc = "Contains three T4 breaching charges."
+ req_access = list(access_cent_specops)
+
+/obj/item/storage/lockbox/t4/New()
+ ..()
+ for(var/i = 0, i < 3, i++)
+ new /obj/item/grenade/plastic/x4/thermite(src)
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert_suits.dm
similarity index 100%
rename from code/modules/clothing/spacesuits/rig/suits/ert.dm
rename to code/modules/clothing/spacesuits/rig/suits/ert_suits.dm
diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm
new file mode 100644
index 00000000000..b9d8782a8c5
--- /dev/null
+++ b/code/modules/response_team/ert.dm
@@ -0,0 +1,375 @@
+// ERTs
+
+#define ERT_TYPE_AMBER 1
+#define ERT_TYPE_RED 2
+#define ERT_TYPE_GAMMA 3
+
+/datum/game_mode
+ var/list/datum/mind/ert = list()
+
+var/list/response_team_members = list()
+var/responseteam_age = 21 // Minimum account age to play as an ERT member
+var/datum/response_team/active_team = null
+var/send_emergency_team = 0
+var/ert_request_answered = 0
+
+/client/proc/response_team()
+ set name = "Dispatch CentComm Response Team"
+ set category = "Event"
+ set desc = "Send an CentComm response team to the station."
+
+ if(!check_rights(R_EVENT))
+ return
+
+ if(!ticker)
+ to_chat(usr, "The game hasn't started yet!")
+ return
+
+ if(ticker.current_state == 1)
+ to_chat(usr, "The round hasn't started yet!")
+ return
+
+ if(send_emergency_team)
+ to_chat(usr, "Central Command has already dispatched an emergency response team!")
+ return
+
+ var/datum/nano_module/ert_manager/E = new()
+ E.ui_interact(usr)
+
+
+/mob/dead/observer/proc/JoinResponseTeam()
+ if(!send_emergency_team)
+ to_chat(src, "No emergency response team is currently being sent.")
+ return 0
+
+ if(jobban_isbanned(src, ROLE_ERT))
+ to_chat(src, "You are jobbanned from the emergency reponse team!")
+ return 0
+
+ var/player_age_check = check_client_age(client, responseteam_age)
+ if(player_age_check && config.use_age_restriction_for_antags)
+ to_chat(src, "This role is not yet available to you. You need to wait another [player_age_check] days.")
+ return 0
+
+ if(cannotPossess(src))
+ to_chat(src, "Upon using the antagHUD you forfeited the ability to join the round.")
+ return 0
+
+ if(response_team_members.len > 6)
+ to_chat(src, "The emergency response team is already full!")
+ return 0
+
+ return 1
+
+/proc/trigger_armed_response_team(var/datum/response_team/response_team_type, commander_slots, security_slots, medical_slots, engineering_slots, janitor_slots, paranormal_slots, cyborg_slots)
+ response_team_members = list()
+ active_team = response_team_type
+ active_team.setSlots(commander_slots, security_slots, medical_slots, engineering_slots, janitor_slots, paranormal_slots, cyborg_slots)
+
+ send_emergency_team = 1
+ var/list/ert_candidates = pollCandidates("Join the Emergency Response Team?",, responseteam_age, 600, 1, role_playtime_requirements[ROLE_ERT])
+ if(!ert_candidates.len)
+ active_team.cannot_send_team()
+ send_emergency_team = 0
+ return 0
+
+ // Respawnable players get first dibs
+ for(var/mob/dead/observer/M in ert_candidates)
+ if(jobban_isbanned(M, ROLE_TRAITOR) || jobban_isbanned(M, "Security Officer") || jobban_isbanned(M, "Captain") || jobban_isbanned(M, "Cyborg"))
+ continue
+ if((M in respawnable_list) && M.JoinResponseTeam())
+ response_team_members |= M
+ // If there's still open slots, non-respawnable players can fill them
+ for(var/mob/dead/observer/M in (ert_candidates - respawnable_list))
+ if(M.JoinResponseTeam())
+ response_team_members |= M
+
+ if(!response_team_members.len)
+ active_team.cannot_send_team()
+ send_emergency_team = 0
+ return 0
+
+ var/index = 1
+ var/ert_spawn_seconds = 120
+ spawn(ert_spawn_seconds * 10) // to account for spawn() using deciseconds
+ var/list/unspawnable_ert = list()
+ for(var/mob/M in response_team_members)
+ if(M)
+ unspawnable_ert |= M
+ if(unspawnable_ert.len)
+ message_admins("ERT SPAWN: The following ERT members could not be spawned within [ert_spawn_seconds] seconds:")
+ for(var/mob/M in unspawnable_ert)
+ message_admins("- Unspawned ERT: [ADMIN_FULLMONTY(M)]")
+ for(var/mob/M in response_team_members)
+ if(index > emergencyresponseteamspawn.len)
+ index = 1
+
+ if(!M || !M.client)
+ continue
+ var/client/C = M.client
+ var/mob/living/new_commando = C.create_response_team(emergencyresponseteamspawn[index])
+ if(!M || !new_commando)
+ continue
+ new_commando.mind.key = M.key
+ new_commando.key = M.key
+ new_commando.update_icons()
+ index++
+
+ send_emergency_team = 0
+ active_team.announce_team()
+ return 1
+
+/client/proc/create_response_team(var/turf/spawn_location)
+ var/class = 0
+ while(!class)
+ class = input(src, "Which loadout would you like to choose?") in active_team.get_slot_list()
+ if(!active_team.check_slot_available(class)) // Because the prompt does not update automatically when a slot gets filled.
+ class = 0
+
+ if(class == "Cyborg")
+ active_team.reduceCyborgSlots()
+ var/cyborg_unlock = active_team.getCyborgUnlock()
+ var/mob/living/silicon/robot/ert/R = new /mob/living/silicon/robot/ert(spawn_location, cyborg_unlock)
+ return R
+
+ var/mob/living/carbon/human/M = new(null)
+ var/obj/item/organ/external/head/head_organ = M.get_organ("head")
+
+ var/new_gender = alert(src, "Please select your gender.", "ERT Character Generation", "Male", "Female")
+
+ if(new_gender)
+ if(new_gender == "Male")
+ M.change_gender(MALE)
+ else
+ M.change_gender(FEMALE)
+
+ M.set_species(/datum/species/human, TRUE)
+ M.dna.ready_dna(M)
+ M.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ERT.
+ M.overeatduration = 0
+
+ var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde
+ var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue
+ var/skin_tone = rand(-120, 20) // A range of skin colors
+
+ head_organ.facial_colour = hair_c
+ head_organ.sec_facial_colour = hair_c
+ head_organ.hair_colour = hair_c
+ head_organ.sec_hair_colour = hair_c
+ M.change_eye_color(eye_c)
+ M.s_tone = skin_tone
+ head_organ.h_style = random_hair_style(M.gender, head_organ.dna.species.name)
+ head_organ.f_style = random_facial_hair_style(M.gender, head_organ.dna.species.name)
+
+ M.rename_character(null, "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]")
+ M.age = rand(23,35)
+ M.regenerate_icons()
+ M.update_body()
+ M.update_dna()
+
+ //Creates mind stuff.
+ M.mind = new
+ M.mind.current = M
+ M.mind.original = M
+ M.mind.assigned_role = SPECIAL_ROLE_ERT
+ M.mind.special_role = SPECIAL_ROLE_ERT
+ if(!(M.mind in ticker.minds))
+ ticker.minds += M.mind //Adds them to regular mind list.
+ ticker.mode.ert += M.mind
+ M.forceMove(spawn_location)
+
+ job_master.CreateMoneyAccount(M, class, null)
+
+ active_team.equip_officer(class, M)
+
+ return M
+
+
+/datum/response_team
+ var/command_slots = 1
+ var/engineer_slots = 3
+ var/medical_slots = 3
+ var/security_slots = 3
+ var/janitor_slots = 0
+ var/paranormal_slots = 0
+ var/cyborg_slots = 0
+
+ var/command_outfit
+ var/engineering_outfit
+ var/medical_outfit
+ var/security_outfit
+ var/janitor_outfit
+ var/paranormal_outfit
+ var/cyborg_unlock = 0
+
+/datum/response_team/proc/setSlots(com, sec, med, eng, jan, par, cyb)
+ command_slots = com == null ? command_slots : com
+ security_slots = sec == null ? security_slots : sec
+ medical_slots = med == null ? medical_slots : med
+ engineer_slots = eng == null ? engineer_slots : eng
+ janitor_slots = jan == null ? janitor_slots : jan
+ paranormal_slots = par == null ? paranormal_slots : par
+ cyborg_slots = cyb == null ? cyborg_slots : cyb
+
+/datum/response_team/proc/reduceCyborgSlots()
+ cyborg_slots--
+
+/datum/response_team/proc/getCyborgUnlock()
+ return cyborg_unlock
+
+/datum/response_team/proc/get_slot_list()
+ var/list/slots_available = list()
+ if(command_slots)
+ slots_available |= "Commander"
+ if(security_slots)
+ slots_available |= "Security"
+ if(engineer_slots)
+ slots_available |= "Engineer"
+ if(medical_slots)
+ slots_available |= "Medic"
+ if(janitor_slots)
+ slots_available |= "Janitor"
+ if(paranormal_slots)
+ slots_available |= "Paranormal"
+ if(cyborg_slots)
+ slots_available |= "Cyborg"
+ return slots_available
+
+/datum/response_team/proc/check_slot_available(var/slot)
+ switch(slot)
+ if("Commander")
+ return command_slots
+ if("Security")
+ return security_slots
+ if("Engineer")
+ return engineer_slots
+ if("Medic")
+ return medical_slots
+ if("Janitor")
+ return janitor_slots
+ if("Paranormal")
+ return paranormal_slots
+ if("Cyborg")
+ return cyborg_slots
+ return 0
+
+/datum/response_team/proc/equip_officer(var/officer_type, var/mob/living/carbon/human/M)
+ switch(officer_type)
+ if("Engineer")
+ engineer_slots -= 1
+ M.equipOutfit(engineering_outfit)
+ M.job = "ERT Engineering"
+
+ if("Security")
+ security_slots -= 1
+ M.equipOutfit(security_outfit)
+ M.job = "ERT Security"
+
+ if("Medic")
+ medical_slots -= 1
+ M.equipOutfit(medical_outfit)
+ M.job = "ERT Medical"
+
+ if("Janitor")
+ janitor_slots -= 1
+ M.equipOutfit(janitor_outfit)
+ M.job = "ERT Janitor"
+
+ if("Paranormal")
+ paranormal_slots -= 1
+ M.equipOutfit(paranormal_outfit)
+ M.job = "ERT Paranormal"
+
+ if("Commander")
+ command_slots = 0
+
+ // Override name and age for the commander
+ M.rename_character(null, "[pick("Lieutenant", "Captain", "Major")] [pick(last_names)]")
+ M.age = rand(35,45)
+
+ M.equipOutfit(command_outfit)
+ M.job = "ERT Commander"
+
+/datum/response_team/proc/cannot_send_team()
+ event_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable")
+
+/datum/response_team/proc/announce_team()
+ event_announcement.Announce("Attention, [station_name()]. We are sending a team of highly trained assistants to aid(?) you. Standby.", "ERT En-Route")
+
+// -- AMBER TEAM --
+
+/datum/response_team/amber
+ engineering_outfit = /datum/outfit/job/centcom/response_team/engineer/amber
+ security_outfit = /datum/outfit/job/centcom/response_team/security/amber
+ medical_outfit = /datum/outfit/job/centcom/response_team/medic/amber
+ command_outfit = /datum/outfit/job/centcom/response_team/commander/amber
+ janitor_outfit = /datum/outfit/job/centcom/response_team/janitorial/amber
+ paranormal_outfit = /datum/outfit/job/centcom/response_team/paranormal/amber
+
+/datum/response_team/amber/announce_team()
+ event_announcement.Announce("Attention, [station_name()]. We are sending a code AMBER light Emergency Response Team. Standby.", "ERT En-Route")
+
+// -- RED TEAM --
+
+/datum/response_team/red
+ engineering_outfit = /datum/outfit/job/centcom/response_team/engineer/red
+ security_outfit = /datum/outfit/job/centcom/response_team/security/red
+ medical_outfit = /datum/outfit/job/centcom/response_team/medic/red
+ command_outfit = /datum/outfit/job/centcom/response_team/commander/red
+ janitor_outfit = /datum/outfit/job/centcom/response_team/janitorial/red
+ paranormal_outfit = /datum/outfit/job/centcom/response_team/paranormal/red
+
+/datum/response_team/red/announce_team()
+ event_announcement.Announce("Attention, [station_name()]. We are sending a code RED Emergency Response Team. Standby.", "ERT En-Route")
+
+// -- GAMMA TEAM --
+
+/datum/response_team/gamma
+ engineering_outfit = /datum/outfit/job/centcom/response_team/engineer/gamma
+ security_outfit = /datum/outfit/job/centcom/response_team/security/gamma
+ medical_outfit = /datum/outfit/job/centcom/response_team/medic/gamma
+ command_outfit = /datum/outfit/job/centcom/response_team/commander/gamma
+ janitor_outfit = /datum/outfit/job/centcom/response_team/janitorial/gamma
+ paranormal_outfit = /datum/outfit/job/centcom/response_team/paranormal/gamma
+ cyborg_unlock = 1
+
+/datum/response_team/gamma/announce_team()
+ event_announcement.Announce("Attention, [station_name()]. We are sending a code GAMMA elite Emergency Response Team. Standby.", "ERT En-Route")
+
+/datum/outfit/job/centcom/response_team
+ name = "Response team"
+ var/rt_assignment = "Emergency Response Team Member"
+ var/rt_job = "This is a bug"
+ allow_backbag_choice = FALSE
+ allow_loadout = FALSE
+ pda = /obj/item/pda/heads/ert
+ id = /obj/item/card/id/ert
+ l_ear = /obj/item/radio/headset/ert/alt
+
+ implants = list(/obj/item/implant/mindshield)
+
+/datum/outfit/job/centcom/response_team/pre_equip()
+ . = ..()
+ backpack_contents.Insert(1, /obj/item/storage/box/responseteam)
+ backpack_contents[/obj/item/storage/box/responseteam] = 1
+
+/obj/item/radio/centcom
+ name = "centcomm bounced radio"
+ frequency = ERT_FREQ
+ icon_state = "radio"
+
+/obj/item/storage/box/responseteam/
+ name = "boxed survival kit"
+
+/obj/item/storage/box/responseteam/New()
+ ..()
+ contents = list()
+ sleep(1)
+ new /obj/item/clothing/mask/breath( src )
+ new /obj/item/tank/emergency_oxygen/engi( src )
+ new /obj/item/flashlight/flare( src )
+ new /obj/item/kitchen/knife/combat( src )
+ new /obj/item/radio/centcom( src )
+ new /obj/item/reagent_containers/food/pill/salicylic( src )
+ new /obj/item/reagent_containers/food/pill/patch/synthflesh( src )
+ return
diff --git a/code/game/response_team.dm b/code/modules/response_team/ert_outfits.dm
similarity index 50%
rename from code/game/response_team.dm
rename to code/modules/response_team/ert_outfits.dm
index 646adfa2038..b7a85700cf7 100644
--- a/code/game/response_team.dm
+++ b/code/modules/response_team/ert_outfits.dm
@@ -1,357 +1,4 @@
-// ERTs
-
-#define ERT_TYPE_AMBER 1
-#define ERT_TYPE_RED 2
-#define ERT_TYPE_GAMMA 3
-
-/datum/game_mode
- var/list/datum/mind/ert = list()
-
-var/list/response_team_members = list()
-var/responseteam_age = 21 // Minimum account age to play as an ERT member
-var/datum/response_team/active_team = null
-var/send_emergency_team = 0
-var/ert_request_answered = 0
-
-/client/proc/response_team()
- set name = "Dispatch CentComm Response Team"
- set category = "Event"
- set desc = "Send an CentComm response team to the station."
-
- if(!check_rights(R_EVENT))
- return
-
- if(!ticker)
- to_chat(usr, "The game hasn't started yet!")
- return
-
- if(ticker.current_state == 1)
- to_chat(usr, "The round hasn't started yet!")
- return
-
- if(send_emergency_team)
- to_chat(usr, "Central Command has already dispatched an emergency response team!")
- return
-
- var/datum/nano_module/ert_manager/E = new()
- E.ui_interact(usr)
-
-
-/mob/dead/observer/proc/JoinResponseTeam()
- if(!send_emergency_team)
- to_chat(src, "No emergency response team is currently being sent.")
- return 0
-
- if(jobban_isbanned(src, ROLE_ERT))
- to_chat(src, "You are jobbanned from the emergency reponse team!")
- return 0
-
- var/player_age_check = check_client_age(client, responseteam_age)
- if(player_age_check && config.use_age_restriction_for_antags)
- to_chat(src, "This role is not yet available to you. You need to wait another [player_age_check] days.")
- return 0
-
- if(cannotPossess(src))
- to_chat(src, "Upon using the antagHUD you forfeited the ability to join the round.")
- return 0
-
- if(response_team_members.len > 6)
- to_chat(src, "The emergency response team is already full!")
- return 0
-
- return 1
-
-/proc/trigger_armed_response_team(var/datum/response_team/response_team_type, commander_slots, security_slots, medical_slots, engineering_slots, janitor_slots, paranormal_slots, cyborg_slots)
- response_team_members = list()
- active_team = response_team_type
- active_team.setSlots(commander_slots, security_slots, medical_slots, engineering_slots, janitor_slots, paranormal_slots, cyborg_slots)
-
- send_emergency_team = 1
- var/list/ert_candidates = pollCandidates("Join the Emergency Response Team?",, responseteam_age, 600, 1, role_playtime_requirements[ROLE_ERT])
- if(!ert_candidates.len)
- active_team.cannot_send_team()
- send_emergency_team = 0
- return 0
-
- // Respawnable players get first dibs
- for(var/mob/dead/observer/M in ert_candidates)
- if(jobban_isbanned(M, ROLE_TRAITOR) || jobban_isbanned(M, "Security Officer") || jobban_isbanned(M, "Captain") || jobban_isbanned(M, "Cyborg"))
- continue
- if((M in respawnable_list) && M.JoinResponseTeam())
- response_team_members |= M
- // If there's still open slots, non-respawnable players can fill them
- for(var/mob/dead/observer/M in (ert_candidates - respawnable_list))
- if(M.JoinResponseTeam())
- response_team_members |= M
-
- if(!response_team_members.len)
- active_team.cannot_send_team()
- send_emergency_team = 0
- return 0
-
- var/index = 1
- var/ert_spawn_seconds = 120
- spawn(ert_spawn_seconds * 10) // to account for spawn() using deciseconds
- var/list/unspawnable_ert = list()
- for(var/mob/M in response_team_members)
- if(M)
- unspawnable_ert |= M
- if(unspawnable_ert.len)
- message_admins("ERT SPAWN: The following ERT members could not be spawned within [ert_spawn_seconds] seconds:")
- for(var/mob/M in unspawnable_ert)
- message_admins("- Unspawned ERT: [ADMIN_FULLMONTY(M)]")
- for(var/mob/M in response_team_members)
- if(index > emergencyresponseteamspawn.len)
- index = 1
-
- if(!M || !M.client)
- continue
- var/client/C = M.client
- var/mob/living/new_commando = C.create_response_team(emergencyresponseteamspawn[index])
- if(!M || !new_commando)
- continue
- new_commando.mind.key = M.key
- new_commando.key = M.key
- new_commando.update_icons()
- index++
-
- send_emergency_team = 0
- active_team.announce_team()
- return 1
-
-/client/proc/create_response_team(var/turf/spawn_location)
- var/class = 0
- while(!class)
- class = input(src, "Which loadout would you like to choose?") in active_team.get_slot_list()
- if(!active_team.check_slot_available(class)) // Because the prompt does not update automatically when a slot gets filled.
- class = 0
-
- if(class == "Cyborg")
- active_team.reduceCyborgSlots()
- var/cyborg_unlock = active_team.getCyborgUnlock()
- var/mob/living/silicon/robot/ert/R = new /mob/living/silicon/robot/ert(spawn_location, cyborg_unlock)
- return R
-
- var/mob/living/carbon/human/M = new(null)
- var/obj/item/organ/external/head/head_organ = M.get_organ("head")
-
- var/new_gender = alert(src, "Please select your gender.", "ERT Character Generation", "Male", "Female")
-
- if(new_gender)
- if(new_gender == "Male")
- M.change_gender(MALE)
- else
- M.change_gender(FEMALE)
-
- M.set_species(/datum/species/human, TRUE)
- M.dna.ready_dna(M)
- M.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ERT.
- M.overeatduration = 0
-
- var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde
- var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue
- var/skin_tone = rand(-120, 20) // A range of skin colors
-
- head_organ.facial_colour = hair_c
- head_organ.sec_facial_colour = hair_c
- head_organ.hair_colour = hair_c
- head_organ.sec_hair_colour = hair_c
- M.change_eye_color(eye_c)
- M.s_tone = skin_tone
- head_organ.h_style = random_hair_style(M.gender, head_organ.dna.species.name)
- head_organ.f_style = random_facial_hair_style(M.gender, head_organ.dna.species.name)
-
- M.rename_character(null, "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]")
- M.age = rand(23,35)
- M.regenerate_icons()
- M.update_body()
- M.update_dna()
-
- //Creates mind stuff.
- M.mind = new
- M.mind.current = M
- M.mind.original = M
- M.mind.assigned_role = SPECIAL_ROLE_ERT
- M.mind.special_role = SPECIAL_ROLE_ERT
- if(!(M.mind in ticker.minds))
- ticker.minds += M.mind //Adds them to regular mind list.
- ticker.mode.ert += M.mind
- M.forceMove(spawn_location)
-
- job_master.CreateMoneyAccount(M, class, null)
-
- active_team.equip_officer(class, M)
-
- return M
-
-
-/datum/response_team
- var/command_slots = 1
- var/engineer_slots = 3
- var/medical_slots = 3
- var/security_slots = 3
- var/janitor_slots = 0
- var/paranormal_slots = 0
- var/cyborg_slots = 0
-
- var/command_outfit
- var/engineering_outfit
- var/medical_outfit
- var/security_outfit
- var/janitor_outfit
- var/paranormal_outfit
- var/cyborg_unlock = 0
-
-/datum/response_team/proc/setSlots(com, sec, med, eng, jan, par, cyb)
- command_slots = com == null ? command_slots : com
- security_slots = sec == null ? security_slots : sec
- medical_slots = med == null ? medical_slots : med
- engineer_slots = eng == null ? engineer_slots : eng
- janitor_slots = jan == null ? janitor_slots : jan
- paranormal_slots = par == null ? paranormal_slots : par
- cyborg_slots = cyb == null ? cyborg_slots : cyb
-
-/datum/response_team/proc/reduceCyborgSlots()
- cyborg_slots--
-
-/datum/response_team/proc/getCyborgUnlock()
- return cyborg_unlock
-
-/datum/response_team/proc/get_slot_list()
- var/list/slots_available = list()
- if(command_slots)
- slots_available |= "Commander"
- if(security_slots)
- slots_available |= "Security"
- if(engineer_slots)
- slots_available |= "Engineer"
- if(medical_slots)
- slots_available |= "Medic"
- if(janitor_slots)
- slots_available |= "Janitor"
- if(paranormal_slots)
- slots_available |= "Paranormal"
- if(cyborg_slots)
- slots_available |= "Cyborg"
- return slots_available
-
-/datum/response_team/proc/check_slot_available(var/slot)
- switch(slot)
- if("Commander")
- return command_slots
- if("Security")
- return security_slots
- if("Engineer")
- return engineer_slots
- if("Medic")
- return medical_slots
- if("Janitor")
- return janitor_slots
- if("Paranormal")
- return paranormal_slots
- if("Cyborg")
- return cyborg_slots
- return 0
-
-/datum/response_team/proc/equip_officer(var/officer_type, var/mob/living/carbon/human/M)
- switch(officer_type)
- if("Engineer")
- engineer_slots -= 1
- M.equipOutfit(engineering_outfit)
- M.job = "ERT Engineering"
-
- if("Security")
- security_slots -= 1
- M.equipOutfit(security_outfit)
- M.job = "ERT Security"
-
- if("Medic")
- medical_slots -= 1
- M.equipOutfit(medical_outfit)
- M.job = "ERT Medical"
-
- if("Janitor")
- janitor_slots -= 1
- M.equipOutfit(janitor_outfit)
- M.job = "ERT Janitor"
-
- if("Paranormal")
- paranormal_slots -= 1
- M.equipOutfit(paranormal_outfit)
- M.job = "ERT Paranormal"
-
- if("Commander")
- command_slots = 0
-
- // Override name and age for the commander
- M.rename_character(null, "[pick("Lieutenant", "Captain", "Major")] [pick(last_names)]")
- M.age = rand(35,45)
-
- M.equipOutfit(command_outfit)
- M.job = "ERT Commander"
-
-/datum/response_team/proc/cannot_send_team()
- event_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable")
-
-/datum/response_team/proc/announce_team()
- event_announcement.Announce("Attention, [station_name()]. We are sending a team of highly trained assistants to aid(?) you. Standby.", "ERT En-Route")
-
-// -- AMBER TEAM --
-
-/datum/response_team/amber
- engineering_outfit = /datum/outfit/job/centcom/response_team/engineer/amber
- security_outfit = /datum/outfit/job/centcom/response_team/security/amber
- medical_outfit = /datum/outfit/job/centcom/response_team/medic/amber
- command_outfit = /datum/outfit/job/centcom/response_team/commander/amber
- janitor_outfit = /datum/outfit/job/centcom/response_team/janitorial/amber
- paranormal_outfit = /datum/outfit/job/centcom/response_team/paranormal/amber
-
-/datum/response_team/amber/announce_team()
- event_announcement.Announce("Attention, [station_name()]. We are sending a code AMBER light Emergency Response Team. Standby.", "ERT En-Route")
-
-// -- RED TEAM --
-
-/datum/response_team/red
- engineering_outfit = /datum/outfit/job/centcom/response_team/engineer/red
- security_outfit = /datum/outfit/job/centcom/response_team/security/red
- medical_outfit = /datum/outfit/job/centcom/response_team/medic/red
- command_outfit = /datum/outfit/job/centcom/response_team/commander/red
- janitor_outfit = /datum/outfit/job/centcom/response_team/janitorial/red
- paranormal_outfit = /datum/outfit/job/centcom/response_team/paranormal/red
-
-/datum/response_team/red/announce_team()
- event_announcement.Announce("Attention, [station_name()]. We are sending a code RED Emergency Response Team. Standby.", "ERT En-Route")
-
-// -- GAMMA TEAM --
-
-/datum/response_team/gamma
- engineering_outfit = /datum/outfit/job/centcom/response_team/engineer/gamma
- security_outfit = /datum/outfit/job/centcom/response_team/security/gamma
- medical_outfit = /datum/outfit/job/centcom/response_team/medic/gamma
- command_outfit = /datum/outfit/job/centcom/response_team/commander/gamma
- janitor_outfit = /datum/outfit/job/centcom/response_team/janitorial/gamma
- paranormal_outfit = /datum/outfit/job/centcom/response_team/paranormal/gamma
- cyborg_unlock = 1
-
-/datum/response_team/gamma/announce_team()
- event_announcement.Announce("Attention, [station_name()]. We are sending a code GAMMA elite Emergency Response Team. Standby.", "ERT En-Route")
-
-/datum/outfit/job/centcom/response_team
- name = "Response team"
- var/rt_assignment = "Emergency Response Team Member"
- var/rt_job = "This is a bug"
- allow_backbag_choice = FALSE
- allow_loadout = FALSE
- pda = /obj/item/pda/heads/ert
- id = /obj/item/card/id/ert
- l_ear = /obj/item/radio/headset/ert/alt
-
- implants = list(/obj/item/implant/mindshield)
-
-/datum/outfit/job/centcom/response_team/pre_equip()
- . = ..()
- backpack_contents.Insert(1, /obj/item/storage/box/responseteam)
- backpack_contents[/obj/item/storage/box/responseteam] = 1
+/* ERT OUTFIT DATUMS */
/datum/outfit/job/centcom/response_team/imprint_idcard(mob/living/carbon/human/H)
var/obj/item/card/id/W = H.wear_id
@@ -376,6 +23,9 @@ var/ert_request_answered = 0
PDA.ownrank = rt_assignment
PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
+
+//////////////////// COMMANDER ///////////////////
+
/datum/outfit/job/centcom/response_team/commander
name = "RT Commander"
rt_assignment = "Emergency Response Team Leader"
@@ -427,18 +77,30 @@ var/ert_request_answered = 0
shoes = /obj/item/clothing/shoes/magboots/advance
gloves = /obj/item/clothing/gloves/combat
suit = /obj/item/clothing/suit/space/hardsuit/ert/commander
- glasses = /obj/item/clothing/glasses/hud/security/night
+ glasses = /obj/item/clothing/glasses/night
+ suit_store = /obj/item/gun/energy/gun/blueshield/pdw9
- belt = /obj/item/gun/energy/gun/nuclear
+ belt = /obj/item/gun/projectile/automatic/pistol/enforcer
backpack_contents = list(
+ /obj/item/storage/box/responseteam/ = 1,
/obj/item/clothing/head/helmet/space/hardsuit/ert/commander = 1,
/obj/item/clothing/mask/gas/sechailer/swat = 1,
/obj/item/restraints/handcuffs = 1,
/obj/item/storage/lockbox/mindshield = 1,
- /obj/item/gun/energy/pulse/pistol = 1
+ /obj/item/gun/energy/ionrifle/carbine = 1,
+ /obj/item/ammo_box/magazine/m45/enforcer45/lethal = 2,
)
+ cybernetic_implants = list(
+ /obj/item/organ/internal/cyberimp/chest/nutriment/plus,
+ /obj/item/organ/internal/cyberimp/eyes/hud/security,
+ /obj/item/organ/internal/cyberimp/brain/anti_stun,
+ /obj/item/organ/internal/cyberimp/arm/flash
+ )
+
+//////////////////// SECURITY ///////////////////
+
/datum/outfit/job/centcom/response_team/security
name = "RT Security"
rt_job = "Emergency Response Team Officer"
@@ -500,18 +162,35 @@ var/ert_request_answered = 0
shoes = /obj/item/clothing/shoes/magboots/advance
gloves = /obj/item/clothing/gloves/combat
suit = /obj/item/clothing/suit/space/hardsuit/ert/security
+ belt = /obj/item/storage/belt/security/response_team/gamma
suit_store = /obj/item/gun/energy/gun/nuclear
- glasses = /obj/item/clothing/glasses/hud/security/night
+ glasses = /obj/item/clothing/glasses/night
+ l_pocket = /obj/item/restraints/legcuffs/bola/energy
+ r_pocket = /obj/item/extinguisher/mini
- r_hand = /obj/item/gun/energy/pulse/carbine
+ r_hand = /obj/item/gun/energy/immolator/multi
backpack_contents = list(
/obj/item/clothing/head/helmet/space/hardsuit/ert/security = 1,
/obj/item/clothing/mask/gas/sechailer/swat = 1,
/obj/item/storage/box/handcuffs = 1,
- /obj/item/gun/energy/ionrifle/carbine = 1
+ /obj/item/storage/box/flashbangs = 1,
+ /obj/item/storage/box/responseteam/ = 1,
+ /obj/item/whetstone = 1,
+ /obj/item/storage/lockbox/t4 = 1,
)
+ cybernetic_implants = list(
+ /obj/item/organ/internal/cyberimp/chest/nutriment/plus,
+ /obj/item/organ/internal/cyberimp/eyes/hud/security,
+ /obj/item/organ/internal/cyberimp/brain/anti_stun,
+ /obj/item/organ/internal/cyberimp/arm/telebaton,
+ /obj/item/organ/internal/cyberimp/chest/reviver,
+ )
+
+
+//////////////////// ENGINEER ///////////////////
+
/datum/outfit/job/centcom/response_team/engineer
name = "RT Engineer"
rt_job = "Emergency Response Team Engineer"
@@ -563,8 +242,9 @@ var/ert_request_answered = 0
name = "RT Engineer (Gamma)"
shoes = /obj/item/clothing/shoes/magboots/advance
gloves = /obj/item/clothing/gloves/color/yellow
+ belt = /obj/item/storage/belt/utility/chief/full
suit = /obj/item/clothing/suit/space/hardsuit/ert/engineer
- suit_store = /obj/item/tank/emergency_oxygen/double/full
+ suit_store = /obj/item/gun/energy/gun/blueshield/pdw9
glasses = /obj/item/clothing/glasses/meson/night
l_pocket = /obj/item/t_scanner/extended_range
@@ -575,9 +255,19 @@ var/ert_request_answered = 0
/obj/item/clothing/mask/gas/sechailer/swat = 1,
/obj/item/rcd/combat = 1,
/obj/item/rcd_ammo/large = 3,
- /obj/item/gun/energy/pulse/pistol = 1
+ /obj/item/storage/box/responseteam/ = 1
)
+ cybernetic_implants = list(
+ /obj/item/organ/internal/cyberimp/chest/nutriment/plus,
+ /obj/item/organ/internal/cyberimp/eyes/hud/security,
+ /obj/item/organ/internal/cyberimp/brain/anti_stun,
+ /obj/item/organ/internal/cyberimp/eyes/shield,
+ /obj/item/organ/internal/cyberimp/arm/toolset,
+ )
+
+//////////////////// MEDIC ///////////////////
+
/datum/outfit/job/centcom/response_team/medic
name = "RT Medic"
rt_job = "Emergency Response Team Medic"
@@ -636,20 +326,35 @@ var/ert_request_answered = 0
shoes = /obj/item/clothing/shoes/magboots/advance
gloves = /obj/item/clothing/gloves/combat
suit = /obj/item/clothing/suit/space/hardsuit/ert/medical
- glasses = /obj/item/clothing/glasses/hud/health/night
+ glasses = /obj/item/clothing/glasses/night
+ suit_store = /obj/item/gun/energy/gun/blueshield/pdw9
belt = /obj/item/defibrillator/compact/loaded
l_pocket = /obj/item/reagent_containers/hypospray/combat/nanites
+ r_pocket = /obj/item/reagent_containers/hypospray/autoinjector
r_hand = /obj/item/gun/medbeam
backpack_contents = list(
/obj/item/clothing/head/helmet/space/hardsuit/ert/medical = 1,
/obj/item/clothing/mask/gas/sechailer/swat = 1,
- /obj/item/storage/firstaid/surgery = 1,
- /obj/item/gun/energy/pulse/pistol = 1
+ /obj/item/storage/box/responseteam/ = 1,
+ /obj/item/bodyanalyzer/advanced = 1,
+ /obj/item/extinguisher/mini = 1,
+ /obj/item/storage/belt/medical/response_team = 1,
+ /obj/structure/stool/bed/roller = 1,
+ )
+
+ cybernetic_implants = list(
+ /obj/item/organ/internal/cyberimp/chest/nutriment/plus,
+ /obj/item/organ/internal/cyberimp/eyes/hud/medical,
+ /obj/item/organ/internal/cyberimp/brain/anti_stun,
+ /obj/item/organ/internal/cyberimp/arm/surgery,
+ /obj/item/organ/internal/cyberimp/arm/medibeam
)
+//////////////////// PARANORMAL ///////////////////
+
/datum/outfit/job/centcom/response_team/paranormal
name = "RT Paranormal"
rt_job = "Emergency Response Team Inquisitor"
@@ -689,6 +394,8 @@ var/ert_request_answered = 0
l_pocket = /obj/item/grenade/clusterbuster/holy
shoes = /obj/item/clothing/shoes/magboots/advance
+//////////////////// JANITORIAL ///////////////////
+
/datum/outfit/job/centcom/response_team/janitorial
name = "RT Janitor"
rt_job = "Emergency Response Team Janitor"
@@ -732,23 +439,3 @@ var/ert_request_answered = 0
r_pocket = /obj/item/grenade/clusterbuster/antiweed
shoes = /obj/item/clothing/shoes/magboots/advance
-/obj/item/radio/centcom
- name = "centcomm bounced radio"
- frequency = ERT_FREQ
- icon_state = "radio"
-
-/obj/item/storage/box/responseteam/
- name = "boxed survival kit"
-
-/obj/item/storage/box/responseteam/New()
- ..()
- contents = list()
- sleep(1)
- new /obj/item/clothing/mask/breath( src )
- new /obj/item/tank/emergency_oxygen/engi( src )
- new /obj/item/flashlight/flare( src )
- new /obj/item/kitchen/knife/combat( src )
- new /obj/item/radio/centcom( src )
- new /obj/item/reagent_containers/food/pill/salicylic( src )
- new /obj/item/reagent_containers/food/pill/patch/synthflesh( src )
- return
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 8ac3c2b82f6..3354f20c2f6 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -323,6 +323,6 @@
/obj/item/organ/internal/cyberimp/arm/telebaton
name = "telebaton implant"
- desc = "Telescopic baton implant."
+ desc = "Telescopic baton implant. Does what it says on the tin" // A better description
- var/list/items_list = list(/obj/item/melee/classic_baton/telescopic)
\ No newline at end of file
+ contents = newlist(/obj/item/melee/classic_baton/telescopic)
\ No newline at end of file
diff --git a/paradise.dme b/paradise.dme
index 7c4deb70dd2..5668eb0d1bc 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -389,7 +389,6 @@
#include "code\game\atoms.dm"
#include "code\game\atoms_movable.dm"
#include "code\game\data_huds.dm"
-#include "code\game\response_team.dm"
#include "code\game\shuttle_engines.dm"
#include "code\game\sound.dm"
#include "code\game\world.dm"
@@ -1278,7 +1277,7 @@
#include "code\modules\clothing\spacesuits\rig\modules\vision.dm"
#include "code\modules\clothing\spacesuits\rig\suits\alien.dm"
#include "code\modules\clothing\spacesuits\rig\suits\combat.dm"
-#include "code\modules\clothing\spacesuits\rig\suits\ert.dm"
+#include "code\modules\clothing\spacesuits\rig\suits\ert_suits.dm"
#include "code\modules\clothing\spacesuits\rig\suits\light.dm"
#include "code\modules\clothing\spacesuits\rig\suits\merc.dm"
#include "code\modules\clothing\spacesuits\rig\suits\station.dm"
@@ -2150,6 +2149,8 @@
#include "code\modules\research\designs\weapon_designs.dm"
#include "code\modules\research\xenobiology\xenobio_camera.dm"
#include "code\modules\research\xenobiology\xenobiology.dm"
+#include "code\modules\response_team\ert.dm"
+#include "code\modules\response_team\ert_outfits.dm"
#include "code\modules\ruins\ruin_areas.dm"
#include "code\modules\scripting\__defines.dm"
#include "code\modules\scripting\Errors.dm"