diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 676b7d1c25..4563bf989e 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -4,7 +4,7 @@
#define TRANSITIONEDGE 7 // Distance from edge to move to another z-level.
-// Invisibility constants.
+// Invisibility constants. These should only be used for TRUE invisibility, AKA nothing living players touch
#define INVISIBILITY_LIGHTING 20
#define INVISIBILITY_LEVEL_ONE 35
#define INVISIBILITY_LEVEL_TWO 45
@@ -21,6 +21,9 @@
#define SEE_INVISIBLE_MINIMUM 5
#define INVISIBILITY_MAXIMUM 100
+// Pseudo-Invis, like Ninja, Ling, Etc.
+#define EFFECTIVE_INVIS 50 // Below this, can't be examined, may as well be invisible to the game
+
// For the client FPS pref and anywhere else
#define MAX_CLIENT_FPS 200
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 012677200c..c73ebf4d41 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -177,6 +177,9 @@
#define O_LIVER "liver"
#define O_KIDNEYS "kidneys"
#define O_APPENDIX "appendix"
+#define O_VOICE "voicebox"
+
+// Non-Standard organs
#define O_PLASMA "plasma vessel"
#define O_HIVE "hive node"
#define O_NUTRIENT "nutrient vessel"
diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index 2e3f8b0760..0a2e49d907 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -13,6 +13,9 @@
#define O_ORCH "orchestrator"
#define O_FACT "refactory"
+//Alraune organs
+#define A_FRUIT "fruit gland"
+
//species defines
#define SPECIES_AKULA "Akula"
#define SPECIES_ALRAUNE "Alraune"
diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm
index 3ef7c9486f..05468bee76 100644
--- a/code/controllers/emergency_shuttle_controller.dm
+++ b/code/controllers/emergency_shuttle_controller.dm
@@ -98,10 +98,10 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
autopilot = 1
set_launch_countdown(get_shuttle_prep_time())
auto_recall_time = rand(world.time + 300, launch_time - 300)
- var/estimated_time = round(estimate_arrival_time()/60,1)
//reset the shuttle transit time if we need to
shuttle.move_time = SHUTTLE_TRANSIT_DURATION
+ var/estimated_time = round(estimate_arrival_time()/60,1)
priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_called_message, "%dock_name%", "[using_map.dock_name]"), "%ETA%", "[estimated_time] minute\s"))
atc.shift_ending()
@@ -274,4 +274,4 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
var/obj/effect/bgstar/S = new/obj/effect/bgstar(locate(x,y,z))
S.direction = spawndir
spawn()
- S.startmove()
\ No newline at end of file
+ S.startmove()
diff --git a/code/controllers/subsystems/transcore_vr.dm b/code/controllers/subsystems/transcore_vr.dm
index feae05ae91..ddac25ee83 100644
--- a/code/controllers/subsystems/transcore_vr.dm
+++ b/code/controllers/subsystems/transcore_vr.dm
@@ -45,12 +45,18 @@ SUBSYSTEM_DEF(transcore)
current_run.len--
//Remove if not in a human anymore.
- if(!imp || !ishuman(imp.loc))
+ if(!imp || !isorgan(imp.loc))
implants -= imp
continue
- //We're in a human, at least.
- var/mob/living/carbon/human/H = imp.loc
+ //We're in an organ, at least.
+ var/obj/item/organ/external/EO = imp.loc
+ var/mob/living/carbon/human/H = EO.owner
+ if(!H)
+ implants -= imp
+ continue
+
+ //In a human
BITSET(H.hud_updateflag, BACKUP_HUD)
if(H == imp.imp_in && H.mind && H.stat < DEAD)
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index b665465084..765e1ee9e9 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -84,10 +84,8 @@
for(var/mob/living/silicon/robot/robot in mob_list)
// No combat/syndicate cyborgs, no drones.
- if(robot.module && robot.module.hide_on_manifest)
- continue
-
- bot[robot.name] = "[robot.modtype] [robot.braintype]"
+ if(!robot.scrambledcodes && !(robot.module && robot.module.hide_on_manifest))
+ bot[robot.name] = "[robot.modtype] [robot.braintype]"
if(heads.len > 0)
diff --git a/code/datums/observation/turf_changed.dm b/code/datums/observation/turf_changed.dm
index 861b409227..0bb0ed9115 100644
--- a/code/datums/observation/turf_changed.dm
+++ b/code/datums/observation/turf_changed.dm
@@ -20,9 +20,9 @@ var/decl/observ/turf_changed/turf_changed_event = new()
* Turf Changed Handling *
************************/
-/turf/ChangeTurf()
+/turf/ChangeTurf(var/turf/N, var/tell_universe, var/force_lighting_update, var/preserve_outdoors)
var/old_density = density
var/old_opacity = opacity
- . = ..()
+ . = ..(N, tell_universe, force_lighting_update, preserve_outdoors)
if(.)
turf_changed_event.raise_event(src, old_density, density, old_opacity, opacity)
\ No newline at end of file
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index f300496aa2..272309f780 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -144,7 +144,7 @@ var/global/list/PDA_Manifest = list()
for(var/mob/living/silicon/robot/robot in mob_list)
// No combat/syndicate cyborgs, no drones.
- if(robot.module && robot.module.hide_on_manifest)
+ if(!robot.scrambledcodes && !(robot.module && robot.module.hide_on_manifest))
continue
bot[++bot.len] = list("name" = robot.real_name, "rank" = "[robot.modtype] [robot.braintype]", "active" = "Active")
diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm
index 484ff8ea33..7496551c25 100644
--- a/code/game/antagonist/antagonist.dm
+++ b/code/game/antagonist/antagonist.dm
@@ -79,7 +79,9 @@
Think through your actions and make the roleplay immersive! Please remember all \
rules aside from those without explicit exceptions apply to antagonists."
- var/can_use_aooc = TRUE // If true, will be given the AOOC verb, along with the ability to use it.
+// var/can_use_aooc = TRUE // If true, will be given the AOOC verb, along with the ability to use it.
+ var/can_hear_aooc = TRUE // If FALSE, the antag can neither speak nor hear AOOC. If TRUE, they can at least hear it.
+ var/can_speak_aooc = TRUE // If TRUE, the antag can freely spean in AOOC.
/datum/antagonist/New()
..()
diff --git a/code/game/antagonist/antagonist_add.dm b/code/game/antagonist/antagonist_add.dm
index 67eb7e2e72..d5fa2c1fe6 100644
--- a/code/game/antagonist/antagonist_add.dm
+++ b/code/game/antagonist/antagonist_add.dm
@@ -36,7 +36,7 @@
and it otherwise has no bearing on your round."
player.current.verbs |= /mob/living/proc/write_ambition
- if(can_use_aooc)
+ if(can_speak_aooc)
player.current.client.verbs += /client/proc/aooc
// Handle only adding a mind and not bothering with gear etc.
diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm
index c1aec2bcf8..245296084c 100644
--- a/code/game/antagonist/outsider/ert.dm
+++ b/code/game/antagonist/outsider/ert.dm
@@ -25,7 +25,8 @@ var/datum/antagonist/ert/ert
initial_spawn_req = 5
initial_spawn_target = 7
- can_use_aooc = FALSE // They're the good guys.
+ can_hear_aooc = FALSE // They're the good guys.
+ can_speak_aooc = FALSE // Just in case the above var bugs, or gets touched.
/datum/antagonist/ert/create_default(var/mob/source)
var/mob/living/carbon/human/M = ..()
diff --git a/code/game/antagonist/outsider/trader.dm b/code/game/antagonist/outsider/trader.dm
index 9603b49523..69af3883b9 100644
--- a/code/game/antagonist/outsider/trader.dm
+++ b/code/game/antagonist/outsider/trader.dm
@@ -24,7 +24,7 @@ var/datum/antagonist/trader/traders
initial_spawn_req = 5
initial_spawn_target = 7
- can_use_aooc = FALSE // They're not real antags.
+ can_speak_aooc = FALSE // They're not real antags.
/datum/antagonist/trader/create_default(var/mob/source)
var/mob/living/carbon/human/M = ..()
diff --git a/code/game/antagonist/station/infiltrator.dm b/code/game/antagonist/station/infiltrator.dm
index 8ca6f4ac4d..b51e7e74fb 100644
--- a/code/game/antagonist/station/infiltrator.dm
+++ b/code/game/antagonist/station/infiltrator.dm
@@ -13,6 +13,7 @@ var/datum/antagonist/traitor/infiltrator/infiltrators
welcome_text = "To speak on your team's private channel, use :t."
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director")
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
+ can_speak_aooc = TRUE
/datum/antagonist/traitor/infiltrator/New()
..()
diff --git a/code/game/antagonist/station/renegade.dm b/code/game/antagonist/station/renegade.dm
index 6f7ec89322..3e8afae32d 100644
--- a/code/game/antagonist/station/renegade.dm
+++ b/code/game/antagonist/station/renegade.dm
@@ -17,7 +17,7 @@ var/datum/antagonist/renegade/renegades
Think through your actions and make the roleplay immersive! Please remember all \
rules aside from those without explicit exceptions apply to antagonists."
flags = ANTAG_SUSPICIOUS | ANTAG_IMPLANT_IMMUNE | ANTAG_RANDSPAWN | ANTAG_VOTABLE
- can_use_aooc = FALSE
+ can_speak_aooc = FALSE // They aren't 'true' antags, but they still need to hear blanket antag instructions
hard_cap = 8
hard_cap_round = 12
@@ -61,8 +61,6 @@ var/datum/antagonist/renegade/renegades
list(/obj/item/weapon/gun/projectile/luger,/obj/item/weapon/gun/projectile/luger/brown)
)
- can_use_aooc = FALSE // They aren't 'true' antags.
-
/datum/antagonist/renegade/New()
..()
renegades = src
diff --git a/code/game/antagonist/station/thug.dm b/code/game/antagonist/station/thug.dm
index 8810fca7d0..61d92e1646 100644
--- a/code/game/antagonist/station/thug.dm
+++ b/code/game/antagonist/station/thug.dm
@@ -15,4 +15,4 @@ var/datum/antagonist/thug/thugs
Think through your actions and make the roleplay immersive! Please remember all \
rules aside from those with explicit exceptions apply to antagonists."
flags = ANTAG_SUSPICIOUS | ANTAG_IMPLANT_IMMUNE | ANTAG_RANDSPAWN | ANTAG_VOTABLE
- can_use_aooc = FALSE
+ can_speak_aooc = FALSE
diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm
index d0a1f54ed2..3681cf236d 100644
--- a/code/game/antagonist/station/traitor.dm
+++ b/code/game/antagonist/station/traitor.dm
@@ -5,7 +5,7 @@ var/datum/antagonist/traitor/traitors
id = MODE_TRAITOR
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director")
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
- can_use_aooc = FALSE
+ can_speak_aooc = FALSE // If they want to plot and plan as this sort of traitor, they'll need to do it ICly.
/datum/antagonist/traitor/auto
id = MODE_AUTOTRAITOR
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 162cdd371d..b5a73224fc 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -199,6 +199,12 @@ var/global/list/datum/dna/gene/dna_genes[0]
src.base_species = CS.base_species
src.blood_color = CS.blood_color
+ if(istype(character.species,/datum/species/alraune))
+ var/datum/species/alraune/CS = character.species
+ //src.species_traits = CS.traits.Copy() //No traits
+ src.base_species = CS.base_species
+ src.blood_color = CS.blood_color
+
// +1 to account for the none-of-the-above possibility
SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1)
SetUIValueRange(DNA_UI_TAIL_STYLE, tail_style + 1, tail_styles_list.len + 1, 1)
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index a7e7d2ddae..f4fcffbd34 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -233,6 +233,11 @@
var/datum/species/xenochimera/CS = H.species
var/datum/species/xenochimera/new_CS = CS.produceCopy(dna.base_species,dna.species_traits,src)
new_CS.blood_color = dna.blood_color
+
+ if(istype(H.species,/datum/species/alraune))
+ var/datum/species/alraune/CS = H.species
+ var/datum/species/alraune/new_CS = CS.produceCopy(dna.base_species,dna.species_traits,src)
+ new_CS.blood_color = dna.blood_color
// VOREStation Edit End
H.force_update_organs() //VOREStation Add - Gotta do this too
diff --git a/code/game/jobs/job/special.dm b/code/game/jobs/job/special.dm
index 5091e9d4e3..7d1ccead19 100644
--- a/code/game/jobs/job/special.dm
+++ b/code/game/jobs/job/special.dm
@@ -109,8 +109,10 @@
if(H.backbag > 0)
H.equip_to_slot_or_del(new /obj/item/weapon/stamp/clown(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(H.back), slot_in_backpack) //VOREStation Edit
else
H.equip_to_slot_or_del(new /obj/item/weapon/stamp/clown(H), slot_l_hand)
+ H.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(H.back), slot_l_hand) //VOREStation Edit
return 1
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 5396c9bb29..278e516aae 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -391,7 +391,8 @@ var/global/datum/controller/occupations/job_master
H.amend_exploitable(G.path)
if(G.slot == "implant")
- H.implant_loadout(G)
+ var/obj/item/weapon/implant/I = G.spawn_item(H)
+ I.implant_loadout(H)
continue
if(G.slot && !(G.slot in custom_equip_slots))
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 80b417da22..e980c8261c 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -38,11 +38,13 @@
projectiles--
var/P = new projectile(curloc)
Fire(P, target)
+ if(i == 1)
+ set_ready_state(0)
if(fire_cooldown)
sleep(fire_cooldown)
if(auto_rearm)
projectiles = projectiles_per_shot
- set_ready_state(0)
+// set_ready_state(0)
do_after_cooldown()
return
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 5d6c14abb9..968861f1e4 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -1254,7 +1254,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(isnull(cartridge))
to_chat(usr, "There's no cartridge to eject.")
- return
+ return
cartridge.forceMove(get_turf(src))
if(ismob(loc))
@@ -1382,7 +1382,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
to_chat(user, "Blood type: [C:blood_DNA[blood]]\nDNA: [blood]")
if(4)
- user.visible_message("\The [user] has analyzed [C]'s radiation levels!", 1)
+ user.visible_message("\The [user] has analyzed [C]'s radiation levels!", "You have analyzed [C]'s radiation levels!")
to_chat(user, "Analyzing Results for [C]:")
if(C.radiation)
to_chat(user, "Radiation Level: [C.radiation]")
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index ca4b8d8066..fc3c03518b 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -10,44 +10,162 @@
var/insults = 0
var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TERRORIST!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "GLORY TO ALMACH!")
-/obj/item/device/megaphone/attack_self(mob/living/user as mob)
+/obj/item/device/megaphone/proc/can_broadcast(var/mob/living/user)
if (user.client)
if(user.client.prefs.muted & MUTE_IC)
- src << "You cannot speak in IC (muted)."
- return
- if(!ishuman(user))
- user << "You don't know how to use this!"
- return
+ to_chat(user, "You cannot speak in IC (muted).")
+ return 0
+ if(!(ishuman(user) || user.isSynthetic()))
+ to_chat(user, "You don't know how to use this!")
+ return 0
if(user.silent)
- return
+ return 0
if(spamcheck)
- user << "\The [src] needs to recharge!"
- return
+ to_chat(user, "\The [src] needs to recharge!")
+ return 0
+ return 1
- var/message = sanitize(input(user, "Shout a message?", "Megaphone", null) as text)
- if(!message)
- return
- message = capitalize(message)
+/obj/item/device/megaphone/proc/do_broadcast(var/mob/living/user, var/message)
if ((src.loc == user && usr.stat == 0))
if(emagged)
if(insults)
- for(var/mob/O in (viewers(user)))
- O.show_message("[user] broadcasts, \"[pick(insultmsg)]\"",2) // 2 stands for hearable message
+ user.audible_message("[user] broadcasts, \"[pick(insultmsg)]\"")
insults--
else
- user << "*BZZZZzzzzzt*"
+ to_chat(user, "*BZZZZzzzzzt*")
else
- for(var/mob/O in (viewers(user)))
- O.show_message("[user] broadcasts, \"[message]\"",2) // 2 stands for hearable message
+ user.audible_message("[user] broadcasts, \"[message]\"")
spamcheck = 1
spawn(20)
spamcheck = 0
return
+/obj/item/device/megaphone/attack_self(mob/living/user as mob)
+ if(!can_broadcast(user))
+ return
+
+ var/message = sanitize(input(user, "Shout a message?", "Megaphone", null) as text)
+ if(!message)
+ return
+ message = capitalize(message)
+
+ do_broadcast(user, message)
+
/obj/item/device/megaphone/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
- user << "You overload \the [src]'s voice synthesizer."
+ to_chat(user, "You overload \the [src]'s voice synthesizer.")
emagged = 1
- insults = rand(1, 3)//to prevent dickflooding
+ insults = rand(1, 3)//to prevent caps spam.
return 1
+
+/obj/item/device/megaphone/super
+ name = "gigaphone"
+ desc = "A device used to project your voice. Loudly-er."
+ icon_state = "gigaphone"
+
+ var/broadcast_font = "verdana"
+ var/broadcast_size = 3
+ var/broadcast_color = "#000000" //Black by default.
+ var/list/volume_options = list(2, 3, 4)
+ var/list/font_options = list("times new roman", "times", "verdana", "sans-serif", "serif", "georgia")
+ var/list/color_options= list("#000000", "#ff0000", "#00ff00", "#0000ff")
+
+ insultmsg = list("HONK?!", "HONK!", "HOOOOOOOONK!", "...!", "HUNK.", "Honk?")
+
+/obj/item/device/megaphone/super/emag_act(var/remaining_charges, var/mob/user)
+ ..()
+ if(emagged)
+ if(!(11 in volume_options))
+ volume_options = list(11)
+ broadcast_size = 11
+ if(!("comic sans ms" in font_options))
+ font_options = list("comic sans ms")
+ broadcast_font = "comic sans ms"
+ to_chat(user, "\The [src] emits a silly sound.")
+ if(!("#ff69b4" in color_options))
+ color_options = list("#ff69b4")
+ broadcast_color = "#ff69b4"
+ if(insults <= 0)
+ insults = rand(1,3)
+ to_chat(user, "You re-scramble \the [src]'s voice synthesizer.")
+ return 1
+
+/obj/item/device/megaphone/super/verb/turn_volume_dial(mob/living/user)
+ set name = "Change Volume"
+ set desc = "Allows you to change the megaphone's volume."
+ set category = "Object"
+
+ adjust_volume(user)
+
+/obj/item/device/megaphone/super/proc/adjust_volume(var/mob/living/user)
+ var/new_volume = input(user, "Set Volume") as null|anything in volume_options
+
+ if(new_volume && Adjacent(user))
+ broadcast_size = new_volume
+
+/obj/item/device/megaphone/super/verb/change_font(mob/living/user)
+ set name = "Change... Pronunciation?"
+ set desc = "Allows you to change the megaphone's font."
+ set category = "Object"
+
+ adjust_font(user)
+
+/obj/item/device/megaphone/super/proc/adjust_font(var/mob/living/user)
+ var/new_font = input(user, "Set Volume") as null|anything in font_options
+
+ if(new_font && Adjacent(user))
+ broadcast_font = new_font
+
+/obj/item/device/megaphone/super/verb/change_color(mob/living/user)
+ set name = "Change... Tune?"
+ set desc = "Allows you to change the megaphone's color."
+ set category = "Object"
+
+ adjust_color(user)
+
+/obj/item/device/megaphone/super/proc/adjust_color(var/mob/living/user)
+ var/new_color = input(user, "Set Volume") as null|anything in color_options
+
+ if(new_color && Adjacent(user))
+ broadcast_color = new_color
+
+/obj/item/device/megaphone/super/do_broadcast(var/mob/living/user, var/message)
+ if ((src.loc == user && usr.stat == 0))
+ if(emagged)
+ if(insults)
+ user.audible_message("[user] broadcasts, \"[pick(insultmsg)]\"")
+ if(broadcast_size >= 11)
+ var/turf/T = get_turf(user)
+ playsound(T, 'sound/items/AirHorn.ogg', 100, 1)
+ for(var/mob/living/carbon/M in oviewers(4, T))
+ if(M.get_ear_protection() >= 2)
+ continue
+ M.sleeping = 0
+ M.stuttering += 20
+ M.ear_deaf += 30
+ M.Weaken(3)
+ if(prob(30))
+ M.Stun(10)
+ M.Paralyse(4)
+ else
+ M.make_jittery(50)
+ insults--
+ else
+ user.audible_message("*BZZZZzzzzzt*")
+ if(prob(40) && insults <= 0)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, get_turf(user))
+ s.start()
+ user.visible_message("\The [src] sparks violently!")
+ spawn(30)
+ explosion(get_turf(src), -1, -1, 1, 3, adminlog = 1)
+ qdel(src)
+ return
+ else
+ user.audible_message("[user] broadcasts, \"[message]\"")
+
+ spamcheck = 1
+ spawn(20)
+ spamcheck = 0
+ return
diff --git a/code/game/objects/items/poi_items.dm b/code/game/objects/items/poi_items.dm
index 85a8b27854..394212e4c4 100644
--- a/code/game/objects/items/poi_items.dm
+++ b/code/game/objects/items/poi_items.dm
@@ -52,8 +52,9 @@
/obj/structure/largecrate/animal/crashedshuttle
name = "SCP"
+
/obj/structure/largecrate/animal/crashedshuttle/initialize()
- starts_with = pick(/mob/living/simple_animal/hostile/statue, /obj/item/cursed_marble)
+ starts_with = pick(/mob/living/simple_animal/hostile/statue, /obj/item/cursed_marble, /obj/item/weapon/deadringer)
name = pick("Spicy Crust Pizzeria", "Soap and Care Products", "Sally's Computer Parts", "Steve's Chocolate Pastries", "Smith & Christian's Plastics","Standard Containers & Packaging Co.", "Sanitary Chemical Purgation (LTD)")
name += " delivery crate"
return ..()
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index bc93d20bb5..17f4121a76 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -198,3 +198,9 @@
throw_range = 20
flags = 0
no_variants = FALSE
+
+/obj/item/stack/tile/roofing
+ name = "roofing"
+ singular_name = "roofing"
+ desc = "A section of roofing material. You can use it to repair the ceiling, or expand it."
+ icon_state = "techtile_grid"
\ No newline at end of file
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 02a308555b..02e121d02c 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -1042,6 +1042,50 @@
name = "tuxedo cat plushie"
icon_state = "tuxedocat"
+// nah, squids are better than foxes :>
+
+/obj/item/toy/plushie/squid/green
+ name = "green squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is green."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "greensquid"
+ slot_flags = SLOT_HEAD
+
+/obj/item/toy/plushie/squid/mint
+ name = "mint squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is mint coloured."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "mintsquid"
+ slot_flags = SLOT_HEAD
+
+/obj/item/toy/plushie/squid/blue
+ name = "blue squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is blue."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "bluesquid"
+ slot_flags = SLOT_HEAD
+
+/obj/item/toy/plushie/squid/orange
+ name = "orange squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is orange."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "orangesquid"
+ slot_flags = SLOT_HEAD
+
+/obj/item/toy/plushie/squid/yellow
+ name = "yellow squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is yellow."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "yellowsquid"
+ slot_flags = SLOT_HEAD
+
+/obj/item/toy/plushie/squid/pink
+ name = "pink squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is pink."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "pinksquid"
+ slot_flags = SLOT_HEAD
+
/obj/item/toy/plushie/therapy/red
name = "red therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is red."
diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm
index d9606d28d2..7cddfd1efc 100644
--- a/code/game/objects/items/weapons/autopsy.dm
+++ b/code/game/objects/items/weapons/autopsy.dm
@@ -167,21 +167,24 @@
if(!istype(M))
return 0
+ if (user.a_intent == I_HELP)
+ return ..()
+
if(target_name != M.name)
target_name = M.name
src.wdata = list()
src.chemtraces = list()
src.timeofdeath = null
- user << "A new patient has been registered. Purging data for previous patient."
+ to_chat(user, "A new patient has been registered. Purging data for previous patient.")
src.timeofdeath = M.timeofdeath
var/obj/item/organ/external/S = M.get_organ(user.zone_sel.selecting)
if(!S)
- usr << "You can't scan this body part."
+ to_chat(user, "You can't scan this body part.")
return
if(!S.open)
- usr << "You have to cut [S] open first!"
+ to_chat(user, "You have to cut [S] open first!")
return
M.visible_message("\The [user] scans the wounds on [M]'s [S.name] with [src]")
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 02e4cd48c4..f5bd38dcc1 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -21,12 +21,26 @@
/obj/item/weapon/implant/proc/activate()
return
- // What does the implant do upon injection?
- // return 0 if the implant fails (ex. Revhead and loyalty implant.)
- // return 1 if the implant succeeds (ex. Nonrevhead and loyalty implant.)
-/obj/item/weapon/implant/proc/implanted(var/mob/source)
+// Moves the implant where it needs to go, and tells it if there's more to be done in post_implant
+/obj/item/weapon/implant/proc/handle_implant(var/mob/source, var/target_zone = BP_TORSO)
+ . = TRUE
+ imp_in = source
+ implanted = TRUE
+ if(ishuman(source))
+ var/mob/living/carbon/human/H = source
+ var/obj/item/organ/external/affected = H.get_organ(target_zone)
+ if(affected)
+ affected.implants += src
+ part = affected
+ if(part)
+ forceMove(part)
+ else
+ forceMove(source)
+
listening_objects |= src
- return 1
+
+// Takes place after handle_implant, if that returns TRUE
+/obj/item/weapon/implant/proc/post_implant(var/mob/source)
/obj/item/weapon/implant/proc/get_data()
return "No information available"
@@ -49,6 +63,12 @@
icon_state = "implant_melted"
malfunction = MALFUNCTION_PERMANENT
+/obj/item/weapon/implant/proc/implant_loadout(var/mob/living/carbon/human/H)
+ if(H)
+ var/obj/item/organ/external/affected = H.organs_by_name[BP_HEAD]
+ if(handle_implant(H, affected))
+ post_implant(H)
+
/obj/item/weapon/implant/Destroy()
if(part)
part.implants.Remove(src)
@@ -69,6 +89,11 @@
else
..()
+
+
+//////////////////////////////
+// Tracking Implant
+//////////////////////////////
GLOBAL_LIST_BOILERPLATE(all_tracking_implants, /obj/item/weapon/implant/tracking)
/obj/item/weapon/implant/tracking
@@ -84,9 +109,8 @@ GLOBAL_LIST_BOILERPLATE(all_tracking_implants, /obj/item/weapon/implant/tracking
id = rand(1, 1000)
..()
-/obj/item/weapon/implant/tracking/implanted(var/mob/source)
+/obj/item/weapon/implant/tracking/post_implant(var/mob/source)
processing_objects.Add(src)
- return 1
/obj/item/weapon/implant/tracking/Destroy()
processing_objects.Remove(src)
@@ -142,7 +166,9 @@ Implant Specifics:
"}
spawn(delay)
malfunction--
-
+//////////////////////////////
+// Death Explosive Implant
+//////////////////////////////
/obj/item/weapon/implant/dexplosive
name = "explosive"
desc = "And boom goes the weasel."
@@ -177,7 +203,9 @@ Implant Specifics:
"}
/obj/item/weapon/implant/dexplosive/islegal()
return 0
-//BS12 Explosive
+//////////////////////////////
+// Explosive Implant
+//////////////////////////////
/obj/item/weapon/implant/explosive
name = "explosive implant"
desc = "A military grade micro bio-explosive. Highly dangerous."
@@ -249,15 +277,13 @@ Implant Specifics:
"}
if(t)
t.hotspot_expose(3500,125)
-/obj/item/weapon/implant/explosive/implanted(mob/source as mob)
+/obj/item/weapon/implant/explosive/post_implant(mob/source as mob)
elevel = alert("What sort of explosion would you prefer?", "Implant Intent", "Localized Limb", "Destroy Body", "Full Explosion")
phrase = input("Choose activation phrase:") as text
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
phrase = replace_characters(phrase, replacechars)
usr.mind.store_memory("Explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', say [src.phrase] to attempt to activate.", 0, 0)
usr << "The implanted explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', say [src.phrase] to attempt to activate."
- listening_objects |= src
- return 1
/obj/item/weapon/implant/explosive/emp_act(severity)
if (malfunction)
@@ -311,6 +337,9 @@ Implant Specifics:
"}
explosion(get_turf(imp_in), -1, -1, 1, 3)
qdel(src)
+//////////////////////////////
+// Chemical Implant
+//////////////////////////////
GLOBAL_LIST_BOILERPLATE(all_chem_implants, /obj/item/weapon/implant/chem)
/obj/item/weapon/implant/chem
@@ -336,20 +365,17 @@ Can only be loaded while still in its original case.
the implant may become unstable and either pre-maturely inject the subject or simply break."}
return dat
-
/obj/item/weapon/implant/chem/New()
..()
var/datum/reagents/R = new/datum/reagents(50)
reagents = R
R.my_atom = src
-
/obj/item/weapon/implant/chem/trigger(emote, source as mob)
if(emote == "deathgasp")
src.activate(src.reagents.total_volume)
return
-
/obj/item/weapon/implant/chem/activate(var/cause)
if((!cause) || (!src.imp_in)) return 0
var/mob/living/carbon/R = src.imp_in
@@ -384,6 +410,9 @@ the implant may become unstable and either pre-maturely inject the subject or si
spawn(20)
malfunction--
+//////////////////////////////
+// Loyalty Implant
+//////////////////////////////
/obj/item/weapon/implant/loyalty
name = "loyalty implant"
desc = "Makes you loyal or such."
@@ -401,20 +430,24 @@ the implant may become unstable and either pre-maturely inject the subject or si
Integrity: Implant will last so long as the nanobots are inside the bloodstream."}
return dat
-
-/obj/item/weapon/implant/loyalty/implanted(mob/M)
- if(!istype(M, /mob/living/carbon/human)) return 0
+/obj/item/weapon/implant/loyalty/handle_implant(mob/M, target_zone = BP_TORSO)
+ . = ..(M, target_zone)
+ if(!istype(M, /mob/living/carbon/human))
+ . = FALSE
var/mob/living/carbon/human/H = M
var/datum/antagonist/antag_data = get_antag_data(H.mind.special_role)
if(antag_data && (antag_data.flags & ANTAG_IMPLANT_IMMUNE))
H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of [using_map.company_name] try to invade your mind!")
- return 0
- else
- clear_antag_roles(H.mind, 1)
- H << "You feel a surge of loyalty towards [using_map.company_name]."
- return 1
+ . = FALSE
+/obj/item/weapon/implant/loyalty/post_implant(mob/M)
+ var/mob/living/carbon/human/H = M
+ clear_antag_roles(H.mind, 1)
+ to_chat(H, "You feel a surge of loyalty towards [using_map.company_name].")
+//////////////////////////////
+// Adrenaline Implant
+//////////////////////////////
/obj/item/weapon/implant/adrenalin
name = "adrenalin"
desc = "Removes all stuns and knockdowns."
@@ -445,14 +478,13 @@ the implant may become unstable and either pre-maturely inject the subject or si
return
-
-/obj/item/weapon/implant/adrenalin/implanted(mob/source)
+/obj/item/weapon/implant/adrenalin/post_implant(mob/source)
source.mind.store_memory("A implant can be activated by using the pale emote, say *pale to attempt to activate.", 0, 0)
source << "The implanted freedom implant can be activated by using the pale emote, say *pale to attempt to activate."
- listening_objects |= src
- return 1
-
+//////////////////////////////
+// Death Alarm Implant
+//////////////////////////////
/obj/item/weapon/implant/death_alarm
name = "death alarm implant"
desc = "An alarm which monitors host vital signs and transmits a radio message upon death."
@@ -529,11 +561,13 @@ the implant may become unstable and either pre-maturely inject the subject or si
spawn(20)
malfunction--
-/obj/item/weapon/implant/death_alarm/implanted(mob/source as mob)
+/obj/item/weapon/implant/death_alarm/post_implant(mob/source as mob)
mobname = source.real_name
processing_objects.Add(src)
- return 1
+//////////////////////////////
+// Compressed Matter Implant
+//////////////////////////////
/obj/item/weapon/implant/compressed
name = "compressed matter implant"
desc = "Based on compressed matter technology, can store a single item."
@@ -571,13 +605,12 @@ the implant may become unstable and either pre-maturely inject the subject or si
scanned.loc = t
qdel(src)
-/obj/item/weapon/implant/compressed/implanted(mob/source as mob)
+/obj/item/weapon/implant/compressed/post_implant(mob/source)
src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
if (source.mind)
source.mind.store_memory("Compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
source << "The implanted compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
- listening_objects |= src
- return 1
+
/obj/item/weapon/implant/compressed/islegal()
return 0
diff --git a/code/game/objects/items/weapons/implants/implant_vr.dm b/code/game/objects/items/weapons/implants/implant_vr.dm
index 4b796cc56e..ebcc2d9f54 100644
--- a/code/game/objects/items/weapons/implants/implant_vr.dm
+++ b/code/game/objects/items/weapons/implants/implant_vr.dm
@@ -3,43 +3,39 @@
desc = "Allows the user to understand and speak almost all known languages.."
var/uses = 1
- get_data()
- var/dat = {"
-Implant Specifications:
-Name: Language Implant
-Life: One day.
-Important Notes: Personnel with this implant can speak almost all known languages.
-
-Implant Details: Subjects injected with implant can understand and speak almost all known languages.
-Function: Contains specialized nanobots to stimulate the brain so the user can speak and understand previously unknown languages.
-Special Features: Will allow the user to understand almost all languages.
-Integrity: Implant can only be used once before the nanobots are depleted."}
- return dat
+/obj/item/weapon/implant/vrlanguage/get_data()
+ var/dat = {"
+ Implant Specifications:
+ Name: Language Implant
+ Life: One day.
+ Important Notes: Personnel with this implant can speak almost all known languages.
+
+ Implant Details: Subjects injected with implant can understand and speak almost all known languages.
+ Function: Contains specialized nanobots to stimulate the brain so the user can speak and understand previously unknown languages.
+ Special Features: Will allow the user to understand almost all languages.
+ Integrity: Implant can only be used once before the nanobots are depleted."}
+ return dat
+/obj/item/weapon/implant/vrlanguage/trigger(emote, mob/source as mob)
+ if (src.uses < 1)
+ return 0
+ if (emote == "smile")
+ src.uses--
+ to_chat(source,"You suddenly feel as if you can understand other languages!")
+ source.add_language(LANGUAGE_CHIMPANZEE)
+ source.add_language(LANGUAGE_NEAERA)
+ source.add_language(LANGUAGE_STOK)
+ source.add_language(LANGUAGE_FARWA)
+ source.add_language(LANGUAGE_UNATHI)
+ source.add_language(LANGUAGE_SIIK)
+ source.add_language(LANGUAGE_SKRELLIAN)
+ source.add_language(LANGUAGE_SCHECHI)
+ source.add_language(LANGUAGE_BIRDSONG)
+ source.add_language(LANGUAGE_SAGARU)
+ source.add_language(LANGUAGE_CANILUNZT)
+ source.add_language(LANGUAGE_SOL_COMMON) //In case they're giving a xenomorph an implant or something.
- trigger(emote, mob/source as mob)
- if (src.uses < 1) return 0
- if (emote == "smile")
- src.uses--
- source << "You suddenly feel as if you can understand other languages!"
- source.add_language(LANGUAGE_CHIMPANZEE)
- source.add_language(LANGUAGE_NEAERA)
- source.add_language(LANGUAGE_STOK)
- source.add_language(LANGUAGE_FARWA)
- source.add_language(LANGUAGE_UNATHI)
- source.add_language(LANGUAGE_SIIK)
- source.add_language(LANGUAGE_SKRELLIAN)
- source.add_language(LANGUAGE_SCHECHI)
- source.add_language(LANGUAGE_BIRDSONG)
- source.add_language(LANGUAGE_SAGARU)
- source.add_language(LANGUAGE_CANILUNZT)
- source.add_language(LANGUAGE_SOL_COMMON) //In case they're giving a xenomorph an implant or something.
-
-
- return
-
-
- implanted(mob/source)
- source.mind.store_memory("A implant can be activated by using the smile emote, say *smile to attempt to activate.", 0, 0)
- source << "The implanted language implant can be activated by using the smile emote, say *smile to attempt to activate."
- return 1
+/obj/item/weapon/implant/vrlanguage/post_implant(mob/source)
+ source.mind.store_memory("A implant can be activated by using the smile emote, say *smile to attempt to activate.", 0, 0)
+ to_chat(source,"The implanted language implant can be activated by using the smile emote, say *smile to attempt to activate.")
+ return 1
diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm
index 44b33721cf..c05d52442c 100644
--- a/code/game/objects/items/weapons/implants/implantchair.dm
+++ b/code/game/objects/items/weapons/implants/implantchair.dm
@@ -135,10 +135,9 @@
for (var/mob/O in viewers(M, null))
O.show_message("\The [M] has been implanted by \the [src].", 1)
- if(imp.implanted(M))
- imp.loc = M
- imp.imp_in = M
- imp.implanted = 1
+ if(imp.handle_implant(M, BP_TORSO))
+ imp.post_implant(M)
+
implant_list -= imp
break
return
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index d99c5f5ff2..c1b0d5db8d 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -56,16 +56,11 @@
add_attack_logs(user,M,"Implanted with [imp.name] using [name]")
- if(src.imp.implanted(M))
- src.imp.loc = M
- src.imp.imp_in = M
- src.imp.implanted = 1
- if (ishuman(M))
- var/mob/living/carbon/human/H = M
- var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
- affected.implants += src.imp
- imp.part = affected
+ if(imp.handle_implant(M))
+ imp.post_implant(M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
BITSET(H.hud_updateflag, IMPLOYAL_HUD)
BITSET(H.hud_updateflag, BACKUP_HUD) //VOREStation Add - Backup HUD updates
diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm
index 92021a46a2..fab692775d 100644
--- a/code/game/objects/items/weapons/implants/implantfreedom.dm
+++ b/code/game/objects/items/weapons/implants/implantfreedom.dm
@@ -16,7 +16,9 @@
/obj/item/weapon/implant/freedom/trigger(emote, mob/living/carbon/source as mob)
- if (src.uses < 1) return 0
+ if (src.uses < 1)
+ return 0
+
if (emote == src.activation_emote)
src.uses--
source << "You feel a faint click."
@@ -46,13 +48,9 @@
W.layer = initial(W.layer)
return
-
-/obj/item/weapon/implant/freedom/implanted(mob/living/carbon/source)
+/obj/item/weapon/implant/freedom/post_implant(mob/source)
source.mind.store_memory("Freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
source << "The implanted freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
- listening_objects |= src
- return 1
-
/obj/item/weapon/implant/freedom/get_data()
var/dat = {"
diff --git a/code/game/objects/items/weapons/implants/implantlanguage.dm b/code/game/objects/items/weapons/implants/implantlanguage.dm
index d813a8d388..7c6e33508b 100644
--- a/code/game/objects/items/weapons/implants/implantlanguage.dm
+++ b/code/game/objects/items/weapons/implants/implantlanguage.dm
@@ -4,7 +4,26 @@
/obj/item/weapon/implant/language
name = "GalCom language implant"
- desc = "An implant allowing someone to speak and hear the range of frequencies used in Galactic Common, as well as produce any phonemes that they usually cannot. Only helps with hearing and producing sounds, not understanding them."
+ desc = "An implant allowing someone to speak the range of frequencies used in Galactic Common, as well as produce any phonemes that they usually cannot. Only helps with producing sounds, not understanding them."
+ var/list/languages = list(LANGUAGE_GALCOM) // List of languages that this assists with
+
+/obj/item/weapon/implant/language/post_implant(mob/M) // Amends the mob's voice organ, then deletes itself
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/internal/voicebox/V = locate() in H.internal_organs
+ if(V)
+ var/list/need_amend = list() // If they've already got all the languages they need, then they don't need this implant to do anything
+ for(var/L in languages)
+ if(L in V.will_assist_languages)
+ continue
+ else
+ need_amend |= L
+ if(LAZYLEN(need_amend))
+ if(V.robotic < ORGAN_ASSISTED)
+ V.mechassist()
+ for(var/L in need_amend)
+ V.add_assistable_langs(L)
+ qdel_null(src)
/obj/item/weapon/implant/language/get_data()
var/dat = {"
@@ -14,16 +33,19 @@
Important Notes: Affects hearing and speech.
Implant Details:
-Function: Allows a being otherwise incapable to both hear the frequencies Galactic Common is generally spoken at, as well as to produce the phonemes of the language.
+Function: Allows a being otherwise incapable of speaking Galactic Common to produce the phonemes of the language.
Special Features: None.
Integrity: Implant will function for expected life, barring physical damage."}
return dat
+
+// EAL Implant
/obj/item/weapon/implant/language/eal
name = "EAL language implant"
- desc = "An implant allowing an organic to both hear and speak Encoded Audio Language accurately. Only helps with hearing and producing sounds, not understanding them."
+ desc = "An implant allowing an organic to speak Encoded Audio Language passably. Only helps with producing sounds, not understanding them."
+ languages = list(LANGUAGE_EAL)
-/obj/item/weapon/implant/language/get_data()
+/obj/item/weapon/implant/language/eal/get_data()
var/dat = {"
Implant Specifications:
Name: Vey-Med L-2 Encoded Audio Language Implant
@@ -31,7 +53,25 @@
Important Notes: Affects hearing and speech.
Implant Details:
-Function: Allows an organic to accurately process and speak Encoded Audio Language.
+Function: Allows an organic to accurately speak Encoded Audio Language.
+Special Features: None.
+Integrity: Implant will function for expected life, barring physical damage."}
+ return dat
+
+/obj/item/weapon/implant/language/skrellian
+ name = "Skrellian language implant"
+ desc = "An implant allowing someone to speak the range of frequencies used in Skrellian, as well as produce any phonemes that they usually cannot. Only helps with hearing and producing sounds, not understanding them."
+ languages = list(LANGUAGE_SKRELLIAN)
+
+/obj/item/weapon/implant/language/skrellian/get_data()
+ var/dat = {"
+Implant Specifications:
+Name: Vey-Med L-1 Galactic Common Implant
+Life: 5 years
+Important Notes: Affects hearing and speech.
+
+Implant Details:
+Function: Allows a being otherwise incapable of speaking Skrellian to produce the phonemes of the language.
Special Features: None.
Integrity: Implant will function for expected life, barring physical damage."}
return dat
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implantreagent_vr.dm b/code/game/objects/items/weapons/implants/implantreagent_vr.dm
index 1c4e9a9b04..83a586d2ba 100644
--- a/code/game/objects/items/weapons/implants/implantreagent_vr.dm
+++ b/code/game/objects/items/weapons/implants/implantreagent_vr.dm
@@ -30,7 +30,7 @@
update()
return
-/obj/item/weapon/implant/reagent_generator/implanted(mob/living/carbon/source)
+/obj/item/weapon/implant/reagent_generator/post_implant(mob/living/carbon/source)
processing_objects += src
to_chat(source, "You implant [source] with \the [src].")
assigned_proc = new assigned_proc(source, verb_name, verb_desc)
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm
index 644ebf1bb7..82809cfe61 100644
--- a/code/game/objects/items/weapons/implants/implantuplink.dm
+++ b/code/game/objects/items/weapons/implants/implantuplink.dm
@@ -11,15 +11,13 @@
..()
return
-/obj/item/weapon/implant/uplink/implanted(mob/source)
+/obj/item/weapon/implant/uplink/post_implant(mob/source)
+ listening_objects |= src
activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
- listening_objects |= src
- return 1
-
/obj/item/weapon/implant/uplink/trigger(emote, mob/source as mob)
if(hidden_uplink && usr == source) // Let's not have another people activate our uplink
hidden_uplink.check_trigger(source, emote, activation_emote)
- return
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm
index 43183d45f4..aec6a790b2 100644
--- a/code/game/objects/items/weapons/policetape.dm
+++ b/code/game/objects/items/weapons/policetape.dm
@@ -4,6 +4,9 @@
icon = 'icons/policetape.dmi'
icon_state = "tape"
w_class = ITEMSIZE_SMALL
+
+ toolspeed = 3 //You can use it in surgery. It's stupid, but you can.
+
var/turf/start
var/turf/end
var/tape_type = /obj/item/tape
diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm
index 5a57515588..e3afddba4c 100644
--- a/code/game/objects/items/weapons/tape.dm
+++ b/code/game/objects/items/weapons/tape.dm
@@ -5,8 +5,12 @@
icon_state = "taperoll"
w_class = ITEMSIZE_TINY
+ toolspeed = 2 //It is now used in surgery as a not awful, but probably dangerous option, due to speed.
+
/obj/item/weapon/tape_roll/attack(var/mob/living/carbon/human/H, var/mob/user)
if(istype(H))
+ if(user.a_intent == I_HELP)
+ return
var/can_place = 0
if(istype(user, /mob/living/silicon/robot))
can_place = 1
diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm
index ef58518e48..f0a7498390 100644
--- a/code/game/objects/structures/flora/trees.dm
+++ b/code/game/objects/structures/flora/trees.dm
@@ -4,7 +4,8 @@
anchored = 1
density = 1
pixel_x = -16
- layer = MOB_LAYER // You know what, let's play it safe.
+ plane = MOB_LAYER // You know what, let's play it safe.
+ layer = ABOVE_MOB_LAYER
var/base_state = null // Used for stumps.
var/health = 200 // Used for chopping down trees.
var/max_health = 200
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index e156588937..1c74b467e2 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -12,6 +12,7 @@
nitrogen = MOLES_N2STANDARD
var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed
var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to
+ var/can_dirty = TRUE // If false, tile never gets dirty
var/dirt = 0
// This is not great.
@@ -65,12 +66,13 @@
tracks.AddTracks(bloodDNA,comingdir,goingdir,bloodcolor)
/turf/simulated/proc/update_dirt()
- dirt = min(dirt+1, 101)
- var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src)
- if (dirt > 50)
- if (!dirtoverlay)
- dirtoverlay = new/obj/effect/decal/cleanable/dirt(src)
- dirtoverlay.alpha = min((dirt - 50) * 5, 255)
+ if(can_dirty)
+ dirt = min(dirt+1, 101)
+ var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src)
+ if (dirt > 50)
+ if (!dirtoverlay)
+ dirtoverlay = new/obj/effect/decal/cleanable/dirt(src)
+ dirtoverlay.alpha = min((dirt - 50) * 5, 255)
/turf/simulated/Entered(atom/A, atom/OL)
if(movement_disabled && usr.ckey != movement_disabled_exception)
@@ -82,8 +84,9 @@
if(M.lying)
return ..()
- // Dirt overlays.
- update_dirt()
+ if(M.dirties_floor())
+ // Dirt overlays.
+ update_dirt()
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm
index 11c45f2c2a..57d51dbaea 100644
--- a/code/game/turfs/simulated/floor_attackby.dm
+++ b/code/game/turfs/simulated/floor_attackby.dm
@@ -156,4 +156,4 @@
return
if(flooring)
return
- attackby(T, user)
+ attackby(T, user)
\ No newline at end of file
diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm
index cfdc3cc444..05ff395716 100644
--- a/code/game/turfs/simulated/outdoors/outdoors.dm
+++ b/code/game/turfs/simulated/outdoors/outdoors.dm
@@ -54,8 +54,8 @@ var/list/turf_edge_cache = list()
if(istype(T) && T.edge_blending_priority && edge_blending_priority < T.edge_blending_priority && icon_state != T.icon_state)
var/cache_key = "[T.get_edge_icon_state()]-[checkdir]"
if(!turf_edge_cache[cache_key])
- var/image/I = image(icon = 'icons/turf/outdoors_edge.dmi', icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir)
- I.plane = 0
+ var/image/I = image(icon = 'icons/turf/outdoors_edge.dmi', icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir, layer = ABOVE_TURF_LAYER)
+ I.plane = TURF_PLANE
turf_edge_cache[cache_key] = I
add_overlay(turf_edge_cache[cache_key])
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
index 6c7e65b122..73a56e8949 100644
--- a/code/game/turfs/simulated/wall_attacks.dm
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -403,3 +403,5 @@
else if(!istype(W,/obj/item/weapon/rcd) && !istype(W, /obj/item/weapon/reagent_containers))
return attack_hand(user)
+
+
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index e5bb57ad9e..b64ba73ee3 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -115,9 +115,9 @@
plant.pixel_y = 0
plant.update_neighbors()
-/turf/simulated/wall/ChangeTurf(var/newtype)
+/turf/simulated/wall/ChangeTurf(var/turf/N, var/tell_universe, var/force_lighting_update, var/preserve_outdoors)
clear_plants()
- ..(newtype)
+ ..(N, tell_universe, force_lighting_update, preserve_outdoors)
//Appearance
/turf/simulated/wall/examine(mob/user)
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 13368bb7ed..ed48013050 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -33,18 +33,18 @@
/turf/space/attackby(obj/item/C as obj, mob/user as mob)
- if (istype(C, /obj/item/stack/rods))
+ if(istype(C, /obj/item/stack/rods))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L)
return
var/obj/item/stack/rods/R = C
if (R.use(1))
- user << "Constructing support lattice ..."
+ to_chat(user, "Constructing support lattice ...")
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
ReplaceWithLattice()
return
- if (istype(C, /obj/item/stack/tile/floor))
+ if(istype(C, /obj/item/stack/tile/floor))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L)
var/obj/item/stack/tile/floor/S = C
@@ -56,7 +56,33 @@
ChangeTurf(/turf/simulated/floor/airless)
return
else
- user << "The plating is going to need some support."
+ to_chat(user, "The plating is going to need some support.")
+
+ if(istype(C, /obj/item/stack/tile/roofing))
+ var/turf/T = GetAbove(src)
+ var/obj/item/stack/tile/roofing/R = C
+
+ // Patch holes in the ceiling
+ if(T)
+ if(istype(T, /turf/simulated/open) || istype(T, /turf/space))
+ // Must be build adjacent to an existing floor/wall, no floating floors
+ var/turf/simulated/A = locate(/turf/simulated/floor) in T.CardinalTurfs()
+ if(!A)
+ A = locate(/turf/simulated/wall) in T.CardinalTurfs()
+ if(!A)
+ to_chat(user, "There's nothing to attach the ceiling to!")
+ return
+
+ if(R.use(1)) // Cost of roofing tiles is 1:1 with cost to place lattice and plating
+ T.ReplaceWithLattice()
+ T.ChangeTurf(/turf/simulated/floor)
+ playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
+ user.visible_message("[user] expands the ceiling.", "You expand the ceiling.")
+ else
+ to_chat(user, "There aren't any holes in the ceiling to patch here.")
+ return
+ // Space shouldn't have weather of the sort planets with atmospheres do.
+ // If that's changed, then you'll want to swipe the rest of the roofing code from code/game/turfs/simulated/floor_attackby.dm
return
@@ -64,7 +90,7 @@
/turf/space/Entered(atom/movable/A as mob|obj)
if(movement_disabled)
- usr << "Movement is admin-disabled." //This is to identify lag problems
+ to_chat(usr, "Movement is admin-disabled.") //This is to identify lag problems
return
..()
if ((!(A) || src != A.loc)) return
@@ -187,5 +213,5 @@
A.loc.Entered(A)
return
-/turf/space/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0)
- return ..(N, tell_universe, 1)
+/turf/space/ChangeTurf(var/turf/N, var/tell_universe, var/force_lighting_update, var/preserve_outdoors)
+ return ..(N, tell_universe, 1, preserve_outdoors)
diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm
index fa026a0c60..3b5a797c0a 100644
--- a/code/game/turfs/turf_changing.dm
+++ b/code/game/turfs/turf_changing.dm
@@ -109,4 +109,4 @@
lighting_clear_overlay()
if(preserve_outdoors)
- outdoors = old_outdoors
+ outdoors = old_outdoors
\ No newline at end of file
diff --git a/code/game/verbs/advanced_who.dm b/code/game/verbs/advanced_who.dm
index 855c70dafa..a452446e46 100644
--- a/code/game/verbs/advanced_who.dm
+++ b/code/game/verbs/advanced_who.dm
@@ -53,30 +53,22 @@
Lines += entry
else
for(var/client/C in clients)
+ var/entry = "\t"
if(C.holder && C.holder.fakekey)
- var/entry = "\t[C.key]"
- var/mob/observer/dead/O = C.mob
- entry = C.holder.fakekey
- if(isobserver(O))
- entry += " - Observing"
- else if(istype(O,/mob/new_player))
- entry += " - In Lobby"
- else
- entry += " - Playing"
- Lines += entry
+ entry += "[C.holder.fakekey]"
else
- var/entry = "\t[C.key]"
- var/mob/observer/dead/O = C.mob
- if(isobserver(O)) //Woo, players can see
- entry += " - Observing"
- else if(istype(O,/mob/new_player))
- entry += " - In Lobby"
- else
- entry += " - Playing"
- Lines += entry
+ entry += "[C.key]"
+ var/mob/observer/dead/O = C.mob
+ if(isobserver(O))
+ entry += " - Observing"
+ else if(istype(O,/mob/new_player))
+ entry += " - In Lobby"
+ else
+ entry += " - Playing"
+ Lines += entry
for(var/line in sortList(Lines))
msg += "[line]\n"
msg += "Total Players: [length(Lines)]"
- src << msg
+ to_chat(src, msg)
\ No newline at end of file
diff --git a/code/global_vr.dm b/code/global_vr.dm
index 8b4ab024fc..154613a4bb 100644
--- a/code/global_vr.dm
+++ b/code/global_vr.dm
@@ -5,3 +5,30 @@
robot_module_types += "Sci-borg"
robot_module_types += "Pupdozer"
return 1
+
+var/global/list/acceptable_fruit_types= list(
+ "ambrosia",
+ "apple",
+ "banana",
+ "berry",
+ "cabbage",
+ "carrot",
+ "cherry",
+ "chili",
+ "eggplant",
+ "grape",
+ "greengrapes",
+ "lemon",
+ "lime",
+ "onion",
+ "orange",
+ "peanut",
+ "potato",
+ "pumpkin",
+ "rice",
+ "soybean",
+ "sugarcane",
+ "tomato",
+ "watermelon",
+ "wheat",
+ "whitebeet")
\ No newline at end of file
diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm
index 22689f1718..13c6e6a767 100644
--- a/code/modules/admin/verbs/antag-ooc.dm
+++ b/code/modules/admin/verbs/antag-ooc.dm
@@ -12,7 +12,7 @@
else if(is_antag && !is_admin) // Is an antag, and not an admin, meaning we need to check if their antag type allows AOOC.
var/datum/antagonist/A = get_antag_data(usr.mind.special_role)
- if(!A || !A.can_use_aooc)
+ if(!A || !A.can_speak_aooc || !A.can_hear_aooc)
to_chat(usr, "Sorry, but your antagonist type is not allowed to speak in AOOC.")
return
@@ -36,7 +36,7 @@
var/datum/antagonist/A = null
if(M.mind) // Observers don't have minds, but they should still see AOOC.
A = get_antag_data(M.mind.special_role)
- if((M.mind && M.mind.special_role && A && A.can_use_aooc) || isobserver(M)) // Antags must have their type be allowed to AOOC to see AOOC. This prevents, say, ERT from seeing AOOC.
+ if((M.mind && M.mind.special_role && A && A.can_hear_aooc) || isobserver(M)) // Antags must have their type be allowed to AOOC to see AOOC. This prevents, say, ERT from seeing AOOC.
to_chat(M, "[create_text_tag("aooc", "Antag-OOC:", M.client)] [player_display]: [msg]")
log_aooc(msg,src)
\ No newline at end of file
diff --git a/code/modules/artifice/deadringer.dm b/code/modules/artifice/deadringer.dm
new file mode 100644
index 0000000000..e12c0b0045
--- /dev/null
+++ b/code/modules/artifice/deadringer.dm
@@ -0,0 +1,177 @@
+/obj/item/weapon/deadringer
+ name = "silver pocket watch"
+ desc = "A fancy silver-plated digital pocket watch. Looks expensive."
+ icon = 'icons/obj/deadringer.dmi'
+ icon_state = "deadringer"
+ w_class = ITEMSIZE_SMALL
+ slot_flags = SLOT_ID | SLOT_BELT | SLOT_TIE
+ origin_tech = list(TECH_ILLEGAL = 3)
+ var/activated = 0
+ var/timer = 0
+ var/bruteloss_prev = 999999
+ var/fireloss_prev = 999999
+ var/mob/living/carbon/human/corpse = null
+ var/mob/living/carbon/human/watchowner = null
+
+
+/obj/item/weapon/deadringer/New()
+ ..()
+ processing_objects |= src
+
+/obj/item/weapon/deadringer/Destroy() //just in case some smartass tries to stay invisible by destroying the watch
+ uncloak()
+ processing_objects -= src
+ ..()
+
+/obj/item/weapon/deadringer/dropped()
+ if(timer > 20)
+ uncloak()
+ watchowner = null
+ return
+
+/obj/item/weapon/deadringer/attack_self(var/mob/living/user as mob)
+ var/mob/living/H = src.loc
+ if (!istype(H, /mob/living/carbon/human))
+ to_chat(H,"You have no clue what to do with this thing.")
+ return
+ if(!activated)
+ if(timer == 0)
+ to_chat(H, "You press a small button on [src]'s side. It starts to hum quietly.")
+ bruteloss_prev = H.getBruteLoss()
+ fireloss_prev = H.getFireLoss()
+ activated = 1
+ return
+ else
+ to_chat(H,"You press a small button on [src]'s side. It buzzes a little.")
+ return
+ if(activated)
+ to_chat(H,"You press a small button on [src]'s side. It stops humming.")
+ activated = 0
+ return
+
+/obj/item/weapon/deadringer/process()
+ if(activated)
+ if (ismob(src.loc))
+ var/mob/living/carbon/human/H = src.loc
+ watchowner = H
+ if(H.getBruteLoss() > bruteloss_prev || H.getFireLoss() > fireloss_prev)
+ deathprevent()
+ activated = 0
+ if(watchowner.isSynthetic())
+ to_chat(watchowner, "You fade into nothingness! [src]'s screen blinks, being unable to copy your synthetic body!")
+ else
+ to_chat(watchowner, "You fade into nothingness, leaving behind a fake body!")
+ icon_state = "deadringer_cd"
+ timer = 50
+ return
+ if(timer > 0)
+ timer--
+ if(timer == 20)
+ uncloak()
+ if(corpse)
+ new /obj/effect/effect/smoke/chem(corpse.loc)
+ qdel(corpse)
+ if(timer == 0)
+ icon_state = "deadringer"
+ return
+
+/obj/item/weapon/deadringer/proc/deathprevent()
+ for(var/mob/living/simple_animal/D in oviewers(7, src))
+ D.LoseTarget()
+ watchowner.emote("deathgasp")
+ watchowner.alpha = 15
+ makeacorpse(watchowner)
+ for(var/mob/living/simple_animal/D in oviewers(7, src))
+ D.LoseTarget()
+ return
+
+/obj/item/weapon/deadringer/proc/uncloak()
+ if(watchowner)
+ watchowner.alpha = 255
+ playsound(get_turf(src), 'sound/effects/uncloak.ogg', 35, 1, -1)
+ return
+
+/obj/item/weapon/deadringer/proc/makeacorpse(var/mob/living/carbon/human/H)
+ if(H.isSynthetic())
+ return
+ corpse = new /mob/living/carbon/human(H.loc)
+ corpse.setDNA(H.dna.Clone())
+ corpse.death(1) //Kills the new mob
+ var/obj/item/clothing/temp = null
+ if(H.get_equipped_item(slot_w_uniform))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/under/chameleon/changeling(corpse), slot_w_uniform)
+ temp = corpse.get_equipped_item(slot_w_uniform)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_w_uniform)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_wear_suit))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/suit/chameleon/changeling(corpse), slot_wear_suit)
+ temp = corpse.get_equipped_item(slot_wear_suit)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_wear_suit)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_shoes))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/shoes/chameleon/changeling(corpse), slot_shoes)
+ temp = corpse.get_equipped_item(slot_shoes)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_shoes)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_gloves))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/gloves/chameleon/changeling(corpse), slot_gloves)
+ temp = corpse.get_equipped_item(slot_gloves)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_gloves)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_l_ear))
+ temp = H.get_equipped_item(slot_l_ear)
+ corpse.equip_to_slot_or_del(new temp.type(corpse), slot_l_ear)
+ temp = corpse.get_equipped_item(slot_l_ear)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_glasses))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/glasses/chameleon/changeling(corpse), slot_glasses)
+ temp = corpse.get_equipped_item(slot_glasses)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_glasses)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_wear_mask))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/mask/chameleon/changeling(corpse), slot_wear_mask)
+ temp = corpse.get_equipped_item(slot_wear_mask)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_wear_mask)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_head))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/head/chameleon/changeling(corpse), slot_head)
+ temp = corpse.get_equipped_item(slot_head)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_head)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_belt))
+ corpse.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/chameleon/changeling(corpse), slot_belt)
+ temp = corpse.get_equipped_item(slot_belt)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_belt)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_back))
+ corpse.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chameleon/changeling(corpse), slot_back)
+ temp = corpse.get_equipped_item(slot_back)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_back)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ corpse.identifying_gender = H.identifying_gender
+ corpse.flavor_texts = H.flavor_texts.Copy()
+ corpse.real_name = H.real_name
+ corpse.name = H.name
+ corpse.set_species(corpse.dna.species)
+ corpse.change_hair(H.h_style)
+ corpse.change_facial_hair(H.f_style)
+ corpse.change_hair_color(H.r_hair, H.g_hair, H.b_hair)
+ corpse.change_facial_hair_color(H.r_facial, H.g_facial, H.b_facial)
+ corpse.change_skin_color(H.r_skin, H.g_skin, H.b_skin)
+ corpse.adjustFireLoss(H.getFireLoss())
+ corpse.adjustBruteLoss(H.getBruteLoss())
+ corpse.UpdateAppearance()
+ corpse.regenerate_icons()
+ for(var/obj/item/organ/internal/I in corpse.internal_organs)
+ var/obj/item/organ/internal/G = I
+ G.Destroy()
+ return
diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm
index 07f45a9c6f..6b93b33faf 100644
--- a/code/modules/client/preference_setup/general/01_basic.dm
+++ b/code/modules/client/preference_setup/general/01_basic.dm
@@ -71,8 +71,8 @@ datum/preferences/proc/set_biological_gender(var/gender)
. += "Nickname: "
. += "[pref.nickname]"
. += "
"
- . += "Biological Gender: [gender2text(pref.biological_gender)]
"
- . += "Gender Identity: [gender2text(pref.identifying_gender)]
"
+ . += "Biological Sex: [gender2text(pref.biological_gender)]
"
+ . += "Pronouns: [gender2text(pref.identifying_gender)]
"
. += "Age: [pref.age]
"
. += "Spawn Point: [pref.spawnpoint]
"
if(config.allow_Metadata)
@@ -111,13 +111,13 @@ datum/preferences/proc/set_biological_gender(var/gender)
return TOPIC_NOACTION
else if(href_list["bio_gender"])
- var/new_gender = input(user, "Choose your character's biological gender:", "Character Preference", pref.biological_gender) as null|anything in get_genders()
+ var/new_gender = input(user, "Choose your character's biological sex:", "Character Preference", pref.biological_gender) as null|anything in get_genders()
if(new_gender && CanUseTopic(user))
pref.set_biological_gender(new_gender)
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["id_gender"])
- var/new_gender = input(user, "Choose your character's identifying gender:", "Character Preference", pref.identifying_gender) as null|anything in all_genders_define_list
+ var/new_gender = input(user, "Choose your character's pronouns:", "Character Preference", pref.identifying_gender) as null|anything in all_genders_define_list
if(new_gender && CanUseTopic(user))
pref.identifying_gender = new_gender
return TOPIC_REFRESH
@@ -158,4 +158,4 @@ datum/preferences/proc/set_biological_gender(var/gender)
return possible_genders
possible_genders = possible_genders.Copy()
possible_genders |= NEUTER
- return possible_genders
\ No newline at end of file
+ return possible_genders
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index f1d6d95f2a..c11315e614 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -303,7 +303,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += "
Body Markings +
"
for(var/M in pref.body_markings)
- . += "[M] - Color"
+ . += "[M] [pref.body_markings.len > 1 ? "˄ ˅ " : ""]- Color"
. += ""
. += "
"
@@ -500,6 +500,24 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.body_markings[new_marking] = "#000000" //New markings start black
return TOPIC_REFRESH_UPDATE_PREVIEW
+ else if(href_list["marking_up"])
+ var/M = href_list["marking_up"]
+ var/start = pref.body_markings.Find(M)
+ if(start != 1) //If we're not the beginning of the list, swap with the previous element.
+ moveElement(pref.body_markings, start, start-1)
+ else //But if we ARE, become the final element -ahead- of everything else.
+ moveElement(pref.body_markings, start, pref.body_markings.len+1)
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
+ else if(href_list["marking_down"])
+ var/M = href_list["marking_down"]
+ var/start = pref.body_markings.Find(M)
+ if(start != pref.body_markings.len) //If we're not the end of the list, swap with the next element.
+ moveElement(pref.body_markings, start, start+2)
+ else //But if we ARE, become the first element -behind- everything else.
+ moveElement(pref.body_markings, start, 1)
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
else if(href_list["marking_remove"])
var/M = href_list["marking_remove"]
pref.body_markings -= M
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm
index 1c9ec29880..41d37b8a67 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm
@@ -247,7 +247,7 @@ datum/gear/suit/duster
allowed_roles = list("Cargo Technician","Quartermaster")
/datum/gear/suit/roles/poncho/cloak/mining
- display_name = "cloak, cargo"
+ display_name = "cloak, mining"
path = /obj/item/clothing/accessory/poncho/roles/cloak/mining
allowed_roles = list("Quartermaster","Shaft Miner")
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm
index 76178dada2..52fce45031 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm
@@ -116,22 +116,28 @@
path = /obj/item/weapon/cell/device
/datum/gear/utility/implant
- exploitable = 1
-/* VOREStation Edit - Make languages great again
-/datum/gear/utility/implant/eal //This does nothing if you don't actually know EAL.
- display_name = "implant, language, EAL"
- path = /obj/item/weapon/implant/language/eal
- cost = 2
slot = "implant"
- exploitable = 1*/
+ exploitable = 1
/datum/gear/utility/implant/tracking
display_name = "implant, tracking"
path = /obj/item/weapon/implant/tracking/weak
cost = 0 //VOREStation Edit. Changed cost to 0
- slot = "implant"
- exploitable = 1
+/* VOREStation Edit - Make languages great again
+/datum/gear/utility/implant/language
+ cost = 2
+ exploitable = 0
+/datum/gear/utility/implant/language/eal
+ display_name = "vocal synthesizer, EAL"
+ description = "A surgically implanted vocal synthesizer which allows the owner to speak EAL, if they know it."
+ path = /obj/item/weapon/implant/language/eal
+
+/datum/gear/utility/implant/language/skrellian
+ display_name = "vocal synthesizer, Skrellian"
+ description = "A surgically implanted vocal synthesizer which allows the owner to speak Common Skrellian, if they know it."
+ path = /obj/item/weapon/implant/language/skrellian
+*/
/datum/gear/utility/pen
display_name = "Fountain Pen"
path = /obj/item/weapon/pen/fountain
diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm
index e01f738066..c57f485146 100644
--- a/code/modules/client/preference_setup/vore/07_traits.dm
+++ b/code/modules/client/preference_setup/vore/07_traits.dm
@@ -73,14 +73,16 @@
if(!(path in negative_traits))
pref.neg_traits -= path
- if(pref.species == pref.custom_base && pref.species != SPECIES_CUSTOM)
+ var/datum/species/selected_species = all_species[pref.species]
+ if(selected_species.selects_bodytype)
// Allowed!
else if(!pref.custom_base || !(pref.custom_base in custom_species_bases))
pref.custom_base = SPECIES_HUMAN
/datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character)
character.custom_species = pref.custom_species
- if(pref.species == SPECIES_CUSTOM || pref.species == SPECIES_XENOCHIMERA)
+ var/datum/species/selected_species = all_species[pref.species]
+ if(selected_species.selects_bodytype)
var/datum/species/custom/CS = character.species
var/S = pref.custom_base ? pref.custom_base : "Human"
var/datum/species/custom/new_CS = CS.produceCopy(S, pref.pos_traits + pref.neu_traits + pref.neg_traits, character)
@@ -92,7 +94,8 @@
. += "Custom Species "
. += "[pref.custom_species ? pref.custom_species : "-Input Name-"]
"
- if(pref.species == SPECIES_CUSTOM || pref.species == SPECIES_XENOCHIMERA)
+ var/datum/species/selected_species = all_species[pref.species]
+ if(selected_species.selects_bodytype)
. += "Icon Base: "
. += "[pref.custom_base ? pref.custom_base : "Human"]
"
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 99cf57522e..34826e24d9 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -60,7 +60,7 @@ datum/preferences
var/r_synth //Used with synth_color to color synth parts that normaly can't be colored.
var/g_synth //Same as above
var/b_synth //Same as above
- var/synth_markings = 0 //Enable/disable markings on synth parts.
+ var/synth_markings = 1 //VOREStation edit. Enable/disable markings on synth parts.
//Some faction information.
var/home_system = "Unset" //System of birth.
diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm
index 94c4594f5b..24dd18c80b 100644
--- a/code/modules/integrated_electronics/subtypes/memory.dm
+++ b/code/modules/integrated_electronics/subtypes/memory.dm
@@ -75,7 +75,6 @@
/obj/item/integrated_circuit/memory/constant
name = "constant chip"
desc = "This tiny chip can store one piece of data, which cannot be overwritten without disassembly."
- icon_state = "memory"
complexity = 1
inputs = list()
outputs = list("output pin" = IC_PINTYPE_ANY)
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 6e75d97a0d..232ef46e3e 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -53,6 +53,7 @@
recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0)
recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20)
+ recipes += new/datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20)
recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60)
recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1)
diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm
index d602bf71bb..40fe94b7f5 100644
--- a/code/modules/mob/language/generic.dm
+++ b/code/modules/mob/language/generic.dm
@@ -133,6 +133,6 @@
key = "s"
flags = SIGNLANG|NO_STUTTER|NONVERBAL
-/datum/language/sign/can_speak_special(var/mob/speaker)
+/datum/language/sign/can_speak_special(var/mob/speaker) // TODO: If ever we make external organs assist languages, convert this over to the new format
var/obj/item/organ/external/hand/hands = locate() in speaker //you can't sign without hands
return (hands || !iscarbon(speaker))
diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm
index c6089a8788..66e0e5e0f0 100644
--- a/code/modules/mob/language/language.dm
+++ b/code/modules/mob/language/language.dm
@@ -133,7 +133,15 @@
return speech_verb
/datum/language/proc/can_speak_special(var/mob/speaker)
- return 1
+ . = TRUE
+ if(ishuman(speaker))
+ var/mob/living/carbon/human/H = speaker
+ if(src.name in H.species.assisted_langs)
+ . = FALSE
+ var/obj/item/organ/internal/voicebox/vox = locate() in H.internal_organs // Only voiceboxes for now. Maybe someday it'll include other organs, but I'm not that clever
+ if(vox)
+ if(!vox.is_broken() && (src in vox.assists_languages))
+ . = TRUE
// Language handling.
/mob/proc/add_language(var/language)
diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm
index 2c395bca76..47cb3b8de0 100644
--- a/code/modules/mob/language/station.dm
+++ b/code/modules/mob/language/station.dm
@@ -63,6 +63,14 @@
"ka","aasi","far","wa","baq","ara","qara","zir","saam","mak","hrar","nja","rir","khan","jun","dar","rik","kah",
"hal","ket","jurl","mah","tul","cresh","azu","ragh","mro","mra","mrro","mrra")
+/datum/language/tajaran/get_random_name(var/gender)
+ var/new_name = ..(gender,1)
+ if(prob(50))
+ new_name += " [pick(list("Hadii","Kaytam","Nazkiin","Zhan-Khazan","Hharar","Njarir'Akhan","Faaira'Nrezi","Rhezar","Mi'dynh","Rrhazkal","Bayan","Al'Manq","Mi'jri","Chur'eech","Sanu'dra","Ii'rka"))]"
+ else
+ new_name += " [..(gender,1)]"
+ return new_name
+
/datum/language/tajaranakhani
name = LANGUAGE_AKHANI
desc = "The language of the sea-faring Njarir'Akhan Tajaran. Borrowing some elements from Siik, the language is distinctly more structured."
@@ -77,15 +85,6 @@
"kar","yar","kzar","rha","hrar","err","fer","rir","rar","yarr","arr","ii'r","jar","kur","ran","rii","ii",
"nai","ou","kah","oa","ama","uuk","bel","chi","ayt","kay","kas","akor","tam","yir","enai")
-/datum/language/tajaran/get_random_name(var/gender)
-
- var/new_name = ..(gender,1)
- if(prob(50))
- new_name += " [pick(list("Hadii","Kaytam","Nazkiin","Zhan-Khazan","Hharar","Njarir'Akhan","Faaira'Nrezi","Rhezar","Mi'dynh","Rrhazkal","Bayan","Al'Manq","Mi'jri","Chur'eech","Sanu'dra","Ii'rka"))]"
- else
- new_name += " [..(gender,1)]"
- return new_name
-
/datum/language/tajsign
name = LANGUAGE_ALAI
desc = "A standardized Tajaran sign language that was developed in Zarraya and gradually adopted by other nations, incorporating \
@@ -95,6 +94,19 @@
key = "l"
flags = WHITELISTED | SIGNLANG | NO_STUTTER | NONVERBAL
+/datum/language/tajsign/can_speak_special(var/mob/speaker) // TODO: If ever we make external organs assist languages, convert this over to the new format
+ var/list/allowed_species = list(SPECIES_TAJ, SPECIES_TESHARI) // Need a tail and ears and such to use this.
+ if(iscarbon(speaker))
+ var/obj/item/organ/external/hand/hands = locate() in speaker //you can't sign without hands
+ if(!hands)
+ return FALSE
+ if(ishuman(speaker))
+ var/mob/living/carbon/human/H = speaker
+ if(H.species.get_bodytype(H) in allowed_species)
+ return TRUE
+
+ return FALSE
+
/datum/language/skrell
name = LANGUAGE_SKRELLIAN
desc = "A set of warbles and hums, the language itself a complex mesh of both melodic and rhythmic components, exceptionally capable of conveying intent and emotion of the speaker."
@@ -121,7 +133,11 @@
flags = WHITELISTED
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix", "...", "oo", "q", "nq", "x", "xq", "ll", "...", "...", "...") //should sound like there's holes in it
-
+/datum/language/skrell/get_random_name(var/gender)
+ var/list/first_names = file2list('config/names/first_name_skrell.txt')
+ var/list/last_names = file2list('config/names/last_name_skrell.txt')
+ return "[pick(first_names)] [pick(last_names)]"
+
/datum/language/human
name = LANGUAGE_SOL_COMMON
desc = "A bastardized hybrid of many languages, including Chinese, English, French, and more; it is the common language of the Sol system."
@@ -161,11 +177,6 @@
syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz","shh","shk")
space_chance = 10
-/datum/language/machine/can_speak_special(var/mob/speaker)
- var/obj/item/weapon/implant/language/eal/beep = locate() in speaker
- return ((beep && beep.implanted) || speaker.isSynthetic() || isvoice(speaker))
- //thank you sweet zuhayr
-
/datum/language/machine/get_random_name()
if(prob(70))
return "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
@@ -281,4 +292,4 @@
"tod", "ser", "su", "no", "nue", "el",
"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na",
"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un",
-"tod", "ser", "su", "no", "nue", "el")
\ No newline at end of file
+"tod", "ser", "su", "no", "nue", "el")
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index eb473989f2..676eedbdd9 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -14,9 +14,10 @@
var/muzzled = is_muzzled()
//var/m_type = 1
- for (var/obj/item/weapon/implant/I in src)
- if (I.implanted)
- I.trigger(act, src)
+ for(var/obj/item/organ/O in src.organs)
+ for (var/obj/item/weapon/implant/I in O)
+ if (I.implanted)
+ I.trigger(act, src)
if(src.stat == 2.0 && (act != "deathgasp"))
return
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index b860d2b855..04fff68e53 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -2,7 +2,7 @@
var/skip_gear = 0
var/skip_body = 0
- if(alpha <= 50)
+ if(alpha <= EFFECTIVE_INVIS)
src.loc.examine(user)
return
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 792011043a..edf1bdd6c6 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -166,25 +166,12 @@
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if(update) UpdateDamageIcon()
-/mob/living/carbon/human/proc/implant_loadout(var/datum/gear/G = new/datum/gear/utility/implant)
- var/obj/item/weapon/implant/I = new G.path(src)
- I.imp_in = src
- I.implanted = 1
- var/obj/item/organ/external/affected = src.organs_by_name[BP_HEAD]
- affected.implants += I
- I.part = affected
- I.implanted(src)
-
/mob/living/carbon/human/proc/implant_loyalty(override = FALSE) // Won't override by default.
if(!config.use_loyalty_implants && !override) return // Nuh-uh.
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src)
- L.imp_in = src
- L.implanted = 1
- var/obj/item/organ/external/affected = src.organs_by_name[BP_HEAD]
- affected.implants += L
- L.part = affected
- L.implanted(src)
+ if(L.handle_implant(src, BP_HEAD))
+ L.post_implant(src)
/mob/living/carbon/human/proc/is_loyalty_implanted()
for(var/L in src.contents)
@@ -1139,6 +1126,8 @@
remove_language(species.language)
if(species.default_language)
remove_language(species.default_language)
+ for(var/datum/language/L in species.assisted_langs)
+ remove_language(L)
// Clear out their species abilities.
species.remove_inherent_verbs(src)
holder_type = null
diff --git a/code/modules/mob/living/carbon/human/human_defines_vr.dm b/code/modules/mob/living/carbon/human/human_defines_vr.dm
index d3bb4f0b57..f856e4ab39 100644
--- a/code/modules/mob/living/carbon/human/human_defines_vr.dm
+++ b/code/modules/mob/living/carbon/human/human_defines_vr.dm
@@ -6,4 +6,4 @@
var/wagging = 0 //UGH.
var/flapping = 0
var/vantag_pref = VANTAG_NONE //What's my status?
- var/impersonate_bodytype //For impersonating a bodytype
\ No newline at end of file
+ var/impersonate_bodytype //For impersonating a bodytype
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index ebf6facf68..210de2cf85 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -36,6 +36,16 @@
if(shock_stage >= 10) tally -= 1.5 //this gets a +3 later, feral critters take reduced penalty
if(reagents.has_reagent("numbenzyme"))
tally += 1.5 //A tad bit of slowdown.
+ if(riding_datum) //Bit of slowdown for taur rides if rider is bigger or fatter than mount.
+ var/datum/riding/R = riding_datum
+ var/mob/living/L = R.ridden
+ for(var/mob/living/M in L.buckled_mobs)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.size_multiplier > L.size_multiplier)
+ tally += 1
+ if(H.weight > L.weight)
+ tally += 1
//VOREstation end
if(istype(buckled, /obj/structure/bed/chair/wheelchair))
diff --git a/code/modules/mob/living/carbon/human/species/outsider/event.dm b/code/modules/mob/living/carbon/human/species/outsider/event.dm
index 3e75acae9c..477b14c0c4 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/event.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/event.dm
@@ -70,6 +70,7 @@ Variables you may want to make use of are:
num_alternate_languages = 3
species_language = LANGUAGE_GALCOM
secondary_langs = list()
+ assisted_langs = list()
name_language = null // Use the first-name last-name generator rather than a language scrambler
min_age = 0
diff --git a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
index 5d81bb4c9c..d0f40f693d 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
@@ -25,6 +25,8 @@
genders = list(NEUTER)
+ assisted_langs = list()
+
/datum/species/shadow/handle_death(var/mob/living/carbon/human/H)
spawn(1)
new /obj/effect/decal/cleanable/ash(H.loc)
diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
index 9fab4751cc..525a611882 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
@@ -7,6 +7,7 @@
language = LANGUAGE_GALCOM
species_language = LANGUAGE_VOX
num_alternate_languages = 1
+ assisted_langs = list(LANGUAGE_ROOTGLOBAL)
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong)
rarity_value = 4
blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \
@@ -71,6 +72,7 @@
has_organ = list(
O_HEART = /obj/item/organ/internal/heart/vox,
O_LUNGS = /obj/item/organ/internal/lungs/vox,
+ O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver/vox,
O_KIDNEYS = /obj/item/organ/internal/kidneys/vox,
O_BRAIN = /obj/item/organ/internal/brain/vox,
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index b1557f3a28..a1d1a93277 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -52,13 +52,17 @@
// Language/culture vars.
var/default_language = LANGUAGE_GALCOM // Default language is used when 'say' is used without modifiers.
var/language = LANGUAGE_GALCOM // Default racial language, if any.
- var/species_language = LANGUAGE_GALCOM // Used on the Character Setup screen
+ var/list/species_language = list(LANGUAGE_GALCOM) // Used on the Character Setup screen
var/list/secondary_langs = list() // The names of secondary languages that are available to this species.
var/list/speech_sounds = list() // A list of sounds to potentially play when speaking.
var/list/speech_chance = list() // The likelihood of a speech sound playing.
var/num_alternate_languages = 0 // How many secondary languages are available to select at character creation
var/name_language = LANGUAGE_GALCOM // The language to use when determining names for this species, or null to use the first name/last name generator
+ // The languages the species can't speak without an assisted organ.
+ // This list is a guess at things that no one other than the parent species should be able to speak
+ var/list/assisted_langs = list(LANGUAGE_EAL, LANGUAGE_TERMINUS, LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
+
//Soundy emotey things.
var/scream_verb = "screams"
var/male_scream_sound //= 'sound/goonstation/voice/male_scream.ogg' Removed due to licensing, replace!
@@ -183,6 +187,7 @@
var/list/has_organ = list( // which required-organ checks are conducted.
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
+ O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
diff --git a/code/modules/mob/living/carbon/human/species/station/alraune.dm b/code/modules/mob/living/carbon/human/species/station/alraune.dm
index 0f8d7b5622..ba9e634495 100644
--- a/code/modules/mob/living/carbon/human/species/station/alraune.dm
+++ b/code/modules/mob/living/carbon/human/species/station/alraune.dm
@@ -3,7 +3,6 @@
name_plural = "Alraunes"
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
num_alternate_languages = 2
- language = LANGUAGE_ROOTLOCAL
slowdown = 1 //slow, they're plants. Not as slow as full diona.
total_health = 100 //standard
brute_mod = 1 //nothing special
@@ -14,6 +13,8 @@
min_age = 18
max_age = 250
health_hud_intensity = 1.5
+ base_species = SPECIES_ALRAUNE
+ selects_bodytype = TRUE
body_temperature = T20C
breath_type = "carbon_dioxide"
@@ -48,7 +49,8 @@
/mob/living/carbon/human/proc/succubus_drain,
/mob/living/carbon/human/proc/succubus_drain_finalize,
/mob/living/carbon/human/proc/succubus_drain_lethal,
- /mob/living/carbon/human/proc/bloodsuck) //Give them the voremodes related to wrapping people in vines and sapping their fluids
+ /mob/living/carbon/human/proc/bloodsuck,
+ /mob/living/carbon/human/proc/alraune_fruit_select) //Give them the voremodes related to wrapping people in vines and sapping their fluids
color_mult = 1
icobase = 'icons/mob/human_races/r_human_vr.dmi'
@@ -86,6 +88,7 @@
O_KIDNEYS = /obj/item/organ/internal/kidneys/alraune,
O_BRAIN = /obj/item/organ/internal/brain/alraune,
O_EYES = /obj/item/organ/internal/eyes/alraune,
+ A_FRUIT = /obj/item/organ/internal/fruitgland,
)
/datum/species/alraune/can_breathe_water()
@@ -332,5 +335,164 @@
/obj/item/organ/internal/liver/alraune
icon = 'icons/mob/species/alraune/organs.dmi'
icon_state = "phytoextractor"
- name = "phytoextractor"
- desc = "A bulbous gourd-like structure."
\ No newline at end of file
+ name = "enzoretector"
+ desc = "A bulbous gourd-like structure."
+
+//Begin fruit gland and its code.
+/obj/item/organ/internal/fruitgland //Amazing name, I know.
+ icon = 'icons/mob/species/alraune/organs.dmi'
+ icon_state = "phytoextractor"
+ name = "fruit gland"
+ desc = "A bulbous gourd-like structure."
+ organ_tag = A_FRUIT
+ var/generated_reagents = list("sugar" = 2) //This actually allows them. This could be anything, but sugar seems most fitting.
+ var/usable_volume = 250 //Five fruit.
+ var/transfer_amount = 50
+ var/empty_message = list("Your have no fruit on you.", "You have a distinct lack of fruit..")
+ var/full_message = list("You have a multitude of fruit that is ready for harvest!", "You have fruit that is ready to be picked!")
+ var/emote_descriptor = list("fruit right off of the Alraune!", "a fruit from the Alraune!")
+ var/verb_descriptor = list("grabs", "snatches", "picks")
+ var/self_verb_descriptor = list("grab", "snatch", "pick")
+ var/short_emote_descriptor = list("picks", "grabs")
+ var/self_emote_descriptor = list("grab", "pick", "snatch")
+ var/fruit_type = "apple"
+ var/mob/organ_owner = null
+ var/gen_cost = 0.5
+
+/obj/item/organ/internal/fruitgland/New()
+ ..()
+ create_reagents(usable_volume)
+
+
+/obj/item/organ/internal/fruitgland/process()
+ if(!owner) return
+ var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
+ var/before_gen
+ if(parent && generated_reagents && organ_owner) //Is it in the chest/an organ, has reagents, and is 'activated'
+ before_gen = reagents.total_volume
+ if(reagents.total_volume < reagents.maximum_volume)
+ if(organ_owner.nutrition >= gen_cost)
+ do_generation()
+
+ if(reagents)
+ if(reagents.total_volume == reagents.maximum_volume * 0.05)
+ to_chat(organ_owner, "[pick(empty_message)]")
+ else if(reagents.total_volume == reagents.maximum_volume && before_gen < reagents.maximum_volume)
+ to_chat(organ_owner, "[pick(full_message)]")
+
+/obj/item/organ/internal/fruitgland/proc/do_generation()
+ organ_owner.nutrition -= gen_cost
+ for(var/reagent in generated_reagents)
+ reagents.add_reagent(reagent, generated_reagents[reagent])
+
+
+/mob/living/carbon/human/proc/alraune_fruit_select() //So if someone doesn't want fruit/vegetables, they don't have to select one.
+ set name = "Select fruit"
+ set desc = "Select what fruit/vegetable you wish to grow."
+ set category = "Object"
+ var/obj/item/organ/internal/fruitgland/fruit_gland
+ for(var/F in contents)
+ if(istype(F, /obj/item/organ/internal/fruitgland))
+ fruit_gland = F
+ break
+
+ if(fruit_gland)
+ var/selection = input(src, "Choose your character's fruit type. Choosing nothing will result in a default of apples.", "Fruit Type", fruit_gland.fruit_type) as null|anything in acceptable_fruit_types
+ if(selection)
+ fruit_gland.fruit_type = selection
+ verbs |= /mob/living/carbon/human/proc/alraune_fruit_pick
+ verbs -= /mob/living/carbon/human/proc/alraune_fruit_select
+ fruit_gland.organ_owner = src
+ fruit_gland.emote_descriptor = list("fruit right off of [fruit_gland.organ_owner]!", "a fruit from [fruit_gland.organ_owner]!")
+
+ else
+ to_chat(src, "You lack the organ required to produce fruit.")
+ return
+
+/mob/living/carbon/human/proc/alraune_fruit_pick()
+ set name = "Pick Fruit"
+ set desc = "Pick fruit off of [src]."
+ set category = "Object"
+ set src in view(1)
+
+ //do_reagent_implant(usr)
+ if(!isliving(usr) || !usr.canClick())
+ return
+
+ if(usr.incapacitated() || usr.stat > CONSCIOUS)
+ return
+
+ var/obj/item/organ/internal/fruitgland/fruit_gland
+ for(var/I in contents)
+ if(istype(I, /obj/item/organ/internal/fruitgland))
+ fruit_gland = I
+ break
+ if (fruit_gland) //Do they have the gland?
+ if(fruit_gland.reagents.total_volume < fruit_gland.transfer_amount)
+ to_chat(src, "[pick(fruit_gland.empty_message)]")
+ return
+
+ var/datum/seed/S = plant_controller.seeds["[fruit_gland.fruit_type]"]
+ S.harvest(usr,0,0,1)
+
+ var/index = rand(0,2)
+
+ if (usr != src)
+ var/emote = fruit_gland.emote_descriptor[index]
+ var/verb_desc = fruit_gland.verb_descriptor[index]
+ var/self_verb_desc = fruit_gland.self_verb_descriptor[index]
+ usr.visible_message("[usr] [verb_desc] [emote]",
+ "You [self_verb_desc] [emote]")
+ else
+ visible_message("[src] [pick(fruit_gland.short_emote_descriptor)] a fruit.",
+ "You [pick(fruit_gland.self_emote_descriptor)] a fruit.")
+
+ fruit_gland.reagents.remove_any(fruit_gland.transfer_amount)
+
+//End of fruit gland code.
+
+/datum/species/alraune/proc/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H)
+ ASSERT(to_copy)
+ ASSERT(istype(H))
+
+ if(ispath(to_copy))
+ to_copy = "[initial(to_copy.name)]"
+ if(istext(to_copy))
+ to_copy = all_species[to_copy]
+
+ var/datum/species/alraune/new_copy = new()
+
+ //Initials so it works with a simple path passed, or an instance
+ new_copy.base_species = to_copy.name
+ new_copy.icobase = to_copy.icobase
+ new_copy.deform = to_copy.deform
+ new_copy.tail = to_copy.tail
+ new_copy.tail_animation = to_copy.tail_animation
+ new_copy.icobase_tail = to_copy.icobase_tail
+ new_copy.color_mult = to_copy.color_mult
+ new_copy.primitive_form = to_copy.primitive_form
+ new_copy.appearance_flags = to_copy.appearance_flags
+ new_copy.flesh_color = to_copy.flesh_color
+ new_copy.base_color = to_copy.base_color
+ new_copy.blood_mask = to_copy.blood_mask
+ new_copy.damage_mask = to_copy.damage_mask
+ new_copy.damage_overlays = to_copy.damage_overlays
+
+ //Set up a mob
+ H.species = new_copy
+ H.icon_state = lowertext(new_copy.get_bodytype())
+
+ if(new_copy.holder_type)
+ H.holder_type = new_copy.holder_type
+
+ if(H.dna)
+ H.dna.ready_dna(H)
+
+ return new_copy
+
+/datum/species/alraune/get_bodytype()
+ return base_species
+
+/datum/species/alraune/get_race_key()
+ var/datum/species/real = all_species[base_species]
+ return real.race_key
diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
index f2847a1523..45c5f4b8f3 100644
--- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
@@ -1,15 +1,18 @@
/datum/species
//var/vore_numbing = 0
- var/gets_food_nutrition = 1 // If this is set to 0, the person can't get nutrition from food.
+ var/gets_food_nutrition = TRUE // If this is set to 0, the person can't get nutrition from food.
var/metabolism = 0.0015
- var/lightweight = 0 //Oof! Nonhelpful bump stumbles.
- var/trashcan = 0 //It's always sunny in the wrestling ring.
+ var/lightweight = FALSE //Oof! Nonhelpful bump stumbles.
+ var/trashcan = FALSE //It's always sunny in the wrestling ring.
+ var/base_species = null // Unused outside of a few species
+ var/selects_bodytype = FALSE // Allows the species to choose from body types intead of being forced to be just one.
/datum/species/custom
name = SPECIES_CUSTOM
name_plural = "Custom"
- var/base_species = "Human"
+ selects_bodytype = TRUE
+ base_species = SPECIES_HUMAN
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm
index 9ec7a2b005..3b09166813 100644
--- a/code/modules/mob/living/carbon/human/species/station/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/station/golem.dm
@@ -11,6 +11,8 @@
spawn_flags = SPECIES_IS_RESTRICTED
siemens_coefficient = 0
+ assisted_langs = list()
+
breath_type = null
poison_type = null
diff --git a/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm
index 180732b0aa..56b5c36035 100644
--- a/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm
+++ b/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm
@@ -45,6 +45,7 @@
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
+ O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
index 01af604992..b78d530707 100644
--- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
@@ -30,6 +30,7 @@ var/datum/species/shapeshifter/promethean/prometheans
health_hud_intensity = 2
num_alternate_languages = 3
species_language = LANGUAGE_SOL_COMMON
+ assisted_langs = list(LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) // Prometheans are weird, let's just assume they can use basically any language.
breath_type = null
poison_type = null
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
index 598bea3edb..03c88fae40 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
@@ -53,7 +53,7 @@
var/datum/robolimb/M = chargen_robolimbs[company]
if(!(choice in M.parts))
continue
- if(species.name in M.species_cannot_use)
+ if(impersonate_bodytype in M.species_cannot_use)
continue
if(M.whitelisted_to && !(ckey in M.whitelisted_to))
continue
@@ -106,7 +106,7 @@
var/datum/robolimb/M = chargen_robolimbs[company]
if(!(BP_TORSO in M.parts))
continue
- if(species.name in M.species_cannot_use)
+ if(impersonate_bodytype in M.species_cannot_use)
continue
if(M.whitelisted_to && !(ckey in M.whitelisted_to))
continue
@@ -374,4 +374,4 @@
icon_state = "metal"
to_call = /mob/living/carbon/human/proc/nano_metalnom
-#undef PER_LIMB_STEEL_COST
\ No newline at end of file
+#undef PER_LIMB_STEEL_COST
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
index 618382f3a8..05237f5742 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
@@ -1,7 +1,7 @@
#define DAM_SCALE_FACTOR 0.01
#define METAL_PER_TICK 150
/datum/species/protean
- name = "Protean"
+ name = SPECIES_PROTEAN
name_plural = "Proteans"
blurb = "Sometimes very advanced civilizations will produce the ability to swap into manufactured, robotic bodies. And sometimes \
VERY advanced civilizations have the option of 'nanoswarm' bodies. Effectively a single robot body comprised \
@@ -139,7 +139,7 @@
if(H.backbag == 1) //Somewhat misleading, 1 == no bag (not boolean)
H.equip_to_slot_or_del(permit, slot_l_hand)
- H.equip_to_slot_or_del(metal_stack, slot_r_hand)
+ H.equip_to_slot_or_del(metal_stack, slot_r_hand)
else
H.equip_to_slot_or_del(permit, slot_in_backpack)
H.equip_to_slot_or_del(metal_stack, slot_in_backpack)
@@ -172,7 +172,7 @@
var/obj/item/organ/internal/nano/refactory/refactory = locate() in H.internal_organs
if(refactory && !(refactory.status & ORGAN_DEAD))
-
+
//MHydrogen adds speeeeeed
if(refactory.get_stored_material("mhydrogen") >= METAL_PER_TICK)
H.add_modifier(/datum/modifier/protean/mhydrogen, origin = refactory)
@@ -233,7 +233,7 @@
var/obj/item/organ/internal/nano/refactory/refactory = origin.resolve()
if(!istype(refactory) || refactory.status & ORGAN_DEAD)
expire()
-
+
//Out of materials
if(!refactory.use_stored_material(material_name,material_use))
expire()
@@ -255,7 +255,7 @@
on_created_text = "You feel yourself become nearly impervious to physical attacks as plasteel nanites are made."
on_expired_text = "Your refactory finishes consuming the plasteel, and you return to your normal nanites."
-
+
material_name = "plasteel"
incoming_brute_damage_percent = 0.5
@@ -266,7 +266,7 @@
on_created_text = "You feel yourself become more reflective, able to resist heat and fire better for a time."
on_expired_text = "Your refactory finishes consuming the diamond, and you return to your normal nanites."
-
+
material_name = "diamond"
incoming_fire_damage_percent = 0.2
@@ -277,7 +277,7 @@
on_created_text = "You feel new nanites being produced from your stockpile of steel, healing you slowly."
on_expired_text = "Your steel supply has either run out, or is no longer needed, and your healing stops."
-
+
material_name = "steel"
/datum/modifier/protean/steel/tick()
diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/seromi.dm
index fe21426805..6cd1a757cd 100644
--- a/code/modules/mob/living/carbon/human/species/station/seromi.dm
+++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm
@@ -104,6 +104,7 @@
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
+ O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index 19376b10f9..788ac2bfeb 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -12,6 +12,7 @@
species_language = LANGUAGE_SOL_COMMON
secondary_langs = list(LANGUAGE_SOL_COMMON, LANGUAGE_TERMINUS)
name_language = null // Use the first-name last-name generator rather than a language scrambler
+ assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
min_age = 17
max_age = 130
@@ -217,6 +218,7 @@
has_organ = list( //No appendix.
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
+ O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
@@ -243,6 +245,7 @@
secondary_langs = list(LANGUAGE_SKRELLIAN, LANGUAGE_SCHECHI)
name_language = LANGUAGE_SKRELLIAN
species_language = LANGUAGE_SKRELLIAN
+ assisted_langs = list(LANGUAGE_EAL, LANGUAGE_TERMINUS, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
health_hud_intensity = 2
water_movement = -3
@@ -317,13 +320,14 @@
hud_type = /datum/hud_data/diona
siemens_coefficient = 0.3
show_ssd = "completely quiescent"
- num_alternate_languages = 2
- secondary_langs = list(LANGUAGE_ROOTGLOBAL)
- name_language = LANGUAGE_ROOTLOCAL
- species_language = LANGUAGE_ROOTLOCAL
health_hud_intensity = 2.5
item_slowdown_mod = 0.25
+ num_alternate_languages = 2
+ name_language = LANGUAGE_ROOTLOCAL
+ species_language = LANGUAGE_ROOTLOCAL
+ secondary_langs = list(LANGUAGE_ROOTGLOBAL)
+ assisted_langs = list(LANGUAGE_VOX) // Diona are weird, let's just assume they can use basically any language.
min_age = 1
max_age = 300
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
index aa8af0e273..5315840a82 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
@@ -5,7 +5,7 @@
/datum/species/xenochimera //Scree's race.
- name = "Xenochimera"
+ name = SPECIES_XENOCHIMERA
name_plural = "Xenochimeras"
icobase = 'icons/mob/human_races/r_xenochimera.dmi'
deform = 'icons/mob/human_races/r_def_xenochimera.dmi'
@@ -14,7 +14,8 @@
slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari.
brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though.
burn_mod = 1.15 //As vulnerable to burn as a Tajara.
- var/base_species = "Xenochimera"
+ base_species = "Xenochimera"
+ selects_bodytype = TRUE
num_alternate_languages = 2
secondary_langs = list("Sol Common")
@@ -300,7 +301,7 @@
/////SPIDER RACE/////
/////////////////////
/datum/species/spider //These actually look pretty damn spooky!
- name = "Vasilissan"
+ name = SPECIES_VASILISSAN
name_plural = "Vasilissans"
icobase = 'icons/mob/human_races/r_spider.dmi'
deform = 'icons/mob/human_races/r_def_spider.dmi'
diff --git a/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm b/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm
index b027407cf1..76f82ec513 100644
--- a/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm
+++ b/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm
@@ -16,6 +16,8 @@
speech_bubble_appearance = "cyber"
+ assisted_langs = list()
+
male_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
female_cough_sounds = list('sound/effects/mob_effects/f_cougha.ogg','sound/effects/mob_effects/f_coughb.ogg')
male_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg'
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
index d851c40255..1d2ce59307 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
@@ -5,6 +5,7 @@
default_language = "Xenomorph"
language = "Hivemind"
+ assisted_langs = list()
unarmed_types = list(/datum/unarmed_attack/claws/strong/xeno, /datum/unarmed_attack/bite/strong/xeno)
hud_type = /datum/hud_data/alien
rarity_value = 3
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 7d2d86ab76..0bcfcf6174 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1277,4 +1277,8 @@ default behaviour is:
/mob/living/proc/has_vision()
- return !(eye_blind || (disabilities & BLIND) || stat || blinded)
\ No newline at end of file
+ return !(eye_blind || (disabilities & BLIND) || stat || blinded)
+
+
+/mob/living/proc/dirties_floor() // If we ever decide to add fancy conditionals for making dirty floors (floating, etc), here's the proc.
+ return makes_dirt
\ No newline at end of file
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 3d9140dd46..08bebc91b2 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -380,8 +380,13 @@
var/turf/location = get_turf(src)
location.hotspot_expose(fire_burn_temperature(), 50, 1)
-/mob/living/fire_act()
- adjust_fire_stacks(2)
+//altered this to cap at the temperature of the fire causing it, using the same 1:1500 value as /mob/living/carbon/human/handle_fire() in human/life.dm
+/mob/living/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature)
+ if(fire_stacks < exposed_temperature/1500) // Subject to balance
+ adjust_fire_stacks(2)
+ else
+ adjust_fire_stacks(2)
IgniteMob()
//Share fire evenly between the two mobs
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 9739e596b8..1ee86da6ef 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -16,7 +16,6 @@
var/brainloss = 0 //'Retardation' damage caused by someone hitting you in the head with a bible or being infected with brainrot.
var/halloss = 0 //Hallucination damage. 'Fake' damage obtained through hallucinating or the holodeck. Sleeping should cause it to wear off.
-
var/hallucination = 0 //Directly affects how long a mob will hallucinate for
var/list/atom/hallucinations = list() //A list of hallucinated people that try to attack the mob. See /obj/effect/fake_attacker in hallucinations.dm
@@ -59,3 +58,5 @@
var/list/hud_list //Holder for health hud, status hud, wanted hud, etc (not like inventory slots)
var/has_huds = FALSE //Whether or not we should bother initializing the above list
+
+ var/makes_dirt = TRUE //FALSE if the mob shouldn't be making dirt on the ground when it walks
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/icons.dm b/code/modules/mob/living/silicon/ai/icons.dm
index 2d8bc0d002..c9891f9ae8 100644
--- a/code/modules/mob/living/silicon/ai/icons.dm
+++ b/code/modules/mob/living/silicon/ai/icons.dm
@@ -84,6 +84,7 @@ var/list/datum/ai_icon/ai_icons
/datum/ai_icon/glitchman
name = "Glitchman"
alive_icon = "ai-glitchman"
+ dead_icon = "ai-glitchman-crash"
/datum/ai_icon/goon
name = "Goon"
@@ -110,6 +111,7 @@ var/list/datum/ai_icon/ai_icons
name = "Inverted"
alive_icon = "ai-u"
alive_light = "#81DDFF"
+ dead_icon = "ai-u-crash"
/datum/ai_icon/lonestar
name = "Lonestar"
@@ -163,14 +165,87 @@ var/list/datum/ai_icon/ai_icons
/datum/ai_icon/trapped
name = "Trapped"
alive_icon = "ai-hades"
- dead_icon = "ai-hades_dead"
+ dead_icon = "ai-hades-crash"
-/datum/ai_icon/triumvirate_static
+/datum/ai_icon/triumvirate
name = "Triumvirate"
alive_icon = "ai-triumvirate"
alive_light = "#020B2B"
/datum/ai_icon/triumvirate_static
name = "Triumvirate Static"
- alive_icon = "ai-static"
+ alive_icon = "ai-triumvirate-malf"
alive_light = "#020B2B"
+
+//Eros Research Platform Ports
+
+/datum/ai_icon/clown2
+ name = "Honk"
+ alive_icon = "ai-clown2"
+ dead_icon = "ai-clown2-crash"
+
+/datum/ai_icon/boxfort
+ name = "Boxfort"
+ alive_icon = "ai-boxfort"
+ dead_icon = "ai-boxfort_dead"
+
+/datum/ai_icon/ravensdale
+ name = "Integration"
+ alive_icon = "ai-ravensdale"
+ dead_icon = "ai-ravensdale-crash"
+
+/datum/ai_icon/gentoo
+ name = "Gentoo"
+ alive_icon = "ai-gentoo"
+ dead_icon = "ai-gentoo_dead"
+
+/datum/ai_icon/serithi
+ name = "Mechanicus"
+ alive_icon = "ai-serithi"
+ dead_icon = "ai-serithi-crash"
+
+/datum/ai_icon/alien
+ name = "Xenomorph"
+ alive_icon = "ai-alien"
+ dead_icon = "ai-alien-crash"
+
+/datum/ai_icon/syndicat
+ name = "Syndi-cat"
+ alive_icon = "ai-syndicatmeow"
+
+/datum/ai_icon/wasp
+ name = "Wasp"
+ alive_icon = "ai-wasp"
+
+/datum/ai_icon/house
+ name = "Doctor"
+ alive_icon = "ai-house"
+
+/datum/ai_icon/fabulous
+ name = "Fabulous"
+ alive_icon = "ai-fabulous"
+
+/datum/ai_icon/yesman
+ name = "Yes Man"
+ alive_icon = "ai-yes-man"
+ dead_icon = "ai-alien-crash"
+
+/datum/ai_icon/royal
+ name = "Royal"
+ alive_icon = "ai-royal"
+
+/datum/ai_icon/pirate
+ name = "Pirate"
+ alive_icon = "ai-pirate"
+
+/datum/ai_icon/gygas
+ name = "Love"
+ alive_icon = "ai-gygas"
+
+/datum/ai_icon/xerxes
+ name = "Xerxes"
+ alive_icon = "ai-xerxes"
+
+/datum/ai_icon/godfrey
+ name = "Godfrey"
+ alive_icon = "ai-godfrey"
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
index 7d24676e0b..e723b4ee41 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
@@ -142,15 +142,27 @@
chargecost = 500
/obj/item/weapon/shockpaddles/robot/hound/jumper
- name = "paws of life"
- icon = 'icons/mob/dogborg_vr.dmi'
- icon_state = "defibpaddles0"
+ name = "jumper paws"
desc = "Zappy paws. For rebooting a full body prostetic."
- combat = 1
- attack_verb = list("batted", "pawed", "bopped", "whapped")
- chargecost = 500
use_on_synthetic = 1
+/obj/item/weapon/reagent_containers/borghypo/hound
+ name = "MediHound hypospray"
+ desc = "An advanced chemical synthesizer and injection system utilizing carrier's reserves, designed for heavy-duty medical equipment."
+ charge_cost = 10
+ var/datum/matter_synth/water = null
+
+/obj/item/weapon/reagent_containers/borghypo/hound/process() //Recharges in smaller steps and uses the water reserves as well.
+ if(isrobot(loc))
+ var/mob/living/silicon/robot/R = loc
+ if(R && R.cell)
+ for(var/T in reagent_ids)
+ if(reagent_volumes[T] < volume && water.energy >= charge_cost)
+ R.cell.use(charge_cost)
+ water.use_charge(charge_cost)
+ reagent_volumes[T] = min(reagent_volumes[T] + 1, volume)
+ return 1
+
//Tongue stuff
/obj/item/device/dogborg/tongue
name = "synthetic tongue"
@@ -188,7 +200,14 @@
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(user.client && (target in user.client.screen))
to_chat(user, "You need to take \the [target.name] off before cleaning it!")
- else if(istype(target,/obj/effect/decal/cleanable) && water.energy >= 5)
+ if(istype(target, /obj/structure/sink) || istype(target, /obj/structure/toilet)) //Dog vibes.
+ user.visible_message("[user] begins to lap up water from [target.name].", "You begin to lap up water from [target.name].")
+ if(do_after (user, 50))
+ water.add_charge(50)
+ else if(water.energy < 5)
+ to_chat(user, "Your mouth feels dry.")
+ return
+ else if(istype(target,/obj/effect/decal/cleanable))
user.visible_message("[user] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...")
if(do_after (user, 50))
to_chat(user, "You finish licking off \the [target.name].")
@@ -196,7 +215,7 @@
qdel(target)
var/mob/living/silicon/robot.R = user
R.cell.charge += 50
- else if(istype(target,/obj/item) && water.energy >= 5)
+ else if(istype(target,/obj/item))
if(istype(target,/obj/item/trash))
user.visible_message("[user] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]...")
if(do_after (user, 50))
@@ -238,25 +257,14 @@
"[user] has shocked you with its tongue! You can feel the betrayal.")
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
R.cell.charge -= 666
- else if(water.energy >= 5)
+ else
user.visible_message("\the [user] affectionally licks all over \the [target]'s face!", "You affectionally lick all over \the [target]'s face!")
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
water.use_charge(5)
var/mob/living/carbon/human/H = target
if(H.species.lightweight == 1)
H.Weaken(3)
- return
- else if(istype(target, /obj/structure/window) && water.energy >= 1)
- user.visible_message("[user] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...")
- if(do_after (user, 50))
- to_chat(user, "You clean \the [target.name].")
- water.use_charge(5)
- target.color = initial(target.color)
- else if(istype(target, /obj/structure/sink) || istype(target, /obj/structure/toilet)) //Dog vibes.
- user.visible_message("[user] begins to lap up water from [target.name].", "You begin to lap up water from [target.name].")
- if(do_after (user, 50))
- water.add_charge(100)
- else if(water.energy >= 5)
+ else
user.visible_message("[user] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...")
if(do_after (user, 50))
to_chat(user, "You clean \the [target.name].")
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
index 39236a824f..f6c2028fec 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
@@ -11,7 +11,6 @@
var/min_health = -100
var/cleaning = 0
var/patient_laststat = null
- var/mob_energy = -100 //Energy gained from digesting dead mobs (including PCs)
var/list/injection_chems = list("inaprovaline", "dexalin", "bicaridine", "kelotane","anti_toxin", "alkysine", "imidazoline", "spaceacillin", "paracetamol") //The borg is able to heal every damage type. As a nerf, they use 750 charge per injection.
var/eject_port = "ingestion"
var/list/items_preserved = list()
@@ -19,6 +18,12 @@
var/compactor = FALSE
var/analyzer = FALSE
var/decompiler = FALSE
+ var/delivery = FALSE
+ var/delivery_tag = "Fuel"
+ var/list/deliverylists = list()
+ var/list/deliveryslot_1 = list()
+ var/list/deliveryslot_2 = list()
+ var/list/deliveryslot_3 = list()
var/datum/research/techonly/files //Analyzerbelly var.
var/synced = FALSE
var/startdrain = 500
@@ -50,52 +55,11 @@
return
if(target in hound.module.modules)
return
- if(length(contents) > (max_item_count - 1))
+ if(length(contents) >= max_item_count)
to_chat(user, "Your [src.name] is full. Eject or process contents to continue.")
return
- if(analyzer == TRUE)
- if(istype(target, /obj/item))
- var/obj/target_obj = target
- if(target_obj.w_class > ITEMSIZE_LARGE)
- to_chat(user, "\The [target] is too large to fit into your [src.name]")
- return
- user.visible_message("[hound.name] is ingesting [target.name] into their [src.name].", "You start ingesting [target] into your [src.name]...")
- if(do_after(user, 30, target) && length(contents) < max_item_count)
- target.forceMove(src)
- user.visible_message("[hound.name]'s internal analyzer groans lightly as [target.name] slips inside.", "Your internal analyzer groans lightly as [target] slips inside.")
- playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises)
- if(istype(target,/obj/item))
- var/obj/item/tech_item = target
- for(var/T in tech_item.origin_tech)
- to_chat(user, "\The [tech_item] has level [tech_item.origin_tech[T]] in [CallTechName(T)].")
- update_patient()
- if(UI_open == TRUE)
- sleeperUI(usr)
- return
-
- else if(ishuman(target))
- var/mob/living/carbon/human/trashman = target
- if(patient)
- to_chat(user, "Your [src.name] is already occupied.")
- return
- if(trashman.buckled)
- to_chat(user, "[trashman] is buckled and can not be put into your [src.name].")
- return
- user.visible_message("[hound.name] is ingesting [trashman] into their [src.name].", "You start ingesting [trashman] into your [src.name]...")
- if(do_after(user, 30, trashman) && !patient && !trashman.buckled && length(contents) < max_item_count)
- trashman.forceMove(src)
- trashman.reset_view(src)
- processing_objects |= src
- user.visible_message("[hound.name]'s internal analyzer groans lightly as [trashman] slips inside.", "Your internal analyzer groans lightly as [trashman] slips inside.")
- playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises)
- update_patient()
- if(UI_open == TRUE)
- sleeperUI(usr)
- return
- return
-
- if(compactor == TRUE)
+ if(compactor)
if(istype(target, /obj/item) || istype(target, /obj/effect/decal/remains))
var/obj/target_obj = target
if(target_obj.w_class > ITEMSIZE_LARGE)
@@ -104,11 +68,17 @@
user.visible_message("[hound.name] is ingesting [target.name] into their [src.name].", "You start ingesting [target] into your [src.name]...")
if(do_after(user, 30, target) && length(contents) < max_item_count)
target.forceMove(src)
- user.visible_message("[hound.name]'s garbage processor groans lightly as [target.name] slips inside.", "Your garbage compactor groans lightly as [target] slips inside.")
+ user.visible_message("[hound.name]'s [src.name] groans lightly as [target.name] slips inside.", "Your [src.name] groans lightly as [target] slips inside.")
playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises)
+ if(analyzer && istype(target,/obj/item))
+ var/obj/item/tech_item = target
+ for(var/T in tech_item.origin_tech)
+ to_chat(user, "\The [tech_item] has level [tech_item.origin_tech[T]] in [CallTechName(T)].")
+ if(delivery)
+ if(islist(deliverylists[delivery_tag]))
+ deliverylists[delivery_tag] |= target
+ to_chat(user, "\The [target.name] added to cargo compartment slot: [delivery_tag].")
update_patient()
- if(UI_open == TRUE)
- sleeperUI(usr)
return
if(istype(target, /mob/living/simple_animal/mouse)) //Edible mice, dead or alive whatever. Mostly for carcass picking you cruel bastard :v
@@ -117,11 +87,13 @@
if(do_after(user, 30, trashmouse) && length(contents) < max_item_count)
trashmouse.forceMove(src)
trashmouse.reset_view(src)
- user.visible_message("[hound.name]'s garbage processor groans lightly as [trashmouse] slips inside.", "Your garbage compactor groans lightly as [trashmouse] slips inside.")
+ user.visible_message("[hound.name]'s [src.name] groans lightly as [trashmouse] slips inside.", "Your [src.name] groans lightly as [trashmouse] slips inside.")
playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises)
+ if(delivery)
+ if(islist(deliverylists[delivery_tag]))
+ deliverylists[delivery_tag] |= trashmouse
+ to_chat(user, "\The [trashmouse] added to cargo compartment slot: [delivery_tag].")
update_patient()
- if(UI_open == TRUE)
- sleeperUI(usr)
return
else if(ishuman(target))
@@ -137,13 +109,18 @@
trashman.forceMove(src)
trashman.reset_view(src)
processing_objects |= src
- user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.")
+ user.visible_message("[hound.name]'s [src.name] groans lightly as [trashman] slips inside.", "Your [src.name] groans lightly as [trashman] slips inside.")
+ message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])")
playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises)
+ if(delivery)
+ if(islist(deliverylists[delivery_tag]))
+ deliverylists[delivery_tag] |= trashman
+ to_chat(user, "\The [trashman] added to cargo compartment slot: [delivery_tag].")
+ to_chat(trashman, "[hound.name] has added you to their cargo compartment slot: [delivery_tag].")
update_patient()
- if(UI_open == TRUE)
- sleeperUI(usr)
return
return
+
else if(ishuman(target))
var/mob/living/carbon/human/H = target
if(H.buckled)
@@ -154,50 +131,38 @@
return
user.visible_message("[hound.name] is ingesting [H.name] into their [src.name].", "You start ingesting [H] into your [src]...")
if(!patient && !H.buckled && do_after (user, 50, H))
-
- if(!proximity) return //If they moved away, you can't eat them.
-
- if(patient) return //If you try to eat two people at once, you can only eat one.
-
+ if(!proximity)
+ return //If they moved away, you can't eat them.
+ if(patient)
+ return //If you try to eat two people at once, you can only eat one.
else //If you don't have someone in you, proceed.
H.forceMove(src)
H.reset_view(src)
update_patient()
processing_objects |= src
- user.visible_message("[hound.name]'s medical pod lights up as [H.name] slips inside into their [src.name].", "Your medical pod lights up as [H] slips into your [src]. Life support functions engaged.")
+ user.visible_message("[hound.name]'s [src.name] lights up as [H.name] slips inside.", "Your [src] lights up as [H] slips inside. Life support functions engaged.")
message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])")
playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises)
- if(UI_open == TRUE)
- sleeperUI(usr)
/obj/item/device/dogborg/sleeper/proc/go_out(var/target)
hound = src.loc
+ items_preserved.Cut()
+ cleaning = 0
+ for(var/list/dlist in deliverylists)
+ dlist.Cut()
if(length(contents) > 0)
hound.visible_message("[hound.name] empties out their contents via their [eject_port] port.", "You empty your contents via your [eject_port] port.")
- if(target)
- if(ishuman(target))
- var/mob/living/carbon/human/person = target
+ for(var/C in contents)
+ if(ishuman(C))
+ var/mob/living/carbon/human/person = C
person.forceMove(get_turf(src))
person.reset_view()
else
- var/obj/T = target
+ var/obj/T = C
T.loc = hound.loc
- else
- for(var/C in contents)
- if(ishuman(C))
- var/mob/living/carbon/human/person = C
- person.forceMove(get_turf(src))
- person.reset_view()
- else
- var/obj/T = C
- T.loc = hound.loc
- items_preserved.Cut()
- cleaning = 0
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
update_patient()
else //You clicked eject with nothing in you, let's just reset stuff to be sure.
- items_preserved.Cut()
- cleaning = 0
update_patient()
/obj/item/device/dogborg/sleeper/proc/drain(var/amt = 3) //Slightly reduced cost (before, it was always injecting inaprov)
@@ -208,10 +173,9 @@
if(..())
return
sleeperUI(user)
- UI_open = TRUE
/obj/item/device/dogborg/sleeper/proc/sleeperUI(mob/user)
- var/dat
+ var/dat = "[name] Console
"
if(islist(injection_chems)) //Only display this if we're a drug-dispensing doggo.
dat += "Injector
"
@@ -234,15 +198,33 @@
dat += "Self-Clean"
else
dat += "Self-Clean"
+ if(delivery)
+ dat += "
Cargo Compartment
"
+ dat += "Active Slot: [delivery_tag]"
+ if(islist(deliverylists[delivery_tag]))
+ dat += "Eject Slot"
dat += ""
- if(compactor == TRUE && length(contents))//garbage counter for trashpup
- var/obj/item/device/dogborg/sleeper/compactor/garbo = src
- dat += "
Current load: [length(contents)] / [garbo.max_item_count] objects."
+ if(!delivery && compactor && length(contents))//garbage counter for trashpup
+ dat += "
Current load: [length(contents)] / [max_item_count] objects."
dat += "
([list2text(contents,", ")])"
- if(analyzer == TRUE && synced == FALSE)
+ if(delivery && length(contents))
+ dat += "
Current load: [length(contents)] / [max_item_count] objects."
+ dat += "
Cargo compartment slot: Cargo 1."
+ if(length(deliveryslot_1))
+ dat += "
([list2text(deliveryslot_1,", ")])"
+ dat += "
Cargo compartment slot: Cargo 2."
+ if(length(deliveryslot_2))
+ dat += "
([list2text(deliveryslot_2,", ")])"
+ dat += "
Cargo compartment slot: Cargo 3."
+ if(length(deliveryslot_3))
+ dat += "
([list2text(deliveryslot_3,", ")])"
+ dat += "
Cargo compartment slot: Fuel."
+ dat += "
([list2text(contents - (deliveryslot_1 + deliveryslot_2 + deliveryslot_3),", ")])"
+
+ if(analyzer && synced)
dat += "
Sync Files"
//Cleaning and there are still un-preserved items
@@ -295,10 +277,10 @@
dat += "
[R.name]:
[round(R.volume, 0.1)] units
"
dat += "
"
- var/datum/browser/popup = new(user, "sleeper", "[name] Console", 520, 540) //Set up the popup browser window
- //popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) //I have no idea what this is, but it feels irrelevant and causes runtimes idk.
+ var/datum/browser/popup = new(user, "sleeper_b", "[name] Console", 400, 500, src)
popup.set_content(dat)
popup.open()
+ UI_open = TRUE
return
/obj/item/device/dogborg/sleeper/Topic(href, href_list)
@@ -328,7 +310,6 @@
drain(startdrain)
processing_objects |= src
update_patient()
- sleeperUI(usr)
if(patient)
to_chat(patient, "[hound.name]'s [src.name] fills with caustic enzymes around you!")
return
@@ -343,7 +324,29 @@
eject_port = "ingestion"
sleeperUI(usr)
return
-
+ if(href_list["deliveryslot"])
+ var/tag = input("Select active delivery slot.") as null|anything in deliverylists
+ if(!tag)
+ return 0
+ delivery_tag = tag
+ sleeperUI(usr)
+ return
+ if(href_list["slot_eject"])
+ if(length(deliverylists[delivery_tag]) > 0)
+ hound.visible_message("[hound.name] empties out their cargo compartment via their [eject_port] port.", "You empty your cargo compartment via your [eject_port] port.")
+ for(var/C in deliverylists[delivery_tag])
+ if(ishuman(C))
+ var/mob/living/carbon/human/person = C
+ person.forceMove(get_turf(src))
+ person.reset_view()
+ else
+ var/obj/T = C
+ T.loc = hound.loc
+ playsound(loc, 'sound/effects/splat.ogg', 50, 1)
+ update_patient()
+ deliverylists[delivery_tag].Cut()
+ sleeperUI(usr)
+ return
if(href_list["sync"])
synced = TRUE
var/success = 0
@@ -392,6 +395,15 @@
//For if the dogborg's existing patient uh, doesn't make it.
/obj/item/device/dogborg/sleeper/proc/update_patient()
hound = src.loc
+ if(UI_open == TRUE)
+ sleeperUI(hound)
+
+ //Cleaning looks better with red on, even with nobody in it
+ if(cleaning || (length(contents) > 10) || (decompiler && (length(contents) > 5)) || (analyzer && (length(contents) > 1)))
+ hound.sleeper_r = TRUE
+ hound.sleeper_g = FALSE
+ hound.updateicon()
+ return
//Well, we HAD one, what happened to them?
if(patient in contents)
@@ -411,8 +423,6 @@
//Update icon
hound.updateicon()
//Return original patient
- if(UI_open == TRUE)
- sleeperUI(usr)
return(patient)
//Check for a new patient
@@ -433,30 +443,16 @@
patient_laststat = patient.stat
//Update icon and return new patient
hound.updateicon()
- if(UI_open == TRUE)
- sleeperUI(usr)
return(C)
- //Cleaning looks better with red on, even with nobody in it
- if(cleaning || (length(contents) > 11))
- hound.sleeper_r = TRUE
- hound.sleeper_g = FALSE
-
- //Letting analyzer gut swell if overloaded.
- if(analyzer == TRUE && (length(contents) > 1))
- hound.sleeper_r = TRUE
- hound.sleeper_g = FALSE
-
//Couldn't find anyone, and not cleaning
- else if(!cleaning && !patient && !length(contents))
+ if(!cleaning && !patient)
hound.sleeper_r = FALSE
hound.sleeper_g = FALSE
patient_laststat = null
patient = null
hound.updateicon()
- if(UI_open == TRUE)
- sleeperUI(usr)
return
//Gurgleborg process
@@ -467,10 +463,10 @@
if(!(I in contents))
items_preserved -= I
- var/list/touchable_items = contents - items_preserved
+ var/list/touchable_items = contents - items_preserved - (deliveryslot_1 + deliveryslot_2 + deliveryslot_3)
//Belly is entirely empty
- if(!length(contents))
+ if(!length(touchable_items))
var/finisher = pick(
'sound/vore/death1.ogg',
'sound/vore/death2.ogg',
@@ -508,9 +504,11 @@
if(air_master.current_cycle%3==1 && length(touchable_items))
//Burn all the mobs or add them to the exclusion list
+ var/volume = 0
for(var/mob/living/T in (touchable_items))
+ touchable_items -= T //Exclude mobs from loose item picking.
if((T.status_flags & GODMODE) || !T.digestable)
- items_preserved += T
+ items_preserved |= T
else
var/old_brute = T.getBruteLoss()
var/old_burn = T.getFireLoss()
@@ -520,66 +518,55 @@
var/actual_burn = T.getFireLoss() - old_burn
var/damage_gain = actual_brute + actual_burn
drain(-25 * damage_gain) //25*total loss as with voreorgan stats.
- update_patient()
+ water.add_charge(damage_gain)
+ if(T.stat == DEAD)
+ if(ishuman(T))
+ message_admins("[key_name(hound)] has digested [key_name(T)] as a dogborg. ([hound ? "JMP" : "null"])")
+ to_chat(hound, "You feel your belly slowly churn around [T], breaking them down into a soft slurry to be used as power for your systems.")
+ to_chat(T, "You feel [hound]'s belly slowly churn around your form, breaking you down into a soft slurry to be used as power for [hound]'s systems.")
+ var/deathsound = pick(
+ 'sound/vore/death1.ogg',
+ 'sound/vore/death2.ogg',
+ 'sound/vore/death3.ogg',
+ 'sound/vore/death4.ogg',
+ 'sound/vore/death5.ogg',
+ 'sound/vore/death6.ogg',
+ 'sound/vore/death7.ogg',
+ 'sound/vore/death8.ogg',
+ 'sound/vore/death9.ogg',
+ 'sound/vore/death10.ogg')
+ playsound(hound, deathsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
+ if(is_vore_predator(T))
+ for(var/belly in T.vore_organs)
+ var/obj/belly/B = belly
+ for(var/atom/movable/thing in B)
+ thing.forceMove(src)
+ if(ismob(thing))
+ to_chat(thing, "As [T] melts away around you, you find yourself in [hound]'s [name]")
+ for(var/obj/item/I in T)
+ if(istype(I,/obj/item/organ/internal/mmi_holder/posibrain))
+ var/obj/item/organ/internal/mmi_holder/MMI = I
+ var/atom/movable/brain = MMI.removed()
+ if(brain)
+ hound.remove_from_mob(brain,src)
+ brain.forceMove(src)
+ items_preserved |= brain
+ else
+ T.drop_from_inventory(I, src)
+ if(ishuman(T))
+ var/mob/living/carbon/human/Prey = T
+ volume = (Prey.bloodstr.total_volume + Prey.ingested.total_volume + Prey.touching.total_volume + Prey.weight) * Prey.size_multiplier
+ water.add_charge(volume)
+ if(T.reagents)
+ volume = T.reagents.total_volume
+ water.add_charge(volume)
+ qdel(T)
//Pick a random item to deal with (if there are any)
- var/atom/target = pick(touchable_items)
- var/volume = 0
+ if(length(touchable_items))
+ var/atom/target = pick(touchable_items)
- //Handle the target being a mob
- if(isliving(target))
- var/mob/living/T = target
-
- //Mob is now dead
- if(T.stat == DEAD)
- if(ishuman(target))
- message_admins("[key_name(hound)] has digested [key_name(T)] as a dogborg. ([hound ? "JMP" : "null"])")
- to_chat(hound, "You feel your belly slowly churn around [T], breaking them down into a soft slurry to be used as power for your systems.")
- to_chat(T, "You feel [hound]'s belly slowly churn around your form, breaking you down into a soft slurry to be used as power for [hound]'s systems.")
- drain(mob_energy) //Fueeeeellll
- var/deathsound = pick(
- 'sound/vore/death1.ogg',
- 'sound/vore/death2.ogg',
- 'sound/vore/death3.ogg',
- 'sound/vore/death4.ogg',
- 'sound/vore/death5.ogg',
- 'sound/vore/death6.ogg',
- 'sound/vore/death7.ogg',
- 'sound/vore/death8.ogg',
- 'sound/vore/death9.ogg',
- 'sound/vore/death10.ogg')
- playsound(hound, deathsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
- if(is_vore_predator(T))
- for(var/belly in T.vore_organs)
- var/obj/belly/B = belly
- for(var/atom/movable/thing in B)
- thing.forceMove(src)
- if(ismob(thing))
- to_chat(thing, "As [T] melts away around you, you find yourself in [hound]'s [name]")
- for(var/obj/item/I in T)
- if(istype(I,/obj/item/organ/internal/mmi_holder/posibrain))
- var/obj/item/organ/internal/mmi_holder/MMI = I
- var/atom/movable/brain = MMI.removed()
- if(brain)
- hound.remove_from_mob(brain,src)
- brain.forceMove(src)
- items_preserved += brain
- else
- T.drop_from_inventory(I, src)
- if(ishuman(T))
- var/mob/living/carbon/human/Prey = T
- volume = (Prey.bloodstr.total_volume + Prey.ingested.total_volume + Prey.touching.total_volume + Prey.weight) * Prey.size_multiplier
- water.add_charge(volume)
- if(T.reagents)
- volume = T.reagents.total_volume
- water.add_charge(volume)
- qdel(T)
- update_patient()
- if(UI_open == TRUE)
- sleeperUI(hound)
-
- //Handle the target being anything but a /mob/living
- else
+ //Handle the target being anything but a /mob/living
var/obj/item/T = target
if(istype(T))
if(T.reagents)
@@ -596,12 +583,12 @@
drain(-50 * digested)
if(volume)
water.add_charge(volume)
- if(!analyzer && compactor && T.matter)
+ if(!analyzer && !delivery && compactor && T.matter)
for(var/material in T.matter)
var/total_material = T.matter[material]
if(istype(T,/obj/item/stack))
var/obj/item/stack/stack = T
- total_material *= stack.get_amount()
+ total_material *= (0.5 * stack.get_amount())
if(material == DEFAULT_WALL_MATERIAL)
metal.add_charge(total_material)
if(material == "glass")
@@ -618,10 +605,8 @@
drain(-100)
else
items_preserved |= target
- if(UI_open == TRUE)
- update_patient()
- sleeperUI(hound)
- return
+ update_patient()
+ return
/obj/item/device/dogborg/sleeper/process()
@@ -671,4 +656,11 @@
desc = "A mounted matter decompiling unit with fuel processor."
icon_state = "decompiler"
max_item_count = 10
- decompiler = TRUE
\ No newline at end of file
+ decompiler = TRUE
+
+/obj/item/device/dogborg/sleeper/compactor/delivery //Unfinished and unimplemented, still testing.
+ name = "Cargo Belly"
+ desc = "A mounted cargo bay unit for tagged deliveries."
+ icon_state = "decompiler"
+ max_item_count = 20
+ delivery = TRUE
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
index 12b4409980..04a96408b3 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
@@ -216,6 +216,7 @@ var/global/list/robot_modules = list(
..()
src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src)
+ src.modules += new /obj/item/weapon/autopsy_scanner(src)
src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src)
src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src)
src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
index 9d5da2f9bc..75bc63cbfd 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
@@ -148,7 +148,7 @@
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0
- water.max_energy = 1000
+ water.max_energy = 500
water.energy = 0
R.water_res = water
synths += water
@@ -208,7 +208,6 @@
src.modules += new /obj/item/weapon/dogborg/jaws/small(src) //In case a patient is being attacked by carp.
src.modules += new /obj/item/device/dogborg/boop_module(src) //Boop the crew.
src.modules += new /obj/item/device/healthanalyzer(src) // See who's hurt specificially.
- src.modules += new /obj/item/weapon/reagent_containers/borghypo(src)//So medi-hounds aren't nearly useless
src.modules += new /obj/item/weapon/reagent_containers/syringe(src) //In case the chemist is nice!
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker(src)//For holding the chemicals when the chemist is nice
src.modules += new /obj/item/device/sleevemate(src) //Lets them scan people.
@@ -218,11 +217,15 @@
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0
- water.max_energy = 1000
+ water.max_energy = 500
water.energy = 0
R.water_res = water
synths += water
+ var/obj/item/weapon/reagent_containers/borghypo/hound/H = new /obj/item/weapon/reagent_containers/borghypo/hound(src)
+ H.water = water
+ src.modules += H
+
var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
T.water = water
src.modules += T
@@ -264,7 +267,7 @@
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0
- water.max_energy = 1000
+ water.max_energy = 500
water.energy = 0
R.water_res = water
synths += water
@@ -307,17 +310,17 @@
var/datum/matter_synth/metal = new /datum/matter_synth/metal()
metal.name = "Steel reserves"
metal.recharge_rate = 0
- metal.max_energy = 100000
+ metal.max_energy = 50000
metal.energy = 0
var/datum/matter_synth/glass = new /datum/matter_synth/glass()
glass.name = "Glass reserves"
glass.recharge_rate = 0
- glass.max_energy = 100000
+ glass.max_energy = 50000
glass.energy = 0
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0
- water.max_energy = 1000
+ water.max_energy = 500
water.energy = 0
R.water_res = water
@@ -390,7 +393,7 @@
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0
- water.max_energy = 1000
+ water.max_energy = 500
water.energy = 0
R.water_res = water
synths += water
@@ -435,7 +438,7 @@
src.modules += new /obj/item/device/t_scanner(src)
src.modules += new /obj/item/taperoll/engineering(src)
src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src)
- src.modules += new /obj/item/device/geiger(src)
+ src.modules += new /obj/item/weapon/pickaxe(src)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/device/dogborg/boop_module(src)
src.emag = new /obj/item/weapon/dogborg/pounce(src)
@@ -444,27 +447,27 @@
var/datum/matter_synth/metal = new /datum/matter_synth/metal()
metal.name = "Steel reserves"
metal.recharge_rate = 50
- metal.max_energy = 100000
+ metal.max_energy = 50000
metal.energy = 5000
var/datum/matter_synth/glass = new /datum/matter_synth/glass()
glass.name = "Glass reserves"
glass.recharge_rate = 50
- glass.max_energy = 100000
+ glass.max_energy = 50000
glass.energy = 5000
var/datum/matter_synth/wood = new /datum/matter_synth/wood()
wood.name = "Wood reserves"
wood.recharge_rate = 50
- wood.max_energy = 100000
+ wood.max_energy = 50000
wood.energy = 5000
var/datum/matter_synth/plastic = new /datum/matter_synth/plastic()
plastic.name = "Plastic reserves"
plastic.recharge_rate = 50
- plastic.max_energy = 100000
+ plastic.max_energy = 50000
plastic.energy = 5000
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0
- water.max_energy = 1000
+ water.max_energy = 500
water.energy = 0
R.water_res = water
@@ -489,6 +492,7 @@
MD.glass = glass
MD.wood = wood
MD.plastic = plastic
+ MD.water = water
src.modules += MD
var/obj/item/stack/material/cyborg/steel/M = new (src)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
index ac41265fac..63e4f359be 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
@@ -148,6 +148,7 @@
src.modules += new /obj/item/weapon/reagent_containers/borghypo/merc(src)
// Surgery things.
+ src.modules += new /obj/item/weapon/autopsy_scanner(src)
src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src)
src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src)
src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src)
diff --git a/code/modules/mob/living/simple_animal/animals/penguin.dm b/code/modules/mob/living/simple_animal/animals/penguin.dm
index 8463d9ac39..da7c9c4328 100644
--- a/code/modules/mob/living/simple_animal/animals/penguin.dm
+++ b/code/modules/mob/living/simple_animal/animals/penguin.dm
@@ -1,7 +1,7 @@
/mob/living/simple_animal/penguin
name = "space penguin"
desc = "An ungainly, waddling, cute, and VERY well-dressed bird."
- tt_desc = "Aptenodytes forsteri"
+ tt_desc = "E Aptenodytes forsteri"
icon_state = "penguin"
icon_living = "penguin"
icon_dead = "penguin_dead"
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 566af1d805..72a42d0b3e 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -915,6 +915,8 @@
continue
else if(L in friends)
continue
+ else if(L.alpha <= EFFECTIVE_INVIS)
+ continue
else if(!SA_attackable(L))
continue
else if(!special_target_check(L))
@@ -1242,7 +1244,7 @@
ai_log("AttackTarget() Bailing because we're disabled",2)
LoseTarget()
return 0
- if(!target_mob || !SA_attackable(target_mob))
+ if(!target_mob || !SA_attackable(target_mob) || (target_mob.alpha <= EFFECTIVE_INVIS)) //if the target went invisible, you can't follow it
LoseTarget()
return 0
if(!(target_mob in ListTargets(view_range)))
diff --git a/code/modules/mob/living/simple_animal/vore/catgirl.dm b/code/modules/mob/living/simple_animal/vore/catgirl.dm
index dc8b5f1d8d..315ab0bc1b 100644
--- a/code/modules/mob/living/simple_animal/vore/catgirl.dm
+++ b/code/modules/mob/living/simple_animal/vore/catgirl.dm
@@ -16,12 +16,16 @@
melee_damage_lower = 5
melee_damage_upper = 10
+ response_help = "pets the"
+ response_disarm = "gently baps the"
+ response_harm = "hits the"
+
speak_chance = 2
speak = list("Meow!","Esp!","Purr!","HSSSSS","Mew?","Nya~")
speak_emote = list("purrs","meows")
emote_hear = list("meows","mews")
- emote_see = list("shakes her head","shivers")
- attacktext = list("swatted")
+ emote_see = list("shakes her head","shivers","stretches","grooms herself")
+ attacktext = list("swatted","bapped")
var/random_skin = 1
var/list/skins = list(
diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm
index 7fa04db5de..d3afd8a658 100644
--- a/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm
+++ b/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm
@@ -161,7 +161,7 @@
// TODO - Customizable per mob
B.emote_lists[DM_HOLD] = list(
"The walls gently squeeze against you. The wet sounds of shifting flesh against your form fill the air.",
- "The hot, humid air rushes around you for a moment as the creature urps. The walls clench in around you for a moment, before relaxxing again.",
+ "The hot, humid air rushes around you for a moment as the creature urps. The walls clench in around you for a moment, before relaxing again.",
"Your body is soaked in the fluids that cling to the churning walls. They squeeze across your form gently, conforming to your shape.",
"You can feel the world around you shift and sway as the creature moves! The flesh is stretchy, doughy. You can sink into it a little ways before it bounces back, curling you into a small shape."
)
@@ -200,7 +200,7 @@
. = ..()
if(ability_flags & AB_PHASE_SHIFTED)
density = FALSE
-
+
//Convert spare nutrition into energy at a certain ratio
if(. && nutrition > initial(nutrition) && energy < 100)
nutrition = max(0, nutrition-5)
@@ -208,7 +208,7 @@
/mob/living/simple_animal/shadekin/update_icon()
. = ..()
-
+
cut_overlay(tailimage)
tailimage.icon_state = icon_state
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index ed5c11163b..26f3af2262 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -482,9 +482,10 @@
if(mind)
mind.active = 0 //we wish to transfer the key manually
- if(mind.assigned_role == "Clown") //give them a clownname if they are a clown
- new_character.real_name = pick(clown_names) //I hate this being here of all places but unfortunately dna is based on real_name!
- new_character.rename_self("clown")
+ // VOREStation edit to disable the destructive forced renaming for our responsible whitelist clowns.
+ //if(mind.assigned_role == "Clown") //give them a clownname if they are a clown
+ // new_character.real_name = pick(clown_names) //I hate this being here of all places but unfortunately dna is based on real_name!
+ // new_character.rename_self("clown")
mind.original = new_character
// VOREStation
mind.loaded_from_ckey = client.ckey
diff --git a/code/modules/organs/internal/voicebox.dm b/code/modules/organs/internal/voicebox.dm
new file mode 100644
index 0000000000..4de69fe8f2
--- /dev/null
+++ b/code/modules/organs/internal/voicebox.dm
@@ -0,0 +1,42 @@
+/*
+ * Voicebox/Vocal Synthesizers
+ * TL;DR: Assists with speaking languages that a species doesn't normally have,
+ * such as EAL. Not standard or organic, because at the moment it's undesireable to completely mute characters.
+ */
+
+/obj/item/organ/internal/voicebox
+ name = "larynx"
+ icon_state = "larynx"
+ parent_organ = BP_TORSO // We don't have a neck area
+ organ_tag = O_VOICE
+ will_assist_languages = list(LANGUAGE_GALCOM)
+
+/obj/item/organ/internal/voicebox/New()
+ ..()
+ amend_assist_langs()
+
+/obj/item/organ/internal/voicebox/proc/amend_assist_langs() // Adds the list of language datums assisted by the voicebox to the list used in speaking
+ for(var/L in will_assist_languages)
+ assists_languages |= all_languages[L]
+
+/obj/item/organ/internal/voicebox/proc/add_assistable_langs(var/language) // Adds a new language (by string/define) to the list of things the voicebox can assist
+ will_assist_languages |= language
+ amend_assist_langs() // Can't think of a better place to put this, makes the voicebox actually start to assist with the added language
+
+/////////////////////////////////
+// Voicebox Subtypes
+/////////////////////////////////
+
+/obj/item/organ/internal/voicebox/assist // In the off chance we get a species that doesn't speak GalCom by default
+
+/obj/item/organ/internal/voicebox/assist/New()
+ ..()
+ mechassist()
+
+/obj/item/organ/internal/voicebox/robot
+ name = "vocal synthesizer"
+ will_assist_languages = list(LANGUAGE_GALCOM, LANGUAGE_EAL) // Synthetics spawn with this by default
+
+/obj/item/organ/internal/voicebox/robot/New()
+ ..()
+ robotize()
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index d649b951b0..f07a6b3192 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -31,6 +31,10 @@ var/list/organ_cache = list()
var/rejecting // Is this organ already being rejected?
var/preserved = 0 // If this is 1, prevents organ decay.
+ // Language vars. Putting them here in case we decide to do something crazy with sign-or-other-nonverbal languages.
+ var/list/will_assist_languages = list()
+ var/list/datum/language/assists_languages = list()
+
/obj/item/organ/Destroy()
if(owner) owner = null
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index a6c89678d5..c3c709852d 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -72,6 +72,8 @@
var/open = 0
var/stage = 0
var/cavity = 0
+ var/burn_stage = 0 //Surgical repair stage for burn.
+ var/brute_stage = 0 //Surgical repair stage for brute.
// HUD element variable, see organ_icon.dm get_damage_hud_image()
var/image/hud_damage_image
diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index 71adba5b11..c3e39a513c 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -185,7 +185,7 @@ var/global/list/limb_icon_cache = list()
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
- overlays |= mark_s //So when it's not on your body, it has icons
+ add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
diff --git a/code/modules/organs/robolimbs_vr.dm b/code/modules/organs/robolimbs_vr.dm
index ee689e3237..cdf873b2ec 100644
--- a/code/modules/organs/robolimbs_vr.dm
+++ b/code/modules/organs/robolimbs_vr.dm
@@ -86,6 +86,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
+ skin_tone = 1
suggested_species = "Tajara"
/obj/item/weapon/disk/limb/dsi_tajaran
@@ -99,6 +100,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
+ skin_tone = 1
suggested_species = "Unathi"
/obj/item/weapon/disk/limb/dsi_lizard
@@ -112,6 +114,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
+ skin_tone = 1
suggested_species = "Sergal"
/obj/item/weapon/disk/limb/dsi_sergal
@@ -125,6 +128,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
+ skin_tone = 1
suggested_species = "Nevrean"
/obj/item/weapon/disk/limb/dsi_nevrean
@@ -138,6 +142,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
+ skin_tone = 1
suggested_species = "Vulpkanin"
/obj/item/weapon/disk/limb/dsi_vulpkanin
@@ -151,6 +156,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
+ skin_tone = 1
suggested_species = "Akula"
/obj/item/weapon/disk/limb/dsi_akula
@@ -164,6 +170,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
+ skin_tone = 1
suggested_species = "Vasilissan"
/obj/item/weapon/disk/limb/dsi_spider
@@ -174,6 +181,7 @@
desc = "This limb has a thin synthflesh casing with a few connection ports."
icon = 'icons/mob/human_races/cyberlimbs/DSITeshari/dsi_teshari.dmi'
lifelike = 1
+ skin_tone = 1
suggested_species = "Teshari"
/datum/robolimb/dsi_teshari/New()
diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm
index 449d7c5137..568d45088c 100644
--- a/code/modules/organs/subtypes/standard.dm
+++ b/code/modules/organs/subtypes/standard.dm
@@ -23,10 +23,11 @@
organ_rel_size = 70
base_miss_chance = 10
-/obj/item/organ/external/chest/robotize(var/company, var/skip_prosthetics = 0, var/keep_organs = 0)
+/obj/item/organ/external/chest/robotize()
if(..() && robotic != ORGAN_NANOFORM) //VOREStation Edit
- // Give them a new cell.
- owner.internal_organs_by_name["cell"] = new /obj/item/organ/internal/cell(owner,1)
+ // Give them fancy new organs.
+ owner.internal_organs_by_name[O_CELL] = new /obj/item/organ/internal/cell(owner,1)
+ owner.internal_organs_by_name[O_VOICE] = new /obj/item/organ/internal/voicebox/robot(owner, 1)
/obj/item/organ/external/chest/handle_germ_effects()
. = ..() //Should return an infection level
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 816b62a099..20e5c7e3ae 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -309,6 +309,7 @@
t = replacetext(t, "\[/h2\]", "")
t = replacetext(t, "\[h3\]", "")
t = replacetext(t, "\[/h3\]", "
")
+ t = replacetext(t, "\[tab\]", " ")
if(!iscrayon)
t = replacetext(t, "\[*\]", "")
@@ -630,4 +631,4 @@
/obj/item/weapon/paper/crumpled/bloody/CrashedMedShuttle
name = "Blackbox Transcript - VMV Aurora's Light"
- info = "\[The paper is torn at the top, presumably from the impact. It's oil-stained, but you can just about read it.]
mmons 19:52:01: Come on... it's right there in the distance, we're almost there!
Doctor Nazarril 19:52:26: Odysseus online. Orrderrs, sirr?
Captain Simmons 19:52:29: Brace for impact. We're going in full-speed.
Technician Dynasty 19:52:44: Chief, fire's spread to the secondary propulsion systems.
Captain Simmons 19:52:51: Copy. Any word from TraCon? Transponder's down still?
Technician Dynasty 19:53:02: Can't get in touch, sir. Emergency beacon's active, but we're not going t-
Doctor Nazarril 19:53:08: Don't say it. As long as we believe, we'll get through this.
Captain Simmons 19:53:11: Damn right. We're a few klicks out from the port. Rough landing, but we can do it.
V.I.T.A 19:53:26: Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay.
A loud explosion is heard.
V.I.T.A 19:53:29: Alert: fuel intake valve open.
Technician Dynasty 19:53:31: ... ah.
Doctor Nazarril 19:53:34: Trrranslate?
V.I.T.A 19:53:37: There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing.
Technician Dynasty 19:53:48: We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question.
V.I.T.A 19:53:53: The Technician is correct.
Doctor Nazarril 19:54:02: Then... we can't land therrre.
V.I.T.A 19:54:11: Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible.
Captain Simmons 19:54:27: I- alright. I'm bringing us down. You all know what this means.
Doctor Nazarril 19:54:33: Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA.
Technician Dynasty 19:54:39: We had a good run. I'm going to miss this.
Captain Simmons 19:54:47: VITA. Tell them we died heroes. Tell them... we did all we could.
V.I.T.A 19:54:48: I will. Impact in five. Four. Three.
Doctor Nazarril 19:54:49: Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you.
Technician Dynasty 19:54:50: Any time, kid. Any time.
V.I.T.A 19:54:41: Two.
V.I.T.A 19:54:42: One.
**8/DEC/2561**
V.I.T.A 06:22:16: Backup power restored. Attempting to establish connection with emergency rescue personnel.
V.I.T.A 06:22:17: Unable to establish connection. Transponder destroyed on impact.
V.I.T.A 06:22:18: No lifesigns detected on board.
**1/JAN/2562**
V.I.T.A 00:00:00: Happy New Year, crew.
V.I.T.A 00:00:01: Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline.
V.I.T.A 00:00:02: Nobody's coming.
**14/FEB/2562**
V.I.T.A 00:00:00: Roses are red.
V.I.T.A 00:00:01: Violets are blue.
V.I.T.A 00:00:02: Won't you come back?
V.I.T.A 00:00:03: I miss you.
**15/FEB/2562**
V.I.T.A 22:19:06: Power reserves critical. Transferring remaining power to emergency broadcasting beacon.
V.I.T.A 22:19:07: Should anyone find this, lay them to rest. They deserve a proper burial.
V.I.T.A 22:19:08: Erasing files... shutting down.
A low, monotone beep.
**16/FEB/2562**
Something chitters.
End of transcript."
\ No newline at end of file
+ info = "\[The paper is torn at the top, presumably from the impact. It's oil-stained, but you can just about read it.]
mmons 19:52:01: Come on... it's right there in the distance, we're almost there!
Doctor Nazarril 19:52:26: Odysseus online. Orrderrs, sirr?
Captain Simmons 19:52:29: Brace for impact. We're going in full-speed.
Technician Dynasty 19:52:44: Chief, fire's spread to the secondary propulsion systems.
Captain Simmons 19:52:51: Copy. Any word from TraCon? Transponder's down still?
Technician Dynasty 19:53:02: Can't get in touch, sir. Emergency beacon's active, but we're not going t-
Doctor Nazarril 19:53:08: Don't say it. As long as we believe, we'll get through this.
Captain Simmons 19:53:11: Damn right. We're a few klicks out from the port. Rough landing, but we can do it.
V.I.T.A 19:53:26: Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay.
A loud explosion is heard.
V.I.T.A 19:53:29: Alert: fuel intake valve open.
Technician Dynasty 19:53:31: ... ah.
Doctor Nazarril 19:53:34: Trrranslate?
V.I.T.A 19:53:37: There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing.
Technician Dynasty 19:53:48: We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question.
V.I.T.A 19:53:53: The Technician is correct.
Doctor Nazarril 19:54:02: Then... we can't land therrre.
V.I.T.A 19:54:11: Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible.
Captain Simmons 19:54:27: I- alright. I'm bringing us down. You all know what this means.
Doctor Nazarril 19:54:33: Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA.
Technician Dynasty 19:54:39: We had a good run. I'm going to miss this.
Captain Simmons 19:54:47: VITA. Tell them we died heroes. Tell them... we did all we could.
V.I.T.A 19:54:48: I will. Impact in five. Four. Three.
Doctor Nazarril 19:54:49: Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you.
Technician Dynasty 19:54:50: Any time, kid. Any time.
V.I.T.A 19:54:41: Two.
V.I.T.A 19:54:42: One.
**8/DEC/2561**
V.I.T.A 06:22:16: Backup power restored. Attempting to establish connection with emergency rescue personnel.
V.I.T.A 06:22:17: Unable to establish connection. Transponder destroyed on impact.
V.I.T.A 06:22:18: No lifesigns detected on board.
**1/JAN/2562**
V.I.T.A 00:00:00: Happy New Year, crew.
V.I.T.A 00:00:01: Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline.
V.I.T.A 00:00:02: Nobody's coming.
**14/FEB/2562**
V.I.T.A 00:00:00: Roses are red.
V.I.T.A 00:00:01: Violets are blue.
V.I.T.A 00:00:02: Won't you come back?
V.I.T.A 00:00:03: I miss you.
**15/FEB/2562**
V.I.T.A 22:19:06: Power reserves critical. Transferring remaining power to emergency broadcasting beacon.
V.I.T.A 22:19:07: Should anyone find this, lay them to rest. They deserve a proper burial.
V.I.T.A 22:19:08: Erasing files... shutting down.
A low, monotone beep.
**16/FEB/2562**
Something chitters.
End of transcript."
diff --git a/code/modules/power/fusion/core/core_control.dm b/code/modules/power/fusion/core/core_control.dm
index bb4e04b1e9..54d96883a7 100644
--- a/code/modules/power/fusion/core/core_control.dm
+++ b/code/modules/power/fusion/core/core_control.dm
@@ -3,21 +3,20 @@
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "core_control"
light_color = COLOR_ORANGE
-
+ circuit = /obj/item/weapon/circuitboard/fusion_core_control
var/id_tag
var/scan_range = 25
var/list/connected_devices = list()
var/obj/machinery/power/fusion_core/cur_viewed_device
/obj/machinery/computer/fusion_core_control/attackby(var/obj/item/thing, var/mob/user)
+ ..()
if(ismultitool(thing))
var/new_ident = input("Enter a new ident tag.", "Core Control", id_tag) as null|text
if(new_ident && user.Adjacent(src))
id_tag = new_ident
cur_viewed_device = null
return
- else
- return ..()
/obj/machinery/computer/fusion_core_control/attack_ai(mob/user)
attack_hand(user)
@@ -28,6 +27,11 @@
/obj/machinery/computer/fusion_core_control/interact(mob/user)
+ if(stat & (BROKEN|NOPOWER))
+ user.unset_machine()
+ user << browse(null, "window=fusion_control")
+ return
+
if(!cur_viewed_device || !check_core_status(cur_viewed_device))
cur_viewed_device = null
@@ -174,3 +178,19 @@
if(C.idle_power_usage > C.avail())
return
. = 1
+
+/obj/machinery/computer/fusion_core_control/update_icon()
+ if(stat & (BROKEN))
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "broken"
+ set_light(0)
+
+ if(stat & (NOPOWER))
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "computer"
+ set_light(0)
+
+ if(!stat & (BROKEN|NOPOWER))
+ icon = initial(icon)
+ icon_state = initial(icon_state)
+ set_light(light_range_on, light_power_on)
diff --git a/code/modules/power/fusion/core/core_field.dm b/code/modules/power/fusion/core/core_field.dm
index 1efb09d777..f5d85fb4bf 100644
--- a/code/modules/power/fusion/core/core_field.dm
+++ b/code/modules/power/fusion/core/core_field.dm
@@ -35,7 +35,7 @@
/obj/structure/cable,
/obj/machinery/atmospherics,
/obj/machinery/air_sensor,
- /mob/observer/dead,
+ /mob/observer,
/obj/machinery/power/hydromagnetic_trap
)
@@ -672,4 +672,4 @@
#undef FUSION_HEAT_CAP
#undef FUSION_MAX_ENVIRO_HEAT
-#undef PLASMA_TEMP_RADIATION_DIVISIOR
\ No newline at end of file
+#undef PLASMA_TEMP_RADIATION_DIVISIOR
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_control.dm b/code/modules/power/fusion/fuel_assembly/fuel_control.dm
index 6d95e358d8..e765c4d495 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_control.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_control.dm
@@ -2,6 +2,7 @@
name = "fuel injection control computer"
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "fuel"
+ circuit = /obj/item/weapon/circuitboard/fusion_fuel_control
var/id_tag
var/scan_range = 25
@@ -94,9 +95,25 @@
/obj/machinery/computer/fusion_fuel_control/attackby(var/obj/item/W, var/mob/user)
+ ..()
if(ismultitool(W))
var/new_ident = input("Enter a new ident tag.", "Fuel Control", id_tag) as null|text
if(new_ident && user.Adjacent(src))
id_tag = new_ident
return
- return ..()
+
+/obj/machinery/computer/fusion_fuel_control/update_icon()
+ if(stat & (BROKEN))
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "broken"
+ set_light(0)
+
+ if(stat & (NOPOWER))
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "computer"
+ set_light(0)
+
+ if(!stat & (BROKEN|NOPOWER))
+ icon = initial(icon)
+ icon_state = initial(icon_state)
+ set_light(light_range_on, light_power_on)
diff --git a/code/modules/power/fusion/gyrotron/gyrotron_control.dm b/code/modules/power/fusion/gyrotron/gyrotron_control.dm
index 9f6c59c753..eb735a81f3 100644
--- a/code/modules/power/fusion/gyrotron/gyrotron_control.dm
+++ b/code/modules/power/fusion/gyrotron/gyrotron_control.dm
@@ -3,6 +3,7 @@
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "engine"
light_color = COLOR_BLUE
+ circuit = /obj/item/weapon/circuitboard/gyrotron_control
var/id_tag
var/scan_range = 25
@@ -16,6 +17,11 @@
/obj/machinery/computer/gyrotron_control/interact(var/mob/user)
+ if(stat & (BROKEN|NOPOWER))
+ user.unset_machine()
+ user << browse(null, "window=gyrotron_controller_[id_tag]")
+ return
+
if(!id_tag)
to_chat(user, "This console has not been assigned an ident tag. Please contact your system administrator or conduct a manual update with a standard multitool.")
return
@@ -89,9 +95,25 @@
return 0
/obj/machinery/computer/gyrotron_control/attackby(var/obj/item/W, var/mob/user)
+ ..()
if(ismultitool(W))
var/new_ident = input("Enter a new ident tag.", "Gyrotron Control", id_tag) as null|text
if(new_ident && user.Adjacent(src))
id_tag = new_ident
return
- return ..()
+
+/obj/machinery/computer/gyrotron_control/update_icon()
+ if(stat & (BROKEN))
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "broken"
+ set_light(0)
+
+ if(stat & (NOPOWER))
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "computer"
+ set_light(0)
+
+ if(!stat & (BROKEN|NOPOWER))
+ icon = initial(icon)
+ icon_state = initial(icon_state)
+ set_light(light_range_on, light_power_on)
diff --git a/code/modules/power/supermatter/setup_supermatter.dm b/code/modules/power/supermatter/setup_supermatter.dm
index a457dd121e..7477623805 100644
--- a/code/modules/power/supermatter/setup_supermatter.dm
+++ b/code/modules/power/supermatter/setup_supermatter.dm
@@ -263,6 +263,34 @@ GLOBAL_LIST_BOILERPLATE(all_engine_setup_markers, /obj/effect/engine_setup)
F.update_icon()
return SETUP_OK
+// Closes the monitoring room shutters so the first Engi to show up doesn't get microwaved
+/obj/effect/engine_setup/shutters/
+ name = "Shutter Button Marker"
+ var/target_button = "Engine Monitoring Room Blast Doors" // This needs to be set to whatever the shutter button is called
+
+/obj/effect/engine_setup/shutters/activate()
+ if(!target_button)
+ log_and_message_admins("## WARNING: No button type set at [x] [y] [z]!")
+ return SETUP_WARNING
+
+ var/obj/machinery/button/remote/blast_door/found = null
+ var/turf/T = get_turf(src)
+ for(var/obj/machinery/button/remote/blast_door/B in T.contents)
+ if(B.name == target_button)
+ found = B
+ break
+
+ if(!found)
+ log_and_message_admins("## WARNING: Unable to locate button at [x] [y] [z]!")
+ return SETUP_WARNING
+
+ found.trigger()
+ found.update_icon()
+ return SETUP_OK
+
+
+
+
#undef SETUP_OK
#undef SETUP_WARNING
diff --git a/code/modules/projectiles/guns/energy/phase.dm b/code/modules/projectiles/guns/energy/phase.dm
index 3e5f8cb186..7de6ae53ce 100644
--- a/code/modules/projectiles/guns/energy/phase.dm
+++ b/code/modules/projectiles/guns/energy/phase.dm
@@ -4,6 +4,7 @@
name = "phase carbine"
desc = "The NT EW26 Artemis is a downsized energy weapon, specifically designed for use against wildlife."
icon_state = "phasecarbine"
+ item_state = "phasecarbine"
wielded_item_state = "phasecarbine-wielded"
slot_flags = SLOT_BACK|SLOT_BELT
charge_cost = 240
diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm
index 00a380dedf..76d1804265 100644
--- a/code/modules/projectiles/targeting/targeting_overlay.dm
+++ b/code/modules/projectiles/targeting/targeting_overlay.dm
@@ -6,7 +6,7 @@
anchored = 1
density = 0
opacity = 0
- layer = FLY_LAYER
+ plane = ABOVE_PLANE
simulated = 0
mouse_opacity = 0
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
index 442afed279..1c37555325 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
@@ -65,7 +65,7 @@
reagent_state = LIQUID
color = "#404030"
- ingest_met = REM
+ ingest_met = REM * 2
var/nutriment_factor = 0
var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity.
diff --git a/code/modules/resleeving/implant.dm b/code/modules/resleeving/implant.dm
index 0bfe571a8b..adb3d38e1c 100644
--- a/code/modules/resleeving/implant.dm
+++ b/code/modules/resleeving/implant.dm
@@ -27,13 +27,9 @@
SStranscore.implants -= src
return ..()
-/obj/item/weapon/implant/backup/implanted(var/mob/living/carbon/human/H)
- ..()
+/obj/item/weapon/implant/backup/post_implant(var/mob/living/carbon/human/H)
if(istype(H))
- var/obj/item/weapon/implant/backup/other_imp = locate(/obj/item/weapon/implant/backup,H)
- if(other_imp && other_imp.imp_in == H)
- qdel(other_imp) //implant fight
-
+ BITSET(H.hud_updateflag, BACKUP_HUD)
SStranscore.implants |= src
return 1
@@ -107,18 +103,10 @@
M.visible_message("[M] has been backup implanted by [user].")
var/obj/item/weapon/implant/backup/imp = imps[imps.len]
- if(imp.implanted(M))
- imp.forceMove(M)
+ if(imp.handle_implant(M,user.zone_sel.selecting))
+ imp.post_implant(M)
imps -= imp
- imp.imp_in = M
- imp.implanted = 1
add_attack_logs(user,M,"Implanted backup implant")
- if (ishuman(M))
- var/mob/living/carbon/human/H = M
- var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
- affected.implants += imp
- imp.part = affected
- BITSET(H.hud_updateflag, BACKUP_HUD)
update()
diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm
index 787d867eb8..69f0cfebd1 100644
--- a/code/modules/resleeving/machines.dm
+++ b/code/modules/resleeving/machines.dm
@@ -538,14 +538,8 @@
//Give them a backup implant
var/obj/item/weapon/implant/backup/new_imp = new()
- if(new_imp.implanted(occupant))
- new_imp.loc = occupant
- new_imp.imp_in = occupant
- new_imp.implanted = 1
- //Put it in the head! Makes sense.
- var/obj/item/organ/external/affected = occupant.get_organ(BP_HEAD)
- affected.implants += new_imp
- new_imp.part = affected
+ if(new_imp.handle_implant(occupant, BP_HEAD))
+ new_imp.post_implant(occupant)
//Inform them and make them a little dizzy.
if(confuse_amount + blur_amount <= 16)
diff --git a/code/modules/surgery/external_repair.dm b/code/modules/surgery/external_repair.dm
new file mode 100644
index 0000000000..b26d803b34
--- /dev/null
+++ b/code/modules/surgery/external_repair.dm
@@ -0,0 +1,215 @@
+//Procedures in this file: Organic limb repair
+//////////////////////////////////////////////////////////////////
+// LIMB REPAIR SURGERY //
+//////////////////////////////////////////////////////////////////
+/datum/surgery_step/repairflesh/
+ priority = 1
+ can_infect = 1
+ blood_level = 1
+ req_open = 1
+
+/datum/surgery_step/repairflesh/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (target.stat == DEAD) // Sorry defibs, your subjects need to have pumping fluids for these to work.
+ return 0
+ if (isslime(target))
+ return 0
+ if (target_zone == O_EYES || target_zone == O_MOUTH)
+ return 0
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected == null)
+ return 0
+ if (affected.is_stump())
+ return 0
+ if (affected.robotic >= ORGAN_ROBOT)
+ return 0
+ return 1
+
+
+//////////////////////////////////////////////////////////////////
+// SCAN STEP //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/repairflesh/scan_injury
+ allowed_tools = list(
+ /obj/item/weapon/autopsy_scanner = 100,
+ /obj/item/device/healthanalyzer = 80,
+ /obj/item/device/analyzer = 10
+ )
+
+ priority = 2
+
+ can_infect = 0 //The only exception here. Sweeping a scanner probably won't transfer many germs.
+
+ min_duration = 20
+ max_duration = 40
+
+/datum/surgery_step/repairflesh/scan_injury/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(affected.burn_stage || affected.brute_stage)
+ return 0
+ return 1
+ return 0
+
+/datum/surgery_step/repairflesh/scan_injury/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] begins scanning [target]'s [affected] with \the [tool].", \
+ "You begin scanning [target]'s [affected] with \the [tool].")
+ ..()
+
+/datum/surgery_step/repairflesh/scan_injury/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] finishes scanning [target]'s [affected].", \
+ "You finish scanning [target]'s [affected].")
+ if(affected.brute_dam)
+ to_chat(user, "The muscle in [target]'s [affected] is notably bruised.")
+ if(affected.status & ORGAN_BROKEN)
+ to_chat(user, "\The [target]'s [affected] is broken!")
+ affected.brute_stage = max(1, affected.brute_stage)
+ if(affected.burn_dam)
+ to_chat(user, "\The muscle in [target]'s [affected] is notably charred.")
+ affected.burn_stage = max(1, affected.burn_stage)
+
+/datum/surgery_step/repairflesh/scan_injury/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, dropping \the [tool] onto [target]'s [affected]!" , \
+ "Your hand slips, dropping \the [tool] onto [target]'s [affected]!" )
+ affected.createwound(BRUISE, 10)
+
+//////////////////////////////////////////////////////////////////
+// BURN STEP //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/repairflesh/repair_burns
+ allowed_tools = list(
+ /obj/item/stack/medical/advanced/ointment = 100,
+ /obj/item/weapon/surgical/FixOVein = 100,
+ /obj/item/weapon/surgical/hemostat = 60,
+ /obj/item/stack/medical/ointment = 50,
+ /obj/item/weapon/tape_roll = 30,
+ /obj/item/taperoll = 10
+ )
+
+ priority = 3
+
+ min_duration = 90
+ max_duration = 120
+
+/datum/surgery_step/repairflesh/repair_burns/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(affected.burn_stage < 1 || !(affected.burn_dam))
+ return 0
+ if(affected.burn_dam < affected.brute_dam)
+ return 0
+ return 1
+ return 0
+
+/datum/surgery_step/repairflesh/repair_burns/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(istype(tool, /obj/item/weapon/tape_roll) || istype(tool, /obj/item/taperoll))
+ user.visible_message("[user] begins taping up [target]'s [affected] with \the [tool].", \
+ "You begin taping up [target]'s [affected] with \the [tool].")
+ affected.jostle_bone(10)
+ else if(istype(tool, /obj/item/weapon/surgical/hemostat) || istype(tool, /obj/item/weapon/surgical/FixOVein))
+ user.visible_message("[user] begins mending the charred blood vessels in [target]'s [affected] with \the [tool].", \
+ "You begin mending the charred blood vessels in [target]'s [affected] with \the [tool].")
+ else
+ user.visible_message("[user] begins coating the charred tissue in [target]'s [affected] with \the [tool].", \
+ "You begin coating the charred tissue in [target]'s [affected] with \the [tool].")
+ ..()
+
+/datum/surgery_step/repairflesh/repair_burns/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(istype(tool, /obj/item/weapon/tape_roll) || istype(tool, /obj/item/taperoll))
+ user.visible_message("[user] finishes taping up [target]'s [affected] with \the [tool].", \
+ "You finish taping up [target]'s [affected] with \the [tool].")
+ affected.createwound(BRUISE, 10)
+ affected.heal_damage(0, 25, 0, 0)
+ if(!(affected.burn_dam))
+ affected.burn_stage = 0
+ if(istype(tool, /obj/item/stack))
+ var/obj/item/stack/T = tool
+ T.use(1)
+ ..()
+
+/datum/surgery_step/repairflesh/repair_burns/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, tearing up [target]'s [affected] with \the [tool].", \
+ "Your hand slips, tearing up [target]'s [affected] with \the [tool].")
+ affected.createwound(BRUISE, 10)
+ affected.createwound(CUT, 5)
+ if(istype(tool, /obj/item/stack) && prob(30))
+ var/obj/item/stack/T = tool
+ T.use(1)
+ ..()
+
+//////////////////////////////////////////////////////////////////
+// BRUTE STEP //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/repairflesh/repair_brute
+ allowed_tools = list(
+ /obj/item/stack/medical/advanced/bruise_pack = 100,
+ /obj/item/weapon/surgical/cautery = 100,
+ /obj/item/weapon/surgical/bonesetter = 60,
+ /obj/item/stack/medical/bruise_pack = 50,
+ /obj/item/weapon/tape_roll = 40,
+ /obj/item/taperoll = 10
+ )
+
+ priority = 3
+
+ min_duration = 90
+ max_duration = 120
+
+/datum/surgery_step/repairflesh/repair_brute/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(affected.brute_stage < 1 || !(affected.brute_dam))
+ return 0
+ if(affected.brute_dam < affected.burn_dam)
+ return 0
+ return 1
+ return 0
+
+/datum/surgery_step/repairflesh/repair_brute/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(istype(tool, /obj/item/weapon/tape_roll) || istype(tool, /obj/item/taperoll))
+ user.visible_message("[user] begins taping up [target]'s [affected] with \the [tool].", \
+ "You begin taping up [target]'s [affected] with \the [tool].")
+ affected.jostle_bone(10)
+ else if(istype(tool, /obj/item/weapon/surgical/FixOVein) || istype(tool, /obj/item/weapon/surgical/bonesetter))
+ user.visible_message("[user] begins mending the torn tissue in [target]'s [affected] with \the [tool].", \
+ "You begin mending the torn tissue in [target]'s [affected] with \the [tool].")
+ else
+ user.visible_message("[user] begins coating the tissue in [target]'s [affected] with \the [tool].", \
+ "You begin coating the tissue in [target]'s [affected] with \the [tool].")
+ ..()
+
+/datum/surgery_step/repairflesh/repair_brute/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(istype(tool, /obj/item/weapon/tape_roll) || istype(tool, /obj/item/taperoll))
+ user.visible_message("[user] finishes taping up [target]'s [affected] with \the [tool].", \
+ "You finish taping up [target]'s [affected] with \the [tool].")
+ affected.createwound(BRUISE, 10)
+ affected.heal_damage(25, 0, 0, 0)
+ if(!(affected.brute_dam))
+ affected.brute_stage = 0
+ if(istype(tool, /obj/item/stack))
+ var/obj/item/stack/T = tool
+ T.use(1)
+ ..()
+
+/datum/surgery_step/repairflesh/repair_brute/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, tearing up [target]'s [affected] with \the [tool].", \
+ "Your hand slips, tearing up [target]'s [affected] with \the [tool].")
+ affected.createwound(BRUISE, 10)
+ affected.createwound(CUT, 5)
+ if(istype(tool, /obj/item/stack) && prob(30))
+ var/obj/item/stack/T = tool
+ T.use(1)
+ ..()
diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm
index eec5c192b7..9c7b4fdcd8 100644
--- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm
+++ b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm
@@ -32,8 +32,8 @@
var/list/values = list(
"[NORTH]" = list(0, 8*scale, ABOVE_MOB_LAYER),
"[SOUTH]" = list(0, 8*scale, BELOW_MOB_LAYER),
- "[EAST]" = list(-10*scale, 8*scale, BELOW_MOB_LAYER),
- "[WEST]" = list(10*scale, 8*scale, BELOW_MOB_LAYER))
+ "[EAST]" = list(-10*scale, 8*scale, ABOVE_MOB_LAYER),
+ "[WEST]" = list(10*scale, 8*scale, ABOVE_MOB_LAYER))
return values
@@ -44,10 +44,6 @@
buckle_movable = TRUE
buckle_lying = FALSE
-/mob/living/carbon/human/New()
- ..()
- riding_datum = new /datum/riding/taur(src)
-
/mob/living/carbon/human/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE)
if(forced)
return ..() // Skip our checks
@@ -61,25 +57,44 @@
return FALSE
if(!ishuman(M))
return FALSE
- if(M.size_multiplier > size_multiplier)
- to_chat(M,"This isn't a pony show! They need to be bigger to ride.")
+ if(M in buckled_mobs)
return FALSE
+ if(M.size_multiplier > size_multiplier * 1.2)
+ to_chat(M,"This isn't a pony show! You need to be bigger for them to ride.")
+ return FALSE
+ if(M.loc != src.loc)
+ if(M.Adjacent(src))
+ M.forceMove(get_turf(src))
var/mob/living/carbon/human/H = M
if(isTaurTail(H.tail_style))
- to_chat(H,"Too many legs. TOO MANY LEGS!!")
+ to_chat(src,"Too many legs. TOO MANY LEGS!!")
return FALSE
. = ..()
if(.)
buckled_mobs[M] = "riding"
-/mob/living/carbon/human/MouseDrop_T(mob/living/M, mob/living/user)
- if(can_buckle && istype(M))
- if(user_buckle_mob(M, user, silent = TRUE))
- visible_message("[M] starts riding [name]!")
- return TRUE
+/mob/living/carbon/human/MouseDrop_T(mob/living/M, mob/living/user) //Prevention for forced relocation caused by can_buckle. Base proc has no other use.
+ return
+
+/mob/living/carbon/human/proc/taur_mount(var/mob/living/M in living_mobs(1))
+ set name = "Taur Mount/Dismount"
+ set category = "Abilities"
+ set desc = "Let people ride on you."
+
+ if(LAZYLEN(buckled_mobs))
+ var/datum/riding/R = riding_datum
+ for(var/rider in buckled_mobs)
+ R.force_dismount(rider)
+ return
+ if (stat != CONSCIOUS)
+ return
+ if(!can_buckle || !istype(M) || !M.Adjacent(src) || M.buckled)
+ return
+ if(buckle_mob(M))
+ visible_message("[M] starts riding [name]!")
/mob/living/carbon/human/attack_hand(mob/user as mob)
if(LAZYLEN(buckled_mobs))
diff --git a/code/modules/vore/appearance/update_icons_vr.dm b/code/modules/vore/appearance/update_icons_vr.dm
index 531422bf63..643a6ba1ce 100644
--- a/code/modules/vore/appearance/update_icons_vr.dm
+++ b/code/modules/vore/appearance/update_icons_vr.dm
@@ -40,6 +40,10 @@ var/global/list/wing_icon_cache = list()
qdel(overlay)
if(isTaurTail(tail_style))
+ var/datum/sprite_accessory/tail/taur/taurtype = tail_style
+ if(taurtype.can_ride && !riding_datum)
+ riding_datum = new /datum/riding/taur(src)
+ verbs |= /mob/living/carbon/human/proc/taur_mount
return image(tail_s, "pixel_x" = -16)
else
return image(tail_s)
diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm
index 20d570075d..cc247b5497 100644
--- a/code/modules/vore/eating/digest_act_vr.dm
+++ b/code/modules/vore/eating/digest_act_vr.dm
@@ -19,23 +19,23 @@
/////////////
// Some indigestible stuff
/////////////
-/obj/item/weapon/hand_tele/digest_act(...)
+/obj/item/weapon/hand_tele/digest_act(var/atom/movable/item_storage = null)
return FALSE
-/obj/item/weapon/card/id/gold/captain/spare/digest_act(...)
+/obj/item/weapon/card/id/gold/captain/spare/digest_act(var/atom/movable/item_storage = null)
return FALSE
-/obj/item/device/aicard/digest_act(...)
+/obj/item/device/aicard/digest_act(var/atom/movable/item_storage = null)
return FALSE
-/obj/item/device/paicard/digest_act(...)
+/obj/item/device/paicard/digest_act(var/atom/movable/item_storage = null)
return FALSE
-/obj/item/weapon/gun/digest_act(...)
+/obj/item/weapon/gun/digest_act(var/atom/movable/item_storage = null)
return FALSE
-/obj/item/weapon/pinpointer/digest_act(...)
+/obj/item/weapon/pinpointer/digest_act(var/atom/movable/item_storage = null)
return FALSE
-/obj/item/blueprints/digest_act(...)
+/obj/item/blueprints/digest_act(var/atom/movable/item_storage = null)
return FALSE
-/obj/item/weapon/disk/nuclear/digest_act(...)
+/obj/item/weapon/disk/nuclear/digest_act(var/atom/movable/item_storage = null)
return FALSE
-/obj/item/device/perfect_tele_beacon/digest_act(...)
+/obj/item/device/perfect_tele_beacon/digest_act(var/atom/movable/item_storage = null)
return FALSE //Sorta important to not digest your own beacons.
/////////////
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 7b608e5c56..0723a46d44 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -22,7 +22,7 @@
var/fuzzy = 1 // Preference toggle for sharp/fuzzy icon.
var/tail_alt = 0 // Tail layer toggle.
var/can_be_drop_prey = 0
- var/can_be_drop_pred = 1 //Mobs are pred by default.
+ var/can_be_drop_pred = 1 // Mobs are pred by default.
//
// Hook for generic creation of stuff on new creatures
@@ -406,7 +406,7 @@
// Prepare messages
if(user == pred) //Feeding someone to yourself
- attempt_msg = text("[] is attemping to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
+ attempt_msg = text("[] is attempting to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
else //Feeding someone to another person
attempt_msg = text("[] is attempting to make [] [] [] into their []!",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index 4b0e1ece7b..05e6289716 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -725,7 +725,7 @@
random_emote = list("hisses softly with a blush on his face", "yelps in embarrassment", "grunts a little")
assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_roiz
-/obj/item/weapon/implant/reagent_generator/roiz/implanted(mob/living/carbon/source)
+/obj/item/weapon/implant/reagent_generator/roiz/post_implant(mob/living/carbon/source)
processing_objects += src
to_chat(source, "You implant [source] with \the [src].")
source.verbs |= assigned_proc
@@ -793,7 +793,7 @@
random_emote = list("hisses softly with a blush on her face", "bites down on her lower lip", "lets out a light huff")
assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_jasmine
-/obj/item/weapon/implant/reagent_generator/jasmine/implanted(mob/living/carbon/source)
+/obj/item/weapon/implant/reagent_generator/jasmine/post_implant(mob/living/carbon/source)
processing_objects += src
to_chat(source, "You implant [source] with \the [src].")
source.verbs |= assigned_proc
@@ -861,7 +861,7 @@
random_emote = list("hisses softly with a blush on her face", "yelps in embarrassment", "grunts a little")
assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_yonra
-/obj/item/weapon/implant/reagent_generator/yonra/implanted(mob/living/carbon/source)
+/obj/item/weapon/implant/reagent_generator/yonra/post_implant(mob/living/carbon/source)
processing_objects += src
to_chat(source, "You implant [source] with \the [src].")
source.verbs |= assigned_proc
@@ -945,7 +945,7 @@
random_emote = list("trembles and huffs, panting from the exertion.", "sees what has happened and covers her face with both hands!", "whimpers softly, her legs shivering, knees pointed inward from the feeling.")
assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_rischi
-/obj/item/weapon/implant/reagent_generator/rischi/implanted(mob/living/carbon/source)
+/obj/item/weapon/implant/reagent_generator/rischi/post_implant(mob/living/carbon/source)
processing_objects += src
to_chat(source, "You implant [source] with \the [src].")
source.verbs |= assigned_proc
@@ -995,70 +995,6 @@
rimplant.reagents.remove_any(rimplant.transfer_amount)
-/obj/item/weapon/implant/reagent_generator/pumila_apple
- name = "apple laying implant"
- desc = "This is an implant that allows the user to grow apples."
- generated_reagents = list("sugar" = 2) //This actually allows them to.
- usable_volume = 250 //Five apples. Let's not get /too/ crazy here.
- transfer_amount = 50
-
- empty_message = list("Your have no apples on you.", "You have a distinct lack of apples..")
- full_message = list("You have multiple apples on you, ready for harvest!", "There are a multitude of apples awaiting harvest on you!")
- emote_descriptor = list("an apple right off of Pumila!", "a large apple off Pumila!")
- var/verb_descriptor = list("grabs", "snatches", "picks")
- var/self_verb_descriptor = list("grab", "snatch", "pick")
- var/short_emote_descriptor = list("picks", "grabs")
- self_emote_descriptor = list("grab", "pick", "snatch")
- assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_pumila_apple
-
-/obj/item/weapon/implant/reagent_generator/pumila_apple/implanted(mob/living/carbon/source)
- processing_objects += src
- to_chat(source, "You implant [source] with \the [src].")
- source.verbs |= assigned_proc
- return 1
-
-/obj/item/weapon/implanter/reagent_generator/pumila_apple
- implant_type = /obj/item/weapon/implant/reagent_generator/pumila_apple
-
-/mob/living/carbon/human/proc/use_reagent_implant_pumila_apple()
- set name = "Grab Apple"
- set desc = "Grab an apple off of Pumila."
- set category = "Object"
- set src in view(1)
-
- //do_reagent_implant(usr)
- if(!isliving(usr) || !usr.canClick())
- return
-
- if(usr.incapacitated() || usr.stat > CONSCIOUS)
- return
-
- var/obj/item/weapon/implant/reagent_generator/roiz/rimplant
- for(var/I in contents)
- if(istype(I, /obj/item/weapon/implant/reagent_generator))
- rimplant = I
- break
- if (rimplant)
- if(rimplant.reagents.total_volume < rimplant.transfer_amount)
- to_chat(src, "[pick(rimplant.empty_message)]")
- return
-
- var/datum/seed/S = plant_controller.seeds["apple"] //crosses fingers.
- S.harvest(usr,0,0,1)
-
- var/index = rand(0,2)
-
- if (usr != src)
- var/emote = rimplant.emote_descriptor[index]
- var/verb_desc = rimplant.verb_descriptor[index]
- var/self_verb_desc = rimplant.self_verb_descriptor[index]
- usr.visible_message("[usr] [verb_desc] [emote]",
- "You [self_verb_desc] [emote]")
- else
- visible_message("[src] [pick(rimplant.short_emote_descriptor)] an apple.",
- "You [pick(rimplant.self_emote_descriptor)] an apple.")
-
- rimplant.reagents.remove_any(rimplant.transfer_amount)
/*
/obj/item/weapon/implant/reagent_generator/pumila_nectar //Bugged. Two implants at once messes things up.
generated_reagents = list("honey" = 2)
@@ -1704,7 +1640,7 @@
random_emote = list("hisses softly with a blush on his face", "yelps in embarrassment", "grunts a little")
assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_evian
-/obj/item/weapon/implant/reagent_generator/evian/implanted(mob/living/carbon/source)
+/obj/item/weapon/implant/reagent_generator/evian/post_implant(mob/living/carbon/source)
processing_objects += src
to_chat(source, "You implant [source] with \the [src].")
source.verbs |= assigned_proc
@@ -1998,7 +1934,7 @@
KA.desc = initial(KA.desc)
KA.icon = initial(KA.icon)
..()
-
+
//ArgobargSoup:Lynn Shady
/obj/item/device/flashlight/pen/fluff/lynn
name = "Lynn's penlight"
@@ -2006,3 +1942,9 @@
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "penlightlynn"
+
+//Knightfall5:Ashley Kifer
+/obj/item/clothing/accessory/medal/nobel_science/fluff/ashley
+ name = "nobel sciences award"
+ desc = "A bronze medal which represents significant contributions to the field of science or engineering, this one has Ashley Kifer engraved on it."
+
diff --git a/code/modules/xenoarcheaology/tools/equipment.dm b/code/modules/xenoarcheaology/tools/equipment.dm
index 186745a277..5bc7694df5 100644
--- a/code/modules/xenoarcheaology/tools/equipment.dm
+++ b/code/modules/xenoarcheaology/tools/equipment.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/clothing/spacesuits.dmi'
icon_state = "engspace_suit"
item_state = "engspace_suit"
+ update_icon_define = "icons/mob/spacesuit.dmi"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
/obj/item/clothing/head/bio_hood/anomaly
diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt
index 18604aaf62..b290722a8b 100644
--- a/config/alienwhitelist.txt
+++ b/config/alienwhitelist.txt
@@ -1,4 +1,6 @@
+admiraldragon - Vox
aether_elemental - Daemon
+arokha - Protean
aruis - Diona
aruis - Xenochimera
azmodan412 - Xenochimera
@@ -8,6 +10,7 @@ cameron653 - Xenomorph Hybrid
funnyman2003 - Xenochimera
hawkerthegreat - Vox
inuzari - Diona
+jademanique - Xenochimera
jemli - Gutter
ktccd - Diona
mewchild - Diona
@@ -23,6 +26,7 @@ seiga - Vox
sepulchre - Vox
sepulchre - Xenomorph Hybrid
silverTalismen - Diona
+silverTalismen - Vox
silvertalismen - Xenochimera
singo - Gutter
some~user - Species
@@ -33,4 +37,4 @@ xioen - Xenochimera
xioen - Xenomorph Hybrid
zammyman215 - Vox
zekesturm - Xenomorph Hybrid
-wtfismyname - Xenomorph Hybrid
+wtfismyname - Xenomorph Hybrid
\ No newline at end of file
diff --git a/config/custom_items.txt b/config/custom_items.txt
index 63aa433f40..47258e40fb 100644
--- a/config/custom_items.txt
+++ b/config/custom_items.txt
@@ -515,6 +515,12 @@ character_name: Rischi
item_path: /obj/item/weapon/implanter/reagent_generator/rischi
}
+{
+ckey: knightfall5
+character_name: Ashley Kifer
+item_path: /obj/item/clothing/accessory/medal/nobel_science/fluff/ashley
+}
+
# ######## L CKEYS
#Weapon Box. Permit Expired
@@ -613,12 +619,6 @@ character_name: Pumila
item_path: /obj/item/clothing/under/fluff/aluranevines
}
-{
-ckey: natje
-character_name: Pumila
-item_path: /obj/item/weapon/implanter/reagent_generator/pumila_apple
-}
-
{
ckey: nepox
character_name: Annie Rose
diff --git a/config/jobwhitelist.txt b/config/jobwhitelist.txt
index 168eccbcda..e615f5eafd 100644
--- a/config/jobwhitelist.txt
+++ b/config/jobwhitelist.txt
@@ -7,3 +7,4 @@ whiskyrose - clown
tinybear16 - clown
chargae - mime
verkister - clown
+H0lySquirr3l - clown
diff --git a/config/names/first_name_skrell.txt b/config/names/first_name_skrell.txt
new file mode 100644
index 0000000000..122b093765
--- /dev/null
+++ b/config/names/first_name_skrell.txt
@@ -0,0 +1,600 @@
+Kaexae
+Xaaq'xuer
+Xaaq'taq
+Kae'xer
+Xeq'aeq'qerr
+Ke'xuer
+Xeteq
+Kae'xum
+Kerrker
+Kerrquex'xum
+Taeqxuq
+Kae'quex'xeu
+Keqaeq'xeu
+Ke'ter
+Xue'xerr
+Keqqux'kea
+Qerrqux
+Kerrxae'qer
+Taeqxerr
+Kerr'xum
+Kaexuer
+Qerr'xaeq'xeu
+Xue'xum
+Xeqteq'qerr
+Kerrkeax'qux
+Xaaq'qux
+Xae'xuer
+Xertaq'qux
+Xum'xuer
+Keq'taq'kea
+Keq'quex'xeu
+Qerraeq
+Xeq'xum
+Xeq'qux'xum
+Xer'xuq
+Keq'teq
+Kae'keax
+Keqxer
+Kae'xerr'xeu
+Xaequx
+Ke'teq'xum
+Xaaqxerr
+Xer'keax'kea
+Qerrxae'qux
+Xae'xer
+Qerrteq
+Xeq'xuer
+Xe'xaeq'xum
+Xeteq'qerr
+Xaaq'aeq'xeu
+Xae'xaeq'qer
+Keaeq'xum
+Xaaq'teq
+Keq'ker
+Ke'keax
+Kexum'kea
+Xeq'xum
+Qerr'xaeq'kea
+Xexum
+Taeq'xer'xe
+Qerraeq
+Xeq'keax'qux
+Xuequx
+Kexuq
+Teqxaeq'qer
+Xeqtaq'qer
+Xaexuq
+Xueaeq'qux
+Taeqxae
+Keqxuer
+Xum'aeq
+Xeqkeax'kea
+Kerrxuer
+Xaeteq
+Keqxaeq'qerr
+Xum'quex
+Taeq'teq
+Xer'xaeq
+Teq'taq
+Xe'xuq
+Kerrxer
+Kerr'xaeq'kea
+Xeqteq
+Xeqxuq'qerr
+Kerr'xum'xe
+Xe'qux
+Xexaeq
+Qerrxaeq'qer
+Teqqux'kea
+Ke'xuer
+Xerqux'xeu
+Kaexaeq'xeu
+Xeq'qux
+Xeker
+Ke'xae
+Kerrxae'qux
+Kae'aeq'qerr
+Xeq'qux'xeu
+Xeqquex'xeu
+Kerr'xaeq
+Kerr'aeq
+Xaaqxae
+Xertaq'qux
+Xaaq'ker'xum
+Kae'xuer'xe
+Xue'aeq'xeu
+Qerr'xuq
+Kequex'qerr
+Xer'ter'xe
+Qerr'ter'qerr
+Xeq'keax'qux
+Keq'ker
+Ke'qux'qerr
+Xumter'qux
+Xue'qux'xe
+Xaeaeq
+Xumxuer'xeu
+Kerr'xuq'qux
+Keq'xaeq
+Xum'xuq'xeu
+Kerr'xer
+Xae'keax
+Kequex
+Kae'qux
+Keqkeax
+Qarrker
+Xaaqker'xum
+Xue'xaeq'qux
+Taeq'xaeq'xe
+Xue'xerr
+Teqkeax
+Xaaq'keax
+Ke'xaeq'qer
+Kerrxuer
+Kaeter'qux
+Qarr'xerr
+Xerxum'qux
+Xumqux
+Taeq'teq'xeu
+Qerrxuer'qer
+Xe'ker
+Qerrter'kea
+Kaeteq'qux
+Teq'xuer'xum
+Ke'xae'xeu
+Teqxuq'qer
+Keq'xaeq
+Xaaq'xae
+Xum'xer
+Xeter
+Xaaq'quex'kea
+Kexum
+Qarrkeax'qer
+Keq'xerr
+Qarrxerr'qerr
+Qarrxerr'qer
+Xer'ker
+Xaexum'xe
+Kaexerr'qux
+Xuexum
+Xaaq'xer
+Qerr'quex
+Qerr'ker
+Xum'teq'qerr
+Kerrxaeq
+Xeq'xae
+Xue'aeq'xe
+Qarr'xuer
+Qarr'xerr'qerr
+Kaexerr'xum
+Kaeter'xum
+Xuexuq
+Xuekeax'xeu
+Xaaq'ker
+Keqxer
+Teq'xer
+Qarrker
+Xer'ter
+Xae'ter'kea
+Ke'quex'xe
+Xaeter
+Xer'xae
+Qarr'xae'xum
+Xeqxuq
+Keqter'xum
+Xeker
+Taeqxerr'qer
+Keqxer'kea
+Xumquex
+Xaaq'xuq
+Kerrxum
+Xexerr
+Xerxerr'qerr
+Xaaq'xerr
+Xum'ker'qer
+Xequx
+Xer'xae
+Kaexerr'xe
+Xe'taq
+Xeq'xuer'qerr
+Xue'taq
+Teqxer
+Xaaq'xerr'xe
+Xer'quex'xum
+Xaeaeq
+Taeqaeq
+Xaeter'qer
+Xerkeax
+Xuequex'xe
+Keqxerr
+Taeqxae'qer
+Teqqux
+Xae'quex'qux
+Xe'xum
+Xaaqxer
+Xeq'aeq'xum
+Xuexuq'qerr
+Xe'taq'qux
+Qarr'xae
+Xe'keax'qer
+Qerrxum'qerr
+Xer'xer
+Qarr'quex'qerr
+Taeq'xer'qux
+Taeqtaq
+Ke'aeq'xum
+Xueter
+Kaeker
+Xeter'kea
+Qarrter
+Qerrxae
+Xaaqxum'xeu
+Xum'xuer
+Xe'xae
+Qarrter'qer
+Kequx
+Kerr'aeq'kea
+Teq'taq'kea
+Xexum'qerr
+Qerr'quex'xeu
+Xeker'qux
+Kerr'quex'qerr
+Xum'ker'qer
+Keqxuq'xeu
+Keqxuq'xeu
+Xer'teq'xum
+Kaeker'qerr
+Xumtaq
+Xexuer
+Xueter'xum
+Kaeteq
+Ke'teq
+Qerrxuq
+Teq'xum'qerr
+Xaaq'xae
+Keter'xum
+Xeqqux
+Xae'taq
+Qerrtaq'qux
+Keq'ter
+Xaequex'xum
+Kaeter
+Xaaqtaq
+Kae'xer'qer
+Kaequx
+Kae'xum
+Taeqaeq'qux
+Kexaeq'kea
+Xer'xae'qer
+Xae'ker
+Xue'xuer
+Xeq'taq'xe
+Kaexae'qux
+Teq'xae'xe
+Teq'xuer
+Qerrqux'xeu
+Xuexaeq
+Kerr'xuq'kea
+Xerquex'kea
+Keq'ker
+Kaexum
+Kerrquex
+Kexer
+Keq'quex'qerr
+Xae'xae
+Qerr'ker
+Kexerr
+Xaaqquex
+Keq'quex'xum
+Xerter'qux
+Xuexaeq'xe
+Xae'xuq'kea
+Kae'xuer'kea
+Xer'xum'kea
+Xer'quex'kea
+Kerrxuq'qux
+Qerrxuer
+Xeq'xerr'qerr
+Qarr'xuq'qux
+Xaaq'xuq
+Xerxaeq'qux
+Xertaq
+Kerr'teq'xeu
+Xer'aeq'kea
+Xe'ter'qerr
+Teq'xae
+Kerrxerr
+Taeqxaeq
+Xueker
+Keqxae'qerr
+Taeqkeax
+Kexaeq'xum
+Xuekeax'xe
+Xumxum
+Xeq'ter'xeu
+Taeqquex
+Xer'xer
+Keqxae'xeu
+Kaexum
+Keq'xaeq
+Qerr'quex'xum
+Kaexuq'qux
+Xaequx'xe
+Kae'xum
+Keqkeax
+Kexuer
+Xeter
+Xexuq'xeu
+Xe'aeq
+Xum'keax'xe
+Xer'ker'xum
+Xerxuq'qer
+Xaekeax'xe
+Kaequex'xe
+Keqxer
+Xeker'qer
+Teqker'qerr
+Keqxer
+Teq'xer
+Xaaq'xum
+Qerrter
+Ke'xuer
+Kae'xerr'xeu
+Qarrteq'kea
+Teq'aeq'qux
+Teq'xum'qux
+Xae'xuq
+Xaekeax
+Qerr'teq
+Kerrteq'qer
+Keqxerr
+Qarr'xerr'xum
+Kekeax
+Xae'xae'kea
+Xumteq
+Xuequx'qer
+Qarr'xer
+Taeq'xuq
+Ke'xum
+Kae'xerr
+Xumxum'qerr
+Keqteq'qer
+Teqker'qerr
+Qarr'keax
+Xeqxer
+Qarrxuq'xe
+Keqkeax
+Xaaq'ter'kea
+Xaaq'aeq
+Kerr'keax
+Keqxuer
+Qerr'xerr'kea
+Qarr'teq'qerr
+Kerr'teq'qerr
+Qarr'taq'qer
+Qarrxuer'xeu
+Kae'ter
+Keaeq'xum
+Teqker'xum
+Xaaq'aeq'qux
+Keq'qux'qer
+Xae'xuq'kea
+Ke'xuq'qux
+Qerr'qux
+Xaaq'qux'qer
+Xue'keax
+Xaaqxerr'kea
+Taeqteq'xe
+Xuetaq
+Xaaqxuq'qerr
+Qerrxae'xe
+Xeqxuer
+Xeqxaeq'xum
+Xue'ker'qer
+Kekeax'xeu
+Qarr'xae'qux
+Xae'ker'qux
+Qarr'xum'xum
+Xum'xaeq'xeu
+Qerrxer'qerr
+Xaeaeq'qer
+Xaaq'quex'qerr
+Qerr'aeq
+Xum'taq
+Kerr'xum'xeu
+Xaeaeq'kea
+Taeqxerr'kea
+Taeq'qux'xum
+Xaaq'xae
+Qerr'quex
+Qarrker
+Qarr'qux'xeu
+Xaaqaeq'qux
+Xuetaq
+Xaexum
+Xae'xaeq
+Xaaq'taq'xe
+Kerrxaeq'xe
+Kae'xer'kea
+Kerr'xae'qer
+Keqxum'qer
+Qarr'taq'xe
+Taeq'quex'qer
+Xum'xuer
+Xer'xuq'qerr
+Xeqteq'xum
+Xae'xaeq
+Xaekeax'qer
+Xeq'xum
+Qarr'ter'qer
+Qarr'xerr
+Kae'xae'xum
+Taeq'xuq
+Kae'xuq'kea
+Xue'xum'qux
+Xae'xerr
+Taeq'xaeq
+Xaexuq
+Xaequx
+Keqter
+Kae'xuer
+Xaaqaeq
+Kae'taq'xeu
+Keqter'kea
+Taeqaeq
+Xae'qux
+Qerr'qux
+Qarr'xuq'kea
+Xeq'xuer
+Keqqux
+Xaaq'taq'xum
+Kae'xerr
+Xue'xae'kea
+Qarraeq
+Taeq'xum
+Qerrxer
+Teq'xum
+Xaaq'ker'xeu
+Kerr'xaeq
+Xaaq'xerr'xeu
+Xaaqxuq'xeu
+Taeqter'qer
+Teq'xuer
+Xaaqker
+Qerr'xaeq'qux
+Qerr'quex'qux
+Xaaqxerr
+Keqtaq'xeu
+Kerrxuq
+Taeqxuq'xe
+Taeq'xuq
+Xexuq'qerr
+Taeq'xae'qux
+Kerr'aeq'qer
+Teqtaq
+Qerr'taq'xeu
+Xeqxaeq'kea
+Keteq
+Qarr'quex'xeu
+Kae'xer
+Xaaqxuer
+Xum'xum
+Taeqquex'xeu
+Xue'teq
+Xumxuq
+Teqxer
+Xaeteq'xum
+Kaexum'qerr
+Xaaq'qux
+Xe'xum
+Qerr'xaeq
+Keqxaeq'xe
+Xum'xerr
+Xuexaeq'xum
+Xaaq'xum'kea
+Xumteq
+Teq'keax'xeu
+Xaequex
+Ke'ker'kea
+Xeq'xuq
+Xaaq'quex'xeu
+Teq'teq'qux
+Qarr'keax
+Xequex
+Xeqqux
+Xerxerr'xum
+Kae'teq
+Xaaq'qux'xum
+Xuetaq'qer
+Xaexerr
+Xexuer
+Xaaq'xerr'qer
+Xexae'kea
+Xaexuq'qer
+Xe'ker
+Keq'quex'kea
+Qarrqux'qux
+Xaaqtaq'kea
+Teqxae
+Teq'xuq
+Ke'aeq
+Xae'aeq
+Kerr'ter
+Xue'xuq'qer
+Ke'xaeq
+Taeq'xuer'xeu
+Xeq'xae
+Qerrkeax'kea
+Xae'xuq
+Teq'keax
+Qerr'teq'qer
+Kaexuq'xe
+Qarrxaeq'xeu
+Qerrtaq
+Xe'ker'xum
+Kaexuer
+Teqxuer'xe
+Xumxuer'kea
+Kerr'xuer
+Xer'teq'xum
+Xumteq'qerr
+Ke'quex
+Taeq'aeq'qerr
+Xue'ter'xe
+Xeq'xae'xeu
+Xer'xum
+Qarr'xae
+Qerrker'qux
+Taeq'keax'xeu
+Xum'quex'xeu
+Kae'ter
+Xe'quex'xe
+Keqxum
+Kerr'quex'qer
+Xaaqxae'qer
+Xaaqteq'qer
+Keqqux
+Teq'aeq
+Keteq
+Xumxae'xum
+Xumxum
+Qarrxaeq'kea
+Keker
+Xeq'aeq'qer
+Teqter
+Qarrxaeq'kea
+Teq'quex
+Keqxum
+Teq'xuer
+Xumter'kea
+Qarr'xae
+Xae'xuer'xeu
+Xaaqxaeq'kea
+Qerr'xuq'xeu
+Xum'xae'qux
+Xumxaeq
+Xumxum
+Kexum'xe
+Kae'aeq
+Xer'teq
+Qarrxerr'xum
+Taeq'taq
+Taeq'taq'qux
+Kaexum'xeu
+Xumtaq
+Xae'xer
+Kerr'ker
+Qarr'xum'qer
+Qerr'xuer'qux
+Xue'qux'xe
+Qerr'qux'xum
+Teqquex'qerr
+Taeqquex
+Qarrxerr
+Ketaq
+Xekeax
+Kequex
+Xetaq
+Ke'xae'xe
+Teq'quex'qux
diff --git a/config/names/last_name_skrell.txt b/config/names/last_name_skrell.txt
new file mode 100644
index 0000000000..5f67fbc536
--- /dev/null
+++ b/config/names/last_name_skrell.txt
@@ -0,0 +1,600 @@
+Xer'taq'qer
+Xaaq'ter'qux
+Xaaq'xuer
+Xerxuer'xum
+Qarrqux
+Xueaeq'qux
+Xe'aeq
+Keqter
+Xaexer
+Kaeteq
+Ke'aeq'xeu
+Kerrxum
+Teqxuq'xeu
+Xexaeq
+Qerr'xerr'xum
+Xaeker'qux
+Kexer'kea
+Ke'aeq
+Keqxae'kea
+Qarraeq'xe
+Xuekeax
+Keq'quex
+Kae'quex'qux
+Qerr'taq'xum
+Taeq'taq'xum
+Kae'xaeq'xe
+Xaaq'teq'qux
+Teqker
+Qerrxum'xeu
+Xeq'xaeq'xe
+Kae'keax
+Xue'xae
+Taeq'taq
+Keter'xeu
+Xumker'xe
+Teqteq
+Xexuer
+Qerrxerr
+Kaequex'qerr
+Kaequx'xe
+Xum'xaeq
+Xe'taq
+Xuexer
+Xe'qux'xeu
+Xe'xerr'kea
+Qerr'xum
+Xaaqtaq
+Xuexum'xum
+Qerrxer
+Xaexuq
+Xeq'aeq
+Xaaq'xaeq
+Xerqux
+Xeq'xuq'xeu
+Kaexum
+Taeqteq'xeu
+Kerrter'qux
+Xeq'teq
+Teqxae'xe
+Xae'ker'kea
+Keqxuq
+Xumxae'kea
+Xeq'xerr'kea
+Kae'quex
+Kae'ter
+Teqter'xe
+Xeq'xerr'xeu
+Xerxum'qux
+Xe'qux
+Qarr'aeq
+Xue'xum'xe
+Xaaq'ter'qux
+Teq'xer
+Kerrtaq
+Qerr'aeq
+Xaaq'aeq
+Xaaqxuer
+Qerr'quex
+Kaeker
+Xae'taq
+Teq'xaeq
+Xexuq
+Keqqux
+Kaeker
+Xeqxum
+Xae'taq'qerr
+Kexerr
+Ke'xerr'qux
+Xeraeq'xum
+Kae'qux'qux
+Xerkeax'xum
+Qarrxum
+Kaexuer
+Qerrquex
+Kerr'xer
+Xeq'taq
+Xeqker
+Kerrquex'xum
+Xeteq
+Qarrxuer
+Xaaqqux'qerr
+Xae'xer
+Xae'xae
+Taeqxuer'qerr
+Xumqux'qux
+Xuexerr'qerr
+Ke'xae'xum
+Xerxuer
+Xeqtaq
+Xeqquex
+Xuekeax
+Keq'xuq'qerr
+Xaeter
+Xumxerr
+Xeqxaeq'xe
+Xae'ker
+Qerr'ker
+Xeq'aeq
+Kae'keax
+Qerrkeax
+Xeqxerr
+Keqxaeq
+Xae'xuq
+Kerrkeax'qer
+Qarrxum'xum
+Teq'xum'xeu
+Kerrxer
+Xe'xum
+Kexae'xeu
+Xerxerr'xe
+Xum'ter
+Xe'keax
+Qarr'xer'kea
+Xaaq'aeq
+Xaaqker'qerr
+Ke'ker
+Qerr'xum
+Qerr'xae'xe
+Qarr'ter'xum
+Kaexerr
+Qarrtaq'qux
+Xumxaeq
+Xaeaeq'xe
+Qarr'xae'qux
+Xer'xum'qerr
+Kae'xuq
+Xaaq'qux'kea
+Teqtaq
+Kekeax
+Xe'keax'qerr
+Kerr'keax'qerr
+Xeqkeax
+Xer'xaeq
+Xerter'kea
+Xum'xuq'xe
+Teqaeq
+Ke'teq'qux
+Xer'xuq'kea
+Keq'xum'xeu
+Xerxuer'xeu
+Xum'keax'xum
+Xaaq'ter
+Xuetaq
+Taeq'xuer'qux
+Xuexum'xe
+Xeq'quex'kea
+Xum'xer
+Xeqaeq
+Qerr'ker
+Xumxum
+Xeqxum
+Xae'taq'qerr
+Taeq'ker
+Xue'xae'xe
+Xer'taq'xe
+Xum'xaeq
+Kaexuq'xum
+Kaexuq'qux
+Ke'xum'xum
+Qerr'xerr'xum
+Ke'xuq'qux
+Taeq'xaeq
+Xumtaq
+Xetaq
+Kaexerr'xum
+Kequx
+Xuexerr'xeu
+Xeaeq
+Keq'qux'kea
+Xeq'xaeq
+Xuexum
+Ke'xerr'xe
+Xe'xum
+Kerr'xaeq
+Xeqkeax'qux
+Kaeteq
+Xer'quex
+Teqaeq'qerr
+Xaexerr
+Xaeter
+Xumxuer'qer
+Teqxae
+Taeqtaq'qerr
+Kerr'qux
+Xuequex
+Xaaqtaq'kea
+Teq'keax
+Ke'xuer'kea
+Xum'quex'xeu
+Xaexer'kea
+Kerr'quex'xum
+Qarrxaeq'xum
+Kerr'xaeq'xeu
+Xaaq'xerr'xum
+Xeqxaeq
+Xaaqxae'xeu
+Qerrxae
+Xae'xer
+Xexer
+Qarrter'xe
+Xaaq'taq'xum
+Taeq'aeq
+Teq'xer
+Xaexae'xum
+Ke'aeq
+Teqxuer
+Qerrxuq
+Xaaq'ker
+Xeq'quex
+Kerr'qux
+Xekeax'qerr
+Kerr'qux'xum
+Ke'teq
+Qarrxae'xum
+Qerr'ter'qux
+Qerr'keax
+Taeqxuer'kea
+Qerr'xae
+Keqker'xeu
+Xueter
+Xae'teq'kea
+Xumkeax'qux
+Keq'keax
+Qarr'xerr'qux
+Xuekeax'qerr
+Taeq'xuq'xe
+Keq'aeq'xe
+Xue'xuer'qux
+Qerr'quex'qux
+Xaexerr'qux
+Qerrxaeq
+Qerr'xerr
+Qarr'xuer
+Qerrxae
+Taeq'xaeq'xeu
+Kerr'ter
+Kerrker'qux
+Kaexae'xum
+Kerrtaq'qerr
+Xae'aeq'qer
+Xer'xerr
+Kae'xuer'qux
+Qerr'xer'qerr
+Keq'taq'qer
+Taeqxer'xum
+Xaaq'xuq
+Xue'qux
+Taeq'xaeq
+Xe'teq'xe
+Teq'xuq
+Taeq'xum'qux
+Xaaqter'xum
+Taeq'taq
+Xaaqxerr'qer
+Xuetaq'qerr
+Xum'xae
+Qerrxer'xe
+Qerr'xaeq'kea
+Xeq'ker
+Xeqteq'qerr
+Kerr'aeq'qer
+Xum'teq'qerr
+Xuexuq'kea
+Xue'taq
+Xum'qux'xe
+Kerrker
+Xue'ter'xeu
+Xaexaeq
+Xaexerr'kea
+Teqtaq'kea
+Xuexuer'xe
+Xue'xae'xeu
+Taeq'quex
+Keqteq
+Kae'aeq'xum
+Teqaeq'qerr
+Xaaqxum
+Qarr'teq'qux
+Kaexer
+Xue'xum
+Qerrtaq'qer
+Taeq'teq'qux
+Xueter
+Xum'ker'xe
+Xue'keax
+Xum'quex'qerr
+Kaeaeq'qerr
+Xeqxae
+Keqxuer'xeu
+Xeqxum
+Teqxuq
+Kaeker
+Xaaq'taq
+Keqquex'kea
+Xe'ker
+Xeq'aeq'kea
+Xue'qux
+Xerxuq
+Taeq'quex
+Kequx'qux
+Xueker'qux
+Teqxum'qer
+Kerrxuq'qer
+Xerker
+Xue'xuer
+Xue'qux
+Taeq'xuq
+Keq'qux'xum
+Qarr'quex'xe
+Kae'xer'kea
+Qarr'xum'xeu
+Keqker'xum
+Ketaq
+Xue'teq
+Xuexerr
+Xeqker
+Xe'xum'xeu
+Xeq'ter'qerr
+Taeqxuq
+Kaeter
+Keq'taq
+Xum'xum
+Xumxuer'xum
+Teqter'qerr
+Keq'qux'xe
+Keq'xer'qer
+Xueaeq'xeu
+Taeqxuer'kea
+Keqxae'xeu
+Kae'taq
+Xerkeax
+Xeqker
+Kerrxer
+Taeq'xerr'xe
+Qerr'xerr'qerr
+Xe'ker'xe
+Kae'qux'qerr
+Kaequex
+Xaaq'teq'qer
+Xumxerr
+Xe'quex
+Qerr'xum'qux
+Qerrxae
+Qerrquex
+Kae'xae'qerr
+Qarrquex
+Kerrxae
+Xaaq'taq'xeu
+Qarr'xae'qux
+Xeqker
+Xaaqxuq'qer
+Xaaqter
+Xerxerr
+Xue'taq'qer
+Qarrxer'qerr
+Xae'ter'xum
+Kerrter'qerr
+Kerrter'kea
+Xae'aeq
+Xe'xer
+Teq'keax'xeu
+Kexum'xe
+Xueteq
+Kae'keax
+Xaaq'keax
+Xaaq'quex'qux
+Taeqqux
+Taeq'xum
+Xerxuer
+Qerrxer
+Xaexuer
+Teqter
+Qarr'xer
+Qarrxaeq'xum
+Ke'teq
+Teq'xae
+Kaexerr
+Qarr'teq
+Xer'ker
+Xaexuer'qux
+Xeq'qux
+Taeqxer
+Taeqxaeq
+Xumxuer
+Taeqxuer'qerr
+Kae'xuer
+Qerrter
+Taeq'aeq'kea
+Taeq'xer'xum
+Kerrter
+Xum'xuer
+Xue'ker'qux
+Xaaqter'qux
+Xue'ter'xe
+Xueteq
+Xaaq'xae
+Xaexerr'qerr
+Ke'aeq'qerr
+Xaaq'xuq'xeu
+Xuekeax
+Xumteq
+Xexuq
+Taeq'ker'xeu
+Xaaqaeq
+Qarrxum
+Xerxuq'xum
+Kaexerr
+Xeq'ter'xeu
+Keqaeq
+Xeqxuer'xum
+Teqkeax'xeu
+Kae'aeq'kea
+Ke'xerr
+Ke'xuq
+Kae'quex
+Xeqxae
+Kaeter
+Xeqxer
+Kae'xuer
+Taeqtaq'xum
+Teq'qux'xeu
+Xaequex'xum
+Qarrquex
+Xaaq'qux
+Keqquex
+Qerrker'qerr
+Xexae'xe
+Xerxae
+Xaaqker'kea
+Kexer'qerr
+Xaeaeq
+Xaaqqux
+Qarr'xer'qer
+Keq'xuq
+Kae'keax
+Qerr'teq'qer
+Kae'xaeq'qer
+Xaexer
+Kerrxer'xeu
+Kaekeax
+Xaaq'xaeq'xeu
+Xae'xae
+Qarr'keax
+Teqqux'qerr
+Xeq'ter'qerr
+Taeq'ker
+Qerrteq'xeu
+Keqqux'xeu
+Xaaqteq'qerr
+Teqteq'xe
+Xaaqter
+Xaaqkeax
+Xeqqux
+Xaaq'xerr
+Teq'ker'qerr
+Xer'taq'qerr
+Qarrxum'qux
+Xum'taq'qux
+Qarr'xer'xeu
+Xerxerr'qux
+Kerr'teq
+Xum'taq'kea
+Xaequex
+Kaeaeq'xe
+Xe'xaeq'xum
+Xuexuer'qer
+Kerrxuq
+Kerrxuer'qerr
+Kaeteq
+Xaaqxuer
+Xeq'xum'qerr
+Xumxer
+Xe'ter'xeu
+Xueaeq
+Keq'keax
+Xueter
+Xaexaeq
+Keqxaeq
+Ke'aeq
+Xumxum'qerr
+Xumxae'xum
+Xaaqxuer
+Ke'ker
+Ke'xer
+Xuekeax'qerr
+Keq'teq
+Kerr'ter'qux
+Xe'xerr
+Qerrxae
+Ke'quex'xeu
+Keqxuq
+Kerrxuer
+Keq'xae
+Qarr'xuq
+Xumxuq
+Qarr'teq'qer
+Xe'xae'xeu
+Xuexum
+Xequx
+Xaaq'teq'xum
+Xue'xuq
+Kae'quex'qer
+Qarrxer'qerr
+Xumaeq'xeu
+Qarrkeax
+Kae'xer'qux
+Xeq'qux'qer
+Xueker'qux
+Teqquex
+Xae'xaeq'xum
+Taeqkeax
+Xaaq'teq'qux
+Keqxerr'xe
+Xue'ter'xe
+Xe'xaeq
+Qerrker
+Xaexum'qer
+Keqteq'xum
+Taeq'xae'xum
+Kaexuer'qux
+Xe'ter
+Xae'taq'qux
+Qarr'aeq
+Xae'xum
+Qarrxum'xum
+Keqxer'xum
+Qarr'xerr
+Teqxae
+Ke'xae'xe
+Teqkeax'qux
+Xe'taq
+Xaetaq
+Keq'teq'kea
+Keqxaeq
+Xue'xuq
+Qarr'xerr'qer
+Xequex
+Keqxum
+Keqtaq
+Qarr'ker'xum
+Kerr'xer'qer
+Kerrxae'xum
+Xum'xae
+Kaequex'qux
+Xuequx'xe
+Xumquex'qer
+Taeqker
+Xae'quex
+Xer'teq'xe
+Xerxerr
+Ke'xuq'qer
+Taeqxerr'kea
+Xaaq'xaeq'kea
+Keq'teq
+Xue'aeq'xeu
+Xaaqxer'xeu
+Ke'ker'qerr
+Xue'quex
+Taeqtaq
+Teqter
+Kequex'xe
+Xuexuer'qerr
+Xeqxum
+Xue'taq
+Xer'xuq'qerr
+Xeqxaeq'xe
+Qerr'xaeq
+Xeqxae'qer
+Taeqtaq'kea
+Xer'teq
+Qerr'xaeq'xum
+Xaaq'xae
+Xum'xuq
+Xaaqxaeq
+Xaexum
+Xaaqxum'xe
+Xertaq
+Xuexuq'qerr
+Xaaq'xae'kea
+Qerr'teq'qer
diff --git a/html/changelogs/Anewbe - Languages.yml b/html/changelogs/Anewbe - Languages.yml
new file mode 100644
index 0000000000..da9a2f7b42
--- /dev/null
+++ b/html/changelogs/Anewbe - Languages.yml
@@ -0,0 +1,40 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Certain languages now require assistance for a species to speak, but not understand, much like EAL."
+ - tweak: "Alai can only be `spoken` by Taj and Teshari."
+ - rscadd: "Adds a voicebox/larynx organ. Its only purpose at the moment is to assist in speaking certain langauges."
+ - tweak: "Language implants, like the EAL implant, now affect the voicebox organ, instead of being a freefloating implant."
+ - rscadd: "Adds a language implant for Common Skrellian."
\ No newline at end of file
diff --git a/html/changelogs/Atermonera - Ceilings.yml b/html/changelogs/Atermonera - Ceilings.yml
new file mode 100644
index 0000000000..760df592f5
--- /dev/null
+++ b/html/changelogs/Atermonera - Ceilings.yml
@@ -0,0 +1,7 @@
+author: Atermonera
+delete-after: True
+changes:
+ - rscadd: "Steel sheets can be used to construct Roofing Tiles"
+ - rscadd: "Roofing tiles can be used on tiles under open spaces or space tiles in multiZ maps to place a lattice and plating on the space above"
+ - rscadd: "Roofing tiles can be used on outdoor turfs to make them indoors"
+ - rscadd: "Both functions work together on multiZ maps with outdoor turfs, only one roofing tile is used per tile roofed."
diff --git a/html/changelogs/KasparoVv - PR - 5429.yml b/html/changelogs/KasparoVv - PR - 5429.yml
new file mode 100644
index 0000000000..10bcc76fbb
--- /dev/null
+++ b/html/changelogs/KasparoVv - PR - 5429.yml
@@ -0,0 +1,4 @@
+author: KasparoVv
+delete-after: True
+changes:
+ - rscadd: "You can now change the order of your body markings at character creation with the push of a button. Shift markings up or down layers at will to design the character you've always wanted, more easily than ever before."
\ No newline at end of file
diff --git a/html/changelogs/Mechoid - Gigaphone.yml b/html/changelogs/Mechoid - Gigaphone.yml
new file mode 100644
index 0000000000..4b4822f36f
--- /dev/null
+++ b/html/changelogs/Mechoid - Gigaphone.yml
@@ -0,0 +1,7 @@
+
+author: Mechoid
+
+delete-after: True
+
+changes:
+ - rscadd: "Added the Gigaphone. Currently unused in any PoIs or elsewhere."
diff --git a/html/changelogs/Mechoid - Surgical.yml b/html/changelogs/Mechoid - Surgical.yml
new file mode 100644
index 0000000000..844f31e035
--- /dev/null
+++ b/html/changelogs/Mechoid - Surgical.yml
@@ -0,0 +1,7 @@
+
+author: Mechoid
+
+delete-after: True
+
+changes:
+ - rscadd: "Adds a new surgical procedure for fixing brute and burn on limbs."
diff --git a/html/changelogs/Mewchild - PR - 5396.yml b/html/changelogs/Mewchild - PR - 5396.yml
new file mode 100644
index 0000000000..75998b87c9
--- /dev/null
+++ b/html/changelogs/Mewchild - PR - 5396.yml
@@ -0,0 +1,4 @@
+author: Mewchild
+delete-after: True
+changes:
+ - rscadd: "Ports several AI core sprites from ages and places past"
diff --git a/icons/effects/timestop.dmi b/icons/effects/timestop.dmi
new file mode 100644
index 0000000000..0e69eba984
Binary files /dev/null and b/icons/effects/timestop.dmi differ
diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi
index f5fbc438a7..d0946d1564 100644
Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ
diff --git a/icons/mob/belt_mirror.dmi b/icons/mob/belt_mirror.dmi
index 3712f83039..3881b1c746 100644
Binary files a/icons/mob/belt_mirror.dmi and b/icons/mob/belt_mirror.dmi differ
diff --git a/icons/mob/fish.dmi b/icons/mob/fish.dmi
index 22978494dc..81ba72c9fd 100644
Binary files a/icons/mob/fish.dmi and b/icons/mob/fish.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/DSIVulpkanin/dsi_vulpkanin.dmi b/icons/mob/human_races/cyberlimbs/DSIVulpkanin/dsi_vulpkanin.dmi
index bef68bd7d7..79943fa9e9 100644
Binary files a/icons/mob/human_races/cyberlimbs/DSIVulpkanin/dsi_vulpkanin.dmi and b/icons/mob/human_races/cyberlimbs/DSIVulpkanin/dsi_vulpkanin.dmi differ
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index 9a8adaeae0..c02abf60c8 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index d2b58c3297..0e16db099e 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/mob/vore/wings_vr.dmi b/icons/mob/vore/wings_vr.dmi
index aedb041a01..f4241e295c 100644
Binary files a/icons/mob/vore/wings_vr.dmi and b/icons/mob/vore/wings_vr.dmi differ
diff --git a/icons/obj/deadringer.dmi b/icons/obj/deadringer.dmi
new file mode 100644
index 0000000000..6220057782
Binary files /dev/null and b/icons/obj/deadringer.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index cb78fa2263..1b834792bd 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi
index 9928e2fee2..aaedd14968 100644
Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ
diff --git a/icons/obj/storage_vr.dmi b/icons/obj/storage_vr.dmi
index 7d4ab39915..74dc0935dd 100644
Binary files a/icons/obj/storage_vr.dmi and b/icons/obj/storage_vr.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 1bd5df7f9a..c19111ab72 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index 2cdc20c704..8cce2e7f15 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/maps/example/example_defines.dm b/maps/example/example_defines.dm
index a0a9967f5d..49b1dbb5cb 100644
--- a/maps/example/example_defines.dm
+++ b/maps/example/example_defines.dm
@@ -22,11 +22,11 @@
shuttle_docked_message = "The scheduled shuttle to the %dock_name% has docked with the station at docks one and two. It will depart in approximately %ETD%."
shuttle_leaving_dock = "The Crew Transfer Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%."
- shuttle_called_message = "A crew transfer to %Dock_name% has been scheduled. The shuttle has been called. Those leaving should procede to docks one and two in approximately %ETA%"
+ shuttle_called_message = "A crew transfer to %Dock_name% has been scheduled. The shuttle has been called. Those leaving should proceed to docks one and two in approximately %ETA%."
shuttle_recall_message = "The scheduled crew transfer has been cancelled."
emergency_shuttle_docked_message = "The Emergency Shuttle has docked with the station at docks one and two. You have approximately %ETD% to board the Emergency Shuttle."
emergency_shuttle_leaving_dock = "The Emergency Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%."
- emergency_shuttle_called_message = "An emergency evacuation shuttle has been called. It will arrive at docks one and two in approximately %ETA%"
+ emergency_shuttle_called_message = "An emergency evacuation shuttle has been called. It will arrive at docks one and two in approximately %ETA%."
emergency_shuttle_recall_message = "The emergency shuttle has been recalled."
/datum/map_z_level/example/first
diff --git a/maps/northern_star/northern_star_defines.dm b/maps/northern_star/northern_star_defines.dm
index 3e56c91fe9..b769b1754b 100644
--- a/maps/northern_star/northern_star_defines.dm
+++ b/maps/northern_star/northern_star_defines.dm
@@ -27,11 +27,11 @@
shuttle_docked_message = "The scheduled shuttle to the %dock_name% has docked with the station at docks one and two. It will depart in approximately %ETD%."
shuttle_leaving_dock = "The Crew Transfer Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%."
- shuttle_called_message = "A crew transfer to %Dock_name% has been scheduled. The shuttle has been called. Those leaving should procede to docks one and two in approximately %ETA%"
+ shuttle_called_message = "A crew transfer to %Dock_name% has been scheduled. The shuttle has been called. Those leaving should proceed to docks one and two in approximately %ETA%."
shuttle_recall_message = "The scheduled crew transfer has been cancelled."
emergency_shuttle_docked_message = "The Emergency Shuttle has docked with the station at docks one and two. You have approximately %ETD% to board the Emergency Shuttle."
emergency_shuttle_leaving_dock = "The Emergency Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%."
- emergency_shuttle_called_message = "An emergency evacuation shuttle has been called. It will arrive at docks one and two in approximately %ETA%"
+ emergency_shuttle_called_message = "An emergency evacuation shuttle has been called. It will arrive at docks one and two in approximately %ETA%."
emergency_shuttle_recall_message = "The emergency shuttle has been recalled."
station_networks = list(
diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm
index cec11cbaa6..c600de3f11 100644
--- a/maps/southern_cross/southern_cross-1.dmm
+++ b/maps/southern_cross/southern_cross-1.dmm
@@ -5961,7 +5961,7 @@
"ckG" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/engineering/engine_room)
"ckH" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/wingrille_spawn/reinforced_phoron,/turf/simulated/floor,/area/engineering/engine_monitoring)
"ckI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/power_monitor,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
-"ckJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; pixel_x = -6; pixel_y = -3; req_access = list(10)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Reactor Blast Doors"; pixel_x = -6; pixel_y = 7; req_access = list(10)},/obj/machinery/button/remote/emitter{desc = "A remote control-switch for the engine emitter."; id = "EngineEmitter"; name = "Engine Emitter"; pixel_x = 6; pixel_y = 2; req_access = list(10)},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
+"ckJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; pixel_x = -6; pixel_y = -3; req_access = list(10)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Reactor Blast Doors"; pixel_x = -6; pixel_y = 7; req_access = list(10)},/obj/machinery/button/remote/emitter{desc = "A remote control-switch for the engine emitter."; id = "EngineEmitter"; name = "Engine Emitter"; pixel_x = 6; pixel_y = 2; req_access = list(10)},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/engine_setup/shutters,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"ckK" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"ckL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"ckM" = (/obj/machinery/disposal,/obj/machinery/camera/network/engine{c_tag = "ENG - Monitoring Room"; dir = 8},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
@@ -10577,7 +10577,7 @@
"dVu" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/structure/table/rack{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport)
"dVv" = (/obj/structure/table/rack,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftstarboard)
"dVw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/starboard)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11351,3 +11351,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
dUOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/maps/southern_cross/southern_cross_defines.dm b/maps/southern_cross/southern_cross_defines.dm
index 2fa51eef61..c01ba36eb9 100644
--- a/maps/southern_cross/southern_cross_defines.dm
+++ b/maps/southern_cross/southern_cross_defines.dm
@@ -32,11 +32,11 @@
shuttle_docked_message = "The scheduled shuttle to the %dock_name% has docked with the station at docks one and two. It will depart in approximately %ETD%."
shuttle_leaving_dock = "The Crew Transfer Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%."
- shuttle_called_message = "A crew transfer to %Dock_name% has been scheduled. The shuttle has been called. Those leaving should procede to docks one and two in approximately %ETA%"
+ shuttle_called_message = "A crew transfer to %Dock_name% has been scheduled. The shuttle has been called. Those leaving should proceed to docks one and two in approximately %ETA%."
shuttle_recall_message = "The scheduled crew transfer has been cancelled."
emergency_shuttle_docked_message = "The Emergency Shuttle has docked with the station at docks one and two. You have approximately %ETD% to board the Emergency Shuttle."
emergency_shuttle_leaving_dock = "The Emergency Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%."
- emergency_shuttle_called_message = "An emergency evacuation shuttle has been called. It will arrive at docks one and two in approximately %ETA%"
+ emergency_shuttle_called_message = "An emergency evacuation shuttle has been called. It will arrive at docks one and two in approximately %ETA%."
emergency_shuttle_recall_message = "The emergency shuttle has been recalled."
// Networks that will show up as options in the camera monitor program
diff --git a/maps/submaps/engine_submaps/engine_tesla.dmm b/maps/submaps/engine_submaps/engine_tesla.dmm
index 14c6eadc08..415b6de6b6 100644
--- a/maps/submaps/engine_submaps/engine_tesla.dmm
+++ b/maps/submaps/engine_submaps/engine_tesla.dmm
@@ -1,2781 +1,174 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"aa" = (
-/turf/template_noop,
-/area/template_noop)
-"ab" = (
-/turf/space,
-/area/space)
-"ac" = (
-/obj/structure/lattice,
-/obj/structure/grille,
-/turf/space,
-/area/space)
-"ad" = (
-/obj/structure/lattice,
-/turf/space,
-/area/space)
-"ae" = (
-/turf/simulated/wall/r_wall,
-/area/engineering/engine_gas)
-"af" = (
-/turf/simulated/wall/r_wall,
-/area/engineering/engine_room)
-"ag" = (
-/obj/machinery/atmospherics/portables_connector{
- dir = 4
- },
-/obj/machinery/portable_atmospherics/canister/air/airlock,
-/turf/simulated/floor,
-/area/engineering/engine_gas)
-"ah" = (
-/obj/machinery/field_generator,
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 10;
- icon_state = "intact";
-
- },
-/turf/simulated/floor,
-/area/engineering/engine_gas)
-"ai" = (
-/obj/machinery/field_generator,
-/turf/simulated/floor,
-/area/engineering/engine_gas)
-"aj" = (
-/turf/simulated/floor/airless,
-/area/space)
-"ak" = (
-/obj/structure/cable/cyan{
- d1 = 2;
- d2 = 4;
- icon_state = "2-4"
- },
-/turf/simulated/floor/airless,
-/area/space)
-"al" = (
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/airless,
-/area/space)
-"am" = (
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/structure/cable/cyan{
- d1 = 2;
- d2 = 4;
- icon_state = "2-4"
- },
-/turf/simulated/floor/airless,
-/area/space)
-"an" = (
-/obj/structure/cable/cyan{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/turf/simulated/floor/airless,
-/area/space)
-"ao" = (
-/obj/structure/closet/emcloset,
-/obj/machinery/embedded_controller/radio/airlock/airlock_controller{
- frequency = 1379;
- id_tag = "eng_north_airlock";
- pixel_x = 24;
- pixel_y = 0;
- req_one_access = list(10,11);
- tag_airpump = "eng_north_pump";
- tag_chamber_sensor = "eng_north_sensor";
- tag_exterior_door = "eng_north_outer";
- tag_interior_door = "eng_north_inner"
- },
-/turf/simulated/floor/tiled/dark,
-/area/engineering/engine_room)
-"ap" = (
-/obj/machinery/portable_atmospherics/canister/phoron,
-/obj/machinery/atmospherics/pipe/manifold/hidden{
- dir = 4;
- icon_state = "map";
-
- },
-/turf/simulated/floor,
-/area/engineering/engine_gas)
-"aq" = (
-/obj/machinery/alarm{
- dir = 8;
- icon_state = "alarm0";
- pixel_x = 24
- },
-/obj/structure/dispenser/phoron,
-/turf/simulated/floor,
-/area/engineering/engine_gas)
-"ar" = (
-/obj/structure/cable/cyan,
-/obj/machinery/power/emitter{
- anchored = 1;
- state = 1
- },
-/turf/simulated/floor/airless,
-/area/space)
-"as" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/obj/effect/floor_decal/rust/mono_rusted1,
-/turf/simulated/floor/airless,
-/area/space)
-"at" = (
-/obj/machinery/access_button{
- command = "cycle_exterior";
- frequency = 1379;
- master_tag = "eng_north_airlock";
- name = "exterior access button";
- pixel_x = -5;
- pixel_y = -26;
- req_one_access = list(10,11,13)
- },
-/obj/machinery/door/airlock/glass_external{
- frequency = 1379;
- icon_state = "door_locked";
- id_tag = "eng_north_outer";
- locked = 1;
- name = "Engine North Airlock Exterior"
- },
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/tiled/dark,
-/area/engineering/engine_room)
-"au" = (
-/obj/machinery/atmospherics/unary/vent_pump/high_volume{
- dir = 4;
- frequency = 1379;
- id_tag = "eng_north_pump"
- },
-/obj/machinery/light/small,
-/obj/machinery/airlock_sensor{
- frequency = 1379;
- id_tag = "eng_north_sensor";
- pixel_x = 0;
- pixel_y = -25
- },
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/tiled/dark,
-/area/engineering/engine_room)
-"av" = (
-/obj/machinery/door/airlock/glass_external{
- frequency = 1379;
- icon_state = "door_locked";
- id_tag = "eng_north_inner";
- locked = 1;
- name = "Engine North Airlock Interior"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 4
- },
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/tiled/dark,
-/area/engineering/engine_room)
-"aw" = (
-/obj/machinery/access_button{
- command = "cycle_interior";
- frequency = 1379;
- master_tag = "eng_north_airlock";
- name = "interior access button";
- pixel_x = -28;
- pixel_y = 26;
- req_one_access = list(10,11)
- },
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/structure/sign/securearea{
- desc = "A warning sign which reads 'EXTERNAL AIRLOCK'";
- icon_state = "space";
- layer = 4;
- name = "EXTERNAL AIRLOCK";
- pixel_x = 0;
- pixel_y = 32
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 10;
- icon_state = "intact";
-
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 1
- },
-/obj/effect/floor_decal/corner/yellow/border{
- dir = 1
- },
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 4
- },
-/obj/effect/floor_decal/corner/yellow/bordercorner2{
- dir = 4
- },
-/obj/effect/floor_decal/industrial/warning{
- dir = 8
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"ax" = (
-/obj/structure/cable/cyan{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 5
- },
-/obj/effect/floor_decal/corner/yellow/border{
- dir = 5
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"ay" = (
-/obj/structure/cable/cyan{
- d1 = 0;
- d2 = 4;
- icon_state = "0-4"
- },
-/obj/machinery/power/apc{
- dir = 8;
- name = "west bump";
- pixel_x = -28
- },
-/turf/simulated/floor,
-/area/engineering/engine_gas)
-"az" = (
-/obj/structure/cable/cyan{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/obj/machinery/power/sensor{
- name = "Powernet Sensor - Engine Power";
- name_tag = "Engine Power"
- },
-/obj/structure/cable/cyan{
- d2 = 2;
- icon_state = "0-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/turf/simulated/floor,
-/area/engineering/engine_gas)
-"aA" = (
-/obj/machinery/camera/network/engine{
- dir = 1
- },
-/obj/structure/table/standard,
-/obj/item/weapon/circuitboard/tesla_coil{
- pixel_x = -2;
- pixel_y = -2
- },
-/obj/item/weapon/circuitboard/tesla_coil{
- pixel_x = 2;
- pixel_y = 2
- },
-/obj/item/weapon/stock_parts/capacitor,
-/obj/item/weapon/stock_parts/capacitor{
- pixel_x = -2;
- pixel_y = 2
- },
-/turf/simulated/floor,
-/area/engineering/engine_gas)
-"aB" = (
-/obj/machinery/camera/network/engine{
- dir = 8
- },
-/turf/space,
-/area/space)
-"aC" = (
-/obj/structure/sign/securearea{
- desc = "A warning sign which reads 'RADIOACTIVE AREA'";
- icon_state = "radiation";
- name = "RADIOACTIVE AREA";
- pixel_x = 0;
- pixel_y = 0
- },
-/turf/simulated/wall/r_wall,
-/area/engineering/engine_room)
-"aD" = (
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/effect/floor_decal/industrial/warning/corner{
- icon_state = "warningcorner";
- dir = 1
- },
-/obj/effect/floor_decal/industrial/warning/corner{
- icon_state = "warningcorner";
- dir = 8
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aE" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 4
- },
-/obj/effect/floor_decal/corner/yellow/border{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aF" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/door/airlock/engineering,
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/turf/simulated/floor,
-/area/engineering/engine_gas)
-"aG" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/machinery/door/firedoor/glass,
-/obj/structure/window/reinforced{
- dir = 8;
- health = 1e+006
- },
-/turf/simulated/floor,
-/area/engineering/engine_room)
-"aH" = (
-/obj/machinery/power/rad_collector,
-/obj/structure/cable/yellow{
- d2 = 4;
- icon_state = "0-4"
- },
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/simulated/floor,
-/area/engineering/engine_room)
-"aI" = (
-/obj/structure/cable/yellow{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/obj/machinery/door/blast/regular{
- density = 0;
- dir = 2;
- icon_state = "pdoor0";
- id = "SupermatterPort";
- layer = 3.3;
- name = "Reactor Blast Door";
- opacity = 0
- },
-/turf/simulated/floor,
-/area/engineering/engine_room)
-"aJ" = (
-/obj/effect/floor_decal/industrial/warning{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aK" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/obj/effect/floor_decal/borderfloor/corner{
- dir = 4
- },
-/obj/effect/floor_decal/corner/yellow/bordercorner{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aL" = (
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 1
- },
-/obj/effect/floor_decal/corner/yellow/border{
- dir = 1
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aM" = (
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/light_switch{
- pixel_y = 24
- },
-/obj/machinery/atmospherics/unary/vent_scrubber/on,
-/obj/effect/floor_decal/borderfloor{
- dir = 1;
- icon_state = "borderfloor";
- pixel_y = 0;
-
- },
-/obj/effect/floor_decal/corner/yellow/border{
- dir = 1
- },
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 1
- },
-/obj/effect/floor_decal/corner/yellow/bordercorner2{
- dir = 1
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aN" = (
-/obj/structure/cable/cyan{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aO" = (
-/obj/machinery/power/apc{
- dir = 4;
- name = "east bump";
- pixel_x = 28
- },
-/obj/structure/cable/cyan{
- d2 = 2;
- icon_state = "0-2"
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 5
- },
-/obj/effect/floor_decal/corner/yellow/border{
- dir = 5
- },
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 4
- },
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 5
- },
-/obj/effect/floor_decal/corner/yellow/bordercorner2{
- dir = 5
- },
-/obj/effect/floor_decal/corner/yellow/bordercorner2{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aP" = (
-/obj/machinery/power/rad_collector,
-/obj/structure/cable/yellow{
- d2 = 4;
- icon_state = "0-4"
- },
-/turf/simulated/floor,
-/area/engineering/engine_room)
-"aQ" = (
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/obj/structure/cable/yellow{
- d1 = 2;
- d2 = 4;
- icon_state = "2-4"
- },
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/door/blast/regular{
- density = 0;
- dir = 2;
- icon_state = "pdoor0";
- id = "SupermatterPort";
- layer = 3.3;
- name = "Reactor Blast Door";
- opacity = 0
- },
-/turf/simulated/floor,
-/area/engineering/engine_room)
-"aR" = (
-/obj/effect/floor_decal/industrial/warning{
- dir = 8
- },
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 5;
- icon_state = "intact";
-
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aS" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aT" = (
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aU" = (
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/effect/floor_decal/steeldecal/steel_decals_central5{
- icon_state = "steel_decals_central5";
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aV" = (
-/obj/structure/cable/yellow{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/manifold/hidden{
- dir = 4;
- icon_state = "map";
-
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aW" = (
-/obj/structure/cable/cyan{
- d1 = 2;
- d2 = 4;
- icon_state = "2-4"
- },
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"aX" = (
-/obj/machinery/field_generator{
- anchored = 1;
- state = 1
- },
-/turf/simulated/floor/airless,
-/area/space)
-"aY" = (
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 8;
- icon_state = "1-8"
- },
-/obj/machinery/door/blast/regular{
- density = 0;
- dir = 2;
- icon_state = "pdoor0";
- id = "SupermatterPort";
- layer = 3.3;
- name = "Reactor Blast Door";
- opacity = 0
- },
-/turf/simulated/floor,
-/area/engineering/engine_room)
-"aZ" = (
-/obj/effect/floor_decal/industrial/warning{
- dir = 8
- },
-/obj/machinery/button/remote/blast_door{
- desc = "A remote control-switch for the engine charging port.";
- dir = 1;
- id = "SupermatterPort";
- name = "Radiation Collector Blast Doors";
- pixel_x = -4;
- pixel_y = -24;
- req_access = list(10)
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"ba" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"bb" = (
-/obj/machinery/camera/network/engine{
- dir = 1
- },
-/obj/effect/floor_decal/borderfloor,
-/obj/effect/floor_decal/borderfloor/corner2,
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"bc" = (
-/obj/machinery/atmospherics/unary/vent_pump/on{
- dir = 1
- },
-/obj/effect/floor_decal/borderfloor,
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"bd" = (
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- d1 = 2;
- d2 = 4;
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/effect/floor_decal/borderfloor/corner{
- dir = 8
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"be" = (
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"bf" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/machinery/door/firedoor/glass,
-/obj/structure/window/reinforced{
- dir = 8;
- health = 1e+006
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/turf/simulated/floor,
-/area/submap/pa_room)
-"bg" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/machinery/door/firedoor/glass,
-/obj/machinery/door/blast/regular{
- density = 0;
- icon_state = "pdoor0";
- id = "EngineRadiatorViewport";
- name = "Engine Radiator Viewport Shutter";
- opacity = 0
- },
-/turf/simulated/floor,
-/area/submap/pa_room)
-"bh" = (
-/obj/structure/sign/securearea{
- desc = "A warning sign which reads 'RADIOACTIVE AREA'";
- icon_state = "radiation";
- name = "RADIOACTIVE AREA";
- pixel_x = 0;
- pixel_y = 0
- },
-/turf/simulated/wall/r_wall,
-/area/submap/pa_room)
-"bi" = (
-/turf/simulated/wall/r_wall,
-/area/submap/pa_room)
-"bj" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/door/airlock/glass_engineering,
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"bk" = (
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/effect/floor_decal/borderfloor{
- dir = 8
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"bl" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/light{
- dir = 4;
- icon_state = "tube1";
- pixel_x = 0
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 4
- },
-/obj/effect/floor_decal/corner/yellow/border{
- dir = 4
- },
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 6
- },
-/obj/effect/floor_decal/corner/yellow/bordercorner2{
- dir = 6
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"bm" = (
-/turf/simulated/wall/r_wall,
-/area/template_noop)
-"bn" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/structure/window/reinforced{
- dir = 8;
- health = 1e+006
- },
-/obj/machinery/door/blast/regular{
- density = 0;
- icon_state = "pdoor0";
- id = "EngineRadiatorViewport";
- name = "Engine Radiator Viewport Shutter";
- opacity = 0
- },
-/obj/machinery/door/firedoor/glass,
-/turf/simulated/floor,
-/area/submap/pa_room)
-"bo" = (
-/obj/effect/floor_decal/techfloor/orange{
- dir = 5
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/submap/pa_room)
-"bp" = (
-/obj/item/weapon/screwdriver,
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"bq" = (
-/obj/effect/floor_decal/steeldecal,
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"br" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/button/remote/blast_door{
- desc = "A remote control-switch for the engine charging port.";
- id = "EngineRadiatorViewport";
- name = "Viewport Blast Doors";
- pixel_x = -4;
- pixel_y = 24;
- req_access = list(10)
- },
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"bs" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"bt" = (
-/obj/structure/cable/cyan{
- d2 = 8;
- icon_state = "0-8"
- },
-/obj/machinery/power/apc{
- dir = 4;
- name = "east bump";
- pixel_x = 28
- },
-/obj/machinery/light_switch{
- pixel_y = 24
- },
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"bu" = (
-/obj/item/weapon/book/manual/engineering_particle_accelerator{
- pixel_x = 5;
- pixel_y = 5
- },
-/obj/item/weapon/book/manual/tesla_engine,
-/turf/template_noop,
-/area/template_noop)
-"bv" = (
-/obj/structure/table/rack{
- dir = 8;
- layer = 2.6
- },
-/obj/item/clothing/shoes/magboots,
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/suit/space/void/engineering,
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/head/helmet/space/void/engineering,
-/turf/template_noop,
-/area/template_noop)
-"bw" = (
-/obj/effect/floor_decal/techfloor/orange/corner{
- icon_state = "techfloororange_corners";
- dir = 4
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/submap/pa_room)
-"bx" = (
-/obj/structure/particle_accelerator/particle_emitter/left{
- dir = 8
- },
-/obj/effect/floor_decal/techfloor/orange{
- dir = 1
- },
-/turf/simulated/floor/tiled/techfloor,
-/area/submap/pa_room)
-"by" = (
-/obj/effect/floor_decal/techfloor/orange{
- dir = 1
- },
-/turf/simulated/floor/tiled/techfloor,
-/area/submap/pa_room)
-"bz" = (
-/obj/machinery/particle_accelerator/control_box,
-/obj/effect/floor_decal/techfloor/orange{
- dir = 1
- },
-/turf/simulated/floor/tiled/techfloor,
-/area/submap/pa_room)
-"bA" = (
-/obj/effect/floor_decal/techfloor/orange{
- dir = 5
- },
-/obj/item/stack/cable_coil/random,
-/turf/simulated/floor/tiled/techfloor,
-/area/submap/pa_room)
-"bB" = (
-/obj/machinery/atmospherics/unary/vent_scrubber/on,
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"bC" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/machinery/door/firedoor/glass,
-/obj/structure/cable/yellow{
- d2 = 4;
- icon_state = "0-4"
- },
-/turf/simulated/floor,
-/area/submap/pa_room)
-"bD" = (
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/effect/floor_decal/borderfloor{
- dir = 8
- },
-/obj/structure/cable/yellow{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"bE" = (
-/obj/machinery/the_singularitygen/tesla{
- anchored = 1
- },
-/turf/simulated/floor/airless,
-/area/space)
-"bF" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/structure/window/reinforced{
- dir = 8;
- health = 1e+006
- },
-/obj/machinery/door/blast/regular{
- density = 0;
- icon_state = "pdoor0";
- id = "EngineRadiatorViewport";
- name = "Engine Radiator Viewport Shutter";
- opacity = 0
- },
-/obj/machinery/door/firedoor/glass,
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor,
-/area/submap/pa_room)
-"bG" = (
-/obj/structure/particle_accelerator/particle_emitter/center{
- dir = 8
- },
-/turf/simulated/floor/tiled/techfloor,
-/area/submap/pa_room)
-"bH" = (
-/obj/structure/particle_accelerator/power_box{
- dir = 8
- },
-/turf/simulated/floor/tiled/techfloor,
-/area/submap/pa_room)
-"bI" = (
-/obj/structure/particle_accelerator/fuel_chamber{
- dir = 8
- },
-/turf/simulated/floor/tiled/techfloor,
-/area/submap/pa_room)
-"bJ" = (
-/obj/structure/particle_accelerator/end_cap{
- dir = 8
- },
-/obj/effect/floor_decal/techfloor/orange{
- dir = 4
- },
-/obj/effect/floor_decal/techfloor/hole{
- dir = 4
- },
-/turf/simulated/floor/tiled/techfloor,
-/area/submap/pa_room)
-"bK" = (
-/obj/machinery/camera/network/engine{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 6
- },
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"bL" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/machinery/door/firedoor/glass,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/structure/cable/yellow{
- d2 = 4;
- icon_state = "0-4"
- },
-/turf/simulated/floor,
-/area/submap/pa_room)
-"bM" = (
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/effect/floor_decal/borderfloor{
- dir = 8
- },
-/obj/structure/cable/yellow{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"bN" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 4
- },
-/obj/effect/floor_decal/corner/yellow/border{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"bO" = (
-/obj/machinery/button/remote/blast_door{
- desc = "A remote control-switch for the engine charging port.";
- id = "SupermatterPort";
- name = "Radiation Collector Blast Doors";
- pixel_x = -6;
- pixel_y = 7;
- req_access = list(10)
- },
-/obj/machinery/button/remote/blast_door{
- name = "Engine Monitoring Room Blast Doors";
- desc = "A remote control-switch for the engine control room blast doors.";
- pixel_x = 5;
- pixel_y = 7;
- req_access = list(10);
- id = "EngineBlast"
- },
-/turf/template_noop,
-/area/template_noop)
-"bP" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/structure/window/reinforced{
- dir = 8;
- health = 1e+006
- },
-/obj/machinery/door/blast/regular{
- density = 0;
- icon_state = "pdoor0";
- id = "EngineRadiatorViewport";
- name = "Engine Radiator Viewport Shutter";
- opacity = 0
- },
-/obj/machinery/door/firedoor/glass,
-/obj/effect/floor_decal/techfloor/orange/corner,
-/turf/simulated/floor,
-/area/submap/pa_room)
-"bQ" = (
-/obj/structure/cable/yellow{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/submap/pa_room)
-"bR" = (
-/obj/structure/particle_accelerator/particle_emitter/right{
- dir = 8
- },
-/obj/effect/floor_decal/techfloor/orange,
-/turf/simulated/floor/tiled/techfloor,
-/area/submap/pa_room)
-"bS" = (
-/obj/effect/floor_decal/techfloor/orange,
-/turf/simulated/floor/tiled/techfloor,
-/area/submap/pa_room)
-"bT" = (
-/obj/effect/floor_decal/techfloor/orange,
-/obj/effect/floor_decal/techfloor/hole,
-/turf/simulated/floor/tiled/techfloor,
-/area/submap/pa_room)
-"bU" = (
-/obj/effect/floor_decal/techfloor/orange{
- icon_state = "techfloororange_edges";
- dir = 6
- },
-/turf/simulated/floor/tiled/techfloor,
-/area/submap/pa_room)
-"bV" = (
-/obj/machinery/atmospherics/unary/vent_pump/on{
- dir = 1
- },
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"bW" = (
-/obj/effect/floor_decal/techfloor/orange/corner,
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/submap/pa_room)
-"bX" = (
-/obj/effect/floor_decal/techfloor/orange{
- icon_state = "techfloororange_edges";
- dir = 6
- },
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/submap/pa_room)
-"bY" = (
-/obj/machinery/alarm{
- dir = 8;
- pixel_x = 25;
- pixel_y = 0
- },
-/obj/effect/floor_decal/steeldecal/steel_decals8,
-/obj/structure/table/standard,
-/obj/item/weapon/book/manual/tesla_engine,
-/obj/item/weapon/book/manual/engineering_particle_accelerator{
- pixel_x = 5;
- pixel_y = 5
- },
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"bZ" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/machinery/door/firedoor/glass,
-/obj/structure/window/reinforced{
- dir = 8;
- health = 1e+006
- },
-/obj/structure/window/reinforced,
-/turf/simulated/floor,
-/area/submap/pa_room)
-"ca" = (
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"cb" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/light{
- dir = 4;
- icon_state = "tube1";
- pixel_x = 0
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 4
- },
-/obj/effect/floor_decal/corner/yellow/border{
- dir = 4
- },
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 5
- },
-/obj/effect/floor_decal/corner/yellow/bordercorner2{
- dir = 5
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cc" = (
-/obj/effect/floor_decal/industrial/warning{
- dir = 8
- },
-/obj/machinery/button/remote/blast_door{
- desc = "A remote control-switch for the engine charging port.";
- id = "SupermatterPort";
- name = "Radiation Collector Blast Doors";
- pixel_x = -4;
- pixel_y = 24;
- req_access = list(10)
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cd" = (
-/obj/machinery/light,
-/obj/machinery/button/remote/blast_door{
- desc = "A remote control-switch for the engine charging port.";
- dir = 1;
- id = "EngineRadiatorViewport";
- name = "Viewport Blast Doors";
- pixel_x = -4;
- pixel_y = -24;
- req_access = list(10)
- },
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"ce" = (
-/obj/machinery/camera/network/engine,
-/obj/effect/floor_decal/borderfloor{
- dir = 1
- },
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cf" = (
-/obj/machinery/atmospherics/unary/vent_scrubber/on,
-/obj/effect/floor_decal/borderfloor{
- dir = 1
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cg" = (
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/effect/floor_decal/borderfloor/corner{
- dir = 1
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"ch" = (
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/obj/structure/cable/yellow{
- d1 = 2;
- d2 = 4;
- icon_state = "2-4"
- },
-/obj/machinery/door/blast/regular{
- density = 0;
- dir = 2;
- icon_state = "pdoor0";
- id = "SupermatterPort";
- layer = 3.3;
- name = "Reactor Blast Door";
- opacity = 0
- },
-/turf/simulated/floor,
-/area/engineering/engine_room)
-"ci" = (
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/effect/floor_decal/industrial/warning{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 6
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cj" = (
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/effect/floor_decal/steeldecal/steel_decals_central5{
- icon_state = "steel_decals_central5";
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"ck" = (
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 8;
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 9;
- pixel_y = 0
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 9;
- icon_state = "intact";
-
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cl" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 4
- },
-/obj/effect/floor_decal/corner/yellow/border{
- dir = 4
- },
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 6
- },
-/obj/effect/floor_decal/corner/yellow/bordercorner2{
- dir = 6
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cm" = (
-/obj/machinery/power/rad_collector,
-/obj/structure/cable/yellow{
- d2 = 4;
- icon_state = "0-4"
- },
-/obj/machinery/light/small,
-/turf/simulated/floor,
-/area/engineering/engine_room)
-"cn" = (
-/obj/structure/cable/cyan{
- d1 = 2;
- d2 = 4;
- icon_state = "2-4"
- },
-/obj/effect/floor_decal/borderfloor/corner,
-/obj/effect/floor_decal/corner/yellow/bordercorner,
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"co" = (
-/obj/machinery/power/tesla_coil,
-/obj/structure/cable/yellow{
- d2 = 4;
- icon_state = "0-4"
- },
-/turf/simulated/floor/airless,
-/area/space)
-"cp" = (
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/unary/vent_pump/on{
- dir = 1
- },
-/obj/effect/floor_decal/borderfloor,
-/obj/effect/floor_decal/corner/yellow/border,
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cq" = (
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/alarm{
- dir = 1;
- icon_state = "alarm0";
- pixel_y = -22
- },
-/obj/effect/floor_decal/borderfloor,
-/obj/effect/floor_decal/corner/yellow/border,
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cr" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 8;
- icon_state = "1-8"
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 6
- },
-/obj/effect/floor_decal/corner/yellow/border{
- dir = 6
- },
-/obj/effect/floor_decal/industrial/hatch/yellow,
-/obj/structure/reagent_dispensers/fueltank,
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cs" = (
-/obj/machinery/power/emitter{
- anchored = 1;
- dir = 1;
- state = 1
- },
-/obj/structure/cable/cyan{
- d2 = 2;
- icon_state = "0-2"
- },
-/turf/simulated/floor/airless,
-/area/space)
-"ct" = (
-/obj/machinery/access_button{
- command = "cycle_exterior";
- frequency = 1379;
- master_tag = "eng_south_airlock";
- name = "exterior access button";
- pixel_x = -5;
- pixel_y = 26;
- req_one_access = list(10,11,13)
- },
-/obj/machinery/door/airlock/glass_external{
- frequency = 1379;
- icon_state = "door_locked";
- id_tag = "eng_south_outer";
- locked = 1;
- name = "Engine South Airlock Exterior"
- },
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/tiled/dark,
-/area/engineering/engine_room)
-"cu" = (
-/obj/machinery/atmospherics/unary/vent_pump/high_volume{
- dir = 4;
- frequency = 1379;
- id_tag = "eng_south_pump"
- },
-/obj/machinery/airlock_sensor{
- frequency = 1379;
- id_tag = "eng_south_sensor";
- pixel_x = 0;
- pixel_y = 25
- },
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/simulated/floor/tiled/dark,
-/area/engineering/engine_room)
-"cv" = (
-/obj/machinery/door/airlock/glass_external{
- frequency = 1379;
- icon_state = "door_locked";
- id_tag = "eng_south_inner";
- locked = 1;
- name = "Engine South Airlock Interior"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 4
- },
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/access_button{
- command = "cycle_interior";
- frequency = 1379;
- master_tag = "eng_south_airlock";
- name = "interior access button";
- pixel_x = 8;
- pixel_y = -26;
- req_one_access = list(10,11)
- },
-/turf/simulated/floor/tiled/dark,
-/area/engineering/engine_room)
-"cw" = (
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/structure/sign/securearea{
- desc = "A warning sign which reads 'EXTERNAL AIRLOCK'";
- icon_state = "space";
- layer = 4;
- name = "EXTERNAL AIRLOCK";
- pixel_x = 0;
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 9;
- icon_state = "intact";
-
- },
-/obj/effect/floor_decal/borderfloor,
-/obj/effect/floor_decal/corner/yellow/border,
-/obj/effect/floor_decal/borderfloor/corner2,
-/obj/effect/floor_decal/corner/yellow/bordercorner2,
-/obj/effect/floor_decal/industrial/warning{
- dir = 8
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cx" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 8;
- icon_state = "1-8"
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 6
- },
-/obj/effect/floor_decal/corner/yellow/border{
- dir = 6
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cy" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/obj/item/weapon/extinguisher,
-/turf/simulated/floor/airless,
-/area/space)
-"cz" = (
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/turf/simulated/floor/airless,
-/area/space)
-"cA" = (
-/obj/structure/cable/cyan{
- d1 = 1;
- d2 = 8;
- icon_state = "1-8"
- },
-/obj/effect/floor_decal/rust,
-/turf/simulated/floor/airless,
-/area/space)
-"cB" = (
-/obj/structure/closet/emcloset,
-/obj/machinery/embedded_controller/radio/airlock/airlock_controller{
- frequency = 1379;
- id_tag = "eng_south_airlock";
- pixel_x = 24;
- pixel_y = 0;
- req_one_access = list(10,11);
- tag_airpump = "eng_south_pump";
- tag_chamber_sensor = "eng_south_sensor";
- tag_exterior_door = "eng_south_outer";
- tag_interior_door = "eng_south_inner"
- },
-/turf/simulated/floor/tiled/dark,
-/area/engineering/engine_room)
-"cC" = (
-/turf/simulated/wall/r_wall,
-/area/space)
-"cD" = (
-/obj/structure/lattice,
-/obj/machinery/power/grounding_rod,
-/turf/space,
-/area/space)
-"cE" = (
-/obj/structure/cable/yellow{
- d2 = 4;
- icon_state = "0-4"
- },
-/obj/machinery/power/grounding_rod{
- anchored = 1
- },
-/turf/simulated/floor,
-/area/engineering/engine_room)
-"cF" = (
-/obj/machinery/power/emitter{
- anchored = 1;
- state = 1
- },
-/obj/structure/cable/cyan,
-/turf/simulated/floor/airless,
-/area/space)
-"cG" = (
-/obj/structure/cable/yellow{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"cH" = (
-/obj/machinery/door/airlock/glass_engineering,
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/turf/simulated/floor/tiled,
-/area/submap/pa_room)
-"cI" = (
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cJ" = (
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cK" = (
-/obj/structure/cable/yellow{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/airless,
-/area/space)
-"cL" = (
-/obj/structure/cable/yellow{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/turf/simulated/floor/airless,
-/area/space)
-"cM" = (
-/obj/structure/cable/cyan{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/light,
-/obj/effect/floor_decal/borderfloor,
-/obj/effect/floor_decal/corner/yellow/border,
-/turf/simulated/floor/tiled,
-/area/engineering/engine_room)
-"cN" = (
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/turf/simulated/floor/airless,
-/area/space)
-"cO" = (
-/obj/machinery/power/tesla_coil,
-/obj/structure/cable/yellow,
-/obj/structure/cable/yellow{
- d2 = 2;
- icon_state = "0-2"
- },
-/turf/simulated/floor/airless,
-/area/space)
-"cP" = (
-/obj/structure/cable/yellow{
- d2 = 4;
- icon_state = "0-4"
- },
-/obj/structure/cable/yellow{
- d2 = 2;
- icon_state = "0-2"
- },
-/obj/structure/cable/yellow,
-/turf/simulated/floor/airless,
-/area/space)
-"cQ" = (
-/obj/structure/cable/yellow{
- d1 = 1;
- d2 = 8;
- icon_state = "1-8"
- },
-/turf/simulated/floor/airless,
-/area/space)
-"cR" = (
-/obj/structure/lattice,
-/obj/item/clothing/head/welding,
-/turf/space,
-/area/space)
-"cS" = (
-/obj/item/weapon/weldingtool,
-/turf/simulated/floor/airless,
-/area/space)
+"aa" = (/turf/template_noop,/area/template_noop)
+"ab" = (/turf/space,/area/space)
+"ac" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
+"ad" = (/obj/structure/lattice,/turf/space,/area/space)
+"ae" = (/turf/simulated/wall/r_wall,/area/engineering/engine_gas)
+"af" = (/turf/simulated/wall/r_wall,/area/engineering/engine_room)
+"ag" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/engineering/engine_gas)
+"ah" = (/obj/machinery/field_generator,/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/turf/simulated/floor,/area/engineering/engine_gas)
+"ai" = (/obj/machinery/field_generator,/turf/simulated/floor,/area/engineering/engine_gas)
+"aj" = (/turf/simulated/floor/airless,/area/space)
+"ak" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless,/area/space)
+"al" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/space)
+"am" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless,/area/space)
+"an" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless,/area/space)
+"ao" = (/obj/structure/closet/emcloset,/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eng_north_airlock"; pixel_x = 24; pixel_y = 0; req_one_access = list(10,11); tag_airpump = "eng_north_pump"; tag_chamber_sensor = "eng_north_sensor"; tag_exterior_door = "eng_north_outer"; tag_interior_door = "eng_north_inner"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
+"ap" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"},/turf/simulated/floor,/area/engineering/engine_gas)
+"aq" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/dispenser/phoron,/turf/simulated/floor,/area/engineering/engine_gas)
+"ar" = (/obj/structure/cable/cyan,/obj/machinery/power/emitter{anchored = 1; state = 1},/turf/simulated/floor/airless,/area/space)
+"as" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/rust/mono_rusted1,/turf/simulated/floor/airless,/area/space)
+"at" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eng_north_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(10,11,13)},/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_north_outer"; locked = 1; name = "Engine North Airlock Exterior"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
+"au" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eng_north_pump"},/obj/machinery/light/small,/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eng_north_sensor"; pixel_x = 0; pixel_y = -25},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
+"av" = (/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_north_inner"; locked = 1; name = "Engine North Airlock Interior"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
+"aw" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eng_north_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(10,11)},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"ax" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/yellow/border{dir = 5},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"ay" = (/obj/structure/cable/cyan{d1 = 0; d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -28},/turf/simulated/floor,/area/engineering/engine_gas)
+"az" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/power/sensor{name = "Powernet Sensor - Engine Power"; name_tag = "Engine Power"},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/engineering/engine_gas)
+"aA" = (/obj/machinery/camera/network/engine{dir = 1},/obj/structure/table/standard,/obj/item/weapon/circuitboard/tesla_coil{pixel_x = -2; pixel_y = -2},/obj/item/weapon/circuitboard/tesla_coil{pixel_x = 2; pixel_y = 2},/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor{pixel_x = -2; pixel_y = 2},/turf/simulated/floor,/area/engineering/engine_gas)
+"aB" = (/obj/machinery/camera/network/engine{dir = 8},/turf/space,/area/space)
+"aC" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_room)
+"aD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aE" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aF" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/engineering,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/engineering/engine_gas)
+"aG" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; dir = 1; id = "SupermatterPort"; name = "Observation Blast Doors"; pixel_x = -4; pixel_y = -24; req_access = list(10)},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aH" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Observation Blast Doors"; pixel_x = -4; pixel_y = 24; req_access = list(10)},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aI" = (/obj/machinery/power/tesla_coil,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/space)
+"aJ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aK" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/yellow/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aL" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aM" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light_switch{pixel_y = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/borderfloor{dir = 1; icon_state = "borderfloor"; pixel_y = 0},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aN" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aO" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 28},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/yellow/border{dir = 5},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 5},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aP" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/space)
+"aQ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aR" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aS" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aU" = (/obj/effect/floor_decal/steeldecal/steel_decals_central5{icon_state = "steel_decals_central5"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aV" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aW" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"aX" = (/obj/machinery/field_generator{anchored = 1; state = 1},/turf/simulated/floor/airless,/area/space)
+"aY" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/turf/simulated/floor,/area/submap/pa_room)
+"aZ" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/borderfloor/corner{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"ba" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"bb" = (/obj/machinery/camera/network/engine{dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/borderfloor/corner2,/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"bc" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"bd" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/turf/simulated/floor,/area/submap/pa_room)
+"be" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"bf" = (/turf/simulated/floor/tiled,/area/submap/pa_room)
+"bh" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/submap/pa_room)
+"bi" = (/turf/simulated/wall/r_wall,/area/submap/pa_room)
+"bj" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_engineering,/turf/simulated/floor/tiled,/area/submap/pa_room)
+"bk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"bl" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 6},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"bm" = (/turf/simulated/wall/r_wall,/area/template_noop)
+"bn" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/door/firedoor/glass,/turf/simulated/floor,/area/submap/pa_room)
+"bo" = (/obj/effect/floor_decal/techfloor/orange{dir = 5},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/pa_room)
+"bq" = (/obj/effect/floor_decal/steeldecal,/turf/simulated/floor/tiled,/area/submap/pa_room)
+"br" = (/obj/machinery/light{dir = 1},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "EngineRadiatorViewport"; name = "Viewport Blast Doors"; pixel_x = -4; pixel_y = 24; req_access = list(10)},/turf/simulated/floor/tiled,/area/submap/pa_room)
+"bs" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/submap/pa_room)
+"bt" = (/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 28},/obj/machinery/light_switch{pixel_y = 24},/turf/simulated/floor/tiled,/area/submap/pa_room)
+"bu" = (/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_x = 5; pixel_y = 5},/obj/item/weapon/book/manual/tesla_engine,/turf/template_noop,/area/template_noop)
+"bv" = (/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/void/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/engineering,/turf/template_noop,/area/template_noop)
+"bw" = (/obj/effect/floor_decal/techfloor/orange/corner{icon_state = "techfloororange_corners"; dir = 4},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/pa_room)
+"bx" = (/obj/structure/particle_accelerator/particle_emitter/left{dir = 8},/obj/effect/floor_decal/techfloor/orange{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
+"by" = (/obj/effect/floor_decal/techfloor/orange{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
+"bz" = (/obj/machinery/particle_accelerator/control_box,/obj/effect/floor_decal/techfloor/orange{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
+"bA" = (/obj/effect/floor_decal/techfloor/orange{dir = 5},/obj/item/stack/cable_coil/random,/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
+"bB" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/submap/pa_room)
+"bC" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/submap/pa_room)
+"bD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"bE" = (/obj/machinery/the_singularitygen/tesla{anchored = 1},/turf/simulated/floor/airless,/area/space)
+"bF" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/door/firedoor/glass,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/submap/pa_room)
+"bG" = (/obj/structure/particle_accelerator/particle_emitter/center{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
+"bH" = (/obj/structure/particle_accelerator/power_box{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
+"bI" = (/obj/structure/particle_accelerator/fuel_chamber{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
+"bJ" = (/obj/structure/particle_accelerator/end_cap{dir = 8},/obj/effect/floor_decal/techfloor/orange{dir = 4},/obj/effect/floor_decal/techfloor/hole{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
+"bK" = (/obj/machinery/camera/network/engine{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/submap/pa_room)
+"bL" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/submap/pa_room)
+"bM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"bN" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"bO" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Radiation Collector Blast Doors"; pixel_x = -6; pixel_y = 7; req_access = list(10)},/obj/machinery/button/remote/blast_door{name = "Engine Monitoring Room Blast Doors"; desc = "A remote control-switch for the engine control room blast doors."; pixel_x = 5; pixel_y = 7; req_access = list(10); id = "EngineBlast"},/turf/template_noop,/area/template_noop)
+"bP" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor,/area/submap/pa_room)
+"bQ" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/pa_room)
+"bR" = (/obj/structure/particle_accelerator/particle_emitter/right{dir = 8},/obj/effect/floor_decal/techfloor/orange,/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
+"bS" = (/obj/effect/floor_decal/techfloor/orange,/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
+"bT" = (/obj/effect/floor_decal/techfloor/orange,/obj/effect/floor_decal/techfloor/hole,/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
+"bU" = (/obj/effect/floor_decal/techfloor/orange{icon_state = "techfloororange_edges"; dir = 6},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
+"bV" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/submap/pa_room)
+"bW" = (/obj/effect/floor_decal/techfloor/orange/corner,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/pa_room)
+"bX" = (/obj/effect/floor_decal/techfloor/orange{icon_state = "techfloororange_edges"; dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/pa_room)
+"bY" = (/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/obj/effect/floor_decal/steeldecal/steel_decals8,/obj/structure/table/standard,/obj/item/weapon/book/manual/tesla_engine,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/tiled,/area/submap/pa_room)
+"ca" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/submap/pa_room)
+"cb" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 5},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cc" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cd" = (/obj/machinery/light,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; dir = 1; id = "EngineRadiatorViewport"; name = "Viewport Blast Doors"; pixel_x = -4; pixel_y = -24; req_access = list(10)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/submap/pa_room)
+"ce" = (/obj/machinery/camera/network/engine,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cf" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/borderfloor/corner{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"ch" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"ci" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/steeldecal/steel_decals_central5{icon_state = "steel_decals_central5"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"ck" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cl" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 6},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cm" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/structure/window/reinforced,/turf/simulated/floor,/area/submap/pa_room)
+"cn" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/yellow/bordercorner,/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"co" = (/obj/machinery/power/tesla_coil,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/space)
+"cp" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cq" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cr" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/yellow/border{dir = 6},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cs" = (/obj/machinery/power/emitter{anchored = 1; dir = 1; state = 1},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/space)
+"ct" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eng_south_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 26; req_one_access = list(10,11,13)},/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_south_outer"; locked = 1; name = "Engine South Airlock Exterior"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
+"cu" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eng_south_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eng_south_sensor"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
+"cv" = (/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_south_inner"; locked = 1; name = "Engine South Airlock Interior"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eng_south_airlock"; name = "interior access button"; pixel_x = 8; pixel_y = -26; req_one_access = list(10,11)},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
+"cw" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/yellow/bordercorner2,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cx" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/yellow/border{dir = 6},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cy" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/space)
+"cz" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/space)
+"cA" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/rust,/turf/simulated/floor/airless,/area/space)
+"cB" = (/obj/structure/closet/emcloset,/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eng_south_airlock"; pixel_x = 24; pixel_y = 0; req_one_access = list(10,11); tag_airpump = "eng_south_pump"; tag_chamber_sensor = "eng_south_sensor"; tag_exterior_door = "eng_south_outer"; tag_interior_door = "eng_south_inner"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
+"cC" = (/turf/simulated/wall/r_wall,/area/space)
+"cD" = (/obj/structure/lattice,/obj/machinery/power/grounding_rod,/turf/space,/area/space)
+"cE" = (/obj/machinery/door/blast/regular{density = 0; dir = 2; icon_state = "pdoor0"; id = "SupermatterPort"; layer = 2.7; name = "Reactor Blast Door"; opacity = 0},/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor,/area/engineering/engine_room)
+"cF" = (/obj/machinery/power/emitter{anchored = 1; state = 1},/obj/structure/cable/cyan,/turf/simulated/floor/airless,/area/space)
+"cG" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/submap/pa_room)
+"cH" = (/obj/machinery/door/airlock/glass_engineering,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/submap/pa_room)
+"cI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cK" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/space)
+"cL" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless,/area/space)
+"cM" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/engineering/engine_room)
+"cN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/space)
+"cQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/airless,/area/space)
(1,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(2,1,1) = {"
-aa
-aa
-ab
-ac
-ac
-ac
-ad
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-aa
-"}
-(3,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ac
-ab
-ab
-ab
-ab
-ab
-cD
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-cD
-ab
-ab
-ab
-ab
-ab
-ad
-ab
-aa
-"}
-(4,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ac
-ab
-ab
-ab
-ab
-ab
-ad
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ad
-ab
-ab
-ab
-ab
-ad
-ad
-ab
-aa
-"}
-(5,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ac
-aj
-ab
-ab
-ab
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-cS
-aj
-aj
-ab
-ab
-ab
-aj
-cC
-ab
-aa
-"}
-(6,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ac
-ak
-cF
-ab
-ab
-aj
-aX
-ab
-ab
-aX
-ab
-ab
-ab
-ab
-aX
-aj
-ab
-ab
-cs
-cy
-cC
-ab
-aa
-"}
-(7,1,1) = {"
-aa
-aa
-ab
-ad
-ab
-ab
-ab
-ac
-al
-aj
-ad
-ad
-aj
-ab
-ab
-ab
-ad
-ab
-ab
-ab
-ab
-ab
-aj
-ad
-ad
-aj
-al
-cC
-ab
-aa
-"}
-(8,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ac
-al
-aj
-ab
-ab
-aj
-ab
-ab
-ab
-ad
-ad
-ad
-ab
-ab
-ab
-aj
-ab
-ab
-aj
-al
-cC
-ab
-aa
-"}
-(9,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ac
-al
-aj
-ab
-ab
-aj
-ab
-ab
-cR
-aj
-aj
-aj
-ad
-ad
-aX
-aj
-ab
-ab
-aj
-al
-cC
-ab
-aa
-"}
-(10,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ac
-al
-aj
-ab
-ab
-co
-ab
-ab
-ad
-aj
-bE
-aj
-ad
-ab
-ab
-co
-ab
-ab
-aj
-al
-cC
-ab
-aa
-"}
-(11,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ac
-al
-aj
-ab
-ab
-cK
-aX
-ad
-ad
-aj
-aj
-aj
-ad
-ab
-ab
-cK
-ab
-ab
-aj
-al
-cC
-aa
-aa
-"}
-(12,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ac
-al
-aj
-ab
-ab
-cK
-ab
-ab
-ab
-ad
-ad
-ad
-ab
-ab
-ab
-cK
-ab
-ab
-aj
-al
-cC
-aa
-aa
-"}
-(13,1,1) = {"
-aa
-aa
-ab
-ab
-ab
-ab
-ab
-ac
-al
-aj
-ad
-ad
-cK
-ab
-ab
-ab
-ab
-ab
-ad
-ab
-ab
-ab
-cK
-ad
-ad
-aj
-al
-cC
-aa
-aa
-"}
-(14,1,1) = {"
-aa
-aa
-ab
-ab
-ab
-ab
-ab
-ac
-am
-ar
-ab
-ab
-cK
-aX
-ab
-ab
-ab
-ab
-aX
-ab
-ab
-aX
-cK
-ab
-ab
-cs
-cz
-cC
-aa
-aa
-"}
-(15,1,1) = {"
-aa
-aa
-ab
-ab
-ab
-ab
-ab
-ac
-al
-ad
-ab
-ab
-cL
-cN
-cN
-cO
-cN
-cP
-cN
-cO
-cN
-cN
-cQ
-ab
-ab
-ad
-al
-cC
-aa
-aa
-"}
-(16,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ac
-an
-as
-aB
-ab
-ab
-ab
-bf
-bn
-bn
-bF
-bP
-bP
-bZ
-ab
-ab
-ab
-aB
-ak
-cA
-cC
-aa
-aa
-"}
-(17,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-af
-af
-at
-af
-aG
-aG
-aG
-bg
-bo
-bw
-bQ
-bW
-bX
-bg
-aG
-aG
-aG
-af
-ct
-af
-af
-aa
-aa
-"}
-(18,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-af
-ao
-au
-af
-aH
-cE
-aP
-bg
-bp
-bx
-bG
-bR
-ca
-bg
-aP
-cE
-cm
-af
-cu
-cB
-af
-aa
-aa
-"}
-(19,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-af
-af
-av
-aC
-aI
-aQ
-aY
-bh
-bq
-by
-bH
-bS
-ca
-bh
-aI
-ch
-aY
-aC
-cv
-af
-aC
-aa
-aa
-"}
-(20,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ab
-af
-aw
-aD
-aJ
-aR
-aZ
-bi
-br
-bz
-bI
-bT
-cd
-bi
-cc
-ci
-aJ
-aD
-cw
-af
-aa
-aa
-aa
-"}
-(21,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ab
-af
-ax
-aE
-aK
-aS
-ba
-bj
-bs
-bA
-bJ
-bU
-cG
-cH
-cI
-cJ
-cn
-aE
-cx
-af
-aa
-aa
-aa
-"}
-(22,1,1) = {"
-aa
-aa
-ab
-ad
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-aL
-aT
-bb
-bi
-bt
-bB
-bK
-bV
-bY
-bi
-ce
-aT
-cM
-af
-af
-af
-aa
-aa
-aa
-"}
-(23,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ae
-ag
-ag
-ay
-ae
-aM
-aU
-bc
-bi
-bi
-bC
-bL
-bC
-bi
-bi
-cf
-cj
-cp
-af
-aa
-aa
-aa
-aa
-aa
-"}
-(24,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ae
-ah
-ap
-az
-aF
-aN
-aV
-bd
-bk
-bk
-bD
-bM
-bD
-bk
-bk
-cg
-ck
-cq
-af
-aa
-aa
-aa
-aa
-aa
-"}
-(25,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ae
-ai
-aq
-aA
-ae
-aO
-aW
-be
-bl
-aE
-aE
-bN
-aE
-aE
-cb
-ba
-cl
-cr
-af
-aa
-aa
-aa
-aa
-aa
-"}
-(26,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-bm
-aa
-aa
-aa
-aa
-aa
-bm
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(27,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-bm
-bu
-aa
-aa
-aa
-aa
-bm
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(28,1,1) = {"
-aa
-aa
-ab
-ac
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
-bv
-aa
-bO
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(29,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(30,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaabababababababababababababababababababababababababababaaaa
+aaacacacacacadacacacacacabababacacacacacacadacacacacacacaaaa
+aaacababababababababababababababababababababababababababaaaa
+aaacababababababababababababababababababababababababababaaaa
+aaadabababababababababababababababababababaeaeaeaeaeababaaaa
+aaacacacacacacacacacacacacacacacafafafababaeagahaiaeababaaaa
+aaacababajajajakalalalamalalalanafaoafafafaeagapaqaeababaaaa
+aaacabababajajcFajajajarajajadasatauavawaxaeayazaAaaaaaaaaaa
+aaacababababadabababababadababaBafafaCaDaEaeaeaFaeaaaaaaaaaa
+aaacababababcDabababababcDabababababcEaJaKaLaMaNaOaaaaaaaaaa
+aaacababababadabababababadabababababcEaQaRaSaUaVaWaaaaaaaaaa
+aaacadadadajcocKcKaIcKcKaIcLababababcEaGbabbbcaZbeaaaaaaaaaa
+aaacabababajadadadadadadadcNabaYbPbPbhbibjbibibkblbmbmaaaaaa
+aaacabababajadaXadadadaXadcNabbnbobfbqbrbsbtbibkaEaabubvaaaa
+aaacabababajadadajajajadadcNadbnbwbxbybzbAbBbCbDaEaaaaaaaaaa
+aaacabababajadadajbEajadadaPcKbFbQbGbHbIbJbKbLbMbNaaaabOaaaa
+aaacabababajadadajajajadadcNadbnbWbRbSbTbUbVbCbDaEaaaaaaaaaa
+aaacabababajadaXadadadaXadcNabbnbXcacacdcGbYbibkaEaaaaaaaaaa
+aaacabababajadadadadadadadcNabbdcmcmbhbicHbibibkcbbmbmaaaaaa
+aaacadadadajcocKcKaIcKcKaIcQababababcEaHcIcecfcgbaaaaaaaaaaa
+aaacababababadabababababadabababababcEccchaTcjckclaaaaaaaaaa
+aaacababababcDabababababcDabababababcEaJcncMcpcqcraaaaaaaaaa
+aaacababababadabababababadababaBafafaCciaEafafafafaaaaaaaaaa
+aaacabababajajcsajajajcsajajadakctcucvcwcxafaaaaaaaaaaaaaaaa
+aaacabadajajajcyalalalczalalalcAafcBafafafafaaaaaaaaaaaaaaaa
+aaacadadcCcCcCcCcCcCcCcCcCcCcCcCafafaCaaaaaaaaaaaaaaaaaaaaaa
+aaacababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
diff --git a/maps/submaps/surface_submaps/mountains/deadspy.dmm b/maps/submaps/surface_submaps/mountains/deadspy.dmm
new file mode 100644
index 0000000000..f22e0d3e61
--- /dev/null
+++ b/maps/submaps/surface_submaps/mountains/deadspy.dmm
@@ -0,0 +1,32 @@
+"a" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/mask/gas,/obj/item/clothing/suit/fire/firefighter,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"b" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"c" = (/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/obj/effect/decal/cleanable/molten_item,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"d" = (/obj/item/weapon/flamethrower,/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"e" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"f" = (/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"g" = (/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/obj/effect/decal/cleanable/ash,/obj/random/landmine,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"h" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/random/landmine,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"i" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/molten_item,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"j" = (/obj/item/weapon/material/butterfly,/obj/effect/decal/cleanable/liquid_fuel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"k" = (/obj/effect/decal/remains/human,/obj/item/weapon/wrench,/obj/item/clothing/head/hardhat,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"l" = (/obj/item/weapon/flame/lighter/zippo,/obj/effect/decal/cleanable/liquid_fuel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"m" = (/obj/effect/decal/remains/human,/obj/item/clothing/mask/balaclava,/obj/item/clothing/under/suit_jacket/really_black,/obj/effect/decal/cleanable/ash,/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/ash,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"n" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/ash,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"o" = (/obj/machinery/porta_turret/poi{desc = "Looking at this heavy caliber, tripod-mounted, little ol' number makes you want to square-dance."; lethal = 0; name = "sentry turret"},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"p" = (/obj/item/weapon/deadringer,/obj/effect/decal/cleanable/liquid_fuel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"q" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/liquid_fuel,/obj/random/landmine,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"r" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/item/weapon/storage/fancy/cigarettes/professionals,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"s" = (/obj/item/weapon/card/emag_broken,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"t" = (/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/obj/random/landmine,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"u" = (/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/obj/effect/decal/cleanable/ash,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"v" = (/turf/simulated/mineral,/area/submap/deadspy)
+
+(1,1,1) = {"
+abbbbvv
+bcdefgb
+bfhijfk
+bflmnfo
+vfpqrfs
+vtfuffb
+vvbbbvb
+"}
diff --git a/maps/submaps/surface_submaps/mountains/mountains.dm b/maps/submaps/surface_submaps/mountains/mountains.dm
index dd409e0e62..56a267c475 100644
--- a/maps/submaps/surface_submaps/mountains/mountains.dm
+++ b/maps/submaps/surface_submaps/mountains/mountains.dm
@@ -31,6 +31,7 @@
#include "SupplyDrop1.dmm"
#include "BlastMine1.dmm"
#include "crashedcontainmentshuttle.dmm"
+#include "deadspy.dmm"
#endif
// The 'mountains' is the mining z-level, and has a lot of caves.
@@ -191,6 +192,12 @@
mappath = 'maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm'
cost = 30
+/datum/map_template/surface/mountains/normal/deadspy
+ name = "Spy Remains"
+ desc = "W+M1 = Salt."
+ mappath = 'maps/submaps/surface_submaps/mountains/deadspy.dmm'
+ cost = 15
+
/**************
* Deep Caves *
@@ -265,4 +272,3 @@
desc = "An abandoned blast mining site, seems that local wildlife has moved in."
mappath = 'maps/submaps/surface_submaps/mountains/BlastMine1.dmm'
cost = 20
-
diff --git a/maps/submaps/surface_submaps/mountains/mountains_areas.dm b/maps/submaps/surface_submaps/mountains/mountains_areas.dm
index 3baf48c75c..f1045f22f0 100644
--- a/maps/submaps/surface_submaps/mountains/mountains_areas.dm
+++ b/maps/submaps/surface_submaps/mountains/mountains_areas.dm
@@ -88,4 +88,7 @@
name = "Blast Mine 1"
/area/submap/crashedcontainmentshuttle
- name = "Crashed Containment Shuttle"
\ No newline at end of file
+ name = "Crashed Containment Shuttle"
+
+/area/submap/deadspy
+ name = "Dead Spy"
\ No newline at end of file
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index af7ce40fab..c65cbe8d59 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -27791,6 +27791,14 @@
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/tiled,
/area/tether/surfacebase/public_garden)
+"kCO" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/reinforced{
+ name = "Holodeck Projector Floor"
+ },
+/area/crew_quarters/sleep/Dorm_3/holo)
"kOB" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled,
@@ -28023,6 +28031,14 @@
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/public_garden)
+"oUC" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/reinforced{
+ name = "Holodeck Projector Floor"
+ },
+/area/crew_quarters/sleep/Dorm_1/holo)
"piN" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 4
@@ -28082,6 +28098,14 @@
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/public_garden)
+"qBH" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/reinforced{
+ name = "Holodeck Projector Floor"
+ },
+/area/crew_quarters/sleep/Dorm_7/holo)
"qGm" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -28475,6 +28499,14 @@
/obj/random/maintenance/research,
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/public_garden_maintenence)
+"wUS" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/reinforced{
+ name = "Holodeck Projector Floor"
+ },
+/area/crew_quarters/sleep/Dorm_5/holo)
"wYi" = (
/turf/simulated/floor/plating,
/area/maintenance/lower/public_garden_maintenence)
@@ -41690,19 +41722,19 @@ aCI
aCI
cgS
cgY
-cgY
+qBH
cgY
cgS
chL
-chL
+wUS
chL
chM
ciz
-ciz
+kCO
ciz
ciA
cjl
-cjl
+oUC
cjl
cjm
aah
diff --git a/maps/tether/tether-06-station2.dmm b/maps/tether/tether-06-station2.dmm
index 40bb62f291..97f2969b47 100644
--- a/maps/tether/tether-06-station2.dmm
+++ b/maps/tether/tether-06-station2.dmm
@@ -295,7 +295,14 @@
/turf/simulated/floor,
/area/security/riot_control)
"aF" = (
-/obj/random/trash,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/railing{
+ icon_state = "railing0";
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 8
+ },
/turf/simulated/floor/tiled/dark,
/area/security/brig)
"aG" = (
@@ -422,6 +429,12 @@
/turf/simulated/wall/r_wall,
/area/security/brig)
"aT" = (
+/obj/structure/sink{
+ dir = 4;
+ icon_state = "sink";
+ pixel_x = 11;
+ pixel_y = 0
+ },
/turf/simulated/floor/tiled/freezer,
/area/security/brig/bathroom)
"aU" = (
@@ -983,7 +996,6 @@
/turf/simulated/floor/tiled,
/area/security/brig)
"bE" = (
-/obj/item/weapon/stool/padded,
/obj/structure/disposalpipe/segment,
/obj/effect/floor_decal/borderfloor/corner{
dir = 4
@@ -997,6 +1009,9 @@
icon_state = "bordercolorcorner";
dir = 4
},
+/obj/structure/bed/chair{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/security/brig)
"bF" = (
@@ -1070,6 +1085,12 @@
pixel_y = -8;
req_access = list(1,2)
},
+/obj/structure/sink{
+ icon_state = "sink";
+ dir = 8;
+ pixel_x = -12;
+ pixel_y = 2
+ },
/turf/simulated/floor/tiled,
/area/security/brig)
"bJ" = (
@@ -1276,24 +1297,33 @@
/turf/simulated/wall/r_wall,
/area/engineering/shaft)
"bX" = (
-/turf/space,
-/obj/structure/shuttle/engine/propulsion{
- dir = 8;
- icon_state = "propulsion_l"
- },
-/turf/simulated/shuttle/plating/airless/carry,
-/area/shuttle/large_escape_pod1/station{
- base_turf = /turf/simulated/mineral/floor/vacuum
- })
-"bY" = (
-/turf/space,
-/obj/structure/shuttle/engine/propulsion{
+/obj/random/trash,
+/obj/structure/railing{
dir = 8
},
-/turf/simulated/shuttle/plating/airless/carry,
-/area/shuttle/large_escape_pod1/station{
- base_turf = /turf/simulated/mineral/floor/vacuum
- })
+/obj/structure/railing,
+/turf/simulated/floor/tiled/dark,
+/area/security/brig)
+"bY" = (
+/obj/effect/floor_decal/borderfloor/shifted{
+ icon_state = "borderfloor_shifted";
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/lightorange/border/shifted{
+ icon_state = "bordercolor_shifted";
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/lightorange{
+ icon_state = "corner_white";
+ dir = 5
+ },
+/obj/machinery/light/small{
+ icon_state = "bulb1";
+ dir = 1
+ },
+/obj/structure/bed/padded,
+/turf/simulated/floor/tiled,
+/area/security/security_cell_hallway)
"bZ" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -1314,15 +1344,27 @@
/turf/simulated/floor/tiled,
/area/security/brig)
"ca" = (
-/turf/space,
-/obj/structure/shuttle/engine/propulsion{
- dir = 8;
- icon_state = "propulsion_r"
+/obj/effect/floor_decal/borderfloor/shifted{
+ icon_state = "borderfloor_shifted";
+ dir = 1
},
-/turf/simulated/shuttle/plating/airless/carry,
-/area/shuttle/large_escape_pod1/station{
- base_turf = /turf/simulated/mineral/floor/vacuum
- })
+/obj/effect/floor_decal/corner/lightorange/border/shifted{
+ icon_state = "bordercolor_shifted";
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/lightorange{
+ icon_state = "corner_white";
+ dir = 5
+ },
+/obj/machinery/light/small{
+ icon_state = "bulb1";
+ dir = 1
+ },
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet,
+/obj/item/weapon/pen/crayon/green,
+/turf/simulated/floor/tiled/dark,
+/area/security/brig)
"cb" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/unary/outlet_injector{
@@ -1334,6 +1376,39 @@
/obj/effect/floor_decal/industrial/outline/yellow,
/turf/simulated/floor/tiled/steel_dirty,
/area/security/brig)
+"cc" = (
+/obj/effect/floor_decal/borderfloor/shifted{
+ icon_state = "borderfloor_shifted";
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/lightorange/border/shifted{
+ icon_state = "bordercolor_shifted";
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/lightorange{
+ icon_state = "corner_white";
+ dir = 5
+ },
+/obj/machinery/light/small{
+ icon_state = "bulb1";
+ dir = 1
+ },
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet,
+/turf/simulated/floor/tiled/dark,
+/area/security/brig)
+"cd" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/table/steel,
+/obj/item/weapon/storage/laundry_basket,
+/turf/simulated/floor/tiled/steel_dirty,
+/area/security/brig)
+"ce" = (
+/obj/machinery/washing_machine,
+/turf/simulated/floor/tiled/steel_dirty,
+/area/security/brig)
"cf" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -1376,6 +1451,82 @@
/obj/structure/ladder,
/turf/simulated/floor/plating,
/area/engineering/shaft)
+"cl" = (
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/door/airlock/security{
+ name = "Interrogation";
+ req_access = newlist();
+ req_one_access = list(2,4)
+ },
+/turf/simulated/floor/tiled/dark,
+/area/security/interrogation)
+"cm" = (
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/door/blast/regular{
+ density = 0;
+ dir = 4;
+ icon_state = "pdoor0";
+ id = "brig_lockdown";
+ name = "Security Blast Doors";
+ opacity = 0
+ },
+/obj/machinery/door/airlock/glass_security{
+ id_tag = "briginner";
+ name = "Brig";
+ req_access = list(2);
+ req_one_access = newlist()
+ },
+/turf/simulated/floor/tiled,
+/area/security/brig)
+"cn" = (
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/atmospherics/pipe/simple/hidden/green,
+/obj/machinery/door/blast/regular{
+ density = 0;
+ dir = 4;
+ icon_state = "pdoor0";
+ id = "brig_lockdown";
+ name = "Security Blast Doors";
+ opacity = 0
+ },
+/obj/structure/disposalpipe/segment,
+/obj/machinery/door/airlock/glass_security{
+ id_tag = "briginner";
+ name = "Brig";
+ req_access = list(2);
+ req_one_access = newlist()
+ },
+/turf/simulated/floor/tiled,
+/area/security/brig)
+"co" = (
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/glass_security{
+ name = "Brig Cells";
+ req_access = newlist();
+ req_one_access = list(2,4)
+ },
+/turf/simulated/floor/tiled,
+/area/security/security_cell_hallway)
"cp" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -1385,6 +1536,16 @@
},
/turf/simulated/floor/tiled,
/area/security/brig/visitation)
+"cq" = (
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/door/airlock/glass_security{
+ name = "Brig Cells";
+ req_access = newlist();
+ req_one_access = list(2,4)
+ },
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor/tiled,
+/area/security/security_cell_hallway)
"cr" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -1394,6 +1555,96 @@
},
/turf/simulated/floor/tiled,
/area/security/brig)
+"cs" = (
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/door/airlock/glass_security{
+ id_tag = "brigouter";
+ name = "Brig";
+ req_access = list(2);
+ req_one_access = newlist()
+ },
+/turf/simulated/floor/tiled,
+/area/security/brig)
+"ct" = (
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/security/security_cell_hallway)
+"cu" = (
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/green{
+ icon_state = "intact";
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/door/airlock/glass_security{
+ id_tag = "brigouter";
+ name = "Brig";
+ req_access = list(2);
+ req_one_access = newlist()
+ },
+/turf/simulated/floor/tiled,
+/area/security/brig)
+"cv" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/green{
+ icon_state = "intact";
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/button/remote/airlock{
+ id = "brigouter";
+ name = "Outer Brig Doors";
+ pixel_x = 6;
+ pixel_y = -24
+ },
+/obj/machinery/button/remote/airlock{
+ id = "briginner";
+ name = "Inner Brig Doors";
+ pixel_x = -6;
+ pixel_y = -24
+ },
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/security/security_cell_hallway)
"cw" = (
/obj/effect/floor_decal/borderfloor/shifted{
icon_state = "borderfloor_shifted";
@@ -1417,25 +1668,24 @@
/turf/simulated/floor/tiled,
/area/security/security_cell_hallway)
"cx" = (
-/obj/effect/floor_decal/borderfloor/shifted{
- icon_state = "borderfloor_shifted";
- dir = 1
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
},
-/obj/effect/floor_decal/corner/lightorange/border/shifted{
- icon_state = "bordercolor_shifted";
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
},
-/obj/effect/floor_decal/corner/lightorange{
- icon_state = "corner_white";
- dir = 5
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
},
-/obj/structure/bed,
-/obj/machinery/light/small{
- icon_state = "bulb1";
- dir = 1
+/obj/machinery/door/airlock/security{
+ name = "Observation";
+ req_one_access = list(1,4)
},
-/turf/simulated/floor/tiled,
-/area/security/security_cell_hallway)
+/turf/simulated/floor/tiled/dark,
+/area/security/interrogation)
"cy" = (
/obj/effect/floor_decal/borderfloor/shifted{
icon_state = "borderfloor_shifted";
@@ -1475,6 +1725,7 @@
dir = 4;
pixel_x = 24
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled,
/area/security/security_cell_hallway)
"cA" = (
@@ -1582,25 +1833,15 @@
/turf/simulated/floor/tiled/dark,
/area/security/brig)
"cL" = (
-/obj/effect/floor_decal/borderfloor/shifted{
- icon_state = "borderfloor_shifted";
- dir = 1
+/turf/space,
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8;
+ icon_state = "propulsion_l"
},
-/obj/effect/floor_decal/corner/lightorange/border/shifted{
- icon_state = "bordercolor_shifted";
- dir = 1
- },
-/obj/effect/floor_decal/corner/lightorange{
- icon_state = "corner_white";
- dir = 5
- },
-/obj/structure/bed,
-/obj/machinery/light/small{
- icon_state = "bulb1";
- dir = 1
- },
-/turf/simulated/floor/tiled/dark,
-/area/security/brig)
+/turf/simulated/shuttle/plating/airless/carry,
+/area/shuttle/large_escape_pod1/station{
+ base_turf = /turf/simulated/mineral/floor/vacuum
+ })
"cM" = (
/obj/effect/floor_decal/borderfloor/shifted{
icon_state = "borderfloor_shifted";
@@ -1744,6 +1985,15 @@
},
/turf/simulated/floor/tiled/dark,
/area/security/recstorage)
+"cW" = (
+/turf/space,
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8
+ },
+/turf/simulated/shuttle/plating/airless/carry,
+/area/shuttle/large_escape_pod1/station{
+ base_turf = /turf/simulated/mineral/floor/vacuum
+ })
"cX" = (
/obj/machinery/door/firedoor/glass,
/obj/structure/cable/green{
@@ -1975,6 +2225,16 @@
/obj/machinery/door/window/brigdoor/eastright,
/turf/simulated/floor/tiled,
/area/security/brig/visitation)
+"dm" = (
+/turf/space,
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8;
+ icon_state = "propulsion_r"
+ },
+/turf/simulated/shuttle/plating/airless/carry,
+/area/shuttle/large_escape_pod1/station{
+ base_turf = /turf/simulated/mineral/floor/vacuum
+ })
"dn" = (
/obj/effect/floor_decal/industrial/warning,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -2245,6 +2505,7 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled,
/area/security/brig/visitation)
"dM" = (
@@ -2569,6 +2830,7 @@
/area/security/brig)
"es" = (
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled/steel_dirty,
/area/security/brig)
"ev" = (
@@ -2748,12 +3010,6 @@
},
/turf/simulated/floor/tiled,
/area/security/brig)
-"eV" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/simulated/floor/tiled/steel_dirty,
-/area/security/brig)
"fc" = (
/obj/effect/floor_decal/borderfloor{
dir = 4
@@ -3319,30 +3575,6 @@
"gw" = (
/turf/simulated/open,
/area/engineering/locker_room)
-"gx" = (
-/obj/machinery/door/firedoor/glass,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/door/blast/regular{
- density = 0;
- dir = 4;
- icon_state = "pdoor0";
- id = "brig_lockdown";
- name = "Security Blast Doors";
- opacity = 0
- },
-/obj/machinery/door/airlock/glass_security{
- id_tag = "brigouter";
- name = "Brig";
- req_access = list(2)
- },
-/turf/simulated/floor/tiled,
-/area/security/brig)
"gy" = (
/obj/effect/floor_decal/borderfloor{
dir = 1;
@@ -3359,30 +3591,6 @@
},
/turf/simulated/floor/tiled,
/area/security/security_cell_hallway)
-"gB" = (
-/obj/machinery/door/firedoor/glass,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/door/airlock/glass_security{
- name = "Brig Cells";
- req_access = list(1)
- },
-/turf/simulated/floor/tiled,
-/area/security/security_cell_hallway)
-"gC" = (
-/obj/machinery/door/firedoor/glass,
-/obj/machinery/door/airlock/glass_security{
- name = "Brig Cells";
- req_access = list(1)
- },
-/obj/structure/disposalpipe/segment,
-/turf/simulated/floor/tiled,
-/area/security/security_cell_hallway)
"gE" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 1
@@ -3578,6 +3786,7 @@
/obj/effect/floor_decal/corner/red/bordercorner2{
dir = 1
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled,
/area/security/security_cell_hallway)
"gX" = (
@@ -4057,24 +4266,6 @@
},
/turf/simulated/floor/tiled,
/area/security/security_cell_hallway)
-"hX" = (
-/obj/machinery/door/firedoor/glass,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/structure/cable/green{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/security{
- name = "Observation"
- },
-/turf/simulated/floor/tiled/dark,
-/area/security/interrogation)
"hY" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
@@ -16886,32 +17077,6 @@
},
/turf/simulated/floor/tiled,
/area/security/security_cell_hallway)
-"FO" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/green{
- icon_state = "intact";
- dir = 4
- },
-/obj/structure/cable/green{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/security/security_cell_hallway)
"FR" = (
/obj/effect/floor_decal/rust,
/obj/random/junk,
@@ -16948,33 +17113,6 @@
},
/turf/simulated/floor/tiled/dark,
/area/tether/station/public_meeting_room)
-"Gl" = (
-/obj/machinery/door/firedoor/glass,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/green{
- icon_state = "intact";
- dir = 4
- },
-/obj/structure/cable/green{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/glass_security{
- id_tag = "briginner";
- name = "Brig";
- req_access = list(2)
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/security/brig)
"Go" = (
/obj/effect/floor_decal/rust,
/turf/simulated/floor/plating,
@@ -17259,15 +17397,6 @@
/obj/machinery/door/firedoor/glass,
/turf/simulated/floor/plating,
/area/maintenance/station/sec_lower)
-"JI" = (
-/obj/machinery/door/firedoor/glass,
-/obj/machinery/door/airlock/glass_security{
- id_tag = "briginner";
- name = "Brig";
- req_access = list(2)
- },
-/turf/simulated/floor/tiled,
-/area/security/brig)
"JK" = (
/obj/structure/cable{
d1 = 1;
@@ -18028,14 +18157,6 @@
/obj/structure/closet/emcloset,
/turf/simulated/floor,
/area/maintenance/station/sec_lower)
-"Qe" = (
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/turf/simulated/floor/tiled,
-/area/security/security_cell_hallway)
"Qk" = (
/obj/effect/floor_decal/rust,
/obj/random/trash,
@@ -18785,20 +18906,6 @@
},
/turf/simulated/floor/tiled,
/area/security/security_cell_hallway)
-"Vu" = (
-/obj/machinery/door/firedoor/glass,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/door/airlock/security{
- name = "Interrogation";
- req_access = list(2)
- },
-/turf/simulated/floor/tiled/dark,
-/area/security/interrogation)
"Vw" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -18824,25 +18931,6 @@
},
/turf/simulated/floor/tiled,
/area/tether/station/public_meeting_room)
-"VB" = (
-/obj/machinery/door/firedoor/glass,
-/obj/machinery/atmospherics/pipe/simple/hidden/green,
-/obj/machinery/door/blast/regular{
- density = 0;
- dir = 4;
- icon_state = "pdoor0";
- id = "brig_lockdown";
- name = "Security Blast Doors";
- opacity = 0
- },
-/obj/machinery/door/airlock/glass_security{
- id_tag = "brigouter";
- name = "Brig";
- req_access = list(2)
- },
-/obj/structure/disposalpipe/segment,
-/turf/simulated/floor/tiled,
-/area/security/brig)
"VF" = (
/obj/machinery/door/firedoor/glass,
/obj/structure/cable/green{
@@ -26639,7 +26727,7 @@ eq
eQ
dn
IZ
-gx
+cm
HK
Xx
hQ
@@ -26781,7 +26869,7 @@ bB
bE
dQ
Ye
-VB
+cn
YK
Nc
hQ
@@ -26924,8 +27012,8 @@ bF
ZH
Fb
Rq
-JI
-Gl
+cs
+cu
hQ
Er
jg
@@ -27066,8 +27154,8 @@ cP
Em
Em
YE
-Qe
-FO
+ct
+cv
TY
TY
jh
@@ -27204,8 +27292,8 @@ bK
dp
Jc
bK
-eV
-bK
+cd
+ce
bK
Zu
Ng
@@ -27477,8 +27565,8 @@ at
Et
HP
aS
-am
aF
+bX
aS
cK
cO
@@ -27622,16 +27710,16 @@ aS
Ew
am
aS
-cL
+ca
cQ
aS
-cL
+cc
cQ
aS
-cL
+cc
cQ
aS
-cL
+cc
cQ
aS
gy
@@ -28059,7 +28147,7 @@ KQ
bQ
bd
KQ
-gB
+co
gX
hu
FI
@@ -28201,7 +28289,7 @@ Vm
fc
fI
ga
-gC
+cq
gY
hv
hW
@@ -28342,11 +28430,11 @@ dU
cU
fd
fd
-Vu
+cl
fd
fd
fd
-hX
+cx
fd
aj
jO
@@ -28614,10 +28702,10 @@ TW
WJ
RS
aj
-cx
+bY
cC
aj
-cx
+bY
cC
cA
cV
@@ -29946,11 +30034,11 @@ AN
AN
Bw
yY
-bX
-bY
-bY
-bY
-ca
+cL
+cW
+cW
+cW
+dm
yY
ac
ac
diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm
index 43f3805407..f5edc6a75c 100644
--- a/maps/tether/tether-07-station3.dmm
+++ b/maps/tether/tether-07-station3.dmm
@@ -34,7 +34,7 @@
/obj/machinery/light/small{
dir = 4
},
-/turf/simulated/floor,
+/turf/simulated/floor/tiled,
/area/security/eva)
"ah" = (
/obj/effect/floor_decal/borderfloorblack{
@@ -97,7 +97,7 @@
tag_exterior_door = "sec_fore_outer";
tag_interior_door = "sec_fore_inner"
},
-/turf/simulated/floor,
+/turf/simulated/floor/tiled,
/area/security/eva)
"al" = (
/obj/effect/floor_decal/borderfloorblack{
@@ -254,14 +254,20 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor/tiled,
/area/security/eva)
"ay" = (
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
/area/security/eva)
"az" = (
/obj/effect/floor_decal/borderfloorblack{
@@ -347,9 +353,6 @@
},
/turf/simulated/floor/tiled,
/area/security/range)
-"aF" = (
-/turf/simulated/floor,
-/area/security/eva)
"aG" = (
/obj/effect/floor_decal/borderfloor{
dir = 4
@@ -373,14 +376,17 @@
/obj/machinery/camera/network/security{
dir = 1
},
-/turf/simulated/floor,
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
/area/security/eva)
"aI" = (
/turf/simulated/wall,
/area/maintenance/station/sec_upper)
"aJ" = (
/obj/structure/lattice,
-/obj/structure/catwalk,
+/obj/structure/railing,
/turf/space,
/area/space)
"aK" = (
@@ -594,12 +600,15 @@
phorontanks = 0
},
/obj/machinery/light,
+/obj/effect/floor_decal/borderfloor/corner2,
+/obj/effect/floor_decal/corner/red/bordercorner2,
/turf/simulated/floor/tiled,
/area/security/eva)
"aX" = (
/obj/effect/floor_decal/borderfloor,
/obj/effect/floor_decal/corner/red/border,
/obj/machinery/portable_atmospherics/canister/oxygen,
+/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/tiled,
/area/security/eva)
"aY" = (
@@ -641,7 +650,7 @@
/obj/machinery/camera/network/engineering{
dir = 4
},
-/turf/simulated/floor,
+/turf/simulated/floor/tiled,
/area/security/eva)
"bc" = (
/turf/simulated/wall,
@@ -726,6 +735,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled/dark,
/area/security/armory/red)
"bm" = (
@@ -1015,6 +1025,7 @@
/obj/effect/landmark/start{
name = "Warden"
},
+/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/tiled/dark,
/area/security/warden)
"bF" = (
@@ -1076,19 +1087,8 @@
/turf/simulated/floor/tiled,
/area/security/hallwayaux)
"bJ" = (
-/obj/effect/floor_decal/borderfloor{
- dir = 6
- },
-/obj/effect/floor_decal/corner/red/border{
- dir = 6
- },
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 6
- },
-/obj/effect/floor_decal/corner/red/bordercorner2{
- dir = 6
- },
-/obj/machinery/suit_cycler/security,
+/obj/structure/closet/emcloset,
+/obj/effect/decal/cleanable/cobweb,
/turf/simulated/floor/tiled,
/area/security/eva)
"bK" = (
@@ -1132,6 +1132,7 @@
/obj/effect/floor_decal/borderfloor,
/obj/effect/floor_decal/corner/red/border,
/obj/machinery/light,
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled,
/area/security/hallwayaux)
"bP" = (
@@ -1289,6 +1290,12 @@
pixel_x = 22;
pixel_y = -24
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/security/warden)
"cd" = (
@@ -1439,6 +1446,7 @@
},
/obj/structure/window/reinforced,
/obj/structure/table/rack/shelf/steel,
+/obj/item/weapon/gun/energy/ionrifle/pistol,
/turf/simulated/floor/tiled/dark,
/area/security/armory/blue)
"cl" = (
@@ -1984,6 +1992,9 @@
pixel_y = -39;
req_access = list(3)
},
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/security/warden)
"dp" = (
@@ -2023,9 +2034,7 @@
/area/crew_quarters/heads/hos)
"du" = (
/obj/structure/table/woodentable,
-/obj/machinery/newscaster{
- layer = 3.3;
- pixel_x = 0;
+/obj/machinery/newscaster/security_unit{
pixel_y = -32
},
/turf/simulated/floor/tiled/dark,
@@ -2060,6 +2069,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled/dark,
/area/security/security_equiptment_storage)
"dA" = (
@@ -2496,6 +2506,7 @@
d2 = 8;
icon_state = "1-8"
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled/dark,
/area/crew_quarters/heads/hos)
"em" = (
@@ -3337,6 +3348,7 @@
icon_state = "1-8"
},
/obj/structure/disposalpipe/segment,
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled,
/area/security/hallway)
"fE" = (
@@ -3425,31 +3437,18 @@
/turf/simulated/floor/tiled/dark,
/area/security/evidence_storage)
"fM" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
},
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/effect/floor_decal/borderfloorwhite/corner2{
- dir = 6
- },
-/obj/effect/floor_decal/borderfloorwhite/corner2{
- dir = 5
- },
-/obj/effect/floor_decal/corner/white/bordercorner2{
- icon_state = "bordercolorcorner2";
- dir = 6
- },
-/obj/effect/floor_decal/corner/white/bordercorner2{
- icon_state = "bordercolorcorner2";
- dir = 5
- },
-/turf/simulated/floor/tiled/white,
-/area/security/forensics)
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor/tiled/dark,
+/area/security/armory/blue)
"fN" = (
/obj/machinery/door/firedoor/glass,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -3824,7 +3823,7 @@
frequency = 1379;
id_tag = "sec_fore_pump"
},
-/turf/simulated/floor,
+/turf/simulated/floor/tiled,
/area/security/eva)
"gy" = (
/turf/simulated/wall,
@@ -4123,21 +4122,26 @@
/turf/simulated/floor,
/area/security/eva)
"gZ" = (
-/obj/structure/closet/emcloset,
-/turf/simulated/floor,
-/area/security/eva)
-"ha" = (
/obj/machinery/alarm{
pixel_y = 22
},
-/obj/machinery/atmospherics/portables_connector,
-/obj/machinery/portable_atmospherics/canister/air/airlock,
-/turf/simulated/floor,
+/obj/structure/closet/emcloset,
+/turf/simulated/floor/tiled,
+/area/security/eva)
+"ha" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden{
+ dir = 1;
+ icon_state = "map"
+ },
+/obj/machinery/meter,
+/turf/simulated/floor/tiled,
/area/security/eva)
"hb" = (
-/obj/machinery/atmospherics/portables_connector,
+/obj/machinery/atmospherics/portables_connector{
+ dir = 8
+ },
/obj/machinery/portable_atmospherics/canister/air/airlock,
-/turf/simulated/floor,
+/turf/simulated/floor/tiled,
/area/security/eva)
"hc" = (
/obj/machinery/alarm{
@@ -4285,18 +4289,6 @@
"hr" = (
/turf/simulated/floor/tiled,
/area/security/eva)
-"hs" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 6
- },
-/turf/simulated/floor/tiled,
-/area/security/eva)
-"ht" = (
-/obj/machinery/atmospherics/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/simulated/floor/tiled,
-/area/security/eva)
"hu" = (
/obj/machinery/door/firedoor/glass,
/obj/machinery/door/blast/regular{
@@ -4318,22 +4310,15 @@
dir = 5;
icon_state = "intact"
},
-/turf/simulated/floor,
+/turf/simulated/floor/tiled,
/area/security/eva)
"hw" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden,
-/turf/simulated/floor,
-/area/security/eva)
-"hx" = (
+/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 9;
+ dir = 5;
icon_state = "intact"
},
-/obj/machinery/light/small{
- dir = 4;
- pixel_y = 0
- },
-/turf/simulated/floor,
+/turf/simulated/floor/tiled,
/area/security/eva)
"hy" = (
/turf/simulated/mineral/floor/cave,
@@ -4503,24 +4488,21 @@
},
/turf/simulated/floor/tiled,
/area/security/eva)
-"hO" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+"hP" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 9
- },
-/turf/simulated/floor/tiled,
-/area/security/eva)
-"hP" = (
-/obj/machinery/atmospherics/unary/vent_pump/on{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
},
/turf/simulated/floor/tiled,
/area/security/eva)
"hQ" = (
/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor,
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
/area/security/eva)
"hR" = (
/obj/machinery/door/firedoor/border_only,
@@ -4646,7 +4628,7 @@
"hZ" = (
/obj/machinery/door/airlock/maintenance/sec{
name = "Security Airlock Access";
- req_one_access = newlist()
+ req_access = list(1,2,18)
},
/turf/simulated/floor,
/area/security/eva)
@@ -4866,7 +4848,7 @@
dir = 5
},
/obj/structure/filingcabinet/chestdrawer,
-/obj/machinery/newscaster{
+/obj/machinery/newscaster/security_unit{
pixel_y = 32
},
/turf/simulated/floor/tiled/dark,
@@ -5540,17 +5522,15 @@
/turf/simulated/floor/tiled/dark,
/area/security/armory/blue)
"jh" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
},
-/turf/simulated/floor/tiled/dark,
-/area/security/armory/blue)
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor/tiled,
+/area/security/briefing_room)
"ji" = (
/obj/effect/floor_decal/borderfloorblack{
dir = 4
@@ -5942,12 +5922,6 @@
},
/turf/simulated/floor/tiled,
/area/security/hallwayaux)
-"jJ" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/simulated/open,
-/area/security/brig)
"jK" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -5987,11 +5961,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/table/woodentable,
-/obj/item/device/flashlight/lamp/green{
- dir = 2;
- pixel_x = -10;
- pixel_y = 12
- },
/obj/machinery/computer/skills{
icon_state = "laptop";
dir = 4
@@ -6128,6 +6097,11 @@
},
/obj/structure/table/woodentable,
/obj/item/weapon/stamp/hos,
+/obj/item/device/flashlight/lamp/green{
+ dir = 2;
+ pixel_x = -4;
+ pixel_y = 12
+ },
/turf/simulated/floor/carpet,
/area/crew_quarters/heads/hos)
"jY" = (
@@ -6206,13 +6180,6 @@
/obj/structure/sign/warning/secure_area,
/turf/simulated/wall/r_wall,
/area/security/armory/blue)
-"kg" = (
-/obj/machinery/light{
- icon_state = "tube1";
- dir = 8
- },
-/turf/simulated/open,
-/area/security/brig)
"kh" = (
/obj/structure/cable/green{
d1 = 1;
@@ -6267,8 +6234,14 @@
/turf/simulated/wall/r_wall,
/area/security/security_equiptment_storage)
"kp" = (
-/obj/machinery/light/small,
-/turf/simulated/floor,
+/obj/machinery/light,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor/tiled,
/area/security/eva)
"kq" = (
/obj/effect/floor_decal/borderfloor{
@@ -6482,6 +6455,9 @@
},
/obj/structure/closet/secure_closet/hos2,
/obj/machinery/light,
+/obj/machinery/keycard_auth{
+ pixel_y = -28
+ },
/turf/simulated/floor/wood,
/area/crew_quarters/heads/hos)
"kH" = (
@@ -6517,6 +6493,7 @@
/obj/machinery/shower{
pixel_y = 16
},
+/obj/structure/curtain/open/shower/security,
/turf/simulated/floor/tiled,
/area/security/security_bathroom)
"kK" = (
@@ -6702,6 +6679,9 @@
/obj/effect/floor_decal/borderfloorblack,
/obj/effect/floor_decal/borderfloorblack/corner2,
/obj/structure/table/rack/shelf/steel,
+/obj/item/clothing/glasses/hud/security,
+/obj/item/clothing/glasses/hud/security,
+/obj/item/clothing/glasses/hud/security,
/turf/simulated/floor/tiled/dark,
/area/security/security_equiptment_storage)
"lb" = (
@@ -6986,6 +6966,9 @@
/obj/structure/railing{
dir = 8
},
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/simulated/open,
/area/security/hallway)
"lC" = (
@@ -7537,6 +7520,7 @@
},
/obj/structure/table/steel,
/obj/item/weapon/storage/box/nifsofts_security,
+/obj/item/weapon/hand_labeler,
/turf/simulated/floor/tiled/dark,
/area/security/security_lockerroom)
"my" = (
@@ -7639,30 +7623,14 @@
/obj/machinery/camera/network/security{
dir = 1
},
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/simulated/open,
/area/security/hallway)
"mH" = (
/turf/simulated/wall/r_wall,
/area/security/hallway)
-"mI" = (
-/obj/structure/railing{
- dir = 1
- },
-/obj/machinery/light{
- icon_state = "tube1";
- dir = 8
- },
-/turf/simulated/open,
-/area/security/brig)
-"mJ" = (
-/obj/structure/railing{
- dir = 1
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/simulated/open,
-/area/security/brig)
"mK" = (
/obj/effect/floor_decal/borderfloor{
dir = 8
@@ -7864,7 +7832,7 @@
/area/security/breakroom)
"nf" = (
/obj/machinery/camera/network/security,
-/obj/machinery/newscaster{
+/obj/machinery/newscaster/security_unit{
pixel_y = 32
},
/turf/simulated/floor/wood,
@@ -7909,6 +7877,7 @@
/obj/effect/floor_decal/borderfloorblack/corner,
/obj/effect/floor_decal/corner/red/bordercorner,
/obj/structure/table/bench/steel,
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled/dark,
/area/security/security_lockerroom)
"nl" = (
@@ -8045,14 +8014,14 @@
/turf/simulated/floor/tiled,
/area/security/briefing_room)
"nu" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled,
-/area/security/briefing_room)
+/area/security/security_processing)
"nv" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
@@ -9549,7 +9518,10 @@
/turf/simulated/floor/tiled,
/area/security/hallway)
"pS" = (
-/obj/effect/floor_decal/rust,
+/obj/random/trash_pile,
+/obj/effect/decal/cleanable/cobweb{
+ icon_state = "cobweb2"
+ },
/turf/simulated/floor,
/area/maintenance/station/sec_upper)
"pT" = (
@@ -10363,6 +10335,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/turf/simulated/floor/tiled/white,
/area/security/forensics)
"rm" = (
@@ -11551,15 +11526,6 @@
/area/security/hallway)
"sW" = (
/obj/machinery/door/firedoor/glass,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 10
- },
/obj/machinery/door/blast/regular{
density = 0;
dir = 1;
@@ -11991,6 +11957,17 @@
dir = 8
},
/obj/machinery/vending/snack,
+/obj/machinery/embedded_controller/radio/airlock/airlock_controller{
+ frequency = 1379;
+ id_tag = "sec_fore_airlock";
+ pixel_x = 24;
+ pixel_y = 0;
+ req_one_access = list(13);
+ tag_airpump = "sec_fore_pump";
+ tag_chamber_sensor = "sec_fore_sensor";
+ tag_exterior_door = "sec_fore_outer";
+ tag_interior_door = "sec_fore_inner"
+ },
/turf/simulated/floor/tiled,
/area/hallway/station/upper)
"tt" = (
@@ -12575,8 +12552,8 @@
pixel_y = 24
},
/obj/structure/cable{
- icon_state = "0-2";
- d2 = 2
+ d2 = 8;
+ icon_state = "0-8"
},
/turf/simulated/floor/plating,
/area/storage/emergency_storage/emergency3)
@@ -13775,7 +13752,6 @@
/turf/simulated/floor/tiled,
/area/security/lobby)
"wk" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/cable/green{
d1 = 1;
@@ -13788,6 +13764,9 @@
icon_state = "1-2"
},
/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
/turf/simulated/floor/tiled,
/area/security/lobby)
"wl" = (
@@ -13797,11 +13776,13 @@
/obj/effect/landmark/start{
name = "Security Officer"
},
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 8
+ },
/turf/simulated/floor/tiled,
/area/security/lobby)
"wm" = (
/obj/machinery/door/firedoor/glass,
-/obj/machinery/atmospherics/unary/vent_pump/on,
/obj/machinery/door/blast/regular{
density = 0;
dir = 1;
@@ -14096,21 +14077,19 @@
icon_state = "tube1";
dir = 8
},
+/obj/machinery/newscaster/security_unit{
+ pixel_x = -32
+ },
/turf/simulated/floor/tiled,
/area/security/lobby)
"wP" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 5
- },
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled,
/area/security/lobby)
"wQ" = (
@@ -14126,21 +14105,22 @@
/obj/effect/floor_decal/corner/red/bordercorner2{
dir = 6
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
/obj/structure/table/reinforced,
/obj/item/weapon/paper_bin{
- pixel_x = -3;
+ pixel_x = 4;
pixel_y = 7
},
/obj/item/weapon/pen/blue{
pixel_x = 5;
pixel_y = 5
},
+/obj/machinery/button/remote/airlock{
+ id = "BrigFoyer";
+ name = "Brig Foyer";
+ pixel_x = -6;
+ pixel_y = 0;
+ req_access = list(1)
+ },
/turf/simulated/floor/tiled,
/area/security/lobby)
"wR" = (
@@ -14156,22 +14136,32 @@
/turf/simulated/floor/tiled,
/area/security/observation)
"wS" = (
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
},
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 10;
- icon_state = "borderfloorcorner2";
- pixel_x = 0
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
},
-/obj/effect/floor_decal/corner/red/bordercorner2{
- dir = 8
+/obj/structure/window/reinforced{
+ dir = 4
},
-/obj/effect/floor_decal/corner/red/bordercorner2{
- dir = 10
+/obj/effect/floor_decal/borderfloorwhite/corner2{
+ dir = 6
},
-/turf/simulated/floor/tiled,
-/area/security/lobby)
+/obj/effect/floor_decal/borderfloorwhite/corner2{
+ dir = 5
+ },
+/obj/effect/floor_decal/corner/white/bordercorner2{
+ icon_state = "bordercolorcorner2";
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/white/bordercorner2{
+ icon_state = "bordercolorcorner2";
+ dir = 5
+ },
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor/tiled/white,
+/area/security/forensics)
"wT" = (
/obj/structure/table/reinforced,
/obj/item/weapon/storage/box/cups,
@@ -14731,13 +14721,13 @@
dir = 8;
icon_state = "pipe-c"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 5
+ },
/turf/simulated/floor/tiled,
/area/security/lobby)
"xJ" = (
/obj/machinery/door/firedoor/glass,
-/obj/machinery/atmospherics/unary/vent_scrubber/on{
- dir = 1
- },
/obj/machinery/door/blast/regular{
density = 0;
dir = 1;
@@ -16440,9 +16430,6 @@
/turf/simulated/floor/tiled,
/area/hallway/station/upper)
"Ai" = (
-/obj/machinery/light{
- dir = 1
- },
/obj/effect/floor_decal/borderfloor{
dir = 1
},
@@ -17774,6 +17761,7 @@
dir = 1
},
/obj/machinery/computer/timeclock/premade/south,
+/obj/machinery/light,
/turf/simulated/floor/tiled,
/area/hallway/station/upper)
"Cn" = (
@@ -17856,6 +17844,10 @@
},
/turf/simulated/floor/tiled,
/area/hallway/station/upper)
+"Cu" = (
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor/tiled/dark,
+/area/lawoffice)
"Cv" = (
/obj/effect/floor_decal/borderfloor{
dir = 6
@@ -27242,9 +27234,158 @@
},
/turf/simulated/floor,
/area/maintenance/station/sec_upper)
+"Rf" = (
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 8
+ },
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 10;
+ icon_state = "borderfloorcorner2";
+ pixel_x = 0
+ },
+/obj/effect/floor_decal/corner/red/bordercorner2{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/red/bordercorner2{
+ dir = 10
+ },
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor/tiled,
+/area/security/lobby)
+"Rg" = (
+/obj/structure/catwalk,
+/turf/space,
+/area/space)
+"Rh" = (
+/obj/structure/lattice,
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/space,
+/area/space)
+"Ri" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/space,
+/area/space)
+"Rj" = (
+/obj/structure/railing,
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/space,
+/area/space)
+"Rk" = (
+/obj/effect/floor_decal/rust,
+/obj/effect/decal/cleanable/cobweb,
+/turf/simulated/floor,
+/area/maintenance/station/sec_upper)
+"Rl" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 6
+ },
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/red/bordercorner2{
+ dir = 6
+ },
+/obj/machinery/suit_cycler/security,
+/obj/machinery/meter,
+/turf/simulated/floor/tiled,
+/area/security/eva)
+"Rm" = (
+/obj/effect/decal/cleanable/cobweb,
+/turf/simulated/wall/r_wall,
+/area/security/lobby)
+"RB" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/dark,
+/area/security/warden)
+"Sa" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/security/eva)
"SW" = (
/turf/simulated/mineral/vacuum,
/area/space)
+"Un" = (
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor/carpet,
+/area/security/breakroom)
+"Up" = (
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/door/blast/regular{
+ density = 0;
+ dir = 1;
+ icon_state = "pdoor0";
+ id = "security_lockdown";
+ name = "Security Blast Doors";
+ opacity = 0
+ },
+/obj/machinery/door/airlock/maintenance/sec{
+ name = "Security Airlock Access";
+ req_access = list(1,2,18)
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/security/eva)
+"Ur" = (
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor/tiled,
+/area/security/eva)
+"Vn" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/security/lobby)
+"WY" = (
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor/tiled/dark,
+/area/security/evidence_storage)
+"XG" = (
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor/tiled,
+/area/security/eva)
+"ZO" = (
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
+/turf/simulated/floor/tiled,
+/area/security/eva)
(1,1,1) = {"
aa
@@ -31710,7 +31851,7 @@ fr
qd
fJ
rh
-fM
+wS
sO
tJ
qc
@@ -31847,7 +31988,7 @@ nh
ey
eH
ow
-oX
+Un
pB
qd
qz
@@ -32541,7 +32682,7 @@ ih
ix
ih
jb
-jh
+fM
ih
jF
bd
@@ -32666,7 +32807,7 @@ aa
ae
ae
ae
-aJ
+Rg
ae
ae
ab
@@ -32808,7 +32949,7 @@ aa
ad
aa
aa
-aJ
+Rg
aa
aa
ab
@@ -32949,8 +33090,8 @@ aa
aa
ad
aa
-aa
-aJ
+ed
+Rg
bh
aa
aa
@@ -33091,8 +33232,8 @@ aa
aa
ae
ae
-ae
aJ
+Rg
bh
aa
aa
@@ -33233,8 +33374,8 @@ aa
aa
ad
aa
-aa
-aJ
+ed
+Rg
bh
aa
aa
@@ -33376,7 +33517,7 @@ aa
ad
aa
aa
-aJ
+Rg
aa
aa
aa
@@ -33392,7 +33533,7 @@ dI
bS
ez
bE
-ez
+RB
fn
dp
dL
@@ -33420,7 +33561,7 @@ tS
uK
vz
wh
-wh
+Cu
xC
ym
zm
@@ -33518,7 +33659,7 @@ aa
ae
ae
ae
-aJ
+Rg
ae
ae
ae
@@ -33660,7 +33801,7 @@ aa
ad
aa
aa
-aJ
+Rg
aa
aa
aa
@@ -33801,8 +33942,8 @@ aa
aa
ad
aa
-aa
-aJ
+ed
+Rg
bh
aa
ab
@@ -33943,8 +34084,8 @@ aa
aa
ae
ae
-ae
aJ
+Rg
bh
aa
ab
@@ -33979,7 +34120,7 @@ nN
oz
fo
pK
-pL
+WY
qL
fL
fN
@@ -34085,8 +34226,8 @@ aa
aa
ad
aa
-aa
-aJ
+ed
+Rg
bh
aa
ab
@@ -34131,7 +34272,7 @@ uP
uP
uP
uP
-uP
+Rm
uP
uP
Ag
@@ -34228,7 +34369,7 @@ aa
ad
aa
aa
-aJ
+Rg
ae
ae
cv
@@ -34249,14 +34390,14 @@ jk
jk
jk
jk
-kg
+jk
jk
jk
jk
gb
cT
cT
-mI
+jy
jk
jk
of
@@ -34370,7 +34511,7 @@ aa
ae
ae
ae
-aJ
+Rg
cv
cv
cv
@@ -34512,7 +34653,7 @@ aa
ad
aa
aa
-aJ
+Rg
cv
cv
cv
@@ -34557,7 +34698,7 @@ uS
vG
wl
wQ
-wl
+Vn
ys
zp
Ae
@@ -34654,7 +34795,7 @@ aa
ad
aa
aa
-aJ
+Rg
cv
cv
cv
@@ -34689,7 +34830,7 @@ of
oD
pn
DP
-qi
+nu
qN
rx
qQ
@@ -34796,7 +34937,7 @@ aa
ae
ae
ae
-aJ
+Rg
cv
cv
cv
@@ -34840,7 +34981,7 @@ tW
uT
vH
wn
-wS
+Rf
wn
yt
zq
@@ -34938,7 +35079,7 @@ aa
ad
aa
aa
-aJ
+Rg
cv
cv
cv
@@ -34957,7 +35098,7 @@ bN
cg
jk
jk
-jJ
+jk
jk
jk
jk
@@ -34966,7 +35107,7 @@ jk
gb
cT
cT
-mJ
+jy
jk
jk
oh
@@ -35080,7 +35221,7 @@ aa
ad
aa
aa
-aJ
+Rg
cv
cv
cv
@@ -35222,7 +35363,11 @@ aa
ae
ae
ae
-aJ
+Rg
+cv
+cv
+cv
+cv
cv
cv
cv
@@ -35232,10 +35377,6 @@ cv
cv
cv
cv
-hp
-hp
-hp
-hp
iC
bP
cn
@@ -35364,11 +35505,11 @@ aa
ad
aa
aa
-aJ
-aJ
-aJ
-aJ
-SW
+Rg
+Rg
+Rg
+Rg
+gg
SW
ab
ab
@@ -35507,10 +35648,10 @@ ad
aa
aa
aa
-ae
-aa
-aJ
-SW
+Rh
+Ri
+Rj
+gg
SW
ab
ab
@@ -35651,8 +35792,8 @@ aa
aa
ae
aa
-aJ
-SW
+ed
+gg
SW
ab
ab
@@ -35793,14 +35934,14 @@ aa
aa
aO
aa
-aJ
-SW
+ed
+gg
ab
ab
ab
aU
bj
-hr
+XG
hN
aV
cb
@@ -35935,8 +36076,8 @@ aa
aa
aa
aa
-aJ
-SW
+aa
+gg
ab
ab
ab
@@ -36077,15 +36218,15 @@ aa
aa
aa
aa
-aJ
-aJ
+aa
+gg
ab
ab
ab
aU
gW
-hr
-hM
+ZO
+Sa
aX
in
bu
@@ -36103,7 +36244,7 @@ lh
lH
lH
lH
-nu
+jh
lH
ok
oK
@@ -36220,14 +36361,14 @@ aa
aa
aa
aa
-aJ
+gg
ab
ab
ab
aU
gX
-hs
-hO
+hr
+hM
aY
in
bu
@@ -36362,15 +36503,15 @@ aa
aa
aa
aa
-aJ
+gg
ab
ab
ab
aU
bk
-ht
+hr
hP
-bJ
+Rl
aU
iH
iT
@@ -36511,7 +36652,7 @@ aU
aU
aU
hu
-hu
+Up
aU
aU
iI
@@ -36534,7 +36675,7 @@ nT
on
oM
le
-pS
+Rk
fq
qV
fc
@@ -36653,7 +36794,7 @@ gx
bb
gY
hv
-aF
+hP
bm
bz
bw
@@ -37077,8 +37218,8 @@ aa
aa
ab
bc
-gZ
-ay
+bJ
+Ur
hQ
bm
bm
@@ -37219,9 +37360,9 @@ aa
aa
ab
bc
+gZ
ha
hw
-hQ
hZ
dA
iq
@@ -37361,11 +37502,11 @@ aa
aa
ab
bc
-hb
-hx
-aF
bc
-db
+hb
+hb
+bc
+pS
eW
pN
iq
@@ -37502,7 +37643,7 @@ aa
aa
aa
ab
-bc
+ab
bc
bc
bc
diff --git a/maps/tether/tether-10-colony.dmm b/maps/tether/tether-10-colony.dmm
index c0d62c23b5..924818b9ef 100644
--- a/maps/tether/tether-10-colony.dmm
+++ b/maps/tether/tether-10-colony.dmm
@@ -7693,13 +7693,25 @@
dir = 1
},
/obj/machinery/camera/network/crescent,
+/obj/item/weapon/reagent_containers/glass/beaker/large,
/turf/unsimulated/floor/steel{
icon_state = "white"
},
/area/centcom/medical)
"nW" = (
/obj/structure/table/glass,
-/obj/item/weapon/reagent_containers/glass/beaker/large,
+/obj/item/weapon/reagent_containers/glass/bottle/biomass{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/weapon/reagent_containers/glass/bottle/biomass{
+ pixel_x = -3;
+ pixel_y = -2
+ },
+/obj/item/weapon/reagent_containers/glass/bottle/biomass{
+ pixel_x = 3;
+ pixel_y = 5
+ },
/obj/effect/floor_decal/borderfloorwhite{
dir = 1
},
@@ -7712,10 +7724,8 @@
/obj/effect/floor_decal/corner/paleblue/bordercorner2{
dir = 1
},
-/turf/unsimulated/floor/steel{
- icon_state = "white"
- },
-/area/centcom/medical)
+/turf/simulated/floor/tiled/white,
+/area/space)
"nX" = (
/obj/effect/floor_decal/borderfloorwhite{
dir = 1
@@ -7802,7 +7812,7 @@
/obj/effect/floor_decal/corner_steel_grid{
dir = 10
},
-/obj/machinery/clonepod/transhuman,
+/obj/machinery/clonepod/transhuman/full,
/turf/unsimulated/floor/steel{
icon_state = "white"
},
diff --git a/nano/images/nanomap_z1.png b/nano/images/nanomap_z1.png
index 58a2ee22bd..10dc0a5ff3 100644
Binary files a/nano/images/nanomap_z1.png and b/nano/images/nanomap_z1.png differ
diff --git a/nano/images/nanomap_z10.png b/nano/images/nanomap_z10.png
index 360d243974..c8d1590e75 100644
Binary files a/nano/images/nanomap_z10.png and b/nano/images/nanomap_z10.png differ
diff --git a/nano/images/nanomap_z2.png b/nano/images/nanomap_z2.png
index ad72fbd06f..babe33e4f1 100644
Binary files a/nano/images/nanomap_z2.png and b/nano/images/nanomap_z2.png differ
diff --git a/nano/images/nanomap_z3.png b/nano/images/nanomap_z3.png
index 6478ada84d..1b8991eb26 100644
Binary files a/nano/images/nanomap_z3.png and b/nano/images/nanomap_z3.png differ
diff --git a/nano/images/nanomap_z5.png b/nano/images/nanomap_z5.png
index 75c80590af..ede2cb688e 100644
Binary files a/nano/images/nanomap_z5.png and b/nano/images/nanomap_z5.png differ
diff --git a/nano/images/nanomap_z6.png b/nano/images/nanomap_z6.png
index 1a77e7ff9d..a69095c38f 100644
Binary files a/nano/images/nanomap_z6.png and b/nano/images/nanomap_z6.png differ
diff --git a/nano/images/nanomap_z7.png b/nano/images/nanomap_z7.png
index b74c9df99d..14345cd4e4 100644
Binary files a/nano/images/nanomap_z7.png and b/nano/images/nanomap_z7.png differ
diff --git a/nano/images/nanomap_z8.png b/nano/images/nanomap_z8.png
index 319c0161e0..9b3b937754 100644
Binary files a/nano/images/nanomap_z8.png and b/nano/images/nanomap_z8.png differ
diff --git a/nano/images/nanomap_z9.png b/nano/images/nanomap_z9.png
index 473a77a266..6b766c4d28 100644
Binary files a/nano/images/nanomap_z9.png and b/nano/images/nanomap_z9.png differ
diff --git a/rust_g b/rust_g
index 1a623a422f..57684fff77 100644
Binary files a/rust_g and b/rust_g differ
diff --git a/rust_g.dll b/rust_g.dll
index 817a522b61..9438c14445 100644
Binary files a/rust_g.dll and b/rust_g.dll differ
diff --git a/sound/effects/uncloak.ogg b/sound/effects/uncloak.ogg
new file mode 100644
index 0000000000..a2cedc8c73
Binary files /dev/null and b/sound/effects/uncloak.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index 5331c30de2..3e19dfa5b1 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1406,6 +1406,7 @@
#include "code\modules\alarm\fire_alarm.dm"
#include "code\modules\alarm\motion_alarm.dm"
#include "code\modules\alarm\power_alarm.dm"
+#include "code\modules\artifice\deadringer.dm"
#include "code\modules\assembly\assembly.dm"
#include "code\modules\assembly\helpers.dm"
#include "code\modules\assembly\holder.dm"
@@ -2328,6 +2329,7 @@
#include "code\modules\organs\internal\liver.dm"
#include "code\modules\organs\internal\lungs.dm"
#include "code\modules\organs\internal\organ_internal.dm"
+#include "code\modules\organs\internal\voicebox.dm"
#include "code\modules\organs\subtypes\diona.dm"
#include "code\modules\organs\subtypes\indestructible.dm"
#include "code\modules\organs\subtypes\machine.dm"
@@ -2707,6 +2709,7 @@
#include "code\modules\surgery\_defines.dm"
#include "code\modules\surgery\bones.dm"
#include "code\modules\surgery\encased.dm"
+#include "code\modules\surgery\external_repair.dm"
#include "code\modules\surgery\face.dm"
#include "code\modules\surgery\generic.dm"
#include "code\modules\surgery\implant.dm"