diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
index 896ad49eac..aebea38901 100644
--- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
@@ -235,25 +235,13 @@
pump_direction = 1
if(signal.data["set_input_pressure"])
- input_pressure_min = between(
- 0,
- text2num(signal.data["set_input_pressure"]),
- ONE_ATMOSPHERE*50
- )
+ input_pressure_min = between(0, text2num(signal.data["set_input_pressure"]), ONE_ATMOSPHERE*50)
if(signal.data["set_output_pressure"])
- output_pressure_max = between(
- 0,
- text2num(signal.data["set_output_pressure"]),
- ONE_ATMOSPHERE*50
- )
+ output_pressure_max = between(0, text2num(signal.data["set_output_pressure"]), ONE_ATMOSPHERE*50)
if(signal.data["set_external_pressure"])
- external_pressure_bound = between(
- 0,
- text2num(signal.data["set_external_pressure"]),
- ONE_ATMOSPHERE*50
- )
+ external_pressure_bound = between(0, text2num(signal.data["set_external_pressure"]), ONE_ATMOSPHERE*50)
if(signal.data["status"])
spawn(2)
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index 5817d0948e..7b8b7155f6 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -185,11 +185,7 @@
unlocked = !unlocked
if("set_target_pressure" in signal.data)
- target_pressure = between(
- 0,
- text2num(signal.data["set_target_pressure"]),
- max_pressure_setting
- )
+ target_pressure = between(0, text2num(signal.data["set_target_pressure"]), max_pressure_setting)
if("set_regulate_mode" in signal.data)
regulate_mode = text2num(signal.data["set_regulate_mode"])
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index 7d476e17b7..665d912b00 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -185,11 +185,7 @@ Thus, the two variables affect pump operation are set in New():
update_use_power(!use_power)
if(signal.data["set_output_pressure"])
- target_pressure = between(
- 0,
- text2num(signal.data["set_output_pressure"]),
- ONE_ATMOSPHERE*50
- )
+ target_pressure = between(0, text2num(signal.data["set_output_pressure"]), ONE_ATMOSPHERE*50)
if(signal.data["status"])
spawn(2)
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index 4c843f5342..191478b60e 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -343,37 +343,19 @@
if (signal.data["set_internal_pressure"] == "default")
internal_pressure_bound = internal_pressure_bound_default
else
- internal_pressure_bound = between(
- 0,
- text2num(signal.data["set_internal_pressure"]),
- ONE_ATMOSPHERE*50
- )
+ internal_pressure_bound = between(0,text2num(signal.data["set_internal_pressure"]),ONE_ATMOSPHERE*50)
if(signal.data["set_external_pressure"] != null)
if (signal.data["set_external_pressure"] == "default")
external_pressure_bound = external_pressure_bound_default
else
- external_pressure_bound = between(
- 0,
- text2num(signal.data["set_external_pressure"]),
- ONE_ATMOSPHERE*50
- )
+ external_pressure_bound = between(0,text2num(signal.data["set_external_pressure"]),ONE_ATMOSPHERE*50)
if(signal.data["adjust_internal_pressure"] != null)
- internal_pressure_bound = between(
- 0,
- internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]),
- ONE_ATMOSPHERE*50
- )
+ internal_pressure_bound = between(0,internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]),ONE_ATMOSPHERE*50)
if(signal.data["adjust_external_pressure"] != null)
-
-
- external_pressure_bound = between(
- 0,
- external_pressure_bound + text2num(signal.data["adjust_external_pressure"]),
- ONE_ATMOSPHERE*50
- )
+ external_pressure_bound = between(0,external_pressure_bound + text2num(signal.data["adjust_external_pressure"]),ONE_ATMOSPHERE*50)
if("reset_external_pressure" in signal.data)
external_pressure_bound = ONE_ATMOSPHERE
diff --git a/code/__defines/__513_compatibility.dm b/code/__defines/__513_compatibility.dm
index 78583570ff..f4a3a8177e 100644
--- a/code/__defines/__513_compatibility.dm
+++ b/code/__defines/__513_compatibility.dm
@@ -14,6 +14,8 @@
#define arctan(x) (arcsin(x/sqrt(1+x*x)))
+#define between(x, y, z) max(min(y, z), x)
+
//////////////////////////////////////////////////
#else
@@ -26,4 +28,6 @@
#define ATAN2(x, y) arctan(x, y)
+#define between(x, y, z) clamp(y, x, z)
+
#endif
\ No newline at end of file
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 0b258311a4..9dbc7c0d99 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -553,10 +553,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/y = min(world.maxy, max(1, A.y + dy))
return locate(x,y,A.z)
-//Makes sure MIDDLE is between LOW and HIGH. If not, it adjusts it. Returns the adjusted value.
-/proc/between(var/low, var/middle, var/high)
- return max(min(middle, high), low)
-
//returns random gauss number
/proc/GaussRand(var/sigma)
var/x,y,rsq
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 81c1e81ccf..50e6b04923 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -826,18 +826,16 @@ About the new airlock wires panel:
if("opening")
cut_overlay()
if(p_open)
- spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond.
- flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking
- update_icon()
+ flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking
+ update_icon()
else
flick("door_opening", src)//[stat ? "_stat":]
update_icon()
if("closing")
cut_overlay()
if(p_open)
- spawn(2)
- flick("o_door_closing", src)
- update_icon()
+ flick("o_door_closing", src)
+ update_icon()
else
flick("door_closing", src)
update_icon()
diff --git a/code/game/machinery/doors/airlock_angled.dm b/code/game/machinery/doors/airlock_angled_bay.dm
similarity index 92%
rename from code/game/machinery/doors/airlock_angled.dm
rename to code/game/machinery/doors/airlock_angled_bay.dm
index ba39cf8bf2..4d5eac48a4 100644
--- a/code/game/machinery/doors/airlock_angled.dm
+++ b/code/game/machinery/doors/airlock_angled_bay.dm
@@ -38,7 +38,7 @@
*/
-/obj/machinery/door/airlock/angled
+/obj/machinery/door/airlock/angled_bay
icon_state = "preview"
dir = 2
@@ -86,11 +86,11 @@
/// Optional: If door_color_icon is not null, this color will be applied to the door color overlay
var/door_color
-/obj/machinery/door/airlock/angled/Initialize()
+/obj/machinery/door/airlock/angled_bay/Initialize()
obtain_icon()
. = ..()
-/obj/machinery/door/airlock/angled/proc/obtain_icon()
+/obj/machinery/door/airlock/angled_bay/proc/obtain_icon()
var/icon/fill_icon
switch(fill_type)
if(FILL_METAL)
@@ -271,7 +271,7 @@
icon = final
update_icon()
-/obj/machinery/door/airlock/angled/proc/gimme_icon()
+/obj/machinery/door/airlock/angled_bay/proc/gimme_icon()
usr << ftp(icon, "[name].dmi")
/**
@@ -282,7 +282,7 @@
// Fills: Metal, glass, color
// Supports stripe color
// Supports door color
-/obj/machinery/door/airlock/angled/standard
+/obj/machinery/door/airlock/angled_bay/standard
icon = 'icons/obj/doors/angled/station/door.dmi'
fill_type = FILL_METAL
@@ -299,16 +299,16 @@
lights_emag_icon = 'icons/obj/doors/angled/station/emag.dmi'
panel_icon = 'icons/obj/doors/angled/station/panel.dmi'
welded_icon = 'icons/obj/doors/angled/station/welded.dmi'
-/obj/machinery/door/airlock/angled/standard/glass
+/obj/machinery/door/airlock/angled_bay/standard/glass
icon_state = "preview_glass"
fill_type = FILL_GLASS
-/obj/machinery/door/airlock/angled/standard/color
+/obj/machinery/door/airlock/angled_bay/standard/color
icon_state = "preview_color"
fill_type = FILL_COLOR
// Fills: Metal
// Supports stripe color
-/obj/machinery/door/airlock/angled/hatch
+/obj/machinery/door/airlock/angled_bay/hatch
icon = 'icons/obj/doors/angled/hatch/door.dmi'
fill_type = FILL_METAL
@@ -324,7 +324,7 @@
welded_icon = 'icons/obj/doors/angled/hatch/welded.dmi'
// Fills: None
-/obj/machinery/door/airlock/angled/ascent
+/obj/machinery/door/airlock/angled_bay/ascent
icon = 'icons/obj/doors/angled/ascent/door.dmi'
base_icon = 'icons/obj/doors/angled/ascent/door.dmi'
@@ -339,7 +339,7 @@
// Fills: Metal, glass, color
// Supports door color
-/obj/machinery/door/airlock/angled/external
+/obj/machinery/door/airlock/angled_bay/external
icon = 'icons/obj/doors/angled/external/door.dmi'
fill_type = FILL_METAL
@@ -352,15 +352,15 @@
lights_green_icon = 'icons/obj/doors/angled/external/lights_green.dmi'
lights_bolts_icon = 'icons/obj/doors/angled/external/lights_bolts.dmi'
lights_emag_icon = 'icons/obj/doors/angled/external/emag.dmi'
-/obj/machinery/door/airlock/angled/external/glass
+/obj/machinery/door/airlock/angled_bay/external/glass
icon_state = "preview_glass"
fill_type = FILL_GLASS
-/obj/machinery/door/airlock/angled/external/color
+/obj/machinery/door/airlock/angled_bay/external/color
icon_state = "preview_color"
fill_type = FILL_COLOR
// Fills: Metal, glass
-/obj/machinery/door/airlock/angled/elevator
+/obj/machinery/door/airlock/angled_bay/elevator
icon = 'icons/obj/doors/angled/elevator/door.dmi'
fill_type = FILL_METAL
@@ -371,34 +371,34 @@
lights_green_icon = 'icons/obj/doors/angled/elevator/lights_green.dmi'
lights_bolts_icon = 'icons/obj/doors/angled/elevator/lights_bolts.dmi'
welded_icon = 'icons/obj/doors/angled/elevator/welded.dmi'
-/obj/machinery/door/airlock/angled/elevator/glass
+/obj/machinery/door/airlock/angled_bay/elevator/glass
icon_state = "preview_glass"
fill_type = FILL_GLASS
// Very few options on these, basically just static doors.
-/obj/machinery/door/airlock/angled/hazard // firedoors
+/obj/machinery/door/airlock/angled_bay/hazard // firedoors
icon = 'icons/obj/doors/angled/hazard/door.dmi'
base_icon = 'icons/obj/doors/angled/hazard/door.dmi'
panel_icon = 'icons/obj/doors/angled/hazard/panel.dmi'
welded_icon = 'icons/obj/doors/angled/hazard/welded.dmi'
-/obj/machinery/door/airlock/angled/vault
+/obj/machinery/door/airlock/angled_bay/vault
icon = 'icons/obj/doors/angled/vault/door.dmi'
fill_type = FILL_METAL // the only option
base_icon = 'icons/obj/doors/angled/vault/door.dmi'
metal_fill_icon = 'icons/obj/doors/angled/vault/fill_steel.dmi'
-/obj/machinery/door/airlock/angled/secure
+/obj/machinery/door/airlock/angled_bay/secure
icon = 'icons/obj/doors/angled/secure/door.dmi'
fill_type = FILL_METAL // the only option
base_icon = 'icons/obj/doors/angled/secure/door.dmi'
metal_fill_icon = 'icons/obj/doors/angled/secure/fill_steel.dmi'
-/obj/machinery/door/airlock/angled/centcomm
+/obj/machinery/door/airlock/angled_bay/centcomm
icon = 'icons/obj/doors/angled/centcomm/door.dmi'
fill_type = FILL_METAL // the only option
@@ -409,7 +409,7 @@
// Fills: Metal, glass, color
// Supports stripe color
// Supports door color
-/obj/machinery/door/airlock/angled/double
+/obj/machinery/door/airlock/angled_bay/double
width = 2
appearance_flags = 0
icon = 'icons/obj/doors/angled/double/door.dmi'
@@ -430,33 +430,33 @@
welded_icon = 'icons/obj/doors/angled/double/welded.dmi'
spark_damaged_icon = 'icons/obj/doors/angled/double/sparks_damaged.dmi'
spark_broken_icon = 'icons/obj/doors/angled/double/sparks_broken.dmi'
-/obj/machinery/door/airlock/angled/double/glass
+/obj/machinery/door/airlock/angled_bay/double/glass
icon_state = "preview_glass"
fill_type = FILL_GLASS
-/obj/machinery/door/airlock/angled/double/color
+/obj/machinery/door/airlock/angled_bay/double/color
icon_state = "preview_color"
fill_type = FILL_COLOR
-/obj/machinery/door/airlock/angled/double/Initialize(mapload)
+/obj/machinery/door/airlock/angled_bay/double/Initialize(mapload)
. = ..()
SetBounds()
apply_opacity_to_my_turfs(opacity)
-/obj/machinery/door/airlock/angled/double/set_opacity()
+/obj/machinery/door/airlock/angled_bay/double/set_opacity()
. = ..()
apply_opacity_to_my_turfs(opacity)
-/obj/machinery/door/airlock/angled/double/Moved()
+/obj/machinery/door/airlock/angled_bay/double/Moved()
. = ..()
SetBounds()
-/obj/machinery/door/airlock/angled/double/proc/apply_opacity_to_my_turfs(new_opacity)
+/obj/machinery/door/airlock/angled_bay/double/proc/apply_opacity_to_my_turfs(new_opacity)
for(var/turf/T in locs)
T.set_opacity(new_opacity)
update_nearby_tiles()
-/obj/machinery/door/airlock/angled/double/proc/SetBounds()
- if(dir & 3)
+/obj/machinery/door/airlock/angled_bay/double/proc/SetBounds()
+ if(dir & 3) // weird, but their icons are 'backwards' so whatever
bound_width = width * world.icon_size
bound_height = world.icon_size
else
diff --git a/code/game/machinery/doors/airlock_angled_tgmc.dm b/code/game/machinery/doors/airlock_angled_tgmc.dm
new file mode 100644
index 0000000000..c810e3d687
--- /dev/null
+++ b/code/game/machinery/doors/airlock_angled_tgmc.dm
@@ -0,0 +1,134 @@
+/obj/machinery/door/airlock/angled_tgmc
+ dir = 2
+ anim_length_before_finalize = 3
+
+/obj/machinery/door/airlock/angled_tgmc/cell
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/celldoor.dmi'
+/obj/machinery/door/airlock/angled_tgmc/command
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/comdoor.dmi'
+/obj/machinery/door/airlock/angled_tgmc/dropship1_pilot
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/dropship1_pilot.dmi'
+/obj/machinery/door/airlock/angled_tgmc/dropship2_pilot
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/dropship2_pilot.dmi'
+/obj/machinery/door/airlock/angled_tgmc/engineering
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/engidoor.dmi'
+/obj/machinery/door/airlock/angled_tgmc/maintenance
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/maintdoor.dmi'
+/obj/machinery/door/airlock/angled_tgmc/medical
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/medidoor.dmi'
+/obj/machinery/door/airlock/angled_tgmc/medical_glass
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/medidoor_glass.dmi'
+ glass = TRUE
+ opacity = FALSE
+/obj/machinery/door/airlock/angled_tgmc/personal
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/personaldoor.dmi'
+/obj/machinery/door/airlock/angled_tgmc/pod
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/pod_doors.dmi'
+/obj/machinery/door/airlock/angled_tgmc/prep
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/prepdoor.dmi'
+ glass = TRUE
+ opacity = FALSE
+/obj/machinery/door/airlock/angled_tgmc/prep/prep_alpha
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/prepdoor_alpha.dmi'
+/obj/machinery/door/airlock/angled_tgmc/prep/prep_bravo
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/prepdoor_bravo.dmi'
+/obj/machinery/door/airlock/angled_tgmc/prep/prep_charlie
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/prepdoor_charlie.dmi'
+/obj/machinery/door/airlock/angled_tgmc/prep/prep_delta
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/prepdoor_delta.dmi'
+
+/obj/machinery/door/airlock/angled_tgmc/security
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/secdoor.dmi'
+/obj/machinery/door/airlock/angled_tgmc/security_glass
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/secdoor_glass.dmi'
+ glass = TRUE
+ opacity = FALSE
+/obj/machinery/door/airlock/angled_tgmc/secure
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/securedoor.dmi'
+
+
+// firedoor
+/* /obj/machinery/door/airlock/angled_tgmc/
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/purinadoor.dmi' */
+// blastdoor
+/* /obj/machinery/door/airlock/angled_tgmc/
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/blastdoors_shutters.dmi' */
+
+/obj/machinery/door/airlock/angled_tgmc/wide
+ width = 2
+ appearance_flags = 0
+ glass = TRUE
+ opacity = FALSE
+
+/obj/machinery/door/airlock/angled_tgmc/wide/Initialize(mapload)
+ . = ..()
+ SetBounds()
+ apply_opacity_to_my_turfs(opacity)
+
+/obj/machinery/door/airlock/angled_tgmc/wide/set_opacity()
+ . = ..()
+ apply_opacity_to_my_turfs(opacity)
+
+/obj/machinery/door/airlock/angled_tgmc/wide/Moved()
+ . = ..()
+ SetBounds()
+
+/obj/machinery/door/airlock/angled_tgmc/wide/proc/apply_opacity_to_my_turfs(new_opacity)
+ for(var/turf/T in locs)
+ T.set_opacity(new_opacity)
+ update_nearby_tiles()
+
+/obj/machinery/door/airlock/angled_tgmc/wide/proc/SetBounds()
+ if(dir & 3)
+ bound_width = world.icon_size
+ bound_height = width * world.icon_size
+ else
+ bound_width = width * world.icon_size
+ bound_height = world.icon_size
+
+/obj/machinery/door/airlock/angled_tgmc/wide/command
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/2x1comdoor.dmi'
+/obj/machinery/door/airlock/angled_tgmc/wide/generic
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/2x1generic.dmi'
+/obj/machinery/door/airlock/angled_tgmc/wide/medical
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/2x1medidoor.dmi'
+/obj/machinery/door/airlock/angled_tgmc/wide/security
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/2x1secdoor.dmi'
+/obj/machinery/door/airlock/angled_tgmc/wide/dropship1
+ width = 3
+ anim_length_before_finalize = 5
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/dropship1_cargo.dmi'
+ glass = FALSE
+ opacity = TRUE
+/obj/machinery/door/airlock/angled_tgmc/wide/dropship2
+ width = 3
+ anim_length_before_finalize = 5
+ icon_state = "door_closed"
+ icon = 'icons/obj/doors/angled/tgmc/dropship2_cargo.dmi'
+ glass = FALSE
+ opacity = TRUE
\ No newline at end of file
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index d253a4dd68..3c392cf9a0 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -32,6 +32,9 @@
var/block_air_zones = 1 //If set, air zones cannot merge across the door even when it is opened.
var/close_door_at = 0 //When to automatically close the door, if possible
+ var/anim_length_before_density = 3
+ var/anim_length_before_finalize = 7
+
//Multi-tile doors
dir = EAST
var/width = 1
@@ -428,10 +431,10 @@
do_animate("opening")
icon_state = "door0"
set_opacity(0)
- sleep(3)
+ sleep(anim_length_before_density)
src.density = FALSE
update_nearby_tiles()
- sleep(7)
+ sleep(anim_length_before_finalize)
src.layer = open_layer
explosion_resistance = 0
update_icon()
@@ -453,12 +456,12 @@
close_door_at = 0
do_animate("closing")
- sleep(3)
+ sleep(anim_length_before_density)
src.density = TRUE
explosion_resistance = initial(explosion_resistance)
src.layer = closed_layer
update_nearby_tiles()
- sleep(7)
+ sleep(anim_length_before_finalize)
update_icon()
if(visible && !glass)
set_opacity(1) //caaaaarn!
diff --git a/code/game/objects/items/weapons/RMS_vr.dm b/code/game/objects/items/weapons/RMS_vr.dm
index 046ef616a6..634e3602da 100644
--- a/code/game/objects/items/weapons/RMS_vr.dm
+++ b/code/game/objects/items/weapons/RMS_vr.dm
@@ -214,7 +214,7 @@
/obj/item/weapon/rms/attack_self(mob/user)
var/list/choices = list(
"Steel" = radial_image_steel,
- MAT_GLASS = radial_image_glass,
+ "Glass" = radial_image_glass,
"Cloth" = radial_image_cloth,
"Plastic" = radial_image_plastic,
"Stone" = radial_image_stone,
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/recycling.dm b/code/game/objects/items/weapons/circuitboards/machinery/recycling.dm
new file mode 100644
index 0000000000..f0375d346b
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/machinery/recycling.dm
@@ -0,0 +1,41 @@
+#ifndef T_BOARD
+#error T_BOARD macro is not defined but we need it!
+#endif
+
+/obj/item/weapon/circuitboard/recycler_crusher
+ name = T_BOARD("recycler - crusher")
+ build_path = /obj/machinery/recycling/crusher
+ board_type = new /datum/frame/frame_types/machine
+ origin_tech = list(TECH_MATERIAL = 2)
+ matter = list(MAT_STEEL = 50, MAT_GLASS = 50)
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/motor = 1,
+ /obj/item/weapon/stock_parts/gear = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1
+ )
+
+/obj/item/weapon/circuitboard/recycler_sorter
+ name = T_BOARD("recycler - sorter")
+ build_path = /obj/machinery/recycling/sorter
+ board_type = new /datum/frame/frame_types/machine
+ origin_tech = list(TECH_MATERIAL = 2)
+ matter = list(MAT_STEEL = 50, MAT_GLASS = 50)
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/motor = 1,
+ /obj/item/weapon/stock_parts/gear = 3
+ )
+
+/obj/item/weapon/circuitboard/recycler_stamper
+ name = T_BOARD("recycler - stamper")
+ build_path = /obj/machinery/recycling/stamper
+ board_type = new /datum/frame/frame_types/machine
+ origin_tech = list(TECH_MATERIAL = 2)
+ matter = list(MAT_STEEL = 50, MAT_GLASS = 50)
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/gear = 2,
+ /obj/item/weapon/stock_parts/motor = 2
+ )
diff --git a/code/game/objects/structures/droppod.dm b/code/game/objects/structures/droppod.dm
new file mode 100644
index 0000000000..3f9c3417d1
--- /dev/null
+++ b/code/game/objects/structures/droppod.dm
@@ -0,0 +1,137 @@
+/obj/structure/drop_pod
+ name = "drop pod"
+ desc = "Standard Commonwealth drop pod. There are file marks where the serial number should be, however."
+ icon = 'icons/obj/structures/droppod.dmi'
+ icon_state = "pod"
+ density = TRUE
+ anchored = TRUE
+ bound_height = 50
+
+ var/polite = FALSE // polite ones don't violently murder everything
+ var/finished = FALSE
+ var/datum/gas_mixture/pod_air/air
+
+/obj/structure/drop_pod/polite
+ polite = TRUE
+
+/obj/structure/drop_pod/New(newloc, atom/movable/A, auto_open = FALSE)
+ ..()
+ if(A)
+ A.forceMove(src) // helo
+ podfall(auto_open)
+ air = new(1000)
+
+/obj/structure/drop_pod/proc/podfall(auto_open)
+ set waitfor = FALSE // sleeping in new otherwise
+
+ var/turf/T = get_turf(src)
+ if(!T)
+ warning("Drop pod wasn't spawned on a turf")
+ return
+
+ moveToNullspace()
+ icon_state = "[initial(icon_state)]_falling"
+
+ // Show warning on 3x3 area centred on our drop spot
+ var/list/turfs_nearby = block(get_step(T, SOUTHWEST), get_step(T, NORTHEAST))
+ for(var/turf/TN in turfs_nearby)
+ new /obj/effect/temporary_effect/shuttle_landing(TN)
+
+ // Wait a minute
+ sleep(4 SECONDS)
+
+ // Wheeeeeee
+ plane = ABOVE_PLANE
+ pixel_z = 300
+ alpha = 0
+ forceMove(T)
+ playsound(T, 'sound/effects/droppod.ogg', 50, 1)
+ animate(src, pixel_z = 0, time = 3 SECONDS, easing = SINE_EASING|EASE_OUT)
+ animate(src, alpha = 255, time = 1 SECOND, flags = ANIMATION_PARALLEL)
+ filters += filter(type="drop_shadow", x=-64, y=100, size=10)
+ animate(filters[filters.len], x=0, y=0, size=0, time=3 SECONDS, flags=ANIMATION_PARALLEL, easing=SINE_EASING|EASE_OUT)
+ sleep(2 SECONDS)
+ new /obj/effect/effect/smoke(T)
+ T.hotspot_expose(900)
+ sleep(1 SECOND)
+ filters = null
+
+ // CRONCH
+ playsound(src, 'sound/effects/meteorimpact.ogg', 50, 1)
+ if(!polite)
+ for(var/atom/A in view(1, T))
+ if(A == src)
+ continue
+ A.ex_act(2)
+ else
+ for(var/turf/simulated/floor/F in view(1, T))
+ F.burn_tile(900)
+
+ for(var/obj/O in T)
+ if(O == src)
+ continue
+ qdel(O)
+ for(var/mob/living/L in T)
+ L.gib()
+
+ // Landed! Simmer
+ plane = initial(plane)
+ icon_state = "[initial(icon_state)]"
+
+ if(auto_open)
+ sleep(2 SECONDS)
+ open_pod()
+ visible_message("\The [src] pops open!")
+ else
+ for(var/mob/M in src)
+ to_chat(M, "You've landed! Open the hatch if you think it's safe! \The [src] has enough air to last for a while...")
+
+/obj/structure/drop_pod/proc/open_pod()
+ if(finished)
+ return
+ icon_state = "[initial(icon_state)]_open"
+ playsound(src, 'sound/effects/magnetclamp.ogg', 100, 1)
+ for(var/atom/movable/AM in src)
+ AM.forceMove(loc)
+ AM.set_dir(SOUTH) // cus
+ qdel_null(air)
+ finished = TRUE
+
+/obj/structure/drop_pod/attack_hand(mob/living/user)
+ if(istype(user) && (Adjacent(user) || (user in src)) && !user.incapacitated())
+ if(finished)
+ to_chat(user, "Nothing left to do with it now. Maybe you can break it down into materials.")
+ else
+ open_pod()
+ user.visible_message("[user] opens \the [src]!","You open \the [src]!")
+
+/obj/structure/drop_pod/attackby(obj/item/O, mob/user)
+ if(O.is_wrench())
+ if(finished)
+ to_chat(user, "You start breaking down \the [src].")
+ if(do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE))
+ var/obj/item/stack/S = new /obj/item/stack/material/plasteel(loc)
+ S.amount = 10
+ playsound(user, O.usesound, 50, 1)
+ qdel(src)
+ else
+ to_chat(user, "\The [src] hasn't been opened yet. Do that first.")
+ return ..()
+
+/obj/structure/drop_pod/return_air()
+ return return_air_for_internal_lifeform()
+
+/obj/structure/drop_pod/return_air_for_internal_lifeform()
+ return air
+
+// This is about 0.896m^3 of atmosphere, which is enough to last for quite a while.
+/datum/gas_mixture/pod_air
+ volume = 2500
+ temperature = 293.150
+ total_moles = 104
+
+/datum/gas_mixture/pod_air/New()
+ . = ..()
+ gas = list(
+ "oxygen" = 21,
+ "nitrogen" = 79)
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 4afb514fe7..8befbe1800 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -22,7 +22,7 @@
return
/obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction
- if(tool.is_screwdriver() && !istype(src, /obj/structure/sign/double))
+ if(tool.is_screwdriver() && !istype(src, /obj/structure/sign/scenery) && !istype(src, /obj/structure/sign/double))
playsound(src, tool.usesound, 50, 1)
to_chat(user, "You unfasten the sign with your [tool].")
var/obj/item/sign/S = new(src.loc)
@@ -64,14 +64,14 @@
qdel(src)
else ..()
-/obj/structure/sign/double/map
+/obj/structure/sign/scenery/map
name = "station map"
desc = "A framed picture of the station."
-/obj/structure/sign/double/map/left
+/obj/structure/sign/scenery/map/left
icon_state = "map-left"
-/obj/structure/sign/double/map/right
+/obj/structure/sign/scenery/map/right
icon_state = "map-right"
/obj/structure/sign/securearea
@@ -251,6 +251,10 @@
name = "\improper ACIDIC SURFACE"
icon_state = "acid"
+/obj/structure/sign/warning/cold
+ name = "\improper EXTREME COLD ENVIRONMENT"
+ icon_state = "cold"
+
/obj/structure/sign/redcross
name = "medbay"
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
@@ -321,6 +325,7 @@
desc = "A warning sign which reads XENOBIOLOGY."
icon_state = "xenobio3"
+
//direction signs presented by the order they appear in the dmi
/obj/structure/sign/directions
name = "direction sign"
@@ -337,221 +342,436 @@
desc = "A direction sign, pointing out the way to \the [src]."
*/
+//Also floor/level/deck signs in the same vein. Naming conventions!
+/obj/structure/sign/levels
+ name = "level sign"
+ desc = "A level sign, claiming to know which level to find... Something on?"
+ icon_state = "level"
+ icon = 'icons/obj/decals_levels.dmi'
+
//engineering signs
/obj/structure/sign/directions/engineering
name = "\improper Engineering Department"
desc = "A direction sign, pointing out the way to the Engineering Department."
icon_state = "direction_eng"
+/obj/structure/sign/levels/engineering
+ name = "\improper Engineering Department"
+ desc = "A level sign, stating the level to find the Engineering Department on."
+ icon_state = "level_eng"
+
/obj/structure/sign/directions/engineering/reactor
name = "\improper Reactor"
desc = "A direction sign, pointing out the way to the Reactor."
icon_state = "direction_core"
+/obj/structure/sign/levels/engineering/reactor
+ name = "\improper Reactor"
+ desc = "A level sign, stating the level to find the Reactor on."
+ icon_state = "level_core"
+
/obj/structure/sign/directions/engineering/solars
name = "\improper Solar Array"
desc = "A direction sign, pointing out the way to the nearest Solar Array."
icon_state = "direction_solar"
+/obj/structure/sign/levels/engineering/solars
+ name = "\improper Solar Array"
+ desc = "A level sign, stating the level to find the nearest Solar Array on."
+ icon_state = "level_solar"
+
/obj/structure/sign/directions/engineering/atmospherics
name = "\improper Atmospherics Department"
desc = "A direction sign, pointing out the way to the Atmospherics Department."
icon_state = "direction_atmos"
+/obj/structure/sign/levels/engineering/atmospherics
+ name = "\improper Atmospherics Department"
+ desc = "A level sign, stating the level to find the Atmospherics Department on."
+ icon_state = "level_atmos"
+
/obj/structure/sign/directions/engineering/gravgen
name = "\improper Gravity Generator"
desc = "A direction sign, pointing out the way to the Artificial Gravity Generator."
icon_state = "direction_grav"
+/obj/structure/sign/levels/engineering/gravgen
+ name = "\improper Gravity Generator"
+ desc = "A level sign, stating the level to find the Artificial Gravity Generator on."
+ icon_state = "level_grav"
+
/obj/structure/sign/directions/engineering/engeqp
name = "\improper Engineering Equipment Storage"
desc = "A direction sign, pointing out the way to Engineering Equipment Storage."
icon_state = "direction_engeqp"
+/obj/structure/sign/levels/engineering/engeqp
+ name = "\improper Engineering Equipment Storage"
+ desc = "A level sign, stating the level to find Engineering Equipment Storage on."
+ icon_state = "level_engeqp"
+
//security signs
/obj/structure/sign/directions/security
name = "\improper Security Department"
desc = "A direction sign, pointing out the way to the Security Department."
icon_state = "direction_sec"
+/obj/structure/sign/levels/security
+ name = "\improper Security Department"
+ desc = "A level sign, stating the level to find the Security Department on."
+ icon_state = "direction_sec"
+
/obj/structure/sign/directions/security/armory
name = "\improper Armory"
desc = "A direction sign, pointing out the way to the Armory."
icon_state = "direction_armory"
+/obj/structure/sign/levels/security/armory
+ name = "\improper Armory"
+ desc = "A level sign, stating the level to find the Armory on."
+ icon_state = "direction_armory"
+
/obj/structure/sign/directions/security/brig
name = "\improper Brig"
desc = "A direction sign, pointing out the way to the Brig."
icon_state = "direction_brig"
+/obj/structure/sign/levels/security/brig
+ name = "\improper Brig"
+ desc = "A level sign, stating the level to find the Brig on."
+ icon_state = "level_brig"
+
/obj/structure/sign/directions/security/seceqp
name = "\improper Security Equipment Storage"
desc = "A direction sign, pointing out the way to Security Equipment Storage."
icon_state = "direction_seceqp"
+/obj/structure/sign/levels/security/seceqp
+ name = "\improper Security Equipment Storage"
+ desc = "A level sign, stating the level to find Security Equipment Storage on."
+ icon_state = "level_seceqp"
+
/obj/structure/sign/directions/security/internal_affairs
name = "\improper Internal Affairs Office"
desc = "A direction sign, pointing out the way to the Internal Affairs Office."
icon_state = "direction_intaff"
+/obj/structure/sign/levels/security/internal_affairs
+ name = "\improper Internal Affairs Office"
+ desc = "A level sign, stating the level to find the Internal Affairs Office on."
+ icon_state = "level_intaff"
+
/obj/structure/sign/directions/security/forensics
name = "\improper Forensics Lab"
desc = "A direction sign, pointing out the way to the Forensics Lab."
icon_state = "direction_forensics"
+/obj/structure/sign/levels/security/forensics
+ name = "\improper Forensics Lab"
+ desc = "A level sign, stating the level to find the Forensics Lab on."
+ icon_state = "level_forensics"
+
/obj/structure/sign/directions/security/forensics/alt
icon_state = "direction_lab"
+/obj/structure/sign/levels/security/forensics/alt
+ icon_state = "level_lab"
+
/obj/structure/sign/directions/security/interrogation
name = "\improper Interrogations"
desc = "A direction sign, pointing out the way to Interrogations."
icon_state = "direction_interrogation"
+/obj/structure/sign/levels/security/interrogation
+ name = "\improper Interrogations"
+ desc = "A level sign, stating the level to find Interrogations on."
+ icon_state = "level_interrogation"
+
//science signs
/obj/structure/sign/directions/science
name = "\improper Science Department"
desc = "A direction sign, pointing out the way to the Science Department."
icon_state = "direction_sci"
-
+
+/obj/structure/sign/levels/science
+ name = "\improper Science Department"
+ desc = "A level sign, stating the level to find the Science Department on."
+ icon_state = "level_sci"
+
/obj/structure/sign/directions/science/rnd
name = "\improper Research & Development"
desc = "A direction sign, pointing out the way to Research & Development."
icon_state = "direction_rnd"
+/obj/structure/sign/levels/science/rnd
+ name = "\improper Research & Development"
+ desc = "A level sign, stating the level to find Research & Development on."
+ icon_state = "level_rnd"
+
/obj/structure/sign/directions/science/toxins
name = "\improper Toxins Lab"
desc = "A direction sign, pointing out the way to the Toxins Lab."
icon_state = "direction_sci"
+/obj/structure/sign/levels/science/toxins
+ name = "\improper Toxins Lab"
+ desc = "A level sign, stating the level to find the Toxins Lab on."
+ icon_state = "level_sci"
+
/obj/structure/sign/directions/science/robotics
name = "\improper Robotics Workshop"
desc = "A direction sign, pointing out the way to the Robotics Workshop."
icon_state = "direction_robotics"
+/obj/structure/sign/levels/science/robotics
+ name = "\improper Robotics Workshop"
+ desc = "A level sign, stating the level to find the Robotics Workshop on."
+ icon_state = "level_robotics"
+
/obj/structure/sign/directions/science/xenoarch
name = "\improper Xenoarchaeology Lab"
desc = "A direction sign, pointing out the way to the Xenoarchaeology Lab."
icon_state = "direction_xenoarch"
+/obj/structure/sign/levels/science/xenoarch
+ name = "\improper Xenoarchaeology Lab"
+ desc = "A level sign, stating the level to find the Xenoarchaeology Lab on."
+ icon_state = "level_xenoarch"
+
/obj/structure/sign/directions/science/xenobiology
name = "\improper Xenobiology Lab"
desc = "A direction sign, pointing out the way to the Xenobiology Lab."
icon_state = "direction_xbio"
+/obj/structure/sign/levels/science/xenobiology
+ name = "\improper Xenobiology Lab"
+ desc = "A level sign, stating the level to find the Xenobiology Lab on."
+ icon_state = "level_xbio"
+
/obj/structure/sign/directions/science/xenoflora
name = "\improper Xenoflora Lab"
desc = "A direction sign, pointing out the way to the Xenoflora Lab."
icon_state = "direction_xflora"
+/obj/structure/sign/levels/science/xenoflora
+ name = "\improper Xenoflora Lab"
+ desc = "A level sign, stating the level to find the Xenoflora Lab on."
+ icon_state = "level_xflora"
+
/obj/structure/sign/directions/science/exploration
name = "\improper Exploration Department"
desc = "A direction sign, pointing out the way to the Exploration Department."
icon_state = "direction_explo"
+/obj/structure/sign/levels/science/exploration
+ name = "\improper Exploration Department"
+ desc = "A level sign, stating the level to find the Exploration Department on."
+ icon_state = "level_explo"
+
//medical signs
/obj/structure/sign/directions/medical
name = "\improper Medical Bay"
desc = "A direction sign, pointing out the way to the Medical Bay."
icon_state = "direction_med"
+/obj/structure/sign/levels/medical
+ name = "\improper Medical Bay"
+ desc = "A level sign, stating the level to find the Medical Bay on."
+ icon_state = "level_med"
+
/obj/structure/sign/directions/medical/chemlab
name = "\improper Chemistry Lab"
desc = "A direction sign, pointing out the way to the Chemistry Lab."
icon_state = "direction_med"
+/obj/structure/sign/levels/medical/chemlab
+ name = "\improper Chemistry Lab"
+ desc = "A level sign, stating the level to find the Chemistry Lab on."
+ icon_state = "level_med"
+
/obj/structure/sign/directions/medical/surgery
name = "\improper Surgery"
desc = "A direction sign, pointing out the way to Surgery."
icon_state = "direction_surgery"
+/obj/structure/sign/levels/medical/surgery
+ name = "\improper Surgery"
+ desc = "A level sign, stating the level to find Surgery on."
+ icon_state = "level_surgery"
+
/obj/structure/sign/directions/medical/operating_1
name = "\improper Operating Theatre 1"
desc = "A direction sign, pointing out the way to Operating Theatre 1."
icon_state = "direction_op1"
+/obj/structure/sign/levels/medical/operating_1
+ name = "\improper Operating Theatre 1"
+ desc = "A level sign, stating the level to find Operating Theatre 1 on."
+ icon_state = "level_op1"
+
/obj/structure/sign/directions/medical/operating_2
name = "\improper Operating Theatre 2"
desc = "A direction sign, pointing out the way to Operating Theatre 2."
icon_state = "direction_op2"
+/obj/structure/sign/levels/medical/operating_2
+ name = "\improper Operating Theatre 2"
+ desc = "A level sign, stating the level to find Operating Theatre 2 on."
+ icon_state = "level_op2"
+
/obj/structure/sign/directions/medical/virology
name = "\improper Virology"
desc = "A direction sign, pointing out the way to the Virology Lab."
icon_state = "direction_viro"
+/obj/structure/sign/levels/medical/virology
+ name = "\improper Virology"
+ desc = "A level sign, stating the level to find the Virology Lab on."
+ icon_state = "level_viro"
+
/obj/structure/sign/directions/medical/medeqp
name = "\improper Medical Equipment Storage"
desc = "A direction sign, pointing out the way to Medical Equipment Storage."
icon_state = "direction_medeqp"
+/obj/structure/sign/levels/medical/medeqp
+ name = "\improper Medical Equipment Storage"
+ desc = "A level sign, stating the level to find Medical Equipment Storage on."
+ icon_state = "level_medeqp"
+
/obj/structure/sign/directions/medical/morgue
name = "\improper Morgue"
desc = "A direction sign, pointing out the way to the Morgue."
icon_state = "direction_morgue"
+/obj/structure/sign/levels/medical/morgue
+ name = "\improper Morgue"
+ desc = "A level sign, stating the level to find the Morgue on."
+ icon_state = "level_morgue"
+
/obj/structure/sign/directions/medical/cloning
name = "\improper Cloning Lab"
desc = "A direction sign, pointing out the way to the Cloning Lab."
icon_state = "direction_cloning"
+/obj/structure/sign/levels/medical/cloning
+ name = "\improper Cloning Lab"
+ desc = "A level sign, stating the level to find the Cloning Lab on."
+ icon_state = "level_cloning"
+
/obj/structure/sign/directions/medical/resleeving
name = "\improper Resleeving Lab"
desc = "A direction sign, pointing out the way to the Resleeving Lab."
icon_state = "direction_resleeve"
-
+
+/obj/structure/sign/levels/medical/resleeving
+ name = "\improper Resleeving Lab"
+ desc = "A level sign, stating the level to find the Resleeving Lab on."
+ icon_state = "level_resleeve"
+
//special signs
/obj/structure/sign/directions/evac
name = "\improper Evacuation"
desc = "A direction sign, pointing out the way to the Escape Shuttle Dock."
icon_state = "direction_evac"
+/obj/structure/sign/levels/evac
+ name = "\improper Evacuation"
+ desc = "A level sign, stating the level to find the Escape Shuttle Dock on."
+ icon_state = "level_evac"
+
/obj/structure/sign/directions/eva
name = "\improper Extra-Vehicular Activity"
desc = "A direction sign, pointing out the way to the EVA Bay."
icon_state = "direction_eva"
+/obj/structure/sign/levels/eva
+ name = "\improper Extra-Vehicular Activity"
+ desc = "A level sign, stating the level to find the EVA Bay on."
+ icon_state = "level_eva"
+
//command signs
/obj/structure/sign/directions/ai_core
name = "\improper AI Core"
desc = "A direction sign, pointing out the way to the AI Core."
icon_state = "direction_ai_core"
+/obj/structure/sign/levels/ai_core
+ name = "\improper AI Core"
+ desc = "A level sign, stating the level to find the AI Core on."
+ icon_state = "level_ai_core"
+
/obj/structure/sign/directions/bridge
name = "\improper Bridge"
desc = "A direction sign, pointing out the way to the Bridge."
icon_state = "direction_bridge"
+/obj/structure/sign/levels/bridge
+ name = "\improper Bridge"
+ desc = "A level sign, stating the level to find the Bridge on."
+ icon_state = "level_bridge"
+
/obj/structure/sign/directions/command
name = "\improper Command"
desc = "A direction sign, pointing out the way to the Command Center."
icon_state = "direction_command"
+/obj/structure/sign/levels/command
+ name = "\improper Command"
+ desc = "A level sign, stating the level to find the Command Center on."
+ icon_state = "level_command"
+
/obj/structure/sign/directions/teleporter
name = "\improper Teleporter"
desc = "A direction sign, pointing out the way to the Teleporter."
icon_state = "direction_teleport"
+/obj/structure/sign/levels/teleporter
+ name = "\improper Teleporter"
+ desc = "A level sign, stating the level to find the Teleporter on."
+ icon_state = "level_teleport"
+
/obj/structure/sign/directions/telecomms
name = "\improper Telecommunications Hub"
desc = "A direction sign, pointing out the way to the Telecommunications Hub."
icon_state = "direction_tcomms"
-
+
+/obj/structure/sign/levels/telecomms
+ name = "\improper Telecommunications Hub"
+ desc = "A level sign, stating the level to find the Telecommunications Hub on."
+ icon_state = "level_tcomms"
+
//cargonia signs
/obj/structure/sign/directions/cargo
name = "\improper Cargo Department"
desc = "A direction sign, pointing out the way to the Cargo Department."
icon_state = "direction_crg"
+/obj/structure/sign/levels/cargo
+ name = "\improper Cargo Department"
+ desc = "A level sign, stating the level to find the Cargo Department on."
+ icon_state = "level_crg"
+
/obj/structure/sign/directions/cargo/mining
name = "\improper Mining Department"
desc = "A direction sign, pointing out the way to the Mining Department."
icon_state = "direction_mining"
+/obj/structure/sign/levels/cargo/mining
+ name = "\improper Mining Department"
+ desc = "A level sign, stating the level to find the Mining Department on."
+ icon_state = "level_mining"
+
/obj/structure/sign/directions/cargo/refinery
name = "\improper Refinery"
desc = "A direction sign, pointing out the way to the Refinery."
icon_state = "direction_refinery"
+/obj/structure/sign/levels/cargo/refinery
+ name = "\improper Refinery"
+ desc = "A level sign, stating the level to find the Refinery on."
+ icon_state = "level_refinery"
+
//civilian/misc signs
/obj/structure/sign/directions/roomnum
name = "room number"
@@ -563,66 +783,131 @@
desc = "A direction sign, pointing out the way to Cryogenic Storage."
icon_state = "direction_cry"
+/obj/structure/sign/levels/cryo
+ name = "\improper Cryogenic Storage"
+ desc = "A level sign, stating the level to find Cryogenic Storage on."
+ icon_state = "level_cry"
+
/obj/structure/sign/directions/elevator
name = "\improper Elevator"
desc = "A direction sign, pointing out the way to the nearest elevator."
icon_state = "direction_elv"
+/obj/structure/sign/levels/elevator
+ name = "\improper Elevator"
+ desc = "A level sign, stating the level to find the nearest elevator on."
+ icon_state = "level_elv"
+
/obj/structure/sign/directions/bar
name = "\improper Bar"
desc = "A direction sign, pointing out the way to the nearest watering hole."
icon_state = "direction_bar"
+/obj/structure/sign/levels/bar
+ name = "\improper Bar"
+ desc = "A level sign, stating the level to find the nearest watering hole on."
+ icon_state = "level_bar"
+
/obj/structure/sign/directions/kitchen
name = "\improper Kitchen"
desc = "A pictographic direction sign with a knife, plate, and fork, pointing out the way to the nearest dining establishment."
icon_state = "direction_kitchen"
+/obj/structure/sign/levels/kitchen
+ name = "\improper Kitchen"
+ desc = "A pictographic direction sign with a knife, plate, and fork, stating the level to find the nearest dining establishment on."
+ icon_state = "level_kitchen"
+
/obj/structure/sign/directions/tram
name = "\improper Public Transit Station"
desc = "A direction sign, pointing out the way to the nearest public transit station."
icon_state = "direction_tram"
+/obj/structure/sign/levels/tram
+ name = "\improper Public Transit Station"
+ desc = "A level sign, stating the level to find the nearest public transit station on."
+ icon_state = "level_tram"
+
/obj/structure/sign/directions/janitor
name = "\improper Custodial Closet"
desc = "A direction sign, pointing out the way to the Custodial Closet."
icon_state = "direction_janitor"
+/obj/structure/sign/levels/janitor
+ name = "\improper Custodial Closet"
+ desc = "A level sign, stating the level to find the Custodial Closet on."
+ icon_state = "level_janitor"
+
/obj/structure/sign/directions/chapel
name = "\improper Chapel"
desc = "A direction sign, pointing out the way to the Chapel."
icon_state = "direction_chapel"
+/obj/structure/sign/levels/chapel
+ name = "\improper Chapel"
+ desc = "A level sign, stating the level to find the Chapel on."
+ icon_state = "level_chapel"
+
/obj/structure/sign/directions/dorms
name = "\improper Dormitories"
desc = "A direction sign, pointing out the way to the Dormitories."
icon_state = "direction_dorms"
+/obj/structure/sign/levels/dorms
+ name = "\improper Dormitories"
+ desc = "A level sign, stating the level to find the Dormitories on."
+ icon_state = "level_dorms"
+
/obj/structure/sign/directions/library
name = "\improper Library"
desc = "A direction sign, pointing out the way to the Library."
icon_state = "direction_library"
+/obj/structure/sign/levels/library
+ name = "\improper Library"
+ desc = "A level sign, stating the level to find the Library on."
+ icon_state = "level_library"
+
/obj/structure/sign/directions/dock
name = "\improper Dock"
desc = "A direction sign, pointing out the way to the nearest docking area."
icon_state = "direction_dock"
+/obj/structure/sign/levels/dock
+ name = "\improper Dock"
+ desc = "A level sign, stating the level to find the nearest docking area on."
+ icon_state = "level_dock"
+
/obj/structure/sign/directions/gym
name = "\improper Gym"
desc = "A direction sign, pointing out the way to the Gym."
icon_state = "direction_gym"
+/obj/structure/sign/levels/gym
+ name = "\improper Gym"
+ desc = "A level sign, stating the level to find the Gym on."
+ icon_state = "level_gym"
+
/obj/structure/sign/directions/pool
name = "\improper Pool"
desc = "A direction sign, pointing out the way to the Pool."
icon_state = "direction_pool"
+/obj/structure/sign/levels/pool
+ name = "\improper Pool"
+ desc = "A level sign, stating the level to find the Pool on."
+ icon_state = "level_pool"
+
/obj/structure/sign/directions/recreation
name = "\improper Recreation Area"
desc = "A direction sign, pointing out the way to the nearest Recreation Area."
icon_state = "direction_recreation"
+/obj/structure/sign/levels/recreation
+ name = "\improper Recreation Area"
+ desc = "A level sign, stating the level to find the nearest Recreation Area on."
+ icon_state = "level_recreation"
+
/obj/structure/sign/directions/stairwell
name = "\improper Stairwell"
desc = "A direction sign with stairs and a door, pointing out the way to the nearest stairwell."
@@ -1038,6 +1323,48 @@
name = "\improper Fourth Deck"
icon_state = "deck-4"
+/obj/structure/sign/level/one
+ name = "\improper Level One"
+ icon_state = "level-1"
+
+/obj/structure/sign/level/one/large
+ icon_state = "level-1-large"
+
+/obj/structure/sign/level/two
+ name = "\improper Level Two"
+ icon_state = "level-2"
+
+/obj/structure/sign/level/two/large
+ icon_state = "level-2-large"
+
+/obj/structure/sign/level/three
+ name = "\improper Level Three"
+ icon_state = "level-3"
+
+/obj/structure/sign/level/three/large
+ icon_state = "level-3-large"
+
+/obj/structure/sign/level/fourth
+ name = "\improper Level Four"
+ icon_state = "level-4"
+
+/obj/structure/sign/level/four/large
+ icon_state = "level-4-large"
+
+/obj/structure/sign/level/basement
+ name = "\improper Basement Level"
+ icon_state = "level-b"
+
+/obj/structure/sign/level/basement/large
+ icon_state = "level-b-large"
+
+/obj/structure/sign/level/ground
+ name = "\improper Basement Level"
+ icon_state = "level-g"
+
+/obj/structure/sign/level/ground/large
+ icon_state = "level-g-large"
+
/obj/structure/sign/hangar/one
name = "\improper Hangar One"
icon_state = "hangar-1"
@@ -1078,12 +1405,61 @@
name = "\improper AIR"
icon_state = "atmos_air"
-/obj/structure/sign/poi/engineleft
+/obj/structure/sign/scenery/engineleft
name = "I.C.V."
desc = "The charred name of a cargo ship of some description."
icon_state = "poi_engine1"
-/obj/structure/sign/poi/engineright
+/obj/structure/sign/scenery/engineright
name = "I.C.V."
desc = "The charred name of a cargo ship of some description."
- icon_state = "poi_engine2"
\ No newline at end of file
+ icon_state = "poi_engine2"
+
+//Direction/Level sign overlays. Not mechanically functional as noted above, but usable for mapping.
+/obj/structure/sign/scenery/overlay
+ name = "snow covering"
+ desc = "Frozen snow obscures the view of a sign beneath."
+ icon_state = "snowy"
+ icon = 'icons/obj/decals_directions.dmi'
+
+/obj/structure/sign/scenery/overlay/rust
+ name = "rust covering"
+ desc = "Thick rust obscures the view of a sign beneath."
+ icon_state = "rusted"
+
+/obj/structure/sign/scenery/overlay/vine
+ name = "vine covering"
+ desc = "Thick vines obscure the view of a sign beneath."
+ icon_state = "vines"
+
+/obj/structure/sign/scenery/overlay/vine/top
+ icon_state = "vines_top"
+
+/obj/structure/sign/scenery/overlay/vine/mid
+ icon_state = "vines_mid"
+
+/obj/structure/sign/scenery/overlay/vine/bottom
+ icon_state = "vines_bottom"
+
+/obj/structure/sign/bigname
+ name = "Cynosure Station"
+ desc = "An aging sign for the Cynosure Xenoarchaeological Research Station."
+ icon_state = "cyno_1"
+
+/obj/structure/sign/bigname/seg_2
+ icon_state = "cyno_2"
+
+/obj/structure/sign/bigname/seg_3
+ icon_state = "cyno_3"
+
+/obj/structure/sign/bigname/seg_4
+ icon_state = "cyno_4"
+
+/obj/structure/sign/bigname/seg_5
+ icon_state = "cyno_5"
+
+/obj/structure/sign/bigname/seg_6
+ icon_state = "cyno_6"
+
+/obj/structure/sign/bigname/seg_7
+ icon_state = "cyno_7"
diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm
index 3113d6a71e..5da83511c6 100644
--- a/code/game/objects/structures/under_wardrobe.dm
+++ b/code/game/objects/structures/under_wardrobe.dm
@@ -1,8 +1,8 @@
/obj/structure/undies_wardrobe
name = "underwear wardrobe"
desc = "Holds item of clothing you shouldn't be showing off in the hallways."
- icon = 'icons/obj/closet.dmi'
- icon_state = "cabinet_closed"
+ icon = 'icons/obj/closets/undies_wardrobe.dmi'
+ icon_state = "wardrobe"
density = TRUE
/obj/structure/undies_wardrobe/attack_hand(var/mob/user)
diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm
index ce71ab6a84..a5af6b9463 100644
--- a/code/game/turfs/flooring/flooring_decals.dm
+++ b/code/game/turfs/flooring/flooring_decals.dm
@@ -16,8 +16,8 @@ var/list/floor_decals = list()
color = newcolour
..(newloc)
-// TODO: identify what is causing these atoms to be qdeleted in New()/Initialize()
-// somewhere in this chain. Alternatively repath to /obj/floor_decal or some other
+// TODO: identify what is causing these atoms to be qdeleted in New()/Initialize()
+// somewhere in this chain. Alternatively repath to /obj/floor_decal or some other
// abstract handler that explicitly doesn't invoke any obj behavior.
/obj/effect/floor_decal/Initialize()
add_to_turf_decals()
@@ -1230,6 +1230,31 @@ var/list/floor_decals = list()
icon_state = "plaque"
desc = "A plaque commerating the building efforts of the sleepiest outpost in the sector, Yawn Wider."
+//Multi-part Floor Signs
+
+/obj/effect/floor_decal/arrivals
+ name = "arrivals sign"
+ icon_state = "arrivals_1"
+
+/obj/effect/floor_decal/arrivals/right
+ icon_state = "arrivals_2"
+
+/obj/effect/floor_decal/shuttles
+ name = "departures sign"
+ icon_state = "shuttle_1"
+
+/obj/effect/floor_decal/shuttles/right
+ icon_state = "shuttle_2"
+
+/obj/effect/floor_decal/arrow
+ name = "floor arrow"
+ icon_state = "arrow_single"
+
+/obj/effect/floor_decal/arrows
+ name = "floor arrows"
+ icon_state = "arrows"
+
+//YW
/obj/effect/floor_decal/snow
name = "snow"
icon = 'icons/turf/overlays.dmi'
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index ff22e219f4..c19b70a85d 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1171,9 +1171,9 @@ var/datum/announcement/minor/admin_min_announcer = new
log_admin("[key_name(usr)] spawned [seedtype] vines at ([usr.x],[usr.y],[usr.z])")
/datum/admins/proc/spawn_atom(var/object as text)
+ set name = "Spawn"
set category = "Debug"
set desc = "(atom path) Spawn an atom"
- set name = "Spawn"
if(!check_rights(R_SPAWN)) return
diff --git a/code/modules/admin/admin_verb_lists.dm b/code/modules/admin/admin_verb_lists.dm
index 23b5ab9415..b5442a97d8 100644
--- a/code/modules/admin/admin_verb_lists.dm
+++ b/code/modules/admin/admin_verb_lists.dm
@@ -142,6 +142,7 @@ var/list/admin_verbs_fun = list(
/datum/admins/proc/call_drop_pod,
/client/proc/smite,
/client/proc/admin_lightning_strike,
+ /client/proc/cmd_admin_droppod_deploy
)
var/list/admin_verbs_spawn = list(
@@ -150,6 +151,7 @@ var/list/admin_verbs_spawn = list(
/datum/admins/proc/check_custom_items,
/datum/admins/proc/spawn_plant,
/datum/admins/proc/spawn_atom, //allows us to spawn instances,
+ /client/proc/cmd_admin_droppod_spawn,
/client/proc/respawn_character,
/client/proc/virus2_editor,
/client/proc/spawn_chemdisp_cartridge,
diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm
index 2b4abb1ff3..a4e2e921f5 100644
--- a/code/modules/admin/admin_verb_lists_vr.dm
+++ b/code/modules/admin/admin_verb_lists_vr.dm
@@ -157,7 +157,8 @@ var/list/admin_verbs_fun = list(
/client/proc/smite,
/client/proc/smite_vr, //VOREStation Add,
/client/proc/admin_lightning_strike,
- /client/proc/resize //VOREStation Add,
+ /client/proc/resize, //VOREStation Add,
+ /client/proc/cmd_admin_droppod_deploy
)
var/list/admin_verbs_spawn = list(
@@ -166,6 +167,7 @@ var/list/admin_verbs_spawn = list(
/datum/admins/proc/check_custom_items,
/datum/admins/proc/spawn_plant,
/datum/admins/proc/spawn_atom, //allows us to spawn instances,
+ /client/proc/cmd_admin_droppod_spawn,
/client/proc/respawn_character,
/client/proc/spawn_character_mob, //VOREStation Add,
/client/proc/virus2_editor,
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index a581d3fb82..267871366b 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -390,7 +390,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(location == "Cancel" || !location)
return
- var/announce = tgui_alert(src,"Announce as if they had just arrived?", "Announce", list("Yes", "No", "Cancel"))
+ var/announce = tgui_alert(src,"Announce as if they had just arrived?", "Announce", list("No", "Yes", "Cancel"))
if(announce == "Cancel")
return
else if(announce == "Yes") //Too bad buttons can't just have 1/0 values and different display strings
@@ -420,7 +420,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
else if(samejob == USELESS_JOB) //VOREStation Edit - Visitor not Assistant
charjob = USELESS_JOB //VOREStation Edit - Visitor not Assistant
else
- records = tgui_alert(src,"No data core entry detected. Would you like add them to the manifest, and sec/med/HR records?","Records",list("Yes","No","Cancel"))
+ records = tgui_alert(src,"No data core entry detected. Would you like add them to the manifest, and sec/med/HR records?","Records",list("No", "Yes", "Cancel"))
if(records == "Cancel")
return
if(records == "Yes")
@@ -457,17 +457,19 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/mob/living/carbon/human/new_character
var/spawnloc
- var/sparks
+ var/showy
//Where did you want to spawn them?
switch(location)
if("Right Here") //Spawn them on your turf
spawnloc = get_turf(src.mob)
- sparks = tgui_alert(src,"Sparks like they teleported in?", "Showy", list("Yes", "No", "Cancel"))
- if(sparks == "Cancel")
+ showy = tgui_alert(src,"Showy entrance?", "Showy", list("No", "Telesparks", "Drop Pod", "Cancel"))
+ if(showy == "Cancel")
return
- if(sparks == "No")
- sparks = FALSE
+ if(showy == "Drop Pod")
+ showy = tgui_alert(src,"Destructive drop pods cause damage in a 3x3 and may break turfs. Polite drop pods lightly damage the turfs but won't break through.", "Drop Pod", list("Polite", "Destructive", "Cancel")) // reusing var
+ if(showy == "Cancel")
+ return
if("Arrivals") //Spawn them at a latejoin spawnpoint
spawnloc = pick(latejoin)
@@ -483,7 +485,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
new_character = new(spawnloc)
- if(sparks)
+ if(showy == "Telesparks")
anim(spawnloc,new_character,'icons/mob/mob.dmi',,"phasein",,new_character.dir)
playsound(spawnloc, "sparks", 50, 1)
var/datum/effect/effect/system/spark_spread/spk = new(new_character)
@@ -546,9 +548,21 @@ Traitors and the like can also be revived with the previous role mostly intact.
log_admin("[admin] has spawned [player_key]'s character [new_character.real_name].")
message_admins("[admin] has spawned [player_key]'s character [new_character.real_name].", 1)
- to_chat(new_character, "You have been fully spawned. Enjoy the game.")
+
feedback_add_details("admin_verb","RSPCH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+ // Drop pods
+ if(showy == "Polite")
+ var/turf/T = get_turf(new_character)
+ new /obj/structure/drop_pod/polite(T, new_character)
+ to_chat(new_character, "Please wait for your arrival.")
+ else if(showy == "Destructive")
+ var/turf/T = get_turf(new_character)
+ new /obj/structure/drop_pod(T, new_character)
+ to_chat(new_character, "Please wait for your arrival.")
+ else
+ to_chat(new_character, "You have been fully spawned. Enjoy the game.")
return new_character
@@ -1057,3 +1071,73 @@ Traitors and the like can also be revived with the previous role mostly intact.
else if(isliving(M))
M.ghostize()
qdel(M) //Bye
+
+/client/proc/cmd_admin_droppod_spawn(var/object as text)
+ set name = "Drop Pod Atom"
+ set desc = "Spawn a new atom/movable in a drop pod where you are."
+ set category = "Fun"
+
+ if(!check_rights(R_SPAWN))
+ return
+
+ var/list/types = typesof(/atom/movable)
+ var/list/matches = new()
+
+ for(var/path in types)
+ if(findtext("[path]", object))
+ matches += path
+
+ if(!matches.len)
+ return
+
+ var/chosen
+ if(matches.len==1)
+ chosen = matches[1]
+ else
+ chosen = tgui_input_list(usr, "Select a movable type:", "Spawn in Drop Pod", matches)
+ if(!chosen)
+ return
+
+ var/podtype = tgui_alert(src,"Destructive drop pods cause damage in a 3x3 and may break turfs. Polite drop pods lightly damage the turfs but won't break through.", "Drop Pod", list("Polite", "Destructive", "Cancel"))
+ if(podtype == "Cancel")
+ return
+ var/autoopen = tgui_alert(src,"Should the pod open automatically?", "Drop Pod", list("Yes", "No", "Cancel"))
+ if(autoopen == "Cancel")
+ return
+ switch(podtype)
+ if("Destructive")
+ var/atom/movable/AM = new chosen(usr.loc)
+ new /obj/structure/drop_pod(get_turf(usr), AM, autoopen == "Yes" ? TRUE : FALSE)
+ if("Polite")
+ var/atom/movable/AM = new chosen(usr.loc)
+ new /obj/structure/drop_pod/polite(get_turf(usr), AM, autoopen == "Yes" ? TRUE : FALSE)
+
+ feedback_add_details("admin_verb","DPA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/proc/cmd_admin_droppod_deploy()
+ set name = "Drop Pod Deploy"
+ set desc = "Drop an existing mob where you are in a drop pod."
+ set category = "Fun"
+
+ if(!check_rights(R_SPAWN))
+ return
+
+ var/mob/living/L = tgui_input_list(usr, "Select the mob to drop:", "Mob Picker", living_mob_list)
+ if(!L)
+ return
+
+ var/podtype = tgui_alert(src,"Destructive drop pods cause damage in a 3x3 and may break turfs. Polite drop pods lightly damage the turfs but won't break through.", "Drop Pod", list("Polite", "Destructive", "Cancel"))
+ if(podtype == "Cancel")
+ return
+ var/autoopen = tgui_alert(src,"Should the pod open automatically?", "Drop Pod", list("Yes", "No", "Cancel"))
+ if(autoopen == "Cancel")
+ return
+ if(!L || QDELETED(L))
+ return
+ switch(podtype)
+ if("Destructive")
+ new /obj/structure/drop_pod(get_turf(usr), L, autoopen == "Yes" ? TRUE : FALSE)
+ if("Polite")
+ new /obj/structure/drop_pod/polite(get_turf(usr), L, autoopen == "Yes" ? TRUE : FALSE)
+
+ feedback_add_details("admin_verb","DPD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
\ No newline at end of file
diff --git a/code/modules/recycling/recycling.dm b/code/modules/recycling/recycling.dm
new file mode 100644
index 0000000000..26eab561e2
--- /dev/null
+++ b/code/modules/recycling/recycling.dm
@@ -0,0 +1,220 @@
+/obj/machinery/recycling
+ idle_power_usage = 5
+ active_power_usage = 500
+ density = TRUE
+ anchored = TRUE
+
+ var/working = FALSE
+
+/obj/machinery/recycling/process()
+ return PROCESS_KILL // these are all stateful
+
+/obj/machinery/recycling/update_icon()
+ . = ..()
+ cut_overlays()
+ if(panel_open)
+ add_overlay("[initial(icon_state)]-panel")
+
+/**
+ * Generic procs common to all
+ */
+/obj/machinery/recycling/attackby(obj/item/O, mob/user)
+ if(!isliving(user) || !Adjacent(user))
+ return
+
+ if(working)
+ to_chat("\The [src] is busy! Wait until it's idle.")
+ return
+
+ if(default_deconstruction_screwdriver(user, O))
+ return
+ if(default_deconstruction_crowbar(user, O))
+ return
+ if(default_part_replacement(user, O))
+ return
+
+ var/mob/living/M = user
+ if(can_accept_item(O))
+ M.drop_from_inventory(O)
+ take_item(O)
+ M.visible_message("[M] inserts [O] into [src].", "You insert [O] into [src].")
+ else
+ to_chat(user, "\The [src] can't accept [O] for recycling.")
+
+// Conveyors etc
+/obj/machinery/recycling/Bumped(atom/A)
+ if(isitem(A) && can_accept_item(A))
+ take_item(A)
+
+/obj/machinery/recycling/proc/can_accept_item(obj/item/O)
+ if(stat & (NOPOWER|BROKEN))
+ return FALSE
+ if(panel_open)
+ return FALSE
+ return !working
+
+/obj/machinery/recycling/proc/take_item(obj/item/O)
+ O.forceMove(src)
+
+/**
+ * This machine takes items and turns them into heaps of junk.
+ */
+/obj/machinery/recycling/crusher
+ name = "recycling crusher"
+ desc = "This machine is designed to break things into their constituient parts via the application of directed kinetic force. A.K.A. it crushes things into bits."
+ description_info = "This machine is the first step in turning things back into their materials. There's a bit of loss, depending on how upgraded it is. The output of this machine goes into the sorter."
+ icon = 'icons/obj/recycling.dmi'
+ icon_state = "crusher"
+ circuit = /obj/item/weapon/circuitboard/recycler_crusher
+
+ working = FALSE
+ var/effic_factor = 0.5
+
+/obj/machinery/recycling/crusher/RefreshParts()
+ . = ..()
+ var/total_rating = 0
+ for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ total_rating += M.rating
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ total_rating += M.rating
+
+ total_rating *= 0.1
+
+ effic_factor = CLAMP01(initial(effic_factor)+total_rating)
+
+/obj/machinery/recycling/crusher/can_accept_item(obj/item/O)
+ if(LAZYLEN(O.matter))
+ return ..()
+ return FALSE
+
+/obj/machinery/recycling/crusher/take_item(obj/item/O)
+ . = ..()
+ working = TRUE
+ icon_state = "crusher-process"
+ update_use_power(USE_POWER_ACTIVE)
+ sleep(5 SECONDS)
+ var/list/modified_mats = list()
+ for(var/mat in O.matter)
+ modified_mats[mat] = O.matter[mat]*effic_factor
+ new /obj/item/debris_pack(get_step(src, dir), modified_mats)
+ update_use_power(USE_POWER_IDLE)
+ icon_state = "crusher"
+ qdel(O)
+ working = FALSE
+
+/**
+ * This machine takes heaps of junk and holds onto them until it has enough of one material to make a sheet.
+ */
+/obj/machinery/recycling/sorter
+ name = "debris sorter"
+ desc = "A machine for retaining debris and sorting it until enough of a similar material have accumulated to warrant conversion into sheets or ingots."
+ description_info = "The output of the recycling crusher should go into this machine, and it will output material dust, which can go into the sheet stamper to make sheets."
+ icon = 'icons/obj/recycling.dmi'
+ icon_state = "sorter"
+ circuit = /obj/item/weapon/circuitboard/recycler_sorter
+
+ var/list/materials = list()
+ working = FALSE
+
+/obj/machinery/recycling/sorter/can_accept_item(obj/item/O)
+ if(istype(O, /obj/item/debris_pack))
+ return ..()
+ return FALSE
+
+/obj/machinery/recycling/sorter/take_item(obj/item/O)
+ . = ..()
+ working = TRUE
+ icon_state = "sorter-process"
+ update_use_power(USE_POWER_ACTIVE)
+ sleep(5 SECONDS)
+ sort_item(O)
+ dispense_if_possible()
+ update_use_power(USE_POWER_IDLE)
+ icon_state = "sorter"
+ working = FALSE
+
+/obj/machinery/recycling/sorter/proc/sort_item(obj/item/O)
+ for(var/mat in O.matter)
+ if(mat in materials)
+ materials[mat] += O.matter[mat]
+ else
+ materials[mat] = O.matter[mat]
+ qdel(O)
+
+/obj/machinery/recycling/sorter/proc/dispense_if_possible()
+ for(var/mat in materials)
+ while(materials[mat] >= SHEET_MATERIAL_AMOUNT)
+ materials[mat] -= SHEET_MATERIAL_AMOUNT
+ new /obj/item/material_dust(get_step(src, dir), mat)
+ sleep(2 SECONDS)
+
+/**
+ * This machine makes sheets after being provided with material dust from a sorter.
+ */
+/obj/machinery/recycling/stamper
+ name = "sheet stamper"
+ desc = "A machine to press homogenous material particulate into more solid portable units of production. A.K.A. it compacts dust into sheets."
+ description_info = "This machine is the last step in the recycling process. The output of a debris sorter should be fed into this machine and it will produce material sheets."
+ icon = 'icons/obj/recycling.dmi'
+ icon_state = "stamper"
+ circuit = /obj/item/weapon/circuitboard/recycler_stamper
+
+/obj/machinery/recycling/stamper/can_accept_item(obj/item/O)
+ if(istype(O, /obj/item/material_dust))
+ return ..()
+ return FALSE
+
+/obj/machinery/recycling/stamper/take_item(obj/item/O)
+ . = ..()
+ working = TRUE
+ icon_state = "stamper-process"
+ update_use_power(USE_POWER_ACTIVE)
+ sleep(64)
+ dust_to_sheet(O)
+ icon_state = "stamper"
+ update_use_power(USE_POWER_IDLE)
+ working = FALSE
+
+/obj/machinery/recycling/stamper/proc/dust_to_sheet(obj/item/material_dust/D)
+ if(!istype(D))
+ return
+ var/datum/material/M = get_material_by_name(D.material_name)
+ if(!M)
+ D.forceMove(get_step(src, dir))
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
+ warning("Dust in [src] had material_name [D.material_name], which can't be made into stacks")
+ return
+
+ var/stacktype = M.stack_type
+ var/turf/T = get_step(src, dir)
+ var/obj/item/stack/S = locate(stacktype) in T
+ if(S)
+ S.amount++
+ else
+ new stacktype(T)
+
+/obj/item/debris_pack
+ name = "debris"
+ desc = "Some ground-up parts of ... something. Might be useful for recycling."
+ icon = 'icons/obj/recycling.dmi'
+ icon_state = "debris"
+ w_class = ITEMSIZE_NORMAL
+
+/obj/item/debris_pack/New(newloc, list/matter)
+ ..()
+ src.matter = matter.Copy()
+
+/obj/item/material_dust
+ name = "dust"
+ desc = "A homogenous powder of some material or another. Might be useful for recycling."
+ icon = 'icons/obj/recycling.dmi'
+ icon_state = "matdust"
+ w_class = ITEMSIZE_SMALL
+ var/material_name
+
+/obj/item/material_dust/New(loc, mat)
+ ..()
+ material_name = mat
+ name = "[material_name] [initial(name)]"
+ var/datum/material/M = get_material_by_name(material_name)
+ color = M?.icon_colour
\ No newline at end of file
diff --git a/code/modules/research/designs/circuits/circuits.dm b/code/modules/research/designs/circuits/circuits.dm
index 9cc6dee112..c4c0825a2e 100644
--- a/code/modules/research/designs/circuits/circuits.dm
+++ b/code/modules/research/designs/circuits/circuits.dm
@@ -690,3 +690,24 @@ CIRCUITS BELOW
req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_COMBAT = 2)
build_path = /obj/item/weapon/circuitboard/pointdefense_control
sort_string = "OAABB"
+
+/datum/design/circuit/recycler_crusher
+ name = "recycler - crusher"
+ id = "recycler_crusher"
+ req_tech = list(TECH_MATERIAL = 2)
+ build_path = /obj/item/weapon/circuitboard/recycler_crusher
+ sort_string = "OAABC"
+
+/datum/design/circuit/recycler_sorter
+ name = "recycler - sorter"
+ id = "recycler_sorter"
+ req_tech = list(TECH_MATERIAL = 2)
+ build_path = /obj/item/weapon/circuitboard/recycler_sorter
+ sort_string = "OAABD"
+
+/datum/design/circuit/recycler_stamper
+ name = "recycler - stamper"
+ id = "recycler_stamper"
+ req_tech = list(TECH_MATERIAL = 2)
+ build_path = /obj/item/weapon/circuitboard/recycler_stamper
+ sort_string = "OAABE"
diff --git a/icons/obj/closets/undies_wardrobe.dmi b/icons/obj/closets/undies_wardrobe.dmi
new file mode 100644
index 0000000000..c412cd0b76
Binary files /dev/null and b/icons/obj/closets/undies_wardrobe.dmi differ
diff --git a/icons/obj/decals_directions.dmi b/icons/obj/decals_directions.dmi
index 6b6ddf5283..14a8bd15b2 100644
Binary files a/icons/obj/decals_directions.dmi and b/icons/obj/decals_directions.dmi differ
diff --git a/icons/obj/decals_levels.dmi b/icons/obj/decals_levels.dmi
new file mode 100644
index 0000000000..5390bf9bcf
Binary files /dev/null and b/icons/obj/decals_levels.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/2x1comdoor.dmi b/icons/obj/doors/angled/tgmc/2x1comdoor.dmi
new file mode 100644
index 0000000000..49b5658a98
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/2x1comdoor.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/2x1generic.dmi b/icons/obj/doors/angled/tgmc/2x1generic.dmi
new file mode 100644
index 0000000000..79d73e0f6b
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/2x1generic.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/2x1medidoor.dmi b/icons/obj/doors/angled/tgmc/2x1medidoor.dmi
new file mode 100644
index 0000000000..4de8eb6f77
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/2x1medidoor.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/2x1secdoor.dmi b/icons/obj/doors/angled/tgmc/2x1secdoor.dmi
new file mode 100644
index 0000000000..ac0456182a
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/2x1secdoor.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/blastdoors_shutters.dmi b/icons/obj/doors/angled/tgmc/blastdoors_shutters.dmi
new file mode 100644
index 0000000000..75dcf76ea5
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/blastdoors_shutters.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/celldoor.dmi b/icons/obj/doors/angled/tgmc/celldoor.dmi
new file mode 100644
index 0000000000..bd2e83eb7b
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/celldoor.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/comdoor.dmi b/icons/obj/doors/angled/tgmc/comdoor.dmi
new file mode 100644
index 0000000000..0c753a597a
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/comdoor.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/dropship1_cargo.dmi b/icons/obj/doors/angled/tgmc/dropship1_cargo.dmi
new file mode 100644
index 0000000000..62408832a2
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/dropship1_cargo.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/dropship1_pilot.dmi b/icons/obj/doors/angled/tgmc/dropship1_pilot.dmi
new file mode 100644
index 0000000000..9e4d67c81d
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/dropship1_pilot.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/dropship2_cargo.dmi b/icons/obj/doors/angled/tgmc/dropship2_cargo.dmi
new file mode 100644
index 0000000000..7c73c84031
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/dropship2_cargo.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/dropship2_pilot.dmi b/icons/obj/doors/angled/tgmc/dropship2_pilot.dmi
new file mode 100644
index 0000000000..c30e29e47e
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/dropship2_pilot.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/engidoor.dmi b/icons/obj/doors/angled/tgmc/engidoor.dmi
new file mode 100644
index 0000000000..fd25f24af7
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/engidoor.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/maintdoor.dmi b/icons/obj/doors/angled/tgmc/maintdoor.dmi
new file mode 100644
index 0000000000..c65b9cc62a
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/maintdoor.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/medidoor.dmi b/icons/obj/doors/angled/tgmc/medidoor.dmi
new file mode 100644
index 0000000000..d67a35e715
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/medidoor.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/medidoor_glass.dmi b/icons/obj/doors/angled/tgmc/medidoor_glass.dmi
new file mode 100644
index 0000000000..5a53591f9b
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/medidoor_glass.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/personaldoor.dmi b/icons/obj/doors/angled/tgmc/personaldoor.dmi
new file mode 100644
index 0000000000..ab4e35390a
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/personaldoor.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/pod_doors.dmi b/icons/obj/doors/angled/tgmc/pod_doors.dmi
new file mode 100644
index 0000000000..a561787518
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/pod_doors.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/prepdoor.dmi b/icons/obj/doors/angled/tgmc/prepdoor.dmi
new file mode 100644
index 0000000000..f1b1024b56
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/prepdoor.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/prepdoor_alpha.dmi b/icons/obj/doors/angled/tgmc/prepdoor_alpha.dmi
new file mode 100644
index 0000000000..259bc6af15
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/prepdoor_alpha.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/prepdoor_bravo.dmi b/icons/obj/doors/angled/tgmc/prepdoor_bravo.dmi
new file mode 100644
index 0000000000..612a8cf255
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/prepdoor_bravo.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/prepdoor_charlie.dmi b/icons/obj/doors/angled/tgmc/prepdoor_charlie.dmi
new file mode 100644
index 0000000000..5a1f6f4475
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/prepdoor_charlie.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/prepdoor_delta.dmi b/icons/obj/doors/angled/tgmc/prepdoor_delta.dmi
new file mode 100644
index 0000000000..459c6d8ccb
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/prepdoor_delta.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/purinadoor.dmi b/icons/obj/doors/angled/tgmc/purinadoor.dmi
new file mode 100644
index 0000000000..6100af6a3b
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/purinadoor.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/secdoor.dmi b/icons/obj/doors/angled/tgmc/secdoor.dmi
new file mode 100644
index 0000000000..3a0da6f17b
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/secdoor.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/secdoor_glass.dmi b/icons/obj/doors/angled/tgmc/secdoor_glass.dmi
new file mode 100644
index 0000000000..95a1145856
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/secdoor_glass.dmi differ
diff --git a/icons/obj/doors/angled/tgmc/securedoor.dmi b/icons/obj/doors/angled/tgmc/securedoor.dmi
new file mode 100644
index 0000000000..acb315d27d
Binary files /dev/null and b/icons/obj/doors/angled/tgmc/securedoor.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index f5507f1e26..79c778bd12 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/recycling.dmi b/icons/obj/recycling.dmi
index eea7e7aaff..4252532f88 100644
Binary files a/icons/obj/recycling.dmi and b/icons/obj/recycling.dmi differ
diff --git a/icons/obj/structures/decor.dmi b/icons/obj/structures/decor.dmi
index 96d6afb6b8..fb79f4a39f 100644
Binary files a/icons/obj/structures/decor.dmi and b/icons/obj/structures/decor.dmi differ
diff --git a/icons/obj/structures/droppod.dmi b/icons/obj/structures/droppod.dmi
new file mode 100644
index 0000000000..9254c59eeb
Binary files /dev/null and b/icons/obj/structures/droppod.dmi differ
diff --git a/icons/turf/flooring/decals.dmi b/icons/turf/flooring/decals.dmi
index acd81e57f1..c98b77736c 100644
Binary files a/icons/turf/flooring/decals.dmi and b/icons/turf/flooring/decals.dmi differ
diff --git a/maps/offmap_vr/om_ships/aro3.dmm b/maps/offmap_vr/om_ships/aro3.dmm
index 6fb00768fc..3c877ab951 100644
--- a/maps/offmap_vr/om_ships/aro3.dmm
+++ b/maps/offmap_vr/om_ships/aro3.dmm
@@ -173,11 +173,11 @@
/turf/simulated/floor/plating/eris/under,
/area/aro3/atmos)
"bk" = (
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
dir = 4;
id_tag = "aro3_private1";
name = "private quarters 1";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/suite_port)
@@ -198,9 +198,9 @@
/turf/simulated/floor/tiled/eris/dark/gray_perforated,
/area/shuttle/aroboat3)
"bv" = (
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
name = "bunkroom 3";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/bunkrooms)
@@ -537,7 +537,7 @@
/obj/structure/cable/cyan{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
dir = 4;
name = "storage room";
stripe_color = "#9e6243"
@@ -586,10 +586,10 @@
/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
id_tag = "aro3_private1";
name = "private quarters 1";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/suite_port)
@@ -751,10 +751,10 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
id_tag = "aro3_private2";
name = "private quarters 2";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/suite_starboard)
@@ -1030,10 +1030,10 @@
/obj/structure/cable/cyan{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
dir = 4;
name = "public restroom";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/wc_starboard)
@@ -1068,7 +1068,7 @@
/turf/simulated/floor/tiled/eris/steel/bar_flat,
/area/aro3/bar)
"hU" = (
-/obj/machinery/door/airlock/angled/standard/glass{
+/obj/machinery/door/airlock/angled_bay/standard/glass{
name = "spare supplies"
},
/turf/simulated/floor/tiled/eris/dark/panels,
@@ -1080,7 +1080,7 @@
/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
name = "bar";
stripe_color = "#00AA00"
},
@@ -1104,7 +1104,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 8
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
dir = 8;
name = "medical";
stripe_color = "#6084e0"
@@ -1150,7 +1150,7 @@
/obj/structure/cable/cyan{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
dir = 4;
name = "storage room";
stripe_color = "#9e6243"
@@ -1217,7 +1217,7 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
name = "atmos room";
stripe_color = "#32d3bb"
},
@@ -1283,11 +1283,11 @@
/turf/simulated/floor/tiled/techmaint,
/area/aro3/medical)
"jy" = (
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
dir = 4;
id_tag = "aro3_private2";
name = "private quarters 2";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/suite_starboard)
@@ -1397,9 +1397,9 @@
/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
/area/aro3/hallway_starboard)
"km" = (
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
name = "toilet";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/steel/panels,
/area/aro3/suite_starboard_wc)
@@ -1503,7 +1503,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 8
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
dir = 8
},
/turf/simulated/floor/tiled/eris/steel/panels,
@@ -1614,7 +1614,7 @@
/obj/structure/cable/cyan{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
dir = 8;
name = "workshop";
stripe_color = "#AA00AA"
@@ -2108,9 +2108,9 @@
/turf/simulated/floor/tiled/eris/steel/panels,
/area/aro3/eva_hall)
"qu" = (
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
name = "bunkroom 2";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/bunkrooms)
@@ -2309,7 +2309,7 @@
/obj/structure/cable/cyan{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
dir = 8
},
/turf/simulated/floor/tiled/eris/steel/panels,
@@ -2323,7 +2323,7 @@
/turf/simulated/floor/tiled/eris/white/cargo,
/area/aro3/medical)
"so" = (
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
dir = 4;
name = "storage room";
stripe_color = "#9e6243"
@@ -2416,9 +2416,9 @@
/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
name = "restroom";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/suite_port)
@@ -2453,7 +2453,7 @@
"ti" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/door/airlock/angled/double/glass,
+/obj/machinery/door/airlock/angled_bay/double/glass,
/turf/simulated/floor/tiled/eris/steel/panels,
/area/aro3/hallway_starboard)
"tk" = (
@@ -2520,15 +2520,15 @@
/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/angled/double/glass,
+/obj/machinery/door/airlock/angled_bay/double/glass,
/turf/simulated/floor/tiled/eris/steel/panels,
/area/aro3/hallway_port)
"tY" = (
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
dir = 4;
id_tag = "aro3_private2_bed";
name = "bedroom";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/suite_starboard)
@@ -2642,7 +2642,7 @@
/turf/simulated/floor/tiled/techmaint,
/area/aro3/bar)
"vx" = (
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
name = "ship systems"
},
/turf/simulated/floor/tiled/eris/steel/panels,
@@ -2935,7 +2935,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 8
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
dir = 8
},
/turf/simulated/floor/tiled/eris/steel/panels,
@@ -3186,7 +3186,7 @@
/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
name = "engine room";
stripe_color = "#e6ef40"
},
@@ -3238,7 +3238,7 @@
/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
name = "public hall"
},
/turf/simulated/floor/tiled/eris/steel/panels,
@@ -3382,7 +3382,7 @@
/area/aro3/bar)
"Aa" = (
/obj/structure/fans/hardlight,
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
dir = 8;
door_color = "#AA0000";
name = "port airlock";
@@ -3452,7 +3452,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 8
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
dir = 8;
name = "kitchen"
},
@@ -3918,9 +3918,9 @@
/turf/simulated/floor/tiled/eris/white/cargo,
/area/aro3/medical)
"EM" = (
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
name = "toilet";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/suite_port_wc)
@@ -4003,9 +4003,9 @@
/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
name = "restroom";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/suite_starboard)
@@ -4393,10 +4393,10 @@
/obj/structure/cable/cyan{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
dir = 4;
name = "public restroom";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/steel/panels,
/area/aro3/wc_port)
@@ -4509,7 +4509,7 @@
/turf/simulated/floor/reinforced/airless,
/area/space)
"KK" = (
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
name = "repair bay"
},
/turf/simulated/floor/tiled/eris/steel/panels,
@@ -4857,7 +4857,7 @@
/turf/simulated/floor/tiled/eris/white/golden,
/area/aro3/medical)
"Nj" = (
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
dir = 4;
name = "storage room";
stripe_color = "#9e6243"
@@ -5092,7 +5092,7 @@
/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
name = "ship systems"
},
/turf/simulated/floor/tiled/eris/steel/panels,
@@ -5253,7 +5253,7 @@
"QD" = (
/obj/structure/fans/hardlight,
/obj/machinery/door/firedoor/glass/hidden,
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
name = "hangar";
stripe_color = "#AA0000"
},
@@ -5275,7 +5275,7 @@
/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
name = "park"
},
/turf/simulated/floor/tiled/eris/steel/panels,
@@ -5328,11 +5328,11 @@
/turf/simulated/floor/tiled/eris/dark/gray_platform,
/area/aro3/hallway_bunkrooms)
"Rm" = (
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
dir = 4;
id_tag = "aro3_private1_bed";
name = "bedroom";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/suite_port)
@@ -5509,7 +5509,7 @@
/obj/structure/cable/cyan{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
dir = 8
},
/turf/simulated/floor/tiled/eris/steel/panels,
@@ -5589,7 +5589,7 @@
/turf/simulated/floor/tiled/eris/cafe,
/area/aro3/kitchen)
"TO" = (
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
name = "kitchen"
},
/turf/simulated/floor/tiled/eris/steel/panels,
@@ -5629,7 +5629,7 @@
/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
name = "bridge";
req_one_access = list(777);
stripe_color = "#0000AA"
@@ -5639,7 +5639,7 @@
"Uj" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
name = "bunkrooms";
stripe_color = "#00AA00"
},
@@ -5674,7 +5674,7 @@
/obj/structure/cable/cyan{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
dir = 8
},
/turf/simulated/floor/tiled/eris/steel/panels,
@@ -5752,9 +5752,9 @@
/turf/simulated/floor/tiled/eris/dark/gray_perforated,
/area/aro3/engines)
"Vv" = (
-/obj/machinery/door/airlock/angled/standard{
+/obj/machinery/door/airlock/angled_bay/standard{
name = "bunkroom 1";
- stripe_color = "#00AA00
+ stripe_color = "#00AA00"
},
/turf/simulated/floor/tiled/eris/dark/panels,
/area/aro3/bunkrooms)
@@ -5769,7 +5769,7 @@
/area/aro3/suite_starboard_wc)
"VO" = (
/obj/structure/fans/hardlight,
-/obj/machinery/door/airlock/angled/double/glass{
+/obj/machinery/door/airlock/angled_bay/double/glass{
dir = 8;
door_color = "#AA0000";
name = "starboard airlock";
@@ -6015,7 +6015,7 @@
/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/angled/standard/glass{
+/obj/machinery/door/airlock/angled_bay/standard/glass{
name = "qpad room";
stripe_color = "#AA00AA"
},
diff --git a/maps/southern_cross/southern_cross-6.dmm b/maps/southern_cross/southern_cross-6.dmm
index 0eabfb6624..d7ac6c180d 100644
--- a/maps/southern_cross/southern_cross-6.dmm
+++ b/maps/southern_cross/southern_cross-6.dmm
@@ -1526,8 +1526,8 @@
"Dr" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_dock"; name = "docking port controller"; pixel_x = 25; pixel_y = 0; req_one_access = list(13); tag_door = "centcom_dock_airlock"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
"Ds" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal)
"Dt" = (/obj/machinery/computer/shuttle_control/administration{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom)
-"Du" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
-"Dv" = (/obj/structure/sign/double/map/right{pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
+"Du" = (/obj/structure/sign/scenery/map/left{pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
+"Dv" = (/obj/structure/sign/scenery/map/right{pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"Dw" = (/obj/machinery/computer/message_monitor,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"Dx" = (/obj/structure/frame/computer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"Dy" = (/obj/structure/table/steel_reinforced,/obj/item/stack/telecrystal,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
@@ -1926,8 +1926,8 @@
"Lb" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/mask/gas/syndicate,/obj/item/clothing/head/helmet/space/void/merc,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"Lc" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/green,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/green,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"Ld" = (/obj/machinery/computer/crew{dir = 1},/obj/effect/floor_decal/corner/paleblue/full,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
-"Le" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
-"Lf" = (/obj/structure/sign/double/map/right{pixel_y = 32},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
+"Le" = (/obj/structure/sign/scenery/map/left{pixel_y = 32},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
+"Lf" = (/obj/structure/sign/scenery/map/right{pixel_y = 32},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
"Lg" = (/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
"Lh" = (/obj/item/weapon/storage/box/syndie_kit/clerical,/obj/structure/table/standard,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
"Li" = (/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station)
diff --git a/maps/submaps/surface_submaps/wilderness/DecoupledEngine.dmm b/maps/submaps/surface_submaps/wilderness/DecoupledEngine.dmm
index 15a2bf604f..74e4b5c824 100644
--- a/maps/submaps/surface_submaps/wilderness/DecoupledEngine.dmm
+++ b/maps/submaps/surface_submaps/wilderness/DecoupledEngine.dmm
@@ -14,8 +14,8 @@
"ao" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/rocks,/area/submap/DecoupledEngine)
"ap" = (/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/DecoupledEngine)
"aq" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/DecoupledEngine)
-"ar" = (/obj/structure/sign/poi/engineright{dir = 1},/turf/simulated/wall/r_wall,/area/submap/DecoupledEngine)
-"as" = (/obj/structure/sign/poi/engineleft{dir = 1},/turf/simulated/wall/r_wall,/area/submap/DecoupledEngine)
+"ar" = (/obj/structure/sign/scenery/engineright{dir = 1},/turf/simulated/wall/r_wall,/area/submap/DecoupledEngine)
+"as" = (/obj/structure/sign/scenery/engineleft{dir = 1},/turf/simulated/wall/r_wall,/area/submap/DecoupledEngine)
"at" = (/turf/simulated/wall/r_wall,/area/submap/DecoupledEngine)
"au" = (/obj/structure/lattice,/turf/template_noop,/area/submap/DecoupledEngine)
"av" = (/turf/simulated/wall/durasteel,/area/submap/DecoupledEngine)
@@ -68,8 +68,8 @@
"br" = (/obj/structure/grille,/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/obj/structure/window/phoronreinforced,/turf/simulated/floor,/area/submap/DecoupledEngine)
"bs" = (/obj/structure/grille,/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced,/turf/simulated/floor,/area/submap/DecoupledEngine)
"bt" = (/obj/structure/grille,/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced,/turf/simulated/floor,/area/submap/DecoupledEngine)
-"bu" = (/obj/structure/sign/poi/engineleft,/turf/simulated/wall/durasteel,/area/submap/DecoupledEngine)
-"bv" = (/obj/structure/sign/poi/engineright,/turf/simulated/wall/r_wall,/area/submap/DecoupledEngine)
+"bu" = (/obj/structure/sign/scenery/engineleft,/turf/simulated/wall/durasteel,/area/submap/DecoupledEngine)
+"bv" = (/obj/structure/sign/scenery/engineright,/turf/simulated/wall/r_wall,/area/submap/DecoupledEngine)
"bw" = (/obj/structure/girder,/turf/simulated/floor/outdoors/rocks,/area/submap/DecoupledEngine)
"bx" = (/obj/structure/girder/displaced,/turf/simulated/floor/outdoors/rocks,/area/submap/DecoupledEngine)
diff --git a/sound/effects/droppod.ogg b/sound/effects/droppod.ogg
new file mode 100644
index 0000000000..161216ff2b
Binary files /dev/null and b/sound/effects/droppod.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index 9c63d2c057..845ff700d9 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -948,7 +948,8 @@
#include "code\game\machinery\computer\timeclock_vr.dm"
#include "code\game\machinery\computer\~computer_vr.dm"
#include "code\game\machinery\doors\airlock.dm"
-#include "code\game\machinery\doors\airlock_angled.dm"
+#include "code\game\machinery\doors\airlock_angled_bay.dm"
+#include "code\game\machinery\doors\airlock_angled_tgmc.dm"
#include "code\game\machinery\doors\airlock_control.dm"
#include "code\game\machinery\doors\airlock_electronics.dm"
#include "code\game\machinery\doors\airlock_vr.dm"
@@ -1346,6 +1347,7 @@
#include "code\game\objects\items\weapons\circuitboards\machinery\papershredder.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm"
+#include "code\game\objects\items\weapons\circuitboards\machinery\recycling.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\ships.dm"
@@ -1476,6 +1478,7 @@
#include "code\game\objects\structures\displaycase.dm"
#include "code\game\objects\structures\dogbed.dm"
#include "code\game\objects\structures\door_assembly.dm"
+#include "code\game\objects\structures\droppod.dm"
#include "code\game\objects\structures\electricchair.dm"
#include "code\game\objects\structures\extinguisher.dm"
#include "code\game\objects\structures\fence.dm"
@@ -3731,6 +3734,7 @@
#include "code\modules\recycling\conveyor2.dm"
#include "code\modules\recycling\disposal-construction.dm"
#include "code\modules\recycling\disposal.dm"
+#include "code\modules\recycling\recycling.dm"
#include "code\modules\recycling\sortingmachinery.dm"
#include "code\modules\research\circuitprinter.dm"
#include "code\modules\research\designs.dm"