diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
index c0cf15616fa..66468a516cc 100644
--- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
@@ -164,7 +164,7 @@
radio_controller.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
- radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA)
+ radio_connection = radio_controller.add_object(src, frequency, radio_filter = RADIO_ATMOSIA)
/obj/machinery/atmospherics/binary/dp_vent_pump/proc/broadcast_status()
if(!radio_connection)
@@ -185,7 +185,7 @@
"external" = external_pressure_bound,
"sigtype" = "status"
)
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
return 1
diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm
index feb1b5cb93c..8710623dfdd 100644
--- a/code/ATMOSPHERICS/components/omni_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm
@@ -1,11 +1,11 @@
//--------------------------------------------
// Gas filter - omni variant
//--------------------------------------------
-/obj/machinery/atmospherics/omni/filter
+/obj/machinery/atmospherics/omni/atmos_filter
name = "omni gas filter"
icon_state = "map_filter"
- var/list/filters = new()
+ var/list/atmos_filters = new()
var/datum/omni_port/input
var/datum/omni_port/output
@@ -18,27 +18,27 @@
var/list/filtering_outputs = list() //maps gasids to gas_mixtures
-/obj/machinery/atmospherics/omni/filter/New()
+/obj/machinery/atmospherics/omni/atmos_filter/New()
..()
rebuild_filtering_list()
for(var/datum/omni_port/P in ports)
P.air.volume = ATMOS_DEFAULT_VOLUME_FILTER
-/obj/machinery/atmospherics/omni/filter/Destroy()
+/obj/machinery/atmospherics/omni/atmos_filter/Destroy()
input = null
output = null
- filters.Cut()
+ atmos_filters.Cut()
return ..()
-/obj/machinery/atmospherics/omni/filter/sort_ports()
+/obj/machinery/atmospherics/omni/atmos_filter/sort_ports()
for(var/datum/omni_port/P in ports)
if(P.update)
if(output == P)
output = null
if(input == P)
input = null
- if(filters.Find(P))
- filters -= P
+ if(atmos_filters.Find(P))
+ atmos_filters -= P
P.air.volume = 200
switch(P.mode)
@@ -47,17 +47,17 @@
if(ATM_OUTPUT)
output = P
if(ATM_O2 to ATM_N2O)
- filters += P
+ atmos_filters += P
-/obj/machinery/atmospherics/omni/filter/error_check()
- if(!input || !output || !filters)
+/obj/machinery/atmospherics/omni/atmos_filter/error_check()
+ if(!input || !output || !atmos_filters)
return 1
- if(filters.len < 1) //requires at least 1 filter ~otherwise why are you using a filter?
+ if(atmos_filters.len < 1) //requires at least 1 atmos_filter ~otherwise why are you using a filter?
return 1
return 0
-/obj/machinery/atmospherics/omni/filter/process()
+/obj/machinery/atmospherics/omni/atmos_filter/process()
if(!..())
return 0
@@ -79,13 +79,13 @@
input.network.update = 1
if(output.network)
output.network.update = 1
- for(var/datum/omni_port/P in filters)
+ for(var/datum/omni_port/P in atmos_filters)
if(P.network)
P.network.update = 1
return 1
-/obj/machinery/atmospherics/omni/filter/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+/obj/machinery/atmospherics/omni/atmos_filter/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
usr.set_machine(src)
var/list/data = new()
@@ -100,7 +100,7 @@
ui.open()
-/obj/machinery/atmospherics/omni/filter/proc/build_uidata()
+/obj/machinery/atmospherics/omni/atmos_filter/proc/build_uidata()
var/list/data = new()
data["power"] = use_power
@@ -113,22 +113,22 @@
var/input = 0
var/output = 0
- var/filter = 1
+ var/atmo_filter = 1
var/f_type = null
switch(P.mode)
if(ATM_INPUT)
input = 1
- filter = 0
+ atmo_filter = 0
if(ATM_OUTPUT)
output = 1
- filter = 0
+ atmo_filter = 0
if(ATM_O2 to ATM_N2O)
f_type = mode_send_switch(P.mode)
portData[++portData.len] = list("dir" = dir_name(P.dir, capitalize = 1), \
"input" = input, \
"output" = output, \
- "filter" = filter, \
+ "atmo_filter" = atmo_filter, \
"f_type" = f_type)
if(portData.len)
@@ -139,7 +139,7 @@
return data
-/obj/machinery/atmospherics/omni/filter/proc/mode_send_switch(var/mode = ATM_NONE)
+/obj/machinery/atmospherics/omni/atmos_filter/proc/mode_send_switch(var/mode = ATM_NONE)
switch(mode)
if(ATM_O2)
return "Oxygen"
@@ -154,7 +154,7 @@
else
return null
-/obj/machinery/atmospherics/omni/filter/Topic(href, href_list)
+/obj/machinery/atmospherics/omni/atmos_filter/Topic(href, href_list)
if(..()) return 1
switch(href_list["command"])
if("power")
@@ -183,7 +183,7 @@
nanomanager.update_uis(src)
return
-/obj/machinery/atmospherics/omni/filter/proc/mode_return_switch(var/mode)
+/obj/machinery/atmospherics/omni/atmos_filter/proc/mode_return_switch(var/mode)
switch(mode)
if("Oxygen")
return ATM_O2
@@ -204,7 +204,7 @@
else
return null
-/obj/machinery/atmospherics/omni/filter/proc/switch_filter(var/dir, var/mode)
+/obj/machinery/atmospherics/omni/atmos_filter/proc/switch_filter(var/dir, var/mode)
//check they aren't trying to disable the input or output ~this can only happen if they hack the cached tmpl file
for(var/datum/omni_port/P in ports)
if(P.dir == dir)
@@ -213,7 +213,7 @@
switch_mode(dir, mode)
-/obj/machinery/atmospherics/omni/filter/proc/switch_mode(var/port, var/mode)
+/obj/machinery/atmospherics/omni/atmos_filter/proc/switch_mode(var/port, var/mode)
if(mode == null || !port)
return
var/datum/omni_port/target_port = null
@@ -246,14 +246,14 @@
update_ports()
-/obj/machinery/atmospherics/omni/filter/proc/rebuild_filtering_list()
+/obj/machinery/atmospherics/omni/atmos_filter/proc/rebuild_filtering_list()
filtering_outputs.Cut()
for(var/datum/omni_port/P in ports)
var/gasid = mode_to_gasid(P.mode)
if(gasid)
filtering_outputs[gasid] = P.air
-/obj/machinery/atmospherics/omni/filter/proc/handle_port_change(var/datum/omni_port/P)
+/obj/machinery/atmospherics/omni/atmos_filter/proc/handle_port_change(var/datum/omni_port/P)
switch(P.mode)
if(ATM_NONE)
initialize_directions &= ~P.dir
diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
index 38d889f37b2..2ab891424cf 100644
--- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
@@ -120,7 +120,7 @@
var/core_icon = null
if(istype(src, /obj/machinery/atmospherics/omni/mixer))
core_icon = "mixer"
- else if(istype(src, /obj/machinery/atmospherics/omni/filter))
+ else if(istype(src, /obj/machinery/atmospherics/omni/atmos_filter))
core_icon = "filter"
else
return
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index 5bc9f8d20f9..e9fe37f8a16 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -1,4 +1,4 @@
-/obj/machinery/atmospherics/trinary/filter
+/obj/machinery/atmospherics/trinary/atmos_filter
icon = 'icons/atmos/filter.dmi'
icon_state = "map"
density = 0
@@ -30,13 +30,13 @@
var/frequency = 0
var/datum/radio_frequency/radio_connection
-/obj/machinery/atmospherics/trinary/filter/proc/set_frequency(new_frequency)
+/obj/machinery/atmospherics/trinary/atmos_filter/proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA)
-/obj/machinery/atmospherics/trinary/filter/New()
+/obj/machinery/atmospherics/trinary/atmos_filter/New()
..()
switch(filter_type)
if(0) //removing hydrocarbons
@@ -54,8 +54,8 @@
air2.volume = ATMOS_DEFAULT_VOLUME_FILTER
air3.volume = ATMOS_DEFAULT_VOLUME_FILTER
-/obj/machinery/atmospherics/trinary/filter/update_icon()
- if(istype(src, /obj/machinery/atmospherics/trinary/filter/m_filter))
+/obj/machinery/atmospherics/trinary/atmos_filter/update_icon()
+ if(istype(src, /obj/machinery/atmospherics/trinary/atmos_filter/m_filter))
icon_state = "m"
else
icon_state = ""
@@ -68,7 +68,7 @@
icon_state += "off"
use_power = 0
-/obj/machinery/atmospherics/trinary/filter/update_underlays()
+/obj/machinery/atmospherics/trinary/atmos_filter/update_underlays()
if(..())
underlays.Cut()
var/turf/T = get_turf(src)
@@ -77,23 +77,23 @@
add_underlay(T, node1, turn(dir, -180))
- if(istype(src, /obj/machinery/atmospherics/trinary/filter/m_filter))
+ if(istype(src, /obj/machinery/atmospherics/trinary/atmos_filter/m_filter))
add_underlay(T, node2, turn(dir, 90))
else
add_underlay(T, node2, turn(dir, -90))
add_underlay(T, node3, dir)
-/obj/machinery/atmospherics/trinary/filter/hide(var/i)
+/obj/machinery/atmospherics/trinary/atmos_filter/hide(var/i)
update_underlays()
-/obj/machinery/atmospherics/trinary/filter/power_change()
+/obj/machinery/atmospherics/trinary/atmos_filter/power_change()
var/old_stat = stat
..()
if(old_stat != stat)
update_icon()
-/obj/machinery/atmospherics/trinary/filter/process()
+/obj/machinery/atmospherics/trinary/atmos_filter/process()
..()
last_power_draw = 0
@@ -124,11 +124,11 @@
return 1
-/obj/machinery/atmospherics/trinary/filter/initialize()
+/obj/machinery/atmospherics/trinary/atmos_filter/initialize()
set_frequency(frequency)
..()
-/obj/machinery/atmospherics/trinary/filter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
+/obj/machinery/atmospherics/trinary/atmos_filter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
if(!can_unwrench())
@@ -146,7 +146,7 @@
qdel(src)
-/obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE
+/obj/machinery/atmospherics/trinary/atmos_filter/attack_hand(user as mob) // -- TLE
if(..())
return
@@ -188,11 +188,11 @@
Flow rate: [round(last_flow_rate, 0.1)]L/s
"}
- user << browse("
[src.name] control[dat]", "window=atmo_filter")
- onclose(user, "atmo_filter")
+ user << browse("[src.name] control[dat]", "window=atmos_filter")
+ onclose(user, "atmos_filter")
return
-/obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE
+/obj/machinery/atmospherics/trinary/atmos_filter/Topic(href, href_list) // -- TLE
if(..())
return 1
usr.set_machine(src)
@@ -230,13 +230,13 @@
*/
return
-/obj/machinery/atmospherics/trinary/filter/m_filter
+/obj/machinery/atmospherics/trinary/atmos_filter/m_filter
icon_state = "mmap"
dir = SOUTH
initialize_directions = SOUTH|NORTH|EAST
-obj/machinery/atmospherics/trinary/filter/m_filter/init_dir()
+obj/machinery/atmospherics/trinary/atmos_filter/m_filter/init_dir()
switch(dir)
if(NORTH)
initialize_directions = WEST|NORTH|SOUTH
@@ -247,7 +247,7 @@ obj/machinery/atmospherics/trinary/filter/m_filter/init_dir()
if(WEST)
initialize_directions = WEST|SOUTH|EAST
-/obj/machinery/atmospherics/trinary/filter/m_filter/initialize()
+/obj/machinery/atmospherics/trinary/atmos_filter/m_filter/initialize()
set_frequency(frequency)
if(node1 && node2 && node3) return
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 19e5615291a..9ebf60632ce 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -158,6 +158,7 @@
#define O_MOUTH "mouth"
#define O_EYES "eyes"
#define O_HEART "heart"
+#define O_CELL "cell"
#define O_LUNGS "lungs"
#define O_BRAIN "brain"
#define O_LIVER "liver"
diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm
index 8ac42dc0b92..eb1ef73eb7e 100644
--- a/code/_helpers/mobs.dm
+++ b/code/_helpers/mobs.dm
@@ -24,6 +24,15 @@
return mobs
+/proc/mobs_in_xray_view(var/range, var/source)
+ var/list/mobs = list()
+ for(var/atom/movable/AM in orange(range, source))
+ var/M = AM.get_mob()
+ if(M)
+ mobs += M
+
+ return mobs
+
proc/random_hair_style(gender, species = "Human")
var/h_style = "Bald"
diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm
index ef83e95f774..4b56d94f0d2 100644
--- a/code/controllers/communications.dm
+++ b/code/controllers/communications.dm
@@ -5,13 +5,13 @@
Note that walkie-talkie, intercoms and headsets handle transmission using nonstandard way.
procs:
- add_object(obj/device as obj, var/new_frequency as num, var/filter as text|null = null)
+ add_object(obj/device as obj, var/new_frequency as num, var/radio_filter as text|null = null)
Adds listening object.
parameters:
device - device receiving signals, must have proc receive_signal (see description below).
one device may listen several frequencies, but not same frequency twice.
new_frequency - see possibly frequencies below;
- filter - thing for optimization. Optional, but recommended.
+ radio_filter - thing for optimization. Optional, but recommended.
All filters should be consolidated in this file, see defines later.
Device without listening filter will receive all signals (on specified frequency).
Device with filter will receive any signals sent without filter.
@@ -30,12 +30,12 @@
radio_frequency is a global object maintaining list of devices that listening specific frequency.
procs:
- post_signal(obj/source as obj|null, datum/signal/signal, var/filter as text|null = null, var/range as num|null = null)
+ post_signal(obj/source as obj|null, datum/signal/signal, var/radio_filter as text|null = null, var/range as num|null = null)
Sends signal to all devices that wants such signal.
parameters:
source - object, emitted signal. Usually, devices will not receive their own signals.
signal - see description below.
- filter - described above.
+ radio_filter - described above.
range - radius of regular byond's square circle on that z-level. null means everywhere, on all z-levels.
obj/proc/receive_signal(datum/signal/signal, var/receive_method as num, var/receive_param)
@@ -220,7 +220,7 @@ var/global/datum/controller/radio/radio_controller
/datum/controller/radio
var/list/datum/radio_frequency/frequencies = list()
-/datum/controller/radio/proc/add_object(obj/device as obj, var/new_frequency as num, var/filter = null as text|null)
+/datum/controller/radio/proc/add_object(obj/device as obj, var/new_frequency as num, var/radio_filter = null as text|null)
var/f_text = num2text(new_frequency)
var/datum/radio_frequency/frequency = frequencies[f_text]
@@ -229,7 +229,7 @@ var/global/datum/controller/radio/radio_controller
frequency.frequency = new_frequency
frequencies[f_text] = frequency
- frequency.add_listener(device, filter)
+ frequency.add_listener(device, radio_filter)
return frequency
/datum/controller/radio/proc/remove_object(obj/device, old_frequency)
@@ -260,15 +260,15 @@ var/global/datum/controller/radio/radio_controller
var/frequency as num
var/list/list/obj/devices = list()
-/datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, var/filter = null as text|null, var/range = null as num|null)
+/datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, var/radio_filter = null as text|null, var/range = null as num|null)
var/turf/start_point
if(range)
start_point = get_turf(source)
if(!start_point)
qdel(signal)
return 0
- if (filter)
- send_to_filter(source, signal, filter, start_point, range)
+ if (radio_filter)
+ send_to_filter(source, signal, radio_filter, start_point, range)
send_to_filter(source, signal, RADIO_DEFAULT, start_point, range)
else
//Broadcast the signal to everyone!
@@ -276,11 +276,11 @@ var/global/datum/controller/radio/radio_controller
send_to_filter(source, signal, next_filter, start_point, range)
//Sends a signal to all machines belonging to a given filter. Should be called by post_signal()
-/datum/radio_frequency/proc/send_to_filter(obj/source, datum/signal/signal, var/filter, var/turf/start_point = null, var/range = null)
+/datum/radio_frequency/proc/send_to_filter(obj/source, datum/signal/signal, var/radio_filter, var/turf/start_point = null, var/range = null)
if (range && !start_point)
return
- for(var/obj/device in devices[filter])
+ for(var/obj/device in devices[radio_filter])
if(device == source)
continue
if(range)
@@ -292,14 +292,14 @@ var/global/datum/controller/radio/radio_controller
device.receive_signal(signal, TRANSMISSION_RADIO, frequency)
-/datum/radio_frequency/proc/add_listener(obj/device as obj, var/filter as text|null)
- if (!filter)
- filter = RADIO_DEFAULT
- //log_admin("add_listener(device=[device],filter=[filter]) frequency=[frequency]")
- var/list/obj/devices_line = devices[filter]
+/datum/radio_frequency/proc/add_listener(obj/device as obj, var/radio_filter as text|null)
+ if (!radio_filter)
+ radio_filter = RADIO_DEFAULT
+ //log_admin("add_listener(device=[device],radio_filter=[radio_filter]) frequency=[frequency]")
+ var/list/obj/devices_line = devices[radio_filter]
if (!devices_line)
devices_line = new
- devices[filter] = devices_line
+ devices[radio_filter] = devices_line
devices_line+=device
// var/list/obj/devices_line___ = devices[filter_str]
// var/l = devices_line___.len
diff --git a/code/datums/outfits/costumes/halloween.dm b/code/datums/outfits/costumes/halloween.dm
new file mode 100644
index 00000000000..d4ad8fa8f99
--- /dev/null
+++ b/code/datums/outfits/costumes/halloween.dm
@@ -0,0 +1,115 @@
+/decl/hierarchy/outfit/h_masked_killer
+ name = "Costume - Masked Killer"
+ uniform = /obj/item/clothing/under/overalls
+ shoes = /obj/item/clothing/shoes/white
+ gloves = /obj/item/clothing/gloves/sterile/latex
+ mask = /obj/item/clothing/mask/surgical
+ head = /obj/item/clothing/head/welding
+ suit = /obj/item/clothing/suit/storage/apron
+ r_hand = /obj/item/weapon/material/twohanded/fireaxe/foam
+
+/decl/hierarchy/outfit/masked_killer/post_equip(var/mob/living/carbon/human/H)
+ var/victim = get_mannequin(H.ckey)
+ for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
+ carried_item.add_blood(victim) //Oh yes, there will be blood.. just not blood from the killer because that's odd. //If I knew how to make fake blood, I would
+
+/decl/hierarchy/outfit/h_professional
+ name = "Costume - Professional"
+ uniform = /obj/item/clothing/under/suit_jacket{ starting_accessories=list(/obj/item/clothing/accessory/wcoat) }
+ shoes = /obj/item/clothing/shoes/black
+ gloves = /obj/item/clothing/gloves/black
+ glasses = /obj/item/clothing/glasses/fakesunglasses
+ l_pocket = /obj/item/toy/sword
+
+/decl/hierarchy/outfit/h_professional/post_equip(var/mob/living/carbon/human/H)
+ var/obj/item/weapon/storage/briefcase/new_briefcase = new(H)
+ for(var/obj/item/briefcase_item in new_briefcase)
+ qdel(briefcase_item)
+ new_briefcase.contents += new /obj/item/toy/crossbow
+ new_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/capgun
+ new_briefcase.contents += new /obj/item/clothing/mask/gas/clown_hat
+ H.equip_to_slot_or_del(new_briefcase, slot_l_hand)
+
+/decl/hierarchy/outfit/h_horrorcop
+ name = "Costume - Slasher Movie Cop"
+ uniform = /obj/item/clothing/under/pcrc{ starting_accessories=list(/obj/item/clothing/accessory/holster) }
+ shoes = /obj/item/clothing/shoes/black
+ gloves = /obj/item/clothing/gloves/black
+ glasses = /obj/item/clothing/glasses/fakesunglasses
+ mask = /obj/item/clothing/mask/fakemoustache
+ head = /obj/item/clothing/head/beret
+ r_hand = /obj/item/weapon/gun/projectile/revolver/capgun
+
+/decl/hierarchy/outfit/h_horrorcop/post_equip(var/mob/living/carbon/human/H)
+ var/obj/item/clothing/under/U = H.w_uniform
+ if(U.accessories.len)
+ for(var/obj/item/clothing/accessory/A in U.accessories)
+ if(istype(A, /obj/item/clothing/accessory/holster))
+ var/obj/item/clothing/accessory/holster/O = A
+ O.holster_verb()
+
+/decl/hierarchy/outfit/h_cowboy
+ name = "Costume - Cowboy"
+ uniform = /obj/item/clothing/under/pants{ starting_accessories=list(/obj/item/clothing/accessory/holster) }
+ shoes = /obj/item/clothing/shoes/boots/cowboy
+ head = /obj/item/clothing/head/cowboy_hat
+ gloves = /obj/item/clothing/gloves/fingerless
+ suit = /obj/item/clothing/accessory/poncho
+ r_hand = /obj/item/weapon/gun/projectile/revolver/capgun
+
+/decl/hierarchy/outfit/h_cowboy/post_equip(var/mob/living/carbon/human/H)
+ var/obj/item/clothing/under/U = H.w_uniform
+ if(U.accessories.len)
+ for(var/obj/item/clothing/accessory/A in U.accessories)
+ if(istype(A, /obj/item/clothing/accessory/holster))
+ var/obj/item/clothing/accessory/holster/O = A
+ O.holster_verb()
+
+/decl/hierarchy/outfit/h_lumberjack
+ name = "Costume - Lumberjack"
+ uniform = /obj/item/clothing/under/pants{ starting_accessories=list(/obj/item/clothing/accessory/sweater/blackneck) }
+ shoes = /obj/item/clothing/shoes/boots/workboots
+ head = /obj/item/clothing/head/beanie
+ gloves = /obj/item/clothing/gloves/fingerless
+ suit = /obj/item/clothing/suit/storage/flannel/red
+ r_hand = /obj/item/weapon/material/twohanded/fireaxe/foam
+
+/decl/hierarchy/outfit/h_firefighter
+ name = "Costume - Firefighter"
+ uniform = /obj/item/clothing/under/pants
+ shoes = /obj/item/clothing/shoes/boots/workboots
+ head = /obj/item/clothing/head/hardhat/red
+ gloves = /obj/item/clothing/gloves/black
+ suit = /obj/item/clothing/suit/fire/firefighter
+ mask = /obj/item/clothing/mask/gas
+
+/decl/hierarchy/outfit/h_highlander
+ name = "Costume - Highlander"
+ uniform = /obj/item/clothing/under/kilt
+ shoes = /obj/item/clothing/shoes/boots/jackboots
+ head = /obj/item/clothing/head/beret
+ r_hand = /obj/item/weapon/material/sword/foam
+
+/decl/hierarchy/outfit/h_vampire
+ name = "Costume - Vampire"
+ uniform = /obj/item/clothing/under/suit_jacket/really_black
+ shoes = /obj/item/clothing/shoes/dress
+ gloves = /obj/item/clothing/gloves/white
+ r_hand = /obj/item/weapon/bedsheet/red
+
+/decl/hierarchy/outfit/h_vampire_hunter
+ name = "Costume - Vampire Hunter"
+ uniform = /obj/item/clothing/under/pants/tan
+ suit = /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless
+ shoes = /obj/item/clothing/shoes/boots/jackboots
+ gloves = /obj/item/clothing/gloves/fingerless
+ l_pocket = /obj/item/toy/crossbow
+ r_pocket = /obj/item/device/flashlight/color/red
+
+/decl/hierarchy/outfit/h_pirate
+ name = "Costume - Pirate"
+ uniform = /obj/item/clothing/under/pirate
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/helmet/space
+ suit = /obj/item/clothing/suit/pirate
+ glasses = /obj/item/clothing/glasses/eyepatch
\ No newline at end of file
diff --git a/code/datums/outfits/horror_killers.dm b/code/datums/outfits/horror_killers.dm
index 1a6b284c63d..5958cf55869 100644
--- a/code/datums/outfits/horror_killers.dm
+++ b/code/datums/outfits/horror_killers.dm
@@ -42,6 +42,7 @@
l_ear = /obj/item/device/radio/headset
glasses = /obj/item/clothing/glasses/sunglasses
l_pocket = /obj/item/weapon/melee/energy/sword
+ mask = /obj/item/clothing/mask/gas/clown_hat
id_slot = slot_wear_id
id_type = /obj/item/weapon/card/id/syndicate/station_access
diff --git a/code/datums/supplypacks/contraband.dm b/code/datums/supplypacks/contraband.dm
index c200e2edda7..cbe52301dff 100644
--- a/code/datums/supplypacks/contraband.dm
+++ b/code/datums/supplypacks/contraband.dm
@@ -52,4 +52,53 @@
cost = 50
contraband = 1
containertype = /obj/structure/closet/crate/secure/weapon
- containername = "Weapons crate"
\ No newline at end of file
+ containername = "Weapons crate"
+
+/datum/supply_packs/randomised/misc/telecrate //you get something awesome, a couple of decent things, and a few weak/filler things
+ name = "ERR_NULL_ENTRY" //null crate! also dream maker is hell,
+ num_contained = 1
+ contains = list(
+ list( //the operator,
+ /obj/item/weapon/gun/projectile/shotgun/pump/combat,
+ /obj/item/clothing/suit/storage/vest/heavy/merc,
+ /obj/item/clothing/glasses/night,
+ /obj/item/weapon/storage/box/anti_photons,
+ /obj/item/ammo_magazine/clip/c12g/pellet, /obj/item/ammo_magazine/clip/c12g
+ ),
+ list( //the doc,
+ /obj/item/weapon/storage/firstaid/combat,
+ /obj/item/weapon/gun/projectile/dartgun, /obj/item/weapon/reagent_containers/hypospray,
+ /obj/item/weapon/reagent_containers/glass/bottle/chloralhydrate,
+ /obj/item/weapon/reagent_containers/glass/bottle/cyanide,
+ /obj/item/ammo_magazine/chemdart
+ ),
+ list( //the sapper,
+ /obj/item/weapon/melee/energy/sword/ionic_rapier,
+ /obj/item/weapon/storage/box/syndie_kit/space, //doesn't matter what species you are,
+ /obj/item/weapon/storage/box/syndie_kit/demolitions,
+ /obj/item/device/multitool/ai_detector,
+ /obj/item/weapon/plastique,
+ /obj/item/weapon/storage/toolbox/syndicate
+ ),
+ list( //the infiltrator,
+ /obj/item/weapon/gun/projectile/silenced,
+ /obj/item/device/chameleon,
+ /obj/item/weapon/storage/box/syndie_kit/chameleon,
+ /obj/item/device/encryptionkey/syndicate,
+ /obj/item/weapon/card/id/syndicate,
+ /obj/item/clothing/mask/gas/voice
+ ),
+ list( //the professional,
+ /obj/item/weapon/gun/projectile/silenced,
+ /obj/item/weapon/gun/energy/ionrifle/pistol,
+ /obj/item/clothing/glasses/thermal/syndi,
+ /obj/item/weapon/card/emag,
+ /obj/item/ammo_magazine/m45/ap,
+ /obj/item/weapon/material/hatchet/tacknife/combatknife,
+ /obj/item/clothing/mask/balaclava
+ )
+ )
+ cost = 250 //more than a hat crate!,
+ contraband = 1
+ containertype = /obj/structure/largecrate
+ containername = "Suspicious crate"
\ No newline at end of file
diff --git a/code/datums/supplypacks/misc.dm b/code/datums/supplypacks/misc.dm
index 5be62b2a58b..5a3bb038bb4 100644
--- a/code/datums/supplypacks/misc.dm
+++ b/code/datums/supplypacks/misc.dm
@@ -38,6 +38,7 @@
/obj/item/clothing/suit/nun,
/obj/item/clothing/head/nun_hood,
/obj/item/clothing/suit/storage/hooded/chaplain_hoodie,
+ /obj/item/clothing/suit/storage/hooded/chaplain_hoodie/whiteout,
/obj/item/clothing/suit/holidaypriest,
/obj/item/clothing/under/wedding/bride_white,
/obj/item/weapon/storage/backpack/cultpack,
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index dc6c5e170d0..69965ef7f0e 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -563,7 +563,7 @@
origin_tech = list(TECH_DATA = 3, TECH_MAGNET = 5 ,TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
-/obj/item/weapon/stock_parts/subspace/filter
+/obj/item/weapon/stock_parts/subspace/sub_filter
name = "hyperwave filter"
icon_state = "hyperwave_filter"
desc = "A tiny device capable of filtering and converting super-intense radiowaves."
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 3b642ffd2fd..a092ed7b65e 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -299,9 +299,10 @@ its easier to just keep the beam vertical.
//Deal with gloves the pass finger/palm prints.
if(!ignoregloves)
if(H.gloves && H.gloves != src)
- var/obj/item/clothing/gloves/G = H.gloves
- if(!prob(G.fingerprint_chance))
- return 0
+ if(istype(H.gloves, /obj/item/clothing/gloves))
+ var/obj/item/clothing/gloves/G = H.gloves
+ if(!prob(G.fingerprint_chance))
+ return 0
//More adminstuffz
if(fingerprintslast != H.key)
diff --git a/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm
index 630a9bdb101..0056675afc5 100644
--- a/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm
+++ b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm
@@ -19,7 +19,6 @@
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
- var/mob/living/carbon/human/wearer = null
/obj/item/clothing/gloves/regen/equipped(var/mob/living/carbon/human/H)
if(H && H.gloves == src)
diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm
index 95809c63f44..88a448c571c 100644
--- a/code/game/jobs/job/civilian_chaplain.dm
+++ b/code/game/jobs/job/civilian_chaplain.dm
@@ -28,17 +28,21 @@
return
spawn(0)
- var/religion_name = "Christianity"
- var/new_religion = sanitize(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name), MAX_NAME_LEN)
+ var/religion_name = "Unitarianism"
+ var/new_religion = sanitize(input(H, "You are the crew services officer. Would you like to change your religion? Default is Unitarianism", "Name change", religion_name), MAX_NAME_LEN)
if (!new_religion)
new_religion = religion_name
switch(lowertext(new_religion))
+ if("unitarianism")
+ B.name = "The Talmudic Quran"
if("christianity")
B.name = pick("The Holy Bible","The Dead Sea Scrolls")
+ if("Judaism")
+ B.name = "The Torah"
if("satanism")
- B.name = "The Unholy Bible"
- if("cthulu")
+ B.name = "The Satanic Bible"
+ if("cthulhu")
B.name = "The Necronomicon"
if("islam")
B.name = "Quran"
@@ -52,20 +56,21 @@
B.name = "Toolbox Manifesto"
if("homosexuality")
B.name = "Guys Gone Wild"
- //if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks")
- // B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition")
- // H.setBrainLoss(100) // starts off retarded as fuck
if("science")
B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
+ if("capitalism")
+ B.name = "Wealth of Nations"
+ if("communism")
+ B.name = "The Communist Manifesto"
else
B.name = "The Holy Book of [new_religion]"
feedback_set_details("religion_name","[new_religion]")
spawn(1)
- var/deity_name = "Space Jesus"
- var/new_deity = sanitize(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name), MAX_NAME_LEN)
+ var/deity_name = "Hashem"
+ var/new_deity = sanitize(input(H, "Would you like to change your deity? Default is Hashem", "Name change", deity_name), MAX_NAME_LEN)
- if ((length(new_deity) == 0) || (new_deity == "Space Jesus") )
+ if ((length(new_deity) == 0) || (new_deity == "Hashem") )
new_deity = deity_name
B.deity_name = new_deity
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index be0a0bbd07e..f74b1d6185f 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -623,7 +623,7 @@ var/global/datum/controller/occupations/job_master
else
spawnpos = spawntypes[H.client.prefs.spawnpoint]
- if(spawnpos && istype(spawnpos) && spawnpos.turfs.len) // VOREStation Edit - Fix runtime if no landmarks exist for a spawntype
+ if(spawnpos && istype(spawnpos) && spawnpos.turfs.len)
if(spawnpos.check_job_spawning(rank))
H.forceMove(spawnpos.get_spawn_position())
. = spawnpos.msg
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index ded2ccdde8f..f510688733e 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -190,8 +190,8 @@
go_out()
if(href_list["beaker"])
remove_beaker()
- if(href_list["filter"])
- if(filtering != text2num(href_list["filter"]))
+ if(href_list["sleeper_filter"])
+ if(filtering != text2num(href_list["sleeper_filter"]))
toggle_filter()
if(href_list["chemical"] && href_list["amount"])
if(occupant && occupant.stat != DEAD)
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
index 546e6acd885..ac1e21051ae 100644
--- a/code/game/machinery/atmo_control.dm
+++ b/code/game/machinery/atmo_control.dm
@@ -56,7 +56,7 @@
signal.data["nitrogen"] = 0
signal.data["carbon_dioxide"] = 0
signal.data["sigtype"]="status"
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
/obj/machinery/air_sensor/proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
@@ -239,7 +239,7 @@ obj/machinery/computer/general_air_control/Destroy()
. = 1
signal.data["sigtype"]="command"
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
/obj/machinery/computer/general_air_control/supermatter_core
icon = 'icons/obj/computer.dmi'
@@ -349,7 +349,7 @@ obj/machinery/computer/general_air_control/Destroy()
. = 1
signal.data["sigtype"]="command"
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
/obj/machinery/computer/general_air_control/fuel_injection
icon = 'icons/obj/computer.dmi'
@@ -386,7 +386,7 @@ obj/machinery/computer/general_air_control/Destroy()
"sigtype"="command"
)
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
..()
@@ -446,7 +446,7 @@ obj/machinery/computer/general_air_control/Destroy()
"status" = 1,
"sigtype"="command"
)
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
if(href_list["toggle_automation"])
automation = !automation
@@ -465,7 +465,7 @@ obj/machinery/computer/general_air_control/Destroy()
"sigtype"="command"
)
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
if(href_list["injection"])
if(!radio_connection)
@@ -480,4 +480,4 @@ obj/machinery/computer/general_air_control/Destroy()
"sigtype"="command"
)
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
\ No newline at end of file
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
\ No newline at end of file
diff --git a/code/game/machinery/computer3/networking.dm b/code/game/machinery/computer3/networking.dm
index 66d25dda5ae..f88d8a4837d 100644
--- a/code/game/machinery/computer3/networking.dm
+++ b/code/game/machinery/computer3/networking.dm
@@ -65,20 +65,20 @@
var/datum/radio_frequency/radio_connection = null
var/frequency = PUB_FREQ
- var/filter = null
+ var/rad_filter = null
var/range = null
var/subspace = 0
init()
..()
spawn(5)
- radio_connection = radio_controller.add_object(src, src.frequency, src.filter)
+ radio_connection = radio_controller.add_object(src, src.frequency, src.rad_filter)
proc/set_frequency(new_frequency)
if(radio_controller)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, filter)
+ radio_connection = radio_controller.add_object(src, frequency, rad_filter)
else
frequency = new_frequency
spawn(rand(5,10))
@@ -94,7 +94,7 @@
if(!computer || (computer.stat&~MAINT) || !computer.program) return
if(!radio_connection) return
- radio_connection.post_signal(src,signal,filter,range)
+ radio_connection.post_signal(src,signal,rad_filter,range)
get_machines(var/typekey)
if(!radio_connection || !radio_connection.frequency)
diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm
index ba8aa85b2c7..c87e78cfd50 100644
--- a/code/game/machinery/doors/airlock_control.dm
+++ b/code/game/machinery/doors/airlock_control.dm
@@ -101,7 +101,7 @@ obj/machinery/door/airlock/proc/send_status(var/bumped = 0)
if (bumped)
signal.data["bumped_with_access"] = 1
- radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, radio_filter = RADIO_AIRLOCK)
obj/machinery/door/airlock/open(surpress_send)
@@ -181,7 +181,7 @@ obj/machinery/airlock_sensor/attack_hand(mob/user)
signal.data["tag"] = master_tag
signal.data["command"] = command
- radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, radio_filter = RADIO_AIRLOCK)
flick("airlock_sensor_cycle", src)
obj/machinery/airlock_sensor/process()
@@ -196,7 +196,7 @@ obj/machinery/airlock_sensor/process()
signal.data["timestamp"] = world.time
signal.data["pressure"] = num2text(pressure)
- radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, radio_filter = RADIO_AIRLOCK)
previousPressure = pressure
@@ -269,7 +269,7 @@ obj/machinery/access_button/attack_hand(mob/user)
signal.data["tag"] = master_tag
signal.data["command"] = command
- radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, radio_filter = RADIO_AIRLOCK)
flick("access_button_cycle", src)
diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm
index a128e6c4e48..5a6b77931fd 100644
--- a/code/game/machinery/embedded_controller/embedded_controller_base.dm
+++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm
@@ -69,11 +69,11 @@ obj/machinery/embedded_controller/radio/Destroy()
else
icon_state = "airlock_control_off"
-/obj/machinery/embedded_controller/radio/post_signal(datum/signal/signal, var/filter = null)
+/obj/machinery/embedded_controller/radio/post_signal(datum/signal/signal, var/radio_filter = null)
signal.transmission_method = TRANSMISSION_RADIO
if(radio_connection)
//use_power(radio_power_use) //neat idea, but causes way too much lag.
- return radio_connection.post_signal(src, signal, filter)
+ return radio_connection.post_signal(src, signal, radio_filter)
else
qdel(signal)
diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm
index 049289c7c73..87eba963240 100644
--- a/code/game/machinery/exonet_node.dm
+++ b/code/game/machinery/exonet_node.dm
@@ -25,7 +25,7 @@
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/telecomms/exonet_node(src)
component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(src)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
diff --git a/code/game/machinery/pda_multicaster.dm b/code/game/machinery/pda_multicaster.dm
index a7d5c780c35..fde455ae51a 100644
--- a/code/game/machinery/pda_multicaster.dm
+++ b/code/game/machinery/pda_multicaster.dm
@@ -28,7 +28,7 @@
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/telecomms/pda_multicaster(src)
component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(src)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(src)
component_parts += new /obj/item/stack/cable_coil(src, 2)
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 4547b4eaf37..e9f693e431f 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -129,13 +129,13 @@ Buildable meters
src.pipe_type = PIPE_VOLUME_PUMP
else if(istype(make_from, /obj/machinery/atmospherics/binary/pump))
src.pipe_type = PIPE_PUMP
- else if(istype(make_from, /obj/machinery/atmospherics/trinary/filter/m_filter))
+ else if(istype(make_from, /obj/machinery/atmospherics/trinary/atmos_filter/m_filter))
src.pipe_type = PIPE_GAS_FILTER_M
else if(istype(make_from, /obj/machinery/atmospherics/trinary/mixer/t_mixer))
src.pipe_type = PIPE_GAS_MIXER_T
else if(istype(make_from, /obj/machinery/atmospherics/trinary/mixer/m_mixer))
src.pipe_type = PIPE_GAS_MIXER_M
- else if(istype(make_from, /obj/machinery/atmospherics/trinary/filter))
+ else if(istype(make_from, /obj/machinery/atmospherics/trinary/atmos_filter))
src.pipe_type = PIPE_GAS_FILTER
else if(istype(make_from, /obj/machinery/atmospherics/trinary/mixer))
src.pipe_type = PIPE_GAS_MIXER
@@ -175,7 +175,7 @@ Buildable meters
src.pipe_type = PIPE_CAP
else if(istype(make_from, /obj/machinery/atmospherics/omni/mixer))
src.pipe_type = PIPE_OMNI_MIXER
- else if(istype(make_from, /obj/machinery/atmospherics/omni/filter))
+ else if(istype(make_from, /obj/machinery/atmospherics/omni/atmos_filter))
src.pipe_type = PIPE_OMNI_FILTER
///// Z-Level stuff
else if(istype(make_from, /obj/machinery/atmospherics/pipe/zpipe/up/supply))
@@ -809,7 +809,7 @@ Buildable meters
P.node2.build_network()
if(PIPE_GAS_FILTER) //gas filter
- var/obj/machinery/atmospherics/trinary/filter/P = new(src.loc)
+ var/obj/machinery/atmospherics/trinary/atmos_filter/P = new(src.loc)
P.set_dir(dir)
P.initialize_directions = pipe_dir
if (pipename)
@@ -849,7 +849,7 @@ Buildable meters
P.node3.build_network()
if(PIPE_GAS_FILTER_M) //gas filter mirrored
- var/obj/machinery/atmospherics/trinary/filter/m_filter/P = new(src.loc)
+ var/obj/machinery/atmospherics/trinary/atmos_filter/m_filter/P = new(src.loc)
P.set_dir(dir)
P.initialize_directions = pipe_dir
if (pipename)
@@ -1232,7 +1232,7 @@ Buildable meters
P.initialize()
P.build_network()
if(PIPE_OMNI_FILTER)
- var/obj/machinery/atmospherics/omni/filter/P = new(loc)
+ var/obj/machinery/atmospherics/omni/atmos_filter/P = new(loc)
var/turf/T = P.loc
P.level = !T.is_plating() ? 2 : 1
P.initialize()
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 8eba407e72a..1b181aebb5d 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -45,6 +45,7 @@
var/check_access = 1 //if this is active, the turret shoots everything that does not meet the access requirements
var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos)
var/check_synth = 0 //if active, will shoot at anything not an AI or cyborg
+ var/check_all = 0 //If active, will fire on anything, including synthetics.
var/ailock = 0 // AI cannot use this
var/attacked = 0 //if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!)
@@ -71,6 +72,7 @@
check_records = 1
check_weapons = 1
check_anomalies = 1
+ check_all = 0
/obj/machinery/porta_turret/stationary
ailock = 1
@@ -229,6 +231,7 @@ var/list/turret_icons
settings[++settings.len] = list("category" = "Check Arrest Status", "setting" = "check_arrest", "value" = check_arrest)
settings[++settings.len] = list("category" = "Check Access Authorization", "setting" = "check_access", "value" = check_access)
settings[++settings.len] = list("category" = "Check misc. Lifeforms", "setting" = "check_anomalies", "value" = check_anomalies)
+ settings[++settings.len] = list("category" = "Neutralize All Entities", "setting" = "check_all", "value" = check_all)
data["settings"] = settings
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
@@ -278,6 +281,8 @@ var/list/turret_icons
check_access = value
else if(href_list["command"] == "check_anomalies")
check_anomalies = value
+ else if(href_list["command"] == "check_all")
+ check_all = value
return 1
@@ -465,7 +470,7 @@ var/list/turret_icons
var/list/targets = list() //list of primary targets
var/list/secondarytargets = list() //targets that are least important
- for(var/mob/M in mobs_in_view(world.view, src))
+ for(var/mob/M in mobs_in_xray_view(world.view, src))
assess_and_assign(M, targets, secondarytargets)
if(!tryToShootAt(targets))
@@ -496,7 +501,7 @@ var/list/turret_icons
if(!L)
return TURRET_NOT_TARGET
- if(!emagged && issilicon(L)) // Don't target silica
+ if(!emagged && issilicon(L) && check_all == 0) // Don't target silica, unless told to neutralize everything.
return TURRET_NOT_TARGET
if(L.stat && !emagged) //if the perp is dead/dying, no need to bother really
@@ -514,7 +519,7 @@ var/list/turret_icons
if(lethal && locate(/mob/living/silicon/ai) in get_turf(L)) //don't accidentally kill the AI!
return TURRET_NOT_TARGET
- if(check_synth) //If it's set to attack all non-silicons, target them!
+ if(check_synth || check_all) //If it's set to attack all non-silicons or everything, target them!
if(L.lying)
return lethal ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
return TURRET_PRIORITY_TARGET
@@ -671,6 +676,7 @@ var/list/turret_icons
var/check_arrest
var/check_weapons
var/check_anomalies
+ var/check_all
var/ailock
/obj/machinery/porta_turret/proc/setState(var/datum/turret_checks/TC)
@@ -686,6 +692,7 @@ var/list/turret_icons
check_arrest = TC.check_arrest
check_weapons = TC.check_weapons
check_anomalies = TC.check_anomalies
+ check_all = TC.check_all
ailock = TC.ailock
power_change()
diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm
index 17797e2a686..4f33f1703f3 100644
--- a/code/game/machinery/turret_control.dm
+++ b/code/game/machinery/turret_control.dm
@@ -24,6 +24,7 @@
var/check_access = 1 //if this is active, the turret shoots everything that does not meet the access requirements
var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos)
var/check_synth = 0 //if active, will shoot at anything not an AI or cyborg
+ var/check_all = 0 //If active, will shoot at anything.
var/ailock = 0 //Silicons cannot use this
req_access = list(access_ai_upload)
@@ -130,6 +131,8 @@
settings[++settings.len] = list("category" = "Check Arrest Status", "setting" = "check_arrest", "value" = check_arrest)
settings[++settings.len] = list("category" = "Check Access Authorization", "setting" = "check_access", "value" = check_access)
settings[++settings.len] = list("category" = "Check misc. Lifeforms", "setting" = "check_anomalies", "value" = check_anomalies)
+ settings[++settings.len] = list("category" = "Neutralize All Entities", "setting" = "check_all", "value" = check_all)
+
data["settings"] = settings
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
@@ -161,6 +164,8 @@
check_access = value
else if(href_list["command"] == "check_anomalies")
check_anomalies = value
+ else if(href_list["command"] == "check_all")
+ check_all = value
updateTurrets()
return 1
@@ -175,6 +180,7 @@
TC.check_arrest = check_arrest
TC.check_weapons = check_weapons
TC.check_anomalies = check_anomalies
+ TC.check_all = check_all
TC.ailock = ailock
if(istype(control_area))
diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index 77087ed32fc..5d692b39b99 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -265,13 +265,13 @@
/obj/mecha/combat/Topic(href,href_list)
..()
- var/datum/topic_input/filter = new (href,href_list)
- if(filter.get("close"))
+ var/datum/topic_input/top_filter = new (href,href_list)
+ if(top_filter.get("close"))
am = null
return
/*
- if(filter.get("saminput"))
- if(md5(filter.get("saminput")) == am)
+ if(top_filter.get("saminput"))
+ if(md5(top_filter.get("saminput")) == am)
occupant_message("From the lies of the Antipath, Circuit preserve us.")
am = null
return
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index acd680ba573..4e895b2b622 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -105,15 +105,15 @@
Topic(href,href_list)
..()
- var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
- if(filter.get("eject"))
+ var/datum/topic_input/top_filter = new /datum/topic_input(href,href_list)
+ if(top_filter.get("eject"))
go_out()
- if(filter.get("view_stats"))
+ if(top_filter.get("view_stats"))
chassis.occupant << browse(get_occupant_stats(),"window=msleeper")
onclose(chassis.occupant, "msleeper")
return
- if(filter.get("inject"))
- inject_reagent(filter.getType("inject",/datum/reagent),filter.getObj("source"))
+ if(top_filter.get("inject"))
+ inject_reagent(top_filter.getType("inject",/datum/reagent),top_filter.getObj("source"))
return
proc/get_occupant_stats()
@@ -473,19 +473,19 @@
Topic(href,href_list)
..()
- var/datum/topic_input/filter = new (href,href_list)
- if(filter.get("toggle_mode"))
+ var/datum/topic_input/top_filter = new (href,href_list)
+ if(top_filter.get("toggle_mode"))
mode = !mode
update_equip_info()
return
- if(filter.get("select_reagents"))
+ if(top_filter.get("select_reagents"))
processed_reagents.len = 0
var/m = 0
var/message
for(var/i=1 to known_reagents.len)
if(m>=synth_speed)
break
- var/reagent = filter.get("reagent_[i]")
+ var/reagent = top_filter.get("reagent_[i]")
if(reagent && (reagent in known_reagents))
message = "[m ? ", " : null][known_reagents[reagent]]"
processed_reagents += reagent
@@ -497,14 +497,14 @@
occupant_message("Reagent processing started.")
log_message("Reagent processing started.")
return
- if(filter.get("show_reagents"))
+ if(top_filter.get("show_reagents"))
chassis.occupant << browse(get_reagents_page(),"window=msyringegun")
- if(filter.get("purge_reagent"))
- var/reagent = filter.get("purge_reagent")
+ if(top_filter.get("purge_reagent"))
+ var/reagent = top_filter.get("purge_reagent")
if(reagent)
reagents.del_reagent(reagent)
return
- if(filter.get("purge_all"))
+ if(top_filter.get("purge_all"))
reagents.clear_reagents()
return
return
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 1292a3747bc..fa511bf412d 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -1,6 +1,6 @@
/obj/machinery/mecha_part_fabricator
icon = 'icons/obj/robotics.dmi'
- icon_state = "fab-idle"
+ icon_state = "mechfab-idle"
name = "Exosuit Fabricator"
desc = "A machine used for construction of mechas."
density = 1
@@ -56,11 +56,11 @@
/obj/machinery/mecha_part_fabricator/update_icon()
overlays.Cut()
if(panel_open)
- icon_state = "fab-o"
+ icon_state = "mechfab-o"
else
- icon_state = "fab-idle"
+ icon_state = "mechfab-idle"
if(busy)
- overlays += "fab-active"
+ overlays += "mechfab-active"
/obj/machinery/mecha_part_fabricator/dismantle()
for(var/f in materials)
@@ -155,9 +155,9 @@
if(materials[S.material.name] + amnt <= res_max_amount)
if(S && S.amount >= 1)
var/count = 0
- overlays += "fab-load-metal"
+ overlays += "mechfab-load-metal"
spawn(10)
- overlays -= "fab-load-metal"
+ overlays -= "mechfab-load-metal"
while(materials[S.material.name] + amnt <= res_max_amount && S.amount >= 1)
materials[S.material.name] += amnt
S.use(1)
@@ -212,7 +212,7 @@
/obj/machinery/mecha_part_fabricator/proc/can_build(var/datum/design/D)
for(var/M in D.materials)
- if(materials[M] < D.materials[M])
+ if(materials[M] < (D.materials[M] * mat_efficiency))
return 0
return 1
diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm
index 8cea4b22c3d..5a665dfd43c 100644
--- a/code/game/mecha/mech_prosthetics.dm
+++ b/code/game/mecha/mech_prosthetics.dm
@@ -239,7 +239,7 @@
/obj/machinery/pros_fabricator/proc/can_build(var/datum/design/D)
for(var/M in D.materials)
- if(materials[M] < D.materials[M])
+ if(materials[M] < (D.materials[M] * mat_efficiency))
return 0
return 1
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 56149a254c2..db8fc519925 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1498,10 +1498,10 @@
return
if(usr.stat > 0)
return
- var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
+ var/datum/topic_input/top_filter = new /datum/topic_input(href,href_list)
if(href_list["select_equip"])
if(usr != src.occupant) return
- var/obj/item/mecha_parts/mecha_equipment/equip = filter.getObj("select_equip")
+ var/obj/item/mecha_parts/mecha_equipment/equip = top_filter.getObj("select_equip")
if(equip)
src.selected = equip
src.occupant_message("You switch to [equip]")
@@ -1532,7 +1532,7 @@
return
if(href_list["rfreq"])
if(usr != src.occupant) return
- var/new_frequency = (radio.frequency + filter.getNum("rfreq"))
+ var/new_frequency = (radio.frequency + top_filter.getNum("rfreq"))
if ((radio.frequency < PUBLIC_LOW_FREQ || radio.frequency > PUBLIC_HIGH_FREQ))
new_frequency = sanitize_frequency(new_frequency)
radio.set_frequency(new_frequency)
@@ -1574,11 +1574,11 @@
return
if(href_list["req_access"] && add_req_access)
if(!in_range(src, usr)) return
- output_access_dialog(filter.getObj("id_card"),filter.getMob("user"))
+ output_access_dialog(top_filter.getObj("id_card"),top_filter.getMob("user"))
return
if(href_list["maint_access"] && maint_access)
if(!in_range(src, usr)) return
- var/mob/user = filter.getMob("user")
+ var/mob/user = top_filter.getMob("user")
if(user)
if(state==0)
state = 1
@@ -1586,18 +1586,18 @@
else if(state==1)
state = 0
user << "The securing bolts are now hidden."
- output_maintenance_dialog(filter.getObj("id_card"),user)
+ output_maintenance_dialog(top_filter.getObj("id_card"),user)
return
if(href_list["set_internal_tank_valve"] && state >=1)
if(!in_range(src, usr)) return
- var/mob/user = filter.getMob("user")
+ var/mob/user = top_filter.getMob("user")
if(user)
var/new_pressure = input(user,"Input new output pressure","Pressure setting",internal_tank_valve) as num
if(new_pressure)
internal_tank_valve = new_pressure
user << "The internal pressure valve has been set to [internal_tank_valve]kPa."
if(href_list["remove_passenger"] && state >= 1)
- var/mob/user = filter.getMob("user")
+ var/mob/user = top_filter.getMob("user")
var/list/passengers = list()
for (var/obj/item/mecha_parts/mecha_equipment/tool/passenger/P in contents)
if (P.occupant)
@@ -1623,20 +1623,20 @@
P.go_out()
P.log_message("[occupant] was removed.")
return
- if(href_list["add_req_access"] && add_req_access && filter.getObj("id_card"))
+ if(href_list["add_req_access"] && add_req_access && top_filter.getObj("id_card"))
if(!in_range(src, usr)) return
- operation_req_access += filter.getNum("add_req_access")
- output_access_dialog(filter.getObj("id_card"),filter.getMob("user"))
+ operation_req_access += top_filter.getNum("add_req_access")
+ output_access_dialog(top_filter.getObj("id_card"),top_filter.getMob("user"))
return
- if(href_list["del_req_access"] && add_req_access && filter.getObj("id_card"))
+ if(href_list["del_req_access"] && add_req_access && top_filter.getObj("id_card"))
if(!in_range(src, usr)) return
- operation_req_access -= filter.getNum("del_req_access")
- output_access_dialog(filter.getObj("id_card"),filter.getMob("user"))
+ operation_req_access -= top_filter.getNum("del_req_access")
+ output_access_dialog(top_filter.getObj("id_card"),top_filter.getMob("user"))
return
if(href_list["finish_req_access"])
if(!in_range(src, usr)) return
add_req_access = 0
- var/mob/user = filter.getMob("user")
+ var/mob/user = top_filter.getMob("user")
user << browse(null,"window=exosuit_add_access")
return
if(href_list["dna_lock"])
@@ -1669,9 +1669,9 @@
/*
if(href_list["debug"])
if(href_list["set_i_dam"])
- setInternalDamage(filter.getNum("set_i_dam"))
+ setInternalDamage(top_filter.getNum("set_i_dam"))
if(href_list["clear_i_dam"])
- clearInternalDamage(filter.getNum("clear_i_dam"))
+ clearInternalDamage(top_filter.getNum("clear_i_dam"))
return
*/
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 00a0654cc12..de1f20fe0a3 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -41,19 +41,19 @@
Topic(href, href_list)
if(..())
return
- var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
+ var/datum/topic_input/top_filter = new /datum/topic_input(href,href_list)
if(href_list["send_message"])
- var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("send_message")
+ var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("send_message")
var/message = sanitize(input(usr,"Input message","Transmit message") as text)
var/obj/mecha/M = MT.in_mecha()
if(message && M)
M.occupant_message(message)
return
if(href_list["shock"])
- var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("shock")
+ var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("shock")
MT.shock()
if(href_list["get_log"])
- var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("get_log")
+ var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("get_log")
stored_data = MT.get_mecha_log()
screen = 1
if(href_list["return"])
diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm
index 2c28dd7ecb9..03f743db6b0 100644
--- a/code/game/objects/effects/chem/foam.dm
+++ b/code/game/objects/effects/chem/foam.dm
@@ -150,8 +150,10 @@
/obj/structure/foamedmetal/ex_act(severity)
qdel(src)
-/obj/structure/foamedmetal/bullet_act()
- if(metal == 1 || prob(50))
+/obj/structure/foamedmetal/bullet_act(var/obj/item/projectile/P)
+ if(istype(P, /obj/item/projectile/test))
+ return
+ else if(metal == 1 || prob(50))
qdel(src)
/obj/structure/foamedmetal/attack_hand(var/mob/user)
diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm
index 019425db0e8..9de35c2582a 100644
--- a/code/game/objects/items/devices/PDA/radio.dm
+++ b/code/game/objects/items/devices/PDA/radio.dm
@@ -29,7 +29,7 @@
if(key3)
signal.data[key3] = value3
- frequency.post_signal(src, signal, filter = s_filter)
+ frequency.post_signal(src, signal, radio_filter = s_filter)
return
@@ -47,7 +47,7 @@
..()
spawn(5)
if(radio_controller)
- radio_controller.add_object(src, control_freq, filter = RADIO_SECBOT)
+ radio_controller.add_object(src, control_freq, radio_filter = RADIO_SECBOT)
// receive radio signals
// can detect bot status signals
diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm
index e2f4137cb43..d10a57c952c 100644
--- a/code/game/objects/items/devices/communicator/communicator.dm
+++ b/code/game/objects/items/devices/communicator/communicator.dm
@@ -985,7 +985,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(text_message && O.exonet)
O.exonet.send_message(chosen_communicator.exonet.address, "text", text_message)
- src << "You have sent '[text_message]' to [chosen_communicator].."
+ src << "You have sent '[text_message]' to [chosen_communicator]."
exonet_messages.Add("To [chosen_communicator]:
[text_message]")
log_pda("[usr] (COMM: [src]) sent \"[text_message]\" to [chosen_communicator]")
@@ -1108,4 +1108,4 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
/obj/machinery/camera/communicator/New()
..()
client_huds |= global_hud.whitense
- client_huds |= global_hud.darkMask
\ No newline at end of file
+ client_huds |= global_hud.darkMask
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 888af9124b6..32a4580c7e0 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -124,7 +124,6 @@
icon_state = "tile_white"
no_variants = FALSE
-// VOREStation Edit
/obj/item/stack/tile/floor/techgrey
name = "grey techfloor tile"
singular_name = "grey techfloor tile"
@@ -143,7 +142,6 @@
icon_state = "tile_steel"
matter = list("plasteel" = SHEET_MATERIAL_AMOUNT / 4)
no_variants = FALSE
-// VOREStation Edit End
/obj/item/stack/tile/floor/steel
name = "steel floor tile"
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
index 1d806a2710d..6d683cd9a84 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
@@ -35,7 +35,7 @@
origin_tech = list(TECH_MAGNET = 3, TECH_POWER = 4)
req_components = list(
/obj/item/weapon/stock_parts/manipulator/pico = 2,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1,
/obj/item/weapon/stock_parts/subspace/treatment = 1,
/obj/item/weapon/stock_parts/subspace/analyzer = 1,
/obj/item/weapon/stock_parts/console_screen = 1,
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
index 835971b0129..856104dcce9 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
@@ -11,7 +11,7 @@
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_BLUESPACE = 2)
req_components = list(
/obj/item/weapon/stock_parts/subspace/ansible = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1,
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/weapon/stock_parts/micro_laser = 1)
@@ -22,7 +22,7 @@
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/subspace/filter = 2)
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 2)
/obj/item/weapon/circuitboard/telecomms/relay
name = T_BOARD("relay mainframe")
@@ -31,7 +31,7 @@
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/subspace/filter = 2)
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 2)
/obj/item/weapon/circuitboard/telecomms/bus
name = T_BOARD("bus mainframe")
@@ -40,7 +40,7 @@
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1)
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1)
/obj/item/weapon/circuitboard/telecomms/processor
name = T_BOARD("processor unit")
@@ -48,7 +48,7 @@
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4)
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 3,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1,
/obj/item/weapon/stock_parts/subspace/treatment = 2,
/obj/item/weapon/stock_parts/subspace/analyzer = 1,
/obj/item/stack/cable_coil = 2,
@@ -61,7 +61,7 @@
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1)
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1)
/obj/item/weapon/circuitboard/telecomms/broadcaster
name = T_BOARD("subspace broadcaster")
@@ -70,7 +70,7 @@
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1,
/obj/item/weapon/stock_parts/subspace/crystal = 1,
/obj/item/weapon/stock_parts/micro_laser/high = 2)
@@ -81,7 +81,7 @@
origin_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 4)
req_components = list(
/obj/item/weapon/stock_parts/subspace/ansible = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1,
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/subspace/crystal = 1,
@@ -94,7 +94,7 @@
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2, TECH_BLUESPACE = 2)
req_components = list(
/obj/item/weapon/stock_parts/subspace/ansible = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1,
/obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/weapon/stock_parts/subspace/treatment = 1,
/obj/item/stack/cable_coil = 2)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index 6f8e1782eb2..46543b901b6 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -103,7 +103,7 @@
/obj/item/device/paicard,
/obj/item/device/violin,
/obj/item/weapon/storage/belt/utility/full,
- /obj/item/clothing/accessory/horrible)
+ /obj/item/clothing/accessory/tie/horrible)
if(!ispath(gift_type,/obj/item)) return
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 87afb34fa4e..7e543b75cd9 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -149,6 +149,7 @@
new /obj/item/clothing/suit/nun(src)
new /obj/item/clothing/head/nun_hood(src)
new /obj/item/clothing/suit/storage/hooded/chaplain_hoodie(src)
+ new /obj/item/clothing/suit/storage/hooded/chaplain_hoodie/whiteout(src)
new /obj/item/clothing/suit/holidaypriest(src)
new /obj/item/clothing/under/wedding/bride_white(src)
new /obj/item/weapon/storage/backpack/cultpack (src)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index e08dba0a0f8..5976c357036 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -1,78 +1,6 @@
-//trees
-/obj/structure/flora/tree
- name = "tree"
- anchored = 1
- density = 1
- pixel_x = -16
- layer = MOB_LAYER // You know what, let's play it safe.
-
-/obj/structure/flora/tree/pine
- name = "pine tree"
- icon = 'icons/obj/flora/pinetrees.dmi'
- icon_state = "pine_1"
-
-/obj/structure/flora/tree/pine/New()
- ..()
- icon_state = "pine_[rand(1, 3)]"
-
-/obj/structure/flora/tree/pine/xmas
- name = "xmas tree"
- icon = 'icons/obj/flora/pinetrees.dmi'
- icon_state = "pine_c"
-
-/obj/structure/flora/tree/pine/xmas/New()
- ..()
- icon_state = "pine_c"
-
-/obj/structure/flora/tree/dead
- icon = 'icons/obj/flora/deadtrees.dmi'
- icon_state = "tree_1"
-
-/obj/structure/flora/tree/dead/New()
- ..()
- icon_state = "tree_[rand(1, 6)]"
-
-/obj/structure/flora/tree/sif
- name = "glowing tree"
- desc = "It's a tree, except this one seems quite alien. It glows a deep blue."
- icon = 'icons/obj/flora/deadtrees.dmi'
- icon_state = "tree_sif"
-
-/obj/structure/flora/tree/sif/New()
- update_icon()
-
-/obj/structure/flora/tree/sif/update_icon()
- set_light(5, 1, "#33ccff")
- overlays.Cut()
- overlays.Add(image(icon = 'icons/obj/flora/deadtrees.dmi', icon_state = "[icon_state]_glow", layer = LIGHTING_LAYER + 0.1))
-
-//grass
-/obj/structure/flora/grass
- name = "grass"
- icon = 'icons/obj/flora/snowflora.dmi'
- anchored = 1
-
-/obj/structure/flora/grass/brown
- icon_state = "snowgrass1bb"
-
-/obj/structure/flora/grass/brown/New()
- ..()
- icon_state = "snowgrass[rand(1, 3)]bb"
-/obj/structure/flora/grass/green
- icon_state = "snowgrass1gb"
-/obj/structure/flora/grass/green/New()
- ..()
- icon_state = "snowgrass[rand(1, 3)]gb"
-
-/obj/structure/flora/grass/both
- icon_state = "snowgrassall1"
-
-/obj/structure/flora/grass/both/New()
- ..()
- icon_state = "snowgrassall[rand(1, 3)]"
//bushes
diff --git a/code/game/objects/structures/flora/grass.dm b/code/game/objects/structures/flora/grass.dm
new file mode 100644
index 00000000000..d5e7e965a87
--- /dev/null
+++ b/code/game/objects/structures/flora/grass.dm
@@ -0,0 +1,27 @@
+//grass
+/obj/structure/flora/grass
+ name = "grass"
+ icon = 'icons/obj/flora/snowflora.dmi'
+ anchored = 1
+
+/obj/structure/flora/grass/brown
+ icon_state = "snowgrass1bb"
+
+/obj/structure/flora/grass/brown/New()
+ ..()
+ icon_state = "snowgrass[rand(1, 3)]bb"
+
+
+/obj/structure/flora/grass/green
+ icon_state = "snowgrass1gb"
+
+/obj/structure/flora/grass/green/New()
+ ..()
+ icon_state = "snowgrass[rand(1, 3)]gb"
+
+/obj/structure/flora/grass/both
+ icon_state = "snowgrassall1"
+
+/obj/structure/flora/grass/both/New()
+ ..()
+ icon_state = "snowgrassall[rand(1, 3)]"
\ No newline at end of file
diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm
new file mode 100644
index 00000000000..d7960b59825
--- /dev/null
+++ b/code/game/objects/structures/flora/trees.dm
@@ -0,0 +1,202 @@
+//trees
+/obj/structure/flora/tree
+ name = "tree"
+ anchored = 1
+ density = 1
+ pixel_x = -16
+ layer = MOB_LAYER // You know what, let's play it safe.
+ var/base_state = null // Used for stumps.
+ var/health = 200 // Used for chopping down trees.
+ var/max_health = 200
+ var/shake_animation_degrees = 4 // How much to shake the tree when struck. Larger trees should have smaller numbers or it looks weird.
+ var/obj/item/stack/material/product = null // What you get when chopping this tree down. Generally it will be a type of wood.
+ var/product_amount = 10 // How much of a stack you get, if the above is defined.
+ var/is_stump = FALSE // If true, suspends damage tracking and most other effects.
+
+/obj/structure/flora/tree/attackby(var/obj/item/weapon/W, var/mob/living/user)
+ if(!istype(W))
+ return ..()
+
+ if(is_stump)
+ return
+
+ visible_message("\The [user] hits \the [src] with \the [W]!")
+
+ var/damage_to_do = W.force
+ if(!W.sharp && !W.edge)
+ damage_to_do = round(damage_to_do / 4)
+ if(damage_to_do > 0)
+ if(W.sharp && W.edge)
+ playsound(get_turf(src), 'sound/effects/woodcutting.ogg', 50, 1)
+ else
+ playsound(get_turf(src), W.hitsound, 50, 1)
+ if(damage_to_do > 5)
+ adjust_health(-damage_to_do)
+ else
+ to_chat(user, "\The [W] is ineffective at harming \the [src].")
+
+ hit_animation()
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+ user.do_attack_animation(src)
+
+// Shakes the tree slightly, more or less stolen from lockers.
+/obj/structure/flora/tree/proc/hit_animation()
+ var/init_px = pixel_x
+ var/shake_dir = pick(-1, 1)
+ animate(src, transform=turn(matrix(), shake_animation_degrees * shake_dir), pixel_x=init_px + 2*shake_dir, time=1)
+ animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
+
+// Used when the tree gets hurt.
+/obj/structure/flora/tree/proc/adjust_health(var/amount)
+ if(is_stump)
+ return
+
+ health = between(0, health + amount, max_health)
+ if(health <= 0)
+ die()
+
+// Called when the tree loses all health, for whatever reason.
+/obj/structure/flora/tree/proc/die()
+ if(is_stump)
+ return
+
+ if(product && product_amount) // Make wooden logs.
+ var/obj/item/stack/material/M = new product(get_turf(src))
+ M.amount = product_amount
+ M.update_icon()
+ visible_message("\The [src] is felled!")
+ stump()
+
+// Makes the tree into a mostly non-interactive stump.
+/obj/structure/flora/tree/proc/stump()
+ if(is_stump)
+ return
+
+ is_stump = TRUE
+ icon_state = "[base_state]_stump"
+ overlays.Cut() // For the Sif tree and other future glowy trees.
+ set_light(0)
+
+/obj/structure/flora/tree/ex_act(var/severity)
+ adjust_health(-(max_health / severity))
+
+
+/obj/structure/flora/tree/get_description_interaction()
+ var/list/results = list()
+
+ if(!is_stump)
+ results += "[desc_panel_image("hatchet")]to cut down this tree into logs. Any sharp and strong weapon will do."
+
+ results += ..()
+
+ return results
+
+// Subtypes.
+
+// Pine trees
+
+/obj/structure/flora/tree/pine
+ name = "pine tree"
+ icon = 'icons/obj/flora/pinetrees.dmi'
+ icon_state = "pine_1"
+ base_state = "pine"
+ product = /obj/item/stack/material/log
+ shake_animation_degrees = 3
+
+/obj/structure/flora/tree/pine/New()
+ ..()
+ icon_state = "[base_state]_[rand(1, 3)]"
+
+
+/obj/structure/flora/tree/pine/xmas
+ name = "xmas tree"
+ icon = 'icons/obj/flora/pinetrees.dmi'
+ icon_state = "pine_c"
+
+/obj/structure/flora/tree/pine/xmas/New()
+ ..()
+ icon_state = "pine_c"
+
+// Palm trees
+
+/obj/structure/flora/tree/palm
+ icon = 'icons/obj/flora/palmtrees.dmi'
+ icon_state = "palm1"
+ base_state = "palm"
+ product = /obj/item/stack/material/log
+ product_amount = 5
+ health = 200
+ max_health = 200
+ pixel_x = 0
+
+/obj/structure/flora/tree/palm/New()
+ ..()
+ icon_state = "[base_state][rand(1, 2)]"
+
+
+// Dead trees
+
+/obj/structure/flora/tree/dead
+ icon = 'icons/obj/flora/deadtrees.dmi'
+ icon_state = "tree_1"
+ base_state = "tree"
+ product = /obj/item/stack/material/log
+ product_amount = 5
+ health = 200
+ max_health = 200
+
+/obj/structure/flora/tree/dead/New()
+ ..()
+ icon_state = "[base_state]_[rand(1, 6)]"
+
+// Small jungle trees
+
+/obj/structure/flora/tree/jungle_small
+ icon = 'icons/obj/flora/jungletreesmall.dmi'
+ icon_state = "tree"
+ base_state = "tree"
+ product = /obj/item/stack/material/log
+ product_amount = 10
+ health = 400
+ max_health = 400
+ pixel_x = -32
+
+/obj/structure/flora/tree/jungle_small/New()
+ ..()
+ icon_state = "[base_state][rand(1, 6)]"
+
+// Big jungle trees
+
+/obj/structure/flora/tree/jungle
+ icon = 'icons/obj/flora/jungletree.dmi'
+ icon_state = "tree"
+ base_state = "tree"
+ product = /obj/item/stack/material/log
+ product_amount = 20
+ health = 800
+ max_health = 800
+ pixel_x = -48
+ pixel_y = -16
+ shake_animation_degrees = 2
+
+/obj/structure/flora/tree/jungle/New()
+ ..()
+ icon_state = "[base_state][rand(1, 6)]"
+
+// Sif trees
+
+/obj/structure/flora/tree/sif
+ name = "glowing tree"
+ desc = "It's a tree, except this one seems quite alien. It glows a deep blue."
+ icon = 'icons/obj/flora/deadtrees.dmi'
+ icon_state = "tree_sif"
+ base_state = "tree_sif"
+ product = /obj/item/stack/material/log/sif
+
+/obj/structure/flora/tree/sif/New()
+ update_icon()
+
+/obj/structure/flora/tree/sif/update_icon()
+ set_light(5, 1, "#33ccff")
+ overlays.Cut()
+ overlays.Add(image(icon = 'icons/obj/flora/deadtrees.dmi', icon_state = "[icon_state]_glow", layer = LIGHTING_LAYER + 0.1))
\ No newline at end of file
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index 6597f62107b..ac231eb947a 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -68,7 +68,6 @@
new /obj/item/stack/rods(src.loc)
qdel(src)
return
- // VOREStation Edit - Added Catwalks
if (istype(C, /obj/item/stack/rods))
var/obj/item/stack/rods/R = C
if(R.use(2))
@@ -78,7 +77,6 @@
new /obj/structure/catwalk(src.loc)
qdel(src)
return
- // VOREStation Edit End
return
/obj/structure/lattice/proc/updateOverlays()
diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm
index c4fb053e329..daa6e8c94ac 100644
--- a/code/game/objects/structures/loot_piles.dm
+++ b/code/game/objects/structures/loot_piles.dm
@@ -337,7 +337,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
/obj/item/weapon/stock_parts/subspace/analyzer,
/obj/item/weapon/stock_parts/subspace/ansible,
/obj/item/weapon/stock_parts/subspace/crystal,
- /obj/item/weapon/stock_parts/subspace/filter,
+ /obj/item/weapon/stock_parts/subspace/sub_filter,
/obj/item/weapon/stock_parts/subspace/transmitter,
/obj/item/weapon/stock_parts/subspace/treatment,
/obj/item/frame,
diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm
index 98bae005f8d..ea52ed3845b 100644
--- a/code/game/objects/structures/railing.dm
+++ b/code/game/objects/structures/railing.dm
@@ -1,7 +1,7 @@
// Based on railing.dmi from https://github.com/Endless-Horizon/CEV-Eris
/obj/structure/railing
name = "railing"
- desc = "A standard steel railing. Play stupid games win stupid prizes."
+ desc = "A standard steel railing. Play stupid games, win stupid prizes."
icon = 'icons/obj/railing.dmi'
density = 1
throwpass = 1
@@ -103,7 +103,7 @@
/obj/structure/railing/update_icon(var/UpdateNeighgors = 1)
NeighborsCheck(UpdateNeighgors)
- //layer = (dir == SOUTH) ? FLY_LAYER : initial(layer) // Vorestation edit because wtf does this even do
+ //layer = (dir == SOUTH) ? FLY_LAYER : initial(layer) // wtf does this even do
overlays.Cut()
if (!check || !anchored)//|| !anchored
icon_state = "railing0"
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index be376e0f652..2d07f0ffbd4 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -2,7 +2,7 @@
#define SUPPLY_DOCKZ 2 //Z-level of the Dock.
#define SUPPLY_STATIONZ 1 //Z-level of the Station.
#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station
-#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock
+#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock
//Supply packs are in /code/defines/obj/supplypacks.dm
//Computers are in /code/game/machinery/computer/supply.dm
@@ -10,294 +10,304 @@
var/datum/controller/supply/supply_controller = new()
var/list/mechtoys = list(
- /obj/item/toy/prize/ripley,
- /obj/item/toy/prize/fireripley,
- /obj/item/toy/prize/deathripley,
- /obj/item/toy/prize/gygax,
- /obj/item/toy/prize/durand,
- /obj/item/toy/prize/honk,
- /obj/item/toy/prize/marauder,
- /obj/item/toy/prize/seraph,
- /obj/item/toy/prize/mauler,
- /obj/item/toy/prize/odysseus,
- /obj/item/toy/prize/phazon
+ /obj/item/toy/prize/ripley,
+ /obj/item/toy/prize/fireripley,
+ /obj/item/toy/prize/deathripley,
+ /obj/item/toy/prize/gygax,
+ /obj/item/toy/prize/durand,
+ /obj/item/toy/prize/honk,
+ /obj/item/toy/prize/marauder,
+ /obj/item/toy/prize/seraph,
+ /obj/item/toy/prize/mauler,
+ /obj/item/toy/prize/odysseus,
+ /obj/item/toy/prize/phazon
)
/obj/item/weapon/paper/manifest
- name = "supply manifest"
- var/is_copy = 1
+ name = "supply manifest"
+ var/is_copy = 1
/area/supply/station
- name = "Supply Shuttle"
- icon_state = "shuttle3"
- requires_power = 0
- base_turf = /turf/space
+ name = "Supply Shuttle"
+ icon_state = "shuttle3"
+ requires_power = 0
+ base_turf = /turf/space
/area/supply/dock
- name = "Supply Shuttle"
- icon_state = "shuttle3"
- requires_power = 0
- base_turf = /turf/space
+ name = "Supply Shuttle"
+ icon_state = "shuttle3"
+ requires_power = 0
+ base_turf = /turf/space
/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY
- name = "\improper plastic flaps"
- desc = "Completely impassable - or are they?"
- icon = 'icons/obj/stationobjs.dmi' //Change this.
- icon_state = "plasticflaps"
- density = 0
- anchored = 1
- layer = 4
- explosion_resistance = 5
- var/list/mobs_can_pass = list(
- /mob/living/bot,
- /mob/living/simple_animal/slime,
- /mob/living/simple_animal/mouse,
- /mob/living/silicon/robot/drone
- )
+ name = "\improper plastic flaps"
+ desc = "Completely impassable - or are they?"
+ icon = 'icons/obj/stationobjs.dmi' //Change this.
+ icon_state = "plasticflaps"
+ density = 0
+ anchored = 1
+ layer = 4
+ explosion_resistance = 5
+ var/list/mobs_can_pass = list(
+ /mob/living/bot,
+ /mob/living/simple_animal/slime,
+ /mob/living/simple_animal/mouse,
+ /mob/living/silicon/robot/drone
+ )
/obj/structure/plasticflaps/attackby(obj/item/P, mob/user)
- if(istype(P, /obj/item/weapon/wirecutters))
- playsound(src, P.usesound, 50, 1)
- user << "You start to cut the plastic flaps."
- if(do_after(user, 10 * P.toolspeed))
- user << "You cut the plastic flaps."
- var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
- A.amount = 4
- qdel(src)
- return
- else
- return
+ if(istype(P, /obj/item/weapon/wirecutters))
+ playsound(src, P.usesound, 50, 1)
+ user << "You start to cut the plastic flaps."
+ if(do_after(user, 10 * P.toolspeed))
+ user << "You cut the plastic flaps."
+ var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
+ A.amount = 4
+ qdel(src)
+ return
+ else
+ return
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
- if(istype(A) && A.checkpass(PASSGLASS))
- return prob(60)
+ if(istype(A) && A.checkpass(PASSGLASS))
+ return prob(60)
- var/obj/structure/bed/B = A
- if (istype(A, /obj/structure/bed) && B.buckled_mob)//if it's a bed/chair and someone is buckled, it will not pass
- return 0
+ var/obj/structure/bed/B = A
+ if (istype(A, /obj/structure/bed) && B.buckled_mob)//if it's a bed/chair and someone is buckled, it will not pass
+ return 0
- if(istype(A, /obj/vehicle)) //no vehicles
- return 0
+ if(istype(A, /obj/vehicle)) //no vehicles
+ return 0
- var/mob/living/M = A
- if(istype(M))
- if(M.lying)
- return ..()
- for(var/mob_type in mobs_can_pass)
- if(istype(A, mob_type))
- return ..()
- return issmall(M)
+ var/mob/living/M = A
+ if(istype(M))
+ if(M.lying)
+ return ..()
+ for(var/mob_type in mobs_can_pass)
+ if(istype(A, mob_type))
+ return ..()
+ return issmall(M)
- return ..()
+ return ..()
/obj/structure/plasticflaps/ex_act(severity)
- switch(severity)
- if (1)
- qdel(src)
- if (2)
- if (prob(50))
- qdel(src)
- if (3)
- if (prob(5))
- qdel(src)
+ switch(severity)
+ if (1)
+ qdel(src)
+ if (2)
+ if (prob(50))
+ qdel(src)
+ if (3)
+ if (prob(5))
+ qdel(src)
/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates
- name = "airtight plastic flaps"
- desc = "Heavy duty, airtight, plastic flaps."
+ name = "airtight plastic flaps"
+ desc = "Heavy duty, airtight, plastic flaps."
- New() //set the turf below the flaps to block air
- var/turf/T = get_turf(loc)
- if(T)
- T.blocks_air = 1
- ..()
+ New() //set the turf below the flaps to block air
+ var/turf/T = get_turf(loc)
+ if(T)
+ T.blocks_air = 1
+ ..()
- Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor
- var/turf/T = get_turf(loc)
- if(T)
- if(istype(T, /turf/simulated/floor))
- T.blocks_air = 0
- ..()
+ Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor
+ var/turf/T = get_turf(loc)
+ if(T)
+ if(istype(T, /turf/simulated/floor))
+ T.blocks_air = 0
+ ..()
/*
/obj/effect/marker/supplymarker
- icon_state = "X"
- icon = 'icons/misc/mark.dmi'
- name = "X"
- invisibility = 101
- anchored = 1
- opacity = 0
+ icon_state = "X"
+ icon = 'icons/misc/mark.dmi'
+ name = "X"
+ invisibility = 101
+ anchored = 1
+ opacity = 0
*/
/datum/supply_order
- var/ordernum
- var/datum/supply_packs/object = null
- var/orderedby = null
- var/comment = null
+ var/ordernum
+ var/datum/supply_packs/object = null
+ var/orderedby = null
+ var/comment = null
/datum/controller/supply
- //supply points
- var/points = 50
- var/points_per_process = 1.5
- var/points_per_slip = 2
- var/points_per_platinum = 5 // 5 points per sheet
- var/points_per_phoron = 5
- //control
- var/ordernum
- var/list/shoppinglist = list()
- var/list/requestlist = list()
- var/list/supply_packs = list()
- //shuttle movement
- var/movetime = 1200
- var/datum/shuttle/ferry/supply/shuttle
+ //supply points
+ var/points = 50
+ var/points_per_process = 1.5
+ var/points_per_slip = 2
+ var/points_per_platinum = 5 // 5 points per sheet
+ var/points_per_phoron = 5
+ var/points_per_money = 0.02
+ //control
+ var/ordernum
+ var/list/shoppinglist = list()
+ var/list/requestlist = list()
+ var/list/supply_packs = list()
+ //shuttle movement
+ var/movetime = 1200
+ var/datum/shuttle/ferry/supply/shuttle
- New()
- ordernum = rand(1,9000)
+ New()
+ ordernum = rand(1,9000)
- for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs))
- var/datum/supply_packs/P = new typepath()
- supply_packs[P.name] = P
+ for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs))
+ var/datum/supply_packs/P = new typepath()
+ supply_packs[P.name] = P
- // Supply shuttle ticker - handles supply point regeneration
- // This is called by the process scheduler every thirty seconds
- proc/process()
- points += points_per_process
+ // Supply shuttle ticker - handles supply point regeneration
+ // This is called by the process scheduler every thirty seconds
+ proc/process()
+ points += points_per_process
- //To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types.
- proc/forbidden_atoms_check(atom/A)
- if(istype(A,/mob/living))
- return 1
- if(istype(A,/obj/item/weapon/disk/nuclear))
- return 1
- if(istype(A,/obj/machinery/nuclearbomb))
- return 1
- if(istype(A,/obj/item/device/radio/beacon))
- return 1
+ //To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types.
+ proc/forbidden_atoms_check(atom/A)
+ if(istype(A,/mob/living))
+ return 1
+ if(istype(A,/obj/item/weapon/disk/nuclear))
+ return 1
+ if(istype(A,/obj/machinery/nuclearbomb))
+ return 1
+ if(istype(A,/obj/item/device/radio/beacon))
+ return 1
- for(var/i=1, i<=A.contents.len, i++)
- var/atom/B = A.contents[i]
- if(.(B))
- return 1
+ for(var/i=1, i<=A.contents.len, i++)
+ var/atom/B = A.contents[i]
+ if(.(B))
+ return 1
- //Sellin
- proc/sell()
- var/area/area_shuttle = shuttle.get_location_area()
- if(!area_shuttle) return
+ //Sellin
+ proc/sell()
+ var/area/area_shuttle = shuttle.get_location_area()
+ if(!area_shuttle) return
- callHook("sell_shuttle", list(area_shuttle));
+ callHook("sell_shuttle", list(area_shuttle));
- var/phoron_count = 0
- var/plat_count = 0
+ var/phoron_count = 0
+ var/plat_count = 0
+ var/money_count = 0
- for(var/atom/movable/MA in area_shuttle)
- if(MA.anchored) continue
+ for(var/atom/movable/MA in area_shuttle)
+ if(MA.anchored) continue
- // Must be in a crate!
- if(istype(MA,/obj/structure/closet/crate))
- var/obj/structure/closet/crate/CR = MA
- callHook("sell_crate", list(CR, area_shuttle))
+ // Must be in a crate!
+ if(istype(MA,/obj/structure/closet/crate))
+ var/obj/structure/closet/crate/CR = MA
+ callHook("sell_crate", list(CR, area_shuttle))
- points += CR.points_per_crate
- var/find_slip = 1
+ points += CR.points_per_crate
+ var/find_slip = 1
- for(var/atom in CR)
- // Sell manifests
- var/atom/A = atom
- if(find_slip && istype(A,/obj/item/weapon/paper/manifest))
- var/obj/item/weapon/paper/manifest/slip = A
- if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense
- points += points_per_slip
- find_slip = 0
- continue
+ for(var/atom in CR)
+ // Sell manifests
+ var/atom/A = atom
+ if(find_slip && istype(A,/obj/item/weapon/paper/manifest))
+ var/obj/item/weapon/paper/manifest/slip = A
+ if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense
+ points += points_per_slip
+ find_slip = 0
+ continue
- // Sell phoron and platinum
- if(istype(A, /obj/item/stack))
- var/obj/item/stack/P = A
- switch(P.get_material_name())
- if("phoron") phoron_count += P.get_amount()
- if("platinum") plat_count += P.get_amount()
- qdel(MA)
+ // Sell phoron and platinum
+ if(istype(A, /obj/item/stack))
+ var/obj/item/stack/P = A
+ switch(P.get_material_name())
+ if("phoron") phoron_count += P.get_amount()
+ if("platinum") plat_count += P.get_amount()
- if(phoron_count)
- points += phoron_count * points_per_phoron
+ //Sell spacebucks
+ if(istype(A, /obj/item/weapon/spacecash))
+ var/obj/item/weapon/spacecash/cashmoney = A
+ money_count += cashmoney.worth
+ qdel(MA)
- if(plat_count)
- points += plat_count * points_per_platinum
+ if(phoron_count)
+ points += phoron_count * points_per_phoron
- //Buyin
- proc/buy()
- if(!shoppinglist.len) return
+ if(plat_count)
+ points += plat_count * points_per_platinum
- var/area/area_shuttle = shuttle.get_location_area()
- if(!area_shuttle) return
+ if(money_count)
+ points += money_count * points_per_money
- var/list/clear_turfs = list()
+ //Buyin
+ proc/buy()
+ if(!shoppinglist.len) return
- for(var/turf/T in area_shuttle)
- if(T.density) continue
- var/contcount
- for(var/atom/A in T.contents)
- if(!A.simulated)
- continue
- contcount++
- if(contcount)
- continue
- clear_turfs += T
+ var/area/area_shuttle = shuttle.get_location_area()
+ if(!area_shuttle) return
- for(var/S in shoppinglist)
- if(!clear_turfs.len) break
- var/i = rand(1,clear_turfs.len)
- var/turf/pickedloc = clear_turfs[i]
- clear_turfs.Cut(i,i+1)
- shoppinglist -= S
+ var/list/clear_turfs = list()
- var/datum/supply_order/SO = S
- var/datum/supply_packs/SP = SO.object
+ for(var/turf/T in area_shuttle)
+ if(T.density) continue
+ var/contcount
+ for(var/atom/A in T.contents)
+ if(!A.simulated)
+ continue
+ contcount++
+ if(contcount)
+ continue
+ clear_turfs += T
- var/obj/A = new SP.containertype(pickedloc)
- A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]"
+ for(var/S in shoppinglist)
+ if(!clear_turfs.len) break
+ var/i = rand(1,clear_turfs.len)
+ var/turf/pickedloc = clear_turfs[i]
+ clear_turfs.Cut(i,i+1)
+ shoppinglist -= S
- //supply manifest generation begin
+ var/datum/supply_order/SO = S
+ var/datum/supply_packs/SP = SO.object
- var/obj/item/weapon/paper/manifest/slip
- if(!SP.contraband)
- slip = new /obj/item/weapon/paper/manifest(A)
- slip.is_copy = 0
- slip.info = "[command_name()] Shipping Manifest
"
- slip.info +="Order #[SO.ordernum]
"
- slip.info +="Destination: [station_name()]
"
- slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
"
- slip.info +="CONTENTS:
"
+ var/obj/A = new SP.containertype(pickedloc)
+ A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]"
- //spawn the stuff, finish generating the manifest while you're at it
- if(SP.access)
- if(isnum(SP.access))
- A.req_access = list(SP.access)
- else if(islist(SP.access))
- var/list/L = SP.access // access var is a plain var, we need a list
- A.req_access = L.Copy()
- else
- world << "Supply pack with invalid access restriction [SP.access] encountered!"
+ //supply manifest generation begin
- var/list/contains
- if(istype(SP,/datum/supply_packs/randomised))
- var/datum/supply_packs/randomised/SPR = SP
- contains = list()
- if(SPR.contains.len)
- for(var/j=1,j<=SPR.num_contained,j++)
- contains += pick(SPR.contains)
- else
- contains = SP.contains
+ var/obj/item/weapon/paper/manifest/slip
+ if(!SP.contraband)
+ slip = new /obj/item/weapon/paper/manifest(A)
+ slip.is_copy = 0
+ slip.info = "[command_name()] Shipping Manifest
"
+ slip.info +="Order #[SO.ordernum]
"
+ slip.info +="Destination: [station_name()]
"
+ slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
"
+ slip.info +="CONTENTS:
"
- for(var/typepath in contains)
- if(!typepath) continue
- var/number_of_items = max(1, contains[typepath])
- for(var/j = 1 to number_of_items)
- var/atom/B2 = new typepath(A)
- if(slip) slip.info += "- [B2.name]
" //add the item to the manifest
+ //spawn the stuff, finish generating the manifest while you're at it
+ if(SP.access)
+ if(isnum(SP.access))
+ A.req_access = list(SP.access)
+ else if(islist(SP.access))
+ var/list/L = SP.access // access var is a plain var, we need a list
+ A.req_access = L.Copy()
+ else
+ world << "Supply pack with invalid access restriction [SP.access] encountered!"
- //manifest finalisation
- if(slip)
- slip.info += "
"
- slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
"
+ var/list/contains
+ if(istype(SP,/datum/supply_packs/randomised))
+ var/datum/supply_packs/randomised/SPR = SP
+ contains = list()
+ if(SPR.contains.len)
+ for(var/j=1,j<=SPR.num_contained,j++)
+ contains += pick(SPR.contains)
+ else
+ contains = SP.contains
- return
+ for(var/typepath in contains)
+ if(!typepath) continue
+ var/number_of_items = max(1, contains[typepath])
+ for(var/j = 1 to number_of_items)
+ var/atom/B2 = new typepath(A)
+ if(slip) slip.info += "- [B2.name]
" //add the item to the manifest
+
+ //manifest finalisation
+ if(slip)
+ slip.info += "
"
+ slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
"
+
+ return
\ No newline at end of file
diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm
index 82421dc3acf..4d708b2944c 100644
--- a/code/game/turfs/flooring/flooring.dm
+++ b/code/game/turfs/flooring/flooring.dm
@@ -98,7 +98,6 @@ var/list/flooring_types
'sound/effects/footstep/carpet4.ogg',
'sound/effects/footstep/carpet5.ogg'))
-// VOREStation Edit - Eris Carpets
/decl/flooring/carpet/bcarpet
name = "black carpet"
icon_base = "bcarpet"
@@ -133,14 +132,13 @@ var/list/flooring_types
name = "orange carpet"
icon_base = "oracarpet"
build_type = /obj/item/stack/tile/carpet/oracarpet
-// VOREStation Edit End
/decl/flooring/tiling
name = "floor"
desc = "Scuffed from the passage of countless greyshirts."
- icon = 'icons/turf/flooring/tiles.dmi' // VOREStation Edit - Eris floors
- icon_base = "tiled" // VOREStation Edit - Eris floors
- has_damage_range = 2 // VOREStation Edit - Eris floors
+ icon = 'icons/turf/flooring/tiles.dmi'
+ icon_base = "tiled"
+ has_damage_range = 2
damage_temperature = T0C+1400
flags = TURF_REMOVE_CROWBAR | TURF_CAN_BREAK | TURF_CAN_BURN
build_type = /obj/item/stack/tile/floor
@@ -152,7 +150,6 @@ var/list/flooring_types
'sound/effects/footstep/floor4.ogg',
'sound/effects/footstep/floor5.ogg'))
-//VOREStation Edit for icons and extra types
/decl/flooring/tiling/tech
desc = "Scuffed from the passage of countless greyshirts."
icon = 'icons/turf/flooring/techfloor.dmi'
diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm
index b50ac335d95..86a7ac1a323 100644
--- a/code/game/turfs/flooring/flooring_decals.dm
+++ b/code/game/turfs/flooring/flooring_decals.dm
@@ -14,7 +14,7 @@ var/list/floor_decals = list()
if(newcolour) color = newcolour
..(newloc)
-// VOREStation Edit - Hack to workaround byond crash bug
+// Hack to workaround byond crash bug
/obj/effect/floor_decal/initialize()
if(!floor_decals_initialized || !loc || QDELETED(src))
return
@@ -23,7 +23,6 @@ var/list/floor_decals = list()
T.apply_decals()
qdel(src)
return
-// VOREStation Edit End
/obj/effect/floor_decal/reset
name = "reset marker"
diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm
index 007108c72ea..9a7fec800a4 100644
--- a/code/game/turfs/simulated/floor_icon.dm
+++ b/code/game/turfs/simulated/floor_icon.dm
@@ -60,11 +60,10 @@ var/list/flooring_cache = list()
if(!(istype(T) && T.flooring && T.flooring.name == flooring.name))
overlays |= get_flooring_overlay("[flooring.icon_base]-corner-[SOUTHWEST]", "[flooring.icon_base]_corners", SOUTHWEST)
- // VOREStation Edit - Hack workaround to byond crash bug
+ // Hack workaround to byond crash bug
//if(decals && decals.len)
//overlays |= decals
apply_decals()
- // VOREStation Edit End
if(is_plating() && !(isnull(broken) && isnull(burnt))) //temp, todo
icon = 'icons/turf/flooring/plating.dmi'
diff --git a/code/game/turfs/simulated/outdoors/snow.dm b/code/game/turfs/simulated/outdoors/snow.dm
index 16678d7c988..22f9085a8c1 100644
--- a/code/game/turfs/simulated/outdoors/snow.dm
+++ b/code/game/turfs/simulated/outdoors/snow.dm
@@ -25,7 +25,7 @@
/turf/simulated/floor/outdoors/snow/attackby(var/obj/item/W, var/mob/user)
if(istype(W, /obj/item/weapon/shovel))
to_chat(user, "You begin to remove \the [src] with your [W].")
- if(do_after(user, 4 SECONDS))
+ if(do_after(user, 4 SECONDS * W.toolspeed))
to_chat(user, "\The [src] has been dug up, and now lies in a pile nearby.")
new /obj/item/stack/material/snow(src)
demote()
diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm
index 6b793d60612..ce4451ff121 100644
--- a/code/game/turfs/simulated/wall_types.dm
+++ b/code/game/turfs/simulated/wall_types.dm
@@ -53,6 +53,12 @@
/turf/simulated/wall/sifwood/New(var/newloc)
..(newloc,"alien wood")
+/turf/simulated/wall/log/New(var/newloc)
+ ..(newloc,"log")
+
+/turf/simulated/wall/log_sif/New(var/newloc)
+ ..(newloc,"alien log")
+
// Shuttle Walls
/turf/simulated/shuttle/wall
name = "autojoin wall"
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index bf2c579afbe..24f56696188 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -385,26 +385,30 @@
for(var/areatype in areas_without_camera)
world << "* [areatype]"
-/datum/admins/proc/cmd_admin_dress()
+/datum/admins/proc/cmd_admin_dress(input in getmobs())
set category = "Fun"
set name = "Select equipment"
if(!check_rights(R_FUN))
return
- var/mob/living/carbon/human/H = input("Select mob.", "Select equipment.") as null|anything in human_mob_list
- if(!H)
+ var/target = getmobs()[input]
+ if(!target)
return
+ if(!ishuman(target))
+ return
+
+ var/mob/living/carbon/human/H = target
+
var/decl/hierarchy/outfit/outfit = input("Select outfit.", "Select equipment.") as null|anything in outfits()
if(!outfit)
return
feedback_add_details("admin_verb","SEQ")
- dressup_human(H, outfit, TRUE)
+ dressup_human(H, outfit, 1)
-/proc/dressup_human(var/mob/living/carbon/human/H, var/decl/hierarchy/outfit/outfit, var/undress = TRUE)
- world << "dressup_human"
+/proc/dressup_human(var/mob/living/carbon/human/H, var/decl/hierarchy/outfit/outfit, var/undress = 1)
if(!H || !outfit)
return
if(undress)
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index b416cb661a4..b78b473e651 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -83,12 +83,12 @@
if (!fqs)
output += " ERROR
"
continue
- for (var/filter in fqs.devices)
- var/list/f = fqs.devices[filter]
+ for (var/radio_filter in fqs.devices)
+ var/list/f = fqs.devices[radio_filter]
if (!f)
- output += " [filter]: ERROR
"
+ output += " [radio_filter]: ERROR
"
continue
- output += " [filter]: [f.len]
"
+ output += " [radio_filter]: [f.len]
"
for (var/device in f)
if (isobj(device))
output += " [device] ([device:x],[device:y],[device:z] in area [get_area(device:loc)])
"
@@ -177,11 +177,11 @@
set desc = "This searches all the active jobban entries for the current round and outputs the results to standard output."
set category = "Debug"
- var/filter = input("Contains what?","Filter") as text|null
- if(!filter)
+ var/job_filter = input("Contains what?","Job Filter") as text|null
+ if(!job_filter)
return
usr << "Jobbans active in this round."
for(var/t in jobban_keylist)
- if(findtext(t, filter))
+ if(findtext(t, job_filter))
usr << "[t]"
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index 9b3bdde66ca..c6500143f00 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -29,6 +29,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["organ_data"] >> pref.organ_data
S["rlimb_data"] >> pref.rlimb_data
S["body_markings"] >> pref.body_markings
+ S["synth_color"] >> pref.synth_color
+ S["synth_red"] >> pref.r_synth
+ S["synth_green"] >> pref.g_synth
+ S["synth_blue"] >> pref.b_synth
pref.preview_icon = null
/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S)
@@ -53,6 +57,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["organ_data"] << pref.organ_data
S["rlimb_data"] << pref.rlimb_data
S["body_markings"] << pref.body_markings
+ S["synth_color"] << pref.synth_color
+ S["synth_red"] << pref.r_synth
+ S["synth_green"] << pref.g_synth
+ S["synth_blue"] << pref.b_synth
/datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S)
if(!pref.species || !(pref.species in playable_species))
@@ -101,6 +109,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
character.h_style = pref.h_style
character.f_style = pref.f_style
character.b_type = pref.b_type
+ character.synth_color = pref.synth_color
+ character.r_synth = pref.r_synth
+ character.g_synth = pref.g_synth
+ character.b_synth = pref.b_synth
// Destroy/cyborgize organs and limbs.
for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
@@ -284,6 +296,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += ""
. += "
"
+ . += "
"
+ . += "Allow Synth color: [pref.synth_color ? "Yes" : "No"]
"
+ if(pref.synth_color)
+ . += "Change Color "
+
. = jointext(.,null)
/datum/category_item/player_setup_item/general/body/proc/has_flag(var/datum/species/mob_species, var/flag)
@@ -665,6 +682,18 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.equip_preview_mob ^= text2num(href_list["toggle_preview_value"])
return TOPIC_REFRESH_UPDATE_PREVIEW
+ else if(href_list["synth_color"])
+ pref.synth_color = !pref.synth_color
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
+ else if(href_list["synth2_color"])
+ var/new_color = input(user, "Choose your character's synth colour: ", "Character Preference", rgb(pref.r_synth, pref.g_synth, pref.b_synth)) as color|null
+ if(new_color && CanUseTopic(user))
+ pref.r_synth = hex2num(copytext(new_color, 2, 4))
+ pref.g_synth = hex2num(copytext(new_color, 4, 6))
+ pref.b_synth = hex2num(copytext(new_color, 6, 8))
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
return ..()
/datum/category_item/player_setup_item/general/body/proc/reset_limbs()
diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm
index 44a814ac679..ecd61cae71b 100644
--- a/code/modules/client/preference_setup/loadout/loadout.dm
+++ b/code/modules/client/preference_setup/loadout/loadout.dm
@@ -14,7 +14,8 @@ var/list/gear_datums = list()
//create a list of gear datums to sort
for(var/geartype in typesof(/datum/gear)-/datum/gear)
var/datum/gear/G = geartype
-
+ if(initial(G.type_category) == geartype)
+ continue
var/use_name = initial(G.display_name)
var/use_category = initial(G.sort_category)
@@ -205,6 +206,7 @@ var/list/gear_datums = list()
var/sort_category = "General"
var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned.
var/exploitable = 0 //Does it go on the exploitable information list?
+ var/type_category = null
/datum/gear/New()
..()
diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
index bbae19a02a7..6bc944552c6 100644
--- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
@@ -1,42 +1,28 @@
/datum/gear/accessory
- display_name = "armband, red"
- path = /obj/item/clothing/accessory/armband
+ display_name = "accessory"
slot = slot_tie
sort_category = "Accessories"
+ type_category = /datum/gear/accessory
+ path = /obj/item/clothing/accessory
+ cost = 1
-/datum/gear/accessory/cargo
- display_name = "armband, cargo"
- path = /obj/item/clothing/accessory/armband/cargo
+/datum/gear/accessory/armband
+ display_name = "armband selection"
+ path = /obj/item/clothing/accessory/armband
-/datum/gear/accessory/emt
- display_name = "armband, EMT"
- path = /obj/item/clothing/accessory/armband/medblue
+/datum/gear/accessory/armband/New()
+ ..()
+ var/list/armbands = list()
+ for(var/armband in (typesof(/obj/item/clothing/accessory/armband) - typesof(/obj/item/clothing/accessory/armband/med/color)))
+ var/obj/item/clothing/accessory/armband_type = armband
+ armbands[initial(armband_type.name)] = armband_type
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(armbands))
-/datum/gear/accessory/engineering
- display_name = "armband, engineering"
- path = /obj/item/clothing/accessory/armband/engine
-
-/datum/gear/accessory/hydroponics
- display_name = "armband, hydroponics"
- path = /obj/item/clothing/accessory/armband/hydro
-
-/datum/gear/accessory/medical
- display_name = "armband, medical"
- path = /obj/item/clothing/accessory/armband/med
-
-/datum/gear/accessory/medical/cross
- display_name = "armband, medic"
- path = /obj/item/clothing/accessory/armband/med/cross
-
-/datum/gear/accessory/science
- display_name = "armband, science"
- path = /obj/item/clothing/accessory/armband/science
-
-/datum/gear/accessory/colored
+/datum/gear/accessory/armband/colored
display_name = "armband"
path = /obj/item/clothing/accessory/armband/med/color
-/datum/gear/accessory/colored/New()
+/datum/gear/accessory/armband/colored/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
@@ -74,215 +60,109 @@
..()
gear_tweaks = list(gear_tweak_free_color_choice)
-
/datum/gear/accessory/wcoat
- display_name = "waistcoat"
+ display_name = "waistcoat selection"
path = /obj/item/clothing/accessory/wcoat
cost = 1
-/datum/gear/accessory/wcoat/red
- display_name = "waistcoat, red"
- path = /obj/item/clothing/accessory/wcoat/red
-
-/datum/gear/accessory/wcoat/grey
- display_name = "waistcoat, grey"
- path = /obj/item/clothing/accessory/wcoat/grey
-
-/datum/gear/accessory/wcoat/brown
- display_name = "waistcoat, brown"
- path = /obj/item/clothing/accessory/wcoat/brown
-
-/datum/gear/accessory/swvest
- display_name = "sweatervest, black"
- path = /obj/item/clothing/accessory/wcoat/swvest
- cost = 1
-
-/datum/gear/accessory/swvest/blue
- display_name = "sweatervest, blue"
- path = /obj/item/clothing/accessory/wcoat/swvest/blue
-
-/datum/gear/accessory/swvest/red
- display_name = "sweatervest, red"
- path = /obj/item/clothing/accessory/wcoat/swvest/red
+/datum/gear/accessory/wcoat/New()
+ ..()
+ var/list/wcoats = list()
+ for(var/wcoat in typesof(/obj/item/clothing/accessory/wcoat))
+ var/obj/item/clothing/accessory/wcoat_type = wcoat
+ wcoats[initial(wcoat_type.name)] = wcoat_type
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(wcoats))
/datum/gear/accessory/holster
- display_name = "holster, armpit"
- path = /obj/item/clothing/accessory/holster/armpit
+ display_name = "holster selection (Security, CD, HoP)"
+ path = /obj/item/clothing/accessory/holster
allowed_roles = list("Colony Director", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective")
-/datum/gear/accessory/holster/hip
- display_name = "holster, hip"
- path = /obj/item/clothing/accessory/holster/hip
-
-/datum/gear/accessory/holster/leg
- display_name = "holster, leg"
- path = /obj/item/clothing/accessory/holster/leg
-
-/datum/gear/accessory/holster/waist
- display_name = "holster, waist"
- path = /obj/item/clothing/accessory/holster/waist
+/datum/gear/accessory/holster/New()
+ ..()
+ var/list/holsters = list()
+ for(var/holster in typesof(/obj/item/clothing/accessory/holster))
+ var/obj/item/clothing/accessory/holster_type = holster
+ holsters[initial(holster_type.name)] = holster_type
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(holsters))
/datum/gear/accessory/tie
- display_name = "tie, black"
- path = /obj/item/clothing/accessory/black
+ display_name = "tie selection"
+ path = /obj/item/clothing/accessory/tie
+ cost = 1
-/datum/gear/accessory/tie/blue
- display_name = "tie, blue"
- path = /obj/item/clothing/accessory/blue
-
-/datum/gear/accessory/tie/blue_clip
- display_name = "tie, blue with clip"
- path = /obj/item/clothing/accessory/blue_clip
-
-/datum/gear/accessory/tie/blue_long
- display_name = "tie, blue long"
- path = /obj/item/clothing/accessory/blue_long
-
-/datum/gear/accessory/tie/red
- display_name = "tie, red"
- path = /obj/item/clothing/accessory/red
-
-/datum/gear/accessory/tie/red_clip
- display_name = "tie, red with clip"
- path = /obj/item/clothing/accessory/red_clip
-
-/datum/gear/accessory/tie/red_long
- display_name = "tie, red long"
- path = /obj/item/clothing/accessory/red_long
-
-/datum/gear/accessory/tie/yellow
- display_name = "tie, yellow"
- path = /obj/item/clothing/accessory/yellow
-
-/datum/gear/accessory/tie/navy
- display_name = "tie, navy blue"
- path = /obj/item/clothing/accessory/navy
-
-/datum/gear/accessory/tie/white
- display_name = "tie, white"
- path = /obj/item/clothing/accessory/white
-
-/datum/gear/accessory/tie/horrible
- display_name = "tie, socially disgraceful"
- path = /obj/item/clothing/accessory/horrible
+/datum/gear/accessory/tie/New()
+ ..()
+ var/list/ties = list()
+ for(var/tie in typesof(/obj/item/clothing/accessory/tie))
+ var/obj/item/clothing/accessory/tie_type = tie
+ ties[initial(tie_type.name)] = tie_type
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(ties))
/datum/gear/accessory/scarf
- display_name = "scarf"
+ display_name = "scarf selection"
path = /obj/item/clothing/accessory/scarf
+ cost = 1
-/datum/gear/accessory/scarf/red
- display_name = "scarf, red"
- path = /obj/item/clothing/accessory/scarf/red
+/datum/gear/accessory/scarf/New()
+ ..()
+ var/list/scarfs = list()
+ for(var/scarf in typesof(/obj/item/clothing/accessory/scarf))
+ var/obj/item/clothing/accessory/scarf_type = scarf
+ scarfs[initial(scarf_type.name)] = scarf_type
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(scarfs))
-/datum/gear/accessory/scarf/green
- display_name = "scarf, green"
- path = /obj/item/clothing/accessory/scarf/green
+/datum/gear/accessory/jacket
+ display_name = "suit jacket selection"
+ path = /obj/item/clothing/accessory/jacket
+ cost = 1
-/datum/gear/accessory/scarf/darkblue
- display_name = "scarf, dark blue"
- path = /obj/item/clothing/accessory/scarf/darkblue
-
-/datum/gear/accessory/scarf/purple
- display_name = "scarf, purple"
- path = /obj/item/clothing/accessory/scarf/purple
-
-/datum/gear/accessory/scarf/yellow
- display_name = "scarf, yellow"
- path = /obj/item/clothing/accessory/scarf/yellow
-
-/datum/gear/accessory/scarf/orange
- display_name = "scarf, orange"
- path = /obj/item/clothing/accessory/scarf/orange
-
-/datum/gear/accessory/scarf/lightblue
- display_name = "scarf, light blue"
- path = /obj/item/clothing/accessory/scarf/lightblue
-
-/datum/gear/accessory/scarf/white
- display_name = "scarf, white"
- path = /obj/item/clothing/accessory/scarf/white
-
-/datum/gear/accessory/scarf/black
- display_name = "scarf, black"
- path = /obj/item/clothing/accessory/scarf/black
-
-/datum/gear/accessory/scarf/zebra
- display_name = "scarf, zebra"
- path = /obj/item/clothing/accessory/scarf/zebra
-
-/datum/gear/accessory/scarf/christmas
- display_name = "scarf, christmas"
- path = /obj/item/clothing/accessory/scarf/christmas
-
-/datum/gear/accessory/scarf/stripedred
- display_name = "scarf, striped red"
- path = /obj/item/clothing/accessory/stripedredscarf
-
-/datum/gear/accessory/scarf/stripedgreen
- display_name = "scarf, striped green"
- path = /obj/item/clothing/accessory/stripedgreenscarf
-
-/datum/gear/accessory/scarf/stripedblue
- display_name = "scarf, striped blue"
- path = /obj/item/clothing/accessory/stripedbluescarf
-
-/datum/gear/accessory/suitjacket
- display_name = "suit jacket, tan"
- path = /obj/item/clothing/accessory/tan_jacket
-
-/datum/gear/accessory/suitjacket/charcoal
- display_name = "suit jacket, charcoal"
- path = /obj/item/clothing/accessory/charcoal_jacket
-
-/datum/gear/accessory/suitjacket/navy
- display_name = "suit jacket, navy blue"
- path = /obj/item/clothing/accessory/navy_jacket
-
-/datum/gear/accessory/suitjacket/burgundy
- display_name = "suit jacket, burgundy"
- path = /obj/item/clothing/accessory/burgundy_jacket
-
-/datum/gear/accessory/suitjacket/checkered
- display_name = "suit jacket, checkered"
- path = /obj/item/clothing/accessory/checkered_jacket
+/datum/gear/accessory/jacket/New()
+ ..()
+ var/list/jackets = list()
+ for(var/jacket in typesof(/obj/item/clothing/accessory/jacket))
+ var/obj/item/clothing/accessory/jacket_type = jacket
+ jackets[initial(jacket_type.name)] = jacket_type
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(jackets))
/datum/gear/accessory/suitvest
display_name = "suit vest"
path = /obj/item/clothing/accessory/vest
/datum/gear/accessory/brown_vest
- display_name = "webbing, engineering"
+ display_name = "webbing, brown"
path = /obj/item/clothing/accessory/storage/brown_vest
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/black_vest
- display_name = "webbing, security"
+ display_name = "webbing, black"
path = /obj/item/clothing/accessory/storage/black_vest
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/white_vest
- display_name = "webbing, medical"
+ display_name = "webbing, white"
path = /obj/item/clothing/accessory/storage/white_vest
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/brown_drop_pouches
- display_name = "drop pouches, engineering"
+ display_name = "drop pouches, brown"
path = /obj/item/clothing/accessory/storage/brown_drop_pouches
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/black_drop_pouches
- display_name = "drop pouches, security"
+ display_name = "drop pouches, black"
path = /obj/item/clothing/accessory/storage/black_drop_pouches
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/white_drop_pouches
- display_name = "drop pouches, medical"
+ display_name = "drop pouches, white"
path = /obj/item/clothing/accessory/storage/white_drop_pouches
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/fannypack
display_name = "fannypack selection"
cost = 2
+ path = /obj/item/weapon/storage/belt/fannypack
/datum/gear/accessory/fannypack/New()
..()
diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm
index 57345631873..1a894704cad 100644
--- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm
@@ -68,9 +68,9 @@
path = /obj/item/clothing/glasses/sunglasses/medhud/aviator/prescription
/datum/gear/eyes/meson
- display_name = "Optical Meson Scanners (Engineering)"
+ display_name = "Optical Meson Scanners (Engineering, Science)"
path = /obj/item/clothing/glasses/meson
- allowed_roles = list("Station Engineer","Chief Engineer","Atmospheric Technician")
+ allowed_roles = list("Station Engineer","Chief Engineer","Atmospheric Technician", "Scientist", "Research Director")
/datum/gear/eyes/meson/prescription
display_name = "Optical Meson Scanners, prescription (Engineering)"
@@ -115,4 +115,3 @@
/datum/gear/eyes/sun/prescriptionsun
display_name = "sunglasses, presciption (Security/Command)"
path = /obj/item/clothing/glasses/sunglasses/prescription
- cost = 2
diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves.dm b/code/modules/client/preference_setup/loadout/loadout_gloves.dm
index 2656e221dbe..18eb05f8829 100644
--- a/code/modules/client/preference_setup/loadout/loadout_gloves.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_gloves.dm
@@ -68,10 +68,34 @@
cost = 3
/datum/gear/gloves/forensic
- display_name = "gloves, forensic"
+ display_name = "gloves, forensic (Detective)"
path = /obj/item/clothing/gloves/forensic
allowed_roles = list("Detective")
/datum/gear/gloves/fingerless
display_name = "fingerless gloves"
- path = /obj/item/clothing/gloves/fingerless
\ No newline at end of file
+ path = /obj/item/clothing/gloves/fingerless
+
+/datum/gear/gloves/ring
+ display_name = "ring selection"
+ description = "Choose from a number of rings."
+ path = /obj/item/clothing/gloves/ring
+ cost = 1
+
+/datum/gear/gloves/ring/New()
+ ..()
+ var/ringtype = list()
+ ringtype["CTI ring"] = /obj/item/clothing/gloves/ring/cti
+ ringtype["Mariner University ring"] = /obj/item/clothing/gloves/ring/mariner
+ ringtype["engagement ring"] = /obj/item/clothing/gloves/ring/engagement
+ ringtype["signet ring"] = /obj/item/clothing/gloves/ring/seal/signet
+ ringtype["masonic ring"] = /obj/item/clothing/gloves/ring/seal/mason
+ ringtype["ring, steel"] = /obj/item/clothing/gloves/ring/material/steel
+ ringtype["ring, iron"] = /obj/item/clothing/gloves/ring/material/iron
+ ringtype["ring, silver"] = /obj/item/clothing/gloves/ring/material/silver
+ ringtype["ring, gold"] = /obj/item/clothing/gloves/ring/material/gold
+ ringtype["ring, platinum"] = /obj/item/clothing/gloves/ring/material/platinum
+ ringtype["ring, glass"] = /obj/item/clothing/gloves/ring/material/glass
+ ringtype["ring, wood"] = /obj/item/clothing/gloves/ring/material/wood
+ ringtype["ring, plastic"] = /obj/item/clothing/gloves/ring/material/plastic
+ gear_tweaks += new/datum/gear_tweak/path(ringtype)
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm
index 16beab3c067..f7737c9dde0 100644
--- a/code/modules/client/preference_setup/loadout/loadout_head.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_head.dm
@@ -136,7 +136,6 @@
/datum/gear/head/cowboy
display_name = "cowboy, rodeo"
path = /obj/item/clothing/head/cowboy_hat
- cost = 3
/datum/gear/head/cowboy/black
display_name = "cowboy, black"
@@ -268,6 +267,11 @@
..()
gear_tweaks = list(gear_tweak_free_color_choice)
+
+/datum/gear/head/kitty
+ display_name = "kitty ears"
+ path = /obj/item/clothing/head/kitty
+
/datum/gear/head/beanie
display_name = "beanie"
path = /obj/item/clothing/head/beanie
diff --git a/code/modules/client/preference_setup/loadout/loadout_shoes.dm b/code/modules/client/preference_setup/loadout/loadout_shoes.dm
index 82540018fbb..ba2d995b279 100644
--- a/code/modules/client/preference_setup/loadout/loadout_shoes.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_shoes.dm
@@ -195,6 +195,10 @@
..()
gear_tweaks = list(gear_tweak_free_color_choice)
+/datum/gear/shoes/slippers
+ display_name = "bunny slippers"
+ path = /obj/item/clothing/shoes/slippers
+
/datum/gear/shoes/boots/winter
display_name = "winter boots"
path = /obj/item/clothing/shoes/boots/winter
@@ -227,7 +231,7 @@
/datum/gear/shoes/boots/winter/medical
display_name = "medical winter boots"
path = /obj/item/clothing/shoes/boots/winter/medical
- allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
/datum/gear/shoes/boots/winter/mining
display_name = "mining winter boots"
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm
index dbacf45e34d..82631635af3 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm
@@ -149,7 +149,7 @@
/datum/gear/suit/labcoat/emt
display_name = "labcoat, EMT (Medical)"
path = /obj/item/clothing/suit/storage/toggle/labcoat/emt
- allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
/datum/gear/suit/roles/surgical_apron
display_name = "surgical apron"
@@ -182,7 +182,7 @@
/datum/gear/suit/roles/poncho/medical
display_name = "poncho, medical"
path = /obj/item/clothing/accessory/poncho/roles/medical
- allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
/datum/gear/suit/roles/poncho/engineering
display_name = "poncho, engineering"
@@ -199,6 +199,41 @@
path = /obj/item/clothing/accessory/poncho/roles/cargo
allowed_roles = list("Quartermaster","Cargo Technician")
+/datum/gear/suit/roles/poncho/cloak/hos
+ display_name = "cloak, head of security"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/hos
+ allowed_roles = list("Head of Security")
+
+/datum/gear/suit/roles/poncho/cloak/cmo
+ display_name = "cloak, chief medical officer"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/cmo
+ allowed_roles = list("Chief Medical Officer")
+
+/datum/gear/suit/roles/poncho/cloak/ce
+ display_name = "cloak, chief engineer"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/ce
+ allowed_roles = list("Chief Engineer")
+
+/datum/gear/suit/roles/poncho/cloak/rd
+ display_name = "cloak, research director"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/rd
+ allowed_roles = list("Research Director")
+
+/datum/gear/suit/roles/poncho/cloak/qm
+ display_name = "cloak, quartermaster"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/qm
+ allowed_roles = list("Quartermaster")
+
+/datum/gear/suit/roles/poncho/cloak/captain
+ display_name = "cloak, colony director"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/captain
+ allowed_roles = list("Colony Director")
+
+/datum/gear/suit/roles/poncho/cloak/hop
+ display_name = "cloak, head of personnel"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/hop
+ allowed_roles = list("Head of Personnel")
+
/datum/gear/suit/unathi_robe
display_name = "roughspun robe"
path = /obj/item/clothing/suit/unathi/robe
@@ -257,7 +292,7 @@
/datum/gear/suit/wintercoat/medical
display_name = "winter coat, medical"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical
- allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
/datum/gear/suit/wintercoat/science
display_name = "winter coat, science"
@@ -410,7 +445,7 @@
/datum/gear/suit/snowsuit/medical
display_name = "snowsuit, medical"
path = /obj/item/clothing/suit/storage/snowsuit/medical
- allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
/datum/gear/suit/snowsuit/science
display_name = "snowsuit, science"
diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm
index 9edc5e81a1d..836146d11ff 100644
--- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm
@@ -243,7 +243,6 @@
/datum/gear/uniform/scrub
display_name = "scrubs selection"
path = /obj/item/clothing/under/rank/medical/scrubs
- allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Roboticist")
/datum/gear/uniform/scrub/New()
..()
@@ -455,3 +454,7 @@
/datum/gear/uniform/red_swept_dress
display_name = "red swept dress"
path = /obj/item/clothing/under/dress/red_swept_dress
+
+/datum/gear/uniform/bathrobe
+ display_name = "bathrobe"
+ path = /obj/item/clothing/under/bathrobe
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/traits/trait_defines.dm b/code/modules/client/preference_setup/traits/trait_defines.dm
index a1a375a9aa4..0431ac611b9 100644
--- a/code/modules/client/preference_setup/traits/trait_defines.dm
+++ b/code/modules/client/preference_setup/traits/trait_defines.dm
@@ -30,14 +30,14 @@
name = "Flimsy"
desc = "You're more fragile than most, and have less of an ability to endure harm."
modifier_type = /datum/modifier/trait/flimsy
- muturally_exclusive = list(/datum/trait/modifier/physical/frail)
+ mutually_exclusive = list(/datum/trait/modifier/physical/frail)
/datum/trait/modifier/physical/frail
name = "Frail"
desc = "Your body is very fragile, and has even less of an ability to endure harm."
modifier_type = /datum/modifier/trait/frail
- muturally_exclusive = list(/datum/trait/modifier/physical/flimsy)
+ mutually_exclusive = list(/datum/trait/modifier/physical/flimsy)
/datum/trait/modifier/physical/haemophilia
@@ -51,10 +51,19 @@
// If a species lacking blood is added, it is suggested to add a check for them here.
return ..()
+
/datum/trait/modifier/physical/weak
name = "Weak"
desc = "A lack of physical strength causes a diminshed capability in close quarters combat."
modifier_type = /datum/modifier/trait/weak
+ mutually_exclusive = list(/datum/trait/modifier/physical/wimpy)
+
+
+/datum/trait/modifier/physical/wimpy
+ name = "Wimpy"
+ desc = "An extreme lack of physical strength causes a greatly diminished capability in close quarters combat."
+ modifier_type = /datum/modifier/trait/wimpy
+ mutually_exclusive = list(/datum/trait/modifier/physical/weak)
/datum/trait/modifier/physical/inaccurate
@@ -68,6 +77,7 @@
/datum/trait/modifier/physical/high_metabolism
name = "High Metabolism"
modifier_type = /datum/modifier/trait/high_metabolism
+ mutually_exclusive = list(/datum/trait/modifier/physical/low_metabolism)
/datum/trait/modifier/physical/high_metabolism/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)
if(setup.is_FBP())
@@ -78,6 +88,7 @@
/datum/trait/modifier/physical/low_metabolism
name = "Low Metabolism"
modifier_type = /datum/modifier/trait/low_metabolism
+ mutually_exclusive = list(/datum/trait/modifier/physical/high_metabolism)
/datum/trait/modifier/physical/low_metabolism/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)
if(setup.is_FBP())
@@ -165,7 +176,7 @@
name = "Xenophobic"
desc = "The mind of the Alien is unknowable, and as such, their intentions cannot be known. You always watch the xenos closely, as they most certainly are watching you \
closely, waiting to strike."
- muturally_exclusive = list(
+ mutually_exclusive = list(
/datum/trait/modifier/mental/humanphobe,
/datum/trait/modifier/mental/skrellphobe,
/datum/trait/modifier/mental/tajaraphobe,
@@ -177,36 +188,36 @@
/datum/trait/modifier/mental/humanphobe
name = "Human-phobic"
desc = "Boilerplate racism for monkeys goes here."
- muturally_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
/datum/trait/modifier/mental/skrellphobe
name = "Skrell-phobic"
desc = "Boilerplate racism for squid goes here."
- muturally_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
/datum/trait/modifier/mental/tajaraphobe
name = "Tajara-phobic"
desc = "Boilerplate racism for cats goes here."
- muturally_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
/datum/trait/modifier/mental/unathiphobe
name = "Unathi-phobic"
desc = "Boilerplate racism for lizards goes here."
- muturally_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
// Not sure why anyone would hate/fear these guys but for the sake of completeness here we are.
/datum/trait/modifier/mental/dionaphobe
name = "Diona-phobic"
desc = "Boilerplate racism for trees goes here."
- muturally_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
/datum/trait/modifier/mental/teshariphobe
name = "Teshari-phobic"
desc = "Boilerplate racism for birds goes here."
- muturally_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
/datum/trait/modifier/mental/prometheanphobe
name = "Promethean-phobic"
desc = "Boilerplate racism for jellos goes here."
- muturally_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
*/
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/traits/traits.dm b/code/modules/client/preference_setup/traits/traits.dm
index da80a98832f..2913968b1e3 100644
--- a/code/modules/client/preference_setup/traits/traits.dm
+++ b/code/modules/client/preference_setup/traits/traits.dm
@@ -79,7 +79,7 @@ var/list/trait_categories = list() // The categories available for the trait men
if(invalidity)
invalid += "[invalidity] "
if(conflicts)
- invalid += "This trait is muturally exclusive with [conflicts]."
+ invalid += "This trait is mutually exclusive with [conflicts]."
. += "[T.desc]\
[invalid ? " Cannot take trait. Reason: [invalid]":""] | "
@@ -114,7 +114,7 @@ var/list/trait_categories = list() // The categories available for the trait men
var/conflicts = T.test_for_trait_conflict(pref.traits)
if(conflicts)
pref.traits -= trait_name
- to_chat(preference_mob, "The [trait_name] trait is muturally exclusive with [conflicts].")
+ to_chat(preference_mob, "The [trait_name] trait is mutually exclusive with [conflicts].")
/datum/category_item/player_setup_item/traits/OnTopic(href, href_list, user)
if(href_list["toggle_trait"])
@@ -129,7 +129,7 @@ var/list/trait_categories = list() // The categories available for the trait men
var/conflicts = T.test_for_trait_conflict(pref.traits)
if(conflicts)
- to_chat(user, "The [T.name] trait is muturally exclusive with [conflicts].")
+ to_chat(user, "The [T.name] trait is mutually exclusive with [conflicts].")
return TOPIC_NOACTION
pref.traits += T.name
@@ -143,7 +143,7 @@ var/list/trait_categories = list() // The categories available for the trait men
/datum/trait
var/name = null // Name to show on UI
var/desc = null // Description of what it does, also shown on UI.
- var/list/muturally_exclusive = list() // List of trait types which cannot be taken alongside this trait.
+ var/list/mutually_exclusive = list() // List of trait types which cannot be taken alongside this trait.
var/category = null // What section to place this trait inside.
// Applies effects to the newly spawned mob.
@@ -156,16 +156,16 @@ var/list/trait_categories = list() // The categories available for the trait men
/datum/trait/proc/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)
return null
-// Checks muturally_exclusive. current_traits needs to be a list of strings.
+// Checks mutually_exclusive. current_traits needs to be a list of strings.
// Returns null if everything is well, similar to the above proc. Otherwise returns an english_list() of conflicting traits.
/datum/trait/proc/test_for_trait_conflict(var/list/current_traits)
var/list/conflicts = list()
var/result
- if(muturally_exclusive.len)
+ if(mutually_exclusive.len)
for(var/trait_name in current_traits)
var/datum/trait/T = trait_datums[trait_name]
- if(T.type in muturally_exclusive)
+ if(T.type in mutually_exclusive)
conflicts.Add(T.name)
if(conflicts.len)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index d364332018c..4709fb3e818 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -51,6 +51,10 @@ datum/preferences
var/list/language_prefixes = list() //Kanguage prefix keys
var/list/gear //Custom/fluff item loadout.
var/list/traits //Traits which modifier characters for better or worse (mostly worse).
+ var/synth_color = 0 //Lets normally uncolorable synth parts be colorable.
+ var/r_synth //Used with synth_color to color synth parts that normaly can't be colored.
+ var/g_synth //Same as above
+ var/b_synth //Same as above
//Some faction information.
var/home_system = "Unset" //System of birth.
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 80009147ce4..e8ec514e566 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -170,6 +170,7 @@
icon_state = O.icon_state
set_dir(O.dir)
+////////////////////////////////////////////////////////////////////////////////////////
//Gloves
/obj/item/clothing/gloves
name = "gloves"
@@ -183,8 +184,11 @@
siemens_coefficient = 0.75
var/wired = 0
var/obj/item/weapon/cell/cell = 0
- var/overgloves = 0
var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through
+ var/obj/item/clothing/gloves/ring = null //Covered ring
+ var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping
+ var/glove_level = 2 //What "layer" the glove is on
+ var/overgloves = 0 //Used by gauntlets and arm_guards
body_parts_covered = HANDS
slot_flags = SLOT_GLOVES
attack_verb = list("challenged")
@@ -201,6 +205,8 @@
/obj/item/clothing/gloves/emp_act(severity)
if(cell)
cell.emp_act(severity)
+ if(ring)
+ ring.emp_act(severity)
..()
// Called just before an attack_hand(), in mob/UnarmedAttack()
@@ -225,6 +231,59 @@
species_restricted -= "Tajara"
return
*/
+
+/obj/item/clothing/gloves/mob_can_equip(mob/user, slot)
+ var/mob/living/carbon/human/H = user
+
+ if(slot && slot == slot_gloves)
+ if(istype(H.gloves, /obj/item/clothing/gloves/ring))
+ ring = H.gloves
+ if(ring.glove_level >= src.glove_level)
+ to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.")
+ ring = null
+ return 0
+ else
+ H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves.
+ ring.forceMove(src)
+ to_chat(user, "You slip \the [src] on over \the [src.ring].")
+ else
+ ring = null
+
+ if(!..())
+ if(ring) //Put the ring back on if the check fails.
+ if(H.equip_to_slot_if_possible(ring, slot_gloves))
+ src.ring = null
+ return 0
+
+ wearer = H //TODO clean this when magboots are cleaned
+ return 1
+
+/obj/item/clothing/gloves/dropped()
+ ..()
+
+ if(!wearer)
+ return
+
+ var/mob/living/carbon/human/H = wearer
+ if(ring && istype(H))
+ if(!H.equip_to_slot_if_possible(ring, slot_gloves))
+ ring.forceMove(get_turf(src))
+ src.ring = null
+ wearer = null
+
+/////////////////////////////////////////////////////////////////////
+//Rings
+
+/obj/item/clothing/gloves/ring
+ name = "ring"
+ w_class = ITEMSIZE_TINY
+ icon = 'icons/obj/clothing/rings.dmi'
+ gender = NEUTER
+ species_restricted = list("exclude", "Diona")
+ siemens_coefficient = 1
+ glove_level = 1
+ fingerprint_chance = 100
+
///////////////////////////////////////////////////////////////////////
//Head
/obj/item/clothing/head
diff --git a/code/modules/clothing/gloves/arm_guards.dm b/code/modules/clothing/gloves/arm_guards.dm
index ef7d0b28dc1..80a5cfd7353 100644
--- a/code/modules/clothing/gloves/arm_guards.dm
+++ b/code/modules/clothing/gloves/arm_guards.dm
@@ -5,11 +5,11 @@
overgloves = 1
w_class = ITEMSIZE_NORMAL
-/obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
+/obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot)
if(..()) //This will only run if no other problems occured when equiping.
if(H.wear_suit)
if(H.wear_suit.body_parts_covered & ARMS)
- H << "You can't wear \the [src] with \the [H.wear_suit], it's in the way."
+ to_chat(H, "You can't wear \the [src] with \the [H.wear_suit], it's in the way.")
return 0
return 1
diff --git a/code/modules/clothing/gloves/gauntlets.dm b/code/modules/clothing/gloves/gauntlets.dm
index 94956ec714f..bc65252d38f 100644
--- a/code/modules/clothing/gloves/gauntlets.dm
+++ b/code/modules/clothing/gloves/gauntlets.dm
@@ -9,16 +9,16 @@
/obj/item/clothing/gloves/gauntlets //Used to cover gloves, otherwise act as gloves.
name = "gauntlets"
desc = "These gloves go over regular gloves."
+ glove_level = 3
overgloves = 1
var/obj/item/clothing/gloves/gloves = null //Undergloves
- var/mob/living/carbon/human/wearer = null //For glove procs
/obj/item/clothing/gloves/gauntlets/mob_can_equip(mob/user)
var/mob/living/carbon/human/H = user
if(H.gloves)
gloves = H.gloves
if(gloves.overgloves)
- user << "You are unable to wear \the [src] as \the [H.gloves] are in the way."
+ to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.")
gloves = null
return 0
H.drop_from_inventory(gloves)
@@ -30,7 +30,7 @@
gloves = null
return 0
if(gloves)
- user << "You slip \the [src] on over \the [gloves]."
+ to_chat(user, "You slip \the [src] on over \the [gloves].")
wearer = H
return 1
@@ -39,6 +39,7 @@
if(gloves)
if(!H.equip_to_slot_if_possible(gloves, slot_gloves))
gloves.forceMove(get_turf(src))
+ if(ring)
+ gloves.ring = ring
src.gloves = null
- wearer = null
- ..()
\ No newline at end of file
+ wearer = null
\ No newline at end of file
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index cda6411b1c8..bb8f29e8925 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -31,12 +31,19 @@
//Chaplain
/obj/item/clothing/head/chaplain_hood
name = "chaplain's hood"
- desc = "It's hood that covers the head. It keeps you warm during the space winters."
+ desc = "It's a hood that covers the head. It keeps you warm during the space winters."
icon_state = "chaplain_hood"
item_state_slots = list(slot_r_hand_str = "beret_black", slot_l_hand_str = "beret_black")
flags_inv = BLOCKHAIR
body_parts_covered = HEAD
+//Chaplain but spookier
+/obj/item/clothing/head/chaplain_hood/whiteout
+ name = "white hood"
+ desc = "It's a generic white hood. Very spooky."
+ icon_state = "whiteout_hood"
+ item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white")
+
//Chaplain
/obj/item/clothing/head/nun_hood
name = "nun hood"
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 876340cb2a2..4facc9fef72 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -15,17 +15,17 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 75, rad = 0)
/obj/item/clothing/mask/gas/filter_air(datum/gas_mixture/air)
- var/datum/gas_mixture/filtered = new
+ var/datum/gas_mixture/gas_filtered = new
for(var/g in filtered_gases)
if(air.gas[g])
- filtered.gas[g] = air.gas[g] * gas_filter_strength
- air.gas[g] -= filtered.gas[g]
+ gas_filtered.gas[g] = air.gas[g] * gas_filter_strength
+ air.gas[g] -= gas_filtered.gas[g]
air.update_values()
- filtered.update_values()
+ gas_filtered.update_values()
- return filtered
+ return gas_filtered
/obj/item/clothing/mask/gas/half
name = "face mask"
diff --git a/code/modules/clothing/rings/material.dm b/code/modules/clothing/rings/material.dm
new file mode 100644
index 00000000000..355d6acf587
--- /dev/null
+++ b/code/modules/clothing/rings/material.dm
@@ -0,0 +1,47 @@
+/////////////////////////////////////////
+//Material Rings
+/obj/item/clothing/gloves/ring/material
+ icon = 'icons/obj/clothing/rings.dmi'
+ icon_state = "material"
+
+/obj/item/clothing/gloves/ring/material/New(var/newloc, var/new_material)
+ ..(newloc)
+ if(!new_material)
+ new_material = DEFAULT_WALL_MATERIAL
+ material = get_material_by_name(new_material)
+ if(!istype(material))
+ qdel(src)
+ return
+ name = "[material.display_name] ring"
+ desc = "A ring made from [material.display_name]."
+ color = material.icon_colour
+
+/obj/item/clothing/gloves/ring/material/get_material()
+ return material
+
+/obj/item/clothing/gloves/ring/material/wood/New(var/newloc)
+ ..(newloc, "wood")
+
+/obj/item/clothing/gloves/ring/material/plastic/New(var/newloc)
+ ..(newloc, "plastic")
+
+/obj/item/clothing/gloves/ring/material/iron/New(var/newloc)
+ ..(newloc, "iron")
+
+/obj/item/clothing/gloves/ring/material/steel/New(var/newloc)
+ ..(newloc, "steel")
+
+/obj/item/clothing/gloves/ring/material/silver/New(var/newloc)
+ ..(newloc, "silver")
+
+/obj/item/clothing/gloves/ring/material/gold/New(var/newloc)
+ ..(newloc, "gold")
+
+/obj/item/clothing/gloves/ring/material/platinum/New(var/newloc)
+ ..(newloc, "platinum")
+
+/obj/item/clothing/gloves/ring/material/phoron/New(var/newloc)
+ ..(newloc, "phoron")
+
+/obj/item/clothing/gloves/ring/material/glass/New(var/newloc)
+ ..(newloc, "glass")
diff --git a/code/modules/clothing/rings/rings.dm b/code/modules/clothing/rings/rings.dm
new file mode 100644
index 00000000000..0bd745ed917
--- /dev/null
+++ b/code/modules/clothing/rings/rings.dm
@@ -0,0 +1,85 @@
+/////////////////////////////////////////
+//Standard Rings
+/obj/item/clothing/gloves/ring/engagement
+ name = "engagement ring"
+ desc = "An engagement ring. It certainly looks expensive."
+ icon_state = "diamond"
+
+/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user)
+ user.visible_message("\The [user] gets down on one knee, presenting \the [src].","You get down on one knee, presenting \the [src].")
+
+/obj/item/clothing/gloves/ring/cti
+ name = "CTI ring"
+ desc = "A ring commemorating graduation from CTI."
+ icon_state = "cti-grad"
+
+/obj/item/clothing/gloves/ring/mariner
+ name = "Mariner University ring"
+ desc = "A ring commemorating graduation from Mariner University."
+ icon_state = "mariner-grad"
+
+
+/////////////////////////////////////////
+//Reagent Rings
+
+/obj/item/clothing/gloves/ring/reagent
+ flags = OPENCONTAINER
+ origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 4)
+
+/obj/item/clothing/gloves/ring/reagent/New()
+ ..()
+ create_reagents(15)
+
+/obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/carbon/human/H)
+ ..()
+ if(istype(H) && H.gloves==src)
+
+ if(reagents.total_volume)
+ to_chat(H, "You feel a prick as you slip on \the [src].")
+ if(H.reagents)
+ var/contained_reagents = reagents.get_reagents()
+ var/trans = reagents.trans_to_mob(H, 15, CHEM_BLOOD)
+ admin_inject_log(usr, H, src, contained_reagents, trans)
+ return
+
+//Sleepy Ring
+/obj/item/clothing/gloves/ring/reagent/sleepy
+ name = "silver ring"
+ desc = "A ring made from what appears to be silver."
+ icon_state = "material"
+ origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5)
+
+/obj/item/clothing/gloves/ring/reagent/sleepy/New()
+ ..()
+ reagents.add_reagent(/datum/reagent/chloralhydrate, 15) // Less than a sleepy-pen, but still enough to knock someone out
+
+/////////////////////////////////////////
+//Seals and Signet Rings
+/obj/item/clothing/gloves/ring/seal/secgen
+ name = "Secretary-General's official seal"
+ desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring."
+ icon_state = "seal-secgen"
+
+/obj/item/clothing/gloves/ring/seal/mason
+ name = "masonic ring"
+ desc = "The Square and Compasses feature prominently on this Masonic ring."
+ icon_state = "seal-masonic"
+
+/obj/item/clothing/gloves/ring/seal/signet
+ name = "signet ring"
+ desc = "A signet ring, for when you're too sophisticated to sign letters."
+ icon_state = "seal-signet"
+ var/nameset = 0
+
+/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user)
+ if(nameset)
+ to_chat(user, "The [src] has already been claimed!")
+ return
+
+ to_chat(user, "You claim the [src] as your own!")
+ change_name(user)
+ nameset = 1
+
+/obj/item/clothing/gloves/ring/seal/signet/proc/change_name(var/signet_name = "Unknown")
+ name = "[signet_name]'s signet ring"
+ desc = "A signet ring belonging to [signet_name], for when you're too sophisticated to sign letters."
\ No newline at end of file
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index 63e4d939653..4a53a244056 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -36,13 +36,14 @@
user.update_inv_shoes() //so our mob-overlays update
user.update_action_buttons()
-/obj/item/clothing/shoes/magboots/mob_can_equip(mob/user)
+/obj/item/clothing/shoes/magboots/mob_can_equip(mob/user, slot)
var/mob/living/carbon/human/H = user
if(H.shoes)
shoes = H.shoes
if(shoes.overshoes)
- user << "You are unable to wear \the [src] as \the [H.shoes] are in the way."
+ if(slot && slot == slot_shoes)
+ to_chat(user, "You are unable to wear \the [src] as \the [H.shoes] are in the way.")
shoes = null
return 0
H.drop_from_inventory(shoes) //Remove the old shoes so you can put on the magboots.
@@ -55,7 +56,8 @@
return 0
if (shoes)
- user << "You slip \the [src] on over \the [shoes]."
+ if(slot && slot == slot_shoes)
+ to_chat(user, "You slip \the [src] on over \the [shoes].")
set_slowdown()
wearer = H
return 1
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index c5de388c0f1..aa2e95c3491 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -39,6 +39,15 @@
hoodtype = /obj/item/clothing/head/chaplain_hood
allowed = list (/obj/item/weapon/storage/bible)
+//Chaplain but spookier
+/obj/item/clothing/suit/storage/hooded/chaplain_hoodie/whiteout
+ name = "white robe"
+ desc = "A long, flowing white robe. It looks comfortable, but not very warm."
+ icon_state = "whiteout_robe"
+ item_state_slots = list(slot_r_hand_str = "suit_white", slot_l_hand_str = "suit_white")
+ flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
+ hoodtype = /obj/item/clothing/head/chaplain_hood/whiteout
+
//Chaplain
/obj/item/clothing/suit/nun
name = "nun robe"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 3298541540c..602b8542879 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -594,6 +594,12 @@ obj/item/clothing/suit/storage/toggle/peacoat
icon_state = "smw_hoodie"
item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black")
+/obj/item/clothing/suit/storage/toggle/hoodie/nrti
+ name = "New Reykjavik Technical Institute hoodie"
+ desc = "A warm, gray sweatshirt. It bears the letters ‘NRT’ on the back, in reference to Sif's premiere technical institute."
+ icon_state = "nrti_hoodie"
+ item_state_slots = list(slot_r_hand_str = "suit_grey", slot_l_hand_str = "suit_grey")
+
/obj/item/clothing/suit/whitedress
name = "white dress"
desc = "A fancy dress."
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index ee6eba13d67..4392a264927 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -80,51 +80,51 @@
return //we aren't an object on the ground so don't call parent
..()
-/obj/item/clothing/accessory/blue
+/obj/item/clothing/accessory/tie
name = "blue tie"
icon_state = "bluetie"
-/obj/item/clothing/accessory/red
+/obj/item/clothing/accessory/tie/red
name = "red tie"
icon_state = "redtie"
-/obj/item/clothing/accessory/blue_clip
+/obj/item/clothing/accessory/tie/blue_clip
name = "blue tie with a clip"
icon_state = "bluecliptie"
-/obj/item/clothing/accessory/blue_long
+/obj/item/clothing/accessory/tie/blue_long
name = "blue long tie"
icon_state = "bluelongtie"
-/obj/item/clothing/accessory/red_clip
+/obj/item/clothing/accessory/tie/red_clip
name = "red tie with a clip"
icon_state = "redcliptie"
-/obj/item/clothing/accessory/red_long
+/obj/item/clothing/accessory/tie/red_long
name = "red long tie"
icon_state = "redlongtie"
-/obj/item/clothing/accessory/black
+/obj/item/clothing/accessory/tie/black
name = "black tie"
icon_state = "blacktie"
-/obj/item/clothing/accessory/darkgreen
+/obj/item/clothing/accessory/tie/darkgreen
name = "dark green tie"
icon_state = "dgreentie"
-/obj/item/clothing/accessory/yellow
+/obj/item/clothing/accessory/tie/yellow
name = "yellow tie"
icon_state = "yellowtie"
-/obj/item/clothing/accessory/navy
+/obj/item/clothing/accessory/tie/navy
name = "navy tie"
icon_state = "navytie"
-/obj/item/clothing/accessory/white
+/obj/item/clothing/accessory/tie/white
name = "white tie"
icon_state = "whitetie"
-/obj/item/clothing/accessory/horrible
+/obj/item/clothing/accessory/tie/horrible
name = "horrible tie"
desc = "A neosilk clip-on tie. This one is disgusting."
icon_state = "horribletie"
@@ -237,17 +237,14 @@
//Scarves
/obj/item/clothing/accessory/scarf
- name = "scarf"
+ name = "green scarf"
desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks."
+ icon_state = "greenscarf"
/obj/item/clothing/accessory/scarf/red
name = "red scarf"
icon_state = "redscarf"
-/obj/item/clothing/accessory/scarf/green
- name = "green scarf"
- icon_state = "greenscarf"
-
/obj/item/clothing/accessory/scarf/darkblue
name = "dark blue scarf"
icon_state = "darkbluescarf"
@@ -284,14 +281,14 @@
name = "christmas scarf"
icon_state = "christmasscarf"
-/obj/item/clothing/accessory/stripedredscarf
+/obj/item/clothing/accessory/scarf/stripedred
name = "striped red scarf"
icon_state = "stripedredscarf"
-/obj/item/clothing/accessory/stripedgreenscarf
+/obj/item/clothing/accessory/scarf/stripedgreen
name = "striped green scarf"
icon_state = "stripedgreenscarf"
-/obj/item/clothing/accessory/stripedbluescarf
+/obj/item/clothing/accessory/scarf/stripedblue
name = "striped blue scarf"
icon_state = "stripedbluescarf"
diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm
index dff0740ace1..3f117d6adec 100644
--- a/code/modules/clothing/under/accessories/clothing.dm
+++ b/code/modules/clothing/under/accessories/clothing.dm
@@ -3,27 +3,27 @@
desc = "Slick black suit vest."
icon_state = "det_vest"
-/obj/item/clothing/accessory/tan_jacket
+/obj/item/clothing/accessory/jacket/
name = "tan suit jacket"
desc = "Cozy suit jacket."
icon_state = "tan_jacket"
-/obj/item/clothing/accessory/charcoal_jacket
+/obj/item/clothing/accessory/jacket/charcoal
name = "charcoal suit jacket"
desc = "Strict suit jacket."
icon_state = "charcoal_jacket"
-/obj/item/clothing/accessory/navy_jacket
+/obj/item/clothing/accessory/jacket/navy
name = "navy suit jacket"
desc = "Official suit jacket."
icon_state = "navy_jacket"
-/obj/item/clothing/accessory/burgundy_jacket
+/obj/item/clothing/accessory/jacket/burgundy
name = "burgundy suit jacket"
desc = "Expensive suit jacket."
icon_state = "burgundy_jacket"
-/obj/item/clothing/accessory/checkered_jacket
+/obj/item/clothing/accessory/jacket/checkered
name = "checkered suit jacket"
desc = "Lucky suit jacket."
icon_state = "checkered_jacket"
@@ -115,6 +115,58 @@
icon_state = "cargoponcho"
item_state = "cargoponcho"
+/*
+ * Cloak
+ */
+/obj/item/clothing/accessory/poncho/roles/cloak
+ name = "brown cloak"
+ desc = "An elaborate brown cloak."
+ icon_state = "qmcloak"
+ item_state = "qmcloak"
+ body_parts_covered = null
+
+/obj/item/clothing/accessory/poncho/roles/cloak/ce
+ name = "chief engineer's cloak"
+ desc = "An elaborate cloak worn by the chief engineer."
+ icon_state = "cecloak"
+ item_state = "cecloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/cmo
+ name = "chief medical officer's cloak"
+ desc = "An elaborate cloak meant to be worn by the chief medical officer."
+ icon_state = "cmocloak"
+ item_state = "cmocloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/hop
+ name = "head of personnel's cloak"
+ desc = "An elaborate cloak meant to be worn by the head of personnel."
+ icon_state = "hopcloak"
+ item_state = "hopcloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/rd
+ name = "research director's cloak"
+ desc = "An elaborate cloak meant to be worn by the research director."
+ icon_state = "rdcloak"
+ item_state = "rdcloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/qm
+ name = "quartermaster's cloak"
+ desc = "An elaborate cloak meant to be worn by the quartermaster."
+ icon_state = "qmcloak"
+ item_state = "qmcloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/hos
+ name = "head of security's cloak"
+ desc = "An elaborate cloak meant to be worn by the head of security."
+ icon_state = "hoscloak"
+ item_state = "hoscloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/captain
+ name = "colony director's cloak"
+ desc = "An elaborate cloak meant to be worn by the colony director."
+ icon_state = "capcloak"
+ item_state = "capcloak"
+
/obj/item/clothing/accessory/hawaii
name = "flower-pattern shirt"
desc = "You probably need some welder googles to look at this."
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index 87e6fa5bf97..a9757e30262 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -101,7 +101,7 @@
icon_state = "internalaffairs"
item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit")
rolled_sleeves = 0
- starting_accessories = list(/obj/item/clothing/accessory/black)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/black)
/obj/item/clothing/under/rank/internalaffairs/skirt
desc = "The plain, professional attire of an Internal Affairs Agent. The top button is sewn shut."
@@ -156,7 +156,7 @@
desc = "A classy suit."
icon_state = "bluesuit"
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
- starting_accessories = list(/obj/item/clothing/accessory/red)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/red)
/obj/item/clothing/under/lawyer/bluesuit/skirt
name = "blue skirt suit"
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index 02dde0f8151..9680de48841 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -73,7 +73,7 @@
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
rolled_sleeves = 0
- starting_accessories = list(/obj/item/clothing/accessory/blue_clip)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/blue_clip)
/*
/obj/item/clothing/under/det/verb/rollup()
@@ -89,13 +89,13 @@
/obj/item/clothing/under/det/grey
icon_state = "detective2"
desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks."
- starting_accessories = list(/obj/item/clothing/accessory/red_long)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/red_long)
/obj/item/clothing/under/det/black
icon_state = "detective3"
item_state_slots = list(slot_r_hand_str = "sl_suit", slot_l_hand_str = "sl_suit")
desc = "An immaculate white dress shirt, paired with a pair of dark grey dress pants, a red tie, and a charcoal vest."
- starting_accessories = list(/obj/item/clothing/accessory/red_long, /obj/item/clothing/accessory/vest)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/red_long, /obj/item/clothing/accessory/vest)
/obj/item/clothing/under/det/corporate
name = "detective's jumpsuit"
@@ -106,12 +106,12 @@
/obj/item/clothing/under/det/waistcoat
icon_state = "detective"
desc = "A rumpled white dress shirt paired with well-worn grey slacks, complete with a blue striped tie, faux-gold tie clip, and waistcoat."
- starting_accessories = list(/obj/item/clothing/accessory/blue_clip, /obj/item/clothing/accessory/wcoat)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/blue_clip, /obj/item/clothing/accessory/wcoat)
/obj/item/clothing/under/det/grey/waistcoat
icon_state = "detective2"
desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks, complete with a red striped tie and waistcoat."
- starting_accessories = list(/obj/item/clothing/accessory/red_long, /obj/item/clothing/accessory/wcoat)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/red_long, /obj/item/clothing/accessory/wcoat)
/obj/item/clothing/under/det/skirt
name = "detective's skirt"
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 7f9586b6a0d..f9a0a9ab379 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -101,7 +101,7 @@
icon_state = "greensuit"
item_state_slots = list(slot_r_hand_str = "centcom", slot_l_hand_str = "centcom")
rolled_sleeves = 0
- starting_accessories = list(/obj/item/clothing/accessory/darkgreen)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/darkgreen)
/obj/item/clothing/under/gov/skirt
name = "Green formal skirt uniform"
@@ -161,7 +161,7 @@
icon_state = "gentlesuit"
item_state_slots = list(slot_r_hand_str = "grey", slot_l_hand_str = "grey")
rolled_sleeves = 0
- starting_accessories = list(/obj/item/clothing/accessory/white, /obj/item/clothing/accessory/wcoat/gentleman)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/white, /obj/item/clothing/accessory/wcoat/gentleman)
/obj/item/clothing/under/gentlesuit/skirt
name = "lady's suit"
@@ -472,7 +472,7 @@
desc = "A charcoal suit and red tie. Very professional."
icon_state = "charcoal_suit"
item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
- starting_accessories = list(/obj/item/clothing/accessory/navy, /obj/item/clothing/accessory/charcoal_jacket)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/navy, /obj/item/clothing/accessory/jacket/charcoal)
/obj/item/clothing/under/suit_jacket/charcoal/skirt
name = "charcoal skirt"
@@ -483,7 +483,7 @@
desc = "A navy suit and red tie, intended for the station's finest."
icon_state = "navy_suit"
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
- starting_accessories = list(/obj/item/clothing/accessory/red, /obj/item/clothing/accessory/navy_jacket)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/red, /obj/item/clothing/accessory/jacket/navy)
/obj/item/clothing/under/suit_jacket/navy/skirt
name = "navy skirt"
@@ -494,7 +494,7 @@
desc = "A burgundy suit and black tie. Somewhat formal."
icon_state = "burgundy_suit"
item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red")
- starting_accessories = list(/obj/item/clothing/accessory/black, /obj/item/clothing/accessory/burgundy_jacket)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/black, /obj/item/clothing/accessory/jacket/burgundy)
/obj/item/clothing/under/suit_jacket/burgundy/skirt
name = "burgundy skirt"
@@ -505,7 +505,7 @@
desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?"
icon_state = "checkered_suit"
item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
- starting_accessories = list(/obj/item/clothing/accessory/black, /obj/item/clothing/accessory/checkered_jacket)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/black, /obj/item/clothing/accessory/jacket/checkered)
/obj/item/clothing/under/suit_jacket/checkered/skirt
name = "checkered skirt"
@@ -516,7 +516,7 @@
desc = "A tan suit. Smart, but casual."
icon_state = "tan_suit"
item_state_slots = list(slot_r_hand_str = "tan_suit", slot_l_hand_str = "tan_suit")
- starting_accessories = list(/obj/item/clothing/accessory/yellow, /obj/item/clothing/accessory/tan_jacket)
+ starting_accessories = list(/obj/item/clothing/accessory/tie/yellow, /obj/item/clothing/accessory/jacket)
/obj/item/clothing/under/suit_jacket/tan/skirt
name = "tan skirt"
diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm
index 54c3ee4e5c6..ef2333a0af6 100644
--- a/code/modules/customitems/item_spawning.dm
+++ b/code/modules/customitems/item_spawning.dm
@@ -222,6 +222,8 @@
existing_item = M.wear_id
else if(citem.item_path == /obj/item/device/pda)
existing_item = locate(/obj/item/device/pda) in M.contents
+ else if(citem.item_path == /obj/item/weapon/storage/backpack)
+ existing_item = locate(/obj/item/weapon/storage/backpack) in M.contents
// Spawn and equip the item.
if(existing_item)
diff --git a/code/modules/examine/descriptions/atmospherics.dm b/code/modules/examine/descriptions/atmospherics.dm
index e5c707325b5..57b6d3e9da2 100644
--- a/code/modules/examine/descriptions/atmospherics.dm
+++ b/code/modules/examine/descriptions/atmospherics.dm
@@ -127,7 +127,7 @@
It can be controlled from an Air Alarm. It can be configured to drain all air rapidly with a 'panic syphon' from an air alarm."
//Omni filters
-/obj/machinery/atmospherics/omni/filter
+/obj/machinery/atmospherics/omni/atmos_filter
description_info = "Filters gas from a custom input direction, with up to two filtered outputs and a 'everything else' \
output. The filtered output's arrows glow orange."
diff --git a/code/modules/examine/stat_icons.dm b/code/modules/examine/stat_icons.dm
index b2ed64032a2..1ece266f0c8 100644
--- a/code/modules/examine/stat_icons.dm
+++ b/code/modules/examine/stat_icons.dm
@@ -29,4 +29,6 @@ var/global/list/description_icons = list(
"power cell" = image(icon='icons/obj/power.dmi',icon_state="hcell"),
"device cell" = image(icon='icons/obj/power.dmi',icon_state="dcell"),
"weapon cell" = image(icon='icons/obj/power.dmi',icon_state="wcell"),
+
+ "hatchet" = image(icon='icons/obj/weapons.dmi',icon_state="hatchet"),
)
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 3e3099bbbcc..c0c1eecd9e7 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -12,6 +12,8 @@
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]")
+
if(integrity>=50)
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
@@ -137,6 +139,9 @@
recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0)
recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5)
+/material/wood/log/generate_recipes()
+ return // Feel free to add log-only recipes here later if desired.
+
/material/cardboard/generate_recipes()
..()
recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box)
diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm
index 7ba518f6ef3..f66d2425c6a 100644
--- a/code/modules/materials/material_sheets.dm
+++ b/code/modules/materials/material_sheets.dm
@@ -203,6 +203,35 @@
icon_state = "sheet-wood"
default_type = "wood"
+/obj/item/stack/material/log
+ name = "log"
+ icon_state = "sheet-log"
+ default_type = "log"
+ no_variants = FALSE
+ color = "#824B28"
+ max_amount = 25
+ w_class = ITEMSIZE_HUGE
+
+/obj/item/stack/material/log/sif
+ name = "alien log"
+ color = "#0099cc"
+
+/obj/item/stack/material/log/attackby(var/obj/item/W, var/mob/user)
+ if(!istype(W))
+ return ..()
+ if(W.sharp && W.edge && use(1))
+ to_chat(user, "You cut up a log into planks.")
+ playsound(get_turf(src), 'sound/effects/woodcutting.ogg', 50, 1)
+ var/obj/item/stack/material/wood/existing_wood = locate() in user.loc
+ var/obj/item/stack/material/wood/new_wood = new(user.loc)
+ new_wood.amount = 2
+ if(existing_wood)
+ if(new_wood.transfer_to(existing_wood))
+ to_chat(user, "You add the newly-formed wood to the stack. It now contains [existing_wood.amount] planks.")
+ else
+ return ..()
+
+
/obj/item/stack/material/cloth
name = "cloth"
icon_state = "sheet-cloth"
diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
index 2daa7501c08..0db3a1016ec 100644
--- a/code/modules/materials/materials.dm
+++ b/code/modules/materials/materials.dm
@@ -680,6 +680,18 @@ var/list/name_to_material
sheet_singular_name = "plank"
sheet_plural_name = "planks"
+/material/wood/log
+ name = "log"
+ icon_base = "log"
+ stack_type = /obj/item/stack/material/log
+ sheet_singular_name = "log"
+ sheet_plural_name = "logs"
+
+/material/wood/log/sif
+ name = "alien log"
+ icon_colour = "#0099cc" // Cyan-ish
+ stack_origin_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2)
+
/material/wood/holographic
name = "holowood"
display_name = "wood"
diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm
index a017476af32..8fcba9aee3b 100644
--- a/code/modules/mining/abandonedcrates.dm
+++ b/code/modules/mining/abandonedcrates.dm
@@ -54,7 +54,7 @@
if(46 to 50)
new/obj/item/clothing/under/chameleon(src)
for(var/i = 0, i < 7, i++)
- new/obj/item/clothing/accessory/horrible(src)
+ new/obj/item/clothing/accessory/tie/horrible(src)
if(51 to 52) // Uncommon, 2% each
new/obj/item/weapon/melee/classic_baton(src)
if(53 to 54)
diff --git a/code/modules/mob/_modifiers/traits.dm b/code/modules/mob/_modifiers/traits.dm
index f3f510a4b06..824343c41c4 100644
--- a/code/modules/mob/_modifiers/traits.dm
+++ b/code/modules/mob/_modifiers/traits.dm
@@ -24,6 +24,12 @@
name = "weak"
desc = "A lack of physical strength causes a diminshed capability in close quarters combat"
+ outgoing_melee_damage_percent = 0.8
+
+/datum/modifier/trait/wimpy
+ name = "wimpy"
+ desc = "An extreme lack of physical strength causes greatly diminished capability in close quarters combat."
+
outgoing_melee_damage_percent = 0.6
/datum/modifier/trait/haemophilia
diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm
index 354a26221c4..d11043ebf77 100644
--- a/code/modules/mob/living/carbon/breathe.dm
+++ b/code/modules/mob/living/carbon/breathe.dm
@@ -63,8 +63,8 @@
//handle mask filtering
if(istype(wear_mask, /obj/item/clothing/mask) && breath)
var/obj/item/clothing/mask/M = wear_mask
- var/datum/gas_mixture/filtered = M.filter_air(breath)
- loc.assume_air(filtered)
+ var/datum/gas_mixture/gas_filtered = M.filter_air(breath)
+ loc.assume_air(gas_filtered)
return breath
return null
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index a4c5efb1fea..a09dad7dba3 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -23,6 +23,12 @@
var/g_skin = 0
var/b_skin = 0
+ //Synth colors
+ var/synth_color = 0 //Lets normally uncolorable synth parts be colorable.
+ var/r_synth //Used with synth_color to color synth parts that normaly can't be colored.
+ var/g_synth //Same as above
+ var/b_synth //Same as above
+
var/size_multiplier = 1 //multiplier for the mob's icon size
var/damage_multiplier = 1 //multiplies melee combat damage
var/icon_update = 1 //whether icon updating shall take place
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 652e11f6a3e..2d726f765dc 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -302,7 +302,7 @@ proc/get_radio_key_from_channel(var/channel)
var/image/speech_bubble = image('icons/mob/talk.dmi',src,"[speech_type][speech_bubble_test]")
spawn(30) qdel(speech_bubble)
- // VOREStation Edit - Attempt Multi-Z Talking
+ // Attempt Multi-Z Talking
var/mob/above = src.shadow
while(!QDELETED(above))
var/turf/ST = get_turf(above)
@@ -315,7 +315,6 @@ proc/get_radio_key_from_channel(var/channel)
listening[item] = z_speech_bubble
listening_obj |= results["objs"]
above = above.shadow
- // VOREStation Edit End
//Main 'say' and 'whisper' message delivery
for(var/mob/M in listening)
@@ -325,12 +324,12 @@ proc/get_radio_key_from_channel(var/channel)
var/dst = get_dist(get_turf(M),get_turf(src))
if(dst <= message_range || (M.stat == DEAD && !forbid_seeing_deadchat)) //Inside normal message range, or dead with ears (handled in the view proc)
- M << (listening[M] || speech_bubble) // VOREStation Edit - Send the image attached to shadow mob if available
+ M << (listening[M] || speech_bubble) // Send the image attached to shadow mob if available
M.hear_say(message, verb, speaking, alt_name, italics, src, speech_sound, sound_vol)
if(whispering) //Don't even bother with these unless whispering
if(dst > message_range && dst <= w_scramble_range) //Inside whisper scramble range
- M << (listening[M] || speech_bubble) // VOREStation Edit - Send the image attached to shadow mob if available
+ M << (listening[M] || speech_bubble) // Send the image attached to shadow mob if available
M.hear_say(stars(message), verb, speaking, alt_name, italics, src, speech_sound, sound_vol*0.2)
if(dst > w_scramble_range && dst <= world.view) //Inside whisper 'visible' range
M.show_message("[src.name] [w_not_heard].", 2)
diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm
index 0e3309a1493..0d24cea1e49 100644
--- a/code/modules/multiz/movement.dm
+++ b/code/modules/multiz/movement.dm
@@ -57,10 +57,8 @@
if(!A.CanPass(src, start, 1.5, 0))
to_chat(src, "\The [A] blocks you.")
return 0
- //VOREStation Edit
if(!Move(destination))
return 0
- //VOREStation Edit End
return 1
/mob/observer/zMove(direction)
@@ -199,7 +197,7 @@
/obj/structure/catwalk/CanFallThru(atom/movable/mover as mob|obj, turf/target as turf)
if(target.z < z)
return FALSE // TODO - Technically should be density = 1 and flags |= ON_BORDER
- if(!isturf(mover.loc)) // VORESTATION EDIT. Feel free to do an upstream suggestion as well.
+ if(!isturf(mover.loc))
return FALSE // Only let loose floor items fall. No more snatching things off people's hands.
else
return TRUE
@@ -213,7 +211,7 @@
return TRUE // We don't block sideways or upward movement.
else if(istype(mover) && mover.checkpass(PASSGRILLE))
return TRUE // Anything small enough to pass a grille will pass a lattice
- if(!isturf(mover.loc)) // VORESTATION EDIT. Feel free to do an upstream suggestion as well.
+ if(!isturf(mover.loc))
return FALSE // Only let loose floor items fall. No more snatching things off people's hands.
else
return FALSE // TODO - Technically should be density = 1 and flags |= ON_BORDER
diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm
index 161adfb80df..636918c5e8a 100644
--- a/code/modules/multiz/turf.dm
+++ b/code/modules/multiz/turf.dm
@@ -85,13 +85,12 @@
bottom_turf.plane = src.plane
bottom_turf.color = below.color
underlays = list(bottom_turf)
- // VOREStation Edit - Hack workaround to byond crash bug - Include the magic overlay holder object.
+ // Hack workaround to byond crash bug - Include the magic overlay holder object.
overlays += below.overlays
// if(below.overlay_holder)
// overlays += (below.overlays + below.overlay_holder.overlays)
// else
// overlays += below.overlays
- // VOREStation Edit End
// get objects (not mobs, they are handled by /obj/zshadow)
var/list/o_img = list()
diff --git a/code/modules/multiz/zshadow.dm b/code/modules/multiz/zshadow.dm
index 42dee28f2bd..5874bd4d802 100644
--- a/code/modules/multiz/zshadow.dm
+++ b/code/modules/multiz/zshadow.dm
@@ -121,7 +121,7 @@
/mob/zshadow/set_typing_indicator(var/state)
if(!typing_indicator)
typing_indicator = new
- typing_indicator.icon = 'icons/mob/talk.dmi' //VOREStation Edit - Looks better on the right with job icons.
+ typing_indicator.icon = 'icons/mob/talk.dmi' // Looks better on the right with job icons.
typing_indicator.icon_state = "typing"
if(state && !typing)
overlays += typing_indicator
diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index 4e381d47ad6..48759ae1cff 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -19,6 +19,8 @@ var/global/list/limb_icon_cache = list()
if(robotic >= ORGAN_ROBOT)
var/datum/robolimb/franchise = all_robolimbs[model]
if(!(franchise && franchise.lifelike))
+ if(human.synth_color)
+ s_col = list(human.r_synth, human.g_synth, human.b_synth)
return
if(species && human.species && species.name != human.species.name)
return
diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm
index 55fe50db39a..d06ea3332f1 100644
--- a/code/modules/organs/robolimbs.dm
+++ b/code/modules/organs/robolimbs.dm
@@ -245,6 +245,20 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
green=xion_green;\
rgb=xion_rgb"
+/datum/robolimb/xion_alt3
+ company = "Xion - Whiteout"
+ desc = "This limb has a minimalist black and white casing."
+ icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt3.dmi'
+ unavailable_to_build = 1
+
+/datum/robolimb/xion_alt4
+ company = "Xion - Breach - Whiteout"
+ desc = "This limb has a minimalist black and white casing. Looks a bit menacing."
+ icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt4.dmi'
+ unavailable_to_build = 1
+ parts = list(BP_HEAD)
+
+
/datum/robolimb/xion_monitor
company = "Xion Monitor"
desc = "Xion Mfg.'s unique spin on a popular prosthetic head model. It looks and minimalist and utilitarian."
diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm
index 439e9f7b2e8..b775f93a8e0 100644
--- a/code/modules/organs/subtypes/machine.dm
+++ b/code/modules/organs/subtypes/machine.dm
@@ -2,7 +2,7 @@
name = "microbattery"
desc = "A small, powerful cell for use in fully prosthetic bodies."
icon_state = "scell"
- organ_tag = "cell"
+ organ_tag = O_CELL
parent_organ = BP_TORSO
vital = 1
@@ -21,7 +21,7 @@
// Used for an MMI or posibrain being installed into a human.
/obj/item/organ/internal/mmi_holder
name = "brain interface"
- organ_tag = "brain"
+ organ_tag = O_BRAIN
parent_organ = BP_HEAD
vital = 1
var/brain_type = /obj/item/device/mmi
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index cee809d5961..0af97704348 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -466,7 +466,7 @@
user << browse("[name][info_links][stamps]", "window=[name]")
return
- else if(istype(P, /obj/item/weapon/stamp))
+ else if(istype(P, /obj/item/weapon/stamp) || istype(P, /obj/item/clothing/gloves/ring/seal))
if((!in_range(src, usr) && loc != user && !( istype(loc, /obj/item/weapon/clipboard) ) && loc.loc != user && user.get_active_hand() != P))
return
diff --git a/code/modules/power/cable_heavyduty.dm b/code/modules/power/cable_heavyduty.dm
index 9c0aab68dc2..99c91a6b742 100644
--- a/code/modules/power/cable_heavyduty.dm
+++ b/code/modules/power/cable_heavyduty.dm
@@ -8,7 +8,7 @@
name = "large power cable"
desc = "This cable is tough. It cannot be cut with simple hand tools."
layer = 2.39 //Just below pipes, which are at 2.4
- color = null //VOREStation Edit
+ color = null
/obj/structure/cable/heavyduty/attackby(obj/item/W, mob/user)
diff --git a/code/modules/power/supermatter/setup_supermatter.dm b/code/modules/power/supermatter/setup_supermatter.dm
index 559f035cb2d..f797e14f9eb 100644
--- a/code/modules/power/supermatter/setup_supermatter.dm
+++ b/code/modules/power/supermatter/setup_supermatter.dm
@@ -56,7 +56,7 @@
C.energy_setting = ENERGY_PHORON
continue
- for(var/obj/effect/engine_setup/filter/F in world)
+ for(var/obj/effect/engine_setup/atmo_filter/F in world)
F.coolant = response
var/list/delayed_objects = list()
@@ -227,13 +227,13 @@
// Sets up filters. This assumes filters are set to filter out N2 back to the core loop by default!
-/obj/effect/engine_setup/filter/
+/obj/effect/engine_setup/atmo_filter/
name = "Omni Filter Marker"
var/coolant = null
-/obj/effect/engine_setup/filter/activate()
+/obj/effect/engine_setup/atmo_filter/activate()
..()
- var/obj/machinery/atmospherics/omni/filter/F = locate() in get_turf(src)
+ var/obj/machinery/atmospherics/omni/atmos_filter/F = locate() in get_turf(src)
if(!F)
log_and_message_admins("## WARNING: Unable to locate omni filter at [x] [y] [z]!")
return SETUP_WARNING
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 76c4249092a..5e599230cfe 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -235,9 +235,18 @@
//if they have a neck grab on someone, that person gets hit instead
var/obj/item/weapon/grab/G = locate() in M
if(G && G.state >= GRAB_NECK)
- visible_message("\The [M] uses [G.affecting] as a shield!")
- if(Bump(G.affecting, forced=1))
- return //If Bump() returns 0 (keep going) then we continue on to attack M.
+ if(G.affecting.stat == DEAD)
+ var/shield_chance = min(80, (30 * (M.mob_size / 10))) //Small mobs have a harder time keeping a dead body as a shield than a human-sized one. Unathi would have an easier job, if they are made to be SIZE_LARGE in the future. -Mech
+ if(prob(shield_chance))
+ visible_message("\The [M] uses [G.affecting] as a shield!")
+ if(Bump(G.affecting, forced=1))
+ return
+ else
+ visible_message("\The [M] tries to use [G.affecting] as a shield, but fails!")
+ else
+ visible_message("\The [M] uses [G.affecting] as a shield!")
+ if(Bump(G.affecting, forced=1))
+ return //If Bump() returns 0 (keep going) then we continue on to attack M.
passthrough = !attack_mob(M, distance)
else
@@ -410,6 +419,8 @@
return //cannot shoot yourself
if(istype(A, /obj/item/projectile))
return
+ if(istype(A, /obj/structure/foamedmetal)) //Turrets can detect through foamed metal, but will have to blast through it. Similar to windows, if someone runs behind it, a person should probably just not shoot.
+ return
if(istype(A, /mob/living) || istype(A, /obj/mecha) || istype(A, /obj/vehicle))
result = 2 //We hit someone, return 1!
return
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
index 6fb44ad8145..99972f4708a 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
@@ -96,7 +96,6 @@
reagent_state = LIQUID
color = "#0064C877"
metabolism = REM * 10
- mrate_static = TRUE
glass_name = "water"
glass_desc = "The father of all refreshments."
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
index d0be0469c10..51ba5d3782d 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
@@ -16,7 +16,6 @@
reagent_state = SOLID
color = "#1C1300"
ingest_met = REM * 5
- mrate_static = TRUE
/datum/reagent/carbon/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
@@ -74,8 +73,6 @@
var/targ_temp = 310
var/halluci = 0
- mrate_static = TRUE
-
glass_name = "ethanol"
glass_desc = "A well-known alcohol with a variety of applications."
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
index 3f660ca1643..8d49b4cb4a2 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
@@ -7,7 +7,6 @@
taste_mult = 4
reagent_state = SOLID
metabolism = REM * 4
- mrate_static = TRUE
var/nutriment_factor = 30 // Per unit
var/injectable = 0
color = "#664330"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
index a5fcab44308..8cfb75e20cb 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
@@ -9,7 +9,6 @@
color = "#00BFFF"
overdose = REAGENTS_OVERDOSE * 2
metabolism = REM * 0.5
- mrate_static = TRUE
scannable = 1
/datum/reagent/inaprovaline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -141,7 +140,6 @@
taste_description = "bitterness"
reagent_state = LIQUID
color = "#0040FF"
- mrate_static = TRUE //Until it's not crazy strong, at least
overdose = REAGENTS_OVERDOSE * 0.5
scannable = 1
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 4a936c6014d..97942f0d021 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -170,10 +170,10 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
/obj/machinery/r_n_d/circuit_imprinter/proc/canBuild(var/datum/design/D)
for(var/M in D.materials)
- if(materials[M] < D.materials[M])
+ if(materials[M] < (D.materials[M] * mat_efficiency))
return 0
for(var/C in D.chemicals)
- if(!reagents.has_reagent(C, D.chemicals[C]))
+ if(!reagents.has_reagent(C, D.chemicals[C] * mat_efficiency))
return 0
return 1
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 3bce9acd121..c34f8d94549 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -671,7 +671,7 @@ other types of metals and chemistry for reagents).
id = "s-filter"
req_tech = list(TECH_DATA = 3, TECH_MAGNET = 3)
materials = list(DEFAULT_WALL_MATERIAL = 40, "silver" = 10)
- build_path = /obj/item/weapon/stock_parts/subspace/filter
+ build_path = /obj/item/weapon/stock_parts/subspace/sub_filter
sort_string = "UAAAB"
/datum/design/item/stock_part/subspace_amplifier
diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm
index f26c66bc9af..38b00c5f96e 100644
--- a/code/modules/research/prosfab_designs.dm
+++ b/code/modules/research/prosfab_designs.dm
@@ -156,6 +156,38 @@
materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 5625)
// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+/datum/design/item/prosfab/pros/heart
+ name = "Prosthetic heart"
+ id = "pros_heart"
+ build_path = /obj/item/organ/internal/heart
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 1000)
+// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+
+/datum/design/item/prosfab/pros/lungs
+ name = "Prosthetic lungs"
+ id = "pros_lung"
+ build_path = /obj/item/organ/internal/lungs
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 1000)
+// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+
+/datum/design/item/prosfab/pros/liver
+ name = "Prosthetic liver"
+ id = "pros_liver"
+ build_path = /obj/item/organ/internal/liver
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 1000)
+// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+
+/datum/design/item/prosfab/pros/kidneys
+ name = "Prosthetic liver"
+ id = "pros_kidney"
+ build_path = /obj/item/organ/internal/kidneys
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 1000)
+// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+
//////////////////// Cyborg Parts ////////////////////
/datum/design/item/prosfab/cyborg
category = "Cyborg Parts"
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index be489f96377..23334827614 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -164,10 +164,10 @@
/obj/machinery/r_n_d/protolathe/proc/canBuild(var/datum/design/D)
for(var/M in D.materials)
- if(materials[M] < D.materials[M])
+ if(materials[M] < (D.materials[M] * mat_efficiency))
return 0
for(var/C in D.chemicals)
- if(!reagents.has_reagent(C, D.chemicals[C]))
+ if(!reagents.has_reagent(C, D.chemicals[C] * mat_efficiency))
return 0
return 1
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index 3310ffe6a50..99fa33d1cba 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -27,13 +27,16 @@
var/obj/item/organ/external/P = target.organs_by_name[E.parent_organ]
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if (affected)
- user << "Something is in the way! You can't attach [E] here!"
+ to_chat(user, "Something is in the way! You can't attach [E] here!")
return 0
if(!P)
- user << "There's nothing to attach [E] to!"
+ to_chat(user, "There's nothing to attach [E] to!")
return 0
else if((P.robotic >= ORGAN_ROBOT) && (E.robotic < ORGAN_ROBOT))
- user << "Attaching [E] to [P] wouldn't work well."
+ to_chat(user, "Attaching [E] to [P] wouldn't work well.")
+ return 0
+ else if(istype(E, /obj/item/organ/external/head) && E.robotic >= ORGAN_ROBOT && P.robotic < ORGAN_ROBOT)
+ to_chat(user, "Attaching [E] to [P] might break [E].")
return 0
else
return 1
diff --git a/code/modules/xenoarcheaology/finds/misc.dm b/code/modules/xenoarcheaology/finds/misc.dm
index 4037de5176a..2729872876e 100644
--- a/code/modules/xenoarcheaology/finds/misc.dm
+++ b/code/modules/xenoarcheaology/finds/misc.dm
@@ -6,10 +6,15 @@
name = "Crystal"
icon = 'icons/obj/mining.dmi'
icon_state = "crystal"
+ density = TRUE
+ anchored = TRUE
/obj/machinery/crystal/New()
if(prob(50))
icon_state = "crystal2"
+ set_light(3, 3, "#CC00CC")
+ else
+ set_light(3, 3, "#33CC33")
//large finds
/*
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index cf745532374..1469c3e3bac 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/xion/xion_alt3.dmi b/icons/mob/human_races/cyberlimbs/xion/xion_alt3.dmi
new file mode 100644
index 00000000000..a5aef281619
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/xion/xion_alt3.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/xion/xion_alt4.dmi b/icons/mob/human_races/cyberlimbs/xion/xion_alt4.dmi
new file mode 100644
index 00000000000..e5fa42135be
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/xion/xion_alt4.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index a0e5df9f9d3..c4a79cf9248 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index d041818abb9..2c17ab4a320 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 5ba6b502fc8..7b1b1b40857 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/rings.dmi b/icons/obj/clothing/rings.dmi
new file mode 100644
index 00000000000..5274bf8735d
Binary files /dev/null and b/icons/obj/clothing/rings.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index d60b03c9aad..382f19e8e11 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index 84117e2754c..8f5aac8ff68 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/flora/deadtrees.dmi b/icons/obj/flora/deadtrees.dmi
index 2ae1a5a6e07..7a0b164619c 100644
Binary files a/icons/obj/flora/deadtrees.dmi and b/icons/obj/flora/deadtrees.dmi differ
diff --git a/icons/obj/flora/jungleflora.dmi b/icons/obj/flora/jungleflora.dmi
new file mode 100644
index 00000000000..9a266e9226e
Binary files /dev/null and b/icons/obj/flora/jungleflora.dmi differ
diff --git a/icons/obj/flora/jungletree.dmi b/icons/obj/flora/jungletree.dmi
new file mode 100644
index 00000000000..51f31413995
Binary files /dev/null and b/icons/obj/flora/jungletree.dmi differ
diff --git a/icons/obj/flora/jungletreesmall.dmi b/icons/obj/flora/jungletreesmall.dmi
new file mode 100644
index 00000000000..3abd375cc91
Binary files /dev/null and b/icons/obj/flora/jungletreesmall.dmi differ
diff --git a/icons/obj/flora/largejungleflora.dmi b/icons/obj/flora/largejungleflora.dmi
new file mode 100644
index 00000000000..bba0fd29f62
Binary files /dev/null and b/icons/obj/flora/largejungleflora.dmi differ
diff --git a/icons/obj/flora/palmtrees.dmi b/icons/obj/flora/palmtrees.dmi
new file mode 100644
index 00000000000..b8708b36d2a
Binary files /dev/null and b/icons/obj/flora/palmtrees.dmi differ
diff --git a/icons/obj/flora/pinetrees.dmi b/icons/obj/flora/pinetrees.dmi
index 9ee04a5baf5..63073046f01 100644
Binary files a/icons/obj/flora/pinetrees.dmi and b/icons/obj/flora/pinetrees.dmi differ
diff --git a/icons/obj/flora/rocks.dmi b/icons/obj/flora/rocks.dmi
index a1f6a0df0a9..0974360e27b 100644
Binary files a/icons/obj/flora/rocks.dmi and b/icons/obj/flora/rocks.dmi differ
diff --git a/icons/obj/robotics.dmi b/icons/obj/robotics.dmi
index 85d5a8d0a0b..e45848975be 100644
Binary files a/icons/obj/robotics.dmi and b/icons/obj/robotics.dmi differ
diff --git a/icons/obj/stacks.dmi b/icons/obj/stacks.dmi
index 1713cacb671..5cdff4a1f33 100644
Binary files a/icons/obj/stacks.dmi and b/icons/obj/stacks.dmi differ
diff --git a/icons/turf/outdoors.dmi b/icons/turf/outdoors.dmi
index bcd81c28c9a..31fab0ec95c 100644
Binary files a/icons/turf/outdoors.dmi and b/icons/turf/outdoors.dmi differ
diff --git a/icons/turf/outdoors_edge.dmi b/icons/turf/outdoors_edge.dmi
index 02a52195c2b..fb0b04168e4 100644
Binary files a/icons/turf/outdoors_edge.dmi and b/icons/turf/outdoors_edge.dmi differ
diff --git a/icons/turf/wall_masks.dmi b/icons/turf/wall_masks.dmi
index 220e1b87e5d..d67671c4d63 100644
Binary files a/icons/turf/wall_masks.dmi and b/icons/turf/wall_masks.dmi differ
diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm
index 83de065a7ba..4f8aedb853d 100644
--- a/maps/northern_star/polaris-1.dmm
+++ b/maps/northern_star/polaris-1.dmm
@@ -8373,7 +8373,7 @@
"dfa" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
"dfb" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/blue/full{dir = 8},/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Port"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dfc" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dfd" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 2; tag_south = 1; tag_west = 3; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dfd" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 0; tag_north = 2; tag_south = 1; tag_west = 3; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dfe" = (/obj/structure/dispenser,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dff" = (/turf/simulated/wall,/area/engineering/atmos)
"dfg" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8660,7 +8660,7 @@
"dkB" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "n2_in"; use_power = 1},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/atmos)
"dkC" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dkD" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dkE" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 2; tag_south = 5; tag_west = 4; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dkE" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 2; tag_south = 5; tag_west = 4; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dkF" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dkG" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dkH" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8712,8 +8712,8 @@
"dlB" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/atmos)
"dlC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/effect/floor_decal/corner/red{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dlD" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dlE" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 0; tag_south = 6; tag_west = 2; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dlF" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 1; tag_south = 7; tag_west = 2; use_power = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dlE" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 0; tag_south = 6; tag_west = 2; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dlF" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 0; tag_north = 1; tag_south = 7; tag_west = 2; use_power = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dlG" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dlH" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dlI" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{dir = 5; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/turf/simulated/wall/r_wall,/area/engineering/workshop)
@@ -9696,9 +9696,9 @@
"dEx" = (/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/engineering/aft_hallway)
"dEy" = (/turf/simulated/floor,/area/shuttle/constructionsite/station)
"dEz" = (/obj/structure/closet/crate,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/shuttle/constructionsite/station)
-"dEA" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 4; tag_south = 2; tag_west = 0; use_power = 0},/obj/effect/engine_setup/filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dEA" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 4; tag_south = 2; tag_west = 0; use_power = 0},/obj/effect/engine_setup/atmo_filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dEB" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor,/area/engineering/engine_room)
-"dEC" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 4; tag_south = 2; tag_west = 1; use_power = 0},/obj/effect/engine_setup/filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dEC" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 0; tag_north = 4; tag_south = 2; tag_west = 1; use_power = 0},/obj/effect/engine_setup/atmo_filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dED" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/engine_room)
"dEE" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor,/area/engineering/engine_room)
"dEF" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -9871,7 +9871,7 @@
"dHQ" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/obj/structure/closet/emcloset,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
"dHR" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/clothing/shoes/magboots,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/eva)
"dHS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/light,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/northern_star/polaris-2.dmm b/maps/northern_star/polaris-2.dmm
index ee935ce4b09..e2a422d04c8 100644
--- a/maps/northern_star/polaris-2.dmm
+++ b/maps/northern_star/polaris-2.dmm
@@ -988,7 +988,7 @@
"sZ" = (/obj/structure/table/rack,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"ta" = (/obj/structure/table/rack,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"tb" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
-"tc" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/weapon/gun/projectile/automatic/sts35,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
+"tc" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m545,/obj/item/ammo_magazine/m545,/obj/item/ammo_magazine/m545,/obj/item/ammo_magazine/m545,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/weapon/gun/projectile/automatic/sts35,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"td" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops)
"te" = (/obj/machinery/vending/boozeomat,/turf/simulated/shuttle/wall/dark,/area/shuttle/administration/centcom)
"tf" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom)
diff --git a/maps/northern_star/polaris-3.dmm b/maps/northern_star/polaris-3.dmm
index dd7fb784cfc..eacc4adfb85 100644
--- a/maps/northern_star/polaris-3.dmm
+++ b/maps/northern_star/polaris-3.dmm
@@ -280,7 +280,7 @@
"fL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/tcomsat)
"fM" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/tcomsat)
"fN" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/transmitter,/obj/item/weapon/stock_parts/subspace/transmitter,/turf/simulated/floor,/area/tcomsat)
-"fO" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/turf/simulated/floor,/area/tcomsat)
+"fO" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/item/weapon/stock_parts/subspace/sub_filter,/turf/simulated/floor,/area/tcomsat)
"fP" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/turf/simulated/floor,/area/tcomsat)
"fQ" = (/obj/machinery/telecomms/server/presets/medical,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"fR" = (/obj/machinery/telecomms/server/presets/science,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
diff --git a/maps/northern_star/polaris-4.dmm b/maps/northern_star/polaris-4.dmm
index a55043f6321..456048f5399 100644
--- a/maps/northern_star/polaris-4.dmm
+++ b/maps/northern_star/polaris-4.dmm
@@ -193,7 +193,7 @@
"dS" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable,/turf/simulated/floor,/area/outpost/abandoned)
"dT" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'COMPRESSED GAS'."; name = "COMPRESSED GAS"; pixel_x = -32; pixel_y = 0},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor,/area/outpost/abandoned)
"dU" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/abandoned)
-"dV" = (/obj/machinery/atmospherics/omni/filter{power_rating = 15000; tag_east = 1; tag_north = 3; tag_south = 4; tag_west = 2},/turf/simulated/floor,/area/outpost/abandoned)
+"dV" = (/obj/machinery/atmospherics/omni/atmos_filter{power_rating = 15000; tag_east = 1; tag_north = 3; tag_south = 4; tag_west = 2},/turf/simulated/floor,/area/outpost/abandoned)
"dW" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor,/area/outpost/abandoned)
"dX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/outpost/abandoned)
"dY" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Atmospherics"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/outpost/abandoned)
diff --git a/maps/northern_star/polaris-5.dmm b/maps/northern_star/polaris-5.dmm
index cf6ccecf5f8..d228eccef0e 100644
--- a/maps/northern_star/polaris-5.dmm
+++ b/maps/northern_star/polaris-5.dmm
@@ -246,7 +246,7 @@
"eL" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/mixing)
"eM" = (/obj/machinery/atmospherics/omni/mixer{tag_east = 2; tag_east_con = null; tag_north = 1; tag_north_con = 0.5; tag_south = 0; tag_south_con = null; tag_west = 1; tag_west_con = 0.5; use_power = 0},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
"eN" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/machinery/meter,/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/research/mixing)
-"eO" = (/obj/machinery/atmospherics/omni/filter{tag_east = 2; tag_north = 6; tag_south = 0; tag_west = 1; use_power = 0},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
+"eO" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 6; tag_south = 0; tag_west = 1; use_power = 0},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
"eP" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -29},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
"eQ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/purple{dir = 9},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/toxins_hallway)
"eR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/toxins_hallway)
@@ -932,7 +932,7 @@
"rV" = (/obj/machinery/door/window/southright{name = "Spectrometry Lab"; req_access = list(65)},/obj/effect/floor_decal/corner/beige{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"rW" = (/obj/machinery/reagentgrinder,/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/beige/full{dir = 4},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Sample Preparation"; dir = 8},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"rX" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"rY" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_south = 2; tag_west = 3},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"rY" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_south = 2; tag_west = 3},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"rZ" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"sa" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/obj/effect/floor_decal/industrial/warning,/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Anomalous Materials Port"; dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"sb" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
@@ -1319,9 +1319,9 @@
"zs" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"zt" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"zu" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
-"zv" = (/obj/machinery/atmospherics/omni/filter{tag_east = 2; tag_north = 6; tag_south = 0; tag_west = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
-"zw" = (/obj/machinery/atmospherics/omni/filter{tag_east = 2; tag_north = 7; tag_west = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
-"zx" = (/obj/machinery/atmospherics/omni/filter{tag_east = 2; tag_north = 5; tag_west = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
+"zv" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 6; tag_south = 0; tag_west = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
+"zw" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 7; tag_west = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
+"zx" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 5; tag_west = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"zy" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"zz" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/freezer,/area/outpost/mining_main/dorms)
"zA" = (/obj/structure/mirror{pixel_x = 30; pixel_y = -2},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/freezer,/area/outpost/mining_main/dorms)
@@ -1747,7 +1747,7 @@
"HE" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored)
"HF" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/engineering/atmospherics)
"HG" = (/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Atmospherics"; dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'COMPRESSED GAS'."; name = "COMPRESSED GAS"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics)
-"HH" = (/obj/machinery/atmospherics/omni/filter{power_rating = 15000; tag_east = 1; tag_north = 3; tag_south = 4; tag_west = 2},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
+"HH" = (/obj/machinery/atmospherics/omni/atmos_filter{power_rating = 15000; tag_east = 1; tag_north = 3; tag_south = 4; tag_west = 2},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"HI" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"HJ" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"HK" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Atmospherics"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics)
@@ -1912,7 +1912,7 @@
"KN" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
"KO" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
"KP" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/nano/templates/omni_filter.tmpl b/nano/templates/omni_filter.tmpl
index 8f2dbfc924e..7e99e73786d 100644
--- a/nano/templates/omni_filter.tmpl
+++ b/nano/templates/omni_filter.tmpl
@@ -36,7 +36,7 @@
Filter
{{for data.ports}}
- {{:helper.link(value.f_type ? value.f_type : 'None', null, {'command' : 'switch_filter', 'mode' : value.f_type, 'dir' : value.dir}, value.filter ? null : 'disabled', value.f_type ? 'selected' : null)}}
+ {{:helper.link(value.f_type ? value.f_type : 'None', null, {'command' : 'switch_filter', 'mode' : value.f_type, 'dir' : value.dir}, value.atmo_filter ? null : 'disabled', value.f_type ? 'selected' : null)}}
{{/for}}
diff --git a/nano/templates/sleeper.tmpl b/nano/templates/sleeper.tmpl
index edcb7b725d2..a0e9da787c5 100644
--- a/nano/templates/sleeper.tmpl
+++ b/nano/templates/sleeper.tmpl
@@ -49,7 +49,7 @@
{{:helper.displayBar(data.tox, 0, 100, (data.tox <= 25) ? 'good' : (data.tox <= 50) ? 'average' : 'bad')}}{{:helper.round(data.tox)}}
- {{:helper.link(data.filtering ? "Dialysis active" : "Dialysis inactive", null, {'filter' : !data.filtering})}}
+ {{:helper.link(data.filtering ? "Dialysis active" : "Dialysis inactive", null, {'sleeper_filter' : !data.filtering})}}
{{:helper.link("Eject occupant", null, {'eject' : 0})}}
diff --git a/polaris.dme b/polaris.dme
index 57ac9141833..5f12fb45653 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -234,6 +234,7 @@
#include "code\datums\outfits\spec_op.dm"
#include "code\datums\outfits\tournament.dm"
#include "code\datums\outfits\wizardry.dm"
+#include "code\datums\outfits\costumes\halloween.dm"
#include "code\datums\outfits\jobs\_defines.dm"
#include "code\datums\outfits\jobs\cargo.dm"
#include "code\datums\outfits\jobs\civilian.dm"
@@ -1042,6 +1043,8 @@
#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm"
+#include "code\game\objects\structures\flora\grass.dm"
+#include "code\game\objects\structures\flora\trees.dm"
#include "code\game\objects\structures\ghost_pods\ghost_pods.dm"
#include "code\game\objects\structures\ghost_pods\silicon.dm"
#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm"
@@ -1290,6 +1293,8 @@
#include "code\modules\clothing\masks\miscellaneous.dm"
#include "code\modules\clothing\masks\monitor.dm"
#include "code\modules\clothing\masks\voice.dm"
+#include "code\modules\clothing\rings\material.dm"
+#include "code\modules\clothing\rings\rings.dm"
#include "code\modules\clothing\shoes\boots.dm"
#include "code\modules\clothing\shoes\colour.dm"
#include "code\modules\clothing\shoes\leg_guards.dm"
diff --git a/sound/ambience/alarm4.ogg b/sound/ambience/alarm4.ogg
index a86bfd155f8..0df767c0d23 100644
Binary files a/sound/ambience/alarm4.ogg and b/sound/ambience/alarm4.ogg differ
diff --git a/sound/ambience/alarm4old.ogg b/sound/ambience/alarm4old.ogg
new file mode 100644
index 00000000000..a86bfd155f8
Binary files /dev/null and b/sound/ambience/alarm4old.ogg differ