diff --git a/code/datums/supplypacks/recreation_vr.dm b/code/datums/supplypacks/recreation_vr.dm
index 8471bce6ef7..8eb64c7c293 100644
--- a/code/datums/supplypacks/recreation_vr.dm
+++ b/code/datums/supplypacks/recreation_vr.dm
@@ -93,7 +93,7 @@
contains = list(
/obj/item/weapon/storage/smolebrickcase, /obj/item/weapon/storage/smolebrickcase,
)
- cost = 200
+ cost = 50
containertype = /obj/structure/closet/crate
containername = "Smole Bulding Brick crate"
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index c48f98fc334..eff908c8982 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -67,9 +67,8 @@
//Tanning!
for(var/obj/item/stack/hairlesshide/HH in washing)
- var/obj/item/stack/WL = new HH.wet_type(src)
- if(istype(WL))
- WL.amount = HH.amount
+ var/obj/item/stack/wetleather/WL = new(src)
+ WL.amount = HH.amount
washing -= HH
HH.forceMove(get_turf(src))
HH.use(HH.amount)
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 3076d2dfb8f..c48f57e693a 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -1,14 +1,18 @@
/obj/item/stack/animalhide
name = "hide"
desc = "The hide of some creature."
+ description_info = "Use something sharp, like a knife, to scrape the hairs/feathers/etc off this hide to prepare it for tanning."
icon_state = "sheet-hide"
drop_sound = 'sound/items/drop/cloth.ogg'
pickup_sound = 'sound/items/pickup/cloth.ogg'
amount = 1
+ max_amount = 20
stacktype = "hide"
no_variants = TRUE
-
- var/process_type = /obj/item/stack/hairlesshide
+// This needs to be very clearly documented for players. Whether it should stay in the main description is up for debate.
+/obj/item/stack/animalhide/examine(var/mob/user)
+ . = ..()
+ . += description_info
/obj/item/stack/animalhide/human
name = "skin"
@@ -18,7 +22,6 @@
no_variants = FALSE
drop_sound = 'sound/items/drop/leather.ogg'
pickup_sound = 'sound/items/pickup/leather.ogg'
- amount = 1
stacktype = "hide-human"
/obj/item/stack/animalhide/corgi
@@ -26,7 +29,6 @@
desc = "The by-product of corgi farming."
singular_name = "corgi hide piece"
icon_state = "sheet-corgi"
- amount = 1
stacktype = "hide-corgi"
/obj/item/stack/animalhide/cat
@@ -34,7 +36,6 @@
desc = "The by-product of cat farming."
singular_name = "cat hide piece"
icon_state = "sheet-cat"
- amount = 1
stacktype = "hide-cat"
/obj/item/stack/animalhide/monkey
@@ -42,7 +43,6 @@
desc = "The by-product of monkey farming."
singular_name = "monkey hide piece"
icon_state = "sheet-monkey"
- amount = 1
stacktype = "hide-monkey"
/obj/item/stack/animalhide/lizard
@@ -50,7 +50,6 @@
desc = "Sssssss..."
singular_name = "lizard skin piece"
icon_state = "sheet-lizard"
- amount = 1
stacktype = "hide-lizard"
/obj/item/stack/animalhide/xeno
@@ -58,7 +57,6 @@
desc = "The skin of a terrible creature."
singular_name = "alien hide piece"
icon_state = "sheet-xeno"
- amount = 1
stacktype = "hide-xeno"
//don't see anywhere else to put these, maybe together they could be used to make the xenos suit?
@@ -68,7 +66,6 @@
singular_name = "alien chitin piece"
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
- amount = 1
stacktype = "hide-chitin"
/obj/item/xenos_claw
@@ -88,19 +85,28 @@
if(has_edge(W) || is_sharp(W))
//visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
user.visible_message("\The [user] starts cutting hair off \the [src]", "You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh")
- if(do_after(user,50))
- to_chat(user, "You cut the hair from this [src.singular_name]")
+ var/scraped = 0
+ while(amount > 0 && do_after(user, 2.5 SECONDS)) // 2.5s per hide
//Try locating an exisitng stack on the tile and add to there if possible
- for(var/obj/item/stack/hairlesshide/HS in user.loc)
- if(HS.amount < 50 && istype(HS, process_type))
- HS.amount++
- src.use(1)
- return
- //If it gets to here it means it did not find a suitable stack on the tile.
- var/obj/item/stack/HS = new process_type(usr.loc)
- if(istype(HS))
- HS.amount = 1
+ var/obj/item/stack/hairlesshide/H = null
+ for(var/obj/item/stack/hairlesshide/HS in user.loc) // Could be scraping something inside a locker, hence the .loc, not get_turf
+ if(HS.amount < HS.max_amount)
+ H = HS
+ break
+
+ // Either we found a valid stack, in which case increment amount,
+ // Or we need to make a new stack
+ if(istype(H))
+ H.amount++
+ else
+ H = new /obj/item/stack/hairlesshide(user.loc)
+
+ // Increment the amount
src.use(1)
+ scraped++
+
+ if(scraped)
+ to_chat(user, SPAN_NOTICE("You scrape the hair off [scraped] hide\s."))
else
..()
@@ -110,31 +116,43 @@
/obj/item/stack/hairlesshide
name = "hairless hide"
desc = "This hide was stripped of it's hair, but still needs tanning."
+ description_info = "Get it wet to continue tanning this into leather.
\
+ You could set it in a river, wash it with a sink, or just splash water on it with a bucket."
singular_name = "hairless hide piece"
icon_state = "sheet-hairlesshide"
no_variants = FALSE
- amount = 1
+ max_amount = 20
stacktype = "hairlesshide"
- var/cleaning = FALSE // Can we be water_acted, or are we busy? To prevent accidental hide duplication and the collapse of causality.
- var/wet_type = /obj/item/stack/wetleather
+/obj/item/stack/hairlesshide/examine(var/mob/user)
+ . = ..()
+ . += description_info
/obj/item/stack/hairlesshide/water_act(var/wateramount)
- ..()
- cleaning = TRUE
- while(amount > 0 && wateramount > 0)
- use(1)
- wateramount--
- new wet_type(get_turf(src))
- cleaning = FALSE
+ . = ..()
+ wateramount = min(amount, round(wateramount))
+ for(var/i in 1 to wateramount)
+ var/obj/item/stack/wetleather/H = null
+ for(var/obj/item/stack/wetleather/HS in get_turf(src)) // Doesn't have a user, can't just use their loc
+ if(HS.amount < HS.max_amount)
+ H = HS
+ break
+
+ // Either we found a valid stack, in which case increment amount,
+ // Or we need to make a new stack
+ if(istype(H))
+ H.amount++
+ else
+ H = new /obj/item/stack/wetleather(get_turf(src))
- return
+ // Increment the amount
+ src.use(1)
/obj/item/stack/hairlesshide/proc/rapidcure(var/stacknum = 1)
stacknum = min(stacknum, amount)
while(stacknum)
- var/obj/item/stack/wetleather/I = new wet_type(get_turf(src))
+ var/obj/item/stack/wetleather/I = new /obj/item/stack/wetleather(get_turf(src))
if(istype(I))
I.dry()
@@ -146,16 +164,34 @@
/obj/item/stack/wetleather
name = "wet leather"
desc = "This leather has been cleaned but still needs to be dried."
+ description_info = "To finish tanning the leather, you need to dry it. \
+ You could place it under a fire, \
+ put it in a drying rack, \
+ or build a tanning rack from steel or wooden boards."
singular_name = "wet leather piece"
icon_state = "sheet-wetleather"
var/wetness = 30 //Reduced when exposed to high temperautres
var/drying_threshold_temperature = 500 //Kelvin to start drying
no_variants = FALSE
- amount = 1
+ max_amount = 20
stacktype = "wetleather"
var/dry_type = /obj/item/stack/material/leather
+/obj/item/stack/wetleather/examine(var/mob/user)
+ . = ..()
+ . += description_info
+ . += "\The [src] is [get_dryness_text()]."
+
+/obj/item/stack/wetleather/proc/get_dryness_text()
+ if(wetness > 20)
+ return "wet"
+ if(wetness > 10)
+ return "damp"
+ if(wetness)
+ return "almost dry"
+ return "dry"
+
/obj/item/stack/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
if(exposed_temperature >= drying_threshold_temperature)
@@ -164,17 +200,87 @@
dry()
/obj/item/stack/wetleather/proc/dry()
- //Try locating an exisitng stack on the tile and add to there if possible
- for(var/obj/item/stack/material/leather/HS in src.loc)
- if(HS.amount < 50)
- HS.amount++
- wetness = initial(wetness)
- src.use(1)
- return
- //If it gets to here it means it did not find a suitable stack on the tile.
- var/obj/item/stack/HS = new dry_type(src.loc)
+ var/obj/item/stack/material/leather/L = new(src.loc)
+ L.amount = amount
+ use(amount)
+ return L
- if(istype(HS))
- HS.amount = 1
- wetness = initial(wetness)
- src.use(1)
+/obj/item/stack/wetleather/transfer_to(obj/item/stack/S, var/tamount=null, var/type_verified)
+ . = ..()
+ if(.) // If it transfers any, do a weighted average of the wetness
+ var/obj/item/stack/wetleather/W = S
+ var/oldamt = W.amount - .
+ W.wetness = round(((oldamt * W.wetness) + (. * wetness)) / W.amount)
+
+
+
+/obj/structure/tanning_rack
+ name = "tanning rack"
+ desc = "A rack used to stretch leather out and hold it taut during the tanning process."
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "spike"
+
+ var/obj/item/stack/wetleather/drying = null
+
+/obj/structure/tanning_rack/Initialize()
+ . = ..()
+ START_PROCESSING(SSobj, src) // SSObj fires ~every 2s , starting from wetness 30 takes ~1m
+
+/obj/structure/tanning_rack/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/structure/tanning_rack/process()
+ if(drying && drying.wetness)
+ drying.wetness = max(drying.wetness - 1, 0)
+ if(!drying.wetness)
+ visible_message("The [drying] is dry!")
+ update_icon()
+
+/obj/structure/tanning_rack/examine(var/mob/user)
+ . = ..()
+ if(drying)
+ . += "\The [drying] is [drying.get_dryness_text()]."
+
+/obj/structure/tanning_rack/update_icon()
+ overlays.Cut()
+ if(drying)
+ var/image/I
+ if(drying.wetness)
+ I = image(icon, "leather_wet")
+ else
+ I = image(icon, "leather_dry")
+ add_overlay(I)
+
+/obj/structure/tanning_rack/attackby(var/atom/A, var/mob/user)
+ if(istype(A, /obj/item/stack/wetleather))
+ if(!drying) // If not drying anything, start drying the thing
+ if(user.unEquip(A, target = src))
+ drying = A
+ else // Drying something, add if possible
+ var/obj/item/stack/wetleather/W = A
+ W.transfer_to(drying, W.amount, TRUE)
+ update_icon()
+ return TRUE
+ return ..()
+
+/obj/structure/tanning_rack/attack_hand(var/mob/user)
+ if(drying)
+ var/obj/item/stack/S = drying
+ if(!drying.wetness) // If it's dry, make a stack of dry leather and prepare to put that in their hands
+ var/obj/item/stack/material/leather/L = new(src)
+ L.amount = drying.amount
+ drying.use(drying.amount)
+ S = L
+
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(!H.put_in_any_hand_if_possible(S))
+ S.forceMove(get_turf(src))
+ else
+ S.forceMove(get_turf(src))
+ drying = null
+ update_icon()
+
+/obj/structure/tanning_rack/attack_robot(var/mob/user)
+ attack_hand(user) // That has checks to
\ No newline at end of file
diff --git a/code/game/objects/structures/cliff.dm b/code/game/objects/structures/cliff.dm
index ad4b23bdb86..24dbb6d25e0 100644
--- a/code/game/objects/structures/cliff.dm
+++ b/code/game/objects/structures/cliff.dm
@@ -195,27 +195,45 @@ two tiles on initialization, and which way a cliff is facing may change during m
displaced = TRUE
if(istype(T))
- visible_message(span("danger", "\The [L] falls off \the [src]!"))
+
+ var/safe_fall = FALSE
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ safe_fall = H.species.handle_falling(H, T, silent = TRUE, planetary = FALSE)
+
+ if(safe_fall)
+ visible_message(span("notice", "\The [L] glides down from \the [src]."))
+ else
+ visible_message(span("danger", "\The [L] falls off \the [src]!"))
L.forceMove(T)
- // Do the actual hurting. Double cliffs do halved damage due to them most likely hitting twice.
var/harm = !is_double_cliff ? 1 : 0.5
- if(istype(L.buckled, /obj/vehicle)) // People falling off in vehicles will take less damage, but will damage the vehicle severely.
- var/obj/vehicle/vehicle = L.buckled
- vehicle.adjust_health(40 * harm)
- to_chat(L, span("warning", "\The [vehicle] absorbs some of the impact, damaging it."))
- harm /= 2
+ if(!safe_fall)
+ // Do the actual hurting. Double cliffs do halved damage due to them most likely hitting twice.
+ if(istype(L.buckled, /obj/vehicle)) // People falling off in vehicles will take less damage, but will damage the vehicle severely.
+ var/obj/vehicle/vehicle = L.buckled
+ vehicle.adjust_health(40 * harm)
+ to_chat(L, span("warning", "\The [vehicle] absorbs some of the impact, damaging it."))
+ harm /= 2
+
+ playsound(L, 'sound/effects/break_stone.ogg', 70, 1)
+ L.Weaken(5 * harm)
- playsound(L, 'sound/effects/break_stone.ogg', 70, 1)
- L.Weaken(5 * harm)
var/fall_time = 3
if(displaced) // Make the fall look more natural when falling sideways.
L.pixel_z = 32 * 2
animate(L, pixel_z = 0, time = fall_time)
sleep(fall_time) // A brief delay inbetween the two sounds helps sell the 'ouch' effect.
+
+ if(safe_fall)
+ visible_message(span("notice", "\The [L] lands on \the [T]."))
+ playsound(L, "rustle", 25, 1)
+ return
+
playsound(L, "punch", 70, 1)
shake_camera(L, 1, 1)
- visible_message(span("danger", "\The [L] hits the ground!"))
+
+ visible_message(span("danger", "\The [L] hits \the [T]!"))
// The bigger they are, the harder they fall.
// They will take at least 20 damage at the minimum, and tries to scale up to 40% of their max health.
diff --git a/code/modules/ai/interfaces.dm b/code/modules/ai/interfaces.dm
index 74ad2eb1a44..9fb58dbb882 100644
--- a/code/modules/ai/interfaces.dm
+++ b/code/modules/ai/interfaces.dm
@@ -52,7 +52,7 @@
return say(message)
/mob/living/proc/IIsAlly(mob/living/L)
- return src.faction == L.faction
+ return istype(L) && src.faction == L.faction
/mob/living/simple_mob/IIsAlly(mob/living/L)
. = ..()
diff --git a/code/modules/food/kitchen/smartfridge.dm b/code/modules/food/kitchen/smartfridge.dm
index d776e452965..a6def6bd2b0 100644
--- a/code/modules/food/kitchen/smartfridge.dm
+++ b/code/modules/food/kitchen/smartfridge.dm
@@ -187,10 +187,10 @@
for(var/obj/item/stack/wetleather/WL in I.instances)
if(!WL.wetness)
- if(WL.amount == 1)
+ if(WL.amount)
WL.forceMove(get_turf(src))
+ WL.dry()
I.instances -= WL
- WL.dry()
break
WL.wetness = max(0, WL.wetness - rand(1, 3))
diff --git a/code/modules/gamemaster/event2/events/security/prison_break.dm b/code/modules/gamemaster/event2/events/security/prison_break.dm
index 9cf3e9aac64..4684f0ae177 100644
--- a/code/modules/gamemaster/event2/events/security/prison_break.dm
+++ b/code/modules/gamemaster/event2/events/security/prison_break.dm
@@ -211,7 +211,7 @@
/datum/event2/event/prison_break/proc/flicker_area()
for(var/area/A in areas_to_break)
var/obj/machinery/power/apc/apc = A.get_apc()
- if(apc.operating) //If the apc's off, it's a little hard to overload the lights.
+ if(istype(apc) && apc.operating) //If the apc's off, it's a little hard to overload the lights.
for(var/obj/machinery/light/L in A)
L.flicker(10)
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index a97ec22b77e..c1239b234c9 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -1,276 +1,278 @@
-/datum/material/proc/get_recipes()
- if(!recipes)
- generate_recipes()
- return recipes
-
-/datum/material/proc/generate_recipes()
- recipes = list()
-
- // If is_brittle() returns true, these are only good for a single strike.
- recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] armor plate insert", /obj/item/weapon/material/armor_plating/insert, 2, time = 40, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
-
- 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]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
-
- if(hardness>50)
- recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] defense wire", /obj/item/weapon/material/barbedwire, 10, time = 1 MINUTE, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
-
-/datum/material/steel/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe_list("office chairs",list( \
- new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") \
- ))
- recipes += new/datum/stack_recipe_list("comfy chairs", list( \
- new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("yellow comfy chair", /obj/structure/bed/chair/comfy/yellow, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("orange comfy chair", /obj/structure/bed/chair/comfy/orange, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- ))
- recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("bench frame", /obj/structure/table/bench, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
- //recipes += new/datum/stack_recipe("fire axe cabinet frame", /obj/item/frame/fireaxe_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1)
- recipes += new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 50, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe_list("airlock assemblies", list( \
- new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("eng atmos airlock assembly", /obj/structure/door_assembly/door_assembly_eat, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("voidcraft airlock assembly horizontal", /obj/structure/door_assembly/door_assembly_voidcraft, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("voidcraft airlock assembly vertical", /obj/structure/door_assembly/door_assembly_voidcraft/vertical, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- ))
- //recipes += new/datum/stack_recipe("IV drip", /obj/machinery/iv_drip, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Removal
- recipes += new/datum/stack_recipe("medical stand", /obj/structure/medical_stand, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Replacement
- recipes += new/datum/stack_recipe("conveyor switch", /obj/machinery/conveyor_switch, 2, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("floor lamp fixture frame", /obj/machinery/light_construct/flamp, 2, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("apc frame", /obj/item/frame/apc, 2, recycle_material = "[name]")
- recipes += new/datum/stack_recipe_list("modular computer frames", list( \
- new/datum/stack_recipe("modular console frame", /obj/item/modular_computer/console, 20, recycle_material = "[name]"),\
- new/datum/stack_recipe("modular telescreen frame", /obj/item/modular_computer/telescreen, 10, recycle_material = "[name]"),\
- new/datum/stack_recipe("modular laptop frame", /obj/item/modular_computer/laptop, 10, recycle_material = "[name]"),\
- new/datum/stack_recipe("modular tablet frame", /obj/item/modular_computer/tablet, 5, recycle_material = "[name]"),\
- ))
- recipes += new/datum/stack_recipe_list("filing cabinets", list( \
- new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("tall filing cabinet", /obj/structure/filingcabinet/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
- ))
- recipes += new/datum/stack_recipe("desk bell", /obj/item/weapon/deskbell, 1, on_floor = 1, supplied_material = "[name]")
-
-/datum/material/plasteel/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("knife grip", /obj/item/weapon/material/butterflyhandle, 4, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]")
- recipes += new/datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor/dark, 1, 4, 20, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("whetstone", /obj/item/weapon/whetstone, 2, time = 10, recycle_material = "[name]")
-
-/datum/material/stone/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
-
-/datum/material/stone/marble/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("light marble floor tile", /obj/item/stack/tile/wmarble, 1, 4, 20, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("dark marble floor tile", /obj/item/stack/tile/bmarble, 1, 4, 20, recycle_material = "[name]")
-
-/datum/material/plastic/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 500u
- recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 250u
- recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 100u
- recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("plastic fishtank", /obj/item/glass_jar/fish/plastic, 2, time = 30 SECONDS, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("reagent tubing", /obj/item/stack/hose, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
-
-/datum/material/wood/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
- 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, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") //VOREStation Add
- recipes += new/datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1, recycle_material = "[name]")
-
-/datum/material/wood/log/generate_recipes()
- recipes = list()
- recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE, recycle_material = "[name]")
-
-/datum/material/cardboard/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe_list("folders",list( \
- new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue, recycle_material = "[name]"), \
- new/datum/stack_recipe("grey folder", /obj/item/weapon/folder, recycle_material = "[name]"), \
- new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red, recycle_material = "[name]"), \
- new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white, recycle_material = "[name]"), \
- new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow, recycle_material = "[name]"), \
- ))
-
-/datum/material/snow/generate_recipes()
- recipes = list()
- recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("snow brick", /obj/item/stack/material/snowbrick, 2, time = 10, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("snowman", /obj/structure/snowman, 2, time = 15, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("snow robot", /obj/structure/snowman/borg, 2, time = 10, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("snow spider", /obj/structure/snowman/spider, 3, time = 20, recycle_material = "[name]")
-
-/datum/material/snowbrick/generate_recipes()
- recipes = list()
- recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
- recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
- recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
- recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
- recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
- recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
- recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
- recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
-
-/datum/material/wood/sif/generate_recipes()
- ..()
- recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20, pass_stack_color = TRUE)
- for(var/datum/stack_recipe/r_recipe in recipes)
- if(r_recipe.title == "wood floor tile")
- recipes -= r_recipe
- continue
- if(r_recipe.title == "wooden chair")
- recipes -= r_recipe
- continue
-
-/datum/material/supermatter/generate_recipes()
- recipes = list()
- recipes += new/datum/stack_recipe("supermatter shard", /obj/machinery/power/supermatter/shard, 30 , one_per_turf = 1, time = 600, on_floor = 1, recycle_material = "[name]")
-
-/datum/material/cloth/generate_recipes()
- recipes = list()
- recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
- recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
-
-/datum/material/resin/generate_recipes()
- recipes = list()
- recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door/resin, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] barricade", /obj/effect/alien/resin/wall, 5, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("[display_name] nest", /obj/structure/bed/nest, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder/resin, 2, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] membrane", /obj/effect/alien/resin/membrane, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS, recycle_material = "[name]")
-
-/datum/material/leather/generate_recipes()
- recipes = list()
- recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
- recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
- recipes += new/datum/stack_recipe("whip", /obj/item/weapon/material/whip, 5, time = 15 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
+/datum/material/proc/get_recipes()
+ if(!recipes)
+ generate_recipes()
+ return recipes
+
+/datum/material/proc/generate_recipes()
+ recipes = list()
+
+ // If is_brittle() returns true, these are only good for a single strike.
+ recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] armor plate insert", /obj/item/weapon/material/armor_plating/insert, 2, time = 40, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+
+ 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]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+
+ if(hardness>50)
+ recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] defense wire", /obj/item/weapon/material/barbedwire, 10, time = 1 MINUTE, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+
+/datum/material/steel/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe_list("office chairs",list( \
+ new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") \
+ ))
+ recipes += new/datum/stack_recipe_list("comfy chairs", list( \
+ new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("yellow comfy chair", /obj/structure/bed/chair/comfy/yellow, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("orange comfy chair", /obj/structure/bed/chair/comfy/orange, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ ))
+ recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("bench frame", /obj/structure/table/bench, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
+ //recipes += new/datum/stack_recipe("fire axe cabinet frame", /obj/item/frame/fireaxe_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1)
+ recipes += new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 50, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe_list("airlock assemblies", list( \
+ new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("eng atmos airlock assembly", /obj/structure/door_assembly/door_assembly_eat, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("voidcraft airlock assembly horizontal", /obj/structure/door_assembly/door_assembly_voidcraft, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("voidcraft airlock assembly vertical", /obj/structure/door_assembly/door_assembly_voidcraft/vertical, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ ))
+ //recipes += new/datum/stack_recipe("IV drip", /obj/machinery/iv_drip, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Removal
+ recipes += new/datum/stack_recipe("medical stand", /obj/structure/medical_stand, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Replacement
+ recipes += new/datum/stack_recipe("conveyor switch", /obj/machinery/conveyor_switch, 2, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("floor lamp fixture frame", /obj/machinery/light_construct/flamp, 2, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("apc frame", /obj/item/frame/apc, 2, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe_list("modular computer frames", list( \
+ new/datum/stack_recipe("modular console frame", /obj/item/modular_computer/console, 20, recycle_material = "[name]"),\
+ new/datum/stack_recipe("modular telescreen frame", /obj/item/modular_computer/telescreen, 10, recycle_material = "[name]"),\
+ new/datum/stack_recipe("modular laptop frame", /obj/item/modular_computer/laptop, 10, recycle_material = "[name]"),\
+ new/datum/stack_recipe("modular tablet frame", /obj/item/modular_computer/tablet, 5, recycle_material = "[name]"),\
+ ))
+ recipes += new/datum/stack_recipe_list("filing cabinets", list( \
+ new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("tall filing cabinet", /obj/structure/filingcabinet/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
+ ))
+ recipes += new/datum/stack_recipe("desk bell", /obj/item/weapon/deskbell, 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]")
+
+/datum/material/plasteel/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("knife grip", /obj/item/weapon/material/butterflyhandle, 4, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor/dark, 1, 4, 20, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("whetstone", /obj/item/weapon/whetstone, 2, time = 10, recycle_material = "[name]")
+
+/datum/material/stone/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
+
+/datum/material/stone/marble/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe("light marble floor tile", /obj/item/stack/tile/wmarble, 1, 4, 20, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("dark marble floor tile", /obj/item/stack/tile/bmarble, 1, 4, 20, recycle_material = "[name]")
+
+/datum/material/plastic/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 500u
+ recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 250u
+ recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 100u
+ recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("plastic fishtank", /obj/item/glass_jar/fish/plastic, 2, time = 30 SECONDS, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("reagent tubing", /obj/item/stack/hose, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
+
+/datum/material/wood/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ 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, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") //VOREStation Add
+ recipes += new/datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]")
+
+/datum/material/wood/log/generate_recipes()
+ recipes = list()
+ recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE, recycle_material = "[name]")
+
+/datum/material/cardboard/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe_list("folders",list( \
+ new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue, recycle_material = "[name]"), \
+ new/datum/stack_recipe("grey folder", /obj/item/weapon/folder, recycle_material = "[name]"), \
+ new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red, recycle_material = "[name]"), \
+ new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white, recycle_material = "[name]"), \
+ new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow, recycle_material = "[name]"), \
+ ))
+
+/datum/material/snow/generate_recipes()
+ recipes = list()
+ recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("snow brick", /obj/item/stack/material/snowbrick, 2, time = 10, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("snowman", /obj/structure/snowman, 2, time = 15, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("snow robot", /obj/structure/snowman/borg, 2, time = 10, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("snow spider", /obj/structure/snowman/spider, 3, time = 20, recycle_material = "[name]")
+
+/datum/material/snowbrick/generate_recipes()
+ recipes = list()
+ recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+
+/datum/material/wood/sif/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20, pass_stack_color = TRUE)
+ for(var/datum/stack_recipe/r_recipe in recipes)
+ if(r_recipe.title == "wood floor tile")
+ recipes -= r_recipe
+ continue
+ if(r_recipe.title == "wooden chair")
+ recipes -= r_recipe
+ continue
+
+/datum/material/supermatter/generate_recipes()
+ recipes = list()
+ recipes += new/datum/stack_recipe("supermatter shard", /obj/machinery/power/supermatter/shard, 30 , one_per_turf = 1, time = 600, on_floor = 1, recycle_material = "[name]")
+
+/datum/material/cloth/generate_recipes()
+ recipes = list()
+ recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
+
+/datum/material/resin/generate_recipes()
+ recipes = list()
+ recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door/resin, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] barricade", /obj/effect/alien/resin/wall, 5, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] nest", /obj/structure/bed/nest, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder/resin, 2, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] membrane", /obj/effect/alien/resin/membrane, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS, recycle_material = "[name]")
+
+/datum/material/leather/generate_recipes()
+ recipes = list()
+ recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
+ recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("whip", /obj/item/weapon/material/whip, 5, time = 15 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
diff --git a/code/modules/mob/freelook/chunk.dm b/code/modules/mob/freelook/chunk.dm
index 5f59d2e737e..da2d84701ca 100644
--- a/code/modules/mob/freelook/chunk.dm
+++ b/code/modules/mob/freelook/chunk.dm
@@ -88,7 +88,7 @@
for(var/turf in visAdded)
var/turf/t = turf
- if(t.obfuscations[obfuscation.type])
+ if(LAZYLEN(t.obfuscations) && t.obfuscations[obfuscation.type])
obscured -= t.obfuscations[obfuscation.type]
for(var/eye in seenby)
var/mob/observer/eye/m = eye
diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
index f87f0de9dd7..82527c040f4 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
@@ -307,31 +307,6 @@
genders = list(MALE, FEMALE, PLURAL, NEUTER)
wikilink="https://wiki.vore-station.net/Diona"
-/datum/species/teshari
- mob_size = MOB_MEDIUM //To allow normal mob swapping
- spawn_flags = SPECIES_CAN_JOIN
- icobase = 'icons/mob/human_races/r_teshari_vr.dmi'
- deform = 'icons/mob/human_races/r_teshari_vr.dmi'
- icobase_tail = 1
- color_mult = 1
- min_age = 18
- push_flags = ~HEAVY //Allows them to use micro step code.
- swap_flags = ~HEAVY
- gluttonous = 0
- genders = list(MALE, FEMALE, PLURAL, NEUTER)
- descriptors = list()
- wikilink="https://wiki.vore-station.net/Teshari"
- agility = 90
-
- male_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg')
- female_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg')
-
- inherent_verbs = list(
- /mob/living/carbon/human/proc/sonar_ping,
- /mob/living/proc/hide,
- /mob/living/proc/toggle_pass_table
- )
-
/datum/species/human
color_mult = 1
icobase = 'icons/mob/human_races/r_human_vr.dmi'
diff --git a/code/modules/mob/living/carbon/human/species/station/teshari.dm b/code/modules/mob/living/carbon/human/species/station/teshari.dm
index 3686ef72555..a1fbf3865c3 100644
--- a/code/modules/mob/living/carbon/human/species/station/teshari.dm
+++ b/code/modules/mob/living/carbon/human/species/station/teshari.dm
@@ -162,7 +162,7 @@
// without parachute, or falling bird without free wings goes splat.
// Are we landing from orbit, or handcuffed/unconscious/tied to something?
- if(planetary || !istype(H) || H.incapacitated())
+ if(planetary || !istype(H) || H.incapacitated(INCAPACITATION_DEFAULT|INCAPACITATION_DISABLED))
return ..()
// Are we landing on a turf? Not sure how this could not be the case, but let's be safe.
@@ -201,7 +201,7 @@
// Handled!
if(!silent)
to_chat(H, SPAN_NOTICE("You catch the air in your wings and greatly slow your fall."))
- H.visible_message(SPAN_NOTICE("\The [H] glides down from above, landing safely."))
- H.Stun(2)
+ landing.visible_message(SPAN_NOTICE("\The [H] glides down from above, landing safely."))
+ H.Stun(1)
playsound(H, "rustle", 25, 1)
return TRUE
diff --git a/code/modules/mob/living/carbon/human/species/station/teshari_vr.dm b/code/modules/mob/living/carbon/human/species/station/teshari_vr.dm
new file mode 100644
index 00000000000..b0c42c8cac4
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/station/teshari_vr.dm
@@ -0,0 +1,24 @@
+/datum/species/teshari
+ mob_size = MOB_MEDIUM //To allow normal mob swapping
+ spawn_flags = SPECIES_CAN_JOIN
+ icobase = 'icons/mob/human_races/r_teshari_vr.dmi'
+ deform = 'icons/mob/human_races/r_teshari_vr.dmi'
+ icobase_tail = 1
+ color_mult = 1
+ min_age = 18
+ push_flags = ~HEAVY //Allows them to use micro step code.
+ swap_flags = ~HEAVY
+ gluttonous = 0
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
+ descriptors = list()
+ wikilink="https://wiki.vore-station.net/Teshari"
+ agility = 90
+
+ male_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg')
+ female_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg')
+
+ inherent_verbs = list(
+ /mob/living/carbon/human/proc/sonar_ping,
+ /mob/living/proc/hide,
+ /mob/living/proc/toggle_pass_table
+ )
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 69c10d61526..fc9ee91e9f7 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -1,1270 +1,1261 @@
-/*
- Global associative list for caching humanoid icons.
- Index format m or f, followed by a string of 0 and 1 to represent bodyparts followed by husk fat hulk skeleton 1 or 0.
-*/
-var/global/list/human_icon_cache = list() //key is incredibly complex, see update_icons_body()
-var/global/list/tail_icon_cache = list() //key is [species.race_key][r_skin][g_skin][b_skin]
-var/global/list/wing_icon_cache = list() // See tail.
-var/global/list/light_overlay_cache = list() //see make_worn_icon() on helmets
-var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
-
-////////////////////////////////////////////////////////////////////////////////////////////////
-// # Human Icon Updating System
-//
-// This system takes care of the "icon" for human mobs. Of course humans don't just have a single
-// icon+icon_state, but a combination of dozens of little sprites including including the body,
-// clothing, equipment, in-universe HUD images, etc.
-//
-// # Basic Operation
-// Whenever you do something that should update the on-mob appearance of a worn or held item, You
-// will need to call the relevant update_inv_* proc. All of these are named after the variable they
-// update from. They are defined at the /mob level so you don't even need to cast to carbon/human.
-//
-// The new system leverages SSoverlays to actually add/remove the overlays from mob.overlays
-// Since SSoverlays already manages batching updates to reduce apperance churn etc, we don't need
-// to worry about that. (In short, you can call add/cut overlay as many times as you want, it will
-// only get assigned to the mob once per tick.)
-// As a corrolary, this means users of this system do NOT need to tell the system when you're done
-// making changes.
-//
-// There are also these special cases:
-// update_icons_body() //Handles updating your mob's icon to reflect their gender/race/complexion etc
-// UpdateDamageIcon() //Handles damage overlays for brute/burn damage //(will rename this when I geta round to it) ~Carn
-// update_skin() //Handles updating skin for species that have a skin overlay.
-// update_bloodied() //Handles adding/clearing the blood overlays for hands & feet. Call when bloodied or cleaned.
-// update_underwear() //Handles updating the sprite for underwear.
-// update_hair() //Handles updating your hair and eyes overlay
-// update_mutations() //Handles updating your appearance for certain mutations. e.g TK head-glows
-// update_fire() //Handles overlay from being on fire.
-// update_water() //Handles overlay from being submerged.
-// update_surgery() //Handles overlays from open external organs.
-//
-// # History (i.e. I'm used to the old way, what is different?)
-// You used to have to call update_icons(FALSE) if you planned to make more changes, and call update_icons(TRUE)
-// on the final update. All that is gone, just call update_inv_whatever() and it handles the rest.
-//
-////////////////////////////////////////////////////////////////////////////////////////////////
-
-//Add an entry to overlays, assuming it exists
-/mob/living/carbon/human/proc/apply_layer(cache_index)
- if((. = overlays_standing[cache_index]))
- add_overlay(.)
-
-//Remove an entry from overlays, and from the list
-/mob/living/carbon/human/proc/remove_layer(cache_index)
- var/I = overlays_standing[cache_index]
- if(I)
- cut_overlay(I)
- overlays_standing[cache_index] = null
-
-// These are used as the layers for the icons, as well as indexes in a list that holds onto them.
-// Technically the layers used are all -100+layer to make them FLOAT_LAYER overlays.
-//Human Overlays Indexes/////////
-#define MUTATIONS_LAYER 1 //Mutations like fat, and lasereyes
-#define SKIN_LAYER 2 //Skin things added by a call on species
-#define BLOOD_LAYER 3 //Bloodied hands/feet/anything else
-#define DAMAGE_LAYER 4 //Injury overlay sprites like open wounds
-#define SURGERY_LAYER 5 //Overlays for open surgical sites
-#define UNDERWEAR_LAYER 6 //Underwear/bras/etc
-#define SHOES_LAYER_ALT 7 //Shoe-slot item (when set to be under uniform via verb)
-#define UNIFORM_LAYER 8 //Uniform-slot item
-#define ID_LAYER 9 //ID-slot item
-#define SHOES_LAYER 10 //Shoe-slot item
-#define GLOVES_LAYER 11 //Glove-slot item
-#define BELT_LAYER 12 //Belt-slot item
-#define SUIT_LAYER 13 //Suit-slot item
-#define TAIL_LAYER 14 //Some species have tails to render
-#define GLASSES_LAYER 15 //Eye-slot item
-#define BELT_LAYER_ALT 16 //Belt-slot item (when set to be above suit via verb)
-#define SUIT_STORE_LAYER 17 //Suit storage-slot item
-#define BACK_LAYER 18 //Back-slot item
-#define HAIR_LAYER 19 //The human's hair
-#define HAIR_ACCESSORY_LAYER 20 //VOREStation edit. Simply move this up a number if things are added.
-#define EARS_LAYER 21 //Both ear-slot items (combined image)
-#define EYES_LAYER 22 //Mob's eyes (used for glowing eyes)
-#define FACEMASK_LAYER 23 //Mask-slot item
-#define HEAD_LAYER 24 //Head-slot item
-#define HANDCUFF_LAYER 25 //Handcuffs, if the human is handcuffed, in a secret inv slot
-#define LEGCUFF_LAYER 26 //Same as handcuffs, for legcuffs
-#define L_HAND_LAYER 27 //Left-hand item
-#define R_HAND_LAYER 28 //Right-hand item
-#define WING_LAYER 29 //Wings or protrusions over the suit.
-#define TAIL_LAYER_ALT 30 //Modified tail-sprite layer. Tend to be larger.
-#define MODIFIER_EFFECTS_LAYER 31 //Effects drawn by modifiers
-#define FIRE_LAYER 32 //'Mob on fire' overlay layer
-#define WATER_LAYER 33 //'Mob submerged' overlay layer
-#define TARGETED_LAYER 34 //'Aimed at' overlay layer
-#define TOTAL_LAYERS 34 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
-//////////////////////////////////
-
-/mob/living/carbon/human
- var/list/overlays_standing[TOTAL_LAYERS]
- var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed
-
-//UPDATES OVERLAYS FROM OVERLAYS_LYING/OVERLAYS_STANDING
-//I'll work on removing that stuff by rewriting some of the cloaking stuff at a later date.
-/mob/living/carbon/human/update_icons()
- if(QDESTROYING(src))
- return
-
- crash_with("CANARY: Old human update_icons was called.")
-
- update_hud() //TODO: remove the need for this
-
- //Do any species specific layering updates, such as when hiding.
- update_icon_special()
-
-/mob/living/carbon/human/update_icons_layers()
- crash_with("CANARY: Old human update_icons_layers was called.")
-
-/mob/living/carbon/human/update_icons_all()
- crash_with("CANARY: Old human update_icons_all was called.")
-
-/mob/living/carbon/human/update_icons_huds()
- crash_with("CANARY: Old human update_icons_huds was called.")
-
-/mob/living/carbon/human/update_transform()
- /* VOREStation Edit START
- // First, get the correct size.
- var/desired_scale_x = icon_scale_x
- var/desired_scale_y = icon_scale_y
-
- desired_scale_x *= species.icon_scale_x
- desired_scale_y *= species.icon_scale_y
-
- for(var/datum/modifier/M in modifiers)
- if(!isnull(M.icon_scale_x_percent))
- desired_scale_x *= M.icon_scale_x_percent
- if(!isnull(M.icon_scale_y_percent))
- desired_scale_y *= M.icon_scale_y_percent
- */
- var/desired_scale_x = size_multiplier * icon_scale_x
- var/desired_scale_y = size_multiplier * icon_scale_y
- desired_scale_x *= species.icon_scale_x
- desired_scale_y *= species.icon_scale_y
- appearance_flags |= PIXEL_SCALE
- if(fuzzy)
- appearance_flags &= ~PIXEL_SCALE
- //VOREStation Edit End
-
- // Regular stuff again.
- var/matrix/M = matrix()
- var/anim_time = 3
-
- //Due to some involuntary means, you're laying now
- if(lying && !resting && !sleeping)
- anim_time = 1 //Thud
-
- if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone.
- M.Turn(90)
- M.Scale(desired_scale_y, desired_scale_x)//VOREStation Edit
- if(species.icon_height == 64)//VOREStation Edit
- M.Translate(13,-22)
- else
- M.Translate(1,-6)
- layer = MOB_LAYER -0.01 // Fix for a byond bug where turf entry order no longer matters
- else
- M.Scale(desired_scale_x, desired_scale_y)//VOREStation Edit
- M.Translate(0, (vis_height/2)*(desired_scale_y-1)) //VOREStation edit
- layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters
-
- animate(src, transform = M, time = anim_time)
- update_icon_special() //May contain transform-altering things
-
-//DAMAGE OVERLAYS
-//constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists
-/mob/living/carbon/human/UpdateDamageIcon()
- if(QDESTROYING(src))
- return
-
- remove_layer(DAMAGE_LAYER)
-
- // first check whether something actually changed about damage appearance
- var/damage_appearance = ""
-
- for(var/obj/item/organ/external/O in organs)
- if(isnull(O) || O.is_stump())
- continue
- damage_appearance += O.damage_state
-
- if(damage_appearance == previous_damage_appearance)
- // nothing to do here
- return
-
- previous_damage_appearance = damage_appearance
-
- var/image/standing_image = image(icon = species.damage_overlays, icon_state = "00", layer = BODY_LAYER+DAMAGE_LAYER)
-
- // blend the individual damage states with our icons
- for(var/obj/item/organ/external/O in organs)
- if(isnull(O) || O.is_stump() || O.is_hidden_by_tail())
- continue
-
- O.update_icon()
- if(O.damage_state == "00") continue
- var/icon/DI
- var/cache_index = "[O.damage_state]/[O.icon_name]/[species.get_blood_colour(src)]/[species.get_bodytype(src)]"
- if(damage_icon_parts[cache_index] == null)
- DI = icon(species.get_damage_overlays(src), O.damage_state) // the damage icon for whole human
- DI.Blend(icon(species.get_damage_mask(src), O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
- DI.Blend(species.get_blood_colour(src), ICON_MULTIPLY)
- damage_icon_parts[cache_index] = DI
- else
- DI = damage_icon_parts[cache_index]
-
- standing_image.overlays += DI
-
- overlays_standing[DAMAGE_LAYER] = standing_image
- apply_layer(DAMAGE_LAYER)
-
-//BASE MOB SPRITE
-/mob/living/carbon/human/update_icons_body()
- if(QDESTROYING(src))
- return
-
- var/husk_color_mod = rgb(96,88,80)
- var/hulk_color_mod = rgb(48,224,40)
-
- var/husk = (HUSK in src.mutations)
- var/fat = (FAT in src.mutations)
- var/hulk = (HULK in src.mutations)
- var/skeleton = (SKELETON in src.mutations)
-
- robolimb_count = 0 //TODO, here, really tho?
- robobody_count = 0
-
- //CACHING: Generate an index key from visible bodyparts.
- //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic.
-
- //Create a new, blank icon for our mob to use.
- var/icon/stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank")
-
- var/g = (gender == MALE ? "male" : "female")
- var/icon_key = "[species.get_race_key(src)][g][s_tone][r_skin][g_skin][b_skin]"
- if(lip_style)
- icon_key += "[lip_style]"
- else
- icon_key += "nolips"
- var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name[O_EYES]
- if(eyes)
- icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]"
- else
- icon_key += "[r_eyes], [g_eyes], [b_eyes]"
- var/obj/item/organ/external/head/head = organs_by_name[BP_HEAD]
- if(head)
- if(!istype(head, /obj/item/organ/external/stump))
- icon_key += "[head.eye_icon]"
- for(var/organ_tag in species.has_limbs)
- var/obj/item/organ/external/part = organs_by_name[organ_tag]
- if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff.
- icon_key += "0"
- continue
- if(part)
- icon_key += "[part.species.get_race_key(part.owner)]"
- icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]"
- icon_key += "[part.s_tone]"
- if(part.s_col && part.s_col.len >= 3)
- icon_key += "[rgb(part.s_col[1],part.s_col[2],part.s_col[3])]"
- if(part.body_hair && part.h_col && part.h_col.len >= 3)
- icon_key += "[rgb(part.h_col[1],part.h_col[2],part.h_col[3])]"
- if(species.color_mult)
- icon_key += "[ICON_MULTIPLY]"
- else
- icon_key += "[ICON_ADD]"
- else
- icon_key += "#000000"
-
- for(var/M in part.markings)
- icon_key += "[M][part.markings[M]["color"]]"
-
- if(part.robotic >= ORGAN_ROBOT)
- icon_key += "2[part.model ? "-[part.model]": ""]"
- robolimb_count++
- if((part.robotic == ORGAN_ROBOT || part.robotic == ORGAN_LIFELIKE) && (part.organ_tag == BP_HEAD || part.organ_tag == BP_TORSO || part.organ_tag == BP_GROIN))
- robobody_count ++
- else if(part.status & ORGAN_DEAD)
- icon_key += "3"
- else
- icon_key += "1"
- if(part.transparent) //VOREStation Edit. For better slime limbs. Avoids using solid var due to limb dropping.
- icon_key += "_t" //VOREStation Edit.
-
- if(istype(tail_style, /datum/sprite_accessory/tail/taur))
- if(tail_style.clip_mask) //VOREStation Edit.
- icon_key += tail_style.clip_mask_state
-
- icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
- var/icon/base_icon
- if(human_icon_cache[icon_key])
- base_icon = human_icon_cache[icon_key]
- else
- //BEGIN CACHED ICON GENERATION.
- var/obj/item/organ/external/chest = get_organ(BP_TORSO)
- base_icon = chest.get_icon()
-
- var/icon/Cutter = null
-
- if(istype(tail_style, /datum/sprite_accessory/tail/taur)) // Tail icon 'cookie cutters' are filled in where icons are preserved. We need to invert that.
- if(tail_style.clip_mask) //VOREStation Edit.
- Cutter = new(icon = tail_style.icon, icon_state = tail_style.clip_mask_state)
-
- Cutter.Blend("#000000", ICON_MULTIPLY) // Make it all black.
-
- Cutter.SwapColor("#00000000", "#FFFFFFFF") // Everywhere empty, make white.
- Cutter.SwapColor("#000000FF", "#00000000") // Everywhere black, make empty.
-
- Cutter.Blend("#000000", ICON_MULTIPLY) // Black again.
-
- for(var/obj/item/organ/external/part in organs)
- if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff.
- continue
- var/icon/temp = part.get_icon(skeleton)
-
- if((part.organ_tag in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) && Cutter)
- temp.Blend(Cutter, ICON_AND, x = -16)
-
- //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
- //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
- if(part.icon_position & (LEFT | RIGHT))
- var/icon/temp2 = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank")
- temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH)
- temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH)
- if(!(part.icon_position & LEFT))
- temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
- if(!(part.icon_position & RIGHT))
- temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
- base_icon.Blend(temp2, ICON_OVERLAY)
- if(part.icon_position & LEFT)
- temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
- if(part.icon_position & RIGHT)
- temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
- base_icon.Blend(temp2, ICON_UNDERLAY)
- else if(part.icon_position & UNDER)
- base_icon.Blend(temp, ICON_UNDERLAY)
- else
- base_icon.Blend(temp, ICON_OVERLAY)
-
- if(!skeleton)
- if(husk)
- base_icon.ColorTone(husk_color_mod)
- else if(hulk)
- var/list/tone = ReadRGB(hulk_color_mod)
- base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3]))
-
- //Handle husk overlay.
- if(husk && ("overlay_husk" in cached_icon_states(species.icobase)))
- var/icon/mask = new(base_icon)
- var/icon/husk_over = new(species.icobase,"overlay_husk")
- mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0)
- husk_over.Blend(mask, ICON_ADD)
- base_icon.Blend(husk_over, ICON_OVERLAY)
-
- human_icon_cache[icon_key] = base_icon
-
- //END CACHED ICON GENERATION.
- stand_icon.Blend(base_icon,ICON_OVERLAY)
- icon = stand_icon
-
- //tail
- update_tail_showing()
- update_wing_showing()
-
-/mob/living/carbon/human/proc/update_skin()
- if(QDESTROYING(src))
- return
-
- remove_layer(SKIN_LAYER)
-
- var/image/skin = species.update_skin(src)
- if(skin)
- skin.layer = BODY_LAYER+SKIN_LAYER
- overlays_standing[SKIN_LAYER] = skin
- apply_layer(SKIN_LAYER)
-
-/mob/living/carbon/human/proc/update_bloodied()
- if(QDESTROYING(src))
- return
-
- remove_layer(BLOOD_LAYER)
- if(!blood_DNA && !feet_blood_DNA)
- return
-
- var/image/both = image(icon = 'icons/effects/effects.dmi', icon_state = "nothing", layer = BODY_LAYER+BLOOD_LAYER)
-
- //Bloody hands
- if(blood_DNA)
- var/image/bloodsies = image(icon = species.get_blood_mask(src), icon_state = "bloodyhands", layer = BODY_LAYER+BLOOD_LAYER)
- bloodsies.color = hand_blood_color
- both.add_overlay(bloodsies)
-
- //Bloody feet
- if(feet_blood_DNA)
- var/image/bloodsies = image(icon = species.get_blood_mask(src), icon_state = "shoeblood", layer = BODY_LAYER+BLOOD_LAYER)
- bloodsies.color = feet_blood_color
- both.add_overlay(bloodsies)
-
- overlays_standing[BLOOD_LAYER] = both
-
- apply_layer(BLOOD_LAYER)
-
-//UNDERWEAR OVERLAY
-/mob/living/carbon/human/proc/update_underwear()
- if(QDESTROYING(src))
- return
-
- remove_layer(UNDERWEAR_LAYER)
-
- if(species.appearance_flags & HAS_UNDERWEAR)
- overlays_standing[UNDERWEAR_LAYER] = list()
- for(var/category in all_underwear)
- if(hide_underwear[category])
- continue
- var/datum/category_item/underwear/UWI = all_underwear[category]
- var/image/wear = UWI.generate_image(all_underwear_metadata[category], layer = BODY_LAYER+UNDERWEAR_LAYER)
- overlays_standing[UNDERWEAR_LAYER] += wear
-
- apply_layer(UNDERWEAR_LAYER)
-
-//HAIR OVERLAY
-/mob/living/carbon/human/proc/update_hair()
- if(QDESTROYING(src))
- return
-
- //Reset our hair
- remove_layer(HAIR_LAYER)
- remove_layer(HAIR_ACCESSORY_LAYER) //VOREStation Edit
- update_eyes() //Pirated out of here, for glowing eyes.
-
- var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD)
- if(!head_organ || head_organ.is_stump() )
- return
-
- //masks and helmets can obscure our hair.
- if( (head && (head.flags_inv & BLOCKHAIR)) || (wear_mask && (wear_mask.flags_inv & BLOCKHAIR)))
- return
-
- //base icons
- var/icon/face_standing = icon(icon = 'icons/mob/human_face.dmi', icon_state = "bald_s")
-
- if(f_style)
- var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
- if(facial_hair_style && facial_hair_style.species_allowed && (src.species.get_bodytype(src) in facial_hair_style.species_allowed))
- var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
- if(facial_hair_style.do_colouration)
- facial_s.Blend(rgb(r_facial, g_facial, b_facial), facial_hair_style.color_blend_mode)
-
- face_standing.Blend(facial_s, ICON_OVERLAY)
-
- if(h_style)
- var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style]
- if(head && (head.flags_inv & BLOCKHEADHAIR))
- if(!(hair_style.flags & HAIR_VERY_SHORT))
- hair_style = hair_styles_list["Short Hair"]
-
- if(hair_style && (src.species.get_bodytype(src) in hair_style.species_allowed))
- var/icon/grad_s = null
- var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
- var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s")
- if(hair_style.do_colouration)
- if(grad_style)
- grad_s = new/icon("icon" = 'icons/mob/hair_gradients.dmi', "icon_state" = GLOB.hair_gradients[grad_style])
- grad_s.Blend(hair_s, ICON_AND)
- grad_s.Blend(rgb(r_grad, g_grad, b_grad), ICON_MULTIPLY)
- hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_MULTIPLY)
- hair_s.Blend(hair_s_add, ICON_ADD)
- if(!isnull(grad_s))
- hair_s.Blend(grad_s, ICON_OVERLAY)
-
- face_standing.Blend(hair_s, ICON_OVERLAY)
-
- if(head_organ.nonsolid || head_organ.transparent)
- face_standing += rgb(,,,120)
-
- var/icon/ears_s = get_ears_overlay()
- if(ears_s)
- face_standing.Blend(ears_s, ICON_OVERLAY)
-
- overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ.head_offset)
- apply_layer(HAIR_LAYER)
- return
-
- // VOREStation Edit - START
- var/icon/hair_acc_s = get_hair_accessory_overlay()
- var/image/hair_acc_s_image = null
- if(hair_acc_s)
- if(hair_accessory_style.ignores_lighting)
- hair_acc_s_image = image(hair_acc_s)
- hair_acc_s_image.plane = PLANE_LIGHTING_ABOVE
- hair_acc_s_image.appearance_flags = appearance_flags
- if (hair_acc_s_image)
- overlays_standing[HAIR_ACCESSORY_LAYER] = hair_acc_s_image
- apply_layer(HAIR_ACCESSORY_LAYER)
- return
- overlays_standing[HAIR_ACCESSORY_LAYER] = image(hair_acc_s, layer = BODY_LAYER+HAIR_ACCESSORY_LAYER)
- apply_layer(HAIR_ACCESSORY_LAYER)
- // VOREStation Edit - END
-
-/mob/living/carbon/human/update_eyes()
- if(QDESTROYING(src))
- return
-
- //Reset our eyes
- remove_layer(EYES_LAYER)
-
- //TODO: Probably redo this. I know I wrote it, but...
-
- //This is ONLY for glowing eyes for now. Boring flat eyes are done by the head's own proc.
- if(!species.has_glowing_eyes)
- return
-
- //Our glowy eyes should be hidden if some equipment hides them.
- if(!should_have_organ(O_EYES) || (head && (head.flags_inv & BLOCKHAIR)) || (wear_mask && (wear_mask.flags_inv & BLOCKHAIR)))
- return
-
- //Get the head, we'll need it later.
- var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD)
- if(!head_organ || head_organ.is_stump() )
- return
-
- //The eyes store the color themselves, funny enough.
- var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name[O_EYES]
- if(!head_organ.eye_icon)
- return
-
- var/icon/eyes_icon = new/icon(head_organ.eye_icon_location, head_organ.eye_icon) //VOREStation Edit
- if(eyes)
- eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD)
- else
- eyes_icon.Blend(rgb(128,0,0), ICON_ADD)
-
- var/image/eyes_image = image(eyes_icon)
- eyes_image.plane = PLANE_LIGHTING_ABOVE
- eyes_image.appearance_flags = appearance_flags
-
- overlays_standing[EYES_LAYER] = eyes_image
- apply_layer(EYES_LAYER)
-
-/mob/living/carbon/human/update_mutations()
- if(QDESTROYING(src))
- return
-
- remove_layer(MUTATIONS_LAYER)
-
- if(!LAZYLEN(mutations))
- return //No mutations, no icons.
-
- //TODO: THIS PROC???
- var/fat
- if(FAT in mutations)
- fat = "fat"
-
- var/image/standing = image(icon = 'icons/effects/genetics.dmi', layer = BODY_LAYER+MUTATIONS_LAYER)
- var/g = gender == FEMALE ? "f" : "m"
-
- for(var/datum/dna/gene/gene in dna_genes)
- if(!gene.block)
- continue
- if(gene.is_active(src))
- var/underlay = gene.OnDrawUnderlays(src,g,fat)
- if(underlay)
- standing.underlays += underlay
-
- for(var/mut in mutations)
- if(LASER)
- standing.overlays += "lasereyes_s" //TODO
-
- overlays_standing[MUTATIONS_LAYER] = standing
- apply_layer(MUTATIONS_LAYER)
-
-/* --------------------------------------- */
-//Recomputes every icon on the mob. Expensive.
-//Useful if the species changed, or there's some
-//other drastic body-shape change, but otherwise avoid.
-/mob/living/carbon/human/regenerate_icons()
- ..()
- if(transforming || QDELETED(src))
- return
-
- update_icons_body()
- UpdateDamageIcon()
- update_mutations()
- update_skin()
- update_underwear()
- update_hair()
- update_inv_w_uniform()
- update_inv_wear_id()
- update_inv_gloves()
- update_inv_glasses()
- update_inv_ears()
- update_inv_shoes()
- update_inv_s_store()
- update_inv_wear_mask()
- update_inv_head()
- update_inv_belt()
- update_inv_back()
- update_inv_wear_suit()
- update_inv_r_hand()
- update_inv_l_hand()
- update_inv_handcuffed()
- update_inv_legcuffed()
- //update_inv_pockets() //Doesn't do anything
- update_fire()
- update_water()
- update_surgery()
-
-/* --------------------------------------- */
-//vvvvvv UPDATE_INV PROCS vvvvvv
-
-/mob/living/carbon/human/update_inv_w_uniform()
- if(QDESTROYING(src))
- return
-
- remove_layer(UNIFORM_LAYER)
-
- //Shoes can be affected by uniform being drawn onto them
- update_inv_shoes()
-
- if(!w_uniform)
- return
-
- if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space/rig))
- return //Wearing a suit that prevents uniform rendering
-
- var/obj/item/clothing/under/under = w_uniform
-
- var/uniform_sprite
-
- if(under.index)
- uniform_sprite = "[INV_W_UNIFORM_DEF_ICON]_[under.index].dmi"
- else
- uniform_sprite = "[INV_W_UNIFORM_DEF_ICON].dmi"
-
- //Build a uniform sprite
- var/icon/c_mask = tail_style?.clip_mask
- if(c_mask)
- var/obj/item/clothing/suit/S = wear_suit
- if((wear_suit?.flags_inv & HIDETAIL) || (istype(S) && S.taurized)) // Reasons to not mask: 1. If you're wearing a suit that hides the tail or if you're wearing a taurized suit.
- c_mask = null
- overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = uniform_sprite, default_layer = UNIFORM_LAYER, clip_mask = c_mask)
- apply_layer(UNIFORM_LAYER)
-
-/mob/living/carbon/human/update_inv_wear_id()
- if(QDESTROYING(src))
- return
-
- remove_layer(ID_LAYER)
-
- if(!wear_id)
- return //Not wearing an ID
-
- //Only draw the ID on the mob if the uniform allows for it
- if(w_uniform && istype(w_uniform, /obj/item/clothing/under))
- var/obj/item/clothing/under/U = w_uniform
- if(U.displays_id)
- overlays_standing[ID_LAYER] = wear_id.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_id_str, default_icon = INV_WEAR_ID_DEF_ICON, default_layer = ID_LAYER)
-
- apply_layer(ID_LAYER)
-
-/mob/living/carbon/human/update_inv_gloves()
- if(QDESTROYING(src))
- return
-
- remove_layer(GLOVES_LAYER)
-
- if(!gloves)
- return //No gloves, no reason to be here.
-
- overlays_standing[GLOVES_LAYER] = gloves.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_gloves_str, default_icon = INV_GLOVES_DEF_ICON, default_layer = GLOVES_LAYER)
-
- apply_layer(GLOVES_LAYER)
-
-/mob/living/carbon/human/update_inv_glasses()
- if(QDESTROYING(src))
- return
-
- remove_layer(GLASSES_LAYER)
-
- if(!glasses)
- return //Not wearing glasses, no need to update anything.
-
- overlays_standing[GLASSES_LAYER] = glasses.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_gloves_str, default_icon = INV_EYES_DEF_ICON, default_layer = GLASSES_LAYER)
-
- apply_layer(GLASSES_LAYER)
-
-/mob/living/carbon/human/update_inv_ears()
- if(QDESTROYING(src))
- return
-
- remove_layer(EARS_LAYER)
-
- if((head && head.flags_inv & (BLOCKHAIR | BLOCKHEADHAIR)) || (wear_mask && wear_mask.flags_inv & (BLOCKHAIR | BLOCKHEADHAIR)))
- return //Ears are blocked (by hair being blocked, overloaded)
-
- if(!l_ear && !r_ear)
- return //Why bother, if no ear sprites
-
- // Blank image upon which to layer left & right overlays.
- var/image/both = image(icon = 'icons/effects/effects.dmi', icon_state = "nothing", layer = BODY_LAYER+EARS_LAYER)
-
- if(l_ear)
- var/image/standing = l_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_l_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER)
- both.add_overlay(standing)
-
- if(r_ear)
- var/image/standing = r_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_r_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER)
- both.add_overlay(standing)
-
- overlays_standing[EARS_LAYER] = both
- apply_layer(EARS_LAYER)
-
-/mob/living/carbon/human/update_inv_shoes()
- if(QDESTROYING(src))
- return
-
- remove_layer(SHOES_LAYER)
- remove_layer(SHOES_LAYER_ALT) //Dumb alternate layer for shoes being under the uniform.
-
- if(!shoes || (wear_suit && wear_suit.flags_inv & HIDESHOES) || (w_uniform && w_uniform.flags_inv & HIDESHOES))
- return //Either nothing to draw, or it'd be hidden.
-
- for(var/f in list(BP_L_FOOT, BP_R_FOOT))
- var/obj/item/organ/external/foot/foot = get_organ(f)
- if(istype(foot) && foot.is_hidden_by_tail()) //If either foot is hidden by the tail, don't render footwear.
- return
-
- //Allow for shoe layer toggle nonsense
- var/shoe_layer = SHOES_LAYER
- if(istype(shoes, /obj/item/clothing/shoes))
- var/obj/item/clothing/shoes/ushoes = shoes
- if(ushoes.shoes_under_pants == 1)
- shoe_layer = SHOES_LAYER_ALT
-
- //NB: the use of a var for the layer on this one
- overlays_standing[shoe_layer] = shoes.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_shoes_str, default_icon = INV_FEET_DEF_ICON, default_layer = shoe_layer)
-
- apply_layer(SHOES_LAYER)
- apply_layer(SHOES_LAYER_ALT)
-
-/mob/living/carbon/human/update_inv_s_store()
- if(QDESTROYING(src))
- return
-
- remove_layer(SUIT_STORE_LAYER)
-
- if(!s_store)
- return //Why bother, nothing there.
-
- //TODO, this is unlike the rest of the things
- //Basically has no variety in slot icon choices at all. WHY SPECIES ONLY??
- var/t_state = s_store.item_state
- if(!t_state)
- t_state = s_store.icon_state
- overlays_standing[SUIT_STORE_LAYER] = image(icon = species.suit_storage_icon, icon_state = t_state, layer = BODY_LAYER+SUIT_STORE_LAYER)
-
- apply_layer(SUIT_STORE_LAYER)
-
-/mob/living/carbon/human/update_inv_head()
- if(QDESTROYING(src))
- return
-
- remove_layer(HEAD_LAYER)
-
- if(!head)
- return //No head item, why bother.
-
- overlays_standing[HEAD_LAYER] = head.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_head_str, default_icon = INV_HEAD_DEF_ICON, default_layer = HEAD_LAYER)
-
- apply_layer(HEAD_LAYER)
-
-/mob/living/carbon/human/update_inv_belt()
- if(QDESTROYING(src))
- return
-
- remove_layer(BELT_LAYER)
- remove_layer(BELT_LAYER_ALT) //Because you can toggle belt layer with a verb
-
- if(!belt)
- return //No belt, why bother.
-
- //Toggle for belt layering with uniform
- var/belt_layer = BELT_LAYER
- if(istype(belt, /obj/item/weapon/storage/belt))
- var/obj/item/weapon/storage/belt/ubelt = belt
- if(ubelt.show_above_suit)
- belt_layer = BELT_LAYER_ALT
-
- //NB: this uses a var from above
- overlays_standing[belt_layer] = belt.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_belt_str, default_icon = INV_BELT_DEF_ICON, default_layer = belt_layer)
-
- apply_layer(belt_layer)
-
-/mob/living/carbon/human/update_inv_wear_suit()
- if(QDESTROYING(src))
- return
-
- remove_layer(SUIT_LAYER)
-
- //Hide/show other layers if necessary
- update_inv_w_uniform()
- update_inv_shoes()
- update_tail_showing()
- update_wing_showing()
-
- if(!wear_suit)
- return //No point, no suit.
-
- var/obj/item/clothing/suit/suit = wear_suit
- var/suit_sprite
-
- if(istype(suit) && suit.index)
- suit_sprite = "[INV_SUIT_DEF_ICON]_[suit.index].dmi"
- else if(istype(suit, /obj/item/clothing) && !isnull(suit.update_icon_define))
- suit_sprite = suit.update_icon_define
- else
- suit_sprite = "[INV_SUIT_DEF_ICON].dmi"
-
- var/icon/c_mask = null
- var/tail_is_rendered = (overlays_standing[TAIL_LAYER] || overlays_standing[TAIL_LAYER_ALT])
- var/valid_clip_mask = tail_style?.clip_mask
-
- if(tail_is_rendered && valid_clip_mask && !(istype(suit) && suit.taurized)) //Clip the lower half of the suit off using the tail's clip mask for taurs since taur bodies aren't hidden.
- c_mask = valid_clip_mask
- overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = suit_sprite, default_layer = SUIT_LAYER, clip_mask = c_mask)
-
- apply_layer(SUIT_LAYER)
-
-/mob/living/carbon/human/update_inv_pockets()
- crash_with("Someone called update_inv_pockets even though it's dumb")
-
-/mob/living/carbon/human/update_inv_wear_mask()
- if(QDESTROYING(src))
- return
-
- remove_layer(FACEMASK_LAYER)
-
- if(!wear_mask || (head && head.flags_inv & HIDEMASK))
- return //Why bother, nothing in mask slot.
-
- overlays_standing[FACEMASK_LAYER] = wear_mask.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_mask_str, default_icon = INV_MASK_DEF_ICON, default_layer = FACEMASK_LAYER)
-
- apply_layer(FACEMASK_LAYER)
-
-/mob/living/carbon/human/update_inv_back()
- if(QDESTROYING(src))
- return
-
- remove_layer(BACK_LAYER)
-
- if(!back)
- return //Why do anything
-
- overlays_standing[BACK_LAYER] = back.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_back_str, default_icon = INV_BACK_DEF_ICON, default_layer = BACK_LAYER)
-
- apply_layer(BACK_LAYER)
-
-//TODO: Carbon procs in my human update_icons??
-/mob/living/carbon/human/update_hud() //TODO: do away with this if possible
- if(QDESTROYING(src))
- return
-
- if(client)
- client.screen |= contents
- if(hud_used)
- hud_used.hidden_inventory_update() //Updates the screenloc of the items on the 'other' inventory bar
-
-//update whether handcuffs appears on our hud.
-/mob/living/carbon/proc/update_hud_handcuffed()
- if(QDESTROYING(src))
- return
-
- if(hud_used && hud_used.l_hand_hud_object && hud_used.r_hand_hud_object)
- hud_used.l_hand_hud_object.update_icon()
- hud_used.r_hand_hud_object.update_icon()
-
-/mob/living/carbon/human/update_inv_handcuffed()
- if(QDESTROYING(src))
- return
-
- remove_layer(HANDCUFF_LAYER)
- update_hud_handcuffed() //TODO
-
- if(!handcuffed)
- return //Not cuffed, why bother
-
- overlays_standing[HANDCUFF_LAYER] = handcuffed.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_handcuffed_str, default_icon = INV_HCUFF_DEF_ICON, default_layer = HANDCUFF_LAYER)
-
- apply_layer(HANDCUFF_LAYER)
-
-/mob/living/carbon/human/update_inv_legcuffed()
- if(QDESTROYING(src))
- return
-
- clear_alert("legcuffed")
- remove_layer(LEGCUFF_LAYER)
-
- if(!legcuffed)
- return //Not legcuffed, why bother.
-
- throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed)
-
- overlays_standing[LEGCUFF_LAYER] = legcuffed.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_legcuffed_str, default_icon = INV_LCUFF_DEF_ICON, default_layer = LEGCUFF_LAYER)
-
- apply_layer(LEGCUFF_LAYER)
-
-/mob/living/carbon/human/update_inv_r_hand()
- if(QDESTROYING(src))
- return
-
- remove_layer(R_HAND_LAYER)
-
- if(!r_hand)
- return //No hand, no bother.
-
- overlays_standing[R_HAND_LAYER] = r_hand.make_worn_icon(body_type = species.get_bodytype(src), inhands = TRUE, slot_name = slot_r_hand_str, default_icon = INV_R_HAND_DEF_ICON, default_layer = R_HAND_LAYER)
-
- apply_layer(R_HAND_LAYER)
-
-/mob/living/carbon/human/update_inv_l_hand()
- if(QDESTROYING(src))
- return
-
- remove_layer(L_HAND_LAYER)
-
- if(!l_hand)
- return //No hand, no bother.
-
- overlays_standing[L_HAND_LAYER] = l_hand.make_worn_icon(body_type = species.get_bodytype(src), inhands = TRUE, slot_name = slot_l_hand_str, default_icon = INV_L_HAND_DEF_ICON, default_layer = L_HAND_LAYER)
-
- apply_layer(L_HAND_LAYER)
-
-/mob/living/carbon/human/proc/update_tail_showing()
- if(QDESTROYING(src))
- return
-
- remove_layer(TAIL_LAYER)
- remove_layer(TAIL_LAYER_ALT) // Alt Tail Layer
-
- var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER
-
- var/image/tail_image = get_tail_image()
- if(tail_image)
- tail_image.layer = BODY_LAYER+used_tail_layer
- overlays_standing[used_tail_layer] = tail_image
- apply_layer(used_tail_layer)
- return
-
- var/species_tail = species.get_tail(src) // Species tail icon_state prefix.
-
- //This one is actually not that bad I guess.
- if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL))
- var/icon/tail_s = get_tail_icon()
- overlays_standing[used_tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+used_tail_layer) // Alt Tail Layer
- animate_tail_reset()
-
-//TODO: Is this the appropriate place for this, and not on species...?
-/mob/living/carbon/human/proc/get_tail_icon()
- var/icon_key = "[species.get_race_key(src)][r_skin][g_skin][b_skin][r_hair][g_hair][b_hair]"
- var/icon/tail_icon = tail_icon_cache[icon_key]
- if(!tail_icon)
- //generate a new one
- var/species_tail_anim = species.get_tail_animation(src)
- if(!species_tail_anim && species.icobase_tail) species_tail_anim = species.icobase //Allow override of file for non-animated tails
- if(!species_tail_anim) species_tail_anim = 'icons/effects/species.dmi'
- tail_icon = new/icon(species_tail_anim)
- tail_icon.Blend(rgb(r_skin, g_skin, b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD)
- // The following will not work with animated tails.
- var/use_species_tail = species.get_tail_hair(src)
- if(use_species_tail)
- var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]")
- hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //Check for species color_mult
- tail_icon.Blend(hair_icon, ICON_OVERLAY)
- tail_icon_cache[icon_key] = tail_icon
-
- return tail_icon
-
-/mob/living/carbon/human/proc/set_tail_state(var/t_state)
- var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // Alt Tail Layer
- var/image/tail_overlay = overlays_standing[used_tail_layer]
-
- remove_layer(TAIL_LAYER)
- remove_layer(TAIL_LAYER_ALT)
-
- if(tail_overlay)
- overlays_standing[used_tail_layer] = tail_overlay
- if(species.get_tail_animation(src))
- tail_overlay.icon_state = t_state
- . = tail_overlay
-
- apply_layer(used_tail_layer)
-
-//Not really once, since BYOND can't do that.
-//Update this if the ability to flick() images or make looping animation start at the first frame is ever added.
-//You can sort of flick images now with flick_overlay -Aro
-/mob/living/carbon/human/proc/animate_tail_once()
- if(QDESTROYING(src))
- return
-
- var/t_state = "[species.get_tail(src)]_once"
- var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // Alt Tail Layer
-
- var/image/tail_overlay = overlays_standing[used_tail_layer] // Alt Tail Layer
- if(tail_overlay && tail_overlay.icon_state == t_state)
- return //let the existing animation finish
-
- tail_overlay = set_tail_state(t_state) // Calls remove_layer & apply_layer
- if(tail_overlay)
- spawn(20)
- //check that the animation hasn't changed in the meantime
- if(overlays_standing[used_tail_layer] == tail_overlay && tail_overlay.icon_state == t_state) // Alt Tail Layer
- animate_tail_stop()
-
-/mob/living/carbon/human/proc/animate_tail_start()
- if(QDESTROYING(src))
- return
-
- set_tail_state("[species.get_tail(src)]_slow[rand(0,9)]")
-
-/mob/living/carbon/human/proc/animate_tail_fast()
- if(QDESTROYING(src))
- return
-
- set_tail_state("[species.get_tail(src)]_loop[rand(0,9)]")
-
-/mob/living/carbon/human/proc/animate_tail_reset()
- if(QDESTROYING(src))
- return
-
- if(stat != DEAD)
- set_tail_state("[species.get_tail(src)]_idle[rand(0,9)]")
- else
- set_tail_state("[species.get_tail(src)]_static")
- toggle_tail(FALSE) //So tails stop when someone dies. TODO - Fix this hack ~Leshana
-
-/mob/living/carbon/human/proc/animate_tail_stop()
- if(QDESTROYING(src))
- return
-
- set_tail_state("[species.get_tail(src)]_static")
-
-/mob/living/carbon/human/proc/update_wing_showing()
- if(QDESTROYING(src))
- return
-
- remove_layer(WING_LAYER)
-
- var/image/wing_image = get_wing_image()
- if(wing_image)
- wing_image.layer = BODY_LAYER+WING_LAYER
- overlays_standing[WING_LAYER] = wing_image
-
- apply_layer(WING_LAYER)
-
-/mob/living/carbon/human/update_modifier_visuals()
- if(QDESTROYING(src))
- return
-
- remove_layer(MODIFIER_EFFECTS_LAYER)
-
- if(!LAZYLEN(modifiers))
- return //No modifiers, no effects.
-
- var/image/effects = new()
- for(var/datum/modifier/M in modifiers)
- if(M.mob_overlay_state)
- var/image/I = image(icon = 'icons/mob/modifier_effects.dmi', icon_state = M.mob_overlay_state)
- effects.overlays += I //TODO, this compositing is annoying.
-
- overlays_standing[MODIFIER_EFFECTS_LAYER] = effects
-
- apply_layer(MODIFIER_EFFECTS_LAYER)
-
-/mob/living/carbon/human/update_fire()
- if(QDESTROYING(src))
- return
-
- remove_layer(FIRE_LAYER)
-
- if(!on_fire)
- return
-
- overlays_standing[FIRE_LAYER] = image(icon = 'icons/mob/OnFire.dmi', icon_state = get_fire_icon_state(), layer = BODY_LAYER+FIRE_LAYER)
-
- apply_layer(FIRE_LAYER)
-
-/mob/living/carbon/human/update_water()
- if(QDESTROYING(src))
- return
-
- remove_layer(WATER_LAYER)
-
- var/depth = check_submerged()
- if(!depth || lying)
- return
-
- var/atom/A = loc // We'd better be swimming and on a turf
- var/image/I = image(icon = 'icons/mob/submerged.dmi', icon_state = "human_swimming_[depth]", layer = BODY_LAYER+WATER_LAYER) //TODO: Improve
- I.color = A.color
- overlays_standing[WATER_LAYER] = I
-
- apply_layer(WATER_LAYER)
-
-/mob/living/carbon/human/proc/update_surgery()
- if(QDESTROYING(src))
- return
-
- remove_layer(SURGERY_LAYER)
-
- var/image/total = new
- for(var/obj/item/organ/external/E in organs)
- if(E.open)
- var/image/I = image(icon = 'icons/mob/surgery.dmi', icon_state = "[E.icon_name][round(E.open)]", layer = BODY_LAYER+SURGERY_LAYER)
- total.overlays += I //TODO: This compositing is annoying
-
- if(total.overlays.len)
- overlays_standing[SURGERY_LAYER] = total
- apply_layer(SURGERY_LAYER)
-
-/mob/living/carbon/human/proc/get_wing_image()
- if(QDESTROYING(src))
- return
-
- //If you are FBP with wing style and didn't set a custom one
- if(synthetic && synthetic.includes_wing && !wing_style)
- var/icon/wing_s = new/icon("icon" = synthetic.icon, "icon_state" = "wing") //I dunno. If synths have some custom wing?
- wing_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD)
- return image(wing_s)
-
- //If you have custom wings selected
- if(wing_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL))
- var/icon/wing_s = new/icon("icon" = wing_style.icon, "icon_state" = flapping && wing_style.ani_state ? wing_style.ani_state : wing_style.icon_state)
- if(wing_style.do_colouration)
- wing_s.Blend(rgb(src.r_wing, src.g_wing, src.b_wing), wing_style.color_blend_mode)
- if(wing_style.extra_overlay)
- var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay)
- overlay.Blend(rgb(src.r_wing2, src.g_wing2, src.b_wing2), wing_style.color_blend_mode)
- wing_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
- if(wing_style.extra_overlay2)
- var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2)
- if(wing_style.ani_state)
- overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2_w)
- overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode)
- wing_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
- else
- overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode)
- wing_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
- return image(wing_s)
-
-/mob/living/carbon/human/proc/get_ears_overlay()
- if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR)))
- var/icon/ears_s = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.icon_state)
- if(ear_style.do_colouration)
- ears_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), ear_style.color_blend_mode)
- if(ear_style.extra_overlay)
- var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay)
- overlay.Blend(rgb(src.r_ears2, src.g_ears2, src.b_ears2), ear_style.color_blend_mode)
- ears_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
- if(ear_style.extra_overlay2) //MORE COLOURS IS BETTERER
- var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay2)
- overlay.Blend(rgb(src.r_ears3, src.g_ears3, src.b_ears3), ear_style.color_blend_mode)
- ears_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
- return ears_s
- return null
-
-
-/mob/living/carbon/human/proc/get_tail_image()
- //If you are FBP with tail style and didn't set a custom one
- var/datum/robolimb/model = isSynthetic()
- if(istype(model) && model.includes_tail && !tail_style)
- var/icon/tail_s = new/icon("icon" = synthetic.icon, "icon_state" = "tail")
- tail_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD)
- return image(tail_s)
-
- //If you have a custom tail selected
- if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !isTaurTail(tail_style)))
- var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state)
- if(tail_style.do_colouration)
- tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode)
- if(tail_style.extra_overlay)
- var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay)
- if(wagging && tail_style.ani_state)
- overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w)
- overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode)
- tail_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
- else
- overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode)
- tail_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
-
- if(tail_style.extra_overlay2)
- var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2)
- if(wagging && tail_style.ani_state)
- overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2_w)
- overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode)
- tail_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
- else
- overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode)
- tail_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
-
- if(isTaurTail(tail_style))
- var/datum/sprite_accessory/tail/taur/taurtype = tail_style
- if(taurtype.can_ride && !riding_datum)
- riding_datum = new /datum/riding/taur(src)
- verbs |= /mob/living/carbon/human/proc/taur_mount
- verbs |= /mob/living/proc/toggle_rider_reins
- return image(tail_s, "pixel_x" = -16)
- else
- return image(tail_s)
- return null
-
-// TODO - Move this to where it should go ~Leshana
-/mob/living/proc/stop_flying()
- if(QDESTROYING(src))
- return
- flying = FALSE
- return 1
-
-/mob/living/carbon/human/stop_flying()
- if((. = ..()))
- update_wing_showing()
-
-//Human Overlays Indexes/////////
-#undef MUTATIONS_LAYER
-#undef SKIN_LAYER
-#undef DAMAGE_LAYER
-#undef SURGERY_LAYER
-#undef UNDERWEAR_LAYER
-#undef SHOES_LAYER_ALT
-#undef UNIFORM_LAYER
-#undef ID_LAYER
-#undef SHOES_LAYER
-#undef GLOVES_LAYER
-#undef BELT_LAYER
-#undef SUIT_LAYER
-#undef TAIL_LAYER
-#undef GLASSES_LAYER
-#undef BELT_LAYER_ALT
-#undef SUIT_STORE_LAYER
-#undef BACK_LAYER
-#undef HAIR_LAYER
-#undef EARS_LAYER
-#undef EYES_LAYER
-#undef FACEMASK_LAYER
-#undef HEAD_LAYER
-#undef COLLAR_LAYER
-#undef HANDCUFF_LAYER
-#undef LEGCUFF_LAYER
-#undef L_HAND_LAYER
-#undef R_HAND_LAYER
-#undef MODIFIER_EFFECTS_LAYER
-#undef FIRE_LAYER
-#undef WATER_LAYER
-#undef TARGETED_LAYER
-#undef TOTAL_LAYERS
+/*
+ Global associative list for caching humanoid icons.
+ Index format m or f, followed by a string of 0 and 1 to represent bodyparts followed by husk fat hulk skeleton 1 or 0.
+*/
+var/global/list/human_icon_cache = list() //key is incredibly complex, see update_icons_body()
+var/global/list/tail_icon_cache = list() //key is [species.race_key][r_skin][g_skin][b_skin]
+var/global/list/wing_icon_cache = list() // See tail.
+var/global/list/light_overlay_cache = list() //see make_worn_icon() on helmets
+var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+// # Human Icon Updating System
+//
+// This system takes care of the "icon" for human mobs. Of course humans don't just have a single
+// icon+icon_state, but a combination of dozens of little sprites including including the body,
+// clothing, equipment, in-universe HUD images, etc.
+//
+// # Basic Operation
+// Whenever you do something that should update the on-mob appearance of a worn or held item, You
+// will need to call the relevant update_inv_* proc. All of these are named after the variable they
+// update from. They are defined at the /mob level so you don't even need to cast to carbon/human.
+//
+// The new system leverages SSoverlays to actually add/remove the overlays from mob.overlays
+// Since SSoverlays already manages batching updates to reduce apperance churn etc, we don't need
+// to worry about that. (In short, you can call add/cut overlay as many times as you want, it will
+// only get assigned to the mob once per tick.)
+// As a corrolary, this means users of this system do NOT need to tell the system when you're done
+// making changes.
+//
+// There are also these special cases:
+// update_icons_body() //Handles updating your mob's icon to reflect their gender/race/complexion etc
+// UpdateDamageIcon() //Handles damage overlays for brute/burn damage //(will rename this when I geta round to it) ~Carn
+// update_skin() //Handles updating skin for species that have a skin overlay.
+// update_bloodied() //Handles adding/clearing the blood overlays for hands & feet. Call when bloodied or cleaned.
+// update_underwear() //Handles updating the sprite for underwear.
+// update_hair() //Handles updating your hair and eyes overlay
+// update_mutations() //Handles updating your appearance for certain mutations. e.g TK head-glows
+// update_fire() //Handles overlay from being on fire.
+// update_water() //Handles overlay from being submerged.
+// update_surgery() //Handles overlays from open external organs.
+//
+// # History (i.e. I'm used to the old way, what is different?)
+// You used to have to call update_icons(FALSE) if you planned to make more changes, and call update_icons(TRUE)
+// on the final update. All that is gone, just call update_inv_whatever() and it handles the rest.
+//
+////////////////////////////////////////////////////////////////////////////////////////////////
+
+//Add an entry to overlays, assuming it exists
+/mob/living/carbon/human/proc/apply_layer(cache_index)
+ if((. = overlays_standing[cache_index]))
+ add_overlay(.)
+
+//Remove an entry from overlays, and from the list
+/mob/living/carbon/human/proc/remove_layer(cache_index)
+ var/I = overlays_standing[cache_index]
+ if(I)
+ cut_overlay(I)
+ overlays_standing[cache_index] = null
+
+// These are used as the layers for the icons, as well as indexes in a list that holds onto them.
+// Technically the layers used are all -100+layer to make them FLOAT_LAYER overlays.
+//Human Overlays Indexes/////////
+#define MUTATIONS_LAYER 1 //Mutations like fat, and lasereyes
+#define SKIN_LAYER 2 //Skin things added by a call on species
+#define BLOOD_LAYER 3 //Bloodied hands/feet/anything else
+#define DAMAGE_LAYER 4 //Injury overlay sprites like open wounds
+#define SURGERY_LAYER 5 //Overlays for open surgical sites
+#define UNDERWEAR_LAYER 6 //Underwear/bras/etc
+#define SHOES_LAYER_ALT 7 //Shoe-slot item (when set to be under uniform via verb)
+#define UNIFORM_LAYER 8 //Uniform-slot item
+#define ID_LAYER 9 //ID-slot item
+#define SHOES_LAYER 10 //Shoe-slot item
+#define GLOVES_LAYER 11 //Glove-slot item
+#define BELT_LAYER 12 //Belt-slot item
+#define SUIT_LAYER 13 //Suit-slot item
+#define TAIL_LAYER 14 //Some species have tails to render
+#define GLASSES_LAYER 15 //Eye-slot item
+#define BELT_LAYER_ALT 16 //Belt-slot item (when set to be above suit via verb)
+#define SUIT_STORE_LAYER 17 //Suit storage-slot item
+#define BACK_LAYER 18 //Back-slot item
+#define HAIR_LAYER 19 //The human's hair
+#define HAIR_ACCESSORY_LAYER 20 //VOREStation edit. Simply move this up a number if things are added.
+#define EARS_LAYER 21 //Both ear-slot items (combined image)
+#define EYES_LAYER 22 //Mob's eyes (used for glowing eyes)
+#define FACEMASK_LAYER 23 //Mask-slot item
+#define HEAD_LAYER 24 //Head-slot item
+#define HANDCUFF_LAYER 25 //Handcuffs, if the human is handcuffed, in a secret inv slot
+#define LEGCUFF_LAYER 26 //Same as handcuffs, for legcuffs
+#define L_HAND_LAYER 27 //Left-hand item
+#define R_HAND_LAYER 28 //Right-hand item
+#define WING_LAYER 29 //Wings or protrusions over the suit.
+#define TAIL_LAYER_ALT 30 //Modified tail-sprite layer. Tend to be larger.
+#define MODIFIER_EFFECTS_LAYER 31 //Effects drawn by modifiers
+#define FIRE_LAYER 32 //'Mob on fire' overlay layer
+#define WATER_LAYER 33 //'Mob submerged' overlay layer
+#define TARGETED_LAYER 34 //'Aimed at' overlay layer
+#define TOTAL_LAYERS 34 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
+//////////////////////////////////
+
+/mob/living/carbon/human
+ var/list/overlays_standing[TOTAL_LAYERS]
+ var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed
+
+//UPDATES OVERLAYS FROM OVERLAYS_LYING/OVERLAYS_STANDING
+//I'll work on removing that stuff by rewriting some of the cloaking stuff at a later date.
+/mob/living/carbon/human/update_icons()
+ if(QDESTROYING(src))
+ return
+
+ crash_with("CANARY: Old human update_icons was called.")
+
+ update_hud() //TODO: remove the need for this
+
+ //Do any species specific layering updates, such as when hiding.
+ update_icon_special()
+
+/mob/living/carbon/human/update_transform()
+ /* VOREStation Edit START
+ // First, get the correct size.
+ var/desired_scale_x = icon_scale_x
+ var/desired_scale_y = icon_scale_y
+
+ desired_scale_x *= species.icon_scale_x
+ desired_scale_y *= species.icon_scale_y
+
+ for(var/datum/modifier/M in modifiers)
+ if(!isnull(M.icon_scale_x_percent))
+ desired_scale_x *= M.icon_scale_x_percent
+ if(!isnull(M.icon_scale_y_percent))
+ desired_scale_y *= M.icon_scale_y_percent
+ */
+ var/desired_scale_x = size_multiplier * icon_scale_x
+ var/desired_scale_y = size_multiplier * icon_scale_y
+ desired_scale_x *= species.icon_scale_x
+ desired_scale_y *= species.icon_scale_y
+ appearance_flags |= PIXEL_SCALE
+ if(fuzzy)
+ appearance_flags &= ~PIXEL_SCALE
+ //VOREStation Edit End
+
+ // Regular stuff again.
+ var/matrix/M = matrix()
+ var/anim_time = 3
+
+ //Due to some involuntary means, you're laying now
+ if(lying && !resting && !sleeping)
+ anim_time = 1 //Thud
+
+ if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone.
+ M.Turn(90)
+ M.Scale(desired_scale_y, desired_scale_x)//VOREStation Edit
+ if(species.icon_height == 64)//VOREStation Edit
+ M.Translate(13,-22)
+ else
+ M.Translate(1,-6)
+ layer = MOB_LAYER -0.01 // Fix for a byond bug where turf entry order no longer matters
+ else
+ M.Scale(desired_scale_x, desired_scale_y)//VOREStation Edit
+ M.Translate(0, (vis_height/2)*(desired_scale_y-1)) //VOREStation edit
+ layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters
+
+ animate(src, transform = M, time = anim_time)
+ update_icon_special() //May contain transform-altering things
+
+//DAMAGE OVERLAYS
+//constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists
+/mob/living/carbon/human/UpdateDamageIcon()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(DAMAGE_LAYER)
+
+ // first check whether something actually changed about damage appearance
+ var/damage_appearance = ""
+
+ for(var/obj/item/organ/external/O in organs)
+ if(isnull(O) || O.is_stump())
+ continue
+ damage_appearance += O.damage_state
+
+ if(damage_appearance == previous_damage_appearance)
+ // nothing to do here
+ return
+
+ previous_damage_appearance = damage_appearance
+
+ var/image/standing_image = image(icon = species.damage_overlays, icon_state = "00", layer = BODY_LAYER+DAMAGE_LAYER)
+
+ // blend the individual damage states with our icons
+ for(var/obj/item/organ/external/O in organs)
+ if(isnull(O) || O.is_stump() || O.is_hidden_by_tail())
+ continue
+
+ O.update_icon()
+ if(O.damage_state == "00") continue
+ var/icon/DI
+ var/cache_index = "[O.damage_state]/[O.icon_name]/[species.get_blood_colour(src)]/[species.get_bodytype(src)]"
+ if(damage_icon_parts[cache_index] == null)
+ DI = icon(species.get_damage_overlays(src), O.damage_state) // the damage icon for whole human
+ DI.Blend(icon(species.get_damage_mask(src), O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
+ DI.Blend(species.get_blood_colour(src), ICON_MULTIPLY)
+ damage_icon_parts[cache_index] = DI
+ else
+ DI = damage_icon_parts[cache_index]
+
+ standing_image.overlays += DI
+
+ overlays_standing[DAMAGE_LAYER] = standing_image
+ apply_layer(DAMAGE_LAYER)
+
+//BASE MOB SPRITE
+/mob/living/carbon/human/update_icons_body()
+ if(QDESTROYING(src))
+ return
+
+ var/husk_color_mod = rgb(96,88,80)
+ var/hulk_color_mod = rgb(48,224,40)
+
+ var/husk = (HUSK in src.mutations)
+ var/fat = (FAT in src.mutations)
+ var/hulk = (HULK in src.mutations)
+ var/skeleton = (SKELETON in src.mutations)
+
+ robolimb_count = 0 //TODO, here, really tho?
+ robobody_count = 0
+
+ //CACHING: Generate an index key from visible bodyparts.
+ //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic.
+
+ //Create a new, blank icon for our mob to use.
+ var/icon/stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank")
+
+ var/g = (gender == MALE ? "male" : "female")
+ var/icon_key = "[species.get_race_key(src)][g][s_tone][r_skin][g_skin][b_skin]"
+ if(lip_style)
+ icon_key += "[lip_style]"
+ else
+ icon_key += "nolips"
+ var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name[O_EYES]
+ if(eyes)
+ icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]"
+ else
+ icon_key += "[r_eyes], [g_eyes], [b_eyes]"
+ var/obj/item/organ/external/head/head = organs_by_name[BP_HEAD]
+ if(head)
+ if(!istype(head, /obj/item/organ/external/stump))
+ icon_key += "[head.eye_icon]"
+ for(var/organ_tag in species.has_limbs)
+ var/obj/item/organ/external/part = organs_by_name[organ_tag]
+ if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff.
+ icon_key += "0"
+ continue
+ if(part)
+ icon_key += "[part.species.get_race_key(part.owner)]"
+ icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]"
+ icon_key += "[part.s_tone]"
+ if(part.s_col && part.s_col.len >= 3)
+ icon_key += "[rgb(part.s_col[1],part.s_col[2],part.s_col[3])]"
+ if(part.body_hair && part.h_col && part.h_col.len >= 3)
+ icon_key += "[rgb(part.h_col[1],part.h_col[2],part.h_col[3])]"
+ if(species.color_mult)
+ icon_key += "[ICON_MULTIPLY]"
+ else
+ icon_key += "[ICON_ADD]"
+ else
+ icon_key += "#000000"
+
+ for(var/M in part.markings)
+ icon_key += "[M][part.markings[M]["color"]]"
+
+ if(part.robotic >= ORGAN_ROBOT)
+ icon_key += "2[part.model ? "-[part.model]": ""]"
+ robolimb_count++
+ if((part.robotic == ORGAN_ROBOT || part.robotic == ORGAN_LIFELIKE) && (part.organ_tag == BP_HEAD || part.organ_tag == BP_TORSO || part.organ_tag == BP_GROIN))
+ robobody_count ++
+ else if(part.status & ORGAN_DEAD)
+ icon_key += "3"
+ else
+ icon_key += "1"
+ if(part.transparent) //VOREStation Edit. For better slime limbs. Avoids using solid var due to limb dropping.
+ icon_key += "_t" //VOREStation Edit.
+
+ if(istype(tail_style, /datum/sprite_accessory/tail/taur))
+ if(tail_style.clip_mask) //VOREStation Edit.
+ icon_key += tail_style.clip_mask_state
+
+ icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
+ var/icon/base_icon
+ if(human_icon_cache[icon_key])
+ base_icon = human_icon_cache[icon_key]
+ else
+ //BEGIN CACHED ICON GENERATION.
+ var/obj/item/organ/external/chest = get_organ(BP_TORSO)
+ base_icon = chest.get_icon()
+
+ var/icon/Cutter = null
+
+ if(istype(tail_style, /datum/sprite_accessory/tail/taur)) // Tail icon 'cookie cutters' are filled in where icons are preserved. We need to invert that.
+ if(tail_style.clip_mask) //VOREStation Edit.
+ Cutter = new(icon = tail_style.icon, icon_state = tail_style.clip_mask_state)
+
+ Cutter.Blend("#000000", ICON_MULTIPLY) // Make it all black.
+
+ Cutter.SwapColor("#00000000", "#FFFFFFFF") // Everywhere empty, make white.
+ Cutter.SwapColor("#000000FF", "#00000000") // Everywhere black, make empty.
+
+ Cutter.Blend("#000000", ICON_MULTIPLY) // Black again.
+
+ for(var/obj/item/organ/external/part in organs)
+ if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff.
+ continue
+ var/icon/temp = part.get_icon(skeleton)
+
+ if((part.organ_tag in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) && Cutter)
+ temp.Blend(Cutter, ICON_AND, x = -16)
+
+ //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
+ //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
+ if(part.icon_position & (LEFT | RIGHT))
+ var/icon/temp2 = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank")
+ temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH)
+ temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH)
+ if(!(part.icon_position & LEFT))
+ temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
+ if(!(part.icon_position & RIGHT))
+ temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
+ base_icon.Blend(temp2, ICON_OVERLAY)
+ if(part.icon_position & LEFT)
+ temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
+ if(part.icon_position & RIGHT)
+ temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
+ base_icon.Blend(temp2, ICON_UNDERLAY)
+ else if(part.icon_position & UNDER)
+ base_icon.Blend(temp, ICON_UNDERLAY)
+ else
+ base_icon.Blend(temp, ICON_OVERLAY)
+
+ if(!skeleton)
+ if(husk)
+ base_icon.ColorTone(husk_color_mod)
+ else if(hulk)
+ var/list/tone = ReadRGB(hulk_color_mod)
+ base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3]))
+
+ //Handle husk overlay.
+ if(husk && ("overlay_husk" in cached_icon_states(species.icobase)))
+ var/icon/mask = new(base_icon)
+ var/icon/husk_over = new(species.icobase,"overlay_husk")
+ mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0)
+ husk_over.Blend(mask, ICON_ADD)
+ base_icon.Blend(husk_over, ICON_OVERLAY)
+
+ human_icon_cache[icon_key] = base_icon
+
+ //END CACHED ICON GENERATION.
+ stand_icon.Blend(base_icon,ICON_OVERLAY)
+ icon = stand_icon
+
+ //tail
+ update_tail_showing()
+ update_wing_showing()
+
+/mob/living/carbon/human/proc/update_skin()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(SKIN_LAYER)
+
+ var/image/skin = species.update_skin(src)
+ if(skin)
+ skin.layer = BODY_LAYER+SKIN_LAYER
+ overlays_standing[SKIN_LAYER] = skin
+ apply_layer(SKIN_LAYER)
+
+/mob/living/carbon/human/proc/update_bloodied()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(BLOOD_LAYER)
+ if(!blood_DNA && !feet_blood_DNA)
+ return
+
+ var/image/both = image(icon = 'icons/effects/effects.dmi', icon_state = "nothing", layer = BODY_LAYER+BLOOD_LAYER)
+
+ //Bloody hands
+ if(blood_DNA)
+ var/image/bloodsies = image(icon = species.get_blood_mask(src), icon_state = "bloodyhands", layer = BODY_LAYER+BLOOD_LAYER)
+ bloodsies.color = hand_blood_color
+ both.add_overlay(bloodsies)
+
+ //Bloody feet
+ if(feet_blood_DNA)
+ var/image/bloodsies = image(icon = species.get_blood_mask(src), icon_state = "shoeblood", layer = BODY_LAYER+BLOOD_LAYER)
+ bloodsies.color = feet_blood_color
+ both.add_overlay(bloodsies)
+
+ overlays_standing[BLOOD_LAYER] = both
+
+ apply_layer(BLOOD_LAYER)
+
+//UNDERWEAR OVERLAY
+/mob/living/carbon/human/proc/update_underwear()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(UNDERWEAR_LAYER)
+
+ if(species.appearance_flags & HAS_UNDERWEAR)
+ overlays_standing[UNDERWEAR_LAYER] = list()
+ for(var/category in all_underwear)
+ if(hide_underwear[category])
+ continue
+ var/datum/category_item/underwear/UWI = all_underwear[category]
+ var/image/wear = UWI.generate_image(all_underwear_metadata[category], layer = BODY_LAYER+UNDERWEAR_LAYER)
+ overlays_standing[UNDERWEAR_LAYER] += wear
+
+ apply_layer(UNDERWEAR_LAYER)
+
+//HAIR OVERLAY
+/mob/living/carbon/human/proc/update_hair()
+ if(QDESTROYING(src))
+ return
+
+ //Reset our hair
+ remove_layer(HAIR_LAYER)
+ remove_layer(HAIR_ACCESSORY_LAYER) //VOREStation Edit
+ update_eyes() //Pirated out of here, for glowing eyes.
+
+ var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD)
+ if(!head_organ || head_organ.is_stump() )
+ return
+
+ //masks and helmets can obscure our hair.
+ if( (head && (head.flags_inv & BLOCKHAIR)) || (wear_mask && (wear_mask.flags_inv & BLOCKHAIR)))
+ return
+
+ //base icons
+ var/icon/face_standing = icon(icon = 'icons/mob/human_face.dmi', icon_state = "bald_s")
+
+ if(f_style)
+ var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
+ if(facial_hair_style && facial_hair_style.species_allowed && (src.species.get_bodytype(src) in facial_hair_style.species_allowed))
+ var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
+ if(facial_hair_style.do_colouration)
+ facial_s.Blend(rgb(r_facial, g_facial, b_facial), facial_hair_style.color_blend_mode)
+
+ face_standing.Blend(facial_s, ICON_OVERLAY)
+
+ if(h_style)
+ var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style]
+ if(head && (head.flags_inv & BLOCKHEADHAIR))
+ if(!(hair_style.flags & HAIR_VERY_SHORT))
+ hair_style = hair_styles_list["Short Hair"]
+
+ if(hair_style && (src.species.get_bodytype(src) in hair_style.species_allowed))
+ var/icon/grad_s = null
+ var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
+ var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s")
+ if(hair_style.do_colouration)
+ if(grad_style)
+ grad_s = new/icon("icon" = 'icons/mob/hair_gradients.dmi', "icon_state" = GLOB.hair_gradients[grad_style])
+ grad_s.Blend(hair_s, ICON_AND)
+ grad_s.Blend(rgb(r_grad, g_grad, b_grad), ICON_MULTIPLY)
+ hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_MULTIPLY)
+ hair_s.Blend(hair_s_add, ICON_ADD)
+ if(!isnull(grad_s))
+ hair_s.Blend(grad_s, ICON_OVERLAY)
+
+ face_standing.Blend(hair_s, ICON_OVERLAY)
+
+ if(head_organ.nonsolid || head_organ.transparent)
+ face_standing += rgb(,,,120)
+
+ var/icon/ears_s = get_ears_overlay()
+ if(ears_s)
+ face_standing.Blend(ears_s, ICON_OVERLAY)
+
+ overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ.head_offset)
+ apply_layer(HAIR_LAYER)
+ return
+
+ // VOREStation Edit - START
+ var/icon/hair_acc_s = get_hair_accessory_overlay()
+ var/image/hair_acc_s_image = null
+ if(hair_acc_s)
+ if(hair_accessory_style.ignores_lighting)
+ hair_acc_s_image = image(hair_acc_s)
+ hair_acc_s_image.plane = PLANE_LIGHTING_ABOVE
+ hair_acc_s_image.appearance_flags = appearance_flags
+ if (hair_acc_s_image)
+ overlays_standing[HAIR_ACCESSORY_LAYER] = hair_acc_s_image
+ apply_layer(HAIR_ACCESSORY_LAYER)
+ return
+ overlays_standing[HAIR_ACCESSORY_LAYER] = image(hair_acc_s, layer = BODY_LAYER+HAIR_ACCESSORY_LAYER)
+ apply_layer(HAIR_ACCESSORY_LAYER)
+ // VOREStation Edit - END
+
+/mob/living/carbon/human/update_eyes()
+ if(QDESTROYING(src))
+ return
+
+ //Reset our eyes
+ remove_layer(EYES_LAYER)
+
+ //TODO: Probably redo this. I know I wrote it, but...
+
+ //This is ONLY for glowing eyes for now. Boring flat eyes are done by the head's own proc.
+ if(!species.has_glowing_eyes)
+ return
+
+ //Our glowy eyes should be hidden if some equipment hides them.
+ if(!should_have_organ(O_EYES) || (head && (head.flags_inv & BLOCKHAIR)) || (wear_mask && (wear_mask.flags_inv & BLOCKHAIR)))
+ return
+
+ //Get the head, we'll need it later.
+ var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD)
+ if(!head_organ || head_organ.is_stump() )
+ return
+
+ //The eyes store the color themselves, funny enough.
+ var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name[O_EYES]
+ if(!head_organ.eye_icon)
+ return
+
+ var/icon/eyes_icon = new/icon(head_organ.eye_icon_location, head_organ.eye_icon) //VOREStation Edit
+ if(eyes)
+ eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD)
+ else
+ eyes_icon.Blend(rgb(128,0,0), ICON_ADD)
+
+ var/image/eyes_image = image(eyes_icon)
+ eyes_image.plane = PLANE_LIGHTING_ABOVE
+ eyes_image.appearance_flags = appearance_flags
+
+ overlays_standing[EYES_LAYER] = eyes_image
+ apply_layer(EYES_LAYER)
+
+/mob/living/carbon/human/update_mutations()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(MUTATIONS_LAYER)
+
+ if(!LAZYLEN(mutations))
+ return //No mutations, no icons.
+
+ //TODO: THIS PROC???
+ var/fat
+ if(FAT in mutations)
+ fat = "fat"
+
+ var/image/standing = image(icon = 'icons/effects/genetics.dmi', layer = BODY_LAYER+MUTATIONS_LAYER)
+ var/g = gender == FEMALE ? "f" : "m"
+
+ for(var/datum/dna/gene/gene in dna_genes)
+ if(!gene.block)
+ continue
+ if(gene.is_active(src))
+ var/underlay = gene.OnDrawUnderlays(src,g,fat)
+ if(underlay)
+ standing.underlays += underlay
+
+ for(var/mut in mutations)
+ if(LASER)
+ standing.overlays += "lasereyes_s" //TODO
+
+ overlays_standing[MUTATIONS_LAYER] = standing
+ apply_layer(MUTATIONS_LAYER)
+
+/* --------------------------------------- */
+//Recomputes every icon on the mob. Expensive.
+//Useful if the species changed, or there's some
+//other drastic body-shape change, but otherwise avoid.
+/mob/living/carbon/human/regenerate_icons()
+ ..()
+ if(transforming || QDELETED(src))
+ return
+
+ update_icons_body()
+ UpdateDamageIcon()
+ update_mutations()
+ update_skin()
+ update_underwear()
+ update_hair()
+ update_inv_w_uniform()
+ update_inv_wear_id()
+ update_inv_gloves()
+ update_inv_glasses()
+ update_inv_ears()
+ update_inv_shoes()
+ update_inv_s_store()
+ update_inv_wear_mask()
+ update_inv_head()
+ update_inv_belt()
+ update_inv_back()
+ update_inv_wear_suit()
+ update_inv_r_hand()
+ update_inv_l_hand()
+ update_inv_handcuffed()
+ update_inv_legcuffed()
+ //update_inv_pockets() //Doesn't do anything
+ update_fire()
+ update_water()
+ update_surgery()
+
+/* --------------------------------------- */
+//vvvvvv UPDATE_INV PROCS vvvvvv
+
+/mob/living/carbon/human/update_inv_w_uniform()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(UNIFORM_LAYER)
+
+ //Shoes can be affected by uniform being drawn onto them
+ update_inv_shoes()
+
+ if(!w_uniform)
+ return
+
+ if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space/rig))
+ return //Wearing a suit that prevents uniform rendering
+
+ var/obj/item/clothing/under/under = w_uniform
+
+ var/uniform_sprite
+
+ if(under.index)
+ uniform_sprite = "[INV_W_UNIFORM_DEF_ICON]_[under.index].dmi"
+ else
+ uniform_sprite = "[INV_W_UNIFORM_DEF_ICON].dmi"
+
+ //Build a uniform sprite
+ var/icon/c_mask = tail_style?.clip_mask
+ if(c_mask)
+ var/obj/item/clothing/suit/S = wear_suit
+ if((wear_suit?.flags_inv & HIDETAIL) || (istype(S) && S.taurized)) // Reasons to not mask: 1. If you're wearing a suit that hides the tail or if you're wearing a taurized suit.
+ c_mask = null
+ overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = uniform_sprite, default_layer = UNIFORM_LAYER, clip_mask = c_mask)
+ apply_layer(UNIFORM_LAYER)
+
+/mob/living/carbon/human/update_inv_wear_id()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(ID_LAYER)
+
+ if(!wear_id)
+ return //Not wearing an ID
+
+ //Only draw the ID on the mob if the uniform allows for it
+ if(w_uniform && istype(w_uniform, /obj/item/clothing/under))
+ var/obj/item/clothing/under/U = w_uniform
+ if(U.displays_id)
+ overlays_standing[ID_LAYER] = wear_id.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_id_str, default_icon = INV_WEAR_ID_DEF_ICON, default_layer = ID_LAYER)
+
+ apply_layer(ID_LAYER)
+
+/mob/living/carbon/human/update_inv_gloves()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(GLOVES_LAYER)
+
+ if(!gloves)
+ return //No gloves, no reason to be here.
+
+ overlays_standing[GLOVES_LAYER] = gloves.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_gloves_str, default_icon = INV_GLOVES_DEF_ICON, default_layer = GLOVES_LAYER)
+
+ apply_layer(GLOVES_LAYER)
+
+/mob/living/carbon/human/update_inv_glasses()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(GLASSES_LAYER)
+
+ if(!glasses)
+ return //Not wearing glasses, no need to update anything.
+
+ overlays_standing[GLASSES_LAYER] = glasses.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_gloves_str, default_icon = INV_EYES_DEF_ICON, default_layer = GLASSES_LAYER)
+
+ apply_layer(GLASSES_LAYER)
+
+/mob/living/carbon/human/update_inv_ears()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(EARS_LAYER)
+
+ if((head && head.flags_inv & (BLOCKHAIR | BLOCKHEADHAIR)) || (wear_mask && wear_mask.flags_inv & (BLOCKHAIR | BLOCKHEADHAIR)))
+ return //Ears are blocked (by hair being blocked, overloaded)
+
+ if(!l_ear && !r_ear)
+ return //Why bother, if no ear sprites
+
+ // Blank image upon which to layer left & right overlays.
+ var/image/both = image(icon = 'icons/effects/effects.dmi', icon_state = "nothing", layer = BODY_LAYER+EARS_LAYER)
+
+ if(l_ear)
+ var/image/standing = l_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_l_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER)
+ both.add_overlay(standing)
+
+ if(r_ear)
+ var/image/standing = r_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_r_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER)
+ both.add_overlay(standing)
+
+ overlays_standing[EARS_LAYER] = both
+ apply_layer(EARS_LAYER)
+
+/mob/living/carbon/human/update_inv_shoes()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(SHOES_LAYER)
+ remove_layer(SHOES_LAYER_ALT) //Dumb alternate layer for shoes being under the uniform.
+
+ if(!shoes || (wear_suit && wear_suit.flags_inv & HIDESHOES) || (w_uniform && w_uniform.flags_inv & HIDESHOES))
+ return //Either nothing to draw, or it'd be hidden.
+
+ for(var/f in list(BP_L_FOOT, BP_R_FOOT))
+ var/obj/item/organ/external/foot/foot = get_organ(f)
+ if(istype(foot) && foot.is_hidden_by_tail()) //If either foot is hidden by the tail, don't render footwear.
+ return
+
+ //Allow for shoe layer toggle nonsense
+ var/shoe_layer = SHOES_LAYER
+ if(istype(shoes, /obj/item/clothing/shoes))
+ var/obj/item/clothing/shoes/ushoes = shoes
+ if(ushoes.shoes_under_pants == 1)
+ shoe_layer = SHOES_LAYER_ALT
+
+ //NB: the use of a var for the layer on this one
+ overlays_standing[shoe_layer] = shoes.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_shoes_str, default_icon = INV_FEET_DEF_ICON, default_layer = shoe_layer)
+
+ apply_layer(SHOES_LAYER)
+ apply_layer(SHOES_LAYER_ALT)
+
+/mob/living/carbon/human/update_inv_s_store()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(SUIT_STORE_LAYER)
+
+ if(!s_store)
+ return //Why bother, nothing there.
+
+ //TODO, this is unlike the rest of the things
+ //Basically has no variety in slot icon choices at all. WHY SPECIES ONLY??
+ var/t_state = s_store.item_state
+ if(!t_state)
+ t_state = s_store.icon_state
+ overlays_standing[SUIT_STORE_LAYER] = image(icon = species.suit_storage_icon, icon_state = t_state, layer = BODY_LAYER+SUIT_STORE_LAYER)
+
+ apply_layer(SUIT_STORE_LAYER)
+
+/mob/living/carbon/human/update_inv_head()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(HEAD_LAYER)
+
+ if(!head)
+ return //No head item, why bother.
+
+ overlays_standing[HEAD_LAYER] = head.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_head_str, default_icon = INV_HEAD_DEF_ICON, default_layer = HEAD_LAYER)
+
+ apply_layer(HEAD_LAYER)
+
+/mob/living/carbon/human/update_inv_belt()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(BELT_LAYER)
+ remove_layer(BELT_LAYER_ALT) //Because you can toggle belt layer with a verb
+
+ if(!belt)
+ return //No belt, why bother.
+
+ //Toggle for belt layering with uniform
+ var/belt_layer = BELT_LAYER
+ if(istype(belt, /obj/item/weapon/storage/belt))
+ var/obj/item/weapon/storage/belt/ubelt = belt
+ if(ubelt.show_above_suit)
+ belt_layer = BELT_LAYER_ALT
+
+ //NB: this uses a var from above
+ overlays_standing[belt_layer] = belt.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_belt_str, default_icon = INV_BELT_DEF_ICON, default_layer = belt_layer)
+
+ apply_layer(belt_layer)
+
+/mob/living/carbon/human/update_inv_wear_suit()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(SUIT_LAYER)
+
+ //Hide/show other layers if necessary
+ update_inv_w_uniform()
+ update_inv_shoes()
+ update_tail_showing()
+ update_wing_showing()
+
+ if(!wear_suit)
+ return //No point, no suit.
+
+ var/obj/item/clothing/suit/suit = wear_suit
+ var/suit_sprite
+
+ if(istype(suit) && suit.index)
+ suit_sprite = "[INV_SUIT_DEF_ICON]_[suit.index].dmi"
+ else if(istype(suit, /obj/item/clothing) && !isnull(suit.update_icon_define))
+ suit_sprite = suit.update_icon_define
+ else
+ suit_sprite = "[INV_SUIT_DEF_ICON].dmi"
+
+ var/icon/c_mask = null
+ var/tail_is_rendered = (overlays_standing[TAIL_LAYER] || overlays_standing[TAIL_LAYER_ALT])
+ var/valid_clip_mask = tail_style?.clip_mask
+
+ if(tail_is_rendered && valid_clip_mask && !(istype(suit) && suit.taurized)) //Clip the lower half of the suit off using the tail's clip mask for taurs since taur bodies aren't hidden.
+ c_mask = valid_clip_mask
+ overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = suit_sprite, default_layer = SUIT_LAYER, clip_mask = c_mask)
+
+ apply_layer(SUIT_LAYER)
+
+/mob/living/carbon/human/update_inv_pockets()
+ crash_with("Someone called update_inv_pockets even though it's dumb")
+
+/mob/living/carbon/human/update_inv_wear_mask()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(FACEMASK_LAYER)
+
+ if(!wear_mask || (head && head.flags_inv & HIDEMASK))
+ return //Why bother, nothing in mask slot.
+
+ overlays_standing[FACEMASK_LAYER] = wear_mask.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_mask_str, default_icon = INV_MASK_DEF_ICON, default_layer = FACEMASK_LAYER)
+
+ apply_layer(FACEMASK_LAYER)
+
+/mob/living/carbon/human/update_inv_back()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(BACK_LAYER)
+
+ if(!back)
+ return //Why do anything
+
+ overlays_standing[BACK_LAYER] = back.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_back_str, default_icon = INV_BACK_DEF_ICON, default_layer = BACK_LAYER)
+
+ apply_layer(BACK_LAYER)
+
+//TODO: Carbon procs in my human update_icons??
+/mob/living/carbon/human/update_hud() //TODO: do away with this if possible
+ if(QDESTROYING(src))
+ return
+
+ if(client)
+ client.screen |= contents
+ if(hud_used)
+ hud_used.hidden_inventory_update() //Updates the screenloc of the items on the 'other' inventory bar
+
+//update whether handcuffs appears on our hud.
+/mob/living/carbon/proc/update_hud_handcuffed()
+ if(QDESTROYING(src))
+ return
+
+ if(hud_used && hud_used.l_hand_hud_object && hud_used.r_hand_hud_object)
+ hud_used.l_hand_hud_object.update_icon()
+ hud_used.r_hand_hud_object.update_icon()
+
+/mob/living/carbon/human/update_inv_handcuffed()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(HANDCUFF_LAYER)
+ update_hud_handcuffed() //TODO
+
+ if(!handcuffed)
+ return //Not cuffed, why bother
+
+ overlays_standing[HANDCUFF_LAYER] = handcuffed.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_handcuffed_str, default_icon = INV_HCUFF_DEF_ICON, default_layer = HANDCUFF_LAYER)
+
+ apply_layer(HANDCUFF_LAYER)
+
+/mob/living/carbon/human/update_inv_legcuffed()
+ if(QDESTROYING(src))
+ return
+
+ clear_alert("legcuffed")
+ remove_layer(LEGCUFF_LAYER)
+
+ if(!legcuffed)
+ return //Not legcuffed, why bother.
+
+ throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed)
+
+ overlays_standing[LEGCUFF_LAYER] = legcuffed.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_legcuffed_str, default_icon = INV_LCUFF_DEF_ICON, default_layer = LEGCUFF_LAYER)
+
+ apply_layer(LEGCUFF_LAYER)
+
+/mob/living/carbon/human/update_inv_r_hand()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(R_HAND_LAYER)
+
+ if(!r_hand)
+ return //No hand, no bother.
+
+ overlays_standing[R_HAND_LAYER] = r_hand.make_worn_icon(body_type = species.get_bodytype(src), inhands = TRUE, slot_name = slot_r_hand_str, default_icon = INV_R_HAND_DEF_ICON, default_layer = R_HAND_LAYER)
+
+ apply_layer(R_HAND_LAYER)
+
+/mob/living/carbon/human/update_inv_l_hand()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(L_HAND_LAYER)
+
+ if(!l_hand)
+ return //No hand, no bother.
+
+ overlays_standing[L_HAND_LAYER] = l_hand.make_worn_icon(body_type = species.get_bodytype(src), inhands = TRUE, slot_name = slot_l_hand_str, default_icon = INV_L_HAND_DEF_ICON, default_layer = L_HAND_LAYER)
+
+ apply_layer(L_HAND_LAYER)
+
+/mob/living/carbon/human/proc/update_tail_showing()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(TAIL_LAYER)
+ remove_layer(TAIL_LAYER_ALT) // Alt Tail Layer
+
+ var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER
+
+ var/image/tail_image = get_tail_image()
+ if(tail_image)
+ tail_image.layer = BODY_LAYER+used_tail_layer
+ overlays_standing[used_tail_layer] = tail_image
+ apply_layer(used_tail_layer)
+ return
+
+ var/species_tail = species.get_tail(src) // Species tail icon_state prefix.
+
+ //This one is actually not that bad I guess.
+ if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL))
+ var/icon/tail_s = get_tail_icon()
+ overlays_standing[used_tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+used_tail_layer) // Alt Tail Layer
+ animate_tail_reset()
+
+//TODO: Is this the appropriate place for this, and not on species...?
+/mob/living/carbon/human/proc/get_tail_icon()
+ var/icon_key = "[species.get_race_key(src)][r_skin][g_skin][b_skin][r_hair][g_hair][b_hair]"
+ var/icon/tail_icon = tail_icon_cache[icon_key]
+ if(!tail_icon)
+ //generate a new one
+ var/species_tail_anim = species.get_tail_animation(src)
+ if(!species_tail_anim && species.icobase_tail) species_tail_anim = species.icobase //Allow override of file for non-animated tails
+ if(!species_tail_anim) species_tail_anim = 'icons/effects/species.dmi'
+ tail_icon = new/icon(species_tail_anim)
+ tail_icon.Blend(rgb(r_skin, g_skin, b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD)
+ // The following will not work with animated tails.
+ var/use_species_tail = species.get_tail_hair(src)
+ if(use_species_tail)
+ var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]")
+ hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //Check for species color_mult
+ tail_icon.Blend(hair_icon, ICON_OVERLAY)
+ tail_icon_cache[icon_key] = tail_icon
+
+ return tail_icon
+
+/mob/living/carbon/human/proc/set_tail_state(var/t_state)
+ var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // Alt Tail Layer
+ var/image/tail_overlay = overlays_standing[used_tail_layer]
+
+ remove_layer(TAIL_LAYER)
+ remove_layer(TAIL_LAYER_ALT)
+
+ if(tail_overlay)
+ overlays_standing[used_tail_layer] = tail_overlay
+ if(species.get_tail_animation(src))
+ tail_overlay.icon_state = t_state
+ . = tail_overlay
+
+ apply_layer(used_tail_layer)
+
+//Not really once, since BYOND can't do that.
+//Update this if the ability to flick() images or make looping animation start at the first frame is ever added.
+//You can sort of flick images now with flick_overlay -Aro
+/mob/living/carbon/human/proc/animate_tail_once()
+ if(QDESTROYING(src))
+ return
+
+ var/t_state = "[species.get_tail(src)]_once"
+ var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // Alt Tail Layer
+
+ var/image/tail_overlay = overlays_standing[used_tail_layer] // Alt Tail Layer
+ if(tail_overlay && tail_overlay.icon_state == t_state)
+ return //let the existing animation finish
+
+ tail_overlay = set_tail_state(t_state) // Calls remove_layer & apply_layer
+ if(tail_overlay)
+ spawn(20)
+ //check that the animation hasn't changed in the meantime
+ if(overlays_standing[used_tail_layer] == tail_overlay && tail_overlay.icon_state == t_state) // Alt Tail Layer
+ animate_tail_stop()
+
+/mob/living/carbon/human/proc/animate_tail_start()
+ if(QDESTROYING(src))
+ return
+
+ set_tail_state("[species.get_tail(src)]_slow[rand(0,9)]")
+
+/mob/living/carbon/human/proc/animate_tail_fast()
+ if(QDESTROYING(src))
+ return
+
+ set_tail_state("[species.get_tail(src)]_loop[rand(0,9)]")
+
+/mob/living/carbon/human/proc/animate_tail_reset()
+ if(QDESTROYING(src))
+ return
+
+ if(stat != DEAD)
+ set_tail_state("[species.get_tail(src)]_idle[rand(0,9)]")
+ else
+ set_tail_state("[species.get_tail(src)]_static")
+ toggle_tail(FALSE) //So tails stop when someone dies. TODO - Fix this hack ~Leshana
+
+/mob/living/carbon/human/proc/animate_tail_stop()
+ if(QDESTROYING(src))
+ return
+
+ set_tail_state("[species.get_tail(src)]_static")
+
+/mob/living/carbon/human/proc/update_wing_showing()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(WING_LAYER)
+
+ var/image/wing_image = get_wing_image()
+ if(wing_image)
+ wing_image.layer = BODY_LAYER+WING_LAYER
+ overlays_standing[WING_LAYER] = wing_image
+
+ apply_layer(WING_LAYER)
+
+/mob/living/carbon/human/update_modifier_visuals()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(MODIFIER_EFFECTS_LAYER)
+
+ if(!LAZYLEN(modifiers))
+ return //No modifiers, no effects.
+
+ var/image/effects = new()
+ for(var/datum/modifier/M in modifiers)
+ if(M.mob_overlay_state)
+ var/image/I = image(icon = 'icons/mob/modifier_effects.dmi', icon_state = M.mob_overlay_state)
+ effects.overlays += I //TODO, this compositing is annoying.
+
+ overlays_standing[MODIFIER_EFFECTS_LAYER] = effects
+
+ apply_layer(MODIFIER_EFFECTS_LAYER)
+
+/mob/living/carbon/human/update_fire()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(FIRE_LAYER)
+
+ if(!on_fire)
+ return
+
+ overlays_standing[FIRE_LAYER] = image(icon = 'icons/mob/OnFire.dmi', icon_state = get_fire_icon_state(), layer = BODY_LAYER+FIRE_LAYER)
+
+ apply_layer(FIRE_LAYER)
+
+/mob/living/carbon/human/update_water()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(WATER_LAYER)
+
+ var/depth = check_submerged()
+ if(!depth || lying)
+ return
+
+ var/atom/A = loc // We'd better be swimming and on a turf
+ var/image/I = image(icon = 'icons/mob/submerged.dmi', icon_state = "human_swimming_[depth]", layer = BODY_LAYER+WATER_LAYER) //TODO: Improve
+ I.color = A.color
+ overlays_standing[WATER_LAYER] = I
+
+ apply_layer(WATER_LAYER)
+
+/mob/living/carbon/human/proc/update_surgery()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(SURGERY_LAYER)
+
+ var/image/total = new
+ for(var/obj/item/organ/external/E in organs)
+ if(E.open)
+ var/image/I = image(icon = 'icons/mob/surgery.dmi', icon_state = "[E.icon_name][round(E.open)]", layer = BODY_LAYER+SURGERY_LAYER)
+ total.overlays += I //TODO: This compositing is annoying
+
+ if(total.overlays.len)
+ overlays_standing[SURGERY_LAYER] = total
+ apply_layer(SURGERY_LAYER)
+
+/mob/living/carbon/human/proc/get_wing_image()
+ if(QDESTROYING(src))
+ return
+
+ //If you are FBP with wing style and didn't set a custom one
+ if(synthetic && synthetic.includes_wing && !wing_style)
+ var/icon/wing_s = new/icon("icon" = synthetic.icon, "icon_state" = "wing") //I dunno. If synths have some custom wing?
+ wing_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD)
+ return image(wing_s)
+
+ //If you have custom wings selected
+ if(wing_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL))
+ var/icon/wing_s = new/icon("icon" = wing_style.icon, "icon_state" = flapping && wing_style.ani_state ? wing_style.ani_state : wing_style.icon_state)
+ if(wing_style.do_colouration)
+ wing_s.Blend(rgb(src.r_wing, src.g_wing, src.b_wing), wing_style.color_blend_mode)
+ if(wing_style.extra_overlay)
+ var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay)
+ overlay.Blend(rgb(src.r_wing2, src.g_wing2, src.b_wing2), wing_style.color_blend_mode)
+ wing_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+ if(wing_style.extra_overlay2)
+ var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2)
+ if(wing_style.ani_state)
+ overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2_w)
+ overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode)
+ wing_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+ else
+ overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode)
+ wing_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+ return image(wing_s)
+
+/mob/living/carbon/human/proc/get_ears_overlay()
+ if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR)))
+ var/icon/ears_s = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.icon_state)
+ if(ear_style.do_colouration)
+ ears_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), ear_style.color_blend_mode)
+ if(ear_style.extra_overlay)
+ var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay)
+ overlay.Blend(rgb(src.r_ears2, src.g_ears2, src.b_ears2), ear_style.color_blend_mode)
+ ears_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+ if(ear_style.extra_overlay2) //MORE COLOURS IS BETTERER
+ var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay2)
+ overlay.Blend(rgb(src.r_ears3, src.g_ears3, src.b_ears3), ear_style.color_blend_mode)
+ ears_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+ return ears_s
+ return null
+
+
+/mob/living/carbon/human/proc/get_tail_image()
+ //If you are FBP with tail style and didn't set a custom one
+ var/datum/robolimb/model = isSynthetic()
+ if(istype(model) && model.includes_tail && !tail_style)
+ var/icon/tail_s = new/icon("icon" = synthetic.icon, "icon_state" = "tail")
+ tail_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD)
+ return image(tail_s)
+
+ //If you have a custom tail selected
+ if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !isTaurTail(tail_style)))
+ var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state)
+ if(tail_style.do_colouration)
+ tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode)
+ if(tail_style.extra_overlay)
+ var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay)
+ if(wagging && tail_style.ani_state)
+ overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w)
+ overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode)
+ tail_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+ else
+ overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode)
+ tail_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+
+ if(tail_style.extra_overlay2)
+ var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2)
+ if(wagging && tail_style.ani_state)
+ overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2_w)
+ overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode)
+ tail_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+ else
+ overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode)
+ tail_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+
+ if(isTaurTail(tail_style))
+ var/datum/sprite_accessory/tail/taur/taurtype = tail_style
+ if(taurtype.can_ride && !riding_datum)
+ riding_datum = new /datum/riding/taur(src)
+ verbs |= /mob/living/carbon/human/proc/taur_mount
+ verbs |= /mob/living/proc/toggle_rider_reins
+ return image(tail_s, "pixel_x" = -16)
+ else
+ return image(tail_s)
+ return null
+
+// TODO - Move this to where it should go ~Leshana
+/mob/living/proc/stop_flying()
+ if(QDESTROYING(src))
+ return
+ flying = FALSE
+ return 1
+
+/mob/living/carbon/human/stop_flying()
+ if((. = ..()))
+ update_wing_showing()
+
+//Human Overlays Indexes/////////
+#undef MUTATIONS_LAYER
+#undef SKIN_LAYER
+#undef DAMAGE_LAYER
+#undef SURGERY_LAYER
+#undef UNDERWEAR_LAYER
+#undef SHOES_LAYER_ALT
+#undef UNIFORM_LAYER
+#undef ID_LAYER
+#undef SHOES_LAYER
+#undef GLOVES_LAYER
+#undef BELT_LAYER
+#undef SUIT_LAYER
+#undef TAIL_LAYER
+#undef GLASSES_LAYER
+#undef BELT_LAYER_ALT
+#undef SUIT_STORE_LAYER
+#undef BACK_LAYER
+#undef HAIR_LAYER
+#undef EARS_LAYER
+#undef EYES_LAYER
+#undef FACEMASK_LAYER
+#undef HEAD_LAYER
+#undef COLLAR_LAYER
+#undef HANDCUFF_LAYER
+#undef LEGCUFF_LAYER
+#undef L_HAND_LAYER
+#undef R_HAND_LAYER
+#undef MODIFIER_EFFECTS_LAYER
+#undef FIRE_LAYER
+#undef WATER_LAYER
+#undef TARGETED_LAYER
+#undef TOTAL_LAYERS
diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm
index 7b9bb15baa6..352221f66fe 100644
--- a/code/modules/mob/update_icons.dm
+++ b/code/modules/mob/update_icons.dm
@@ -9,17 +9,8 @@
return
// Obsolete
-/mob/proc/update_icons_layers()
- return
-
-/mob/proc/update_icons_huds()
- return
-
/mob/proc/update_icons_body()
return
-
-/mob/proc/update_icons_all()
- return
// End obsolete
/mob/proc/update_hud()
diff --git a/code/modules/overmap/spacetravel.dm b/code/modules/overmap/spacetravel.dm
index cf1787c4ab2..f3efcd3fc48 100644
--- a/code/modules/overmap/spacetravel.dm
+++ b/code/modules/overmap/spacetravel.dm
@@ -73,7 +73,7 @@ proc/get_deepspace(x,y)
/mob/lost_in_space()
return isnull(client)
-/mob/living/lost_in_space()
+/mob/living/carbon/human/lost_in_space()
return FALSE
// return isnull(client) && !key && stat == DEAD // Allows bodies that players have ghosted from to be deleted - Ater
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 2e0db3877d5..aa50a4b79f9 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -313,7 +313,8 @@
if(spill)
splash(target.loc, spill, multiplier, copy, min_spill, max_spill)
- trans_to(target, amount, multiplier, copy)
+ if(!trans_to(target, amount, multiplier, copy))
+ touch(target, amount)
/datum/reagents/proc/trans_type_to(var/target, var/rtype, var/amount = 1)
if (!target)
diff --git a/html/changelogs/woodrat - idtweaks.yml b/html/changelogs/woodrat - idtweaks.yml
new file mode 100644
index 00000000000..4c5edc64717
--- /dev/null
+++ b/html/changelogs/woodrat - idtweaks.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Woodrat
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Minor adjustment of ID icons."
\ No newline at end of file
diff --git a/icons/mob/uniform_rolled_down.dmi b/icons/mob/uniform_rolled_down.dmi
index 95a013291d0..b5002751cf6 100644
Binary files a/icons/mob/uniform_rolled_down.dmi and b/icons/mob/uniform_rolled_down.dmi differ
diff --git a/icons/mob/uniform_sleeves_rolled.dmi b/icons/mob/uniform_sleeves_rolled.dmi
index 0e7e8783075..1c7c6ef7c39 100644
Binary files a/icons/mob/uniform_sleeves_rolled.dmi and b/icons/mob/uniform_sleeves_rolled.dmi differ
diff --git a/icons/obj/card_new.dmi b/icons/obj/card_new.dmi
index f5b658ccd07..8c2143b8f3e 100644
Binary files a/icons/obj/card_new.dmi and b/icons/obj/card_new.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 6c5a251283c..f558d3fd493 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/maps/submaps/engine_submaps/southern_cross/engine_tesla.dmm b/maps/submaps/engine_submaps/southern_cross/engine_tesla.dmm
index c6787641caf..1f81261b4f3 100644
--- a/maps/submaps/engine_submaps/southern_cross/engine_tesla.dmm
+++ b/maps/submaps/engine_submaps/southern_cross/engine_tesla.dmm
@@ -1,201 +1,2817 @@
-"aa" = (/turf/template_noop,/area/template_noop)
-"ab" = (/turf/space,/area/space)
-"ac" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
-"ad" = (/obj/structure/lattice,/turf/space,/area/space)
-"ae" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 28},/obj/effect/floor_decal/corner/yellow/bordercorner,/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"af" = (/turf/simulated/wall/r_wall,/area/engineering/engine_room)
-"ah" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/engineering,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/firedoor/glass,/turf/simulated/floor,/area/engineering/engine_waste)
-"ai" = (/turf/simulated/wall/r_wall,/area/engineering/engine_waste)
-"aj" = (/turf/simulated/floor/airless,/area/space)
-"ak" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air/airlock{start_pressure = 4559.63},/turf/simulated/floor,/area/engineering/engine_waste)
-"al" = (/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/power/emitter{anchored = 1; dir = 1; state = 1},/turf/simulated/floor/airless,/area/space)
-"am" = (/obj/machinery/field_generator,/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/turf/simulated/floor,/area/engineering/engine_waste)
-"an" = (/obj/machinery/field_generator,/turf/simulated/floor,/area/engineering/engine_waste)
-"ao" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering/engine_waste)
-"aq" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/yellow/border{dir = 5},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"ar" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/space)
-"as" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/engine_waste)
-"at" = (/obj/structure/closet/emcloset,/obj/machinery/embedded_controller/radio/airlock/airlock_controller{id_tag = "eng_north_airlock"; pixel_x = 24; req_one_access = list(10,11); tag_airpump = "eng_north_pump"; tag_chamber_sensor = "eng_north_sensor"; tag_exterior_door = "eng_north_outer"; tag_interior_door = "eng_north_inner"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
-"au" = (/turf/template_noop,/area/engineering/engine_waste)
-"av" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/engine_waste)
-"aw" = (/obj/machinery/alarm{dir = 8; pixel_x = 24},/obj/structure/table/standard,/obj/item/stack/cable_coil/random,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/screwdriver,/turf/simulated/floor,/area/engineering/engine_waste)
-"ax" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -28},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/engineering/engine_waste)
-"ay" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/yellow/border{dir = 9},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"az" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aA" = (/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aB" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eng_north_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(10,11,13)},/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_north_outer"; locked = 1; name = "Engine North Airlock Exterior"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
-"aC" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eng_north_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(10,11)},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aD" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/yellow/border{dir = 5},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aF" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aG" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aH" = (/obj/machinery/door/airlock/glass_engineering,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/submap/pa_room)
-"aI" = (/obj/machinery/power/sensor{name = "Powernet Sensor - Engine Power"; name_tag = "Engine Power"},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engineering/engine_waste)
-"aK" = (/obj/machinery/camera/network/engine{dir = 1},/obj/structure/table/standard,/obj/item/weapon/circuitboard/tesla_coil,/obj/item/weapon/circuitboard/tesla_coil,/turf/simulated/floor,/area/engineering/engine_waste)
-"aL" = (/turf/simulated/wall/r_wall,/area/space)
-"aM" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aN" = (/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/yellow/bordercorner,/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aO" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aP" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aQ" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/yellow/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aR" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aS" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light_switch{pixel_y = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aT" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aU" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/yellow/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aV" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"aX" = (/obj/machinery/power/tesla_coil,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/space)
-"aY" = (/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/yellow/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"ba" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"bb" = (/obj/effect/floor_decal/steeldecal/steel_decals_central5{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"bc" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"bd" = (/obj/effect/floor_decal/techfloor/orange{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/pa_room)
-"bf" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"},/turf/simulated/wall/r_wall,/area/submap/pa_room)
-"bh" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; dir = 1; id = "SupermatterPort"; name = "Observation Blast Doors"; pixel_x = -4; pixel_y = -24; req_access = list(10)},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"bi" = (/turf/simulated/wall/r_wall,/area/submap/pa_room)
-"bj" = (/obj/machinery/field_generator{anchored = 1; state = 1},/turf/simulated/floor/airless,/area/space)
-"bk" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"bl" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless,/area/space)
-"bm" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless,/area/space)
-"bo" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor,/area/submap/pa_room)
-"bp" = (/obj/machinery/power/grounding_rod,/turf/simulated/floor/airless,/area/space)
-"bq" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless,/area/space)
-"br" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_engineering,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/submap/pa_room)
-"bs" = (/obj/structure/cable/cyan,/obj/machinery/power/emitter{anchored = 1; state = 1},/turf/simulated/floor/airless,/area/space)
-"bt" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/rust/mono_rusted1,/turf/simulated/floor/airless,/area/space)
-"bv" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eng_north_pump"},/obj/machinery/light/small,/obj/machinery/airlock_sensor{id_tag = "eng_north_sensor"; pixel_y = -25},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
-"bw" = (/turf/simulated/floor/tiled,/area/submap/pa_room)
-"by" = (/obj/machinery/light{dir = 1},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "EngineRadiatorViewport"; name = "Viewport Blast Doors"; pixel_x = -4; pixel_y = 24; req_access = list(10)},/turf/simulated/floor/tiled,/area/submap/pa_room)
-"bz" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/submap/pa_room)
-"bA" = (/obj/machinery/camera/network/engine{dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/borderfloor/corner2,/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"bB" = (/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_north_inner"; locked = 1; name = "Engine North Airlock Interior"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
-"bC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"bE" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/yellow/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"bF" = (/obj/effect/floor_decal/techfloor/orange/corner{dir = 4},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/pa_room)
-"bG" = (/obj/effect/floor_decal/techfloor/orange{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
-"bH" = (/obj/machinery/particle_accelerator/control_box,/obj/effect/floor_decal/techfloor/orange{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
-"bI" = (/obj/effect/floor_decal/techfloor/orange{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
-"bJ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/submap/pa_room)
-"bL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"bN" = (/obj/machinery/camera/network/engine{dir = 8},/turf/space,/area/space)
-"bO" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/yellow/border{dir = 6},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"bP" = (/obj/machinery/door/blast/regular{density = 0; dir = 2; icon_state = "pdoor0"; id = "SupermatterPort"; name = "Reactor Blast Door"; opacity = 0},/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor,/area/engineering/engine_room)
-"bQ" = (/obj/effect/floor_decal/techfloor/orange{dir = 1},/obj/structure/particle_accelerator/particle_emitter/right{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
-"bS" = (/obj/structure/particle_accelerator/fuel_chamber{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
-"bT" = (/obj/structure/particle_accelerator/end_cap{dir = 8},/obj/effect/floor_decal/techfloor/orange{dir = 4},/obj/effect/floor_decal/techfloor/hole{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
-"bU" = (/obj/machinery/camera/network/engine{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/submap/pa_room)
-"bV" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/submap/pa_room)
-"bW" = (/obj/structure/particle_accelerator/particle_emitter/center{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
-"bX" = (/obj/effect/floor_decal/techfloor/orange,/obj/structure/particle_accelerator/particle_emitter/left{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
-"bY" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/submap/pa_room)
-"bZ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"ca" = (/obj/effect/floor_decal/techfloor/orange,/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
-"cb" = (/obj/item/weapon/extinguisher,/turf/space,/area/space)
-"cc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cd" = (/obj/effect/floor_decal/techfloor/orange{dir = 6},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
-"ce" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cg" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 5},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"ch" = (/obj/machinery/camera/network/engine,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"ci" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/yellow/border{dir = 10},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"ck" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cl" = (/obj/machinery/power/tesla_coil,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/space)
-"cm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/submap/pa_room)
-"cn" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"co" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/item/clothing/head/hardhat,/turf/simulated/floor/airless,/area/space)
-"cp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cq" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 6},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cr" = (/turf/simulated/wall/r_wall,/area/template_noop)
-"cs" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"ct" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cu" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"},/turf/simulated/wall/r_wall,/area/engineering/engine_room)
-"cv" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cw" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/space)
-"cz" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/turf/simulated/floor,/area/submap/pa_room)
-"cA" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eng_south_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 26; req_one_access = list(10,11,13)},/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_south_outer"; locked = 1; name = "Engine South Airlock Exterior"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
-"cB" = (/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_south_inner"; locked = 1; name = "Engine South Airlock Interior"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eng_south_airlock"; name = "interior access button"; pixel_x = 8; pixel_y = -26; req_one_access = list(10,11)},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
-"cC" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/space)
-"cD" = (/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 28},/obj/machinery/light_switch{pixel_y = 24},/turf/simulated/floor/tiled,/area/submap/pa_room)
-"cE" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cF" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 6},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cG" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/submap/pa_room)
-"cH" = (/obj/machinery/alarm{dir = 8; pixel_x = 25},/obj/effect/floor_decal/steeldecal/steel_decals8,/obj/structure/table/standard,/obj/item/weapon/book/manual/tesla_engine,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/tiled,/area/submap/pa_room)
-"cI" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/tesla_coil,/obj/structure/cable/yellow,/turf/simulated/floor/airless,/area/space)
-"cJ" = (/obj/effect/floor_decal/techfloor/orange{dir = 5},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/pa_room)
-"cK" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/door/firedoor/glass,/turf/simulated/floor,/area/submap/pa_room)
-"cL" = (/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/void/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/engineering,/turf/template_noop,/area/template_noop)
-"cM" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/steeldecal/steel_decals_central5{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"cN" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/space)
-"cQ" = (/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_x = 5; pixel_y = 5},/obj/item/weapon/book/manual/tesla_engine,/turf/template_noop,/area/template_noop)
-"fm" = (/obj/machinery/light,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; dir = 1; id = "EngineRadiatorViewport"; name = "Viewport Blast Doors"; pixel_x = -4; pixel_y = -24; req_access = list(10)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/submap/pa_room)
-"hf" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/pa_room)
-"hF" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/turf/simulated/floor,/area/submap/pa_room)
-"hV" = (/obj/structure/particle_accelerator/power_box{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
-"jd" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Observation Blast Doors"; pixel_x = -4; pixel_y = 24; req_access = list(10)},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"ji" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"jt" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"jD" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/space)
-"kd" = (/obj/item/weapon/tool/wirecutters,/turf/simulated/floor/airless,/area/space)
-"kq" = (/obj/effect/floor_decal/steeldecal,/turf/simulated/floor/tiled,/area/submap/pa_room)
-"pr" = (/obj/item/weapon/weldingtool,/turf/simulated/floor/airless,/area/space)
-"qP" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/yellow/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"rv" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"rS" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/yellow/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"rU" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"rV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/airless,/area/space)
-"sq" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/submap/pa_room)
-"vq" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"vr" = (/obj/structure/closet/emcloset,/obj/machinery/embedded_controller/radio/airlock/airlock_controller{id_tag = "eng_south_airlock"; pixel_x = 24; req_one_access = list(10,11); tag_airpump = "eng_south_pump"; tag_chamber_sensor = "eng_south_sensor"; tag_exterior_door = "eng_south_outer"; tag_interior_door = "eng_south_inner"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
-"vV" = (/obj/effect/floor_decal/techfloor/orange,/obj/effect/floor_decal/techfloor/hole,/turf/simulated/floor/tiled/techfloor,/area/submap/pa_room)
-"yC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"yG" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eng_south_pump"},/obj/machinery/airlock_sensor{id_tag = "eng_south_sensor"; pixel_y = 25},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/dark,/area/engineering/engine_room)
-"yI" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/door/firedoor/glass,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/submap/pa_room)
-"An" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/rust,/turf/simulated/floor/airless,/area/space)
-"Bi" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/space)
-"Bp" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/yellow/bordercorner2,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"EG" = (/obj/machinery/the_singularitygen/tesla{anchored = 1},/turf/simulated/floor/airless,/area/space)
-"Gj" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/structure/window/reinforced,/turf/simulated/floor,/area/submap/pa_room)
-"Ia" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"Ms" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"My" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"NG" = (/obj/structure/cable/yellow,/obj/machinery/power/tesla_coil,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/space)
-"Of" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/yellow/border{dir = 10},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"SX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"Tu" = (/obj/effect/floor_decal/techfloor/orange/corner,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/pa_room)
-"TM" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"WG" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/yellow/border{dir = 6},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/engineering/engine_room)
-"Xy" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Radiation Collector Blast Doors"; pixel_x = -6; pixel_y = 7; req_access = list(10)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; pixel_x = 5; pixel_y = 7; req_access = list(10)},/obj/effect/engine_setup/shutters,/turf/template_noop,/area/template_noop)
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aa" = (
+/turf/template_noop,
+/area/template_noop)
+"ab" = (
+/turf/space,
+/area/space)
+"ac" = (
+/obj/structure/lattice,
+/obj/structure/grille,
+/turf/space,
+/area/space)
+"ad" = (
+/obj/structure/lattice,
+/turf/space,
+/area/space)
+"ae" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 4
+ },
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "east bump";
+ pixel_x = 28
+ },
+/obj/effect/floor_decal/corner/yellow/bordercorner,
+/obj/structure/cable/cyan{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"af" = (
+/turf/simulated/wall/r_wall,
+/area/engineering/engine_room)
+"ah" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/engineering,
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor,
+/area/engineering/engine_waste)
+"ai" = (
+/turf/simulated/wall/r_wall,
+/area/engineering/engine_waste)
+"aj" = (
+/turf/simulated/floor/airless,
+/area/space)
+"ak" = (
+/obj/machinery/atmospherics/portables_connector{
+ dir = 4
+ },
+/obj/machinery/portable_atmospherics/canister/air/airlock{
+ start_pressure = 4559.63
+ },
+/turf/simulated/floor,
+/area/engineering/engine_waste)
+"al" = (
+/obj/structure/cable/cyan{
+ d2 = 2;
+ icon_state = "0-2"
+ },
+/obj/machinery/power/emitter{
+ anchored = 1;
+ dir = 1;
+ state = 1
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"am" = (
+/obj/machinery/field_generator,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 10
+ },
+/turf/simulated/floor,
+/area/engineering/engine_waste)
+"an" = (
+/obj/machinery/field_generator,
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
+/turf/simulated/floor,
+/area/engineering/engine_waste)
+"ao" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden{
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/turf/simulated/floor,
+/area/engineering/engine_waste)
+"aq" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 5
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 5
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"ar" = (
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"as" = (
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 5
+ },
+/turf/simulated/floor,
+/area/engineering/engine_waste)
+"at" = (
+/obj/structure/closet/emcloset,
+/obj/machinery/embedded_controller/radio/airlock/airlock_controller{
+ id_tag = "eng_north_airlock";
+ pixel_x = 24;
+ req_one_access = list(10,11);
+ tag_airpump = "eng_north_pump";
+ tag_chamber_sensor = "eng_north_sensor";
+ tag_exterior_door = "eng_north_outer";
+ tag_interior_door = "eng_north_inner"
+ },
+/turf/simulated/floor/tiled/dark,
+/area/engineering/engine_room)
+"au" = (
+/turf/template_noop,
+/area/engineering/engine_waste)
+"av" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden{
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor,
+/area/engineering/engine_waste)
+"aw" = (
+/obj/machinery/alarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/structure/table/standard,
+/obj/item/stack/cable_coil/random,
+/obj/item/weapon/tool/wrench,
+/obj/item/weapon/tool/screwdriver,
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/engineering/engine_waste)
+"ax" = (
+/obj/machinery/power/apc{
+ dir = 8;
+ name = "west bump";
+ pixel_x = -28
+ },
+/obj/structure/cable/green{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/turf/simulated/floor,
+/area/engineering/engine_waste)
+"ay" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 9
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"az" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aA" = (
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aB" = (
+/obj/machinery/access_button{
+ command = "cycle_exterior";
+ frequency = 1379;
+ master_tag = "eng_north_airlock";
+ name = "exterior access button";
+ pixel_x = -5;
+ pixel_y = -26;
+ req_one_access = list(10,11,13)
+ },
+/obj/machinery/door/airlock/glass_external{
+ frequency = 1379;
+ icon_state = "door_locked";
+ id_tag = "eng_north_outer";
+ locked = 1;
+ name = "Engine North Airlock Exterior"
+ },
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled/dark,
+/area/engineering/engine_room)
+"aC" = (
+/obj/machinery/access_button{
+ command = "cycle_interior";
+ frequency = 1379;
+ master_tag = "eng_north_airlock";
+ name = "interior access button";
+ pixel_x = -28;
+ pixel_y = 26;
+ req_one_access = list(10,11)
+ },
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/structure/sign/securearea{
+ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'";
+ icon_state = "space";
+ layer = 4;
+ name = "EXTERNAL AIRLOCK";
+ pixel_y = 32
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 10
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 1
+ },
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/yellow/bordercorner2{
+ dir = 4
+ },
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aD" = (
+/obj/structure/cable/cyan{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 5
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 5
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aF" = (
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 9
+ },
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aG" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aH" = (
+/obj/machinery/door/airlock/glass_engineering,
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"aI" = (
+/obj/machinery/power/sensor{
+ name = "Powernet Sensor - Engine Power";
+ name_tag = "Engine Power"
+ },
+/obj/structure/cable/cyan{
+ d2 = 2;
+ icon_state = "0-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/simulated/floor,
+/area/engineering/engine_waste)
+"aK" = (
+/obj/machinery/camera/network/engine{
+ dir = 1
+ },
+/obj/structure/table/standard,
+/obj/item/weapon/circuitboard/tesla_coil,
+/obj/item/weapon/circuitboard/tesla_coil,
+/turf/simulated/floor,
+/area/engineering/engine_waste)
+"aL" = (
+/turf/simulated/wall/r_wall,
+/area/space)
+"aM" = (
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aN" = (
+/obj/effect/floor_decal/borderfloor/corner,
+/obj/effect/floor_decal/corner/yellow/bordercorner,
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aO" = (
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/yellow/border,
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aP" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aQ" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/effect/floor_decal/borderfloor/corner{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/yellow/bordercorner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aR" = (
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aS" = (
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/light_switch{
+ pixel_y = 24
+ },
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aT" = (
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aU" = (
+/obj/structure/cable/cyan{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/effect/floor_decal/borderfloor/corner{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/yellow/bordercorner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aV" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"aX" = (
+/obj/machinery/power/tesla_coil,
+/obj/structure/cable/yellow{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"aY" = (
+/obj/effect/floor_decal/borderfloor/corner{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/yellow/bordercorner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"ba" = (
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"bb" = (
+/obj/effect/floor_decal/steeldecal/steel_decals_central5{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"bc" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden{
+ dir = 4
+ },
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"bd" = (
+/obj/effect/floor_decal/techfloor/orange{
+ dir = 6
+ },
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/submap/pa_room)
+"bf" = (
+/obj/structure/sign/securearea{
+ desc = "A warning sign which reads 'RADIOACTIVE AREA'";
+ icon_state = "radiation";
+ name = "RADIOACTIVE AREA"
+ },
+/turf/simulated/wall/r_wall,
+/area/submap/pa_room)
+"bh" = (
+/obj/machinery/button/remote/blast_door{
+ desc = "A remote control-switch for the engine charging port.";
+ dir = 1;
+ id = "SupermatterPort";
+ name = "Observation Blast Doors";
+ pixel_x = -4;
+ pixel_y = -24;
+ req_access = list(10)
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"bi" = (
+/turf/simulated/wall/r_wall,
+/area/submap/pa_room)
+"bj" = (
+/obj/machinery/field_generator{
+ anchored = 1;
+ state = 1
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"bk" = (
+/obj/structure/cable/cyan{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"bl" = (
+/obj/structure/cable/cyan{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"bm" = (
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/structure/cable/cyan{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"bo" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/door/blast/regular{
+ density = 0;
+ icon_state = "pdoor0";
+ id = "EngineRadiatorViewport";
+ name = "Engine Radiator Viewport Shutter";
+ opacity = 0
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/submap/pa_room)
+"bp" = (
+/obj/machinery/power/grounding_rod,
+/turf/simulated/floor/airless,
+/area/space)
+"bq" = (
+/obj/structure/cable/cyan{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"br" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/glass_engineering,
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"bs" = (
+/obj/structure/cable/cyan,
+/obj/machinery/power/emitter{
+ anchored = 1;
+ state = 1
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"bt" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/effect/floor_decal/rust/mono_rusted1,
+/turf/simulated/floor/airless,
+/area/space)
+"bv" = (
+/obj/machinery/atmospherics/unary/vent_pump/high_volume{
+ dir = 4;
+ frequency = 1379;
+ id_tag = "eng_north_pump"
+ },
+/obj/machinery/light/small,
+/obj/machinery/airlock_sensor{
+ id_tag = "eng_north_sensor";
+ pixel_y = -25
+ },
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled/dark,
+/area/engineering/engine_room)
+"bw" = (
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"by" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/button/remote/blast_door{
+ desc = "A remote control-switch for the engine charging port.";
+ id = "EngineRadiatorViewport";
+ name = "Viewport Blast Doors";
+ pixel_x = -4;
+ pixel_y = 24;
+ req_access = list(10)
+ },
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"bz" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"bA" = (
+/obj/machinery/camera/network/engine{
+ dir = 1
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/borderfloor/corner2,
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"bB" = (
+/obj/machinery/door/airlock/glass_external{
+ frequency = 1379;
+ icon_state = "door_locked";
+ id_tag = "eng_north_inner";
+ locked = 1;
+ name = "Engine North Airlock Interior"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 4
+ },
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled/dark,
+/area/engineering/engine_room)
+"bC" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"bE" = (
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 6
+ },
+/obj/structure/cable/cyan{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/effect/floor_decal/borderfloor/corner{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/yellow/bordercorner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"bF" = (
+/obj/effect/floor_decal/techfloor/orange/corner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/submap/pa_room)
+"bG" = (
+/obj/effect/floor_decal/techfloor/orange{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/submap/pa_room)
+"bH" = (
+/obj/machinery/particle_accelerator/control_box,
+/obj/effect/floor_decal/techfloor/orange{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/submap/pa_room)
+"bI" = (
+/obj/effect/floor_decal/techfloor/orange{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/submap/pa_room)
+"bJ" = (
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"bL" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/obj/structure/cable/yellow{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"bN" = (
+/obj/machinery/camera/network/engine{
+ dir = 8
+ },
+/turf/space,
+/area/space)
+"bO" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 6
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"bP" = (
+/obj/machinery/door/blast/regular{
+ density = 0;
+ dir = 2;
+ icon_state = "pdoor0";
+ id = "SupermatterPort";
+ name = "Reactor Blast Door";
+ opacity = 0
+ },
+/obj/machinery/door/firedoor/glass,
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/structure/window/reinforced{
+ dir = 8;
+ health = 1e+006
+ },
+/turf/simulated/floor,
+/area/engineering/engine_room)
+"bQ" = (
+/obj/effect/floor_decal/techfloor/orange{
+ dir = 1
+ },
+/obj/structure/particle_accelerator/particle_emitter/right{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/submap/pa_room)
+"bS" = (
+/obj/structure/particle_accelerator/fuel_chamber{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/submap/pa_room)
+"bT" = (
+/obj/structure/particle_accelerator/end_cap{
+ dir = 8
+ },
+/obj/effect/floor_decal/techfloor/orange{
+ dir = 4
+ },
+/obj/effect/floor_decal/techfloor/hole{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/submap/pa_room)
+"bU" = (
+/obj/machinery/camera/network/engine{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"bV" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/turf/simulated/floor,
+/area/submap/pa_room)
+"bW" = (
+/obj/structure/particle_accelerator/particle_emitter/center{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/submap/pa_room)
+"bX" = (
+/obj/effect/floor_decal/techfloor/orange,
+/obj/structure/particle_accelerator/particle_emitter/left{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/submap/pa_room)
+"bY" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/machinery/door/firedoor/glass,
+/obj/structure/cable/yellow{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/turf/simulated/floor,
+/area/submap/pa_room)
+"bZ" = (
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"ca" = (
+/obj/effect/floor_decal/techfloor/orange,
+/turf/simulated/floor/tiled/techfloor,
+/area/submap/pa_room)
+"cb" = (
+/obj/item/weapon/extinguisher,
+/turf/space,
+/area/space)
+"cc" = (
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cd" = (
+/obj/effect/floor_decal/techfloor/orange{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/submap/pa_room)
+"ce" = (
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 5
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cf" = (
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cg" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 5
+ },
+/obj/effect/floor_decal/corner/yellow/bordercorner2{
+ dir = 5
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"ch" = (
+/obj/machinery/camera/network/engine,
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"ci" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 10
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 10
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cj" = (
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/effect/floor_decal/borderfloor/corner{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"ck" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/structure/cable/yellow{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cl" = (
+/obj/machinery/power/tesla_coil,
+/obj/structure/cable/yellow{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/obj/structure/cable/yellow{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"cm" = (
+/obj/structure/cable/yellow{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"cn" = (
+/obj/structure/cable/yellow{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"co" = (
+/obj/structure/cable/yellow{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/item/clothing/head/hardhat,
+/turf/simulated/floor/airless,
+/area/space)
+"cp" = (
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 9
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cq" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/yellow/bordercorner2{
+ dir = 6
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cr" = (
+/turf/simulated/wall/r_wall,
+/area/template_noop)
+"cs" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"ct" = (
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/effect/floor_decal/borderfloor,
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cu" = (
+/obj/structure/sign/securearea{
+ desc = "A warning sign which reads 'RADIOACTIVE AREA'";
+ icon_state = "radiation";
+ name = "RADIOACTIVE AREA"
+ },
+/turf/simulated/wall/r_wall,
+/area/engineering/engine_room)
+"cv" = (
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cw" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cx" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/effect/floor_decal/borderfloor/corner{
+ dir = 8
+ },
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cy" = (
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"cz" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/machinery/door/firedoor/glass,
+/obj/structure/window/reinforced{
+ dir = 8;
+ health = 1e+006
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/machinery/door/blast/regular{
+ density = 0;
+ icon_state = "pdoor0";
+ id = "EngineRadiatorViewport";
+ name = "Engine Radiator Viewport Shutter";
+ opacity = 0
+ },
+/turf/simulated/floor,
+/area/submap/pa_room)
+"cA" = (
+/obj/machinery/access_button{
+ command = "cycle_exterior";
+ frequency = 1379;
+ master_tag = "eng_south_airlock";
+ name = "exterior access button";
+ pixel_x = -5;
+ pixel_y = 26;
+ req_one_access = list(10,11,13)
+ },
+/obj/machinery/door/airlock/glass_external{
+ frequency = 1379;
+ icon_state = "door_locked";
+ id_tag = "eng_south_outer";
+ locked = 1;
+ name = "Engine South Airlock Exterior"
+ },
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled/dark,
+/area/engineering/engine_room)
+"cB" = (
+/obj/machinery/door/airlock/glass_external{
+ frequency = 1379;
+ icon_state = "door_locked";
+ id_tag = "eng_south_inner";
+ locked = 1;
+ name = "Engine South Airlock Interior"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 4
+ },
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/access_button{
+ command = "cycle_interior";
+ frequency = 1379;
+ master_tag = "eng_south_airlock";
+ name = "interior access button";
+ pixel_x = 8;
+ pixel_y = -26;
+ req_one_access = list(10,11)
+ },
+/turf/simulated/floor/tiled/dark,
+/area/engineering/engine_room)
+"cC" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"cD" = (
+/obj/structure/cable/cyan{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "east bump";
+ pixel_x = 28
+ },
+/obj/machinery/light_switch{
+ pixel_y = 24
+ },
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"cE" = (
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cF" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/yellow/bordercorner2{
+ dir = 6
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cG" = (
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"cH" = (
+/obj/machinery/alarm{
+ dir = 8;
+ pixel_x = 25
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals8,
+/obj/structure/table/standard,
+/obj/item/weapon/book/manual/tesla_engine,
+/obj/item/weapon/book/manual/engineering_particle_accelerator{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"cI" = (
+/obj/structure/cable/yellow{
+ d2 = 2;
+ icon_state = "0-2"
+ },
+/obj/machinery/power/tesla_coil,
+/obj/structure/cable/yellow,
+/turf/simulated/floor/airless,
+/area/space)
+"cJ" = (
+/obj/effect/floor_decal/techfloor/orange{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/submap/pa_room)
+"cK" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/structure/window/reinforced{
+ dir = 8;
+ health = 1e+006
+ },
+/obj/machinery/door/blast/regular{
+ density = 0;
+ icon_state = "pdoor0";
+ id = "EngineRadiatorViewport";
+ name = "Engine Radiator Viewport Shutter";
+ opacity = 0
+ },
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor,
+/area/submap/pa_room)
+"cL" = (
+/obj/structure/table/rack{
+ dir = 8;
+ layer = 2.6
+ },
+/obj/item/clothing/shoes/magboots,
+/obj/item/clothing/mask/breath,
+/obj/item/clothing/suit/space/void/engineering,
+/obj/item/clothing/mask/breath,
+/obj/item/clothing/head/helmet/space/void/engineering,
+/turf/template_noop,
+/area/template_noop)
+"cM" = (
+/obj/structure/cable/yellow{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals_central5{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"cN" = (
+/obj/structure/cable/yellow{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"cQ" = (
+/obj/item/weapon/book/manual/engineering_particle_accelerator{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/item/weapon/book/manual/tesla_engine,
+/turf/template_noop,
+/area/template_noop)
+"fm" = (
+/obj/machinery/light,
+/obj/machinery/button/remote/blast_door{
+ desc = "A remote control-switch for the engine charging port.";
+ dir = 1;
+ id = "EngineRadiatorViewport";
+ name = "Viewport Blast Doors";
+ pixel_x = -4;
+ pixel_y = -24;
+ req_access = list(10)
+ },
+/obj/structure/cable/yellow{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"hf" = (
+/obj/structure/cable/yellow{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/submap/pa_room)
+"hF" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/machinery/door/firedoor/glass,
+/obj/structure/window/reinforced{
+ dir = 8;
+ health = 1e+006
+ },
+/obj/structure/window/reinforced,
+/obj/machinery/door/blast/regular{
+ density = 0;
+ icon_state = "pdoor0";
+ id = "EngineRadiatorViewport";
+ name = "Engine Radiator Viewport Shutter";
+ opacity = 0
+ },
+/turf/simulated/floor,
+/area/submap/pa_room)
+"hV" = (
+/obj/structure/particle_accelerator/power_box{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/submap/pa_room)
+"jd" = (
+/obj/machinery/button/remote/blast_door{
+ desc = "A remote control-switch for the engine charging port.";
+ id = "SupermatterPort";
+ name = "Observation Blast Doors";
+ pixel_x = -4;
+ pixel_y = 24;
+ req_access = list(10)
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"ji" = (
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"jt" = (
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"jD" = (
+/obj/structure/cable/yellow{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"kd" = (
+/obj/item/weapon/tool/wirecutters,
+/turf/simulated/floor/airless,
+/area/space)
+"kq" = (
+/obj/effect/floor_decal/steeldecal,
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"pr" = (
+/obj/item/weapon/weldingtool,
+/turf/simulated/floor/airless,
+/area/space)
+"qP" = (
+/obj/structure/cable/cyan{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/effect/floor_decal/borderfloor/corner{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/yellow/bordercorner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"rv" = (
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 6
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"rS" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/effect/floor_decal/borderfloor/corner{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/yellow/bordercorner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"rU" = (
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/alarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/yellow/border,
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"rV" = (
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"sq" = (
+/obj/structure/cable/yellow{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/turf/simulated/floor/tiled,
+/area/submap/pa_room)
+"vq" = (
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/yellow/border,
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"vr" = (
+/obj/structure/closet/emcloset,
+/obj/machinery/embedded_controller/radio/airlock/airlock_controller{
+ id_tag = "eng_south_airlock";
+ pixel_x = 24;
+ req_one_access = list(10,11);
+ tag_airpump = "eng_south_pump";
+ tag_chamber_sensor = "eng_south_sensor";
+ tag_exterior_door = "eng_south_outer";
+ tag_interior_door = "eng_south_inner"
+ },
+/turf/simulated/floor/tiled/dark,
+/area/engineering/engine_room)
+"vV" = (
+/obj/effect/floor_decal/techfloor/orange,
+/obj/effect/floor_decal/techfloor/hole,
+/turf/simulated/floor/tiled/techfloor,
+/area/submap/pa_room)
+"yC" = (
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/obj/structure/cable/yellow{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"yG" = (
+/obj/machinery/atmospherics/unary/vent_pump/high_volume{
+ dir = 4;
+ frequency = 1379;
+ id_tag = "eng_south_pump"
+ },
+/obj/machinery/airlock_sensor{
+ id_tag = "eng_south_sensor";
+ pixel_y = 25
+ },
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/dark,
+/area/engineering/engine_room)
+"yI" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/structure/window/reinforced{
+ dir = 8;
+ health = 1e+006
+ },
+/obj/machinery/door/blast/regular{
+ density = 0;
+ icon_state = "pdoor0";
+ id = "EngineRadiatorViewport";
+ name = "Engine Radiator Viewport Shutter";
+ opacity = 0
+ },
+/obj/machinery/door/firedoor/glass,
+/obj/structure/cable/yellow{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor,
+/area/submap/pa_room)
+"An" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/obj/effect/floor_decal/rust,
+/turf/simulated/floor/airless,
+/area/space)
+"Bi" = (
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"Bp" = (
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/structure/sign/securearea{
+ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'";
+ icon_state = "space";
+ layer = 4;
+ name = "EXTERNAL AIRLOCK";
+ pixel_y = -32
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 9
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/yellow/border,
+/obj/effect/floor_decal/borderfloor/corner2,
+/obj/effect/floor_decal/corner/yellow/bordercorner2,
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"EG" = (
+/obj/machinery/the_singularitygen/tesla{
+ anchored = 1
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"Gj" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/door/blast/regular{
+ density = 0;
+ icon_state = "pdoor0";
+ id = "EngineRadiatorViewport";
+ name = "Engine Radiator Viewport Shutter";
+ opacity = 0
+ },
+/obj/structure/window/reinforced,
+/turf/simulated/floor,
+/area/submap/pa_room)
+"Ia" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"Ms" = (
+/obj/structure/cable/cyan{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/light,
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/yellow/border,
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"My" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/yellow/border,
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"NG" = (
+/obj/structure/cable/yellow,
+/obj/machinery/power/tesla_coil,
+/obj/structure/cable/yellow{
+ d2 = 2;
+ icon_state = "0-2"
+ },
+/turf/simulated/floor/airless,
+/area/space)
+"Of" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 10
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 10
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"SX" = (
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/obj/structure/cable/yellow{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"Tu" = (
+/obj/effect/floor_decal/techfloor/orange/corner,
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/submap/pa_room)
+"TM" = (
+/obj/structure/cable/cyan{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"WG" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/yellow/border{
+ dir = 6
+ },
+/obj/effect/floor_decal/industrial/hatch/yellow,
+/obj/structure/reagent_dispensers/fueltank,
+/turf/simulated/floor/tiled,
+/area/engineering/engine_room)
+"Xy" = (
+/obj/machinery/button/remote/blast_door{
+ desc = "A remote control-switch for the engine charging port.";
+ id = "SupermatterPort";
+ name = "Radiation Collector Blast Doors";
+ pixel_x = -6;
+ pixel_y = 7;
+ req_access = list(10)
+ },
+/obj/machinery/button/remote/blast_door{
+ desc = "A remote control-switch for the engine control room blast doors.";
+ id = "EngineBlast";
+ name = "Engine Monitoring Room Blast Doors";
+ pixel_x = 5;
+ pixel_y = 7;
+ req_access = list(10)
+ },
+/obj/effect/engine_setup/shutters,
+/turf/template_noop,
+/area/template_noop)
(1,1,1) = {"
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaiaiaiaiaiaaaaaaaa
-abababababababababababababababababababababaiakamanaiaaaaaaaa
-acacacacacadacacacacacabababacacacacacacabaiakaoasauaaaaaaaa
-acababababababababababababababababababababaiakavawaiaaaaaaaa
-acababababababababababababababababababababaiaxaIaKaiaaaaaaaa
-adabababababababababababababababababababafaiaiahaiaiaaaaaaaa
-acacacacacacacacacacacacacacacafafafababafayaAazaqafcraaaaaa
-acababajajblarararararbmararbqafatafafafafaPaAazaYaqafaaaaaa
-acabababajbsajajajajajbsajadbtaBbvbBaCaDafcibEaFaAaVafaaaaaa
-acababababadababadababadababbNafafcucEcwafafaMaNaObOafaaaaaa
-acababababadababadababadabababababbPbZaQaRaSaUaVcrcrcraaaaaa
-acababcbabadababadababadadbpabababbPceaGbabbbcaecraaaaaaaaaa
-acabababbpajaXcNcNcNclcNcoadabababbPbhcsbActcxbkaaaaaaaaaaaa
-acadadadajbjabadabadabbjcyadczbobobfbibrbibibCcFcrcrcraaaaaa
-acabababajababadabadababcIadcKcJbwkqbybzcDbibCcwaacLcQaaaaaa
-acabababajadadprajajadadcyadcKbFbQbGbHbIbJbYbLcwaaaaaaaaaaaa
-acabababajababajEGajababjDcNyIhfbWhVbSbTbUbVSXTMaaaaXyaaaaaa
-acabababajadadajajajadadcyadcKTubXcavVcdcGbYyCcwaaaaaaaaaaaa
-acabababajababadabadababNGadcKbdcmcmfmsqcHbicfcwaaaaaaaaaaaa
-acadadadajbjabadabadabbjcyadhFGjGjbfbiaHbibicfcgcrcraaaaaaaa
-acabababbpajaXcNcNcNclcNrVadabababbPjdccchaTcjckaaaaaaaaaaaa
-acababababadababadababadadbpabababbPrvjicncMcpcqcraaaaaaaaaa
-acababababadababadababadabababababbPbZaAaAjtaAcwcrcrcraaaaaa
-acababababadababadababadababbNafafcucvaAaAaAaArSIaaqafaaaaaa
-acabababkdalajajajajajalajadblcAyGcBBpqPaAaAaAcsaAaVafaaaaaa
-acabadajajcCarararararBiararAnafvrafafOfMsvqrUMyaOWGafaaaaaa
-acadadaLaLaLaLaLaLaLaLaLaLaLaLafafcuafafafafafafafafafaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aa
+aa
+aa
+ab
+ac
+ac
+ac
+ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+aa
+"}
+(2,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ad
+ab
+ab
+ab
+ab
+ab
+ad
+ab
+ab
+ab
+ab
+ab
+ab
+ad
+aa
+"}
+(3,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ad
+ab
+ab
+ab
+ab
+ab
+ad
+ab
+ab
+ab
+ab
+ab
+ad
+ad
+aa
+"}
+(4,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+ac
+aj
+ab
+ab
+ab
+cb
+ab
+ad
+ab
+ab
+ab
+ab
+ab
+ad
+ab
+ab
+ab
+ab
+ab
+aj
+aL
+aa
+"}
+(5,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+ac
+aj
+aj
+ab
+ab
+ab
+bp
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+bp
+ab
+ab
+ab
+kd
+aj
+aL
+aa
+"}
+(6,1,1) = {"
+aa
+aa
+aa
+ab
+ad
+ab
+ab
+ab
+ac
+bl
+bs
+ad
+ad
+ad
+aj
+bj
+ab
+ad
+ab
+ad
+ab
+bj
+aj
+ad
+ad
+ad
+al
+cC
+aL
+aa
+"}
+(7,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+ac
+ar
+aj
+ab
+ab
+ab
+aX
+ab
+ab
+ad
+ab
+ad
+ab
+ab
+aX
+ab
+ab
+ab
+aj
+ar
+aL
+aa
+"}
+(8,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+ac
+ar
+aj
+ab
+ab
+ab
+cN
+ad
+ad
+pr
+aj
+aj
+ad
+ad
+cN
+ab
+ab
+ab
+aj
+ar
+aL
+aa
+"}
+(9,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+ac
+ar
+aj
+ad
+ad
+ad
+cN
+ab
+ab
+aj
+EG
+aj
+ab
+ab
+cN
+ad
+ad
+ad
+aj
+ar
+aL
+aa
+"}
+(10,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+ac
+ar
+aj
+ab
+ab
+ab
+cN
+ad
+ad
+aj
+aj
+aj
+ad
+ad
+cN
+ab
+ab
+ab
+aj
+ar
+aL
+aa
+"}
+(11,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+ac
+ar
+aj
+ab
+ab
+ab
+cl
+ab
+ab
+ad
+ab
+ad
+ab
+ab
+cl
+ab
+ab
+ab
+aj
+ar
+aL
+aa
+"}
+(12,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ac
+bm
+bs
+ad
+ad
+ad
+cN
+bj
+ab
+ad
+ab
+ad
+ab
+bj
+cN
+ad
+ad
+ad
+al
+Bi
+aL
+aa
+"}
+(13,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ac
+ar
+aj
+ab
+ab
+ad
+co
+cy
+cI
+cy
+jD
+cy
+NG
+cy
+rV
+ad
+ab
+ab
+aj
+ar
+aL
+aa
+"}
+(14,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ac
+ar
+ad
+ab
+ab
+bp
+ad
+ad
+ad
+ad
+cN
+ad
+ad
+ad
+ad
+bp
+ab
+ab
+ad
+ar
+aL
+aa
+"}
+(15,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+ac
+bq
+bt
+bN
+ab
+ab
+ab
+cz
+cK
+cK
+yI
+cK
+cK
+hF
+ab
+ab
+ab
+bN
+bl
+An
+aL
+aa
+"}
+(16,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+af
+af
+aB
+af
+ab
+ab
+ab
+bo
+cJ
+bF
+hf
+Tu
+bd
+Gj
+ab
+ab
+ab
+af
+cA
+af
+af
+aa
+"}
+(17,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+af
+at
+bv
+af
+ab
+ab
+ab
+bo
+bw
+bQ
+bW
+bX
+cm
+Gj
+ab
+ab
+ab
+af
+yG
+vr
+af
+aa
+"}
+(18,1,1) = {"
+aa
+aa
+aa
+ab
+ac
+ab
+ab
+ab
+af
+af
+bB
+cu
+bP
+bP
+bP
+bf
+kq
+bG
+hV
+ca
+cm
+bf
+bP
+bP
+bP
+cu
+cB
+af
+cu
+aa
+"}
+(19,1,1) = {"
+aa
+aa
+ab
+ab
+ac
+ab
+ab
+ab
+ab
+af
+aC
+cE
+bZ
+ce
+bh
+bi
+by
+bH
+bS
+vV
+fm
+bi
+jd
+rv
+bZ
+cv
+Bp
+af
+af
+aa
+"}
+(20,1,1) = {"
+aa
+aa
+ab
+ab
+ac
+ab
+ab
+ab
+ab
+af
+aD
+cw
+aQ
+aG
+cs
+br
+bz
+bI
+bT
+cd
+sq
+aH
+cc
+ji
+aA
+aA
+qP
+Of
+af
+aa
+"}
+(21,1,1) = {"
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+af
+af
+af
+af
+af
+aR
+ba
+bA
+bi
+cD
+bJ
+bU
+cG
+cH
+bi
+ch
+cn
+aA
+aA
+aA
+Ms
+af
+aa
+"}
+(22,1,1) = {"
+aa
+aa
+ai
+ai
+ai
+ai
+ai
+ai
+ay
+aP
+ci
+af
+aS
+bb
+ct
+bi
+bi
+bY
+bV
+bY
+bi
+bi
+aT
+cM
+jt
+aA
+aA
+vq
+af
+aa
+"}
+(23,1,1) = {"
+aa
+aa
+ai
+ak
+ak
+ak
+ax
+ai
+aA
+aA
+bE
+aM
+aU
+bc
+cx
+bC
+bC
+bL
+SX
+yC
+cf
+cf
+cj
+cp
+aA
+aA
+aA
+rU
+af
+aa
+"}
+(24,1,1) = {"
+aa
+aa
+ai
+am
+ao
+av
+aI
+ah
+az
+az
+aF
+aN
+aV
+ae
+bk
+cF
+cw
+cw
+TM
+cw
+cw
+cg
+ck
+cq
+cw
+rS
+cs
+My
+af
+aa
+"}
+(25,1,1) = {"
+aa
+aa
+ai
+an
+as
+aw
+aK
+ai
+aq
+aY
+aA
+aO
+cr
+cr
+aa
+cr
+aa
+aa
+aa
+aa
+aa
+cr
+aa
+cr
+cr
+Ia
+aA
+aO
+af
+aa
+"}
+(26,1,1) = {"
+aa
+aa
+ai
+ai
+au
+ai
+ai
+ai
+af
+aq
+aV
+bO
+cr
+aa
+aa
+cr
+cL
+aa
+aa
+aa
+aa
+cr
+aa
+aa
+cr
+aq
+aV
+WG
+af
+aa
+"}
+(27,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+cr
+af
+af
+af
+cr
+aa
+aa
+cr
+cQ
+aa
+Xy
+aa
+aa
+aa
+aa
+aa
+cr
+af
+af
+af
+af
+aa
+"}
+(28,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(29,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(30,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
"}
diff --git a/maps/tether/submaps/tether_misc.dmm b/maps/tether/submaps/tether_misc.dmm
index 0524f4097e7..cae7622ae35 100644
--- a/maps/tether/submaps/tether_misc.dmm
+++ b/maps/tether/submaps/tether_misc.dmm
@@ -5744,21 +5744,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -5886,21 +5886,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -6028,21 +6028,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -6170,21 +6170,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -6312,21 +6312,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -6454,21 +6454,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -6596,21 +6596,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -6738,21 +6738,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -6880,21 +6880,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -7022,21 +7022,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -7164,21 +7164,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -7306,21 +7306,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -7448,21 +7448,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -7590,21 +7590,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -7732,21 +7732,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -7874,21 +7874,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -8016,21 +8016,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -8158,21 +8158,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -8300,21 +8300,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -8442,21 +8442,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -8584,21 +8584,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -8726,21 +8726,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -8868,21 +8868,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -9010,21 +9010,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -9152,21 +9152,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -9294,21 +9294,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -9436,21 +9436,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -9578,21 +9578,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -9720,21 +9720,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -9862,21 +9862,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -10004,21 +10004,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -10146,21 +10146,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -10288,21 +10288,21 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -10430,54 +10430,54 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
"}
(36,1,1) = {"
@@ -10572,22 +10572,6 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-OY
-Xl
OY
OY
OY
@@ -10598,7 +10582,6 @@ OY
OY
OY
OY
-Xl
OY
OY
OY
@@ -10609,7 +10592,24 @@ OY
OY
OY
OY
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -10714,22 +10714,6 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-OY
-Xl
OY
OY
OY
@@ -10740,7 +10724,6 @@ OY
OY
OY
OY
-Xl
OY
OY
OY
@@ -10751,7 +10734,24 @@ OY
OY
OY
OY
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -10856,22 +10856,6 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-OY
-Xl
OY
OY
OY
@@ -10882,7 +10866,6 @@ OY
OY
OY
OY
-Xl
OY
OY
OY
@@ -10893,7 +10876,24 @@ OY
OY
OY
OY
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -10998,22 +10998,6 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-OY
-Xl
OY
OY
OY
@@ -11024,7 +11008,6 @@ OY
OY
OY
OY
-Xl
OY
OY
OY
@@ -11035,7 +11018,24 @@ OY
OY
OY
OY
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -11140,22 +11140,6 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-OY
-Xl
OY
OY
OY
@@ -11166,7 +11150,6 @@ OY
OY
OY
OY
-Xl
OY
OY
OY
@@ -11177,7 +11160,24 @@ OY
OY
OY
OY
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -11282,22 +11282,6 @@ ae
ae
ae
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-OY
-Xl
OY
OY
OY
@@ -11308,7 +11292,6 @@ OY
OY
OY
OY
-Xl
OY
OY
OY
@@ -11319,7 +11302,24 @@ OY
OY
OY
OY
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -11424,22 +11424,6 @@ Xl
ap
ap
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-OY
-Xl
OY
OY
OY
@@ -11450,7 +11434,6 @@ OY
OY
OY
OY
-Xl
OY
OY
OY
@@ -11461,7 +11444,24 @@ OY
OY
OY
OY
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -11526,34 +11526,6 @@ ap
ap
ap
ap
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
Xl
OY
OY
@@ -11563,57 +11535,85 @@ OY
OY
OY
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+Xl
ap
ap
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
"}
(44,1,1) = {"
@@ -11668,34 +11668,6 @@ ap
ap
ap
ap
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
Xl
OY
OY
@@ -11705,25 +11677,37 @@ OY
OY
OY
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+Xl
ap
ap
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-OY
-Xl
OY
OY
OY
@@ -11734,7 +11718,6 @@ OY
OY
OY
OY
-Xl
OY
OY
OY
@@ -11745,7 +11728,24 @@ OY
OY
OY
OY
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -11810,35 +11810,35 @@ ap
ap
ap
ap
-OY
-OY
-OY
Xl
OY
OY
OY
OY
-Xl
OY
OY
OY
OY
-Xl
OY
OY
OY
OY
-Xl
OY
OY
OY
OY
-Xl
OY
OY
OY
OY
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -11846,58 +11846,58 @@ OY
sF
OY
OY
+Xl
+ap
+ap
+Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
-ap
-ap
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
Xl
"}
(46,1,1) = {"
@@ -11952,34 +11952,6 @@ ap
ap
ap
ap
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
Xl
OY
OY
@@ -11989,24 +11961,36 @@ OY
OY
OY
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+Xl
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
OY
@@ -12018,7 +12002,6 @@ OY
OY
OY
OY
-Xl
OY
OY
OY
@@ -12029,7 +12012,24 @@ OY
OY
OY
OY
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -12094,34 +12094,6 @@ ap
ap
ap
ap
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
-Xl
-OY
-OY
-OY
-OY
Xl
OY
OY
@@ -12131,57 +12103,85 @@ OY
OY
OY
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+Xl
ap
ap
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
"}
(48,1,1) = {"
@@ -12236,61 +12236,45 @@ ap
ap
ap
ap
-OY
-OY
-OY
Xl
-OY
-OY
-OY
-OY
Xl
-OY
-OY
-OY
-OY
Xl
-OY
-OY
-OY
-OY
Xl
-OY
-OY
-OY
-OY
Xl
-OY
-OY
-OY
-OY
Xl
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
+Xl
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
OY
@@ -12302,7 +12286,6 @@ OY
OY
OY
OY
-Xl
OY
OY
OY
@@ -12313,7 +12296,24 @@ OY
OY
OY
OY
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
OY
OY
OY
@@ -12418,54 +12418,54 @@ ap
ap
ap
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
"}
(50,1,1) = {"
@@ -12804,6 +12804,8 @@ ap
ap
ap
ap
+Xl
+OY
OY
OY
OY
@@ -12813,23 +12815,6 @@ OY
OY
OY
Xl
-OY
-Xl
-ap
-ap
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
ap
ap
Xl
@@ -12841,6 +12826,21 @@ OY
OY
OY
OY
+OY
+OY
+OY
+Xl
+ap
+ap
+Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+Xl
ap
ap
ap
@@ -12946,16 +12946,16 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -12969,7 +12969,7 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -12982,7 +12982,7 @@ OY
OY
OY
OY
-OY
+Xl
ap
ap
ap
@@ -13088,16 +13088,16 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -13111,7 +13111,7 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -13124,7 +13124,7 @@ OY
OY
OY
OY
-OY
+Xl
ap
ap
ap
@@ -13230,16 +13230,16 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -13253,7 +13253,7 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -13266,7 +13266,7 @@ OY
OY
OY
OY
-OY
+Xl
ap
ap
ap
@@ -13372,7 +13372,7 @@ ap
ap
ap
ap
-OY
+Xl
OY
OY
OY
@@ -13380,23 +13380,8 @@ OY
sF
OY
OY
-Xl
OY
-Xl
-ap
-ap
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
Xl
ap
ap
@@ -13409,6 +13394,21 @@ OY
OY
OY
OY
+OY
+OY
+OY
+Xl
+ap
+ap
+Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+Xl
ap
ap
ap
@@ -13514,16 +13514,16 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -13537,7 +13537,7 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -13550,7 +13550,7 @@ OY
OY
OY
OY
-OY
+Xl
ap
ap
ap
@@ -13656,16 +13656,16 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -13679,7 +13679,7 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -13692,7 +13692,7 @@ sF
OY
OY
OY
-OY
+Xl
ap
ap
ap
@@ -13798,16 +13798,16 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -13821,7 +13821,7 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -13834,7 +13834,7 @@ OY
OY
OY
OY
-OY
+Xl
ap
ap
ap
@@ -13940,16 +13940,16 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -13963,19 +13963,19 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
ap
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -14105,7 +14105,7 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -14118,7 +14118,7 @@ OY
OY
OY
OY
-OY
+Xl
ap
ap
ap
@@ -14247,19 +14247,19 @@ sF
OY
OY
OY
-Xl
+OY
OY
Xl
ap
ap
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -14389,19 +14389,19 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
ap
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -14531,7 +14531,7 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -14544,7 +14544,7 @@ OY
OY
OY
OY
-OY
+Xl
ap
ap
ap
@@ -14650,16 +14650,16 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -14673,7 +14673,7 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -14792,31 +14792,31 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -14934,16 +14934,16 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -14957,7 +14957,7 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -15076,31 +15076,31 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -15218,7 +15218,7 @@ ap
ap
ap
ap
-OY
+Xl
OY
OY
OY
@@ -15226,7 +15226,7 @@ OY
sF
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -15241,7 +15241,7 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -15360,31 +15360,31 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -15502,16 +15502,16 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -15525,7 +15525,7 @@ OY
OY
OY
OY
-Xl
+OY
OY
Xl
ap
@@ -15644,31 +15644,31 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
-Xl
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
@@ -15786,16 +15786,16 @@ ap
ap
ap
ap
-OY
-OY
-OY
-OY
-OY
-OY
-OY
-OY
Xl
OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
+OY
Xl
ap
ap
diff --git a/maps/tether/tether_defines.dm b/maps/tether/tether_defines.dm
index 83e82e5e2a2..b7c7fcfc90a 100644
--- a/maps/tether/tether_defines.dm
+++ b/maps/tether/tether_defines.dm
@@ -157,11 +157,10 @@
lateload_z_levels = list(
list("Tether - Misc","Tether - Underdark","Tether - Plains"), //Stock Tether lateload maps
list("Offmap Ship - Talon Z1","Offmap Ship - Talon Z2"),
- list("Asteroid Belt 1","Asteroid Belt 2","Asteroid Belt 3","Asteroid Belt 4"),
+ list("Asteroid Belt 1","Asteroid Belt 2"),
list("Desert Planet - Z1 Beach","Desert Planet - Z2 Cave"),
list("Remmi Aerostat - Z1 Aerostat","Remmi Aerostat - Z2 Surface"),
list("Debris Field - Z1 Space"),
- list("Gutter Site - Z1 Space"),
list("Fuel Depot - Z1 Space")
)
diff --git a/vorestation.dme b/vorestation.dme
index 9585fc3b010..9d44e14d18b 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2664,6 +2664,7 @@
#include "code\modules\mob\living\carbon\human\species\station\station_special_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\station_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\teshari.dm"
+#include "code\modules\mob\living\carbon\human\species\station\teshari_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\xenochimera_hud_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\xenochimera_trait_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_blob.dm"