From dec9f1f00aafe01d6005602d733b84ab1393167c Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 29 Mar 2021 14:17:05 -0400 Subject: [PATCH 01/26] EMERGENCY FIX --- maps/tether/tether_defines.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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") ) From 18e0d9a064fbeb6c8897d0bdf29556d276b88b23 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 29 Mar 2021 14:49:29 -0400 Subject: [PATCH 02/26] Fixes Teshari Load order fixed --- .../human/species/station/station_vr.dm | 25 ------------------- .../human/species/station/teshari_vr.dm | 24 ++++++++++++++++++ vorestation.dme | 1 + 3 files changed, 25 insertions(+), 25 deletions(-) create mode 100644 code/modules/mob/living/carbon/human/species/station/teshari_vr.dm 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_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/vorestation.dme b/vorestation.dme index 50f134b80a2..98615e92d29 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2663,6 +2663,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" From 541c37863145c4c2c9008b9050ffdde00ca88412 Mon Sep 17 00:00:00 2001 From: H0lySquirr3l <34927367+H0lySquirr3l@users.noreply.github.com> Date: Mon, 29 Mar 2021 14:27:54 -0500 Subject: [PATCH 03/26] Update recreation_vr.dm --- code/datums/supplypacks/recreation_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/supplypacks/recreation_vr.dm b/code/datums/supplypacks/recreation_vr.dm index 8471bce6ef7..a3cf0cccccf 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 = 49 containertype = /obj/structure/closet/crate containername = "Smole Bulding Brick crate" From 0db89ac140d51e664346f7a1eaadcbc34772dcd7 Mon Sep 17 00:00:00 2001 From: H0lySquirr3l <34927367+H0lySquirr3l@users.noreply.github.com> Date: Mon, 29 Mar 2021 14:32:39 -0500 Subject: [PATCH 04/26] Update recreation_vr.dm --- code/datums/supplypacks/recreation_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/supplypacks/recreation_vr.dm b/code/datums/supplypacks/recreation_vr.dm index a3cf0cccccf..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 = 49 + cost = 50 containertype = /obj/structure/closet/crate containername = "Smole Bulding Brick crate" From b0a8109f554b54ed8a23cb16bb9bbee0476a769b Mon Sep 17 00:00:00 2001 From: VerySoft Date: Mon, 29 Mar 2021 23:14:21 -0400 Subject: [PATCH 05/26] OM edge tweak Some of the overmap edges weren't edges, so ships can just fly out of the overmap and get into trouble! So I ran over all the edges to make sure there aren't any unaccounted for. --- maps/tether/submaps/tether_misc.dmm | 142 ++++++++++++++-------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/maps/tether/submaps/tether_misc.dmm b/maps/tether/submaps/tether_misc.dmm index 0524f4097e7..f6837ac6777 100644 --- a/maps/tether/submaps/tether_misc.dmm +++ b/maps/tether/submaps/tether_misc.dmm @@ -11526,7 +11526,7 @@ ap ap ap ap -OY +Xl OY OY Xl @@ -11562,7 +11562,7 @@ OY OY OY OY -OY +Xl ap ap Xl @@ -11668,7 +11668,7 @@ ap ap ap ap -OY +Xl OY OY Xl @@ -11704,7 +11704,7 @@ OY OY OY OY -OY +Xl ap ap Xl @@ -11810,7 +11810,7 @@ ap ap ap ap -OY +Xl OY OY Xl @@ -11846,7 +11846,7 @@ OY sF OY OY -OY +Xl ap ap Xl @@ -11952,7 +11952,7 @@ ap ap ap ap -OY +Xl OY OY Xl @@ -11988,10 +11988,10 @@ OY OY OY OY -OY +Xl ap ap -OY +Xl OY OY OY @@ -12094,7 +12094,7 @@ ap ap ap ap -OY +Xl OY OY Xl @@ -12130,7 +12130,7 @@ OY OY OY OY -OY +Xl ap ap Xl @@ -12236,46 +12236,46 @@ 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 +Xl OY OY OY @@ -12804,7 +12804,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -12840,7 +12840,7 @@ OY OY OY OY -OY +Xl ap ap ap @@ -12946,7 +12946,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -12982,7 +12982,7 @@ OY OY OY OY -OY +Xl ap ap ap @@ -13088,7 +13088,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -13124,7 +13124,7 @@ OY OY OY OY -OY +Xl ap ap ap @@ -13230,7 +13230,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -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 @@ -13408,7 +13408,7 @@ OY OY OY OY -OY +Xl ap ap ap @@ -13514,7 +13514,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -13550,7 +13550,7 @@ OY OY OY OY -OY +Xl ap ap ap @@ -13656,7 +13656,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -13692,7 +13692,7 @@ sF OY OY OY -OY +Xl ap ap ap @@ -13798,7 +13798,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -13834,7 +13834,7 @@ OY OY OY OY -OY +Xl ap ap ap @@ -13940,7 +13940,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -14118,7 +14118,7 @@ OY OY OY OY -OY +Xl ap ap ap @@ -14544,7 +14544,7 @@ OY OY OY OY -OY +Xl ap ap ap @@ -14650,7 +14650,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -14792,7 +14792,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -14934,7 +14934,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -15076,7 +15076,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -15218,7 +15218,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -15360,7 +15360,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -15502,7 +15502,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -15644,7 +15644,7 @@ ap ap ap ap -OY +Xl OY OY OY @@ -15786,7 +15786,7 @@ ap ap ap ap -OY +Xl OY OY OY From 191c59aad765e86e29fe612d6d94c8fc45f9d5b5 Mon Sep 17 00:00:00 2001 From: VerySoft Date: Mon, 29 Mar 2021 23:22:31 -0400 Subject: [PATCH 06/26] double checks --- maps/tether/submaps/tether_misc.dmm | 2070 +++++++++++++-------------- 1 file changed, 1035 insertions(+), 1035 deletions(-) diff --git a/maps/tether/submaps/tether_misc.dmm b/maps/tether/submaps/tether_misc.dmm index f6837ac6777..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 @@ -11529,32 +11529,32 @@ ap Xl 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 @@ -11566,54 +11566,54 @@ 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) = {" @@ -11671,32 +11671,32 @@ ap Xl 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 @@ -11708,22 +11708,6 @@ 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 @@ -11813,32 +11813,32 @@ ap Xl 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 @@ -11850,54 +11850,54 @@ 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 "} (46,1,1) = {" @@ -11955,32 +11955,32 @@ ap Xl 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 @@ -12007,7 +12007,6 @@ OY OY OY OY -Xl OY OY OY @@ -12018,7 +12017,6 @@ OY OY OY OY -Xl OY OY OY @@ -12029,7 +12027,9 @@ OY OY OY OY -Xl +OY +OY +OY OY OY OY @@ -12097,32 +12097,32 @@ ap Xl 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 @@ -12134,54 +12134,54 @@ 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) = {" @@ -12291,7 +12291,6 @@ OY OY OY OY -Xl OY OY OY @@ -12302,7 +12301,6 @@ OY OY OY OY -Xl OY OY OY @@ -12313,7 +12311,9 @@ OY OY OY OY -Xl +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) = {" @@ -12812,23 +12812,23 @@ OY OY OY OY -Xl +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 @@ -12954,7 +12954,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -12969,7 +12969,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -13096,7 +13096,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -13111,7 +13111,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -13238,7 +13238,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -13253,7 +13253,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -13380,23 +13380,23 @@ OY sF OY OY -Xl +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 @@ -13522,7 +13522,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -13537,7 +13537,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -13664,7 +13664,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -13679,7 +13679,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -13806,7 +13806,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -13821,7 +13821,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -13948,7 +13948,7 @@ OY OY OY OY -Xl +OY OY Xl 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 @@ -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 @@ -14658,7 +14658,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -14673,7 +14673,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -14800,23 +14800,23 @@ OY OY OY OY -Xl +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 @@ -14942,7 +14942,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -14957,7 +14957,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -15084,23 +15084,23 @@ OY OY OY OY -Xl +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 @@ -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 @@ -15368,23 +15368,23 @@ OY OY OY OY -Xl +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 @@ -15510,7 +15510,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -15525,7 +15525,7 @@ OY OY OY OY -Xl +OY OY Xl ap @@ -15652,23 +15652,23 @@ OY OY OY OY -Xl +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 @@ -15794,7 +15794,7 @@ OY OY OY OY -Xl +OY OY Xl ap From 72d1741b6bbd61e8b7821e0df0b2fbe5c8759f2d Mon Sep 17 00:00:00 2001 From: Atermonera Date: Mon, 29 Mar 2021 20:48:11 -0900 Subject: [PATCH 07/26] Tanning Tweaks --- code/game/machinery/washing_machine.dm | 5 +- .../objects/items/stacks/sheets/leather.dm | 198 ++++++++++--- code/modules/food/kitchen/smartfridge.dm | 4 +- code/modules/materials/material_recipes.dm | 279 ++++++++++++++++++ code/modules/reagents/Chemistry-Holder.dm | 3 +- icons/obj/kitchen.dmi | Bin 15787 -> 16252 bytes 6 files changed, 437 insertions(+), 52 deletions(-) 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/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/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index a97ec22b77e..a995a09a17a 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /datum/material/proc/get_recipes() if(!recipes) generate_recipes() @@ -274,3 +275,281 @@ 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]") + 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("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]") +>>>>>>> 003d47f... Tanning Tweaks (#7965) 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/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 6c5a251283cef7139d5c16498316834a6281265d..f558d3fd493513ca14c494b064e57d59bfff0a01 100644 GIT binary patch literal 16252 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 literal 15787 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 Date: Tue, 30 Mar 2021 12:36:14 -0400 Subject: [PATCH 08/26] Properly garbage collects carp --- code/modules/overmap/spacetravel.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From f6793b62074f4b6689d8dcfef57a39738e52ff14 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Tue, 30 Mar 2021 16:16:57 -0400 Subject: [PATCH 09/26] Update material_recipes.dm --- code/modules/materials/material_recipes.dm | 283 +-------------------- 1 file changed, 3 insertions(+), 280 deletions(-) diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index a995a09a17a..c1239b234c9 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -1,281 +1,3 @@ -<<<<<<< HEAD -/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() @@ -364,7 +86,8 @@ 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]") + //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]") @@ -440,6 +163,7 @@ 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]") @@ -552,4 +276,3 @@ 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]") ->>>>>>> 003d47f... Tanning Tweaks (#7965) From dd267ee7af2a3daeb7d2331705efd74392cfb6f2 Mon Sep 17 00:00:00 2001 From: Schnayy Date: Tue, 30 Mar 2021 21:48:51 -0500 Subject: [PATCH 10/26] Merge pull request #8010 from MistakeNot4892/fashion Explorer uniform now has rolldown and sleeve states. --- icons/mob/uniform_rolled_down.dmi | Bin 42347 -> 43141 bytes icons/mob/uniform_sleeves_rolled.dmi | Bin 131640 -> 133223 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/uniform_rolled_down.dmi b/icons/mob/uniform_rolled_down.dmi index 95a013291d0da760a54614473927974f79e3d897..b5002751cf6b62328b3bc27d54560668ac80286d 100644 GIT binary patch delta 3368 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 E1LFC(HUIzs delta 2545 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 diff --git a/icons/mob/uniform_sleeves_rolled.dmi b/icons/mob/uniform_sleeves_rolled.dmi index 0e7e8783075da48dfe071d4b4e0493fc467c2a1a..1c7c6ef7c39b25f7917691dd4cd240618451e801 100644 GIT binary patch delta 13935 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 aGK1gvXg0ONIrzWI07W?!*%E2Pfd2t}c?i(} delta 12339 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 Date: Tue, 30 Mar 2021 22:47:16 -0900 Subject: [PATCH 12/26] Merge pull request #8003 from Atermonera/tesla_waste_vents Tesla engine waste handling has atmos vent/scrubber --- .../southern_cross/engine_tesla.dmm | 3012 +++++++++++++++-- 1 file changed, 2814 insertions(+), 198 deletions(-) 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 "} From 7d2fede2a3ad81d4416a9a285c6a4020dadda7fa Mon Sep 17 00:00:00 2001 From: Atermonera Date: Tue, 30 Mar 2021 22:46:41 -0900 Subject: [PATCH 14/26] Merge pull request #8001 from Atermonera/viro_prison_break Fixes runtime in prison_break.dm, line 214 --- code/modules/gamemaster/event2/events/security/prison_break.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From 5b1b8fb62883a8bf809b6310bc9f6ea93fc2d773 Mon Sep 17 00:00:00 2001 From: Atermonera Date: Tue, 30 Mar 2021 22:46:15 -0900 Subject: [PATCH 16/26] Merge pull request #8000 from Atermonera/ai_eye_higgs_bugson Fixes runtime in chunk.dm: line 91, I think? --- code/modules/mob/freelook/chunk.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From beae8650dceb84c9d94888c85af35f60841e8b2d Mon Sep 17 00:00:00 2001 From: Atermonera Date: Tue, 30 Mar 2021 22:45:23 -0900 Subject: [PATCH 18/26] Merge pull request #7999 from Atermonera/emitter_iisally Non-mobs aren't allies --- code/modules/ai/interfaces.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) . = ..() From 989e1d0853e4bdff37c47903c76256cbc08344d1 Mon Sep 17 00:00:00 2001 From: Atermonera Date: Tue, 30 Mar 2021 23:22:20 -0900 Subject: [PATCH 20/26] Merge pull request #8012 from MistakeNot4892/bird Tesh gliding tweaks. --- code/game/objects/structures/cliff.dm | 38 ++++++++++++++----- .../carbon/human/species/station/teshari.dm | 6 +-- 2 files changed, 31 insertions(+), 13 deletions(-) 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/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 From 84b8b6bb63e9a50469439bc312136cfd23f9f499 Mon Sep 17 00:00:00 2001 From: Atermonera Date: Tue, 30 Mar 2021 23:24:47 -0900 Subject: [PATCH 22/26] Merge pull request #8016 from Woodratt/0326_idtweak Minor ID sprite tweaks --- html/changelogs/woodrat - idtweaks.yml | 36 +++++++++++++++++++++++++ icons/obj/card_new.dmi | Bin 8704 -> 9611 bytes 2 files changed, 36 insertions(+) create mode 100644 html/changelogs/woodrat - idtweaks.yml 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/obj/card_new.dmi b/icons/obj/card_new.dmi index f5b658ccd0721030185d0cf2055c09f15faf00cd..8c2143b8f3e0cd5b7e93b1bcc97a8424b0dfaedc 100644 GIT binary patch delta 8532 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 a9G;@N8`YIp?m+iAO2{4k+hy7|FaHOJEM9K_ delta 7612 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 bNr8;)rH8+Ix7OeMt^q)eEUuLpJb3;;G7WUQ From 7852343002f6aca4d558c4fa0f72b1549e82bc36 Mon Sep 17 00:00:00 2001 From: Atermonera Date: Tue, 30 Mar 2021 23:29:21 -0900 Subject: [PATCH 24/26] Updates respawn_character some more --- code/modules/admin/verbs/randomverbs.dm | 4 + .../mob/living/carbon/human/update_icons.dm | 1232 +++++++++++++++++ code/modules/mob/update_icons.dm | 9 - 3 files changed, 1236 insertions(+), 9 deletions(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 26e30011290..cfe156c40ee 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -529,7 +529,11 @@ Traitors and the like can also be revived with the previous role mostly intact. job_master.EquipRank(new_character, charjob, 1) new_character.mind.assigned_role = charjob new_character.mind.role_alt_title = job_master.GetPlayerAltTitle(new_character, charjob) +<<<<<<< HEAD //equip_custom_items(new_character) //VOREStation Removal +======= + equip_custom_items(new_character) +>>>>>>> 7d1536b... Merge pull request #8017 from Novacat/nova-alerts //If desired, add records. if(records) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 69c10d61526..3275f3c6e27 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /* 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. @@ -1268,3 +1269,1234 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #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 EARS_LAYER 20 //Both ear-slot items (combined image) +#define EYES_LAYER 21 //Mob's eyes (used for glowing eyes) +#define FACEMASK_LAYER 22 //Mask-slot item +#define HEAD_LAYER 23 //Head-slot item +#define HANDCUFF_LAYER 24 //Handcuffs, if the human is handcuffed, in a secret inv slot +#define LEGCUFF_LAYER 25 //Same as handcuffs, for legcuffs +#define L_HAND_LAYER 26 //Left-hand item +#define R_HAND_LAYER 27 //Right-hand item +#define WING_LAYER 28 //Wings or protrusions over the suit. +#define TAIL_LAYER_ALT 29 //Modified tail-sprite layer. Tend to be larger. +#define MODIFIER_EFFECTS_LAYER 30 //Effects drawn by modifiers +#define FIRE_LAYER 31 //'Mob on fire' overlay layer +#define WATER_LAYER 32 //'Mob submerged' overlay layer +#define TARGETED_LAYER 33 //'Aimed at' overlay layer +#define TOTAL_LAYERS 33//<---- 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() + // 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 + + // 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_x, desired_scale_y) + 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) + M.Translate(0, 16*(desired_scale_y-1)) + 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()) + 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) + icon_key += "_t" + + if(istype(tail_style, /datum/sprite_accessory/tail/taur)) + 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. + Cutter = new(icon = tail_style.icon, icon_state = tail_style.clip_mask) + + 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()) + 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) + 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 + +/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) + 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 +>>>>>>> 7d1536b... Merge pull request #8017 from Novacat/nova-alerts 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() From 16a599fd795ca72b8de7c5e4cfd70480b647565a Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Wed, 31 Mar 2021 05:18:37 -0400 Subject: [PATCH 25/26] Update randomverbs.dm --- code/modules/admin/verbs/randomverbs.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index cfe156c40ee..26e30011290 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -529,11 +529,7 @@ Traitors and the like can also be revived with the previous role mostly intact. job_master.EquipRank(new_character, charjob, 1) new_character.mind.assigned_role = charjob new_character.mind.role_alt_title = job_master.GetPlayerAltTitle(new_character, charjob) -<<<<<<< HEAD //equip_custom_items(new_character) //VOREStation Removal -======= - equip_custom_items(new_character) ->>>>>>> 7d1536b... Merge pull request #8017 from Novacat/nova-alerts //If desired, add records. if(records) From 81f24445406672fe70a1886a3293b34042273b34 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Wed, 31 Mar 2021 05:19:48 -0400 Subject: [PATCH 26/26] Update update_icons.dm --- .../mob/living/carbon/human/update_icons.dm | 1367 +---------------- 1 file changed, 63 insertions(+), 1304 deletions(-) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 3275f3c6e27..fc9ee91e9f7 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1,1275 +1,3 @@ -<<<<<<< HEAD -/* - 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. @@ -1351,21 +79,22 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #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 EARS_LAYER 20 //Both ear-slot items (combined image) -#define EYES_LAYER 21 //Mob's eyes (used for glowing eyes) -#define FACEMASK_LAYER 22 //Mask-slot item -#define HEAD_LAYER 23 //Head-slot item -#define HANDCUFF_LAYER 24 //Handcuffs, if the human is handcuffed, in a secret inv slot -#define LEGCUFF_LAYER 25 //Same as handcuffs, for legcuffs -#define L_HAND_LAYER 26 //Left-hand item -#define R_HAND_LAYER 27 //Right-hand item -#define WING_LAYER 28 //Wings or protrusions over the suit. -#define TAIL_LAYER_ALT 29 //Modified tail-sprite layer. Tend to be larger. -#define MODIFIER_EFFECTS_LAYER 30 //Effects drawn by modifiers -#define FIRE_LAYER 31 //'Mob on fire' overlay layer -#define WATER_LAYER 32 //'Mob submerged' overlay layer -#define TARGETED_LAYER 33 //'Aimed at' overlay layer -#define TOTAL_LAYERS 33//<---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list. +#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 @@ -1386,6 +115,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() 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 @@ -1398,6 +128,15 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() 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() @@ -1409,12 +148,15 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() 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_x, desired_scale_y) - M.Translate(1,-6) + 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) - M.Translate(0, 16*(desired_scale_y-1)) + 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) @@ -1505,7 +247,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() 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()) + 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) @@ -1535,12 +277,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() icon_key += "3" else icon_key += "1" - - if(part.transparent) - icon_key += "_t" + 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)) - icon_key += tail_style.clip_mask_state + 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 @@ -1554,17 +296,18 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() 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. - Cutter = new(icon = tail_style.icon, icon_state = tail_style.clip_mask) + 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.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.SwapColor("#00000000", "#FFFFFFFF") // Everywhere empty, make white. + Cutter.SwapColor("#000000FF", "#00000000") // Everywhere black, make empty. - Cutter.Blend("#000000", ICON_MULTIPLY) // Black again. + Cutter.Blend("#000000", ICON_MULTIPLY) // Black again. for(var/obj/item/organ/external/part in organs) - if(isnull(part) || part.is_stump()) + 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) @@ -1680,6 +423,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //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) @@ -1735,6 +479,22 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() 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 @@ -1762,7 +522,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!head_organ.eye_icon) return - var/icon/eyes_icon = new/icon(head_organ.eye_icon_location, head_organ.eye_icon) + 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 @@ -2499,4 +1259,3 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #undef WATER_LAYER #undef TARGETED_LAYER #undef TOTAL_LAYERS ->>>>>>> 7d1536b... Merge pull request #8017 from Novacat/nova-alerts