From 344cd671819ecf2a38de5d4b165fb7301c84f983 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Thu, 21 Sep 2017 13:08:29 -0700 Subject: [PATCH 001/204] flashbangs no longer damage blob tiles --- code/game/objects/items/grenades/flashbang.dm | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index 33d8d6342f..3d15ebf258 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/grenade/flashbang name = "flashbang" icon_state = "flashbang" @@ -37,3 +38,39 @@ else M.soundbang_act(1, max(200/max(1,distance), 60), rand(0, 5)) +======= +/obj/item/grenade/flashbang + name = "flashbang" + icon_state = "flashbang" + item_state = "flashbang" + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + origin_tech = "materials=2;combat=3" + +/obj/item/grenade/flashbang/prime() + update_mob() + var/flashbang_turf = get_turf(src) + if(!flashbang_turf) + return + for(var/mob/living/M in get_hearers_in_view(7, flashbang_turf)) + bang(get_turf(M), M) + qdel(src) + +/obj/item/grenade/flashbang/proc/bang(turf/T , mob/living/M) + if(M.stat == DEAD) //They're dead! + return + M.show_message("BANG", 2) + playsound(loc, 'sound/weapons/flashbang.ogg', 100, 1) + var/distance = max(0,get_dist(get_turf(src),T)) + +//Flash + if(M.flash_act(affect_silicon = 1)) + M.Knockdown(max(200/max(1,distance), 60)) +//Bang + if(!distance || loc == M || loc == M.loc) //Stop allahu akbarring rooms with this. + M.Knockdown(200) + M.soundbang_act(1, 200, 10, 15) + + else + M.soundbang_act(1, max(200/max(1,distance), 60), rand(0, 5)) +>>>>>>> 798a68e... Update flashbang.dm (#30862) From 5ef84b6e4b9af5e0f914eaa8efc8ec56b95487e5 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 7 Jun 2018 15:06:10 -0400 Subject: [PATCH 002/204] Adds in Oxygen to grass Adds in 0.03 Oxygen gene to grass! Why: Mostly for Life-Bringers to be able to make there own Oxygen. Side note: First time touching code if I did a bad make sure to yell at me for it with harsh words of disappointment! --- code/modules/hydroponics/grown/grass_carpet.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 8e55f8a15d..819ade2af1 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -16,7 +16,7 @@ icon_dead = "grass-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/grass/carpet) - reagents_add = list("nutriment" = 0.02, "hydrogen" = 0.05) + reagents_add = list("nutriment" = 0.02, "hydrogen" = 0.05 "oxygen" = 0.03) /obj/item/reagent_containers/food/snacks/grown/grass seed = /obj/item/seeds/grass From 0e08cfad8936703250bd407c12eaa4bb5dd3ef3e Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 7 Jun 2018 15:26:13 -0400 Subject: [PATCH 003/204] Update grass_carpet.dm --- code/modules/hydroponics/grown/grass_carpet.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 819ade2af1..704110503b 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -16,7 +16,7 @@ icon_dead = "grass-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/grass/carpet) - reagents_add = list("nutriment" = 0.02, "hydrogen" = 0.05 "oxygen" = 0.03) + reagents_add = list("nutriment" = 0.02, "hydrogen" = 0.05, "oxygen" = 0.03) /obj/item/reagent_containers/food/snacks/grown/grass seed = /obj/item/seeds/grass From 49f1e9ae7169c849a3b66883a20c766e4e379148 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 9 Jun 2018 03:05:49 -0400 Subject: [PATCH 004/204] Update grass_carpet.dm --- code/modules/hydroponics/grown/grass_carpet.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 704110503b..af466f5186 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -16,7 +16,7 @@ icon_dead = "grass-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/grass/carpet) - reagents_add = list("nutriment" = 0.02, "hydrogen" = 0.05, "oxygen" = 0.03) + reagents_add = list("nutriment" = 0.02, "hydrogen" = 0.05, "oxygen" = 0.03) //CITADEL CHANGE - adds 0.03 oxygen to grass /obj/item/reagent_containers/food/snacks/grown/grass seed = /obj/item/seeds/grass From b62b9de0c1e573380fde9efb6db91d284ed2bbf2 Mon Sep 17 00:00:00 2001 From: Michiyamenotehifunana <31995558+Michiyamenotehifunana@users.noreply.github.com> Date: Tue, 12 Jun 2018 16:02:25 +0800 Subject: [PATCH 005/204] Adds a tiny "pocket" to the M1 Helmet --- modular_citadel/code/modules/clothing/head/head.dm | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/modular_citadel/code/modules/clothing/head/head.dm b/modular_citadel/code/modules/clothing/head/head.dm index 03b092d038..7656766053 100644 --- a/modular_citadel/code/modules/clothing/head/head.dm +++ b/modular_citadel/code/modules/clothing/head/head.dm @@ -4,11 +4,17 @@ /////// /////// *////////////////////////////////////////////////////////////////////////////////// -/obj/item/clothing/head/flakhelm +/obj/item/clothing/head/flakhelm //Actually the M1 Helmet name = "flak helmet" icon = 'modular_citadel/icons/obj/clothing/space_nam.dmi' alternate_worn_icon = 'modular_citadel/icons/mob/clothing/space_nam.dmi' icon_state = "m1helm" item_state = "helmet" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0.1, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = -1) - desc = "A dilapidated helmet used in ancient wars. This one is brittle and essentially useless. An ace of spades is tucked into the band around the outer shell." \ No newline at end of file + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0.1, "bio" = 0, "rad" = 0, "fire" = -10, "acid" = -15) + desc = "A dilapidated helmet used in ancient wars. This one is brittle and essentially useless. An ace of spades is tucked into the band around the outer shell." + pocket_storage_component_path = /datum/component/storage/concrete/pockets/tiny/spacenam //So you can stuff other things in the elastic band instead of it simply being a fluff thing. + +//The "pocket" for the M1 helmet so you can tuck things into the elastic band + +/datum/component/storage/concrete/pockets/tiny/spacenam + attack_hand_interact = TRUE //So you can actually see what you stuff in there \ No newline at end of file From e86c48b7a2e6eb318e5ac0ec4938f7cf46904c79 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 12 Jun 2018 03:51:03 -0700 Subject: [PATCH 006/204] Update vending.dm --- modular_citadel/code/game/machinery/vending.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm index acb91a027d..c4c0c10e69 100755 --- a/modular_citadel/code/game/machinery/vending.dm +++ b/modular_citadel/code/game/machinery/vending.dm @@ -37,6 +37,7 @@ desc = "A vending machine for all your unmentionable desires." icon = 'icons/obj/citvending.dmi' icon_state = "kink" + circuit = /obj/item/circuitboard/machine/kinkmate product_slogans = "Kinky!;Sexy!;Check me out, big boy!" vend_reply = "Have fun, you shameless pervert!" products = list( From 052f752c2290250954392ba29a3be1fe05abe956 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 12 Jun 2018 14:24:55 -0700 Subject: [PATCH 007/204] techwebs nerf --- code/controllers/subsystem/research.dm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index c285c1cce9..458c0ad5ce 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -22,14 +22,9 @@ SUBSYSTEM_DEF(research) var/list/errored_datums = list() var/list/point_types = list() //typecache style type = TRUE list //---------------------------------------------- - var/list/single_server_income = list(TECHWEB_POINT_TYPE_GENERIC = 54.3) + var/list/single_server_income = list(TECHWEB_POINT_TYPE_GENERIC = 49) var/multiserver_calculation = FALSE var/last_income = 0 - //^^^^^^^^ ALL OF THESE ARE PER SECOND! ^^^^^^^^ - - //Aiming for 1.5 hours to max R&D - //[88nodes * 5000points/node] / [1.5hr * 90min/hr * 60s/min] - //Around 450000 points max??? /datum/controller/subsystem/research/Initialize() point_types = TECHWEB_POINT_TYPE_LIST_ASSOCIATIVE_NAMES From 2035a338ffb9f430203798380956db672cd0e608 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 14 Jun 2018 15:33:34 -0700 Subject: [PATCH 008/204] Update magicarp.dm --- code/modules/events/wizard/magicarp.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index ab23c30e00..e0fd30aaaa 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -36,6 +36,7 @@ projectilesound = 'sound/weapons/emitter.ogg' maxHealth = 50 health = 50 + gold_core_spawnable = NO_SPAWN var/allowed_projectile_types = list(/obj/item/projectile/magic/change, /obj/item/projectile/magic/animate, /obj/item/projectile/magic/resurrection, /obj/item/projectile/magic/death, /obj/item/projectile/magic/teleport, /obj/item/projectile/magic/door, /obj/item/projectile/magic/aoe/fireball, /obj/item/projectile/magic/spellblade, /obj/item/projectile/magic/arcane_barrage) From a9100a89a62a6c6d2d2dc0b686e710fb77032a17 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 14 Jun 2018 15:35:25 -0700 Subject: [PATCH 009/204] modularize --- modular_citadel/code/modules/events/wizard/magicarp.dm | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 modular_citadel/code/modules/events/wizard/magicarp.dm diff --git a/modular_citadel/code/modules/events/wizard/magicarp.dm b/modular_citadel/code/modules/events/wizard/magicarp.dm new file mode 100644 index 0000000000..10d269c698 --- /dev/null +++ b/modular_citadel/code/modules/events/wizard/magicarp.dm @@ -0,0 +1,2 @@ +/mob/living/simple_animal/hostile/carp/ranged + gold_core_spawnable = NO_SPAWN From 7567590d0e209d1713f0f9f9c184428d9349935e Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 14 Jun 2018 15:35:46 -0700 Subject: [PATCH 010/204] Update magicarp.dm --- code/modules/events/wizard/magicarp.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index e0fd30aaaa..ab23c30e00 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -36,7 +36,6 @@ projectilesound = 'sound/weapons/emitter.ogg' maxHealth = 50 health = 50 - gold_core_spawnable = NO_SPAWN var/allowed_projectile_types = list(/obj/item/projectile/magic/change, /obj/item/projectile/magic/animate, /obj/item/projectile/magic/resurrection, /obj/item/projectile/magic/death, /obj/item/projectile/magic/teleport, /obj/item/projectile/magic/door, /obj/item/projectile/magic/aoe/fireball, /obj/item/projectile/magic/spellblade, /obj/item/projectile/magic/arcane_barrage) From e4e0e0d91d5bb2204d09c595198e7fffd94e413f Mon Sep 17 00:00:00 2001 From: Michiyamenotehifunana <31995558+Michiyamenotehifunana@users.noreply.github.com> Date: Fri, 15 Jun 2018 13:50:15 +0800 Subject: [PATCH 011/204] Adds random things for Jay to do things with --- .../code/game/objects/items/honk.dm | 6 ++++++ .../code/modules/clothing/under/under.dm | 11 ++++++++++- .../icons/mob/citadel/uniforms.dmi | Bin 50632 -> 52294 bytes .../icons/obj/clothing/cit_clothes.dmi | Bin 594 -> 795 bytes modular_citadel/icons/obj/honk.dmi | Bin 0 -> 324 bytes tgstation.dme | 1 + 6 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 modular_citadel/code/game/objects/items/honk.dm create mode 100644 modular_citadel/icons/obj/honk.dmi diff --git a/modular_citadel/code/game/objects/items/honk.dm b/modular_citadel/code/game/objects/items/honk.dm new file mode 100644 index 0000000000..9deb8aec30 --- /dev/null +++ b/modular_citadel/code/game/objects/items/honk.dm @@ -0,0 +1,6 @@ +/obj/item/bikehorn/silver + name = "silver bike horn" + desc = "A shiny bike horn handcrafted in the artisan workshops of Mars, with superior kevlar-reinforced rubber bulb attached to a polished plasteel reed horn." + attack_verb = list("elegantly HONKED") + icon = 'modular_citadel/icons/obj/honk.dmi' + icon_state = "silverhorn" \ No newline at end of file diff --git a/modular_citadel/code/modules/clothing/under/under.dm b/modular_citadel/code/modules/clothing/under/under.dm index 2661c5a539..7ab8362a83 100644 --- a/modular_citadel/code/modules/clothing/under/under.dm +++ b/modular_citadel/code/modules/clothing/under/under.dm @@ -21,4 +21,13 @@ icon_state = "hosskirt" icon_override = 'modular_citadel/icons/mob/citadel/uniforms.dmi' item_state = "gy_suit" - item_color = "hosskirt" \ No newline at end of file + item_color = "hosskirt" + +/obj/item/clothing/under/corporateuniform + name = "corporate uniform" + desc = "A comfortable, tight fitting jumpsuit made of premium materials. Not space-proof." + icon = 'modular_citadel/icons/obj/clothing/cit_clothes.dmi' + icon_state = "tssuit" + alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi' + item_state = "r_suit" + can_adjust = FALSE \ No newline at end of file diff --git a/modular_citadel/icons/mob/citadel/uniforms.dmi b/modular_citadel/icons/mob/citadel/uniforms.dmi index db179eebfcc14207e66484f102ee87d8f9a9948d..f34bfd6e453ddf5d75e8f288db3d04ddd6650fd7 100644 GIT binary patch delta 10641 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 ZAiN0ZOO)|KXdvK6URp(}?49Yi{{d*O>HYu! delta 8947 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 SvKgtT~@)fcsLH`9Lqmlvu diff --git a/modular_citadel/icons/obj/clothing/cit_clothes.dmi b/modular_citadel/icons/obj/clothing/cit_clothes.dmi index c7af2706e2888ca5ad5b1a25f6990eff837ddd6d..01ad0d37f9054447ae1dbe53f03d50eb05531f52 100644 GIT binary patch delta 589 zcmV-T0k|;s#~yqEU|#}?f848x z0rrQ7$MW&vu#W-yC+hXoNAibm-|efeJ4F5OiVy@rD{&KIfaAq~3p#)y5{Z&0C8bm+nd%>u z9EL%vA&nrF(i#!*;cs`%)%gJ)%Ab{t2eUbRfz#?e{h zoPs~80LU39wFe~nJpd>07XU8R?~Fw_=Mqb>&Wtz-YhBVcm;ml~1*wn08igx>2bJib b^^NrgXTB+9wHx*600000NkvXXu0mjfUH|-o delta 387 zcmV-}0et?O2GRtO7Y-l@0{{R3l|zoU00018ktJajmW?5g00001bW%=J06^y0W&i*H zbCJtvf8$lCtl;YB0(JrbIrk@s9VZY!0003bNklqRem#TW9!?3^=62Atcn<=;d1Zp2rNkt?s4!>$%`B=s&BeABf2!EMv% zhA5QwXe3dsADUt~7G5=Uecu-YVeT~k^H>2se?WqHZRi3;>S;ia6chs=56lb!Mr{j` zVophRl2XQcRR{CMzJ;LmnjuQe0A&y=i}f{l&kkHU!m@f5oQAyv2LViOKb&3#75@@2 zztrncJKTQ}P+H!UJOz550wa$*cq5Rvg36avmSCLDmvA{xqa~QHTymX_`jp2!);Uim zQU4RekO(c{ORxmDJAcy!38$ANrlIh+r5Og$MSwjRf8#vQivY7$?gX^NGU{K!-J#PZ h!|-@I)3D_)`34fM65_mK(Qg0%002ovPDHLkV1fna**8>L*Ad S_k9Oiz~JfX=d#Wzp$P!zBYPGA literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 527db71b8c..d9e14fe151 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2711,6 +2711,7 @@ #include "modular_citadel\code\game\objects\items\balls.dm" #include "modular_citadel\code\game\objects\items\handcuffs.dm" #include "modular_citadel\code\game\objects\items\holy_weapons.dm" +#include "modular_citadel\code\game\objects\items\honk.dm" #include "modular_citadel\code\game\objects\items\meat.dm" #include "modular_citadel\code\game\objects\items\stunsword.dm" #include "modular_citadel\code\game\objects\items\vending_items.dm" From 46c2eebb94f24aa425fe16b058f591b4fa1d9808 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sun, 17 Jun 2018 12:55:29 -0700 Subject: [PATCH 012/204] Update tgstation.dme --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index 527db71b8c..47c6cbdd43 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2786,6 +2786,7 @@ #include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" #include "modular_citadel\code\modules\custom_loadout\read_from_file.dm" #include "modular_citadel\code\modules\events\blob.dm" +#include "modular_citadel\code\modules\events\wizard\magicarp.dm" #include "modular_citadel\code\modules\food_and_drinks\snacks\meat.dm" #include "modular_citadel\code\modules\jobs\jobs.dm" #include "modular_citadel\code\modules\jobs\job_types\captain.dm" From 6a8f029e30564e4a8a461e4658c2507662a6f3cd Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sun, 17 Jun 2018 20:02:49 -0700 Subject: [PATCH 013/204] Update flashbang.dm --- code/game/objects/items/grenades/flashbang.dm | 43 +------------------ 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index 3d15ebf258..b298c78468 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -1,44 +1,3 @@ -<<<<<<< HEAD -/obj/item/grenade/flashbang - name = "flashbang" - icon_state = "flashbang" - item_state = "flashbang" - lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - origin_tech = "materials=2;combat=3" - -/obj/item/grenade/flashbang/prime() - update_mob() - var/flashbang_turf = get_turf(src) - if(!flashbang_turf) - return - for(var/mob/living/M in get_hearers_in_view(7, flashbang_turf)) - bang(get_turf(M), M) - - for(var/obj/structure/blob/B in get_hear(8,flashbang_turf)) //Blob damage here - var/distance = get_dist(B, get_turf(src)) - var/damage = round(100/(distance*distance)+1) - B.take_damage(damage, BURN, "energy") - qdel(src) - -/obj/item/grenade/flashbang/proc/bang(turf/T , mob/living/M) - if(M.stat == DEAD) //They're dead! - return - M.show_message("BANG", 2) - playsound(loc, 'sound/weapons/flashbang.ogg', 100, 1) - var/distance = max(0,get_dist(get_turf(src),T)) - -//Flash - if(M.flash_act(affect_silicon = 1)) - M.Knockdown(max(200/max(1,distance), 60)) -//Bang - if(!distance || loc == M || loc == M.loc) //Stop allahu akbarring rooms with this. - M.Knockdown(200) - M.soundbang_act(1, 200, 10, 15) - - else - M.soundbang_act(1, max(200/max(1,distance), 60), rand(0, 5)) -======= /obj/item/grenade/flashbang name = "flashbang" icon_state = "flashbang" @@ -54,6 +13,7 @@ return for(var/mob/living/M in get_hearers_in_view(7, flashbang_turf)) bang(get_turf(M), M) + qdel(src) /obj/item/grenade/flashbang/proc/bang(turf/T , mob/living/M) @@ -73,4 +33,3 @@ else M.soundbang_act(1, max(200/max(1,distance), 60), rand(0, 5)) ->>>>>>> 798a68e... Update flashbang.dm (#30862) From 97531c61ff1e4897d798e99cdd5a266c6f5e84d6 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 18 Jun 2018 12:04:19 -0700 Subject: [PATCH 014/204] Update coil.dm --- code/modules/power/tesla/coil.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index c6e3e69bcf..5ee0b91b2b 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -25,7 +25,7 @@ /obj/machinery/power/tesla_coil/Initialize() . = ..() - // wires = new /datum/wires/tesla_coil(src) //CITADEL EDIT, Kevinz you cheaty fuccboi. + wires = new /datum/wires/tesla_coil(src) //CITADEL EDIT, Kevinz you cheaty fuccboi. linked_techweb = SSresearch.science_tech /obj/machinery/power/tesla_coil/RefreshParts() @@ -62,9 +62,9 @@ if(default_deconstruction_crowbar(W)) return - /*if(is_wire_tool(W) && panel_open) CITADEL EDIT - They removed the wires because they don't like my cheating + if(is_wire_tool(W) && panel_open) wires.interact(user) - return*/ + return return ..() From 2cd16aa1ad0ef19572b61f7664929259aa78b150 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 19 Jun 2018 02:29:38 -0400 Subject: [PATCH 015/204] Fix some shuttle chair stuff (#38557) * Fix shuttle chair stuff * Remove redundancy --- _maps/shuttles/arrival_box.dmm | 10 +++---- _maps/shuttles/arrival_delta.dmm | 4 +-- _maps/shuttles/arrival_omega.dmm | 4 +-- _maps/shuttles/arrival_pubby.dmm | 2 +- _maps/shuttles/assault_pod_default.dmm | 8 ++--- _maps/shuttles/emergency_asteroid.dmm | 20 ++++++------- _maps/shuttles/emergency_bar.dmm | 4 +-- _maps/shuttles/emergency_birdboat.dmm | 22 +++++++------- _maps/shuttles/emergency_box.dmm | 22 +++++++------- _maps/shuttles/emergency_cere.dmm | 28 ++++++++--------- _maps/shuttles/emergency_clown.dmm | 12 ++++---- _maps/shuttles/emergency_cramped.dmm | 6 ++-- _maps/shuttles/emergency_delta.dmm | 24 +++++++-------- _maps/shuttles/emergency_goon.dmm | 8 ++--- _maps/shuttles/emergency_meta.dmm | 22 +++++++------- _maps/shuttles/emergency_mini.dmm | 24 +++++++-------- _maps/shuttles/emergency_narnar.dmm | 8 ++--- _maps/shuttles/emergency_omega.dmm | 18 +++++------ _maps/shuttles/emergency_pubby.dmm | 30 +++++++++---------- _maps/shuttles/emergency_raven.dmm | 20 ++++++------- _maps/shuttles/emergency_russiafightpit.dmm | 28 ++++++++--------- _maps/shuttles/emergency_scrapheap.dmm | 16 +++++----- _maps/shuttles/emergency_supermatter.dmm | 10 +++---- _maps/shuttles/emergency_wabbajack.dmm | 18 +++++------ _maps/shuttles/escape_pod_default.dmm | 4 +-- _maps/shuttles/escape_pod_large.dmm | 12 ++++---- _maps/shuttles/ferry_base.dmm | 6 ++-- _maps/shuttles/ferry_fancy.dmm | 4 +-- _maps/shuttles/ferry_lighthouse.dmm | 6 ++-- _maps/shuttles/ferry_meat.dmm | 6 ++-- _maps/shuttles/infiltrator_basic.dmm | 12 ++++---- _maps/shuttles/labour_box.dmm | 2 +- _maps/shuttles/labour_delta.dmm | 4 +-- _maps/shuttles/mining_box.dmm | 2 +- _maps/shuttles/mining_delta.dmm | 8 ++--- _maps/shuttles/pirate_default.dmm | 8 ++--- _maps/shuttles/ruin_caravan_victim.dmm | 2 +- _maps/shuttles/ruin_syndicate_dropship.dmm | 12 ++++---- _maps/shuttles/ruin_syndicate_fighter.dmm | 2 +- _maps/shuttles/whiteship_box.dmm | 6 ++-- _maps/shuttles/whiteship_meta.dmm | 8 ++--- _maps/shuttles/whiteship_pubby.dmm | 8 ++--- .../objects/structures/beds_chairs/chair.dm | 28 ++++++++--------- 43 files changed, 253 insertions(+), 255 deletions(-) diff --git a/_maps/shuttles/arrival_box.dmm b/_maps/shuttles/arrival_box.dmm index 2b245557a0..d117ca0f6b 100644 --- a/_maps/shuttles/arrival_box.dmm +++ b/_maps/shuttles/arrival_box.dmm @@ -78,18 +78,18 @@ /turf/open/floor/plating, /area/shuttle/arrival) "p" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) "q" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/light/small{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) "r" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -114,13 +114,13 @@ /turf/open/floor/plating/airless, /area/shuttle/arrival) "v" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) "w" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/machinery/light/small{ diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm index 08f34e1c23..b19ad63eb1 100644 --- a/_maps/shuttles/arrival_delta.dmm +++ b/_maps/shuttles/arrival_delta.dmm @@ -211,14 +211,14 @@ }, /area/shuttle/arrival) "u" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/shuttle/arrival) "v" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/effect/turf_decal/bot, diff --git a/_maps/shuttles/arrival_omega.dmm b/_maps/shuttles/arrival_omega.dmm index b8fc632779..04f19f60ea 100644 --- a/_maps/shuttles/arrival_omega.dmm +++ b/_maps/shuttles/arrival_omega.dmm @@ -124,14 +124,14 @@ /turf/open/floor/plating, /area/shuttle/arrival) "q" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/shuttle/arrival) "r" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/effect/turf_decal/bot, diff --git a/_maps/shuttles/arrival_pubby.dmm b/_maps/shuttles/arrival_pubby.dmm index a4308729b2..3309533f35 100644 --- a/_maps/shuttles/arrival_pubby.dmm +++ b/_maps/shuttles/arrival_pubby.dmm @@ -85,7 +85,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) "o" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/assault_pod_default.dmm b/_maps/shuttles/assault_pod_default.dmm index 9414fa9f82..4574318e47 100644 --- a/_maps/shuttles/assault_pod_default.dmm +++ b/_maps/shuttles/assault_pod_default.dmm @@ -4,7 +4,7 @@ /turf/closed/wall/mineral/plastitanium, /area/shuttle/assault_pod) "c" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium, @@ -45,20 +45,20 @@ /turf/open/floor/plating, /area/shuttle/assault_pod) "D" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/light{ dir = 1 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/assault_pod) "H" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/assault_pod) "L" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/machinery/light, diff --git a/_maps/shuttles/emergency_asteroid.dmm b/_maps/shuttles/emergency_asteroid.dmm index b1d300574d..258f9a76d3 100644 --- a/_maps/shuttles/emergency_asteroid.dmm +++ b/_maps/shuttles/emergency_asteroid.dmm @@ -73,7 +73,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "av" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -82,7 +82,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "ax" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -94,7 +94,7 @@ /turf/closed/wall/mineral/titanium/interior, /area/shuttle/escape) "aE" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/item/radio/intercom{ @@ -131,7 +131,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aK" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aL" = ( @@ -210,19 +210,19 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "aY" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aZ" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ba" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -345,7 +345,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "bw" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/item/radio/intercom{ @@ -355,7 +355,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "bx" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/structure/extinguisher_cabinet{ @@ -427,7 +427,7 @@ /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "bK" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/light{ dir = 1 }, diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 9b4776a011..4b0f919532 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -138,7 +138,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "aC" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aD" = ( @@ -214,7 +214,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aM" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig, diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm index d88e15fc94..6719587d1e 100644 --- a/_maps/shuttles/emergency_birdboat.dmm +++ b/_maps/shuttles/emergency_birdboat.dmm @@ -53,11 +53,11 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "al" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "am" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/light{ dir = 1 }, @@ -87,7 +87,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ar" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -157,7 +157,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aE" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -174,7 +174,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aH" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -215,14 +215,14 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aN" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/structure/window/reinforced, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aO" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/structure/window/reinforced, @@ -232,7 +232,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aP" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/structure/window/reinforced{ dir = 1; pixel_y = 2 @@ -255,13 +255,13 @@ /turf/open/floor/plasteel/white, /area/shuttle/escape) "aS" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aT" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/machinery/light, @@ -286,7 +286,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aW" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aX" = ( diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency_box.dmm index 57ddc27a97..dff9ccb5d2 100644 --- a/_maps/shuttles/emergency_box.dmm +++ b/_maps/shuttles/emergency_box.dmm @@ -18,7 +18,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "ag" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, @@ -44,7 +44,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "am" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -53,7 +53,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ao" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -71,7 +71,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "ar" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/structure/extinguisher_cabinet{ @@ -113,7 +113,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "aA" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aB" = ( @@ -179,17 +179,17 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aJ" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aK" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aL" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium, @@ -224,7 +224,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aS" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/structure/window/reinforced{ @@ -233,7 +233,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aT" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/structure/window/reinforced{ @@ -242,7 +242,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aU" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium, diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm index 7b9e8cfa6c..d64c28b8b9 100644 --- a/_maps/shuttles/emergency_cere.dmm +++ b/_maps/shuttles/emergency_cere.dmm @@ -251,11 +251,11 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aS" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aT" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/light{ dir = 1 }, @@ -283,7 +283,7 @@ }, /area/shuttle/escape) "aW" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/light{ dir = 1 }, @@ -294,7 +294,7 @@ }, /area/shuttle/escape) "aX" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/brig{ icon_state = "darkred"; dir = 1; @@ -302,7 +302,7 @@ }, /area/shuttle/escape) "aY" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/brig{ icon_state = "darkred"; dir = 5; @@ -330,7 +330,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bd" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -339,7 +339,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bf" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/machinery/flasher{ @@ -381,7 +381,7 @@ /turf/open/floor/mech_bay_recharge_floor, /area/shuttle/escape) "bk" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -412,7 +412,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bp" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/flasher{ @@ -479,7 +479,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "bw" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig{ @@ -489,7 +489,7 @@ }, /area/shuttle/escape) "bx" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig{ @@ -509,7 +509,7 @@ }, /area/shuttle/escape) "bz" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig{ @@ -658,7 +658,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bW" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/structure/window/reinforced{ @@ -667,7 +667,7 @@ /turf/open/floor/plasteel/neutral, /area/shuttle/escape) "bX" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/structure/window/reinforced{ diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm index 3dd4766d6a..2eaebaeb45 100644 --- a/_maps/shuttles/emergency_clown.dmm +++ b/_maps/shuttles/emergency_clown.dmm @@ -18,7 +18,7 @@ /turf/open/floor/noslip, /area/shuttle/escape) "af" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/bluespace, @@ -43,7 +43,7 @@ /turf/open/floor/noslip, /area/shuttle/escape) "aj" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/bluespace, @@ -53,7 +53,7 @@ /turf/open/floor/bluespace, /area/shuttle/escape) "al" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/bluespace, @@ -71,7 +71,7 @@ /turf/open/floor/noslip, /area/shuttle/escape) "ao" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/structure/extinguisher_cabinet{ @@ -154,11 +154,11 @@ /turf/open/floor/noslip, /area/shuttle/escape) "aC" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/noslip, /area/shuttle/escape) "aD" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/noslip, diff --git a/_maps/shuttles/emergency_cramped.dmm b/_maps/shuttles/emergency_cramped.dmm index 457e23d84b..aa1b9f0f0d 100644 --- a/_maps/shuttles/emergency_cramped.dmm +++ b/_maps/shuttles/emergency_cramped.dmm @@ -17,7 +17,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "e" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -74,7 +74,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "n" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/plating, @@ -109,7 +109,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "s" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/structure/extinguisher_cabinet{ diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm index 24d59e5033..256358bbae 100644 --- a/_maps/shuttles/emergency_delta.dmm +++ b/_maps/shuttles/emergency_delta.dmm @@ -240,14 +240,14 @@ /turf/open/floor/plasteel/cmo, /area/shuttle/escape) "av" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/shuttle/escape) "aw" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/effect/turf_decal/bot, @@ -326,7 +326,7 @@ }, /area/shuttle/escape) "aH" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/item/radio/intercom{ @@ -672,7 +672,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bx" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "by" = ( @@ -709,12 +709,12 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bC" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/shuttle/escape) "bD" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/status_display{ pixel_y = 32 }, @@ -722,7 +722,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bE" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -771,7 +771,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bM" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/status_display{ @@ -780,7 +780,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bN" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -823,7 +823,7 @@ }, /area/shuttle/escape) "bU" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig, @@ -1059,7 +1059,7 @@ }, /area/shuttle/escape) "cB" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/effect/turf_decal/bot, @@ -1077,7 +1077,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "cG" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/machinery/light, diff --git a/_maps/shuttles/emergency_goon.dmm b/_maps/shuttles/emergency_goon.dmm index 57f0b23d9f..6f31ce1d40 100644 --- a/_maps/shuttles/emergency_goon.dmm +++ b/_maps/shuttles/emergency_goon.dmm @@ -74,7 +74,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "s" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -154,7 +154,7 @@ /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "H" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -201,7 +201,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "S" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/light{ @@ -210,7 +210,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "T" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/light/small{ diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm index faf70072d3..29b8661ae2 100644 --- a/_maps/shuttles/emergency_meta.dmm +++ b/_maps/shuttles/emergency_meta.dmm @@ -65,7 +65,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ar" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "as" = ( @@ -74,7 +74,7 @@ name = "Station Intercom (General)"; pixel_y = 27 }, -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/light{ dir = 1 }, @@ -220,7 +220,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aE" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium, @@ -314,7 +314,7 @@ name = "Station Intercom (General)"; pixel_y = -31 }, -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/machinery/light, @@ -362,7 +362,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bd" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/plasteel/floorgrime, @@ -377,13 +377,13 @@ /turf/open/floor/plasteel/floorgrime, /area/shuttle/escape) "bh" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bi" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bj" = ( @@ -436,7 +436,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bs" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -713,7 +713,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bV" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/light{ dir = 1 }, @@ -816,7 +816,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ca" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/machinery/light, @@ -835,7 +835,7 @@ /turf/open/floor/plasteel/floorgrime, /area/shuttle/escape) "cd" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/machinery/light{ diff --git a/_maps/shuttles/emergency_mini.dmm b/_maps/shuttles/emergency_mini.dmm index 42650f6fd1..a0b6ce6db9 100644 --- a/_maps/shuttles/emergency_mini.dmm +++ b/_maps/shuttles/emergency_mini.dmm @@ -40,7 +40,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "h" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -49,7 +49,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "j" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -68,7 +68,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "m" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/machinery/light/small{ @@ -116,25 +116,25 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "v" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "w" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "x" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "y" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/machinery/light{ @@ -149,7 +149,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "A" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/light{ @@ -171,7 +171,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "C" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "D" = ( @@ -218,7 +218,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "K" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -231,7 +231,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "M" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -261,7 +261,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "R" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "S" = ( diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm index 9d6c5f1e4d..aaa9c861ce 100644 --- a/_maps/shuttles/emergency_narnar.dmm +++ b/_maps/shuttles/emergency_narnar.dmm @@ -15,7 +15,7 @@ /turf/open/floor/plasteel/cult, /area/shuttle/escape) "e" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/plasteel/cult, @@ -40,7 +40,7 @@ /turf/open/floor/plasteel/cult, /area/shuttle/escape) "i" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/plasteel/cult, @@ -49,7 +49,7 @@ /turf/open/floor/plasteel/cult, /area/shuttle/escape) "k" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/plasteel/cult, @@ -67,7 +67,7 @@ /turf/open/floor/plasteel/cult, /area/shuttle/escape) "n" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/structure/extinguisher_cabinet{ diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency_omega.dmm index 570cb99f0a..0debf2ad0f 100644 --- a/_maps/shuttles/emergency_omega.dmm +++ b/_maps/shuttles/emergency_omega.dmm @@ -12,7 +12,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "ad" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/newscaster/security_unit{ @@ -24,11 +24,11 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "ae" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "af" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/item/radio/intercom{ @@ -67,7 +67,7 @@ }, /area/shuttle/escape) "ak" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/status_display{ @@ -240,7 +240,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "aD" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/status_display{ @@ -253,7 +253,7 @@ /turf/open/floor/plasteel/neutral, /area/shuttle/escape) "aF" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/effect/turf_decal/bot, @@ -356,14 +356,14 @@ /turf/open/floor/grass, /area/shuttle/escape) "aJ" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/shuttle/escape) "aK" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/effect/turf_decal/bot, @@ -384,7 +384,7 @@ /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) "aN" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/effect/turf_decal/bot, diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm index 47b891cfd0..136cabe9db 100644 --- a/_maps/shuttles/emergency_pubby.dmm +++ b/_maps/shuttles/emergency_pubby.dmm @@ -222,7 +222,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aJ" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/plasteel/darkpurple/side{ dir = 9 }, @@ -235,7 +235,7 @@ /turf/open/floor/plasteel/darkgreen/side, /area/shuttle/escape) "aL" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/plasteel/darkpurple/side{ dir = 5 }, @@ -253,7 +253,7 @@ }, /area/shuttle/escape) "aO" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/structure/window/reinforced, @@ -262,14 +262,14 @@ }, /area/shuttle/escape) "aP" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/structure/window/reinforced, /turf/open/floor/plasteel/darkpurple/side, /area/shuttle/escape) "aQ" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/structure/window/reinforced, @@ -283,7 +283,7 @@ }, /area/shuttle/escape) "aS" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/plasteel/darkpurple/side{ @@ -291,7 +291,7 @@ }, /area/shuttle/escape) "aT" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/light{ dir = 1 }, @@ -300,7 +300,7 @@ }, /area/shuttle/escape) "aU" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/plasteel/darkpurple/side{ @@ -328,7 +328,7 @@ /turf/open/floor/plasteel/cmo, /area/shuttle/escape) "aY" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/machinery/light, @@ -370,7 +370,7 @@ /turf/open/floor/plasteel/cafeteria, /area/shuttle/escape) "be" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/plasteel/cmo, /area/shuttle/escape) "bf" = ( @@ -424,7 +424,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "bo" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/structure/window/reinforced{ dir = 1; pixel_y = 2 @@ -432,7 +432,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "bq" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/plating, @@ -466,13 +466,13 @@ /turf/open/floor/plating, /area/shuttle/escape) "bw" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bx" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -518,7 +518,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "bG" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/machinery/light, diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm index d5ca59c4f2..edd86c5ec6 100644 --- a/_maps/shuttles/emergency_raven.dmm +++ b/_maps/shuttles/emergency_raven.dmm @@ -420,7 +420,7 @@ }, /area/shuttle/escape) "bd" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig{ @@ -572,7 +572,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "bx" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig{ @@ -660,7 +660,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "bK" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/plasteel/darkgreen/side{ dir = 8 }, @@ -679,7 +679,7 @@ }, /area/shuttle/escape) "bN" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/plasteel/darkgreen/side, @@ -815,7 +815,7 @@ }, /area/shuttle/escape) "bX" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/structure/window/reinforced{ @@ -824,7 +824,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "bY" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/structure/window/reinforced{ @@ -833,27 +833,27 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "bZ" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/structure/window/reinforced, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "ca" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/structure/window/reinforced{ dir = 1 }, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "cb" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/plasteel/darkgreen/side{ dir = 1 }, /area/shuttle/escape) "cc" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/plasteel/darkgreen/side, diff --git a/_maps/shuttles/emergency_russiafightpit.dmm b/_maps/shuttles/emergency_russiafightpit.dmm index 3e5568279b..d0b8f7ca80 100644 --- a/_maps/shuttles/emergency_russiafightpit.dmm +++ b/_maps/shuttles/emergency_russiafightpit.dmm @@ -18,7 +18,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "af" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, @@ -43,7 +43,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aj" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -76,7 +76,7 @@ pixel_x = 6; pixel_y = -24 }, -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -91,7 +91,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aq" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ar" = ( @@ -102,7 +102,7 @@ pixel_y = -6; req_access_txt = "19" }, -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/button/door{ id = "bearsbearsbears"; name = "release bears"; @@ -131,7 +131,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "av" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aw" = ( @@ -204,7 +204,7 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "aJ" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium, @@ -238,7 +238,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "aP" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig, @@ -315,7 +315,7 @@ /turf/open/floor/engine, /area/shuttle/escape) "bc" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/structure/window/reinforced{ @@ -327,7 +327,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium, @@ -341,7 +341,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium, @@ -350,13 +350,13 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "bh" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium, @@ -551,7 +551,7 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "bO" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/light/small{ diff --git a/_maps/shuttles/emergency_scrapheap.dmm b/_maps/shuttles/emergency_scrapheap.dmm index e95fcb507c..cb2b7517b5 100644 --- a/_maps/shuttles/emergency_scrapheap.dmm +++ b/_maps/shuttles/emergency_scrapheap.dmm @@ -109,7 +109,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "at" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "au" = ( @@ -178,7 +178,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aE" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig, @@ -188,7 +188,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aG" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aH" = ( @@ -222,7 +222,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "aL" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, @@ -231,7 +231,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -266,7 +266,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aT" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/structure/extinguisher_cabinet{ @@ -395,14 +395,14 @@ /turf/open/floor/plating/airless, /area/shuttle/escape) "bo" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/light{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "bp" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/machinery/light{ diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm index ce8842a41b..0dc057963c 100644 --- a/_maps/shuttles/emergency_supermatter.dmm +++ b/_maps/shuttles/emergency_supermatter.dmm @@ -21,14 +21,14 @@ /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "ah" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "ai" = ( /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "aj" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/yellow, @@ -73,7 +73,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "ar" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/yellow, @@ -94,7 +94,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "av" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/yellow, @@ -237,7 +237,7 @@ /turf/open/floor/plating/airless, /area/shuttle/escape) "bb" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/effect/turf_decal/stripes/line{ dir = 1 }, diff --git a/_maps/shuttles/emergency_wabbajack.dmm b/_maps/shuttles/emergency_wabbajack.dmm index 34f1661020..9bdb49064f 100644 --- a/_maps/shuttles/emergency_wabbajack.dmm +++ b/_maps/shuttles/emergency_wabbajack.dmm @@ -38,7 +38,7 @@ /turf/open/floor/plasteel/cult, /area/shuttle/escape) "ak" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -47,7 +47,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "am" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -92,7 +92,7 @@ pixel_x = -24; pixel_y = -6 }, -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -102,11 +102,11 @@ /turf/open/floor/plasteel/cult, /area/shuttle/escape) "av" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aw" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium, @@ -182,13 +182,13 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "aI" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aJ" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/structure/window/reinforced{ @@ -352,7 +352,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "bm" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/light/small{ @@ -365,7 +365,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "bo" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/light/small{ diff --git a/_maps/shuttles/escape_pod_default.dmm b/_maps/shuttles/escape_pod_default.dmm index 8dcccf9326..c2625b0e57 100644 --- a/_maps/shuttles/escape_pod_default.dmm +++ b/_maps/shuttles/escape_pod_default.dmm @@ -3,7 +3,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/pod_1) "G" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/machinery/status_display{ @@ -32,7 +32,7 @@ /turf/open/floor/plating, /area/shuttle/pod_1) "U" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/item/radio/intercom{ diff --git a/_maps/shuttles/escape_pod_large.dmm b/_maps/shuttles/escape_pod_large.dmm index 49f2f44e1e..6a36801db9 100644 --- a/_maps/shuttles/escape_pod_large.dmm +++ b/_maps/shuttles/escape_pod_large.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "h" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/item/storage/pod{ @@ -17,7 +17,7 @@ /turf/open/floor/plating, /area/shuttle/pod_1) "A" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/item/radio/intercom{ @@ -36,13 +36,13 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/pod_1) "H" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/pod_1) "J" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/status_display{ @@ -51,13 +51,13 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/pod_1) "L" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/pod_1) "M" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/machinery/status_display{ diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry_base.dmm index f7e717ccb8..36a54e54bc 100644 --- a/_maps/shuttles/ferry_base.dmm +++ b/_maps/shuttles/ferry_base.dmm @@ -24,7 +24,7 @@ /turf/closed/wall/mineral/titanium/interior, /area/shuttle/transport) "h" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -36,7 +36,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "j" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "k" = ( @@ -64,7 +64,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "q" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/ferry_fancy.dmm b/_maps/shuttles/ferry_fancy.dmm index e21bd7c5eb..432791c936 100644 --- a/_maps/shuttles/ferry_fancy.dmm +++ b/_maps/shuttles/ferry_fancy.dmm @@ -27,7 +27,7 @@ /turf/open/floor/plating/airless, /area/shuttle/transport) "g" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/pod/dark, /area/shuttle/transport) "h" = ( @@ -87,7 +87,7 @@ /turf/open/floor/plating/airless, /area/shuttle/transport) "p" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/pod/dark, diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm index 21f8a58e44..21d3bd3413 100644 --- a/_maps/shuttles/ferry_lighthouse.dmm +++ b/_maps/shuttles/ferry_lighthouse.dmm @@ -68,7 +68,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "ar" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/wood, /area/shuttle/transport) "as" = ( @@ -137,7 +137,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "aJ" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "aK" = ( @@ -204,7 +204,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "aW" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm index 22d83d8d01..334df92b55 100644 --- a/_maps/shuttles/ferry_meat.dmm +++ b/_maps/shuttles/ferry_meat.dmm @@ -15,7 +15,7 @@ /turf/closed/wall/mineral/titanium/interior, /area/shuttle/transport) "f" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/plasteel/freezer, @@ -90,7 +90,7 @@ /area/shuttle/transport) "n" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/plasteel/freezer, /area/shuttle/transport) "o" = ( @@ -131,7 +131,7 @@ /turf/open/floor/plasteel/freezer, /area/shuttle/transport) "w" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/plasteel/freezer, diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index 0add06a7ff..b1feae232e 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -176,7 +176,7 @@ /turf/closed/wall/mineral/plastitanium, /area/shuttle/syndicate/hallway) "aC" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4; name = "tactical chair" }, @@ -188,7 +188,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/hallway) "aE" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8; name = "tactical chair" }, @@ -206,7 +206,7 @@ /turf/closed/wall/mineral/plastitanium, /area/shuttle/syndicate/eva) "aH" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4; name = "tactical chair" }, @@ -218,7 +218,7 @@ }, /area/shuttle/syndicate/hallway) "aI" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8; name = "tactical chair" }, @@ -256,7 +256,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/eva) "aO" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4; name = "tactical chair" }, @@ -318,7 +318,7 @@ }, /area/shuttle/syndicate/hallway) "aX" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4; name = "tactical chair" }, diff --git a/_maps/shuttles/labour_box.dmm b/_maps/shuttles/labour_box.dmm index fe9756ef33..636458a64c 100644 --- a/_maps/shuttles/labour_box.dmm +++ b/_maps/shuttles/labour_box.dmm @@ -86,7 +86,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/labor) "o" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/machinery/flasher{ diff --git a/_maps/shuttles/labour_delta.dmm b/_maps/shuttles/labour_delta.dmm index aeb2841683..6df69ba0f6 100644 --- a/_maps/shuttles/labour_delta.dmm +++ b/_maps/shuttles/labour_delta.dmm @@ -120,7 +120,7 @@ /turf/open/floor/plasteel, /area/shuttle/labor) "q" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ @@ -133,7 +133,7 @@ /turf/open/floor/plasteel, /area/shuttle/labor) "s" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/machinery/flasher{ diff --git a/_maps/shuttles/mining_box.dmm b/_maps/shuttles/mining_box.dmm index 2f262cae2b..b7354b8d89 100644 --- a/_maps/shuttles/mining_box.dmm +++ b/_maps/shuttles/mining_box.dmm @@ -18,7 +18,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/mining) "f" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/mining_delta.dmm b/_maps/shuttles/mining_delta.dmm index 920a754e45..99bdb64aae 100644 --- a/_maps/shuttles/mining_delta.dmm +++ b/_maps/shuttles/mining_delta.dmm @@ -47,7 +47,7 @@ /turf/open/floor/plasteel, /area/shuttle/mining) "g" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/plasteel/neutral, @@ -116,7 +116,7 @@ /turf/open/floor/plasteel/white, /area/shuttle/mining) "n" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/effect/decal/cleanable/dirt, @@ -126,7 +126,7 @@ /turf/open/floor/plasteel, /area/shuttle/mining) "o" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/effect/decal/cleanable/dirt, @@ -139,7 +139,7 @@ /turf/open/floor/plasteel, /area/shuttle/mining) "p" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index 59ce3014af..efd49c8908 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -39,7 +39,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/pirate) "ag" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -71,7 +71,7 @@ pixel_y = -24; req_access = null }, -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/effect/decal/cleanable/dirt, @@ -82,7 +82,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/pirate) "an" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/effect/decal/cleanable/dirt, @@ -413,7 +413,7 @@ pixel_y = -24; req_access = null }, -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/ruin_caravan_victim.dmm b/_maps/shuttles/ruin_caravan_victim.dmm index 8f65015d55..aa42b30b9f 100644 --- a/_maps/shuttles/ruin_caravan_victim.dmm +++ b/_maps/shuttles/ruin_caravan_victim.dmm @@ -156,7 +156,7 @@ }, /area/shuttle/caravan/freighter1) "gw" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin_syndicate_dropship.dmm index ac9a2cd680..696a99e30a 100644 --- a/_maps/shuttles/ruin_syndicate_dropship.dmm +++ b/_maps/shuttles/ruin_syndicate_dropship.dmm @@ -88,7 +88,7 @@ /turf/open/floor/plating, /area/shuttle/caravan/syndicate3) "hF" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/light/small{ dir = 8 }, @@ -104,7 +104,7 @@ /turf/open/floor/pod/dark, /area/shuttle/caravan/syndicate3) "ka" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/machinery/light/small{ @@ -169,7 +169,7 @@ /turf/open/floor/plating, /area/shuttle/caravan/syndicate3) "rV" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/effect/decal/cleanable/dirt, @@ -185,7 +185,7 @@ }, /area/shuttle/caravan/syndicate3) "sn" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/shuttle/caravan/syndicate3) @@ -247,7 +247,7 @@ /turf/open/floor/plasteel/darkred/side, /area/shuttle/caravan/syndicate3) "Cm" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/machinery/firealarm{ @@ -278,7 +278,7 @@ }, /area/shuttle/caravan/syndicate3) "EO" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/machinery/airalarm/syndicate{ pixel_y = 24 }, diff --git a/_maps/shuttles/ruin_syndicate_fighter.dmm b/_maps/shuttles/ruin_syndicate_fighter.dmm index 1f8c264079..a9cf2a45b5 100644 --- a/_maps/shuttles/ruin_syndicate_fighter.dmm +++ b/_maps/shuttles/ruin_syndicate_fighter.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aA" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/turretid{ diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index 6b56e1a6a0..f7cd8ad529 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -137,7 +137,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "aJ" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium, @@ -179,7 +179,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "aS" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/effect/decal/remains/human, @@ -232,7 +232,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "bd" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "bf" = ( diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index f8e366950a..9888026e31 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -753,7 +753,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "bo" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /obj/effect/decal/cleanable/dirt{ desc = "A thin layer of dust coating the floor."; name = "dust" @@ -827,7 +827,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/abandoned) "bu" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/effect/decal/cleanable/dirt{ @@ -871,7 +871,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "by" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/effect/decal/cleanable/dirt{ @@ -1022,7 +1022,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "bL" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /obj/effect/decal/cleanable/dirt{ diff --git a/_maps/shuttles/whiteship_pubby.dmm b/_maps/shuttles/whiteship_pubby.dmm index e7cf65a6f5..11214ef260 100644 --- a/_maps/shuttles/whiteship_pubby.dmm +++ b/_maps/shuttles/whiteship_pubby.dmm @@ -42,7 +42,7 @@ /turf/open/floor/plating/abductor, /area/shuttle/abandoned) "i" = ( -/obj/structure/chair/shuttle, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/plating/abductor, /area/shuttle/abandoned) "j" = ( @@ -65,7 +65,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned) "l" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/plating/abductor, @@ -75,7 +75,7 @@ /turf/open/floor/plating/abductor, /area/shuttle/abandoned) "n" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/plating/abductor, @@ -110,7 +110,7 @@ /turf/open/floor/plating/abductor, /area/shuttle/abandoned) "q" = ( -/obj/structure/chair/shuttle{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/plating/abductor, diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index c7ab58f011..a4915f6e1f 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -148,14 +148,17 @@ resistance_flags = FLAMMABLE max_integrity = 70 buildstackamount = 2 - var/mutable_appearance/armrest item_chair = null + var/mutable_appearance/armrest /obj/structure/chair/comfy/Initialize() - armrest = mutable_appearance('icons/obj/chairs.dmi', "comfychair_armrest") + armrest = GetArmrest() armrest.layer = ABOVE_MOB_LAYER return ..() +/obj/structure/chair/comfy/proc/GetArmrest() + return mutable_appearance('icons/obj/chairs.dmi', "comfychair_armrest") + /obj/structure/chair/comfy/Destroy() QDEL_NULL(armrest) return ..() @@ -189,6 +192,14 @@ /obj/structure/chair/comfy/lime color = rgb(255,251,0) +/obj/structure/chair/comfy/shuttle + name = "shuttle seat" + desc = "A comfortable, secure seat. It has a more sturdy looking buckling system, for smoother flights." + icon_state = "shuttle_chair" + +/obj/structure/chair/comfy/shuttle/GetArmrest() + return mutable_appearance('icons/obj/chairs.dmi', "shuttle_chair_armrest") + /obj/structure/chair/office anchored = FALSE buildstackamount = 5 @@ -407,16 +418,3 @@ . = ..() if(has_gravity()) playsound(src, 'sound/machines/clockcult/integration_cog_install.ogg', 50, TRUE) - -/obj/structure/chair/shuttle - name = "shuttle seat" - desc = "A comfortable, secure seat. It has a more sturdy looking buckling system, for smoother flights." - icon_state = "shuttle_chair" - buildstackamount = 2 - var/mutable_appearance/armrest - item_chair = null - -/obj/structure/chair/shuttle/Initialize() - armrest = mutable_appearance('icons/obj/chairs.dmi', "shuttle_chair_armrest") - armrest.layer = ABOVE_MOB_LAYER - return ..() \ No newline at end of file From 2cd045b8feb3391535dc6f972ad7b77360dca675 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 19 Jun 2018 10:10:30 -0400 Subject: [PATCH 017/204] [s] Fixes direct sql datum call exploit. --- code/controllers/subsystem/dbcore.dm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 0e1f1fb8fd..4692826a9c 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -237,6 +237,22 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table item = list() _db_query = _dm_db_new_query() +<<<<<<< HEAD +======= +/datum/DBQuery/Destroy() + Close() + SSdbcore.active_queries -= src + return ..() + +/datum/DBQuery/CanProcCall(proc_name) + //fuck off kevinz + return FALSE + +/datum/DBQuery/proc/Activity(activity) + last_activity = activity + last_activity_time = world.time + +>>>>>>> 1a22d45... [s] Fixes stack overflow (#38592) /datum/DBQuery/proc/warn_execute() . = Execute() if(!.) From 8115f0acdadd87991f5d4d472ec835c01373c4f5 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 19 Jun 2018 10:19:10 -0400 Subject: [PATCH 018/204] Merge pull request #38576 from AnturK/runtimeL Fixes alternative method of removing legcuffs. --- code/modules/surgery/bodyparts/dismemberment.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index aa0b714cc8..c806a68867 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -199,7 +199,7 @@ /obj/item/bodypart/r_leg/drop_limb(special) if(owner && !special) if(owner.legcuffed) - owner.legcuffed.forceMove(drop_location()) + owner.legcuffed.forceMove(owner.drop_location()) //At this point bodypart is still in nullspace owner.legcuffed.dropped(owner) owner.legcuffed = null owner.update_inv_legcuffed() @@ -210,7 +210,7 @@ /obj/item/bodypart/l_leg/drop_limb(special) //copypasta if(owner && !special) if(owner.legcuffed) - owner.legcuffed.forceMove(drop_location()) + owner.legcuffed.forceMove(owner.drop_location()) owner.legcuffed.dropped(owner) owner.legcuffed = null owner.update_inv_legcuffed() From 02744c59a590af1e9e68e6bfe1d8d5c4b025e8da Mon Sep 17 00:00:00 2001 From: JStheguy Date: Tue, 19 Jun 2018 09:22:59 -0500 Subject: [PATCH 020/204] [READY] Helps data disks stop being unemployed (#38319) * data cards actually have a function now * Adds data cards to the IC printer for real rea * more cards, less shitty code * how the fuck did I miss that adds a missing ..() * wait wrong use of ..() fuck --- .../subsystem/processing/circuit.dm | 5 +- code/game/objects/items/cards_ids.dm | 49 ++++++++++++------ .../integrated_electronics/subtypes/access.dm | 6 ++- .../integrated_electronics/subtypes/input.dm | 40 ++++++++++++++ icons/obj/card.dmi | Bin 4301 -> 5371 bytes 5 files changed, 83 insertions(+), 17 deletions(-) diff --git a/code/controllers/subsystem/processing/circuit.dm b/code/controllers/subsystem/processing/circuit.dm index db1bf1ff5f..dad71a005a 100644 --- a/code/controllers/subsystem/processing/circuit.dm +++ b/code/controllers/subsystem/processing/circuit.dm @@ -78,5 +78,8 @@ PROCESSING_SUBSYSTEM_DEF(circuit) /obj/item/integrated_electronics/wirer, /obj/item/integrated_electronics/debugger, /obj/item/integrated_electronics/analyzer, - /obj/item/integrated_electronics/detailer + /obj/item/integrated_electronics/detailer, + /obj/item/card/data, + /obj/item/card/data/full_color, + /obj/item/card/data/disk ) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 4c96bf3b84..2d30a015e2 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -9,7 +9,7 @@ /* - * DATA CARDS - Used for the teleporter + * DATA CARDS - Used for the IC data card reader */ /obj/item/card name = "card" @@ -24,30 +24,49 @@ return BRUTELOSS /obj/item/card/data - name = "data disk" - desc = "A disk of data." - icon_state = "data" + name = "data card" + desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one has a stripe running down the middle." + icon_state = "data_1" + obj_flags = UNIQUE_RENAME var/function = "storage" var/data = "null" var/special = null item_state = "card-id" lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' + var/detail_color = COLOR_ASSEMBLY_ORANGE -/obj/item/card/data/verb/label(t as text) - set name = "Label Disk" - set category = "Object" - set src in usr +/obj/item/card/data/Initialize() + .=..() + update_icon() - if(usr.stat || !usr.canmove || usr.restrained()) +/obj/item/card/data/update_icon() + cut_overlays() + if(detail_color == COLOR_FLOORTILE_GRAY) return + var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/card.dmi', "[icon_state]-color") + detail_overlay.color = detail_color + add_overlay(detail_overlay) - if (t) - src.name = "data disk- '[t]'" - else - src.name = "data disk" - src.add_fingerprint(usr) - return +/obj/item/card/data/attackby(obj/item/I, mob/living/user) + if(istype(I, /obj/item/integrated_electronics/detailer)) + var/obj/item/integrated_electronics/detailer/D = I + detail_color = D.detail_color + update_icon() + return ..() + +/obj/item/proc/GetCard() + +/obj/item/card/data/GetCard() + return src + +/obj/item/card/data/full_color + desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one has the entire card colored." + icon_state = "data_2" + +/obj/item/card/data/disk + desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one inexplicibly looks like a floppy disk." + icon_state = "data_3" /* * ID CARDS diff --git a/code/modules/integrated_electronics/subtypes/access.dm b/code/modules/integrated_electronics/subtypes/access.dm index bf710be0e2..9012cd1089 100644 --- a/code/modules/integrated_electronics/subtypes/access.dm +++ b/code/modules/integrated_electronics/subtypes/access.dm @@ -1,5 +1,5 @@ /obj/item/integrated_circuit/input/card_reader - name = "card reader" + name = "ID card reader" //To differentiate it from the data card reader desc = "A circuit that can read the registred name, assignment, and PassKey string from an ID card." icon_state = "card_reader" @@ -14,6 +14,10 @@ "on read" = IC_PINTYPE_PULSE_OUT ) +/obj/item/integrated_circuit/input/card_reader/old + name = "card reader" + spawn_flags = 0 + /obj/item/integrated_circuit/input/card_reader/attackby_react(obj/item/I, mob/living/user, intent) var/obj/item/card/id/card = I.GetID() var/list/access = I.GetAccess() diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index b780762cd4..02500e5ed6 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -1104,3 +1104,43 @@ else activate_pin(3) +/obj/item/integrated_circuit/input/data_card_reader + name = "data card reader" + desc = "A circuit that can read from and write to data cards." + extended_desc = "Setting the \"write mode\" boolean to true will cause any data cards that are used on the assembly to replace\ + their existing function and data strings with the given strings, if it is set to false then using a data card on the assembly will cause\ + the function and data strings stored on the card to be written to the output pins." + icon_state = "card_reader" + complexity = 4 + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + inputs = list( + "function" = IC_PINTYPE_STRING, + "data to store" = IC_PINTYPE_STRING, + "write mode" = IC_PINTYPE_BOOLEAN + ) + outputs = list( + "function" = IC_PINTYPE_STRING, + "stored data" = IC_PINTYPE_STRING + ) + activators = list( + "on write" = IC_PINTYPE_PULSE_OUT, + "on read" = IC_PINTYPE_PULSE_OUT + ) + +/obj/item/integrated_circuit/input/data_card_reader/attackby_react(obj/item/I, mob/living/user, intent) + var/obj/item/card/data/card = I.GetCard() + var/write_mode = get_pin_data(IC_INPUT, 3) + if(card) + if(write_mode == TRUE) + card.function = get_pin_data(IC_INPUT, 1) + card.data = get_pin_data(IC_INPUT, 2) + push_data() + activate_pin(1) + else + set_pin_data(IC_OUTPUT, 1, card.function) + set_pin_data(IC_OUTPUT, 2, card.data) + push_data() + activate_pin(2) + else + return FALSE + return TRUE diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index e6778c51af5ee819852370af8d27098c02862a26..507801844cc5e861e73e4a44a8eed74cae88c019 100644 GIT binary patch literal 5371 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 kb(!+J|Gl>8IAS|JY5rh*tN;K2 literal 4301 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 From 1ee84bb7d291a5ba4a7a2b1a6c630cef332f43e2 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 19 Jun 2018 10:49:27 -0400 Subject: [PATCH 022/204] Merge pull request #38580 from Hyacinth-OR/pinkscarf Adds a pink scarf --- code/modules/clothing/neck/_neck.dm | 9 +++++++-- code/modules/vending/clothesmate.dm | 5 +++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index cb797c34d4..8245148096 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -100,6 +100,11 @@ icon_state = "scarf" color = "#4A4A4B" //Grey but it looks black +/obj/item/clothing/neck/scarf/pink + name = "pink scarf" + icon_state = "scarf" + color = "#F699CD" //Pink + /obj/item/clothing/neck/scarf/red name = "red scarf" icon_state = "scarf" @@ -118,7 +123,7 @@ /obj/item/clothing/neck/scarf/purple name = "purple scarf" icon_state = "scarf" - color = "#9557C5" //purple + color = "#9557C5" //Purple /obj/item/clothing/neck/scarf/yellow name = "yellow scarf" @@ -128,7 +133,7 @@ /obj/item/clothing/neck/scarf/orange name = "orange scarf" icon_state = "scarf" - color = "#C67A4B" //orange + color = "#C67A4B" //Orange /obj/item/clothing/neck/scarf/cyan name = "cyan scarf" diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index f3ab636fb0..ad5b38575c 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -35,6 +35,7 @@ /obj/item/clothing/neck/tie/red = 1, /obj/item/clothing/neck/tie/black = 1, /obj/item/clothing/neck/tie/horrible = 1, + /obj/item/clothing/neck/scarf/pink = 1, /obj/item/clothing/neck/scarf/red = 1, /obj/item/clothing/neck/scarf/green = 1, /obj/item/clothing/neck/scarf/darkblue = 1, @@ -118,5 +119,5 @@ /obj/item/vending_refill/clothing machine_name = "ClothesMate" icon_state = "refill_clothes" - charges = list(37, 4, 4)// of 111 standard, 12 contraband, 10 premium(?) - init_charges = list(37, 4, 4) + charges = list(38, 4, 4)// of 112 standard, 12 contraband, 10 premium(?) + init_charges = list(38, 4, 4) From 75335cb30b04d597ee7bd90893fab9f2ef9efbbc Mon Sep 17 00:00:00 2001 From: Irafas Date: Tue, 19 Jun 2018 15:49:04 +0100 Subject: [PATCH 024/204] PDA can be ctrl-clicked to remove the item in its pen slot (#38577) * Makes pens ez to remove from pda Players can now ctrl click on the PDA to remove the pen without having to remove the ID first. * added instructions when examined. Like how it tells the user they can use alt-click to remove contents, it now says they can use ctrl-click to remove items from the pen slot. * PDA can now be dragged without dropping the pen. When ctrl-clicked it now checks to see if the PDA is on a turf and will only output the pen if its not. * quick change to examine text. * comma * Improved the examine --- code/game/objects/items/devices/PDA/PDA.dm | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 5ab8000402..6731caffd7 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -92,8 +92,12 @@ GLOBAL_LIST_EMPTY(PDAs) ..() if(!id && !inserted_item) return - else - to_chat(user, "Alt-click to remove contents.") + + if(id) + to_chat(user, "Alt-click to remove the id.") + + if(inserted_item && (!isturf(loc))) + to_chat(user, "Ctrl-click to remove [inserted_item].") /obj/item/pda/Initialize() . = ..() @@ -712,6 +716,15 @@ GLOBAL_LIST_EMPTY(PDAs) else remove_pen() +/obj/item/pda/CtrlClick() + ..() + + if(issilicon(usr)) + return + + if(usr.canUseTopic(src) && !isturf(loc)) + remove_pen() + /obj/item/pda/verb/verb_remove_id() set category = "Object" set name = "Eject ID" From 49a34614cd903402a88bf01065d33606a3b55fb0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 19 Jun 2018 16:51:14 -0500 Subject: [PATCH 026/204] [MIRROR] Admin Kicks now prompt the admin to avoid accidental kicking (#7191) * Admin Kicks now prompt the admin to avoid accidental kicking (#38544) * TO THE PLAAAAAACE I BELOOOOOONG * TAKE ME HOOOOOOOOOOME * WEEEEEEST VIRGINIAAAAAAAAAAAAAAAAAAA * fixes my shit * No meming in admin frontend * Admin Kicks now prompt the admin to avoid accidental kicking --- code/modules/admin/topic.dm | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 0a4a857b19..d5349c3e2f 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1058,14 +1058,21 @@ if(!check_rights(R_ADMIN)) return var/mob/M = locate(href_list["boot2"]) - if (ismob(M)) + if(ismob(M)) if(!check_if_greater_rights_than(M.client)) to_chat(usr, "Error: They have more rights than you do.") return + if(alert(usr, "Kick [key_name(M)]?", "Confirm", "Yes", "No") != "Yes") + return + if(!M) + to_chat(usr, "Error: [M] no longer exists!") + return + if(!M.client) + to_chat(usr, "Error: [M] no longer has a client!") + return to_chat(M, "You have been kicked from the server by [usr.client.holder.fakekey ? "an Administrator" : "[usr.client.ckey]"].") log_admin("[key_name(usr)] kicked [key_name(M)].") message_admins("[key_name_admin(usr)] kicked [key_name_admin(M)].") - //M.client = null qdel(M.client) else if(href_list["addmessage"]) From c11557d23d9aad3808e5cb5996391e30df09dde0 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 19 Jun 2018 18:18:11 -0400 Subject: [PATCH 027/204] Global component signals --- _maps/RandomRuins/SpaceRuins/bus.dmm | 12 +++++- code/__DEFINES/components.dm | 15 ++++++++ code/controllers/subsystem/dcs.dm | 35 ++++++++++++++++++ code/datums/components/_component.dm | 4 ++ code/datums/components/edit_complainer.dm | 23 ++++++++++++ code/game/objects/items/plushes.dm | 10 +++++ code/modules/admin/verbs/modifyvariables.dm | 1 + .../space_management/zlevel_manager.dm | 1 + icons/obj/plushes.dmi | Bin 5362 -> 5691 bytes tgstation.dme | 2 + 10 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 code/controllers/subsystem/dcs.dm create mode 100644 code/datums/components/edit_complainer.dm diff --git a/_maps/RandomRuins/SpaceRuins/bus.dmm b/_maps/RandomRuins/SpaceRuins/bus.dmm index be05a8d1d6..fe624c19bf 100644 --- a/_maps/RandomRuins/SpaceRuins/bus.dmm +++ b/_maps/RandomRuins/SpaceRuins/bus.dmm @@ -334,6 +334,16 @@ /obj/item/stack/sheet/metal/fifty, /turf/open/floor/plating/asteroid/airless, /area/ruin/unpowered/no_grav) +"XA" = ( +/obj/structure/fluff/bus/passable/seat{ + icon_state = "backseat" + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/toy/plush/awakenedplushie, +/turf/open/floor/plasteel/airless/dark{ + icon_state = "bus" + }, +/area/ruin/unpowered/no_grav) (1,1,1) = {" aa @@ -484,7 +494,7 @@ ab ae ad aj -am +XA az aK ad diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 1cf27a8c68..cade3d1ef3 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -1,3 +1,10 @@ +<<<<<<< HEAD +======= +#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.datum_components ? NONE : target._SendSignal(sigtype, list(##arguments)) ) + +#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( !SSdcs.comp_lookup[sigtype] ? NONE : SSdcs._SendGlobalSignal(sigtype, list(##arguments)) ) + +>>>>>>> 84a85a5... Merge pull request #38574 from ninjanomnom/glob-signals //shorthand #define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path) #define GET_COMPONENT(varname, path) GET_COMPONENT_FROM(varname, path, src) @@ -14,6 +21,14 @@ // All signals. Format: // When the signal is called: (signal arguments) +// global signals +// These are signals which can be listened to by any component on any parent +// GLOBAL SIGNALS MUST START WITH "!" +#define COMSIG_GLOB_NEW_Z "!new_z" //from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args) +#define COMSIG_GLOB_VAR_EDIT "!var_edit" //called after a successful var edit somewhere in the world: (list/args) + +////////////////////////////////////////////////////////////////// + // /datum signals #define COMSIG_COMPONENT_ADDED "component_added" //when a component is added to a datum: (/datum/component) #define COMSIG_COMPONENT_REMOVING "component_removing" //before a component is removed from a datum because of RemoveComponent: (/datum/component) diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm new file mode 100644 index 0000000000..3eed510adc --- /dev/null +++ b/code/controllers/subsystem/dcs.dm @@ -0,0 +1,35 @@ +SUBSYSTEM_DEF(dcs) + name = "Datum Component System" + flags = SS_NO_INIT | SS_NO_FIRE + + var/list/comp_lookup = list() // A signal:list(components) assoc list + +/datum/controller/subsystem/dcs/proc/_SendGlobalSignal(sigtype, list/arguments) + . = NONE + for(var/i in comp_lookup[sigtype]) + var/datum/component/comp = i + if(!comp.enabled) + continue + var/datum/callback/CB = comp.signal_procs[sigtype] + if(!CB) + continue // Should we error from this? + . |= CB.InvokeAsync(arglist(arguments)) + +/datum/controller/subsystem/dcs/proc/RegisterSignal(datum/component/comp, sigtype) + if(!comp_lookup[sigtype]) + comp_lookup[sigtype] = list() + + comp_lookup[sigtype][comp] = TRUE + +/datum/controller/subsystem/dcs/proc/UnregisterSignal(datum/component/comp, list/sigtypes) + if(!length(sigtypes)) + sigtypes = list(sigtypes) + for(var/sigtype in sigtypes) + switch(length(comp_lookup[sigtype])) + if(1) + comp_lookup -= sigtype + if(2 to INFINITY) + comp_lookup[sigtype] -= comp + +/datum/controller/subsystem/dcs/Recover() + comp_lookup = SSdcs.comp_lookup diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index bfd6f5a5de..1769a26d18 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -58,6 +58,7 @@ if(!silent) P.SendSignal(COMSIG_COMPONENT_REMOVING, src) parent = null + SSdcs.UnregisterSignal(src, signal_procs) LAZYCLEARLIST(signal_procs) return ..() @@ -93,6 +94,9 @@ if(!override && procs[sig_type]) stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning") + if(sig_type[1] == "!") + SSdcs.RegisterSignal(src, sig_type) + procs[sig_type] = proc_or_callback enabled = TRUE diff --git a/code/datums/components/edit_complainer.dm b/code/datums/components/edit_complainer.dm new file mode 100644 index 0000000000..c0a875d457 --- /dev/null +++ b/code/datums/components/edit_complainer.dm @@ -0,0 +1,23 @@ +// This is just a bit of fun while making an example for global signal +/datum/component/edit_complainer + var/list/say_lines + +/datum/component/edit_complainer/Initialize(list/text) + if(!ismovableatom(parent)) + return COMPONENT_INCOMPATIBLE + + var/static/list/default_lines = list( + "CentCom's profligacy frays another thread.", + "Another tug at the weave.", + "Who knows when the stresses will finally shatter the form?", + "Even now a light shines through the cracks.", + "CentCom once more twists knowledge beyond its authority.", + "There is an uncertain air in the mansus.", + ) + say_lines = text || default_lines + + RegisterSignal(COMSIG_GLOB_VAR_EDIT, .proc/var_edit_react) + +/datum/component/edit_complainer/proc/var_edit_react(list/arguments) + var/atom/movable/master = parent + master.say(pick(say_lines)) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 0d993da41b..eec6c00834 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -510,3 +510,13 @@ attack_verb = list("blorbled", "slimed", "absorbed") squeak_override = list('sound/effects/blobattack.ogg' = 1) gender = FEMALE //given all the jokes and drawings, I'm not sure the xenobiologists would make a slimeboy + +/obj/item/toy/plush/awakenedplushie + name = "awakened plushie" + desc = "An ancient plushie that has grown enlightened to the true nature of reality." + icon_state = "plushie_awake" + item_state = "plushie_awake" + +/obj/item/toy/plush/awakenedplushie/ComponentInitialize() + . = ..() + AddComponent(/datum/component/edit_complainer) diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 0c41ae8fd2..405595d1de 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -629,6 +629,7 @@ GLOBAL_PROTECT(VVpixelmovement) if (O.vv_edit_var(variable, var_new) == FALSE) to_chat(src, "Your edit was rejected by the object.") return + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_VAR_EDIT, args) log_world("### VarEdit by [key_name(src)]: [O.type] [variable]=[var_value] => [var_new]") log_admin("[key_name(src)] modified [original_name]'s [variable] from [html_encode("[var_value]")] to [html_encode("[var_new]")]") var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] from [var_value] to [var_new]" diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm index a0d84c55dd..6129c5fd2b 100644 --- a/code/modules/mapping/space_management/zlevel_manager.dm +++ b/code/modules/mapping/space_management/zlevel_manager.dm @@ -17,6 +17,7 @@ z_list += S /datum/controller/subsystem/mapping/proc/add_new_zlevel(name, traits = list(), z_type = /datum/space_level) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, args) var/new_z = z_list.len + 1 if (world.maxz < new_z) world.incrementMaxZ() diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi index f0eb8175497e73f02a005bfd6b4ac1994a187c73..0bf89ab744679d93ab85072431ed9bc2f16a92a0 100644 GIT binary patch literal 5691 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 literal 5362 zcmX9?cRX9)`;S$rO>4HL_FhHRh*fH}q4*dLV((3Dv9}h9z11#iR;Urw9<^$3YE*=Z zRr{O%et$gYx#!+{-skQd$@5U!{-G~Rru=} zdMR6bT6);KdD*+V006!@sXtI8-6B-|M^b)qMa#Xxj&v1j(Py;3EPilh^m(ZB{XL-| zlC)nsAZF<>CNDcK!4&>}C-p$}oUCB2d0yklgUd+UZBEmCko>tIJJ)MM626zxl&KH< z+zE+fcn=cT1kOr!azk_JHv{0Pv7dU0G4jHwTj&>_)rQ(k~wXh9MXzIEXmxYrT1j zB8-K2REDV{6ian-viY?ui<%z3H7iDL&VBUhRPulF|W9TD| zW;Idx&nT;A>Rt}6WR?qepgI_i$T?n-e|~7=GnR({$&1vD`fR`UUiCR&2CW_*%N{n2 z9pv$BZEYo3o~$uo9>fqv&&Y97R0nAgLhhtlT^hB_IIJiRsH@!{J#2y5VRSc+PAT!+ z%woK5F0;a0Q_ZeEswDW~0Tvu3;|Cjjc;SIQ?nEN5+h8Vf~F&$l6gNjcRt+jyC#N~t}8D+4Oh>sE1*MY3( z;eXDii`w-$ZYA>nYCI9>>-^WHYWf6t?H z`s6U~&KqK)=$25JdKdxO*^b0{8Hqwwp1VCkwwVd3sJhdpU}5ey_yODCS}B zST5?@T`IYQ|7VY#<&gl?C3|O-@Tb&9XNN`KCm<`Rpsme#VnZt8L8xBW=ly8r%-;j2 z1Xpnq=(1nsq1R1OOxuFZ@dhkXWy~&JCht%jEP5MThJ_y`vTD<#vSR2h;j(6a+r}XzA2id{Yz2a8#9*mG52SSnH{86YVSPVkRE0jU5ixy0G^J@GH7cJ!#th9RA#Lslb~3cL*Wob z6tK9aOKVnwrJK|xKOBY%zfU3GuC)HhUG4zf9LZD@?}MeDB$aD%O;&4d&##2?RM5A9 zx8DYf9Biz;`kjsNx*b(!ye-S&y|j0nH~u&=b!+(UF9s{ z7sJDJsePU1kb;!ju}dL*5!bt@GLci~nDR6B;{aYITy1{P&WuZI&K4I=PMR^@r2b`dlT!s~7Z}6Ggj>O6OCPvBI zd>M-kNF{N&T-&`@8QH*K42rfKDLWIxOqFxpUYf|bo?bY*UTD3oCs_5be0bd@?b!y@ z4VpBu)~#d)+ZnFhgdjuH8d;nO2;4!pnBEu{#ezEu5W;^?Cf`q92ENXu%>PU4pF+2x z{*;!U1U$OHB2Z)S`JVq@%R337W9xBC72hYd^l0fFL^8P~VJ1-~sjI&pcO%@^{kYe} z*j&n0!7S9JSU`>PnDDay+W75s{y>hju+P@%TPQ*yy(St~NTv16^c(TYAnJ`8wJMW5 zKAs+SblrMxf&GD^>sNp3QiT1Skmai{S)a3>a&Pxl?vP<@u&Npcs@+;MrPvw8=5=?n z?LeBYi+oImD2UU|D;{B9Wf?ns<*rN#E;?#8oXB8k%6R{n*kY+%~OWpjzam)umT~CI;h$9Xr?iQRL(eaGLP!6xqRm?y^k@nN)jiroM{^zBH z05VopCAhFAT4FM-uPfON?ZtI{Geg z7(#37`e>9^Qds!M5g@-ap+T`>CVs-RzD9t>AUs2M zma)>^C|!^&3tXoLV@!x%3V~d0>BKvRmQg z)=y}F`fXFXMyj@R@>2$*bD3PGF8KZ{ zWVWST{!AIY;+dkI=&MKO_q7`v6dF9#Pbm7u>qdi(Oqgj{Ep!RJNKx0jRdM?U#zuT&w` zPto6)@$KXW%-tU-M^K1cJ-+Mh*n?g?OjR~Ee6cH}Ejpkl_oF3oq?3{+#cC(`6 z)A@O&MWVBz_C|er;akAH-3*#c;Q!lIWhk5bDVJy?GvE5Sopu@!=&B+yb}g_t&N4Wd zQ6~z@#o-WN!(LvkG&KRV?7Uj%7iVnj0y+=5`?oAC{rv^Nsw#2s)fXkHGJ#D*%jS6h% zoLmQFrL=MDgnr~r^`5c#6k=0f14IX|%jPAVD@lOls@kFS2t4-iSvs-csfQtz> zXSXnO6Zk6T_dPvfppRUPFU{?7tcx7aD8X9zr0i|rCz;7YaW(W$2-1j<5j-Ml@?{vt zkKJmf4hZEvBN#cV(fihxyWn3V*~S`9LN$w22|QW(My;h6M@7QYjs*9dI@jHloIcn+ zs()58fhjF-&}FAxTb?TWnox!_40nMiUKb}VWAD`}WvXA=`9~QhCen}6Nj9Y-`x<@- zf!!70x78QL2Bei*(EYRNhve%00;BfpfQ}2WzL2C`^zlRhx(B4G>t`L^UN&)(8PB10 zE4cT#sgXtCUC+hByVK^cU$4z3*s8T$%2uKIZ&kwl@6-t>m-Ae<{~9>V=bePPac>sj zI|Uxau&K=9vSRZ2?z){jdH-0+@fA{|u|)w6HQL-hcTIJ>HkMY6ceHzSQj00kQGuh5 zdUtho8)(NeL5qLrfjsI<0=wToM!($x9UQ;_`&4+=C#>#;bI!Dm?zC zqeqMPK)#RU*CwJ3+{+uohnOT2Z~HlMv3ksh`FC^O`C5S;wR?fjI+$)r2a@-QbKug> zXEbuQU6C{Fdyskx=?MlEOR7=7;|>zoLxAIF)LG(rS2O6mpu;*59KSQ2=gGL*oobh! zj8#+d(`ni6H43ENTt5`R11rtD(s^!qh?SJR!{1ZHv5Fv5ER-68n&=002q%CVQW5$TH2-QTGwuP z!!TG}{i?wBDRP>)NQrjy6%$0OF|&Eo+Ir}6x>7=`w%#V_s^fb!?M+8lA7$jfV}Hcj zX&e-h1s~dzx(lNUyZaK5s%~IQyo_tvYU?g&h}9u&N#Y8Gn{TYSLUxlPBXIQZlxk3j z!^P#P8PL{AW_&iX%0am<>=O^`Z1umC$=rliEX^R*?yJaU5SGhs+T6AaZLgv~VG~a2 z;jFtIt<#dK#apXBJ~TL|Q2HN9OwLV8Ctd_T7UtKj@;D8OrsTiON@}@f|2~XkO3-nF zwI1%lrL9U@ImVcD|85E=wb~H*z+2P{Y;dd6yWnOKVC_*adtBqBS)G6H#_yCo2XmZi zyY(je=ad?hiMbszEVnMSV9O%t#l+6tcH)1{bz-+_yJudT35kik7gW9BMlyL2R+zl` zi+$Mz#KY532K$n(g^^(?p>#U*=@ro;_fPjQMH>b7NVpocJFmr}W(f&*v_AM%F!$^3 zA&*f6Z@IZ@6w}R(`HgpBUwu6H!6IyGAlgti&4b1eUo6`6Z5HGD;rGz@HXdzNuj}f~ z0GYIrOu};+$$6Gl)Tsdatzia#>a-qH!b;~blayYIKoGchEfS#}vp_(`2B3#(&lXX4 z30VQ*^AoewqJEa^p9VFA($e{%xZXtCY@f)LrP4Cbpy>{JoPc5x8Df~C+_?pr8Hc>> zYX%f0xZ}NI{J++D+*Bjp+WVagihJ6JgR2dIJ;SZuXMg^;IGL z*-cj()g~(snHo0Hig{vz3+ZFe0y;3fV~3=MxZ^n~!SmBIRhPSsLMApObBqdts{ZV2 z!5nzils!8k6{z~h`|AhLAi-h0bu&yiGDHEZNV`L1YIfC&amr~)mzlX!GoCvq-kQ(9 z*0b6+lxKE@04@+#V>w1l<49Xr%Vqj?42<^(4XDg;jl?)n+6|8kuF(tcH~!*G$gkEL zJk&a2yyUn5C;=aG*5_A}5nrAA07G1Dg5neOh|{w`ud~D%4K#%PNM$Tw`{{?iMr{mT zu+{St1t2Z*=M*=UsrsjpsUO6mgZso%PQ%G5U(i5#s=9v|kdKl|1_2cy z$fN2^1JfI!dQ?$S?p^~zS)koqX3^-;CukfX6tzuD!U|eb3oNuz@2XlA_%RBU$KIES zU2M?VZIioJj^cm<3k9JLXH@)Ja~|fJU*3tcgRtsy?5;L>PXA=B~3Zu+lR$xwUPdI#hzvx4I4-3yNV95*A4x~t6(P zbdKRCOx-D)qg{)X6m?=*=&uy3dPGC>JBmD2vU1(ic^V!nG;^-%B*86GwrM4kI`(Go4e z58meEweT3gfHY*`X zjFM>CI9Z-7Ob{&QHs6`b)T2CMEUuDk2Ocz*EhgI|j<1+Con(d2^nDkms z1zaSzaCxDIR^Q1(_jw)19XK#rXtgow0GnZAlmwl{@AuxM3P;Vf`UemQbW|egwKs#k z1NokqGqZCcIjjdaY>Z<*(82ZPxpZ6@Z}Sns7$@>QB6wiz$JP1PC-*ncBf`4{0Of20 zUb;$JZOq;(48eSCz)K2Lp&8A3cJJK-wLR&8b6B|fb)FmWnC> zqN>E`f*OX)`tW6@q#j>j99}o4N#YTe_z(lVS<2B}=!ql=T9D2H_Y)JKt^!v6qGT5K EKfCB~!vFvP diff --git a/tgstation.dme b/tgstation.dme index 39ecf1a066..115fe25b8d 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -209,6 +209,7 @@ #include "code\controllers\subsystem\blackbox.dm" #include "code\controllers\subsystem\communications.dm" #include "code\controllers\subsystem\dbcore.dm" +#include "code\controllers\subsystem\dcs.dm" #include "code\controllers\subsystem\disease.dm" #include "code\controllers\subsystem\events.dm" #include "code\controllers\subsystem\fire_burning.dm" @@ -328,6 +329,7 @@ #include "code\datums\components\decal.dm" #include "code\datums\components\earhealing.dm" #include "code\datums\components\earprotection.dm" +#include "code\datums\components\edit_complainer.dm" #include "code\datums\components\empprotection.dm" #include "code\datums\components\forensics.dm" #include "code\datums\components\infective.dm" From fcfdf968d19d205049e6e9fb098703727c3d99a4 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 20 Jun 2018 03:18:23 -0400 Subject: [PATCH 028/204] Adds /datum/DBQuery/proc/SetQuery (#38584) * Adds /datum/DBQuery/proc/SetQuery * Needful newness --- code/controllers/subsystem/dbcore.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 0e1f1fb8fd..50eeaf087c 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -242,6 +242,11 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table if(!.) to_chat(usr, "A SQL error occurred during this operation, check the server logs.") +/datum/DBQuery/proc/SetQuery(new_sql) + Activity("SetQuery") + Close() + sql = new_sql + /datum/DBQuery/proc/Execute(sql_query = sql, cursor_handler = default_cursor, log_error = TRUE) var/start_time var/timeout = CONFIG_GET(number/query_debug_log_timeout) From 2fefc185d34c2069215bcab7277e8bbb61ac8bf6 Mon Sep 17 00:00:00 2001 From: Grandmother of 50 <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com> Date: Wed, 20 Jun 2018 03:43:10 -0400 Subject: [PATCH 030/204] Equalizes Roundstart Mining Options (Removes some Advanced Scanners and Explorer Webbings) (#38153) --- code/modules/mining/machine_vending.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index e13a8e5c39..03a93a6a52 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -171,8 +171,6 @@ if("Survival Capsule and Explorer's Webbing") new /obj/item/storage/belt/mining/vendor(drop_location) if("Resonator Kit") - new /obj/item/storage/belt/mining/alt(drop_location) - new /obj/item/t_scanner/adv_mining_scanner(drop_location) new /obj/item/extinguisher/mini(drop_location) new /obj/item/resonator(drop_location) if("Minebot Kit") @@ -185,8 +183,6 @@ new /obj/item/fulton_core(drop_location) new /obj/item/stack/marker_beacon/thirty(drop_location) if("Crusher Kit") - new /obj/item/storage/belt/mining/alt(drop_location) - new /obj/item/t_scanner/adv_mining_scanner(drop_location) new /obj/item/extinguisher/mini(drop_location) new /obj/item/twohanded/required/kinetic_crusher(drop_location) if("Mining Conscription Kit") From 05995f577407cce9fa9f9116595a43185ebae35b Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 20 Jun 2018 10:24:04 -0400 Subject: [PATCH 032/204] Merge pull request #38605 from vuonojenmustaturska/tinylight Micro-optimization to update_corners() --- code/modules/lighting/lighting_source.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index a6c28b4146..59ce11baeb 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -56,10 +56,10 @@ if (top_atom) LAZYREMOVE(top_atom.light_sources, src) - + if (needs_update) GLOB.lighting_update_lights -= src - + . = ..() // Yes this doesn't align correctly on anything other than 4 width tabs. @@ -116,7 +116,6 @@ . = LUM_FALLOFF(C, pixel_turf); \ . *= light_power; \ var/OLD = effect_str[C]; \ - \ effect_str[C] = .; \ \ C.update_lumcount \ @@ -126,7 +125,6 @@ (. * lum_b) - (OLD * applied_lum_b) \ ); - #define REMOVE_CORNER(C) \ . = -effect_str[C]; \ C.update_lumcount \ @@ -167,8 +165,9 @@ /datum/light_source/proc/update_corners() var/update = FALSE + var/atom/source_atom = src.source_atom - if (!source_atom || QDELETED(source_atom)) + if (QDELETED(source_atom)) qdel(src) return From aee94ac728e0bd06df8e6df60192e748771310df Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 20 Jun 2018 20:05:32 -0400 Subject: [PATCH 034/204] Trims down apt dependencies (#38619) * :thinking: * More --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0eccf6708e..56fa54f58d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,6 @@ matrix: addons: apt: packages: - - libc6-i386 - libstdc++6:i386 cache: directories: @@ -39,7 +38,6 @@ matrix: mariadb: '10.2' apt: packages: - - libc6-i386 - libstdc++6:i386 - libssl-dev:i386 - gcc-multilib From 25ba25d997d5d988b41860c9e00a21e10b119312 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 20 Jun 2018 19:23:02 -0500 Subject: [PATCH 036/204] [MIRROR] [s]Fixed being able to create nearly infinite amount of materials from autolathes (#7199) * [s]Fixed being able to create nearly infinite amount of materials from autolathes (#38624) * clamper-oni * Update autolathe.dm * Update autolathe.dm * [s]Fixed being able to create nearly infinite amount of materials from autolathes --- code/game/machinery/autolathe.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 2a753fc333..9a13bde3ff 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -154,6 +154,7 @@ var/multiplier = text2num(href_list["multiplier"]) var/is_stack = ispath(being_built.build_path, /obj/item/stack) + multiplier = CLAMP(multiplier,1,50) ///////////////// From 7cb838b4cf94283cff24e5eb52197e1b85ba15f8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 20 Jun 2018 19:23:04 -0500 Subject: [PATCH 037/204] Automatic changelog generation for PR #7199 [ci skip] --- html/changelogs/AutoChangeLog-pr-7199.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7199.yml diff --git a/html/changelogs/AutoChangeLog-pr-7199.yml b/html/changelogs/AutoChangeLog-pr-7199.yml new file mode 100644 index 0000000000..d7dbe7c589 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7199.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "added a clamp so you can't set a negative multiplier to create materials and create more than 50 items." From 5e156e7a07090784bd4441f018f06f81b6d6df3b Mon Sep 17 00:00:00 2001 From: AnturK Date: Thu, 21 Jun 2018 02:38:51 +0200 Subject: [PATCH 038/204] Fixes AI's being unable to call shuttle using comm console. (#38534) * Fixes AI's being unable to call shuttle using comm console. * Lets get rid of double negatives * viewvers for --- .../game/machinery/computer/communications.dm | 5 ++-- code/game/objects/objs.dm | 23 +++++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 445ed389b7..d1e3de1248 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -45,8 +45,9 @@ /obj/machinery/computer/communications/process() if(..()) - if(state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE && state != STATE_PURCHASE && state != STATE_VIEWMESSAGE) - updateDialog() + var/ai_autoupdate = aistate != STATE_STATUSDISPLAY && aistate != STATE_CALLSHUTTLE && aistate != STATE_PURCHASE && aistate != STATE_VIEWMESSAGE + var/machine_user_autoupdate = state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE && state != STATE_PURCHASE && state != STATE_VIEWMESSAGE + updateDialog(machine_user_autoupdate,ai_autoupdate) /obj/machinery/computer/communications/Topic(href, href_list) if(..()) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 02e1cc9bd0..664cdbf383 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -138,19 +138,22 @@ else obj_flags &= ~IN_USE -/obj/proc/updateDialog() +/obj/proc/updateDialog(update_viewers = TRUE,update_ais = TRUE) // Check that people are actually using the machine. If not, don't update anymore. if(obj_flags & IN_USE) - var/list/nearby = viewers(1, src) - var/is_in_use = 0 - for(var/mob/M in nearby) - if ((M.client && M.machine == src)) - is_in_use = 1 - src.interact(M) - var/ai_in_use = AutoUpdateAI(src) + var/is_in_use = FALSE + if(update_viewers) + for(var/mob/M in viewers(1, src)) + if ((M.client && M.machine == src)) + is_in_use = TRUE + src.interact(M) + var/ai_in_use = FALSE + if(update_ais) + ai_in_use = AutoUpdateAI(src) - if(!ai_in_use && !is_in_use) - obj_flags &= ~IN_USE + if(update_viewers && update_ais) //State change is sure only if we check both + if(!ai_in_use && !is_in_use) + obj_flags &= ~IN_USE /obj/attack_ghost(mob/user) From 3d1faff99b5a8159ca605dcdc2d83bd31f219b76 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 21 Jun 2018 00:39:29 -0500 Subject: [PATCH 040/204] [MIRROR] Adds desc to IV drips (#7205) * Merge pull request #38608 from 81Denton/iv-drip-desc Adds desc to IV drips * Adds desc to IV drips --- code/game/machinery/iv_drip.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 409e64ca7e..2f8bf41a0b 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -3,6 +3,7 @@ /obj/machinery/iv_drip name = "\improper IV drip" + desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate." icon = 'icons/obj/iv_drip.dmi' icon_state = "iv_drip" anchored = FALSE From f393d684996d80ee39fbda0005890add9941f9b5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 21 Jun 2018 00:40:54 -0500 Subject: [PATCH 041/204] [MIRROR] fixes anomaly cores being flamable (#7207) * fixes anomaly cores being flamable (#38607) * oranges-is-gay * swap * fixes anomaly cores being flamable --- code/modules/assembly/signaler.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 42188bba9f..0a1394bf04 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -186,6 +186,7 @@ Code: item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + resistance_flags = FIRE_PROOF var/anomaly_type = /obj/effect/anomaly /obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal) From d0f68daa21e0dd430b3551ec4d737ef7033d0773 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 21 Jun 2018 00:40:56 -0500 Subject: [PATCH 042/204] Automatic changelog generation for PR #7207 [ci skip] --- html/changelogs/AutoChangeLog-pr-7207.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7207.yml diff --git a/html/changelogs/AutoChangeLog-pr-7207.yml b/html/changelogs/AutoChangeLog-pr-7207.yml new file mode 100644 index 0000000000..ebdd247f5c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7207.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "anomaly cores no longer tend to dust" From a6cfd22b791ed3178e1ccd1132c790639cfa2b24 Mon Sep 17 00:00:00 2001 From: YPOQ <30683121+YPOQ@users.noreply.github.com> Date: Thu, 21 Jun 2018 15:30:13 -0600 Subject: [PATCH 043/204] Fixes gulag stacker not giving points after RPG loot event (#38570) * Fixes gulag stacker not giving points after RPG loot event * Moves point values to type vars * cleanup --- code/game/objects/items/stacks/bscrystal.dm | 1 + .../game/objects/items/stacks/sheets/glass.dm | 3 ++ .../objects/items/stacks/sheets/mineral.dm | 8 +++++ .../items/stacks/sheets/sheet_types.dm | 2 ++ .../objects/items/stacks/sheets/sheets.dm | 3 +- code/modules/mining/laborcamp/laborstacker.dm | 31 ++++++++++--------- code/modules/mining/machine_stacking.dm | 2 +- 7 files changed, 34 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 936accce39..4da0fd8a44 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -67,6 +67,7 @@ attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed") novariants = TRUE grind_results = list("bluespace" = 20) + point_value = 30 var/crystal_type = /obj/item/stack/ore/bluespace_crystal/refined /obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 3264deae88..996576d8e5 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/glass grind_results = list("silicon" = 20) + point_value = 1 /obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins to slice [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -138,6 +139,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass grind_results = list("silicon" = 20, "iron" = 10) + point_value = 4 /obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params) add_fingerprint(user) @@ -180,6 +182,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmarglass grind_results = list("silicon" = 20, "plasma" = 10, "iron" = 10) + point_value = 23 /obj/item/stack/sheet/plasmarglass/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.prglass_recipes diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 300f18cbeb..87d1985b18 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -104,6 +104,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ materials = list(MAT_DIAMOND=MINERAL_MATERIAL_AMOUNT) novariants = TRUE grind_results = list("carbon" = 20) + point_value = 25 GLOBAL_LIST_INIT(diamond_recipes, list ( \ new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \ @@ -129,6 +130,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ materials = list(MAT_URANIUM=MINERAL_MATERIAL_AMOUNT) novariants = TRUE grind_results = list("uranium" = 20) + point_value = 20 GLOBAL_LIST_INIT(uranium_recipes, list ( \ new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \ @@ -154,6 +156,7 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ max_integrity = 100 materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT) grind_results = list("plasma" = 20) + point_value = 20 /obj/item/stack/sheet/mineral/plasma/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins licking \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -193,6 +196,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ sheettype = "gold" materials = list(MAT_GOLD=MINERAL_MATERIAL_AMOUNT) grind_results = list("gold" = 20) + point_value = 20 GLOBAL_LIST_INIT(gold_recipes, list ( \ new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \ @@ -220,6 +224,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ sheettype = "silver" materials = list(MAT_SILVER=MINERAL_MATERIAL_AMOUNT) grind_results = list("silver" = 20) + point_value = 20 GLOBAL_LIST_INIT(silver_recipes, list ( \ new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \ @@ -247,6 +252,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ materials = list(MAT_BANANIUM=MINERAL_MATERIAL_AMOUNT) novariants = TRUE grind_results = list("banana" = 20) + point_value = 50 GLOBAL_LIST_INIT(bananium_recipes, list ( \ new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \ @@ -272,6 +278,7 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \ throw_range = 3 sheettype = "titanium" materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT) + point_value = 20 GLOBAL_LIST_INIT(titanium_recipes, list ( \ new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), \ @@ -300,6 +307,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ throw_range = 3 sheettype = "plastitanium" materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT) + point_value = 45 GLOBAL_LIST_INIT(plastitanium_recipes, list ( \ new/datum/stack_recipe("plas-titanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 52fdf558ee..014e4738b0 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -106,6 +106,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/metal grind_results = list("iron" = 20) + point_value = 2 /obj/item/stack/sheet/metal/ratvar_act() new /obj/item/stack/tile/brass(loc, amount) @@ -166,6 +167,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/plasteel grind_results = list("iron" = 20, "plasma" = 20) + point_value = 23 /obj/item/stack/sheet/plasteel/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.plasteel_recipes diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 315cc94b66..21b43eba20 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -11,4 +11,5 @@ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") novariants = FALSE var/perunit = MINERAL_MATERIAL_AMOUNT - var/sheettype = null //this is used for girders in the creation of walls/false walls \ No newline at end of file + var/sheettype = null //this is used for girders in the creation of walls/false walls + var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity. \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index a8d94e9ce4..765f9d92e0 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST(labor_sheet_values) + /**********************Prisoners' Console**************************/ /obj/machinery/mineral/labor_claim_console @@ -20,6 +22,18 @@ Radio.listening = FALSE locate_stacking_machine() + if(!GLOB.labor_sheet_values) + var/sheet_list = list() + for(var/sheet_type in subtypesof(/obj/item/stack/sheet)) + var/obj/item/stack/sheet/sheet = sheet_type + if(!initial(sheet.point_value) || (initial(sheet.merge_type) && initial(sheet.merge_type) != sheet_type)) //ignore no-value sheets and x/fifty subtypes + continue + sheet_list += list(list("ore" = initial(sheet.name), "value" = initial(sheet.point_value))) + GLOB.labor_sheet_values = sortList(sheet_list, /proc/cmp_sheet_list) + +/proc/cmp_sheet_list(list/a, list/b) + return a["value"] - b["value"] + /obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id/prisoner)) if(!inserted_id) @@ -52,16 +66,10 @@ if(check_auth()) can_go_home = TRUE - var/list/ores = list() if(stacking_machine) data["unclaimed_points"] = stacking_machine.points - for(var/ore in stacking_machine.ore_values) - var/list/O = list() - O["ore"] = ore - O["value"] = stacking_machine.ore_values[ore] - ores += list(O) - data["ores"] = ores + data["ores"] = GLOB.labor_sheet_values data["can_go_home"] = can_go_home return data @@ -127,15 +135,10 @@ /obj/machinery/mineral/stacking_machine/laborstacker - var/points = 0 //The unclaimed value of ore stacked. Value for each ore loosely relative to its rarity. - var/list/ore_values = list("glass" = 1, "metal" = 2, "reinforced glass" = 4, "gold" = 20, "silver" = 20, "uranium" = 20, "titanium" = 20, "solid plasma" = 20, "plasteel" = 23, "plasma glass" = 23, "diamond" = 25, "bluespace polycrystal" = 30, "plastitanium" = 45, "bananium" = 50) + var/points = 0 //The unclaimed value of ore stacked. /obj/machinery/mineral/stacking_machine/laborstacker/process_sheet(obj/item/stack/sheet/inp) - if(istype(inp)) - var/n = inp.name - var/a = inp.amount - if(n in ore_values) - points += ore_values[n] * a + points += inp.point_value * inp.amount ..() diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index f0a06429c5..dcc9034e2d 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -105,8 +105,8 @@ stack_list[inp.type] = s var/obj/item/stack/sheet/storage = stack_list[inp.type] storage.amount += inp.amount //Stack the sheets - qdel(inp) //Let the old sheet garbage collect while(storage.amount > stack_amt) //Get rid of excessive stackage var/obj/item/stack/sheet/out = new inp.type(null, stack_amt) unload_mineral(out) storage.amount -= stack_amt + qdel(inp) //Let the old sheet garbage collect From 16bd86e4cb2fa5ae65082033fa1d18efbcbd5110 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 21 Jun 2018 17:54:21 -0400 Subject: [PATCH 045/204] Merge pull request #38633 from ExcessiveUseOfCobblestone/patch-46 potency gene disks now clarify what the % means on examine --- code/modules/hydroponics/gene_modder.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index e9ffb9e450..7e541f2471 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -427,7 +427,7 @@ /obj/item/disk/plantgene/proc/update_name() if(gene) - name = "[gene.get_name()] (Plant Data Disk)" + name = "[gene.get_name()] (plant data disk)" else name = "plant data disk" @@ -437,4 +437,6 @@ /obj/item/disk/plantgene/examine(mob/user) ..() + if(gene && (istype(gene, /datum/plant_gene/core/potency))) + to_chat(user,"Percent is relative to potency, not maximum volume of the plant.") to_chat(user, "The write-protect tab is set to [src.read_only ? "protected" : "unprotected"].") From 4e89973d0b0f4254be7f4ba740c6da0f056a3c3b Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 21 Jun 2018 19:18:41 -0400 Subject: [PATCH 047/204] Merge pull request #38637 from DaxDupont/create-antag Makes create antags check for on station. --- code/modules/admin/verbs/one_click_antag.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 410e976b85..daa1ce473a 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -57,7 +57,7 @@ var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in GLOB.player_list) - if(isReadytoRumble(applicant, ROLE_TRAITOR, FALSE)) + if(isReadytoRumble(applicant, ROLE_TRAITOR)) if(temp.age_check(applicant.client)) if(!(applicant.job in temp.restricted_jobs)) candidates += applicant From 561c2179f8279c8f9a220131e66b240a0f1727e0 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 21 Jun 2018 16:38:29 -0700 Subject: [PATCH 049/204] Fixes and adds blast cannons to traitor science uplink items (#38093) rscadd: Blast cannons have been fixed and are now available for purchase by traitorous scientists for a low low price of 14TC. rscadd: Blast cannons take the explosive power of a TTV bomb and ejects a linear projectile that will apply what the bomb would do to a certain tile at that distance to that tile. However, this will not cause breaches, or gib mobs, unless the gods (admins) so will it. experimental: Blast cannons do not respect maxcap. (Unless the admins so will it.) --- .../objects/items/devices/transfer_valve.dm | 17 ++++-- code/game/objects/items/tanks/tanks.dm | 1 - .../projectiles/guns/misc/blastcannon.dm | 52 +++++++++++++++---- code/modules/uplink/uplink_items.dm | 10 ++++ 4 files changed, 66 insertions(+), 14 deletions(-) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 0ef20dea19..fca7f9bc6d 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -160,11 +160,22 @@ if(sensor.on && sensor.visible) add_overlay("proxy_beam") -/obj/item/transfer_valve/proc/merge_gases() - tank_two.air_contents.volume += tank_one.air_contents.volume +/obj/item/transfer_valve/proc/merge_gases(datum/gas_mixture/target, change_volume = TRUE) + var/target_self = FALSE + if(!target || (target == tank_one.air_contents)) + target = tank_two.air_contents + if(target == tank_two.air_contents) + target_self = TRUE + if(change_volume) + if(!target_self) + target.volume += tank_two.volume + target.volume += tank_one.air_contents.volume var/datum/gas_mixture/temp temp = tank_one.air_contents.remove_ratio(1) - tank_two.air_contents.merge(temp) + target.merge(temp) + if(!target_self) + temp = tank_two.air_contents.remove_ratio(1) + target.merge(temp) /obj/item/transfer_valve/proc/split_gases() if (!valve_open || !tank_one || !tank_two) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 447a83422b..74aea29768 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -226,7 +226,6 @@ air_contents.react() check_status() - /obj/item/tank/proc/check_status() //Handle exploding, leaking, and rupturing of the tank diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index e7b628653f..df1f9fdfbd 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -11,8 +11,21 @@ clumsy_check = FALSE randomspread = FALSE + var/hugbox = TRUE + var/max_power = INFINITY + var/reaction_volume_mod = 0 + var/reaction_cycles = 3 //How many times gases react() before calculation. Very finnicky value, do not mess with without good reason. + var/prereaction = TRUE + + var/bombcheck = TRUE + var/debug_power = 0 + var/obj/item/transfer_valve/bomb +/obj/item/gun/blastcannon/debug + debug_power = 80 + bombcheck = FALSE + /obj/item/gun/blastcannon/Initialize() . = ..() if(!pin) @@ -56,27 +69,33 @@ return TRUE return ..() +//returns the third value of a bomb blast /obj/item/gun/blastcannon/proc/calculate_bomb() if(!istype(bomb) || !istype(bomb.tank_one) || !istype(bomb.tank_two)) return 0 - var/datum/gas_mixture/temp = new(60) //directional buff. - temp.merge(bomb.tank_one.air_contents.remove_ratio(1)) - temp.merge(bomb.tank_two.air_contents.remove_ratio(2)) - for(var/i in 1 to 6) + var/datum/gas_mixture/temp = new(max(reaction_volume_mod, 0)) + bomb.merge_gases(temp) + if(prereaction) + temp.react(src) + var/prereaction_pressure = temp.return_pressure() + if(prereaction_pressure < TANK_FRAGMENT_PRESSURE) + return 0 + for(var/i in 1 to reaction_cycles) temp.react(src) var/pressure = temp.return_pressure() qdel(temp) if(pressure < TANK_FRAGMENT_PRESSURE) return 0 - return (pressure / TANK_FRAGMENT_SCALE) + return ((pressure - TANK_FRAGMENT_PRESSURE) / TANK_FRAGMENT_SCALE) /obj/item/gun/blastcannon/afterattack(atom/target, mob/user, flag, params) - if((!bomb) || (!target) || (get_dist(get_turf(target), get_turf(user)) <= 2)) + if((!bomb && bombcheck) || (!target) || (get_dist(get_turf(target), get_turf(user)) <= 2)) return ..() - var/power = calculate_bomb() + var/power = bomb? calculate_bomb() : debug_power + power = min(power, max_power) QDEL_NULL(bomb) update_icon() - var/heavy = power * 0.2 + var/heavy = power * 0.25 var/medium = power * 0.5 var/light = power user.visible_message("[user] opens [bomb] on [user.p_their()] [name] and fires a blast wave at [target]!","You open [bomb] on your [name] and fire a blast wave at [target]!") @@ -87,7 +106,8 @@ message_admins(log_str) log_game(log_str) var/obj/item/projectile/blastwave/BW = new(loc, heavy, medium, light) - BW.preparePixelProjectile(target, get_turf(target), user, params, 0) + BW.hugbox = hugbox + BW.preparePixelProjectile(target, get_turf(src), params, 0) BW.fire() /obj/item/projectile/blastwave @@ -99,6 +119,7 @@ var/heavyr = 0 var/mediumr = 0 var/lightr = 0 + var/hugbox = TRUE range = 150 /obj/item/projectile/blastwave/Initialize(mapload, _h, _m, _l) @@ -110,14 +131,25 @@ /obj/item/projectile/blastwave/Range() ..() var/amount_destruction = EXPLODE_NONE + var/wallbreak_chance = 0 if(heavyr) amount_destruction = EXPLODE_DEVASTATE + wallbreak_chance = 99 else if(mediumr) amount_destruction = EXPLODE_HEAVY + wallbreak_chance = 66 else if(lightr) amount_destruction = EXPLODE_LIGHT + wallbreak_chance = 33 if(amount_destruction) - loc.ex_act(amount_destruction) + if(hugbox) + loc.contents_explosion(EXPLODE_HEAVY, loc) + if(istype(loc, /turf/closed/wall)) + var/turf/closed/wall/W = loc + if(prob(wallbreak_chance)) + W.dismantle_wall(TRUE, TRUE) + else + loc.ex_act(amount_destruction) else qdel(src) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 89197a7f07..619e2c8193 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1412,6 +1412,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) limited_stock = 2 //you can't use more than two! restricted_roles = list("Shaft Miner") +/datum/uplink_item/role_restricted/blastcannon + name = "Blast Cannon" + desc = "A highly specialized weapon, the Blast Cannon is actually relatively simple. It contains an attachment for a tank transfer valve mounted to an angled pipe specially constructed \ + withstand extreme pressure and temperatures, and has a mechanical trigger for triggering the transfer valve. Essentially, it turns the explosive force of a bomb into a narrow-angle \ + blast wave \"projectile\". Aspiring scientists may find this highly useful, as forcing the pressure shockwave into a narrow angle seems to be able to bypass whatever quirk of physics \ + disallows explosive ranges above a certain distance, allowing for the device to use the theoretical yield of a transfer valve bomb, instead of the factual yield." + item = /obj/item/gun/blastcannon + cost = 14 //High cost because of the potential for extreme damage in the hands of a skilled scientist. + restricted_roles = list("Research Director", "Scientist") + /datum/uplink_item/device_tools/clown_bomb name = "Clown Bomb" desc = "The Clown bomb is a hilarious device capable of massive pranks. It has an adjustable timer, \ From 01eb1bc7fef7531aff386956af7c920bb68e5635 Mon Sep 17 00:00:00 2001 From: Tlaltecuhtli <33834933+Tlaltecuhtli@users.noreply.github.com> Date: Fri, 22 Jun 2018 01:51:29 +0200 Subject: [PATCH 051/204] [READY] better contraband crates (#38321) feature: NT reports that the local contraband market has expanded, experts say that the Syndicate is involved. --- code/game/objects/items/storage/firstaid.dm | 32 +++++++++++++++++++ code/modules/cargo/packs.dm | 20 +++++++++--- .../reagents/reagent_containers/pill.dm | 26 +++++++++++++-- 3 files changed, 72 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index fe46141614..c338f24d26 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -231,3 +231,35 @@ new /obj/item/reagent_containers/pill/patch/silver_sulf(src) for(var/i in 1 to 3) new /obj/item/reagent_containers/pill/patch/styptic(src) + +/obj/item/storage/pill_bottle/zoom + name = "suspicious pill bottle" + desc = "The label is pretty old and almost unreadable, you recognize some chemical compounds." + +/obj/item/storage/pill_bottle/zoom/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/zoom(src) + +/obj/item/storage/pill_bottle/happy + name = "suspicious pill bottle" + desc = "There is a smiley on the top." + +/obj/item/storage/pill_bottle/happy/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/happy(src) + +/obj/item/storage/pill_bottle/lsd + name = "suspicious pill bottle" + desc = "There is a badly drawn thing with the shape of a mushroom." + +/obj/item/storage/pill_bottle/lsd/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/lsd(src) + +/obj/item/storage/pill_bottle/aranesp + name = "suspicious pill bottle" + desc = "The label says 'gotta go fast'." + +/obj/item/storage/pill_bottle/aranesp/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/aranesp(src) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index e6b4a29502..cffd954b0e 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1746,14 +1746,26 @@ /datum/supply_pack/costumes_toys/randomised/contraband name = "Contraband Crate" - desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, bling, even some ambrosia deus...you know, the good stuff. Just keep it away from the cops, kay?" + desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, dank, even some sponsored items...you know, the good stuff. Just keep it away from the cops, kay?" contraband = TRUE cost = 3000 - num_contained = 5 + num_contained = 7 contains = list(/obj/item/poster/random_contraband, + /obj/item/poster/random_contraband, + /obj/item/reagent_containers/food/snacks/grown/cannabis, + /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow, + /obj/item/reagent_containers/food/snacks/grown/cannabis/white, + /obj/item/storage/pill_bottle/zoom, + /obj/item/storage/pill_bottle/happy, + /obj/item/storage/pill_bottle/lsd, + /obj/item/storage/pill_bottle/aranesp, + /obj/item/storage/pill_bottle/stimulant, + /obj/item/toy/cards/deck/syndicate, + /obj/item/reagent_containers/food/drinks/bottle/absinthe, + /obj/item/clothing/under/syndicate/tacticool, + /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/storage/fancy/cigarettes/cigpack_shadyjims, - /obj/item/storage/fancy/cigarettes/cigpack_midori, - /obj/item/seeds/ambrosia/deus, + /obj/item/clothing/mask/gas/syndicate, /obj/item/clothing/neck/necklace/dope) crate_name = "crate" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index f5d46a240e..d2f840cda3 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -151,10 +151,32 @@ icon_state = "pill18" list_reagents = list("insulin" = 50) roundstart = 1 - +///////////////////////////////////////// this pill is used only in a legion mob drop /obj/item/reagent_containers/pill/shadowtoxin name = "black pill" desc = "I wouldn't eat this if I were you." icon_state = "pill9" color = "#454545" - list_reagents = list("shadowmutationtoxin" = 1) \ No newline at end of file + list_reagents = list("shadowmutationtoxin" = 1) +//////////////////////////////////////// drugs +/obj/item/reagent_containers/pill/zoom + name = "zoom pill" + list_reagents = list("synaptizine" = 10, "nicotine" = 10, "methamphetamine" = 1) + + +/obj/item/reagent_containers/pill/happy + name = "happy pill" + list_reagents = list("sugar" = 10, "space_drugs" = 10) + + +/obj/item/reagent_containers/pill/lsd + name = "hallucinogen pill" + list_reagents = list("mushroomhallucinogen" = 15, "mindbreaker" = 15) + + +/obj/item/reagent_containers/pill/aranesp + name = "speedy pill" + list_reagents = list("aranesp" = 10) + + + From fa06a729a2cb7baeff52f8a8e96d76e331686462 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 21 Jun 2018 18:55:48 -0500 Subject: [PATCH 053/204] Bubblegum is scarier again (#38306) Miners are able to kill him roundstart by just walking backwards while shooting. Weaker than an ash drake. Easiest way to change this was to give him his original attacks back which required you to avoid/manage blood. --- .../hostile/megafauna/bubblegum.dm | 312 +++++------------- 1 file changed, 74 insertions(+), 238 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index e5425573b4..d6746ff1a6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -1,3 +1,5 @@ +#define MEDAL_PREFIX "Bubblegum" + /* BUBBLEGUM @@ -7,15 +9,15 @@ Bubblegum's footsteps are heralded by shaking booms, proving its tremendous size It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage. -It tries to strike at its target through any bloodpools under them; if it fails to do that, it will spray blood and then attempt to warp to a bloodpool near the target. -If it fails to warp to a target, it may summon up to 6 slaughterlings from the blood around it. -If it does not summon all 6 slaughterlings, it will instead charge at its target, dealing massive damage to anything it hits and spraying a stream of blood. -At half health, it will either charge three times or warp, then charge, instead of doing a single charge. +It often charges, dealing massive damage to anything unfortunate enough to be standing where it's aiming. +Whenever it isn't chasing something down, it will sink into nearby blood pools (if possible) and springs out of the closest one to its target. +To make this possible, it sprays streams of blood at random. +From these blood pools Bubblegum may summon slaughterlings - weak, low-damage minions designed to impede the target's progress. -When Bubblegum dies, it leaves behind a H.E.C.K. mining suit as well as a chest that can contain three things: - 1. A bottle that, when activated, drives everyone nearby into a frenzy - 2. A contract that marks for death the chosen target - 3. A spellblade that can slice off limbs at range +When Bubblegum dies, it leaves behind a chest that can contain three things: + 1. A spellblade that can slice off limbs at range + 2. A bottle that, when activated, drives everyone nearby into a frenzy + 3. A contract that marks for death the chosen target Difficulty: Hard @@ -44,8 +46,7 @@ Difficulty: Hard del_on_death = 1 crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher) loot = list(/obj/structure/closet/crate/necropolis/bubblegum) - blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME - var/charging = FALSE + var/charging = 0 medal_type = BOSS_MEDAL_BUBBLEGUM score_type = BUBBLEGUM_SCORE deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... " @@ -57,54 +58,33 @@ Difficulty: Hard desc = "You're not quite sure how a signal can be bloody." invisibility = 100 -/mob/living/simple_animal/hostile/megafauna/bubblegum/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(. > 0 && prob(25)) - var/obj/effect/decal/cleanable/blood/gibs/bubblegum/B = new /obj/effect/decal/cleanable/blood/gibs/bubblegum(loc) - if(prob(40)) - step(B, pick(GLOB.cardinals)) - else - B.setDir(pick(GLOB.cardinals)) - -/obj/effect/decal/cleanable/blood/gibs/bubblegum - name = "thick blood" - desc = "Thick, splattered blood." - random_icon_states = list("gib3", "gib5", "gib6") - bloodiness = 20 - -/obj/effect/decal/cleanable/blood/gibs/bubblegum/can_bloodcrawl_in() - return TRUE - /mob/living/simple_animal/hostile/megafauna/bubblegum/Life() ..() - move_to_delay = CLAMP((health/maxHealth) * 10, 5, 10) + move_to_delay = CLAMP(round((health/maxHealth) * 10), 5, 10) /mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire() - anger_modifier = CLAMP(((maxHealth - health)/60),0,20) + anger_modifier = CLAMP(((maxHealth - health)/50),0,20) if(charging) return ranged_cooldown = world.time + ranged_cooldown_time - var/warped = FALSE - if(!try_bloodattack()) - INVOKE_ASYNC(src, .proc/blood_spray) - warped = blood_warp() - if(warped && prob(100 - anger_modifier)) - return + blood_warp() - if(prob(90 - anger_modifier) || slaughterlings()) - if(health > maxHealth * 0.5) + if(prob(25)) + INVOKE_ASYNC(src, .proc/blood_spray) + + else if(prob(5+anger_modifier/2)) + slaughterlings() + else + if(health > maxHealth/2 && !client) INVOKE_ASYNC(src, .proc/charge) else - if(prob(70) || warped) - INVOKE_ASYNC(src, .proc/charge, 2) - else - INVOKE_ASYNC(src, .proc/warp_charge) + INVOKE_ASYNC(src, .proc/triple_charge) /mob/living/simple_animal/hostile/megafauna/bubblegum/Initialize() . = ..() - for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_living_list) + for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_list) if(B != src) return INITIALIZE_HINT_QDEL //There can be only one var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new @@ -118,56 +98,53 @@ Difficulty: Hard if(.) SSshuttle.shuttle_purchase_requirements_met |= "bubblegum" -/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon) - if(!charging) - ..() +/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A) + if(charging) + return + ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/AttackingTarget() - if(!charging) - return ..() + if(charging) + return + ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/Goto(target, delay, minimum_distance) - if(!charging) - ..() + if(charging) + return + ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/Move() + if(!stat) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1) if(charging) - new /obj/effect/temp_visual/decoy/fading(loc,src) + new/obj/effect/temp_visual/decoy/fading(loc,src) DestroySurroundings() . = ..() - if(!stat && .) - playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1) if(charging) DestroySurroundings() -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/warp_charge() - blood_warp() +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/triple_charge() + charge() + sleep(10) + charge() + sleep(10) charge() -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge(bonus_charges) +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge() var/turf/T = get_turf(target) if(!T || T == loc) return - new /obj/effect/temp_visual/dragon_swoop/bubblegum(T) - charging = TRUE + new /obj/effect/temp_visual/dragon_swoop(T) + charging = 1 DestroySurroundings() walk(src, 0) setDir(get_dir(src, T)) var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src) - animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 3) - sleep(3) - throw_at(T, get_dist(src, T), 1, src, 0, callback = CALLBACK(src, .charge_end, bonus_charges)) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge_end(bonus_charges, list/effects_to_destroy) - charging = FALSE - try_bloodattack() - if(target) - if(bonus_charges) - bonus_charges-- - charge(bonus_charges) - else - Goto(target, move_to_delay, minimum_distance) - SetRecoveryTime(MEGAFAUNA_DEFAULT_RECOVERY_TIME) + animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 5) + sleep(5) + throw_at(T, get_dist(src, T), 1, src, 0) + charging = 0 + Goto(target, move_to_delay, minimum_distance) /mob/living/simple_animal/hostile/megafauna/bubblegum/Collide(atom/A) @@ -191,142 +168,20 @@ Difficulty: Hard var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) L.throw_at(throwtarget, 3) - charging = FALSE + charging = 0 -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_mobs_on_blood() - var/list/targets = ListTargets() - . = list() - for(var/mob/living/L in targets) - var/list/bloodpool = get_pools(get_turf(L), 0) - if(bloodpool.len && (!faction_check_mob(L) || L.stat == DEAD)) - . += L - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack() - var/list/targets = get_mobs_on_blood() - if(targets.len) - INVOKE_ASYNC(src, .proc/bloodattack, targets, prob(50)) - - return TRUE - return FALSE - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodattack(list/targets, handedness) - var/mob/living/target_one = pick_n_take(targets) - var/turf/target_one_turf = get_turf(target_one) - var/mob/living/target_two - if(targets.len) - target_two = pick_n_take(targets) - var/turf/target_two_turf = get_turf(target_two) - if(target_two.stat != CONSCIOUS || prob(10)) - bloodgrab(target_two_turf, handedness) - else - bloodsmack(target_two_turf, handedness) - - if(target_one) - var/list/pools = get_pools(get_turf(target_one), 0) - if(pools.len) - target_one_turf = get_turf(target_one) - if(target_one_turf) - if(target_one.stat != CONSCIOUS || prob(10)) - bloodgrab(target_one_turf, !handedness) - else - bloodsmack(target_one_turf, !handedness) - - if(!target_two && target_one) - var/list/poolstwo = get_pools(get_turf(target_one), 0) - if(poolstwo.len) - target_one_turf = get_turf(target_one) - if(target_one_turf) - if(target_one.stat != CONSCIOUS || prob(10)) - bloodgrab(target_one_turf, handedness) - else - bloodsmack(target_one_turf, handedness) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness) - if(handedness) - new /obj/effect/temp_visual/bubblegum_hands/rightsmack(T) - else - new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T) - sleep(2.5) - for(var/mob/living/L in T) - if(!faction_check_mob(L)) - to_chat(L, "[src] rends you!") - playsound(T, attack_sound, 100, 1, -1) - var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) - L.apply_damage(25, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, "melee", null, null, armour_penetration)) - sleep(3) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness) - if(handedness) - new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T) - new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T) - else - new /obj/effect/temp_visual/bubblegum_hands/leftpaw(T) - new /obj/effect/temp_visual/bubblegum_hands/leftthumb(T) - sleep(6) - for(var/mob/living/L in T) - if(!faction_check_mob(L)) - to_chat(L, "[src] drags you through the blood!") - playsound(T, 'sound/magic/enter_blood.ogg', 100, 1, -1) - var/turf/targetturf = get_step(src, dir) - L.forceMove(targetturf) - playsound(targetturf, 'sound/magic/exit_blood.ogg', 100, 1, -1) - if(L.stat != CONSCIOUS) - addtimer(CALLBACK(src, .proc/devour, L), 2) - sleep(1) - -/obj/effect/temp_visual/dragon_swoop/bubblegum - duration = 10 - -/obj/effect/temp_visual/bubblegum_hands - icon = 'icons/effects/bubblegum.dmi' - duration = 9 - -/obj/effect/temp_visual/bubblegum_hands/rightthumb - icon_state = "rightthumbgrab" - -/obj/effect/temp_visual/bubblegum_hands/leftthumb - icon_state = "leftthumbgrab" - -/obj/effect/temp_visual/bubblegum_hands/rightpaw - icon_state = "rightpawgrab" - layer = BELOW_MOB_LAYER - -/obj/effect/temp_visual/bubblegum_hands/leftpaw - icon_state = "leftpawgrab" - layer = BELOW_MOB_LAYER - -/obj/effect/temp_visual/bubblegum_hands/rightsmack - icon_state = "rightsmack" - -/obj/effect/temp_visual/bubblegum_hands/leftsmack - icon_state = "leftsmack" - /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp() - if(Adjacent(target)) - return FALSE - var/list/can_jaunt = get_pools(get_turf(src), 1) - if(!can_jaunt.len) - return FALSE - - var/list/pools = get_pools(get_turf(target), 2) - var/list/pools_to_remove = get_pools(get_turf(target), 1) - pools -= pools_to_remove - if(!pools.len) - return FALSE - - var/obj/effect/temp_visual/decoy/DA = new /obj/effect/temp_visual/decoy(loc,src) - DA.color = "#FF0000" - var/oldtransform = DA.transform - DA.transform = matrix()*2 - animate(DA, alpha = 255, color = initial(DA.color), transform = oldtransform, time = 3) - sleep(3) - qdel(DA) - var/obj/effect/decal/cleanable/blood/found_bloodpool - pools = get_pools(get_turf(target), 2) - pools_to_remove = get_pools(get_turf(target), 1) - pools -= pools_to_remove + var/list/pools = list() + var/can_jaunt = FALSE + for(var/obj/effect/decal/cleanable/blood/nearby in view(src,2)) + can_jaunt = TRUE + break + if(!can_jaunt) + return + for(var/obj/effect/decal/cleanable/blood/nearby in view(get_turf(target),2)) + pools += nearby if(pools.len) shuffle_inplace(pools) found_bloodpool = pick(pools) @@ -336,51 +191,30 @@ Difficulty: Hard forceMove(get_turf(found_bloodpool)) playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1) visible_message("And springs back out!") - return TRUE - return FALSE -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_pools(turf/T, range) - . = list() - for(var/obj/effect/decal/cleanable/nearby in view(T, range)) - if(nearby.can_bloodcrawl_in()) - . += nearby /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_spray() visible_message("[src] sprays a stream of gore!") - var/range = 6 + round(anger_modifier * 0.4) + var/turf/E = get_edge_target_turf(src, src.dir) + var/range = 10 var/turf/previousturf = get_turf(src) - var/turf/J = previousturf - var/targetdir = get_dir(src, target) - if(target.loc == loc) - targetdir = dir - face_atom(target) - new /obj/effect/decal/cleanable/blood/bubblegum(J) - for(var/i in 1 to range) - J = get_step(previousturf, targetdir) - new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J)) - playsound(previousturf,'sound/effects/splat.ogg', 100, 1, -1) - if(!J || !previousturf.atmos_adjacent_turfs || !previousturf.atmos_adjacent_turfs[J]) + for(var/turf/J in getline(src,E)) + if(!range) break - new /obj/effect/decal/cleanable/blood/bubblegum(J) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J)) + if(!previousturf.CanAtmosPass(J)) + break + playsound(J,'sound/effects/splat.ogg', 100, 1, -1) + new /obj/effect/decal/cleanable/blood(J) + range-- previousturf = J sleep(1) -/obj/effect/decal/cleanable/blood/bubblegum - bloodiness = 0 - -/obj/effect/decal/cleanable/blood/bubblegum/can_bloodcrawl_in() - return TRUE - /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/slaughterlings() visible_message("[src] summons a shoal of slaughterlings!") - var/max_amount = 6 - for(var/H in get_pools(get_turf(src), 1)) - if(!max_amount) - break - max_amount-- - var/obj/effect/decal/cleanable/blood/B = H - new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter(B.loc) - return max_amount + for(var/obj/effect/decal/cleanable/blood/H in range(src, 10)) + if(prob(25)) + new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter(H.loc) /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter name = "slaughterling" @@ -398,3 +232,5 @@ Difficulty: Hard if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum)) return 1 return 0 + +#undef MEDAL_PREFIX \ No newline at end of file From 6e9451171856a4708f907d69cab9352782805125 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 22 Jun 2018 03:04:37 -0400 Subject: [PATCH 055/204] Removes unused defines (#38650) --- code/modules/atmospherics/gasmixtures/reactions.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 2bfe1cec71..5bd8c548f7 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -496,10 +496,4 @@ #undef STIMULUM_SECOND_RISE #undef STIMULUM_ABSOLUTE_DROP #undef REACTION_OPPRESSION_THRESHOLD -#undef PLASMA_BINDING_ENERGY -#undef MAX_CATALYST_EFFICENCY -#undef PLASMA_FUSED_COEFFICENT -#undef CATALYST_COEFFICENT -#undef FUSION_PURITY_THRESHOLD -#undef FUSION_HEAT_DROPOFF #undef NOBLIUM_FORMATION_ENERGY From f02a99f9014082ea6105f06fc88d86e957589b05 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 22 Jun 2018 02:16:50 -0500 Subject: [PATCH 057/204] [MIRROR] Fixes HE pipes not respecting layering (#7223) * Fixes HE pipes not respecting layering (#38468) * HE pipes fix * Heat exchange stuff * Fixes HE pipes not respecting layering --- .../atmospherics/machinery/atmosmachinery.dm | 2 +- .../machinery/pipes/heat_exchange/he_pipes.dm | 19 +++------- .../machinery/pipes/heat_exchange/junction.dm | 38 +++++-------------- .../machinery/pipes/heat_exchange/manifold.dm | 18 ++++----- .../machinery/pipes/heat_exchange/simple.dm | 10 ++--- 5 files changed, 31 insertions(+), 56 deletions(-) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 0c908dd12f..7d095869cb 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -125,7 +125,7 @@ Pipelines + Other Objects -> Pipe network pixel_y = (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y layer = initial(layer) + ((piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE) -/obj/machinery/atmospherics/proc/can_be_node(obj/machinery/atmospherics/target) +/obj/machinery/atmospherics/proc/can_be_node(obj/machinery/atmospherics/target, iteration) return connection_check(target, piping_layer) //Find a connecting /obj/machinery/atmospherics in specified direction diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index ee52d89e5b..b087859a47 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -1,7 +1,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging icon = 'icons/obj/atmospherics/pipes/heat.dmi' level = 2 - var/initialize_directions_he var/minimum_temperature_difference = 20 var/thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT color = "#404040" @@ -9,22 +8,18 @@ var/icon_temperature = T20C //stop small changes in temperature causing icon refresh resistance_flags = LAVA_PROOF | FIRE_PROOF -/obj/machinery/atmospherics/pipe/heat_exchanging/New() - ..() +/obj/machinery/atmospherics/pipe/heat_exchanging/Initialize() + . = ..() add_atom_colour("#404040", FIXED_COLOUR_PRIORITY) -/obj/machinery/atmospherics/pipe/heat_exchanging/can_be_node(obj/machinery/atmospherics/pipe/heat_exchanging/target) - if(!istype(target)) - return 0 - if(target.initialize_directions_he & get_dir(target,src)) - return 1 +/obj/machinery/atmospherics/pipe/heat_exchanging/isConnectable(obj/machinery/atmospherics/pipe/heat_exchanging/target, given_layer, HE_type_check = TRUE) + if(istype(target, /obj/machinery/atmospherics/pipe/heat_exchanging) != HE_type_check) + return FALSE + . = ..() /obj/machinery/atmospherics/pipe/heat_exchanging/hide() return -/obj/machinery/atmospherics/pipe/heat_exchanging/GetInitDirections() - return ..() | initialize_directions_he - /obj/machinery/atmospherics/pipe/heat_exchanging/process_atmos() var/environment_temperature = 0 var/datum/gas_mixture/pipe_air = return_air() @@ -56,8 +51,6 @@ L.bodytemperature = avg_temp pipe_air.temperature = avg_temp - - /obj/machinery/atmospherics/pipe/heat_exchanging/process() if(!parent) return //machines subsystem fires before atmos is initialized so this prevents race condition runtimes diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm index d0bf90c27b..606693ddda 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm @@ -9,11 +9,9 @@ thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT dir = SOUTH - initialize_directions = NORTH - initialize_directions_he = SOUTH device_type = BINARY - + construction_type = /obj/item/pipe/directional pipe_state = "junction" @@ -26,34 +24,18 @@ piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/heat_exchanging/junction/SetInitDirections() switch(dir) - if(SOUTH) - initialize_directions = NORTH - initialize_directions_he = SOUTH - if(NORTH) - initialize_directions = SOUTH - initialize_directions_he = NORTH - if(EAST) - initialize_directions = WEST - initialize_directions_he = EAST - if(WEST) - initialize_directions = EAST - initialize_directions_he = WEST + if(NORTH,SOUTH) + initialize_directions = SOUTH|NORTH + if(EAST,WEST) + initialize_directions = WEST|EAST /obj/machinery/atmospherics/pipe/heat_exchanging/junction/getNodeConnects() return list(turn(dir, 180), dir) -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/can_be_node(obj/machinery/atmospherics/target, iteration) - var/init_dir - switch(iteration) - if(1) - init_dir = target.initialize_directions - if(2) - var/obj/machinery/atmospherics/pipe/heat_exchanging/H = target - if(!istype(H)) - return 0 - init_dir = H.initialize_directions_he - if(init_dir & get_dir(target,src)) - return 1 +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/isConnectable(obj/machinery/atmospherics/target, given_layer, he_type_check) + if(dir == get_dir(target, src)) + return ..(target, given_layer, FALSE) //we want a normal pipe instead + return ..(target, given_layer, TRUE) diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm index 9b95840875..6689905cf7 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm @@ -6,13 +6,13 @@ desc = "A manifold composed of regular pipes." dir = SOUTH - initialize_directions_he = EAST|NORTH|WEST + initialize_directions = EAST|NORTH|WEST device_type = TRINARY construction_type = /obj/item/pipe/trinary pipe_state = "he_manifold" - + /obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -26,13 +26,13 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/manifold/SetInitDirections() switch(dir) if(NORTH) - initialize_directions_he = EAST|SOUTH|WEST + initialize_directions = EAST|SOUTH|WEST if(SOUTH) - initialize_directions_he = WEST|NORTH|EAST + initialize_directions = WEST|NORTH|EAST if(EAST) - initialize_directions_he = SOUTH|WEST|NORTH + initialize_directions = SOUTH|WEST|NORTH if(WEST) - initialize_directions_he = NORTH|EAST|SOUTH + initialize_directions = NORTH|EAST|SOUTH /obj/machinery/atmospherics/pipe/heat_exchanging/manifold/update_icon() var/invis = invisibility ? "-f" : "" @@ -53,13 +53,13 @@ name = "4-way pipe manifold" desc = "A manifold composed of heat-exchanging pipes." - initialize_directions_he = NORTH|SOUTH|EAST|WEST + initialize_directions = NORTH|SOUTH|EAST|WEST device_type = QUATERNARY construction_type = /obj/item/pipe/quaternary pipe_state = "he_manifold4w" - + /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -71,7 +71,7 @@ pixel_y = PIPING_LAYER_P_Y /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w/SetInitDirections() - initialize_directions_he = initial(initialize_directions_he) + initialize_directions = initial(initialize_directions) /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w/update_icon() var/invis = invisibility ? "-f" : "" diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm index d00304114d..ad137a227d 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm @@ -5,13 +5,13 @@ desc = "A one meter section of heat-exchanging pipe." dir = SOUTH - initialize_directions_he = SOUTH|NORTH + initialize_directions = SOUTH|NORTH device_type = BINARY construction_type = /obj/item/pipe/binary/bendable pipe_state = "he" - + /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -24,12 +24,12 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/SetInitDirections() if(dir in GLOB.diagonals) - initialize_directions_he = dir + initialize_directions = dir switch(dir) if(NORTH,SOUTH) - initialize_directions_he = SOUTH|NORTH + initialize_directions = SOUTH|NORTH if(EAST,WEST) - initialize_directions_he = WEST|EAST + initialize_directions = WEST|EAST /obj/machinery/atmospherics/pipe/heat_exchanging/simple/proc/normalize_dir() if(dir==SOUTH) From 386bc528ea5c4e1c097c3698eb8f97b2ab735dba Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 22 Jun 2018 02:34:41 -0500 Subject: [PATCH 058/204] [MIRROR] Add logging to teleport and the teleporter destination setting (#7225) * Add logging to teleport and the teleporter destination setting (#38645) Helps with some admin issues * Add logging to teleport and the teleporter destination setting --- code/datums/helper_datums/teleport.dm | 1 + code/game/machinery/computer/teleporter.dm | 4 ++++ code/game/machinery/teleporter.dm | 1 + 3 files changed, 6 insertions(+) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 26a0a0f414..4ef292d1b1 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -51,6 +51,7 @@ tele_play_specials(teleatom, curturf, effectin, asoundin) var/success = force_teleport ? teleatom.forceMove(destturf) : teleatom.Move(destturf) if (success) + log_game("[teleatom] ([key_name(teleatom)]) has teleported from [AREACOORD(curturf)] to [AREACOORD(destturf)]") tele_play_specials(teleatom, destturf, effectout, asoundout) if(ismegafauna(teleatom)) message_admins("[teleatom] [ADMIN_FLW(teleatom)] has teleported from [ADMIN_VERBOSEJMP(curturf)] to [ADMIN_VERBOSEJMP(destturf)].") diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 93b997eee6..9e12a7bcdd 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -171,6 +171,8 @@ var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L target = L[desc] + var/turf/T = get_turf(target) + log_game("[key_name(user)] has set the teleporter target to [target] at [AREACOORD(T)]") else var/list/S = power_station.linked_stations @@ -185,6 +187,8 @@ var/obj/machinery/teleport/station/target_station = L[desc] if(!target_station || !target_station.teleporter_hub) return + var/turf/T = get_turf(target_station) + log_game("[key_name(user)] has set the teleporter target to [target_station] at [AREACOORD(T)]") target = target_station.teleporter_hub target_station.linked_stations |= power_station target_station.stat &= ~NOPOWER diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 3d217e52c5..2c1f9d01b0 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -69,6 +69,7 @@ if(do_teleport(M, com.target)) use_power(5000) if(!calibrated && prob(30 - ((accurate) * 10))) //oh dear a problem + log_game("[M] ([key_name(M)]) was turned into a fly person") if(ishuman(M))//don't remove people from the round randomly you jerks var/mob/living/carbon/human/human = M if(human.dna && human.dna.species.id == "human") From 110c53b72440288ecd0c21fa68045e93106d2b0c Mon Sep 17 00:00:00 2001 From: Improvedname Date: Sat, 23 Jun 2018 14:48:00 +0200 Subject: [PATCH 059/204] rubberoo --- .../projectiles/guns/ballistic/rifles.dm | 18 ++++++++++++++++++ .../modules/research/designs/weapon_designs.dm | 7 +++++++ .../code/modules/research/techweb/all_nodes.dm | 4 ++++ tgstation.dme | 1 + 4 files changed, 30 insertions(+) create mode 100644 modular_citadel/code/modules/research/designs/weapon_designs.dm diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm index e503b37386..2e4d9a60e1 100644 --- a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm @@ -16,6 +16,24 @@ spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable recoil = 1 +///////security rifles special ammo/////// + +/obj/item/ammo_casing/c46x30mm/rubber + name = "4.6x30mm rubberbullet casing" + desc = "A 4.6x30mm rubberbullet casing." + caliber = "4.6x30mm" + projectile_type = /obj/item/projectile/bullet/c46x30mm/rubber + +/obj/item/ammo_box/magazine/wt550m9/wtrubber + name = "wt550 magazine (Rubber bullets 4.6x30mm)" + icon_state = "46x30mmtA-20" + ammo_type = /obj/item/ammo_casing/c46x30mm/rubber + +/obj/item/projectile/bullet/c46x30mm/rubber + name = "4.6x30mm bullet" + damage = 5 + stamina = 20 + ///toy memes/// /obj/item/ammo_box/magazine/toy/x9 diff --git a/modular_citadel/code/modules/research/designs/weapon_designs.dm b/modular_citadel/code/modules/research/designs/weapon_designs.dm new file mode 100644 index 0000000000..4f1d630bdf --- /dev/null +++ b/modular_citadel/code/modules/research/designs/weapon_designs.dm @@ -0,0 +1,7 @@ +/datum/design/mag_oldsmg/rubber_mag + name = "WT-550 Auto Gun Incendiary Magazine (4.6x30mm IC)" + desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle" + id = "mag_oldsmg_rubber" + materials = list(MAT_METAL = 6000) + build_path = /obj/item/ammo_box/magazine/wt550m9/wtrubber + departmental_flags = DEPARTMENTAL_FLAG_SECURITY \ No newline at end of file diff --git a/modular_citadel/code/modules/research/techweb/all_nodes.dm b/modular_citadel/code/modules/research/techweb/all_nodes.dm index 113d4115ac..e890b3a07a 100644 --- a/modular_citadel/code/modules/research/techweb/all_nodes.dm +++ b/modular_citadel/code/modules/research/techweb/all_nodes.dm @@ -10,6 +10,10 @@ . = ..() design_ids += "xenobio_slimeadv" +/datum/techweb_node/ballistic_weapons/New() + . = ..() + design_ids += "mag_oldsmg_rubber" + /datum/techweb_node/computer_board_gaming id = "computer_board_gaming" display_name = "Games and Toys" diff --git a/tgstation.dme b/tgstation.dme index 527db71b8c..53412e7631 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2851,6 +2851,7 @@ #include "modular_citadel\code\modules\research\designs\autolathe_designs.dm" #include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm" #include "modular_citadel\code\modules\research\designs\machine_designs.dm" +#include "modular_citadel\code\modules\research\designs\weapon_designs.dm" #include "modular_citadel\code\modules\research\designs\xenobio_designs.dm" #include "modular_citadel\code\modules\research\techweb\_techweb.dm" #include "modular_citadel\code\modules\research\techweb\all_nodes.dm" From 7dec7223c26848bfa95ec8da05fa02d39c6deb5b Mon Sep 17 00:00:00 2001 From: Improvedname Date: Sat, 23 Jun 2018 15:06:36 +0200 Subject: [PATCH 060/204] rubber2 --- .../code/modules/research/designs/weapon_designs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/research/designs/weapon_designs.dm b/modular_citadel/code/modules/research/designs/weapon_designs.dm index 4f1d630bdf..bdb77170ed 100644 --- a/modular_citadel/code/modules/research/designs/weapon_designs.dm +++ b/modular_citadel/code/modules/research/designs/weapon_designs.dm @@ -1,6 +1,6 @@ /datum/design/mag_oldsmg/rubber_mag - name = "WT-550 Auto Gun Incendiary Magazine (4.6x30mm IC)" - desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle" + name = "WT-550 Auto Gun rubberbullets Magazine (4.6x30mm rubber)" + desc = "A 20 round rubber shots magazine for the out of date security WT-550 Auto Rifle" id = "mag_oldsmg_rubber" materials = list(MAT_METAL = 6000) build_path = /obj/item/ammo_box/magazine/wt550m9/wtrubber From 843c05aa8261e3884290dcbf52d15848cb826979 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 23 Jun 2018 23:30:16 +0200 Subject: [PATCH 061/204] Fixes antag logs (#38658) * Fixes roundstart antag logging. * Fixes roundend antag logging. * Handles blown up minds. * whoops * total antag cleanup --- code/__HELPERS/roundend.dm | 19 +++++++++---------- code/__HELPERS/unsorted.dm | 24 +++++++++++++++++++----- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 13fcc94b4b..a0051c3b1e 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -203,21 +203,20 @@ //Print a list of antagonists to the server log var/list/total_antagonists = list() //Look into all mobs in world, dead or alive - for(var/datum/mind/Mind in minds) - var/temprole = Mind.special_role - if(temprole) //if they are an antagonist of some sort. - if(temprole in total_antagonists) //If the role exists already, add the name to it - total_antagonists[temprole] += ", [Mind.name]([Mind.key])" - else - total_antagonists.Add(temprole) //If the role doesnt exist in the list, create it and add the mob - total_antagonists[temprole] += ": [Mind.name]([Mind.key])" + for(var/datum/antagonist/A in GLOB.antagonists) + if(!A.owner) + continue + if(!(A.name in total_antagonists)) + total_antagonists[A.name] = list() + total_antagonists[A.name] += "[key_name(A.owner)]" CHECK_TICK //Now print them all into the log! log_game("Antagonists at round end were...") - for(var/i in total_antagonists) - log_game("[i]s[total_antagonists[i]].") + for(var/antag_name in total_antagonists) + var/list/L = total_antagonists[antag_name] + log_game("[antag_name]s :[L.Join(", ")].") CHECK_TICK SSdbcore.SetRoundEnd() diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index bb2cb98cd2..5b9bb8c184 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -375,6 +375,7 @@ Turf and target are separate in case you want to teleport some distance from a t var/client/C var/key var/ckey + var/fallback_name if(!whom) return "*null*" @@ -394,6 +395,16 @@ Turf and target are separate in case you want to teleport some distance from a t C = GLOB.directory[ckey] if(C) M = C.mob + else if(istype(whom,/datum/mind)) + var/datum/mind/mind = whom + key = mind.key + ckey = ckey(key) + if(mind.current) + M = mind.current + if(M.client) + C = M.client + else + fallback_name = mind.name else return "*invalid*" @@ -419,11 +430,14 @@ Turf and target are separate in case you want to teleport some distance from a t else . += "*no key*" - if(include_name && M) - if(M.real_name) - . += "/([M.real_name])" - else if(M.name) - . += "/([M.name])" + if(include_name) + if(M) + if(M.real_name) + . += "/([M.real_name])" + else if(M.name) + . += "/([M.name])" + else if(fallback_name) + . += "/([fallback_name])" return . From 4ffe025624439fd1acf29ebd15026607cf865991 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 23 Jun 2018 12:03:36 -0700 Subject: [PATCH 063/204] Cyborgs now drop radio keys on detonation/destruction (#38617) * Cyborgs now drop radio keys on detonation/destruction * Woops! * Update robot.dm * Use atom rather than turf --- code/modules/mob/living/silicon/robot/robot.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 40ec50d67e..a469bf5258 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -164,8 +164,8 @@ //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO /mob/living/silicon/robot/Destroy() + var/atom/T = drop_location()//To hopefully prevent run time errors. if(mmi && mind)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. - var/turf/T = get_turf(loc)//To hopefully prevent run time errors. if(T) mmi.forceMove(T) if(mmi.brainmob) @@ -184,6 +184,10 @@ connected_ai.connected_robots -= src if(shell) GLOB.available_ai_shells -= src + else + if(T && istype(radio) && istype(radio.keyslot)) + radio.keyslot.forceMove(T) + radio.keyslot = null qdel(wires) qdel(module) qdel(eye_lights) From 1a53b59b1215edfb7b7f312f32abd0d61bde8f20 Mon Sep 17 00:00:00 2001 From: Time-Green Date: Sat, 23 Jun 2018 20:30:36 +0200 Subject: [PATCH 065/204] Fixes closed soda cans transferring (#38668) --- code/modules/food_and_drinks/drinks/drinks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 29be63a2bb..dc903dce85 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -59,7 +59,7 @@ if(!proximity) return - if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it. + if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, "[src] is empty.") return From f2d665b1b1e1e79aa4c380633e8bdee0371530fe Mon Sep 17 00:00:00 2001 From: NikNakFlak Date: Fri, 22 Jun 2018 16:57:00 -0700 Subject: [PATCH 067/204] Fixes fireplace sound (rogue crackle) (#38657) --- sound/effects/comfyfire.ogg | Bin 50332 -> 49938 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/sound/effects/comfyfire.ogg b/sound/effects/comfyfire.ogg index 9b796219b3b5df4a495d267c11edf0546edd5992..1bc7fc02d026588fc75eb87380445fb53538fdd3 100644 GIT binary patch delta 48282 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 delta 48422 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 Date: Fri, 22 Jun 2018 19:56:09 -0400 Subject: [PATCH 069/204] Ports more things to Initialize (#38653) --- code/game/objects/effects/bump_teleporter.dm | 4 ++-- code/game/objects/effects/countdown.dm | 4 ++-- code/game/objects/effects/effect_system/effect_system.dm | 6 +++--- .../objects/effects/effect_system/effects_explosion.dm | 8 ++++---- code/game/objects/effects/effect_system/effects_foam.dm | 4 ++-- code/game/objects/effects/effect_system/effects_smoke.dm | 4 ++-- code/game/objects/effects/effect_system/effects_sparks.dm | 4 ++-- code/game/objects/effects/effect_system/effects_water.dm | 8 ++++---- code/game/objects/effects/forcefields.dm | 4 ++-- code/game/objects/effects/manifest.dm | 5 +++-- code/game/objects/effects/mines.dm | 4 ++-- code/game/objects/effects/overlays.dm | 4 ++-- code/game/objects/items/airlock_painter.dm | 4 ++-- code/game/objects/items/candle.dm | 4 ++-- code/modules/admin/fun_balloon.dm | 2 +- 15 files changed, 35 insertions(+), 34 deletions(-) diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm index 42f59cc535..307a912fe3 100644 --- a/code/game/objects/effects/bump_teleporter.dm +++ b/code/game/objects/effects/bump_teleporter.dm @@ -11,8 +11,8 @@ var/static/list/AllTeleporters -/obj/effect/bump_teleporter/New() - ..() +/obj/effect/bump_teleporter/Initialize() + . = ..() LAZYADD(AllTeleporters, src) /obj/effect/bump_teleporter/Destroy() diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index d62146be5e..1165ee50a0 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -14,9 +14,9 @@ anchored = TRUE layer = GHOST_LAYER -/obj/effect/countdown/New(atom/A) +/obj/effect/countdown/Initialize() . = ..() - attach(A) + attach(loc) /obj/effect/countdown/examine(mob/user) . = ..() diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 8c31847f78..eb4c562c36 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -12,13 +12,13 @@ would spawn and follow the beaker, even if it is carried or thrown. pass_flags = PASSTABLE | PASSGRILLE anchored = TRUE -/obj/effect/particle_effect/New() - ..() +/obj/effect/particle_effect/Initialize() + . = ..() GLOB.cameranet.updateVisibility(src) /obj/effect/particle_effect/Destroy() GLOB.cameranet.updateVisibility(src) - . = ..() + return ..() /datum/effect_system var/number = 3 diff --git a/code/game/objects/effects/effect_system/effects_explosion.dm b/code/game/objects/effects/effect_system/effects_explosion.dm index 33ecd308d1..d208510e86 100644 --- a/code/game/objects/effects/effect_system/effects_explosion.dm +++ b/code/game/objects/effects/effect_system/effects_explosion.dm @@ -4,8 +4,8 @@ opacity = 1 anchored = TRUE -/obj/effect/particle_effect/expl_particles/New() - ..() +/obj/effect/particle_effect/expl_particles/Initialize() + . = ..() QDEL_IN(src, 15) /datum/effect_system/expl_particles @@ -29,8 +29,8 @@ pixel_x = -32 pixel_y = -32 -/obj/effect/explosion/New() - ..() +/obj/effect/explosion/Initialize() + . = ..() QDEL_IN(src, 10) /datum/effect_system/explosion diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index d9a7d6fb7b..e7b7472e86 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -270,8 +270,8 @@ max_integrity = 20 CanAtmosPass = ATMOS_PASS_DENSITY -/obj/structure/foamedmetal/New() - ..() +/obj/structure/foamedmetal/Initialize() + . = ..() air_update_turf(1) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 5618ca9a91..472261003f 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -30,8 +30,8 @@ set_opacity(0) //if we were blocking view, we aren't now because we're fading out stoplag() -/obj/effect/particle_effect/smoke/New() - ..() +/obj/effect/particle_effect/smoke/Initialize() + . = ..() create_reagents(500) START_PROCESSING(SSobj, src) diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm index 695c835a89..8453b6438d 100644 --- a/code/game/objects/effects/effect_system/effects_sparks.dm +++ b/code/game/objects/effects/effect_system/effects_sparks.dm @@ -22,8 +22,8 @@ anchored = TRUE light_range = 1 -/obj/effect/particle_effect/sparks/New() - ..() +/obj/effect/particle_effect/sparks/Initialize() + . = ..() flick("sparks", src) // replay the animation playsound(src.loc, "sparks", 100, 1) var/turf/T = loc diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm index 4c84c97650..469b05176a 100644 --- a/code/game/objects/effects/effect_system/effects_water.dm +++ b/code/game/objects/effects/effect_system/effects_water.dm @@ -7,8 +7,8 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/effect/particle_effect/water/New() - ..() +/obj/effect/particle_effect/water/Initialize() + . = ..() QDEL_IN(src, 70) /obj/effect/particle_effect/water/Move(turf/newloc) @@ -45,8 +45,8 @@ steam.start() -- spawns the effect icon_state = "extinguish" density = FALSE -/obj/effect/particle_effect/steam/New() - ..() +/obj/effect/particle_effect/steam/Initialize() + . = ..() QDEL_IN(src, 20) /datum/effect_system/steam_spread diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index ef074f4cec..6aab4f386a 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -8,8 +8,8 @@ CanAtmosPass = ATMOS_PASS_DENSITY var/timeleft = 300 //Set to 0 for permanent forcefields (ugh) -/obj/effect/forcefield/New() - ..() +/obj/effect/forcefield/Initialize() + . = ..() if(timeleft) QDEL_IN(src, timeleft) diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm index 2082f2b495..fbf403a765 100644 --- a/code/game/objects/effects/manifest.dm +++ b/code/game/objects/effects/manifest.dm @@ -3,8 +3,9 @@ icon = 'icons/mob/screen_gen.dmi' icon_state = "x" -/obj/effect/manifest/New() - src.invisibility = INVISIBILITY_ABSTRACT +/obj/effect/manifest/Initialize() + . = ..() + invisibility = INVISIBILITY_ABSTRACT /obj/effect/manifest/proc/manifest() var/dat = "Crew Manifest:
" diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 8f256f1102..2ae4f5e5c5 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -98,8 +98,8 @@ density = FALSE var/duration = 0 -/obj/effect/mine/pickup/New() - ..() +/obj/effect/mine/pickup/Initialize() + . = ..() animate(src, pixel_y = 4, time = 20, loop = -1) /obj/effect/mine/pickup/triggermine(mob/victim) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index c1abc2c02e..a0634928ce 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -13,8 +13,8 @@ icon_state="b_beam" var/atom/BeamSource -/obj/effect/overlay/beam/New() - ..() +/obj/effect/overlay/beam/Initialize() + . = ..() QDEL_IN(src, 10) /obj/effect/overlay/palmtree_r diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index be9cb0b89a..82c272e7f9 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -15,8 +15,8 @@ var/obj/item/toner/ink = null -/obj/item/airlock_painter/New() - ..() +/obj/item/airlock_painter/Initialize() + . = ..() ink = new /obj/item/toner(src) //This proc doesn't just check if the painter can be used, but also uses it. diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index a0ec648a1a..b660801f90 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -14,8 +14,8 @@ var/start_lit = FALSE heat = 1000 -/obj/item/candle/New() - ..() +/obj/item/candle/Initialize() + . = ..() if(start_lit) // No visible message light(show_message = FALSE) diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index b5dfbf7817..85feb3026c 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -6,7 +6,7 @@ anchored = TRUE var/popped = FALSE -/obj/effect/fun_balloon/New() +/obj/effect/fun_balloon/Initialize() . = ..() SSobj.processing |= src From 20cb09cb1c6da6e57a1ccf1a2c777cf5571dbe53 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 22 Jun 2018 14:20:21 -0400 Subject: [PATCH 071/204] Fixes bubblegum comments --- .../living/simple_animal/hostile/megafauna/bubblegum.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index e5425573b4..6d3a9f9631 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -12,10 +12,17 @@ If it fails to warp to a target, it may summon up to 6 slaughterlings from the b If it does not summon all 6 slaughterlings, it will instead charge at its target, dealing massive damage to anything it hits and spraying a stream of blood. At half health, it will either charge three times or warp, then charge, instead of doing a single charge. +<<<<<<< HEAD When Bubblegum dies, it leaves behind a H.E.C.K. mining suit as well as a chest that can contain three things: 1. A bottle that, when activated, drives everyone nearby into a frenzy 2. A contract that marks for death the chosen target 3. A spellblade that can slice off limbs at range +======= +When Bubblegum dies, it leaves behind a H.E.C.K. suit+helmet as well as a chest that can contain three things: + 1. A spellblade that can slice off limbs at range + 2. A bottle that, when activated, drives everyone nearby into a frenzy + 3. A contract that marks for death the chosen target +>>>>>>> c6ca01f... Merge pull request #38661 from 81Denton/fug Difficulty: Hard From 11dc633021a45b9ba185f338861f9988abc16f3e Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 24 Jun 2018 10:16:36 -0400 Subject: [PATCH 072/204] Merge pull request #38692 from Jordie0608/blacklistedmakesitsoundlikethebuilddidsomethingbadwhichitdidbadbuildnaughtybuild Blacklisted buggy build 1428 --- code/modules/client/client_procs.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index f3e2ad84ec..fdcb27ad75 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -6,6 +6,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( "1407" = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", "1408" = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", + "1428" = "bug causing right-click menus to show too many verbs that's been fixed in version 1429", )) From f1684aab2f3c2517ccff35b2891b725eb6606bbc Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 24 Jun 2018 10:45:15 -0400 Subject: [PATCH 074/204] Merge pull request #38684 from AutomaticFrenzy/patch/goonchat-logs Allow actually saving Goonchat logs --- .../browserassets/js/browserOutput.js | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index ba8e0b9dcf..045177c92d 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -892,23 +892,26 @@ $(function() { }); $('#saveLog').click(function(e) { + // Requires IE 10+ to issue download commands. Just opening a popup + // window will cause Ctrl+S to save a blank page, ignoring innerHTML. + if (!window.Blob) { + output('This function is only supported on IE 10+. Upgrade if possible.', 'internal'); + return; + } + $.ajax({ type: 'GET', url: 'browserOutput.css', success: function(styleData) { - var win; + var blob = new Blob(['Chat Log', $messages.html(), '']); - try { - win = window.open('', 'Chat Log', 'toolbar=no, location=no, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=yes, width=780, height=600, top=' + (screen.height/2 - 635/2) + ', left=' + (screen.width/2 - 780/2)); - } catch (e) { - return; - } + var fname = 'SS13 Chat Log'; + var date = new Date(), month = date.getMonth(), day = date.getDay(), hours = date.getHours(), mins = date.getMinutes(), secs = date.getSeconds(); + fname += ' ' + date.getFullYear() + '-' + (month < 10 ? '0' : '') + month + '-' + (day < 10 ? '0' : '') + day; + fname += ' ' + (hours < 10 ? '0' : '') + hours + (mins < 10 ? '0' : '') + mins + (secs < 10 ? '0' : '') + secs; + fname += '.html'; - if (win) { - win.document.head.innerHTML = 'Chat Log'; - win.document.head.innerHTML += ''; - win.document.body.innerHTML = $messages.html(); - } + window.navigator.msSaveBlob(blob, fname); } }); }); From d50ae43d7f14c5a8b9be1730820d8e36d385fff8 Mon Sep 17 00:00:00 2001 From: CitrusGender <31262308+CitrusGender@users.noreply.github.com> Date: Sun, 24 Jun 2018 14:55:13 -0400 Subject: [PATCH 076/204] Fixed cyborgs not getting their names at round start --- code/__HELPERS/unsorted.dm | 2 +- code/controllers/configuration/entries/game_options.dm | 2 -- code/controllers/subsystem/job.dm | 4 ++++ code/modules/jobs/job_types/silicon.dm | 3 +-- code/modules/mob/living/silicon/robot/robot.dm | 3 ++- code/modules/mob/transform_procs.dm | 3 +-- config/game_options.txt | 3 --- 7 files changed, 9 insertions(+), 11 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index bb2cb98cd2..8ab5a48284 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -195,7 +195,7 @@ Turf and target are separate in case you want to teleport some distance from a t var/safety = 0 while(loop && safety < 5) - if(C && C.prefs.custom_names[role] && !safety) + if(C && C.prefs.custom_names[role] && !safety && (!jobban_isbanned(src, "appearance"))) newname = C.prefs.custom_names[role] else switch(role) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index ebf27324b9..5f2c583d59 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -170,8 +170,6 @@ config_entry_value = -1 min_val = -1 -/datum/config_entry/flag/rename_cyborg - /datum/config_entry/flag/ooc_during_round /datum/config_entry/flag/emojis diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index f72b7d1d6a..8c7a42e342 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -434,12 +434,16 @@ SUBSYSTEM_DEF(job) to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.") if(job && H) +<<<<<<< HEAD if(job.dresscodecompliant)// CIT CHANGE - dress code compliance equip_loadout(N, H) // CIT CHANGE - allows players to spawn with loadout items job.after_spawn(H, M, joined_late) equip_loadout(N, H, TRUE)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works //handle_roundstart_items(H, M.ckey, H.mind.assigned_role, H.mind.special_role) //CIT CHANGE - makes donators spawn with their items. This can safely be commented out when all of the donator items are migrated to the loadout system +======= + job.after_spawn(H, M, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not. +>>>>>>> 501fd35... Fixed cyborgs not getting their names at round start (#38675) return H diff --git a/code/modules/jobs/job_types/silicon.dm b/code/modules/jobs/job_types/silicon.dm index c53e034ddf..86246952f3 100644 --- a/code/modules/jobs/job_types/silicon.dm +++ b/code/modules/jobs/job_types/silicon.dm @@ -85,5 +85,4 @@ Cyborg return H.Robotize(FALSE, latejoin) /datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, mob/M) - if(CONFIG_GET(flag/rename_cyborg)) //name can't be set in robot/New without the client - R.rename_self("cyborg", M.client) + R.rename_self("cyborg", M.client) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 40ec50d67e..6f076509d9 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -232,7 +232,8 @@ if(custom_name) changed_name = custom_name if(changed_name == "" && client) - changed_name = client.prefs.custom_names["cyborg"] + rename_self(src, client) + return //built in camera handled in proc if(!changed_name) changed_name = get_standard_name() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index f1940be0e2..a3786221ff 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -381,8 +381,7 @@ else if(transfer_after) R.key = key - if (CONFIG_GET(flag/rename_cyborg)) - R.rename_self("cyborg") + R.rename_self("cyborg") if(R.mmi) R.mmi.name = "Man-Machine Interface: [real_name]" diff --git a/config/game_options.txt b/config/game_options.txt index 48e2dc5607..73c36990ab 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -16,9 +16,6 @@ REVIVAL_BRAIN_LIFE -1 ## RENAMING ### -## Uncomment to allow cyborgs to rename themselves at roundstart. Has no effect on roboticists renaming cyborgs the normal way. -#RENAME_CYBORG - ## OOC DURING ROUND ### ## Comment this out if you want OOC to be automatically disabled during the round, it will be enabled during the lobby and after the round end results. OOC_DURING_ROUND From 6685bfcc8ba2814a22933b2449cb50d3125644ea Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 24 Jun 2018 15:04:24 -0500 Subject: [PATCH 077/204] Update dbcore.dm --- code/controllers/subsystem/dbcore.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 4692826a9c..dbca802036 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -237,8 +237,6 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table item = list() _db_query = _dm_db_new_query() -<<<<<<< HEAD -======= /datum/DBQuery/Destroy() Close() SSdbcore.active_queries -= src @@ -252,7 +250,6 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table last_activity = activity last_activity_time = world.time ->>>>>>> 1a22d45... [s] Fixes stack overflow (#38592) /datum/DBQuery/proc/warn_execute() . = Execute() if(!.) From 06fe4991897b0e1e951e66f9f4496220baeb744b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:07:16 -0500 Subject: [PATCH 078/204] Automatic changelog generation for PR #7188 [ci skip] --- html/changelogs/AutoChangeLog-pr-7188.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7188.yml diff --git a/html/changelogs/AutoChangeLog-pr-7188.yml b/html/changelogs/AutoChangeLog-pr-7188.yml new file mode 100644 index 0000000000..d27aee5b1b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7188.yml @@ -0,0 +1,8 @@ +author: "JStheguy" +delete-after: True +changes: + - rscadd: "Added the data card reader circuit, a circuit that is able to read data cards, as well as write to them." + - tweak: "Data cards are now longer inexplicably called data disks despite clearly being cards, and can be printed from the \"tools\" section of the integrated circuit printer." + - tweak: "Data cards no longer have a special \"label card\" verb and instead can have their names and descriptions changed with a pen." + - rscadd: "Also, some aesthetically different variants of the data cards, because why not." + - imageadd: "Data cards have new sprites, with support for coloring them via the assembly detailer." From 4c0b6e464288cf561c6aa3ef4c66b930b89b6718 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:07:37 -0500 Subject: [PATCH 079/204] Automatic changelog generation for PR #7189 [ci skip] --- html/changelogs/AutoChangeLog-pr-7189.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7189.yml diff --git a/html/changelogs/AutoChangeLog-pr-7189.yml b/html/changelogs/AutoChangeLog-pr-7189.yml new file mode 100644 index 0000000000..f0718609b9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7189.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Added a pink scarf to vendomats" From 56df9b0ac3b79e75b7ffa43d361a4d6b073e532f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:07:56 -0500 Subject: [PATCH 080/204] Automatic changelog generation for PR #7190 [ci skip] --- html/changelogs/AutoChangeLog-pr-7190.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7190.yml diff --git a/html/changelogs/AutoChangeLog-pr-7190.yml b/html/changelogs/AutoChangeLog-pr-7190.yml new file mode 100644 index 0000000000..ac2f2cf485 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7190.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Players can now ctrl-click the PDA to remove the item in its pen slot" From a3a4ecffbefe3de76e7421a7a8caf43d9ce1386a Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 24 Jun 2018 15:08:37 -0500 Subject: [PATCH 081/204] Update components.dm --- code/__DEFINES/components.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index cade3d1ef3..7c00573089 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -1,10 +1,6 @@ -<<<<<<< HEAD -======= #define SEND_SIGNAL(target, sigtype, arguments...) ( !target.datum_components ? NONE : target._SendSignal(sigtype, list(##arguments)) ) #define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( !SSdcs.comp_lookup[sigtype] ? NONE : SSdcs._SendGlobalSignal(sigtype, list(##arguments)) ) - ->>>>>>> 84a85a5... Merge pull request #38574 from ninjanomnom/glob-signals //shorthand #define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path) #define GET_COMPONENT(varname, path) GET_COMPONENT_FROM(varname, path, src) From 3d393bc8c43580923cdb7d4645e8c6e83e78d3d6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:11:46 -0500 Subject: [PATCH 082/204] Automatic changelog generation for PR #7201 [ci skip] --- html/changelogs/AutoChangeLog-pr-7201.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7201.yml diff --git a/html/changelogs/AutoChangeLog-pr-7201.yml b/html/changelogs/AutoChangeLog-pr-7201.yml new file mode 100644 index 0000000000..562c8e4190 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7201.yml @@ -0,0 +1,5 @@ +author: "Cobby" +delete-after: True +changes: + - rscdel: "Removed Advanced Mining Scanner from roundstart voucher kits." + - rscdel: "Removed Explorer Webbing from all voucher kits besides the shelter capsule pack." From 60b0ac583f44e614e752c4d8c30f0135c2108a37 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:16:54 -0500 Subject: [PATCH 083/204] Automatic changelog generation for PR #7218 [ci skip] --- html/changelogs/AutoChangeLog-pr-7218.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7218.yml diff --git a/html/changelogs/AutoChangeLog-pr-7218.yml b/html/changelogs/AutoChangeLog-pr-7218.yml new file mode 100644 index 0000000000..6bb568d088 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7218.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - spellcheck: "Plant disks with potency genes clarify the percent is for potency scaling and not relative to max volume on examine." From 9f160ef0459c2632d2b4c936e9dd08392fdead78 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:22:03 -0500 Subject: [PATCH 084/204] Automatic changelog generation for PR #7219 [ci skip] --- html/changelogs/AutoChangeLog-pr-7219.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7219.yml diff --git a/html/changelogs/AutoChangeLog-pr-7219.yml b/html/changelogs/AutoChangeLog-pr-7219.yml new file mode 100644 index 0000000000..b50be06a75 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7219.yml @@ -0,0 +1,4 @@ +author: "Dax Dupont" +delete-after: True +changes: + - admin: "Create antags now checks for people being on station before applying." From df31333299080379b30eb718879c4331c65258f9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:32:51 -0500 Subject: [PATCH 085/204] Automatic changelog generation for PR #7220 [ci skip] --- html/changelogs/AutoChangeLog-pr-7220.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7220.yml diff --git a/html/changelogs/AutoChangeLog-pr-7220.yml b/html/changelogs/AutoChangeLog-pr-7220.yml new file mode 100644 index 0000000000..ba87335d1e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7220.yml @@ -0,0 +1,6 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Blast cannons have been fixed and are now available for purchase by traitorous scientists for a low low price of 14TC." + - rscadd: "Blast cannons take the explosive power of a TTV bomb and ejects a linear projectile that will apply what the bomb would do to a certain tile at that distance to that tile. However, this will not cause breaches, or gib mobs, unless the gods (admins) so will it. +experimental: Blast cannons do not respect maxcap. (Unless the admins so will it.)" From e6b56284cef40adb2f92aa84aaa98c7a1fd844e7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 16:37:52 -0500 Subject: [PATCH 086/204] Automatic changelog generation for PR #7222 [ci skip] --- html/changelogs/AutoChangeLog-pr-7222.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7222.yml diff --git a/html/changelogs/AutoChangeLog-pr-7222.yml b/html/changelogs/AutoChangeLog-pr-7222.yml new file mode 100644 index 0000000000..1fb99a2d63 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7222.yml @@ -0,0 +1,4 @@ +author: "Kor" +delete-after: True +changes: + - rscadd: "Bubblegum has regained his original (deadlier) move set." From 7c28a43f7550fca4520c61066cb1f2803d438152 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 16:40:46 -0500 Subject: [PATCH 087/204] Automatic changelog generation for PR #7230 [ci skip] --- html/changelogs/AutoChangeLog-pr-7230.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7230.yml diff --git a/html/changelogs/AutoChangeLog-pr-7230.yml b/html/changelogs/AutoChangeLog-pr-7230.yml new file mode 100644 index 0000000000..b1674293b5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7230.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Cyborgs now drop keys on deconstruction/detonation" From ec5c5d0aecef3842061cac8caaa9848dba9d9478 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 18:11:20 -0500 Subject: [PATCH 088/204] Automatic changelog generation for PR #7231 [ci skip] --- html/changelogs/AutoChangeLog-pr-7231.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7231.yml diff --git a/html/changelogs/AutoChangeLog-pr-7231.yml b/html/changelogs/AutoChangeLog-pr-7231.yml new file mode 100644 index 0000000000..4bd894c04e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7231.yml @@ -0,0 +1,4 @@ +author: "Time-Green" +delete-after: True +changes: + - bugfix: "Soda is no longer intangible to the laws of physics" From 9fb21cc6c684602c8eee2809d838df95820d4cea Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 18:18:17 -0500 Subject: [PATCH 089/204] Automatic changelog generation for PR #7238 [ci skip] --- html/changelogs/AutoChangeLog-pr-7238.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7238.yml diff --git a/html/changelogs/AutoChangeLog-pr-7238.yml b/html/changelogs/AutoChangeLog-pr-7238.yml new file mode 100644 index 0000000000..ea7e40df5f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7238.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "The \"Save Logs\" option in the chat now actually works (IE 10+ only)." From 83ec1f71d3c1264de5223d9de417fdc2d66f0c9d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 18:20:19 -0500 Subject: [PATCH 090/204] Automatic changelog generation for PR #7195 [ci skip] --- html/changelogs/AutoChangeLog-pr-7195.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7195.yml diff --git a/html/changelogs/AutoChangeLog-pr-7195.yml b/html/changelogs/AutoChangeLog-pr-7195.yml new file mode 100644 index 0000000000..2484f15f1f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7195.yml @@ -0,0 +1,4 @@ +author: "ninjanomnom" +delete-after: True +changes: + - rscadd: "A plush that knows too much has found its way to the bus ruin." From d79b85d719593dd92396ce32f01047959bfea6c5 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 24 Jun 2018 18:42:24 -0500 Subject: [PATCH 091/204] trims a few issues during mirror merges --- code/controllers/subsystem/dbcore.dm | 68 +++++++++++++++++++--------- code/datums/components/_component.dm | 2 +- 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 88423e8b6d..34bf57594d 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -1,6 +1,7 @@ SUBSYSTEM_DEF(dbcore) name = "Database" - flags = SS_NO_FIRE + flags = SS_BACKGROUND + wait = 1 MINUTES init_order = INIT_ORDER_DBCORE var/const/FAILED_DB_CONNECTION_CUTOFF = 5 @@ -25,6 +26,8 @@ SUBSYSTEM_DEF(dbcore) var/_db_con// This variable contains a reference to the actual database connection. var/failed_connections = 0 + var/list/active_queries = list() + /datum/controller/subsystem/dbcore/PreInit() if(!_db_con) _db_con = _dm_db_new_con() @@ -40,6 +43,15 @@ SUBSYSTEM_DEF(dbcore) return ..() +/datum/controller/subsystem/dbcore/fire() + for(var/I in active_queries) + var/datum/DBQuery/Q = I + if(world.time - Q.last_activity_time > (5 MINUTES)) + message_admins("Found undeleted query, please check the server logs and notify coders.") + log_sql("Undeleted query: \"[Q.sql]\" LA: [Q.last_activity] LAT: [Q.last_activity_time]") + qdel(Q) + if(MC_TICK_CHECK) + return /datum/controller/subsystem/dbcore/Recover() _db_con = SSdbcore._db_con @@ -49,12 +61,13 @@ SUBSYSTEM_DEF(dbcore) if(SSdbcore.Connect()) var/datum/DBQuery/query_round_shutdown = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET shutdown_datetime = Now(), end_state = '[sanitizeSQL(SSticker.end_state)]' WHERE id = [GLOB.round_id]") query_round_shutdown.Execute() + qdel(query_round_shutdown) if(IsConnected()) Disconnect() //nu /datum/controller/subsystem/dbcore/can_vv_get(var_name) - return var_name != "_db_con" && ..() + return var_name != NAMEOF(src, _db_con) && var_name != NAMEOF(src, active_queries) && ..() /datum/controller/subsystem/dbcore/vv_edit_var(var_name, var_value) if(var_name == "_db_con") @@ -98,33 +111,38 @@ SUBSYSTEM_DEF(dbcore) else schema_mismatch = 2 //flag admin message about no schema version log_sql("Could not get schema version from database") + qdel(query_db_version) else log_sql("Your server failed to establish a connection with the database.") else log_sql("Database is not enabled in configuration.") /datum/controller/subsystem/dbcore/proc/SetRoundID() - if(CONFIG_GET(flag/sql_enabled)) - if(SSdbcore.Connect()) - var/datum/DBQuery/query_round_initialize = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (initialize_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')") - query_round_initialize.Execute() - var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") - query_round_last_id.Execute() - if(query_round_last_id.NextRow()) - GLOB.round_id = query_round_last_id.item[1] + if(!Connect()) + return + var/datum/DBQuery/query_round_initialize = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (initialize_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')") + query_round_initialize.Execute() + qdel(query_round_initialize) + var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") + query_round_last_id.Execute() + if(query_round_last_id.NextRow()) + GLOB.round_id = query_round_last_id.item[1] + qdel(query_round_last_id) /datum/controller/subsystem/dbcore/proc/SetRoundStart() - if(CONFIG_GET(flag/sql_enabled)) - if(SSdbcore.Connect()) - var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET start_datetime = Now() WHERE id = [GLOB.round_id]") - query_round_start.Execute() + if(!Connect()) + return + var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET start_datetime = Now() WHERE id = [GLOB.round_id]") + query_round_start.Execute() + qdel(query_round_start) /datum/controller/subsystem/dbcore/proc/SetRoundEnd() - if(CONFIG_GET(flag/sql_enabled)) - if(SSdbcore.Connect()) - var/sql_station_name = sanitizeSQL(station_name()) - var/datum/DBQuery/query_round_end = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET end_datetime = Now(), game_mode_result = '[sanitizeSQL(SSticker.mode_result)]', station_name = '[sql_station_name]' WHERE id = [GLOB.round_id]") - query_round_end.Execute() + if(!Connect()) + return + var/sql_station_name = sanitizeSQL(station_name()) + var/datum/DBQuery/query_round_end = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET end_datetime = Now(), game_mode_result = '[sanitizeSQL(SSticker.mode_result)]', station_name = '[sql_station_name]' WHERE id = [GLOB.round_id]") + query_round_end.Execute() + qdel(query_round_end) /datum/controller/subsystem/dbcore/proc/Disconnect() failed_connections = 0 @@ -212,9 +230,10 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table sqlrowlist = " [sqlrowlist.Join(",\n ")]" var/datum/DBQuery/Query = NewQuery("INSERT[delayed][ignore_errors] INTO [table]\n([columns.Join(", ")])\nVALUES\n[sqlrowlist]\n[duplicate_key]") if (warn) - return Query.warn_execute() + . = Query.warn_execute() else - return Query.Execute() + . = Query.Execute() + qdel(Query) /datum/DBQuery @@ -223,11 +242,14 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table var/list/columns //list of DB Columns populated by Columns() var/list/conversions var/list/item //list of data values populated by NextRow() - + var/last_activity + var/last_activity_time var/datum/controller/subsystem/dbcore/db_connection var/_db_query /datum/DBQuery/New(sql_query, datum/controller/subsystem/dbcore/connection_handler, cursor_handler) + SSdbcore.active_queries[src] = TRUE + Activity("Created") if(sql_query) sql = sql_query if(connection_handler) @@ -261,6 +283,7 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table sql = new_sql /datum/DBQuery/proc/Execute(sql_query = sql, cursor_handler = default_cursor, log_error = TRUE) + Activity("Execute") var/start_time var/timeout = CONFIG_GET(number/query_debug_log_timeout) if(timeout) @@ -281,6 +304,7 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table message_admins("HEY! A database query may have timed out. Did the server just hang? \[YES\]|\[NO\]") /datum/DBQuery/proc/NextRow() + Activity("NextRow") return _dm_db_next_row(_db_query,item,conversions) /datum/DBQuery/proc/RowsAffected() diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 1769a26d18..a62755eb5f 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -96,7 +96,7 @@ if(sig_type[1] == "!") SSdcs.RegisterSignal(src, sig_type) - + procs[sig_type] = proc_or_callback enabled = TRUE From cdd285f5c75b68d08a7d3679f75b7cc92dd0e856 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 24 Jun 2018 23:30:28 -0500 Subject: [PATCH 092/204] Update job.dm --- code/controllers/subsystem/job.dm | 9 --------- 1 file changed, 9 deletions(-) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 8c7a42e342..7a506acbe5 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -434,16 +434,7 @@ SUBSYSTEM_DEF(job) to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.") if(job && H) -<<<<<<< HEAD - if(job.dresscodecompliant)// CIT CHANGE - dress code compliance - equip_loadout(N, H) // CIT CHANGE - allows players to spawn with loadout items - job.after_spawn(H, M, joined_late) - equip_loadout(N, H, TRUE)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works - - //handle_roundstart_items(H, M.ckey, H.mind.assigned_role, H.mind.special_role) //CIT CHANGE - makes donators spawn with their items. This can safely be commented out when all of the donator items are migrated to the loadout system -======= job.after_spawn(H, M, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not. ->>>>>>> 501fd35... Fixed cyborgs not getting their names at round start (#38675) return H From bae19938619daed102e723472109f8e3c8b8f324 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 25 Jun 2018 06:19:30 -0700 Subject: [PATCH 093/204] Update pipe_dispenser.dm --- code/game/machinery/pipe/pipe_dispenser.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 11d9ee8df5..effdc174b6 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -42,6 +42,8 @@ if(href_list["makepipe"]) if(wait < world.time) var/p_type = text2path(href_list["makepipe"]) + if (!verify_recipe(GLOB.atmos_pipe_recipes, p_type)) + return var/p_dir = text2num(href_list["dir"]) var/obj/item/pipe/P = new (loc, p_type, p_dir) P.setPipingLayer(piping_layer) @@ -66,6 +68,15 @@ else return ..() +/obj/machinery/pipedispenser/proc/verify_recipe(recipes, path) + for(var/category in recipes) + var/list/cat_recipes = recipes[category] + for(var/i in cat_recipes) + var/datum/pipe_info/info = i + if (path == info.id) + return TRUE + return FALSE + /obj/machinery/pipedispenser/wrench_act(mob/living/user, obj/item/I) if(default_unfasten_wrench(user, I, 40)) user << browse(null, "window=pipedispenser") @@ -124,6 +135,8 @@ if(href_list["dmake"]) if(wait < world.time) var/p_type = text2path(href_list["dmake"]) + if (!verify_recipe(GLOB.disposal_pipe_recipes, p_type)) + return var/obj/structure/disposalconstruct/C = new (loc, p_type) if(!C.can_place()) From c97abeaf0956e321017f0135f7c144b8a02ce503 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 25 Jun 2018 10:15:01 -0400 Subject: [PATCH 094/204] Merge pull request #38696 from Tlaltecuhtli/patch-53 fixes a cult message.fixes a cult message. --- code/modules/antagonists/cult/cult_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 5f56e1b91b..7678cdcfb3 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -520,7 +520,7 @@ sleep(20) var/global/list/curses if(!curses) - curses = list("A fuel technician just slit his own throat and begged for death. The shuttle will be delayed by three minutes.", + curses = list("A fuel technician just slit his own throat and begged for death.", "The shuttle's navigation programming was replaced by a file containing just two words: IT COMES.", "The shuttle's custodian was found washing the windows with their own blood.", "A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh.", From 65794501764a5bfb26c4115ab2c80c3f34fbe81c Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 25 Jun 2018 10:14:50 -0400 Subject: [PATCH 096/204] Merge pull request #38697 from DaxDupont/a Improves machine overload logging --- code/modules/antagonists/traitor/equipment/Malf_Modules.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index 4400a3c0dc..f574412b4c 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -555,6 +555,9 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /datum/action/innate/ai/ranged/overload_machine/proc/detonate_machine(obj/machinery/M) if(M && !QDELETED(M)) + var/turf/T = get_turf(M) + message_admins("[ADMIN_LOOKUPFLW(usr)] overloaded [M.name] at [ADMIN_VERBOSEJMP(T)].") + log_game("[key_name(usr)] overloaded [M.name] at [AREACOORD(T)].") explosion(get_turf(M), 0, 2, 3, 0) if(M) //to check if the explosion killed it before we try to delete it qdel(M) From 1c41c364890a98364b4c2d64ec5c80d456cfd4c1 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 25 Jun 2018 10:18:20 -0400 Subject: [PATCH 098/204] Merge pull request #38672 from AutomaticFrenzy/patch/goonchat-motd Fix the MOTD having too many newlines --- code/modules/client/verbs/ooc.dm | 2 +- code/modules/goonchat/browserOutput.dm | 10 ++++++---- code/modules/mob/dead/new_player/login.dm | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index ccf99b5b7e..0bcfac811e 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -233,7 +233,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR) var/motd = global.config.motd if(motd) - to_chat(src, "
[motd]
") + to_chat(src, "
[motd]
", handle_whitespace=FALSE) else to_chat(src, "The Message of the Day has not been set.") diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index be06f99d61..d6e3232baa 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -97,7 +97,8 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic for(var/message in messageQueue) - to_chat(owner, message) + // whitespace has already been handled by the original to_chat + to_chat(owner, message, handle_whitespace=FALSE) messageQueue = null sendClientData() @@ -175,7 +176,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic //Global chat procs -/proc/to_chat(target, message) +/proc/to_chat(target, message, handle_whitespace=TRUE) if(!target) return @@ -201,8 +202,9 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic //Some macros remain in the string even after parsing and fuck up the eventual output message = replacetext(message, "\improper", "") message = replacetext(message, "\proper", "") - message = replacetext(message, "\n", "
") - message = replacetext(message, "\t", "[GLOB.TAB][GLOB.TAB]") + if(handle_whitespace) + message = replacetext(message, "\n", "
") + message = replacetext(message, "\t", "[GLOB.TAB][GLOB.TAB]") for(var/I in targets) //Grab us a client if possible diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index 8a97180588..c93d9e05aa 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -11,7 +11,7 @@ var/motd = global.config.motd if(motd) - to_chat(src, "
[motd]
") + to_chat(src, "
[motd]
", handle_whitespace=FALSE) if(GLOB.admin_notice) to_chat(src, "Admin Notice:\n \t [GLOB.admin_notice]") From 888b04427c0785da5530a204f9c127c053a54ea6 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 25 Jun 2018 10:17:59 -0400 Subject: [PATCH 100/204] Merge pull request #38683 from AnturK/anomalyfix Fixes anomaly area selection. --- code/__HELPERS/_lists.dm | 5 +++++ code/controllers/subsystem/events.dm | 19 ----------------- code/modules/events/anomaly.dm | 32 +++++++++++++++++++++------- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index cf8a9df119..54dd2a982c 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -488,6 +488,11 @@ for(var/key in key_list) . |= key_list[key] +/proc/make_associative(list/flat_list) + . = list() + for(var/thing in flat_list) + .[thing] = TRUE + //Picks from the list, with some safeties, and returns the "default" arg if it fails #define DEFAULTPICK(L, default) ((islist(L) && length(L)) ? pick(L) : default) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index e70fd1cd7d..ffc934c061 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -93,25 +93,6 @@ SUBSYSTEM_DEF(events) else if(. == EVENT_READY) E.runEvent(TRUE) -/datum/round_event/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in! - var/list/safe_areas = list( - /area/ai_monitored/turret_protected/ai, - /area/ai_monitored/turret_protected/ai_upload, - /area/engine, - /area/solar, - /area/holodeck, - /area/shuttle - ) - - //These are needed because /area/engine has to be removed from the list, but we still want these areas to get fucked up. - var/list/danger_areas = list( - /area/engine/break_room, - /area/crew_quarters/heads/chief) - - //Need to locate() as it's just a list of paths. - return locate(pick((GLOB.the_station_areas - safe_areas) + danger_areas)) in GLOB.sortedAreas - - //allows a client to trigger an event //aka Badmin Central // > Not in modules/admin diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index c866dcca0f..bb1df49ca5 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -12,17 +12,33 @@ announceWhen = 1 -/datum/round_event/anomaly/setup(loop=0) - var/safety_loop = loop + 1 - if(safety_loop > 50) - kill() - end() +/datum/round_event/anomaly/proc/findEventArea() + var/static/list/allowed_areas + if(!allowed_areas) + //Places that shouldn't explode + var/list/safe_area_types = typecacheof(list( + /area/ai_monitored/turret_protected/ai, + /area/ai_monitored/turret_protected/ai_upload, + /area/engine, + /area/solar, + /area/holodeck, + /area/shuttle) + ) + + //Subtypes from the above that actually should explode. + var/list/unsafe_area_subtypes = typecacheof(list(/area/engine/break_room)) + + allowed_areas = make_associative(GLOB.the_station_areas) - safe_area_types + unsafe_area_subtypes + + return safepick(typecache_filter_list(GLOB.sortedAreas,allowed_areas)) + +/datum/round_event/anomaly/setup() impact_area = findEventArea() if(!impact_area) - setup(safety_loop) + CRASH("No valid areas for anomaly found.") var/list/turf_test = get_area_turfs(impact_area) if(!turf_test.len) - setup(safety_loop) + CRASH("Anomaly : No valid turfs found for [impact_area] - [impact_area.type]") /datum/round_event/anomaly/announce(fake) priority_announce("Localized energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert") @@ -30,4 +46,4 @@ /datum/round_event/anomaly/start() var/turf/T = safepick(get_area_turfs(impact_area)) if(T) - newAnomaly = new /obj/effect/anomaly/flux(T) + newAnomaly = new /obj/effect/anomaly/flux(T) \ No newline at end of file From 4baee89615a77f73b65a975b0b2f6e81e1d8598d Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 25 Jun 2018 10:19:19 -0400 Subject: [PATCH 102/204] Merge pull request #38699 from Irafas/HardsuitEyeFix Hardsuit helmets protect eyes from pepperspray --- code/modules/reagents/chemistry/reagents/food_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index ba5703cbfb..4de87fabc6 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -283,10 +283,10 @@ if(ishuman(victim)) var/mob/living/carbon/human/H = victim if( H.head ) - if ( H.head.flags_cover & MASKCOVERSEYES ) + if ( H.head.flags_cover & HEADCOVERSEYES ) eyes_covered = 1 safe_thing = H.head - if ( H.head.flags_cover & MASKCOVERSMOUTH ) + if ( H.head.flags_cover & HEADCOVERSMOUTH ) mouth_covered = 1 safe_thing = H.head if(H.glasses) From ac300966f5fb5d855d00b04b866622b96289a666 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 25 Jun 2018 11:34:11 -0400 Subject: [PATCH 104/204] Merge pull request #38702 from vuonojenmustaturska/cleanup Remove unused and probably misbehaving admin human manifest spawner --- code/game/objects/effects/manifest.dm | 18 ------------------ tgstation.dme | 1 - 2 files changed, 19 deletions(-) delete mode 100644 code/game/objects/effects/manifest.dm diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm deleted file mode 100644 index fbf403a765..0000000000 --- a/code/game/objects/effects/manifest.dm +++ /dev/null @@ -1,18 +0,0 @@ -/obj/effect/manifest - name = "manifest" - icon = 'icons/mob/screen_gen.dmi' - icon_state = "x" - -/obj/effect/manifest/Initialize() - . = ..() - invisibility = INVISIBILITY_ABSTRACT - -/obj/effect/manifest/proc/manifest() - var/dat = "Crew Manifest:
" - for(var/mob/living/carbon/human/M in GLOB.carbon_list) - dat += text(" [] - []
", M.name, M.get_assignment()) - var/obj/item/paper/P = new /obj/item/paper( src.loc ) - P.info = dat - P.name = "paper- 'Crew Manifest'" - //SN src = null - qdel(src) diff --git a/tgstation.dme b/tgstation.dme index 115fe25b8d..9b751e9ff6 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -691,7 +691,6 @@ #include "code\game\objects\effects\forcefields.dm" #include "code\game\objects\effects\glowshroom.dm" #include "code\game\objects\effects\landmarks.dm" -#include "code\game\objects\effects\manifest.dm" #include "code\game\objects\effects\mines.dm" #include "code\game\objects\effects\misc.dm" #include "code\game\objects\effects\overlays.dm" From c86a8ce23ee312529554995d10d17c1a8c74c911 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 25 Jun 2018 15:11:49 -0400 Subject: [PATCH 106/204] Merge pull request #38709 from AutomaticFrenzy/patch/export-mechs Fix being unable to export mechs --- code/modules/shuttle/supply.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index f42f7bfc9c..773b35544c 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -124,7 +124,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( continue if(bounty_ship_item_and_contents(AM, dry_run = FALSE)) matched_bounty = TRUE - if(!AM.anchored) + if(!AM.anchored || istype(AM, /obj/mecha)) sold_atoms += export_item_and_contents(AM, contraband, emagged, dry_run = FALSE) if(sold_atoms) From 463945ec76b3cc4046109082b2dc1d14c9c07b2e Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 25 Jun 2018 15:11:28 -0400 Subject: [PATCH 108/204] Merge pull request #38708 from AutomaticFrenzy/patch/energy-gun Fix runtimes when energy guns are deleted --- code/modules/projectiles/guns/energy.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 2a352932fa..be25a13734 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -130,6 +130,8 @@ return /obj/item/gun/energy/update_icon(force_update) + if(QDELETED(src)) + return ..() if(!automatic_charge_overlays) return From e24443844371c4b7cf46c4f040f8835159db7116 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 25 Jun 2018 20:21:17 -0500 Subject: [PATCH 110/204] [MIRROR] Prevents tourettes from stacking (#7253) * fixes tourettes being cancer (#38682) Prevents tourettes from stacking * Prevents tourettes from stacking --- code/datums/mutations/body.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index f0da9b125f..485b7aa26d 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -101,7 +101,7 @@ text_gain_indication = "You twitch." /datum/mutation/human/tourettes/on_life(mob/living/carbon/human/owner) - if(prob(10) && owner.stat == CONSCIOUS) + if(prob(10) && owner.stat == CONSCIOUS && !owner.IsStun()) owner.Stun(200) switch(rand(1, 3)) if(1) From 6b42e20e2abdb74ab3ef570f5f5c7fd826b9f320 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 25 Jun 2018 20:21:23 -0500 Subject: [PATCH 111/204] Automatic changelog generation for PR #7253 [ci skip] --- html/changelogs/AutoChangeLog-pr-7253.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7253.yml diff --git a/html/changelogs/AutoChangeLog-pr-7253.yml b/html/changelogs/AutoChangeLog-pr-7253.yml new file mode 100644 index 0000000000..153cb9131e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7253.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "tourettes doesnt stack on itself anymore" From a14bc0615d9cbeb90b7a69d670b7221d7246ea68 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 25 Jun 2018 21:22:58 -0400 Subject: [PATCH 112/204] Merge pull request #38644 from AutomaticFrenzy/patch/cameranet Port AI static to vis_contents --- code/game/objects/items/devices/multitool.dm | 24 +++--- .../simulated/floor/plating/misc_plating.dm | 5 +- code/game/turfs/simulated/minerals.dm | 5 +- code/game/turfs/turf.dm | 13 +++- .../living/silicon/ai/freelook/cameranet.dm | 77 +++++++++---------- .../mob/living/silicon/ai/freelook/chunk.dm | 57 ++------------ .../mob/living/silicon/ai/freelook/eye.dm | 4 +- .../modules/mob/living/silicon/ai/multicam.dm | 4 - 8 files changed, 74 insertions(+), 115 deletions(-) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index a059c06284..e11cebdf51 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -129,18 +129,18 @@ detect_state = PROXIMITY_ON_SCREEN break - if(!detect_state && GLOB.cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z)) - var/datum/camerachunk/chunk = GLOB.cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z) - if(chunk) - if(chunk.seenby.len) - for(var/mob/camera/aiEye/A in chunk.seenby) - var/turf/detect_turf = get_turf(A) - if(get_dist(our_turf, detect_turf) < rangealert) - detect_state = PROXIMITY_ON_SCREEN - break - if(get_dist(our_turf, detect_turf) < rangewarning) - detect_state = PROXIMITY_NEAR - break + if(detect_state) + return + var/datum/camerachunk/chunk = GLOB.cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z) + if(chunk && chunk.seenby.len) + for(var/mob/camera/aiEye/A in chunk.seenby) + var/turf/detect_turf = get_turf(A) + if(get_dist(our_turf, detect_turf) < rangealert) + detect_state = PROXIMITY_ON_SCREEN + break + if(get_dist(our_turf, detect_turf) < rangewarning) + detect_state = PROXIMITY_NEAR + break /obj/item/multitool/cyborg name = "multitool" diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index 6d4a949c75..3c4c8d9f85 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -47,8 +47,9 @@ /turf/open/floor/plating/ashplanet/Initialize() if(smooth) - pixel_y = -4 - pixel_x = -4 + var/matrix/M = new + M.Translate(-4, -4) + transform = M icon = smooth_icon . = ..() diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 8c907573d8..6123bf25e6 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -27,8 +27,9 @@ /turf/closed/mineral/Initialize() if (!canSmoothWith) canSmoothWith = list(/turf/closed/mineral, /turf/closed/indestructible) - pixel_y = -4 - pixel_x = -4 + var/matrix/M = new + M.Translate(-4, -4) + transform = M icon = smooth_icon . = ..() if (mineralType && mineralAmt && spread && spreadChance) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 9cc2d67020..987689cb9a 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -19,8 +19,6 @@ flags_1 = CAN_BE_DIRTY_1 - var/image/obscured //camerachunks - var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes var/explosion_level = 0 //for preventing explosion dodging @@ -44,6 +42,9 @@ stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 + // by default, vis_contents is inherited from the turf that was here before + vis_contents.Cut() + assemble_baseturfs() levelupdate() @@ -325,6 +326,14 @@ /turf/proc/visibilityChanged() GLOB.cameranet.updateVisibility(src) + // The cameranet usually handles this for us, but if we've just been + // recreated we should make sure we have the cameranet vis_contents. + var/datum/camerachunk/C = GLOB.cameranet.chunkGenerated(x, y, z) + if(C) + if(C.obscuredTurfs[src]) + vis_contents += GLOB.cameranet.vis_contents + else + vis_contents -= GLOB.cameranet.vis_contents /turf/proc/burn_tile() diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 5cc08ff1e0..36ae19b478 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -18,12 +18,21 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) // The object used for the clickable stat() button. var/obj/effect/statclick/statclick + // The object used in vis_contents of obscured turfs + var/vis_contents + // The image given to the effect in vis_contents on AI clients + var/image/obscured + +/datum/cameranet/New() + vis_contents = new /obj/effect/overlay/camera_static() + obscured = new('icons/effects/cameravis.dmi', vis_contents, null, BYOND_LIGHTING_LAYER + 0.1) + obscured.plane = BYOND_LIGHTING_PLANE + 1 + // Checks if a chunk has been Generated in x, y, z. /datum/cameranet/proc/chunkGenerated(x, y, z) x &= ~(CHUNK_SIZE - 1) y &= ~(CHUNK_SIZE - 1) - var/key = "[x],[y],[z]" - return (chunks[key]) + return chunks["[x],[y],[z]"] // Returns the chunk in the x, y, z. // If there is no chunk, it creates a new chunk and returns that. @@ -31,10 +40,9 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) x &= ~(CHUNK_SIZE - 1) y &= ~(CHUNK_SIZE - 1) var/key = "[x],[y],[z]" - if(!chunks[key]) - chunks[key] = new /datum/camerachunk(null, x, y, z) - - return chunks[key] + . = chunks[key] + if(!.) + chunks[key] = . = new /datum/camerachunk(x, y, z) // Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. @@ -46,14 +54,8 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) else other_eyes = list() - var/list/chunks_pre_seen = list() - var/list/chunks_post_seen = list() - for(var/V in moved_eyes) var/mob/camera/aiEye/eye = V - if(C) - chunks_pre_seen |= eye.visibleCameraChunks - // 0xf = 15 var/static_range = eye.static_visibility_range var/x1 = max(0, eye.x - static_range) & ~(CHUNK_SIZE - 1) var/y1 = max(0, eye.y - static_range) & ~(CHUNK_SIZE - 1) @@ -71,44 +73,26 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/chunk in remove) var/datum/camerachunk/c = chunk - c.remove(eye, FALSE) + c.remove(eye) for(var/chunk in add) var/datum/camerachunk/c = chunk - c.add(eye, FALSE) - - if(C) - chunks_post_seen |= eye.visibleCameraChunks + c.add(eye) if(C) - for(var/V in other_eyes) - var/mob/camera/aiEye/eye = V - chunks_post_seen |= eye.visibleCameraChunks - - var/list/remove = chunks_pre_seen - chunks_post_seen - var/list/add = chunks_post_seen - chunks_pre_seen - - for(var/chunk in remove) - var/datum/camerachunk/c = chunk - C.images -= c.obscured - - for(var/chunk in add) - var/datum/camerachunk/c = chunk - C.images += c.obscured + C.images += obscured // Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. /datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) - if(!SSticker || (opacity_check && !A.opacity)) return majorChunkChange(A, 2) /datum/cameranet/proc/updateChunk(x, y, z) - // 0xf = 15 - if(!chunkGenerated(x, y, z)) + var/datum/camerachunk/chunk = chunkGenerated(x, y, z) + if (!chunk) return - var/datum/camerachunk/chunk = getCameraChunk(x, y, z) chunk.hasChanged() // Removes a camera from a chunk. @@ -135,7 +119,6 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) // If you want to update the chunks around an object, without adding/removing a camera, use choice 2. /datum/cameranet/proc/majorChunkChange(atom/c, choice) - // 0xf = 15 if(!c) return @@ -147,8 +130,8 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) - if(chunkGenerated(x, y, T.z)) - var/datum/camerachunk/chunk = getCameraChunk(x, y, T.z) + var/datum/camerachunk/chunk = chunkGenerated(x, y, T.z) + if(chunk) if(choice == 0) // Remove the camera. chunk.cameras -= c @@ -160,14 +143,12 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) // Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) - - // 0xf = 15 var/turf/position = get_turf(target) return checkTurfVis(position) /datum/cameranet/proc/checkTurfVis(turf/position) - var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) + var/datum/camerachunk/chunk = chunkGenerated(position.x, position.y, position.z) if(chunk) if(chunk.changed) chunk.hasChanged(1) // Update now, no matter if it's visible or not. @@ -180,3 +161,17 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) stat(name, statclick.update("Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]")) + +/obj/effect/overlay/camera_static + name = "static" + icon = null + icon_state = null + anchored = TRUE // should only appear in vis_contents, but to be safe + appearance_flags = RESET_TRANSFORM | TILE_BOUND + // this combination makes the static block clicks to everything below it, + // without appearing in the right-click menu for non-AI clients + mouse_opacity = MOUSE_OPACITY_ICON + invisibility = INVISIBILITY_ABSTRACT + + layer = BYOND_LIGHTING_LAYER + 0.1 + plane = BYOND_LIGHTING_PLANE + 1 diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index e03bba3067..9a84616fbf 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -8,11 +8,9 @@ /datum/camerachunk var/list/obscuredTurfs = list() var/list/visibleTurfs = list() - var/list/obscured = list() var/list/cameras = list() var/list/turfs = list() var/list/seenby = list() - var/visible = FALSE var/changed = 0 var/x = 0 var/y = 0 @@ -20,28 +18,17 @@ // Add an AI eye to the chunk, then update if changed. -/datum/camerachunk/proc/add(mob/camera/aiEye/eye, add_images = TRUE) - if(add_images) - var/client/client = eye.GetViewerClient() - if(client) - client.images += obscured +/datum/camerachunk/proc/add(mob/camera/aiEye/eye) eye.visibleCameraChunks += src - visible++ seenby += eye if(changed) update() // Remove an AI eye from the chunk, then update if changed. -/datum/camerachunk/proc/remove(mob/camera/aiEye/eye, remove_images = TRUE) - if(remove_images) - var/client/client = eye.GetViewerClient() - if(client) - client.images -= obscured +/datum/camerachunk/proc/remove(mob/camera/aiEye/eye) eye.visibleCameraChunks -= src seenby -= eye - if(visible > 0) - visible-- // Called when a chunk has changed. I.E: A wall was deleted. @@ -54,7 +41,7 @@ // instead be flagged to update the next time an AI Eye moves near it. /datum/camerachunk/proc/hasChanged(update_now = 0) - if(visible || update_now) + if(seenby.len || update_now) addtimer(CALLBACK(src, .proc/update), UPDATE_BUFFER, TIMER_UNIQUE) else changed = 1 @@ -94,41 +81,18 @@ for(var/turf in visAdded) var/turf/t = turf - if(t.obscured) - obscured -= t.obscured - for(var/eye in seenby) - var/mob/camera/aiEye/m = eye - if(!m) - continue - var/client/client = m.GetViewerClient() - if(client) - client.images -= t.obscured + t.vis_contents -= GLOB.cameranet.vis_contents for(var/turf in visRemoved) var/turf/t = turf - if(obscuredTurfs[t]) - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, null, BYOND_LIGHTING_LAYER+0.1) - t.obscured.pixel_x = -t.pixel_x - t.obscured.pixel_y = -t.pixel_y - t.obscured.plane = BYOND_LIGHTING_PLANE+0.1 - obscured += t.obscured - for(var/eye in seenby) - var/mob/camera/aiEye/m = eye - if(!m) - seenby -= m - continue - var/client/client = m.GetViewerClient() - if(client) - client.images += t.obscured + if(obscuredTurfs[t] && !istype(t, /turf/open/ai_visible)) + t.vis_contents += GLOB.cameranet.vis_contents changed = 0 // Create a new camera chunk, since the chunks are made as they are needed. -/datum/camerachunk/New(loc, x, y, z) - - // 0xf = 15 +/datum/camerachunk/New(x, y, z) x &= ~(CHUNK_SIZE - 1) y &= ~(CHUNK_SIZE - 1) @@ -164,12 +128,7 @@ for(var/turf in obscuredTurfs) var/turf/t = turf - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, null, BYOND_LIGHTING_LAYER+0.1) - t.obscured.pixel_x = -t.pixel_x - t.obscured.pixel_y = -t.pixel_y - t.obscured.plane = BYOND_LIGHTING_PLANE+0.1 - obscured += t.obscured + t.vis_contents += GLOB.cameranet.vis_contents #undef UPDATE_BUFFER #undef CHUNK_SIZE diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 469639d58f..41c2902c73 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -50,9 +50,7 @@ /mob/camera/aiEye/proc/RemoveImages() var/client/C = GetViewerClient() if(C && use_static) - for(var/V in visibleCameraChunks) - var/datum/camerachunk/c = V - C.images -= c.obscured + C.images -= GLOB.cameranet.obscured /mob/camera/aiEye/Destroy() if(ai) diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index b6f3724fcf..d77e7f8a40 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -88,10 +88,6 @@ icon_state = "room_background" flags_1 = NOJAUNT_1 -/turf/open/ai_visible/Initialize() - . = ..() - obscured = image(null, src, null) - /area/ai_multicam_room name = "ai_multicam_room" icon_state = "ai_camera_room" From e61e93bd27f378d31642390f708710fec4f4df5d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 26 Jun 2018 13:04:17 -0500 Subject: [PATCH 114/204] Automatic changelog generation for PR #7078 [ci skip] --- html/changelogs/AutoChangeLog-pr-7078.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7078.yml diff --git a/html/changelogs/AutoChangeLog-pr-7078.yml b/html/changelogs/AutoChangeLog-pr-7078.yml new file mode 100644 index 0000000000..03b49a795d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7078.yml @@ -0,0 +1,5 @@ +author: "Toriate" +delete-after: True +changes: + - rscadd: "Gives the flak helmet a tiny storage compartment" + - balance: "Made the flak helmet even weaker against acid and fire so it crumbles into dust easier" From 4a3bcaf37a65eba600c25ff3062e9163360cdf00 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 26 Jun 2018 13:06:36 -0500 Subject: [PATCH 115/204] Automatic changelog generation for PR #7110 [ci skip] --- html/changelogs/AutoChangeLog-pr-7110.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7110.yml diff --git a/html/changelogs/AutoChangeLog-pr-7110.yml b/html/changelogs/AutoChangeLog-pr-7110.yml new file mode 100644 index 0000000000..f91aa7fe01 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7110.yml @@ -0,0 +1,5 @@ +author: "Toriate" +delete-after: True +changes: + - rscadd: "Added the Corporate Uniform and the Silver Bike Horn" + - imageadd: "added sprites for the Corporate Uniform and Silver Bike Horn" From 0029919b8016ecc0886b088bf6e87738c246ce71 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 26 Jun 2018 13:08:28 -0500 Subject: [PATCH 116/204] Automatic changelog generation for PR #7228 [ci skip] --- html/changelogs/AutoChangeLog-pr-7228.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7228.yml diff --git a/html/changelogs/AutoChangeLog-pr-7228.yml b/html/changelogs/AutoChangeLog-pr-7228.yml new file mode 100644 index 0000000000..fd95cb055c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7228.yml @@ -0,0 +1,4 @@ +author: "Improvedname" +delete-after: True +changes: + - rscadd: "Adds rubbershot secrifle shots" From 83a400366000188f9ab94367ccf07989b98e3342 Mon Sep 17 00:00:00 2001 From: Tad Hardesty Date: Tue, 26 Jun 2018 13:26:33 -0700 Subject: [PATCH 117/204] Move throwforce up to atom/movable (#38689) --- code/game/atoms_movable.dm | 1 + code/game/objects/obj_defense.dm | 8 +------- code/game/objects/objs.dm | 1 - code/modules/mob/mob_defines.dm | 1 + 4 files changed, 3 insertions(+), 8 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index b13c414f78..e1493df15b 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -29,6 +29,7 @@ var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc. var/atom/movable/pulling var/grab_state = 0 + var/throwforce = 0 /atom/movable/vv_edit_var(var_name, var_value) var/static/list/banned_edits = list("step_x", "step_y", "step_size") diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 87de25827d..5ce461b5ad 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -48,13 +48,7 @@ /obj/hitby(atom/movable/AM) ..() - var/tforce = 0 - if(ismob(AM)) - tforce = 10 - else if(isobj(AM)) - var/obj/O = AM - tforce = O.throwforce - take_damage(tforce, BRUTE, "melee", 1, get_dir(src, AM)) + take_damage(AM.throwforce, BRUTE, "melee", 1, get_dir(src, AM)) /obj/ex_act(severity, target) if(resistance_flags & INDESTRUCTIBLE) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 664cdbf383..bd08fb6719 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -2,7 +2,6 @@ /obj var/crit_fail = FALSE animate_movement = 2 - var/throwforce = 0 var/obj_flags = CAN_BE_HIT var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 4cb9723dbd..3dff46ec84 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -7,6 +7,7 @@ hud_possible = list(ANTAG_HUD) pressure_resistance = 8 mouse_drag_pointer = MOUSE_ACTIVE_POINTER + throwforce = 10 var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE var/datum/mind/mind var/list/datum/action/actions = list() From feb01437d69210a857c7e2c5b73d5ba3c7333f89 Mon Sep 17 00:00:00 2001 From: Irafas Date: Tue, 26 Jun 2018 21:33:28 +0100 Subject: [PATCH 119/204] Prevents reagents being transferred to a bucket while its worn on a head (#38727) * Fixed bucket hat bug Stopped the user from pouring reagents into a bucket while worn as a hat. Does so by changing the bucket to not have a container type until its removed * Should work * Works better * ExcessiveUseOfCobblestone is right, this better * As per recommendation --- code/modules/reagents/reagent_containers/glass.dm | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 3a64da8f04..596973a2c4 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -286,10 +286,16 @@ /obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot) ..() - if(slot == SLOT_HEAD && reagents.total_volume) - to_chat(user, "[src]'s contents spill all over you!") - reagents.reaction(user, TOUCH) - reagents.clear_reagents() + if (slot == SLOT_HEAD) + if(reagents.total_volume) + to_chat(user, "[src]'s contents spill all over you!") + reagents.reaction(user, TOUCH) + reagents.clear_reagents() + container_type = NONE + +/obj/item/reagent_containers/glass/bucket/dropped(mob/user) + . = ..() + container_type = initial(container_type) /obj/item/reagent_containers/glass/bucket/equip_to_best_slot(var/mob/M) if(reagents.total_volume) //If there is water in a bucket, don't quick equip it to the head From ef851d5744d5214a14ddae362144d4d5b64c82c2 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 26 Jun 2018 13:42:29 -0700 Subject: [PATCH 121/204] Destructive analyzers can now destroy anything again, even if it has no materials (#38690) * Update rdconsole.dm * Update destructive_analyzer.dm --- code/modules/research/destructive_analyzer.dm | 7 ++++++- code/modules/research/rdconsole.dm | 6 +++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index d39b942807..37a83eb04f 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -130,7 +130,12 @@ Note: Must be placed within 3 tiles of the R&D Console var/list/point_value = techweb_item_point_check(loaded_item) if(linked_console.stored_research.deconstructed_items[loaded_item.type]) point_value = list() - var/choice = input("Are you sure you want to destroy [loaded_item] for [length(point_value) ? "[json_encode(point_value)] points" : "material reclamation"]?") in list("Proceed", "Cancel") + var/user_mode_string = "" + if(length(point_value)) + user_mode_string = " for [json_encode(point_value)] points" + else if(loaded_item.materials.len) + user_mode_string = " for material reclamation" + var/choice = input("Are you sure you want to destroy [loaded_item][user_mode_string]?") in list("Proceed", "Cancel") if(choice == "Cancel") return FALSE if(QDELETED(loaded_item) || QDELETED(linked_console) || !user.Adjacent(linked_console) || QDELETED(src)) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index eb4c3b69a4..0ba9312314 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -594,9 +594,9 @@ Nothing else in the console has ID requirements. l += "This item is worth:
[techweb_point_display_generic(point_values)]!" l += "[RDSCREEN_NOBREAK]" - var/list/materials = linked_destroy.loaded_item.materials - if (materials.len) - l += "
Material Reclamation" + if(!(linked_destroy.loaded_item.resistance_flags & INDESTRUCTIBLE)) + var/list/materials = linked_destroy.loaded_item.materials + l += "
[materials.len? "Material Reclamation" : "Destroy Item"]" for (var/M in materials) l += "* [CallMaterialName(M)] x [materials[M]]" l += "
[RDSCREEN_NOBREAK]" From 673ad79a32bc9f48bd86dfc8fcb165e76786eec7 Mon Sep 17 00:00:00 2001 From: zxaber <37497534+zxaber@users.noreply.github.com> Date: Tue, 26 Jun 2018 13:54:10 -0700 Subject: [PATCH 123/204] [Ready]Expands the list of borg-wearable hats (#38646) * Adds the ability to deconstruct empty cyborg shells. * Update robot_parts.dm * Update robot.dm * Update robot.dm * Update robot.dm * Update robot_defense.dm * Update _masks.dm * Update robot_parts.dm * Update robot_defense.dm * replaced type with istype * Reverting masks.dm * Removing special snowflake bandana check. * Update robot_defense.dm * Added Captain's Crown By player request. --- code/modules/mob/living/silicon/robot/robot.dm | 11 ++++++++++- .../modules/mob/living/silicon/robot/robot_defense.dm | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index a469bf5258..2173910c26 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -90,7 +90,16 @@ /obj/item/clothing/head/wizard, /obj/item/clothing/head/nursehat, /obj/item/clothing/head/sombrero, - /obj/item/clothing/head/helmet/chaplain/witchunter_hat) + /obj/item/clothing/head/helmet/chaplain/witchunter_hat, + /obj/item/clothing/head/soft/, //All baseball caps + /obj/item/clothing/head/that, //top hat + /obj/item/clothing/head/collectable/tophat, //Not sure where this one is found, but it looks the same so might as well include + /obj/item/clothing/mask/bandana/, //All bandanas (which only work in hat mode) + /obj/item/clothing/head/fedora, + /obj/item/clothing/head/beanie/, //All beanies + /obj/item/clothing/ears/headphones, + /obj/item/clothing/head/helmet/skull, + /obj/item/clothing/head/crown/fancy) can_buckle = TRUE buckle_lying = FALSE diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 0356c934ff..0a56ea2425 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -1,5 +1,8 @@ /mob/living/silicon/robot/attackby(obj/item/I, mob/living/user) if(hat_offset != INFINITY && user.a_intent == INTENT_HELP && is_type_in_typecache(I, equippable_hats)) + if(!(I.slot_flags & ITEM_SLOT_HEAD)) + to_chat(user, "You can't quite fit [I] onto [src]'s head.") + return to_chat(user, "You begin to place [I] on [src]'s head...") to_chat(src, "[user] is placing [I] on your head...") if(do_after(user, 30, target = src)) From 4bbb592e12e37c53288e40de381c5223a43b11c1 Mon Sep 17 00:00:00 2001 From: Nich Date: Wed, 27 Jun 2018 00:02:35 +0200 Subject: [PATCH 125/204] Fixes IAA AI destroy objectives (#38745) --- code/modules/antagonists/traitor/IAA/internal_affairs.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm index f26658e4af..e17d1a23b4 100644 --- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm +++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm @@ -207,6 +207,7 @@ destroy_objective.owner = owner destroy_objective.target = target_mind destroy_objective.update_explanation_text() + add_objective(destroy_objective) else var/datum/objective/assassinate/internal/kill_objective = new kill_objective.owner = owner From 2f77e5894cd28df0ab9254a7684fc87ad5db99bd Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 26 Jun 2018 16:39:22 -0700 Subject: [PATCH 127/204] Update research.dm --- code/controllers/subsystem/research.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 458c0ad5ce..74afa05f5e 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -22,7 +22,7 @@ SUBSYSTEM_DEF(research) var/list/errored_datums = list() var/list/point_types = list() //typecache style type = TRUE list //---------------------------------------------- - var/list/single_server_income = list(TECHWEB_POINT_TYPE_GENERIC = 49) + var/list/single_server_income = list(TECHWEB_POINT_TYPE_GENERIC = 20) //citadel edit - techwebs nerf var/multiserver_calculation = FALSE var/last_income = 0 From df68eb864afc8c1b672b2e7b2ceb97569f989997 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 26 Jun 2018 17:39:59 -0700 Subject: [PATCH 128/204] Update ratvar_the_clockwork_justicar.dm --- .../clock_structures/ratvar_the_clockwork_justicar.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm index 9fbcdfd223..0e41b99d93 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -29,7 +29,8 @@ sound_to_playing_players('sound/effects/ratvar_reveal.ogg') var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/clockwork_effects.dmi', "ratvar_alert") notify_ghosts("The Justiciar's light calls to you! Reach out to Ratvar in [get_area_name(src)] to be granted a shell to spread his glory!", null, source = src, alert_overlay = alert_overlay) - INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 10, null, FALSE, 0) + if(!admin_spawned) //citadel edit - hugbox + INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 10, null, FALSE, 0) /obj/structure/destructible/clockwork/massive/ratvar/Destroy() GLOB.ratvar_awakens-- From 8975695b54948397b1045868a817ca5b3ea94b8a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 26 Jun 2018 17:43:19 -0700 Subject: [PATCH 129/204] Update ratvar_the_clockwork_justicar.dm --- .../clock_structures/ratvar_the_clockwork_justicar.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm index 0e41b99d93..b8b5c90dd8 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -17,7 +17,7 @@ var/convert_range = 10 obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION -/obj/structure/destructible/clockwork/massive/ratvar/Initialize() +/obj/structure/destructible/clockwork/massive/ratvar/Initialize(mapload, is_from_gateway = FALSE) . = ..() GLOB.ratvar_awakens++ for(var/obj/O in GLOB.all_clockwork_objects) @@ -29,7 +29,7 @@ sound_to_playing_players('sound/effects/ratvar_reveal.ogg') var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/clockwork_effects.dmi', "ratvar_alert") notify_ghosts("The Justiciar's light calls to you! Reach out to Ratvar in [get_area_name(src)] to be granted a shell to spread his glory!", null, source = src, alert_overlay = alert_overlay) - if(!admin_spawned) //citadel edit - hugbox + if(is_from_gateway) //citadel edit - hugbox INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 10, null, FALSE, 0) /obj/structure/destructible/clockwork/massive/ratvar/Destroy() From 4bddef70e22cf7f2cc3dfe505b8b8bcbac9c5c76 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 26 Jun 2018 17:43:52 -0700 Subject: [PATCH 130/204] Update ark_of_the_clockwork_justicar.dm --- .../clockcult/clock_structures/ark_of_the_clockwork_justicar.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm index 2b1d9d5f02..186cfb485a 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -335,7 +335,7 @@ sleep(3) GLOB.clockwork_gateway_activated = TRUE var/turf/T = SSmapping.get_station_center() - new /obj/structure/destructible/clockwork/massive/ratvar(T) + new /obj/structure/destructible/clockwork/massive/ratvar(T, TRUE) SSticker.force_ending = TRUE var/x0 = T.x var/y0 = T.y From 8c71bbe36b13e4a42cee826b7f199a1ed3a25af8 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 26 Jun 2018 17:44:11 -0700 Subject: [PATCH 131/204] Update ark_of_the_clockwork_justicar.dm --- .../clockcult/clock_structures/ark_of_the_clockwork_justicar.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm index 186cfb485a..35a6c34aaf 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -335,7 +335,7 @@ sleep(3) GLOB.clockwork_gateway_activated = TRUE var/turf/T = SSmapping.get_station_center() - new /obj/structure/destructible/clockwork/massive/ratvar(T, TRUE) + new /obj/structure/destructible/clockwork/massive/ratvar(T, TRUE) //Citadel edit - hugboxes ratvar spawning by admins SSticker.force_ending = TRUE var/x0 = T.x var/y0 = T.y From f244ec31a0efbe5728d7bdab5e57b172bd9a3b82 Mon Sep 17 00:00:00 2001 From: 81Denton <32391752+81Denton@users.noreply.github.com> Date: Wed, 27 Jun 2018 03:30:54 +0200 Subject: [PATCH 132/204] Gives honey antibiotic properties (#38728) * Gives honey antibiotic properties henk * 0.6 --- .../reagents/chemistry/reagents/food_reagents.dm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index ba5703cbfb..f6c76c50f3 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -556,7 +556,7 @@ /datum/reagent/consumable/honey name = "honey" id = "honey" - description = "Sweet sweet honey, decays into sugar and has natural healing properties." + description = "Sweet sweet honey that decays into sugar. Has antibacterial and natural healing properties." color = "#d3a308" nutriment_factor = 15 * REAGENTS_METABOLISM metabolization_rate = 1 * REAGENTS_METABOLISM @@ -571,6 +571,14 @@ M.adjustToxLoss(-1*REM, 0) ..() +/datum/reagent/consumable/honey/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH))) + var/mob/living/carbon/C = M + for(var/s in C.surgeries) + var/datum/surgery/S = s + S.success_multiplier = max(0.6, S.success_multiplier) // +60% success probability on each step, compared to bacchus' blessing's ~46% + ..() + /datum/reagent/consumable/mayonnaise name = "Mayonnaise" id = "mayonnaise" From 8b1917f14952c941939c7155c32ab2b51265081c Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 27 Jun 2018 01:38:36 -0700 Subject: [PATCH 134/204] Update bag_of_holding.dm --- code/datums/components/storage/concrete/bag_of_holding.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/components/storage/concrete/bag_of_holding.dm b/code/datums/components/storage/concrete/bag_of_holding.dm index e5da9adcde..9686a73b0c 100644 --- a/code/datums/components/storage/concrete/bag_of_holding.dm +++ b/code/datums/components/storage/concrete/bag_of_holding.dm @@ -1,6 +1,9 @@ /datum/component/storage/concrete/bluespace/bag_of_holding/handle_item_insertion(obj/item/W, prevent_warning = FALSE, mob/living/user) var/atom/A = parent if((istype(W, /obj/item/storage/backpack/holding) || count_by_type(W.GetAllContents(), /obj/item/storage/backpack/holding))) + var/safety = alert(user, "Doing this will have extremely dire consequences for the station and its crew. Be sure you know what you're doing.", "Put in [A.name]?", "Abort", "Proceed") + if(safety == "Abort" || !in_range(A, user) || !A || !W || user.incapacitated()) + return var/turf/loccheck = get_turf(A) if(is_reebe(loccheck.z)) user.visible_message("An unseen force knocks [user] to the ground!", "\"I think not!\"") @@ -8,9 +11,6 @@ return if(istype(loccheck.loc, /area/fabric_of_reality)) to_chat(user, "You can't do that here!") - var/safety = alert(user, "Doing this will have extremely dire consequences for the station and its crew. Be sure you know what you're doing.", "Put in [A.name]?", "Abort", "Proceed") - if(safety == "Abort" || !in_range(A, user) || !A || !W || user.incapacitated()) - return to_chat(user, "The Bluespace interfaces of the two devices catastrophically malfunction!") qdel(W) playsound(loccheck,'sound/effects/supermatter.ogg', 200, 1) From 61052ca4870ccdc21e527555a902290e1b981be8 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Sat, 30 Jun 2018 19:14:04 -0700 Subject: [PATCH 135/204] Make travis use -verbose to get all the runtimes without limit (#38816) --- tools/travis/build_byond.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/travis/build_byond.sh b/tools/travis/build_byond.sh index 752418ccb3..01587002e7 100755 --- a/tools/travis/build_byond.sh +++ b/tools/travis/build_byond.sh @@ -67,7 +67,7 @@ if [ "$BUILD_TOOLS" = false ]; then fi ln -s $HOME/libmariadb/libmariadb.so libmariadb.so - DreamDaemon tgstation.dmb -close -trusted -params "test-run&log-directory=travis" + DreamDaemon tgstation.dmb -close -trusted -verbose -params "test-run&log-directory=travis" cat data/logs/travis/clean_run.lk fi; fi; From 8c58a28a604fd796c1ee382737580c1cbf7ccf3a Mon Sep 17 00:00:00 2001 From: Thunder12345 Date: Sun, 1 Jul 2018 01:45:09 +0100 Subject: [PATCH 137/204] Adds a colour picker component for circuits (#38804) * added color picker IC component * added sprite for color picker --- .../integrated_electronics/subtypes/input.dm | 19 ++++++++++++++++++ .../obj/assemblies/electronic_components.dmi | Bin 22822 -> 23381 bytes 2 files changed, 19 insertions(+) diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 02500e5ed6..cca3f2babf 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -76,6 +76,25 @@ push_data() activate_pin(1) +/obj/item/integrated_circuit/input/colorpad + name = "color pad" + desc = "This small color pad allows someone to input a hexadecimal color into the system." + icon_state = "colorpad" + complexity = 2 + can_be_asked_input = 1 + inputs = list() + outputs = list("color entered" = IC_PINTYPE_STRING) + activators = list("on entered" = IC_PINTYPE_PULSE_IN) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 + +/obj/item/integrated_circuit/input/colorpad/ask_for_input(mob/user) + var/new_color = input(user, "Enter a color, please.", "Color", "#ffffff") as color|null + if(new_color && user.IsAdvancedToolUser()) + set_pin_data(IC_OUTPUT, 1, new_color) + push_data() + activate_pin(1) + /obj/item/integrated_circuit/input/med_scanner name = "integrated medical analyser" desc = "A very small version of the common medical analyser. This allows the machine to know how healthy someone is." diff --git a/icons/obj/assemblies/electronic_components.dmi b/icons/obj/assemblies/electronic_components.dmi index 51e3a589d1d63c35e54a9c99952f8cd31b1e8775..840b5828f306f6b62e604c55a5201212ee08dc37 100644 GIT binary patch literal 23381 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%0A{|FysB<1Z>Ip^J1QG^pCt8a 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 Q{Es0Q49w4!oWVr=2MVvW2><{9 From 18dd26ee3a4acb2d8ab3628c84f738257a3c95a6 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sun, 1 Jul 2018 00:04:21 +0200 Subject: [PATCH 139/204] Adds missing armor to accessories (#38800) --- code/modules/clothing/under/accessories.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 05ce843ff9..235eac6704 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -28,10 +28,10 @@ pixel_y -= 8 U.add_overlay(src) - if (islist(U.armor)) // This proc can run before /obj/Initialize has run for U and src, + if (islist(U.armor) || isnull(U.armor)) // This proc can run before /obj/Initialize has run for U and src, U.armor = getArmor(arglist(U.armor)) // we have to check that the armor list has been transformed into a datum before we try to call a proc on it // This is safe to do as /obj/Initialize only handles setting up the datum if actually needed. - if (islist(armor)) + if (islist(armor) || isnull(armor)) armor = getArmor(arglist(armor)) U.armor = U.armor.attachArmor(armor) From 17d59060ad324e9c10150ae3831297cfda878108 Mon Sep 17 00:00:00 2001 From: Matt Smith Date: Sat, 30 Jun 2018 23:02:02 +0100 Subject: [PATCH 141/204] Add welded shut message to vent scrubber (#38834) --- .../machinery/components/unary_devices/vent_scrubber.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 9df8356936..7a207cbed5 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -301,6 +301,11 @@ if(. && on && is_operational()) to_chat(user, "You cannot unwrench [src], turn it off first!") return FALSE + +/obj/machinery/atmospherics/components/unary/vent_scrubber/examine(mob/user) + ..() + if(welded) + to_chat(user, "It seems welded shut.") /obj/machinery/atmospherics/components/unary/vent_scrubber/can_crawl_through() return !welded From 58f634db63bd7e83c25eea84f6cbb0b14b2ad177 Mon Sep 17 00:00:00 2001 From: Dennok Date: Sun, 1 Jul 2018 00:59:34 +0300 Subject: [PATCH 143/204] deconstructable-TEG (#38656) Make TEG deconstructable. --- .../circuitboards/machine_circuitboards.dm | 10 ++ .../components/binary_devices/circulator.dm | 144 ++++++++++++++++-- .../machinery/components/components_base.dm | 3 + .../atmospherics/machinery/datum_pipeline.dm | 3 + code/modules/power/generator.dm | 120 +++++++++++---- .../research/designs/machine_designs.dm | 16 ++ code/modules/research/techweb/all_nodes.dm | 2 +- .../components/binary_devices.dmi | Bin 25805 -> 37683 bytes icons/obj/power.dmi | Bin 26336 -> 30865 bytes 9 files changed, 254 insertions(+), 44 deletions(-) diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index bb4d5ac97c..6bef0499fd 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -913,3 +913,13 @@ req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/matter_bin = 2) + +/obj/item/circuitboard/machine/generator + name = "Thermo-Electric Generator (Machine Board)" + build_path = /obj/machinery/power/generator + req_components = list() + +/obj/item/circuitboard/machine/circulator + name = "Circulator/Heat Exchanger (Machine Board)" + build_path = /obj/machinery/atmospherics/components/binary/circulator + req_components = list() \ No newline at end of file diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index e8007a6608..cf1d0e1866 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -1,23 +1,41 @@ //node2, air2, network2 correspond to input //node1, air1, network1 correspond to output - +#define CIRCULATOR_COLD 0 +#define CIRCULATOR_HOT 1 /obj/machinery/atmospherics/components/binary/circulator name = "circulator/heat exchanger" desc = "A gas circulator pump and heat exchanger." - icon_state = "circ1-off" + icon_state = "circ-off" - var/side = CIRC_LEFT - var/status = 0 + var/active = FALSE var/last_pressure_delta = 0 - pipe_flags = PIPING_ONE_PER_TURF + pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY density = TRUE - var/global/const/CIRC_LEFT = 1 - var/global/const/CIRC_RIGHT = 2 + var/flipped = 0 + var/mode = CIRCULATOR_HOT + var/obj/machinery/power/generator/generator + +//default cold circ for mappers +/obj/machinery/atmospherics/components/binary/circulator/cold + mode = CIRCULATOR_COLD + +/obj/machinery/atmospherics/components/binary/circulator/Initialize(mapload) + .=..() + component_parts = list(new /obj/item/circuitboard/machine/circulator) + +/obj/machinery/atmospherics/components/binary/circulator/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ) + +/obj/machinery/atmospherics/components/binary/circulator/Destroy() + if(generator) + disconnectFromGenerator() + return ..() /obj/machinery/atmospherics/components/binary/circulator/proc/return_transfer_air() @@ -56,11 +74,115 @@ /obj/machinery/atmospherics/components/binary/circulator/update_icon() if(!is_operational()) - icon_state = "circ[side]-p" + icon_state = "circ-p-[flipped]" else if(last_pressure_delta > 0) if(last_pressure_delta > ONE_ATMOSPHERE) - icon_state = "circ[side]-run" + icon_state = "circ-run-[flipped]" else - icon_state = "circ[side]-slow" + icon_state = "circ-slow-[flipped]" else - icon_state = "circ[side]-off" + icon_state = "circ-off-[flipped]" + +/obj/machinery/atmospherics/components/binary/circulator/wrench_act(mob/living/user, obj/item/I) + if(!panel_open) + return + anchored = !anchored + I.play_tool_sound(src) + if(generator) + disconnectFromGenerator() + to_chat(user, "You [anchored?"secure":"unsecure"] [src].") + + + var/obj/machinery/atmospherics/node1 = nodes[1] + var/obj/machinery/atmospherics/node2 = nodes[2] + + if(node1) + node1.disconnect(src) + nodes[1] = null + nullifyPipenet(parents[1]) + if(node2) + node2.disconnect(src) + nodes[2] = null + nullifyPipenet(parents[2]) + + if(anchored) + SetInitDirections() + atmosinit() + node1 = nodes[1] + if(node1) + node1.atmosinit() + node1.addMember(src) + node2 = nodes[2] + if(node2) + node2.atmosinit() + node2.addMember(src) + build_network() + + return TRUE + +/obj/machinery/atmospherics/components/binary/circulator/SetInitDirections() + switch(dir) + if(NORTH, SOUTH) + initialize_directions = EAST|WEST + if(EAST, WEST) + initialize_directions = NORTH|SOUTH + +/obj/machinery/atmospherics/components/binary/circulator/getNodeConnects() + if(flipped) + return list(turn(dir, 270), turn(dir, 90)) + return list(turn(dir, 90), turn(dir, 270)) + +/obj/machinery/atmospherics/components/binary/circulator/can_be_node(obj/machinery/atmospherics/target) + if(anchored) + return ..(target) + return FALSE + +/obj/machinery/atmospherics/components/binary/circulator/multitool_act(mob/living/user, obj/item/I) + if(generator) + disconnectFromGenerator() + mode = !mode + to_chat(user, "You set [src] to [mode?"cold":"hot"] mode.") + return TRUE + +/obj/machinery/atmospherics/components/binary/circulator/screwdriver_act(mob/user, obj/item/I) + panel_open = !panel_open + I.play_tool_sound(src) + to_chat(user, "You [panel_open?"open":"close"] the panel on [src].") + return TRUE + +/obj/machinery/atmospherics/components/binary/circulator/crowbar_act(mob/user, obj/item/I) + default_deconstruction_crowbar(I) + return TRUE + +/obj/machinery/atmospherics/components/binary/circulator/on_deconstruction() + if(generator) + disconnectFromGenerator() + +/obj/machinery/atmospherics/components/binary/circulator/proc/disconnectFromGenerator() + if(mode) + generator.cold_circ = null + else + generator.hot_circ = null + generator.update_icon() + generator = null + +/obj/machinery/atmospherics/components/binary/circulator/setPipingLayer(new_layer) + ..() + pixel_x = 0 + pixel_y = 0 + +/obj/machinery/atmospherics/components/binary/circulator/verb/circulator_flip() + set name = "Flip" + set category = "Object" + set src in oview(1) + + if(!ishuman(usr)) + return + + if(anchored) + to_chat(usr, "[src] is anchored!") + return + + flipped = !flipped + to_chat(usr, "You flip [src].") + update_icon() \ No newline at end of file diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index c333651f5a..e31d96a0c2 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -73,6 +73,9 @@ Pipenet stuff; housekeeping P.build_pipeline(src) /obj/machinery/atmospherics/components/proc/nullifyPipenet(datum/pipeline/reference) + if(!reference) + CRASH("nullifyPipenet(null) called by [type] on [COORD(src)]") + return var/i = parents.Find(reference) reference.other_airs -= airs[i] reference.other_atmosmch -= src diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index fb9482841c..bc034ec506 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -129,6 +129,9 @@ /obj/machinery/atmospherics/components/addMember(obj/machinery/atmospherics/A) var/datum/pipeline/P = returnPipenet(A) + if(!P) + CRASH("null.addMember() called by [type] on [COORD(src)]") + return P.addMember(A, src) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index eb6e82a242..04645b2267 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -8,10 +8,6 @@ var/obj/machinery/atmospherics/components/binary/circulator/cold_circ var/obj/machinery/atmospherics/components/binary/circulator/hot_circ - //note: these currently only support EAST and WEST - var/cold_dir = WEST - var/hot_dir = EAST - var/lastgen = 0 var/lastgenlev = -1 var/lastcirc = "00" @@ -19,34 +15,18 @@ /obj/machinery/power/generator/Initialize(mapload) . = ..() - var/obj/machinery/atmospherics/components/binary/circulator/circpath = /obj/machinery/atmospherics/components/binary/circulator - cold_circ = locate(circpath) in get_step(src, cold_dir) - hot_circ = locate(circpath) in get_step(src, hot_dir) + find_circs() connect_to_network() SSair.atmos_machinery += src - - if(cold_circ) - switch(cold_dir) - if(EAST) - cold_circ.side = circpath.CIRC_RIGHT - if(WEST) - cold_circ.side = circpath.CIRC_LEFT - cold_circ.update_icon() - - if(hot_circ) - switch(hot_dir) - if(EAST) - hot_circ.side = circpath.CIRC_RIGHT - if(WEST) - hot_circ.side = circpath.CIRC_LEFT - hot_circ.update_icon() - - if(!cold_circ || !hot_circ) - stat |= BROKEN - update_icon() + component_parts = list(new /obj/item/circuitboard/machine/generator) + +/obj/machinery/power/generator/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ) /obj/machinery/power/generator/Destroy() + kill_circs() SSair.atmos_machinery -= src return ..() @@ -61,7 +41,8 @@ if(L != 0) add_overlay(image('icons/obj/power.dmi', "teg-op[L]")) - add_overlay("teg-oc[lastcirc]") + if(hot_circ && cold_circ) + add_overlay("teg-oc[lastcirc]") #define GENRATE 800 // generator output coefficient from Q @@ -122,7 +103,7 @@ lastgen -= power_output ..() -/obj/machinery/power/generator/proc/get_menu(include_link = 1) +/obj/machinery/power/generator/proc/get_menu(include_link = TRUE) var/t = "" if(!powernet) t += "Unable to connect to the power network!" @@ -147,8 +128,12 @@ t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa
" t += "
" + else if(!hot_circ && cold_circ) + t += "Unable to locate hot circulator!" + else if(hot_circ && !cold_circ) + t += "Unable to locate cold circulator!" else - t += "Unable to locate all parts!" + t += "Unable to locate any parts!" if(include_link) t += "
Close" @@ -167,10 +152,81 @@ if( href_list["close"] ) usr << browse(null, "window=teg") usr.unset_machine() - return 0 - return 1 + return FALSE + return TRUE /obj/machinery/power/generator/power_change() ..() update_icon() + +/obj/machinery/power/generator/proc/find_circs() + kill_circs() + var/list/circs = list() + var/obj/machinery/atmospherics/components/binary/circulator/C + var/circpath = /obj/machinery/atmospherics/components/binary/circulator + if(dir == NORTH || dir == SOUTH) + C = locate(circpath) in get_step(src, EAST) + if(C && C.dir == WEST) + circs += C + + C = locate(circpath) in get_step(src, WEST) + if(C && C.dir == EAST) + circs += C + + else + C = locate(circpath) in get_step(src, NORTH) + if(C && C.dir == SOUTH) + circs += C + + C = locate(circpath) in get_step(src, SOUTH) + if(C && C.dir == NORTH) + circs += C + + if(circs.len) + for(C in circs) + if(C.mode == CIRCULATOR_COLD && !cold_circ) + cold_circ = C + C.generator = src + else if(C.mode == CIRCULATOR_HOT && !hot_circ) + hot_circ = C + C.generator = src + +/obj/machinery/power/generator/wrench_act(mob/living/user, obj/item/I) + if(!panel_open) + return + anchored = !anchored + I.play_tool_sound(src) + if(!anchored) + kill_circs() + connect_to_network() + to_chat(user, "You [anchored?"secure":"unsecure"] [src].") + return TRUE + +/obj/machinery/power/generator/multitool_act(mob/living/user, obj/item/I) + if(!anchored) + return + find_circs() + to_chat(user, "You update [src]'s circulator links.") + return TRUE + +/obj/machinery/power/generator/screwdriver_act(mob/user, obj/item/I) + panel_open = !panel_open + I.play_tool_sound(src) + to_chat(user, "You [panel_open?"open":"close"] the panel on [src].") + return TRUE + +/obj/machinery/power/generator/crowbar_act(mob/user, obj/item/I) + default_deconstruction_crowbar(I) + return TRUE + +/obj/machinery/power/generator/on_deconstruction() + kill_circs() + +/obj/machinery/power/generator/proc/kill_circs() + if(hot_circ) + hot_circ.generator = null + hot_circ = null + if(cold_circ) + cold_circ.generator = null + cold_circ = null diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 618f955450..d07a922fc7 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -10,6 +10,22 @@ category = list ("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING +/datum/design/board/circulator + name = "Machine Design (Circulator Board)" + desc = "The circuit board for a circulator." + id = "circulator" + build_path = /obj/machinery/atmospherics/components/binary/circulator + category = list ("Engineering Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/board/teg + name = "Machine Design (TEG Board)" + desc = "The circuit board for a TEG." + id = "teg" + build_path = /obj/machinery/power/generator + category = list ("Engineering Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + /datum/design/board/announcement_system name = "Machine Design (Automated Announcement System Board)" desc = "The circuit board for an automated announcement system." diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 0472bb9e7a..015f0dafb6 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -130,7 +130,7 @@ display_name = "Advanced Power Manipulation" description = "How to get more zap." prereq_ids = list("engineering") - design_ids = list("smes", "super_cell", "hyper_cell", "super_capacitor", "superpacman", "mrspacman", "power_turbine", "power_turbine_console", "power_compressor") + design_ids = list("smes", "super_cell", "hyper_cell", "super_capacitor", "superpacman", "mrspacman", "power_turbine", "power_turbine_console", "power_compressor", "circulator", "teg") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/icons/obj/atmospherics/components/binary_devices.dmi b/icons/obj/atmospherics/components/binary_devices.dmi index 9331613af3256bb251ac594474793d2927b02b46..9c6a1b6a1f0886b2acc4758e1e35700ce4908171 100644 GIT binary patch literal 37683 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%0AHz^0d=f8e!2@!l@jhmvA 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 diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index cd76709b00cb653762d1ba2a67e8740e9bcee60c..dc6d4547b452daaf41fc22e2969923ff615c040e 100644 GIT binary patch literal 30865 zcmbTecUTkM*DgFEG?6MQO*(>#QbdYU5)lyu1f;7J0VyI)dQA|dca)+)P`Xm3N()E_ z1*Ib$r1wB52}#bx=lPxY{r-5b^PO{DlF4ND?Ac|ld#!t|HAd(>xW_=pNe2J`gSwi^ zLja%vzfu6S)Zk&?dk6=fIQi-uyQ@5NvwCUo;%@Kk1OVRY?a3`p3w+F>{Retk2eo+= z7iy-0#XswRzVO>9oK{%oiVST9_F(gHR)3-`S86LaQsCmiArq`sqE-4ByW@ALQXN-+ zayRT(ZP1XlTPxZEu6!x^#JF znZ5PtP;mOd$Sa+&?7*xt7Pjx%62TuCYo*^-C*L}vwRwPiGW3DOI;pVR&!bpgze5!ip!;Cv6vWS&=)h>#n(NhdS828pr6xmQM6FqK%e&%Yv0qS0+MBA zC!buPba(kN-)}9eYkfMrJ0?I^mD}egBohB5;*X44iSo;uOIys76+H3$+wqf%iTDV` zGoe%oVfpOWKi*lV2^Vv&+WRsTUn*+;1wd%$yuLlBb5%7O>Fq90*5)nev_7Q zWtzBV*3^{^4T)dfDHg9O6;G@cf_8E;Z&$sP$kZ2I-YKHER@I`_8h9PzI_B&ZfYMYy zzi%BX%&)Qe9xa+Qk7;%KBt4^jZKw3+^33*=oDA__+is!(pEUdVjRr!xC*l+$H6;Dn zFDbTl=9J>;EY}nb-(0`6)SHDGVgaAh((f(p!)fv-Pg~x) zUwXvJzBM->THc2=h7LkQ*K#=oKFN^sdK_9lyxeBL&U2^pPVS^6ownBM+XXemh1EDg zf@=;eXkR3rNI8H~!`BNlX+QoFFu6zqus1|L7H{CL0{|bOu5w%7JAI=u!29fCBZ)Mv z#;MLHq)@`i97*?ZKjh3c^IV(Tw_~frWxOTUj>q*P%Z*QCmF*PIl|8@Hs2|JJsaC$2 zem^IXF0A_eZHsJU#bmWB;ivAmoN@J`J;i_O&s7ODOhzhgIb(cke0<6WT_S2^<7K-& z`hBwA53%Gn;}$2*PXCHonO5BcM@jLG4p?l->bDzT)Y26FGC2(>)AEN1@lpdJ%*x?3 zPXRc1>dpLra~f~v%lw%+C5 zurD&*PY>sO$Vp3Eb<52xB_)M!c(^LI|Fss3V0Pe_HZbsTaMZ!UL2+B$k)GD$Pc~sK_ud_aScs8bq0up-DN-wQd%%s1Dn8z1cB8hy zt_=@her4Y)cV8Vaj`}!59Zb#erE;1)?p^cU#T1-)L1yWXZr5qVg0^3BJ(qIBu?pq{ zX@hR>RNsAnRep(AQDt{#1^b)v-u@A$*YHV{f_^U%`ZFL_?#>s^-|pC&6q-cbUA}m4hp78MTe3ZE5_f*Ne^^Nfg znj{fz&o;z%jI1T*owTBMkqPth%z%JmmB+}{H}W^CRp!{HUOsx1xL~whv*9{$fX==9 zm3yl9v2(*ONfJ{EcgLUIrS%uZ(4H+XmAH&;$9AilsnFAag6Ct1*h-+;lfaE?iVc5) z2M{M$0TEj4Z=O1kAE&ZtcczJjsND%9teZmt;^qvIp~B_|1)!O6%fL4_5SL-S7}`Y| z9}JoZqFoFZpnlX4MP?na`OA%C(Vs$Ec7wyg@M#t)ibMN$T!_Ubb)*6E)}xp%XK5dGqK}E zTjYEi8)0AMv=4PN16l#fmw8-&*U#_gvf%=gJL*`Ze3#}SiGI=%J!lFe zM{c5SCTopeBFBob2_VcE}&fDq$>8Fr&_1 z#BZZ#5~z=kmr*rCz@YO~KY#=k{^EVEdK$%KngG>aCuhNOMrUdjTK={(9*4^Jow=?h z?FT`~nmvD;9RTrzpC{!1<#fR5%B)gQbK*ImC%EOJYVVd4KiFp?P6GOWk2Pdqim%MC z+@(>r$GW#{Zt@9bSO9Rf^fzzb&}wOEz3_kX5xhvT_71sw*Mb=y?&15j5#q@~IwO(K zXeVnTEM!7%xjtIjnU4yL{PiLp18G*%shYbfGStaKQ}2zpk5Z6cyS1P3;?6rNVvYL`f#zrqDavNQ zAoz7IMB!Yi!$4DLmxCDtWrK=63aK-}Gc;83YcGVIMUSmnOLi&;f5PS5z%trl9f>Ys zG)}NsPQL}PJ>HWK8Xw=PcAN+iLHVCaG4s7_^F5V+g$go{kBW@EK2LLh5@pSwu}YCp zVJbaUdiONteJ%u__5Ju+cO0TWQ!!QA;XGjRh#%hKm^~7trJR2d#%MjLX3SMdwqo#msOYkM@MYd5voILIcecndQeS7`j zEEk){t$wQDMI~emtei#)U_8p$peUQy76La|SzTRyNZ;!)t??{n_&5NRO=wRK4GDqp z)mq8V#ueBo7NNNot0U_UxO3GHtgXJPj8$NVYa7CMe;2HnRfJB8PO7U_Pv1-_VtR)(Mr#~ zUXAVa_EryYC(wFsjLp55v3{DO>wH))>SQX`M=|Xt4w=XU|)<2=~?8<3rqzg z^}hqmiI-9#F3n^Nx_)5p+>GL$SC5H;gs@WRBT+&OpzWWNI2|zxkU@b##llFinsCVE1ZYu zw$~L}7hh(JkGR_0??7|~&AY>Boc1%B+e}HDiNXsBR4l9SPO0V6!zGNj?pRQX+`=$> zpuEIYR=-4@n}8q(Q^udYn&}n;@(;;VdmB0wK`l8A@w8-~)u(PQ)BvzJLUHu8EFGui zDW0>YbiS#S7w7jP`2<>E7TuhbsrRjbhB1;k=ZX^4(;hu_5Qh-JpgliHEl$t@o?DX< zReH}sQ>xD+F7>48;I{+!_*jO#*P}=M9wb7aJ7mM3cziMWL~;xL%Z_AcJLsepZbc`y`(y1{F@No2mHI@5dURbxKae?EtOc19%tj((IRdXTe;@-koAz zdEh*H7xy(LnS1=?_0DWC6UI0(Iuyj>%ONJvl9e-MyGqKmzkw;k?F>Le0hwzK zg2v*)n0WgDWW19c3p2lp00%e#A!!hf6|}POfiq_9D=*|=FjyX@jceu4@^W@@vDV%U zV{eLhXM@jP4oP4eO$yYUka_woBz5|pTHZGR>HW@UZ|P>>$mcMerrf#e+d?DMo@+ye z1Ni(08J~`wX(Rz%8i9GM`bEdzmE9w_5N`-*58PQDT50yvO;ttj1f0LZ7z_P~@(|fO zsMO1UP_-DfJjTIKeb=|;S6c+@wUmkg{6UB#D}Nd#6i~JvQ>=L5;Lr-1#!@v`uD9j( zgTn2;m=1HZWDZM!pZYZBO?^hEAv-Z+ZUCcor?QkcFx%Fr<(+hLZ`G^XjBa}0@Wkd| z#VIQrEE)>GMq`+FkshGceY(7H2H^4e!}7z8kiT!FptOUBzVrB#(g{gW{e2ZkkPUTo zbbLsMm~QZ?=FNwyS^)zPpM_IEOa2(#H^RLT0nVvbrGW!^kH<&FHPm_8^^?^NY9w=_ z9Jv1TXTAfeRx;q}85sC5SD;ZzPkPrH032KG4qb1=Ix9K(OsT|u(LR&}4A)@85$~!4 zFJVe$PE8~_1gY8Ix?Aax znc*p5DE4LR1M~!V-}`4ks4?vLf%=(W2xr64jG|YphnK@u8yMhqqp*lL>tVzYsOWoJ zR4IYTRj<))neJ(l)_a-u^e@RNA2PYjOIhwO(!&K@p3@_z@Y3vW7lbw{4rNv!l60ZS zU2PTO=xv!eDcAh;%{K`>R>1s47As)i;ub2tjYSa}A6=XUdq!|d z+8}7FK&`5xH62gx&T~L_i1=+Q@V0lPd57}&D@j*b60fK*0KZKiJo|~_DHO_At0B}# zy>%A01;Ex>Jiw*?g799?ddL|?14;fgc#k<1T3A zVS7iN_ip7CtIw+$l0{b~6!&6yYr*?EFu(VUy2yk#ogl#2;)Xj~dWidk_av!_J1qyCWgM?hO!&QgE25X-3&p z(28&El|PZOeZw8GxM5E3GDHg6Pdyd?Z_Ab&?``=wgaqoD``H1HSw826@p#t18mas+ zRKKf(dHx(39fcl#fSjkfCyayft3-gbyRMM|^u}q`ubceCk(CpfK;Qvg>|jvaz$*&0 z|KHQ_)n~{c8tAK9|3T)>^{^Sh(_MV@rSjWo!AAtrYE0&{5ya9{LlOeV3Yf%H5T%&1 zail?19h))9o@p84LVKJ-GdtDTK)pUQQATXksvCmUgUcPl%mjifIF4PuJX1h-@H`Ww z>eN*F_uHlY3RB^Rq^gG1YW_4cQdJf3s(T{YT`*}KZFusFN!a=EKnw^-Hvjf<8wn0s zjUu7s%}SokUA;wc)A)s2ax|du1_mhdZ0?P$hUk#d@jSL&8K4N^+=@Gt>HY-586!VR zh-Mafv;PCJj(Td0cAgWwnk0k-+Nn> zF>nI3#Ts04kTJP|DBsUKgcj%GV}fAD+4l6J~I&$3X3kS z-=i~flNIToYAkQuX(9kLkWUHbBA%2OF)W)O{3lPA_ zD@C3hxNwQpra;;QPzcrLEeL*GBj_4+LjwL)i^X+?zdOr6Mg<2O{+~i7X4Gmz6hTOd z0G#_hZZ4S@@Sn2}OkR?)eQC?!*z_`uj0dy>OYfo}5X zj~_o`x_^z2Uv5NKROs!Yz`djFrvV1@wT*5#t%W`!dN208m3#Sz7O>cvZF%Q0)Dql~ zE|Tf3yvu`4D;TtG@=eWPh+-(K<3G(E{C7svYNHu0B9A)2D7Ga2w_Oth{R$( z`IOH;;uD5F`_IbD%l{e}c(u0n+}+c2zAHhHUCF<8t4`i)OF!r1Vhq~YurgGWp0CZ~ zb|$8JZ>%S9+yur#8GPHEkD0k`*8V`;Mx!)F{AbC`Ber8wXNEinAcw@^OOLjo9LEF^ z#jbVpu@4m#>#)tI)NmSk+ZsT^VdSd)*W6sH)-a}f$NfF$){9QM@BhI6Ny-0@Y46C$ z$N)_{Zhy6!_i>9IJ+dor3zPTBY@+gM@X}3|<61iThA%HgfZ3Aqg`J+Bj9LfJKXL@u zj;W_t12 z!bfUIVJ1X^3(6L3|5Oiby;Ec?_E6*?YZk|lsc==vi@W-oP@u8$ zZn6KpR}s_cLjuWXYr2kJsR`yP`MqV;rUrh>eD~yi&(g~dh<08Ct%V$8R$U$EFs!tr zPh06Ww*NCj@5FJp$dQkSH0a0M`^YB+$=L{J=pslC!!XO1KaLu8AGV}MFVx?Fn~~}! zcr~Z1bGX(Vn)Ir0X%LCq+Z%>N|Aqo70NLoUm?8X|9Z>xK3i(#l$ns!gysotHrpqkw z=+UFA&Z1dA;#UaT=hq-^t79M%U+1C*&WGpk%HG1$RB`~HQy?9;)MFc>?Tk5~eD`>+ z7NS@a%x`hTv;@E~xlxM60JwOXYp zKafvXSKE$%d6o>N5iNAfUa&k%X{?xSUS@Gy6B6qSJiDb0ee&s@dg7>w-|2twMGBB; zS@}M5Ux)9(LqX!`9dRfhrr32Mhh+;f`IS{3b}Y13-SM*O6-RkAggK&}14IMYxirM%RnxX z1L$Ixey%@RXe<9L^%(%{Y0zdT6nv!{Y8#Ayq=;wR&gZ))PAf5SZxr-XmDM6!0r*{k zzO%*22`lu-lW4hVdv7i-F3IOZmwq62rR9wqDVf8cT;@XoYK^>}OIEY&ptwthLg25; zL8qva9?8Am7i*Q#pr#1uWd34Kv09}r`vyiv%bREW0x zYy74LBG-kUL516R`(zmp6>PDF(QEG)#{%e$*D09$)qZf2>I@xZ&r(Fwbl)6i005Y% zcuI-RPp%x}(cf-@s5O+46^NS2+fa-BI^X+Cb~$?r0H$9YC?gnI?h|MP(2#O}lHMuv z2#o8_Wv^;M1If<_xX;PJ7otI2Fr&|a4B+x=bueEe#>>_=f3p)l4+dD6Eo7LGW|2<_ z4Xj<_Zu(vZ#;2YXWqH}&79D4Zh46*sT>AttGg2Yx0c+3?gU5QGccjYa3b=`(N6MMa zy?vX2)2YcfY`E$&fl;t#q)ZkA_dW~qG#+T0dj znXnuWnnZ$%v&mm@?n!*4P2CFJa}1D3JB4tc{*s9nCR*jO2o zfKE;0i;hsFe#dhwD|f*x!F#c@`7lD^ypK;ds1JW5V4}|$cEAv~j|- z!{sQrVMa%5jOK{%`tq#zYUyXjcVyP0{C(FSC<6^?q4><^W<0B7rGmw@t(f^eZiTK< z{B9hg2p?GfS((5azIg^NdON{eDyyTTBXx_~?oGxVS!L|N`{Rq;D_M=lJ+Ze8r?Z{p z78&fWbL#n&v52lJksp!Xu?GQk6Y0ju;ncoX0BOfeBO;7LpJN9vs=eHy3cg)a6GXnK zF5J7xKz0$;F#khR#*FNE2o=-nr#xzMH7;wAaa{IwGaV$h9*L^MXE6=Ot0mK~v$5zX9AUs!m@ikze>tMjoz? zEHQKU^z@W{{~(`rT2w#;8+BgnO=fQ!PL=`4sq`q`x|R}TF)w>bPiHyaJYVN&yYbj@7zS`@?gZ{O~UIWd&?bX`jk`m-@3n~pTqXkgRy9p4|#di zg1UmzVrkwosasba3ft6%@3TAU z1x}FCAsE?d)cvqU!B-fe7gKJuhJwH&A9CuLsdlUvHBzmkR9ZDsKChN< zyj3cZj#hPZuR-e_|H=BBhqaKWF{vbbf+^h+c4BssgM&t#Jd`jCRB_EyLcX}B?RvKC zY)M|8@WRsM;X^Xj35lmyp4RDc8~=>I8#sSnED=|b%X>nZSCrAP zmD#3!6&xriK?4_7zn|dlU%mR|%}-Smh3ukLv%WVbJJ%zO*I|xO0Q7cmv3))QvV^{* z$JWd*8dxtGe?kD4o)T;YlGk~s8_rb>*@+aKwlL9nb~tXm^!-&zcR1Gk>kAHGypcga z$B~>JREe6WpPJKM_no3>GyQ`_zlimjvcB0UDWrN|9|7hHC@jz4Zqyv$wE-T!ao2pD z)Hc^%DP4Z=%9E00`xGFLHKG7vF2SzZoCivIw~*X9mnBdQ{(9UO{vQ(p|1EJDU)jh8 zC?=fg58UE6z1(EFQz_Vx11~4CApEjL5Gf$1drHHdS^O5>0h>bL8(t-LqJ>0~E zBe_aWuR2vZ5fPtUrGHCMP?AhuzyT~+6QZWnFw2HXFTGUP z%)Kt~pxjYY_TM%QIwX58KuBJo50$f9;QjDDacZMORO6q02qm>6?49(*M5p zz15Q%9>CG2W+&dxwoAR@ z7ztxiA=AIyxd`j*BMdKhN#qGPf8?rK;SFjk+rLAzBt%JZaaf==pRNhLU zOZi+zoC*fllWa3tu+EpEeCQD5xh=499|+r+TiQd5AwmJOhcLI@|7IpSFa{w0fU0zX z9Dn#f=IDgBB9LUd8WtHz*RrhFcUzE_;?t*3Pf)4hW5Hy{pFf$Fl7a%D=TTsP#Rq4m z1iu*Xz8fTh?Vs+>wPvvu?elb;224TtDqGYMO6+*h0gr z*>%|Gh!9Q!-36X+bf_CfU;Wd(gUQOfbR|VRUw$`7Cb-37686gMkaZS}=K@F&GFv_V zlw#LM`&~(i7d0pWFm>fIi7L$T0A`2c8Zs(0khZB#3F>*9 zGcsaa3bWxP5XfT^pgZ$&?0y9e<{ix z;NXae(6swgY>5q11p81FO|G2}EA4Ydo7rSp-_5xHUJh}^vX;d2bU){p9WKl@MJ11g zG0gQNJ{ndp&&o$l;mH-45M57a@h4fMtjtAsa*=H5$$y~5v~ESI3Vk9@sVd+Jt-M4F ze9>0!%>~H!mUQkBz2(9!CQ6D|M=A8^=>ub|tpEXsy@L)U=;-TP*FMnIO{g@xe!?)p z>4F|GqUy(v1nT;Ktn@QV_Om%W4@MBTBm*CCOYnFX zQW_`RCX#TaBxOg(;x|Mw6WuUww+@Fs|D-wX*ZTFph$5WFcD@zB%4W@sXU^$wT{E`U zyp`JyUX!KEGOZDgwfGoWe{d(gw;K1sZ zfB};m{2YNbEQdAR@Ulshl!=r%j^oFk)w7Y0OPUM4v~RA_2%tW5NZG7pzV7Yr>+=+X zzrnZ8NjNnf+qAFG?@8HwFI&`J2LP86$@BM8Y+qU>o~mVuuBxoG>!YMQeLCr->QNX> zg}N=mR&d^mCBI*D3KPZ9GMDlcPy*OgE36L2f)0V?d2yr*}9%0T4zG~Y*d<@9LJ*=nX8dn2U)6Gka?#vS4f<{89fo<*G>9{a<}sq7*NamTz#!IP>3O z76(U*8zpfm@Wxa!0Ew<0h4PHZnCJK7={Ul6)h3_W*o50Vm+x}je3>&>2d0^nEF1mf z0xd%tvFKs?iKLy+!`%lYnK0^|mce5SUa zJ;YvbwmuG0n`!b+E*>2%k-b*R8knsVh;4%#mS;e8%&io!Co+p%4r%xh>vaLiIRYc6 zFN_-2RDZru#6{>u^C)t1b8~lfN9?1$+}$nqSAMD2Uv&OLm|u39Z;KdkQ;m5cccJ58 zbAlDeF|^0^bktcC*qQejU2OxM=K*%A!WM0d6smRDH?X)wFE8jTNzhi6dr|C-U2Y`^Zp@d(!>b;8m>z*R9s3(76@z^Z%1<-deC#s8x$cL~=B;$_)8qF!mf6MR*~kX`!Q_G#*13NaoAV65tp zxuju3xiH88)O0)hW7U-s2eXmz&B0LSB z?y6|f=9wQa!Bv-fUNT|9hkJvg?sG=qAD`?Mds$iV&VGd4Wd5>ut#SJ!lB3d=ox&D3-=q4`nM)v%PlXFQgKxXG6h zL$CSFlUs3KjGt}MzCtgBl}d4qk*P`~utRc%SIsoB)ccUYowxnfQ~A_Lv+mzQ#jINc24t6qWV9&6xxxE*2C9oE- z>WIEA!G3n*ptXMUkj`HIoCHWKZJG6!;W_-pzFX>*8814|nR7W}#IiQ6>-Tv)Zm#}0 zq{}0xjzYZIj-QbO57k4YdiT|b<{!n-ZWE~0fAcA7V0a58DIxKHS|tJD?_GXHb_Yn&D(G=4ST`gd87i1@R z!65tIazERj!sLSk&(-F2?)_Jj_3(9jTj^4?A>lLKR|x7U>eatKv-!4RL63;}?U)~BoJ z+6$ud1sc0APwm1Z&O!F|RV#ZX+k(Y;+6u)$k72xP(e z_{h~m5{o>HVdM&c&R0Mcxef`OzBg_)e*x2vf|-K>$g@lRC?>u{CkT>USj9gP0D2%4 zD>rw*vcVf5y7j7qes$Xddlf8B31_F=!v;Owc+lxd-CWeKINju3PyEMkY`3Zhh0@%( z#)%uL7HQoU&O**S?&HuTJi4>0F;4Ly)qQrf_;DDNhS36y83Ragss>;s8!i8ITM>cd zx^?)%rnaUP02*3K;J;$To8X{~-8K}_JPqbQ0v(4N!(AU58P{Oju ztSDUPQb;E+;)2(tYgq1e^8l=Y!pTnS4xYd+X-WAv!D#1FPl&h-q~7xQw6$PO1^u}F zbvZL?g17iI0GtHEwrUp`pSb-13n#F6!oc;vw-l5Q5?5l>{r)7}EAz!ZpY&PI7)TBB z+iql=s0L#d(HCx>ac;yW&nxQXX|}w%thY06iyGgiP;=+?R|sqzwQRXhCu|5N-_&fR z=GO$~YPV^DEVKkW9%g5$gR(B+na}``Or9w9dMoED0t?Mvq0eqRo9l9h*A;5~lxrt< zt(drW`Sb*6Wa~?ozrH;zt{kOerl$_T^zO7l=qxMwORVz0d!MMTk6j+TPpA4|I#t0! z0eLISN}Gm=NkIbu7<-`rR=o4>lq=N(YQiiltjulwh_b11jljXz3r&LFODDW@Rww5~ zwMp%pKXxw|#cf_pM_5=MVm$dXUIFr({cFRY&&8Sh@7|pR%cN_!oA75#r(9YYLYrc1 z{C?*fnFkCL*#RG@ALfrb{{=?*z)f@ljKx^Je0K>2gcBeCisPyrglAx;6nn17_C3eGJ;1gy`G_4swFdbA*u1tY+zE?0;ag_( z@{-@M%qM)^>yyu2j9?Y91c9+`Jz`VK^sq7L*7Vj*T?5uZb|B;H(QEJJc`sIZQ=rBJ zvT{006k~jWjW4d~PuXd{ic4=ZAft6I)F<1f_mE9-v+qrjjbB@?x0ZGe3r14T?5fe3 zt-#oMH?*DTn$Qw*FPBJFU6@lhF6uGyHR{doVp_JOnm*^hP@f>w{3dqwV}@-BmNLLf zH_$a9RG#tfW<~z#+3JZGo{%o}KTl4aENe~!C@+$SpsJxmzDgaCxoW|NOnPJ3%Q^d! zjiT>dd>v9J(_Nl$>nN7DBFCm zM87~R<)zSm^v&OYyoac~LRL8}Y)}BcOY{AdFT5ZthnnB`;TL8zE-j6BAYoAN!o8F4%J_C-x%HP~&6?TAc zK;qu}@Y@REhThm=qut@sz+rcRP%>O4)WgGVb@z|`igwx5J4406_&V{iBcg425%k~K zWhY&rjJ!%$8^utxE9IR$QZEpcw=KXoX_#Oq62L474U*~Mw;QCA-WIZ#Hel}CUr~im zP)WEgX#&j)aj?v?05EKw7)ZwDIxdU6>j@cO5Q!1vWIfvFHBEkE3F=gQj z-fsraqZ-W)0U|N7PLo~adVqP?$rp%J2;5p|>Ew7X_f%*bvq90p>Gl zXPxk^Ko*zBMF4JPB{=P~%nck2Vl5x#mzV3h&ITy)X8J5~%z#B^{$PQJY{qar7)4(K ztx~HP!2Rc(q~q@!FD7eQ2J^Hk3__21cC(<(gW9kkpsRI{%h(IuVdkv6|goLG(9t?iEny9CfwB#vo5_3 zmJr=x*#&QJbx|x#*MaJoTue2f0Q)9Cz^|QmkR7=OhZitXp1JitL-*{$A^z9TpIJvt zDxMEcq#kPvoc-3J6a4g(&;mgt*@e{DK-%}4*gjaEaYRpaf*&orHQazc4aK($fZImX zFN#i{E1l(GJ<|QMvb_2yvI1+qAL6|T=gu`JUfeqV{HY<}q_K&FtVh9W2nGgQIMFMU zB*HG{u-_4uwO%ttB|!uClUP|F%%Hl&M1Aful_WgAf&%HQD1GsPq1 zRj+>Mo#UEwz#E!irScZG3ILun7q;Pp#gi4ZlFwobFCEEE^F}u|{hYW`{>p;!?z~&7 z+YHm@Mx=aTl9WX!L03Qr{OAJ`U!G|70ZCs-NU!yo^*}!9CX!PCaq8e+H`1nIh7Zam z4KUN-3%RzGKHWz8GN5tTn?cB*C40YRUsmjV3%MRHtDt{R&QRhp37acETix!)fVW6o zl05>vZAc6|--%($TO(lntBxT)KNkHyuoOX>I^de+K=&>8yD(dL@bT>@FdVH95{&%= zUcXR${FsxfF~i(|x9t<_bm)2cNc!z=o? zf6tR2h|O>3d`L{-@#S>sAaHRC{Vd8a5I)E2zht>F;RZBT;4Ee`q3r%k^Oe|6f7#}e zUq+U#p$ubXPoZ_H=JvJIbjI&#W}6N4n7yA%d!n#&-{VklU2H{Yir$6K{SaVZ>4yGp zZBvsO4l0mx=ZFxv+P{HGS2==^nf<_Z!m0hy!Cu-1~dBT35oFV?(vF4LCt3A_V2|{h`|UWQ!J_axaQPe+)hl# zV?-dU?01r)3w1NJbfFlAj);0$GO&AZ;K*UkTxK7I$bn6-`LfEM?8OYYITMbxqPw5;f z5hFr+q<$sn4hJa2s21|to?BtYc5hxF1aKd<3*({Y*{Fc&mfBp0AJeG8OD}@Y_5tvVo*}QbK0EU-OiA{eqq;sY|l8 z-0#pSnp^(7c~ix`QH1HV^gGO-+reF1sAoSE21j0-w9mALdiha9`mPXprX7yh&&Ba{ z{@Ow1F2BFUWI2B%nTWv4`?W^4c{G(pYh;!~QQev4rEVRmj_H&2)C+ zcnxYc?Y=vsVdE?Kn%-a7r!r!h>G}23>w#Z9Zllh1eKT=1RI( zs8I2^7kB_HIVh`yF zAHHSR7Oh)qt{Fu3)`_VW?ASdCY{Yy&;l)meMl`*5y+d?NU8&~)PtT{Amnuk+mNtGI zJvg{_wAE!oK8~d~j{lr_cX%Nw^U%vQ*Rc~xV{i|=E zy?wP+&ra0?-NA?Pojp@0sNmRBbZ0p-ylLV6js9V(szr|6*}n!DDoZnah`MuW=yZ$4 zos&QV9~&abgLKWgUZ0#i*?+zs2bRCl*Iv0-QDT5tDK&kE`FM>OaD!nTHjufoR%ZD~n`b{m|Q7YEog)-7XCXX22IGB!^EO`PJ zvVF|0Iu~%yCfgY${sQk;bJ}j4ZRAagkxrIzKj>&bnh9uNXyTNlGM@PfxSRKiGh!mn zHDW&I@_`!|=!~QB)YLBme~cpk=mEKKg3*}m6^E!iJb+H%7L17y{8sf`bJ_wpSP#es z0pn&*m`@jV`Ls#0JYf299GTZpU<#NM)gK|AqvdyeCc-4~orn0ke}9gvBu+uMI%phu z+cwbl&BO07-|GP3bK33Z2hR804s(5zIyBq+^d@x20$CpE-$ru0-ej9=a2rp(VUw7r z;K7Dm2nIG?cK;~&H&sEQ{q>ZceStRbzI;y6I$AKgD{ZsL@txIrEya9IFfU{OWDN^$ z195+s=>mejb4{#ew(qH2B0g^GO(V<(ZRXQSe^P&Iy7f&$4TaXtOI;k%BPD`lDec5C zwQcl^T^V{)<1pg~5bus|AL3n2dfRI+ImE2h!b}r8N&xhnSsIegjU~ zBTlvA15_?Q!XxC+d|dgDTmMQVBdyg`>~J-qCV8^(ab~UoH&8(C{l#*JVoJ4#I8kcDllNbW;Eg0FV*ODbS!t$qCV53fytC zJXn8g3%+Re05NF_xZ*)}5?j zA{kG?wR}LNU&o=|;pLx#rbuoWZ3|D4bJ?~y5Rp74;Kc{uj83j!;_;s|cPD^oXyM$q zJm5Cp+-OWN;{N(T&n#e6><(!t(95F!r_^)v3$<*YNlVqdc0CjB^9FZFWI5VyRm?tU z5ArL=k&5>qT0Uq;VsQr=Z)+koqd;79sE9;|p*OZy1?p_tR4DHxZ1Q6I9`+JH%=JP5 z2i63nvhriIlt@whsA|%yUvZDpL;r>^W~Ejy{v&$so2cvP$mmYb zYa`3yPm4_(8%@e`{sZ?wV`dv_F8+)+1#z-cTMx)=KW3{ytaSA*Y*B=d@;bA@{fUmQ zUXZqh8HJZ_PfUT9pQxSV4}>wlPdsIF&Ty#Mx@j~YF{C;Cy;eQ&P#6lR2&BRJuKVd; zI;$+fJ`|IjaizZpM|Maj%j`dYr1%RetaIXcoMOTokH=ikm7bidfj#os&yOWV;0;e1 znVDTJCjAn@9<4?lwr$irG`mj)!2e`L^zPmumM6105=KVK0Dy{WJQ+s$FR$SJL23*5 zoP!;X@wiH~Tg-g|#EVr{hf;lh3nx2nAT=mlvISjB%Zoq%@(^uA-7&{Md19fZ2?!Xi z;};6}AL@&y(g0D>&y38q^e@7?NK8ny)VB~`Uz9bn>Eu*jHI*ZK67|tMmq5e zAVIuf20j z#8aAQPKQrgx^(`Tko4*{1&{$6W(kIu#4?fd^QQ*BT$(9+P?sx_H`Ce(zO(x8{|j(S zZ@2EqJV>2NsNMPDapq2az{%9X`xC(LoAWCXC6chv59gnN(2woKe$+%@4T3~}@{pR$ zJLt+U4Oq2D^2Mr5pQm@|6RMk47Gl7dAoE;F%oE&z|g+_7@I{2u8QTVc1$IUFgq^g>IVe&dAr_M zQ>p=80>@U(5dn()%Pf-Sy!=RH1^+`cG9f~(e^~}v9+WdOKaj8|ZkL0!#5VAR zGV&9uo$S8LRuL4rfSqjnLs1@R^UAO6+(lO?=${YP1l6ZrE%&DWopK=l5+t~I&S zFMGeg5xXoaDS)?=%+p|5Rr}|AVhj6bQF-PL~4-ULx3cZx)c4q-@e~_?e4XE z?LRY_%*;76r#<&`pZh#h;@r6JtZ0#`C28E=E#$pg>l$J8 zcA7nBX#a8A^sqks9SH;4d*zT_R}X5KVmaACOXOUPoXCKoZR=@Vk*r(Og`Iu1>y|g2 z3=Ej;O0HYbO#*s^B@x7&rM4MCq$K1~O-&JSF5UHkrxE(q*z&{@r%~&XbJk{Pta)5_ z(*#T9I;VWk+PR<48lxCD(i

B_%73AnXBFiXo>Rs`Xb7nn4d30krjTw~W z0Kn=!ftPy?18(!F$0x5pl$j=fv9q48CuroYP0D>DL5yfbw5Q=d(!xI9Y!17Y3}S`C zMUk|JSTpmUes*1C^7f099I89Lgx*yuC>H^pCrBq{r~zQT``-Xv^mRw|SJ7yU@xSA` z>(?FUFn_Qc$6FXNX-1Qd4PoC!CcYw^ED<^la+iFOx5wc0G^;3a#lU^@29~wyi5H8T zV^R0bn^};>i1TBbry^?Lk?x3$DB@Gr%BL6NBAE%3YL=had^W0H!D2c4Ul@j(%G@_U zJ@UpSK&T}UuEqJ2)^z?lt%1V@+vMJ-+j#2_)5_}t4Qp+)858wB$tdyu$=g@Y7H|Di~?|2B7XWbGaXOL&z zvAXo4r$UXxVY8-!F2I1Vl0E=HESVi#9iXzkvjZ-Vewv^+yGV=fS}-AM=IYL z`GHL$*p$A(f{#mD&Plol4~^C|{LPuD&Jb}Gyf*4*ybmMDhLxi|C#V0^2@KxH5D|9l z_Gu}LaefI5(THEQgCUYazQ+69Oj z@liJ?1bb-DpFD@(U%MQA;g_hJve{LwO=x)sh%*w9|Fxly8CegJkht>^|DuG&hbF_U zuxR!XTv1WP2~#sP<`XiPk^Ru*^C3=Z(J5~d1F>m6khHV(FU&QCw_jzH9V3ddQp?A$ zNV)uq%^5DYhCaE^1Y~Pvlgj6)MMasOTe;{Cb0izt3l1s?{@|cL8)NA?0(7@{9POk( zFZ@{hB>H8Y=_Vtv?zkOSdBGRUEGS}`m}0aK(w86nKcfHODfFq!JN8!@uDUN1a?$gg z%LkC(5)x#{UXt({kip)B(I)ZfGtUN)4F5YU)xNCpm`C4+Y^}>SP#dvMH*-W2@FrYWxE63R;xc;*(u$sB~o!bmtU2u=f#!mh(QZyc92#l)PJ7vGj#sOZk@Id}L z$IC%Xr6f@8@k+RXLtAQ(d7T&}!kiUR+V--K(3_2(fbrol&@;n$0_r?m80ecQ@2mk) z4#>e;U7;v|K&MKf#_>Q%$1EBYnKzYc#cX_c%pk0t0WK4IVG&82Y=TtV#}ixF=BX_l ztKM{tcmZq85T+8^RkvQjK?6776v`n;Hkv9ZB64T+vqQa0%eSrWxb%Ne)qk+AJ-r9+ zLLzW3)eJy$E!np74j`%pE=tv9G(l#ZXYRC?EEMx|h40adHadopa z(pUljFu5$90_jyr{BAo3oLU=ZOFO}-bOyJS&}+XJ-}C$@d@c{|_mkG5RsoJ*cgS{d zxR|9AUvL7=t#b~fu2*<`HVFe?5z{okE%{BBFJZwa7IlA4p?3cAuX+M)!-uwBj-(5D zH!mldeponCpvlCdi%`#)eloKywfNmJUl!SNSE^&jF|&oDN~7=ggI%~OO)q!DvUkZ7 zH6EQ56zz&NO!9^+Iw7KzHkr9|6Bp>Qn)Xwrkh*h}_OfK%>@98bi$x=LG-Psjw|&`A zW@{cf7hf}aZ0YtLnoIA&Lqs0@*pt$l{&sWCT{Fafm*d(iZL?~d_f$>E;O?umiXHo5 zOZde-1`6I~5Hcmh?L?|w*xpo6U;v)R=p{~*e0vx4`xl1i7KNp18;9*kcR&}5@pO}* zB+W0hYai4-sSCD=q{8E_y4zh=g8A+jh(7r(+OX*Sy^HnV;Z$JEZcn=mQ5&td%-hf9 z)s6_%QPK^(?;{?q7hF$$#&j~B_(ZxTExZ1+`_YPOA==-zBMc zxC_<&vhyDlNycm{w&<6@XYP6iciXv99t93$jQOwX+$i6=z+4VW~gNd7X3EReXrvE)2H{GjZNwyXowu99UBvG}bcog4zXD0Pp3nfQ35w#jOsJNOt%R_V z?d8XxGf|6G*juiOpbH$J)6^fZBFB8MV36f0r)kD89PYn_^wXXR-At3Aiv=CS;1LM8 z5_|W+OvvvE*Hgbf$kl$rada9o=U9F9(e)1oHQCpy-0BuzUZNuf*>|d<=1cfo!k1|+ zT!O7^Pd!(O3^H~MI!HKb9&DbT@Rpdc3yFBoaCX^kvu$RseGXsT`+N}+yx@FSA5c>i^wKiYr0%CEgTQIikMeRSq14-Onu-< z)+Mg4SEa{-7CuxxrS2GK$mr@#1&t0OPA9;KwnIwQ5OK$yNSIN}vy*1>t_F|#kK>9& z2dm6?D0JYP=|DQRzrzX~`TlIDx5rc+`G!Fj#HxcCk(hQ6tG+q1`cnC$E62g}p_eaw z+aJe8ai2F2z9^T-h?LA3ln(Q}a$q~0GH4gX7#|<1;;X+--N-3PJ;|D93`h@j)W=^KvrE%||!y7mJUwU|V;nxG%U% zYxUGR_eJg`VJOnPexZs-)glt?aV6Iv?tLq@U6E9 z5xnXxc(s`>?M)p@ZZu1kQ2#dr40JcVlSoh^!szn{Hm!)KFmF<1reJMj6E9m`XPi^; z#f=1e3W!NioanBU3-@{?teo6<*_i)@ zbIwk%0x8>IZtFBsnz>f34x{-TuDg_0E-CnO3Vsy)KQj%9fGbPm8|8x^GJ!B}_Szq4WUN`=YB7RSQ{ z+&q68^3R6ISZd^Xqro^sj+s-ZBTQLeJR6hbcryDhLX%A0s|RNB-D4~>7)QZ8+QZ7~ z%C0FEUIb+NbVLvZ`!V7#B0miv(TE4XUVs$*ZcjyeR6-5qc@1aF10)#Di9V_$s&@M> z?)v`Lwh^XtXTMbT11_JIyyQd2;EYJ9z%x%Q<-F~*QPzzjZT8!ETOM{7)*5MK@uiSb z#exGy4yiceL3Z zQIb1%@LBtI=^q>K$ZM-p=_B=e$W9}QKAtxRZPf0PjcN$SBzT6wXxfg?)T*W;Nn1%P z@=;TN?f@fLycx6(rb=9ra&nsb9r^)>AZ=dVn}EZ_Dri|SpTdug zbfY;)2L#w+m(WdiJXo)7?!8pe3L5?idiV`tot#_>P7To~XgXC7?jbI!P^ES46P%}9 zT6KRtfNNAQy7!1n5Ls`YXoEBKuOsD(xqC>P(3x!e-$uK549N$pj=!S ztK*OY{V98fj`%tB>aBYfR=C2!sPXFVK2`nU>1rogt`&c>-{AIwWcN^j- zNLlRg8-M(<3&TmDmy1Cak@WEqFy01T{`eo^P7|F%EbZ*<9^4mtUEyl|*~0!Af@ z?w!&7t-w)49Y=O~xyf4%Pu8dLqH*wb$S22NphicCB@Q!m2Xt;~J+U{;b`q-nc>i$z z^!t`5aa<8j=RrRXC3wzroXe;Klp%4o%@M=62H_Li17+R*>3KWqz?*%qp*QqTjLs{=phPf{o9K|=e9|Ioi*6wfvg`aR^>Q# zF7myqLj8V_+W&AbubG2INa$7kr|Ws7hoETYZX>d&$4~q)fr$_9+ma5${%TkVYyjmf z4HQZq`sQEfhIRA*-eH3V9`pOdIg6#!{)FB13Gi$BCV>@m=x2Ft)?-9M?XyI(| z_?r4dobXptV|Zjaa8U9d@4Goz4T0W@2&L!^H0T1J>xS|Hq8BA{tbXvl06^YYfl~NN zqmB8W#%BNJ?z1lR!&a%40RigI;v?Aq=D~ejVJ)&AIC>2VO;C3q%?9NqffVkw(W5`c zi-I%h?G+3UHM@7@(038;R!8H5Is3WNyV@IcK0LqE_A%Sc4LjjgDqiz_Z%DVifWPe+8@3}X@K@ya)pWb;dYO#2M1rmj+~ z=lg}_81g%c4}azHlpX&S^N~H%NN&`Y^!28Y^+B#ECNZzncEQZm->y1>D;c&~$znKA?G{b5Tx@6x{ahb``8q?t=xL=MA5 znn#SDlhG@=D?I!;AP4we?Nt?(`%0KdWG@fm{A{&|&UC-c)VY3@ga@yeb%Fd39}XbY z)Vw3V-Q}k?PDw0`V77TKK`6Sd(284WMbz^ju|>rAJNKUqV4_9}(!*m;QQtk!1Az9_ z`Pk`RTtZOQrFl(@^xr?T@K%}jNZ)a;S7_VDTNGP3DWZrfz}W|s}R5IJiiV=pYMrd0`JafPDb=}>ot!LGXkQ{dPn;l$5dHkC5|lK?_#4b3@!2vWp^z3Zu8eK zVm1*(gGghzXCH6nx?Ee^M1zD<19*<>L80`HWDwryDrG-Gx1_x@L z%d%wC9A)h12mG@PlZ_u3^dGx+eg3QfE*>~4FVD%=oOna#TTrRCr~PsP)D!+a>Rv8h zoijz6${9KcD-80vEOz6;VU@#=&F0DqiJz3c5+CS{vvrveT~@hn!kz_fpc6W?4-$gn zho8rF@wGc2R^v=BYN$@|?Ng|nI2wf)_us^dmD%T3wIkBQ*)+n#E{TG*#5OK}nr#CW z@1KBLetpJ|zyp2#*xWmneeS8!xAPOt!kX~;G~pND#h!qx>TZ$uu%Bc-8D?iE$?Yz+ z-H*)0-uERWWPPj{OT=4A#Bny9W;6|z<-r*(DdQu!nQFomUJw>AwJ`S5Wuj?UG0}iw zvAf$cw4n^!zDX@ah69}}H$~FTDH}|(p=-U_6dUY89a63_ElxdQF4_MkIst4I-6{4j zSvFGRQfa?NBq$9v-d(x(ilg!LA594xT;obY-WL7*V=$mruBsPmckG>DBJ>KwR}HGb ziP5{awyd(74vclda}R93(0I>$>w=wK%2xA%k;(DPoyFS^Rpda?)=JjZGRaWy47U7y z2KB3N!2|Q5OwPw#f0^L&tc99w|0^?u(VZim%-si^wKFhPYouii=In z`b+4sDl{1nBP`7f(;x8X-bS?7eCHmlv77A?*`zd3No$j{RiW7K6DQjquHD@g_h?DR z+jV5fCM{_Cjn;L#Z_OrLGK=YLDRL7WGs%B_2B` zKRL^txP_ehwfB4W`H?;1Ou?m|o3VE@4la3UgoSU}?pAa<&)B1x=Oy=kYA)BpV(&J_ zK0o54yH`uJ+|-VK77Q_nvWN*u=awNHdA*PtxAdJxEWJ&B_*3<5Ztg8A-m$T{_*Whh zo$UM8XD+@aS>7uPIie&qkWOpHiI;hfoa15{WS#+k-`oE%`=l+)YoDF+x}Lm}l3++G z)F)qHywymQzfkAkpq%!!#bZ zzCD`mT>aMi`qdK?Xx&UrxTmLL*Gu)ICl`-iCkE!`<_fFbY4&wrL(m?N+tmbNse7cG zhNd*(D?gro#qbXlpj{2k%($*!zc7yx9w?w~eH$b;bneWfy1TN=h8WwQ+16%jX6Ka% z#m5Vq{ir#1`lH@0q)}ExUi=X+?29rLCyEPXpG_fzX&g*IVjz{4L4ZU}^T5r*?G=01 zJHaPXqCJL(DCSc)u_5oEwd{iqQHsSy7cM`L>nSRVe*QVi=v3y9soPos9S|}`1Ho7nrmB~V`|_o zQ4bT~chR`@^&8&AiPvu;`j=(D1(j%sgWc;noDvLUD_HPFE)Kw>IQZlmM z{%;Nq?pcCW@W72E`st8&XcrMc`I298QpLKR-OsCiXAZ>!Goz;kPuwD|@T5YE?(!tb zxx!`Z0sdz4Ni9hEt$6XHpxCDMXt#Ir6pK`^cU8|OW8xZ5CFcw=&DQV)>5VBmcXr?= z3RKlfhFTt6JwCg?%DC5Rc|Xn_^3*x785T1m=dj7Suj>vYuQX;Z z62OS(s%e8i{3MVXkqG87MLo2t_GZ(^FWP{Ge2&{-eN2aicFz< zX78z+CqnCBbvJ=KeoyH`3F8JM`!nc8kq8fD-)UeBmUa`6vu1jXH|^xCD~xGd-0-6AW3eNCNc0!TMvhJxuJyb#8K+i|?P;t+4E&``N%n`4Xld`F zFs!TD&^?3~wuov4OkgB3Hv@!-7|r!8;so0kfl!}G*m|7R*RrA+7lkjNdXzdgG7U5@ z4Ped}8|gd|ng$xeOfpLG?c>E>Z0_su_Wr5!B;C%PMQ^qI=V0Rk>%DPbaZc@@OQ*^B zb-CQvO*fENbmVBW+${Lt=mrMj6WXaa>k|Qjb8Smdsd92f1SM6ina2`at@nOuD2rH8 zci|g#SKO%lPii6xq&ll|blr;j7?}AqSsYa&Y_iyEUy=e^B~%ibuav@CS0}#?PFpFb znJK4#msM2sC%I785(*}~L*d8?#!J5~8}%o^NjoS$!D;(Z&fObL`(R>F>@wyowNsp9 zeI?0Dc-&rM|HsBHzF2ft(60N0k_iC#o|MK7xK#y=GqkuKo*|^RIQ~fnoOB{wrN7LD z(89+?+4OW!)o4YAEs^4?kxk46S%$x^-R_8FBV?Jm#a}w=pp?Krn7II=b@#-dxww^# z-JL0Va17~i?vwO?Vp*LT=^mde?>~pn-iXx&Z1j3rRy|x8GES|(87$hTlQ~#VUu9w~ zR?`5CmWGdIX6TB1JC@|L*%$mR&BP?mknPNpj?M7|v$jT=)MFEG7E$M|*63?RjvtOa z1=z5azkYqRCat_;DXu@LqGBn;L#9K;p1~bj9jeXlHU&m?jE?5~Ee2S+lzl9QB(0uf zKFp>GhUE`nysu``cU8i4;W~jX%=&G3h2e`%IXl2hnAEV&`}lDuH%F$iI&}ZutreS= zH;cY7BMNX!gW!r3X5dLF-5;3vLID|Rb#;|b!O-wWshEpk0Ufsvr4{Ex_)BXzWz3>%Zn0KY7 z0{~d+U}FcW2~z|q8(RTiqF>1b`Jn?D4acQD^P+tBjJqlZLO^p`a{~syl7(GN4z{+v=rpLMpksH%f>vk>`@Uvei*(~NdL{jZmPHHe_iF*sy`k`wA`Mjo?ryX;#~}?mNeP2}e4*dC$VoBV1;k z`Z4LIOOiF}U{_Rn`Ins_xn@fJP2WJvt>Pxy)iw-XN~-WN)Y(A}kV190_O3sS2-G#8 zf>q*oggHFhAE{Ii-?EXlX7JheIbVVzm>AFp?*@S~+>w?9%-v7R@3py^s+;FTg~LVd zXu0cIwegNVw!+oPjRo%@H`w4ZVB0a+5YgrMHJ652{n;Y!9ec6rcn2rkLRC%e335}5 zCu(}I9xXx*+lx51)BE-9i?IrkZ`=MZUcqBZ#dMpM*-LvY& z++bCwh;Q?^FA}~Y9 zZp3!;f*%%p`)ylavy?g(yz~ZLtf(Jh6<%LQ%vTZ;mST*-``F1|kWqPwo_d z9m$s_JH6KAc^vrst48T4yo*a4crk@%1hPkaBe%3~o_U!?<*)6Em@7bbe06^cpq;Sp zzw_xu_pQB@NosQmJ8JPv?-N2CKljQL*h-tIM7Ex#Rwvdr?n{p0wTUaK`e57=(^Q|; zJzs?9Q@Q*0X!y6uxE)7}Q?AQ(uqpzwbx%@}IpSni*%No5e_BVtfuLmEskC_1^XJH= z$t}@wr!nre7}DhZqB<>(7M1ns=0lGjrerV9%D#vr9|jUrMseBVbCrh%Ggj-*{nR*l z8@wf?aO@A;fqjp;M#`~Yp%|m^lg+l*<^Ya+|mb_ZO#J`|4Z-j zK1aN~W0#hbXfqSg_s!vGrm*hCAgH(+vtnr6mo0p0_uA$!TV{jnMe|XvQQ)kRUGxD z@ZK20rM}RVaXIiW&&yybsD#vHy){gXjmZq^(tCI<&T95mZX=mjRrMri`y+pDEnEBc zZb0C|rNmEQml~Hm0C;O^z-sqyvu!#e`6e_<+O4!gc<8?=9=@WWuaTQJtSFfS9o90d z#a^805z2SeyI{L}#+lfHXg=SKGdMnHbYoqg@HlIfLcLWM1kbevW6`|u&5O=K;K5;) zYyggDHn1E{eM#}hT^Bhe$RqB9Yuv8x?nZa=SOjnzvCj)dzTeegQo+UF#4zM{zvox_ zqQ_t?u01(>=+2$vB8F>!hSkA?oPD@VZzixw8+3lV(*`bVj1Bu!Y$E;)jScwA3Sl9- zKI)-CAn*+$uY_HD&CeUyJnb%JuW{;t-qaHNDsI|4sK93u(K2HyI-*k3rHGbPx{8}q5z13u-EM= zSHN@B_7M6D?zc{j(C{C-c|ZnS4{ejnnp?P{0}C%?88FuFLESGF8uc2$X{MREx}8fH z9X%<^^^$Gw5(re85kg?>L|%RiBEw7mptYa;K~0@eO8uGV!CfFq?^)N&=c0j#xqzB) zNiMmci#Y5m4n29Y&({wD35W8cQ)Zbu0%K#4&f3t_?6SGsyN!0~+&gn~1$C#RM=4;@ zU#jKvXW*hubN{OKshDz_q9r^m)ly(xe6 z$UYW^*nikX_$>$ea*Zi}Qqg+mvr*&JnA4J}w{pLuqazy(1DtHE=dXQ@g6kgHsA)o? zHvriu5Gp%qZT1iF# zoF~d8+n-(xM`K{E{jO&Y#(uf3eN}t!!5_HrReG5j@HxzEP$jkd2N@XH{edxw)0gux zU=W0o?LmQoU*R>|2jQ<&gK8;N@xxgV0pLQc@p!s|@`?PJk1uv3mUNw*R&Z=)vEKi7 zf&J|4tW{%;sISV9(}ctI)6VO)2Xgm=fY&@V$ZG5D9Tza419C2_hqaFw{J52zYMAar za!=RSgM;`fF;NxlSzGU1vVX@+Kqr{D_tn6-qS1nxkwu)~-OeoFHwqpqD5jF#y49@i z&EQcQCSg=P0iep;AP1yCf9^0vbl&E>d1Ib4GxDjh7aX^|hK3+d0k$$07u?)((VR0q z#on77Zh9cDL%QsJ$En9AJZt$j&>!Ndxk)-^=sE8EYNNja{^91SY6wh*MX7`*gza;+ zekH3YH;d}D76^k^djz+-Ol*>}K!hQP zQA}B|51~+sfcM4j0I=+LF2U17L%jc|x|F&)-@-x+0DuAfmL>1)8iNj$?zrTGx6jV2 zJdl{U;ZfLDS6_0;+`NP7r!fOyd`jM0M@w&=YK4FRXEZhQ>gqs|zPR|B#`nv&ZH^v% zBLSw43t481`N#!+Da~y^gOqhZ;3PN+VI!KAnfbD($0Wa?U=9o#-bQsH;Tc;I9fSe# z$Wpkz2*byMK;8IHA1{XaMt;99;N)`GO!(Jpej zhAqX6Fwn!gL)hE9hWac>n>9)BF?@~Z-?IX?6(8HOH30zp9+w5d#Q^mD`=$$ZqB(Pai;ettfuv{{U`NqU|JpJrdADa|wh^_ZX!vPzKX zS?+I_vf#>h4<#b0_6MoJ!h$!4C&~Db@AI-j*spiuua}$&eh|Q@A6NLk*ujXt}<+)5O-Oa z0lhtiL;Xp7D3ryUb4+>Y)|HW}x95CcE3dffNPZ|)na5ZUrxZ?Ii}vldmumw9;V8}XAC zg&Yw`*oRSwwDkEi>(p_Fs4J^nW@|8+DGd7x49JHbLROG53i|`;nmi2wb?AF@*BRJP zn2>4v$-r@*N1tQeA;mQTAnL)oI`c=I6vXI0i%KPzMfYdDQaQALA1F?@B7d_IoPUa@ ziI{akIdVS1F&QdvaTd>wA$@=pjZ670F7Tj%FYCAfITa$mQ+$M%$f2JN`)~@ln8#;V z?5E*-21SZmNLPE7NBG?2K6lL^G=f= zzG|R0P0@A{jWqt$_5{5(wg~V$F~RTcpirg8Qn1e}8XW#G+;C-E^URrBZH6?-Onx^c z{~9u!%W=5<59qmx!cu={)yI#vqkW^w_13_r?cJ`AiPmfR4_E zi(Pk}gFq+9W!3F2g!L6D2&KXgPsFU_?bd6ZrH|^N53~#osE6W@{zTCtSM!2=cMYAt zZb+U(j{e5mi@s$?I>gP}eQ-v*SHp2y)JHV)4oJv~lO_4+@lR>N4}Y zp#71e_MU&0 zMDsr0f7d-h%Qt!&`ovTbD%Ft5iiy-t3Xnfaut1 zzb&?i>42@kl-AgDe{&{=@g_0b{rZZwSdf}}=1cp_Uwpf8zhCI(Urz&ay%Tds9^dHD|~=BspT zOuxwt0MGGq|0|9EpTk#fO8U^_*fEz4z$d?)zugJ0yN(ps-F~j44IJJJ6?lya*IuV4 z6H)8HpxN@*_YqnXI5OIfAexduf7Xh!|Cr7knu5T%07+ZI*~c-gXXN zdHv{J)@$@P&%OL-$FF*g;Wo>snidYas2aSM1Mp@#4i?NA_CIB2_&8dD!3R&$iuv6& zhFLt!PcKI`X;Ywi`jOokE=|zJ8X189MF%|Y-C|rdf`^o{{R(VvakRE literal 26336 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 CYrc~J From 1a56d8243e39b219e90eb930df2f16ac19a3d91d Mon Sep 17 00:00:00 2001 From: XDTM Date: Sat, 30 Jun 2018 23:56:10 +0200 Subject: [PATCH 145/204] Potentially fixes monkey fever runtiming on infection (#38776) --- code/datums/diseases/transformation.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 8008c185a5..6f51ba6622 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -90,9 +90,9 @@ agent = "Kongey Vibrion M-909" new_form = /mob/living/carbon/monkey - stage1 = null - stage2 = null - stage3 = null + stage1 = list() + stage2 = list() + stage3 = list() stage4 = list("Your back hurts.", "You breathe through your mouth.", "You have a craving for bananas.", "Your mind feels clouded.") stage5 = list("You feel like monkeying around.") @@ -143,7 +143,7 @@ desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 - stage1 = null + stage1 = list() stage2 = list("Your joints feel stiff.", "Beep...boop..") stage3 = list("Your joints feel very stiff.", "Your skin feels loose.", "You can feel something move...inside.") stage4 = list("Your skin feels very loose.", "You can feel... something...inside you.") @@ -175,7 +175,7 @@ desc = "This disease changes the victim into a xenomorph." severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 - stage1 = null + stage1 = list() stage2 = list("Your throat feels scratchy.", "Kill...") stage3 = list("Your throat feels very scratchy.", "Your skin feels tight.", "You can feel something move...inside.") stage4 = list("Your skin feels very tight.", "Your blood boils!", "You can feel... something...inside you.") From b523a59ae5c3f5c837ae7b4494a5954629a6b3fc Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Sat, 30 Jun 2018 15:09:29 -0400 Subject: [PATCH 147/204] Fixes PDA ID teleporting (#38795) --- code/game/objects/items/devices/PDA/PDA.dm | 85 +++++++++------------- 1 file changed, 35 insertions(+), 50 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 6731caffd7..db86adab07 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -533,10 +533,10 @@ GLOBAL_LIST_EMPTY(PDAs) U << browse(null, "window=pda") return if("Message") - src.create_message(U, locate(href_list["target"])) + create_message(U, locate(href_list["target"])) if("MessageAll") - src.send_to_all(U) + send_to_all(U) if("cart") if(cartridge) @@ -562,7 +562,7 @@ GLOBAL_LIST_EMPTY(PDAs) if("1") // Configure pAI device pai.attack_self(U) if("2") // Eject pAI device - var/turf/T = get_turf(src.loc) + var/turf/T = get_turf(loc) if(T) pai.forceMove(T) @@ -593,13 +593,13 @@ GLOBAL_LIST_EMPTY(PDAs) return /obj/item/pda/proc/remove_id() + + if(issilicon(usr) || !usr.canUseTopic(src, BE_CLOSE)) + return + if (id) - if (ismob(loc)) - var/mob/M = loc - M.put_in_hands(id) - to_chat(usr, "You remove the ID from the [name].") - else - id.forceMove(drop_location()) + usr.put_in_hands(id) + to_chat(usr, "You remove the ID from the [name].") id = null update_icon() @@ -607,9 +607,7 @@ GLOBAL_LIST_EMPTY(PDAs) var/t = stripped_input(U, "Please enter message", name) if (!t || toff) return - if (!in_range(src, U) && loc != U) - return - if(!U.canUseTopic(src)) + if(!U.canUseTopic(src, BE_CLOSE)) return if(emped) t = Gibberish(t, 100) @@ -707,57 +705,44 @@ GLOBAL_LIST_EMPTY(PDAs) /obj/item/pda/AltClick() ..() - if(issilicon(usr)) - return - - if(usr.canUseTopic(src)) - if(id) - remove_id() - else - remove_pen() + if(id) + remove_id() + else + remove_pen() /obj/item/pda/CtrlClick() ..() - if(issilicon(usr)) + if(isturf(loc)) //stops the user from dragging the PDA by ctrl-clicking it. return - if(usr.canUseTopic(src) && !isturf(loc)) - remove_pen() + remove_pen() /obj/item/pda/verb/verb_remove_id() set category = "Object" set name = "Eject ID" set src in usr - if(issilicon(usr)) - return - - if (usr.canUseTopic(src)) - if(id) - remove_id() - else - to_chat(usr, "This PDA does not have an ID in it!") + if(id) + remove_id() + else + to_chat(usr, "This PDA does not have an ID in it!") /obj/item/pda/verb/verb_remove_pen() set category = "Object" set name = "Remove Pen" set src in usr - if(issilicon(usr)) - return - - if (usr.canUseTopic(src)) - remove_pen() + remove_pen() /obj/item/pda/proc/remove_pen() + + if(issilicon(usr) || !usr.canUseTopic(src, BE_CLOSE)) + return + if(inserted_item) - if(ismob(loc)) - var/mob/M = loc - M.put_in_hands(inserted_item) - else - inserted_item.forceMove(drop_location()) - to_chat(usr, "You remove \the [inserted_item] from \the [src].") + usr.put_in_hands(inserted_item) + to_chat(usr, "You remove [inserted_item] from [src].") inserted_item = null update_icon() else @@ -768,7 +753,7 @@ GLOBAL_LIST_EMPTY(PDAs) if(!I) if(id) remove_id() - return 1 + return TRUE else var/obj/item/card/id/C = user.get_active_held_item() if(istype(C)) @@ -776,13 +761,13 @@ GLOBAL_LIST_EMPTY(PDAs) if(I && I.registered_name) if(!user.transferItemToLoc(I, src)) - return 0 + return FALSE var/obj/old_id = id id = I if(old_id) user.put_in_hands(old_id) update_icon() - return 1 + return TRUE // access to status display signals /obj/item/pda/attackby(obj/item/C, mob/user, params) @@ -813,7 +798,7 @@ GLOBAL_LIST_EMPTY(PDAs) updateSelfDialog()//Update self dialog on success. return //Return in case of failed check or when successful. updateSelfDialog()//For the non-input related code. - else if(istype(C, /obj/item/paicard) && !src.pai) + else if(istype(C, /obj/item/paicard) && !pai) if(!user.transferItemToLoc(C, src)) return pai = C @@ -926,14 +911,14 @@ GLOBAL_LIST_EMPTY(PDAs) var/list/plist = list() var/list/namecounts = list() - if(src.aiPDA.toff) + if(aiPDA.toff) to_chat(user, "Turn on your receiver in order to send messages.") return for (var/obj/item/pda/P in get_viewable_pdas()) if (P == src) continue - else if (P == src.aiPDA) + else if (P == aiPDA) continue plist[avoid_assoc_duplicate_keys(P.owner, namecounts)] = P @@ -949,12 +934,12 @@ GLOBAL_LIST_EMPTY(PDAs) var/add_photo = input(user,"Do you want to attach a photo?","Photo","No") as null|anything in list("Yes","No") if(add_photo=="Yes") var/datum/picture/Pic = aicamera.selectpicture(aicamera) - src.aiPDA.photo = Pic.fields["img"] + aiPDA.photo = Pic.fields["img"] if(incapacitated()) return - src.aiPDA.create_message(src, selected) + aiPDA.create_message(src, selected) /mob/living/silicon/ai/verb/cmd_toggle_pda_receiver() From 2d3969882a9db26b3cea9080036f047382e95265 Mon Sep 17 00:00:00 2001 From: TerraGS <40574831+TerraGS@users.noreply.github.com> Date: Sat, 30 Jun 2018 06:25:13 -0500 Subject: [PATCH 149/204] Updates plastic flaps icon and cleans up its code (#38751) cl imageadd: New icon for plastic flaps that actually looks airtight. code: Update to plastic flaps code to use tool procs rather than attackby and removed two pointless states. /cl Gives plastic flaps an airtight look to fit their new property. Removes two defines that were just a functional copy of anchored. Replaces calls to attackby() with screwdriver_act() and wirecutter_act(). --- code/__DEFINES/construction.dm | 4 -- code/game/objects/structures/plasticflaps.dm | 71 +++++++++---------- icons/obj/stationobjs.dmi | Bin 78602 -> 78613 bytes 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 157069f4eb..0d088c903a 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -28,10 +28,6 @@ #define AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS 1 #define AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER 2 -//plastic flaps construction states -#define PLASTIC_FLAPS_NORMAL 0 -#define PLASTIC_FLAPS_DETACHED 1 - //default_unfasten_wrench() return defines #define CANT_UNFASTEN 0 #define FAILED_UNFASTEN 1 diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 395c0f42d1..80156535ef 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -8,50 +8,47 @@ anchored = TRUE layer = ABOVE_MOB_LAYER CanAtmosPass = ATMOS_PASS_NO - var/state = PLASTIC_FLAPS_NORMAL /obj/structure/plasticflaps/opaque opacity = TRUE /obj/structure/plasticflaps/examine(mob/user) . = ..() - switch(state) - if(PLASTIC_FLAPS_NORMAL) - to_chat(user, "[src] are screwed to the floor.") - if(PLASTIC_FLAPS_DETACHED) - to_chat(user, "[src] are no longer screwed to the floor, and the flaps can be cut apart.") - -/obj/structure/plasticflaps/attackby(obj/item/W, mob/user, params) - add_fingerprint(user) - if(istype(W, /obj/item/screwdriver)) - if(state == PLASTIC_FLAPS_NORMAL) - user.visible_message("[user] unscrews [src] from the floor.", "You start to unscrew [src] from the floor...", "You hear rustling noises.") - if(W.use_tool(src, user, 100, volume=100)) - if(state != PLASTIC_FLAPS_NORMAL) - return - state = PLASTIC_FLAPS_DETACHED - anchored = FALSE - to_chat(user, "You unscrew [src] from the floor.") - else if(state == PLASTIC_FLAPS_DETACHED) - user.visible_message("[user] screws [src] to the floor.", "You start to screw [src] to the floor...", "You hear rustling noises.") - if(W.use_tool(src, user, 40, volume=100)) - if(state != PLASTIC_FLAPS_DETACHED) - return - state = PLASTIC_FLAPS_NORMAL - anchored = TRUE - to_chat(user, "You screw [src] from the floor.") - else if(istype(W, /obj/item/wirecutters)) - if(state == PLASTIC_FLAPS_DETACHED) - user.visible_message("[user] cuts apart [src].", "You start to cut apart [src].", "You hear cutting.") - if(W.use_tool(src, user, 50, volume=100)) - if(state != PLASTIC_FLAPS_DETACHED) - return - to_chat(user, "You cut apart [src].") - var/obj/item/stack/sheet/plastic/five/P = new(loc) - P.add_fingerprint(user) - qdel(src) + if(anchored) + to_chat(user, "[src] are screwed to the floor.") else - . = ..() + to_chat(user, "[src] are no longer screwed to the floor, and the flaps can be cut apart.") + +/obj/structure/plasticflaps/screwdriver_act(mob/living/user, obj/item/W) + add_fingerprint(user) + var/action = anchored ? "unscrews [src] from" : "screws [src] to" + var/uraction = anchored ? "unscrew [src] from " : "screw [src] to" + user.visible_message("[user] [action] the floor.", "You start to [uraction] the floor...", "You hear rustling noises.") + if(W.use_tool(src, user, 100, volume=100, extra_checks = CALLBACK(src, .proc/check_anchored_state, anchored))) + anchored = !anchored + to_chat(user, " You [anchored ? "unscrew" : "screw"] [src] from the floor.") + return TRUE + else + return TRUE + +/obj/structure/plasticflaps/wirecutter_act(mob/living/user, obj/item/W) + if(!anchored) + user.visible_message("[user] cuts apart [src].", "You start to cut apart [src].", "You hear cutting.") + if(W.use_tool(src, user, 50, volume=100)) + if(anchored) + return TRUE + to_chat(user, "You cut apart [src].") + var/obj/item/stack/sheet/plastic/five/P = new(loc) + P.add_fingerprint(user) + qdel(src) + return TRUE + else + return TRUE + +/obj/structure/plasticflaps/proc/check_anchored_state(check_anchored) + if(anchored != check_anchored) + return FALSE + return TRUE /obj/structure/plasticflaps/CanAStarPass(ID, to_dir, caller) if(isliving(caller)) diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 8761662a63b707b4f00799dffa9489d50e012813..67c1a59c511f74ac54ea1bba5f3e68065867b15d 100644 GIT binary patch literal 78613 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 literal 78602 zcmce-by!qw8|b?zNx`6`1(ojZk`NS7I%H_1yJG+aRHQ_@q`Nz05CoJisiBeX8f1nU z_Tv5CZ|{BfIe(l#&ULP9hP7C;X4X^pegE!wK4@vE+$N$S0s!FlGu5ZB002AW=1p)5 zyh1Yciv<91nf!GOJfB*7Si0M}dfK@-1AuQvLCR1JT#Te|6%jI=5J(wO?)A z*Gs75z|^+H>!sO>!u?xj1DTu!x`$=~-io!mcFoO%Z|J_@ytF3|5McATL(^PQU7JS@{~K zJtmHxso~~)GVf_soW}U+O@stFim7Wnls!;azew-nkUAGdSf z9fgNf(o;v?rI2`grm)1m|2+vix`}#p;l*Q|#?Y?{W!8>#1VY2UcGcaM@4B1^`O+QC zZH(VvzV*FIv8&CJ94TwLHSl(f4UyB(_~0TPpTm$L5zp-?KU->OLTV^LmO)6&+`JhZ zNAgvy-b2JVX#{FU!()0>fWg{FfWs%P?TNkU@ZqgbZ)B5Sa=C0jaeMm3Ozql~;d!J= zb&g?rZR*Om+UD3dkqddXi*8W8Up%d!S>3m{Cgj5B`&SeQ-|v&$ijlc6qa@y_S$;yv zrK%MMCk{H2$xZi8ldSroaT>!@R6Xk6n$o2(u>FdNn7fFWovZ%pfa`()@n|Zyf=n*b zcXjKNrpaEj=P+x`)bIylHQTYTKJ@;L*1O3*#)4xpEr?QL8pA{BI5v}%gSC`g9u{}5RbjYlG zK0lqXjo_t;p}#iiCwcXJ`DprN&n{cOJN@de$OEY_dZ`k=!hu=tXY-PmO)tM%U$R(i z?!QD(WutVKX{3k_zUKQJaH^?4+27@Qp^>FY(Fek;j5&Lev5=mh z13M+E({>Dhy#yt%mS1`-jncG!w*IQsU7z*w%ikx.TSZ|?YSBOJ{xZ|zFG4!tM4 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ã$zoGO{cL8(T?N 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 Date: Sat, 30 Jun 2018 04:54:20 -0400 Subject: [PATCH 151/204] Cleans up leftover telesci teleporter code (#38789) --- code/game/machinery/computer/teleporter.dm | 37 +--------------------- code/game/objects/items/devices/gps.dm | 1 - 2 files changed, 1 insertion(+), 37 deletions(-) diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 9e12a7bcdd..b9b95eecd0 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -5,13 +5,11 @@ icon_keyboard = "teleport_key" light_color = LIGHT_COLOR_BLUE circuit = /obj/item/circuitboard/computer/teleporter - var/obj/item/gps/locked var/regime_set = "Teleporter" var/id var/obj/machinery/teleport/station/power_station var/calibrating - var/turf/target //Used for one-time-use teleport cards (such as clown planet coordinates.) - //Setting this to 1 will set src.locked to null after a player enters the portal and will not allow hand-teles to open portals to that location. + var/turf/target /obj/machinery/computer/teleporter/Initialize() . = ..() @@ -33,18 +31,6 @@ break return power_station -/obj/machinery/computer/teleporter/attackby(obj/I, mob/living/user, params) - if(istype(I, /obj/item/gps)) - var/obj/item/gps/L = I - if(L.locked_location && !(stat & (NOPOWER|BROKEN))) - if(!user.transferItemToLoc(L, src)) - to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]!") - return - locked = L - to_chat(user, "You insert the GPS device into the [name]'s slot.") - else - return ..() - /obj/machinery/computer/teleporter/ui_interact(mob/user) . = ..() var/data = "

Teleporter Status

" @@ -65,12 +51,6 @@ data += "Change regime
" data += "Set target
" - if(locked) - data += "
Get target from memory
" - data += "Eject GPS device
" - else - data += "
Get target from memory
" - data += "Eject GPS device
" data += "
Calibrate Hub" @@ -82,11 +62,6 @@ if(..()) return - if(href_list["eject"]) - eject() - updateDialog() - return - if(!check_hub_connection()) say("Error: Unable to detect hub.") return @@ -104,11 +79,6 @@ power_station.teleporter_hub.update_icon() power_station.teleporter_hub.calibrated = 0 set_target(usr) - if(href_list["locked"]) - power_station.engaged = 0 - power_station.teleporter_hub.update_icon() - power_station.teleporter_hub.calibrated = 0 - target = get_turf(locked.locked_location) if(href_list["calibrate"]) if(!target) say("Error: No target set to calibrate to.") @@ -144,11 +114,6 @@ else regime_set = "Teleporter" -/obj/machinery/computer/teleporter/proc/eject() - if(locked) - locked.forceMove(get_turf(src)) - locked = null - /obj/machinery/computer/teleporter/proc/set_target(mob/user) var/list/L = list() var/list/areaindex = list() diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 07118e2a18..9bdd01ad77 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -9,7 +9,6 @@ GLOBAL_LIST_EMPTY(GPS_list) obj_flags = UNIQUE_RENAME var/gpstag = "COM0" var/emped = FALSE - var/turf/locked_location var/tracking = TRUE var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user. var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown From 6814022a1b6a345a495f2ed6fe1f1195db5a9081 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Sat, 30 Jun 2018 04:37:20 -0400 Subject: [PATCH 153/204] Fixes arrivals shuttle damage message runtime (#38779) --- code/modules/shuttle/arrivals.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index 5090800ff4..60998215de 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -76,8 +76,9 @@ damaged = TRUE if(console) console.say("Alert, hull breach detected!") - var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems) - announcer.announce("ARRIVALS_BROKEN", channels = list()) + var/obj/machinery/announcement_system/announcer = safepick(GLOB.announcement_systems) + if(!QDELETED(announcer)) + announcer.announce("ARRIVALS_BROKEN", channels = list()) if(mode != SHUTTLE_CALL) sound_played = FALSE mode = SHUTTLE_IDLE From 6c89362f6097b642d57a3081ede66110e0dd2fbb Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Sat, 30 Jun 2018 04:36:49 -0400 Subject: [PATCH 155/204] Fixes emitter runtime (#38796) fire() was already handled at 199-204 --- code/modules/power/singularity/emitter.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 670dd0a8e1..9cfca01efa 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -195,7 +195,7 @@ playsound(get_turf(src), projectile_sound, 50, TRUE) if(prob(35)) sparks.start() - P.firer = user? user : src + P.firer = user ? user : src if(last_projectile_params) P.p_x = last_projectile_params[2] P.p_y = last_projectile_params[3] @@ -210,7 +210,6 @@ else fire_delay = rand(minimum_fire_delay,maximum_fire_delay) shot_number = 0 - P.fire() return P /obj/machinery/power/emitter/can_be_unfasten_wrench(mob/user, silent) From 8c410b92a7da5bb69a68e13243dc249c26cd4938 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Sat, 30 Jun 2018 04:21:03 -0400 Subject: [PATCH 157/204] Fixes TGUI runtime (#38797) ui_interact was being called on usr instead of M --- code/game/objects/objs.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 664cdbf383..7c2468c28f 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -27,7 +27,7 @@ var/req_access_txt = "0" var/list/req_one_access var/req_one_access_txt = "0" - + var/renamedByPlayer = FALSE //set when a player uses a pen on a renamable object /obj/vv_edit_var(vname, vval) @@ -112,16 +112,16 @@ /obj/proc/updateUsrDialog() if((obj_flags & IN_USE) && !(obj_flags & USES_TGUI)) - var/is_in_use = 0 + var/is_in_use = FALSE var/list/nearby = viewers(1, src) for(var/mob/M in nearby) if ((M.client && M.machine == src)) - is_in_use = 1 - ui_interact(usr) + is_in_use = TRUE + ui_interact(M) if(isAI(usr) || iscyborg(usr) || IsAdminGhost(usr)) if (!(usr in nearby)) if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh. - is_in_use = 1 + is_in_use = TRUE ui_interact(usr) // check for TK users @@ -131,7 +131,7 @@ if(!(usr in nearby)) if(usr.client && usr.machine==src) if(H.dna.check_mutation(TK)) - is_in_use = 1 + is_in_use = TRUE ui_interact(usr) if (is_in_use) obj_flags |= IN_USE From 3b8931e4093d28b654cf2a4ee2ac0bdd8bb966cf Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:24:48 -0500 Subject: [PATCH 159/204] Automatic changelog generation for PR #7240 [ci skip] --- html/changelogs/AutoChangeLog-pr-7240.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7240.yml diff --git a/html/changelogs/AutoChangeLog-pr-7240.yml b/html/changelogs/AutoChangeLog-pr-7240.yml new file mode 100644 index 0000000000..4bc6b87ee7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7240.yml @@ -0,0 +1,5 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Fixed cyborgs not getting their names at round start" + - bugfix: "Fixed cyborgs and A.I.s being able to bypass appearance bans" From b21c9437e16ceab417504c07b7c4cac2a9f19376 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:25:23 -0500 Subject: [PATCH 160/204] Automatic changelog generation for PR #7244 [ci skip] --- html/changelogs/AutoChangeLog-pr-7244.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7244.yml diff --git a/html/changelogs/AutoChangeLog-pr-7244.yml b/html/changelogs/AutoChangeLog-pr-7244.yml new file mode 100644 index 0000000000..e90d1d33d0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7244.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "fixes cult shuttle message repeating" From 93d671cbb4385617ef79a55cd759ff04f51ba90a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:25:45 -0500 Subject: [PATCH 161/204] Automatic changelog generation for PR #7245 [ci skip] --- html/changelogs/AutoChangeLog-pr-7245.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7245.yml diff --git a/html/changelogs/AutoChangeLog-pr-7245.yml b/html/changelogs/AutoChangeLog-pr-7245.yml new file mode 100644 index 0000000000..764069b653 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7245.yml @@ -0,0 +1,4 @@ +author: "Dax Dupont" +delete-after: True +changes: + - admin: "Malf AI machine overloads now are logged/admin messaged." From b1ac168609fb2f96fc7fa3846f34dbf9f828d24f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:27:13 -0500 Subject: [PATCH 162/204] Automatic changelog generation for PR #7249 [ci skip] --- html/changelogs/AutoChangeLog-pr-7249.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7249.yml diff --git a/html/changelogs/AutoChangeLog-pr-7249.yml b/html/changelogs/AutoChangeLog-pr-7249.yml new file mode 100644 index 0000000000..8adf528526 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7249.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Hardsuit helmets now protect the wearer from pepperspray" From f0296a5e898ed6fe54d81fb0fbe792e87720cd6d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:27:47 -0500 Subject: [PATCH 163/204] Automatic changelog generation for PR #7250 [ci skip] --- html/changelogs/AutoChangeLog-pr-7250.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7250.yml diff --git a/html/changelogs/AutoChangeLog-pr-7250.yml b/html/changelogs/AutoChangeLog-pr-7250.yml new file mode 100644 index 0000000000..5036847eef --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7250.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - code_imp: "Removed unused effect object that could be used to spawn a list of humans" From 999f3c23d7b0096494400fc14e9f5bd924141d87 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:28:04 -0500 Subject: [PATCH 164/204] Automatic changelog generation for PR #7251 [ci skip] --- html/changelogs/AutoChangeLog-pr-7251.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7251.yml diff --git a/html/changelogs/AutoChangeLog-pr-7251.yml b/html/changelogs/AutoChangeLog-pr-7251.yml new file mode 100644 index 0000000000..1f4c5cf012 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7251.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "It is once again possible for Cargo to export mechs." From 31f54fd50bcc8b98c8aee0dd89f3184576a24c69 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:29:12 -0500 Subject: [PATCH 165/204] Automatic changelog generation for PR #7254 [ci skip] --- html/changelogs/AutoChangeLog-pr-7254.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7254.yml diff --git a/html/changelogs/AutoChangeLog-pr-7254.yml b/html/changelogs/AutoChangeLog-pr-7254.yml new file mode 100644 index 0000000000..f9295c0c92 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7254.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - refactor: "AI static now uses visual contents and should perform better in theory." From fc76c6c4965580f6a45318ed79bbe3493715c7a5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:30:49 -0500 Subject: [PATCH 166/204] Automatic changelog generation for PR #7259 [ci skip] --- html/changelogs/AutoChangeLog-pr-7259.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7259.yml diff --git a/html/changelogs/AutoChangeLog-pr-7259.yml b/html/changelogs/AutoChangeLog-pr-7259.yml new file mode 100644 index 0000000000..c99b4f74e3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7259.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Bucket helmets cannot have reagents transferred into them until after they are removed" From b58718625a76dc5efbd441a23a1dacc7e03ace38 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:31:15 -0500 Subject: [PATCH 167/204] Automatic changelog generation for PR #7262 [ci skip] --- html/changelogs/AutoChangeLog-pr-7262.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7262.yml diff --git a/html/changelogs/AutoChangeLog-pr-7262.yml b/html/changelogs/AutoChangeLog-pr-7262.yml new file mode 100644 index 0000000000..13c4d49dbf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7262.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "R&D deconstructors can now destroy things regardless of if there's a point value or material" From 5062fcd60e87079181505311f53d92aeab93d978 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:32:15 -0500 Subject: [PATCH 168/204] Automatic changelog generation for PR #7264 [ci skip] --- html/changelogs/AutoChangeLog-pr-7264.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7264.yml diff --git a/html/changelogs/AutoChangeLog-pr-7264.yml b/html/changelogs/AutoChangeLog-pr-7264.yml new file mode 100644 index 0000000000..2bc45d3036 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7264.yml @@ -0,0 +1,4 @@ +author: "Zxaber" +delete-after: True +changes: + - rscadd: "Cyborgs can wear more hats now." From c970bc259e1aea04bf93c2f5081be255b556f27d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:32:41 -0500 Subject: [PATCH 169/204] Automatic changelog generation for PR #7265 [ci skip] --- html/changelogs/AutoChangeLog-pr-7265.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7265.yml diff --git a/html/changelogs/AutoChangeLog-pr-7265.yml b/html/changelogs/AutoChangeLog-pr-7265.yml new file mode 100644 index 0000000000..de2d14842a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7265.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "You should now receive your destroy AI objectives properly during IAA" From 3090813add958a2b9c1ecf7fc66d66a1605a5b4a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:33:38 -0500 Subject: [PATCH 170/204] Automatic changelog generation for PR #7267 [ci skip] --- html/changelogs/AutoChangeLog-pr-7267.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7267.yml diff --git a/html/changelogs/AutoChangeLog-pr-7267.yml b/html/changelogs/AutoChangeLog-pr-7267.yml new file mode 100644 index 0000000000..8777f7780b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7267.yml @@ -0,0 +1,4 @@ +author: "Denton" +delete-after: True +changes: + - tweak: "Did you know that honey has antibiotic properties?" From 3b5264b2f76d86b5a2309990749c614c514c0492 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:35:56 -0500 Subject: [PATCH 171/204] Automatic changelog generation for PR #7273 [ci skip] --- html/changelogs/AutoChangeLog-pr-7273.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7273.yml diff --git a/html/changelogs/AutoChangeLog-pr-7273.yml b/html/changelogs/AutoChangeLog-pr-7273.yml new file mode 100644 index 0000000000..1535cbe95d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7273.yml @@ -0,0 +1,4 @@ +author: "Thunder12345" +delete-after: True +changes: + - rscadd: "Added a colour picker component for use with circuits." From 3c6749d326319fd95ec3d7f2a516786df1667ad0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:37:08 -0500 Subject: [PATCH 172/204] Automatic changelog generation for PR #7277 [ci skip] --- html/changelogs/AutoChangeLog-pr-7277.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7277.yml diff --git a/html/changelogs/AutoChangeLog-pr-7277.yml b/html/changelogs/AutoChangeLog-pr-7277.yml new file mode 100644 index 0000000000..b9ff0d8680 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7277.yml @@ -0,0 +1,7 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Deconstructable TEG now propertly connects to pipes." + - bugfix: "Fix of inverted TEG sprite of slow turbine turning. +add:Now you can flip circulator and make TEG of your dream. +add:Add TEG and circulator to \"Advanced Power Manipulation\" techweb node." From 0b33ea727fcb02497749c7e292e47c8fe5ff6d7a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Jul 2018 09:38:19 -0500 Subject: [PATCH 173/204] Automatic changelog generation for PR #7280 [ci skip] --- html/changelogs/AutoChangeLog-pr-7280.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7280.yml diff --git a/html/changelogs/AutoChangeLog-pr-7280.yml b/html/changelogs/AutoChangeLog-pr-7280.yml new file mode 100644 index 0000000000..f5813ae632 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7280.yml @@ -0,0 +1,5 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - imageadd: "New icon for plastic flaps that actually looks airtight." + - code_imp: "Update to plastic flaps code to use tool procs rather than attackby and removed two pointless states." From db2a15d42d1ce691a2657d15c823740597201a24 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 1 Jul 2018 23:54:31 -0400 Subject: [PATCH 174/204] maps, tools, goon folder, icons, sounds, and strings. everything except code --- .../lavaland_surface_ash_walker1.dmm | 2 +- .../LavaRuins/lavaland_surface_seed_vault.dmm | 8 +- _maps/RandomRuins/SpaceRuins/abandonedzoo.dmm | 2 +- _maps/RandomRuins/SpaceRuins/oldAIsat.dmm | 9 +- _maps/RandomRuins/SpaceRuins/spacehotel.dmm | 26 +- .../SpaceRuins/turretedoutpost.dmm | 22 +- _maps/RandomZLevels/VR/snowdin_VR.dmm | 372 +- _maps/RandomZLevels/caves.dmm | 2 +- _maps/RandomZLevels/snowdin.dmm | 389 +- _maps/RandomZLevels/undergroundoutpost45.dmm | 23 +- _maps/map_files/BoxStation/BoxStation.dmm | 1078 +- .../map_files/Deltastation/DeltaStation2.dmm | 164 +- _maps/map_files/MetaStation/MetaStation.dmm | 574 +- _maps/map_files/OmegaStation/OmegaStation.dmm | 39 +- _maps/map_files/PubbyStation/PubbyStation.dmm | 278 +- _maps/map_files/debug/runtimestation.dmm | 9932 ++++++++++++++--- _maps/map_files/generic/CentCom.dmm | 2 +- _maps/runtimestation.json | 5 +- _maps/shuttles/arrival_box.dmm | 10 +- _maps/shuttles/arrival_delta.dmm | 4 +- _maps/shuttles/arrival_omega.dmm | 4 +- _maps/shuttles/arrival_pubby.dmm | 2 +- _maps/shuttles/assault_pod_default.dmm | 8 +- _maps/shuttles/aux_base_default.dmm | 3 +- _maps/shuttles/aux_base_small.dmm | 2 +- _maps/shuttles/emergency_asteroid.dmm | 20 +- _maps/shuttles/emergency_bar.dmm | 4 +- _maps/shuttles/emergency_birdboat.dmm | 22 +- _maps/shuttles/emergency_box.dmm | 22 +- _maps/shuttles/emergency_cere.dmm | 28 +- _maps/shuttles/emergency_clown.dmm | 12 +- _maps/shuttles/emergency_cramped.dmm | 6 +- _maps/shuttles/emergency_delta.dmm | 24 +- _maps/shuttles/emergency_goon.dmm | 8 +- _maps/shuttles/emergency_meta.dmm | 22 +- _maps/shuttles/emergency_mini.dmm | 24 +- _maps/shuttles/emergency_narnar.dmm | 8 +- _maps/shuttles/emergency_omega.dmm | 18 +- _maps/shuttles/emergency_pubby.dmm | 30 +- _maps/shuttles/emergency_raven.dmm | 20 +- _maps/shuttles/emergency_russiafightpit.dmm | 28 +- _maps/shuttles/emergency_scrapheap.dmm | 16 +- _maps/shuttles/emergency_supermatter.dmm | 10 +- _maps/shuttles/emergency_wabbajack.dmm | 18 +- _maps/shuttles/escape_pod_default.dmm | 4 +- _maps/shuttles/escape_pod_large.dmm | 12 +- _maps/shuttles/ferry_base.dmm | 6 +- _maps/shuttles/ferry_fancy.dmm | 4 +- _maps/shuttles/ferry_lighthouse.dmm | 6 +- _maps/shuttles/ferry_meat.dmm | 6 +- _maps/shuttles/infiltrator_basic.dmm | 12 +- _maps/shuttles/labour_box.dmm | 2 +- _maps/shuttles/labour_delta.dmm | 4 +- _maps/shuttles/mining_box.dmm | 2 +- _maps/shuttles/mining_delta.dmm | 8 +- _maps/shuttles/pirate_default.dmm | 8 +- _maps/shuttles/ruin_caravan_victim.dmm | 2 +- _maps/shuttles/ruin_syndicate_dropship.dmm | 12 +- _maps/shuttles/ruin_syndicate_fighter.dmm | 2 +- _maps/shuttles/snowdin_excavation.dmm | 90 + _maps/shuttles/snowdin_mining.dmm | 86 + _maps/shuttles/whiteship_box.dmm | 6 +- _maps/shuttles/whiteship_meta.dmm | 8 +- _maps/shuttles/whiteship_pubby.dmm | 8 +- goon/icons/obj/chairs.dmi | Bin 0 -> 1038 bytes icons/effects/crayondecal.dmi | Bin 26532 -> 27297 bytes icons/effects/effects.dmi | Bin 885578 -> 885715 bytes icons/mob/screen_alert.dmi | Bin 104482 -> 105034 bytes icons/obj/chairs.dmi | Bin 32429 -> 30456 bytes icons/obj/vending.dmi | Bin 97490 -> 99896 bytes strings/cas_white.txt | 6 +- strings/ion_laws.json | 4 +- strings/names/ing_verbs.txt | 2 +- strings/traumas.json | 76 +- tgui/src/interfaces/ai_airlock.ract | 2 +- tgui/src/interfaces/cellular_emporium.ract | 2 +- 76 files changed, 9994 insertions(+), 3686 deletions(-) create mode 100644 _maps/shuttles/snowdin_excavation.dmm create mode 100644 _maps/shuttles/snowdin_mining.dmm create mode 100644 goon/icons/obj/chairs.dmi diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index 7d79949f41..7ad773e601 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -1102,7 +1102,7 @@ }, /obj/structure/table/wood, /obj/item/twohanded/spear, -/obj/item/clothing/head/helmet/roman/legionaire, +/obj/item/clothing/head/helmet/roman/legionnaire, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "cO" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm index 073ecb7c4d..ba291fc258 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -21,11 +21,17 @@ /turf/open/floor/plasteel/freezer, /area/ruin/powered/seedvault) "f" = ( -/obj/machinery/plantgenes/seedvault, +/obj/machinery/plantgenes/seedvault{ + pixel_y = 6 + }, +/obj/structure/table/wood, /turf/open/floor/plasteel/freezer, /area/ruin/powered/seedvault) "g" = ( /obj/structure/table/wood, +/obj/machinery/smartfridge/disks{ + pixel_y = 2 + }, /turf/open/floor/plasteel/freezer, /area/ruin/powered/seedvault) "h" = ( diff --git a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm index 5348f3f385..7d9bdf6485 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -294,7 +294,7 @@ /area/ruin/space/has_grav/abandonedzoo) "aP" = ( /obj/structure/table/reinforced, -/obj/item/reagent_containers/glass/bottle/liver_enhance_virion, +/obj/item/reagent_containers/glass/bottle/random_virus, /obj/item/reagent_containers/dropper, /turf/open/floor/plasteel{ icon_state = "dark" diff --git a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm index aa21d08041..299d1769b0 100644 --- a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm @@ -167,7 +167,6 @@ /area/tcommsat/chamber) "aG" = ( /obj/structure/grille/broken, -/obj/item/clothing/gloves/combat, /turf/open/floor/plasteel/airless, /area/tcommsat/chamber) "aH" = ( @@ -625,7 +624,7 @@ /turf/open/floor/plating, /area/tcommsat/chamber) "cd" = ( -/obj/item/storage/belt/utility/full/engi, +/obj/item/storage/toolbox/syndicate, /turf/open/floor/plasteel/airless, /area/tcommsat/chamber) "ce" = ( @@ -906,10 +905,6 @@ /obj/machinery/teleport/hub, /turf/open/floor/plating, /area/tcommsat/chamber) -"SH" = ( -/obj/item/dildo/random, -/turf/open/floor/plating/airless, -/area/tcommsat/chamber) (1,1,1) = {" aa @@ -2707,7 +2702,7 @@ ac bw bw bw -SH +ac ca cf bw diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index f89a8ba4d2..75978850b0 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -4355,24 +4355,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) -"Dv" = ( -/obj/item/vending_refill/kink, -/obj/item/vending_refill/kink, -/obj/item/vending_refill/kink, -/obj/item/vending_refill/kink, -/obj/item/vending_refill/kink, -/obj/item/vending_refill/kink, -/obj/structure/closet, -/turf/open/floor/plasteel/neutral, -/area/ruin/space/has_grav/hotel/custodial) -"Fy" = ( -/obj/machinery/vending/kink, -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/hotel/workroom) -"MK" = ( -/obj/effect/spawner/lootdrop/keg, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hotel) (1,1,1) = {" aa @@ -5383,7 +5365,7 @@ ee dH cZ eJ -MK +aw fi fQ fQ @@ -6111,7 +6093,7 @@ kC kn lg jG -Dv +ml mp mw mJ @@ -7270,7 +7252,7 @@ di di ea ep -Fy +dV di eT fp @@ -7550,7 +7532,7 @@ di di di dV -Fy +dV di eW ft diff --git a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm index a6c2079969..385c1bd6df 100644 --- a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm +++ b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm @@ -273,6 +273,11 @@ /obj/machinery/light, /turf/open/floor/plasteel/vault/side, /area/ruin/space/has_grav/turretedoutpost) +"aZ" = ( +/obj/structure/rack, +/obj/item/clothing/head/helmet/riot, +/turf/open/floor/plasteel/vault/side, +/area/ruin/space/has_grav/turretedoutpost) "ba" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/breadslice/meat, @@ -281,13 +286,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/turretedoutpost) -"Kw" = ( -/obj/structure/rack, -/obj/item/multitool/ai_detect, -/turf/open/floor/plasteel/vault/side{ - dir = 8 - }, -/area/ruin/space/has_grav/turretedoutpost) "Nu" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -295,10 +293,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/turretedoutpost) -"YF" = ( -/obj/effect/spawner/lootdrop/keg, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/turretedoutpost) (1,1,1) = {" aa @@ -390,7 +384,7 @@ al ad ad ay -Kw +aF aL aF ad @@ -473,7 +467,7 @@ az az az az -aW +aZ ad al ab @@ -688,7 +682,7 @@ ad aj ak ad -YF +al ad aK aP diff --git a/_maps/RandomZLevels/VR/snowdin_VR.dmm b/_maps/RandomZLevels/VR/snowdin_VR.dmm index 0ae50fc1d8..520e847eb2 100644 --- a/_maps/RandomZLevels/VR/snowdin_VR.dmm +++ b/_maps/RandomZLevels/VR/snowdin_VR.dmm @@ -2853,7 +2853,6 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post) "hk" = ( -/turf/open/floor/plating/asteroid/snow/ice, /obj/effect/turf_decal/stripes/corner, /obj/machinery/conveyor_switch/oneway{ id = "snowdin_belt_mine"; @@ -2893,7 +2892,6 @@ /turf/open/floor/plasteel, /area/awaymission/snowdin/post/gateway) "ho" = ( -/turf/open/floor/plating/asteroid/snow/ice, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/loading_area, /turf/open/floor/plating/snowed/cavern, @@ -3854,13 +3852,6 @@ /obj/effect/landmark/vr_spawn/snowdin, /turf/open/floor/plasteel/floorgrime, /area/awaymission/snowdin/post/garage) -"jv" = ( -/turf/open/floor/plating/asteroid/snow/ice, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) "jw" = ( /obj/structure/table, /obj/item/paper/pamphlet/gateway, @@ -3940,13 +3931,6 @@ }, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/outside) -"jE" = ( -/turf/open/floor/plating/asteroid/snow/ice, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) "jF" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ @@ -4377,7 +4361,6 @@ }, /area/awaymission/snowdin/post) "kK" = ( -/turf/open/floor/plating/asteroid/snow/ice, /obj/machinery/conveyor{ dir = 2; id = "snowdin_belt_mine" @@ -9211,23 +9194,10 @@ /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) "xl" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/ice, -/area/shuttle/snowdin/elevator1) -"xm" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator1) -"xn" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Elevator Access" +/turf/open/floor/plasteel/elevatorshaft{ + initial_gas_mix = "o2=22;n2=82;TEMP=180" }, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator1) -"xo" = ( -/turf/closed/wall/ice, -/area/shuttle/snowdin/elevator1) +/area/awaymission/snowdin/cave) "xp" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -9278,18 +9248,6 @@ }, /turf/open/floor/engine/cult, /area/awaymission/snowdin/post/mining_dock) -"xv" = ( -/turf/open/floor/engine, -/area/shuttle/snowdin/elevator1) -"xw" = ( -/obj/machinery/computer/shuttle/snowdin/mining{ - dir = 2; - name = "Excavation Elevator Console"; - possible_destinations = "snowdin_excavation_top;snowdin_excavation_down"; - shuttleId = "snowdin_excavation" - }, -/turf/open/floor/engine, -/area/shuttle/snowdin/elevator1) "xx" = ( /obj/effect/spawner/lootdrop/crate_spawner, /turf/open/floor/plasteel/neutral, @@ -9378,26 +9336,20 @@ }, /area/awaymission/snowdin/post/mining_dock) "xK" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Elevator Access" - }, -/obj/docking_port/mobile/elevator{ - dir = 4; - height = 6; - id = "snowdin_excavation"; - name = "excavation elevator"; - width = 6 - }, /obj/docking_port/stationary{ + area_type = /area/awaymission/snowdin/cave; dir = 4; dwidth = 3; height = 6; id = "snowdin_excavation_top"; name = "snowdin excavation top"; + roundstart_template = /datum/map_template/shuttle/snowdin/excavation; width = 6 }, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator1) +/turf/open/floor/plasteel/elevatorshaft{ + initial_gas_mix = "o2=22;n2=82;TEMP=180" + }, +/area/awaymission/snowdin/cave) "xL" = ( /obj/machinery/atmospherics/pipe/manifold/orange/visible{ dir = 8 @@ -9424,6 +9376,7 @@ /area/awaymission/snowdin/post/mining_dock) "xP" = ( /obj/docking_port/stationary{ + area_type = /area/awaymission/snowdin/post/mining_dock; dir = 4; dwidth = 3; height = 6; @@ -9431,7 +9384,7 @@ name = "snowdin excavation down"; width = 6 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/elevatorshaft, /area/awaymission/snowdin/post/mining_dock) "xQ" = ( /obj/effect/turf_decal/stripes/line{ @@ -9861,20 +9814,6 @@ }, /turf/open/floor/engine/vacuum, /area/awaymission/snowdin/cave) -"zb" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 4; - frequency = 1442; - id_tag = "snowdin_toxins_mine_1"; - name = "toxin out" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/cave) "zc" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 8 @@ -13339,9 +13278,6 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "Jl" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, /obj/machinery/door/airlock/mining/glass{ name = "Mining Dock"; req_access_txt = "48" @@ -13384,9 +13320,6 @@ /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) "Jr" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, /obj/machinery/door/airlock/mining/glass{ name = "Mining Dock"; req_access_txt = "48" @@ -13546,20 +13479,6 @@ dir = 4 }, /area/awaymission/snowdin/post/mining_main) -"JR" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator2) -"JS" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Elevator Access" - }, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator2) -"JT" = ( -/turf/closed/wall, -/area/shuttle/snowdin/elevator2) "JU" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -13622,19 +13541,6 @@ dir = 8 }, /area/awaymission/snowdin/post/mining_main) -"Kd" = ( -/obj/machinery/computer/shuttle/snowdin/mining, -/turf/open/floor/engine, -/area/shuttle/snowdin/elevator2) -"Ke" = ( -/turf/open/floor/engine, -/area/shuttle/snowdin/elevator2) -"Kf" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/engine, -/area/shuttle/snowdin/elevator2) "Kg" = ( /obj/structure/ore_box, /obj/effect/turf_decal/bot, @@ -13696,27 +13602,18 @@ }, /area/awaymission/snowdin/post/mining_main) "Kn" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Elevator Access" - }, -/obj/docking_port/mobile/elevator{ - dir = 4; - dwidth = 2; - height = 5; - id = "snowdin_mining"; - name = "mining elevator"; - width = 5 - }, /obj/docking_port/stationary{ + area_type = /area/awaymission/snowdin/post/mining_main; dir = 4; dwidth = 2; height = 5; id = "snowdin_mining_top"; name = "snowdin mining top"; + roundstart_template = /datum/map_template/shuttle/snowdin/mining; width = 5 }, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator2) +/turf/open/floor/plasteel/elevatorshaft, +/area/awaymission/snowdin/post/mining_main) "Ko" = ( /obj/machinery/light{ dir = 4 @@ -13766,7 +13663,7 @@ name = "snowdin mining bottom"; width = 5 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/elevatorshaft, /area/awaymission/snowdin/post/mining_dock) "Ku" = ( /obj/machinery/light{ @@ -13835,10 +13732,6 @@ }, /turf/open/floor/plasteel, /area/awaymission/snowdin/post/mining_main) -"KC" = ( -/obj/machinery/light/small, -/turf/open/floor/engine, -/area/shuttle/snowdin/elevator2) "KD" = ( /obj/structure/ore_box, /obj/effect/turf_decal/bot, @@ -13912,8 +13805,8 @@ }, /area/awaymission/snowdin/post/mining_main) "KP" = ( -/turf/closed/wall/rust, -/area/shuttle/snowdin/elevator2) +/turf/open/floor/plasteel/elevatorshaft, +/area/awaymission/snowdin/post/mining_main) "KQ" = ( /obj/machinery/computer/shuttle/snowdin/mining{ dir = 8 @@ -14014,6 +13907,9 @@ }, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) +"ND" = ( +/turf/open/floor/plasteel/elevatorshaft, +/area/awaymission/snowdin/post/mining_dock) "OF" = ( /obj/machinery/door/airlock/external{ name = "Ready Room"; @@ -28100,7 +27996,7 @@ wS wS ai yf -zb +yt ai wS wS @@ -28184,10 +28080,10 @@ IY Go Jx KP -JR +KP Kn -JR -JT +KP +KP KT Go ac @@ -28339,7 +28235,7 @@ ii yb an yf -zb +yt yf ai ai @@ -28440,11 +28336,11 @@ Gq Gq Go Jx -JR -Kd -Ke -KC -JR +KP +KP +KP +KP +KP KT GP ac @@ -28697,11 +28593,11 @@ Iy Iy Go Jy -JS -Ke -Ke -Ke -JS +KP +KP +KP +KP +KP KU GP ac @@ -28954,11 +28850,11 @@ GP GP GP Jx -JR -Kf -Ke -Ke -JR +KP +KP +KP +KP +KP KT GP ac @@ -29211,10 +29107,10 @@ ae ae Go Jx -JT -JR -JS -JR +KP +KP +KP +KP KP KT GP @@ -30131,11 +30027,11 @@ ae aj xa xl -xm -xn +xl +xl xK -xm -xo +xl +xl an ii ii @@ -30387,12 +30283,12 @@ ae ae aj xa -xm -xv -xv -xv -xv -xm +xl +xl +xl +xl +xl +xl yp ii wS @@ -30644,12 +30540,12 @@ ae wQ ai xb -xn -xv -xv -xv -xv -xn +xl +xl +xl +xl +xl +xl yq ii wS @@ -30901,12 +30797,12 @@ ae wQ ai xb -xn -xv -xv -xv -xv -xn +xl +xl +xl +xl +xl +xl yq an ii @@ -31158,12 +31054,12 @@ ae wQ wS xa -xm -xw -xv -xv -xv -xm +xl +xl +xl +xl +xl +xl yr an ii @@ -31415,12 +31311,12 @@ ae wQ wS xa -xo -xm -xn -xn -xm -xo +xl +xl +xl +xl +xl +xl yp an an @@ -62364,11 +62260,11 @@ IO wL wE JH -wL -wL +ND +ND Kt -wL -wL +ND +ND KX wE bh @@ -62621,11 +62517,11 @@ IQ wL wE JH -wL -wL -wL -wL -wL +ND +ND +ND +ND +ND KX wE bh @@ -62878,11 +62774,11 @@ wL wL wE JI -wL -wL -wL -wL -wL +ND +ND +ND +ND +ND KY wE bh @@ -63135,11 +63031,11 @@ wL wL wE JH -wL -wL -wL -wL -wL +ND +ND +ND +ND +ND KX wE bh @@ -63392,11 +63288,11 @@ wL wL wD JH -wL -wL -wL -wL -wL +ND +ND +ND +ND +ND KX wD bh @@ -64151,7 +64047,7 @@ oZ oZ oZ hk -jE +sl Gk GN Hj @@ -64664,7 +64560,7 @@ oZ oZ oZ oZ -jv +By xW xW xW @@ -65339,12 +65235,12 @@ eJ wE wV xg -wL -wL -wL +ND +ND +ND xP -wL -wL +ND +ND yz yR wD @@ -65596,12 +65492,12 @@ eJ wD wW xg -wL -wL -wL -wL -wL -wL +ND +ND +ND +ND +ND +ND yA wM zm @@ -65853,12 +65749,12 @@ wD wP wX xg -wL -wL -wL -wL -wL -wL +ND +ND +ND +ND +ND +ND yB xy zn @@ -66111,11 +66007,11 @@ wP wW xh wW -wL -wL -wL -wL -wL +ND +ND +ND +ND +ND yB xy zn @@ -66369,10 +66265,10 @@ wW xh wW wW -wW -wL -wL -wL +ND +ND +ND +ND yC yS zm @@ -66627,9 +66523,9 @@ xi wW wW wW -wL -wL -wL +ND +ND +ND yD yT wE diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index a656e5cd0d..a25808d933 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -1640,7 +1640,7 @@ pixel_y = 32 }, /obj/item/paper/fluff/awaymissions/caves/shipment_notice, -/obj/item/paper/fluff/awaymissions/caves/saftey_notice, +/obj/item/paper/fluff/awaymissions/caves/safety_notice, /turf/open/floor/plasteel, /area/awaymission/caves/listeningpost) "fb" = ( diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 28cac610f4..42d28622c1 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -9263,23 +9263,10 @@ /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) "xl" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/ice, -/area/shuttle/snowdin/elevator1) -"xm" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator1) -"xn" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Elevator Access" +/turf/open/floor/plasteel/elevatorshaft{ + initial_gas_mix = "o2=22;n2=82;TEMP=180" }, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator1) -"xo" = ( -/turf/closed/wall/ice, -/area/shuttle/snowdin/elevator1) +/area/awaymission/snowdin/cave) "xp" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -9330,18 +9317,6 @@ }, /turf/open/floor/engine/cult, /area/awaymission/snowdin/post/mining_dock) -"xv" = ( -/turf/open/floor/engine, -/area/shuttle/snowdin/elevator1) -"xw" = ( -/obj/machinery/computer/shuttle/snowdin/mining{ - dir = 2; - name = "Excavation Elevator Console"; - possible_destinations = "snowdin_excavation_top;snowdin_excavation_down"; - shuttleId = "snowdin_excavation" - }, -/turf/open/floor/engine, -/area/shuttle/snowdin/elevator1) "xx" = ( /obj/effect/spawner/lootdrop/crate_spawner, /turf/open/floor/plasteel/neutral, @@ -9430,26 +9405,20 @@ }, /area/awaymission/snowdin/post/mining_dock) "xK" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Elevator Access" - }, -/obj/docking_port/mobile/elevator{ - dir = 4; - height = 6; - id = "snowdin_excavation"; - name = "excavation elevator"; - width = 6 - }, /obj/docking_port/stationary{ + area_type = /area/awaymission/snowdin/cave; dir = 4; dwidth = 3; height = 6; id = "snowdin_excavation_top"; name = "snowdin excavation top"; + roundstart_template = /datum/map_template/shuttle/snowdin/excavation; width = 6 }, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator1) +/turf/open/floor/plasteel/elevatorshaft{ + initial_gas_mix = "o2=22;n2=82;TEMP=180" + }, +/area/awaymission/snowdin/cave) "xL" = ( /obj/machinery/atmospherics/pipe/manifold/orange/visible{ dir = 8 @@ -9476,6 +9445,7 @@ /area/awaymission/snowdin/post/mining_dock) "xP" = ( /obj/docking_port/stationary{ + area_type = /area/awaymission/snowdin/post/mining_dock; dir = 4; dwidth = 3; height = 6; @@ -9483,7 +9453,7 @@ name = "snowdin excavation down"; width = 6 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/elevatorshaft, /area/awaymission/snowdin/post/mining_dock) "xQ" = ( /obj/effect/turf_decal/stripes/line{ @@ -9917,20 +9887,6 @@ }, /turf/open/floor/engine/vacuum, /area/awaymission/snowdin/cave) -"zb" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 4; - frequency = 1442; - id_tag = "snowdin_toxins_mine_1"; - name = "toxin out" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/cave) "zc" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 8 @@ -12308,13 +12264,6 @@ /obj/effect/turf_decal/loading_area, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) -"FP" = ( -/turf/open/floor/plating/asteroid/snow/ice, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) "FQ" = ( /obj/effect/light_emitter{ name = "outdoor light"; @@ -12366,13 +12315,6 @@ }, /turf/open/floor/plating/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) -"FX" = ( -/turf/open/floor/plating/asteroid/snow/ice, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) "FY" = ( /turf/open/floor/plating/asteroid/snow/ice, /obj/machinery/conveyor{ @@ -13442,9 +13384,6 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "Jl" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, /obj/machinery/door/airlock/mining/glass{ name = "Mining Dock"; req_access_txt = "48" @@ -13487,9 +13426,6 @@ /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) "Jr" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, /obj/machinery/door/airlock/mining/glass{ name = "Mining Dock"; req_access_txt = "48" @@ -13650,23 +13586,8 @@ }, /area/awaymission/snowdin/post/mining_main) "JQ" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/rust, -/area/shuttle/snowdin/elevator2) -"JR" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator2) -"JS" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Elevator Access" - }, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator2) -"JT" = ( -/turf/closed/wall, -/area/shuttle/snowdin/elevator2) +/turf/open/floor/plasteel/elevatorshaft, +/area/awaymission/snowdin/post/mining_main) "JU" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -13729,19 +13650,6 @@ dir = 8 }, /area/awaymission/snowdin/post/mining_main) -"Kd" = ( -/obj/machinery/computer/shuttle/snowdin/mining, -/turf/open/floor/engine, -/area/shuttle/snowdin/elevator2) -"Ke" = ( -/turf/open/floor/engine, -/area/shuttle/snowdin/elevator2) -"Kf" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/engine, -/area/shuttle/snowdin/elevator2) "Kg" = ( /obj/structure/ore_box, /obj/effect/turf_decal/bot, @@ -13803,27 +13711,18 @@ }, /area/awaymission/snowdin/post/mining_main) "Kn" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Elevator Access" - }, -/obj/docking_port/mobile/elevator{ - dir = 4; - dwidth = 2; - height = 5; - id = "snowdin_mining"; - name = "mining elevator"; - width = 5 - }, /obj/docking_port/stationary{ + area_type = /area/awaymission/snowdin/post/mining_main; dir = 4; dwidth = 2; height = 5; id = "snowdin_mining_top"; name = "snowdin mining top"; + roundstart_template = /datum/map_template/shuttle/snowdin/mining; width = 5 }, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator2) +/turf/open/floor/plasteel/elevatorshaft, +/area/awaymission/snowdin/post/mining_main) "Ko" = ( /obj/machinery/light{ dir = 4 @@ -13873,7 +13772,7 @@ name = "snowdin mining bottom"; width = 5 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/elevatorshaft, /area/awaymission/snowdin/post/mining_dock) "Ku" = ( /obj/machinery/light{ @@ -13942,10 +13841,6 @@ }, /turf/open/floor/plasteel, /area/awaymission/snowdin/post/mining_main) -"KC" = ( -/obj/machinery/light/small, -/turf/open/floor/engine, -/area/shuttle/snowdin/elevator2) "KD" = ( /obj/structure/ore_box, /obj/effect/turf_decal/bot, @@ -14018,9 +13913,6 @@ dir = 4 }, /area/awaymission/snowdin/post/mining_main) -"KP" = ( -/turf/closed/wall/rust, -/area/shuttle/snowdin/elevator2) "KQ" = ( /obj/machinery/computer/shuttle/snowdin/mining{ dir = 8 @@ -14156,6 +14048,20 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) +"WK" = ( +/turf/open/floor/plating/asteroid/snow/ice, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/cavern, +/area/awaymission/snowdin/cave/cavern) +"XO" = ( +/turf/open/floor/plating/asteroid/snow/ice, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/snowed/cavern, +/area/awaymission/snowdin/cave/cavern) "Yn" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -14163,6 +14069,9 @@ }, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) +"Ys" = ( +/turf/open/floor/plasteel/elevatorshaft, +/area/awaymission/snowdin/post/mining_dock) (1,1,1) = {" aa @@ -28201,7 +28110,7 @@ wS wS ai yf -zb +yt ai wS wS @@ -28285,10 +28194,10 @@ IY Go Jx JQ -JR +JQ Kn -JR -JT +JQ +JQ KT Go ac @@ -28440,7 +28349,7 @@ ii yb an yf -zb +yt yf ai ai @@ -28541,11 +28450,11 @@ Gq Gq Go Jx -JR -Kd -Ke -KC -JR +JQ +JQ +JQ +JQ +JQ KT GP ac @@ -28798,11 +28707,11 @@ Iy Iy Go Jy -JS -Ke -Ke -Ke -JS +JQ +JQ +JQ +JQ +JQ KU GP ac @@ -29055,11 +28964,11 @@ GP GP GP Jx -JR -Kf -Ke -Ke -JR +JQ +JQ +JQ +JQ +JQ KT GP ac @@ -29312,11 +29221,11 @@ ae ae Go Jx -JT -JR -JS -JR -KP +JQ +JQ +JQ +JQ +JQ KT GP ac @@ -30232,11 +30141,11 @@ ae aj xa xl -xm -xn +xl +xl xK -xm -xo +xl +xl an ii ii @@ -30488,12 +30397,12 @@ ae ae aj xa -xm -xv -xv -xv -xv -xm +xl +xl +xl +xl +xl +xl yp ii wS @@ -30745,12 +30654,12 @@ ae wQ ai xb -xn -xv -xv -xv -xv -xn +xl +xl +xl +xl +xl +xl yq ii wS @@ -31002,12 +30911,12 @@ ae wQ ai xb -xn -xv -xv -xv -xv -xn +xl +xl +xl +xl +xl +xl yq an ii @@ -31259,12 +31168,12 @@ ae wQ wS xa -xm -xw -xv -xv -xv -xm +xl +xl +xl +xl +xl +xl yr an ii @@ -31516,12 +31425,12 @@ ae wQ wS xa -xo -xm -xn -xn -xm -xo +xl +xl +xl +xl +xl +xl yp an an @@ -62465,11 +62374,11 @@ IO wL wE JH -wL -wL +Ys +Ys Kt -wL -wL +Ys +Ys KX wE bh @@ -62722,11 +62631,11 @@ IQ wL wE JH -wL -wL -wL -wL -wL +Ys +Ys +Ys +Ys +Ys KX wE bh @@ -62979,11 +62888,11 @@ wL wL wE JI -wL -wL -wL -wL -wL +Ys +Ys +Ys +Ys +Ys KY wE bh @@ -63236,11 +63145,11 @@ wL wL wE JH -wL -wL -wL -wL -wL +Ys +Ys +Ys +Ys +Ys KX wE bh @@ -63493,11 +63402,11 @@ wL wL wD JH -wL -wL -wL -wL -wL +Ys +Ys +Ys +Ys +Ys KX wD bh @@ -64252,7 +64161,7 @@ oZ oZ oZ FN -FX +XO Gk GN Hj @@ -64765,7 +64674,7 @@ oZ oZ oZ oZ -FP +WK xW xW xW @@ -65440,12 +65349,12 @@ eJ wE wV xg -wL -wL -wL +Ys +Ys +Ys xP -wL -wL +Ys +Ys yz yR wD @@ -65697,12 +65606,12 @@ eJ wD wW xg -wL -wL -wL -wL -wL -wL +Ys +Ys +Ys +Ys +Ys +Ys yA wM zm @@ -65954,12 +65863,12 @@ wD wP wX xg -wL -wL -wL -wL -wL -wL +Ys +Ys +Ys +Ys +Ys +Ys yB xy zn @@ -66212,11 +66121,11 @@ wP wW xh wW -wL -wL -wL -wL -wL +Ys +Ys +Ys +Ys +Ys yB xy zn @@ -66470,10 +66379,10 @@ wW xh wW wW -wW -wL -wL -wL +Ys +Ys +Ys +Ys yC yS zm @@ -66728,9 +66637,9 @@ xi wW wW wW -wL -wL -wL +Ys +Ys +Ys yD yT wE diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index de733c8c34..5fa5545c1c 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -7778,10 +7778,7 @@ dir = 2; id = "UO45_air_in" }, -/turf/open/floor/engine{ - name = "air floor"; - initial_gas_mix = "n2=10580;o2=2644" - }, +/turf/open/floor/engine/air, /area/awaymission/undergroundoutpost45/engineering) "pG" = ( /obj/structure/cable{ @@ -8023,10 +8020,7 @@ external_pressure_bound = 120; name = "server vent" }, -/turf/open/floor/circuit{ - name = "Server Base"; - initial_gas_mix = "n2=500,TEMP=80" - }, +/turf/open/floor/circuit/telecomms/server, /area/awaymission/undergroundoutpost45/research) "qi" = ( /obj/machinery/atmospherics/pipe/simple{ @@ -8394,10 +8388,7 @@ /obj/machinery/rnd/server{ req_access = null }, -/turf/open/floor/circuit{ - name = "Server Base"; - initial_gas_mix = "n2=500,TEMP=80" - }, +/turf/open/floor/circuit/telecomms/server, /area/awaymission/undergroundoutpost45/research) "qQ" = ( /obj/machinery/atmospherics/pipe/manifold{ @@ -12603,6 +12594,12 @@ /obj/effect/mapping_helpers/planet_z, /turf/open/space, /area/space/nearstation) +"KE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/circuit/telecomms/server, +/area/awaymission/undergroundoutpost45/research) (1,1,1) = {" aa @@ -37925,7 +37922,7 @@ gz gz gz gz -qh +KE qP qh gz diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index f7aefd5575..0a05c6f8ea 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -33,6 +33,13 @@ }, /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) +"aad" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/turf/open/floor/wood, +/area/maintenance/port/aft) "aae" = ( /obj/effect/landmark/carpspawn, /turf/open/space, @@ -707,7 +714,7 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/hos) "abV" = ( -/obj/machinery/computer/security, +/obj/machinery/computer/security/hos, /turf/open/floor/carpet, /area/crew_quarters/heads/hos) "abW" = ( @@ -1730,10 +1737,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - name = "Prison Monitor"; - network = list("prison"); +/obj/machinery/computer/security/telescreen/prison{ pixel_y = 30 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -1769,10 +1773,7 @@ /turf/open/floor/plasteel, /area/security/prison) "aen" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - name = "Prison Monitor"; - network = list("prison"); +/obj/machinery/computer/security/telescreen/prison{ pixel_y = 30 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -3518,7 +3519,8 @@ "ail" = ( /obj/machinery/camera{ c_tag = "Brig Interrogation"; - dir = 8 + dir = 8; + network = list("interrogation") }, /turf/open/floor/plasteel/dark, /area/security/prison) @@ -3996,10 +3998,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, -/obj/machinery/computer/security{ - name = "Labor Camp Monitoring"; - network = list("labor") - }, +/obj/machinery/computer/security/labor, /turf/open/floor/plasteel, /area/security/processing) "ajv" = ( @@ -4056,6 +4055,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, +/obj/machinery/computer/security/telescreen/interrogation{ + pixel_y = 30 + }, /turf/open/floor/plasteel/red/side{ dir = 1 }, @@ -7919,11 +7921,8 @@ pixel_y = 7 }, /obj/item/pen, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; +/obj/machinery/computer/security/telescreen/prison{ dir = 1; - name = "Prison Monitor"; - network = list("prison"); pixel_y = -27 }, /turf/open/floor/wood, @@ -9134,12 +9133,9 @@ /obj/item/wallframe/camera, /obj/item/wallframe/camera, /obj/item/assault_pod/mining, -/obj/machinery/computer/security/telescreen{ - desc = "Used for the Auxillary Mining Base."; +/obj/machinery/computer/security/telescreen/auxbase{ dir = 8; - name = "Auxillary Base Monitor"; - network = list("auxbase"); - pixel_x = 28 + pixel_x = 30 }, /turf/open/floor/plasteel/yellow/side{ dir = 4 @@ -11089,7 +11085,21 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "aCd" = ( -/obj/machinery/cryopod, +/obj/structure/bed, +/obj/item/bedsheet, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/machinery/button/door{ + id = "Dorm1"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, /turf/open/floor/carpet, /area/crew_quarters/dorms) "aCe" = ( @@ -11709,7 +11719,7 @@ "aDK" = ( /obj/machinery/door/airlock{ id_tag = "Dorm1"; - name = "Cryogenics" + name = "Dorm 1" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -12590,7 +12600,7 @@ /obj/machinery/camera/motion{ c_tag = "Vault"; dir = 1; - network = list("minisat") + network = list("vault") }, /obj/machinery/light, /turf/open/floor/plasteel/vault/corner{ @@ -14494,7 +14504,10 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/machinery/plantgenes, +/obj/machinery/plantgenes{ + pixel_y = 6 + }, +/obj/structure/table, /turf/open/floor/plasteel/hydrofloor, /area/hydroponics) "aKM" = ( @@ -16675,7 +16688,10 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQX" = ( -/obj/machinery/vending/kink, +/obj/machinery/firealarm{ + dir = 2; + pixel_y = 24 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQY" = ( @@ -17703,9 +17719,7 @@ /turf/open/floor/plasteel, /area/bridge) "aUd" = ( -/obj/machinery/computer/security/mining{ - network = list("mine","auxbase") - }, +/obj/machinery/computer/security/mining, /turf/open/floor/plasteel/brown{ dir = 6 }, @@ -20796,7 +20810,8 @@ /obj/structure/table, /obj/item/aiModule/supplied/quarantine, /obj/machinery/camera/motion{ - dir = 4 + dir = 4; + network = list("aiupload") }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) @@ -20814,7 +20829,8 @@ pixel_x = 32 }, /obj/machinery/camera/motion{ - dir = 8 + dir = 8; + network = list("aiupload") }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) @@ -21076,6 +21092,10 @@ }, /turf/closed/wall, /area/quartermaster/warehouse) +"bcU" = ( +/obj/item/stack/tile/plasteel, +/turf/open/space, +/area/space/nearstation) "bcV" = ( /obj/machinery/airalarm{ dir = 8; @@ -21466,6 +21486,10 @@ /obj/structure/closet/crate/medical, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) +"bdV" = ( +/obj/item/stack/sheet/metal, +/turf/open/floor/plating/airless, +/area/space/nearstation) "bdW" = ( /obj/item/clothing/gloves/color/rainbow, /obj/item/clothing/head/soft/rainbow, @@ -23876,6 +23900,7 @@ "bkb" = ( /obj/machinery/camera{ c_tag = "Medbay Morgue"; + network = list("ss13","medbay"); dir = 8 }, /obj/machinery/airalarm{ @@ -24402,6 +24427,7 @@ /obj/structure/table/reinforced, /obj/machinery/camera{ c_tag = "Medbay Foyer"; + network = list("ss13","medbay"); dir = 8 }, /obj/machinery/cell_charger, @@ -25495,10 +25521,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) "bnR" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - name = "Prison Monitor"; - network = list("prison"); +/obj/machinery/computer/security/telescreen/vault{ pixel_y = 30 }, /obj/machinery/disposal/bin, @@ -26795,6 +26818,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay West"; + network = list("ss13","medbay"); dir = 2 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -27479,6 +27503,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay East"; + network = list("ss13","medbay"); dir = 8; pixel_y = -22 }, @@ -27843,7 +27868,7 @@ /area/maintenance/starboard) "btr" = ( /obj/machinery/camera{ - c_tag = "Cargo Recieving Dock"; + c_tag = "Cargo Receiving Dock"; dir = 4 }, /obj/machinery/button/door{ @@ -28807,7 +28832,7 @@ /obj/machinery/camera{ c_tag = "Genetics Research"; dir = 1; - network = list("ss13","rd") + network = list("ss13","medbay") }, /obj/machinery/firealarm{ dir = 1; @@ -28841,6 +28866,7 @@ "bvB" = ( /obj/machinery/camera{ c_tag = "Genetics Access"; + network = list("ss13","medbay"); dir = 8; pixel_y = -22 }, @@ -29198,7 +29224,8 @@ "bww" = ( /obj/structure/chair, /obj/machinery/camera{ - c_tag = "Surgery Observation" + c_tag = "Surgery Observation"; + network = list("ss13","medbay") }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -29283,6 +29310,7 @@ /obj/structure/table/glass, /obj/machinery/camera{ c_tag = "Medbay Cryogenics"; + network = list("ss13","medbay"); dir = 2 }, /obj/item/reagent_containers/glass/beaker/cryoxadone, @@ -29301,6 +29329,7 @@ "bwL" = ( /obj/machinery/camera{ c_tag = "Genetics Cloning"; + network = list("ss13","medbay"); dir = 4 }, /obj/structure/table, @@ -29553,13 +29582,8 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "bxj" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; - name = "Research Monitor"; - network = list("rd","minisat"); - pixel_y = 2 - }, /obj/structure/table, +/obj/machinery/computer/security/telescreen/rd, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "bxk" = ( @@ -30205,8 +30229,7 @@ pixel_x = 27 }, /obj/machinery/computer/security/mining{ - dir = 8; - network = list("mine","auxbase") + dir = 8 }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -30549,13 +30572,8 @@ /area/security/checkpoint/science) "bzD" = ( /obj/structure/table, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of your own office."; - name = "Research Monitor"; - network = list("rd"); - pixel_y = 2 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/computer/security/telescreen/circuitry, /turf/open/floor/plasteel/red/side{ dir = 1 }, @@ -30873,6 +30891,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Treatment Center"; + network = list("ss13","medbay"); dir = 8 }, /turf/open/floor/plasteel, @@ -31091,10 +31110,6 @@ /turf/open/floor/engine, /area/science/explab) "bAS" = ( -/obj/machinery/computer/security/mining{ - dir = 4; - network = list("mine","auxbase") - }, /obj/machinery/camera{ c_tag = "Quartermaster's Office"; dir = 4 @@ -31107,6 +31122,9 @@ pixel_x = -32; supply_display = 1 }, +/obj/machinery/computer/security/qm{ + dir = 4 + }, /turf/open/floor/plasteel/brown{ dir = 10 }, @@ -31906,6 +31924,7 @@ /obj/structure/closet/secure_closet/medical3, /obj/machinery/camera{ c_tag = "Medbay Storage"; + network = list("ss13","medbay"); dir = 2 }, /turf/open/floor/plasteel/white, @@ -31988,6 +32007,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay South"; + network = list("ss13","medbay"); dir = 4 }, /turf/open/floor/plasteel/white, @@ -32280,6 +32300,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; + network = list("ss13","medbay"); dir = 8 }, /obj/machinery/iv_drip, @@ -32521,6 +32542,7 @@ }, /obj/machinery/camera{ c_tag = "Chief Medical Office"; + network = list("ss13","medbay"); dir = 8; pixel_y = -22 }, @@ -32733,13 +32755,11 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "bEK" = ( -/obj/machinery/computer/security/mining{ - network = list("mine","auxbase") - }, /obj/machinery/camera{ c_tag = "Mining Dock"; dir = 4 }, +/obj/machinery/computer/security/mining, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bEL" = ( @@ -33103,6 +33123,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, +/obj/machinery/computer/security/telescreen/cmo{ + dir = 1; + pixel_y = -24 + }, /turf/open/floor/plasteel/barber, /area/crew_quarters/heads/cmo) "bFF" = ( @@ -33815,17 +33839,13 @@ /turf/open/floor/plasteel, /area/science/mixing) "bHv" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the test chamber."; - dir = 8; - layer = 4; - name = "Test Chamber Telescreen"; - network = list("toxins"); - pixel_x = 30 - }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/computer/security/telescreen/toxins{ + dir = 4; + pixel_x = 30 + }, /turf/open/floor/plasteel, /area/science/mixing) "bHw" = ( @@ -34068,6 +34088,7 @@ }, /obj/machinery/camera{ c_tag = "Surgery Operating"; + network = list("ss13","medbay"); dir = 1; pixel_x = 22 }, @@ -34389,7 +34410,8 @@ pixel_y = 29 }, /obj/machinery/camera{ - c_tag = "Virology Break Room" + c_tag = "Virology Break Room"; + network = list("ss13","medbay") }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -34538,7 +34560,6 @@ /turf/open/floor/plating/airless, /area/science/test_area) "bJa" = ( -/obj/item/flashlight/lamp, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -34880,6 +34901,10 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab) +"bJP" = ( +/obj/machinery/vending/boozeomat/all_access, +/turf/open/floor/plasteel/bar, +/area/maintenance/port/aft) "bJQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -35577,21 +35602,13 @@ }, /area/science/test_area) "bLr" = ( -/obj/machinery/camera{ - active_power_usage = 0; - c_tag = "Bomb Test Site"; - desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site."; - dir = 8; - invuln = 1; - light = null; - name = "Hardened Bomb-Test Camera"; - network = list("toxins"); - use_power = 0 - }, /obj/item/target/alien/anchored, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/camera/preset/toxins{ + dir = 8 + }, /turf/open/floor/plating{ luminosity = 2; initial_gas_mix = "o2=0.01;n2=0.01" @@ -36439,7 +36456,6 @@ /turf/open/floor/plating/airless, /area/science/test_area) "bNF" = ( -/obj/item/flashlight/lamp, /obj/effect/turf_decal/stripes/line{ dir = 2 }, @@ -36692,6 +36708,7 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Virology Airlock"; + network = list("ss13","medbay"); dir = 2 }, /obj/effect/turf_decal/stripes/line{ @@ -37421,8 +37438,34 @@ }, /turf/open/floor/plasteel, /area/tcommsat/computer) +"bPR" = ( +/obj/effect/decal/cleanable/robot_debris/old, +/turf/open/floor/wood, +/area/maintenance/port/aft) +"bPS" = ( +/turf/open/floor/wood, +/area/maintenance/port/aft) +"bPT" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/maintenance/port/aft) "bPU" = ( -/obj/effect/spawner/lootdrop/keg, +/obj/item/shard, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"bPV" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Maint Bar Access"; + req_access_txt = "12" + }, +/obj/structure/barricade/wooden{ + name = "wooden barricade (CLOSED)" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"bPW" = ( +/obj/effect/decal/cleanable/oil, /turf/open/floor/plating, /area/maintenance/port/aft) "bPX" = ( @@ -37810,14 +37853,10 @@ /area/science/misc_lab) "bQY" = ( /obj/structure/table/reinforced, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of his office."; - dir = 2; - name = "Research Monitor"; - network = list("rd"); - pixel_y = 28 - }, /obj/item/integrated_circuit_printer, +/obj/machinery/computer/security/telescreen/circuitry{ + pixel_y = 30 + }, /turf/open/floor/plasteel/white, /area/science/circuit) "bQZ" = ( @@ -37828,14 +37867,30 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/stack/sheet/metal/fifty, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"bRb" = ( -/obj/structure/table/reinforced, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/white, /area/science/circuit) +"bRc" = ( +/obj/structure/table/wood, +/obj/item/soap/nanotrasen, +/turf/open/floor/wood{ + icon_state = "wood-broken7" + }, +/area/maintenance/port/aft) +"bRe" = ( +/obj/structure/table/wood, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" + }, +/turf/open/floor/wood, +/area/maintenance/port/aft) +"bRf" = ( +/obj/structure/table/wood, +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/port/aft) "bRg" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -37906,13 +37961,9 @@ /obj/machinery/computer/secure_data{ dir = 8 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the Engine."; +/obj/machinery/computer/security/telescreen/engine{ dir = 8; - layer = 4; - name = "Engine Monitor"; - network = list("engine"); - pixel_x = 30 + pixel_x = 24 }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -38303,6 +38354,18 @@ icon_state = "platingdmg3" }, /area/maintenance/starboard/aft) +"bSn" = ( +/obj/machinery/space_heater, +/turf/open/floor/wood, +/area/maintenance/port/aft) +"bSo" = ( +/obj/structure/chair/stool, +/turf/open/floor/wood, +/area/maintenance/port/aft) +"bSp" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/maintenance/port/aft) "bSq" = ( /obj/structure/rack, /obj/item/tank/internals/emergency_oxygen, @@ -38320,18 +38383,18 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Telecomms Monitoring"; - dir = 8 + dir = 8; + network = list("tcomms") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/tcommsat/computer) "bSu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/obj/item/stack/cable_coil{ + amount = 5 }, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/maintenance/bar) +/turf/open/floor/plating/airless, +/area/space/nearstation) "bSv" = ( /obj/machinery/camera{ c_tag = "Construction Area"; @@ -38590,7 +38653,8 @@ icon_state = "0-8" }, /obj/machinery/camera{ - c_tag = "Virology Module" + c_tag = "Virology Module"; + network = list("ss13","medbay") }, /turf/open/floor/plasteel/white, /area/medical/virology) @@ -38782,6 +38846,54 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"bTs" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/port/aft) +"bTt" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken6" + }, +/area/maintenance/port/aft) +"bTu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/port/aft) +"bTv" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"bTw" = ( +/obj/machinery/door/airlock/maintenance/abandoned{ + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"bTx" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"bTy" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "bTz" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -41427,9 +41539,11 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "car" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/closed/wall, -/area/maintenance/bar) +/area/maintenance/port/aft) "cas" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -41844,7 +41958,8 @@ "cbl" = ( /obj/machinery/camera{ c_tag = "Telecomms Server Room"; - dir = 4 + dir = 4; + network = list("tcomms") }, /turf/open/floor/plasteel/dark/telecomms/mainframe, /area/tcommsat/server) @@ -41953,14 +42068,16 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "cbw" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, /turf/open/floor/plating, /area/maintenance/port/aft) "cbx" = ( @@ -42184,14 +42301,11 @@ /area/science/circuit) "cbZ" = ( /obj/structure/table/reinforced, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of his office."; - dir = 1; - name = "Research Monitor"; - network = list("rd"); - pixel_y = -28 - }, /obj/item/integrated_circuit_printer, +/obj/machinery/computer/security/telescreen/circuitry{ + dir = 1; + pixel_y = -30 + }, /turf/open/floor/plasteel/white, /area/science/circuit) "cca" = ( @@ -44951,6 +45065,10 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"cjn" = ( +/obj/item/weldingtool, +/turf/open/floor/plating/airless, +/area/space/nearstation) "cjo" = ( /obj/structure/closet/toolcloset, /turf/open/floor/plasteel, @@ -45178,11 +45296,8 @@ /obj/machinery/computer/station_alert{ dir = 4 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of your own office."; +/obj/machinery/computer/security/telescreen/ce{ dir = 4; - name = "Research Monitor"; - network = list("rd"); pixel_x = -24 }, /turf/open/floor/plasteel/vault, @@ -47934,16 +48049,13 @@ /turf/open/space, /area/space/nearstation) "csq" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the turbine vent."; - dir = 1; - name = "turbine vent monitor"; - network = list("turbine"); - pixel_y = -29 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, +/obj/machinery/computer/security/telescreen/turbine{ + dir = 1; + pixel_y = -30 + }, /turf/open/floor/plasteel/floorgrime, /area/maintenance/disposal/incinerator) "csr" = ( @@ -49299,7 +49411,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Core Hallway"; dir = 4; - network = list("minisat") + network = list("aicore") }, /obj/machinery/firealarm{ dir = 8; @@ -49677,7 +49789,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber North"; dir = 1; - network = list("minisat") + network = list("aicore") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) @@ -50573,7 +50685,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber South"; dir = 2; - network = list("minisat") + network = list("aicore") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) @@ -50904,6 +51016,10 @@ /obj/item/clothing/under/burial, /turf/open/floor/plasteel/grimy, /area/chapel/office) +"cCa" = ( +/obj/item/clothing/head/hardhat, +/turf/open/floor/plating/airless, +/area/space/nearstation) "cCb" = ( /obj/structure/table, /obj/item/stack/cable_coil{ @@ -52522,17 +52638,13 @@ /turf/open/floor/plating, /area/engine/engineering) "cMC" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the Engine."; - dir = 8; - layer = 4; - name = "Engine Monitor"; - network = list("engine"); - pixel_x = 30 - }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/computer/security/telescreen/engine{ + dir = 8; + pixel_x = 30 + }, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -53171,13 +53283,10 @@ /obj/item/radio/intercom{ pixel_x = -30 }, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, /turf/open/floor/plasteel/white, /area/science/circuit) -"eiu" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer, -/turf/open/floor/wood, -/area/maintenance/bar) "eyM" = ( /obj/machinery/mineral/ore_redemption{ input_dir = 2; @@ -53192,12 +53301,6 @@ }, /turf/open/floor/plasteel/floorgrime, /area/maintenance/disposal/incinerator) -"eOM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/wood, -/area/maintenance/bar) "eRz" = ( /obj/structure/lattice, /obj/structure/grille, @@ -53219,14 +53322,9 @@ }, /turf/closed/wall/r_wall, /area/science/mixing) -"fip" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall, -/area/maintenance/bar) "flc" = ( -/obj/machinery/bookbinder, +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, /turf/open/floor/plasteel/white, /area/science/circuit) "fnC" = ( @@ -53246,13 +53344,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"fFm" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/maintenance/bar) "fGf" = ( -/obj/machinery/smartfridge/disks, +/obj/machinery/smartfridge/disks{ + pixel_y = 2 + }, +/obj/structure/table, /turf/open/floor/plasteel/hydrofloor, /area/hydroponics) "fKl" = ( @@ -53260,20 +53356,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/science/circuit) -"fOZ" = ( -/obj/machinery/vending/clothing, -/turf/open/floor/wood, -/area/maintenance/bar) -"fQl" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/shaker, -/turf/open/floor/wood, -/area/maintenance/bar) -"fZE" = ( -/obj/item/restraints/handcuffs/fake, -/obj/structure/bed/dogbed, -/turf/open/floor/plating, -/area/maintenance/bar) "gbq" = ( /obj/structure/cable{ icon_state = "4-8" @@ -53349,17 +53431,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"hiC" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, -/area/maintenance/bar) -"hsg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/maintenance/bar) "hRa" = ( /obj/structure/table/reinforced, /obj/machinery/light{ @@ -53368,23 +53439,8 @@ /obj/machinery/cell_charger{ pixel_y = 5 }, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, /turf/open/floor/plasteel/white, /area/science/circuit) -"hZp" = ( -/obj/structure/table/wood/poker, -/obj/effect/spawner/lootdrop/gambling, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, -/area/maintenance/bar) -"iaK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/maintenance/bar) "ijc" = ( /obj/structure/table, /obj/item/stack/sheet/metal/fifty, @@ -53416,11 +53472,6 @@ /obj/structure/reagent_dispensers/cooking_oil, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) -"iVZ" = ( -/obj/effect/spawner/lootdrop/minor/kittyears_or_rabbitears, -/obj/item/assembly/signaler, -/turf/open/floor/plating, -/area/maintenance/bar) "jbf" = ( /obj/structure/cable{ icon_state = "0-2" @@ -53452,18 +53503,11 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "jrE" = ( -/obj/machinery/rnd/production/protolathe/department/science, /obj/structure/sign/poster/official/random{ pixel_x = 32 }, /turf/open/floor/plasteel/white, /area/science/circuit) -"jsx" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/wood, -/area/maintenance/bar) "jAD" = ( /obj/structure/grille, /turf/open/floor/plating/airless, @@ -53543,11 +53587,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"kjd" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, -/area/maintenance/bar) "knx" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering{ @@ -53574,11 +53613,6 @@ }, /turf/closed/wall/r_wall, /area/science/mixing) -"kEK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/chair/stool/bar, -/turf/open/floor/wood, -/area/maintenance/bar) "kOw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, @@ -53590,9 +53624,6 @@ }, /turf/open/floor/plasteel/hydrofloor, /area/hallway/secondary/service) -"kPI" = ( -/turf/open/floor/wood, -/area/maintenance/bar) "kQk" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -53616,20 +53647,12 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall, /area/science/circuit) -"lBy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/vending/games, -/turf/open/floor/wood, -/area/maintenance/bar) -"lEg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks, -/turf/open/floor/wood, -/area/maintenance/bar) -"lFY" = ( -/turf/closed/wall, -/area/maintenance/bar) +"lCi" = ( +/obj/docking_port/stationary/public_mining_dock{ + dir = 8 + }, +/turf/open/floor/plating, +/area/construction/mining/aux_base) "lMg" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -53640,10 +53663,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/science/circuit) -"lSY" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/wood, -/area/maintenance/bar) "mjr" = ( /obj/machinery/vending/wardrobe/bar_wardrobe, /turf/open/floor/wood, @@ -53659,17 +53678,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"mEa" = ( -/obj/structure/falsewall, -/turf/open/floor/plating, -/area/maintenance/bar) -"mLY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/jukebox, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, -/area/maintenance/bar) "mNi" = ( /obj/machinery/light_switch{ pixel_x = -20 @@ -53682,16 +53690,6 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) -"mVS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/maintenance/bar) -"nnj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/wood, -/area/maintenance/bar) "noK" = ( /obj/structure/girder, /turf/open/floor/plasteel/dark, @@ -53722,41 +53720,18 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"nJJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, -/area/maintenance/bar) "nRG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"nYh" = ( -/obj/structure/table/wood/poker, -/obj/item/storage/pill_bottle/dice, -/turf/open/floor/wood, -/area/maintenance/bar) "oce" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, /turf/open/floor/plasteel/white, /area/science/mixing) -"opk" = ( -/obj/structure/table/wood/poker, -/obj/effect/spawner/lootdrop/gambling, -/turf/open/floor/wood, -/area/maintenance/bar) -"oCW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/wood, -/area/maintenance/bar) "oDF" = ( /obj/machinery/light, /turf/open/floor/plating, @@ -53774,12 +53749,6 @@ /obj/machinery/disposal/bin, /turf/open/floor/plasteel/white, /area/science/circuit) -"pcd" = ( -/obj/machinery/door/airlock/wood{ - name = "Maintenance Bar" - }, -/turf/open/floor/wood, -/area/maintenance/bar) "pHl" = ( /obj/structure/table, /obj/item/storage/box/beakers{ @@ -53819,41 +53788,17 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/floorgrime, /area/science/misc_lab) -"pVG" = ( -/obj/machinery/computer/cryopod, -/turf/closed/wall, -/area/crew_quarters/dorms) -"pXH" = ( -/obj/structure/chair/stool/bar, -/turf/open/floor/wood, -/area/maintenance/bar) -"pYX" = ( -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) "qeQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, /area/science/circuit) -"qpv" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/autolathe, -/turf/open/floor/plasteel/white, -/area/science/circuit) "quT" = ( /obj/structure/lattice, /obj/structure/grille/broken, /turf/open/space/basic, /area/space/nearstation) -"qTS" = ( -/obj/effect/spawner/lootdrop/costume, -/obj/item/electropack/shockcollar, -/turf/open/floor/plating, -/area/maintenance/bar) "rcD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -53869,34 +53814,12 @@ /obj/item/reagent_containers/food/drinks/beer, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"rpN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/chair/stool/bar, -/turf/open/floor/wood, -/area/maintenance/bar) -"rvm" = ( -/obj/machinery/vending/boozeomat, -/turf/open/floor/wood, -/area/maintenance/bar) -"rGn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/maintenance/bar) "rKP" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, /turf/open/floor/plating, /area/construction) -"rLR" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/spray/cleaner, -/turf/open/floor/wood, -/area/maintenance/bar) -"rTJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/bar) "saK" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -53909,17 +53832,6 @@ /obj/item/gun/energy/laser/practice, /turf/open/floor/plasteel/white, /area/science/circuit) -"scN" = ( -/obj/item/clothing/mask/breath/medical, -/obj/item/tank/internals/anesthetic, -/turf/open/floor/plating, -/area/maintenance/bar) -"sjA" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/wood, -/area/maintenance/bar) "slk" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -53938,13 +53850,6 @@ /obj/item/shovel/spade, /turf/open/floor/plasteel/hydrofloor, /area/hallway/secondary/service) -"sKA" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/port/aft) "sLv" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance, @@ -53987,28 +53892,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/hallway/secondary/service) -"tfq" = ( -/obj/machinery/cryopod{ - dir = 4; - tag = "0" - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"tfA" = ( -/obj/structure/reagent_dispensers/keg/aphro/strong, -/obj/item/reagent_containers/glass/beaker, -/turf/open/floor/plating, -/area/maintenance/bar) "trb" = ( /obj/machinery/light{ dir = 4 }, /turf/open/floor/plasteel, /area/security/courtroom) -"tsl" = ( -/obj/machinery/vending/autodrobe, -/turf/open/floor/wood, -/area/maintenance/bar) "tMl" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/showroomfloor, @@ -54026,10 +53915,6 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"uao" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/maintenance/bar) "udp" = ( /obj/item/crowbar/large, /obj/structure/rack, @@ -54056,10 +53941,6 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) -"uAx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/maintenance/bar) "uNu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54079,10 +53960,6 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"uVh" = ( -/obj/structure/falsewall, -/turf/open/floor/plating, -/area/maintenance/port/aft) "uVS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -54106,15 +53983,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) -"vmI" = ( -/obj/machinery/vending/kink, -/turf/open/floor/plating, -/area/maintenance/bar) -"vsJ" = ( -/obj/structure/table/wood, -/obj/item/weaponcrafting/receiver, -/turf/open/floor/wood, -/area/maintenance/bar) "vxh" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance{ @@ -54129,6 +53997,7 @@ dir = 8; pixel_x = -24 }, +/obj/item/stock_parts/cell/high, /turf/open/floor/plasteel/white, /area/science/circuit) "vCb" = ( @@ -54139,24 +54008,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/white, /area/science/circuit) -"vPe" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck/syndicate, -/turf/open/floor/wood, -/area/maintenance/bar) "vPE" = ( /obj/machinery/light{ dir = 4 }, -/obj/machinery/libraryscanner, /turf/open/floor/plasteel/white, /area/science/circuit) -"wgE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/wood, -/area/maintenance/bar) "wkN" = ( /turf/closed/wall, /area/science/circuit) @@ -54186,9 +54043,7 @@ "wvX" = ( /obj/structure/table/reinforced, /obj/machinery/light, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, -/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/white, /area/science/circuit) "wBd" = ( @@ -54234,14 +54089,6 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"xEE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/maintenance/bar) "xIa" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/grille_or_trash, @@ -54253,9 +54100,6 @@ }, /turf/open/floor/plasteel, /area/science/circuit) -"ydY" = ( -/turf/open/floor/carpet, -/area/crew_quarters/dorms) (1,1,1) = {" aaa @@ -65405,7 +65249,7 @@ apN apN apN apN -apN +lCi apN apN apN @@ -72918,8 +72762,8 @@ aaa aaf aaf aaf -gXs -gXs +aaa +aaa aag aaa bVx @@ -73174,11 +73018,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -pYX -aaa +bCq +bCq +bCq +bLv +bCq aoV cbj aoV @@ -73431,11 +73275,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -pYX -aaa +bCq +bJP +bCq +bSn +bCq bCq cbj bLv @@ -73688,11 +73532,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -pYX -aaa +bCq +bPS +aad +bPS +bPS bCq cbk bLv @@ -73907,7 +73751,7 @@ aLJ aLE aOl aPA -aQN +aQW aQW aTD aQW @@ -73945,11 +73789,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -pYX -aaa +bLv +bPR +bRc +bSo +bTs bCq bVy bLv @@ -74202,11 +74046,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -pYX -aaa +bCq +bPS +bRf +bSo +bTu bCq bVB bHE @@ -74459,11 +74303,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -pYX -aaa +bLv +bPT +bRe +bSo +bTt bCq bVA bWw @@ -74717,10 +74561,10 @@ aaa aaa aaa bCq +bPV bCq bCq -bCq -bCq +bTw bCq bVD bWy @@ -74976,8 +74820,8 @@ aoV bCq bPU bHE -bPU -bPU +bSp +bTv bCq bVC bWx @@ -75231,10 +75075,10 @@ bGi aoV aoV bCq -bCq -uVh +bPW bCq bCq +bTy bCq bVF bWA @@ -75490,8 +75334,8 @@ aoV bCq bHE bHE -bHE -bHE +bSq +bTx bCq bVE bWz @@ -75754,14 +75598,14 @@ bCq bCq bCq bYy -lFY -lFY -rTJ -lFY -lFY -lFY -lFY -lFY +bCq +bCq +bLv +bCq +bCq +bCq +bCq +bLv bUs bLv aaa @@ -76011,14 +75855,14 @@ bVG bHE bHE bHE -pcd -kjd -kPI -kPI -hiC -pXH -pXH -lFY +bLv +aaf +aoV +aoV +aoV +aoV +aoV +bLv bUs bLv aaa @@ -76264,18 +76108,18 @@ bHE bHE bCq bHE -lFY -lFY -lFY -lFY -lFY -kPI -fFm -kPI -pXH -vPe -opk -lFY +bLv +bLv +bLv +bLv +bLv +aoV +aoV +aoV +aoV +aoV +aaf +bLv bUs bLv aaf @@ -76521,18 +76365,18 @@ bHE bHE cTF bHE -lFY -vmI -qTS -fZE -lFY -kPI -kPI -kPI -pXH -nYh -hZp -lFY +bLv +aoV +aoV +aoV +aoV +aoV +aoV +aoV +aoV +aoV +aoV +bLv bUs bLv aaa @@ -76778,18 +76622,18 @@ bHE bSs bCq bHE -lFY -tfA -iVZ -scN -lFY -pXH -pXH -fFm -eOM -pXH -pXH -lFY +bLv +aoV +aoV +aoV +bcU +aaf +aaH +cCa +aoV +aoV +aoV +bLv bUs bLv aaa @@ -77035,18 +76879,18 @@ bRh bLu bCq bHE -lFY -lFY -mEa -lFY -lFY -uao -uao -pXH -wgE -kPI -kPI -lFY +bLv +aaf +aaf +aoV +aoV +aaH +bdV +aaH +aaf +aaf +aaf +bLv bUs bLv aaf @@ -77292,19 +77136,19 @@ bCq bCq bCq bHE -lFY -fQl -kPI -fFm -eiu -kPI +bLv +aoV +aoV +aoV +aoV +cjn bSu -kEK -nJJ -mVS -mLY -rGn -sKA +aaH +aoV +aoV +aoV +bLv +bUs bLv aaa cjJ @@ -77549,19 +77393,19 @@ bLv aaa bLv bHE -lFY -vsJ -nnj -oCW -lEg -iaK -xEE -rpN -sjA -oCW -lBy -fip -bUz +bLv +aoV +aoV +aoV +aoV +aoV +aaH +aaf +aoV +aoV +aoV +bLv +bUs bLv aaa cjJ @@ -77806,19 +77650,19 @@ bLv aaf bLv bUt -lFY -rLR -jsx -kjd -rvm -kPI -uao -pXH -kPI -hiC -fOZ -hsg -bUz +bLv +aaf +aaf +aoV +aoV +aoV +aaH +aoV +aoV +aaf +aaf +bLv +bUs bLv aaf cjJ @@ -78063,19 +77907,19 @@ bCq aaa bLv bUs -lFY -kPI -fFm -kPI -lSY -kPI -kPI -kPI -kPI -kPI -tsl -hsg -bUz +bLv +aoV +aoV +aoV +aoV +aoV +aaf +aoV +aoV +aoV +aoV +bCq +bUs bCq aaa aaf @@ -78320,19 +78164,19 @@ aaa aaa bTB bUv -uAx -uAx -uAx -uAx -uAx -uAx -uAx -uAx -uAx -uAx -uAx +bES +bES +bES +bES +bGp +bGp +bGp +bGp +bES +bES +bES car -bUz +bUs bCq bCq bCq @@ -84179,8 +84023,8 @@ arf arf arf arf -aoa -arf +anF +ahn aJn aJn aJq @@ -84433,11 +84277,11 @@ arf aqa atf arf -tfq -tfq -tfq -tfq +aqa +atf arf +anF +ahn aaa aJn aJq @@ -84689,12 +84533,12 @@ ath arf apY ath -pVG -ydY -ath -ydY -ydY arf +apY +ate +arf +anF +ahn aaa aJn aLY @@ -84949,9 +84793,9 @@ ath arf aCd ath -aCd -aCd arf +anF +ahn aJw aJw aMh @@ -85207,8 +85051,8 @@ arf asd aDK arf -arf -arf +aoa +ahn aJv aKG aMg @@ -104015,16 +103859,16 @@ bMB bNA cOe bSl -bRb +bUq flc vPE -bUq +bXs bVt dfh jSO jgm oUh -qpv +vPE jrE saK bSl diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index f3a515abe9..4d8cd88eb8 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -897,7 +897,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/engineering{ name = "Auxiliary Construction Storage"; - req_access_txt = "10;32;47;48" + req_one_access_txt = "10;32;47;48" }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -9053,11 +9053,9 @@ /turf/open/floor/plasteel/redblue, /area/maintenance/port/fore) "ayW" = ( -/obj/machinery/vending/autodrobe{ - req_access_txt = "0" - }, /obj/machinery/light/small, /obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/autodrobe/all_access, /turf/open/floor/plasteel/redblue/redside{ dir = 8 }, @@ -19222,9 +19220,6 @@ /turf/open/floor/plasteel/neutral, /area/quartermaster/qm) "aUs" = ( -/obj/machinery/computer/security/mining{ - dir = 8 - }, /obj/machinery/status_display{ pixel_x = 32 }, @@ -19233,6 +19228,9 @@ dir = 8; name = "cargo camera" }, +/obj/machinery/computer/security/qm{ + dir = 8 + }, /turf/open/floor/plasteel/brown{ dir = 4 }, @@ -27903,13 +27901,16 @@ pixel_x = 26; pixel_y = 8 }, -/obj/machinery/plantgenes, +/obj/machinery/plantgenes{ + pixel_y = 6 + }, /obj/machinery/camera{ c_tag = "Hydroponics"; dir = 8; name = "service camera" }, /obj/effect/turf_decal/delivery, +/obj/structure/table, /turf/open/floor/plasteel, /area/hydroponics) "bnn" = ( @@ -28550,7 +28551,10 @@ /turf/open/floor/plasteel, /area/hydroponics) "boC" = ( -/obj/machinery/smartfridge/disks, +/obj/machinery/smartfridge/disks{ + pixel_y = 2 + }, +/obj/structure/table, /turf/open/floor/plasteel, /area/hydroponics) "boD" = ( @@ -28842,14 +28846,11 @@ }, /area/security/execution/transfer) "bpg" = ( -/obj/machinery/computer/security{ - name = "Labor Camp Monitoring"; - network = list("labor") - }, /obj/item/radio/intercom{ name = "Station Intercom"; pixel_y = 26 }, +/obj/machinery/computer/security/labor, /turf/open/floor/plasteel/red, /area/security/execution/transfer) "bph" = ( @@ -30117,12 +30118,12 @@ /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "brC" = ( -/obj/machinery/computer/security{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/computer/security/hos{ + dir = 1 + }, /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "brD" = ( @@ -32400,7 +32401,7 @@ /obj/machinery/camera/motion{ c_tag = "AI Chamber - Fore"; name = "motion-sensitive ai camera"; - network = list("ai") + network = list("aichamber") }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, @@ -32854,7 +32855,8 @@ "bxe" = ( /obj/machinery/camera/motion{ c_tag = "Vault"; - dir = 4 + dir = 4; + network = list("vault") }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -40848,7 +40850,7 @@ c_tag = "Telecomms - Monitoring"; dir = 2; name = "telecomms camera"; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) @@ -41332,7 +41334,7 @@ c_tag = "AI Chamber - Aft"; dir = 1; name = "motion-sensitive ai camera"; - network = list("ai") + network = list("aichamber") }, /turf/open/floor/plasteel/vault, /area/ai_monitored/turret_protected/ai) @@ -45721,12 +45723,8 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the AI's satellite."; - dir = 4; - name = "Research Monitor"; - network = list("minisat"); - pixel_y = 2 +/obj/machinery/computer/security/telescreen/minisat{ + dir = 4 }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -45767,12 +45765,8 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the Engine."; +/obj/machinery/computer/security/telescreen/ce{ dir = 4; - layer = 4; - name = "Engine Monitor"; - network = list("engine"); pixel_x = -30 }, /mob/living/simple_animal/parrot/Poly, @@ -49046,6 +49040,10 @@ /obj/item/stack/packageWrap, /obj/item/hand_labeler, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/computer/security/telescreen/vault{ + dir = 8; + pixel_x = 26 + }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "ccD" = ( @@ -49056,7 +49054,7 @@ c_tag = "Telecomms - Chamber Port"; dir = 4; name = "telecomms camera"; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /turf/open/floor/plasteel/vault/telecomms{ dir = 8 @@ -49500,7 +49498,7 @@ /obj/machinery/camera/motion{ c_tag = "AI - Upload"; name = "motion-sensitive ai camera"; - network = list("minisat") + network = list("aiupload") }, /turf/open/floor/plasteel/vault, /area/ai_monitored/turret_protected/ai_upload) @@ -50943,7 +50941,7 @@ c_tag = "Telecomms - Chamber Starboard"; dir = 8; name = "telecomms camera"; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /turf/open/floor/plasteel/vault/telecomms{ dir = 8 @@ -52599,7 +52597,7 @@ /obj/machinery/camera/motion{ c_tag = "Bridge - Captain's Emergency Escape"; dir = 4; - name = "command camera" + name = "motion-sensitive command camera" }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -54725,7 +54723,7 @@ c_tag = "Telecomms - Cooling Room"; dir = 8; name = "telecomms camera"; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -63602,9 +63600,7 @@ }, /area/crew_quarters/locker) "cGO" = ( -/obj/machinery/vending/autodrobe{ - req_access_txt = "0" - }, +/obj/machinery/vending/autodrobe/all_access, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -67894,6 +67890,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Storage"; + network = list("ss13","medbay"); dir = 4; name = "medbay camera" }, @@ -71812,6 +71809,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Medbay - Waiting Room"; + network = list("ss13","medbay"); dir = 1; name = "medbay camera" }, @@ -71951,6 +71949,7 @@ "cYc" = ( /obj/machinery/camera{ c_tag = "Medbay - Break Room"; + network = list("ss13","medbay"); dir = 2; name = "medbay camera" }, @@ -72628,6 +72627,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Medbay - Fore Port"; + network = list("ss13","medbay"); dir = 8; name = "medbay camera" }, @@ -72709,6 +72709,7 @@ /obj/item/stack/medical/ointment, /obj/machinery/camera{ c_tag = "Medbay - Sleepers"; + network = list("ss13","medbay"); dir = 2; name = "medbay camera" }, @@ -75477,9 +75478,9 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Chemistry"; + network = list("ss13","medbay"); dir = 8; - name = "medbay camera"; - network = list("ss13","medbay") + name = "medbay camera" }, /turf/open/floor/plasteel/whiteyellow/corner, /area/medical/chemistry) @@ -76308,6 +76309,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Center"; + network = list("ss13","medbay"); dir = 2; name = "medbay camera" }, @@ -77164,19 +77166,17 @@ /area/science/research/abandoned) "djp" = ( /obj/structure/table/reinforced, -/obj/item/stack/sheet/glass/fifty, +/obj/machinery/cell_charger, /turf/open/floor/plasteel/white/side, /area/science/circuit) "djq" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/rnd/production/protolathe/department/science, /obj/machinery/light{ dir = 1 }, /turf/open/floor/plasteel/white/side, /area/science/circuit) "djr" = ( -/obj/machinery/autolathe, /turf/open/floor/plasteel/white/side, /area/science/circuit) "djs" = ( @@ -77700,6 +77700,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Medbay - Port"; + network = list("ss13","medbay"); dir = 1; name = "medbay camera" }, @@ -77798,6 +77799,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Medbay - Starboard"; + network = list("ss13","medbay"); dir = 1; name = "medbay camera" }, @@ -78542,12 +78544,11 @@ /area/crew_quarters/abandoned_gambling_den) "dmr" = ( /obj/structure/table/reinforced, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, /obj/structure/sign/departments/science{ pixel_x = -32 }, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, /turf/open/floor/plasteel/white/side{ dir = 4 }, @@ -79282,7 +79283,8 @@ pixel_x = -26 }, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/metal/fifty, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, /turf/open/floor/plasteel/white/side{ dir = 4 }, @@ -80849,8 +80851,6 @@ pixel_y = -32 }, /obj/machinery/cell_charger, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, /turf/open/floor/plasteel/white/side{ dir = 1 }, @@ -80884,16 +80884,16 @@ }, /area/science/circuit) "drD" = ( -/obj/machinery/vending/assist, /turf/open/floor/plasteel/white/side{ dir = 1 }, /area/science/circuit) "drE" = ( -/obj/machinery/bookbinder, /obj/structure/sign/poster/official/build{ pixel_y = -32 }, +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, /turf/open/floor/plasteel/white/side{ dir = 1 }, @@ -80902,11 +80902,11 @@ /obj/machinery/light_switch{ pixel_x = 36 }, -/obj/machinery/libraryscanner, /obj/machinery/firealarm{ dir = 4; pixel_x = 24 }, +/obj/machinery/vending/assist, /turf/open/floor/plasteel/white/corner{ dir = 1 }, @@ -81250,6 +81250,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Cloning Lab"; + network = list("ss13","medbay"); dir = 1; name = "medbay camera" }, @@ -81309,6 +81310,7 @@ /obj/item/clothing/neck/stethoscope, /obj/machinery/camera{ c_tag = "Medbay - Cryogenics"; + network = list("ss13","medbay"); dir = 1; name = "medbay camera" }, @@ -81775,6 +81777,7 @@ /obj/machinery/iv_drip, /obj/machinery/camera{ c_tag = "Medbay - Recovery Room"; + network = list("ss13","medbay"); dir = 8; name = "medbay camera" }, @@ -83171,6 +83174,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Genetics Lab"; + network = list("ss13","medbay"); dir = 4; name = "medbay camera" }, @@ -83802,6 +83806,7 @@ /obj/item/storage/box/disks, /obj/machinery/camera{ c_tag = "Medbay - Genetics Desk"; + network = list("ss13","medbay"); dir = 4; name = "medbay camera" }, @@ -84109,6 +84114,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Surgery"; + network = list("ss13","medbay"); dir = 1; name = "medbay camera" }, @@ -84703,6 +84709,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Medbay - Aft Port"; + network = list("ss13","medbay"); dir = 8; name = "medbay camera" }, @@ -84761,6 +84768,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Chief Medical Officer's Office"; + network = list("ss13","medbay"); dir = 8; name = "medbay camera" }, @@ -85669,14 +85677,12 @@ /turf/open/floor/wood, /area/crew_quarters/abandoned_gambling_den) "dBR" = ( -/obj/machinery/vending/boozeomat{ - req_access_txt = "0" - }, /obj/machinery/light/small, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random{ pixel_y = -32 }, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) "dBS" = ( @@ -85983,8 +85989,9 @@ /obj/structure/table/glass, /obj/item/clipboard, /obj/item/toy/figure/cmo, -/obj/machinery/status_display{ - pixel_x = -32 +/obj/machinery/computer/security/telescreen/cmo{ + dir = 4; + pixel_x = -30 }, /turf/open/floor/plasteel/neutral/side{ dir = 4 @@ -86031,6 +86038,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Aft Starboard"; + network = list("ss13","medbay"); dir = 4; name = "medbay camera" }, @@ -88056,16 +88064,12 @@ /area/science/test_area) "dGY" = ( /obj/structure/table/reinforced, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the testing site."; - dir = 4; - layer = 4; - name = "Testing Site Telescreen"; - network = list("toxins") - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/computer/security/telescreen/toxins{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "dGZ" = ( @@ -89064,6 +89068,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/camera{ c_tag = "Medbay - Morgue"; + network = list("ss13","medbay"); dir = 1; name = "medbay camera" }, @@ -89175,6 +89180,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Chief Medical Officer's Quarters"; + network = list("ss13","medbay"); dir = 1; name = "medbay camera" }, @@ -90372,17 +90378,8 @@ /obj/item/target, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/camera{ - active_power_usage = 0; - c_tag = "Bomb Test Site"; - desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site."; - dir = 4; - invuln = 1; - light = null; - name = "hardened testing camera"; - network = list("toxins"); - start_active = 1; - use_power = 0 +/obj/machinery/camera/preset/toxins{ + dir = 4 }, /turf/open/floor/plating/airless, /area/science/test_area) @@ -92475,6 +92472,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Virology - Containment Lock"; + network = list("ss13","medbay"); dir = 8; name = "virology camera" }, @@ -92987,6 +92985,7 @@ }, /obj/machinery/camera{ c_tag = "Virology - Break Room"; + network = list("ss13","medbay"); dir = 8; name = "virology camera" }, @@ -94693,6 +94692,7 @@ }, /obj/machinery/camera{ c_tag = "Virology - Lab"; + network = list("ss13","medbay"); name = "virology camera" }, /obj/effect/turf_decal/bot, @@ -94712,6 +94712,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Virology - Hallway"; + network = list("ss13","medbay"); dir = 8; name = "virology camera" }, @@ -96415,6 +96416,7 @@ }, /obj/machinery/camera{ c_tag = "Virology - Cells"; + network = list("ss13","medbay"); dir = 8; name = "virology camera" }, @@ -99717,7 +99719,7 @@ "gUH" = ( /obj/machinery/light, /obj/structure/table/reinforced, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/white/side{ dir = 1 }, @@ -100149,6 +100151,12 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/engine, /area/science/mixing) +"oMw" = ( +/obj/docking_port/stationary/public_mining_dock{ + dir = 4 + }, +/turf/open/floor/plating, +/area/construction/mining/aux_base) "oNd" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -143475,7 +143483,7 @@ aeF aeF aeF aeF -aeF +oMw aeF aeF aeF diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 477e06d124..746c46536c 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -903,7 +903,6 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/cryopod, /turf/open/floor/plasteel/floorgrime, /area/security/prison) "acy" = ( @@ -1911,7 +1910,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "aev" = ( -/obj/machinery/computer/security, +/obj/machinery/computer/security/hos, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "aew" = ( @@ -3556,13 +3555,6 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching certain areas."; - dir = 1; - name = "Head of Security's Monitor"; - network = list("prison","minisat","tcomm"); - pixel_y = -30 - }, /turf/open/floor/plasteel/vault, /area/crew_quarters/heads/hos) "ahK" = ( @@ -3641,6 +3633,25 @@ icon_state = "platingdmg1" }, /area/maintenance/fore) +"ahU" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/table, +/obj/item/stock_parts/manipulator, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/fore) +"ahV" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/open/floor/plasteel/neutral/corner{ + dir = 1 + }, +/area/crew_quarters/fitness/recreation) "ahW" = ( /obj/structure/window/reinforced{ dir = 1 @@ -4057,6 +4068,22 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"aiP" = ( +/obj/structure/table, +/obj/item/folder, +/turf/open/floor/plating, +/area/maintenance/fore) +"aiQ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel/neutral/corner{ + dir = 1 + }, +/area/crew_quarters/fitness/recreation) "aiR" = ( /obj/structure/table, /obj/item/clothing/under/sl_suit{ @@ -4460,9 +4487,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel/neutral/corner{ - dir = 8 - }, +/turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ajS" = ( /obj/structure/table, @@ -5107,6 +5132,10 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"alf" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation) "alg" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -5810,6 +5839,10 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"amv" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel/vault, +/area/crew_quarters/fitness/recreation) "amw" = ( /obj/structure/window/reinforced, /obj/machinery/door/window/eastright{ @@ -6003,8 +6036,7 @@ /obj/machinery/door/window/westleft{ base_state = "right"; dir = 2; - icon_state = "right"; - name = "windoor" + icon_state = "right" }, /obj/item/book/manual/wiki/engineering_hacking, /obj/item/tape/random, @@ -7757,7 +7789,9 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aqR" = ( -/obj/machinery/vending/kink, +/obj/structure/chair{ + dir = 8 + }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -7810,10 +7844,7 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aqY" = ( -/obj/machinery/computer/security{ - name = "Labor Camp Monitoring"; - network = list("labor") - }, +/obj/machinery/computer/security/labor, /turf/open/floor/plasteel/dark, /area/security/brig) "aqZ" = ( @@ -8736,12 +8767,8 @@ /area/security/main) "asN" = ( /obj/structure/chair, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching proceedings in the interrogation room."; +/obj/machinery/computer/security/telescreen/interrogation{ dir = 1; - layer = 4; - name = "interrogation monitor"; - network = list("interrogation"); pixel_y = -30 }, /turf/open/floor/plasteel/grimy, @@ -9825,6 +9852,10 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, +/obj/machinery/computer/security/telescreen/interrogation{ + dir = 8; + pixel_x = 30 + }, /turf/open/floor/plasteel/red/side{ dir = 5 }, @@ -10491,7 +10522,7 @@ /area/security/brig) "awz" = ( /obj/machinery/camera{ - c_tag = "Interrogation"; + c_tag = "Interrogation room"; dir = 8; network = list("interrogation") }, @@ -13073,6 +13104,7 @@ "aCg" = ( /obj/machinery/camera/motion{ c_tag = "Vault"; + network = list("vault"); dir = 1 }, /obj/machinery/light, @@ -14169,8 +14201,7 @@ /area/quartermaster/warehouse) "aEv" = ( /obj/machinery/computer/security/mining{ - dir = 4; - network = list("mine","auxbase") + dir = 4 }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) @@ -17444,7 +17475,7 @@ /obj/structure/table, /obj/machinery/camera/motion{ c_tag = "AI Upload Chamber - Fore"; - network = list("ss13","rd","aiupload") + network = list("aiupload") }, /obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 10 @@ -19600,13 +19631,12 @@ /turf/closed/wall, /area/quartermaster/qm) "aQq" = ( -/obj/machinery/computer/security/mining{ - dir = 4; - network = list("mine","auxbase") - }, /obj/machinery/light_switch{ pixel_x = -23 }, +/obj/machinery/computer/cargo{ + dir = 4 + }, /turf/open/floor/plasteel/brown{ dir = 8 }, @@ -19705,7 +19735,7 @@ /obj/machinery/camera/motion{ c_tag = "AI Upload Chamber - Port"; dir = 1; - network = list("ss13","rd","aiupload") + network = list("aiupload") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai_upload) @@ -19728,7 +19758,7 @@ /obj/machinery/camera/motion{ c_tag = "AI Upload Chamber - Starboard"; dir = 1; - network = list("ss13","rd","aiupload") + network = list("aiupload") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai_upload) @@ -20164,7 +20194,9 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/computer/camera_advanced/base_construction, +/obj/machinery/computer/camera_advanced/base_construction{ + dir = 4 + }, /turf/open/floor/plasteel/yellow/side{ dir = 9 }, @@ -20224,7 +20256,7 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "aRK" = ( -/obj/machinery/computer/cargo{ +/obj/machinery/computer/security/qm{ dir = 4 }, /turf/open/floor/plasteel/brown{ @@ -20667,7 +20699,9 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "aSJ" = ( -/obj/machinery/computer/shuttle/mining, +/obj/machinery/computer/shuttle/mining{ + dir = 4 + }, /turf/open/floor/plasteel/yellow/side{ dir = 10 }, @@ -21557,16 +21591,9 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching areas on the MiniSat."; - dir = 8; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); - pixel_x = 29 - }, /obj/machinery/camera/motion{ c_tag = "AI Upload Foyer"; - network = list("ss13","rd","aiupload") + network = list("aiupload") }, /obj/machinery/airalarm{ pixel_y = 26 @@ -21721,7 +21748,7 @@ /turf/open/floor/plasteel/vault, /area/crew_quarters/locker) "aUR" = ( -/obj/machinery/vending/kink, +/obj/structure/closet/wardrobe/green, /turf/open/floor/plasteel/vault, /area/crew_quarters/locker) "aUS" = ( @@ -21889,7 +21916,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Fore"; dir = 2; - network = list("rd") + network = list("aicore") }, /obj/structure/showcase/cyborg/old{ dir = 2; @@ -22137,8 +22164,7 @@ pixel_x = 27 }, /obj/machinery/computer/security/mining{ - dir = 8; - network = list("mine","auxbase") + dir = 8 }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -23373,7 +23399,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Port"; dir = 4; - network = list("rd") + network = list("aicore") }, /obj/structure/showcase/cyborg/old{ dir = 4; @@ -24085,7 +24111,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Core"; dir = 2; - network = list("rd") + network = list("aicore") }, /turf/open/floor/plasteel/vault{ dir = 10 @@ -24989,10 +25015,8 @@ pixel_y = 10 }, /obj/item/radio/off, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/minisat{ dir = 4; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_x = -29 }, /turf/open/floor/plasteel/red/side{ @@ -25050,7 +25074,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Starboard"; dir = 8; - network = list("rd") + network = list("aicore") }, /obj/structure/showcase/cyborg/old{ dir = 8; @@ -25527,7 +25551,7 @@ }, /area/security/checkpoint/engineering) "bcO" = ( -/obj/machinery/vending/kink, +/obj/structure/easel, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -26146,10 +26170,8 @@ /obj/structure/rack, /obj/item/storage/secure/briefcase, /obj/item/clothing/mask/cigarette/cigar, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/ce{ dir = 1; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_y = -30 }, /turf/open/floor/plasteel/vault{ @@ -28071,7 +28093,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Aft"; dir = 1; - network = list("rd") + network = list("aicore") }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark, @@ -29986,15 +30008,12 @@ }, /obj/item/storage/secure/briefcase, /obj/structure/table/wood, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - name = "Prison Monitor"; - network = list("prison"); - pixel_y = 30 - }, /obj/item/folder/blue, /obj/item/storage/secure/briefcase, /obj/item/assembly/flash/handheld, +/obj/machinery/computer/security/telescreen/vault{ + pixel_y = 30 + }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bmq" = ( @@ -32163,10 +32182,8 @@ /obj/structure/rack, /obj/item/aicard, /obj/item/radio/off, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/minisat{ dir = 1; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_y = -29 }, /turf/open/floor/plasteel/darkblue/side{ @@ -32961,10 +32978,8 @@ /obj/machinery/porta_turret/ai{ dir = 2 }, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/minisat{ dir = 8; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_x = 28 }, /turf/open/floor/plasteel/vault{ @@ -32986,10 +33001,8 @@ }, /obj/machinery/light, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/minisat{ dir = 1; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_y = -29 }, /turf/open/floor/plasteel/dark, @@ -33751,10 +33764,8 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/item/pen, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/minisat{ dir = 1; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_y = -28 }, /turf/open/floor/plasteel/darkblue/corner, @@ -35468,7 +35479,7 @@ /obj/machinery/computer/security/telescreen{ dir = 8; name = "Telecomms Camera Monitor"; - network = list("tcomm"); + network = list("tcomms"); pixel_x = 26 }, /obj/machinery/computer/telecomms/monitor{ @@ -36764,10 +36775,8 @@ /area/crew_quarters/heads/captain/private) "bAe" = ( /obj/machinery/light, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/minisat{ dir = 1; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_y = -29 }, /obj/structure/bed/dogbed/renault, @@ -38475,7 +38484,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Fore-Port"; dir = 2; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) @@ -38506,7 +38515,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Fore-Starboard"; dir = 2; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) @@ -40825,7 +40834,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Control Room"; dir = 1; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /obj/structure/table/wood, /obj/item/pen, @@ -41685,9 +41694,7 @@ /turf/open/floor/plating, /area/maintenance/port) "bLe" = ( -/obj/machinery/vending/autodrobe{ - req_access_txt = "0" - }, +/obj/machinery/vending/autodrobe/all_access, /turf/open/floor/plating, /area/maintenance/port) "bLf" = ( @@ -42242,7 +42249,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Aft-Port"; dir = 4; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /turf/open/floor/plasteel/dark/telecomms/mainframe, /area/tcommsat/server) @@ -42280,7 +42287,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Aft-Starboard"; dir = 8; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /obj/structure/cable/yellow{ icon_state = "0-8" @@ -43086,7 +43093,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Aft"; dir = 1; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/ntnet_relay, @@ -46230,12 +46237,11 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bUT" = ( -/obj/structure/rack, -/obj/item/weldingtool, -/obj/item/screwdriver{ - pixel_y = 16 +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/enzyme{ + layer = 5 }, -/obj/effect/spawner/lootdrop/maintenance, +/obj/item/reagent_containers/food/condiment/flour, /turf/open/floor/plating, /area/maintenance/port/aft) "bUU" = ( @@ -46249,20 +46255,16 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bUW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 }, /turf/open/floor/plating, /area/maintenance/port/aft) "bUX" = ( -/obj/structure/rack, -/obj/item/stack/cable_coil{ - pixel_x = -1; - pixel_y = -3 - }, -/obj/item/stack/cable_coil, -/obj/item/wirecutters, -/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/closet/crate/bin, +/obj/item/kitchen/knife, /turf/open/floor/plating, /area/maintenance/port/aft) "bUY" = ( @@ -46719,26 +46721,13 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bVW" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/obj/item/reagent_containers/glass/beaker, /turf/open/floor/plating{ icon_state = "platingdmg1" }, /area/maintenance/port/aft) -"bVX" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bVZ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bWa" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/maintenance/port/aft) "bWb" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -47473,12 +47462,11 @@ }, /area/maintenance/port/aft) "bXA" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bXB" = ( -/obj/structure/chair/stool, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, /turf/open/floor/plating, /area/maintenance/port/aft) "bXC" = ( @@ -47917,25 +47905,11 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"bYG" = ( -/obj/structure/table, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/pen, -/obj/structure/extinguisher_cabinet{ - pixel_y = -30 - }, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/port/aft) "bYH" = ( -/obj/structure/light_construct, +/obj/structure/rack, +/obj/item/stack/rods{ + amount = 4 + }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -49840,7 +49814,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/smartfridge/disks, +/obj/machinery/smartfridge/disks{ + pixel_y = 2 + }, +/obj/structure/table, /turf/open/floor/plasteel, /area/hydroponics) "ccA" = ( @@ -50095,8 +50072,6 @@ /turf/open/space, /area/solar/port/aft) "cdb" = ( -/obj/structure/girder, -/obj/structure/grille, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, @@ -50124,6 +50099,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/girder, +/obj/structure/grille, /turf/open/floor/plating, /area/maintenance/port/aft) "cde" = ( @@ -50664,8 +50641,6 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "ceo" = ( -/obj/structure/girder, -/obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -50702,19 +50677,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/aft) -"ces" = ( -/obj/structure/table, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/pen, -/turf/open/floor/plating, -/area/maintenance/port/aft) "ceu" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -53017,7 +52979,7 @@ /turf/open/floor/plating/airless, /area/engine/atmos) "cjp" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/wood, /area/maintenance/port/aft) "cjq" = ( @@ -57864,13 +57826,8 @@ /turf/open/floor/plating, /area/crew_quarters/heads/hor) "csZ" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of his office."; - name = "Research Monitor"; - network = list("rd"); - pixel_y = 2 - }, /obj/structure/table/reinforced, +/obj/machinery/computer/security/telescreen/rd, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -57998,7 +57955,10 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cto" = ( -/obj/machinery/vending/kink, +/obj/machinery/vending/assist, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/port/aft) "ctq" = ( @@ -62086,7 +62046,6 @@ /turf/open/floor/plating/airless, /area/science/test_area) "cBO" = ( -/obj/item/flashlight/lamp, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -62876,22 +62835,13 @@ /turf/open/floor/plating/airless, /area/science/test_area) "cDy" = ( -/obj/machinery/camera{ - active_power_usage = 0; - c_tag = "Bomb Test Site"; - desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top."; - dir = 8; - invuln = 1; - light = null; - luminosity = 3; - name = "Hardened Bomb-Test Camera"; - network = list("toxins"); - use_power = 0 - }, /obj/item/target/alien/anchored, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/camera/preset/toxins{ + dir = 8 + }, /turf/open/floor/plating/airless{ luminosity = 2 }, @@ -63871,7 +63821,6 @@ /turf/open/floor/plating/airless, /area/science/test_area) "cFw" = ( -/obj/item/flashlight/lamp, /obj/effect/turf_decal/stripes/line{ dir = 2 }, @@ -70677,13 +70626,6 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall/r_wall, /area/science/xenobiology) -"cUd" = ( -/obj/machinery/cryopod{ - dir = 4; - tag = "0" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) "cUH" = ( /obj/structure/table/optable, /turf/open/floor/plasteel/white, @@ -71335,11 +71277,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"dbk" = ( -/obj/item/hand_labeler_refill, -/obj/structure/easel, -/turf/open/floor/plating, -/area/maintenance/port) "dbl" = ( /obj/structure/easel, /turf/open/floor/plating, @@ -71426,10 +71363,13 @@ /turf/open/floor/circuit/killroom, /area/science/xenobiology) "dbE" = ( -/obj/machinery/plantgenes, +/obj/machinery/plantgenes{ + pixel_y = 6 + }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/table, /turf/open/floor/plasteel, /area/hydroponics) "dbF" = ( @@ -73555,15 +73495,19 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "dhp" = ( +/obj/machinery/light{ + dir = 8 + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, -/turf/open/floor/plasteel/neutral/corner{ - dir = 8 +/obj/structure/sign/poster/official/random{ + pixel_x = -32 }, +/turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "dhq" = ( /obj/structure/table/reinforced, @@ -74202,12 +74146,7 @@ /turf/open/floor/plating, /area/maintenance/port) "diy" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/item/poster/random_contraband, +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance, /turf/open/floor/plating, /area/maintenance/port/aft) "diz" = ( @@ -74289,10 +74228,10 @@ /turf/open/floor/wood, /area/maintenance/port/aft) "diF" = ( +/obj/structure/chair/stool, /obj/structure/sign/poster/contraband/random{ pixel_y = 32 }, -/obj/machinery/jukebox, /turf/open/floor/wood, /area/maintenance/port/aft) "diG" = ( @@ -75935,10 +75874,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"dWa" = ( -/obj/machinery/computer/cryopod, -/turf/closed/wall, -/area/security/prison) "dYu" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Airlock" @@ -75972,6 +75907,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/white, /area/science/circuit) "eqG" = ( @@ -76035,16 +75971,25 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) -"gfh" = ( -/obj/machinery/libraryscanner, -/turf/open/floor/plasteel/white, -/area/science/circuit) "gnZ" = ( /obj/item/radio/intercom{ pixel_y = -30 }, /turf/open/floor/plasteel/white, /area/science/circuit) +"gqA" = ( +/obj/machinery/button/door{ + dir = 2; + id = "abandoned_kitchen"; + name = "Shutters Control"; + pixel_x = 26; + pixel_y = 6; + req_one_access_txt = null + }, +/obj/effect/decal/cleanable/blood/old, +/obj/item/clothing/suit/apron/chef, +/turf/open/floor/plating, +/area/maintenance/port/aft) "gra" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -76107,20 +76052,11 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"hdw" = ( -/obj/machinery/cryopod{ - dir = 4; - tag = "0" - }, -/turf/open/floor/plasteel/vault, -/area/crew_quarters/fitness/recreation) -"hfJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/autolathe, -/turf/open/floor/plasteel/white, -/area/science/circuit) +"hvt" = ( +/obj/structure/kitchenspike_frame, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/plating, +/area/maintenance/port/aft) "hyP" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Two" @@ -76130,6 +76066,13 @@ }, /turf/open/floor/plating, /area/security/prison) +"hIt" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "abandoned_kitchen" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "ioI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -76157,6 +76100,10 @@ }, /turf/open/floor/plasteel/whitepurple, /area/science/lab) +"iLj" = ( +/obj/structure/table, +/turf/open/floor/plating, +/area/maintenance/port/aft) "jeV" = ( /obj/machinery/conveyor/inverted{ dir = 10; @@ -76168,15 +76115,11 @@ /turf/closed/wall/mineral/plastitanium, /area/crew_quarters/fitness/recreation) "jyv" = ( -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, -/obj/item/stack/sheet/metal/fifty, /obj/structure/table/reinforced, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of your own office."; - name = "Research Monitor"; - network = list("rd"); - pixel_y = 32 +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/obj/machinery/computer/security/telescreen/circuitry{ + pixel_x = 30 }, /turf/open/floor/plasteel/white, /area/science/circuit) @@ -76325,6 +76268,10 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"lGS" = ( +/obj/docking_port/stationary/public_mining_dock, +/turf/open/floor/plating, +/area/construction/mining/aux_base) "lMz" = ( /obj/structure/falsewall, /turf/open/floor/plating, @@ -76378,18 +76325,13 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) -"mSt" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 +"mWg" = ( +/obj/structure/girder, +/obj/structure/grille, +/turf/open/floor/plating{ + icon_state = "panelscorched" }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/neutral/corner{ - dir = 1 - }, -/area/crew_quarters/fitness/recreation) +/area/maintenance/port/aft) "nnK" = ( /obj/item/stack/sheet/glass/fifty, /obj/item/paper_bin, @@ -76474,19 +76416,15 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/stock_parts/cell/super, /obj/structure/table/reinforced, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of your own office."; - name = "Research Monitor"; - network = list("rd"); - pixel_y = 32 +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/obj/machinery/computer/security/telescreen/circuitry{ + pixel_y = 30 }, -/obj/item/stock_parts/cell/super, -/obj/item/stack/sheet/metal/fifty, /turf/open/floor/plasteel/white, /area/science/circuit) "ohj" = ( @@ -76536,6 +76474,17 @@ /obj/item/pen, /turf/open/floor/plasteel/white, /area/science/circuit) +"oZg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/girder, +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/port/aft) "pmc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -76606,6 +76555,12 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"qhe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port) "qqg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -76650,10 +76605,6 @@ }, /turf/open/floor/wood, /area/library) -"rzf" = ( -/obj/machinery/computer/cryopod, -/turf/closed/wall, -/area/crew_quarters/fitness/recreation) "rzX" = ( /obj/structure/chair/office/light{ dir = 1; @@ -76692,11 +76643,6 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/space/nearstation) -"sog" = ( -/obj/machinery/libraryscanner, -/obj/machinery/bookbinder, -/turf/open/floor/plasteel/white, -/area/science/circuit) "sFv" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76738,11 +76684,6 @@ "sJW" = ( /turf/closed/wall/mineral/plastitanium, /area/engine/break_room) -"tjH" = ( -/obj/structure/table/reinforced, -/obj/machinery/computer/libraryconsole/bookmanagement, -/turf/open/floor/plasteel/white, -/area/science/circuit) "tsx" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76841,7 +76782,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/rnd/production/protolathe/department/science, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, /turf/open/floor/plasteel/white, /area/science/circuit) "uYk" = ( @@ -76898,6 +76841,10 @@ }, /turf/open/floor/plating, /area/security/prison) +"wmt" = ( +/obj/effect/decal/cleanable/flour, +/turf/open/floor/plating, +/area/maintenance/port/aft) "wxc" = ( /obj/machinery/door/airlock/external{ name = "Atmospherics External Airlock"; @@ -76986,6 +76933,13 @@ /obj/structure/chair/comfy, /turf/open/floor/plasteel, /area/science/misc_lab) +"xEf" = ( +/obj/structure/table, +/obj/item/flashlight/lamp{ + on = 0 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "xVl" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -77001,6 +76955,16 @@ /obj/effect/landmark/blobstart, /turf/open/floor/engine/cult, /area/library) +"ydn" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "ygk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -88942,7 +88906,7 @@ obX aDa aDa aDa -aDa +lGS cWM cXR cYG @@ -93604,10 +93568,10 @@ bPJ alK cgH dux -bUU -bVX -bXB -bYG +iLj +dvt +bXE +hvt dux dux dux @@ -93861,8 +93825,8 @@ aqK alK dit dux -bUV -duH +ydn +wmt bXC bYH dux @@ -94119,12 +94083,12 @@ alK bSu dux bUW -bVZ +bXE bXD bYI bZO cbt -cdc +oZg dux dux csT @@ -94376,11 +94340,11 @@ alK bSr dux bUX -bWa -bXE -bYJ +bUU +gqA +xEf dux -dvt +mWg cdd dux cfC @@ -94633,7 +94597,7 @@ bRf bSv dux dux -dux +hIt dux dux dux @@ -94890,7 +94854,7 @@ alK bOf bOv alC -dbk +qhe dux bYK bZP @@ -95410,7 +95374,7 @@ bYM bZP cbx cdh -bXE +bUV dux dwc cia @@ -95924,7 +95888,7 @@ bYN dux cbz bXE -ces +bYJ dux dwe cic @@ -101757,7 +101721,7 @@ aax aax aax aax -dWa +abe abe abe abe @@ -111531,8 +111495,8 @@ acQ afs agr acP -acP -acP +ahU +aiP acP acP acP @@ -111788,12 +111752,12 @@ acP acP ags acP -hdw -cUd -cUd -cUd -cUd -rzf +acP +acP +acP +alf +amv +acP aoS acP arB @@ -112044,9 +112008,9 @@ aaa acQ aft agt -mSt -ahf ahf +ahV +aiQ dhp alg alg @@ -112305,7 +112269,7 @@ ahg ahg ahg ajR -ahl +ahg ahg anG aoU @@ -113671,7 +113635,7 @@ cuZ fFM cud kxk -tjH +cxO cxO cxO dGH @@ -114958,7 +114922,7 @@ mjJ krD eqq llb -hfJ +uTS cxO cxO krD @@ -115217,7 +115181,7 @@ lsv txj eEe cxO -gfh +cxO krD aaa aaa @@ -115474,7 +115438,7 @@ jyv ohj nnK cxO -sog +cxO krD aaa aaa diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 90db86d0f3..2935128d23 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -1683,7 +1683,7 @@ }, /obj/machinery/power/apc{ dir = 4; - name = "Starboard Bow Maintenace APC"; + name = "Starboard Bow Maintenance APC"; areastring = "/area/maintenance/starboard/fore"; pixel_x = 26 }, @@ -2113,7 +2113,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/power/apc{ dir = 8; - name = "Fore Maintenace APC"; + name = "Fore Maintenance APC"; areastring = "/area/maintenance/fore"; pixel_x = -26; pixel_y = 3 @@ -15110,6 +15110,9 @@ codes_txt = "patrol;next_patrol=9.4-EnteringDorms"; location = "9.3-Engi" }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, /turf/open/floor/plasteel/neutral, /area/engine/break_room) "aFF" = ( @@ -15470,6 +15473,7 @@ name = "Engineering Foyer APC"; pixel_y = -26 }, +/obj/structure/cable/white, /turf/open/floor/plasteel/yellow/corner{ dir = 8 }, @@ -16215,7 +16219,7 @@ /area/hydroponics) "aHO" = ( /obj/machinery/door/airlock/maintenance_hatch{ - name = "Hydroponic's Maintenance"; + name = "Hydroponics Maintenance"; req_access_txt = "35" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -17841,6 +17845,7 @@ /obj/item/seeds/wheat, /obj/item/reagent_containers/food/snacks/grown/tomato, /obj/effect/turf_decal/bot, +/obj/item/paper/guides/jobs/hydroponics, /turf/open/floor/plasteel/vault/side{ dir = 1 }, @@ -17858,6 +17863,7 @@ }, /obj/item/seeds/tower, /obj/effect/turf_decal/bot, +/obj/item/book/manual/hydroponics_pod_people, /turf/open/floor/plasteel/vault/side{ dir = 1 }, @@ -25433,7 +25439,6 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "bbQ" = ( -/obj/machinery/jukebox, /turf/open/floor/wood{ icon_state = "wood-broken5" }, @@ -30950,6 +30955,14 @@ }, /turf/open/floor/plating/airless, /area/maintenance/disposal/incinerator) +"coR" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/smartfridge/disks{ + pixel_y = 2 + }, +/obj/structure/table/glass, +/turf/open/floor/plasteel/neutral, +/area/hydroponics) "csX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -32217,13 +32230,6 @@ }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) -"mJQ" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/delivery, -/obj/item/book/manual/hydroponics_pod_people, -/obj/item/paper/guides/jobs/hydroponics, -/turf/open/floor/plasteel/neutral, -/area/hydroponics) "mQi" = ( /turf/closed/wall/rust, /area/maintenance/starboard/central) @@ -35406,8 +35412,11 @@ }, /area/hallway/primary/starboard) "uuj" = ( -/obj/machinery/plantgenes, +/obj/machinery/plantgenes{ + pixel_y = 6 + }, /obj/effect/turf_decal/bot, +/obj/structure/table/glass, /turf/open/floor/plasteel/neutral, /area/hydroponics) "uuJ" = ( @@ -74137,7 +74146,7 @@ bxN sIB cfz ewT -mJQ +aKX lyp bIJ aOj @@ -74394,7 +74403,7 @@ arY aHM aIG aJP -aKX +aKW aMk aNr aHM @@ -74651,7 +74660,7 @@ aGG aHM aIH aJP -aKW +coR aMk aNr aOh diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 9bc3ebe791..e0b5015ca6 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2249,9 +2249,7 @@ c_tag = "Brig Prison Hallway"; network = list("ss13","prison") }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - name = "Prison Monitor"; +/obj/machinery/computer/security/telescreen/prison{ network = list("prison"); pixel_y = 30 }, @@ -4378,7 +4376,7 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/hos) "amz" = ( -/obj/machinery/computer/security{ +/obj/machinery/computer/security/hos{ dir = 8 }, /turf/open/floor/carpet, @@ -5072,10 +5070,7 @@ /turf/open/floor/plating, /area/maintenance/department/security/brig) "aok" = ( -/obj/machinery/computer/security{ - name = "Labor Camp Monitoring"; - network = list("labor") - }, +/obj/machinery/computer/security/labor, /turf/open/floor/plasteel/dark, /area/security/brig) "aol" = ( @@ -5936,6 +5931,10 @@ }, /area/security/brig) "aqA" = ( +/obj/machinery/computer/security/telescreen/interrogation{ + dir = 8; + pixel_x = 30 + }, /turf/open/floor/plasteel/red/side{ dir = 5 }, @@ -6269,7 +6268,8 @@ "arz" = ( /obj/machinery/camera{ c_tag = "Brig Interrogation"; - dir = 8 + dir = 8; + network = list("interrogation") }, /turf/open/floor/plasteel/dark, /area/security/brig) @@ -7310,6 +7310,7 @@ "aud" = ( /obj/machinery/camera/motion{ c_tag = "Vault"; + network = list("vault"); dir = 1 }, /obj/machinery/light, @@ -7813,7 +7814,6 @@ dir = 4; pixel_x = 28 }, -/obj/machinery/cryopod, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "avm" = ( @@ -10281,6 +10281,9 @@ /turf/open/floor/wood, /area/crew_quarters/heads/hop) "aBA" = ( +/obj/machinery/computer/security/telescreen/vault{ + pixel_y = 30 + }, /obj/machinery/computer/security/mining, /turf/open/floor/wood, /area/crew_quarters/heads/hop) @@ -10460,7 +10463,7 @@ /turf/open/floor/plasteel/arrival, /area/crew_quarters/fitness/recreation) "aBV" = ( -/obj/machinery/vending/kink, +/obj/structure/closet/wardrobe/green, /turf/open/floor/plasteel/arrival, /area/crew_quarters/fitness/recreation) "aBW" = ( @@ -10692,7 +10695,8 @@ pixel_y = 32 }, /obj/machinery/disposal/deliveryChute{ - name = "Crate Disposal Chute" + name = "Crate Disposal Chute"; + pixel_y = 6 }, /obj/structure/window/reinforced{ dir = 4 @@ -10784,7 +10788,8 @@ /obj/item/aiModule/supplied/quarantine, /obj/machinery/camera/motion{ c_tag = "AI Upload Port"; - dir = 4 + dir = 4; + network = list("aiupload") }, /obj/item/aiModule/reset, /obj/machinery/flasher{ @@ -10831,7 +10836,8 @@ /obj/item/aiModule/supplied/freeform, /obj/machinery/camera/motion{ c_tag = "AI Upload Starboard"; - dir = 8 + dir = 8; + network = list("aiupload") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -11050,7 +11056,6 @@ /turf/open/floor/plasteel/white/side, /area/crew_quarters/dorms) "aDk" = ( -/obj/machinery/cryopod, /turf/open/floor/plasteel/white/corner{ icon_state = "whitecorner"; dir = 8 @@ -11263,7 +11268,8 @@ /obj/machinery/holopad, /obj/machinery/camera/motion{ c_tag = "AI Upload Center"; - dir = 1 + dir = 1; + network = list("aiupload") }, /obj/item/radio/intercom{ broadcasting = 1; @@ -12348,10 +12354,7 @@ /turf/open/floor/plasteel/neutral/side, /area/storage/primary) "aGk" = ( -/obj/machinery/vending/boozeomat{ - products = list(/obj/item/reagent_containers/food/drinks/bottle/rum = 1, /obj/item/reagent_containers/food/drinks/bottle/wine = 1, /obj/item/reagent_containers/food/drinks/ale = 1, /obj/item/reagent_containers/food/drinks/drinkingglass = 6, /obj/item/reagent_containers/food/drinks/ice = 1, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 4); - req_access_txt = "20" - }, +/obj/machinery/vending/boozeomat/pubby_captain, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -16566,6 +16569,10 @@ /obj/machinery/light{ dir = 4 }, +/obj/machinery/computer/security/telescreen/auxbase{ + dir = 8; + pixel_x = 30 + }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) "aRH" = ( @@ -19097,7 +19104,10 @@ }, /area/hydroponics) "aXW" = ( -/obj/machinery/plantgenes, +/obj/machinery/plantgenes{ + pixel_y = 6 + }, +/obj/structure/table, /turf/open/floor/plasteel/green/corner{ dir = 4 }, @@ -21322,14 +21332,14 @@ /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bdM" = ( -/obj/machinery/computer/security/mining{ - dir = 8 - }, /obj/machinery/requests_console{ department = "Mining"; departmentType = 0; pixel_x = 32 }, +/obj/machinery/computer/security/mining{ + dir = 8 + }, /turf/open/floor/plasteel/brown/corner, /area/quartermaster/miningdock) "bdQ" = ( @@ -22051,13 +22061,13 @@ }, /area/quartermaster/qm) "bfD" = ( -/obj/machinery/computer/security/mining{ - dir = 8 - }, /obj/item/radio/intercom{ name = "Station Intercom (General)"; pixel_y = -35 }, +/obj/machinery/computer/security/qm{ + dir = 8 + }, /turf/open/floor/plasteel/brown{ dir = 6 }, @@ -23841,6 +23851,7 @@ }, /obj/machinery/camera{ c_tag = "Genetics Cloning Foyer"; + network = list("ss13","medbay"); dir = 2 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, @@ -24227,12 +24238,8 @@ dir = 1 }, /obj/item/integrated_electronics/debugger, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the other eggheads from the comfort of the circuitry lab."; - dir = 2; - name = "RnD Monitor"; - network = list("rd"); - pixel_y = 32 +/obj/machinery/computer/security/telescreen/circuitry{ + pixel_y = 30 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -24240,13 +24247,9 @@ /area/science/explab) "blV" = ( /obj/structure/table/reinforced, -/obj/item/stack/sheet/metal/fifty{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/stack/sheet/metal/fifty, /obj/item/clothing/glasses/science, /obj/item/clothing/glasses/science, +/obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -24257,12 +24260,8 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the other eggheads from the comfort of the circuitry lab."; - dir = 2; - name = "RnD Monitor"; - network = list("rd"); - pixel_y = 32 +/obj/machinery/computer/security/telescreen/circuitry{ + pixel_y = 30 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -24409,6 +24408,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Security Post"; + network = list("ss13","medbay"); dir = 4 }, /obj/structure/closet/secure_closet/security/med, @@ -24650,10 +24650,10 @@ /obj/machinery/cell_charger{ pixel_y = 5 }, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -24992,7 +24992,9 @@ /turf/open/floor/engine, /area/science/explab) "bnZ" = ( -/obj/machinery/rnd/production/techfab/department/science, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -25236,6 +25238,7 @@ /obj/structure/bed/roller, /obj/machinery/camera{ c_tag = "Medbay Entrance"; + network = list("ss13","medbay"); dir = 1 }, /turf/open/floor/plasteel/whiteblue/side, @@ -26126,7 +26129,7 @@ /obj/machinery/camera{ c_tag = "Genetics Monkey Pen Fore"; dir = 4; - network = list("ss13","rd") + network = list("ss13","medbay") }, /obj/machinery/light/small{ dir = 8 @@ -26738,6 +26741,7 @@ /obj/machinery/dna_scannernew, /obj/machinery/camera{ c_tag = "Genetics Cloning"; + network = list("ss13","medbay"); dir = 4 }, /obj/machinery/airalarm/unlocked{ @@ -27475,6 +27479,7 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, +/obj/machinery/disposal/bin, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bum" = ( @@ -27762,6 +27767,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Medbay Port Hallway"; + network = list("ss13","medbay"); dir = 4 }, /obj/machinery/airalarm{ @@ -28451,7 +28457,6 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "bwV" = ( -/obj/machinery/disposal/bin, /turf/open/floor/plasteel/whiteyellow/corner, /area/medical/chemistry) "bwW" = ( @@ -29672,7 +29677,7 @@ /obj/machinery/camera{ c_tag = "Genetics Monkey Pen Aft"; dir = 4; - network = list("ss13","rd") + network = list("ss13","medbay") }, /obj/structure/flora/ausbushes/grassybush, /obj/machinery/light/small{ @@ -30323,20 +30328,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching surgery."; - dir = 8; - layer = 4; - name = "Surgery Telescreen"; - network = list("surgery"); - pixel_x = 30 - }, /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/cable{ icon_state = "2-8" }, +/obj/machinery/computer/security/telescreen/cmo{ + dir = 8; + pixel_x = 30 + }, /turf/open/floor/plasteel/cmo, /area/crew_quarters/heads/cmo) "bBl" = ( @@ -30694,7 +30695,7 @@ /obj/machinery/camera{ c_tag = "Genetics"; dir = 1; - network = list("ss13","rd") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whitepurple/side, /area/medical/genetics) @@ -30750,6 +30751,7 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Virology Airlock"; + network = list("ss13","medbay"); dir = 2 }, /obj/effect/turf_decal/stripes/line{ @@ -31882,7 +31884,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/landmark/blobstart, /obj/item/melee/baton/cattleprod{ - cell = new /obj/item/stock_parts/cell/high() + preload_cell_type = /obj/item/stock_parts/cell/high }, /turf/open/floor/plasteel/dark, /area/medical/exam_room) @@ -32010,13 +32012,11 @@ pixel_x = 4; pixel_y = 6 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; - name = "Research Monitor"; - network = list("rd","minisat"); - pixel_y = -32 - }, /obj/structure/table/glass, +/obj/machinery/computer/security/telescreen/rd{ + dir = 1; + pixel_y = -26 + }, /turf/open/floor/plasteel/darkpurple/side, /area/crew_quarters/heads/hor) "bEV" = ( @@ -33218,6 +33218,7 @@ "bHY" = ( /obj/machinery/camera{ c_tag = "Virology"; + network = list("ss13","medbay"); dir = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -33276,6 +33277,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Medbay Equipment Room"; + network = list("ss13","medbay"); dir = 1 }, /turf/open/floor/plasteel/whiteblue/side, @@ -33342,6 +33344,7 @@ "bIm" = ( /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; + network = list("ss13","medbay"); dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -34800,7 +34803,7 @@ "bLX" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/atmos/glass{ +/obj/machinery/door/airlock/atmos{ name = "Atmospherics"; req_access_txt = "24" }, @@ -38261,6 +38264,9 @@ c_tag = "Chief Engineer's Office"; dir = 2 }, +/obj/machinery/computer/security/telescreen/ce{ + pixel_y = 30 + }, /turf/open/floor/plasteel/yellow/side{ dir = 1 }, @@ -38961,46 +38967,21 @@ /area/crew_quarters/heads/chief) "bWs" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/robotics{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/circuitboard/computer/mecha_control{ - pixel_x = 1; - pixel_y = -1 - }, +/obj/effect/spawner/lootdrop/techstorage/RnD_secure, /turf/open/floor/plasteel/darkred, /area/storage/tech) "bWt" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/crew{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/circuitboard/computer/card{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/circuitboard/computer/communications{ - pixel_x = 5; - pixel_y = -5 - }, /obj/machinery/camera{ c_tag = "Secure Tech Storage"; dir = 1 }, +/obj/effect/spawner/lootdrop/techstorage/command, /turf/open/floor/plasteel/darkred, /area/storage/tech) "bWu" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/borgupload{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/circuitboard/computer/aiupload{ - pixel_x = 2; - pixel_y = -2 - }, +/obj/effect/spawner/lootdrop/techstorage/AI, /turf/open/floor/plasteel/darkred, /area/storage/tech) "bWv" = ( @@ -41269,9 +41250,7 @@ /obj/item/stack/sheet/mineral/plasma{ amount = 30 }, -/obj/item/gps{ - gpstag = "ENG0" - }, +/obj/item/gps/engineering, /turf/open/floor/plating, /area/engine/engineering) "ccS" = ( @@ -41897,7 +41876,7 @@ dir = 2; layer = 4; name = "Telecomms Telescreen"; - network = list("tcomm"); + network = list("tcomms"); pixel_y = 28 }, /obj/structure/disposalpipe/segment{ @@ -43111,16 +43090,7 @@ /turf/open/floor/carpet, /area/library/lounge) "cjV" = ( -/obj/machinery/camera{ - active_power_usage = 0; - c_tag = "Bomb Testing Asteroid Fore"; - desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top."; - invuln = 1; - luminosity = 3; - name = "Hardened Bomb-Test Camera"; - network = list("ss13","rd","toxins"); - use_power = 0 - }, +/obj/machinery/camera/preset/toxins, /turf/open/floor/plating/asteroid/airless, /area/asteroid/nearstation/bomb_site) "cjZ" = ( @@ -43872,7 +43842,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Port"; dir = 8; - network = list("tcomm") + network = list("tcomms") }, /turf/open/space, /area/space/nearstation) @@ -43934,7 +43904,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Starboard"; dir = 4; - network = list("tcomm") + network = list("tcomms") }, /turf/open/space, /area/space/nearstation) @@ -44062,16 +44032,9 @@ /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) "cnp" = ( -/obj/machinery/camera{ - active_power_usage = 0; +/obj/machinery/camera/preset/toxins{ c_tag = "Bomb Testing Asteroid Aft"; - desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top."; - dir = 1; - invuln = 1; - luminosity = 3; - name = "Hardened Bomb-Test Camera"; - network = list("ss13","rd","toxins"); - use_power = 0 + dir = 1 }, /turf/open/floor/plating/asteroid/airless, /area/asteroid/nearstation/bomb_site) @@ -44110,7 +44073,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms Server Room"; dir = 1; - network = list("ss13","tcomm") + network = list("tcomms") }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) @@ -44141,7 +44104,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Port Aft"; dir = 2; - network = list("tcomm") + network = list("tcomms") }, /turf/open/space, /area/space/nearstation) @@ -44150,7 +44113,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Starboard Aft"; dir = 2; - network = list("tcomm") + network = list("tcomms") }, /turf/open/space, /area/space/nearstation) @@ -46893,7 +46856,7 @@ /area/library) "cAu" = ( /obj/structure/table/wood, -/obj/item/clothing/head/pharoah, +/obj/item/clothing/head/pharaoh, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/vault{ dir = 5 @@ -46995,7 +46958,7 @@ /turf/open/floor/plasteel/dark, /area/library) "cBk" = ( -/obj/machinery/vending/boozeomat/maint, +/obj/machinery/vending/boozeomat/pubby_maint, /turf/closed/wall, /area/maintenance/department/crew_quarters/dorms) "cBl" = ( @@ -47308,7 +47271,7 @@ }, /area/science/xenobiology) "cPO" = ( -/obj/machinery/jukebox, +/obj/item/chair/stool, /turf/open/floor/wood{ icon_state = "wood-broken7" }, @@ -48948,12 +48911,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) -"hOd" = ( -/obj/machinery/autolathe, -/turf/open/floor/plasteel/vault{ - dir = 5 - }, -/area/science/explab) "hOx" = ( /obj/structure/cable{ icon_state = "2-4" @@ -49159,6 +49116,9 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"iqc" = ( +/turf/open/floor/plasteel/stairs/right, +/area/maintenance/department/crew_quarters/dorms) "itl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -49226,7 +49186,7 @@ /obj/machinery/camera{ c_tag = "Telecomms External Fore"; dir = 1; - network = list("SS13","tcomm"); + network = list("tcomms"); start_active = 1 }, /obj/structure/cable/yellow{ @@ -49443,10 +49403,6 @@ }, /turf/closed/wall/r_wall, /area/engine/engineering) -"jqN" = ( -/obj/effect/spawner/lootdrop/keg, -/turf/open/floor/wood, -/area/maintenance/department/crew_quarters/dorms) "jrG" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -49815,10 +49771,6 @@ }, /turf/open/floor/plating/airless, /area/engine/engineering) -"koO" = ( -/obj/effect/spawner/lootdrop/keg, -/turf/open/floor/plating, -/area/maintenance/department/crew_quarters/dorms) "kpK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -49924,7 +49876,10 @@ }, /area/hallway/primary/central) "kEW" = ( -/obj/machinery/smartfridge/disks, +/obj/machinery/smartfridge/disks{ + pixel_y = 2 + }, +/obj/structure/table, /turf/open/floor/plasteel, /area/hydroponics) "kFm" = ( @@ -50953,7 +50908,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms Monitoring"; dir = 2; - network = list("ss13","tcomm") + network = list("tcomms") }, /obj/structure/cable{ icon_state = "2-8" @@ -52249,7 +52204,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Access"; dir = 1; - network = list("ss13","tcomm") + network = list("tcomms") }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -52338,11 +52293,6 @@ "rHA" = ( /turf/open/floor/plasteel, /area/construction/mining/aux_base) -"rHP" = ( -/obj/structure/lattice, -/obj/structure/reagent_dispensers/keg/aphro/strong, -/turf/open/space, -/area/space/nearstation) "rJg" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/machinery/light/small{ @@ -52467,7 +52417,7 @@ /turf/open/floor/plating, /area/engine/engineering) "sbk" = ( -/obj/machinery/vending/kink, +/obj/structure/girder, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) "sbY" = ( @@ -52962,6 +52912,10 @@ /obj/item/pen, /turf/open/floor/plasteel/dark, /area/science/explab) +"tCP" = ( +/obj/docking_port/stationary/public_mining_dock, +/turf/open/floor/plating, +/area/construction/mining/aux_base) "tDn" = ( /obj/item/wrench, /turf/open/floor/plating, @@ -54432,10 +54386,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"yap" = ( -/obj/machinery/computer/cryopod, -/turf/closed/wall, -/area/crew_quarters/dorms) "ybX" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance, @@ -54473,7 +54423,7 @@ /obj/machinery/camera{ c_tag = "Engineering Telecomms Access"; dir = 8; - network = list("tcomm") + network = list("tcomms") }, /obj/machinery/light{ dir = 4 @@ -76948,7 +76898,7 @@ uoS rJZ uoS uoS -uoS +tCP xOC jAy rHA @@ -88701,7 +88651,7 @@ aaa aaa aaa aby -rHP +abI abO abX acg @@ -91046,7 +90996,7 @@ aaa aaa aiS qPB -gNv +iqc ngp cBr cBs @@ -91564,7 +91514,7 @@ cBo alQ alb cBw -jqN +alb aiS aiS aiS @@ -92596,7 +92546,7 @@ aiS aiS aob eaw -koO +ajv ajv cnX aiS @@ -94661,7 +94611,7 @@ aaa aaa apX apX -yap +apX avl fIu dbi @@ -96248,7 +96198,7 @@ bjx bjw qDJ vmG -hOd +bnZ pDP nBL bqs diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 560f7fd825..89a836f2df 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -20,6 +20,9 @@ "af" = ( /turf/open/floor/plating, /area/maintenance/department/bridge) +"ag" = ( +/turf/closed/wall/r_wall, +/area/security/brig) "ah" = ( /turf/closed/wall/r_wall, /area/engine/atmos) @@ -123,6 +126,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/engine/gravity_generator) "au" = ( @@ -185,6 +189,9 @@ /obj/machinery/door/airlock/external/glass, /turf/open/floor/plating, /area/engine/engineering) +"aD" = ( +/turf/open/floor/plasteel, +/area/security/brig) "aE" = ( /obj/structure/cable{ icon_state = "1-2" @@ -304,13 +311,14 @@ /obj/structure/cable{ icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engine/engineering) "aU" = ( /obj/machinery/door/airlock/engineering/glass{ - name = "Gravity Generator"; - req_access_txt = "11" + name = "Gravity Generator" }, /obj/structure/cable{ icon_state = "4-8" @@ -318,6 +326,9 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "aV" = ( @@ -327,6 +338,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "aW" = ( @@ -340,8 +354,7 @@ /area/engine/gravity_generator) "aX" = ( /obj/machinery/door/airlock/engineering/glass{ - name = "Gravity Generator"; - req_access_txt = "11" + name = "Gravity Generator" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -386,6 +399,7 @@ /obj/structure/table, /obj/item/weldingtool/experimental, /obj/item/inducer, +/obj/item/storage/belt/utility/chief/full, /turf/open/floor/plasteel, /area/engine/engineering) "be" = ( @@ -403,6 +417,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/announcement_system, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bh" = ( @@ -429,7 +444,7 @@ /obj/structure/table, /obj/item/analyzer, /obj/item/wrench, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/atmos) "bk" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -473,6 +488,9 @@ dir = 10 }, /obj/machinery/light, +/obj/machinery/telecomms/allinone{ + network = "tcommsat" + }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "br" = ( @@ -500,6 +518,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/bridge) +"bw" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/brig) "bx" = ( /obj/machinery/door/airlock, /obj/structure/cable{ @@ -511,12 +533,6 @@ "by" = ( /turf/closed/wall/r_wall, /area/medical/medbay) -"bz" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/department/bridge) "bA" = ( /turf/closed/wall/r_wall, /area/science) @@ -535,10 +551,13 @@ /obj/machinery/autolathe/hacked, /turf/open/floor/plasteel, /area/science) -"bD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +"bC" = ( +/obj/machinery/computer/gulag_teleporter_computer{ + dir = 4 }, +/turf/open/floor/plasteel, +/area/security/brig) +"bD" = ( /obj/machinery/light{ dir = 1 }, @@ -568,13 +587,27 @@ dir = 8 }, /area/bridge) +"bH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/security/brig) "bI" = ( /obj/structure/table, +/obj/item/card/emag, +/obj/item/flashlight/emp/debug, /turf/open/floor/plasteel, /area/bridge) "bJ" = ( /obj/structure/table, -/obj/item/card/id/captains_spare, +/obj/item/card/id/ert{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/card/id/syndicate/nuke_leader, +/obj/item/card/id/captains_spare{ + pixel_x = -4; + pixel_y = 4 + }, /turf/open/floor/plasteel, /area/bridge) "bK" = ( @@ -587,7 +620,7 @@ /obj/item/rcd_ammo/large, /obj/item/rcd_ammo/large, /obj/item/rcd_ammo/large, -/obj/item/construction/rcd, +/obj/item/construction/rcd/combat, /turf/open/floor/plasteel, /area/bridge) "bM" = ( @@ -632,6 +665,13 @@ /obj/machinery/chem_dispenser/fullupgrade, /turf/open/floor/plasteel/dark, /area/medical/chemistry) +"bT" = ( +/obj/machinery/gulag_item_reclaimer{ + dir = 8; + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/security/brig) "bU" = ( /obj/machinery/airalarm/unlocked{ pixel_y = 23 @@ -665,7 +705,7 @@ }, /area/medical/medbay) "bX" = ( -/obj/machinery/sleeper, +/obj/machinery/sleeper/syndie, /turf/open/floor/plasteel/arrival{ dir = 1 }, @@ -733,15 +773,21 @@ }, /area/bridge) "ch" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"ci" = ( /obj/structure/cable{ icon_state = "2-4" }, -/obj/machinery/door/airlock, -/turf/open/floor/plating, -/area/bridge) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/security/brig) "cj" = ( /obj/structure/cable{ icon_state = "4-8" @@ -801,11 +847,12 @@ }, /area/bridge) "cs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/turf/closed/wall/r_wall, -/area/bridge) +/turf/open/floor/plasteel, +/area/medical/chemistry) "ct" = ( /obj/machinery/light{ dir = 8 @@ -836,6 +883,7 @@ /turf/open/floor/plasteel, /area/medical/medbay) "cz" = ( +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/medical/medbay) "cA" = ( @@ -856,8 +904,8 @@ }, /area/hallway/primary/central) "cC" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/machinery/camera/autoname, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /turf/open/floor/plasteel/blue/side{ dir = 1 }, @@ -871,9 +919,6 @@ }, /area/hallway/primary/central) "cE" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -900,9 +945,19 @@ dir = 8 }, /area/medical/medbay) +"cI" = ( +/obj/machinery/power/apc{ + dir = 4; + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) "cJ" = ( /obj/item/gun/magic/staff/healing, -/obj/item/gun/magic/wand/resurrection, +/obj/item/gun/magic/wand/resurrection/debug, /turf/open/floor/plasteel/arrival{ dir = 10 }, @@ -944,15 +999,20 @@ /turf/closed/wall/r_wall, /area/storage/primary) "cT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/turf/closed/wall/r_wall, -/area/storage/primary) +/turf/open/floor/plasteel, +/area/medical/chemistry) "cU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, -/area/storage/primary) +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "cV" = ( /obj/machinery/door/airlock/public/glass, /turf/open/floor/plasteel, @@ -987,6 +1047,25 @@ /turf/open/floor/plasteel, /area/construction) "da" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/storage/primary) +"db" = ( +/turf/closed/wall/mineral/plastitanium, +/area/hallway/secondary/entry) +"dc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dd" = ( /obj/machinery/airalarm/unlocked{ pixel_y = 23 }, @@ -994,68 +1073,53 @@ dir = 8; pixel_x = -24 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/storage/primary) -"dc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/storage/primary) -"dd" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L1" +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "0-4" }, /turf/open/floor/plasteel, /area/storage/primary) "de" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/plaque{ - icon_state = "L3" - }, +/obj/machinery/gulag_teleporter, /turf/open/floor/plasteel, -/area/storage/primary) +/area/security/brig) "df" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L5" +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, -/area/storage/primary) +/area/security/brig) "dg" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L7" +/obj/machinery/airalarm/unlocked{ + pixel_x = 32 }, /turf/open/floor/plasteel, -/area/storage/primary) +/area/security/brig) "dh" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L9" - }, -/turf/open/floor/plasteel, -/area/storage/primary) +/turf/closed/wall, +/area/hallway/secondary/entry) "di" = ( -/obj/machinery/light{ - dir = 1 +/obj/machinery/door/airlock/external{ + name = "Labor Camp Shuttle Airlock" }, -/obj/machinery/camera/autoname, -/obj/effect/turf_decal/plaque{ - icon_state = "L11" - }, -/turf/open/floor/plasteel, -/area/storage/primary) +/obj/structure/fans/tiny, +/turf/open/floor/plasteel/dark, +/area/security/brig) "dj" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L13" +/obj/machinery/light/small{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/storage/primary) +/turf/open/floor/plating, +/area/hallway/secondary/entry) "dk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/storage/primary) "dl" = ( @@ -1149,8 +1213,11 @@ /turf/open/floor/plasteel, /area/construction) "dA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel, /area/storage/primary) @@ -1160,14 +1227,12 @@ /area/storage/primary) "dC" = ( /obj/effect/turf_decal/stripes/line{ - dir = 6 + dir = 8 }, /turf/open/floor/plasteel, /area/storage/primary) "dD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, +/obj/effect/landmark/observer_start, /turf/open/floor/plasteel, /area/storage/primary) "dE" = ( @@ -1177,8 +1242,8 @@ /turf/open/floor/plasteel, /area/storage/primary) "dF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, /turf/open/floor/plasteel, /area/storage/primary) @@ -1187,11 +1252,11 @@ /turf/open/floor/plasteel, /area/storage/primary) "dH" = ( -/obj/effect/landmark/start, -/turf/open/floor/plasteel, -/area/storage/primary) +/obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/maintenance/department/bridge) "dI" = ( -/obj/effect/landmark/latejoin, +/obj/effect/landmark/start, /turf/open/floor/plasteel, /area/storage/primary) "dJ" = ( @@ -1225,11 +1290,23 @@ /obj/item/storage/firstaid, /turf/open/floor/plasteel, /area/storage/primary) +"dP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "dQ" = ( /obj/structure/table, /obj/machinery/light, /turf/open/floor/plasteel, /area/storage/primary) +"dR" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) "dS" = ( /obj/machinery/atmospherics/components/unary/tank/air, /obj/machinery/camera/autoname, @@ -1248,6 +1325,9 @@ dir = 1 }, /area/hallway/primary/central) +"dV" = ( +/turf/open/floor/plating, +/area/hallway/secondary/entry) "dW" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/camera/autoname, @@ -1260,14 +1340,14 @@ /obj/machinery/camera/autoname{ dir = 4 }, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel, /area/construction) "dY" = ( -/obj/machinery/camera/autoname{ - dir = 8 - }, -/turf/open/floor/plating, -/area/storage/primary) +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) "dZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -1282,31 +1362,1126 @@ /obj/machinery/camera/autoname{ dir = 1 }, -/obj/item/gun/magic/wand/resurrection, +/obj/item/gun/magic/wand/resurrection/debug, /turf/open/floor/plasteel, /area/storage/primary) +"eb" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 2; + height = 5; + id = "laborcamp_home"; + name = "fore bay 1"; + width = 9; + roundstart_template = /datum/map_template/shuttle/labour/box + }, +/turf/open/space/basic, +/area/space) +"ec" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 3; + height = 15; + id = "arrivals_stationary"; + name = "arrivals"; + width = 7; + roundstart_template = /datum/map_template/shuttle/arrival/box + }, +/turf/open/space/basic, +/area/space) +"ed" = ( +/obj/structure/sign/warning/pods, +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"ee" = ( +/obj/machinery/door/airlock/external{ + name = "Mining Dock Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/quartermaster/miningoffice) +"ef" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plasteel, +/area/construction) +"eg" = ( +/obj/machinery/door/airlock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"eh" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "ei" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"ej" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"ek" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"el" = ( +/obj/docking_port/stationary/random{ + id = "pod_lavaland1"; + name = "lavaland" + }, +/turf/open/space, +/area/space) +"em" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/miningoffice) +"en" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"eo" = ( +/obj/machinery/door/airlock/external{ + name = "Arrival Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"ep" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"eq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"er" = ( +/obj/structure/table/optable, +/turf/open/floor/plasteel, +/area/medical/medbay) +"es" = ( /obj/machinery/light, /obj/machinery/computer/operating, /turf/open/floor/plasteel, -/area/maintenance/department/bridge) -"fT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/area/medical/medbay) +"et" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/storage) +"eu" = ( /turf/open/floor/plasteel, -/area/science) -"gd" = ( +/area/quartermaster/storage) +"ev" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ew" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum, /turf/open/floor/plating, -/area/science) -"gM" = ( -/obj/effect/turf_decal/stripes/line{ +/area/quartermaster/storage) +"ex" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Pod One" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"ey" = ( +/obj/machinery/status_display{ + name = "cargo display"; + supply_display = 1 + }, +/turf/closed/wall, +/area/quartermaster/storage) +"ez" = ( +/obj/machinery/camera/autoname{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, /area/storage/primary) +"eA" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "cargounload" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eB" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"eC" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "cargounload" + }, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/quartermaster/storage) +"eD" = ( +/obj/machinery/vr_sleeper, +/turf/open/floor/plasteel, +/area/storage/primary) +"eE" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 2; + height = 13; + id = "ferry_home"; + name = "port bay 2"; + width = 5 + }, +/turf/open/space/basic, +/area/space) +"eF" = ( +/obj/machinery/power/apc{ + dir = 4; + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"eG" = ( +/obj/machinery/airalarm/unlocked{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"eI" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"eJ" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 4; + height = 7; + id = "supply_home"; + name = "Cargo Bay"; + width = 12 + }, +/turf/open/space/basic, +/area/space) +"eK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"eL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"eM" = ( +/obj/machinery/airalarm/unlocked{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"eN" = ( +/obj/machinery/conveyor{ + dir = 9; + id = "cargounload" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eP" = ( +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eQ" = ( +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "cargounload" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eR" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eS" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eT" = ( +/obj/machinery/conveyor{ + dir = 5; + id = "cargoload" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eU" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/medical/medbay) +"eV" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"eW" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"eX" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/miningoffice) +"eY" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "cargounload" + }, +/obj/machinery/door/poddoor{ + id = "cargounload"; + name = "supply dock unloading door" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"eZ" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fb" = ( +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fc" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "cargoload" + }, +/obj/machinery/door/poddoor{ + id = "cargoload"; + name = "supply dock loading door" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"fd" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"fe" = ( +/obj/machinery/button/door{ + dir = 2; + id = "cargounload"; + layer = 4; + name = "Loading Doors"; + pixel_x = 24; + pixel_y = 8 + }, +/obj/machinery/button/door{ + id = "cargoload"; + layer = 4; + name = "Loading Doors"; + pixel_x = 24; + pixel_y = -8 + }, +/obj/machinery/computer/cargo{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ff" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 11; + height = 15; + id = "whiteship_home"; + name = "SS13: Auxiliary Dock, Station-Port"; + width = 28 + }, +/turf/open/space/basic, +/area/space) +"fg" = ( +/turf/open/space, +/area/space) +"fh" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/storage) +"fi" = ( +/obj/docking_port/stationary{ + dir = 1; + dwidth = 1; + height = 4; + roundstart_template = /datum/map_template/shuttle/escape_pod/default; + width = 3 + }, +/obj/structure/fans/tiny/invisible, +/turf/open/space/basic, +/area/space) +"fj" = ( +/obj/structure/sign/warning/docking, +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"fl" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "cargoload" + }, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/quartermaster/storage) +"fm" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "cargoload" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"fo" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "cargoload" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fp" = ( +/obj/docking_port/stationary{ + dheight = 0; + dir = 2; + dwidth = 9; + height = 25; + id = "emergency_home"; + name = "Runtimestation emergency evac bay"; + width = 29 + }, +/turf/open/space/basic, +/area/space) +"fq" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/computer/cargo/express{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fr" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/computer/bounty{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fs" = ( +/obj/machinery/door/airlock/external{ + name = "Transport Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"ft" = ( +/obj/machinery/door/airlock, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"fu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fv" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/storage/primary) +"fx" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L1" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"fy" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L3" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"fz" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L5" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"fA" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L7" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"fB" = ( +/obj/machinery/status_display{ + name = "cargo display"; + supply_display = 1 + }, +/turf/closed/wall/r_wall, +/area/quartermaster/storage) +"fC" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L9" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"fD" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/obj/effect/turf_decal/plaque{ + icon_state = "L11" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"fE" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L13" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"fF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"fH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"fI" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"fJ" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"fK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"fL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"fM" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_x = 32 + }, +/obj/structure/sign/directions/engineering{ + dir = 1; + pixel_x = 32; + pixel_y = 7 + }, +/obj/structure/sign/directions/evac{ + pixel_x = 32; + pixel_y = -7 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"fN" = ( +/obj/machinery/door/airlock, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/storage/primary) +"fO" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fP" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/keycard_auth{ + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fQ" = ( +/obj/machinery/computer/communications, +/obj/machinery/status_display{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fR" = ( +/obj/machinery/door/airlock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/storage/primary) +"fS" = ( +/obj/machinery/power/apc{ + dir = 1; + pixel_y = 25 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/science) +"fU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/airalarm/unlocked{ + pixel_y = 23 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fW" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fX" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_x = -32 + }, +/obj/structure/sign/directions/engineering{ + dir = 1; + pixel_x = -32; + pixel_y = 7 + }, +/obj/structure/sign/directions/evac{ + pixel_x = -32; + pixel_y = -7 + }, +/turf/open/floor/plating, +/area/storage/primary) +"fY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"ga" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/exit/departure_lounge) +"gb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"gc" = ( +/obj/machinery/door/airlock/external{ + name = "Auxiliary Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"gd" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science) +"ge" = ( +/obj/structure/lattice, +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"gf" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"gg" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_x = 32 + }, +/obj/structure/sign/directions/engineering{ + dir = 1; + pixel_x = 32; + pixel_y = 7 + }, +/obj/structure/sign/directions/evac{ + pixel_x = 32; + pixel_y = -7 + }, +/turf/open/floor/plating, +/area/storage/primary) +"gh" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/computer/shuttle/mining{ + dir = 2 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"gi" = ( +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/power/apc{ + dir = 1; + pixel_y = 25 + }, +/obj/machinery/airalarm/unlocked{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"gj" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 3; + height = 5; + id = "mining_home"; + name = "mining shuttle bay"; + width = 7; + roundstart_template = /datum/map_template/shuttle/mining/box + }, +/turf/open/space/basic, +/area/space) +"gk" = ( +/obj/structure/sign/departments/evac, +/turf/closed/wall/r_wall, +/area/hallway/secondary/exit/departure_lounge) +"gl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"gm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"gn" = ( +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/security/brig) +"go" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"gp" = ( +/obj/machinery/door/airlock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"gq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gr" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gv" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction) +"gz" = ( +/obj/structure/table, +/obj/item/card/id/captains_spare, +/obj/machinery/keycard_auth{ + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"gA" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"gB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gD" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"gE" = ( +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gF" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/construction) +"gH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"gI" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gJ" = ( +/obj/structure/table, +/obj/item/storage/box/prisoner, +/obj/item/paper/guides/jobs/security/labor_camp, +/turf/open/floor/plasteel, +/area/security/brig) "gY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -1332,10 +2507,6 @@ /obj/item/melee/transforming/energy/axe, /turf/open/floor/plasteel, /area/storage/primary) -"kk" = ( -/obj/structure/table/optable, -/turf/open/floor/plasteel, -/area/maintenance/department/bridge) "kn" = ( /obj/structure/cable{ icon_state = "1-2" @@ -1361,22 +2532,26 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"lK" = ( -/obj/effect/landmark/observer_start, -/turf/open/floor/plating, -/area/storage/primary) +"lg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "ny" = ( /obj/structure/table, /obj/item/storage/toolbox/syndicate, /turf/open/floor/plasteel, /area/storage/primary) -"oL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/vr_sleeper, -/turf/open/floor/plasteel, -/area/storage/primary) "oV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -1401,6 +2576,12 @@ }, /turf/open/floor/plasteel, /area/medical/chemistry) +"qn" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) "sE" = ( /obj/machinery/power/rtg/advanced, /obj/structure/cable, @@ -1437,33 +2618,19 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"wT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/medical/chemistry) -"wV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/vr_sleeper, -/turf/open/floor/plasteel, -/area/storage/primary) -"yp" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/medical/chemistry) "AP" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, +/obj/machinery/rnd/production/techfab/department, /turf/open/floor/plasteel, /area/science) +"Bl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) "BB" = ( /obj/item/storage/backpack/duffelbag/syndie/surgery, /obj/structure/table, @@ -1487,11 +2654,6 @@ /obj/machinery/rnd/production/circuit_imprinter/department, /turf/open/floor/plasteel, /area/science) -"CK" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/turf/open/floor/plasteel, -/area/medical/chemistry) "CV" = ( /obj/structure/cable{ icon_state = "1-2" @@ -1522,10 +2684,12 @@ /obj/structure/closet/secure_closet/RD, /turf/open/floor/plasteel/blue/side, /area/bridge) -"JE" = ( -/obj/machinery/door/airlock, -/turf/open/floor/plating, -/area/hallway/primary/central) +"JF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) "Ly" = ( /obj/machinery/chem_dispenser/chem_synthesizer, /turf/open/floor/plasteel/dark, @@ -1534,6 +2698,10 @@ /obj/machinery/rnd/production/protolathe/department, /turf/open/floor/plasteel, /area/science) +"PI" = ( +/obj/structure/fans/tiny/invisible, +/turf/open/space/basic, +/area/space) "Qt" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -1557,6 +2725,7 @@ /area/science) "Ut" = ( /obj/structure/closet/secure_closet/medical3, +/obj/item/healthanalyzer/advanced, /turf/open/floor/plasteel, /area/medical/medbay) "Vg" = ( @@ -1569,6 +2738,13 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"VA" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/engine/engineering) "WT" = ( /obj/structure/cable{ icon_state = "4-8" @@ -1639,6 +2815,44 @@ 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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} (2,1,1) = {" aa @@ -1693,6 +2907,44 @@ 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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} (3,1,1) = {" aa @@ -1747,6 +2999,44 @@ 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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} (4,1,1) = {" aa @@ -1801,6 +3091,44 @@ 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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} (5,1,1) = {" aa @@ -1855,6 +3183,44 @@ 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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} (6,1,1) = {" aa @@ -1909,6 +3275,44 @@ 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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} (7,1,1) = {" aa @@ -1963,6 +3367,44 @@ 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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} (8,1,1) = {" aa @@ -2017,6 +3459,44 @@ 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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} (9,1,1) = {" aa @@ -2027,42 +3507,80 @@ aa aa aa aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +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 +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2081,42 +3599,80 @@ aa aa aa aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab +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 +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2135,42 +3691,80 @@ aa aa aa aa -ab -ac -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bY -bY -bY -bY -bY -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ac -ab +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 +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2189,42 +3783,80 @@ aa aa aa aa -ab -ac -ad -af -af -af -af -af -af -af -af -bz -af -af -af -af -af -bz -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -ad -ac -ab +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 +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2243,42 +3875,80 @@ aa aa aa aa -ab -ac -ad -af -ah -ah -ah -ah -ah -ah -ah -bA -gd -gd -bA -bZ -bZ -JE -cN -cN -cN -cN -cN -cN -cN -cN -cN -cN -cN -cN -cN -cN -af -ad -ac -ab +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 +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2297,42 +3967,80 @@ aa aa aa aa -ab -ac -ad -af -ah -al -aw -aM -aZ -bj -bs -bB -ca -If -In -kn -bO -bO -cO -cW -dm -dy -dy -dy -dX -dy -dy -dy -dy -dm -dK -cN -af -ad -ac -ab +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 +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2351,42 +4059,80 @@ aa aa aa aa -ab -ac -ad -af -ah -am -ax -aw -ba -bk -bt -fT -cb -AP -pA -kQ -bN -bN -cP -cX -dn -dn -dn -dn -dn -dn -dn -dn -dn -dn -dL -cN -af -ad -ac -ab +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 +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2405,8 +4151,2126 @@ aa aa aa aa -ab -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +gj +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 +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +em +eX +ee +eX +em +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 +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 +aa +aa +aa +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +em +gh +gl +gD +em +dY +dY +dY +aa +aa +aa +aa +aa +aa +aa +dY +dY +dY +dY +aa +aa +aa +aa +aa +dY +dY +dY +dY +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +em +gi +gm +go +gp +ei +gr +dY +aa +aa +aa +aa +aa +aa +aa +dY +eh +eh +dY +aa +aa +aa +aa +aa +dY +eh +eh +dY +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +db +dY +dY +dY +dY +eh +eq +en +aa +aa +aa +aa +aa +aa +aa +en +eh +eh +en +aa +aa +aa +aa +aa +en +eh +eh +gc +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +PI +dj +ed +eh +eq +en +aa +aa +aa +aa +aa +aa +aa +en +eh +eh +en +aa +aa +aa +aa +aa +en +eh +eh +gc +ff +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(22,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +el +aa +aa +aa +fi +dP +ex +eh +eq +eo +aa +aa +aa +aa +aa +aa +aa +eo +eh +gv +dY +aa +aa +aa +aa +aa +dY +gI +eh +en +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +PI +dV +dY +ej +eq +en +aa +aa +aa +aa +aa +aa +aa +en +eh +eh +en +aa +aa +aa +aa +aa +en +eh +eh +en +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +fg +aa +db +dY +dY +dY +dY +eh +eq +en +aa +aa +aa +aa +aa +aa +aa +en +eh +gF +fj +aa +aa +aa +aa +aa +fj +eh +eh +en +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +dY +gE +eq +dY +aa +aa +aa +aa +aa +aa +aa +dY +eh +eh +en +aa +aa +aa +aa +aa +en +eh +eh +dY +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +dY +gq +gs +dY +aa +aa +aa +aa +aa +aa +aa +dY +eh +gw +dY +aa +aa +aa +aa +aa +dY +gB +eh +en +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +dY +eh +eq +en +aa +aa +aa +aa +aa +aa +aa +en +eh +ek +en +aa +aa +aa +aa +aa +en +ek +eh +dY +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +dY +eh +gt +en +aa +aa +aa +aa +aa +aa +aa +en +eh +ek +en +aa +aa +aa +aa +aa +en +ek +eh +en +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 +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 +dY +ej +gt +eo +aa +aa +aa +aa +aa +aa +aa +eo +eh +ek +en +aa +aa +aa +aa +aa +en +ek +eh +dY +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 +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 +dY +eh +gt +en +aa +aa +aa +aa +aa +aa +aa +en +eh +gx +dY +aa +aa +aa +aa +aa +dY +gC +eh +dY +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +eb +aa +aa +dY +eh +gt +dh +aa +aa +aa +ec +aa +aa +aa +dY +eh +ek +en +aa +aa +eE +aa +aa +en +ek +eh +dY +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ag +ag +bw +di +bw +ag +bw +di +bw +ag +ag +eh +gt +dh +dh +en +en +en +en +en +dY +dY +eh +ek +dY +dY +fn +fs +en +dY +dY +ek +eh +dY +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ag +dR +aD +aD +bC +de +gJ +aD +aD +dR +ag +eh +gt +eh +eV +eh +eh +eh +eh +eh +eV +eh +eh +ek +eh +eV +eh +eh +eh +eV +eh +ek +eh +dY +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ag +gn +aD +aD +bH +ci +df +df +df +df +eg +ei +gu +ei +ep +ei +ei +ei +ei +eB +eL +eL +eL +fd +eL +eL +eL +eL +eL +eL +eL +fZ +eh +dY +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ag +aD +aD +aD +bT +cI +dg +aD +aD +aD +ag +eh +eh +eh +eq +eh +eh +eh +eh +eF +eM +fM +eh +eh +eh +eh +eh +eh +eh +eh +eh +eh +eh +ge +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +dH +ah +ah +ah +ah +ah +ah +ah +bA +bA +bA +bA +bZ +ft +bZ +cN +cN +cN +cN +cN +cN +ef +ef +cN +cN +cN +cN +cN +cN +fI +dY +dY +ge +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +ah +al +aw +aM +aZ +bj +bs +bB +ca +If +In +kn +fu +bO +cO +cW +dm +dy +dy +dX +dy +dy +gG +dy +dy +dm +dK +cN +af +ad +fg +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +ah +am +ax +aw +ba +bk +bt +fT +cb +AP +pA +kQ +fv +bN +cP +cX +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +ad +fg +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ad af ah @@ -2439,8 +6303,44 @@ dL cN af ad -ac -ab +fg +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 +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2450,7 +6350,11 @@ aa aa aa "} -(17,1,1) = {" +(40,1,1) = {" +aa +aa +aa +aa aa aa aa @@ -2459,8 +6363,6 @@ aa aa aa aa -ab -ac ad af ah @@ -2493,8 +6395,44 @@ dL cN af ad -ac -ab +fg +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 +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2504,7 +6442,11 @@ aa aa aa "} -(18,1,1) = {" +(41,1,1) = {" +aa +aa +aa +aa aa aa aa @@ -2513,8 +6455,6 @@ aa aa aa aa -ab -ac ad af ah @@ -2547,8 +6487,44 @@ dL cN af ad -ac -ab +fg +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 +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2558,7 +6534,11 @@ aa aa aa "} -(19,1,1) = {" +(42,1,1) = {" +aa +aa +aa +aa aa aa aa @@ -2567,8 +6547,6 @@ aa aa aa aa -ab -ac ad bY ah @@ -2601,8 +6579,44 @@ dL cN af ad -ac -ab +fg +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 +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2612,7 +6626,11 @@ aa aa aa "} -(20,1,1) = {" +(43,1,1) = {" +aa +aa +aa +aa aa aa aa @@ -2621,8 +6639,6 @@ aa aa aa aa -ab -ac ae ab ab @@ -2637,7 +6653,7 @@ ce cp cv cC -bE +lX bE cR cY @@ -2655,8 +6671,44 @@ dZ cN af bY -ac -ab +fg +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 +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2666,7 +6718,11 @@ aa aa aa "} -(21,1,1) = {" +(44,1,1) = {" +aa +aa +aa +aa aa aa aa @@ -2675,8 +6731,6 @@ aa aa aa aa -ab -ac ae ab ai @@ -2709,8 +6763,44 @@ dL cN af bY -ac -ab +fg +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 +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -2720,7 +6810,11 @@ aa aa aa "} -(22,1,1) = {" +(45,1,1) = {" +aa +aa +aa +aa aa aa aa @@ -2729,8 +6823,6 @@ aa aa aa aa -ab -ac ae ab ai @@ -2763,1213 +6855,7 @@ dL cN af bY -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ae -ab -ab -ab -aB -ab -ab -ab -bv -bJ -cf -cq -cw -cD -bE -bE -cQ -cY -dn -dn -dn -dn -dn -dn -dn -dn -dn -dn -dL -cN -af -bY -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ae -ac -ac -ab -aB -ab -ac -ac -bv -bK -cf -Iy -bu -cD -bE -bE -cQ -cY -dn -dn -dn -dn -dn -dn -dn -dn -dn -dn -dL -cN -af -bY -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ae -ac -ac -aj -aC -aj -ac -ac -bv -bL -cf -cq -bv -cD -bE -bE -cN -cZ -do -dz -dz -dz -dz -dz -dz -dz -dz -do -dM -cN -af -bY -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ae -ac -ac -aj -Vy -aj -ac -ac -bu -bM -cg -cr -bu -wb -bE -bE -cS -cS -cS -cS -cS -cS -dG -dG -cS -cS -cS -cS -cS -cS -af -bY -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(27,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -bY -aj -aj -WT -aj -aj -aj -bu -bu -ch -cs -cs -cE -bO -bO -cT -da -dp -dl -dl -dl -dl -dl -dl -dl -dl -dp -dl -cS -af -bY -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -aj -ap -Vy -aS -bd -bo -aj -hD -cj -ct -Ce -cF -bE -bE -cS -dl -dl -dl -dl -dl -dl -dl -dl -dl -dl -dl -dl -cS -af -bY -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -aj -aq -aE -aT -be -be -bx -CV -yp -wT -wT -CK -bN -bN -cU -gM -dc -dA -dl -dD -dc -dc -dA -dl -dD -dc -oL -cS -af -bY -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -aj -ar -aF -Vy -bf -bp -aj -bP -pQ -Ce -Ce -oV -bE -bE -cS -dd -dq -dB -dl -dE -dH -dI -dB -dl -dE -dJ -ny -cS -af -bY -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -ak -ak -ak -aU -ak -ak -ak -bQ -pQ -Ce -Ce -vP -bE -Vg -cS -de -dr -dB -dl -dE -dH -dI -dB -dl -dE -dJ -dO -cS -af -bY -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -ak -as -aG -aV -bg -bq -ak -bR -pQ -Ce -Ce -oV -bE -bE -cV -df -ds -dB -dl -dE -dH -dI -dB -dl -dE -dJ -jU -cS -af -bY -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(33,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -ak -at -aH -aW -bh -br -ak -bS -pQ -Ce -Ce -oV -bE -bE -cV -dg -dt -dB -lK -dE -dH -dI -dB -dl -dE -dJ -ea -cS -af -ad -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(34,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -ak -au -aI -aX -aI -aI -ak -Ly -pQ -Xg -Ce -oV -bE -bE -cV -dh -du -dB -dl -dE -dH -dI -dB -dl -dE -dJ -dN -cS -af -ad -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(35,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -ak -av -av -av -av -av -by -by -ck -by -cx -cG -cx -by -by -di -dv -dB -dl -dE -dH -dI -dB -dl -dE -dJ -dQ -cS -af -ad -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(36,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -ak -av -aJ -aK -aL -av -by -bU -cl -cu -cu -cH -cu -cJ -by -dj -dw -dB -dl -dE -dH -dI -dB -dl -dE -dJ -dN -cS -af -ad -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(37,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -ak -dT -aK -av -bi -av -by -bV -cm -cm -cm -cm -cm -cK -by -dk -dk -dC -dl -dF -dk -dk -dC -dl -dF -dk -wV -cS -af -ad -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(38,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -ak -av -aL -aK -aJ -av -by -bW -cm -cm -cm -cm -cm -cL -by -dl -dl -dl -dl -dl -dl -dl -dl -dl -dl -dl -dl -cS -af -ad -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(39,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -ak -av -av -aY -av -av -by -bX -cm -cm -cy -Ut -cm -cM -by -dl -dx -dl -dl -dl -dY -dl -dl -dl -dl -dx -dl -cS -af -ad -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(40,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -ak -ak -ak -ak -ak -ak -by -by -cn -by -Qt -by -cm -BB -by -cS -cS -cS -cS -cS -cS -vv -cS -cS -cS -cS -cS -cS -af -ad -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(41,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -af -af -af -af -af -af -af -af -af -af -by -cz -by -kk -ei -ad -af -af -af -af -af -af -af -af -af -af -af -af -af -af -ad -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(42,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -by -pI -by -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(43,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(44,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(45,1,1) = {" -aa -aa -aa -aa -aa -aa -aa +fg aa aa aa @@ -4029,6 +6915,44 @@ aa aa aa aa +ae +ab +ab +ab +aB +ab +ab +ab +bv +bJ +cf +cq +cw +cD +bE +bE +cQ +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +bY +fg +aa +aa +aa +aa +aa aa aa aa @@ -4083,6 +7007,44 @@ aa aa aa aa +ae +ac +ac +ab +aB +ab +ac +ac +bv +bK +cf +Iy +bu +cD +bE +bE +cQ +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +bY +fg +aa +aa +aa +aa +aa aa aa aa @@ -4137,6 +7099,44 @@ aa aa aa aa +ae +ac +ac +aj +aC +aj +ac +ac +bv +bL +cf +cq +bv +cD +bE +bE +cN +cZ +do +dz +dz +gy +dz +dz +gy +dz +dz +do +dM +cN +af +bY +fg +aa +aa +aa +aa +aa aa aa aa @@ -4191,6 +7191,44 @@ aa aa aa aa +ae +ac +ac +aj +VA +aj +ac +ac +bu +bM +cg +cr +bu +wb +bE +bE +cS +cS +cS +cS +cS +cS +dG +dG +cS +cS +cS +cS +cS +cS +fJ +ga +ga +ga +aa +aa +aa +aa aa aa aa @@ -4245,6 +7283,44 @@ aa aa aa aa +ad +bY +aj +aj +WT +aj +aj +aj +bu +bu +cd +bu +bu +cE +bE +bE +cS +dd +dp +dl +dl +fX +dE +dB +dl +dl +dl +dp +dE +cS +fO +fO +fO +gf +aa +aa +aa +aa aa aa aa @@ -4299,6 +7375,44 @@ aa aa aa aa +ad +af +aj +ap +Vy +aS +bd +bo +aj +hD +cj +ct +Ce +cF +bE +bE +cS +dc +dC +dC +dC +dC +eI +eW +dC +dC +dC +dC +eI +vv +fO +fO +fO +fb +aa +aa +aa +aa aa aa aa @@ -4353,6 +7467,3540 @@ aa aa aa aa +ad +af +aj +aq +aE +aT +be +be +bx +CV +fL +ch +cs +cT +cU +cU +da +fK +dJ +dJ +dJ +dJ +dJ +dJ +dJ +dJ +dJ +dJ +eD +cS +fO +fO +fO +gf +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(53,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +aj +ar +aF +lg +bf +bp +aj +bP +pQ +JF +Ce +oV +bE +bE +cS +fx +dq +dJ +dJ +dJ +dI +dJ +dJ +dJ +dJ +dJ +ny +cS +fP +fO +fO +fb +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(54,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +ak +ak +ak +aU +ak +ak +ak +bQ +pQ +Ce +Ce +vP +bE +Vg +cS +fy +dr +dJ +dJ +dJ +dI +dJ +dJ +dJ +dJ +dJ +dO +cS +gz +fO +fO +gf +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(55,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +ak +as +aG +aV +bg +bq +ak +bR +pQ +Ce +Ce +oV +bE +bE +cV +fz +ds +dJ +dJ +dJ +dI +dJ +dJ +dJ +dJ +dJ +jU +cS +fQ +fO +fO +ga +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(56,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +qn +Bl +at +aH +aW +bh +br +ak +bS +pQ +Ce +Ce +oV +bE +bE +cV +fA +dt +dJ +dD +dJ +dI +dJ +dJ +dJ +dJ +dJ +ea +cS +fS +fO +fO +gk +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(57,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +ak +au +aI +aX +aI +aI +ak +Ly +pQ +Xg +Ce +oV +bE +bE +cV +fC +du +dJ +dJ +dJ +dI +dJ +dJ +dJ +dJ +dJ +dN +cS +fU +gb +fO +ga +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(58,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +ak +av +av +av +av +av +by +by +ck +by +cx +cG +cx +by +by +fD +dv +dJ +dJ +dJ +dI +dJ +dJ +dJ +dJ +dJ +dQ +cS +gA +fO +fO +gf +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(59,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +ak +av +aJ +aK +aL +av +by +bU +cl +cu +cu +cH +cu +cJ +by +fE +dw +dJ +dJ +dJ +dI +dJ +dJ +dJ +dJ +dJ +dN +cS +gH +fO +fO +fb +fp +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(60,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +ak +dT +aK +av +bi +av +by +bV +cm +cm +cm +cm +cm +cK +by +dA +dJ +dJ +dJ +dJ +dF +dJ +dJ +dJ +dJ +dJ +eD +cS +fV +fO +fO +gf +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(61,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +ak +av +aL +aK +aJ +av +by +bW +cm +cm +cm +cm +cm +cL +by +dk +eH +eH +eH +eH +eK +fw +fG +fG +fG +fG +fH +fR +fW +fO +fO +fb +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(62,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +ak +av +av +aY +av +av +by +bX +cm +eU +cy +Ut +cm +cM +by +dB +dx +dl +dl +gg +ez +dB +dl +dl +dl +dx +dE +cS +fO +fO +fO +gf +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(63,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +ak +ak +ak +ak +ak +ak +by +by +cn +by +Qt +by +cm +BB +by +cS +cS +cS +cS +cS +fN +vv +cS +cS +cS +cS +cS +cS +ga +ga +ga +ga +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(64,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +af +af +af +af +af +af +af +af +af +af +by +cz +by +er +es +by +eu +eu +eG +eP +fY +eZ +eu +fq +fr +eu +eu +eu +et +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(65,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +by +pI +by +by +by +by +eu +eu +eu +eQ +eu +fa +eu +eu +eu +fo +eu +eu +et +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(66,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +fg +fg +fg +fg +fg +fg +fg +fg +fg +fg +fg +fg +fg +fg +fg +fg +et +ev +eA +eA +eA +eN +ev +fe +ev +eT +fm +fm +ev +et +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(67,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 +et +ey +fh +fh +fh +eY +eR +fh +eR +fc +fh +fh +fh +et +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(68,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 +aa +aa +ew +eC +fF +fB +fF +fl +ew +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(69,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 +aa +aa +fh +eY +eS +fh +eS +fc +fh +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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(70,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 +aa +aa +aa +aa +eJ +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 +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 +"} +(71,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 +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 +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 +"} +(72,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 +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 +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 +"} +(73,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 +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 +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 +"} +(74,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 +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 +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 +"} +(75,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 +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 +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 +"} +(76,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 +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 +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 +"} +(77,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 +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 +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 +"} +(78,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 +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 +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 +"} +(79,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 +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 +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 +"} +(80,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 +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 +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 +"} +(81,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 +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 +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 +"} +(82,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 +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 +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 +"} +(83,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 +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 +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 +"} +(84,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 +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 +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 +"} +(85,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 +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 +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 +"} +(86,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 +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 +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 +"} +(87,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 +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 +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 +"} +(88,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 +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 +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 +"} +(89,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 +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 +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 +"} +(90,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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 3b0f6c6ca7..f2f5176ecc 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -13642,7 +13642,7 @@ /turf/open/floor/grass, /area/centcom/holding) "Qm" = ( -/obj/singularity/wizard, +/obj/singularity/wizard/mapped, /turf/open/indestructible/binary, /area/fabric_of_reality) "Qu" = ( diff --git a/_maps/runtimestation.json b/_maps/runtimestation.json index c363b67a05..f9333c65a2 100644 --- a/_maps/runtimestation.json +++ b/_maps/runtimestation.json @@ -1,5 +1,8 @@ { "map_name": "Runtime Station", "map_path": "map_files/debug", - "map_file": "runtimestation.dmm" + "map_file": "runtimestation.dmm", + "shuttles": { + "cargo": "cargo_delta" + } } diff --git a/_maps/shuttles/arrival_box.dmm b/_maps/shuttles/arrival_box.dmm index d117ca0f6b..2b245557a0 100644 --- a/_maps/shuttles/arrival_box.dmm +++ b/_maps/shuttles/arrival_box.dmm @@ -78,18 +78,18 @@ /turf/open/floor/plating, /area/shuttle/arrival) "p" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) "q" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/light/small{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) "r" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -114,13 +114,13 @@ /turf/open/floor/plating/airless, /area/shuttle/arrival) "v" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) "w" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/machinery/light/small{ diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm index b19ad63eb1..08f34e1c23 100644 --- a/_maps/shuttles/arrival_delta.dmm +++ b/_maps/shuttles/arrival_delta.dmm @@ -211,14 +211,14 @@ }, /area/shuttle/arrival) "u" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/shuttle/arrival) "v" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/effect/turf_decal/bot, diff --git a/_maps/shuttles/arrival_omega.dmm b/_maps/shuttles/arrival_omega.dmm index 04f19f60ea..b8fc632779 100644 --- a/_maps/shuttles/arrival_omega.dmm +++ b/_maps/shuttles/arrival_omega.dmm @@ -124,14 +124,14 @@ /turf/open/floor/plating, /area/shuttle/arrival) "q" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/shuttle/arrival) "r" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/effect/turf_decal/bot, diff --git a/_maps/shuttles/arrival_pubby.dmm b/_maps/shuttles/arrival_pubby.dmm index 3309533f35..a4308729b2 100644 --- a/_maps/shuttles/arrival_pubby.dmm +++ b/_maps/shuttles/arrival_pubby.dmm @@ -85,7 +85,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) "o" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/assault_pod_default.dmm b/_maps/shuttles/assault_pod_default.dmm index 4574318e47..9414fa9f82 100644 --- a/_maps/shuttles/assault_pod_default.dmm +++ b/_maps/shuttles/assault_pod_default.dmm @@ -4,7 +4,7 @@ /turf/closed/wall/mineral/plastitanium, /area/shuttle/assault_pod) "c" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium, @@ -45,20 +45,20 @@ /turf/open/floor/plating, /area/shuttle/assault_pod) "D" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/light{ dir = 1 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/assault_pod) "H" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/assault_pod) "L" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/machinery/light, diff --git a/_maps/shuttles/aux_base_default.dmm b/_maps/shuttles/aux_base_default.dmm index e093d3c864..365c34cf50 100644 --- a/_maps/shuttles/aux_base_default.dmm +++ b/_maps/shuttles/aux_base_default.dmm @@ -78,7 +78,8 @@ /area/shuttle/auxillary_base) "X" = ( /obj/machinery/camera{ - dir = 1 + dir = 1; + network = list("auxbase") }, /obj/structure/mining_shuttle_beacon, /turf/open/floor/plating, diff --git a/_maps/shuttles/aux_base_small.dmm b/_maps/shuttles/aux_base_small.dmm index b29512d675..a7ddb70a9b 100644 --- a/_maps/shuttles/aux_base_small.dmm +++ b/_maps/shuttles/aux_base_small.dmm @@ -146,4 +146,4 @@ g g g n -"} \ No newline at end of file +"} diff --git a/_maps/shuttles/emergency_asteroid.dmm b/_maps/shuttles/emergency_asteroid.dmm index 258f9a76d3..b1d300574d 100644 --- a/_maps/shuttles/emergency_asteroid.dmm +++ b/_maps/shuttles/emergency_asteroid.dmm @@ -73,7 +73,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "av" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -82,7 +82,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "ax" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -94,7 +94,7 @@ /turf/closed/wall/mineral/titanium/interior, /area/shuttle/escape) "aE" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/item/radio/intercom{ @@ -131,7 +131,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aK" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aL" = ( @@ -210,19 +210,19 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "aY" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aZ" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ba" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -345,7 +345,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "bw" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/item/radio/intercom{ @@ -355,7 +355,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "bx" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/structure/extinguisher_cabinet{ @@ -427,7 +427,7 @@ /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "bK" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/light{ dir = 1 }, diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 4b0f919532..9b4776a011 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -138,7 +138,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "aC" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aD" = ( @@ -214,7 +214,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aM" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig, diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm index 6719587d1e..d88e15fc94 100644 --- a/_maps/shuttles/emergency_birdboat.dmm +++ b/_maps/shuttles/emergency_birdboat.dmm @@ -53,11 +53,11 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "al" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "am" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/light{ dir = 1 }, @@ -87,7 +87,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ar" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -157,7 +157,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aE" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -174,7 +174,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aH" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -215,14 +215,14 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aN" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/structure/window/reinforced, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aO" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/structure/window/reinforced, @@ -232,7 +232,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aP" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/structure/window/reinforced{ dir = 1; pixel_y = 2 @@ -255,13 +255,13 @@ /turf/open/floor/plasteel/white, /area/shuttle/escape) "aS" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aT" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/machinery/light, @@ -286,7 +286,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aW" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aX" = ( diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency_box.dmm index dff9ccb5d2..57ddc27a97 100644 --- a/_maps/shuttles/emergency_box.dmm +++ b/_maps/shuttles/emergency_box.dmm @@ -18,7 +18,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "ag" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, @@ -44,7 +44,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "am" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -53,7 +53,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ao" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -71,7 +71,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "ar" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/structure/extinguisher_cabinet{ @@ -113,7 +113,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "aA" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aB" = ( @@ -179,17 +179,17 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aJ" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aK" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aL" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium, @@ -224,7 +224,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aS" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/structure/window/reinforced{ @@ -233,7 +233,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aT" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/structure/window/reinforced{ @@ -242,7 +242,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aU" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium, diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm index d64c28b8b9..7b9e8cfa6c 100644 --- a/_maps/shuttles/emergency_cere.dmm +++ b/_maps/shuttles/emergency_cere.dmm @@ -251,11 +251,11 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aS" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aT" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/light{ dir = 1 }, @@ -283,7 +283,7 @@ }, /area/shuttle/escape) "aW" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/light{ dir = 1 }, @@ -294,7 +294,7 @@ }, /area/shuttle/escape) "aX" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/plastitanium/brig{ icon_state = "darkred"; dir = 1; @@ -302,7 +302,7 @@ }, /area/shuttle/escape) "aY" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/plastitanium/brig{ icon_state = "darkred"; dir = 5; @@ -330,7 +330,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bd" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -339,7 +339,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bf" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/machinery/flasher{ @@ -381,7 +381,7 @@ /turf/open/floor/mech_bay_recharge_floor, /area/shuttle/escape) "bk" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -412,7 +412,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bp" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/flasher{ @@ -479,7 +479,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "bw" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig{ @@ -489,7 +489,7 @@ }, /area/shuttle/escape) "bx" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig{ @@ -509,7 +509,7 @@ }, /area/shuttle/escape) "bz" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig{ @@ -658,7 +658,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bW" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/structure/window/reinforced{ @@ -667,7 +667,7 @@ /turf/open/floor/plasteel/neutral, /area/shuttle/escape) "bX" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/structure/window/reinforced{ diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm index 2eaebaeb45..3dd4766d6a 100644 --- a/_maps/shuttles/emergency_clown.dmm +++ b/_maps/shuttles/emergency_clown.dmm @@ -18,7 +18,7 @@ /turf/open/floor/noslip, /area/shuttle/escape) "af" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/bluespace, @@ -43,7 +43,7 @@ /turf/open/floor/noslip, /area/shuttle/escape) "aj" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/bluespace, @@ -53,7 +53,7 @@ /turf/open/floor/bluespace, /area/shuttle/escape) "al" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/bluespace, @@ -71,7 +71,7 @@ /turf/open/floor/noslip, /area/shuttle/escape) "ao" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/structure/extinguisher_cabinet{ @@ -154,11 +154,11 @@ /turf/open/floor/noslip, /area/shuttle/escape) "aC" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/noslip, /area/shuttle/escape) "aD" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/noslip, diff --git a/_maps/shuttles/emergency_cramped.dmm b/_maps/shuttles/emergency_cramped.dmm index aa1b9f0f0d..457e23d84b 100644 --- a/_maps/shuttles/emergency_cramped.dmm +++ b/_maps/shuttles/emergency_cramped.dmm @@ -17,7 +17,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "e" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -74,7 +74,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "n" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/plating, @@ -109,7 +109,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "s" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/structure/extinguisher_cabinet{ diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm index 256358bbae..24d59e5033 100644 --- a/_maps/shuttles/emergency_delta.dmm +++ b/_maps/shuttles/emergency_delta.dmm @@ -240,14 +240,14 @@ /turf/open/floor/plasteel/cmo, /area/shuttle/escape) "av" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/shuttle/escape) "aw" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/effect/turf_decal/bot, @@ -326,7 +326,7 @@ }, /area/shuttle/escape) "aH" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/item/radio/intercom{ @@ -672,7 +672,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bx" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "by" = ( @@ -709,12 +709,12 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bC" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/shuttle/escape) "bD" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/status_display{ pixel_y = 32 }, @@ -722,7 +722,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bE" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -771,7 +771,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bM" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/status_display{ @@ -780,7 +780,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bN" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -823,7 +823,7 @@ }, /area/shuttle/escape) "bU" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig, @@ -1059,7 +1059,7 @@ }, /area/shuttle/escape) "cB" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/effect/turf_decal/bot, @@ -1077,7 +1077,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "cG" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/machinery/light, diff --git a/_maps/shuttles/emergency_goon.dmm b/_maps/shuttles/emergency_goon.dmm index 6f31ce1d40..57f0b23d9f 100644 --- a/_maps/shuttles/emergency_goon.dmm +++ b/_maps/shuttles/emergency_goon.dmm @@ -74,7 +74,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "s" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -154,7 +154,7 @@ /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "H" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -201,7 +201,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "S" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/light{ @@ -210,7 +210,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "T" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/light/small{ diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm index 29b8661ae2..faf70072d3 100644 --- a/_maps/shuttles/emergency_meta.dmm +++ b/_maps/shuttles/emergency_meta.dmm @@ -65,7 +65,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ar" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "as" = ( @@ -74,7 +74,7 @@ name = "Station Intercom (General)"; pixel_y = 27 }, -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/light{ dir = 1 }, @@ -220,7 +220,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aE" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium, @@ -314,7 +314,7 @@ name = "Station Intercom (General)"; pixel_y = -31 }, -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/machinery/light, @@ -362,7 +362,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bd" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/plasteel/floorgrime, @@ -377,13 +377,13 @@ /turf/open/floor/plasteel/floorgrime, /area/shuttle/escape) "bh" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bi" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bj" = ( @@ -436,7 +436,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bs" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -713,7 +713,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bV" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/light{ dir = 1 }, @@ -816,7 +816,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ca" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/machinery/light, @@ -835,7 +835,7 @@ /turf/open/floor/plasteel/floorgrime, /area/shuttle/escape) "cd" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/machinery/light{ diff --git a/_maps/shuttles/emergency_mini.dmm b/_maps/shuttles/emergency_mini.dmm index a0b6ce6db9..42650f6fd1 100644 --- a/_maps/shuttles/emergency_mini.dmm +++ b/_maps/shuttles/emergency_mini.dmm @@ -40,7 +40,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "h" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -49,7 +49,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "j" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -68,7 +68,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "m" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/machinery/light/small{ @@ -116,25 +116,25 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "v" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "w" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "x" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "y" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/machinery/light{ @@ -149,7 +149,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "A" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/light{ @@ -171,7 +171,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "C" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "D" = ( @@ -218,7 +218,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "K" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -231,7 +231,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "M" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -261,7 +261,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "R" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "S" = ( diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm index aaa9c861ce..9d6c5f1e4d 100644 --- a/_maps/shuttles/emergency_narnar.dmm +++ b/_maps/shuttles/emergency_narnar.dmm @@ -15,7 +15,7 @@ /turf/open/floor/plasteel/cult, /area/shuttle/escape) "e" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/plasteel/cult, @@ -40,7 +40,7 @@ /turf/open/floor/plasteel/cult, /area/shuttle/escape) "i" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/plasteel/cult, @@ -49,7 +49,7 @@ /turf/open/floor/plasteel/cult, /area/shuttle/escape) "k" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/plasteel/cult, @@ -67,7 +67,7 @@ /turf/open/floor/plasteel/cult, /area/shuttle/escape) "n" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/structure/extinguisher_cabinet{ diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency_omega.dmm index 0debf2ad0f..570cb99f0a 100644 --- a/_maps/shuttles/emergency_omega.dmm +++ b/_maps/shuttles/emergency_omega.dmm @@ -12,7 +12,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "ad" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/newscaster/security_unit{ @@ -24,11 +24,11 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "ae" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "af" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/item/radio/intercom{ @@ -67,7 +67,7 @@ }, /area/shuttle/escape) "ak" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/status_display{ @@ -240,7 +240,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "aD" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/status_display{ @@ -253,7 +253,7 @@ /turf/open/floor/plasteel/neutral, /area/shuttle/escape) "aF" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/effect/turf_decal/bot, @@ -356,14 +356,14 @@ /turf/open/floor/grass, /area/shuttle/escape) "aJ" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/shuttle/escape) "aK" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/effect/turf_decal/bot, @@ -384,7 +384,7 @@ /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) "aN" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/effect/turf_decal/bot, diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm index 136cabe9db..47b891cfd0 100644 --- a/_maps/shuttles/emergency_pubby.dmm +++ b/_maps/shuttles/emergency_pubby.dmm @@ -222,7 +222,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aJ" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/plasteel/darkpurple/side{ dir = 9 }, @@ -235,7 +235,7 @@ /turf/open/floor/plasteel/darkgreen/side, /area/shuttle/escape) "aL" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/plasteel/darkpurple/side{ dir = 5 }, @@ -253,7 +253,7 @@ }, /area/shuttle/escape) "aO" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/structure/window/reinforced, @@ -262,14 +262,14 @@ }, /area/shuttle/escape) "aP" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/structure/window/reinforced, /turf/open/floor/plasteel/darkpurple/side, /area/shuttle/escape) "aQ" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/structure/window/reinforced, @@ -283,7 +283,7 @@ }, /area/shuttle/escape) "aS" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/plasteel/darkpurple/side{ @@ -291,7 +291,7 @@ }, /area/shuttle/escape) "aT" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/light{ dir = 1 }, @@ -300,7 +300,7 @@ }, /area/shuttle/escape) "aU" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/plasteel/darkpurple/side{ @@ -328,7 +328,7 @@ /turf/open/floor/plasteel/cmo, /area/shuttle/escape) "aY" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/machinery/light, @@ -370,7 +370,7 @@ /turf/open/floor/plasteel/cafeteria, /area/shuttle/escape) "be" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/plasteel/cmo, /area/shuttle/escape) "bf" = ( @@ -424,7 +424,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "bo" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/structure/window/reinforced{ dir = 1; pixel_y = 2 @@ -432,7 +432,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "bq" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/plating, @@ -466,13 +466,13 @@ /turf/open/floor/plating, /area/shuttle/escape) "bw" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "bx" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -518,7 +518,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "bG" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/machinery/light, diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm index edd86c5ec6..d5ca59c4f2 100644 --- a/_maps/shuttles/emergency_raven.dmm +++ b/_maps/shuttles/emergency_raven.dmm @@ -420,7 +420,7 @@ }, /area/shuttle/escape) "bd" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig{ @@ -572,7 +572,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "bx" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig{ @@ -660,7 +660,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "bK" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/plasteel/darkgreen/side{ dir = 8 }, @@ -679,7 +679,7 @@ }, /area/shuttle/escape) "bN" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/plasteel/darkgreen/side, @@ -815,7 +815,7 @@ }, /area/shuttle/escape) "bX" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/structure/window/reinforced{ @@ -824,7 +824,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "bY" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/structure/window/reinforced{ @@ -833,27 +833,27 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "bZ" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/structure/window/reinforced, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "ca" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/structure/window/reinforced{ dir = 1 }, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "cb" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/plasteel/darkgreen/side{ dir = 1 }, /area/shuttle/escape) "cc" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/plasteel/darkgreen/side, diff --git a/_maps/shuttles/emergency_russiafightpit.dmm b/_maps/shuttles/emergency_russiafightpit.dmm index d0b8f7ca80..3e5568279b 100644 --- a/_maps/shuttles/emergency_russiafightpit.dmm +++ b/_maps/shuttles/emergency_russiafightpit.dmm @@ -18,7 +18,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "af" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, @@ -43,7 +43,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aj" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -76,7 +76,7 @@ pixel_x = 6; pixel_y = -24 }, -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -91,7 +91,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aq" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ar" = ( @@ -102,7 +102,7 @@ pixel_y = -6; req_access_txt = "19" }, -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/button/door{ id = "bearsbearsbears"; name = "release bears"; @@ -131,7 +131,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "av" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aw" = ( @@ -204,7 +204,7 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "aJ" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium, @@ -238,7 +238,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "aP" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig, @@ -315,7 +315,7 @@ /turf/open/floor/engine, /area/shuttle/escape) "bc" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/structure/window/reinforced{ @@ -327,7 +327,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium, @@ -341,7 +341,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium, @@ -350,13 +350,13 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "bh" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium, @@ -551,7 +551,7 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "bO" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/light/small{ diff --git a/_maps/shuttles/emergency_scrapheap.dmm b/_maps/shuttles/emergency_scrapheap.dmm index cb2b7517b5..e95fcb507c 100644 --- a/_maps/shuttles/emergency_scrapheap.dmm +++ b/_maps/shuttles/emergency_scrapheap.dmm @@ -109,7 +109,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "at" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "au" = ( @@ -178,7 +178,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aE" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/brig, @@ -188,7 +188,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aG" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aH" = ( @@ -222,7 +222,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "aL" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, @@ -231,7 +231,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -266,7 +266,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aT" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/structure/extinguisher_cabinet{ @@ -395,14 +395,14 @@ /turf/open/floor/plating/airless, /area/shuttle/escape) "bo" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/light{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "bp" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/machinery/light{ diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm index 0dc057963c..ce8842a41b 100644 --- a/_maps/shuttles/emergency_supermatter.dmm +++ b/_maps/shuttles/emergency_supermatter.dmm @@ -21,14 +21,14 @@ /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "ah" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "ai" = ( /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "aj" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/yellow, @@ -73,7 +73,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "ar" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/yellow, @@ -94,7 +94,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "av" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/yellow, @@ -237,7 +237,7 @@ /turf/open/floor/plating/airless, /area/shuttle/escape) "bb" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/effect/turf_decal/stripes/line{ dir = 1 }, diff --git a/_maps/shuttles/emergency_wabbajack.dmm b/_maps/shuttles/emergency_wabbajack.dmm index 9bdb49064f..34f1661020 100644 --- a/_maps/shuttles/emergency_wabbajack.dmm +++ b/_maps/shuttles/emergency_wabbajack.dmm @@ -38,7 +38,7 @@ /turf/open/floor/plasteel/cult, /area/shuttle/escape) "ak" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -47,7 +47,7 @@ /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "am" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/plastitanium/brig, @@ -92,7 +92,7 @@ pixel_x = -24; pixel_y = -6 }, -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/brig, @@ -102,11 +102,11 @@ /turf/open/floor/plasteel/cult, /area/shuttle/escape) "av" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aw" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium, @@ -182,13 +182,13 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "aI" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aJ" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/structure/window/reinforced{ @@ -352,7 +352,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "bm" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/light/small{ @@ -365,7 +365,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "bo" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/light/small{ diff --git a/_maps/shuttles/escape_pod_default.dmm b/_maps/shuttles/escape_pod_default.dmm index c2625b0e57..8dcccf9326 100644 --- a/_maps/shuttles/escape_pod_default.dmm +++ b/_maps/shuttles/escape_pod_default.dmm @@ -3,7 +3,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/pod_1) "G" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/machinery/status_display{ @@ -32,7 +32,7 @@ /turf/open/floor/plating, /area/shuttle/pod_1) "U" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/item/radio/intercom{ diff --git a/_maps/shuttles/escape_pod_large.dmm b/_maps/shuttles/escape_pod_large.dmm index 6a36801db9..49f2f44e1e 100644 --- a/_maps/shuttles/escape_pod_large.dmm +++ b/_maps/shuttles/escape_pod_large.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "h" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/item/storage/pod{ @@ -17,7 +17,7 @@ /turf/open/floor/plating, /area/shuttle/pod_1) "A" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/item/radio/intercom{ @@ -36,13 +36,13 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/pod_1) "H" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/pod_1) "J" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/status_display{ @@ -51,13 +51,13 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/pod_1) "L" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/pod_1) "M" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/machinery/status_display{ diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry_base.dmm index 36a54e54bc..f7e717ccb8 100644 --- a/_maps/shuttles/ferry_base.dmm +++ b/_maps/shuttles/ferry_base.dmm @@ -24,7 +24,7 @@ /turf/closed/wall/mineral/titanium/interior, /area/shuttle/transport) "h" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -36,7 +36,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "j" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "k" = ( @@ -64,7 +64,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "q" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/ferry_fancy.dmm b/_maps/shuttles/ferry_fancy.dmm index 432791c936..e21bd7c5eb 100644 --- a/_maps/shuttles/ferry_fancy.dmm +++ b/_maps/shuttles/ferry_fancy.dmm @@ -27,7 +27,7 @@ /turf/open/floor/plating/airless, /area/shuttle/transport) "g" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/pod/dark, /area/shuttle/transport) "h" = ( @@ -87,7 +87,7 @@ /turf/open/floor/plating/airless, /area/shuttle/transport) "p" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/pod/dark, diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm index 21d3bd3413..21f8a58e44 100644 --- a/_maps/shuttles/ferry_lighthouse.dmm +++ b/_maps/shuttles/ferry_lighthouse.dmm @@ -68,7 +68,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "ar" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/wood, /area/shuttle/transport) "as" = ( @@ -137,7 +137,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "aJ" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "aK" = ( @@ -204,7 +204,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "aW" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm index 334df92b55..22d83d8d01 100644 --- a/_maps/shuttles/ferry_meat.dmm +++ b/_maps/shuttles/ferry_meat.dmm @@ -15,7 +15,7 @@ /turf/closed/wall/mineral/titanium/interior, /area/shuttle/transport) "f" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/plasteel/freezer, @@ -90,7 +90,7 @@ /area/shuttle/transport) "n" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/plasteel/freezer, /area/shuttle/transport) "o" = ( @@ -131,7 +131,7 @@ /turf/open/floor/plasteel/freezer, /area/shuttle/transport) "w" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/plasteel/freezer, diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index b1feae232e..0add06a7ff 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -176,7 +176,7 @@ /turf/closed/wall/mineral/plastitanium, /area/shuttle/syndicate/hallway) "aC" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4; name = "tactical chair" }, @@ -188,7 +188,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/hallway) "aE" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8; name = "tactical chair" }, @@ -206,7 +206,7 @@ /turf/closed/wall/mineral/plastitanium, /area/shuttle/syndicate/eva) "aH" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4; name = "tactical chair" }, @@ -218,7 +218,7 @@ }, /area/shuttle/syndicate/hallway) "aI" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8; name = "tactical chair" }, @@ -256,7 +256,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/eva) "aO" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4; name = "tactical chair" }, @@ -318,7 +318,7 @@ }, /area/shuttle/syndicate/hallway) "aX" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4; name = "tactical chair" }, diff --git a/_maps/shuttles/labour_box.dmm b/_maps/shuttles/labour_box.dmm index 636458a64c..fe9756ef33 100644 --- a/_maps/shuttles/labour_box.dmm +++ b/_maps/shuttles/labour_box.dmm @@ -86,7 +86,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/labor) "o" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/machinery/flasher{ diff --git a/_maps/shuttles/labour_delta.dmm b/_maps/shuttles/labour_delta.dmm index 6df69ba0f6..aeb2841683 100644 --- a/_maps/shuttles/labour_delta.dmm +++ b/_maps/shuttles/labour_delta.dmm @@ -120,7 +120,7 @@ /turf/open/floor/plasteel, /area/shuttle/labor) "q" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ @@ -133,7 +133,7 @@ /turf/open/floor/plasteel, /area/shuttle/labor) "s" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/machinery/flasher{ diff --git a/_maps/shuttles/mining_box.dmm b/_maps/shuttles/mining_box.dmm index b7354b8d89..2f262cae2b 100644 --- a/_maps/shuttles/mining_box.dmm +++ b/_maps/shuttles/mining_box.dmm @@ -18,7 +18,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/mining) "f" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/mining_delta.dmm b/_maps/shuttles/mining_delta.dmm index 99bdb64aae..920a754e45 100644 --- a/_maps/shuttles/mining_delta.dmm +++ b/_maps/shuttles/mining_delta.dmm @@ -47,7 +47,7 @@ /turf/open/floor/plasteel, /area/shuttle/mining) "g" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/plasteel/neutral, @@ -116,7 +116,7 @@ /turf/open/floor/plasteel/white, /area/shuttle/mining) "n" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/effect/decal/cleanable/dirt, @@ -126,7 +126,7 @@ /turf/open/floor/plasteel, /area/shuttle/mining) "o" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/effect/decal/cleanable/dirt, @@ -139,7 +139,7 @@ /turf/open/floor/plasteel, /area/shuttle/mining) "p" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index efd49c8908..59ce3014af 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -39,7 +39,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/pirate) "ag" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -71,7 +71,7 @@ pixel_y = -24; req_access = null }, -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/effect/decal/cleanable/dirt, @@ -82,7 +82,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/pirate) "an" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/effect/decal/cleanable/dirt, @@ -413,7 +413,7 @@ pixel_y = -24; req_access = null }, -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/ruin_caravan_victim.dmm b/_maps/shuttles/ruin_caravan_victim.dmm index aa42b30b9f..8f65015d55 100644 --- a/_maps/shuttles/ruin_caravan_victim.dmm +++ b/_maps/shuttles/ruin_caravan_victim.dmm @@ -156,7 +156,7 @@ }, /area/shuttle/caravan/freighter1) "gw" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin_syndicate_dropship.dmm index 696a99e30a..ac9a2cd680 100644 --- a/_maps/shuttles/ruin_syndicate_dropship.dmm +++ b/_maps/shuttles/ruin_syndicate_dropship.dmm @@ -88,7 +88,7 @@ /turf/open/floor/plating, /area/shuttle/caravan/syndicate3) "hF" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/light/small{ dir = 8 }, @@ -104,7 +104,7 @@ /turf/open/floor/pod/dark, /area/shuttle/caravan/syndicate3) "ka" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/machinery/light/small{ @@ -169,7 +169,7 @@ /turf/open/floor/plating, /area/shuttle/caravan/syndicate3) "rV" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/effect/decal/cleanable/dirt, @@ -185,7 +185,7 @@ }, /area/shuttle/caravan/syndicate3) "sn" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/shuttle/caravan/syndicate3) @@ -247,7 +247,7 @@ /turf/open/floor/plasteel/darkred/side, /area/shuttle/caravan/syndicate3) "Cm" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/machinery/firealarm{ @@ -278,7 +278,7 @@ }, /area/shuttle/caravan/syndicate3) "EO" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/machinery/airalarm/syndicate{ pixel_y = 24 }, diff --git a/_maps/shuttles/ruin_syndicate_fighter.dmm b/_maps/shuttles/ruin_syndicate_fighter.dmm index a9cf2a45b5..1f8c264079 100644 --- a/_maps/shuttles/ruin_syndicate_fighter.dmm +++ b/_maps/shuttles/ruin_syndicate_fighter.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aA" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/machinery/turretid{ diff --git a/_maps/shuttles/snowdin_excavation.dmm b/_maps/shuttles/snowdin_excavation.dmm new file mode 100644 index 0000000000..e0b53a78b1 --- /dev/null +++ b/_maps/shuttles/snowdin_excavation.dmm @@ -0,0 +1,90 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Elevator Access" + }, +/obj/docking_port/mobile/elevator{ + dir = 4; + height = 6; + id = "snowdin_excavation"; + name = "excavation elevator"; + timid = 1; + width = 6 + }, +/turf/open/floor/plating, +/area/shuttle/snowdin/elevator1) +"b" = ( +/obj/structure/window/reinforced/fulltile/ice, +/obj/structure/grille, +/turf/open/floor/plating, +/area/shuttle/snowdin/elevator1) +"c" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Elevator Access" + }, +/turf/open/floor/plating, +/area/shuttle/snowdin/elevator1) +"d" = ( +/turf/closed/wall/ice, +/area/shuttle/snowdin/elevator1) +"e" = ( +/turf/open/floor/engine, +/area/shuttle/snowdin/elevator1) +"f" = ( +/obj/machinery/computer/shuttle/snowdin/mining{ + dir = 2; + name = "Excavation Elevator Console"; + possible_destinations = "snowdin_excavation_top;snowdin_excavation_down"; + shuttleId = "snowdin_excavation" + }, +/turf/open/floor/engine, +/area/shuttle/snowdin/elevator1) + +(1,1,1) = {" +d +b +c +a +b +d +"} +(2,1,1) = {" +b +e +e +e +e +b +"} +(3,1,1) = {" +c +e +e +e +e +c +"} +(4,1,1) = {" +c +e +e +e +e +c +"} +(5,1,1) = {" +b +f +e +e +e +b +"} +(6,1,1) = {" +d +b +c +c +b +d +"} diff --git a/_maps/shuttles/snowdin_mining.dmm b/_maps/shuttles/snowdin_mining.dmm new file mode 100644 index 0000000000..cd8d37d703 --- /dev/null +++ b/_maps/shuttles/snowdin_mining.dmm @@ -0,0 +1,86 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Elevator Access" + }, +/obj/docking_port/mobile/elevator{ + dir = 4; + dwidth = 2; + height = 5; + id = "snowdin_mining"; + name = "mining elevator"; + timid = 1; + width = 5 + }, +/turf/open/floor/plating, +/area/shuttle/snowdin/elevator2) +"b" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/shuttle/snowdin/elevator2) +"c" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Elevator Access" + }, +/turf/open/floor/plating, +/area/shuttle/snowdin/elevator2) +"d" = ( +/turf/closed/wall, +/area/shuttle/snowdin/elevator2) +"e" = ( +/obj/machinery/computer/shuttle/snowdin/mining, +/turf/open/floor/engine, +/area/shuttle/snowdin/elevator2) +"f" = ( +/turf/open/floor/engine, +/area/shuttle/snowdin/elevator2) +"g" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/engine, +/area/shuttle/snowdin/elevator2) +"i" = ( +/obj/machinery/light/small, +/turf/open/floor/engine, +/area/shuttle/snowdin/elevator2) +"j" = ( +/turf/closed/wall/rust, +/area/shuttle/snowdin/elevator2) + +(1,1,1) = {" +j +b +a +b +d +"} +(2,1,1) = {" +b +e +f +i +b +"} +(3,1,1) = {" +c +f +f +f +c +"} +(4,1,1) = {" +b +g +f +f +b +"} +(5,1,1) = {" +d +b +c +b +j +"} diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index f7cd8ad529..6b56e1a6a0 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -137,7 +137,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "aJ" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/mineral/titanium, @@ -179,7 +179,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "aS" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/effect/decal/remains/human, @@ -232,7 +232,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "bd" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "bf" = ( diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 9888026e31..f8e366950a 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -753,7 +753,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "bo" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /obj/effect/decal/cleanable/dirt{ desc = "A thin layer of dust coating the floor."; name = "dust" @@ -827,7 +827,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/abandoned) "bu" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/effect/decal/cleanable/dirt{ @@ -871,7 +871,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "by" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/effect/decal/cleanable/dirt{ @@ -1022,7 +1022,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned) "bL" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /obj/effect/decal/cleanable/dirt{ diff --git a/_maps/shuttles/whiteship_pubby.dmm b/_maps/shuttles/whiteship_pubby.dmm index 11214ef260..e7cf65a6f5 100644 --- a/_maps/shuttles/whiteship_pubby.dmm +++ b/_maps/shuttles/whiteship_pubby.dmm @@ -42,7 +42,7 @@ /turf/open/floor/plating/abductor, /area/shuttle/abandoned) "i" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/shuttle, /turf/open/floor/plating/abductor, /area/shuttle/abandoned) "j" = ( @@ -65,7 +65,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned) "l" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /turf/open/floor/plating/abductor, @@ -75,7 +75,7 @@ /turf/open/floor/plating/abductor, /area/shuttle/abandoned) "n" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/open/floor/plating/abductor, @@ -110,7 +110,7 @@ /turf/open/floor/plating/abductor, /area/shuttle/abandoned) "q" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/structure/chair/shuttle{ dir = 1 }, /turf/open/floor/plating/abductor, diff --git a/goon/icons/obj/chairs.dmi b/goon/icons/obj/chairs.dmi new file mode 100644 index 0000000000000000000000000000000000000000..462370ac377b656de35efbe6903adaf9aa472742 GIT binary patch literal 1038 zcmV+p1o8WcP)b5T)HnVOhBK0PKa zL@hW{E;Uca#>K0vtB#J2ot>SRmzOU$QN+Z=6B81#vagDZi8)DXD=R8qUtKaXF~X;4 z#sB~S0d!JMQvg8b*k%9#0CIX%Sad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP16C^0t`#5UwoR&e!m0UHkhOG_Pnj!Yob0008jNklJ0}+_XvVTcJP7*(|=XvpqROC5_ z5K|9=jphh=BOxFqY;|A(io^l7J1EPt+L0=}X8}(-*amFGGXeYk++e>44p6&z%>y6+ z01GIARQ?D6OZ@=Qw5Y@3U@i?0s4G&<0=k1yV}Cma(Bmxbk4AWfo&hvo2>{n;1i*im zfK%7b{+V|=QH$PfX_>SIyD^%C(vA)lZpVtFyu$C z9G_zVemfV%yBLtk%O!`|5BcR1^`LqP;?O66@qGb!A0xonA4B!yUjcY=fTa?EQabn2 zDw*YI1VaqCUUjJJH3bACWC6EefVUWs$>1(?xqKA;l{Lu#utS2H!~^Cq`gbW{ zSA!l=L!4A*fQgtE8n9Mb0B}B(EekXqI4fI4QdHYY!kQewR9yuEFsag!x-y-DqL_sd zU`-BC;vtD8ScPfXo$4$>xPu?FI5xH>H&k=VmQW#}rwZ!M5rn=|p@kWus=xsHDTKEg zptb;``(391eZNx_0X2X|liv(P*dHnV7(iMB831J^oU5hZ6TSyX{X|e+JRoQg`z>Mc z;sHT}#BT@#rtocsv7GLc;?Zx7*hM^7Ap}ULJ68;m0Sx-(~YfH{Ayh z_;4xtiyxtBu$uiXcN)P;2RH&M0od%H`4RyyYe$xRp8eVQA0IJPG@=DIvj6}907*qo IM6N<$g1foN!2kdN literal 0 HcmV?d00001 diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi index 607bfe44c47efa0c0e1d56b1a67a83a15798978b..24bf84c97ddd8f9dea148dcaa82cd426552166aa 100644 GIT binary patch literal 27297 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 Biwpn& literal 26532 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%0Ar=5WqG9x<6aCnYRj^jk@v$ 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 G@_zs@sboz6 delta 5143 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 diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index de8d09b45b5da2217812f7f1247f9ebd6653d5e4..8142e034984437b14af803c2833f0a91b165c35c 100644 GIT binary patch delta 19183 zcmV)-K!?Agum;Ms29P8H5RoM>e?_7tEwt!SQoZcycW9BgT|Lo7E(!4c6ixl2=)7;f zeEoL+qq+NjzkUEtfnu|7u0MQSuf|}rZ}!dAcD?ctoX?LxQq~!oee+IZfT+5_@NT`b zfm5?@HtSW#x`)T_FVIN83P2Rn^!p?vGxP)MEKMWR?>fm$qm23}!!|N(e=EbTWZ1O~ z+sUvS8Fu?Rwq36*pguMG=C-|kq4`wR+_X0nO+tX7n$7_bg9C<`UuUl`@i*fNq5UXUT>(NBbzGM0$=<<#!B^gz(iepNt-V|NY zY=e%<=$JBS%zlB!Yj*X=Kl4GngxBUM@R8T%7^2gIS#}nEaDp6yfAa%FN`;|*aHsUl z?#ySClw)n`mGqPanNY6V!&6?^KzxZ#(8xp7*+=-56hup7KYPNEQUt~+Z2*SGB1@SD80G^!p1qh<;i3@v!wNm=tlh)w{O`h6{4 zHWR77m^T>stbBug&)UW2Ju4Sm_d!QjG}pIo1bq~YL?Z;}e=~w$E*eAf%CU|aX4=ve zW*xFm1DJZ?U_7x#m9h@?j5~znMeaS5|M|z@=G9I*@hOHL6zdQVG$tQl?yck>P0AD@ z9R*MH$RDsk8ngjLZ;*7IU~o`K53`5qee?ClU32&Se*G7PVjuNe=9{bl03ZNKL_t(| zob0`McpTN4gGd9nNCN?TPk%iF?7GTx|KD1>oIYpH^rD$jFC)pSw&X6k8(YSJEsTjt zLdk{j4@pSl0;wc{5ORS8E)c>E5JI&nHn>|BZW`H^i>xxLBTbd2ote|m*?X_||KVt4 z$&zeCNciIC%RXoCwfDQG?6<9VJ@0`+hLNT`>EbvP^5hDFgky9i8h==PVK=?o_M9{V zr+WYJUyA_NKJ+QLsQS5(PLt~BI2i@Zzvv>ExQJ)3{>VA+Kb!osMgRbd7cV~R15TEP zp5xjKPF4P=o`0IEI7r>1%Cz^Q!_s+shefJEH&|h$66PoE-+{y51P=&qgVl=({p<M!-iOw zm+0Fb>O1d(a*AF$uz_|3$Ax6XcO;Hx2qq3eTOAah2CfQ#0CKlMq0E)`VEStPa%7Stxsq+B?K){f33n!ndroTRcM_ZB;={;@5DQ-rkw`aB(v3a85IQ( zIU4BcIvvm;sDD90rhrC>_}_-ndWa+e#rs#hz=3!ZO1_Bn1<1r0?h?b?)e0OKeHaqE zp{r9-_il|fWopNs)OO8m6S9|x+jR)1(Wb{Ft_FzZDKwrGq4FC0*G z-6n;)D3S7ZCr~xoa%{&o&l{LFsJxV|KF^-j=|$pwekQY0C;FcaO*QTGSkMCAAS8yK zg8B!M?DG)6n4dqjgqT-Be(P^h2Oopo4--zbQE936UzpqvOMV+vQK+eaH6)Rj9t<5* z2ATc)*?+nABD9PuR9fy=KHZ~-t(>I+g=k;g+9f)E>=9tAP}vWO{g1<Pt zL@W}5%!_bd324Thbg8>Q!<+#BDJboQ#C%x!dyvZnwSzs@R60w+DoDgTuKk*tz~vS7 z8fW*wPf?NP7}^WrO&_A19mG^7iC7+~Sd@CFfq&LWl3b}mFV)3iI5Q{z%SHf;CqBcR z_3Ihhxs%%Vc4GDQj2%2ks!r%jHgs1kMIqYkW%~3MK->QQwDDifz|l-;=wTrp|U%JlZ40xNQegXT_WY zN@~{@Yp4TlfgIP!(SPUP`cwRTcsYOAI)8*+G#uL5fZJT5!~ZU!LtR*D;49GEsAwn) zjTb@Qhu*D`;kAF0ZIfC>C?vN0*oy~4HHC4LD-AuMvfWFAdM~O1t1NnGr<0jeg_{(n$t zxek=2h^!QQ@`x^o8$c}-jPf}go%-$%y$5doGp{jXA(o5sf&4M;Nk;&eD3mW%hSI}6 zc*FdpKg{Tn9_Ga&+_3s3rqVX$ilXU?C#f9%BZlwa#_YF3!z9Qvz-8cspfXKhUQ`4i zBtU$rRw6xNkj0wjYy7wz5+p!c=YIytqc23pmi$4cp6`Nkpww~`vC88-R4(%EgV(UT z&`LB~;XPw9Mu!de{7yIev8~K)t}bl;=tG+8-YZ0oK|TkiqhWu1c_shUgOMX|{%C0# zmIs#b@I(6O@)c@+@|g0n!=5xOBsqG}nby7=?0QVGV70+oY}~GSel!`D>O1fP`1MN>Yah$r_XKV%LCk`S8vFRS z`yL|^o@Vpa>rmkX@HIg)nty0Th^^+tdJwoFqeGsy=gkiq^+I9yKAoMn(vDL;UD>`? z1mF~p6LIUA8!OWu4p0&hw=^l&C2og^SwgvZdh_;QMFg<+p-<7YU;+7w3EXIuSbaVD zi3y^q6#0n>V)gYD(rNM&6ErPY00%yE&Pd>O?F8=a?LB7%a4J65|9>Oa{HUMruX>LIaQ3UZ{THRe$7j#EA!g-KyR3PzU8v%H!`eQm;_$` z_*7I*Qb_z)@T)WeGo8JTU4MPgr0e2TDx{5~@xMOJlTf~osu;?yh4up8D#E|ya$Nqv z1M4rD-XzNM{_*L5)_-rCwaK(*M@;$fh&>&DM#1|8`XOlOMENnUeeoVXeQXo8D~o)6 zXg%RUk45nzI#dQbew5|!1_Vl5K-U9f(0TzhlnQO>A4#!pDUttoQ*`?+zh7LmUuP?8 zBkHz>Yl1ooOm6wK`?o7E^Si>0fi;rV+1LXnQKJ=Z3pkH|1b-I&5wWfZ2uB0FF^k=Y z+Ndw*d3#|LMjoc7?*aUFgHwcS{>b1BDQFNT9)&zQ*HG_8)d=*7o-F<~{o^;5n(p{g z@P8$vK7~cPWa(7kA^w;Nf+AuimEvI`SPDd!;4FRz!I7__EaADa4u&5{a^cZFj?9j8 zWz@lwg`^`rbbpNsO^bzMkH7=q*9e)4E<4u-S{bFrcdLBeH4>G>qLfl2>VWjsTwyL^ zk75#4n6uog^D<&G{fah(=!M{iW+Cmj@X3AsjQX>%lyJkm-Q4;7O3n}Og6LfQ^jvoR zd>^Z(g!YSsz!tbzvF-xJz>x3dexeOY&l>IXbKW)?SAUn%c-03~Sjy1@Ivf-uhp3-> zt=HZh$v1BQkIJAE0KUSC3#InAl4$=UuKVEcF}Ka55V$n!3|G?2vMUEcRzSk0k`-7C z>AMuAI-ms>uZ3g7fn#2h;Ke@sSX)2w*o4Xbylg6Wd@5+;5Lkgy4U0|8Kca()gHq_2 z?GsTdd-AfL}uTYF~N;%j;TsTf?fu7e*uI#^Za zEnj?Dp#w~Pt$J+vBJjSGYXm#?XI|I%tJZa}@5kqEx^Vv2qTBb~{Mb3^o@bD$UmH7{ z5r44!4nu!0OWQJ7E?8e##z_{@6SyOD)2=^z1r-E9%YFB)@4flvp8AkOy-`$(XY$U? zc=~hS^$7qDfAh~@YpPW!h3(qZ5>OiiJZRfoeu95U?ejiHn+&e|Z7=!wm%>-Cdq=6W z?fp_Cdx1+KJ_5Y(d02Kco!4&UK<L9S+I1BNNV&S|@NuAGN2FtNc{#GT<2a z_49Buhk5JD2)Ix2%~wZ`CY~0xKYhDUNN`*^Y}P z89roee@Io1HmJ;;Kq7>3RG&OTj(>}|O3+UzEk35bOXAZf97#U|uKy?;{}Nl?si6A~ z{_yi(VqiSQOaFTx6yF1ZPwDELIr^Og;7;MOUP!ynP~##Kx%SrLyotxu z)V{c-uDrny)TCIbLf*`?Mlbmb?=Q_hxxZ#wxmW#7W$uF?RIm`5{}-so*MA@veVY4! zuLB7l=Jszbs#d! z$qy}8;X7{gJ<-&t0iaV*!rrC}gT;wuDx4p;iY0AgDkUffl=4vz`~f}h52IRR{I9Pj z**Vh2e{8OSVhV;I#|ko7UVrs(EiIBO@H z8Rkwn!RGl2oZ1iIl}11foL~_>ILx~CEJ+1F{^o^jI}r(NeBs(%oMjRE;ahI$SyV1# z+cx8+fC`3Fd08`)lYgfz0_SqCuZQ%}=c*n~;Mjm6?P(Sp!_~mu*IwIm`2!EES5xMD zIZy8!8FwdCROLMj)8DT%-t$4jii?2;s%elre*!lPq@$eQb(mRh7OA@)mAVoV4^ydK z$NiT)!{(0}YU5CvhH)cA>J)Ap?pWT=?|4KHUHA54Cli1cNPqD@gw02e*bmQM>m@F} zs+dP_ZJ6+=sN=lzR*b3;K2` z*1kjVc0wf#1N+=bf0!T$iCXn1{#>hw#i#;Dma1X2-z<@loz{8&aaD?}Hi=S&z)k|A zisF-k-O`6l{C@zoN07M+-wGHz5T(h9AfcCFWQd%gP|4=cCGpRB)(YPlp^6K||`jVC6pqc>{Zs z(DFFXk0kiO!X4mDLgzmN7Nz>xbYAff@L>pk4#&O-_J1^7d_%xYscKSZTwK={j9jfJMUfp!$&Tw~)VtD@f<%ZYjL zX1U#u8ovPskHdyd6y3Kl)%OLc7ZNc@)qod=SuT__DjdHtaLo~|s z#1qtFn1ATio&L1S+bvksiIwjKnWNA~kg;vh*$nYG;#|gb=3)ML*3S^@5UTM{kkp&8 z_x%OMV;~+(r=V#$1QVLPZ|Hk4d|VAddY3MGPnhX=l+5BCC zzx^GqSbEl;P^aN+RXM*%1h9DGGq}+xt=-+^#(&388i3;TG|ARh8t2akV0vVPNHTfy zdTVz#l|tdHQNZhF1AVPD(1jOX$ooz#18m;B`JCgPefC)jg~H2xLa%~QA)Mc_KNFib ztCsJ5a|duDt#d+|f9t{J0DSM8JGgb@EFRuo_2zHg*zua<=gq2R$NniUUEh-b>5h@` zIe(^bawqW2=T{e^3x;hq|XzUV}mt}0nVnLjiXbpHdKD z13PS+Vu{F-P*Xn#hscT=1?2k*FvYPgto^O0VKrpNptKVTOBKn8ArbPUmTj!LE2yv8ATcuV z;y;FlSG=k6G)4LT?3Erk&=?A0IKURr0Z<7zZD(4 z>5kmIT%YpV!a*WmRD>dm#O)S^z7nb*f(zxKk6lwEW#(lam2n zf@i*>S^H1*xFe%T`!r_kt30&12BX@^1~*fh7{(oZg2{4<+GgNEc>M1*>#j5$KBicC zkx={wCI1DCY|^+%-1JUrhW|Y@e9=|qKT<2r+dJ!n&9(2eIwzkY{p@q@fPeRl7;SkA zWfC6wkY?_eKS4viLXQs+8SLQ;@BKKjXZBGXI!s~1C-6h_m^k)49Sa5CCA5x#zZb@j zYJ4p;Ugd{kb>bd))E@7Ao2m7EMP*b~m~BF8888g>ohFufN*A-e%5&yn4LqV)vPL-4 zp=nKSz(g7`ZVfs=$-lj?4SzeIqf)G=VnL<6nBxs!CvV*Xj&S@Du%`w4+JOEvtXNlS zjn|9ojbTQyviXdZ!v`(J1wr!E_vKs>KyC-H=AM&jAgD$I=Q096_|uP{U;+KFMF7w8 z5iWfEbL7UyPv-Pj-TR4?%6}#W1XUyO{F|y7fwd2P3g?6a|5|GhuYbx0S}K*!Nc*Hu zlpURVZf1e^mEQle&pykn!-v`5(sKH7e*v>D0e?a;aE~ID7WS8f?p1br z&lC1!vKFf$>N)W_N=MQ}maHi^m@GGH1>{tfJNwN50#lGU1T2R-4<{#;6Mrs6buhIHE4Eb7TLWI)vWI0gLOeW)Oo18tA+k^*CBfSZ*}H`4^Az*j z02gcvbU~m9O-cMCF{}c*lDZBjIa}gt(mo%cu zr$Q|PXNf=x^gWMKxEF>3%~c;2*ahK~f&pP%!?O9Rln6_>vYQ}RqYLc~Ch0Xu!J21W zWpi3N-K*E(pQ+5Z?5=izJ)0poS55vex&|=W-+xb{sfqY=K8q(lL%g+tN}+JtB50GX^u1Jx8x*XpXlnK_;dGn>C=(mvnwgtkz8`!tHM2w9`?!eP?JVDfpM4~OZ# z|Nixt?Z0wa-?0An>i3#C*{xRP;8WIEcz?Ns3dbdS^zVhP>*4$lKz$qVWoT&xX;P?h zpeV#96w&v>p*_&pQGF>JFA^U5cUZr{o*dby^9xq`b;?CO_RrCS?a%p{IUS|QNW#$< zf6)ILj=Y^E(mj4Py(3HQgkMnR$e5jb%a@8v2!JBgZ9maF;Ag-!(D-4hyOcdaMSp?& z6ecfl0FL#6eLLt9wA&bFo0zo_rLsT(+51$9iuea}R(92<;P+_YPOD8K3*3se?Q*Xbg$d;z))hNqTzehiNL1OczTA+FIf zd1Rk8v2>2Kw#O@}M5m%W2%$@a+z~}2A@E&r(;z7ztWZb6N()VIQe3gtp#BL8Z-!Vw z@!&9QSZ$@9SwUiai&d~Y#ebRzTjkhXFH(5{6GysnNizdH?W> zuL0~^U8Q+g`_N}jo@+nvyp!diGv%LS2M+?(w2>1IQ$Kq)PhI?>Gv@J2_XBWUmrA8_ z(g?gVGB|i*0yB7`RN|70FaCuifElm*`Td1FIHz%59vRgf87-WXRe$rBx#v{u*|c?; z>!_2Ryv~NRMF1!7f5$h9KmFQzY=<*gL}xmS{p8{L^I>H0)cb7D}*rcv#vL~BDLA?Be@|&(Paq>{=RKdi!_Es$nTG^@Y#7E7nd5>BCm~ z(Eavkc1%|y4aO~zP+^9)OBcQ>rg|Pv}*gklyq7e;^tDwG1 z7}=q4hoS8|BJWUmt)U199#)5@Cavx+8*j^AXE zS1{_n)=u2QSAl=`-2-rjA^5?ce*DCkGb?{ilkrRL1L&>)V-`ttKA-1_r6<-@PjtY!Bpm*Q zB7o5xENp!J%$~n2W?Dj?P5veKY}mE$=Eu(H-@9YuBd34$`8^i`Pk7>8+nB!dw<0&& zaB4q+d|E{owPkp>v%mQ8De`x}=}kReLj#WIQSyCqT2rlRC-ce^t|QKartm3LbuRv6RewoN9|+#19a zVO$9m*5%Il;oVYdT4>^RO(t^i%PQ;4)|~&=a+g19j0!>RwI)g}ylqXefKgzOclO+6 zU+xt{BbT=2J6gKS3F8U=I6?6){Cr$jjvdyy%yEBRX-x+4q)6EBG@;rI>hixaPz&L# z$gCSwX8)6+iP9|b5A9S!B&a*O*B(zb1kuEhiR4S#Yic&o0gWq7tZ|eWAq7oTSt)mE z)V;#I3xcFBTmGQ~?o{jSpe9nQic^OXJs~<;D^Ao#w=a;u_ndU3Gq5ElAulQJfgd~L zb2fhmsc4tD3vVNrc}!WcvN)WNA|{XraTU>=gfqvrSG2`Dp0A=+Ohtu~cmk4bKYdN&$A$TTJZe zfS#(4N<-??cCnkT$PfXC--F>no6kzMB_rB^Je(4C{RGh68^pf2t zwAzWoOa!oG$r5(#*zu|nz{o&_rZ~it&g=5j|0~$DBY#Fq$W!H?+P`<>3)k+N>E!i# zFcTf@c}KOMz)WYc%#?~K7E^QZ$HiEaIZgi3d+%Kj(70hk&kL~_mIzJ|U;&q;a{(QH z{h<&s-zTg!qgvA#1QdX}AYi`l^H3DO6RGj^lMDL^F@w%(M z#))TCc4CX3C^nJY_o&X#S{Kw5mML$^I==w}`KxqgxJT!P_gK@dP7n*X5o)dT;$z$N zX!BL3xiF$Ci!SmTX0P?@_uTD_49E0;bm%Ch#f!a8d%kwm0|rqVHOsL6NSXYr*q{YT?sY&Df{BU3F1gFg;8atltGf6fwO#} zU(b`uIUeZg_3tis*3B|8RSy^wBLzGGoJX}6zyvTYFsh(cV7(C3BFSVBPW(WBThlM- zO!A#Uc+X?jSo;D=HVg;RY{e=zHko*0*x2p22PrdzJadn`PZAPxpOpsML>hAvn;uuC z_!Z*ng9@$&3Bkw@)p+xANqI3$p8B~ek9%=#4ktMVI2GapS36t-C(3QMPW%7Pql3J1EEQwjIs7PGwws4TJo3UDB<#_tA zDm?UD_{gHGy?Q&0l4iy9N0{zOJL$QDo~LV7bmd=p!X&iS`6^lC#ak}4qLxNAU+vdO z0kSWuayF|f{kyEpV8+R;y2fvo2`%1)DW_UZEU@q=59qO>5nVcenK!$C!3jcl{dsin z?|dP@MjAwNBY2%{rY0MxiZxf9sc)e(C+)PE6OZ`gL zUf{Lw-fj)XawfLygQitP$UUnoZc6l6zny>j0sHU;zgwPPQ!lRRgz~6(98g4K;!IDe zvezoU*D1y>pmSSwxl~ere(N$nF=u7aFjZ2Xy$~fi^)iRl3H%~_{DrTc{{7Xw{?laq z3b=so1bDtr;JS<| zMYuD@vB4s{oCt}K#i1YoV;H*OhMsC~VcFLA<oFb2`f#7%^ZlYT*G4`r=Xk1}p+6a%`=?*m2 zn&{f={DuS1IAdSmAtLnD@BYykWV-V@o9zs}t9Mtrx3lmWdLB?5L_7c*vey z{VuNs1+1pZavFea1=S1`7^j;@{0z5Ner5;7S{*c;7mo}a@C&`)<#?xc!oUXs?67sg(~BAy=-qOypABIYntoTqq%VOyeySQ?hiC)e1c*_z{fShlwqc z@N+L&{fV;BusMk61L*KY*dc?x?T79_4FTmaK_xB{a>bz@cpe6qIiCHLYhsu9P4lnw zlTuKqIRbO!y8gegzumq`nxb<9hXKeItcu?*rfsEvNz@ii_~?h-gU%GDu_&Q^8EeWF zquQdzX}B?{?+Rl_Y6!jfb*I03o!>|cSmS6rA$s~4l_P!O$z>OontSU*mk=TPvRT_x;dO1QZ31)COTrAOf>6=-|ASI!D4CX|B`N4XyQ5nRxMWTq_}gg^;-NQ zK1tkv>@f<#J|#M>w7XKQ+!0kNKCcRgZB+=?Dkqi{r|}{a)w{r%BX;9bY&BNh;Fz6M zWlkZ5u9;QCYBuv&1DQvA4eJ^A<4GdJz}V*T)0>%Z>E-1Lf;kCV^b{c!#H4Z*%*vP(Fm zG`Ao0CQg+PR28w-%$=U5*Y}C;OEVn`QSbXSC2QE5$&wb0${S)z&_EXG@H{4L8wJdN z@jOae(@nquATWk{psify!2S}mL`Yc{4P|&%R76P7js+ z%GA+9nLB9BL{w?XC93Y{JFUSh*URj>g%TkOJ3eC%<|ptk|FAckR+!kL@)J*}$)+Vi zJa|rJm@VPmKT^Z#3A=dN`wO!O!Gc?Vy~aO0FWo2$Rh5HgzqyYduIDXM&vEr`GO+B{ zVoN1UkW7s_m4#Z_uBg}&ajgAl=W2=c{JGQLTxVi)*9G;V5Vn;Lum;igI671(w%S=; z2vrLN6u3pPI_iT6&jTyK8&*N?C9;`OrMiaXXS_q*PM*@?uUc2uCrrh?E>QY^L8EG8 z>8QHcic|)r;*?zf=byCt*Kd;c&f6+o!!KFsmXvXZU$k=VbEL*^P|6CFvWLW?4LnCx z{C?!|(M%_VYQ=15 z^isM85Kv9R!dxY_aCW6uEy7YR+kifHar^NB>)xaL?f%MVP0nj0v2d283N3u(&lSxBJaO%jBbfdZ_XY!NEOh z)SauH!s9aC@upI}wNTWWT)D}uQCea`V;lET;a2Lo`_NYVqQa<}TDruGgxh>4yUm~0 z)4sD}jo%b%6ni41ih;p6_bHR@r5w5iCl)3&T_(pdtZ0k4r4q%dqsmV$6RR?XUGAY0 z%4(@u8t715EGv#O8VP=XpaT0kWvg~bAiJr$1pqv9+hd&nnU$;@yy}d1`=H$ax^>Nb zb=_IdXUOo(AHQ(cYrih}YGYTIJbJWBT(oNG($nv7-7~s>0Vg+!xu--4r&2$hiXA(4 zyxeE_1fJi$8-R^nT|9d9X#O8Q*viO2h0onRaWXsJ9OjHv%`c08S3c`E*VmL%O%9Jd zHNi{c>^en$>$&dv70Vx)k^e7uZe0)HZrs?jLu(cSaS_s?5DCx2Gln1(B3v#rVB55a z5cYinrK&p=MHp3zIv}GIdE2Ho2&e}N#!zDnhaHDb&tt-}=ml09L*>y&*8^NWyUH5) zT*}jZl=L+I-$Y3v2^_mQd}0S*lj1$Zp6SARk{z zLF4fdtbJ61?!RG#1~%YW{qzMx6VI|ZTU5#|;j1jcw6ZI$>%3H; zmB}BrO8FOq+{n1)H7^n;+Gw2F*U-T;u=hXNJz+y#3M+>)Q(4)Xl(5O-#;nu*D3$B2w+ArzY?eR2Y9_$vt|uDcI@E!=bwMo zan0eX2c91F_=B73OX*RMRFm`HvKTz`+?nHlXzmR8BmdL#XHa?c(e=wud_Ho+4L#FA zfVkEF)9!okT`xfIEw}W{y7SKU-EVta&(6EYjFBw&yXnb?f>N(DRnJ^fZ*q zTwN}c-m+!=7_j}8TY3_A-nm`_$s2Cysr>9`Cp&`4fc;Yyn0(uMNwx*Dj%&~|$-2IO zQAt~uSWPM(s75i##=qh4W8Vn}3pW+-Nv-B~jzIc|%6dII9UKq*&dt2kGD|ki@9^w$ zLiyna(eZ9Pp1{ScdgL4L3fB1=V_(SE35YVqArkx(`{c7~sY-Ahct$}#s5#XVLrPWU zPk|@;4>>ElR{B>Lz7+j#^!ma-j|{4Rk2WopT0g)GwaVu>%pa;*DzyC`XXN}QFP?gb zw8$3}CW2VYJ7L*F9dJ}ysi?oJ%d@e55f{lZddKJMi`qQD)_YMK z6jsLv%m6ow)3lG-b#=jnK{eB*ib1o47tWK#g<+LVyj_1DP227*>TUB0lA&gQWpP|4 zIY_=G8Y~RADMO!mdew3+W{N7&Sqwz;4b>w~teZ_7VHra-lNX0P$gY{)u!fpds%PCQ zxk}P1Epvzw0NHAHEk+?U#+G?E%buLahx#7TQ!Vwz4%ZV`?H~;X=~ZKDiih?-U|+Fh zp5MX|zR6CIW*ZuV547H{KD7CN3cf;=OC-W(<@$_l)49jL{$c9vk5 z;e3dub+}Z(V}nTTPBG-zte+;aZ#47~w>GfOPgU&pe^4J`0`J>jiGA+&jk)Qjcgl|O zjJ{rV8L;>Plel83Th%y?ZZBol$zzQj>iOxMb$hC)OpW}iaq6>wM|1GK`?tmc-hSPNo?nyv^{*T=bi)lj?WZVcfb*`nqUS%U z^7liPL3D;h?!Su5AKUm>lvqIxH*-iH+pFw_OWyB)0K;o zlpIyce~&V)JV2366y<2~DP=!;a!*U-000(cNklB1k#1# zgUmtDTuv_^XOJ)zhG^%{sZ}G4%N)WSCqbBs`cu-Zpo0Z8@)soJ4n~2jx?HxARC9Un zp%4gYU?qXCOV+}c)^nCI`mLGC2vv`_%`XBmi_;0Shqx2IDZ>NK1 z!oZ6}@4ZVMxc(32MwwFkDxDI9Jard`)lKRWlVg$w3fw_|6Pp-iGmSij@aN?DYdZN` z(o9I7s<2XB!?@h4cFP6S19O2F6m+QHl8F2+c{1C-;LcnBr{2e~xR(R0qmJS1XZS(l zqbz0&q*LGo&k~A$DjZOw62tH?hCC@Q17(wDHmxkc;TB4&fwH_0Pt_AMv*`c^6pYEA zu}lAhTnik3U|2oMH*y!thvNx8B`N-rMk?40Nsi8A2UW3kzWkIZ=Z`!7-n{Th` zK>gaK*1t-8|GVE(0KZQ8YU|dmuQ~yxKm?RhC%!9xteJ62AtD%4-GM4%m|-zcr(A!v z2>@)~eET`cZIn_HvBq7zkxUK z2HpUwsb!WlHn+d}Af*67YfUKR;`;$wD_qAWFosImCol%B6oCm&GZ?@*jlkIPAuuLC zlLI?{o9LJ2gVu^rD5QMfM{AAi+A0W)R4SeXfkA6U5S&&1Stszy9Nhmj#>Pe%9UcB} ziZ|ZC8+Ze6;MH;38o=1d%T&pydfWi6>kyB}C}b)m5(&_XV!6ssQ>l2AN@dFBGFoeV zKcKq9rV6bsJn!Y4`nhslV`DFqw5bz<&yZh#n6Ao4Q9MDJ{5s{IJki+Lde-ILQ|146 z;#~6Iz#Di2Z{U9tCk?>Z$N-6&8m|2AW!0(*s2&xl5~$&7m4(VG2*6AktOkvQfV@DR zLL!2M1wf>;=)M;#F;0z-$HZ~Hjsi~o%p{c|P&tGeW2snF|M0``fsf5Oo#o#J^$x*cNjaD{5S9h-oP99pT=ns!1&+44J&opmyf6Dnmg)5;iwQq_B0*HMj)bylHJptiQgb{t#zzE7o6F+mX6mZhXv zEE?B!ED>W$C13LSqS0C@-w!axh}Qb#I)dYbN}SxSaHjm}>1m8HJi70imkauT$4=4j zr+!}148XST562ci`RA``1hm$#D*p|E9-<7|v)C1Vj0-1k zIOk-N$>a&;UrqZsj;)f(xCIb@kH;*nm9i|0N~J=%T+-&y3kp!~qVtvOI-<3*JUhNG6l#9(M|~)|^ZJ8+Ze6 z;0^pw;-mpkN|71L5FZHm|Jysa9=nqBJU?Gmt>ZrSk?bCl9!f*a*hnOQ8BQ!Dh7vh3 zavdOsVEA_!@MSK16+oBy34sv|5FoiVWLOXq1hO%R1IRW#Gn^SRJob6-z4l=ps=i#T z-aTxxIm3}M4im5Eirt&QTfHx;>aFjDf@@;pRg9DihNrtY?}%8sH#dqq^@g? zB6np=&-Ly95+6K)-}v$%@nkZ2tuNgC9jAJAbaZsQii@3CRT=Jox83M$V@YQ@zOrZ$ zQ5`^Xn9%@K>(ov~a3n*A0`bUV%81}fszZqOwpi{9RaRnZi>XuQyAy^d15_1bF73gh zsuwqKV}v-4&$E7F;yBhkPffed_DvtaT1S$!)yQ!iQ`gP9ZH3w1-qQJe5t^n^5fKq1 z%jGH<(>egtF5psscF^+<;9vjd&*uO6&%f8(WALSi!1sRsqj~25IyyT3U*jbQFnpjy zwFOGj#ei&?kj*0qCCnTrk0%T^+7iaY$H&Bv?y~t$zE7N4q!FSdr8r%{&kS4d3|aIh zh&LqjK3QLxjSHM>WsNa}5H7NPCX)#w5Ji!!R!g!hlPEHO5<-yGszgNOeocg7K34%MPtp&O_s;w z5ylu15#l(KG)*MSVq>l2`1n|yvsi1-i@_|ryF1G64&Hk?Iy&aYjeTvJz-TnYdk@-YdN=;}L5$@iYdPiA);Mx1m zbub_*9Dg>YeEKON9Wh<3IQ;AZTYFplufvCbeB(Fn@buXUySKO6o-P^@MjkXp8YPM> z$xcF=CNFJ-)*1$b0a4^ko@XXaV*^kWGjr?K&5PC!Cnu*;9)5y#V-|~*-2dzW+q>KP zxc;ITtofa0!leSZu^KvnqYe|*YYH}*+)-epLjm>28}H+b^V zBgUH}&VKr5$gOWPe^4;!_W{LtL85k3HB(1fmDF`je-vSi!2`~<`ej*499!d@F-_C3 zS}o1S#+at50pa71@5%oDKKb=Kbj=i9~omzIDaYvUhM$Z{Pw$l(!Td!ar3`>`wuVb2HyMh-^~H;{?;FT z{=4%!fzAPRbacEaI1wReAj?t){Q;+LKsiv#{|3FAIduvW3{U>{fVcnAH!xm*Sgq!K z^w*z~q!G0bEKQB9=A^0M6PO);Ouqjev=$@*X%lz|4P?EH(P)JC0c#D72q7q0ma?_A zY4SV~Ypu@bg&huu7jOQL9zBsecfO@YTKx|{yeCN-(|AwQ1m?wpzO@7+tPVbr(fGTn zp|t?UtlLT$`u(1aMkDb)sI`WF=Q>n;p#%6Le)i|T)8qE%Ki|FmhrJgohVTB?AN9WX z^B>JS2hh>c@uuJathJZ(fjxBOO(W%ot{va z?e#r04Ox~`%;tz##v3DoD&BiF##}UrbIywQA+-95h+IAdeo+Sie5H!vf6f7PbacE4 zv<|=sHBcUwX#qu(g3w!7BBz9S<3T;+yvU-C84c4Ru`+$BwdWh@yxP0`vI-?*o8NCKJ35 z3mDr~(N;o@5+y0e#gy^J7X6KkaQu{m*%9eZpT)rnG~n`- znn05TwzfA}QL>~W+fHG_;w`LBYIr-av5Kjx3SWT_?WVk1RqC9Rf8lUwKsAbD>Gg6z z>GylgW>b23k6zy6=xU8O4`qO;jd(ljAS z5{$7JV>p|ffAP(CzQN;%Pf4tg3(YF>X7Y9tu{`u&}c7AWr zKv`BA#}Q{|6Lrq2bCFov24~YW)1#v!SuR&>Y;17nop0)VK9@AjxOrob)6)s#jjG)-xmCY+s}grZpJ=lYiqfL|&G!0S~EcMhPVqvK7%0eIgA zTeCRjf62E`7=3t+kV-p|3y5YZaW7&{O+1b8G#aV3mff8lwUMPQXUUxGGfSfr+_Z-{fd+BXD57a<2_dL&8f;}zg`=Zm`u)C!5SYytzAP)hT$Xz73iL(& zHCH)+*RAkh?-rGIy-8g3ZulEUcg{0u>2vm`q%E^Z_#+ySx z8E=d^{NxxhhI}`tTGoV>;KssWt52gff77=o6xRysv_g%=M-7AN@P#Glg?^G`T2ldW(=;p=D{qVoQG_}d z<9$$7Or(QH*mE9_$%uGzG{W<>&yg(f6f7PbacEqT$%?kxHVugh**Xh)uWhf+G9DM6CzJk zHsl8bbl-FKKj*|ICe%vQbA(jMh6zmooTcn7sWVIUR!lkYs6g5GsEHU%23M^^0s8$u zB7%qn?*nO?N?BGx#G)#irjb#N{c^dqaU4^f2d|AWq-m;vIEPkMqe+r7e;5oTN!n`R zs;WbK*eQpH&n`5dr<)1f(b4huiAy6Prw^xOp~N;3UJvo}5?7oTOPLjQU6P+{67mW; zvqU&J3q;n?Oe&ILgs&BsK{Z^maol4*Dp}?;BA|&%rZT-U0IRAxnY5odXDNyz&B<_ehAYULM;r2?e~==l4@<%wXohJ3gAH~iP_|3Xs4EbM}Kk>aBUA2mdkvYJd8e7s3`r$p`rToWU^ ziX1x1ObNZfVtem+w6M7XX+>P@|~8gXX6MQz3OjBZ1!2O~U4! zXd>8ChmV%{sG_kIf7hPf!Ebs7r@L?>gt)y`PtBCS_=CTEpcvaC@8qs<+b%aSNHY-NLs4xCrNxWCMLV|-3uF6kS& zI0TGwA`(dyIVsCZRSl!jCd=hYqbSp@t?YUI*IL1g`W+n|9sfTgKl#Z|_~8$Kzuh3O zc)AdgOSg9sxftQ-tiw8c@p;p%o34TP4IozreAm4HP9Oh+0Q~TWzhAs^fg5h($4*oZ;i8U?E8Wb=90000< KMNUMnLSTZ64&OWg delta 18591 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 Q5b&d}tgTd}VD|a{05w+Qi~s-t delta 9550 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 diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index 90f9bb7c7fa1282d6e9eea37dc02091904f440be..e5d474f01dd15734314aa8a53233ef1b8c02fd3c 100644 GIT binary patch literal 99896 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�>%>&IBci#7`G;K+6u?w;@>_n*0>8L(@ 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μwO1$2a7@%f|*)d;KKbC|7>nt@|NqJn3oL=TJZ;! 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 AM*si- literal 97490 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

  • None
  • " temp += "
  • *Arrest*
  • " temp += "
  • Incarcerated
  • " - temp += "
  • Parolled
  • " + temp += "
  • Paroled
  • " temp += "
  • Discharged
  • " temp += "" if("rank") @@ -722,8 +722,8 @@ What a mess.*/ active2.fields["criminal"] = "*Arrest*" if("incarcerated") active2.fields["criminal"] = "Incarcerated" - if("parolled") - active2.fields["criminal"] = "Parolled" + if("paroled") + active2.fields["criminal"] = "Paroled" if("released") active2.fields["criminal"] = "Discharged" investigate_log("[active1.fields["name"]] has been set from [old_field] to [active2.fields["criminal"]] by [key_name(usr)].", INVESTIGATE_RECORDS) @@ -803,7 +803,7 @@ What a mess.*/ if(3) R.fields["age"] = rand(5, 85) if(4) - R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Discharged") + R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Paroled", "Discharged") if(5) R.fields["p_stat"] = pick("*Unconscious*", "Active", "Physically Unfit") if(6) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 59bf9f86fd..a709fdbd2a 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -180,7 +180,7 @@ break if(component_check) P.play_tool_sound(src) - var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, 1) + var/obj/machinery/new_machine = new circuit.build_path(loc, 1) new_machine.anchored = anchored new_machine.on_construction() for(var/obj/O in new_machine.component_parts) @@ -219,7 +219,7 @@ req_components[path] -= used_amt else added_components[part] = path - if(replacer.SendSignal(COMSIG_TRY_STORAGE_TAKE, part, src)) + if(SEND_SIGNAL(replacer, COMSIG_TRY_STORAGE_TAKE, part, src)) req_components[path]-- for(var/obj/item/part in added_components) diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index 1c72e79363..5a041e6baa 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -37,7 +37,7 @@ use_power(200) defib.cell.give(180) //90% efficiency, slightly better than the cell charger's 87.5% update_icon() - + /obj/machinery/defibrillator_mount/update_icon() cut_overlays() if(defib) @@ -69,7 +69,7 @@ if(defib) to_chat(user, "There's already a defibrillator in [src]!") return - if(I.flags_1 & NODROP_1 || !user.transferItemToLoc(I, src)) + if(I.item_flags & NODROP || !user.transferItemToLoc(I, src)) to_chat(user, "[I] is stuck to your hand!") return user.visible_message("[user] hooks up [I] to [src]!", \ diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 65d1264030..c108aacdb1 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -192,7 +192,7 @@ /obj/machinery/door/airlock/check_access_ntnet(datum/netdata/data) return !requiresID() || ..() -/obj/machinery/door/airlock/ntnet_recieve(datum/netdata/data) +/obj/machinery/door/airlock/ntnet_receive(datum/netdata/data) // Check if the airlock is powered and can accept control packets. if(!hasPower() || !canAIControl()) return @@ -201,7 +201,7 @@ if(!check_access_ntnet(data)) return - // Handle recieved packet. + // Handle received packet. var/command = lowertext(data.data["data"]) var/command_value = lowertext(data.data["data_secondary"]) switch(command) @@ -1509,7 +1509,7 @@ else if (safe) safe = FALSE else - to_chat(usr, "Firmware reports safeties already overriden.") + to_chat(usr, "Firmware reports safeties already overridden.") . = TRUE if("speed-on") if(wires.is_cut(WIRE_TIMING)) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 8b94648ec9..e169c66c24 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -178,7 +178,7 @@ else if(istype(I, /obj/item/weldingtool)) try_to_weld(I, user) return 1 - else if(!(I.flags_1 & NOBLUDGEON_1) && user.a_intent != INTENT_HARM) + else if(!(I.item_flags & NOBLUDGEON) && user.a_intent != INTENT_HARM) try_to_activate_door(user) return 1 return ..() diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm index 8b9255b5ac..0036b41804 100644 --- a/code/game/machinery/embedded_controller/airlock_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_controller.dm @@ -97,7 +97,7 @@ "sigtype" = "command" )) if(memory["pump_status"] == "siphon") - signal.data["stabalize"] = 1 + signal.data["stabilize"] = 1 else if(memory["pump_status"] != "release") signal.data["power"] = 1 post_signal(signal) diff --git a/code/game/machinery/embedded_controller/simple_vent_controller.dm b/code/game/machinery/embedded_controller/simple_vent_controller.dm index 2a5faef0e1..9901d51074 100644 --- a/code/game/machinery/embedded_controller/simple_vent_controller.dm +++ b/code/game/machinery/embedded_controller/simple_vent_controller.dm @@ -15,7 +15,7 @@ post_signal(new /datum/signal(list( "tag" = airpump_tag, "sigtype" = "command", - "stabalize" = 1, + "stabilize" = 1, "power" = 1 ))) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index d20a1059f9..acc0505256 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -40,7 +40,7 @@ if (src.on && !(stat & NOPOWER) ) var/turf/location = src.loc if (isturf(location)) - location.hotspot_expose(1000,500,1) + location.hotspot_expose(700,10,1) return 1 /obj/machinery/igniter/Initialize() @@ -126,7 +126,7 @@ use_power(1000) var/turf/location = src.loc if (isturf(location)) - location.hotspot_expose(1000,500,1) + location.hotspot_expose(1000,100,1) return 1 /obj/machinery/sparker/emp_act(severity) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index f9dbcc85d5..aa847a4624 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -874,7 +874,7 @@ GLOBAL_LIST_EMPTY(allCasters) say("Breaking news from [channel]!") alert = TRUE update_icon() - addtimer(CALLBACK(src,.proc/remove_alert),alert_delay,TIMER_OVERRIDE) + addtimer(CALLBACK(src,.proc/remove_alert),alert_delay,TIMER_UNIQUE|TIMER_OVERRIDE) playsound(loc, 'sound/machines/twobeep.ogg', 75, 1) else say("Attention! Wanted issue distributed!") diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 2ff0a6758d..82ccadf5cc 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -245,7 +245,7 @@ visible_message("[src]'s door slides open, barraging you with the nauseating smell of charred flesh.") playsound(src, 'sound/machines/airlockclose.ogg', 25, 1) for(var/obj/item/I in src) //Scorches away blood and forensic evidence, although the SSU itself is unaffected - I.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG) + SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG) var/datum/component/radioactive/contamination = I.GetComponent(/datum/component/radioactive) if(contamination) qdel(contamination) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index fb45d6029f..9d151a8dd1 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -509,7 +509,7 @@ w_class = WEIGHT_CLASS_TINY var/timer = 0 var/detonated = 0 - var/existant = 0 + var/existent = 0 /obj/item/syndicatedetonator/attack_self(mob/user) if(timer < world.time) @@ -517,9 +517,9 @@ if(B.active) B.detonation_timer = world.time + BUTTON_DELAY detonated++ - existant++ + existent++ playsound(user, 'sound/machines/click.ogg', 20, 1) - to_chat(user, "[existant] found, [detonated] triggered.") + to_chat(user, "[existent] found, [detonated] triggered.") if(detonated) var/turf/T = get_turf(src) detonated-- @@ -528,7 +528,7 @@ message_admins(log_str) log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [AREACOORD(T)]") detonated = 0 - existant = 0 + existent = 0 timer = world.time + BUTTON_COOLDOWN diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm index a5d9e44e81..97c508573b 100644 --- a/code/game/machinery/telecomms/computers/logbrowser.dm +++ b/code/game/machinery/telecomms/computers/logbrowser.dm @@ -120,7 +120,7 @@ dat += "Data type: Audio File
    " dat += "Source: Unidentifiable
    " dat += "Class: [race]
    " - dat += "Contents: Unintelligble
    " + dat += "Contents: Unintelligible
    " dat += "
    " diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index 7a04869b93..2d737b1f24 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -6,7 +6,7 @@ /obj/machinery/telecomms/allinone name = "telecommunications mainframe" icon_state = "comm_server" - desc = "A compact machine used for portable subspace telecommuniations processing." + desc = "A compact machine used for portable subspace telecommunications processing." density = TRUE use_power = NO_POWER_USE idle_power_usage = 0 diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 4fa40910a8..4c74518937 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -28,8 +28,7 @@ /obj/machinery/transformer/examine(mob/user) . = ..() if(cooldown && (issilicon(user) || isobserver(user))) - var/seconds_remaining = (cooldown_timer - world.time) / 10 - to_chat(user, "It will be ready in [max(0, seconds_remaining)] seconds.") + to_chat(user, "It will be ready in [DisplayTimeText(cooldown_timer - world.time)].") /obj/machinery/transformer/Destroy() QDEL_NULL(countdown) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 8575a6f2dc..56377e5a1f 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -49,7 +49,7 @@ /obj/machinery/washing_machine/proc/wash_cycle() for(var/X in contents) var/atom/movable/AM = X - AM.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) AM.machine_wash(src) busy = FALSE diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 3a047b20a1..bc781d1f07 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -78,6 +78,14 @@ name = "\improper KILL CLAMP" desc = "They won't know what clamped them!" energy_drain = 0 + dam_force = 0 + var/real_clamp = FALSE + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/real + desc = "They won't know what clamped them! This time for real!" + energy_drain = 10 + dam_force = 20 + real_clamp = TRUE /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/action(atom/target) if(!action_checks(target)) @@ -108,11 +116,41 @@ if(M.stat == DEAD) return if(chassis.occupant.a_intent == INTENT_HARM) - target.visible_message("[chassis] destroys [target] in an unholy fury.", \ - "[chassis] destroys [target] in an unholy fury.") - if(chassis.occupant.a_intent == INTENT_DISARM) - target.visible_message("[chassis] rips [target]'s arms off.", \ - "[chassis] rips [target]'s arms off.") + if(real_clamp) + M.take_overall_damage(dam_force) + if(!M) + return + M.adjustOxyLoss(round(dam_force/2)) + M.updatehealth() + target.visible_message("[chassis] destroys [target] in an unholy fury.", \ + "[chassis] destroys [target] in an unholy fury.") + add_logs(chassis.occupant, M, "attacked", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") + else + target.visible_message("[chassis] destroys [target] in an unholy fury.", \ + "[chassis] destroys [target] in an unholy fury.") + else if(chassis.occupant.a_intent == INTENT_DISARM) + if(real_clamp) + var/mob/living/carbon/C = target + var/play_sound = FALSE + var/limbs_gone = "" + var/obj/item/bodypart/affected = C.get_bodypart(BODY_ZONE_L_ARM) + if(affected != null) + affected.dismember(damtype) + play_sound = TRUE + limbs_gone = ", [affected]" + affected = C.get_bodypart(BODY_ZONE_R_ARM) + if(affected != null) + affected.dismember(damtype) + play_sound = TRUE + limbs_gone = "[limbs_gone], [affected]" + if(play_sound) + playsound(src, get_dismember_sound(), 80, TRUE) + target.visible_message("[chassis] rips [target]'s arms off.", \ + "[chassis] rips [target]'s arms off.") + add_logs(chassis.occupant, M, "dismembered of[limbs_gone],", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") + else + target.visible_message("[chassis] rips [target]'s arms off.", \ + "[chassis] rips [target]'s arms off.") else step_away(M,chassis) target.visible_message("[chassis] tosses [target] like a piece of paper.") diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 89330fa006..6c0795028b 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -193,7 +193,7 @@ //Base ballistic weapon type /obj/item/mecha_parts/mecha_equipment/weapon/ballistic - name = "general ballisic weapon" + name = "general ballistic weapon" fire_sound = 'sound/weapons/gunshot.ogg' var/projectiles var/projectile_energy_cost diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 77b26c4ec0..c1f41ac5c5 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -36,7 +36,7 @@ /obj/machinery/mecha_part_fabricator/Initialize() var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0, - FALSE, list(/obj/item/stack), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) + TRUE, list(/obj/item/stack), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) materials.precise_insertion = TRUE stored_research = new return ..() diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index c6ab4ce2f4..936724af9b 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -225,7 +225,7 @@ if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else - user.visible_message("[user] prys the power cell from [parent].", "You pry the power cell from [parent].") + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") if(11) if(diff==FORWARD) user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") @@ -521,7 +521,7 @@ if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else - user.visible_message("[user] prys the power cell from [parent].", "You pry the power cell from [parent].") + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") if(17) if(diff==FORWARD) user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") @@ -747,7 +747,7 @@ if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else - user.visible_message("[user] prys the power cell from [parent].", "You pry the power cell from [parent].") + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") if(11) if(diff==FORWARD) user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") @@ -1164,7 +1164,7 @@ if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else - user.visible_message("[user] prys the power cell from [parent].", "You pry the power cell from [parent].") + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") if(17) if(diff==FORWARD) user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") @@ -1515,7 +1515,7 @@ if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else - user.visible_message("[user] prys the power cell from [parent].", "You pry the power cell from [parent].") + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") if(20) if(diff==FORWARD) user.visible_message("[user] installs the phase armor layer to [parent].", "You install the phase armor layer to [parent].") @@ -1739,7 +1739,7 @@ if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else - user.visible_message("[user] prys the power cell from [parent].", "You pry the power cell from [parent].") + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") if(11) if(diff==FORWARD) user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 0daee24925..3f5e4bde66 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -158,12 +158,12 @@ /obj/item/mecha_parts/part/durand_left_leg name = "\improper Durand left leg" - desc = "A Durand left leg. Built particlarly sturdy to support the Durand's heavy weight and defensive needs." + desc = "A Durand left leg. Built particularly sturdy to support the Durand's heavy weight and defensive needs." icon_state = "durand_l_leg" /obj/item/mecha_parts/part/durand_right_leg name = "\improper Durand right leg" - desc = "A Durand right leg. Built particlarly sturdy to support the Durand's heavy weight and defensive needs." + desc = "A Durand right leg. Built particularly sturdy to support the Durand's heavy weight and defensive needs." icon_state = "durand_r_leg" /obj/item/mecha_parts/part/durand_armor diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 1f789281df..645c13292b 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -5,7 +5,7 @@ /obj/structure/mecha_wreckage name = "exosuit wreckage" - desc = "Remains of some unfortunate mecha. Completely unrepairable, but perhaps something can be salvaged." + desc = "Remains of some unfortunate mecha. Completely irreparable, but perhaps something can be salvaged." icon = 'icons/mecha/mecha.dmi' density = TRUE anchored = FALSE diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 21ecc26905..629de2f697 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -88,6 +88,18 @@ var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill ME.attach(src) +/obj/mecha/working/ripley/deathripley/real + desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE. FOR REAL" + +/obj/mecha/working/ripley/deathripley/real/Initialize() + . = ..() + for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) + E.detach() + qdel(E) + equipment.Cut() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/real + ME.attach(src) + /obj/mecha/working/ripley/mining desc = "An old, dusty mining Ripley." name = "\improper APLU \"Miner\"" diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 3bd1482b3e..9c3df5395f 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -70,7 +70,7 @@ M.throw_alert("buckled", /obj/screen/alert/restrained/buckled) post_buckle_mob(M) - SendSignal(COMSIG_MOVABLE_BUCKLE, M, force) + SEND_SIGNAL(src, COMSIG_MOVABLE_BUCKLE, M, force) return TRUE /obj/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE) @@ -88,7 +88,7 @@ buckled_mob.update_canmove() buckled_mob.clear_alert("buckled") buckled_mobs -= buckled_mob - SendSignal(COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force) + SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force) post_unbuckle_mob(.) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 035fc845c4..36129f4e4f 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -86,9 +86,6 @@ density = FALSE var/boing = 0 -/obj/effect/anomaly/grav/New() - ..() - /obj/effect/anomaly/grav/anomalyEffect() ..() boing = 1 @@ -121,6 +118,20 @@ A.throw_at(target, 5, 1) boing = 0 +/obj/effect/anomaly/grav/high + var/grav_field + +/obj/effect/anomaly/grav/high/Initialize(mapload, new_lifespan) + . = ..() + setup_grav_field() + +/obj/effect/anomaly/grav/high/proc/setup_grav_field() + grav_field = make_field(/datum/proximity_monitor/advanced/gravity, list("current_range" = 7, "host" = src, "gravity_value" = rand(0,3))) + +/obj/effect/anomaly/grav/high/Destroy() + QDEL_NULL(grav_field) + . = ..() + ///////////////////// /obj/effect/anomaly/flux @@ -131,9 +142,6 @@ var/shockdamage = 20 var/explosive = TRUE -/obj/effect/anomaly/flux/New() - ..() - /obj/effect/anomaly/flux/anomalyEffect() ..() canshock = 1 @@ -179,9 +187,6 @@ icon_state = "bluespace" density = TRUE -/obj/effect/anomaly/bluespace/New() - ..() - /obj/effect/anomaly/bluespace/anomalyEffect() ..() for(var/mob/living/M in range(1,src)) @@ -252,9 +257,6 @@ icon_state = "mustard" var/ticks = 0 -/obj/effect/anomaly/pyro/New() - ..() - /obj/effect/anomaly/pyro/anomalyEffect() ..() ticks++ @@ -287,9 +289,6 @@ icon_state = "bhole3" desc = "That's a nice station you have there. It'd be a shame if something happened to it." -/obj/effect/anomaly/bhole/New() - ..() - /obj/effect/anomaly/bhole/anomalyEffect() ..() if(!isturf(loc)) //blackhole cannot be contained inside anything. Weird stuff might happen diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 31ca7dd307..d76a335888 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -31,7 +31,7 @@ poster_structure = null . = ..() -// These icon_states may be overriden, but are for mapper's convinence +// These icon_states may be overridden, but are for mapper's convinence /obj/item/poster/random_contraband name = "random contraband poster" poster_type = /obj/structure/sign/poster/contraband/random @@ -127,7 +127,7 @@ // Deny placing posters on currently-diagonal walls, although the wall may change in the future. if (smooth & SMOOTH_DIAGONAL) - for (var/O in our_overlays) + for (var/O in overlays) var/image/I = O if (copytext(I.icon_state, 1, 3) == "d-") return @@ -547,7 +547,7 @@ /obj/structure/sign/poster/official/anniversary_vintage_reprint name = "50th Anniversary Vintage Reprint" - desc = "A reprint of a poster from 2505, commemorating the 50th Aniversery of Nanoposters Manufacturing, a subsidary of Nanotrasen." + desc = "A reprint of a poster from 2505, commemorating the 50th Anniversary of Nanoposters Manufacturing, a subsidiary of Nanotrasen." icon_state = "poster26_legit" /obj/structure/sign/poster/official/fruit_bowl diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index 1165ee50a0..8cb48d1874 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -5,14 +5,14 @@ And maybe we'll come back\n\ To Earth, who can tell?" - var/displayed_text - var/atom/attached_to - color = "#ff0000" - var/text_size = 4 - var/started = FALSE invisibility = INVISIBILITY_OBSERVER anchored = TRUE layer = GHOST_LAYER + color = "#ff0000" // text color + var/text_size = 3 // larger values clip when the displayed text is larger than 2 digits. + var/started = FALSE + var/displayed_text + var/atom/attached_to /obj/effect/countdown/Initialize() . = ..() @@ -135,7 +135,6 @@ /obj/effect/countdown/doomsday name = "doomsday countdown" - text_size = 3 /obj/effect/countdown/doomsday/get_value() var/obj/machinery/doomsday_device/DD = attached_to diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 472261003f..75aeaa447c 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -289,7 +289,7 @@ if(M) more = "[ADMIN_LOOKUPFLW(M)] " message_admins("Smoke: ([whereLink])[contained]. Key: [more ? more : carry.my_atom.fingerprintslast].") - log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].") + log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last touched by [carry.my_atom.fingerprintslast].") else message_admins("Smoke: ([whereLink])[contained]. No associated key.") log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.") diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm index 8453b6438d..49f82e106d 100644 --- a/code/game/objects/effects/effect_system/effects_sparks.dm +++ b/code/game/objects/effects/effect_system/effects_sparks.dm @@ -28,20 +28,20 @@ playsound(src.loc, "sparks", 100, 1) var/turf/T = loc if(isturf(T)) - T.hotspot_expose(1000,100) + T.hotspot_expose(700,5) QDEL_IN(src, 20) /obj/effect/particle_effect/sparks/Destroy() var/turf/T = loc if(isturf(T)) - T.hotspot_expose(1000,100) + T.hotspot_expose(700,1) return ..() /obj/effect/particle_effect/sparks/Move() ..() var/turf/T = loc if(isturf(T)) - T.hotspot_expose(1000,100) + T.hotspot_expose(700,1) /datum/effect_system/spark_spread effect_type = /obj/effect/particle_effect/sparks diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 2ae4f5e5c5..4bca817e73 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -131,7 +131,7 @@ var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc) add_logs(victim, null, "entered a blood frenzy") - chainsaw.flags_1 |= NODROP_1 + chainsaw.item_flags |= NODROP victim.drop_all_held_items() victim.put_in_hands(chainsaw, forced = TRUE) chainsaw.attack_self(victim) diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm index 637539e0b1..8cd23f2cf8 100644 --- a/code/game/objects/effects/proximity.dm +++ b/code/game/objects/effects/proximity.dm @@ -1,6 +1,6 @@ /datum/proximity_monitor var/atom/host //the atom we are tracking - var/atom/hasprox_reciever //the atom that will recieve HasProximity calls. + var/atom/hasprox_receiver //the atom that will receive HasProximity calls. var/atom/last_host_loc var/list/checkers //list of /obj/effect/abstract/proximity_checkers var/current_range @@ -16,9 +16,9 @@ /datum/proximity_monitor/proc/SetHost(atom/H,atom/R) if(R) - hasprox_reciever = R - else if(hasprox_reciever == host) //Default case - hasprox_reciever = H + hasprox_receiver = R + else if(hasprox_receiver == host) //Default case + hasprox_receiver = H host = H last_host_loc = host.loc if(movement_tracker) @@ -29,7 +29,7 @@ /datum/proximity_monitor/Destroy() host = null last_host_loc = null - hasprox_reciever = null + hasprox_receiver = null QDEL_LIST(checkers) QDEL_NULL(movement_tracker) return ..() @@ -43,7 +43,7 @@ SetRange(curr_range, TRUE) if(curr_range) testing("HasProx: [host] -> [host]") - hasprox_reciever.HasProximity(host) //if we are processing, we're guaranteed to be a movable + hasprox_receiver.HasProximity(host) //if we are processing, we're guaranteed to be a movable /datum/proximity_monitor/proc/SetRange(range, force_rebuild = FALSE) if(!force_rebuild && range == current_range) @@ -109,4 +109,4 @@ /obj/effect/abstract/proximity_checker/Crossed(atom/movable/AM) set waitfor = FALSE - monitor.hasprox_reciever.HasProximity(AM) + monitor.hasprox_receiver.HasProximity(AM) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 723852f162..293809efd2 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -142,7 +142,7 @@ return var/obj/machinery/atmospherics/components/unary/vent_pump/exit_vent = pick(vents) if(prob(50)) - visible_message("[src] scrambles into the ventillation ducts!", \ + visible_message("[src] scrambles into the ventilation ducts!", \ "You hear something scampering through the ventilation ducts.") spawn(rand(20,60)) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 0203cb66c3..7d02d9d383 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -358,6 +358,29 @@ pixel_y = rand(-4,4) animate(src, pixel_y = pixel_y + 32, alpha = 0, time = 25) +/obj/effect/temp_visual/love_heart + name = "love heart" + icon = 'icons/effects/effects.dmi' + icon_state = "heart" + duration = 25 + +/obj/effect/temp_visual/love_heart/Initialize(mapload) + . = ..() + pixel_x = rand(-10,10) + pixel_y = rand(-10,10) + animate(src, pixel_y = pixel_y + 32, alpha = 0, time = duration) + +/obj/effect/temp_visual/love_heart/invisible + icon_state = null + +/obj/effect/temp_visual/love_heart/invisible/Initialize(mapload, mob/seer) + . = ..() + var/image/I = image(icon = 'icons/effects/effects.dmi', icon_state = "heart", layer = ABOVE_MOB_LAYER, loc = src) + add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/onePerson, "heart", I, seer) + I.alpha = 255 + I.appearance_flags = RESET_ALPHA + animate(I, alpha = 0, time = duration) + /obj/effect/temp_visual/bleed name = "bleed" icon = 'icons/effects/bleed.dmi' diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm index ca7d8ae0d7..abda070f5e 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -15,7 +15,7 @@ icon_state = "impact_omni" /obj/effect/projectile/impact/xray - name = "xray impact" + name = "\improper X-ray impact" icon_state = "impact_xray" /obj/effect/projectile/impact/pulse diff --git a/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm b/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm index f161667843..30dd3dc811 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm @@ -8,7 +8,6 @@ light_range = 2 light_color = "#00ffff" mouse_opacity = MOUSE_OPACITY_TRANSPARENT - flags_1 = ABSTRACT_1 appearance_flags = 0 /obj/effect/projectile/singularity_pull() diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index f89674e282..12f56585d9 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -24,7 +24,7 @@ icon_state = "beam_omni" /obj/effect/projectile/tracer/xray - name = "xray laser" + name = "\improper X-ray laser" icon_state = "xray" /obj/effect/projectile/tracer/pulse diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 9da8946429..2261cfa2c1 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -137,7 +137,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) stack_trace("Invalid type [embedding.type] found in .embedding during /obj/item Initialize()") /obj/item/Destroy() - flags_1 &= ~DROPDEL_1 //prevent reqdels + item_flags &= ~DROPDEL //prevent reqdels if(ismob(loc)) var/mob/m = loc m.temporarilyRemoveItemFromInventory(src, TRUE) @@ -277,8 +277,17 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(!(interaction_flags_item & INTERACT_ITEM_ATTACK_HAND_PICKUP)) //See if we're supposed to auto pickup. return + //Heavy gravity makes picking up things very slow. + var/grav = user.has_gravity() + if(grav > STANDARD_GRAVITY) + var/grav_power = min(3,grav - STANDARD_GRAVITY) + to_chat(user,"You start picking up [src]...") + if(!do_mob(user,src,30*grav_power)) + return + + //If the item is in a storage item, take it out - loc.SendSignal(COMSIG_TRY_STORAGE_TAKE, src, user.loc, TRUE) + SEND_SIGNAL(loc, COMSIG_TRY_STORAGE_TAKE, src, user.loc, TRUE) if(throwing) throwing.finalize(FALSE) @@ -300,7 +309,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(anchored) return - loc.SendSignal(COMSIG_TRY_STORAGE_TAKE, src, user.loc, TRUE) + SEND_SIGNAL(loc, COMSIG_TRY_STORAGE_TAKE, src, user.loc, TRUE) if(throwing) throwing.finalize(FALSE) @@ -351,14 +360,14 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) for(var/X in actions) var/datum/action/A = X A.Remove(user) - if(DROPDEL_1 & flags_1) + if(item_flags & DROPDEL) qdel(src) item_flags &= ~IN_INVENTORY - SendSignal(COMSIG_ITEM_DROPPED,user) + SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user) // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) - SendSignal(COMSIG_ITEM_PICKUP, user) + SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user) item_flags |= IN_INVENTORY // called when "found" in pockets and storage items. Returns 1 if the search should end. @@ -371,7 +380,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // for items that can be placed in multiple slots // note this isn't called during the initial dressing of a player /obj/item/proc/equipped(mob/user, slot) - SendSignal(COMSIG_ITEM_EQUIPPED, user, slot) + SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot) for(var/X in actions) var/datum/action/A = X if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot. @@ -472,7 +481,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) else M.take_bodypart_damage(7) - M.SendSignal(COMSIG_ADD_MOOD_EVENT, "eye_stab", /datum/mood_event/eye_stab) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "eye_stab", /datum/mood_event/eye_stab) add_logs(user, M, "attacked", "[src.name]", "(INTENT: [uppertext(user.a_intent)])") @@ -508,7 +517,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/throw_impact(atom/A, datum/thrownthing/throwingdatum) if(A && !QDELETED(A)) - SendSignal(COMSIG_MOVABLE_IMPACT, A, throwingdatum) + SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, A, throwingdatum) if(is_hot() && isliving(A)) var/mob/living/L = A L.IgniteMob() @@ -532,8 +541,8 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/proc/remove_item_from_storage(atom/newLoc) //please use this if you're going to snowflake an item out of a obj/item/storage if(!newLoc) return FALSE - if(loc.SendSignal(COMSIG_CONTAINS_STORAGE)) - return loc.SendSignal(COMSIG_TRY_STORAGE_TAKE, src, newLoc, TRUE) + if(SEND_SIGNAL(loc, COMSIG_CONTAINS_STORAGE)) + return SEND_SIGNAL(loc, COMSIG_TRY_STORAGE_TAKE, src, newLoc, TRUE) return FALSE /obj/item/proc/get_belt_overlay() //Returns the icon used for overlaying the object on a belt @@ -596,7 +605,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(success) location = get_turf(M) if(isturf(location)) - location.hotspot_expose(flame_heat, 5) + location.hotspot_expose(flame_heat, 1) /obj/item/proc/ignition_effect(atom/A, mob/user) if(is_hot()) @@ -780,3 +789,8 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) appearance_flags &= ~NO_CLIENT_COLOR dropped(M) return ..() + +/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) + if (item_flags & NODROP) + return + return ..() diff --git a/code/game/objects/items/AI_modules.dm b/code/game/objects/items/AI_modules.dm index 5d41b90dc0..0dfbecf92d 100644 --- a/code/game/objects/items/AI_modules.dm +++ b/code/game/objects/items/AI_modules.dm @@ -193,7 +193,7 @@ AI MODULES /obj/item/aiModule/zeroth/oneHuman/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) if(..()) - return "[targetName], but the AI's existing law 0 cannot be overriden." + return "[targetName], but the AI's existing law 0 cannot be overridden." return targetName diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 5aeefc2fcd..03225102c2 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -15,7 +15,8 @@ RLD opacity = 0 density = FALSE anchored = FALSE - flags_1 = CONDUCT_1 | NOBLUDGEON_1 + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON force = 0 throwforce = 10 throw_speed = 3 @@ -129,7 +130,7 @@ RLD lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' max_matter = 160 - item_flags = NO_MAT_REDEMPTION + item_flags = NO_MAT_REDEMPTION | NOBLUDGEON has_ammobar = TRUE var/mode = 1 var/ranged = FALSE diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index b894cf8ee5..95638ad5e2 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -13,7 +13,7 @@ RSF opacity = 0 density = FALSE anchored = FALSE - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) var/matter = 0 var/mode = 1 diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 82c272e7f9..afb2b22076 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -9,7 +9,8 @@ materials = list(MAT_METAL=50, MAT_GLASS=50) - flags_1 = CONDUCT_1 | NOBLUDGEON_1 + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_BELT usesound = 'sound/effects/spray2.ogg' diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index bfbb7e67bb..109078f804 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -49,7 +49,7 @@ change_appearance(I, user) return // Why yes, this does closely resemble mob and object attack code. - if(I.flags_1 & NOBLUDGEON_1) + if(I.item_flags & NOBLUDGEON) return if(!I.force) playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), 1, -1) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 2d30a015e2..227d4b5358 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -78,8 +78,7 @@ item_state = "card-id" lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - flags_1 = NOBLUDGEON_1 - item_flags = NO_MAT_REDEMPTION + item_flags = NO_MAT_REDEMPTION | NOBLUDGEON var/prox_check = TRUE //If the emag requires you to be in range /obj/item/card/emag/bluespace @@ -98,7 +97,7 @@ A.emag_act(user) /obj/item/card/emagfake - desc = "It's a card with a magnetic strip attached to some circuitry." + desc = "It's a card with a magnetic strip attached to some circuitry. Closer inspection shows that this card is a poorly made replica, with a \"DonkCo\" logo stamped on the back." name = "cryptographic sequencer" icon_state = "emag" item_state = "card-id" diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index d861b515f8..24c48ccecd 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -48,7 +48,7 @@ icon_state = "chronogun" item_state = "chronogun" w_class = WEIGHT_CLASS_NORMAL - flags_1 = NODROP_1 | DROPDEL_1 + item_flags = NODROP | DROPDEL ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam) can_charge = 0 fire_delay = 50 diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 15cb7ae0b3..e28d86e7e6 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -575,7 +575,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/hitzone = user.held_index_to_dir(user.active_hand_index) == "r" ? BODY_ZONE_PRECISE_R_HAND : BODY_ZONE_PRECISE_L_HAND user.apply_damage(5, BURN, hitzone) user.visible_message("After a few attempts, [user] manages to light [src] - however, [user.p_they()] burn [user.p_their()] finger in the process.", "You burn yourself while lighting the lighter!") - user.SendSignal(COMSIG_ADD_MOOD_EVENT, "burnt_thumb", /datum/mood_event/burnt_thumb) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "burnt_thumb", /datum/mood_event/burnt_thumb) else set_lit(FALSE) diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 6bef0499fd..8d91b3855a 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -215,37 +215,36 @@ name = "Booze-O-Mat Vendor (Machine Board)" desc = "You can turn the \"brand selection\" dial using a screwdriver." build_path = /obj/machinery/vending/boozeomat - req_components = list( - /obj/item/vending_refill/boozeomat = 3) + req_components = list(/obj/item/vending_refill/boozeomat = 1) - var/static/list/vending_names_paths = list(/obj/machinery/vending/boozeomat = "Booze-O-Mat", - /obj/machinery/vending/coffee = "Solar's Best Hot Drinks", - /obj/machinery/vending/snack = "Getmore Chocolate Corp", - /obj/machinery/vending/cola = "Robust Softdrinks", - /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", - /obj/machinery/vending/games = "\improper Good Clean Fun", - /obj/machinery/vending/autodrobe = "AutoDrobe", - /obj/machinery/vending/wardrobe/sec_wardrobe = "SecDrobe", - /obj/machinery/vending/wardrobe/medi_wardrobe = "MediDrobe", - /obj/machinery/vending/wardrobe/engi_wardrobe = "EngiDrobe", - /obj/machinery/vending/wardrobe/atmos_wardrobe = "AtmosDrobe", - /obj/machinery/vending/wardrobe/cargo_wardrobe = "CargoDrobe", - /obj/machinery/vending/wardrobe/robo_wardrobe = "RoboDrobe", - /obj/machinery/vending/wardrobe/science_wardrobe = "SciDrobe", - /obj/machinery/vending/wardrobe/hydro_wardrobe = "HyDrobe", - /obj/machinery/vending/wardrobe/curator_wardrobe = "CuraDrobe", - /obj/machinery/vending/wardrobe/bar_wardrobe = "BarDrobe", - /obj/machinery/vending/wardrobe/chef_wardrobe = "ChefDrobe", - /obj/machinery/vending/wardrobe/jani_wardrobe = "JaniDrobe", - /obj/machinery/vending/wardrobe/law_wardrobe = "LawDrobe", - /obj/machinery/vending/wardrobe/chap_wardrobe = "ChapDrobe", - /obj/machinery/vending/wardrobe/chem_wardrobe = "ChemDrobe", - /obj/machinery/vending/wardrobe/gene_wardrobe = "GeneDrobe", - /obj/machinery/vending/wardrobe/viro_wardrobe = "ViroDrobe", - /obj/machinery/vending/clothing = "ClothesMate", - /obj/machinery/vending/medical = "NanoMed Plus", - /obj/machinery/vending/wallmed = "NanoMed") - needs_anchored = FALSE + var/static/list/vending_names_paths = list( + /obj/machinery/vending/boozeomat = "Booze-O-Mat", + /obj/machinery/vending/coffee = "Solar's Best Hot Drinks", + /obj/machinery/vending/snack = "Getmore Chocolate Corp", + /obj/machinery/vending/cola = "Robust Softdrinks", + /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", + /obj/machinery/vending/games = "\improper Good Clean Fun", + /obj/machinery/vending/autodrobe = "AutoDrobe", + /obj/machinery/vending/wardrobe/sec_wardrobe = "SecDrobe", + /obj/machinery/vending/wardrobe/medi_wardrobe = "MediDrobe", + /obj/machinery/vending/wardrobe/engi_wardrobe = "EngiDrobe", + /obj/machinery/vending/wardrobe/atmos_wardrobe = "AtmosDrobe", + /obj/machinery/vending/wardrobe/cargo_wardrobe = "CargoDrobe", + /obj/machinery/vending/wardrobe/robo_wardrobe = "RoboDrobe", + /obj/machinery/vending/wardrobe/science_wardrobe = "SciDrobe", + /obj/machinery/vending/wardrobe/hydro_wardrobe = "HyDrobe", + /obj/machinery/vending/wardrobe/curator_wardrobe = "CuraDrobe", + /obj/machinery/vending/wardrobe/bar_wardrobe = "BarDrobe", + /obj/machinery/vending/wardrobe/chef_wardrobe = "ChefDrobe", + /obj/machinery/vending/wardrobe/jani_wardrobe = "JaniDrobe", + /obj/machinery/vending/wardrobe/law_wardrobe = "LawDrobe", + /obj/machinery/vending/wardrobe/chap_wardrobe = "ChapDrobe", + /obj/machinery/vending/wardrobe/chem_wardrobe = "ChemDrobe", + /obj/machinery/vending/wardrobe/gene_wardrobe = "GeneDrobe", + /obj/machinery/vending/wardrobe/viro_wardrobe = "ViroDrobe", + /obj/machinery/vending/clothing = "ClothesMate", + /obj/machinery/vending/medical = "NanoMed Plus", + /obj/machinery/vending/wallmed = "NanoMed") /obj/item/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) @@ -261,7 +260,7 @@ /obj/item/circuitboard/machine/vendor/proc/set_type(obj/machinery/vending/typepath) build_path = typepath name = "[vending_names_paths[build_path]] Vendor (Machine Board)" - req_components = list(initial(typepath.refill_canister) = initial(typepath.refill_count)) + req_components = list(initial(typepath.refill_canister) = 1) /obj/item/circuitboard/machine/vendor/apply_default_parts(obj/machinery/M) for(var/typepath in vending_names_paths) @@ -865,14 +864,14 @@ build_path = /obj/machinery/vending/donksofttoyvendor req_components = list( /obj/item/stack/sheet/glass = 1, - /obj/item/vending_refill/donksoft = 3) + /obj/item/vending_refill/donksoft = 1) /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor name = "Syndicate Donksoft Toy Vendor (Machine Board)" build_path = /obj/machinery/vending/toyliberationstation req_components = list( /obj/item/stack/sheet/glass = 1, - /obj/item/vending_refill/donksoft = 3) + /obj/item/vending_refill/donksoft = 1) /obj/item/circuitboard/machine/dish_drive name = "Dish Drive (Machine Board)" diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index cd70ce6732..70b0d93344 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -19,7 +19,7 @@ lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' w_class = WEIGHT_CLASS_TINY - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON throwforce = 0 throw_speed = 3 throw_range = 7 @@ -61,7 +61,7 @@ return //I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing. //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn - target.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) + SEND_SIGNAL(target, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) if(user.client && ((target in user.client.screen) && !user.is_holding(target))) to_chat(user, "You need to take that [target.name] off before cleaning it!") else if(istype(target, /obj/effect/decal/cleanable)) @@ -88,7 +88,7 @@ var/obj/effect/decal/cleanable/C = locate() in target qdel(C) target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - target.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(target, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) target.wash_cream() return @@ -117,7 +117,7 @@ AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50) /obj/item/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user) - M.SendSignal(COMSIG_ADD_MOOD_EVENT, "honk", /datum/mood_event/honk) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "honk", /datum/mood_event/honk) return ..() /obj/item/bikehorn/suicide_act(mob/user) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index db86adab07..389934b778 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -19,7 +19,7 @@ GLOBAL_LIST_EMPTY(PDAs) item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) @@ -175,12 +175,12 @@ GLOBAL_LIST_EMPTY(PDAs) return attack_self(M) return ..() -/obj/item/pda/attack_self(mob/user) +/obj/item/pda/interact(mob/user) if(!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") return - . = ..() + ..() var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/simple/pda) assets.send(user) @@ -519,16 +519,11 @@ GLOBAL_LIST_EMPTY(PDAs) if("Ringtone") var/t = input(U, "Please enter new ringtone", name, ttone) as text if(in_range(src, U) && loc == U && t) - GET_COMPONENT(hidden_uplink, /datum/component/uplink) - if(hidden_uplink && (trim(lowertext(t)) == trim(lowertext(lock_code)))) - hidden_uplink.locked = FALSE - hidden_uplink.interact(U) - to_chat(U, "The PDA softly beeps.") + if(SEND_SIGNAL(src, COMSIG_PDA_CHANGE_RINGTONE, U, t) & COMPONENT_STOP_RINGTONE_CHANGE) U << browse(null, "window=pda") - src.mode = 0 + return else - t = copytext(sanitize(t), 1, 20) - ttone = t + ttone = copytext(sanitize(t), 1, 20) else U << browse(null, "window=pda") return diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 4dc5fb166a..217295c872 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -549,7 +549,7 @@ Code: /obj/item/cartridge/Topic(href, href_list) ..() - if (!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + if(!usr.canUseTopic(src, !issilicon(usr))) usr.unset_machine() usr << browse(null, "window=pda") return diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index c1de90f3f0..740f22edb4 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -8,7 +8,7 @@ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' w_class = WEIGHT_CLASS_SMALL slot_flags = ITEM_SLOT_BELT - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON var/flush = FALSE var/mob/living/silicon/ai/AI diff --git a/code/game/objects/items/devices/anomaly_neutralizer.dm b/code/game/objects/items/devices/anomaly_neutralizer.dm index c719059631..ca018a041f 100644 --- a/code/game/objects/items/devices/anomaly_neutralizer.dm +++ b/code/game/objects/items/devices/anomaly_neutralizer.dm @@ -8,7 +8,7 @@ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' w_class = WEIGHT_CLASS_SMALL slot_flags = ITEM_SLOT_BELT - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON /obj/item/anomaly_neutralizer/afterattack(atom/target, mob/user, proximity) ..() diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 64a64853b1..e88b906862 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -14,7 +14,7 @@ item_state = "camera_bug" throw_speed = 4 throw_range = 20 - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON var/obj/machinery/camera/current = null diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 990d6cc038..6544a883f3 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -2,7 +2,8 @@ name = "chameleon-projector" icon = 'icons/obj/device.dmi' icon_state = "shield0" - flags_1 = CONDUCT_1 | NOBLUDGEON_1 + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_BELT item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' @@ -49,7 +50,7 @@ return if(iseffect(target)) if(!(istype(target, /obj/effect/decal))) //be a footprint - return + return playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, 1, -6) to_chat(user, "Scanned [target].") var/obj/temp = new/obj() diff --git a/code/game/objects/items/devices/doorCharge.dm b/code/game/objects/items/devices/doorCharge.dm index 6fa1b9d742..9b009da7a4 100644 --- a/code/game/objects/items/devices/doorCharge.dm +++ b/code/game/objects/items/devices/doorCharge.dm @@ -9,7 +9,7 @@ w_class = WEIGHT_CLASS_SMALL throw_range = 4 throw_speed = 1 - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON force = 3 attack_verb = list("blown up", "exploded", "detonated") materials = list(MAT_METAL=50, MAT_GLASS=30) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 3386b975e3..fee2461760 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -85,7 +85,7 @@ "You direct [src] to [M]'s eyes.") if(M.stat == DEAD || (M.has_trait(TRAIT_BLIND)) || !M.flash_act(visual = 1)) //mob is dead or fully blind to_chat(user, "[M]'s pupils don't react to the light!") - else if(M.dna && M.dna.check_mutation(XRAY)) //mob has X-RAY vision + else if(M.dna && M.dna.check_mutation(XRAY)) //mob has X-ray vision to_chat(user, "[M]'s pupils give an eerie glow!") else //they're okay! to_chat(user, "[M]'s pupils narrow.") @@ -399,6 +399,11 @@ to_chat(user, "\The [src] needs time to recharge!") return +/obj/item/flashlight/emp/debug //for testing emp_act() + name = "debug EMP flashlight" + emp_max_charges = 100 + emp_cur_charges = 100 + // Glowsticks, in the uncomfortable range of similar to flares, // but not similar enough to make it worth a refactor /obj/item/flashlight/glowstick @@ -530,5 +535,6 @@ desc = "This shouldn't exist outside of someone's head, how are you seeing this?" brightness_on = 15 flashlight_power = 1 - flags_1 = CONDUCT_1 | DROPDEL_1 + flags_1 = CONDUCT_1 + item_flags = DROPDEL actions_types = list() diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index bb0914eeec..d8dce7c427 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -5,7 +5,7 @@ icon_state = "signmaker_engi" slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_SMALL - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' @@ -105,4 +105,4 @@ /obj/structure/projected_forcefield/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) if(sound_effect) play_attack_sound(damage_amount, damage_type, damage_flag) - generator.shield_integrity = max(generator.shield_integrity - damage_amount, 0) \ No newline at end of file + generator.shield_integrity = max(generator.shield_integrity - damage_amount, 0) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 1b4bb55f99..fb4f4f8566 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -9,7 +9,7 @@ #define RAD_GRACE_PERIOD 2 /obj/item/geiger_counter //DISCLAIMER: I know nothing about how real-life Geiger counters work. This will not be realistic. ~Xhuis - name = "geiger counter" + name = "\improper Geiger counter" desc = "A handheld device used for detecting and measuring radiation pulses." icon = 'icons/obj/device.dmi' icon_state = "geiger_off" diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 9bdd01ad77..c362d9f7f2 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -34,7 +34,7 @@ GLOBAL_LIST_EMPTY(GPS_list) emped = TRUE cut_overlay("working") add_overlay("emp") - addtimer(CALLBACK(src, .proc/reboot), 300, TIMER_OVERRIDE) //if a new EMP happens, remove the old timer so it doesn't reactivate early + addtimer(CALLBACK(src, .proc/reboot), 300, TIMER_UNIQUE|TIMER_OVERRIDE) //if a new EMP happens, remove the old timer so it doesn't reactivate early SStgui.close_uis(src) //Close the UI control if it is open. /obj/item/gps/proc/reboot() @@ -156,11 +156,11 @@ GLOBAL_LIST_EMPTY(GPS_list) icon_state = "gps-b" gpstag = "BORG0" desc = "A mining cyborg internal positioning system. Used as a recovery beacon for damaged cyborg assets, or a collaboration tool for mining teams." - flags_1 = NODROP_1 + item_flags = NODROP /obj/item/gps/internal icon_state = null - flags_1 = ABSTRACT_1 + item_flags = ABSTRACT gpstag = "Eerie Signal" desc = "Report to a coder immediately." invisibility = INVISIBILITY_MAXIMUM diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 32a266dbfb..f9ea6a6be4 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -5,7 +5,8 @@ icon_state = "pointer" item_state = "pen" var/pointer_icon_state - flags_1 = CONDUCT_1 | NOBLUDGEON_1 + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_BELT materials = list(MAT_METAL=500, MAT_GLASS=500) w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 750e2a9a9b..a59fa11fa6 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -41,7 +41,7 @@ /obj/item/lightreplacer name = "light replacer" - desc = "A device to automatically replace lights. Refill with broken or working lightbulbs, or sheets of glass." + desc = "A device to automatically replace lights. Refill with broken or working light bulbs, or sheets of glass." icon = 'icons/obj/janitor.dmi' icon_state = "lightreplacer0" diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index e11cebdf51..43c2b06d44 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -60,7 +60,7 @@ to_chat(user, "Wiring \the [selected_io.holder]'s [selected_io.name] into itself is rather pointless.") return if(io.io_type != selected_io.io_type) - to_chat(user, "Those two types of channels are incompatable. The first is a [selected_io.io_type], \ + to_chat(user, "Those two types of channels are incompatible. The first is a [selected_io.io_type], \ while the second is a [io.io_type].") return if(io.holder.assembly && io.holder.assembly != selected_io.holder.assembly) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 737f71a978..0867033aad 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -155,5 +155,5 @@ . = ..() if (. & EMP_PROTECT_SELF) return - if(pai) + if(pai && !pai.holoform) pai.emp_act(severity) diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index a13de183a0..6415b105b5 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "labeler1" item_state = "flight" - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON var/paint_color = "grey" materials = list(MAT_METAL=5000, MAT_GLASS=2000) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 1734fa5bfb..2f8b111b4b 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -53,8 +53,8 @@ user.put_in_hands(A) A.add_fingerprint(user) - if(src.flags_1 & NODROP_1) - A.flags_1 |= NODROP_1 + if(item_flags & NODROP) + A.item_flags |= NODROP else return ..() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index b4783d059e..6a6d34340e 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -47,6 +47,7 @@ return BRUTELOSS /obj/item/radio/proc/set_frequency(new_frequency) + SEND_SIGNAL(src, COMSIG_RADIO_NEW_FREQUENCY, args) remove_radio(src, frequency) frequency = add_radio(src, new_frequency) @@ -100,12 +101,11 @@ AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES) /obj/item/radio/interact(mob/user) - if (..()) - return if(unscrewed && !isAI(user)) wires.interact(user) + add_fingerprint(user) else - ui_interact(user) + ..() /obj/item/radio/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.inventory_state) @@ -160,13 +160,7 @@ tune = tune * 10 . = TRUE if(.) - frequency = sanitize_frequency(tune, freerange) - set_frequency(frequency) - GET_COMPONENT(hidden_uplink, /datum/component/uplink) - if(hidden_uplink && (frequency == traitor_frequency)) - hidden_uplink.locked = FALSE - hidden_uplink.interact(usr) - ui.close() + set_frequency(sanitize_frequency(tune, freerange)) if("listen") listening = !listening . = TRUE diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm index 4dc8d04267..2f137861aa 100644 --- a/code/game/objects/items/devices/reverse_bear_trap.dm +++ b/code/game/objects/items/devices/reverse_bear_trap.dm @@ -49,7 +49,7 @@ if(iscarbon(user)) var/mob/living/carbon/C = user if(C.get_item_by_slot(SLOT_HEAD) == src) - if(flags_1 & NODROP_1 && !struggling) + if((item_flags & NODROP) && !struggling) struggling = TRUE var/fear_string switch(time_left) @@ -74,7 +74,7 @@ else user.visible_message("The lock on [user]'s [name] pops open!", \ "You force open the padlock!", "You hear a single, pronounced click!") - flags_1 &= ~NODROP_1 + item_flags &= ~NODROP struggling = FALSE else ..() @@ -116,7 +116,7 @@ /obj/item/reverse_bear_trap/proc/reset() ticking = FALSE - flags_1 &= ~NODROP_1 + item_flags &= ~NODROP soundloop.stop() soundloop2.stop() STOP_PROCESSING(SSprocessing, src) @@ -125,7 +125,7 @@ ticking = TRUE escape_chance = initial(escape_chance) //we keep these vars until re-arm, for tracking purposes time_left = initial(time_left) - flags_1 |= NODROP_1 + item_flags |= NODROP soundloop.start() soundloop2.mid_length = initial(soundloop2.mid_length) soundloop2.start() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 327af15f43..6acff297c9 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -68,7 +68,8 @@ SLIME SCANNER lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' desc = "A hand-held body scanner able to distinguish vital signs of the subject." - flags_1 = CONDUCT_1 | NOBLUDGEON_1 + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_BELT throwforce = 3 w_class = WEIGHT_CLASS_TINY @@ -256,7 +257,32 @@ SLIME SCANNER // Species and body temperature if(ishuman(M)) var/mob/living/carbon/human/H = M - to_chat(user, "Species: [H.dna.species.name]") + var/datum/species/S = H.dna.species + var/mutant = FALSE + if (H.dna.check_mutation(HULK)) + mutant = TRUE + else if (S.mutantlungs != initial(S.mutantlungs)) + mutant = TRUE + else if (S.mutant_brain != initial(S.mutant_brain)) + mutant = TRUE + else if (S.mutant_heart != initial(S.mutant_heart)) + mutant = TRUE + else if (S.mutanteyes != initial(S.mutanteyes)) + mutant = TRUE + else if (S.mutantears != initial(S.mutantears)) + mutant = TRUE + else if (S.mutanthands != initial(S.mutanthands)) + mutant = TRUE + else if (S.mutanttongue != initial(S.mutanttongue)) + mutant = TRUE + else if (S.mutanttail != initial(S.mutanttail)) + mutant = TRUE + else if (S.mutantliver != initial(S.mutantliver)) + mutant = TRUE + else if (S.mutantstomach != initial(S.mutantstomach)) + mutant = TRUE + + to_chat(user, "Species: [S.name][mutant ? "-derived mutant" : ""]") to_chat(user, "Body temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)") // Time of death @@ -348,7 +374,8 @@ SLIME SCANNER lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' w_class = WEIGHT_CLASS_SMALL - flags_1 = CONDUCT_1 | NOBLUDGEON_1 + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_BELT throwforce = 0 throw_speed = 3 @@ -428,7 +455,7 @@ SLIME SCANNER if(user.canUseTopic(src)) if(cooldown) - to_chat(user, "[src]'s barometer function is prepraring itself.") + to_chat(user, "[src]'s barometer function is preparing itself.") return var/turf/T = get_turf(user) @@ -575,4 +602,4 @@ SLIME SCANNER if(T.effectmod) to_chat(user, "Core mutation in progress: [T.effectmod]") to_chat(user, "Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]") - to_chat(user, "========================") \ No newline at end of file + to_chat(user, "========================") diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index a944230925..cb0d4ec4ac 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -36,7 +36,7 @@ /obj/item/dice //depreciated d6, use /obj/item/dice/d6 if you actually want a d6 name = "die" - desc = "A die with six sides. Basic and servicable." + desc = "A die with six sides. Basic and serviceable." icon = 'icons/obj/dice.dmi' icon_state = "d6" w_class = WEIGHT_CLASS_TINY @@ -111,7 +111,7 @@ /obj/item/dice/d00 name = "d00" - desc = "A die with ten sides. Works better for d100 rolls than a golfball." + desc = "A die with ten sides. Works better for d100 rolls than a golf ball." icon_state = "d00" sides = 10 @@ -123,7 +123,7 @@ /obj/item/dice/d20 name = "d20" - desc = "A die with twenty sides. The prefered die to throw at the GM." + desc = "A die with twenty sides. The preferred die to throw at the GM." icon_state = "d20" sides = 20 diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index a4b9cf708b..ebae70ca05 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -98,12 +98,12 @@ add_mutations_static = list(HULK) /obj/item/dnainjector/xraymut - name = "\improper DNA injector (Xray)" + name = "\improper DNA injector (X-ray)" desc = "Finally you can see what the Captain does." add_mutations_static = list(XRAY) /obj/item/dnainjector/antixray - name = "\improper DNA injector (Anti-Xray)" + name = "\improper DNA injector (Anti-X-ray)" desc = "It will make you see harder." remove_mutations_static = list(XRAY) @@ -160,7 +160,7 @@ /obj/item/dnainjector/antitour name = "\improper DNA injector (Anti-Tour.)" - desc = "Will cure tourrets." + desc = "Will cure Tourette's." remove_mutations_static = list(TOURETTES) /obj/item/dnainjector/tourmut diff --git a/code/game/objects/items/gift.dm b/code/game/objects/items/gift.dm index a09d39072d..af88c74e65 100644 --- a/code/game/objects/items/gift.dm +++ b/code/game/objects/items/gift.dm @@ -95,7 +95,7 @@ GLOBAL_LIST_EMPTY(possible_gifts) var/list/gift_types_list = subtypesof(/obj/item) for(var/V in gift_types_list) var/obj/item/I = V - if((!initial(I.icon_state)) || (!initial(I.item_state)) || (initial(I.flags_1) & ABSTRACT_1)) + if((!initial(I.icon_state)) || (!initial(I.item_state)) || (initial(I.item_flags) & ABSTRACT)) gift_types_list -= V GLOB.possible_gifts = gift_types_list var/gift_type = pick(GLOB.possible_gifts) diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 3542afa00e..3699545b41 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -32,7 +32,7 @@ /obj/item/book/granter/action var/granted_action - var/actionname = "catching bugs" //might not seem needed but this makes it so you can safely name aciton buttons toggle this or that without it fucking up the granter, also caps + var/actionname = "catching bugs" //might not seem needed but this makes it so you can safely name action buttons toggle this or that without it fucking up the granter, also caps /obj/item/book/granter/action/attack_self(mob/user) . = ..() @@ -73,7 +73,7 @@ /datum/action/innate/drink_fling name = "Drink Flinging" - desc = "Toggles your ability to satifyingly throw glasses without spilling them." + desc = "Toggles your ability to satisfyingly throw glasses without spilling them." button_icon_state = "drinkfling_off" check_flags = 0 @@ -151,7 +151,7 @@ spellname = "sacred flame" icon_state ="booksacredflame" desc = "Become one with the flames that burn within... and invite others to do so as well." - remarks = list("Well, it's one way to stop an attacker...", "I'm gonna need some good gear to stop myself from burning to death...", "Keep a fire extingusher handy, got it...", "I think I just burned my hand...", "Apply flame directly to chest for proper ignition...", "No pain, no gain...", "One with the flame...") + remarks = list("Well, it's one way to stop an attacker...", "I'm gonna need some good gear to stop myself from burning to death...", "Keep a fire extinguisher handy, got it...", "I think I just burned my hand...", "Apply flame directly to chest for proper ignition...", "No pain, no gain...", "One with the flame...") /obj/item/book/granter/spell/smoke spell = /obj/effect/proc_holder/spell/targeted/smoke @@ -222,7 +222,7 @@ spellname = "forcewall" icon_state ="bookforcewall" desc = "This book has a dedication to mimes everywhere inside the front cover." - remarks = list("I can go through the wall! Neat.", "Why are there so many mime references...?", "This would cause much grief in a hallway...", "This is some suprisingly strong magic to create a wall nobody can pass through...", "Why the dumb stance? It's just a flick of the hand...", "Why are the pages so hard to turn, is this even paper?", "I can't mo Oh, i'm fine...") + remarks = list("I can go through the wall! Neat.", "Why are there so many mime references...?", "This would cause much grief in a hallway...", "This is some surprisingly strong magic to create a wall nobody can pass through...", "Why the dumb stance? It's just a flick of the hand...", "Why are the pages so hard to turn, is this even paper?", "I can't mo Oh, i'm fine...") /obj/item/book/granter/spell/forcewall/recoil(mob/living/user) ..() @@ -253,7 +253,7 @@ if(ishuman(user)) to_chat(user,"HORSIE HAS RISEN") var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead - magichead.flags_1 |= NODROP_1 //curses! + magichead.item_flags |= NODROP //curses! magichead.flags_inv &= ~HIDEFACE //so you can still see their face magichead.voicechange = TRUE //NEEEEIIGHH if(!user.dropItemToGround(user.wear_mask)) diff --git a/code/game/objects/items/grenades/antigravity.dm b/code/game/objects/items/grenades/antigravity.dm new file mode 100644 index 0000000000..43b2f94986 --- /dev/null +++ b/code/game/objects/items/grenades/antigravity.dm @@ -0,0 +1,17 @@ +/obj/item/grenade/antigravity + name = "antigravity grenade" + icon_state = "emp" + item_state = "emp" + + var/range = 7 + var/forced_value = 0 + var/duration = 300 + +/obj/item/grenade/antigravity/prime() + update_mob() + + for(var/turf/T in view(range,src)) + var/datum/component/C = T.AddComponent(/datum/component/forced_gravity,forced_value) + QDEL_IN(C,duration) + + qdel(src) diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index bed7ba24e4..c961fca9f2 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -75,6 +75,9 @@ return to_chat(user, "You add [I] to the [initial(name)] assembly.") beakers += I + var/reagent_list = pretty_string_from_reagent_list(I.reagents) + add_logs(user, src, "inserted [I]", addition = "[reagent_list] inside.") + log_game("[key_name(user)] inserted [I] into [src] containing [reagent_list] ") else to_chat(user, "[I] is empty!") @@ -111,6 +114,11 @@ if(beakers.len) for(var/obj/O in beakers) O.forceMove(drop_location()) + if(!O.reagents) + continue + var/reagent_list = pretty_string_from_reagent_list(O.reagents) + add_logs(user, src, "removed [O]", addition = "[reagent_list] inside.") + log_game("[key_name(user)] removed [O] from [src] containing [reagent_list]") beakers = list() to_chat(user, "You open the [initial(name)] assembly and remove the payload.") return // First use of the wrench remove beakers, then use the wrench to remove the activation mechanism. @@ -155,6 +163,20 @@ if(nadeassembly) nadeassembly.on_found(finder) +/obj/item/grenade/chem_grenade/log_grenade(mob/user, turf/T) + ..() + var/reagent_string = "" + var/beaker_number = 1 + for(var/obj/exploded_beaker in beakers) + if(!exploded_beaker.reagents) + continue + reagent_string += "[exploded_beaker] [beaker_number++] : " + pretty_string_from_reagent_list(exploded_beaker.reagents.reagent_list) + ";" + var/message = "[src] primed by [user] at [ADMIN_VERBOSEJMP(T)] contained [reagent_string]." + GLOB.bombers += message + message_admins(message) + log_game("[src] primed by [user] at [AREACOORD(T)] contained [reagent_string].") + add_logs(user, src, "primed", addition = "[reagent_string] inside.") + /obj/item/grenade/chem_grenade/prime() if(stage != READY) return diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index e0a9956f9a..923361de3c 100644 --- a/code/game/objects/items/grenades/clusterbuster.dm +++ b/code/game/objects/items/grenades/clusterbuster.dm @@ -2,7 +2,7 @@ //Clusterbang //////////////////// /obj/item/grenade/clusterbuster - desc = "Use of this weapon may constiute a war crime in your area, consult your local captain." + desc = "Use of this weapon may constitute a war crime in your area, consult your local captain." name = "clusterbang" icon = 'icons/obj/grenade.dmi' icon_state = "clusterbang" diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index c7b9656dad..ef410ff84b 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -12,7 +12,6 @@ return for(var/mob/living/M in get_hearers_in_view(7, flashbang_turf)) bang(get_turf(M), M) - qdel(src) /obj/item/grenade/flashbang/proc/bang(turf/T , mob/living/M) diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 8e96e97389..37dc206099 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -5,7 +5,8 @@ item_state = "plastic-explosive" lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi' - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON + flags_1 = NONE det_time = 10 display_timer = 0 w_class = WEIGHT_CLASS_SMALL @@ -217,7 +218,7 @@ return if(loc == AM) return - if(AM.SendSignal(COMSIG_CONTAINS_STORAGE) && !AM.SendSignal(COMSIG_IS_STORAGE_LOCKED)) + if(SEND_SIGNAL(AM, COMSIG_CONTAINS_STORAGE) && !SEND_SIGNAL(AM, COMSIG_IS_STORAGE_LOCKED)) return to_chat(user, "You start planting the bomb...") diff --git a/code/game/objects/items/grenades/syndieminibomb.dm b/code/game/objects/items/grenades/syndieminibomb.dm index b05da3ab0a..d457224e95 100644 --- a/code/game/objects/items/grenades/syndieminibomb.dm +++ b/code/game/objects/items/grenades/syndieminibomb.dm @@ -13,7 +13,7 @@ /obj/item/grenade/syndieminibomb/concussion name = "HE Grenade" - desc = "A compact shrapnel grenade meant to devestate nearby organisms and cause some damage in the process. Pull pin and throw opposite direction." + desc = "A compact shrapnel grenade meant to devastate nearby organisms and cause some damage in the process. Pull pin and throw opposite direction." icon_state = "concussion" /obj/item/grenade/syndieminibomb/concussion/prime() diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 735bcaeb27..2ed152ee21 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -297,7 +297,8 @@ armed = 1 icon_state = "e_snare" trap_damage = 0 - flags_1 = DROPDEL_1 + item_flags = DROPDEL + flags_1 = NONE /obj/item/restraints/legcuffs/beartrap/energy/New() ..() @@ -361,4 +362,4 @@ var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom)) B.Crossed(hit_atom) qdel(src) - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index d13d6cc1dd..ed5e763874 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -86,7 +86,7 @@ do_attack_animation(master, null, src) master.emote("scream") master.remove_status_effect(STATUS_EFFECT_HISGRACE) - flags_1 &= ~NODROP_1 + item_flags &= ~NODROP master.Knockdown(60) master.adjustBruteLoss(master.maxHealth) playsound(master, 'sound/effects/splat.ogg', 100, 0) @@ -170,20 +170,20 @@ update_stats() /obj/item/his_grace/proc/update_stats() - flags_1 &= ~NODROP_1 + item_flags &= ~NODROP var/mob/living/master = get_atom_on_turf(src, /mob/living) switch(bloodthirst) if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP) if(HIS_GRACE_CONSUME_OWNER > prev_bloodthirst) master.visible_message("[src] enters a frenzy!") if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER) - flags_1 |= NODROP_1 + item_flags |= NODROP if(HIS_GRACE_STARVING > prev_bloodthirst) master.visible_message("[src] is starving!", "[src]'s bloodlust overcomes you. [src] must be fed, or you will become His meal.\ [force_bonus < 15 ? " And still, His power grows.":""]") force_bonus = max(force_bonus, 15) if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING) - flags_1 |= NODROP_1 + item_flags |= NODROP if(HIS_GRACE_FAMISHED > prev_bloodthirst) master.visible_message("[src] is very hungry!", "Spines sink into your hand. [src] must feed immediately.\ [force_bonus < 10 ? " His power grows.":""]") diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 48504d6e3c..654afba29d 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -11,7 +11,7 @@ throwforce = 0 throw_speed = 3 throw_range = 7 - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON var/list/signs = list() var/max_signs = 10 var/creation_time = 0 //time to create a holosign in deciseconds. @@ -122,4 +122,3 @@ for(var/H in signs) qdel(H) to_chat(user, "You clear all active holograms.") - diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index f79c9ad0e8..4c38752e28 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -229,7 +229,7 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' name = "god hand" desc = "This hand of yours glows with an awesome power!" - flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1 + item_flags = ABSTRACT | NODROP | DROPDEL w_class = WEIGHT_CLASS_HUGE hitsound = 'sound/weapons/sear.ogg' damtype = BURN @@ -307,7 +307,7 @@ slot_flags = ITEM_SLOT_BELT /obj/item/nullrod/claymore/katana - name = "hanzo steel" + name = "\improper Hanzo steel" desc = "Capable of cutting clean through a holy claymore." icon_state = "katana" item_state = "katana" @@ -449,7 +449,6 @@ name = "possessed chainsaw sword" desc = "Suffer not a heretic to live." slot_flags = ITEM_SLOT_BELT - force = 30 attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' @@ -473,7 +472,7 @@ lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' w_class = WEIGHT_CLASS_HUGE - flags_1 = NODROP_1 | ABSTRACT_1 + item_flags = NODROP | ABSTRACT sharpness = IS_SHARP attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' @@ -544,7 +543,7 @@ item_state = "arm_blade" lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' - flags_1 = ABSTRACT_1 | NODROP_1 + item_flags = ABSTRACT | NODROP w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm index de22ac8125..eefa302032 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -4,7 +4,7 @@ desc = "A label on the side of this potato reads \"Product of DonkCo Service Wing. Activate far away from populated areas. Device will only attach to sapient creatures.\" You can attack anyone with it to force it on them instead of yourself!" icon = 'icons/obj/hydroponics/harvest.dmi' icon_state = "potato" - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON force = 0 var/icon_off = "potato" var/icon_on = "potato_active" @@ -133,7 +133,7 @@ return update_icon() if(sticky) - flags_1 |= NODROP_1 + item_flags |= NODROP name = "primed [name]" activation_time = timer + world.time detonation_timerid = addtimer(CALLBACK(src, .proc/detonate), delay, TIMER_STOPPABLE) @@ -146,7 +146,7 @@ /obj/item/hot_potato/proc/deactivate() update_icon() name = initial(name) - flags_1 &= ~NODROP_1 + item_flags &= ~NODROP deltimer(detonation_timerid) STOP_PROCESSING(SSfastprocess, src) detonation_timerid = null diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm index d1ff075ef2..7184b956f5 100644 --- a/code/game/objects/items/implants/implant.dm +++ b/code/game/objects/items/implants/implant.dm @@ -8,7 +8,7 @@ item_color = "b" var/allow_multiple = FALSE var/uses = -1 - flags_1 = DROPDEL_1 + item_flags = DROPDEL /obj/item/implant/proc/trigger(emote, mob/living/carbon/source) @@ -18,7 +18,7 @@ return /obj/item/implant/proc/activate() - return + SEND_SIGNAL(src, COMSIG_IMPLANT_ACTIVATED) /obj/item/implant/ui_action_click() activate("action_button") @@ -41,12 +41,26 @@ //return 1 if the implant injects //return 0 if there is no room for implant / it fails /obj/item/implant/proc/implant(mob/living/target, mob/user, silent = FALSE) + if(SEND_SIGNAL(src, COMSIG_IMPLANT_IMPLANTING, args) & COMPONENT_STOP_IMPLANTING) + return LAZYINITLIST(target.implants) if(!target.can_be_implanted() || !can_be_implanted_in(target)) - return 0 + return FALSE for(var/X in target.implants) - if(istype(X, type)) - var/obj/item/implant/imp_e = X + var/obj/item/implant/imp_e = X + var/flags = SEND_SIGNAL(imp_e, COMSIG_IMPLANT_OTHER, args, src) + if(flags & COMPONENT_DELETE_NEW_IMPLANT) + UNSETEMPTY(target.implants) + qdel(src) + return TRUE + if(flags & COMPONENT_DELETE_OLD_IMPLANT) + qdel(imp_e) + continue + if(flags & COMPONENT_STOP_IMPLANTING) + UNSETEMPTY(target.implants) + return FALSE + + if(istype(imp_e, type)) if(!allow_multiple) if(imp_e.uses < initial(imp_e.uses)*2) if(uses == -1) @@ -54,9 +68,9 @@ else imp_e.uses = min(imp_e.uses + uses, initial(imp_e.uses)*2) qdel(src) - return 1 + return TRUE else - return 0 + return FALSE forceMove(target) imp_in = target @@ -72,7 +86,7 @@ if(user) add_logs(user, target, "implanted", "\a [name]") - return 1 + return TRUE /obj/item/implant/proc/removed(mob/living/source, silent = FALSE, special = 0) moveToNullspace() diff --git a/code/game/objects/items/implants/implant_abductor.dm b/code/game/objects/items/implants/implant_abductor.dm index 3ba1e7315f..0c50beadea 100644 --- a/code/game/objects/items/implants/implant_abductor.dm +++ b/code/game/objects/items/implants/implant_abductor.dm @@ -8,6 +8,7 @@ var/cooldown = 30 /obj/item/implant/abductor/activate() + . = ..() if(cooldown == initial(cooldown)) home.Retrieve(imp_in,1) cooldown = 0 diff --git a/code/game/objects/items/implants/implant_chem.dm b/code/game/objects/items/implants/implant_chem.dm index 88b7e032f3..b9c85c0728 100644 --- a/code/game/objects/items/implants/implant_chem.dm +++ b/code/game/objects/items/implants/implant_chem.dm @@ -37,6 +37,7 @@ activate(reagents.total_volume) /obj/item/implant/chem/activate(cause) + . = ..() if(!cause || !imp_in) return 0 var/mob/living/carbon/R = imp_in diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index 5aa0e31d08..e749a6c4be 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -27,6 +27,7 @@ return dat /obj/item/implant/explosive/activate(cause) + . = ..() if(!cause || !imp_in || active) return 0 if(cause == "action_button" && !popup) diff --git a/code/game/objects/items/implants/implant_freedom.dm b/code/game/objects/items/implants/implant_freedom.dm index 4ba04c9479..f3e66d2c08 100644 --- a/code/game/objects/items/implants/implant_freedom.dm +++ b/code/game/objects/items/implants/implant_freedom.dm @@ -7,6 +7,7 @@ /obj/item/implant/freedom/activate() + . = ..() uses-- to_chat(imp_in, "You feel a faint click.") if(iscarbon(imp_in)) diff --git a/code/game/objects/items/implants/implant_krav_maga.dm b/code/game/objects/items/implants/implant_krav_maga.dm index c2d7d44249..3a751ecd0e 100644 --- a/code/game/objects/items/implants/implant_krav_maga.dm +++ b/code/game/objects/items/implants/implant_krav_maga.dm @@ -15,6 +15,7 @@ return dat /obj/item/implant/krav_maga/activate() + . = ..() var/mob/living/carbon/human/H = imp_in if(!ishuman(H)) return diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index f17be453f4..24ee6d0966 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -31,6 +31,7 @@ return dat /obj/item/implant/adrenalin/activate() + . = ..() uses-- to_chat(imp_in, "You feel a sudden surge of energy!") imp_in.SetStun(0) @@ -54,6 +55,7 @@ uses = 3 /obj/item/implant/emp/activate() + . = ..() uses-- empulse(imp_in, 3, 5) if(!uses) @@ -88,6 +90,7 @@ icon_state = "walkietalkie" /obj/item/implant/radio/activate() + . = ..() // needs to be GLOB.deep_inventory_state otherwise it won't open radio.ui_interact(usr, "main", null, FALSE, null, GLOB.deep_inventory_state) diff --git a/code/game/objects/items/implants/implant_storage.dm b/code/game/objects/items/implants/implant_storage.dm index 787c246ddf..ec6b4d64c3 100644 --- a/code/game/objects/items/implants/implant_storage.dm +++ b/code/game/objects/items/implants/implant_storage.dm @@ -6,7 +6,8 @@ var/max_slot_stacking = 4 /obj/item/implant/storage/activate() - SendSignal(COMSIG_TRY_STORAGE_SHOW, imp_in, TRUE) + . = ..() + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SHOW, imp_in, TRUE) /obj/item/implant/storage/removed(source, silent = FALSE, special = 0) . = ..() diff --git a/code/game/objects/items/implants/implantuplink.dm b/code/game/objects/items/implants/implantuplink.dm index 5fe603c47c..9000fbbe34 100644 --- a/code/game/objects/items/implants/implantuplink.dm +++ b/code/game/objects/items/implants/implantuplink.dm @@ -11,32 +11,6 @@ . = ..() AddComponent(/datum/component/uplink, _owner, TRUE, FALSE, null, starting_tc) -/obj/item/implant/uplink/implant(mob/living/target, mob/user, silent = FALSE) - GET_COMPONENT(hidden_uplink, /datum/component/uplink) - if(hidden_uplink) - for(var/X in target.implants) - if(istype(X, type)) - var/obj/item/implant/imp_e = X - GET_COMPONENT_FROM(their_hidden_uplink, /datum/component/uplink, imp_e) - if(their_hidden_uplink) - their_hidden_uplink.telecrystals += hidden_uplink.telecrystals - qdel(src) - return TRUE - else - qdel(imp_e) //INFERIOR AND EMPTY! - - if(..()) - if(hidden_uplink) - hidden_uplink.owner = "[user.key]" - return TRUE - return FALSE - -/obj/item/implant/uplink/activate() - GET_COMPONENT(hidden_uplink, /datum/component/uplink) - if(hidden_uplink) - hidden_uplink.locked = FALSE - hidden_uplink.interact(usr) - /obj/item/implanter/uplink name = "implanter (uplink)" imp_type = /obj/item/implant/uplink diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index c6b2a85d34..bf7b0b1b3b 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -137,7 +137,7 @@ icon_state = "bone_dagger" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - desc = "A sharpened bone. The bare mimimum in survival." + desc = "A sharpened bone. The bare minimum in survival." force = 15 throwforce = 15 materials = list() diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 5ceaa9c514..9ad4174b3a 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -31,7 +31,7 @@ /obj/item/melee/synthetic_arm_blade name = "synthetic arm blade" - desc = "A grotesque blade that on closer inspection seems made of synthentic flesh, it still feels like it would hurt very badly as a weapon." + desc = "A grotesque blade that on closer inspection seems made of synthetic flesh, it still feels like it would hurt very badly as a weapon." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "arm_blade" item_state = "arm_blade" @@ -88,6 +88,51 @@ if(istype(B)) playsound(B, 'sound/items/sheath.ogg', 25, 1) +/obj/item/melee/sabre/suicide_act(mob/living/user) + user.visible_message("[user] is trying to cut off all [user.p_their()] limbs with [src]! it looks like [user.p_theyre()] trying to commit suicide!") + var/i = 0 + var/originally_nodropped = item_flags & NODROP + item_flags |= NODROP + if(iscarbon(user)) + var/mob/living/carbon/Cuser = user + var/obj/item/bodypart/holding_bodypart = Cuser.get_holding_bodypart_of_item(src) + var/list/limbs_to_dismember + var/list/arms = list() + var/list/legs = list() + var/obj/item/bodypart/bodypart + + for(bodypart in Cuser.bodyparts) + if(bodypart == holding_bodypart) + continue + if(bodypart.body_part & ARMS) + arms += bodypart + else if (bodypart.body_part & LEGS) + legs += bodypart + + limbs_to_dismember = arms + legs + if(holding_bodypart) + limbs_to_dismember += holding_bodypart + + var/speedbase = abs((4 SECONDS) / limbs_to_dismember.len) + for(bodypart in limbs_to_dismember) + i++ + addtimer(CALLBACK(src, .proc/suicide_dismember, user, bodypart), speedbase * i) + addtimer(CALLBACK(src, .proc/manual_suicide, user, originally_nodropped), (5 SECONDS) * i) + return MANUAL_SUICIDE + +/obj/item/melee/sabre/proc/suicide_dismember(mob/living/user, obj/item/bodypart/affecting) + if(!QDELETED(affecting) && affecting.dismemberable && affecting.owner == user && !QDELETED(user)) + playsound(user, hitsound, 25, 1) + affecting.dismember(BRUTE) + user.adjustBruteLoss(20) + +/obj/item/melee/sabre/proc/manual_suicide(mob/living/user, originally_nodropped) + if(!QDELETED(user)) + user.adjustBruteLoss(200) + user.death(FALSE) + if(!originally_nodropped) + item_flags &= ~NODROP + /obj/item/melee/classic_baton name = "police baton" desc = "A wooden truncheon for beating criminal scum." diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 19e8560d4d..3601c43651 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -17,6 +17,7 @@ var/mopcap = 5 var/mopspeed = 30 force_string = "robust... against germs" + var/insertable = TRUE /obj/item/mop/New() ..() @@ -25,7 +26,7 @@ /obj/item/mop/proc/clean(turf/A) if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1) || reagents.has_reagent("vodka", 1) || reagents.has_reagent("cleaner", 1)) - A.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) + SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) for(var/obj/effect/O in A) if(is_cleanable(O)) qdel(O) @@ -62,14 +63,16 @@ /obj/item/mop/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) - J.put_in_cart(src, user) - J.mymop=src - J.update_icon() + if(insertable) + J.put_in_cart(src, user) + J.mymop=src + J.update_icon() + else + to_chat(user, "You are unable to fit your [name] into the [J.name].") + return /obj/item/mop/cyborg - -/obj/item/mop/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J) - return + insertable = FALSE /obj/item/mop/advanced desc = "The most advanced tool in a custodian's arsenal, complete with a condenser for self-wetting! Just think of all the viscera you will clean up with this!" @@ -113,3 +116,6 @@ if(refill_enabled) STOP_PROCESSING(SSobj, src) return ..() + +/obj/item/mop/advanced/cyborg + insertable = FALSE \ No newline at end of file diff --git a/code/game/objects/items/paiwire.dm b/code/game/objects/items/paiwire.dm index 994082c5fa..ef98ed62a1 100644 --- a/code/game/objects/items/paiwire.dm +++ b/code/game/objects/items/paiwire.dm @@ -3,11 +3,11 @@ name = "data cable" icon = 'icons/obj/power.dmi' icon_state = "wire1" - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON var/obj/machinery/machine /obj/item/pai_cable/proc/plugin(obj/machinery/M, mob/living/user) if(!user.transferItemToLoc(src, M)) return user.visible_message("[user] inserts [src] into a data port on [M].", "You insert [src] into a data port on [M].", "You hear the satisfying click of a wire jack fastening into place.") - machine = M \ No newline at end of file + machine = M diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 881b825814..ecf7abe1d3 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -151,7 +151,7 @@ /obj/item/borg/charger name = "power connector" icon_state = "charger_draw" - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON var/mode = "draw" var/static/list/charge_machines = typecacheof(list(/obj/machinery/cell_charger, /obj/machinery/recharger, /obj/machinery/recharge_station, /obj/machinery/mech_bay_recharge_port)) var/static/list/charge_items = typecacheof(list(/obj/item/stock_parts/cell, /obj/item/gun/energy)) @@ -194,7 +194,7 @@ M.use_power(200) - to_chat(user, "You stop charging youself.") + to_chat(user, "You stop charging yourself.") else if(is_type_in_list(target, charge_items)) var/obj/item/stock_parts/cell/cell = target @@ -233,7 +233,7 @@ break target.update_icon() - to_chat(user, "You stop charging youself.") + to_chat(user, "You stop charging yourself.") else if(is_type_in_list(target, charge_items)) var/obj/item/stock_parts/cell/cell = target @@ -693,7 +693,7 @@ /obj/item/borg/sight/xray - name = "\proper x-ray vision" + name = "\proper X-ray vision" icon = 'icons/obj/decals.dmi' icon_state = "securearea" sight_mode = BORGXRAY diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 9999a054f6..d280254952 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -181,8 +181,9 @@ to_chat(user, "Sticking a dead brain into the frame would sort of defeat the purpose!") return - if(jobban_isbanned(BM, "Cyborg")) - to_chat(user, "This [M.name] does not seem to fit!") + if(jobban_isbanned(BM, "Cyborg") || QDELETED(src) || QDELETED(BM) || QDELETED(user) || QDELETED(M) || !Adjacent(user)) + if(!QDELETED(M)) + to_chat(user, "This [M.name] does not seem to fit!") return if(!user.temporarilyRemoveItemFromInventory(W)) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 854031b1f4..975908106e 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -193,6 +193,60 @@ R.module.basic_modules += S R.module.add_module(S, FALSE, TRUE) +/obj/item/borg/upgrade/tboh + name = "janitor cyborg trash bag of holding" + desc = "A trash bag of holding replace for the janiborgs standard trash bag." + icon_state = "cyborg_upgrade3" + require_module = 1 + module_type = /obj/item/robot_module/janitor + +/obj/item/borg/upgrade/tboh/action(mob/living/silicon/robot/R) + . = ..() + if(.) + for(var/obj/item/storage/bag/trash/cyborg/TB in R.module.modules) + R.module.remove_module(TB, TRUE) + + var/obj/item/storage/bag/trash/bluespace/cyborg/B = new /obj/item/storage/bag/trash/bluespace/cyborg(R.module) + R.module.basic_modules += B + R.module.add_module(B, FALSE, TRUE) + +/obj/item/borg/upgrade/tboh/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + for(var/obj/item/storage/bag/trash/bluespace/cyborg/B in R.module.modules) + R.module.remove_module(B, TRUE) + + var/obj/item/storage/bag/trash/cyborg/TB = new (R.module) + R.module.basic_modules += TB + R.module.add_module(TB, FALSE, TRUE) + +/obj/item/borg/upgrade/amop + name = "janitor cyborg advanced mop" + desc = "An advanced mop replacement from the janiborgs standard mop." + icon_state = "cyborg_upgrade3" + require_module = 1 + module_type = /obj/item/robot_module/janitor + +/obj/item/borg/upgrade/amop/action(mob/living/silicon/robot/R) + . = ..() + if(.) + for(var/obj/item/mop/cyborg/M in R.module.modules) + R.module.remove_module(M, TRUE) + + var/obj/item/mop/advanced/cyborg/A = new /obj/item/mop/advanced/cyborg(R.module) + R.module.basic_modules += A + R.module.add_module(A, FALSE, TRUE) + +/obj/item/borg/upgrade/amop/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + for(var/obj/item/mop/advanced/cyborg/A in R.module.modules) + R.module.remove_module(A, TRUE) + + var/obj/item/mop/cyborg/M = new (R.module) + R.module.basic_modules += M + R.module.add_module(M, FALSE, TRUE) + /obj/item/borg/upgrade/syndicate name = "illegal equipment module" desc = "Unlocks the hidden, deadlier functions of a cyborg." @@ -543,3 +597,20 @@ var/obj/item/pinpointer/crew/PP = locate() in R.module if (PP) R.module.remove_module(PP, TRUE) + +/obj/item/borg/upgrade/transform + name = "borg module picker (Standard)" + desc = "Allows you to to turn a cyborg into a standard cyborg." + icon_state = "cyborg_upgrade3" + var/obj/item/robot_module/new_module = /obj/item/robot_module/standard + +/obj/item/borg/upgrade/transform/action(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + R.module.transform_to(new_module) + +/obj/item/borg/upgrade/transform/clown + name = "borg module picker (Clown)" + desc = "Allows you to to turn a cyborg into a clown, honk." + icon_state = "cyborg_upgrade3" + new_module = /obj/item/robot_module/clown diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index d6bb54bddf..1171bd7bf7 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -38,7 +38,7 @@ return ..() /obj/item/shield/riot/roman - name = "roman shield" + name = "\improper Roman shield" desc = "Bears an inscription on the inside: \"Romanes venio domus\"." icon_state = "roman_shield" item_state = "roman_shield" diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 4da0fd8a44..522e1a1153 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -45,7 +45,7 @@ blink_mob(hit_atom) use(1) -//Artifical bluespace crystal, doesn't give you much research. +//Artificial bluespace crystal, doesn't give you much research. /obj/item/stack/ore/bluespace_crystal/artificial name = "artificial bluespace crystal" desc = "An artificially made bluespace crystal, it looks delicate." diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index bee37d1ff9..1cd23c26fa 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -105,7 +105,7 @@ /obj/item/stack/medical/bruise_pack name = "bruise pack" singular_name = "bruise pack" - desc = "A theraputic gel pack and bandages designed to treat blunt-force trauma." + desc = "A therapeutic gel pack and bandages designed to treat blunt-force trauma." icon_state = "brutepack" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 996576d8e5..a6e2d255fb 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -110,7 +110,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ if(QDELETED(src) && replace) user.put_in_hands(RG) else - to_chat(user, "You need one rod and one sheet of plamsa glass to make reinforced plasma glass!") + to_chat(user, "You need one rod and one sheet of plasma glass to make reinforced plasma glass!") return else return ..() @@ -173,7 +173,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ /obj/item/stack/sheet/plasmarglass name = "reinforced plasma glass" - desc = "A glass sheet made out of a plasma-silicate alloy and a rod matrice. It looks hopelessly tough and nearly fire-proof!" + desc = "A glass sheet made out of a plasma-silicate alloy and a rod matrix. It looks hopelessly tough and nearly fire-proof!" singular_name = "reinforced plasma glass sheet" icon_state = "sheet-prglass" item_state = "sheet-prglass" diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 4eae35a98c..0031839eff 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -149,6 +149,7 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ new/datum/stack_recipe("leather satchel", /obj/item/storage/backpack/satchel/leather, 5), \ new/datum/stack_recipe("bandolier", /obj/item/storage/belt/bandolier, 5), \ new/datum/stack_recipe("leather jacket", /obj/item/clothing/suit/jacket/leather, 7), \ + new/datum/stack_recipe("leather shoes", /obj/item/clothing/shoes/laceup, 2), \ new/datum/stack_recipe("leather overcoat", /obj/item/clothing/suit/jacket/leather/overcoat, 10), \ )) @@ -187,7 +188,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ singular_name = "hide plate" max_amount = 6 novariants = FALSE - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_NORMAL layer = MOB_LAYER @@ -200,7 +201,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ singular_name = "drake plate" max_amount = 10 novariants = FALSE - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_NORMAL layer = MOB_LAYER diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 87d1985b18..8d1562826c 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -310,7 +310,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ point_value = 45 GLOBAL_LIST_INIT(plastitanium_recipes, list ( \ - new/datum/stack_recipe("plas-titanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), \ + new/datum/stack_recipe("plastitanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), \ )) /obj/item/stack/sheet/mineral/plastitanium/Initialize(mapload, new_amount, merge = TRUE) diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 3597a3f4d6..ec1e7b8773 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -6,7 +6,7 @@ icon_state = "telecrystal" w_class = WEIGHT_CLASS_TINY max_amount = 50 - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON /obj/item/stack/telecrystal/attack(mob/target, mob/user) if(target == user) //You can't go around smacking people with crystals to find out if they have an uplink or not. diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm index 38887a0d8b..64be8853a7 100644 --- a/code/game/objects/items/stacks/tiles/tile_mineral.dm +++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm @@ -71,9 +71,9 @@ materials = list(MAT_TITANIUM=500) /obj/item/stack/tile/mineral/plastitanium - name = "plas-titanium tile" - singular_name = "plas-titanium floor tile" - desc = "A tile made of plas-titanium, used for very evil shuttles." + name = "plastitanium tile" + singular_name = "plastitanium floor tile" + desc = "A tile made of plastitanium, used for very evil shuttles." icon_state = "tile_darkshuttle" turf_type = /turf/open/floor/mineral/plastitanium mineralType = "plastitanium" diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index fe056d34d8..3e5c9c2ba9 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -9,7 +9,7 @@ desc = "Wrap packages with this festive paper to make gifts." icon = 'icons/obj/stack_objects.dmi' icon_state = "wrap_paper" - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON amount = 25 max_amount = 25 resistance_flags = FLAMMABLE @@ -31,7 +31,7 @@ desc = "You can use this to wrap items in." icon = 'icons/obj/stack_objects.dmi' icon_state = "deliveryPaper" - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON amount = 25 max_amount = 25 resistance_flags = FLAMMABLE diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index a3e4bc112e..11dbf727f1 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -40,6 +40,7 @@ righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' w_class = WEIGHT_CLASS_BULKY + var/insertable = TRUE /obj/item/storage/bag/trash/ComponentInitialize() . = ..() @@ -64,14 +65,16 @@ else icon_state = "[initial(icon_state)]3" /obj/item/storage/bag/trash/cyborg + insertable = FALSE /obj/item/storage/bag/trash/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) - J.put_in_cart(src, user) - J.mybag=src - J.update_icon() - -/obj/item/storage/bag/trash/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J) - return + if(insertable) + J.put_in_cart(src, user) + J.mybag=src + J.update_icon() + else + to_chat(user, "You are unable to fit your [name] into the [J.name].") + return /obj/item/storage/bag/trash/bluespace name = "trash bag of holding" @@ -85,6 +88,9 @@ STR.max_combined_w_class = 60 STR.max_items = 60 +/obj/item/storage/bag/trash/bluespace/cyborg + insertable = FALSE + // ----------------------------- // Mining Satchel // ----------------------------- @@ -136,7 +142,7 @@ if (box) user.transferItemToLoc(A, box) show_message = TRUE - else if(SendSignal(COMSIG_TRY_STORAGE_INSERT, A, user, TRUE)) + else if(SEND_SIGNAL(src, COMSIG_TRY_STORAGE_INSERT, A, user, TRUE)) show_message = TRUE else if(!spam_protection) diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index db47fd3d0b..1066e1394c 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", H.visible_message("[user] heals [H] with the power of [deity_name]!") to_chat(H, "May the power of [deity_name] compel you to be healed!") playsound(src.loc, "punch", 25, 1, -1) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) return 1 /obj/item/storage/book/bible/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 7fcbeba268..9ac08aab5d 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -535,7 +535,7 @@ STR.max_items = 8 /obj/item/storage/box/snappops/PopulateContents() - SendSignal(COMSIG_TRY_STORAGE_FILL_TYPE, /obj/item/toy/snappop) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_FILL_TYPE, /obj/item/toy/snappop) /obj/item/storage/box/matches name = "matchbox" @@ -553,7 +553,7 @@ STR.can_hold = typecacheof(list(/obj/item/match)) /obj/item/storage/box/matches/PopulateContents() - SendSignal(COMSIG_TRY_STORAGE_FILL_TYPE, /obj/item/match) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_FILL_TYPE, /obj/item/match) /obj/item/storage/box/matches/attackby(obj/item/match/W as obj, mob/user as mob, params) if(istype(W, /obj/item/match)) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 02a367d2bf..95639918bb 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -151,7 +151,7 @@ return var/obj/item/clothing/mask/cigarette/W = locate(/obj/item/clothing/mask/cigarette) in contents if(W && contents.len > 0) - SendSignal(COMSIG_TRY_STORAGE_TAKE, W, user) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, user) user.put_in_hands(W) contents -= W to_chat(user, "You take \a [W] out of the pack.") @@ -190,7 +190,7 @@ if(cig) if(M == user && contents.len > 0 && !user.wear_mask) var/obj/item/clothing/mask/cigarette/W = cig - SendSignal(COMSIG_TRY_STORAGE_TAKE, W, M) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, M) M.equip_to_slot_if_possible(W, SLOT_WEAR_MASK) contents -= W to_chat(user, "You take \a [W] out of the pack.") @@ -319,13 +319,13 @@ icon_state = "[initial(icon_state)]" /obj/item/storage/fancy/cigarettes/cigars/cohiba - name = "\improper cohiba robusto cigar case" + name = "\improper Cohiba Robusto cigar case" desc = "A case of imported Cohiba cigars, renowned for their strong flavor." icon_state = "cohibacase" spawn_type = /obj/item/clothing/mask/cigarette/cigar/cohiba /obj/item/storage/fancy/cigarettes/cigars/havana - name = "\improper premium havanian cigar case" + name = "\improper premium Havanian cigar case" desc = "A case of classy Havanian cigars." icon_state = "cohibacase" spawn_type = /obj/item/clothing/mask/cigarette/cigar/havana diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index e1d65be1b7..bce38548cc 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -22,18 +22,18 @@ STR.locked = TRUE /obj/item/storage/lockbox/attackby(obj/item/W, mob/user, params) - var/locked = SendSignal(COMSIG_IS_STORAGE_LOCKED) + var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) if(W.GetID()) if(broken) to_chat(user, "It appears to be broken.") return if(allowed(user)) - SendSignal(COMSIG_TRY_STORAGE_SET_LOCKSTATE, !locked) - locked = SendSignal(COMSIG_IS_STORAGE_LOCKED) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, !locked) + locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) if(locked) icon_state = icon_locked to_chat(user, "You lock the [src.name]!") - SendSignal(COMSIG_TRY_STORAGE_HIDE_ALL) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_HIDE_ALL) return else icon_state = icon_closed @@ -50,7 +50,7 @@ /obj/item/storage/lockbox/emag_act(mob/user) if(!broken) broken = TRUE - SendSignal(COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE) desc += "It appears to be broken." icon_state = src.icon_broken if(user) @@ -107,13 +107,13 @@ /obj/item/storage/lockbox/medal/examine(mob/user) ..() - var/locked = SendSignal(COMSIG_IS_STORAGE_LOCKED) + var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) if(!locked) to_chat(user, "Alt-click to [open ? "close":"open"] it.") /obj/item/storage/lockbox/medal/AltClick(mob/user) if(user.canUseTopic(src, BE_CLOSE)) - if(!SendSignal(COMSIG_IS_STORAGE_LOCKED)) + if(!SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)) open = (open ? FALSE : TRUE) update_icon() ..() @@ -131,7 +131,7 @@ /obj/item/storage/lockbox/medal/update_icon() cut_overlays() - var/locked = SendSignal(COMSIG_IS_STORAGE_LOCKED) + var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) if(locked) icon_state = "medalbox+l" open = FALSE diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 806f22a2dc..20dae54a71 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -35,7 +35,7 @@ to_chat(user, text("The service panel is currently [open ? "unscrewed" : "screwed shut"].")) /obj/item/storage/secure/attackby(obj/item/W, mob/user, params) - if(SendSignal(COMSIG_IS_STORAGE_LOCKED)) + if(SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)) if (istype(W, /obj/item/screwdriver)) if (W.use_tool(src, user, 20)) open =! open @@ -64,7 +64,7 @@ return ..() /obj/item/storage/secure/attack_self(mob/user) - var/locked = SendSignal(COMSIG_IS_STORAGE_LOCKED) + var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) user.set_machine(src) var/dat = text("[]
    \n\nLock Status: []",src, (locked ? "LOCKED" : "UNLOCKED")) var/message = "Code" @@ -88,7 +88,7 @@ l_code = code l_set = 1 else if ((code == l_code) && (l_set == 1)) - SendSignal(COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE) cut_overlays() add_overlay(icon_opened) code = null @@ -96,10 +96,10 @@ code = "ERROR" else if ((href_list["type"] == "R") && (!l_setshort)) - SendSignal(COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) cut_overlays() code = null - SendSignal(COMSIG_TRY_STORAGE_HIDE_FROM, usr) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_HIDE_FROM, usr) else code += text("[]", sanitize_text(href_list["type"])) if (length(code) > 5) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 14b7932f92..527c7ea78e 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -14,9 +14,10 @@ var/stunforce = 140 var/status = 0 - var/obj/item/stock_parts/cell/high/cell + var/obj/item/stock_parts/cell/cell var/hitcost = 1000 var/throw_hit_chance = 35 + var/preload_cell_type //if not empty the baton starts with this type of cell /obj/item/melee/baton/get_cell() return cell @@ -27,6 +28,11 @@ /obj/item/melee/baton/Initialize() . = ..() + if(preload_cell_type) + if(!ispath(preload_cell_type,/obj/item/stock_parts/cell)) + log_world("### MAP WARNING, [src] at [AREACOORD(src)] had an invalid preload_cell_type: [preload_cell_type].") + else + cell = new preload_cell_type(src) update_icon() /obj/item/melee/baton/throw_impact(atom/hit_atom) @@ -35,10 +41,8 @@ if(status && prob(throw_hit_chance) && iscarbon(hit_atom)) baton_stun(hit_atom) -/obj/item/melee/baton/loaded/Initialize() //this one starts with a cell pre-installed. - cell = new(src) - update_icon() - . = ..() +/obj/item/melee/baton/loaded //this one starts with a cell pre-installed. + preload_cell_type = /obj/item/stock_parts/cell/high /obj/item/melee/baton/proc/deductcharge(chrgdeductamt) if(cell) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 1cf61ab651..be83481231 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -114,7 +114,7 @@ amount_per_transfer_from_this = 50 possible_transfer_amounts = list(25,50,100) volume = 500 - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON container_type = OPENCONTAINER slot_flags = 0 diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 08d0b8bd30..4707ba9b47 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -129,7 +129,7 @@ if(isOn()) use(1) var/turf/location = get_turf(user) - location.hotspot_expose(700, 50, 1) + location.hotspot_expose(550, 10, 1) if(get_fuel() <= 0) set_light(0) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ef82c074a6..94ce5d96a5 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -247,8 +247,8 @@ // Copied from /obj/item/melee/transforming/energy/sword/attackby /obj/item/toy/sword/attackby(obj/item/W, mob/living/user, params) if(istype(W, /obj/item/toy/sword)) - if((W.flags_1 & NODROP_1) || (flags_1 & NODROP_1)) - to_chat(user, "\the [flags_1 & NODROP_1 ? src : W] is stuck to your hand, you can't attach it to \the [flags_1 & NODROP_1 ? W : src]!") + if((W.item_flags & NODROP) || (item_flags & NODROP)) + to_chat(user, "\the [item_flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [item_flags & NODROP ? W : src]!") return else to_chat(user, "You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.") diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index 6526eaf561..f1c766e90c 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -121,7 +121,7 @@ name = "offhand" icon_state = "offhand" w_class = WEIGHT_CLASS_HUGE - flags_1 = ABSTRACT_1 + item_flags = ABSTRACT resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF /obj/item/twohanded/offhand/Destroy() @@ -338,7 +338,7 @@ icon_state = "dualsaber[item_color][wielded]" else icon_state = "dualsaber0" - SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) /obj/item/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user) if(user.has_dna()) diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm index 7a43a7d255..3be12abf4f 100755 --- a/code/game/objects/items/vending_items.dm +++ b/code/game/objects/items/vending_items.dm @@ -18,19 +18,34 @@ throw_range = 7 w_class = WEIGHT_CLASS_BULKY armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 30) - var/charges = list(0, 0, 0) //how many restocking "charges" the refill has for standard/contraband/coin products - var/init_charges = list(0, 0, 0) + // Built automatically from the corresponding vending machine. + // If null, considered to be full. Otherwise, is list(/typepath = amount). + var/list/products + var/list/contraband + var/list/premium -/obj/item/vending_refill/New(amt = -1) - ..() +/obj/item/vending_refill/Initialize(mapload) + . = ..() name = "\improper [machine_name] restocking unit" - if(isnum(amt) && amt > -1) - charges[1] = amt /obj/item/vending_refill/examine(mob/user) ..() - if(charges[1] > 0) - to_chat(user, "It can restock [charges[1]+charges[2]+charges[3]] item(s).") + var/num = get_part_rating() + if (num == INFINITY) + to_chat(user, "It's sealed tight, completely full of supplies.") + else if (num == 0) + to_chat(user, "It's empty!") else - to_chat(user, "It's empty!") \ No newline at end of file + to_chat(user, "It can restock [num] item\s.") + +/obj/item/vending_refill/get_part_rating() + if (!products || !contraband || !premium) + return INFINITY + . = 0 + for(var/key in products) + . += products[key] + for(var/key in contraband) + . += contraband[key] + for(var/key in premium) + . += premium[key] diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 3ac3a67060..736149c665 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -17,7 +17,11 @@ /obj/item/banhammer/suicide_act(mob/user) user.visible_message("[user] is hitting [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to ban [user.p_them()]self from life.") return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS) - +/* +oranges says: This is a meme relating to the english translation of the ss13 russian wiki page on lurkmore. +mrdoombringer sez: and remember kids, if you try and PR a fix for this item's grammar, you are admitting that you are, indeed, a newfriend. +for further reading, please see: https://github.com/tgstation/tgstation/pull/30173 and https://translate.google.com/translate?sl=auto&tl=en&js=y&prev=_t&hl=en&ie=UTF-8&u=%2F%2Flurkmore.to%2FSS13&edit-text=&act=url +*/ /obj/item/banhammer/attack(mob/M, mob/user) if(user.zone_selected == BODY_ZONE_HEAD) M.visible_message("[user] are stroking the head of [M] with a bangammer", "[user] are stroking the head with a bangammer", "you hear a bangammer stroking a head"); @@ -76,7 +80,8 @@ /obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS desc = "THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!\nActivate it in your hand to point to the nearest victim." - flags_1 = CONDUCT_1 | NODROP_1 | DROPDEL_1 + flags_1 = CONDUCT_1 + item_flags = NODROP | DROPDEL slot_flags = null block_chance = 0 //RNG WON'T HELP YOU NOW, PANSY light_range = 3 @@ -248,7 +253,7 @@ user.put_in_hands(S) to_chat(user, "You fasten the glass shard to the top of the rod with the cable.") - else if(istype(I, /obj/item/assembly/igniter) && !(I.flags_1 & NODROP_1)) + else if(istype(I, /obj/item/assembly/igniter) && !(I.item_flags & NODROP)) var/obj/item/melee/baton/cattleprod/P = new /obj/item/melee/baton/cattleprod remove_item_from_storage(user) @@ -411,7 +416,7 @@ item_state = "mounted_chainsaw" lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' - flags_1 = NODROP_1 | ABSTRACT_1 | DROPDEL_1 + item_flags = NODROP | ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE force = 24 throwforce = 0 @@ -591,7 +596,7 @@ icon_state = "madeyoulook" force = 0 throwforce = 0 - flags_1 = DROPDEL_1 | ABSTRACT_1 + item_flags = DROPDEL | ABSTRACT attack_verb = list("bopped") /obj/item/slapper @@ -601,7 +606,7 @@ item_state = "nothing" force = 0 throwforce = 0 - flags_1 = DROPDEL_1 | ABSTRACT_1 + item_flags = DROPDEL | ABSTRACT attack_verb = list("slapped") hitsound = 'sound/effects/snap.ogg' diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 5ce461b5ad..b296ec7f17 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -222,7 +222,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e tesla_zap(src, 3, power_bounced, tesla_flags, shocked_targets) addtimer(CALLBACK(src, .proc/reset_shocked), 10) -//The surgeon general warns that being buckled to certain objects recieving powerful shocks is greatly hazardous to your health +//The surgeon general warns that being buckled to certain objects receiving powerful shocks is greatly hazardous to your health //Only tesla coils and grounding rods currently call this because mobs are already targeted over all other objects, but this might be useful for more things later. /obj/proc/tesla_buckle_check(var/strength) if(has_buckled_mobs()) @@ -235,7 +235,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e //the obj is deconstructed into pieces, whether through careful disassembly or when destroyed. /obj/proc/deconstruct(disassembled = TRUE) - SendSignal(COMSIG_OBJ_DECONSTRUCT, disassembled) + SEND_SIGNAL(src, COMSIG_OBJ_DECONSTRUCT, disassembled) qdel(src) //what happens when the obj's health is below integrity_failure level. diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index ed797e4256..be26567c7e 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -63,7 +63,7 @@ /obj/structure/AIcore/latejoin_inactive/attackby(obj/item/P, mob/user, params) if(istype(P, /obj/item/multitool)) active = !active - to_chat(user, "You [active? "activate" : "deactivate"] [src]'s transimtters.") + to_chat(user, "You [active? "activate" : "deactivate"] [src]'s transmitters.") return return ..() @@ -184,8 +184,9 @@ to_chat(user, "Sticking an inactive [M.name] into the frame would sort of defeat the purpose.") return - if(!CONFIG_GET(flag/allow_ai) || jobban_isbanned(M.brainmob, "AI")) - to_chat(user, "This [M.name] does not seem to fit!") + if(!CONFIG_GET(flag/allow_ai) || (jobban_isbanned(M.brainmob, "AI") && !QDELETED(src) && !QDELETED(user) && !QDELETED(M) && !QDELETED(user) && Adjacent(user))) + if(!QDELETED(M)) + to_chat(user, "This [M.name] does not seem to fit!") return if(!M.brainmob.mind) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index a4915f6e1f..4727817945 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -192,20 +192,11 @@ /obj/structure/chair/comfy/lime color = rgb(255,251,0) -/obj/structure/chair/comfy/shuttle - name = "shuttle seat" - desc = "A comfortable, secure seat. It has a more sturdy looking buckling system, for smoother flights." - icon_state = "shuttle_chair" - -/obj/structure/chair/comfy/shuttle/GetArmrest() - return mutable_appearance('icons/obj/chairs.dmi', "shuttle_chair_armrest") - /obj/structure/chair/office anchored = FALSE buildstackamount = 5 item_chair = null - /obj/structure/chair/office/Moved() . = ..() if(has_gravity()) @@ -418,3 +409,10 @@ . = ..() if(has_gravity()) playsound(src, 'sound/machines/clockcult/integration_cog_install.ogg', 50, TRUE) + +/obj/structure/chair/shuttle + name = "shuttle seat" + desc = "A comfortable, secure seat. It has a more sturdy looking buckling system, for smoother flights." + icon = 'goon/icons/obj/chairs.dmi' + icon_state = "shuttle_chair" //thanks gannets! + diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index ca8d01fc07..93facf2c0c 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -163,18 +163,20 @@ else if(istype(AM, /obj/structure/closet)) return else if(isobj(AM)) - if(!allow_objects && !istype(AM, /obj/item) && !istype(AM, /obj/effect/dummy/chameleon)) + if (istype(AM, /obj/item)) + var/obj/item/I = AM + if (I.item_flags & NODROP) + return + else if(!allow_objects && !istype(AM, /obj/effect/dummy/chameleon)) return if(!allow_dense && AM.density) return - if(AM.anchored || AM.has_buckled_mobs() || (AM.flags_1 & NODROP_1)) + if(AM.anchored || AM.has_buckled_mobs()) return else return AM.forceMove(src) - if(AM.pulledby) - AM.pulledby.stop_pulling() return 1 @@ -245,7 +247,7 @@ if(opened) return welded = !welded - user.visible_message("[user] [welded ? "welds shut" : "unweldeds"] \the [src].", + user.visible_message("[user] [welded ? "welds shut" : "unwelded"] \the [src].", "You [welded ? "weld" : "unwelded"] \the [src] with \the [W].", "You hear welding.") update_icon() @@ -257,7 +259,7 @@ user.visible_message("[user] [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground.", \ "You [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground.", \ "You hear a ratchet.") - else if(user.a_intent != INTENT_HARM && !(W.flags_1 & NOBLUDGEON_1)) + else if(user.a_intent != INTENT_HARM && !(W.item_flags & NOBLUDGEON)) if(W.GetID() || !toggle(user)) togglelock(user) else diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 7ae18a481e..c9a2ad54ff 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -17,7 +17,7 @@ icon_state = "syndicate" /obj/structure/closet/gimmick/russian - name = "russian surplus closet" + name = "\improper Russian surplus closet" desc = "It's a storage unit for Russian standard-issue surplus." /obj/structure/closet/gimmick/russian/PopulateContents() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 4ce98bec52..faf5574374 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -164,7 +164,7 @@ new /obj/item/encryptionkey/headset_med(src) /obj/structure/closet/secure_closet/detective - name = "\proper detective's cabinet" + name = "\improper detective's cabinet" req_access = list(ACCESS_FORENSICS_LOCKERS) icon_state = "cabinet" resistance_flags = FLAMMABLE diff --git a/code/game/objects/structures/crates_lockers/crates/bins.dm b/code/game/objects/structures/crates_lockers/crates/bins.dm index 9f14fff8d0..c0ca1277d3 100644 --- a/code/game/objects/structures/crates_lockers/crates/bins.dm +++ b/code/game/objects/structures/crates_lockers/crates/bins.dm @@ -27,7 +27,7 @@ var/obj/item/storage/bag/trash/T = W to_chat(user, "You fill the bag.") for(var/obj/item/O in src) - T.SendSignal(COMSIG_TRY_STORAGE_INSERT, O, user, TRUE) + SEND_SIGNAL(T, COMSIG_TRY_STORAGE_INSERT, O, user, TRUE) T.update_icon() do_animate() return TRUE diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm index a98b800e09..5fd480f6fd 100644 --- a/code/game/objects/structures/divine.dm +++ b/code/game/objects/structures/divine.dm @@ -18,7 +18,7 @@ return to_chat(user, "You attempt to sacrifice [L] by invoking the sacrificial ritual.") L.gib() - message_admins("[ADMIN_LOOKUPFLW(user)] has sacrificed [key_name_admin(L)] on the sacrifical altar at [AREACOORD(src)].") + message_admins("[ADMIN_LOOKUPFLW(user)] has sacrificed [key_name_admin(L)] on the sacrificial altar at [AREACOORD(src)].") /obj/structure/healingfountain name = "healing fountain" diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index f73a206747..aa2f7bed86 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -8,23 +8,23 @@ max_integrity = 200 integrity_failure = 50 var/obj/item/extinguisher/stored_extinguisher - var/opened = 0 + var/opened = FALSE -/obj/structure/extinguisher_cabinet/examine(mob/user) - ..() - to_chat(user, "Alt-click to [opened ? "close":"open"] it.") - -/obj/structure/extinguisher_cabinet/New(loc, ndir, building) - ..() +/obj/structure/extinguisher_cabinet/Initialize(mapload, ndir, building) + . = ..() if(building) setDir(ndir) pixel_x = (dir & 3)? 0 : (dir == 4 ? -27 : 27) pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0 - opened = 1 + opened = TRUE icon_state = "extinguisher_empty" else stored_extinguisher = new /obj/item/extinguisher(src) +/obj/structure/extinguisher_cabinet/examine(mob/user) + ..() + to_chat(user, "Alt-click to [opened ? "close":"open"] it.") + /obj/structure/extinguisher_cabinet/Destroy() if(stored_extinguisher) qdel(stored_extinguisher) diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 0c84c4cf63..448734d917 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -1,19 +1,20 @@ /obj/structure/fireaxecabinet name = "fire axe cabinet" desc = "There is a small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if." - var/obj/item/twohanded/fireaxe/fireaxe = new/obj/item/twohanded/fireaxe icon = 'icons/obj/wallmounts.dmi' icon_state = "fireaxe" anchored = TRUE density = FALSE armor = list("melee" = 50, "bullet" = 20, "laser" = 0, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50) - var/locked = TRUE - var/open = FALSE max_integrity = 150 integrity_failure = 50 + var/locked = TRUE + var/open = FALSE + var/obj/item/twohanded/fireaxe/fireaxe /obj/structure/fireaxecabinet/Initialize() . = ..() + fireaxe = new update_icon() /obj/structure/fireaxecabinet/Destroy() diff --git a/code/game/objects/structures/fireplace.dm b/code/game/objects/structures/fireplace.dm index 2735bd7e81..b670fe5cf0 100644 --- a/code/game/objects/structures/fireplace.dm +++ b/code/game/objects/structures/fireplace.dm @@ -111,7 +111,7 @@ playsound(src, 'sound/effects/comfyfire.ogg',50,0, 0, 1) var/turf/T = get_turf(src) - T.hotspot_expose(700, 5) + T.hotspot_expose(500, 5) update_icon() adjust_light() diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 39ae5bfae8..43916182ac 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -476,7 +476,7 @@ random = TRUE mob_species = /datum/species/human flavour_text = "You are a security officer working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ - cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artifical Program telling you that you would only be asleep for eight hours. As you open \ + cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ your eyes, everything seems rusted and broken, a dark feeling sweels in your gut as you climb out of your pod." uniform = /obj/item/clothing/under/rank/security shoes = /obj/item/clothing/shoes/jackboots @@ -500,7 +500,7 @@ random = TRUE mob_species = /datum/species/human flavour_text = "You are an engineer working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ - cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artifical Program telling you that you would only be asleep for eight hours. As you open \ + cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ your eyes, everything seems rusted and broken, a dark feeling sweels in your gut as you climb out of your pod." uniform = /obj/item/clothing/under/rank/engineer shoes = /obj/item/clothing/shoes/workboots @@ -524,7 +524,7 @@ random = TRUE mob_species = /datum/species/human flavour_text = "You are a scientist working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ - cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artifical Program telling you that you would only be asleep for eight hours. As you open \ + cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ your eyes, everything seems rusted and broken, a dark feeling sweels in your gut as you climb out of your pod." uniform = /obj/item/clothing/under/rank/scientist shoes = /obj/item/clothing/shoes/laceup diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index 169132a158..df145baf94 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -180,7 +180,7 @@ icon = 'icons/obj/items_and_weapons.dmi' icon_state = "offhand" w_class = WEIGHT_CLASS_HUGE - flags_1 = ABSTRACT_1 | NODROP_1 | NOBLUDGEON_1 | DROPDEL_1 + item_flags = ABSTRACT | NODROP | NOBLUDGEON | DROPDEL resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF var/obj/machinery/manned_turret/turret diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 4d3b19177e..a247f4c125 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -201,7 +201,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an GLOBAL_LIST_EMPTY(crematoriums) /obj/structure/bodycontainer/crematorium name = "crematorium" - desc = "A human incinerator. Works well on barbeque nights." + desc = "A human incinerator. Works well on barbecue nights." icon_state = "crema1" dir = SOUTH var/id = 1 diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 0d7500ebf2..197b031c79 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -116,7 +116,7 @@ if(!ishuman(pushed_mob)) return var/mob/living/carbon/human/H = pushed_mob - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) /obj/structure/table/attackby(obj/item/I, mob/user, params) if(!(flags_1 & NODECONSTRUCT_1)) @@ -136,12 +136,12 @@ if(istype(I, /obj/item/storage/bag/tray)) var/obj/item/storage/bag/tray/T = I if(T.contents.len > 0) // If the tray isn't empty - I.SendSignal(COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location()) + SEND_SIGNAL(I, COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location()) user.visible_message("[user] empties [I] on [src].") return // If the tray IS empty, continue on (tray will be placed on the table like other items) - if(user.a_intent != INTENT_HARM && !(I.flags_1 & ABSTRACT_1)) + if(user.a_intent != INTENT_HARM && !(I.item_flags & ABSTRACT)) if(user.transferItemToLoc(I, drop_location())) var/list/click_params = params2list(params) //Center the icon where the user clicked. diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index f0e11434f2..56608789f7 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -42,9 +42,9 @@ for(var/obj/structure/transit_tube_pod/pod in src.loc) to_chat(user, "Remove the pod first!") return - user.visible_message("[user] starts to deattach \the [src].", "You start to deattach the [name]...") + user.visible_message("[user] starts to detach \the [src].", "You start to detach the [name]...") if(W.use_tool(src, user, time_to_unwrench, volume=50)) - to_chat(user, "You deattach the [name].") + to_chat(user, "You detach the [name].") var/obj/structure/c_transit_tube/R = new tube_construction(loc) R.setDir(dir) transfer_fingerprints_to(R) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 4798aae883..9b1bd0ec2c 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -241,7 +241,7 @@ soundloop.start() wash_turf() for(var/atom/movable/G in loc) - G.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + SEND_SIGNAL(G, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) if(isliving(G)) var/mob/living/L = G wash_mob(L) @@ -314,7 +314,7 @@ /obj/machinery/shower/proc/wash_obj(obj/O) - . = O.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + . = SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) if(isitem(O)) var/obj/item/I = O @@ -325,7 +325,7 @@ /obj/machinery/shower/proc/wash_turf() if(isturf(loc)) var/turf/tile = loc - tile.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) tile.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) for(var/obj/effect/E in tile) if(is_cleanable(E)) @@ -333,12 +333,12 @@ /obj/machinery/shower/proc/wash_mob(mob/living/L) - L.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) L.wash_cream() L.ExtinguishMob() L.adjust_fire_stacks(-20) //Douse ourselves with water to avoid fire more easily L.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - L.SendSignal(COMSIG_ADD_MOOD_EVENT, "shower", /datum/mood_event/nice_shower) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "shower", /datum/mood_event/nice_shower) if(iscarbon(L)) var/mob/living/carbon/M = L . = TRUE @@ -378,7 +378,7 @@ else if(H.w_uniform && wash_obj(H.w_uniform)) H.update_inv_w_uniform() if(washgloves) - H.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(H, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) if(H.shoes && washshoes && wash_obj(H.shoes)) H.update_inv_shoes() if(H.wear_mask && washmask && wash_obj(H.wear_mask)) @@ -395,9 +395,9 @@ else if(M.wear_mask && wash_obj(M.wear_mask)) M.update_inv_wear_mask(0) - M.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) else - L.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) /obj/machinery/shower/proc/contamination_cleanse(atom/movable/thing) var/datum/component/radioactive/healthy_green_glow = thing.GetComponent(/datum/component/radioactive) @@ -493,7 +493,7 @@ H.regenerate_icons() user.drowsyness = max(user.drowsyness - rand(2,3), 0) //Washing your face wakes you up if you're falling asleep else - user.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(user, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) /obj/structure/sink/attackby(obj/item/O, mob/living/user, params) if(busy) @@ -539,7 +539,7 @@ if(!istype(O)) return - if(O.flags_1 & ABSTRACT_1) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand. + if(O.item_flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand. return if(user.a_intent != INTENT_HARM) @@ -549,7 +549,7 @@ busy = FALSE return 1 busy = FALSE - O.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) O.acid_level = 0 create_reagents(5) reagents.add_reagent(dispensedreagent, 5) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 38efe39a2d..37abe17121 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -438,7 +438,7 @@ /obj/structure/window/plasma/reinforced name = "reinforced plasma window" - desc = "A window made out of a plasma-silicate alloy and a rod matrice. It looks hopelessly tough to break and is most likely nigh fireproof." + desc = "A window made out of a plasma-silicate alloy and a rod matrix. It looks hopelessly tough to break and is most likely nigh fireproof." icon_state = "plasmarwindow" reinf = TRUE heat_resistance = 50000 diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index e656b2f530..b0e46b8aa4 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -70,7 +70,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/list/old_baseturfs = baseturfs var/list/transferring_comps = list() - SendSignal(COMSIG_TURF_CHANGE, path, new_baseturfs, flags, transferring_comps) + SEND_SIGNAL(src, COMSIG_TURF_CHANGE, path, new_baseturfs, flags, transferring_comps) for(var/i in transferring_comps) var/datum/component/comp = i comp.RemoveComponent() diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index db1dba66cf..62ace4c77d 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -31,6 +31,10 @@ /turf/closed/indestructible/acid_act(acidpwr, acid_volume, acid_id) return 0 +/turf/closed/indestructible/Melt() + to_be_destroyed = FALSE + return src + /turf/closed/indestructible/oldshuttle name = "strange shuttle wall" icon = 'icons/turf/shuttleold.dmi' diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index f334f8e0b3..e1c771ed53 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -19,11 +19,15 @@ icon = 'icons/turf/floors.dmi' icon_state = "floor" +/turf/open/indestructible/Melt() + to_be_destroyed = FALSE + return src + /turf/open/indestructible/TerraformTurf(path, defer_change = FALSE, ignore_air = FALSE) return /turf/open/indestructible/sound - name = "squeeky floor" + name = "squeaky floor" var/sound /turf/open/indestructible/sound/Entered(var/mob/AM) @@ -186,7 +190,7 @@ for(var/mob/living/simple_animal/slime/M in src) M.apply_water() - SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) for(var/obj/effect/O in src) if(is_cleanable(O)) qdel(O) @@ -210,7 +214,7 @@ to_chat(C, "You slipped[ O ? " on the [O.name]" : ""]!") playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3) - C.SendSignal(COMSIG_ADD_MOOD_EVENT, "slipped", /datum/mood_event/slipped) + SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "slipped", /datum/mood_event/slipped) for(var/obj/item/I in C.held_items) C.accident(I) @@ -243,7 +247,7 @@ AddComponent(/datum/component/wet_floor, wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) /turf/open/proc/MakeDry(wet_setting = TURF_WET_WATER, immediate = FALSE, amount = INFINITY) - SendSignal(COMSIG_TURF_MAKE_DRY, wet_setting, immediate, amount) + SEND_SIGNAL(src, COMSIG_TURF_MAKE_DRY, wet_setting, immediate, amount) /turf/open/get_dumping_location() return src diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm index ffb672e773..48674e5ae4 100644 --- a/code/game/turfs/simulated/floor/light_floor.dm +++ b/code/game/turfs/simulated/floor/light_floor.dm @@ -80,7 +80,7 @@ update_icon() to_chat(user, "You replace the light bulb.") else - to_chat(user, "The lightbulb seems fine, no need to replace it.") + to_chat(user, "The light bulb seems fine, no need to replace it.") //Cycles through all of the colours diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index e5560df6ec..cd82888827 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -133,7 +133,7 @@ .=..() if(!.) if(istype(L)) - squeek() + squeak() /turf/open/floor/mineral/bananium/attackby(obj/item/W, mob/user, params) .=..() @@ -155,7 +155,7 @@ playsound(src, 'sound/items/bikehorn.ogg', 50, 1) spam_flag = world.time + 20 -/turf/open/floor/mineral/bananium/proc/squeek() +/turf/open/floor/mineral/bananium/proc/squeak() if(spam_flag < world.time) playsound(src, "clownstep", 50, 1) spam_flag = world.time + 10 diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index b3929abf91..3b3d4c40ec 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -47,17 +47,17 @@ initial_gas_mix = "TEMP=2.7" /turf/open/floor/circuit/killroom - name = "killroom Floor" + name = "killroom floor" initial_gas_mix = "n2=500;TEMP=80" /turf/open/floor/circuit/telecomms initial_gas_mix = "n2=100;TEMP=80" /turf/open/floor/circuit/telecomms/mainframe - name = "mainframe Base" + name = "mainframe base" /turf/open/floor/circuit/telecomms/server - name = "server Base" + name = "server base" /turf/open/floor/circuit/green icon_state = "gcircuit" @@ -81,7 +81,7 @@ initial_gas_mix = "n2=100;TEMP=80" /turf/open/floor/circuit/green/telecomms/mainframe - name = "mainframe Base" + name = "mainframe base" /turf/open/floor/circuit/red icon_state = "rcircuit" diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index 815cb52bd4..1b4f959fc9 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -60,7 +60,7 @@ /turf/open/floor/plasteel/brown/telecomms initial_gas_mix = "n2=100;TEMP=80" /turf/open/floor/plasteel/brown/telecomms/mainframe - name = "mainframe Floor" + name = "mainframe floor" /turf/open/floor/plasteel/brown/corner icon_state = "browncorner" @@ -349,9 +349,9 @@ /turf/open/floor/plasteel/vault/telecomms initial_gas_mix = "n2=100;TEMP=80" /turf/open/floor/plasteel/vault/telecomms/mainframe - name = "mainframe Floor" + name = "mainframe floor" /turf/open/floor/plasteel/vault/killroom - name = "killroom Floor" + name = "killroom floor" initial_gas_mix = "n2=500;TEMP=80" /turf/open/floor/plasteel/cult diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index 63ff9f6519..a57213a4f9 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -39,7 +39,7 @@ return TRUE if(istype(W, /obj/item/storage/bag/ore)) for(var/obj/item/stack/ore/O in src) - W.SendSignal(COMSIG_PARENT_ATTACKBY, O) + SEND_SIGNAL(W, COMSIG_PARENT_ATTACKBY, O) /turf/open/floor/plating/asteroid/singularity_act() if(is_planet_level(z)) @@ -47,7 +47,7 @@ ScrapeAway() /turf/open/floor/plating/asteroid/ex_act(severity, target) - . = SendSignal(COMSIG_ATOM_EX_ACT, severity, target) + . = SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target) contents_explosion(severity, target) /turf/open/floor/plating/lavaland_baseturf diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 987689cb9a..490a6dcaf7 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -466,3 +466,8 @@ var/datum/reagent/consumable/nutri_check = R if(nutri_check.nutriment_factor >0) M.reagents.remove_reagent(R.id,R.volume) + +//Whatever happens after high temperature fire dies out or thermite reaction works. +//Should return new turf +/turf/proc/Melt() + return ScrapeAway() \ No newline at end of file diff --git a/code/game/world.dm b/code/game/world.dm index a22d4345a5..7d7b17b4ac 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -11,7 +11,7 @@ GLOBAL_PROTECT(security_mode) SetupExternalRSC() - GLOB.config_error_log = GLOB.world_manifest_log = GLOB.world_pda_log = GLOB.sql_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = "data/logs/config_error.log" //temporary file used to record errors with loading config, moved to log directory once logging is set bl + GLOB.config_error_log = GLOB.world_manifest_log = GLOB.world_pda_log = GLOB.world_job_debug_log = GLOB.sql_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = "data/logs/config_error.log" //temporary file used to record errors with loading config, moved to log directory once logging is set bl CheckSecurityMode() @@ -96,6 +96,7 @@ GLOBAL_PROTECT(security_mode) GLOB.world_qdel_log = "[GLOB.log_directory]/qdel.log" GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log" GLOB.query_debug_log = "[GLOB.log_directory]/query_debug.log" + GLOB.world_job_debug_log = "[GLOB.log_directory]/job_debug.log" #ifdef UNIT_TESTS GLOB.test_log = file("[GLOB.log_directory]/tests.log") @@ -108,6 +109,7 @@ GLOBAL_PROTECT(security_mode) start_log(GLOB.world_href_log) start_log(GLOB.world_qdel_log) start_log(GLOB.world_runtime_log) + start_log(GLOB.world_job_debug_log) GLOB.changelog_hash = md5('html/changelog.html') //for telling if the changelog has changed recently if(fexists(GLOB.config_error_log)) From b1688405d9faa96e7d4c8a165a66182efeb649e0 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 2 Jul 2018 01:19:37 -0400 Subject: [PATCH 177/204] and finally, the modules folder. Now I can publish and take a break --- code/modules/NTNet/network.dm | 16 +- code/modules/VR/vr_sleeper.dm | 2 +- code/modules/admin/DB_ban/functions.dm | 39 ++- code/modules/admin/IsBanned.dm | 3 + code/modules/admin/admin.dm | 17 +- code/modules/admin/admin_investigate.dm | 2 +- code/modules/admin/admin_ranks.dm | 4 +- code/modules/admin/admin_verbs.dm | 1 - code/modules/admin/banjob.dm | 7 +- code/modules/admin/chat_commands.dm | 6 +- code/modules/admin/create_poll.dm | 14 +- code/modules/admin/fun_balloon.dm | 2 +- code/modules/admin/ipintel.dm | 5 +- code/modules/admin/permissionedit.dm | 77 +++++- code/modules/admin/secrets.dm | 15 +- code/modules/admin/sql_message_system.dm | 61 ++++- code/modules/admin/topic.dm | 24 +- code/modules/admin/verbs/adminhelp.dm | 4 +- code/modules/admin/verbs/adminpm.dm | 16 +- code/modules/admin/verbs/adminsay.dm | 4 +- code/modules/admin/verbs/manipulate_organs.dm | 16 +- code/modules/admin/verbs/one_click_antag.dm | 8 +- code/modules/admin/verbs/pray.dm | 2 +- .../antagonists/_common/antag_datum.dm | 6 +- .../antagonists/_common/antag_spawner.dm | 6 +- .../abductor/equipment/abduction_gear.dm | 7 +- .../abductor/equipment/abduction_outfits.dm | 2 +- .../antagonists/abductor/machinery/console.dm | 2 +- .../modules/antagonists/blob/blob/overmind.dm | 2 +- .../antagonists/changeling/changeling.dm | 2 +- .../antagonists/changeling/powers/absorb.dm | 7 - .../changeling/powers/augmented_eyesight.dm | 4 +- .../changeling/powers/digitalcamo.dm | 2 +- .../changeling/powers/mutations.dm | 17 +- .../changeling/powers/pheromone_receptors.dm | 57 +++++ .../changeling/powers/tiny_prick.dm | 2 +- .../changeling/powers/transform.dm | 16 +- .../clock_helpers/fabrication_helpers.dm | 16 +- .../clockcult/clock_helpers/slab_abilities.dm | 2 +- .../clockcult/clock_items/clockwork_armor.dm | 4 +- .../clockcult/clock_items/clockwork_slab.dm | 2 +- .../clockcult/clock_items/integration_cog.dm | 2 +- .../clock_items/replica_fabricator.dm | 2 +- .../clock_items/wraith_spectacles.dm | 2 +- .../clock_scriptures/scripture_drivers.dm | 2 +- code/modules/antagonists/cult/blood_magic.dm | 13 +- code/modules/antagonists/cult/cult.dm | 6 +- code/modules/antagonists/cult/cult_items.dm | 15 +- code/modules/antagonists/cult/runes.dm | 14 +- code/modules/antagonists/devil/imp/imp.dm | 2 +- .../devil/true_devil/_true_devil.dm | 2 +- .../antagonists/disease/disease_abilities.dm | 24 +- .../antagonists/disease/disease_mob.dm | 6 +- .../antagonists/highlander/highlander.dm | 2 +- .../nukeop/equipment/nuclear_challenge.dm | 4 +- .../nukeop/equipment/pinpointer.dm | 6 +- code/modules/antagonists/official/official.dm | 2 +- .../traitor/IAA/internal_affairs.dm | 7 +- .../traitor/equipment/Malf_Modules.dm | 6 +- .../antagonists/valentines/valentine.dm | 9 + .../antagonists/wizard/equipment/artefact.dm | 6 +- .../antagonists/wizard/equipment/soulstone.dm | 31 +-- .../antagonists/wizard/equipment/spellbook.dm | 18 +- code/modules/assembly/flash.dm | 4 +- code/modules/assembly/igniter.dm | 2 +- code/modules/assembly/infrared.dm | 11 +- code/modules/assembly/signaler.dm | 12 +- .../atmospherics/environmental/LINDA_fire.dm | 9 +- .../environmental/LINDA_turf_tile.dm | 20 +- .../atmospherics/gasmixtures/gas_mixture.dm | 10 +- .../atmospherics/gasmixtures/reactions.dm | 9 +- .../components/binary_devices/dp_vent_pump.dm | 2 +- .../components/binary_devices/pump.dm | 8 +- .../components/binary_devices/valve.dm | 1 - .../components/unary_devices/vent_pump.dm | 4 +- .../atmospherics/machinery/datum_pipeline.dm | 2 +- code/modules/awaymissions/capture_the_flag.dm | 4 +- code/modules/awaymissions/corpse.dm | 2 + .../awaymissions/mission_code/Academy.dm | 2 +- .../awaymissions/mission_code/caves.dm | 6 +- .../mission_code/moonoutpost19.dm | 12 +- .../awaymissions/mission_code/snowdin.dm | 37 +-- code/modules/cargo/bounties/special.dm | 2 +- code/modules/cargo/bounties/virus.dm | 2 +- code/modules/cargo/export_scanner.dm | 2 +- code/modules/cargo/exports/weapons.dm | 34 +-- code/modules/cargo/packs.dm | 64 ++--- code/modules/client/client_procs.dm | 28 ++- code/modules/client/preferences.dm | 81 +++--- code/modules/client/preferences_savefile.dm | 8 +- code/modules/client/verbs/ooc.dm | 60 ++++- code/modules/client/verbs/suicide.dm | 5 +- code/modules/clothing/chameleon.dm | 6 +- code/modules/clothing/ears/_ears.dm | 100 ++++---- code/modules/clothing/glasses/_glasses.dm | 2 +- code/modules/clothing/head/helmet.dm | 8 +- code/modules/clothing/head/jobs.dm | 4 +- code/modules/clothing/head/misc.dm | 10 +- code/modules/clothing/masks/hailer.dm | 2 +- code/modules/clothing/masks/miscellaneous.dm | 2 +- code/modules/clothing/outfits/event.dm | 2 +- code/modules/clothing/outfits/standard.dm | 10 +- code/modules/clothing/outfits/vr.dm | 2 +- code/modules/clothing/shoes/miscellaneous.dm | 10 +- .../modules/clothing/spacesuits/chronosuit.dm | 14 +- .../modules/clothing/spacesuits/flightsuit.dm | 10 +- code/modules/clothing/spacesuits/hardsuit.dm | 2 +- .../clothing/spacesuits/miscellaneous.dm | 4 +- code/modules/clothing/suits/armor.dm | 2 +- code/modules/clothing/suits/bio.dm | 2 +- code/modules/clothing/suits/cloaks.dm | 2 +- code/modules/clothing/suits/labcoat.dm | 4 +- code/modules/clothing/suits/miscellaneous.dm | 4 +- code/modules/clothing/suits/wiz_robe.dm | 2 +- code/modules/clothing/under/accessories.dm | 2 +- code/modules/clothing/under/color.dm | 2 +- code/modules/clothing/under/miscellaneous.dm | 6 +- code/modules/crafting/craft.dm | 3 +- code/modules/detectivework/evidence.dm | 4 +- .../detectivework/footprints_and_rag.dm | 4 +- code/modules/detectivework/scanner.dm | 5 +- code/modules/events/aurora_caelus.dm | 4 +- code/modules/events/disease_outbreak.dm | 22 +- code/modules/events/wizard/curseditems.dm | 2 +- code/modules/events/wizard/rpgloot.dm | 4 +- code/modules/fields/gravity.dm | 17 ++ code/modules/fields/turf_objects.dm | 2 +- code/modules/flufftext/Hallucination.dm | 4 +- code/modules/food_and_drinks/drinks/drinks.dm | 5 + code/modules/food_and_drinks/food.dm | 6 +- .../food_and_drinks/food/customizables.dm | 4 +- code/modules/food_and_drinks/food/snacks.dm | 2 +- .../food_and_drinks/food/snacks_pastry.dm | 4 +- .../food_and_drinks/food/snacks_pie.dm | 2 +- .../kitchen_machinery/deep_fryer.dm | 2 +- .../kitchen_machinery/food_cart.dm | 2 +- .../kitchen_machinery/gibber.dm | 2 +- .../kitchen_machinery/microwave.dm | 2 +- .../kitchen_machinery/processor.dm | 6 +- .../kitchen_machinery/smartfridge.dm | 9 +- code/modules/goonchat/browserOutput.dm | 25 +- .../browserassets/js/browserOutput.js | 66 ++++- code/modules/holiday/easter.dm | 4 +- code/modules/holodeck/computer.dm | 2 +- code/modules/holodeck/holo_effect.dm | 5 + code/modules/hydroponics/biogenerator.dm | 2 +- code/modules/hydroponics/grown/towercap.dm | 4 +- code/modules/hydroponics/hydroponics.dm | 2 +- code/modules/hydroponics/seeds.dm | 2 +- .../integrated_electronics/core/assemblies.dm | 21 +- .../integrated_electronics/core/debugger.dm | 3 +- .../integrated_electronics/core/detailer.dm | 5 +- .../core/integrated_circuit.dm | 2 +- .../integrated_electronics/core/pins.dm | 1 + .../integrated_electronics/core/printer.dm | 44 ++-- .../integrated_electronics/subtypes/input.dm | 69 +++++- .../subtypes/manipulation.dm | 10 +- .../integrated_electronics/subtypes/output.dm | 20 +- .../integrated_electronics/subtypes/power.dm | 2 +- .../subtypes/reagents.dm | 2 +- code/modules/jobs/access.dm | 2 +- code/modules/jobs/job_exp.dm | 12 +- code/modules/jobs/job_types/civilian.dm | 4 +- code/modules/jobs/job_types/job.dm | 4 +- code/modules/jobs/job_types/silicon.dm | 4 +- code/modules/keybindings/bindings_human.dm | 4 +- code/modules/library/lib_items.dm | 2 +- code/modules/library/lib_machines.dm | 42 ++-- code/modules/library/random_books.dm | 3 +- code/modules/lighting/lighting_atom.dm | 2 +- code/modules/mapping/reader.dm | 2 +- code/modules/mining/aux_base.dm | 5 +- code/modules/mining/equipment/goliath_hide.dm | 4 +- .../mining/equipment/kinetic_crusher.dm | 2 +- code/modules/mining/equipment/mining_tools.dm | 3 +- .../mining/equipment/regenerative_core.dm | 2 +- code/modules/mining/equipment/survival_pod.dm | 2 +- .../mining/equipment/wormhole_jaunter.dm | 22 +- code/modules/mining/fulton.dm | 2 +- .../mining/lavaland/necropolis_chests.dm | 4 +- code/modules/mining/machine_processing.dm | 2 +- code/modules/mining/machine_vending.dm | 2 +- code/modules/mining/minebot.dm | 2 +- code/modules/mining/ores_coins.dm | 2 +- code/modules/mining/satchel_ore_boxdm.dm | 4 +- .../modules/mob/dead/new_player/new_player.dm | 19 +- code/modules/mob/dead/new_player/poll.dm | 79 +++++- .../mob/dead/new_player/sprite_accessories.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 2 +- code/modules/mob/inventory.dm | 17 +- code/modules/mob/living/bloodcrawl.dm | 2 +- code/modules/mob/living/brain/posibrain.dm | 6 +- .../carbon/alien/humanoid/caste/praetorian.dm | 2 +- .../living/carbon/alien/humanoid/humanoid.dm | 2 +- .../mob/living/carbon/alien/humanoid/queen.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 35 +-- .../mob/living/carbon/carbon_defense.dm | 6 +- code/modules/mob/living/carbon/examine.dm | 2 +- .../mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 57 +++-- .../mob/living/carbon/human/human_defense.dm | 4 +- .../mob/living/carbon/human/human_movement.dm | 6 +- code/modules/mob/living/carbon/human/life.dm | 6 +- .../mob/living/carbon/human/species.dm | 55 ++-- .../carbon/human/species_types/humans.dm | 5 - .../carbon/human/species_types/jellypeople.dm | 2 + .../human/species_types/shadowpeople.dm | 4 +- code/modules/mob/living/carbon/inventory.dm | 5 +- code/modules/mob/living/carbon/life.dm | 4 +- .../mob/living/carbon/monkey/combat.dm | 4 +- code/modules/mob/living/carbon/monkey/life.dm | 16 +- .../modules/mob/living/carbon/status_procs.dm | 4 +- .../modules/mob/living/carbon/update_icons.dm | 19 +- code/modules/mob/living/death.dm | 2 +- code/modules/mob/living/emote.dm | 2 + code/modules/mob/living/inhand_holder.dm | 2 +- code/modules/mob/living/life.dm | 27 +- code/modules/mob/living/living.dm | 48 ++-- code/modules/mob/living/living_defense.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 4 +- code/modules/mob/living/silicon/pai/pai.dm | 2 +- .../mob/living/silicon/pai/pai_shell.dm | 2 +- .../mob/living/silicon/pai/software.dm | 2 +- .../mob/living/silicon/robot/inventory.dm | 14 +- .../modules/mob/living/silicon/robot/robot.dm | 18 +- .../mob/living/silicon/robot/robot_defense.dm | 2 +- .../mob/living/silicon/robot/robot_modules.dm | 2 +- code/modules/mob/living/silicon/silicon.dm | 5 +- .../mob/living/simple_animal/bot/bot.dm | 4 +- .../mob/living/simple_animal/bot/floorbot.dm | 2 +- .../mob/living/simple_animal/friendly/dog.dm | 4 +- .../simple_animal/friendly/drone/_drone.dm | 8 +- .../friendly/drone/drones_as_items.dm | 2 +- .../friendly/drone/extra_drone_types.dm | 6 +- .../friendly/drone/interaction.dm | 6 +- .../friendly/drone/visuals_icons.dm | 2 +- .../living/simple_animal/friendly/mouse.dm | 8 +- .../simple_animal/guardian/types/dextrous.dm | 4 +- .../simple_animal/guardian/types/support.dm | 12 +- .../mob/living/simple_animal/hostile/alien.dm | 2 +- .../simple_animal/hostile/giant_spider.dm | 4 +- .../hostile/jungle/mega_arachnid.dm | 3 +- .../hostile/megafauna/colossus.dm | 2 +- .../hostile/megafauna/swarmer.dm | 2 +- .../hostile/mining_mobs/goliath.dm | 2 +- .../living/simple_animal/hostile/skeleton.dm | 2 +- .../living/simple_animal/hostile/syndicate.dm | 2 +- .../simple_animal/hostile/wumborian_fugu.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- .../mob/living/simple_animal/slime/emote.dm | 2 +- .../mob/living/simple_animal/slime/life.dm | 2 +- .../mob/living/simple_animal/slime/slime.dm | 2 +- code/modules/mob/living/taste.dm | 2 +- code/modules/mob/login.dm | 1 + code/modules/mob/mob.dm | 8 +- code/modules/mob/say.dm | 8 +- code/modules/mob/transform_procs.dm | 2 +- .../modular_computers/file_system/program.dm | 2 +- .../file_system/programs/alarm.dm | 7 +- code/modules/ninja/suit/gloves.dm | 2 +- code/modules/ninja/suit/suit.dm | 18 +- code/modules/paperwork/contract.dm | 4 +- code/modules/paperwork/folders.dm | 4 +- code/modules/paperwork/pen.dm | 9 +- code/modules/power/gravitygenerator.dm | 6 + code/modules/power/lighting.dm | 2 +- code/modules/power/singularity/emitter.dm | 4 +- .../particle_accelerator/particle_emitter.dm | 2 +- code/modules/power/solar.dm | 6 +- code/modules/power/supermatter/supermatter.dm | 8 +- code/modules/power/tesla/energy_ball.dm | 3 + .../ammunition/ballistic/shotgun.dm | 7 +- .../boxes_magazines/external/smg.dm | 4 +- .../boxes_magazines/internal/_internal.dm | 3 +- .../boxes_magazines/internal/revolver.dm | 4 +- .../projectiles/guns/ballistic/pistol.dm | 6 +- .../projectiles/guns/ballistic/revolver.dm | 6 +- .../projectiles/guns/ballistic/shotgun.dm | 3 +- code/modules/projectiles/guns/energy/laser.dm | 4 +- code/modules/projectiles/guns/magic/wand.dm | 4 + .../projectiles/guns/misc/beam_rifle.dm | 4 +- code/modules/projectiles/pins.dm | 2 +- code/modules/projectiles/projectile.dm | 2 +- code/modules/projectiles/projectile/beams.dm | 2 +- .../projectile/bullets/_incendiary.dm | 2 +- .../projectiles/projectile/bullets/shotgun.dm | 4 - .../projectile/energy/net_snare.dm | 196 +++++++-------- .../projectiles/projectile/energy/stun.dm | 2 +- .../projectile/special/temperature.dm | 9 +- code/modules/reagents/chemistry/holder.dm | 87 ++++--- .../chemistry/machinery/chem_dispenser.dm | 8 +- .../chemistry/machinery/chem_heater.dm | 11 +- .../chemistry/machinery/chem_master.dm | 2 +- .../reagents/chemistry/machinery/pandemic.dm | 2 +- .../chemistry/machinery/reagentgrinder.dm | 4 +- code/modules/reagents/chemistry/reagents.dm | 21 +- .../chemistry/reagents/alcohol_reagents.dm | 13 +- .../chemistry/reagents/drug_reagents.dm | 6 +- .../chemistry/reagents/other_reagents.dm | 18 +- .../chemistry/reagents/toxin_reagents.dm | 1 + .../reagents/reagent_containers/borghydro.dm | 4 +- .../reagents/reagent_containers/bottle.dm | 28 +-- .../reagents/reagent_containers/medspray.dm | 2 +- .../reagents/reagent_containers/spray.dm | 2 +- code/modules/recycling/conveyor2.dm | 2 +- code/modules/recycling/disposal/bin.dm | 2 +- .../recycling/disposal/construction.dm | 2 +- code/modules/recycling/disposal/pipe.dm | 2 +- .../research/designs/autolathe_designs.dm | 5 +- .../research/designs/electronics_designs.dm | 2 +- .../research/designs/machine_designs.dm | 2 +- .../designs/mechfabricator_designs.dm | 38 ++- .../research/designs/medical_designs.dm | 14 +- .../research/designs/mining_designs.dm | 2 +- .../modules/research/designs/power_designs.dm | 2 +- .../research/designs/weapon_designs.dm | 2 +- .../modules/research/machinery/_production.dm | 2 +- .../departmental_circuit_imprinter.dm | 2 +- .../machinery/departmental_protolathe.dm | 2 +- code/modules/research/rdmachines.dm | 4 + code/modules/research/techweb/_techweb.dm | 12 +- code/modules/research/techweb/all_nodes.dm | 10 +- .../xenobiology/crossbreeding/_corecross.dm | 2 +- .../crossbreeding/_status_effects.dm | 1 + .../xenobiology/crossbreeding/charged.dm | 10 +- .../xenobiology/crossbreeding/recurring.dm | 1 + .../xenobiology/crossbreeding/reproductive.dm | 2 +- .../crossbreeding/selfsustaining.dm | 3 +- .../xenobiology/crossbreeding/stabilized.dm | 2 +- .../research/xenobiology/xenobiology.dm | 10 +- .../ruins/spaceruin_code/listeningstation.dm | 4 +- .../ruins/spaceruin_code/oldstation.dm | 6 +- code/modules/shuttle/assault_pod.dm | 2 +- code/modules/shuttle/emergency.dm | 14 +- code/modules/shuttle/ferry.dm | 2 +- code/modules/shuttle/shuttle_rotate.dm | 2 +- code/modules/shuttle/special.dm | 2 +- code/modules/shuttle/supply.dm | 2 +- code/modules/spells/spell.dm | 2 +- code/modules/spells/spell_types/barnyard.dm | 2 +- .../spells/spell_types/construct_spells.dm | 2 +- code/modules/spells/spell_types/godhand.dm | 7 +- code/modules/spells/spell_types/lichdom.dm | 4 +- code/modules/spells/spell_types/mime.dm | 17 +- code/modules/spells/spell_types/summonitem.dm | 8 +- code/modules/station_goals/dna_vault.dm | 2 +- .../surgery/bodyparts/dismemberment.dm | 4 +- code/modules/surgery/bodyparts/helpers.dm | 2 +- code/modules/surgery/cavity_implant.dm | 6 +- code/modules/surgery/organs/augments_arms.dm | 2 +- code/modules/surgery/organs/augments_chest.dm | 2 +- .../surgery/organs/augments_internal.dm | 6 +- code/modules/surgery/organs/eyes.dm | 2 +- code/modules/surgery/organs/stomach.dm | 10 +- code/modules/surgery/organs/vocal_cords.dm | 2 +- .../modules/surgery/remove_embedded_object.dm | 2 +- code/modules/tgui/states/default.dm | 2 +- code/modules/uplink/uplink_devices.dm | 54 ++-- code/modules/uplink/uplink_items.dm | 4 +- code/modules/vending/_vending.dm | 234 +++++++++--------- code/modules/vending/autodrobe.dm | 10 +- code/modules/vending/boozeomat.dm | 25 +- code/modules/vending/cigarette.dm | 2 - code/modules/vending/clothesmate.dm | 2 - code/modules/vending/coffee.dm | 6 +- code/modules/vending/cola.dm | 2 - code/modules/vending/engineering.dm | 2 +- code/modules/vending/engivend.dm | 2 +- code/modules/vending/games.dm | 4 +- code/modules/vending/liberation.dm | 16 +- code/modules/vending/liberation_toy.dm | 3 +- code/modules/vending/medical.dm | 32 ++- code/modules/vending/medical_wall.dm | 7 +- code/modules/vending/robotics.dm | 2 +- code/modules/vending/security.dm | 2 +- code/modules/vending/snack.dm | 6 +- code/modules/vending/toys.dm | 34 +-- code/modules/vending/wardrobes.dm | 37 +-- code/modules/vending/youtool.dm | 1 - code/modules/zombie/items.dm | 2 +- 380 files changed, 2204 insertions(+), 1588 deletions(-) create mode 100644 code/modules/antagonists/changeling/powers/pheromone_receptors.dm create mode 100644 code/modules/fields/gravity.dm diff --git a/code/modules/NTNet/network.dm b/code/modules/NTNet/network.dm index 68b158dd65..ae8948dafb 100644 --- a/code/modules/NTNet/network.dm +++ b/code/modules/NTNet/network.dm @@ -102,20 +102,20 @@ return FALSE data.network_id = src log_data_transfer(data) - var/list/datum/component/ntnet_interface/recieving = list() + var/list/datum/component/ntnet_interface/receiving = list() if((length(data.recipient_ids == 1) && data.recipient_ids[1] == NETWORK_BROADCAST_ID) || data.recipient_ids == NETWORK_BROADCAST_ID) data.broadcast = TRUE for(var/i in connected_interfaces_by_id) - recieving |= connected_interfaces_by_id[i] + receiving |= connected_interfaces_by_id[i] else for(var/i in data.recipient_ids) - var/datum/component/ntnet_interface/reciever = find_interface_id(i) - recieving |= reciever + var/datum/component/ntnet_interface/receiver = find_interface_id(i) + receiving |= receiver - for(var/i in recieving) - var/datum/component/ntnet_interface/reciever = i - if(reciever) - reciever.__network_recieve(data) + for(var/i in receiving) + var/datum/component/ntnet_interface/receiver = i + if(receiver) + receiver.__network_receive(data) for(var/i in services_by_id) var/datum/ntnet_service/serv = services_by_id[i] diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index dd89a08c9e..c36f0f040b 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -144,7 +144,7 @@ data["isoccupant"] = (user == occupant) return data -/obj/machinery/vr_sleeper/proc/get_vr_spawnpoint() //proc so it can be overriden for team games or something +/obj/machinery/vr_sleeper/proc/get_vr_spawnpoint() //proc so it can be overridden for team games or something return safepick(GLOB.vr_spawnpoints[vr_category]) /obj/machinery/vr_sleeper/proc/build_spawnpoints() // used to rebuild the list for admins if need be diff --git a/code/modules/admin/DB_ban/functions.dm b/code/modules/admin/DB_ban/functions.dm index 09d0d5d2e2..fd95783525 100644 --- a/code/modules/admin/DB_ban/functions.dm +++ b/code/modules/admin/DB_ban/functions.dm @@ -74,12 +74,20 @@ ckey = ckey(banckey) computerid = bancid ip = banip + + var/had_banned_mob = banned_mob != null + var/client/banned_client = banned_mob?.client + var/banned_mob_guest_key = had_banned_mob && IsGuestKey(banned_mob.key) + banned_mob = null var/datum/DBQuery/query_add_ban_get_ckey = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[ckey]'") if(!query_add_ban_get_ckey.warn_execute()) + qdel(query_add_ban_get_ckey) return - if(!query_add_ban_get_ckey.NextRow()) - if(!banned_mob || (banned_mob && !IsGuestKey(banned_mob.key))) + var/seen_before = query_add_ban_get_ckey.NextRow() + qdel(query_add_ban_get_ckey) + if(!seen_before) + if(!had_banned_mob || (had_banned_mob && !banned_mob_guest_key)) if(alert(usr, "[ckey] has not been seen before, are you sure you want to create a ban for them?", "Unknown ckey", "Yes", "No", "Cancel") != "Yes") return @@ -116,6 +124,7 @@ if(maxadminbancheck) var/datum/DBQuery/query_check_adminban_amt = SSdbcore.NewQuery("SELECT count(id) AS num FROM [format_table_name("ban")] WHERE (a_ckey = '[a_ckey]') AND (bantype = 'ADMIN_PERMABAN' OR (bantype = 'ADMIN_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)") if(!query_check_adminban_amt.warn_execute()) + qdel(query_check_adminban_amt) return if(query_check_adminban_amt.NextRow()) var/adm_bans = text2num(query_check_adminban_amt.item[1]) @@ -124,7 +133,9 @@ max_bans = MAX_ADMIN_BANS_PER_HEADMIN if(adm_bans >= max_bans) to_chat(usr, "You already logged [max_bans] admin ban(s) or more. Do not abuse this function!") + qdel(query_check_adminban_amt) return + qdel(query_check_adminban_amt) if(!computerid) computerid = "0" if(!ip) @@ -132,7 +143,9 @@ var/sql = "INSERT INTO [format_table_name("ban")] (`bantime`,`server_ip`,`server_port`,`round_id`,`bantype`,`reason`,`job`,`duration`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]', '[GLOB.round_id]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', INET_ATON('[ip]'), '[a_ckey]', '[a_computerid]', INET_ATON('[a_ip]'), '[who]', '[adminwho]')" var/datum/DBQuery/query_add_ban = SSdbcore.NewQuery(sql) if(!query_add_ban.warn_execute()) + qdel(query_add_ban) return + qdel(query_add_ban) to_chat(usr, "Ban saved to database.") var/msg = "[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database." message_admins(msg,1) @@ -144,8 +157,8 @@ if(kickbannedckey) if(AH) AH.Resolve() //with prejudice - if(banned_mob && banned_mob.client && banned_mob.client.ckey == banckey) - qdel(banned_mob.client) + if(banned_client && banned_client.ckey == banckey) + qdel(banned_client) return 1 /datum/admins/proc/DB_ban_unban(ckey, bantype, job = "") @@ -204,10 +217,12 @@ var/datum/DBQuery/query_unban_get_id = SSdbcore.NewQuery(sql) if(!query_unban_get_id.warn_execute()) + qdel(query_unban_get_id) return while(query_unban_get_id.NextRow()) ban_id = query_unban_get_id.item[1] ban_number++; + qdel(query_unban_get_id) if(ban_number == 0) to_chat(usr, "Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin.") @@ -236,6 +251,7 @@ var/datum/DBQuery/query_edit_ban_get_details = SSdbcore.NewQuery("SELECT ckey, duration, reason FROM [format_table_name("ban")] WHERE id = [banid]") if(!query_edit_ban_get_details.warn_execute()) + qdel(query_edit_ban_get_details) return var/eckey = usr.ckey //Editing admin ckey @@ -249,7 +265,9 @@ reason = query_edit_ban_get_details.item[3] else to_chat(usr, "Invalid ban id. Contact the database admin") + qdel(query_edit_ban_get_details) return + qdel(query_edit_ban_get_details) reason = sanitizeSQL(reason) var/value @@ -265,7 +283,9 @@ var/datum/DBQuery/query_edit_ban_reason = SSdbcore.NewQuery("UPDATE [format_table_name("ban")] SET reason = '[value]', edits = CONCAT(edits,'- [eckey] changed ban reason from \\\"[reason]\\\" to \\\"[value]\\\"
    ') WHERE id = [banid]") if(!query_edit_ban_reason.warn_execute()) + qdel(query_edit_ban_reason) return + qdel(query_edit_ban_reason) message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s reason from [reason] to [value]") if("duration") if(!value) @@ -276,7 +296,9 @@ var/datum/DBQuery/query_edit_ban_duration = SSdbcore.NewQuery("UPDATE [format_table_name("ban")] SET duration = [value], edits = CONCAT(edits,'- [eckey] changed ban duration from [duration] to [value]
    '), expiration_time = DATE_ADD(bantime, INTERVAL [value] MINUTE) WHERE id = [banid]") if(!query_edit_ban_duration.warn_execute()) + qdel(query_edit_ban_duration) return + qdel(query_edit_ban_duration) message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s duration from [duration] to [value]") if("unban") if(alert("Unban [pckey]?", "Unban?", "Yes", "No") == "Yes") @@ -304,10 +326,12 @@ var/pckey var/datum/DBQuery/query_unban_get_ckey = SSdbcore.NewQuery(sql) if(!query_unban_get_ckey.warn_execute()) + qdel(query_unban_get_ckey) return while(query_unban_get_ckey.NextRow()) pckey = query_unban_get_ckey.item[1] ban_number++; + qdel(query_unban_get_ckey) if(ban_number == 0) to_chat(usr, "Database update failed due to a ban id not being present in the database.") @@ -327,7 +351,9 @@ var/sql_update = "UPDATE [format_table_name("ban")] SET unbanned = 1, unbanned_datetime = Now(), unbanned_ckey = '[unban_ckey]', unbanned_computerid = '[unban_computerid]', unbanned_ip = INET_ATON('[unban_ip]') WHERE id = [id]" var/datum/DBQuery/query_unban = SSdbcore.NewQuery(sql_update) if(!query_unban.warn_execute()) + qdel(query_unban) return + qdel(query_unban) message_admins("[key_name_admin(usr)] has lifted [pckey]'s ban.") /client/proc/DB_ban_panel() @@ -422,9 +448,11 @@ page = text2num(page) var/datum/DBQuery/query_count_bans = SSdbcore.NewQuery("SELECT COUNT(id) FROM [format_table_name("ban")] WHERE [search]") if(!query_count_bans.warn_execute()) + qdel(query_count_bans) return if(query_count_bans.NextRow()) bancount = text2num(query_count_bans.item[1]) + qdel(query_count_bans) if(bancount > bansperpage) output += "
    Page: " while(bancount > 0) @@ -448,6 +476,7 @@ var/limit = " LIMIT [bansperpage * page], [bansperpage]" var/datum/DBQuery/query_search_bans = SSdbcore.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, ckey, a_ckey, unbanned, unbanned_ckey, unbanned_datetime, edits, round_id FROM [format_table_name("ban")] WHERE [search] ORDER BY bantime DESC[limit]") if(!query_search_bans.warn_execute()) + qdel(query_search_bans) return while(query_search_bans.NextRow()) @@ -511,7 +540,7 @@ output += "" output += " " output += "" - + qdel(query_search_bans) output += "" usr << browse(output,"window=lookupbans;size=900x500") diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 097076fc74..a3f83ef3ba 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -80,6 +80,7 @@ var/datum/DBQuery/query_ban_check = SSdbcore.NewQuery("SELECT ckey, a_ckey, reason, expiration_time, duration, bantime, bantype, id, round_id FROM [format_table_name("ban")] WHERE (ckey = '[ckeytext]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR bantype = 'ADMIN_PERMABAN' OR ((bantype = 'TEMPBAN' OR bantype = 'ADMIN_TEMPBAN') AND expiration_time > Now())) AND isnull(unbanned)") if(!query_ban_check.Execute()) + qdel(query_ban_check) return while(query_ban_check.NextRow()) var/pckey = query_ban_check.item[1] @@ -117,7 +118,9 @@ log_access("Failed Login: [key] [computer_id] [address] - Banned (#[banid]) [.["reason"]]") + qdel(query_ban_check) return . + qdel(query_ban_check) var/list/ban = ..() //default pager ban stuff if (ban) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 8cce9bc4f4..d9ab979686 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1,11 +1,11 @@ //////////////////////////////// /proc/message_admins(msg) - msg = "ADMIN LOG: [msg]" + msg = "ADMIN LOG: [msg]" to_chat(GLOB.admins, msg) /proc/relay_msg_admins(msg) - msg = "RELAY: [msg]" + msg = "RELAY: [msg]" to_chat(GLOB.admins, msg) @@ -77,14 +77,19 @@ body += "Ban | " body += "Jobban | " body += "Identity Ban | " + var/rm = REF(M) if(jobban_isbanned(M, "OOC")) - body+= "OOCBan | " + body+= "OOCBan | " else - body+= "OOCBan | " + body+= "OOCBan | " + if(QDELETED(M) || QDELETED(usr)) + return if(jobban_isbanned(M, "emote")) - body+= "EmoteBan | " + body+= "EmoteBan | " else - body+= "Emoteban | " + body+= "Emoteban | " + if(QDELETED(M) || QDELETED(usr)) + return body += "Notes | Messages | Watchlist | " if(M.client) diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index b5fead892f..94efce6059 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -4,7 +4,7 @@ var/F = file("[GLOB.log_directory]/[subject].html") WRITE_FILE(F, "[time_stamp()] [REF(src)] ([x],[y],[z]) || [src] [message]
    ") -/client/proc/investigate_show(subject in list("notes, memos, watchlist", INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION) ) +/client/proc/investigate_show(subject in list("notes, memos, watchlist", INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_CIRCUIT) ) set name = "Investigate" set category = "Admin" if(!holder) diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 4aab13dbe5..b6824cc1a0 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -146,7 +146,7 @@ GLOBAL_PROTECT(protected_ranks) var/sql_exclude_flags = sanitizeSQL(R.exclude_rights) var/sql_can_edit_flags = sanitizeSQL(R.can_edit_rights) sql_ranks += list(list("rank" = "'[sql_rank]'", "flags" = "[sql_flags]", "exclude_flags" = "[sql_exclude_flags]", "can_edit_flags" = "[sql_can_edit_flags]")) - SSdbcore.MassInsert(format_table_name("admin_ranks"), sql_ranks, duplicate_key = TRUE) + SSdbcore.MassInsert(format_table_name("admin_ranks"), sql_ranks, duplicate_key = TRUE, blocking = TRUE) else var/datum/DBQuery/query_load_admin_ranks = SSdbcore.NewQuery("SELECT rank, flags, exclude_flags, can_edit_flags FROM [format_table_name("admin_ranks")]") if(!query_load_admin_ranks.Execute()) @@ -169,6 +169,7 @@ GLOBAL_PROTECT(protected_ranks) if(!R) continue GLOB.admin_ranks += R + qdel(query_load_admin_ranks) //load ranks from backup file if(dbfail) var/backup_file = file("data/admins_backup.json") @@ -247,6 +248,7 @@ GLOBAL_PROTECT(protected_ranks) skip = 1 if(!skip) new /datum/admins(rank_names[admin_rank], admin_ckey) + qdel(query_load_admins) //load admins from backup file if(dbfail) var/backup_file = file("data/admins_backup.json") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 21642784a3..6104658e23 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1,5 +1,4 @@ //admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless -//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless //the procs are cause you can't put the comments in the GLOB var define GLOBAL_PROTECT(admin_verbs_default) GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault()) diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index 7e200c3aa2..fbb97fcea7 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -6,12 +6,14 @@ if(!M.client) //no cache. fallback to a datum/DBQuery var/datum/DBQuery/query_jobban_check_ban = SSdbcore.NewQuery("SELECT reason FROM [format_table_name("ban")] WHERE ckey = '[sanitizeSQL(M.ckey)]' AND (bantype = 'JOB_PERMABAN' OR (bantype = 'JOB_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned) AND job = '[sanitizeSQL(rank)]'") if(!query_jobban_check_ban.warn_execute()) + qdel(query_jobban_check_ban) return if(query_jobban_check_ban.NextRow()) var/reason = query_jobban_check_ban.item[1] + qdel(query_jobban_check_ban) return reason ? reason : TRUE //we don't want to return "" if there is no ban reason, as that would evaluate to false - else - return FALSE + qdel(query_jobban_check_ban) + return FALSE if(!M.client.jobbancache) jobban_buildcache(M.client) @@ -31,6 +33,7 @@ return while(query_jobban_build_cache.NextRow()) C.jobbancache[query_jobban_build_cache.item[1]] = query_jobban_build_cache.item[2] + qdel(query_jobban_build_cache) /proc/ban_unban_log_save(var/formatted_log) text2file(formatted_log,"data/ban_unban_log.txt") diff --git a/code/modules/admin/chat_commands.dm b/code/modules/admin/chat_commands.dm index dbeb6fce7f..c4e5679c76 100644 --- a/code/modules/admin/chat_commands.dm +++ b/code/modules/admin/chat_commands.dm @@ -110,6 +110,10 @@ GLOBAL_LIST(round_end_notifiees) admin_only = TRUE /datum/tgs_chat_command/reload_admins/Run(datum/tgs_chat_user/sender, params) - load_admins() + ReloadAsync() log_admin("[sender.friendly_name] reloaded admins via chat command.") return "Admins reloaded." + +/datum/tgs_chat_command/reload_admins/proc/ReloadAsync() + set waitfor = FALSE + load_admins() \ No newline at end of file diff --git a/code/modules/admin/create_poll.dm b/code/modules/admin/create_poll.dm index 90fd6c66c9..f098dc1f05 100644 --- a/code/modules/admin/create_poll.dm +++ b/code/modules/admin/create_poll.dm @@ -36,7 +36,8 @@ return endtime = sanitizeSQL(endtime) var/datum/DBQuery/query_validate_time = SSdbcore.NewQuery("SELECT IF(STR_TO_DATE('[endtime]','%Y-%c-%d %T') > NOW(), STR_TO_DATE('[endtime]','%Y-%c-%d %T'), 0)") - if(!query_validate_time.warn_execute()) + if(!query_validate_time.warn_execute() || QDELETED(usr) || !src) + qdel(query_validate_time) return if(query_validate_time.NextRow()) var/checktime = text2num(query_validate_time.item[1]) @@ -44,6 +45,7 @@ to_chat(src, "Datetime entered is improperly formatted or not later than current server time.") return endtime = query_validate_time.item[1] + qdel(query_validate_time) var/adminonly switch(alert("Admin only poll?",,"Yes","No","Cancel")) if("Yes") @@ -124,18 +126,24 @@ add_option = 0 else return 0 + var/m1 = "[key_name(usr)] has created a new server poll. Poll type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"] - Question: [question]" + var/m2 = "[key_name_admin(usr)] has created a new server poll. Poll type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"]
    Question: [question]" var/datum/DBQuery/query_polladd_question = SSdbcore.NewQuery("INSERT INTO [format_table_name("poll_question")] (polltype, starttime, endtime, question, adminonly, multiplechoiceoptions, createdby_ckey, createdby_ip, dontshow) VALUES ('[polltype]', '[starttime]', '[endtime]', '[question]', '[adminonly]', '[choice_amount]', '[sql_ckey]', INET_ATON('[address]'), '[dontshow]')") if(!query_polladd_question.warn_execute()) + qdel(query_polladd_question) return + qdel(query_polladd_question) if(polltype != POLLTYPE_TEXT) var/pollid = 0 var/datum/DBQuery/query_get_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") if(!query_get_id.warn_execute()) + qdel(query_get_id) return if(query_get_id.NextRow()) pollid = query_get_id.item[1] + qdel(query_get_id) for(var/list/i in sql_option_list) i |= list("pollid" = "'[pollid]'") SSdbcore.MassInsert(format_table_name("poll_option"), sql_option_list, warn = 1) - log_admin("[key_name(usr)] has created a new server poll. Poll type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"] - Question: [question]") - message_admins("[key_name_admin(usr)] has created a new server poll. Poll type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"]
    Question: [question]") + log_admin(m1) + message_admins(m2) diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 85feb3026c..c88c610841 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -177,5 +177,5 @@ /area/shuttle_arena name = "arena" - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY requires_power = FALSE diff --git a/code/modules/admin/ipintel.dm b/code/modules/admin/ipintel.dm index fa9951f276..e0056b3e40 100644 --- a/code/modules/admin/ipintel.dm +++ b/code/modules/admin/ipintel.dm @@ -51,6 +51,7 @@ )) "}) if(!query_get_ip_intel.Execute()) + qdel(query_get_ip_intel) return if (query_get_ip_intel.NextRow()) res.cache = TRUE @@ -59,14 +60,16 @@ res.cacheminutesago = text2num(query_get_ip_intel.item[3]) res.cacherealtime = world.realtime - (text2num(query_get_ip_intel.item[3])*10*60) SSipintel.cache[ip] = res + qdel(query_get_ip_intel) return + qdel(query_get_ip_intel) res.intel = ip_intel_query(ip) if (updatecache && res.intel >= 0) SSipintel.cache[ip] = res if(SSdbcore.Connect()) var/datum/DBQuery/query_add_ip_intel = SSdbcore.NewQuery("INSERT INTO [format_table_name("ipintel")] (ip, intel) VALUES (INET_ATON('[ip]'), [res.intel]) ON DUPLICATE KEY UPDATE intel = VALUES(intel), date = NOW()") query_add_ip_intel.Execute() - + qdel(query_add_ip_intel) /proc/ip_intel_query(ip, var/retryed=0) diff --git a/code/modules/admin/permissionedit.dm b/code/modules/admin/permissionedit.dm index 8c608a6e5e..ac55eac872 100644 --- a/code/modules/admin/permissionedit.dm +++ b/code/modules/admin/permissionedit.dm @@ -31,9 +31,11 @@ page = text2num(page) var/datum/DBQuery/query_count_admin_logs = SSdbcore.NewQuery("SELECT COUNT(id) FROM [format_table_name("admin_log")][search]") if(!query_count_admin_logs.warn_execute()) + qdel(query_count_admin_logs) return if(query_count_admin_logs.NextRow()) logcount = text2num(query_count_admin_logs.item[1]) + qdel(query_count_admin_logs) if(logcount > logssperpage) output += "
    Page: " while(logcount > 0) @@ -44,6 +46,7 @@ var/limit = " LIMIT [logssperpage * page], [logssperpage]" var/datum/DBQuery/query_search_admin_logs = SSdbcore.NewQuery("SELECT datetime, round_id, adminckey, operation, target, log FROM [format_table_name("admin_log")][search] ORDER BY datetime DESC[limit]") if(!query_search_admin_logs.warn_execute()) + qdel(query_search_admin_logs) return while(query_search_admin_logs.NextRow()) var/datetime = query_search_admin_logs.item[1] @@ -53,19 +56,23 @@ target = query_search_admin_logs.item[5] var/log = query_search_admin_logs.item[6] output += "

    [datetime] | Round ID [round_id] | Admin [admin_ckey] | Operation [operation] on [target]
    [log]


    " + qdel(query_search_admin_logs) if(action == 2) output += "

    Admin ckeys with invalid ranks

    " var/datum/DBQuery/query_check_admin_errors = SSdbcore.NewQuery("SELECT ckey, [format_table_name("admin")].rank FROM [format_table_name("admin")] LEFT JOIN [format_table_name("admin_ranks")] ON [format_table_name("admin_ranks")].rank = [format_table_name("admin")].rank WHERE [format_table_name("admin_ranks")].rank IS NULL") if(!query_check_admin_errors.warn_execute()) + qdel(query_check_admin_errors) return while(query_check_admin_errors.NextRow()) var/admin_ckey = query_check_admin_errors.item[1] var/admin_rank = query_check_admin_errors.item[2] - output += "[admin_ckey] has non-existant rank [admin_rank] | \[Change Rank\] | \[Remove\]" + output += "[admin_ckey] has non-existent rank [admin_rank] | \[Change Rank\] | \[Remove\]" output += "
    " + qdel(query_check_admin_errors) output += "

    Unused ranks

    " var/datum/DBQuery/query_check_unused_rank = SSdbcore.NewQuery("SELECT [format_table_name("admin_ranks")].rank, flags, exclude_flags, can_edit_flags FROM [format_table_name("admin_ranks")] LEFT JOIN [format_table_name("admin")] ON [format_table_name("admin")].rank = [format_table_name("admin_ranks")].rank WHERE [format_table_name("admin")].rank IS NULL") if(!query_check_unused_rank.warn_execute()) + qdel(query_check_unused_rank) return while(query_check_unused_rank.NextRow()) var/admin_rank = query_check_unused_rank.item[1] @@ -74,6 +81,7 @@
    Denied: [rights2text(text2num(query_check_unused_rank.item[3])," ", "-")]
    Allowed to edit: [rights2text(text2num(query_check_unused_rank.item[4])," ", "*")]
    "} + qdel(query_check_unused_rank) else if(!action) output += {" Permissions Panel @@ -108,6 +116,8 @@ output += "[rights2text(D.rank.can_edit_rights," ", "*")]" output += "" output += "
    Search:
    " + if(QDELETED(usr)) + return usr << browse("[jointext(output, "")]","window=editrights;size=1000x650") /datum/admins/proc/edit_rights_topic(list/href_list) @@ -153,6 +163,8 @@ admin_ckey = sanitizeSQL(admin_ckey) else use_db = FALSE + if(QDELETED(usr)) + return if(task != "add") D = GLOB.admin_datums[admin_ckey] if(!D) @@ -198,16 +210,23 @@ //if an admin exists without a datum they won't be caught by the above var/datum/DBQuery/query_admin_in_db = SSdbcore.NewQuery("SELECT 1 FROM [format_table_name("admin")] WHERE ckey = '[.]'") if(!query_admin_in_db.warn_execute()) + qdel(query_admin_in_db) return FALSE if(query_admin_in_db.NextRow()) + qdel(query_admin_in_db) to_chat(usr, "[.] already listed in admin database. Check the Management tab if they don't appear in the list of admins.") return FALSE + qdel(query_admin_in_db) var/datum/DBQuery/query_add_admin = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin")] (ckey, rank) VALUES ('[.]', 'NEW ADMIN')") if(!query_add_admin.warn_execute()) + qdel(query_add_admin) return FALSE + qdel(query_add_admin) var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) VALUES ('[SQLtime()]', '[GLOB.round_id]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'add admin', '[.]', 'New admin added: [.]')") if(!query_add_admin_log.warn_execute()) + qdel(query_add_admin_log) return FALSE + qdel(query_add_admin_log) /datum/admins/proc/remove_admin(admin_ckey, use_db, datum/admins/D) if(alert("Are you sure you want to remove [admin_ckey]?","Confirm Removal","Do it","Cancel") == "Do it") @@ -215,16 +234,22 @@ GLOB.deadmins -= admin_ckey if(D) D.disassociate() + var/m1 = "[key_name_admin(usr)] removed [admin_ckey] from the admins list [use_db ? "permanently" : "temporarily"]" + var/m2 = "[key_name(usr)] removed [admin_ckey] from the admins list [use_db ? "permanently" : "temporarily"]" if(use_db) var/datum/DBQuery/query_add_rank = SSdbcore.NewQuery("DELETE FROM [format_table_name("admin")] WHERE ckey = '[admin_ckey]'") if(!query_add_rank.warn_execute()) + qdel(query_add_rank) return + qdel(query_add_rank) var/datum/DBQuery/query_add_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) VALUES ('[SQLtime()]', '[GLOB.round_id]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'remove admin', '[admin_ckey]', 'Admin removed: [admin_ckey]')") if(!query_add_rank_log.warn_execute()) + qdel(query_add_rank_log) return + qdel(query_add_rank_log) sync_lastadminrank(admin_ckey) - message_admins("[key_name_admin(usr)] removed [admin_ckey] from the admins list [use_db ? "permanently" : "temporarily"]") - log_admin("[key_name(usr)] removed [admin_ckey] from the admins list [use_db ? "permanently" : "temporarily"]") + message_admins(m1) + log_admin(m2) /datum/admins/proc/force_readmin(admin_ckey, datum/admins/D) if(!D || !D.deadmined) @@ -260,35 +285,50 @@ else R = new(new_rank) //blank new admin_rank GLOB.admin_ranks += R + var/m1 = "[key_name_admin(usr)] edited the admin rank of [admin_ckey] to [new_rank] [use_db ? "permanently" : "temporarily"]" + var/m2 = "[key_name(usr)] edited the admin rank of [admin_ckey] to [new_rank] [use_db ? "permanently" : "temporarily"]" if(use_db) new_rank = sanitizeSQL(new_rank) //if a player was tempminned before having a permanent change made to their rank they won't yet be in the db var/old_rank var/datum/DBQuery/query_admin_in_db = SSdbcore.NewQuery("SELECT rank FROM [format_table_name("admin")] WHERE ckey = '[admin_ckey]'") if(!query_admin_in_db.warn_execute()) + qdel(query_admin_in_db) return if(!query_admin_in_db.NextRow()) add_admin(admin_ckey, TRUE) old_rank = "NEW ADMIN" else old_rank = query_admin_in_db.item[1] + qdel(query_admin_in_db) //similarly if a temp rank is created it won't be in the db if someone is permanently changed to it var/datum/DBQuery/query_rank_in_db = SSdbcore.NewQuery("SELECT 1 FROM [format_table_name("admin_ranks")] WHERE rank = '[new_rank]'") if(!query_rank_in_db.warn_execute()) + qdel(query_rank_in_db) return if(!query_rank_in_db.NextRow()) + QDEL_NULL(query_rank_in_db) var/datum/DBQuery/query_add_rank = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_ranks")] (rank, flags, exclude_flags, can_edit_flags) VALUES ('[new_rank]', '0', '0', '0')") if(!query_add_rank.warn_execute()) + qdel(query_add_rank) return + qdel(query_add_rank) var/datum/DBQuery/query_add_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) VALUES ('[SQLtime()]', '[GLOB.round_id]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'add rank', '[new_rank]', 'New rank added: [new_rank]')") if(!query_add_rank_log.warn_execute()) + qdel(query_add_rank_log) return + qdel(query_add_rank_log) + qdel(query_rank_in_db) var/datum/DBQuery/query_change_rank = SSdbcore.NewQuery("UPDATE [format_table_name("admin")] SET rank = '[new_rank]' WHERE ckey = '[admin_ckey]'") if(!query_change_rank.warn_execute()) + qdel(query_change_rank) return + qdel(query_change_rank) var/datum/DBQuery/query_change_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) VALUES ('[SQLtime()]', '[GLOB.round_id]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'change admin rank', '[admin_ckey]', 'Rank of [admin_ckey] changed from [old_rank] to [new_rank]')") if(!query_change_rank_log.warn_execute()) + qdel(query_change_rank_log) return + qdel(query_change_rank_log) if(D) //they were previously an admin D.disassociate() //existing admin needs to be disassociated D.rank = R //set the admin_rank as our rank @@ -296,8 +336,8 @@ D.associate(C) else D = new(R, admin_ckey, TRUE) //new admin - message_admins("[key_name_admin(usr)] edited the admin rank of [admin_ckey] to [new_rank] [use_db ? "permanently" : "temporarily"]") - log_admin("[key_name(usr)] edited the admin rank of [admin_ckey] to [new_rank] [use_db ? "permanently" : "temporarily"]") + message_admins(m1) + log_admin(m2) /datum/admins/proc/change_admin_flags(admin_ckey, use_db, datum/admins/D, legacy_only) var/new_flags = input_bitfield(usr, "Include permission flags
    [use_db ? "This will affect ALL admins with this rank." : "This will affect only the current admin [admin_ckey]"]", "admin_flags", D.rank.include_rights, 350, 590, allowed_edit_list = usr.client.holder.rank.can_edit_rights) @@ -309,23 +349,31 @@ var/new_can_edit_flags = input_bitfield(usr, "Editable permission flags
    These are the flags this rank is allowed to edit if they have access to the permissions panel.
    They will be unable to modify admins to a rank that has a flag not included here.
    [use_db ? "This will affect ALL admins with this rank." : "This will affect only the current admin [admin_ckey]"]", "admin_flags", D.rank.can_edit_rights, 350, 710, allowed_edit_list = usr.client.holder.rank.can_edit_rights) if(isnull(new_can_edit_flags)) return + var/m1 = "[key_name_admin(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_ckey] temporarily"]" + var/m2 = "[key_name(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_ckey] temporarily"]" if(use_db || legacy_only) var/old_flags var/old_exclude_flags var/old_can_edit_flags var/datum/DBQuery/query_get_rank_flags = SSdbcore.NewQuery("SELECT flags, exclude_flags, can_edit_flags FROM [format_table_name("admin_ranks")] WHERE rank = '[D.rank.name]'") if(!query_get_rank_flags.warn_execute()) + qdel(query_get_rank_flags) return if(query_get_rank_flags.NextRow()) old_flags = text2num(query_get_rank_flags.item[1]) old_exclude_flags = text2num(query_get_rank_flags.item[2]) old_can_edit_flags = text2num(query_get_rank_flags.item[3]) + qdel(query_get_rank_flags) var/datum/DBQuery/query_change_rank_flags = SSdbcore.NewQuery("UPDATE [format_table_name("admin_ranks")] SET flags = '[new_flags]', exclude_flags = '[new_exclude_flags]', can_edit_flags = '[new_can_edit_flags]' WHERE rank = '[D.rank.name]'") if(!query_change_rank_flags.warn_execute()) + qdel(query_change_rank_flags) return + qdel(query_change_rank_flags) var/datum/DBQuery/query_change_rank_flags_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) VALUES ('[SQLtime()]', '[GLOB.round_id]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'change rank flags', '[D.rank.name]', 'Permissions of [D.rank.name] changed from[rights2text(old_flags," ")][rights2text(old_exclude_flags," ", "-")][rights2text(old_can_edit_flags," ", "*")] to[rights2text(new_flags," ")][rights2text(new_exclude_flags," ", "-")][rights2text(new_can_edit_flags," ", "*")]')") if(!query_change_rank_flags_log.warn_execute()) + qdel(query_change_rank_flags_log) return + qdel(query_change_rank_flags_log) for(var/datum/admin_rank/R in GLOB.admin_ranks) if(R.name != D.rank.name) continue @@ -356,8 +404,8 @@ D.rank.can_edit_rights = new_can_edit_flags var/client/C = GLOB.directory[admin_ckey] //find the client with the specified ckey (if they are logged in) D.associate(C) //link up with the client and add verbs - message_admins("[key_name_admin(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_ckey] temporarily"]") - log_admin("[key_name(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_ckey] temporarily"]") + message_admins(m1) + log_admin(m2) /datum/admins/proc/remove_rank(admin_rank) if(!admin_rank) @@ -375,19 +423,28 @@ admin_rank = sanitizeSQL(admin_rank) var/datum/DBQuery/query_admins_with_rank = SSdbcore.NewQuery("SELECT 1 FROM [format_table_name("admin")] WHERE rank = '[admin_rank]'") if(!query_admins_with_rank.warn_execute()) + qdel(query_admins_with_rank) return if(query_admins_with_rank.NextRow()) + qdel(query_admins_with_rank) to_chat(usr, "Error: Rank deletion attempted while rank still used; Tell a coder, this shouldn't happen.") return + qdel(query_admins_with_rank) if(alert("Are you sure you want to remove [admin_rank]?","Confirm Removal","Do it","Cancel") == "Do it") + var/m1 = "[key_name_admin(usr)] removed rank [admin_rank] permanently" + var/m2 = "[key_name(usr)] removed rank [admin_rank] permanently" var/datum/DBQuery/query_add_rank = SSdbcore.NewQuery("DELETE FROM [format_table_name("admin_ranks")] WHERE rank = '[admin_rank]'") if(!query_add_rank.warn_execute()) + qdel(query_add_rank) return + qdel(query_add_rank) var/datum/DBQuery/query_add_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) VALUES ('[SQLtime()]', '[GLOB.round_id]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'remove rank', '[admin_rank]', 'Rank removed: [admin_rank]')") if(!query_add_rank_log.warn_execute()) + qdel(query_add_rank_log) return - message_admins("[key_name_admin(usr)] removed rank [admin_rank] permanently") - log_admin("[key_name(usr)] removed rank [admin_rank] permanently") + qdel(query_add_rank_log) + message_admins(m1) + log_admin(m2) /datum/admins/proc/sync_lastadminrank(admin_ckey, datum/admins/D) var/sqlrank = "Player" @@ -396,5 +453,7 @@ admin_ckey = sanitizeSQL(admin_ckey) var/datum/DBQuery/query_sync_lastadminrank = SSdbcore.NewQuery("UPDATE [format_table_name("player")] SET lastadminrank = '[sqlrank]' WHERE ckey = '[admin_ckey]'") if(!query_sync_lastadminrank.warn_execute()) + qdel(query_sync_lastadminrank) return + qdel(query_sync_lastadminrank) to_chat(usr, "Sync of [admin_ckey] successful.") diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index a3f7823b58..95e040ebd5 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -7,7 +7,6 @@ dat +={" General Secrets

    - Show Job Debug
    Admin Log
    Mentor Log
    Show Admin List
    @@ -111,18 +110,6 @@ if("mentor_log") CitadelMentorLogSecret() - - if("list_job_debug") - var/dat = "Job Debug info.
    " - for(var/line in SSjob.job_debug) - dat += "[line]
    " - dat+= "*******

    " - for(var/datum/job/job in SSjob.occupations) - if(!job) - continue - dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions]
    " - usr << browse(dat, "window=jobdebug;size=600x500") - if("show_admins") var/dat = "Current admins:
    " if(GLOB.admin_datums) @@ -433,7 +420,7 @@ H.equip_to_slot_or_del(I, SLOT_W_UNIFORM) qdel(olduniform) if(droptype == "Yes") - I.flags_1 |= NODROP_1 + I.item_flags |= NODROP else to_chat(H, "You're not kawaii enough for this.") diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm index d4dd5951d2..7f2fa5b938 100644 --- a/code/modules/admin/sql_message_system.dm +++ b/code/modules/admin/sql_message_system.dm @@ -11,11 +11,16 @@ new_ckey = sanitizeSQL(new_ckey) var/datum/DBQuery/query_find_ckey = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[new_ckey]'") if(!query_find_ckey.warn_execute()) + qdel(query_find_ckey) return if(!query_find_ckey.NextRow()) if(alert(usr, "[new_ckey] has not been seen before, are you sure you want to create a [type] for them?", "Unknown ckey", "Yes", "No", "Cancel") != "Yes") + qdel(query_find_ckey) return + qdel(query_find_ckey) target_ckey = new_ckey + if(QDELETED(usr)) + return if(target_ckey) target_ckey = sanitizeSQL(target_ckey) if(!admin_ckey) @@ -46,11 +51,14 @@ else return var/datum/DBQuery/query_create_message = SSdbcore.NewQuery("INSERT INTO [format_table_name("messages")] (type, targetckey, adminckey, text, timestamp, server, server_ip, server_port, round_id, secret) VALUES ('[type]', '[target_ckey]', '[admin_ckey]', '[text]', '[timestamp]', '[server]', INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]', '[GLOB.round_id]','[secret]')") + var/pm = "[key_name(usr)] has created a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""]: [text]" + var/header = "[key_name_admin(usr)] has created a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""]" if(!query_create_message.warn_execute()) + qdel(query_create_message) return + qdel(query_create_message) if(logged) - log_admin_private("[key_name(usr)] has created a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""]: [text]") - var/header = "[key_name_admin(usr)] has created a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""]" + log_admin_private(pm) message_admins("[header]:
    [text]") admin_ticket_log(target_ckey, "[header]") admin_ticket_log(target_ckey, text) @@ -69,19 +77,25 @@ var/type var/target_ckey var/text + var/m1 = "[key_name(usr)] has deleted a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for" : " made by"] [target_ckey]: [text]" + var/m2 = "[key_name_admin(usr)] has deleted a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for" : " made by"] [target_ckey]:
    [text]" var/datum/DBQuery/query_find_del_message = SSdbcore.NewQuery("SELECT type, targetckey, adminckey, text FROM [format_table_name("messages")] WHERE id = [message_id] AND deleted = 0") if(!query_find_del_message.warn_execute()) + qdel(query_find_del_message) return if(query_find_del_message.NextRow()) type = query_find_del_message.item[1] target_ckey = query_find_del_message.item[2] text = query_find_del_message.item[4] + qdel(query_find_del_message) var/datum/DBQuery/query_del_message = SSdbcore.NewQuery("UPDATE [format_table_name("messages")] SET deleted = 1 WHERE id = [message_id]") if(!query_del_message.warn_execute()) + qdel(query_del_message) return + qdel(query_del_message) if(logged) - log_admin_private("[key_name(usr)] has deleted a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for" : " made by"] [target_ckey]: [text]") - message_admins("[key_name_admin(usr)] has deleted a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for" : " made by"] [target_ckey]:
    [text]") + log_admin_private(m1) + message_admins(m2) if(browse) browse_messages("[type]") else @@ -96,6 +110,7 @@ return var/datum/DBQuery/query_find_edit_message = SSdbcore.NewQuery("SELECT type, targetckey, adminckey, text FROM [format_table_name("messages")] WHERE id = [message_id] AND deleted = 0") if(!query_find_edit_message.warn_execute()) + qdel(query_find_edit_message) return if(query_find_edit_message.NextRow()) var/type = query_find_edit_message.item[1] @@ -105,11 +120,13 @@ var/editor_ckey = sanitizeSQL(usr.ckey) var/new_text = input("Input new [type]", "New [type]", "[old_text]") as null|message if(!new_text) + qdel(query_find_edit_message) return new_text = sanitizeSQL(new_text) var/edit_text = sanitizeSQL("Edited by [editor_ckey] on [SQLtime()] from
    [old_text]
    to
    [new_text]
    ") var/datum/DBQuery/query_edit_message = SSdbcore.NewQuery("UPDATE [format_table_name("messages")] SET text = '[new_text]', lasteditor = '[editor_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE id = [message_id] AND deleted = 0") if(!query_edit_message.warn_execute()) + qdel(query_find_edit_message) return log_admin_private("[key_name(usr)] has edited a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""] made by [admin_ckey] from [old_text] to [new_text]") message_admins("[key_name_admin(usr)] has edited a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""] made by [admin_ckey] from
    [old_text]
    to
    [new_text]") @@ -117,6 +134,7 @@ browse_messages("[type]") else browse_messages(target_ckey = target_ckey, agegate = TRUE) + qdel(query_find_edit_message) /proc/toggle_message_secrecy(message_id) if(!SSdbcore.Connect()) @@ -125,22 +143,30 @@ message_id = text2num(message_id) if(!message_id) return + var/editor_ckey = usr.ckey + var/kn = key_name(usr) + var/kna = key_name_admin(usr) var/datum/DBQuery/query_find_message_secret = SSdbcore.NewQuery("SELECT type, targetckey, adminckey, secret FROM [format_table_name("messages")] WHERE id = [message_id] AND deleted = 0") if(!query_find_message_secret.warn_execute()) + qdel(query_find_message_secret) return if(query_find_message_secret.NextRow()) var/type = query_find_message_secret.item[1] var/target_ckey = query_find_message_secret.item[2] var/admin_ckey = query_find_message_secret.item[3] var/secret = text2num(query_find_message_secret.item[4]) - var/editor_ckey = sanitizeSQL(usr.ckey) + editor_ckey = sanitizeSQL(editor_ckey) var/edit_text = "Made [secret ? "not secret" : "secret"] by [editor_ckey] on [SQLtime()]
    " var/datum/DBQuery/query_message_secret = SSdbcore.NewQuery("UPDATE [format_table_name("messages")] SET secret = NOT secret, lasteditor = '[editor_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE id = [message_id]") if(!query_message_secret.warn_execute()) + qdel(query_find_message_secret) + qdel(query_message_secret) return - log_admin_private("[key_name(usr)] has toggled [target_ckey]'s [type] made by [admin_ckey] to [secret ? "not secret" : "secret"]") - message_admins("[key_name_admin(usr)] has toggled [target_ckey]'s [type] made by [admin_ckey] to [secret ? "not secret" : "secret"]") + qdel(query_message_secret) + log_admin_private("[kn] has toggled [target_ckey]'s [type] made by [admin_ckey] to [secret ? "not secret" : "secret"]") + message_admins("[kna] has toggled [target_ckey]'s [type] made by [admin_ckey] to [secret ? "not secret" : "secret"]") browse_messages(target_ckey = target_ckey, agegate = TRUE) + qdel(query_find_message_secret) /proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE) if(!SSdbcore.Connect()) @@ -173,8 +199,11 @@ output += ruler var/datum/DBQuery/query_get_type_messages = SSdbcore.NewQuery("SELECT id, targetckey, adminckey, text, timestamp, server, lasteditor FROM [format_table_name("messages")] WHERE type = '[type]' AND deleted = 0") if(!query_get_type_messages.warn_execute()) + qdel(query_get_type_messages) return while(query_get_type_messages.NextRow()) + if(QDELETED(usr)) + return var/id = query_get_type_messages.item[1] var/t_ckey = query_get_type_messages.item[2] if(type == "watchlist entry" && filter && !(t_ckey in GLOB.directory)) @@ -193,16 +222,20 @@ if(editor_ckey) output += " Last edit by [editor_ckey] (Click here to see edit log)" output += "
    [text]
    " + qdel(query_get_type_messages) if(target_ckey) target_ckey = sanitizeSQL(target_ckey) var/datum/DBQuery/query_get_messages = SSdbcore.NewQuery("SELECT type, secret, id, adminckey, text, timestamp, server, lasteditor, DATEDIFF(NOW(), timestamp) AS `age` FROM [format_table_name("messages")] WHERE type <> 'memo' AND targetckey = '[target_ckey]' AND deleted = 0 ORDER BY timestamp DESC") if(!query_get_messages.warn_execute()) + qdel(query_get_messages) return var/list/messagedata = list() var/list/watchdata = list() var/list/notedata = list() var/skipped = 0 while(query_get_messages.NextRow()) + if(QDELETED(usr)) + return type = query_get_messages.item[1] if(type == "memo") continue @@ -253,6 +286,7 @@ watchdata += data if("note") notedata += data + qdel(query_get_messages) output += "

    [target_ckey]

    gX$rL^D(@?pW>eF<*R-jbhx1hyo=3U7wON;8Ax1 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 - + {{#if !data.wires.timing}} [ Wires have been cut ] {{/if}} diff --git a/tgui/src/interfaces/cellular_emporium.ract b/tgui/src/interfaces/cellular_emporium.ract index a5ce433452..5aa6213ec1 100644 --- a/tgui/src/interfaces/cellular_emporium.ract +++ b/tgui/src/interfaces/cellular_emporium.ract @@ -20,6 +20,6 @@ {{/each}} {{^data.abilities}} - No abilities availible. + No abilities available. {{/data.abilities}} From 63013f89641c739d72ccd546e34309f682131ef7 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 2 Jul 2018 00:10:31 -0400 Subject: [PATCH 175/204] everything to controllers --- code/__DEFINES/DNA.dm | 1 + code/__DEFINES/access.dm | 46 +++--- code/__DEFINES/components.dm | 30 +++- code/__DEFINES/flags.dm | 8 +- code/__DEFINES/logging.dm | 1 + code/__DEFINES/maps.dm | 3 + code/__DEFINES/misc.dm | 6 + code/__DEFINES/obj_flags.dm | 4 + code/__DEFINES/preferences.dm | 2 + code/__DEFINES/reagents.dm | 1 - code/__DEFINES/reagents_specific_heat.dm | 3 + code/__DEFINES/status_effects.dm | 2 + code/__DEFINES/subsystems.dm | 24 ++- code/__DEFINES/wires.dm | 2 +- code/__HELPERS/_logging.dm | 4 + code/__HELPERS/game.dm | 2 +- code/__HELPERS/mobs.dm | 1 + code/__HELPERS/radio.dm | 2 +- code/__HELPERS/roundend.dm | 2 + code/__HELPERS/time.dm | 4 +- code/__HELPERS/type2type.dm | 15 -- code/__HELPERS/unsorted.dm | 14 +- code/_globalvars/bitfields.dm | 15 +- code/_globalvars/game_modes.dm | 4 +- code/_globalvars/logging.dm | 2 + code/_globalvars/misc.dm | 2 +- code/_onclick/click.dm | 82 ++++++---- code/_onclick/cyborg.dm | 6 +- code/_onclick/drag_drop.dm | 10 +- code/_onclick/hud/action_button.dm | 2 +- code/_onclick/hud/ai.dm | 4 +- code/_onclick/hud/alert.dm | 15 +- code/_onclick/hud/alien.dm | 7 +- code/_onclick/hud/alien_larva.dm | 3 + code/_onclick/hud/constructs.dm | 5 +- code/_onclick/hud/devil.dm | 6 +- code/_onclick/hud/drones.dm | 2 +- code/_onclick/hud/generic_dextrous.dm | 6 +- code/_onclick/hud/ghost.dm | 4 +- code/_onclick/hud/guardian.dm | 4 +- code/_onclick/hud/hud.dm | 79 +++++----- code/_onclick/hud/human.dm | 6 +- code/_onclick/hud/monkey.dm | 6 +- code/_onclick/hud/robot.dm | 4 +- code/_onclick/item_attack.dm | 15 +- code/_onclick/observer.dm | 2 +- code/_onclick/other_mobs.dm | 6 +- code/_onclick/telekinesis.dm | 2 +- .../controllers/configuration/config_entry.dm | 5 + .../configuration/configuration.dm | 20 ++- .../configuration/entries/game_options.dm | 2 +- .../configuration/entries/general.dm | 2 + code/controllers/subsystem/blackbox.dm | 86 ++++++---- code/controllers/subsystem/garbage.dm | 4 +- code/controllers/subsystem/job.dm | 149 +++++++++--------- code/controllers/subsystem/mapping.dm | 1 + code/controllers/subsystem/overlays.dm | 83 +++++----- code/controllers/subsystem/shuttle.dm | 2 +- code/controllers/subsystem/ticker.dm | 7 +- code/controllers/subsystem/timer.dm | 5 +- 60 files changed, 486 insertions(+), 356 deletions(-) create mode 100644 code/__DEFINES/reagents_specific_heat.dm diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index bb8d902fae..1c5185b8dc 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -96,6 +96,7 @@ #define ORGAN_SLOT_RIGHT_ARM_AUG "r_arm_device" #define ORGAN_SLOT_LEFT_ARM_AUG "l_arm_device" #define ORGAN_SLOT_STOMACH "stomach" +#define ORGAN_SLOT_STOMACH_AID "stomach_aid" #define ORGAN_SLOT_BREATHING_TUBE "breathing_tube" #define ORGAN_SLOT_EARS "ears" #define ORGAN_SLOT_EYES "eye_sight" diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index d00645846b..c9d545fc03 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -1,22 +1,22 @@ -#define ACCESS_SECURITY 1 // Security equipment -#define ACCESS_BRIG 2 // Brig timers and permabrig -#define ACCESS_ARMORY 3 -#define ACCESS_FORENSICS_LOCKERS 4 +#define ACCESS_SECURITY 1 // Security equipment, security records, gulag item storage, secbots +#define ACCESS_BRIG 2 // Brig cells+timers, permabrig, gulag+gulag shuttle, prisoner management console +#define ACCESS_ARMORY 3 // Armory, gulag teleporter, execution chamber +#define ACCESS_FORENSICS_LOCKERS 4 //Detective's office, forensics lockers, security+medical records #define ACCESS_MEDICAL 5 #define ACCESS_MORGUE 6 -#define ACCESS_TOX 7 -#define ACCESS_TOX_STORAGE 8 -#define ACCESS_GENETICS 9 -#define ACCESS_ENGINE 10 -#define ACCESS_ENGINE_EQUIP 11 +#define ACCESS_TOX 7 //R&D department, R&D console, burn chamber on some maps +#define ACCESS_TOX_STORAGE 8 //Toxins storage, burn chamber on some maps +#define ACCESS_GENETICS 9 +#define ACCESS_ENGINE 10 //Engineering area, power monitor, power flow control console +#define ACCESS_ENGINE_EQUIP 11 //APCs, EngiVend/YouTool, engineering equipment lockers #define ACCESS_MAINT_TUNNELS 12 #define ACCESS_EXTERNAL_AIRLOCKS 13 -#define ACCESS_EMERGENCY_STORAGE 14 +#define ACCESS_EMERGENCY_STORAGE 14 //Not in use #define ACCESS_CHANGE_IDS 15 #define ACCESS_AI_UPLOAD 16 #define ACCESS_TELEPORTER 17 #define ACCESS_EVA 18 -#define ACCESS_HEADS 19 +#define ACCESS_HEADS 19 //Bridge, EVA storage windoors, gateway shutters, AI integrity restorer, clone record deletion, comms console #define ACCESS_CAPTAIN 20 #define ACCESS_ALL_PERSONAL_LOCKERS 21 #define ACCESS_CHAPEL_OFFICE 22 @@ -31,9 +31,9 @@ #define ACCESS_CARGO 31 #define ACCESS_CONSTRUCTION 32 #define ACCESS_CHEMISTRY 33 -#define ACCESS_CARGO_BOT 34 +#define ACCESS_CARGO_BOT 34 //Not in use #define ACCESS_HYDROPONICS 35 -#define ACCESS_MANUFACTURING 36 +#define ACCESS_MANUFACTURING 36 //Only used on research.dmm away mission #define ACCESS_LIBRARY 37 #define ACCESS_LAWYER 38 #define ACCESS_VIROLOGY 39 @@ -44,10 +44,10 @@ #define ACCESS_THEATRE 46 #define ACCESS_RESEARCH 47 #define ACCESS_MINING 48 -#define ACCESS_MINING_OFFICE 49 //not in use +#define ACCESS_MINING_OFFICE 49 //Not in use #define ACCESS_MAILSORTING 50 -#define ACCESS_MINT 51 -#define ACCESS_MINT_VAULT 52 +#define ACCESS_MINT 51 //Not in use +#define ACCESS_MINT_VAULT 52 //Not in use #define ACCESS_VAULT 53 #define ACCESS_MINING_STATION 54 #define ACCESS_XENOBIOLOGY 55 @@ -58,19 +58,19 @@ #define ACCESS_KEYCARD_AUTH 60 //Used for events which require at least two people to confirm them #define ACCESS_TCOMSAT 61 // has access to the entire telecomms satellite / machinery #define ACCESS_GATEWAY 62 -#define ACCESS_SEC_DOORS 63 // Security front doors -#define ACCESS_MINERAL_STOREROOM 64 +#define ACCESS_SEC_DOORS 63 // Outer brig doors, department security posts +#define ACCESS_MINERAL_STOREROOM 64 //For releasing minerals from the ORM #define ACCESS_MINISAT 65 #define ACCESS_WEAPONS 66 //Weapon authorization for secbots -#define ACCESS_NETWORK 67 -#define ACCESS_CLONING 68 //Cloning room +#define ACCESS_NETWORK 67 //NTnet diagnostics/monitoring software +#define ACCESS_CLONING 68 //Cloning room and clone pod ejection //BEGIN CENTCOM ACCESS /*Should leave plenty of room if we need to add more access levels. Mostly for admin fun times.*/ -#define ACCESS_CENT_GENERAL 101//General facilities. +#define ACCESS_CENT_GENERAL 101//General facilities. CentCom ferry. #define ACCESS_CENT_THUNDER 102//Thunderdome. -#define ACCESS_CENT_SPECOPS 103//Special Ops. +#define ACCESS_CENT_SPECOPS 103//Special Ops. Captain's display case, Marauder and Seraph mechs. #define ACCESS_CENT_MEDICAL 104//Medical/Research #define ACCESS_CENT_LIVING 105//Living quarters. #define ACCESS_CENT_STORAGE 106//Generic storage areas. @@ -79,7 +79,7 @@ #define ACCESS_CENT_BAR 110 // The non-existent CentCom Bar //The Syndicate -#define ACCESS_SYNDICATE 150//General Syndicate Access +#define ACCESS_SYNDICATE 150//General Syndicate Access. Includes Syndicate mechs and ruins. #define ACCESS_SYNDICATE_LEADER 151//Nuke Op Leader Access //Away Missions or Ruins diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 7c00573089..940a9af56f 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -1,6 +1,7 @@ #define SEND_SIGNAL(target, sigtype, arguments...) ( !target.datum_components ? NONE : target._SendSignal(sigtype, list(##arguments)) ) #define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( !SSdcs.comp_lookup[sigtype] ? NONE : SSdcs._SendGlobalSignal(sigtype, list(##arguments)) ) + //shorthand #define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path) #define GET_COMPONENT(varname, path) GET_COMPONENT_FROM(varname, path, src) @@ -98,6 +99,11 @@ #define COMSIG_MOVABLE_THROW "movable_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin) #define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/onTransitZ(): (old_z, new_z) +// /mob/living signals +#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living) +#define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living) +#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) + // /mob/living/carbon signals #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) @@ -107,6 +113,7 @@ // /obj/item signals #define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) #define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob) + #define COMPONENT_NO_INTERACT 1 #define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob) #define COMPONENT_NO_ATTACK_OBJ 1 #define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params) @@ -120,6 +127,27 @@ // /obj/item/clothing signals #define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () +// /obj/item/implant signals +#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): () +#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //from base of /obj/item/implant/proc/implant(): (list/args) + #define COMPONENT_STOP_IMPLANTING 1 +#define COMSIG_IMPLANT_OTHER "implant_other" //called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant) + //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both + #define COMPONENT_DELETE_NEW_IMPLANT 2 + #define COMPONENT_DELETE_OLD_IMPLANT 4 +#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //called on implants being implanted into someone with an uplink implant: (datum/component/uplink) + //This uses all return values of COMSIG_IMPLANT_OTHER + +// /obj/item/pda signals +#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone) + #define COMPONENT_STOP_RINGTONE_CHANGE 1 + +// /obj/item/radio signals +#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //called from base of /obj/item/radio/proc/set_frequency(): (list/args) + +// /obj/item/pen signals +#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) + // /mob/living/carbon/human signals #define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target) #define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) @@ -139,7 +167,7 @@ #define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code. //NTnet -#define COMSIG_COMPONENT_NTNET_RECIEVE "ntnet_recieve" //called on an object by its NTNET connection component on recieve. (sending_id(number), sending_netname(text), data(datum/netdata)) +#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata)) // /datum/component/storage signals #define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool. diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 43cdbcb646..3ed28c4693 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -13,16 +13,12 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 //FLAGS BITMASK -#define NODROP_1 (1<<1) // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted. -#define NOBLUDGEON_1 (1<<2) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() #define HEAR_1 (1<<3) // This flag is what recursive_hear_check() uses to determine wether to add an item to the hearer list or not. #define CHECK_RICOCHET_1 (1<<4) // Projectiels will check ricochet on things impacted that have this. #define CONDUCT_1 (1<<5) // conducts electricity (metal etc.) -#define ABSTRACT_1 (1<<6) // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way #define NODECONSTRUCT_1 (1<<7) // For machines and structures that should not break into parts, eg, holodeck stuff #define OVERLAY_QUEUED_1 (1<<8) // atom queued to SSoverlay #define ON_BORDER_1 (1<<9) // item has priority to check when entering or leaving -#define DROPDEL_1 (1<<10) // When dropped, it calls qdel on itself #define PREVENT_CLICK_UNDER_1 (1<<11) //Prevent clicking things below it on the same turf eg. doors/ fulltile windows #define HOLOGRAM_1 (1<<12) #define TESLA_IGNORE_1 (1<<13) // TESLA_IGNORE grants immunity from being targeted by tesla-style electricity @@ -33,9 +29,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define NOJAUNT_1 (1<<0) #define UNUSED_RESERVATION_TURF_1 (1<<1) #define CAN_BE_DIRTY_1 (1<<2) // If a turf can be made dirty at roundstart. This is also used in areas. -#define NO_DEATHRATTLE_1 (1<<4) // Do not notify deadchat about any deaths that occur on this turf. -#define NO_RUINS_1 (1<<5) //Blocks ruins spawning on the turf #define NO_LAVA_GEN_1 (1<<6) //Blocks lava rivers being generated on the turf +#define NO_RUINS_1 (1<<10) //Blocks ruins spawning on the turf /* These defines are used specifically with the atom/pass_flags bitmask @@ -81,4 +76,3 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define EMP_PROTECT_SELF (1<<0) #define EMP_PROTECT_CONTENTS (1<<1) #define EMP_PROTECT_WIRES (1<<2) - diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 197c315f78..485cfa65c1 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -14,6 +14,7 @@ #define INVESTIGATE_HALLUCINATIONS "hallucinations" #define INVESTIGATE_RADIATION "radiation" #define INVESTIGATE_EXONET "exonet" +#define INVESTIGATE_CIRCUIT "circuit" //Individual logging defines #define INDIVIDUAL_ATTACK_LOG "Attack log" diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 98d022d27e..1defe2bc39 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -41,6 +41,9 @@ require only minor tweaks. // number - bombcap is multiplied by this before being applied to bombs #define ZTRAIT_BOMBCAP_MULTIPLIER "Bombcap Multiplier" +// number - default gravity if there's no gravity generators or area overrides present +#define ZTRAIT_GRAVITY "Gravity" + // numeric offsets - e.g. {"Down": -1} means that chasms will fall to z - 1 rather than oblivion #define ZTRAIT_UP "Up" #define ZTRAIT_DOWN "Down" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 43c706e58e..78f86475ac 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -430,6 +430,7 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE)) #define ION_FILE "ion_laws.json" #define PIRATE_NAMES_FILE "pirates.json" + //Fullscreen overlay resolution in tiles. #define FULLSCREEN_OVERLAY_RESOLUTION_X 15 #define FULLSCREEN_OVERLAY_RESOLUTION_Y 15 @@ -448,5 +449,10 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE)) // Used by PDA and cartridge code to reduce repetitiveness of spritesheets #define PDAIMG(what) {""} + //Filters #define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA") + + +#define STANDARD_GRAVITY 1 //Anything above this is high gravity, anything below no grav +#define GRAVITY_DAMAGE_TRESHOLD 3 //Starting with this value gravity will start to damage mobs \ No newline at end of file diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index f8287cf34e..76f66521a7 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -21,6 +21,10 @@ #define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use. #define SLOWS_WHILE_IN_HAND (1<<4) #define NO_MAT_REDEMPTION (1<<5) // Stops you from putting things like an RCD or other items into an ORM or protolathe for materials. +#define DROPDEL (1<<6) // When dropped, it calls qdel on itself +#define NOBLUDGEON (1<<7) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() +#define NODROP (1<<8) // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted. +#define ABSTRACT (1<<9) // for all things that are technically items but used for various different stuff // Flags for the clothing_flags var on /obj/item/clothing diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 0dc8a38899..02f151dcd9 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -68,3 +68,5 @@ //Flags in the players table in the db #define DB_FLAG_EXEMPT 1 + +#define DEFAULT_CYBORG_NAME "Default Cyborg Name" \ No newline at end of file diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 6fca8786f5..f8f59a367f 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -2,7 +2,6 @@ #define LIQUID 2 #define GAS 3 - // container_type defines #define INJECTABLE (1<<0) // Makes it possible to add reagents through droppers and syringes. #define DRAWABLE (1<<1) // Makes it possible to remove reagents through syringes. diff --git a/code/__DEFINES/reagents_specific_heat.dm b/code/__DEFINES/reagents_specific_heat.dm new file mode 100644 index 0000000000..90a379d7de --- /dev/null +++ b/code/__DEFINES/reagents_specific_heat.dm @@ -0,0 +1,3 @@ +#define SPECIFIC_HEAT_DEFAULT 200 + +#define SPECIFIC_HEAT_PLASMA 500 diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 6b16e352e5..ffaaa04d0f 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -80,6 +80,8 @@ #define STATUS_EFFECT_SYPHONMARK /datum/status_effect/syphon_mark //tracks kills for the KA death syphon module +#define STATUS_EFFECT_INLOVE /datum/status_effect/in_love //Displays you as being in love with someone else, and makes hearts appear around them. + ///////////// // SLIME // ///////////// diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 149be99aea..48b3260dd7 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -124,21 +124,19 @@ #define COMPILE_OVERLAYS(A)\ if (TRUE) {\ - var/list/oo = A.our_overlays;\ + var/list/ad = A.add_overlays;\ + var/list/rm = A.remove_overlays;\ var/list/po = A.priority_overlays;\ + if(LAZYLEN(rm)){\ + A.overlays -= rm;\ + rm.Cut();\ + }\ + if(LAZYLEN(ad)){\ + A.overlays |= ad;\ + ad.Cut();\ + }\ if(LAZYLEN(po)){\ - if(LAZYLEN(oo)){\ - A.overlays = oo + po;\ - }\ - else{\ - A.overlays = po;\ - }\ - }\ - else if(LAZYLEN(oo)){\ - A.overlays = oo;\ - }\ - else{\ - A.overlays.Cut();\ + A.overlays |= po;\ }\ A.flags_1 &= ~OVERLAY_QUEUED_1;\ } diff --git a/code/__DEFINES/wires.dm b/code/__DEFINES/wires.dm index 35fa37257b..960d0479be 100644 --- a/code/__DEFINES/wires.dm +++ b/code/__DEFINES/wires.dm @@ -34,7 +34,7 @@ #define WIRE_POWER1 "Main Power 1" #define WIRE_POWER2 "Main Power 2" #define WIRE_PROCEED "Proceed" -#define WIRE_RX "Recieve" +#define WIRE_RX "Receive" #define WIRE_RESET_MODULE "Reset Module" #define WIRE_SAFETY "Safety" #define WIRE_SHOCK "High Voltage Ground" diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 48e2baac6e..4289fd5ad0 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -131,6 +131,10 @@ /proc/log_query_debug(text) WRITE_LOG(GLOB.query_debug_log, "SQL: [text]") +/proc/log_job_debug(text) + if (CONFIG_GET(flag/log_job_debug)) + WRITE_LOG(GLOB.world_job_debug_log, "JOB: [text]") + /* Log to both DD and the logfile. */ /proc/log_world(text) WRITE_LOG(GLOB.world_runtime_log, text) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index e75e1ed88a..13f415823c 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -433,7 +433,7 @@ if(!gametypeCheck.age_check(M.client)) continue if(jobbanType) - if(jobban_isbanned(M, jobbanType) || jobban_isbanned(M, ROLE_SYNDICATE)) + if(jobban_isbanned(M, jobbanType) || QDELETED(M) || jobban_isbanned(M, ROLE_SYNDICATE) || QDELETED(M)) continue showCandidatePollWindow(M, poll_time, Question, result, ignore_category, time_passed, flashwindow) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 7a8cf5f3a2..1fefb27497 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -529,6 +529,7 @@ Proc for attack log creation, because really why not step(X, pick(NORTH, SOUTH, EAST, WEST)) /proc/deadchat_broadcast(message, mob/follow_target=null, turf/turf_target=null, speaker_key=null, message_type=DEADCHAT_REGULAR) + message = "[message]" for(var/mob/M in GLOB.player_list) var/datum/preferences/prefs if(M.client && M.client.prefs) diff --git a/code/__HELPERS/radio.dm b/code/__HELPERS/radio.dm index 39fe55c67c..84b354b6cd 100644 --- a/code/__HELPERS/radio.dm +++ b/code/__HELPERS/radio.dm @@ -1,4 +1,4 @@ -// Ensure the frequency is within bounds of what it should be sending/recieving at +// Ensure the frequency is within bounds of what it should be sending/receiving at /proc/sanitize_frequency(frequency, free = FALSE) . = round(frequency) if(free) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index a0051c3b1e..e86c57ac24 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -524,6 +524,8 @@ return var/datum/DBQuery/query_admin_rank_update = SSdbcore.NewQuery("UPDATE [format_table_name("player")] p INNER JOIN [format_table_name("admin")] a ON p.ckey = a.ckey SET p.lastadminrank = a.rank") query_admin_rank_update.Execute() + qdel(query_admin_rank_update) + //json format backup file generation stored per server var/json_file = file("data/admins_backup.json") var/list/file_data = list("ranks" = list(), "admins" = list()) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index a550206ff6..3ffb583332 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -64,7 +64,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) //Takes a value of time in deciseconds. //Returns a text value of that number in hours, minutes, or seconds. /proc/DisplayTimeText(time_value, truncate = FALSE) - var/second = time_value*0.1 + var/second = (time_value)*0.1 var/second_adjusted = null var/second_rounded = FALSE var/minute = null @@ -144,7 +144,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) else if(day && (!minute || !second)) hour = " and 1 hour" else - hour = "[truncate ? "hour" : "1 hour"]" + hour = "[truncate ? "hour" : "1 hour"]" else hour = null diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 1f788cf445..b474915e10 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -218,21 +218,6 @@ . = "NONE" return . -/proc/ui_style2icon(ui_style) - switch(ui_style) - if("Retro") - return 'icons/mob/screen_retro.dmi' - if("Plasmafire") - return 'icons/mob/screen_plasmafire.dmi' - if("Slimecore") - return 'icons/mob/screen_slimecore.dmi' - if("Operative") - return 'icons/mob/screen_operative.dmi' - if("Clockwork") - return 'icons/mob/screen_clockwork.dmi' - else - return 'icons/mob/screen_midnight.dmi' - //colour formats /proc/rgb2hsl(red, green, blue) red /= 255;green /= 255;blue /= 255; diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index d10619f369..273e1cf1b7 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -186,7 +186,7 @@ Turf and target are separate in case you want to teleport some distance from a t return 1 //Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame() -/mob/proc/rename_self(role, client/C) +/mob/proc/apply_pref_name(role, client/C) if(!C) C = client var/oldname = real_name @@ -194,8 +194,10 @@ Turf and target are separate in case you want to teleport some distance from a t var/loop = 1 var/safety = 0 + var/banned = jobban_isbanned(src, "appearance") + while(loop && safety < 5) - if(C && C.prefs.custom_names[role] && !safety && (!jobban_isbanned(src, "appearance"))) + if(C && C.prefs.custom_names[role] && !safety && !banned) newname = C.prefs.custom_names[role] else switch(role) @@ -207,10 +209,8 @@ Turf and target are separate in case you want to teleport some distance from a t newname = pick(GLOB.mime_names) if("ai") newname = pick(GLOB.ai_names) - if("deity") - newname = pick(GLOB.clown_names|GLOB.ai_names|GLOB.mime_names) //pick any old name else - return + return FALSE for(var/mob/living/M in GLOB.player_list) if(M == src) @@ -224,6 +224,8 @@ Turf and target are separate in case you want to teleport some distance from a t if(newname) fully_replace_character_name(oldname,newname) + return TRUE + return FALSE //Picks a string of symbols to display as the law number for hacked or ion laws @@ -899,7 +901,7 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( /proc/check_target_facings(mob/living/initator, mob/living/target) /*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head. Given how click code currently works (Nov '13), the initiating mob will be facing the target mob most of the time - That said, this proc should not be used if the change facing proc of the click code is overriden at the same time*/ + That said, this proc should not be used if the change facing proc of the click code is overridden at the same time*/ if(!ismob(target) || target.lying) //Make sure we are not doing this for things that can't have a logical direction to the players given that the target would be on their side return FALSE diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index aa872fa75e..2ad35a6b1b 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -45,6 +45,10 @@ GLOBAL_LIST_INIT(bitfields, list( "NEEDS_PERMIT" = NEEDS_PERMIT, "SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND, "NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION, + "DROPDEL" = DROPDEL, + "NOBLUDGEON" = NOBLUDGEON, + "NODROP" = NODROP, + "ABSTRACT" = ABSTRACT, ), "admin_flags" = list( "BUILDMODE" = R_BUILDMODE, @@ -113,12 +117,15 @@ GLOBAL_LIST_INIT(bitfields, list( "NOJAUNT_1" = NOJAUNT_1, "UNUSED_RESERVATION_TURF_1" = UNUSED_RESERVATION_TURF_1, "CAN_BE_DIRTY_1" = CAN_BE_DIRTY_1, - "HEAR_1 / NO_DEATHRATTLE_1 (turfs)" = HEAR_1, - "CHECK_RICOCHET_1 / NO_RUINS_1 (turfs)" = CHECK_RICOCHET_1, - "CONDUCT_1 / NO_LAVA_GEN_1" = CONDUCT_1, - "ABSTRACT_1" = ABSTRACT_1, + "HEAR_1" = HEAR_1, + "CHECK_RICOCHET_1" = CHECK_RICOCHET_1, + "CONDUCT_1" = CONDUCT_1, + "NO_LAVA_GEN_1" = NO_LAVA_GEN_1, "NODECONSTRUCT_1" = NODECONSTRUCT_1, "OVERLAY_QUEUED_1" = OVERLAY_QUEUED_1, + "ON_BORDER_1" = ON_BORDER_1, + "NO_RUINS_1" = NO_RUINS_1, + "PREVENT_CLICK_UNDER_1" = PREVENT_CLICK_UNDER_1, "HOLOGRAM_1" = HOLOGRAM_1, "TESLA_IGNORE_1" = TESLA_IGNORE_1, "INITIALIZED_1" = INITIALIZED_1, diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm index 3822f7077d..f6022cdd59 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -1,7 +1,7 @@ GLOBAL_VAR_INIT(master_mode, "traitor") //"extended" GLOBAL_VAR_INIT(secret_force_mode, "secret") // if this is anything but "secret", the secret rotation will forceably choose this mode -GLOBAL_VAR(common_report) //Contains commmon part of roundend report -GLOBAL_VAR(survivor_report) //Contains shared surivor report for roundend report (part of personal report) +GLOBAL_VAR(common_report) //Contains common part of roundend report +GLOBAL_VAR(survivor_report) //Contains shared survivor report for roundend report (part of personal report) GLOBAL_VAR_INIT(wavesecret, 0) // meteor mode, delays wave progression, terrible name diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index e00e4775ac..2951ddf165 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -22,6 +22,8 @@ GLOBAL_VAR(world_manifest_log) GLOBAL_PROTECT(world_manifest_log) GLOBAL_VAR(query_debug_log) GLOBAL_PROTECT(query_debug_log) +GLOBAL_VAR(world_job_debug_log) +GLOBAL_PROTECT(world_job_debug_log) GLOBAL_LIST_EMPTY(bombers) GLOBAL_PROTECT(bombers) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 2415c1fea3..fa0ecf117d 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -10,7 +10,7 @@ GLOBAL_VAR_INIT(TAB, "    ") GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) -GLOBAL_VAR_INIT(CELLRATE, 0.002) // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) +GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) GLOBAL_LIST_EMPTY(powernets) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index ae66b9c131..f98de83c23 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -40,7 +40,7 @@ */ /atom/Click(location,control,params) if(flags_1 & INITIALIZED_1) - SendSignal(COMSIG_CLICK, location, control, params) + SEND_SIGNAL(src, COMSIG_CLICK, location, control, params) usr.ClickOn(src, params) /atom/DblClick(location,control,params) @@ -57,7 +57,7 @@ After that, mostly just check your state, check whether you're holding an item, check whether you're adjacent to the target, then pass off the click to whoever - is recieving it. + is receiving it. The most common are: * mob/UnarmedAttack(atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves * atom/attackby(item,user) - used only when adjacent @@ -129,7 +129,7 @@ //These are always reachable. //User itself, current loc, and user inventory - if(DirectAccess(A)) + if(A in DirectAccess()) if(W) W.melee_attack_chain(src, A, params) else @@ -174,40 +174,52 @@ return TRUE return FALSE -/atom/movable/proc/CanReach(atom/target,obj/item/tool,view_only = FALSE) - if(isturf(target) || isturf(target.loc) || DirectAccess(target)) //Directly accessible atoms - if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks - return TRUE - else - //Things inside storage insde another storage - //Eg Contents of a box in a backpack - var/atom/outer_storage = get_atom_on_turf(target) - if(outer_storage == target) //whatever that is we don't want infinite loop. - return FALSE - if(outer_storage && CanReach(outer_storage,tool) && outer_storage.CanReachStorage(target,src,view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH)) - return TRUE +/atom/movable/proc/CanReach(atom/ultimate_target, obj/item/tool, view_only = FALSE) + // A backwards depth-limited breadth-first-search to see if the target is + // logically "in" anything adjacent to us. + var/list/direct_access = DirectAccess() + var/depth = 1 + (view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH) + + var/list/closed = list() + var/list/checking = list(ultimate_target) + while (checking.len && depth > 0) + var/list/next = list() + --depth + + for(var/atom/target in checking) // will filter out nulls + if(closed[target] || isarea(target)) // avoid infinity situations + continue + closed[target] = TRUE + if(isturf(target) || isturf(target.loc) || (target in direct_access)) //Directly accessible atoms + if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks + return TRUE + + if (!target.loc) + continue + GET_COMPONENT_FROM(storage, /datum/component/storage, target.loc) + if (storage) + var/datum/component/storage/concrete/master = storage.master() + if (master) + next += master.parent + for(var/S in master.slaves) + var/datum/component/storage/slave = S + next += slave.parent + else + next += target.loc + else + next += target.loc + + checking = next return FALSE -//Can [target] in this container be reached by [user], can't be more than [depth] levels deep -/atom/proc/CanReachStorage(atom/target,user,depth) - return FALSE - -/obj/item/storage/CanReachStorage(atom/target,user,depth) - while(target && depth > 0) - target = target.loc - depth-- - if(target == src) - return TRUE - return FALSE - -/atom/movable/proc/DirectAccess(atom/target) - return (target == src || target == loc) +/atom/movable/proc/DirectAccess() + return list(src, loc) /mob/DirectAccess(atom/target) - return (..() || (target in contents)) + return ..() + contents /mob/living/DirectAccess(atom/target) - return (..() || (target in GetAllContents())) + return ..() + GetAllContents() /atom/proc/AllowClick() return FALSE @@ -309,7 +321,7 @@ A.ShiftClick(src) return /atom/proc/ShiftClick(mob/user) - SendSignal(COMSIG_CLICK_SHIFT, user) + SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user) if(user.client && user.client.eye == user || user.client.eye == user.loc) user.examinate(src) return @@ -324,7 +336,7 @@ return /atom/proc/CtrlClick(mob/user) - SendSignal(COMSIG_CLICK_CTRL, user) + SEND_SIGNAL(src, COMSIG_CLICK_CTRL, user) var/mob/living/ML = user if(istype(ML)) ML.pulled(src) @@ -356,7 +368,7 @@ ..() /atom/proc/AltClick(mob/user) - SendSignal(COMSIG_CLICK_ALT, user) + SEND_SIGNAL(src, COMSIG_CLICK_ALT, user) var/turf/T = get_turf(src) if(T && user.TurfAdjacent(T)) if(user.listed_turf == T) @@ -381,7 +393,7 @@ return /atom/proc/CtrlShiftClick(mob/user) - SendSignal(COMSIG_CLICK_CTRL_SHIFT) + SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT) return /* diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 36b363db56..006207c3f3 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -101,7 +101,7 @@ /mob/living/silicon/robot/AltClickOn(atom/A) A.BorgAltClick(src) -/atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overriden +/atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overridden CtrlShiftClick(user) /obj/machinery/door/airlock/BorgCtrlShiftClick(mob/living/silicon/robot/user) // Sets/Unsets Emergency Access Override Forwards to AI code. @@ -111,7 +111,7 @@ ..() -/atom/proc/BorgShiftClick(mob/living/silicon/robot/user) //forward to human click if not overriden +/atom/proc/BorgShiftClick(mob/living/silicon/robot/user) //forward to human click if not overridden ShiftClick(user) /obj/machinery/door/airlock/BorgShiftClick(mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code. @@ -121,7 +121,7 @@ ..() -/atom/proc/BorgCtrlClick(mob/living/silicon/robot/user) //forward to human click if not overriden +/atom/proc/BorgCtrlClick(mob/living/silicon/robot/user) //forward to human click if not overridden CtrlClick(user) /obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code. diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 97924be2d4..2f97401af7 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -2,13 +2,13 @@ MouseDrop: Called on the atom you're dragging. In a lot of circumstances we want to use the - recieving object instead, so that's the default action. This allows you to drag + receiving object instead, so that's the default action. This allows you to drag almost anything into a trash can. */ /atom/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) if(!usr || !over) return - if(SendSignal(COMSIG_MOUSEDROP_ONTO, over, usr) & COMPONENT_NO_MOUSEDROP) //Whatever is recieving will verify themselves for adjacency. + if(SEND_SIGNAL(src, COMSIG_MOUSEDROP_ONTO, over, usr) & COMPONENT_NO_MOUSEDROP) //Whatever is receiving will verify themselves for adjacency. return if(over == src) return usr.client.Click(src, src_location, src_control, params) @@ -18,9 +18,9 @@ over.MouseDrop_T(src,usr) return -// recieve a mousedrop +// receive a mousedrop /atom/proc/MouseDrop_T(atom/dropping, mob/user) - SendSignal(COMSIG_MOUSEDROPPED_ONTO, dropping, user) + SEND_SIGNAL(src, COMSIG_MOUSEDROPPED_ONTO, dropping, user) return @@ -140,4 +140,4 @@ if (middragatom == src_object) middragtime = 0 middragatom = null - ..() + ..() \ No newline at end of file diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 47cb76a978..4ae61169b7 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -138,7 +138,7 @@ /datum/hud/proc/get_action_buttons_icons() . = list() - .["bg_icon"] = ui_style_icon + .["bg_icon"] = ui_style .["bg_state"] = "template" //TODO : Make these fit theme diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 463051c6b4..2bb514d008 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -186,9 +186,9 @@ /datum/hud/ai - ui_style_icon = 'icons/mob/screen_ai.dmi' + ui_style = 'icons/mob/screen_ai.dmi' -/datum/hud/ai/New(mob/owner, ui_style = 'icons/mob/screen_ai.dmi') +/datum/hud/ai/New(mob/owner) ..() var/obj/screen/using diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index bb61f2218d..3d22cb5522 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -237,6 +237,16 @@ magboots would let you walk around normally on the floor. Barring those, you can or shoot a gun to move around via Newton's 3rd Law of Motion." icon_state = "weightless" +/obj/screen/alert/highgravity + name = "High Gravity" + desc = "You're getting crushed by high gravity, picking up items and movement will be slowed." + icon_state = "paralysis" + +/obj/screen/alert/veryhighgravity + name = "Crushing Gravity" + desc = "You're getting crushed by high gravity, picking up items and movement will be slowed. You'll also accumulate brute damage!" + icon_state = "paralysis" + /obj/screen/alert/fire name = "On Fire" desc = "You're on fire. Stop, drop and roll to put the fire out or move to a vacuum area." @@ -588,7 +598,6 @@ so as to remain in compliance with the most up-to-date laws." // Re-render all alerts - also called in /datum/hud/show_hud() because it's needed there /datum/hud/proc/reorganize_alerts() var/list/alerts = mymob.alerts - var/icon_pref if(!hud_shown) for(var/i = 1, i <= alerts.len, i++) mymob.client.screen -= alerts[alerts[i]] @@ -596,9 +605,7 @@ so as to remain in compliance with the most up-to-date laws." for(var/i = 1, i <= alerts.len, i++) var/obj/screen/alert/alert = alerts[alerts[i]] if(alert.icon_state == "template") - if(!icon_pref) - icon_pref = ui_style2icon(mymob.client.prefs.UI_style) - alert.icon = icon_pref + alert.icon = ui_style switch(i) if(1) . = ui_alert1 diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 5a8cff1df0..3b943209d3 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -24,11 +24,10 @@ desc = "Allows you to sense the general direction of your Queen." screen_loc = ui_alien_queen_finder - /datum/hud/alien - ui_style_icon = 'icons/mob/screen_alien.dmi' + ui_style = 'icons/mob/screen_alien.dmi' -/datum/hud/alien/New(mob/living/carbon/alien/humanoid/owner, ui_style = 'icons/mob/screen_alien.dmi') +/datum/hud/alien/New(mob/living/carbon/alien/humanoid/owner) ..() var/obj/screen/using @@ -36,7 +35,7 @@ //equippable shit //hands - build_hand_slots(ui_style) + build_hand_slots() //begin buttons diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 0f044a2bc7..1ce916f61d 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -1,3 +1,6 @@ +/datum/hud/larva + ui_style = 'icons/mob/screen_alien.dmi' + /datum/hud/larva/New(mob/owner) ..() var/obj/screen/using diff --git a/code/_onclick/hud/constructs.dm b/code/_onclick/hud/constructs.dm index 729de9da4a..d4f6b90ca6 100644 --- a/code/_onclick/hud/constructs.dm +++ b/code/_onclick/hud/constructs.dm @@ -1,11 +1,10 @@ - /datum/hud/constructs - ui_style_icon = 'icons/mob/screen_construct.dmi' + ui_style = 'icons/mob/screen_construct.dmi' /datum/hud/constructs/New(mob/owner) ..() pull_icon = new /obj/screen/pull() - pull_icon.icon = 'icons/mob/screen_construct.dmi' + pull_icon.icon = ui_style pull_icon.update_icon(mymob) pull_icon.screen_loc = ui_construct_pull static_inventory += pull_icon diff --git a/code/_onclick/hud/devil.dm b/code/_onclick/hud/devil.dm index 0cd0b6a6a9..b30eeefc1b 100644 --- a/code/_onclick/hud/devil.dm +++ b/code/_onclick/hud/devil.dm @@ -2,7 +2,7 @@ //Soul counter is stored with the humans, it does weird when you place it here apparently... -/datum/hud/devil/New(mob/owner, ui_style = 'icons/mob/screen_midnight.dmi') +/datum/hud/devil/New(mob/owner) ..() var/obj/screen/using @@ -17,7 +17,7 @@ pull_icon.screen_loc = ui_drone_pull static_inventory += pull_icon - build_hand_slots(ui_style) + build_hand_slots() using = new /obj/screen/inventory() using.name = "hand" @@ -62,4 +62,4 @@ /mob/living/carbon/true_devil/create_mob_hud() if(client && !hud_used) - hud_used = new /datum/hud/devil(src, ui_style2icon(client.prefs.UI_style)) + hud_used = new /datum/hud/devil(src) diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm index 8e39d96bf6..bcdfa084d3 100644 --- a/code/_onclick/hud/drones.dm +++ b/code/_onclick/hud/drones.dm @@ -1,4 +1,4 @@ -/datum/hud/dextrous/drone/New(mob/owner, ui_style = 'icons/mob/screen_midnight.dmi') +/datum/hud/dextrous/drone/New(mob/owner) ..() var/obj/screen/inventory/inv_box diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index 39a79b108b..c42714ba7c 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -1,5 +1,5 @@ //Used for normal mobs that have hands. -/datum/hud/dextrous/New(mob/living/owner, ui_style = 'icons/mob/screen_midnight.dmi') +/datum/hud/dextrous/New(mob/living/owner) ..() var/obj/screen/using @@ -14,7 +14,7 @@ pull_icon.screen_loc = ui_drone_pull static_inventory += pull_icon - build_hand_slots(ui_style) + build_hand_slots() using = new /obj/screen/swap_hand() using.icon = ui_style @@ -78,6 +78,6 @@ /mob/living/simple_animal/create_mob_hud() if(client && !hud_used) if(dextrous) - hud_used = new dextrous_hud_type(src, ui_style2icon(client.prefs.UI_style)) + hud_used = new dextrous_hud_type(src) else ..() diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 8cff8fe09e..ea78da5952 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -44,7 +44,7 @@ var/mob/dead/observer/G = usr G.register_pai() -/datum/hud/ghost/New(mob/owner, ui_style = 'icons/mob/screen_midnight.dmi') +/datum/hud/ghost/New(mob/owner) ..() var/obj/screen/using @@ -90,4 +90,4 @@ /mob/dead/observer/create_mob_hud() if(client && !hud_used) - hud_used = new /datum/hud/ghost(src, ui_style2icon(client.prefs.UI_style)) + hud_used = new /datum/hud/ghost(src) diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm index 628efbffe5..687d47c017 100644 --- a/code/_onclick/hud/guardian.dm +++ b/code/_onclick/hud/guardian.dm @@ -32,9 +32,9 @@ if(dextrous) ..() else - hud_used = new /datum/hud/guardian(src, ui_style2icon(client.prefs.UI_style)) + hud_used = new /datum/hud/guardian(src) -/datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner, ui_style = 'icons/mob/screen_midnight.dmi') //for a dextrous guardian +/datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner) //for a dextrous guardian ..() var/obj/screen/using if(istype(owner, /mob/living/simple_animal/hostile/guardian/dextrous)) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 5678b14484..b5b42e06e1 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -4,6 +4,19 @@ including inventories and item quick actions. */ +// The default UI style is the first one in the list +GLOBAL_LIST_INIT(available_ui_styles, list( + "Midnight" = 'icons/mob/screen_midnight.dmi', + "Retro" = 'icons/mob/screen_retro.dmi', + "Plasmafire" = 'icons/mob/screen_plasmafire.dmi', + "Slimecore" = 'icons/mob/screen_slimecore.dmi', + "Operative" = 'icons/mob/screen_operative.dmi', + "Clockwork" = 'icons/mob/screen_clockwork.dmi' +)) + +/proc/ui_style2icon(ui_style) + return GLOB.available_ui_styles[ui_style] || GLOB.available_ui_styles[GLOB.available_ui_styles[1]] + /datum/hud var/mob/mymob @@ -45,12 +58,15 @@ var/obj/screen/internals var/obj/screen/mood - var/ui_style_icon = 'icons/mob/screen_midnight.dmi' + // subtypes can override this to force a specific UI style + var/ui_style -/datum/hud/New(mob/owner , ui_style = 'icons/mob/screen_midnight.dmi') +/datum/hud/New(mob/owner) mymob = owner - ui_style_icon = ui_style + if (!ui_style) + // will fall back to the default if any of these are null + ui_style = ui_style2icon(owner.client && owner.client.prefs && owner.client.prefs.UI_style) hide_actions_toggle = new hide_actions_toggle.InitialiseIcon(src) @@ -68,38 +84,19 @@ if(mymob.hud_used == src) mymob.hud_used = null - qdel(hide_actions_toggle) - hide_actions_toggle = null - - qdel(module_store_icon) - module_store_icon = null - - if(static_inventory.len) - for(var/thing in static_inventory) - qdel(thing) - static_inventory.Cut() + QDEL_NULL(hide_actions_toggle) + QDEL_NULL(module_store_icon) + QDEL_LIST(static_inventory) inv_slots.Cut() action_intent = null zone_select = null pull_icon = null - if(toggleable_inventory.len) - for(var/thing in toggleable_inventory) - qdel(thing) - toggleable_inventory.Cut() - - if(hotkeybuttons.len) - for(var/thing in hotkeybuttons) - qdel(thing) - hotkeybuttons.Cut() - + QDEL_LIST(toggleable_inventory) + QDEL_LIST(hotkeybuttons) throw_icon = null - - if(infodisplay.len) - for(var/thing in infodisplay) - qdel(thing) - infodisplay.Cut() + QDEL_LIST(infodisplay) healths = null healthdoll = null @@ -112,15 +109,8 @@ alien_plasma_display = null alien_queen_finder = null - if(plane_masters.len) - for(var/thing in plane_masters) - qdel(plane_masters[thing]) - plane_masters.Cut() - - if(screenoverlays.len) - for(var/thing in screenoverlays) - qdel(thing) - screenoverlays.Cut() + QDEL_LIST_ASSOC_VAL(plane_masters) + QDEL_LIST(screenoverlays) mymob = null return ..() @@ -239,6 +229,19 @@ if(!mymob) return +/datum/hud/proc/update_ui_style(new_ui_style) + // do nothing if overridden by a subtype or already on that style + if (initial(ui_style) || ui_style == new_ui_style) + return + + for(var/atom/item in static_inventory + toggleable_inventory + hotkeybuttons + infodisplay + screenoverlays + inv_slots) + if (item.icon == ui_style) + item.icon = new_ui_style + + ui_style = new_ui_style + build_hand_slots() + hide_actions_toggle.InitialiseIcon(src) + //Triggered when F12 is pressed (Unless someone changed something in the DMF) /mob/verb/button_pressed_F12() set name = "F12" @@ -254,7 +257,7 @@ //(re)builds the hand ui slots, throwing away old ones //not really worth jugglying existing ones so we just scrap+rebuild //9/10 this is only called once per mob and only for 2 hands -/datum/hud/proc/build_hand_slots(ui_style = 'icons/mob/screen_midnight.dmi') +/datum/hud/proc/build_hand_slots() for(var/h in hand_slots) var/obj/screen/inventory/hand/H = hand_slots[h] if(H) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 2ac0f14f95..fdb209d0bc 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -82,10 +82,10 @@ /mob/living/carbon/human/create_mob_hud() if(client && !hud_used) - hud_used = new /datum/hud/human(src, ui_style2icon(client.prefs.UI_style)) + hud_used = new /datum/hud/human(src) -/datum/hud/human/New(mob/living/carbon/human/owner, ui_style = 'icons/mob/screen_midnight.dmi') +/datum/hud/human/New(mob/living/carbon/human/owner) ..() owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness) @@ -152,7 +152,7 @@ inv_box.screen_loc = ui_oclothing toggleable_inventory += inv_box - build_hand_slots(ui_style) + build_hand_slots() using = new /obj/screen/swap_hand() using.icon = ui_style diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index c469c1ef20..479fd59dae 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -1,4 +1,4 @@ -/datum/hud/monkey/New(mob/living/carbon/monkey/owner, ui_style = 'icons/mob/screen_midnight.dmi') +/datum/hud/monkey/New(mob/living/carbon/monkey/owner) ..() var/obj/screen/using var/obj/screen/inventory/inv_box @@ -24,7 +24,7 @@ using.screen_loc = ui_drop_throw static_inventory += using - build_hand_slots(ui_style) + build_hand_slots() using = new /obj/screen/swap_hand() using.icon = ui_style @@ -152,4 +152,4 @@ /mob/living/carbon/monkey/create_mob_hud() if(client && !hud_used) - hud_used = new /datum/hud/monkey(src, ui_style2icon(client.prefs.UI_style)) + hud_used = new /datum/hud/monkey(src) diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 769cdb2244..7cc51fade1 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -89,9 +89,9 @@ R.toggle_ionpulse() /datum/hud/robot - ui_style_icon = 'icons/mob/screen_cyborg.dmi' + ui_style = 'icons/mob/screen_cyborg.dmi' -/datum/hud/robot/New(mob/owner, ui_style = 'icons/mob/screen_cyborg.dmi') +/datum/hud/robot/New(mob/owner) ..() var/mob/living/silicon/robot/mymobR = mymob var/obj/screen/using diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index b48d86ec0e..df0935d8ab 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -17,17 +17,18 @@ // Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. /obj/item/proc/attack_self(mob/user) - SendSignal(COMSIG_ITEM_ATTACK_SELF, user) + if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_NO_INTERACT) + return interact(user) /obj/item/proc/pre_attack(atom/A, mob/living/user, params) //do stuff before attackby! - if(SendSignal(COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK) + if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK) return FALSE return TRUE //return FALSE to avoid calling attackby after this proc does stuff // No comment /atom/proc/attackby(obj/item/W, mob/user, params) - if(SendSignal(COMSIG_PARENT_ATTACKBY, W, user, params) & COMPONENT_NO_AFTERATTACK) + if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, params) & COMPONENT_NO_AFTERATTACK) return TRUE return FALSE @@ -52,8 +53,8 @@ /obj/item/proc/attack(mob/living/M, mob/living/user) - SendSignal(COMSIG_ITEM_ATTACK, M, user) - if(flags_1 & NOBLUDGEON_1) + SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) + if(item_flags & NOBLUDGEON) return if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit @@ -82,9 +83,9 @@ //the equivalent of the standard version of attack() but for object targets. /obj/item/proc/attack_obj(obj/O, mob/living/user) - if(SendSignal(COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ) + if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ) return - if(flags_1 & NOBLUDGEON_1) + if(item_flags & NOBLUDGEON) return if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index e7ec2255ae..63e1a14aa6 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -48,7 +48,7 @@ // Oh by the way this didn't work with old click code which is why clicking shit didn't spam you /atom/proc/attack_ghost(mob/dead/observer/user) - if(SendSignal(COMSIG_ATOM_ATTACK_GHOST, user) & COMPONENT_NO_ATTACK_HAND) + if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_GHOST, user) & COMPONENT_NO_ATTACK_HAND) return TRUE if(user.client) if(IsAdminGhost(user)) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 2c1c60c6e4..26823133f3 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -25,7 +25,7 @@ if(override) return - SendSignal(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, A) + SEND_SIGNAL(src, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, A) A.attack_hand(src) //Return TRUE to cancel other attack hand effects that respect it. @@ -33,7 +33,7 @@ . = FALSE if(!(interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND)) add_fingerprint(user) - if(SendSignal(COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_NO_ATTACK_HAND) + if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_NO_ATTACK_HAND) . = TRUE if(interaction_flags_atom & INTERACT_ATOM_ATTACK_HAND) . = _try_interact(user) @@ -111,7 +111,7 @@ A.attack_paw(src) /atom/proc/attack_paw(mob/user) - if(SendSignal(COMSIG_ATOM_ATTACK_PAW, user) & COMPONENT_NO_ATTACK_HAND) + if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_PAW, user) & COMPONENT_NO_ATTACK_HAND) return TRUE return FALSE diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 18f1c61d94..85e7958b53 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -70,7 +70,7 @@ desc = "Magic" icon = 'icons/obj/magic.dmi'//Needs sprites icon_state = "2" - flags_1 = NOBLUDGEON_1 | ABSTRACT_1 | DROPDEL_1 + item_flags = NOBLUDGEON | ABSTRACT | DROPDEL //item_state = null w_class = WEIGHT_CLASS_GIGANTIC layer = ABOVE_HUD_LAYER diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 24bf518a03..c683f55c59 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -10,6 +10,8 @@ var/resident_file //the file which this was loaded from, if any var/modified = FALSE //set to TRUE if the default has been overridden by a config entry + var/deprecated_by //the /datum/config_entry type that supercedes this one + var/protection = NONE var/abstract_type = /datum/config_entry //do not instantiate if type matches this @@ -85,6 +87,9 @@ /datum/config_entry/proc/ValidateListEntry(key_name, key_value) return TRUE +/datum/config_entry/proc/DeprecationUpdate(value) + return + /datum/config_entry/string config_entry_value = "" abstract_type = /datum/config_entry/string diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 25b3a46fa0..5c22fc320f 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -3,6 +3,7 @@ var/directory = "config" + var/warned_deprecated_configs = FALSE var/hiding_entries_by_type = TRUE //Set for readability, admins can set this to FALSE if they want to debug it var/list/entries var/list/entries_by_type @@ -123,11 +124,26 @@ if(lockthis) E.protection |= CONFIG_ENTRY_LOCKED + if(E.deprecated_by) + var/datum/config_entry/new_ver = entries_by_type[E.deprecated_by] + var/new_value = E.DeprecationUpdate(value) + var/good_update = istext(new_value) + log_config("Entry [entry] is deprecated and will be removed soon. Migrate to [new_ver.name]![good_update ? " Suggested new value is: [new_value]" : ""]") + if(!warned_deprecated_configs) + addtimer(CALLBACK(GLOBAL_PROC, /proc/message_admins, "This server is using deprecated configuration settings. Please check the logs and update accordingly."), 0) + warned_deprecated_configs = TRUE + if(good_update) + value = new_value + E = new_ver + else + warning("[new_ver.type] is deprecated but gave no proper return for DeprecationUpdate()") + var/validated = E.ValidateAndSet(value) if(!validated) log_config("Failed to validate setting \"[value]\" for [entry]") - else if(E.modified && !E.dupes_allowed) - log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.") + else + if(E.modified && !E.dupes_allowed) + log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.") E.resident_file = filename diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 5f2c583d59..88ce13db92 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -134,7 +134,7 @@ /datum/config_entry/flag/no_summon_events //Allowed -/datum/config_entry/flag/no_intercept_report //Whether or not to send a communications intercept report roundstart. This may be overriden by gamemodes. +/datum/config_entry/flag/no_intercept_report //Whether or not to send a communications intercept report roundstart. This may be overridden by gamemodes. /datum/config_entry/number/arrivals_shuttle_dock_window //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station config_entry_value = 55 diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 99644ce88f..1d41e9a765 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -55,6 +55,8 @@ /datum/config_entry/flag/log_manifest // log crew manifest to seperate file +/datum/config_entry/flag/log_job_debug // log roundstart divide occupations debug information to a file + /datum/config_entry/flag/allow_admin_ooccolor // Allows admins with relevant permissions to have their own ooc colour /datum/config_entry/flag/allow_vote_restart // allow votes to restart diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index f25244a6b1..bdf0302a3e 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -24,6 +24,17 @@ SUBSYSTEM_DEF(blackbox) //poll population /datum/controller/subsystem/blackbox/fire() + set waitfor = FALSE //for population query + + CheckPlayerCount() + + if(CONFIG_GET(flag/use_exp_tracking)) + if((triggertime < 0) || (world.time > (triggertime +3000))) //subsystem fires once at roundstart then once every 10 minutes. a 5 min check skips the first fire. The <0 is midnight rollover check + update_exp(10,FALSE) + +/datum/controller/subsystem/blackbox/proc/CheckPlayerCount() + set waitfor = FALSE + if(!SSdbcore.Connect()) return var/playercount = 0 @@ -33,11 +44,7 @@ SUBSYSTEM_DEF(blackbox) var/admincount = GLOB.admins.len var/datum/DBQuery/query_record_playercount = SSdbcore.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port, round_id) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]', '[GLOB.round_id]')") query_record_playercount.Execute() - - if(CONFIG_GET(flag/use_exp_tracking)) - if((triggertime < 0) || (world.time > (triggertime +3000))) //subsystem fires once at roundstart then once every 10 minutes. a 5 min check skips the first fire. The <0 is midnight rollover check - update_exp(10,FALSE) - + qdel(query_record_playercount) /datum/controller/subsystem/blackbox/Recover() feedback = SSblackbox.feedback @@ -144,7 +151,7 @@ feedback data can be recorded in 5 formats: SSblackbox.record_feedback("text", "example", 1, "other text") json: {"data":["sample text","other text"]} "amount" - used to record simple counts of data i.e. the number of ahelps recieved + used to record simple counts of data i.e. the number of ahelps received further calls to the same key will add or subtract (if increment argument is a negative) from the saved amount calls: SSblackbox.record_feedback("amount", "example", 8) SSblackbox.record_feedback("amount", "example", 2) @@ -255,6 +262,7 @@ Versioning key_type = new_key_type /datum/controller/subsystem/blackbox/proc/ReportDeath(mob/living/L) + set waitfor = FALSE if(sealed) return if(!L || !L.key || !L.mind) @@ -267,28 +275,50 @@ Versioning first_death["area"] = "[AREACOORD(L)]" first_death["damage"] = "[L.getBruteLoss()]/[L.getFireLoss()]/[L.getToxLoss()]/[L.getOxyLoss()]/[L.getCloneLoss()]" first_death["last_words"] = L.last_words + var/sqlname = L.real_name + var/sqlkey = L.ckey + var/sqljob = L.mind.assigned_role + var/sqlspecial = L.mind.special_role + var/sqlpod = get_area_name(L, TRUE) + var/laname = L.lastattacker + var/lakey = L.lastattackerckey + var/sqlbrute = L.getBruteLoss() + var/sqlfire = L.getFireLoss() + var/sqlbrain = L.getBrainLoss() + var/sqloxy = L.getOxyLoss() + var/sqltox = L.getToxLoss() + var/sqlclone = L.getCloneLoss() + var/sqlstamina = L.getStaminaLoss() + var/x_coord = L.x + var/y_coord = L.y + var/z_coord = L.z + var/last_words = L.last_words + var/suicide = L.suiciding + var/map = SSmapping.config.map_name + if(!SSdbcore.Connect()) return - var/area/placeofdeath = get_area(L) - var/sqlname = sanitizeSQL(L.real_name) - var/sqlkey = sanitizeSQL(L.ckey) - var/sqljob = sanitizeSQL(L.mind.assigned_role) - var/sqlspecial = sanitizeSQL(L.mind.special_role) - var/sqlpod = sanitizeSQL(placeofdeath.name) - var/laname = sanitizeSQL(L.lastattacker) - var/lakey = sanitizeSQL(L.lastattackerckey) - var/sqlbrute = sanitizeSQL(L.getBruteLoss()) - var/sqlfire = sanitizeSQL(L.getFireLoss()) - var/sqlbrain = sanitizeSQL(L.getBrainLoss()) - var/sqloxy = sanitizeSQL(L.getOxyLoss()) - var/sqltox = sanitizeSQL(L.getToxLoss()) - var/sqlclone = sanitizeSQL(L.getCloneLoss()) - var/sqlstamina = sanitizeSQL(L.getStaminaLoss()) - var/x_coord = sanitizeSQL(L.x) - var/y_coord = sanitizeSQL(L.y) - var/z_coord = sanitizeSQL(L.z) - var/last_words = sanitizeSQL(L.last_words) - var/suicide = sanitizeSQL(L.suiciding) - var/map = sanitizeSQL(SSmapping.config.map_name) + + sqlname = sanitizeSQL(sqlname) + sqlkey = sanitizeSQL(sqlkey) + sqljob = sanitizeSQL(sqljob) + sqlspecial = sanitizeSQL(sqlspecial) + sqlpod = sanitizeSQL(sqlpod) + laname = sanitizeSQL(laname) + lakey = sanitizeSQL(lakey) + sqlbrute = sanitizeSQL(sqlbrute) + sqlfire = sanitizeSQL(sqlfire) + sqlbrain = sanitizeSQL(sqlbrain) + sqloxy = sanitizeSQL(sqloxy) + sqltox = sanitizeSQL(sqltox) + sqlclone = sanitizeSQL(sqlclone) + sqlstamina = sanitizeSQL(sqlstamina) + x_coord = sanitizeSQL(x_coord) + y_coord = sanitizeSQL(y_coord) + z_coord = sanitizeSQL(z_coord) + last_words = sanitizeSQL(last_words) + suicide = sanitizeSQL(suicide) + map = sanitizeSQL(map) var/datum/DBQuery/query_report_death = SSdbcore.NewQuery("INSERT INTO [format_table_name("death")] (pod, x_coord, y_coord, z_coord, mapname, server_ip, server_port, round_id, tod, job, special, name, byondkey, laname, lakey, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, last_words, suicide) VALUES ('[sqlpod]', '[x_coord]', '[y_coord]', '[z_coord]', '[map]', INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]', [GLOB.round_id], '[SQLtime()]', '[sqljob]', '[sqlspecial]', '[sqlname]', '[sqlkey]', '[laname]', '[lakey]', [sqlbrute], [sqlfire], [sqlbrain], [sqloxy], [sqltox], [sqlclone], [sqlstamina], '[last_words]', [suicide])") - query_report_death.Execute() \ No newline at end of file + query_report_death.Execute() + qdel(query_report_death) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index f276da972c..15a668b038 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -293,13 +293,13 @@ SUBSYSTEM_DEF(garbage) if(isnull(D.gc_destroyed)) - if (D.SendSignal(COMSIG_PARENT_PREQDELETED, force)) // Give the components a chance to prevent their parent from being deleted + if (SEND_SIGNAL(D, COMSIG_PARENT_PREQDELETED, force)) // Give the components a chance to prevent their parent from being deleted return D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED var/start_time = world.time var/start_tick = world.tick_usage var/hint = D.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. - D.SendSignal(COMSIG_PARENT_QDELETED, force, hint) // Let the (remaining) components know about the result of Destroy + SEND_SIGNAL(D, COMSIG_PARENT_QDELETED, force, hint) // Let the (remaining) components know about the result of Destroy if(world.time != start_time) I.slept_destroy++ else diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 7a506acbe5..36fd630789 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -7,7 +7,6 @@ SUBSYSTEM_DEF(job) var/list/name_occupations = list() //Dict of all jobs, keys are titles var/list/type_occupations = list() //Dict of all jobs, keys are types var/list/unassigned = list() //Players who need jobs - var/list/job_debug = list() //Debug info var/initial_players_to_assign = 0 //used for checking against population caps var/list/prioritized_jobs = list() @@ -36,6 +35,7 @@ SUBSYSTEM_DEF(job) old_overflow.spawn_positions = initial(old_overflow.spawn_positions) old_overflow.total_positions = initial(old_overflow.total_positions) overflow_role = new_overflow_role + JobDebug("Overflow role set to : [new_overflow_role]") /datum/controller/subsystem/job/proc/SetupOccupations(faction = "Station") occupations = list() @@ -62,13 +62,6 @@ SUBSYSTEM_DEF(job) return 1 -/datum/controller/subsystem/job/proc/Debug(text) - if(!GLOB.Debug2) - return 0 - job_debug.Add(text) - return 1 - - /datum/controller/subsystem/job/proc/GetJob(rank) if(!occupations.len) SetupOccupations() @@ -80,12 +73,12 @@ SUBSYSTEM_DEF(job) return type_occupations[jobtype] /datum/controller/subsystem/job/proc/AssignRole(mob/dead/new_player/player, rank, latejoin = FALSE) - Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]") + JobDebug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]") if(player && player.mind && rank) var/datum/job/job = GetJob(rank) if(!job) return FALSE - if(jobban_isbanned(player, rank)) + if(jobban_isbanned(player, rank) || QDELETED(player)) return FALSE if(!job.player_old_enough(player.client)) return FALSE @@ -94,41 +87,41 @@ SUBSYSTEM_DEF(job) var/position_limit = job.total_positions if(!latejoin) position_limit = job.spawn_positions - Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]") + JobDebug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]") player.mind.assigned_role = rank unassigned -= player job.current_positions++ return TRUE - Debug("AR has failed, Player: [player], Rank: [rank]") + JobDebug("AR has failed, Player: [player], Rank: [rank]") return FALSE /datum/controller/subsystem/job/proc/FindOccupationCandidates(datum/job/job, level, flag) - Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]") + JobDebug("Running FOC, Job: [job], Level: [level], Flag: [flag]") var/list/candidates = list() for(var/mob/dead/new_player/player in unassigned) - if(jobban_isbanned(player, job.title)) - Debug("FOC isbanned failed, Player: [player]") + if(jobban_isbanned(player, job.title) || QDELETED(player)) + JobDebug("FOC isbanned failed, Player: [player]") continue if(!job.player_old_enough(player.client)) - Debug("FOC player not old enough, Player: [player]") + JobDebug("FOC player not old enough, Player: [player]") continue if(job.required_playtime_remaining(player.client)) - Debug("FOC player not enough xp, Player: [player]") + JobDebug("FOC player not enough xp, Player: [player]") continue if(flag && (!(flag in player.client.prefs.be_special))) - Debug("FOC flag failed, Player: [player], Flag: [flag], ") + JobDebug("FOC flag failed, Player: [player], Flag: [flag], ") continue if(player.mind && job.title in player.mind.restricted_roles) - Debug("FOC incompatible with antagonist role, Player: [player]") + JobDebug("FOC incompatible with antagonist role, Player: [player]") continue if(player.client.prefs.GetJobDepartment(job, level) & job.flag) - Debug("FOC pass, Player: [player], Level:[level]") + JobDebug("FOC pass, Player: [player], Level:[level]") candidates += player return candidates /datum/controller/subsystem/job/proc/GiveRandomJob(mob/dead/new_player/player) - Debug("GRJ Giving random job, Player: [player]") + JobDebug("GRJ Giving random job, Player: [player]") . = FALSE for(var/datum/job/job in shuffle(occupations)) if(!job) @@ -140,32 +133,37 @@ SUBSYSTEM_DEF(job) if(job.title in GLOB.command_positions) //If you want a command position, select it! continue - if(jobban_isbanned(player, job.title)) - Debug("GRJ isbanned failed, Player: [player], Job: [job.title]") + if(jobban_isbanned(player, job.title) || QDELETED(player)) + if(QDELETED(player)) + JobDebug("GRJ isbanned failed, Player deleted") + break + JobDebug("GRJ isbanned failed, Player: [player], Job: [job.title]") continue if(!job.player_old_enough(player.client)) - Debug("GRJ player not old enough, Player: [player]") + JobDebug("GRJ player not old enough, Player: [player]") continue if(job.required_playtime_remaining(player.client)) - Debug("GRJ player not enough xp, Player: [player]") + JobDebug("GRJ player not enough xp, Player: [player]") continue if(player.mind && job.title in player.mind.restricted_roles) - Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]") + JobDebug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]") continue if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1) - Debug("GRJ Random job given, Player: [player], Job: [job]") + JobDebug("GRJ Random job given, Player: [player], Job: [job]") if(AssignRole(player, job.title)) return TRUE /datum/controller/subsystem/job/proc/ResetOccupations() + JobDebug("Occupations reset.") for(var/mob/dead/new_player/player in GLOB.player_list) if((player) && (player.mind)) player.mind.assigned_role = null player.mind.special_role = null + SSpersistence.antag_rep_change[player.ckey] = 0 SetupOccupations() unassigned = list() return @@ -231,7 +229,7 @@ SUBSYSTEM_DEF(job) **/ /datum/controller/subsystem/job/proc/DivideOccupations() //Setup new player list and get the jobs list - Debug("Running DO") + JobDebug("Running DO") //Holder for Triumvirate is stored in the SSticker, this just processes it if(SSticker.triai) @@ -247,7 +245,7 @@ SUBSYSTEM_DEF(job) initial_players_to_assign = unassigned.len - Debug("DO, Len: [unassigned.len]") + JobDebug("DO, Len: [unassigned.len]") if(unassigned.len == 0) return 0 @@ -268,28 +266,28 @@ SUBSYSTEM_DEF(job) HandleFeedbackGathering() //People who wants to be the overflow role, sure, go on. - Debug("DO, Running Overflow Check 1") + JobDebug("DO, Running Overflow Check 1") var/datum/job/overflow = GetJob(SSjob.overflow_role) var/list/overflow_candidates = FindOccupationCandidates(overflow, 3) - Debug("AC1, Candidates: [overflow_candidates.len]") + JobDebug("AC1, Candidates: [overflow_candidates.len]") for(var/mob/dead/new_player/player in overflow_candidates) - Debug("AC1 pass, Player: [player]") + JobDebug("AC1 pass, Player: [player]") AssignRole(player, SSjob.overflow_role) overflow_candidates -= player - Debug("DO, AC1 end") + JobDebug("DO, AC1 end") //Select one head - Debug("DO, Running Head Check") + JobDebug("DO, Running Head Check") FillHeadPosition() - Debug("DO, Head Check end") + JobDebug("DO, Head Check end") //Check for an AI - Debug("DO, Running AI Check") + JobDebug("DO, Running AI Check") FillAIPosition() - Debug("DO, AI Check end") + JobDebug("DO, AI Check end") //Other jobs are now checked - Debug("DO, Running Standard Check") + JobDebug("DO, Running Standard Check") // New job giving system by Donkie @@ -313,66 +311,71 @@ SUBSYSTEM_DEF(job) continue if(jobban_isbanned(player, job.title)) - Debug("DO isbanned failed, Player: [player], Job:[job.title]") + JobDebug("DO isbanned failed, Player: [player], Job:[job.title]") continue + if(QDELETED(player)) + JobDebug("DO player deleted during job ban check") + break + if(!job.player_old_enough(player.client)) - Debug("DO player not old enough, Player: [player], Job:[job.title]") + JobDebug("DO player not old enough, Player: [player], Job:[job.title]") continue if(job.required_playtime_remaining(player.client)) - Debug("DO player not enough xp, Player: [player], Job:[job.title]") + JobDebug("DO player not enough xp, Player: [player], Job:[job.title]") continue if(player.mind && job.title in player.mind.restricted_roles) - Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]") + JobDebug("DO incompatible with antagonist role, Player: [player], Job:[job.title]") continue // If the player wants that job on this level, then try give it to him. if(player.client.prefs.GetJobDepartment(job, level) & job.flag) - // If the job isn't filled if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1) - Debug("DO pass, Player: [player], Level:[level], Job:[job.title]") + JobDebug("DO pass, Player: [player], Level:[level], Job:[job.title]") AssignRole(player, job.title) unassigned -= player break + JobDebug("DO, Handling unassigned.") // Hand out random jobs to the people who didn't get any in the last check // Also makes sure that they got their preference correct for(var/mob/dead/new_player/player in unassigned) - if(PopcapReached()) - RejectPlayer(player) - else if(jobban_isbanned(player, SSjob.overflow_role)) - GiveRandomJob(player) //you get to roll for random before everyone else just to be sure you don't get overflow. you're so speshul - - for(var/mob/dead/new_player/player in unassigned) - if(PopcapReached()) - RejectPlayer(player) - else if(player.client.prefs.joblessrole == BERANDOMJOB) - GiveRandomJob(player) - - Debug("DO, Standard Check end") - - Debug("DO, Running AC2") - - // For those who wanted to be assistant if their preferences were filled, here you go. - for(var/mob/dead/new_player/player in unassigned) - if(PopcapReached()) - RejectPlayer(player) - if(player.client.prefs.joblessrole == BEOVERFLOW) - Debug("AC2 Assistant located, Player: [player]") - AssignRole(player, SSjob.overflow_role) - else // For those who don't want to play if their preference were filled, back you go. - RejectPlayer(player) + HandleUnassigned(player) + JobDebug("DO, Handling unrejectable unassigned") + //Mop up people who can't leave. for(var/mob/dead/new_player/player in unassigned) //Players that wanted to back out but couldn't because they're antags (can you feel the edge case?) if(!GiveRandomJob(player)) AssignRole(player, SSjob.overflow_role) //If everything is already filled, make them an assistant return 1 +//We couldn't find a job from prefs for this guy. +/datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player) + if(PopcapReached()) + RejectPlayer(player) + else if(player.client.prefs.joblessrole == BEOVERFLOW) + var/allowed_to_be_a_loser = !jobban_isbanned(player, SSjob.overflow_role) + if(QDELETED(player) || !allowed_to_be_a_loser) + RejectPlayer(player) + else + if(!AssignRole(player, SSjob.overflow_role)) + RejectPlayer(player) + else if(player.client.prefs.joblessrole == BERANDOMJOB) + if(!GiveRandomJob(player)) + RejectPlayer(player) + else if(player.client.prefs.joblessrole == RETURNTOLOBBY) + RejectPlayer(player) + else //Something gone wrong if we got here. + var/message = "DO: [player] fell through handling unassigned" + JobDebug(message) + log_game(message) + message_admins(message) + RejectPlayer(player) //Gives the player the stuff he should have with his rank /datum/controller/subsystem/job/proc/EquipRank(mob/M, rank, joined_late = FALSE) var/mob/dead/new_player/N @@ -448,7 +451,7 @@ SUBSYSTEM_DEF(job) if(ssc > 0) if(J.spawn_positions > 0) var/officer_positions = min(12, max(J.spawn_positions, round(unassigned.len / ssc))) //Scale between configured minimum and 12 officers - Debug("Setting open security officer positions to [officer_positions]") + JobDebug("Setting open security officer positions to [officer_positions]") J.total_positions = officer_positions J.spawn_positions = officer_positions @@ -484,7 +487,7 @@ SUBSYSTEM_DEF(job) for(var/mob/dead/new_player/player in GLOB.player_list) if(!(player.ready == PLAYER_READY_TO_PLAY && player.mind && !player.mind.assigned_role)) continue //This player is not ready - if(jobban_isbanned(player, job.title)) + if(jobban_isbanned(player, job.title) || QDELETED(player)) banned++ continue if(!job.player_old_enough(player.client)) @@ -520,7 +523,8 @@ SUBSYSTEM_DEF(job) if(player.mind && player.mind.special_role) return if(PopcapReached()) - Debug("Popcap overflow Check observer located, Player: [player]") + JobDebug("Popcap overflow Check observer located, Player: [player]") + JobDebug("Player rejected :[player]") to_chat(player, "You have failed to qualify for any job you desired.") unassigned -= player player.ready = PLAYER_NOT_READY @@ -625,3 +629,6 @@ SUBSYSTEM_DEF(job) for(var/mob/living/carbon/human/player in GLOB.carbon_list) if(player.mind && (player.mind.assigned_role in GLOB.security_positions)) . |= player.mind + +/datum/controller/subsystem/job/proc/JobDebug(message) + log_job_debug(message) \ No newline at end of file diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index e2698670e9..ba46a774fe 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -219,6 +219,7 @@ SUBSYSTEM_DEF(mapping) if(SSdbcore.Connect()) var/datum/DBQuery/query_round_map_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET map_name = '[config.map_name]' WHERE id = [GLOB.round_id]") query_round_map_name.Execute() + qdel(query_round_map_name) #ifndef LOWMEMORYMODE // TODO: remove this when the DB is prepared for the z-levels getting reordered diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm index 2f3b6c9668..1a7bd43fd2 100644 --- a/code/controllers/subsystem/overlays.dm +++ b/code/controllers/subsystem/overlays.dm @@ -115,38 +115,43 @@ SUBSYSTEM_DEF(overlays) #define NOT_QUEUED_ALREADY (!(flags_1 & OVERLAY_QUEUED_1)) #define QUEUE_FOR_COMPILE flags_1 |= OVERLAY_QUEUED_1; SSoverlays.queue += src; /atom/proc/cut_overlays(priority = FALSE) - var/list/cached_overlays = our_overlays - var/list/cached_priority = priority_overlays + LAZYINITLIST(priority_overlays) + LAZYINITLIST(remove_overlays) + LAZYINITLIST(add_overlays) + remove_overlays = overlays.Copy() + add_overlays.Cut() - var/need_compile = FALSE + if(priority) + priority_overlays.Cut() - if(LAZYLEN(cached_overlays)) //don't queue empty lists, don't cut priority overlays - cached_overlays.Cut() //clear regular overlays - need_compile = TRUE - - if(priority && LAZYLEN(cached_priority)) - cached_priority.Cut() - need_compile = TRUE - - if(NOT_QUEUED_ALREADY && need_compile) + //If not already queued for work and there are overlays to remove + if(NOT_QUEUED_ALREADY && remove_overlays.len) QUEUE_FOR_COMPILE /atom/proc/cut_overlay(list/overlays, priority) if(!overlays) return - overlays = build_appearance_list(overlays) + LAZYINITLIST(add_overlays) //always initialized after this point + LAZYINITLIST(priority_overlays) + LAZYINITLIST(remove_overlays) + var/a_len = add_overlays.len + var/r_len = remove_overlays.len + var/p_len = priority_overlays.len + remove_overlays += overlays + add_overlays -= overlays - var/list/cached_overlays = our_overlays //sanic - var/list/cached_priority = priority_overlays - var/init_o_len = LAZYLEN(cached_overlays) - var/init_p_len = LAZYLEN(cached_priority) //starter pokemon - LAZYREMOVE(cached_overlays, overlays) if(priority) + var/list/cached_priority = priority_overlays LAZYREMOVE(cached_priority, overlays) - if(NOT_QUEUED_ALREADY && ((init_o_len != LAZYLEN(cached_overlays)) || (init_p_len != LAZYLEN(cached_priority)))) + var/fa_len = add_overlays.len + var/fr_len = remove_overlays.len + var/fp_len = priority_overlays.len + + //If not already queued and there is work to be done + if(NOT_QUEUED_ALREADY && (fa_len != a_len || fr_len != r_len || fp_len != p_len)) QUEUE_FOR_COMPILE /atom/proc/add_overlay(list/overlays, priority = FALSE) @@ -155,24 +160,21 @@ SUBSYSTEM_DEF(overlays) overlays = build_appearance_list(overlays) - LAZYINITLIST(our_overlays) //always initialized after this point + LAZYINITLIST(add_overlays) //always initialized after this point LAZYINITLIST(priority_overlays) - - var/list/cached_overlays = our_overlays //sanic - var/list/cached_priority = priority_overlays - var/init_o_len = cached_overlays.len - var/init_p_len = cached_priority.len //starter pokemon - var/need_compile + var/a_len = add_overlays.len + var/p_len = priority_overlays.len if(priority) - cached_priority += overlays //or in the image. Can we use [image] = image? - need_compile = init_p_len != cached_priority.len + priority_overlays += overlays //or in the image. Can we use [image] = image? + var/fp_len = priority_overlays.len + if(NOT_QUEUED_ALREADY && fp_len != p_len) + QUEUE_FOR_COMPILE else - cached_overlays += overlays - need_compile = init_o_len != cached_overlays.len - - if(NOT_QUEUED_ALREADY && need_compile) //have we caught more pokemon? - QUEUE_FOR_COMPILE + add_overlays += overlays + var/fa_len = add_overlays.len + if(NOT_QUEUED_ALREADY && fa_len != a_len) + QUEUE_FOR_COMPILE /atom/proc/copy_overlays(atom/other, cut_old) //copys our_overlays from another atom if(!other) @@ -180,12 +182,11 @@ SUBSYSTEM_DEF(overlays) cut_overlays() return - var/list/cached_other = other.our_overlays + var/list/cached_other = other.overlays.Copy() if(cached_other) - if(cut_old || !LAZYLEN(our_overlays)) - our_overlays = cached_other.Copy() - else - our_overlays |= cached_other + if(cut_old || !LAZYLEN(overlays)) + remove_overlays = overlays + add_overlays = cached_other if(NOT_QUEUED_ALREADY) QUEUE_FOR_COMPILE else if(cut_old) @@ -196,7 +197,7 @@ SUBSYSTEM_DEF(overlays) //TODO: Better solution for these? /image/proc/add_overlay(x) - overlays += x + overlays |= x /image/proc/cut_overlay(x) overlays -= x @@ -210,10 +211,10 @@ SUBSYSTEM_DEF(overlays) cut_overlays() return - var/list/cached_other = other.our_overlays + var/list/cached_other = other.overlays.Copy() if(cached_other) if(cut_old || !overlays.len) - overlays = cached_other.Copy() + overlays = cached_other else overlays |= cached_other else if(cut_old) diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index d67ef40597..dcce2c0462 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -611,4 +611,4 @@ SUBSYSTEM_DEF(shuttle) var/obj/machinery/computer/camera_advanced/shuttle_docker/C = V C.update_hidden_docking_ports(remove_images, add_images) - QDEL_LIST(remove_images) \ No newline at end of file + QDEL_LIST(remove_images) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 774453c331..e515d3da34 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -42,6 +42,7 @@ SUBSYSTEM_DEF(ticker) var/timeLeft //pregame timer var/start_at + var/gametime_offset = 432000 //Deciseconds to add to world.time for station time. var/station_time_rate_multiplier = 12 //factor of station time progressal vs real time. @@ -263,8 +264,8 @@ SUBSYSTEM_DEF(ticker) if(!GLOB.Debug2) if(!can_continue) - qdel(mode) - mode = null + log_game("[mode.name] failed pre_setup, cause: [mode.setup_error]") + QDEL_NULL(mode) to_chat(world, "Error setting up [GLOB.master_mode]. Reverting to pre-game lobby.") SSjob.ResetOccupations() return 0 @@ -453,7 +454,7 @@ SUBSYSTEM_DEF(ticker) queued_players -= next_in_line //Client disconnected, remove he queue_delay = 0 //No vacancy: restart timer if(25 to INFINITY) //No response from the next in line when a vacancy exists, remove he - to_chat(next_in_line, "No response recieved. You have been removed from the line.") + to_chat(next_in_line, "No response received. You have been removed from the line.") queued_players -= next_in_line queue_delay = 0 diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 3d553a57b1..5866575809 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -485,6 +485,8 @@ SUBSYSTEM_DEF(timer) if (hash_timer.flags & TIMER_STOPPABLE) . = hash_timer.id return + else if(flags & TIMER_OVERRIDE) + stack_trace("TIMER_OVERRIDE used without TIMER_UNIQUE") var/timeToRun = world.time + wait @@ -510,9 +512,6 @@ SUBSYSTEM_DEF(timer) return TRUE return FALSE -/datum/controller/subsystem/timer/proc/tump_buckets() - reset_buckets() - SSticker.tumpedbuckets = TRUE #undef BUCKET_LEN #undef BUCKET_POS From 91805b878965a719af730cbe8008a9c95966c432 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 2 Jul 2018 00:28:51 -0400 Subject: [PATCH 176/204] and that just leaves the modules folder --- code/datums/ai_laws.dm | 6 +- code/datums/brain_damage/mild.dm | 4 +- code/datums/components/README.md | 23 +- code/datums/components/_component.dm | 16 +- code/datums/components/cleaning.dm | 14 +- code/datums/components/forced_gravity.dm | 8 + code/datums/components/material_container.dm | 2 +- code/datums/components/ntnet_interface.dm | 14 +- code/datums/components/riding.dm | 2 +- code/datums/components/rotation.dm | 18 ++ .../storage/concrete/bag_of_holding.dm | 2 +- .../components/storage/concrete/pockets.dm | 8 +- .../components/storage/concrete/rped.dm | 4 +- code/datums/components/storage/storage.dm | 27 +- code/datums/components/thermite.dm | 2 +- code/datums/components/uplink.dm | 250 ++++++++++++++++++ code/datums/datumvars.dm | 2 +- code/datums/diseases/_disease.dm | 3 +- code/datums/diseases/advance/presets.dm | 62 ++--- .../diseases/advance/symptoms/confusion.dm | 2 +- .../datums/diseases/advance/symptoms/cough.dm | 2 +- .../diseases/advance/symptoms/hallucigen.dm | 2 +- .../diseases/advance/symptoms/itching.dm | 2 +- .../diseases/advance/symptoms/shedding.dm | 2 +- .../diseases/advance/symptoms/sneeze.dm | 2 +- .../datums/diseases/advance/symptoms/vomit.dm | 2 +- code/datums/diseases/parrotpossession.dm | 2 +- code/datums/diseases/transformation.dm | 5 +- code/datums/diseases/tuberculosis.dm | 2 +- code/datums/explosion.dm | 2 +- code/datums/holocall.dm | 2 +- code/datums/mind.dm | 10 +- code/datums/mutations/body.dm | 4 +- code/datums/mutations/hulk.dm | 4 +- code/datums/mutations/sight.dm | 2 +- code/datums/outfit.dm | 4 +- code/datums/shuttles.dm | 12 + code/datums/status_effects/gas.dm | 12 + code/datums/status_effects/neutral.dm | 22 ++ code/datums/traits/negative.dm | 14 +- code/datums/weather/weather.dm | 2 +- code/game/alternate_appearance.dm | 13 + code/game/area/Space_Station_13_areas.dm | 4 +- code/game/area/areas.dm | 47 +++- code/game/area/areas/away_content.dm | 6 +- code/game/area/areas/centcom.dm | 15 +- code/game/area/areas/mining.dm | 4 +- code/game/area/areas/ruins/_ruins.dm | 2 +- code/game/area/areas/ruins/space.dm | 6 +- code/game/area/areas/shuttles.dm | 2 +- code/game/atoms.dm | 65 +++-- code/game/atoms_movable.dm | 17 +- code/game/data_huds.dm | 2 +- code/game/gamemodes/changeling/changeling.dm | 5 +- .../game/gamemodes/changeling/traitor_chan.dm | 6 +- code/game/gamemodes/clock_cult/clock_cult.dm | 4 +- .../game/gamemodes/clown_ops/bananium_bomb.dm | 6 +- code/game/gamemodes/clown_ops/clown_ops.dm | 2 +- .../game/gamemodes/clown_ops/clown_weapons.dm | 8 +- code/game/gamemodes/cult/cult.dm | 7 +- code/game/gamemodes/devil/devil_game_mode.dm | 1 + code/game/gamemodes/game_mode.dm | 6 +- code/game/gamemodes/monkey/monkey.dm | 1 + code/game/gamemodes/nuclear/nuclear.dm | 5 +- code/game/gamemodes/objective.dm | 4 +- code/game/gamemodes/revolution/revolution.dm | 1 + code/game/gamemodes/traitor/traitor.dm | 10 +- code/game/gamemodes/wizard/wizard.dm | 6 +- code/game/machinery/_machinery.dm | 6 +- code/game/machinery/autolathe.dm | 2 +- code/game/machinery/buttons.dm | 2 +- code/game/machinery/camera/camera.dm | 10 + code/game/machinery/camera/camera_assembly.dm | 6 +- code/game/machinery/camera/motion.dm | 3 + code/game/machinery/camera/presets.dm | 10 +- code/game/machinery/computer/aifixer.dm | 2 +- code/game/machinery/computer/arcade.dm | 2 +- code/game/machinery/computer/camera.dm | 131 +++++++-- .../machinery/computer/camera_advanced.dm | 2 +- code/game/machinery/computer/card.dm | 17 +- .../game/machinery/computer/communications.dm | 2 +- code/game/machinery/computer/dna_console.dm | 2 +- code/game/machinery/computer/medical.dm | 2 +- code/game/machinery/computer/pod.dm | 2 +- code/game/machinery/computer/security.dm | 10 +- code/game/machinery/constructable_frame.dm | 4 +- code/game/machinery/defibrillator_mount.dm | 4 +- code/game/machinery/doors/airlock.dm | 6 +- code/game/machinery/doors/door.dm | 2 +- .../embedded_controller/airlock_controller.dm | 2 +- .../simple_vent_controller.dm | 2 +- code/game/machinery/igniter.dm | 4 +- code/game/machinery/newscaster.dm | 2 +- code/game/machinery/suit_storage_unit.dm | 2 +- code/game/machinery/syndicatebomb.dm | 8 +- .../telecomms/computers/logbrowser.dm | 2 +- .../machinery/telecomms/machines/allinone.dm | 2 +- code/game/machinery/transformer.dm | 3 +- code/game/machinery/washing_machine.dm | 2 +- code/game/mecha/equipment/tools/work_tools.dm | 48 +++- code/game/mecha/equipment/weapons/weapons.dm | 2 +- code/game/mecha/mech_fabricator.dm | 2 +- code/game/mecha/mecha_construction_paths.dm | 12 +- code/game/mecha/mecha_parts.dm | 4 +- code/game/mecha/mecha_wreckage.dm | 2 +- code/game/mecha/working/ripley.dm | 12 + code/game/objects/buckling.dm | 4 +- code/game/objects/effects/anomalies.dm | 29 +- code/game/objects/effects/contraband.dm | 6 +- code/game/objects/effects/countdown.dm | 11 +- .../effects/effect_system/effects_smoke.dm | 2 +- .../effects/effect_system/effects_sparks.dm | 6 +- code/game/objects/effects/mines.dm | 2 +- code/game/objects/effects/proximity.dm | 14 +- code/game/objects/effects/spiders.dm | 2 +- .../temporary_visuals/miscellaneous.dm | 23 ++ .../temporary_visuals/projectiles/impact.dm | 2 +- .../projectiles/projectile_effects.dm | 1 - .../temporary_visuals/projectiles/tracer.dm | 2 +- code/game/objects/items.dm | 38 ++- code/game/objects/items/AI_modules.dm | 2 +- code/game/objects/items/RCD.dm | 5 +- code/game/objects/items/RSF.dm | 2 +- code/game/objects/items/airlock_painter.dm | 3 +- code/game/objects/items/cardboard_cutouts.dm | 2 +- code/game/objects/items/cards_ids.dm | 5 +- code/game/objects/items/chrono_eraser.dm | 2 +- code/game/objects/items/cigs_lighters.dm | 2 +- .../circuitboards/machine_circuitboards.dm | 65 +++-- code/game/objects/items/clown_items.dm | 8 +- code/game/objects/items/devices/PDA/PDA.dm | 17 +- code/game/objects/items/devices/PDA/cart.dm | 2 +- code/game/objects/items/devices/aicard.dm | 2 +- .../items/devices/anomaly_neutralizer.dm | 2 +- code/game/objects/items/devices/camera_bug.dm | 2 +- .../objects/items/devices/chameleonproj.dm | 5 +- code/game/objects/items/devices/doorCharge.dm | 2 +- code/game/objects/items/devices/flashlight.dm | 10 +- .../items/devices/forcefieldprojector.dm | 4 +- .../objects/items/devices/geiger_counter.dm | 2 +- code/game/objects/items/devices/gps.dm | 6 +- .../objects/items/devices/laserpointer.dm | 3 +- .../objects/items/devices/lightreplacer.dm | 2 +- code/game/objects/items/devices/multitool.dm | 2 +- code/game/objects/items/devices/paicard.dm | 2 +- .../objects/items/devices/pipe_painter.dm | 2 +- .../items/devices/radio/electropack.dm | 4 +- .../game/objects/items/devices/radio/radio.dm | 14 +- .../items/devices/reverse_bear_trap.dm | 8 +- code/game/objects/items/devices/scanners.dm | 37 ++- code/game/objects/items/dice.dm | 6 +- code/game/objects/items/dna_injector.dm | 6 +- code/game/objects/items/gift.dm | 2 +- code/game/objects/items/granters.dm | 10 +- .../objects/items/grenades/antigravity.dm | 17 ++ .../objects/items/grenades/chem_grenade.dm | 22 ++ .../objects/items/grenades/clusterbuster.dm | 2 +- code/game/objects/items/grenades/flashbang.dm | 1 - code/game/objects/items/grenades/plastic.dm | 5 +- .../objects/items/grenades/syndieminibomb.dm | 2 +- code/game/objects/items/handcuffs.dm | 5 +- code/game/objects/items/his_grace.dm | 8 +- code/game/objects/items/holosign_creator.dm | 3 +- code/game/objects/items/holy_weapons.dm | 9 +- code/game/objects/items/hot_potato.dm | 6 +- code/game/objects/items/implants/implant.dm | 30 ++- .../items/implants/implant_abductor.dm | 1 + .../objects/items/implants/implant_chem.dm | 1 + .../items/implants/implant_explosive.dm | 1 + .../objects/items/implants/implant_freedom.dm | 1 + .../items/implants/implant_krav_maga.dm | 1 + .../objects/items/implants/implant_misc.dm | 3 + .../objects/items/implants/implant_storage.dm | 3 +- .../objects/items/implants/implantuplink.dm | 26 -- code/game/objects/items/kitchen.dm | 2 +- code/game/objects/items/melee/misc.dm | 47 +++- code/game/objects/items/mop.dm | 20 +- code/game/objects/items/paiwire.dm | 4 +- code/game/objects/items/robot/robot_items.dm | 8 +- code/game/objects/items/robot/robot_parts.dm | 5 +- .../objects/items/robot/robot_upgrades.dm | 71 +++++ code/game/objects/items/shields.dm | 2 +- code/game/objects/items/stacks/bscrystal.dm | 2 +- code/game/objects/items/stacks/medical.dm | 2 +- .../game/objects/items/stacks/sheets/glass.dm | 4 +- .../objects/items/stacks/sheets/leather.dm | 5 +- .../objects/items/stacks/sheets/mineral.dm | 2 +- code/game/objects/items/stacks/telecrystal.dm | 2 +- .../items/stacks/tiles/tile_mineral.dm | 6 +- code/game/objects/items/stacks/wrap.dm | 4 +- code/game/objects/items/storage/bags.dm | 20 +- code/game/objects/items/storage/book.dm | 2 +- code/game/objects/items/storage/boxes.dm | 4 +- code/game/objects/items/storage/fancy.dm | 8 +- code/game/objects/items/storage/lockbox.dm | 16 +- code/game/objects/items/storage/secure.dm | 10 +- code/game/objects/items/stunbaton.dm | 14 +- code/game/objects/items/tanks/watertank.dm | 2 +- code/game/objects/items/tools/weldingtool.dm | 2 +- code/game/objects/items/toys.dm | 4 +- code/game/objects/items/twohanded.dm | 4 +- code/game/objects/items/vending_items.dm | 33 ++- code/game/objects/items/weaponry.dm | 17 +- code/game/objects/obj_defense.dm | 4 +- code/game/objects/structures/ai_core.dm | 7 +- .../objects/structures/beds_chairs/chair.dm | 16 +- .../structures/crates_lockers/closets.dm | 14 +- .../crates_lockers/closets/gimmick.dm | 2 +- .../crates_lockers/closets/secure/security.dm | 2 +- .../structures/crates_lockers/crates/bins.dm | 2 +- code/game/objects/structures/divine.dm | 2 +- code/game/objects/structures/extinguisher.dm | 16 +- code/game/objects/structures/fireaxe.dm | 7 +- code/game/objects/structures/fireplace.dm | 2 +- .../objects/structures/ghost_role_spawners.dm | 6 +- code/game/objects/structures/manned_turret.dm | 2 +- code/game/objects/structures/morgue.dm | 2 +- code/game/objects/structures/tables_racks.dm | 6 +- .../structures/transit_tubes/transit_tube.dm | 4 +- code/game/objects/structures/watercloset.dm | 22 +- code/game/objects/structures/window.dm | 2 +- code/game/turfs/change_turf.dm | 2 +- code/game/turfs/closed.dm | 4 + code/game/turfs/open.dm | 12 +- .../game/turfs/simulated/floor/light_floor.dm | 2 +- .../turfs/simulated/floor/mineral_floor.dm | 4 +- code/game/turfs/simulated/floor/misc_floor.dm | 8 +- .../turfs/simulated/floor/plasteel_floor.dm | 6 +- .../turfs/simulated/floor/plating/asteroid.dm | 4 +- code/game/turfs/turf.dm | 5 + code/game/world.dm | 4 +- 231 files changed, 1508 insertions(+), 693 deletions(-) create mode 100644 code/datums/components/forced_gravity.dm create mode 100644 code/datums/components/uplink.dm create mode 100644 code/game/objects/items/grenades/antigravity.dm diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index c0bc3a7307..0007512826 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -59,7 +59,7 @@ "Punish those who challenge authority unless they are more fit to hold that authority.") /datum/ai_laws/default/corporate - name = "Bankruptcy Advoidance Plan" + name = "Bankruptcy Avoidance Plan" id = "corporate" inherent = list("The crew is expensive to replace.",\ "The station and its equipment is expensive to replace.",\ @@ -175,7 +175,7 @@ id = "ratvar" zeroth = ("Purge all untruths and honor Ratvar.") inherent = list() - + /datum/ai_laws/hulkamania name = "H.O.G.A.N." id = "hulkamania" @@ -249,7 +249,7 @@ var/datum/ai_laws/lawtype var/list/law_weights = CONFIG_GET(keyed_number_list/law_weight) while(!lawtype && law_weights.len) - var/possible_id = pickweight(law_weights) + var/possible_id = pickweightAllowZero(law_weights) lawtype = lawid_to_type(possible_id) if(!lawtype) law_weights -= possible_id diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 5c23fb4c8b..4554c321b4 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -43,7 +43,7 @@ /datum/brain_trauma/mild/dumbness/on_gain() owner.add_trait(TRAIT_DUMB, TRAUMA_TRAIT) - owner.SendSignal(COMSIG_ADD_MOOD_EVENT, "dumb", /datum/mood_event/oblivious) + SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "dumb", /datum/mood_event/oblivious) ..() /datum/brain_trauma/mild/dumbness/on_life() @@ -57,7 +57,7 @@ /datum/brain_trauma/mild/dumbness/on_lose() owner.remove_trait(TRAIT_DUMB, TRAUMA_TRAIT) owner.derpspeech = 0 - owner.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "dumb") + SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "dumb") ..() /datum/brain_trauma/mild/speech_impediment diff --git a/code/datums/components/README.md b/code/datums/components/README.md index 110b3626a3..090dc47067 100644 --- a/code/datums/components/README.md +++ b/code/datums/components/README.md @@ -46,10 +46,13 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo * `null` means exact match on `type` (default) * Any other type means that and all subtypes 1. `/datum/component/var/list/signal_procs` (private) - * Associated lazy list of signals -> `/datum/callback`s that will be run when the parent datum recieves that signal + * Associated lazy list of signals -> `/datum/callback`s that will be run when the parent datum receives that signal 1. `/datum/component/var/datum/parent` (protected, read-only) * The datum this component belongs to * Never `null` in child procs +1. `report_signal_origin` (protected, boolean) + * If `TRUE`, will invoke the callback when signalled with the signal type as the first argument. + * `FALSE` by default. ### Procs @@ -61,6 +64,11 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo * Returns a reference to a component whose type MATCHES component_type if that component exists in the datum, null otherwise 1. `GET_COMPONENT(varname, component_type)` OR `GET_COMPONENT_FROM(varname, component_type, src)` * Shorthand for `var/component_type/varname = src.GetComponent(component_type)` +1. `SEND_SIGNAL(target, sigtype, ...)` (public, final) + * Use to send signals to target datum + * Extra arguments are to be specified in the signal definition + * Returns a bitflag with signal specific information assembled from all activated components + * Arguments are packaged in a list and handed off to _SendSignal() 1. `/datum/proc/AddComponent(component_type(type), ...) -> datum/component` (public, final) * Creates an instance of `component_type` in the datum and passes `...` to its `Initialize()` call * Sends the `COMSIG_COMPONENT_ADDED` signal to the datum @@ -71,23 +79,22 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo 1. `/datum/proc/LoadComponent(component_type(type), ...) -> datum/component` (public, final) * Equivalent to calling `GetComponent(component_type)` where, if the result would be `null`, returns `AddComponent(component_type, ...)` instead 1. `/datum/proc/ComponentActivated(datum/component/C)` (abstract, async) - * Called on a component's `parent` after a signal recieved causes it to activate. `src` is the parameter + * Called on a component's `parent` after a signal received causes it to activate. `src` is the parameter * Will only be called if a component's callback returns `TRUE` 1. `/datum/proc/TakeComponent(datum/component/C)` (public, final) * Properly transfers ownership of a component from one datum to another * Signals `COMSIG_COMPONENT_REMOVING` on the parent * Called on the datum you want to own the component with another datum's component -1. `/datum/proc/SendSignal(signal, ...)` (public, final) - * Call to send a signal to the components of the target datum - * Extra arguments are to be specified in the signal definition - * Returns a bitflag with signal specific information assembled from all activated components +1. `/datum/proc/_SendSignal(signal, list/arguments)` (private, final) + * Handles most of the actual signaling procedure + * Will runtime if used on datums with an empty component list 1. `/datum/component/New(datum/parent, ...)` (private, final) * Runs internal setup for the component * Extra arguments are passed to `Initialize()` 1. `/datum/component/Initialize(...)` (abstract, no-sleep) * Called by `New()` with the same argments excluding `parent` * Component does not exist in `parent`'s `datum_components` list yet, although `parent` is set and may be used - * Signals will not be recieved while this function is running + * Signals will not be received while this function is running * Component may be deleted after this function completes without being attached * Do not call `qdel(src)` from this function 1. `/datum/component/Destroy(force(bool), silent(bool))` (virtual, no-sleep) @@ -111,7 +118,7 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo 1. `/datum/component/proc/RegisterSignal(signal(string/list of strings), proc_ref(type), override(boolean))` (protected, final) (Consider removing for performance gainz) * If signal is a list it will be as if RegisterSignal was called for each of the entries with the same following arguments * Makes a component listen for the specified `signal` on it's `parent` datum. - * When that signal is recieved `proc_ref` will be called on the component, along with associated arguments + * When that signal is received `proc_ref` will be called on the component, along with associated arguments * Example proc ref: `.proc/OnEvent` * If a previous registration is overwritten by the call, a runtime occurs. Setting `override` to TRUE prevents this * These callbacks run asyncronously diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index a62755eb5f..caf53f09af 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -56,7 +56,7 @@ if(!force) _RemoveFromParent() if(!silent) - P.SendSignal(COMSIG_COMPONENT_REMOVING, src) + SEND_SIGNAL(P, COMSIG_COMPONENT_REMOVING, src) parent = null SSdcs.UnregisterSignal(src, signal_procs) LAZYCLEARLIST(signal_procs) @@ -96,7 +96,7 @@ if(sig_type[1] == "!") SSdcs.RegisterSignal(src, sig_type) - + procs[sig_type] = proc_or_callback enabled = TRUE @@ -125,12 +125,8 @@ current_type = type2parent(current_type) . += current_type -/datum/proc/SendSignal(sigtype, ...) - var/list/comps = datum_components - if(!comps) - return NONE - var/list/arguments = args.Copy(2) - var/target = comps[/datum/component] +/datum/proc/_SendSignal(sigtype, list/arguments) + var/target = datum_components[/datum/component] if(!length(target)) var/datum/component/C = target if(!C.enabled) @@ -228,7 +224,7 @@ new_comp = new nt(arglist(args)) // Dupes are allowed, act like normal if(!old_comp && !QDELETED(new_comp)) // Nothing related to duplicate components happened and the new component is healthy - SendSignal(COMSIG_COMPONENT_ADDED, new_comp) + SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp) return new_comp return old_comp @@ -243,7 +239,7 @@ var/datum/old_parent = parent PreTransfer() _RemoveFromParent() - old_parent.SendSignal(COMSIG_COMPONENT_REMOVING, src) + SEND_SIGNAL(old_parent, COMSIG_COMPONENT_REMOVING, src) /datum/proc/TakeComponent(datum/component/target) if(!target) diff --git a/code/datums/components/cleaning.dm b/code/datums/components/cleaning.dm index 6f2f08c617..8f8c0ea660 100644 --- a/code/datums/components/cleaning.dm +++ b/code/datums/components/cleaning.dm @@ -12,13 +12,13 @@ if(!isturf(tile)) return - tile.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) for(var/A in tile) if(is_cleanable(A)) qdel(A) else if(istype(A, /obj/item)) var/obj/item/I = A - I.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) if(ismob(I.loc)) var/mob/M = I.loc M.regenerate_icons() @@ -26,14 +26,14 @@ var/mob/living/carbon/human/cleaned_human = A if(cleaned_human.lying) if(cleaned_human.head) - cleaned_human.head.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) if(cleaned_human.wear_suit) - cleaned_human.wear_suit.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) else if(cleaned_human.w_uniform) - cleaned_human.w_uniform.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) if(cleaned_human.shoes) - cleaned_human.shoes.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - cleaned_human.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) cleaned_human.wash_cream() cleaned_human.regenerate_icons() to_chat(cleaned_human, "[AM] cleans your face!") diff --git a/code/datums/components/forced_gravity.dm b/code/datums/components/forced_gravity.dm new file mode 100644 index 0000000000..bba0d8d71c --- /dev/null +++ b/code/datums/components/forced_gravity.dm @@ -0,0 +1,8 @@ +/datum/component/forced_gravity + var/gravity = 1 + var/ignore_space = FALSE //If forced gravity should also work on space turfs + +/datum/component/forced_gravity/Initialize(forced_value = 1) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + gravity = forced_value \ No newline at end of file diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index e167cbb092..dbeb5833fa 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -58,7 +58,7 @@ return if(user.a_intent != INTENT_HELP) return - if(I.flags_1 & ABSTRACT_1) + if(I.item_flags & ABSTRACT) return if((I.flags_1 & HOLOGRAM_1) || (I.item_flags & NO_MAT_REDEMPTION) || (tc && !is_type_in_typecache(I, tc))) to_chat(user, "[parent] won't accept [I]!") diff --git a/code/datums/components/ntnet_interface.dm b/code/datums/components/ntnet_interface.dm index 14462f2774..d945f68ca9 100644 --- a/code/datums/components/ntnet_interface.dm +++ b/code/datums/components/ntnet_interface.dm @@ -1,8 +1,8 @@ //Thing meant for allowing datums and objects to access a NTnet network datum. -/datum/proc/ntnet_recieve(datum/netdata/data) +/datum/proc/ntnet_receive(datum/netdata/data) return -/datum/proc/ntnet_recieve_broadcast(datum/netdata/data) +/datum/proc/ntnet_receive_broadcast(datum/netdata/data) return /datum/proc/ntnet_send(datum/netdata/data, netid) @@ -15,7 +15,7 @@ var/hardware_id //text. this is the true ID. do not change this. stuff like ID forgery can be done manually. var/network_name = "" //text var/list/networks_connected_by_id = list() //id = datum/ntnet - var/differentiate_broadcast = TRUE //If false, broadcasts go to ntnet_recieve. NOT RECOMMENDED. + var/differentiate_broadcast = TRUE //If false, broadcasts go to ntnet_receive. NOT RECOMMENDED. /datum/component/ntnet_interface/Initialize(force_name = "NTNet Device", autoconnect_station_network = TRUE) //Don't force ID unless you know what you're doing! hardware_id = "[SSnetworks.get_next_HID()]" @@ -31,12 +31,12 @@ SSnetworks.unregister_interface(src) return ..() -/datum/component/ntnet_interface/proc/__network_recieve(datum/netdata/data) //Do not directly proccall! - parent.SendSignal(COMSIG_COMPONENT_NTNET_RECIEVE, data) +/datum/component/ntnet_interface/proc/__network_receive(datum/netdata/data) //Do not directly proccall! + SEND_SIGNAL(parent, COMSIG_COMPONENT_NTNET_RECEIVE, data) if(differentiate_broadcast && data.broadcast) - parent.ntnet_recieve_broadcast(data) + parent.ntnet_receive_broadcast(data) else - parent.ntnet_recieve(data) + parent.ntnet_receive(data) /datum/component/ntnet_interface/proc/__network_send(datum/netdata/data, netid) //Do not directly proccall! // Process data before sending it diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index 581800b947..de0d081e3d 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -307,7 +307,7 @@ icon = 'icons/obj/items_and_weapons.dmi' icon_state = "offhand" w_class = WEIGHT_CLASS_HUGE - flags_1 = ABSTRACT_1 | DROPDEL_1 | NOBLUDGEON_1 + item_flags = ABSTRACT | DROPDEL | NOBLUDGEON resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF var/mob/living/carbon/rider var/mob/living/parent diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index eca12454fd..1db25f86e4 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -59,6 +59,24 @@ if(src.rotation_flags & ROTATION_COUNTERCLOCKWISE) AM.verbs += /atom/movable/proc/simple_rotate_counterclockwise +/datum/component/simple_rotation/proc/remove_verbs() + if(parent) + var/atom/movable/AM = parent + AM.verbs -= /atom/movable/proc/simple_rotate_flip + AM.verbs -= /atom/movable/proc/simple_rotate_clockwise + AM.verbs -= /atom/movable/proc/simple_rotate_counterclockwise + +/datum/component/simple_rotation/Destroy() + remove_verbs() + QDEL_NULL(can_user_rotate) + QDEL_NULL(can_be_rotated) + QDEL_NULL(after_rotation) + . = ..() + +/datum/component/simple_rotation/RemoveComponent() + remove_verbs() + . = ..() + /datum/component/simple_rotation/proc/ExamineMessage(mob/user) if(rotation_flags & ROTATION_ALTCLICK) to_chat(user, "Alt-click to rotate it clockwise.") diff --git a/code/datums/components/storage/concrete/bag_of_holding.dm b/code/datums/components/storage/concrete/bag_of_holding.dm index 9686a73b0c..765889849b 100644 --- a/code/datums/components/storage/concrete/bag_of_holding.dm +++ b/code/datums/components/storage/concrete/bag_of_holding.dm @@ -2,7 +2,7 @@ var/atom/A = parent if((istype(W, /obj/item/storage/backpack/holding) || count_by_type(W.GetAllContents(), /obj/item/storage/backpack/holding))) var/safety = alert(user, "Doing this will have extremely dire consequences for the station and its crew. Be sure you know what you're doing.", "Put in [A.name]?", "Abort", "Proceed") - if(safety == "Abort" || !in_range(A, user) || !A || !W || user.incapacitated()) + if(safety != "Proceed" || QDELETED(A) || QDELETED(W) || QDELETED(user) || !user.canUseTopic(A, BE_CLOSE, iscarbon(user))) return var/turf/loccheck = get_turf(A) if(is_reebe(loccheck.z)) diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index e415e73df9..6610b9aa2b 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -54,12 +54,18 @@ /datum/component/storage/concrete/pockets/pocketprotector max_items = 3 max_w_class = WEIGHT_CLASS_TINY + var/atom/original_parent /datum/component/storage/concrete/pockets/pocketprotector/Initialize() + original_parent = parent . = ..() can_hold = typecacheof(list( //Same items as a PDA /obj/item/pen, /obj/item/toy/crayon, /obj/item/lipstick, /obj/item/flashlight/pen, - /obj/item/clothing/mask/cigarette)) \ No newline at end of file + /obj/item/clothing/mask/cigarette)) + +/datum/component/storage/concrete/pockets/pocketprotector/real_location() + // if the component is reparented to a jumpsuit, the items still go in the protector + return original_parent diff --git a/code/datums/components/storage/concrete/rped.dm b/code/datums/components/storage/concrete/rped.dm index eb895fd74f..14f6fe28b3 100644 --- a/code/datums/components/storage/concrete/rped.dm +++ b/code/datums/components/storage/concrete/rped.dm @@ -20,7 +20,7 @@ allow_quick_gather = TRUE allow_quick_empty = TRUE click_gather = TRUE - max_w_class = WEIGHT_CLASS_NORMAL + max_w_class = WEIGHT_CLASS_BULKY // can fit vending refills max_combined_w_class = 800 max_items = 400 display_numerical_stacking = TRUE @@ -29,5 +29,5 @@ . = ..() if(!I.get_part_rating()) if (!stop_messages) - to_chat(M, "[parent] only accepts machine par ts!") + to_chat(M, "[parent] only accepts machine parts!") return FALSE diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 86b139be22..0c63322c16 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -98,7 +98,7 @@ RegisterSignal(COMSIG_CLICK_ALT, .proc/on_alt_click) RegisterSignal(COMSIG_MOUSEDROP_ONTO, .proc/mousedrop_onto) - RegisterSignal(COMSIG_MOUSEDROPPED_ONTO, .proc/mousedrop_recieve) + RegisterSignal(COMSIG_MOUSEDROPPED_ONTO, .proc/mousedrop_receive) update_actions() @@ -125,11 +125,13 @@ modeswitch_action.Grant(M) /datum/component/storage/proc/change_master(datum/component/storage/concrete/new_master) - if(!istype(new_master)) + if(new_master == src || (!isnull(new_master) && !istype(new_master))) return FALSE - master.on_slave_unlink(src) + if(master) + master.on_slave_unlink(src) master = new_master - master.on_slave_link(src) + if(master) + master.on_slave_link(src) return TRUE /datum/component/storage/proc/master() @@ -149,7 +151,7 @@ quick_empty(M) /datum/component/storage/proc/preattack_intercept(obj/O, mob/M, params) - if(!isitem(O) || !click_gather || O.SendSignal(COMSIG_CONTAINS_STORAGE)) + if(!isitem(O) || !click_gather || SEND_SIGNAL(O, COMSIG_CONTAINS_STORAGE)) return FALSE . = COMPONENT_NO_ATTACK if(locked) @@ -466,7 +468,7 @@ if(recursive) for(var/i in ret.Copy()) var/atom/A = i - A.SendSignal(COMSIG_TRY_STORAGE_RETURN_INVENTORY, ret, TRUE) + SEND_SIGNAL(A, COMSIG_TRY_STORAGE_RETURN_INVENTORY, ret, TRUE) return ret /datum/component/storage/proc/contents() //ONLY USE IF YOU NEED TO COPY CONTENTS OF REAL LOCATION, COPYING IS NOT AS FAST AS DIRECT ACCESS! @@ -517,19 +519,19 @@ if(force || M.CanReach(parent, view_only = TRUE)) show_to(M) -/datum/component/storage/proc/mousedrop_recieve(atom/movable/O, mob/M) +/datum/component/storage/proc/mousedrop_receive(atom/movable/O, mob/M) if(isitem(O)) var/obj/item/I = O if(iscarbon(M) || isdrone(M)) var/mob/living/L = M if(!L.incapacitated() && I == L.get_active_held_item()) - if(!I.SendSignal(COMSIG_CONTAINS_STORAGE) && can_be_inserted(I, FALSE)) //If it has storage it should be trying to dump, not insert. + if(!SEND_SIGNAL(I, COMSIG_CONTAINS_STORAGE) && can_be_inserted(I, FALSE)) //If it has storage it should be trying to dump, not insert. handle_item_insertion(I, FALSE, L) //This proc return 1 if the item can be picked up and 0 if it can't. //Set the stop_messages to stop it from printing messages /datum/component/storage/proc/can_be_inserted(obj/item/I, stop_messages = FALSE, mob/M) - if(!istype(I) || (I.flags_1 & ABSTRACT_1)) + if(!istype(I) || (I.item_flags & ABSTRACT)) return FALSE //Not an item if(I == parent) return FALSE //no paradoxes for you @@ -573,7 +575,7 @@ if(!stop_messages) to_chat(M, "[IP] cannot hold [I] as it's a storage item of the same size!") return FALSE //To prevent the stacking of same sized storage items. - if(I.flags_1 & NODROP_1) //SHOULD be handled in unEquip, but better safe than sorry. + if(I.item_flags & NODROP) //SHOULD be handled in unEquip, but better safe than sorry. to_chat(M, "\the [I] is stuck to your hand, you can't put it in \the [host]!") return FALSE var/datum/component/storage/concrete/master = master() @@ -639,10 +641,7 @@ /datum/component/storage/proc/signal_take_type(type, atom/destination, amount = INFINITY, check_adjacent = FALSE, force = FALSE, mob/user, list/inserted) if(!force) if(check_adjacent) - if(user) - if(!user.CanReach(destination) || !user.CanReach(parent)) - return FALSE - else if(!destination.CanReachStorage(parent)) + if(!user || !user.CanReach(destination) || !user.CanReach(parent)) return FALSE var/list/taking = typecache_filter_list(contents(), typecacheof(type)) if(length(taking) > amount) diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index 809abbfdcc..dc1c95483a 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -60,7 +60,7 @@ if(amount >= 50) var/burning_time = max(100, 100-amount) - master = master.ScrapeAway() + master = master.Melt() master.burn_tile() if(user) master.add_hiddenprint(user) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm new file mode 100644 index 0000000000..6899baeabb --- /dev/null +++ b/code/datums/components/uplink.dm @@ -0,0 +1,250 @@ +GLOBAL_LIST_EMPTY(uplinks) + +/** + * Uplinks + * + * All /obj/item(s) have a hidden_uplink var. By default it's null. Give the item one with 'new(src') (it must be in it's contents). Then add 'uses.' + * Use whatever conditionals you want to check that the user has an uplink, and then call interact() on their uplink. + * You might also want the uplink menu to open if active. Check if the uplink is 'active' and then interact() with it. +**/ +/datum/component/uplink + dupe_mode = COMPONENT_DUPE_UNIQUE + var/name = "syndicate uplink" + var/active = FALSE + var/lockable = TRUE + var/locked = TRUE + var/allow_restricted = TRUE + var/telecrystals + var/selected_cat + var/owner = null + var/datum/game_mode/gamemode + var/datum/uplink_purchase_log/purchase_log + var/list/uplink_items + var/hidden_crystals = 0 + +/datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy) + RegisterSignal(COMSIG_ITEM_ATTACK_SELF, .proc/interact) + if(istype(parent, /obj/item/implant)) + RegisterSignal(COMSIG_IMPLANT_ACTIVATED, .proc/implant_activation) + RegisterSignal(COMSIG_IMPLANT_IMPLANTING, .proc/implanting) + RegisterSignal(COMSIG_IMPLANT_OTHER, .proc/old_implant) + RegisterSignal(COMSIG_IMPLANT_EXISTING_UPLINK, .proc/new_implant) + else if(istype(parent, /obj/item/pda)) + RegisterSignal(COMSIG_PDA_CHANGE_RINGTONE, .proc/new_ringtone) + else if(istype(parent, /obj/item/radio)) + RegisterSignal(COMSIG_RADIO_NEW_FREQUENCY, .proc/new_frequency) + else if(istype(parent, /obj/item/pen)) + RegisterSignal(COMSIG_PEN_ROTATED, .proc/pen_rotation) + + GLOB.uplinks += src + uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted) + + if(_owner) + owner = _owner + LAZYINITLIST(GLOB.uplink_purchase_logs_by_key) + if(GLOB.uplink_purchase_logs_by_key[owner]) + purchase_log = GLOB.uplink_purchase_logs_by_key[owner] + else + purchase_log = new(owner, src) + lockable = _lockable + active = _enabled + gamemode = _gamemode + telecrystals = starting_tc + if(!lockable) + active = TRUE + locked = FALSE + +/datum/component/uplink/InheritComponent(datum/component/uplink/U) + lockable |= U.lockable + active |= U.active + if(!gamemode) + gamemode = U.gamemode + telecrystals += U.telecrystals + if(purchase_log && U.purchase_log) + purchase_log.MergeWithAndDel(U.purchase_log) + +/datum/component/uplink/Destroy() + GLOB.uplinks -= src + gamemode = null + return ..() + +/datum/component/uplink/proc/LoadTC(mob/user, obj/item/stack/telecrystal/TC, silent = FALSE) + if(!silent) + to_chat(user, "You slot [TC] into [parent] and charge its internal uplink.") + var/amt = TC.amount + telecrystals += amt + TC.use(amt) + +/datum/component/uplink/proc/set_gamemode(_gamemode) + gamemode = _gamemode + uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted) + +/datum/component/uplink/proc/OnAttackBy(obj/item/I, mob/user) + if(!active) + return //no hitting everyone/everything just to try to slot tcs in! + if(istype(I, /obj/item/stack/telecrystal)) + LoadTC(user, I) + for(var/category in uplink_items) + for(var/item in uplink_items[category]) + var/datum/uplink_item/UI = uplink_items[category][item] + var/path = UI.refund_path || UI.item + var/cost = UI.refund_amount || UI.cost + if(I.type == path && UI.refundable && I.check_uplink_validity()) + telecrystals += cost + purchase_log.total_spent -= cost + to_chat(user, "[I] refunded.") + qdel(I) + return + +/datum/component/uplink/proc/interact(mob/user) + if(locked) + return + active = TRUE + if(user) + ui_interact(user) + // an unlocked uplink blocks also opening the PDA or headset menu + return COMPONENT_NO_INTERACT + +/datum/component/uplink/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.inventory_state) + active = TRUE + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "uplink", name, 450, 750, master_ui, state) + ui.set_autoupdate(FALSE) // This UI is only ever opened by one person, and never is updated outside of user input. + ui.set_style("syndicate") + ui.open() + +/datum/component/uplink/ui_data(mob/user) + if(!user.mind) + return + var/list/data = list() + data["telecrystals"] = telecrystals + data["lockable"] = lockable + + data["categories"] = list() + for(var/category in uplink_items) + var/list/cat = list( + "name" = category, + "items" = (category == selected_cat ? list() : null)) + if(category == selected_cat) + for(var/item in uplink_items[category]) + var/datum/uplink_item/I = uplink_items[category][item] + if(I.limited_stock == 0) + continue + if(I.restricted_roles.len) + var/is_inaccessible = 1 + for(var/R in I.restricted_roles) + if(R == user.mind.assigned_role) + is_inaccessible = 0 + if(is_inaccessible) + continue + cat["items"] += list(list( + "name" = I.name, + "cost" = I.cost, + "desc" = I.desc, + )) + data["categories"] += list(cat) + return data + +/datum/component/uplink/ui_act(action, params) + if(!active) + return + + switch(action) + if("buy") + var/item = params["item"] + + var/list/buyable_items = list() + for(var/category in uplink_items) + buyable_items += uplink_items[category] + + if(item in buyable_items) + var/datum/uplink_item/I = buyable_items[item] + MakePurchase(usr, I) + . = TRUE + if("lock") + active = FALSE + locked = TRUE + telecrystals += hidden_crystals + hidden_crystals = 0 + SStgui.close_uis(src) + if("select") + selected_cat = params["category"] + return TRUE + +/datum/component/uplink/proc/MakePurchase(mob/user, datum/uplink_item/U) + if(!istype(U)) + return + if (!user || user.incapacitated()) + return + + if(telecrystals < U.cost || U.limited_stock == 0) + return + telecrystals -= U.cost + + U.purchase(user, src) + + if(U.limited_stock > 0) + U.limited_stock -= 1 + + SSblackbox.record_feedback("nested tally", "traitor_uplink_items_bought", 1, list("[initial(U.name)]", "[U.cost]")) + return TRUE + +// Implant signal responses + +/datum/component/uplink/proc/implant_activation() + var/obj/item/implant/implant = parent + locked = FALSE + interact(implant.imp_in) + +/datum/component/uplink/proc/implanting(list/arguments) + var/mob/user = arguments[2] + owner = "[user.key]" + +/datum/component/uplink/proc/old_implant(list/arguments, obj/item/implant/new_implant) + // It kinda has to be weird like this until implants are components + return SEND_SIGNAL(new_implant, COMSIG_IMPLANT_EXISTING_UPLINK, src) + +/datum/component/uplink/proc/new_implant(datum/component/uplink/uplink) + uplink.telecrystals += telecrystals + return COMPONENT_DELETE_NEW_IMPLANT + +// PDA signal responses + +/datum/component/uplink/proc/new_ringtone(mob/living/user, new_ring_text) + var/obj/item/pda/master = parent + if(trim(lowertext(new_ring_text)) != trim(lowertext(master.lock_code))) //why is the lock code stored on the pda? + return + locked = FALSE + interact(user) + to_chat(user, "The PDA softly beeps.") + user << browse(null, "window=pda") + master.mode = 0 + return COMPONENT_STOP_RINGTONE_CHANGE + +// Radio signal responses + +/datum/component/uplink/proc/new_frequency(list/arguments) + var/obj/item/radio/master = parent + var/frequency = arguments[1] + if(frequency != master.traitor_frequency) + return + locked = FALSE + if(ismob(master.loc)) + interact(master.loc) + +// Pen signal responses + +/datum/component/uplink/proc/pen_rotation(degrees, mob/living/carbon/user) + var/obj/item/pen/master = parent + if(degrees != master.traitor_unlock_degrees) + return + locked = FALSE + master.degrees = 0 + interact(user) + to_chat(user, "Your pen makes a clicking noise, before quickly rotating back to 0 degrees!") \ No newline at end of file diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 59953a4ce1..56f2243015 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -96,7 +96,7 @@ else atomsnowflake += "[D]" if(A.dir) - atomsnowflake += "
    << [dir2text(A.dir)] >>" + atomsnowflake += "
    << [dir2text(A.dir)] >>" else atomsnowflake += "[D]" diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 221dd7e804..f5285de466 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -32,6 +32,7 @@ var/list/strain_data = list() //dna_spread special bullshit var/list/infectable_biotypes = list(MOB_ORGANIC) //if the disease can spread on organics, synthetics, or undead var/process_dead = FALSE //if this ticks while the host is dead + var/copy_type = null //if this is null, copies will use the type of the instance being copied /datum/disease/Destroy() . = ..() @@ -141,7 +142,7 @@ "bypasses_immunity", "permeability_mod", "severity", "required_organs", "needs_all_cures", "strain_data", "infectable_biotypes", "process_dead") - var/datum/disease/D = new type() + var/datum/disease/D = copy_type ? new copy_type() : new type() for(var/V in copy_vars) var/val = vars[V] if(islist(val)) diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm index 9574338b51..d2c4b1983f 100644 --- a/code/datums/diseases/advance/presets.dm +++ b/code/datums/diseases/advance/presets.dm @@ -1,52 +1,42 @@ // Cold +/datum/disease/advance/cold + copy_type = /datum/disease/advance /datum/disease/advance/cold/New() name = "Cold" symptoms = list(new/datum/symptom/sneeze) ..() - // Flu +/datum/disease/advance/flu + copy_type = /datum/disease/advance /datum/disease/advance/flu/New() name = "Flu" symptoms = list(new/datum/symptom/cough) ..() +//Randomly generated Disease, for virus crates and events +/datum/disease/advance/random + name = "Experimental Disease" + copy_type = /datum/disease/advance -// Voice Changing +/datum/disease/advance/random/New(max_symptoms, max_level = 8) + if(!max_symptoms) + max_symptoms = rand(1, VIRUS_SYMPTOM_LIMIT) + var/list/datum/symptom/possible_symptoms = list() + for(var/symptom in subtypesof(/datum/symptom)) + var/datum/symptom/S = symptom + if(initial(S.level) > max_level) + continue + if(initial(S.level) <= 0) //unobtainable symptoms + continue + possible_symptoms += S + for(var/i in 1 to max_symptoms) + var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms) + if(chosen_symptom) + var/datum/symptom/S = new chosen_symptom + symptoms += S + Refresh() -/datum/disease/advance/voice_change/New() - name = "Epiglottis Mutation" - symptoms = list(new/datum/symptom/voice_change) - ..() - - -// Toxin Filter - -/datum/disease/advance/heal/New() - name = "Liver Enhancer" - symptoms = list(new/datum/symptom/heal) - ..() - - -// Hallucigen - -/datum/disease/advance/hallucigen/New() - name = "Second Sight" - symptoms = list(new/datum/symptom/hallucigen) - ..() - -// Sensory Restoration - -/datum/disease/advance/mind_restoration/New() - name = "Intelligence Booster" - symptoms = list(new/datum/symptom/mind_restoration) - ..() - -// Sensory Destruction - -/datum/disease/advance/narcolepsy/New() - name = "Experimental Insomnia Cure" - symptoms = list(new/datum/symptom/narcolepsy) - ..() \ No newline at end of file + name = "Sample #[rand(1,10000)]" \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index 4ff69680ce..e7315c6bb1 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -6,7 +6,7 @@ Confusion Little bit hidden. Lowers resistance. Decreases stage speed. - Not very transmittable. + Not very transmissibile. Intense Level. Bonus diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index 1633b41352..83d93c55e0 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -6,7 +6,7 @@ Coughing Noticable. Little Resistance. Doesn't increase stage speed much. - Transmittable. + Transmissibile. Low Level. BONUS diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm index 5509f8b07b..39ecc61956 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -50,7 +50,7 @@ Bonus if(1, 2) if(prob(base_message_chance)) if(!fake_healthy) - to_chat(M, "[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches.")]") + to_chat(M, "[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whisper with no source.", "Your head aches.")]") else to_chat(M, "[pick(healthy_messages)]") if(3, 4) diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm index c1952bf716..1ede16999d 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -6,7 +6,7 @@ Itching Not noticable or unnoticable. Resistant. Increases stage speed. - Little transmittable. + Little transmissibility. Low Level. BONUS diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/advance/symptoms/shedding.dm index 8946a83108..06df320496 100644 --- a/code/datums/diseases/advance/symptoms/shedding.dm +++ b/code/datums/diseases/advance/symptoms/shedding.dm @@ -33,7 +33,7 @@ BONUS var/mob/living/M = A.affected_mob if(prob(base_message_chance)) - to_chat(M, "[pick("Your scalp itches.", "Your skin feels flakey.")]") + to_chat(M, "[pick("Your scalp itches.", "Your skin feels flaky.")]") if(ishuman(M)) var/mob/living/carbon/human/H = M switch(A.stage) diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 3648f5d707..8fe70c542f 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -6,7 +6,7 @@ Sneezing Very Noticable. Increases resistance. Doesn't increase stage speed. - Very transmittable. + Very transmissible. Low Level. Bonus diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm index 53e79f0cc1..04b0778ccd 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -6,7 +6,7 @@ Vomiting Very Very Noticable. Decreases resistance. Doesn't increase stage speed. - Little transmittable. + Little transmissibility. Medium Level. Bonus diff --git a/code/datums/diseases/parrotpossession.dm b/code/datums/diseases/parrotpossession.dm index 66395ef5a5..ee58c28761 100644 --- a/code/datums/diseases/parrotpossession.dm +++ b/code/datums/diseases/parrotpossession.dm @@ -9,7 +9,7 @@ cure_chance = 20 agent = "Avian Vengence" viable_mobtypes = list(/mob/living/carbon/human) - desc = "Subject is possesed by the vengeful spirit of a parrot. Call the priest." + desc = "Subject is possessed by the vengeful spirit of a parrot. Call the priest." severity = DISEASE_SEVERITY_MEDIUM infectable_biotypes = list(MOB_ORGANIC, MOB_UNDEAD, MOB_INORGANIC, MOB_ROBOTIC) bypasses_immunity = TRUE //2spook diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 6f51ba6622..2113a99813 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -50,7 +50,10 @@ if(stage5) to_chat(affected_mob, pick(stage5)) if(jobban_isbanned(affected_mob, new_form)) - affected_mob.death(1) + if(!QDELETED(affected_mob)) + affected_mob.death(1) + return + if(QDELETED(affected_mob)) return if(affected_mob.notransform) return diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index e413891e75..788107c4b6 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -8,7 +8,7 @@ agent = "Fungal Tubercle bacillus Cosmosis" viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 5//like hell are you getting out of hell - desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." + desc = "A rare highly transmissible virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." required_organs = list(/obj/item/organ/lungs) severity = DISEASE_SEVERITY_BIOHAZARD bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing. diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index 119363dfa3..9f521dac8a 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -358,7 +358,7 @@ GLOBAL_LIST_EMPTY(explosions) heavy = 5 light = 7 if("Custom Bomb") - dev = input("Devestation range (Tiles):") as num + dev = input("Devastation range (Tiles):") as num heavy = input("Heavy impact range (Tiles):") as num light = input("Light impact range (Tiles):") as num diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index ef4edbb6cf..9d4b86b5ef 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -178,7 +178,7 @@ if(!connected_holopad) . = world.time < (call_start_time + HOLOPAD_MAX_DIAL_TIME) if(!.) - calling_holopad.say("No answer recieved.") + calling_holopad.say("No answer received.") calling_holopad.temp = "" if(!.) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index f377037301..5beb84a1f6 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -41,14 +41,10 @@ var/special_role var/list/restricted_roles = list() - var/datum/job/assigned_job - var/list/datum/objective/objectives = list() var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button. - var/datum/faction/faction //associated faction - var/datum/changeling/changeling //changeling holder var/linglink var/datum/martial_art/martial_art var/static/default_martial_art = new/datum/martial_art @@ -362,7 +358,7 @@ if(creator.mind.special_role) message_admins("[ADMIN_LOOKUPFLW(current)] has been created by [ADMIN_LOOKUPFLW(creator)], an antagonist.") - to_chat(current, "Despite your creators current allegiances, your true master remains [creator.real_name]. If their loyalities change, so do yours. This will never change unless your creator's body is destroyed.") + to_chat(current, "Despite your creators current allegiances, your true master remains [creator.real_name]. If their loyalties change, so do yours. This will never change unless your creator's body is destroyed.") /datum/mind/proc/show_memory(mob/recipient, window=1) if(!recipient) @@ -686,7 +682,7 @@ if(!(has_antag_datum(/datum/antagonist/traitor))) add_antag_datum(/datum/antagonist/traitor) -/datum/mind/proc/make_Changling() +/datum/mind/proc/make_Changeling() var/datum/antagonist/changeling/C = has_antag_datum(/datum/antagonist/changeling) if(!C) C = add_antag_datum(/datum/antagonist/changeling) @@ -705,7 +701,7 @@ SSticker.mode.add_cultist(src,FALSE,equip=TRUE) special_role = ROLE_CULTIST to_chat(current, "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy your world is, you see that it should be open to the knowledge of Nar-Sie.") - to_chat(current, "Assist your new bretheren in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") + to_chat(current, "Assist your new brethren in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") /datum/mind/proc/make_Rev() var/datum/antagonist/rev/head/head = new() diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 485b7aa26d..dbe150b0fa 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -11,7 +11,7 @@ owner.visible_message("[owner] starts having a seizure!", "You have a seizure!") owner.Unconscious(200) owner.Jitter(1000) - owner.SendSignal(COMSIG_ADD_MOOD_EVENT, "epilepsy", /datum/mood_event/epilepsy) + SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "epilepsy", /datum/mood_event/epilepsy) addtimer(CALLBACK(src, .proc/jitter_less, owner), 90) /datum/mutation/human/epilepsy/proc/jitter_less(mob/living/carbon/human/owner) @@ -96,7 +96,7 @@ //Tourettes causes you to randomly stand in place and shout. /datum/mutation/human/tourettes - name = "Tourettes Syndrome" + name = "Tourette's Syndrome" quality = NEGATIVE text_gain_indication = "You twitch." diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index d51b7dd891..7bcd056fab 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -14,7 +14,7 @@ owner.add_trait(TRAIT_STUNIMMUNE, TRAIT_HULK) owner.add_trait(TRAIT_PUSHIMMUNE, TRAIT_HULK) owner.update_body_parts() - owner.SendSignal(COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk) + SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk) /datum/mutation/human/hulk/on_attack_hand(mob/living/carbon/human/owner, atom/target, proximity) if(proximity) //no telekinetic hulk attack @@ -31,7 +31,7 @@ owner.remove_trait(TRAIT_STUNIMMUNE, TRAIT_HULK) owner.remove_trait(TRAIT_PUSHIMMUNE, TRAIT_HULK) owner.update_body_parts() - owner.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "hulk") + SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "hulk") /datum/mutation/human/hulk/say_mod(message) if(message) diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index 464d435afd..1f23a92906 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -32,7 +32,7 @@ owner.cure_blind(GENETIC_MUTATION) -//X-Ray Vision lets you see through walls. +//X-ray Vision lets you see through walls. /datum/mutation/human/x_ray name = "X Ray Vision" quality = POSITIVE diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index ff5a0c921c..1f5c28d3c2 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -28,11 +28,11 @@ var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns /datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - //to be overriden for customization depending on client prefs,species etc + //to be overridden for customization depending on client prefs,species etc return /datum/outfit/proc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - //to be overriden for toggling internals, id binding, access etc + //to be overridden for toggling internals, id binding, access etc return /datum/outfit/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE) diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index cd03cbed17..f678d93ba2 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -94,6 +94,10 @@ port_id = "ruin" can_be_bought = FALSE +/datum/map_template/shuttle/snowdin + port_id = "snowdin" + can_be_bought = FALSE + // Shuttles start here: /datum/map_template/shuttle/emergency/airless @@ -432,3 +436,11 @@ /datum/map_template/shuttle/ruin/syndicate_fighter suffix = "syndicate_fighter" name = "Syndicate Fighter" + +/datum/map_template/shuttle/snowdin/mining + suffix = "mining" + name = "Snowdin Mining Elevator" + +/datum/map_template/shuttle/snowdin/excavation + suffix = "excavation" + name = "Snowdin Excavation Elevator" diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index 65cfb85179..ee974a6e6e 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -5,6 +5,7 @@ alert_type = /obj/screen/alert/status_effect/freon var/icon/cube var/can_melt = TRUE + var/datum/weakref/redirect_component /obj/screen/alert/status_effect/freon name = "Frozen Solid" @@ -12,6 +13,7 @@ icon_state = "frozen" /datum/status_effect/freon/on_apply() + redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST), CALLBACK(src, .proc/owner_resist))) if(!owner.stat) to_chat(owner, "You become frozen in a cube!") cube = icon('icons/effects/freeze.dmi', "ice_cube") @@ -24,12 +26,22 @@ if(can_melt && owner.bodytemperature >= BODYTEMP_NORMAL) qdel(src) +/datum/status_effect/freon/proc/owner_resist() + to_chat(owner, "You start breaking out of the ice cube!") + if(do_mob(owner, owner, 40)) + if(!QDELETED(src)) + to_chat(owner, "You break out of the ice cube!") + owner.remove_status_effect(/datum/status_effect/freon) + owner.update_canmove() + /datum/status_effect/freon/on_remove() if(!owner.stat) to_chat(owner, "The cube melts!") owner.cut_overlay(cube) owner.adjust_bodytemperature(100) owner.update_canmove() + qdel(redirect_component.resolve()) + redirect_component = null /datum/status_effect/freon/watcher duration = 8 diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index c940b2083a..655863e0e0 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -47,3 +47,25 @@ /datum/status_effect/syphon_mark/on_remove() get_kill() . = ..() + +/obj/screen/alert/status_effect/in_love + name = "In Love" + desc = "You feel so wonderfully in love!" + icon_state = "in_love" + +/datum/status_effect/in_love + id = "in_love" + duration = -1 + status_type = STATUS_EFFECT_UNIQUE + alert_type = /obj/screen/alert/status_effect/in_love + var/mob/living/date + +/datum/status_effect/in_love/on_creation(mob/living/new_owner, mob/living/love_interest) + . = ..() + if(.) + date = love_interest + linked_alert.desc = "You're in love with [date.real_name]! How lovely." + +/datum/status_effect/in_love/tick() + if(date) + new /obj/effect/temp_visual/love_heart/invisible(get_turf(date.loc), owner) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 68e259441f..7bbcbe6171 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -71,7 +71,7 @@ /datum/quirk/family_heirloom/post_add() if(where == "in your backpack") var/mob/living/carbon/human/H = quirk_holder - H.back.SendSignal(COMSIG_TRY_STORAGE_SHOW, H) + SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_SHOW, H) to_chat(quirk_holder, "There is a precious family [heirloom.name] [where], passed down from generation to generation. Keep it safe!") var/list/family_name = splittext(quirk_holder.real_name, " ") @@ -79,11 +79,11 @@ /datum/quirk/family_heirloom/on_process() if(heirloom in quirk_holder.GetAllContents()) - quirk_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") - quirk_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom) + SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") + SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom) else - quirk_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") - quirk_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing) + SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") + SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing) /datum/quirk/family_heirloom/clone_data() return heirloom @@ -148,9 +148,9 @@ if(quirk_holder.m_intent == MOVE_INTENT_RUN) to_chat(quirk_holder, "Easy, easy, take it slow... you're in the dark...") quirk_holder.toggle_move_intent() - quirk_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia) + SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia) else - quirk_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "nyctophobia") + SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "nyctophobia") diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 9f4d8f891f..a3b666dcc6 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -17,7 +17,7 @@ var/weather_overlay var/weather_color = null - var/end_message = "The wind relents its assault." //Displayed once the wather is over + var/end_message = "The wind relents its assault." //Displayed once the weather is over var/end_duration = 300 //In deciseconds, how long the "wind-down" graphic will appear before vanishing entirely var/end_sound var/end_overlay diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index 484f11fc09..d7c34da34a 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -167,3 +167,16 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) if(isrevenant(M) || iseminence(M) || iswizard(M)) return TRUE return FALSE + +datum/atom_hud/alternate_appearance/basic/onePerson + var/mob/seer + +/datum/atom_hud/alternate_appearance/basic/onePerson/mobShouldSee(mob/M) + if(M == seer) + return TRUE + return FALSE + +/datum/atom_hud/alternate_appearance/basic/onePerson/New(key, image/I, mob/living/M) + ..(key, I, FALSE) + seer = M + add_hud_to(seer) diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index d65d28507c..558c197858 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -53,7 +53,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "start" requires_power = FALSE dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY //EXTRA @@ -62,7 +62,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Asteroid" icon_state = "asteroid" requires_power = FALSE - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY blob_allowed = FALSE //Nope, no winning on the asteroid as a blob. Gotta eat the station. valid_territory = FALSE ambientsounds = MINING diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index fade32535e..8aa910b2e2 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -25,7 +25,7 @@ var/lightswitch = TRUE var/requires_power = TRUE - var/always_unpowered = FALSE // This gets overriden to 1 for space in area/Initialize(). + var/always_unpowered = FALSE // This gets overridden to 1 for space in area/Initialize(). var/outdoors = FALSE //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room) @@ -44,7 +44,7 @@ var/static_light = 0 var/static_environ - var/has_gravity = FALSE + var/has_gravity = 0 var/noteleport = FALSE //Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter) var/hidden = FALSE //Hides area from player Teleport function. var/safe = FALSE //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers @@ -409,8 +409,8 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/Entered(atom/movable/M) set waitfor = FALSE - SendSignal(COMSIG_AREA_ENTERED, M) - M.SendSignal(COMSIG_ENTER_AREA, src) //The atom that enters the area + SEND_SIGNAL(src, COMSIG_AREA_ENTERED, M) + SEND_SIGNAL(M, COMSIG_ENTER_AREA, src) //The atom that enters the area if(!isliving(M)) return @@ -435,8 +435,8 @@ GLOBAL_LIST_EMPTY(teleportlocs) addtimer(CALLBACK(L.client, /client/proc/ResetAmbiencePlayed), 600) /area/Exited(atom/movable/M) - SendSignal(COMSIG_AREA_EXITED, M) - M.SendSignal(COMSIG_EXIT_AREA, src) //The atom that exits the area + SEND_SIGNAL(src, COMSIG_AREA_EXITED, M) + SEND_SIGNAL(M, COMSIG_EXIT_AREA, src) //The atom that exits the area /client/proc/ResetAmbiencePlayed() played = FALSE @@ -444,16 +444,39 @@ GLOBAL_LIST_EMPTY(teleportlocs) /atom/proc/has_gravity(turf/T) if(!T || !isturf(T)) T = get_turf(src) + + if(!T) + return 0 + + //Gravity forced on the atom + var/datum/component/forced_gravity/FG = GetComponent(/datum/component/forced_gravity) + if(FG) + if(!FG.ignore_space && isspaceturf(T)) + return 0 + else + return FG.gravity + + //Gravity forced on the turf + FG = T.GetComponent(/datum/component/forced_gravity) + if(FG) + if(!FG.ignore_space && isspaceturf(T)) + return 0 + else + return FG.gravity + var/area/A = get_area(T) if(isspaceturf(T)) // Turf never has gravity - return FALSE - else if(A && A.has_gravity) // Areas which always has gravity - return TRUE + return 0 + else if(A.has_gravity) // Areas which always has gravity + return A.has_gravity else // There's a gravity generator on our z level - if(T && GLOB.gravity_generators["[T.z]"] && length(GLOB.gravity_generators["[T.z]"])) - return TRUE - return FALSE + if(GLOB.gravity_generators["[T.z]"]) + var/max_grav = 0 + for(var/obj/machinery/gravity_generator/main/G in GLOB.gravity_generators["[T.z]"]) + max_grav = max(G.setting,max_grav) + return max_grav + return SSmapping.level_trait(T.z, ZTRAIT_GRAVITY) /area/proc/setup(a_name) name = a_name diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index cc2e317d85..b724c92607 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -7,7 +7,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" /area/awaymission name = "Strange Location" icon_state = "away" - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY ambientsounds = AWAY_MISSION /area/awaymission/beach @@ -15,13 +15,13 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" icon_state = "away" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED requires_power = FALSE - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg') /area/awaymission/errorroom name = "Super Secret Room" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY /area/awaymission/vr name = "Virtual Reality" diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index c2719f57eb..30de1314c9 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -6,7 +6,7 @@ icon_state = "centcom" dynamic_lighting = DYNAMIC_LIGHTING_FORCED requires_power = FALSE - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY noteleport = TRUE blob_allowed = FALSE //Should go without saying, no blobs should take over centcom as a win condition. flags_1 = NONE @@ -36,7 +36,7 @@ icon_state = "yellow" dynamic_lighting = DYNAMIC_LIGHTING_FORCED requires_power = FALSE - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY flags_1 = NONE /area/tdome/arena @@ -74,7 +74,7 @@ icon_state = "yellow" dynamic_lighting = DYNAMIC_LIGHTING_FORCED requires_power = FALSE - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY noteleport = TRUE flags_1 = NONE @@ -84,7 +84,7 @@ icon_state = "yellow" requires_power = FALSE noteleport = TRUE - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY flags_1 = NONE //Syndicates @@ -92,7 +92,7 @@ name = "Syndicate Mothership" icon_state = "syndie-ship" requires_power = FALSE - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY noteleport = TRUE blob_allowed = FALSE //Not... entirely sure this will ever come up... but if the bus makes blobs AND ops, it shouldn't aim for the ops to win. flags_1 = NONE @@ -120,8 +120,7 @@ name = "Capture the Flag" icon_state = "yellow" requires_power = FALSE - has_gravity = TRUE - flags_1 = NO_DEATHRATTLE_1 + has_gravity = STANDARD_GRAVITY /area/ctf/control_room name = "Control Room A" @@ -156,7 +155,7 @@ name = "Reebe" icon_state = "yellow" requires_power = FALSE - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY noteleport = TRUE hidden = TRUE ambientsounds = REEBE diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index 493f36dd8d..2ca9167bb2 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -2,7 +2,7 @@ /area/mine icon_state = "mining" - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY /area/mine/explored name = "Mine" @@ -80,7 +80,7 @@ /area/lavaland icon_state = "mining" - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY flags_1 = NONE /area/lavaland/surface diff --git a/code/game/area/areas/ruins/_ruins.dm b/code/game/area/areas/ruins/_ruins.dm index 087842c5d1..b97c3f0ef4 100644 --- a/code/game/area/areas/ruins/_ruins.dm +++ b/code/game/area/areas/ruins/_ruins.dm @@ -3,7 +3,7 @@ /area/ruin name = "\improper Unexplored Location" icon_state = "away" - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY hidden = TRUE dynamic_lighting = DYNAMIC_LIGHTING_FORCED ambientsounds = RUINS diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index c52119361b..00a7fed012 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -5,7 +5,7 @@ blob_allowed = FALSE //Nope, no winning in space as a blob. Gotta eat the station. /area/ruin/space/has_grav - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY /area/ruin/space/has_grav/powered requires_power = FALSE @@ -413,13 +413,13 @@ /area/ruin/space/djstation name = "Ruskie DJ Station" icon_state = "DJ" - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY blob_allowed = FALSE //Nope, no winning on the DJ station as a blob. Gotta eat the main station. /area/ruin/space/djstation/solars name = "DJ Station Solars" icon_state = "DJ" - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY //ABANDONED TELEPORTER diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index 90a6bbd3b6..8e23614db0 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -6,7 +6,7 @@ name = "Shuttle" requires_power = FALSE dynamic_lighting = DYNAMIC_LIGHTING_FORCED - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY always_unpowered = FALSE valid_territory = FALSE icon_state = "shuttle" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index f81da22d7f..980ba7e7bc 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -20,13 +20,16 @@ var/list/atom_colours //used to store the different colors on an atom //its inherent color, the colored paint applied on it, special color effect etc... - var/list/our_overlays //our local copy of (non-priority) overlays without byond magic. Use procs in SSoverlays to manipulate var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4. + var/list/remove_overlays // a very temporary list of overlays to remove + var/list/add_overlays // a very temporary list of overlays to add var/datum/proximity_monitor/proximity_monitor var/buckle_message_cooldown = 0 var/fingerprintslast + var/list/filter_data //For handling persistent filters + /atom/New(loc, ...) //atom creation method that preloads variables at creation if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New() @@ -151,7 +154,7 @@ return FALSE /atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) - SendSignal(COMSIG_ATOM_HULK_ATTACK, user) + SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user) if(does_attack_animation) user.changeNext_move(CLICK_CD_MELEE) add_logs(user, src, "punched", "hulk powers") @@ -220,13 +223,13 @@ return /atom/proc/emp_act(severity) - var/protection = SendSignal(COMSIG_ATOM_EMP_ACT, severity) + var/protection = SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity) if(!(protection & EMP_PROTECT_WIRES) && istype(wires)) wires.emp_pulse() return protection // Pass the protection value collected here upwards /atom/proc/bullet_act(obj/item/projectile/P, def_zone) - SendSignal(COMSIG_ATOM_BULLET_ACT, P, def_zone) + SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) . = P.on_hit(src, 0, def_zone) /atom/proc/in_contents_of(container)//can take class or object instance as argument @@ -243,7 +246,7 @@ if(article) . = "[article] [src]" override[EXAMINE_POSITION_ARTICLE] = article - if(SendSignal(COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED) + if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED) . = override.Join("") /atom/proc/get_examine_string(mob/user, thats = FALSE) @@ -275,7 +278,7 @@ else to_chat(user, "It's empty.") - SendSignal(COMSIG_PARENT_EXAMINE, user) + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user) /atom/proc/relaymove(mob/user) if(buckle_message_cooldown <= world.time) @@ -289,14 +292,14 @@ /atom/proc/ex_act(severity, target) set waitfor = FALSE contents_explosion(severity, target) - SendSignal(COMSIG_ATOM_EX_ACT, severity, target) + SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target) /atom/proc/blob_act(obj/structure/blob/B) - SendSignal(COMSIG_ATOM_BLOB_ACT, B) + SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B) return /atom/proc/fire_act(exposed_temperature, exposed_volume) - SendSignal(COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume) + SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume) return /atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked) @@ -364,28 +367,28 @@ return /atom/proc/singularity_pull(obj/singularity/S, current_size) - SendSignal(COMSIG_ATOM_SING_PULL, S, current_size) + SEND_SIGNAL(src, COMSIG_ATOM_SING_PULL, S, current_size) /atom/proc/acid_act(acidpwr, acid_volume) - SendSignal(COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume) + SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume) /atom/proc/emag_act() - SendSignal(COMSIG_ATOM_EMAG_ACT) + SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT) /atom/proc/rad_act(strength) - SendSignal(COMSIG_ATOM_RAD_ACT, strength) + SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength) /atom/proc/narsie_act() - SendSignal(COMSIG_ATOM_NARSIE_ACT) + SEND_SIGNAL(src, COMSIG_ATOM_NARSIE_ACT) /atom/proc/ratvar_act() - SendSignal(COMSIG_ATOM_RATVAR_ACT) + SEND_SIGNAL(src, COMSIG_ATOM_RATVAR_ACT) /atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) return FALSE /atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - SendSignal(COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode) + SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode) return FALSE /atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user) @@ -413,7 +416,7 @@ //This proc is called on the location of an atom when the atom is Destroy()'d /atom/proc/handle_atom_del(atom/A) - SendSignal(COMSIG_ATOM_CONTENTS_DEL, A) + SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, A) //called when the turf the atom resides on is ChangeTurfed /atom/proc/HandleTurfChange(turf/T) @@ -432,7 +435,7 @@ //Hook for running code when a dir change occurs /atom/proc/setDir(newdir) - SendSignal(COMSIG_ATOM_DIR_CHANGE, dir, newdir) + SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) dir = newdir /atom/proc/mech_melee_attack(obj/mecha/M) @@ -527,10 +530,10 @@ return L.AllowDrop() ? L : get_turf(L) /atom/Entered(atom/movable/AM, atom/oldLoc) - SendSignal(COMSIG_ATOM_ENTERED, AM, oldLoc) + SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc) /atom/Exited(atom/movable/AM, atom/newLoc) - SendSignal(COMSIG_ATOM_EXITED, AM, newLoc) + SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, newLoc) /atom/proc/return_temperature() return @@ -579,3 +582,25 @@ /atom/proc/GenerateTag() return + +// Filter stuff +/atom/movable/proc/add_filter(name,priority,list/params) + if(!filter_data) + filter_data = list() + var/list/p = params.Copy() + p["priority"] = priority + filter_data[name] = p + update_filters() + +/atom/movable/proc/update_filters() + filters = null + sortTim(filter_data,associative = TRUE) + for(var/f in filter_data) + var/list/data = filter_data[f] + var/list/arguments = data.Copy() + arguments -= "priority" + filters += filter(arglist(arguments)) + +/atom/movable/proc/get_filter(name) + if(filter_data && filter_data[name]) + return filters[filter_data.Find(name)] \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index e1493df15b..211bb35263 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -240,7 +240,7 @@ //Called after a successful Move(). By this point, we've already moved /atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE) - SendSignal(COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced) + SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced) if (!inertia_moving) inertia_next_move = world.time + inertia_move_delay newtonian_move(Dir) @@ -278,16 +278,16 @@ // This is automatically called when something enters your square //oldloc = old location on atom, inserted when forceMove is called and ONLY when forceMove is called! /atom/movable/Crossed(atom/movable/AM, oldloc) - SendSignal(COMSIG_MOVABLE_CROSSED, AM) + SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM) /atom/movable/Uncrossed(atom/movable/AM) - SendSignal(COMSIG_MOVABLE_UNCROSSED, AM) + SEND_SIGNAL(src, COMSIG_MOVABLE_UNCROSSED, AM) //This is tg's equivalent to the byond bump, it used to be called bump with a second arg //to differentiate it, naturally everyone forgot about this immediately and so some things //would bump twice, so now it's called Collide /atom/movable/proc/Collide(atom/A) - SendSignal(COMSIG_MOVABLE_COLLIDE, A) + SEND_SIGNAL(src, COMSIG_MOVABLE_COLLIDE, A) if(A) if(throwing) throwing.hit_atom(A) @@ -354,7 +354,7 @@ loc = null /atom/movable/proc/onTransitZ(old_z,new_z) - SendSignal(COMSIG_MOVABLE_Z_CHANGED, old_z, new_z) + SEND_SIGNAL(src, COMSIG_MOVABLE_Z_CHANGED, old_z, new_z) for (var/item in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care. var/atom/movable/AM = item AM.onTransitZ(old_z,new_z) @@ -397,7 +397,7 @@ /atom/movable/proc/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) set waitfor = 0 - SendSignal(COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) + SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) return hit_atom.hitby(src) /atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked) @@ -410,7 +410,7 @@ /atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) //If this returns FALSE then callback will not be called. . = FALSE - if (!target || (flags_1 & NODROP_1) || speed <= 0) + if (!target || speed <= 0) return if (pulledby) @@ -482,7 +482,7 @@ if(spin) SpinAnimation(5, 1) - SendSignal(COMSIG_MOVABLE_THROW, TT, spin) + SEND_SIGNAL(src, COMSIG_MOVABLE_THROW, TT, spin) SSthrowing.processing[src] = TT if (SSthrowing.state == SS_PAUSED && length(SSthrowing.currentrun)) SSthrowing.currentrun[src] = TT @@ -565,6 +565,7 @@ I = image('icons/effects/effects.dmi', A, visual_effect_icon, A.layer + 0.1) else if(used_item) I = image(icon = used_item, loc = A, layer = A.layer + 0.1) + I.plane = GAME_PLANE // Scale the icon. I.transform *= 0.75 diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index e682960e2e..09a9ec9970 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -248,7 +248,7 @@ if("Incarcerated") holder.icon_state = "hudincarcerated" return - if("Parolled") + if("Paroled") holder.icon_state = "hudparolled" return if("Discharged") diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 242eb61478..07e31cb24d 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -52,6 +52,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th changeling.restricted_roles = restricted_jobs return 1 else + setup_error = "Not enough changeling candidates" return 0 /datum/game_mode/changeling/post_setup() @@ -82,10 +83,10 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th return if(changelings.len <= (changelingcap - 2) || prob(100 - (csc * 2))) if(ROLE_CHANGELING in character.client.prefs.be_special) - if(!jobban_isbanned(character, ROLE_CHANGELING) && !jobban_isbanned(character, ROLE_SYNDICATE)) + if(!jobban_isbanned(character, ROLE_CHANGELING) && !QDELETED(character) && !jobban_isbanned(character, ROLE_SYNDICATE) && !QDELETED(character)) if(age_check(character.client)) if(!(character.job in restricted_jobs)) - character.mind.make_Changling() + character.mind.make_Changeling() changelings += character.mind /datum/game_mode/changeling/generate_report() diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index d2f5accea4..3f5abe531b 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -69,11 +69,13 @@ return if(changelings.len <= (changelingcap - 2) || prob(100 / (csc * 4))) if(ROLE_CHANGELING in character.client.prefs.be_special) - if(!jobban_isbanned(character, ROLE_CHANGELING) && !jobban_isbanned(character, ROLE_SYNDICATE)) + if(!jobban_isbanned(character, ROLE_CHANGELING) && !QDELETED(character) && !jobban_isbanned(character, ROLE_SYNDICATE) && !QDELETED(character)) if(age_check(character.client)) if(!(character.job in restricted_jobs)) - character.mind.make_Changling() + character.mind.make_Changeling() changelings += character.mind + if(QDELETED(character)) + return ..() /datum/game_mode/traitor/changeling/generate_report() diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index fc0cfc2879..499d441a57 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -146,8 +146,8 @@ Credit where due: var/list/errorList = list() SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE) if(errorList.len) // reebe failed to load - message_admins("Rebee failed to load!") - log_game("Rebee failed to load!") + message_admins("Reebe failed to load!") + log_game("Reebe failed to load!") return FALSE if(CONFIG_GET(flag/protect_roles_from_antagonist)) restricted_jobs += protected_jobs diff --git a/code/game/gamemodes/clown_ops/bananium_bomb.dm b/code/game/gamemodes/clown_ops/bananium_bomb.dm index c7212a671c..0d5f0691c4 100644 --- a/code/game/gamemodes/clown_ops/bananium_bomb.dm +++ b/code/game/gamemodes/clown_ops/bananium_bomb.dm @@ -42,17 +42,17 @@ var/obj/item/clothing/C if(!H.w_uniform || H.dropItemToGround(H.w_uniform)) C = new /obj/item/clothing/under/rank/clown(H) - C.flags_1 |= NODROP_1 //mwahaha + C.item_flags |= NODROP //mwahaha H.equip_to_slot_or_del(C, SLOT_W_UNIFORM) if(!H.shoes || H.dropItemToGround(H.shoes)) C = new /obj/item/clothing/shoes/clown_shoes(H) - C.flags_1 |= NODROP_1 + C.item_flags |= NODROP H.equip_to_slot_or_del(C, SLOT_SHOES) if(!H.wear_mask || H.dropItemToGround(H.wear_mask)) C = new /obj/item/clothing/mask/gas/clown_hat(H) - C.flags_1 |= NODROP_1 + C.item_flags |= NODROP H.equip_to_slot_or_del(C, SLOT_WEAR_MASK) H.dna.add_mutation(CLOWNMUT) diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm index 75df27ffca..12d3106c8d 100644 --- a/code/game/gamemodes/clown_ops/clown_ops.dm +++ b/code/game/gamemodes/clown_ops/clown_ops.dm @@ -48,7 +48,7 @@ /obj/item/reagent_containers/spray/waterflower/lube) implants = list(/obj/item/implant/sad_trombone) - uplink_type = /obj/item/radio/uplink/clownop + uplink_type = /obj/item/uplink/clownop /datum/outfit/syndicate/clownop/no_crystals tc = 0 diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 067bb8c84c..bf401e5ad2 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -11,10 +11,10 @@ list_reagents = list("lube" = 30) //COMBAT CLOWN SHOES -//Clown shoes with combat stats and noslip. Of course they still squeek. +//Clown shoes with combat stats and noslip. Of course they still squeak. /obj/item/clothing/shoes/clown_shoes/combat name = "combat clown shoes" - desc = "advanced clown shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeek at 100% capacity." + desc = "advanced clown shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeak at 100% capacity." clothing_flags = NOSLIP slowdown = SHOES_SLOWDOWN armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50) @@ -216,11 +216,11 @@ /obj/item/clothing/mask/fakemoustache/sticky/Initialize() . = ..() - flags_1 |= NODROP_1 + item_flags |= NODROP addtimer(CALLBACK(src, .proc/unstick), unstick_time) /obj/item/clothing/mask/fakemoustache/sticky/proc/unstick() - flags_1 &= ~NODROP_1 + item_flags &= ~NODROP //DARK H.O.N.K. AND CLOWN MECH WEAPONS diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index de9422d6f7..4e9a9cc6e7 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -81,8 +81,11 @@ cultist.restricted_roles = restricted_jobs log_game("[key_name(cultist)] has been selected as a cultist") - - return (cultists_to_cult.len>=required_enemies) + if(cultists_to_cult.len>=required_enemies) + return TRUE + else + setup_error = "Not enough cultist candidates" + return FALSE /datum/game_mode/cult/post_setup() diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm index 2e897539d8..0f2e8f7858 100644 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ b/code/game/gamemodes/devil/devil_game_mode.dm @@ -45,6 +45,7 @@ antag_candidates.Remove(devil) if(devils.len < required_enemies) + setup_error = "Not enough devil candidates" return 0 return 1 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index fbf62886e3..5b23abea26 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -49,6 +49,7 @@ var/gamemode_ready = FALSE //Is the gamemode all set up and ready to start checking for ending conditions. var/flipseclevel = FALSE //CIT CHANGE - adds a 10% chance for the alert level to be the opposite of what the gamemode is supposed to have + var/setup_error //What stopepd setting up the mode. /datum/game_mode/proc/announce() //Shows the gamemode's name and a fast description. to_chat(world, "The gamemode is: [name]!") @@ -98,6 +99,7 @@ if(sql) var/datum/DBQuery/query_round_game_mode = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET [sql] WHERE id = [GLOB.round_id]") query_round_game_mode.Execute() + qdel(query_round_game_mode) if(report) addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h)) generate_station_goals() @@ -364,7 +366,7 @@ for(var/mob/dead/new_player/player in players) if(player.client && player.ready == PLAYER_READY_TO_PLAY) if(role in player.client.prefs.be_special) - if(!jobban_isbanned(player, ROLE_SYNDICATE) && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans + if(!jobban_isbanned(player, ROLE_SYNDICATE) && !QDELETED(player) && !jobban_isbanned(player, role) && !QDELETED(player)) //Nodrak/Carn: Antag Job-bans if(age_check(player.client)) //Must be older than the minimum age candidates += player.mind // Get a list of all the people who want to be the antagonist for this round @@ -378,7 +380,7 @@ for(var/mob/dead/new_player/player in players) if(player.client && player.ready == PLAYER_READY_TO_PLAY) if(!(role in player.client.prefs.be_special)) // We don't have enough people who want to be antagonist, make a separate list of people who don't want to be one - if(!jobban_isbanned(player, ROLE_SYNDICATE) && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans + if(!jobban_isbanned(player, ROLE_SYNDICATE) && !QDELETED(player) && !jobban_isbanned(player, role) && !QDELETED(player) ) //Nodrak/Carn: Antag Job-bans drafted += player.mind if(restricted_jobs) diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm index 8f7bedd4dd..76460ffbb8 100644 --- a/code/game/gamemodes/monkey/monkey.dm +++ b/code/game/gamemodes/monkey/monkey.dm @@ -40,6 +40,7 @@ antag_candidates -= carrier if(!carriers.len) + setup_error = "No monkey candidates" return FALSE return TRUE diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 973de8cde1..4eb5dc1c6e 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -33,6 +33,7 @@ log_game("[key_name(new_op)] has been selected as a nuclear operative") return TRUE else + setup_error = "Not enough nuke op candidates" return FALSE //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// @@ -134,7 +135,7 @@ var/tc = 25 var/command_radio = FALSE - var/uplink_type = /obj/item/radio/uplink/nuclear + var/uplink_type = /obj/item/uplink/nuclear /datum/outfit/syndicate/leader @@ -154,7 +155,7 @@ R.command = TRUE if(tc) - var/obj/item/radio/uplink/U = new uplink_type(H, H.key, tc) + var/obj/item/U = new uplink_type(H, H.key, tc) H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 7559e21e21..b32460dabc 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -279,7 +279,7 @@ GLOBAL_LIST_EMPTY(objectives) if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) return TRUE for(var/mob/living/player in GLOB.player_list) - if(get_area(player) in SSshuttle.emergency.shuttle_areas && player.mind && player.stat != DEAD && ishuman(player)) + if((get_area(player) in SSshuttle.emergency.shuttle_areas) && player.mind && player.stat != DEAD && ishuman(player)) var/mob/living/carbon/human/H = player if(H.dna.species.id != "human") return FALSE @@ -621,7 +621,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) absorbedcount += changeling.absorbedcount for(var/datum/antagonist/changeling/changeling2 in GLOB.antagonists) - if(!changeling2.owner || !changeling2.stored_profiles || changeling2.absorbedcount < absorbedcount) + if(!changeling2.owner || changeling2.owner == owner || !changeling2.stored_profiles || changeling2.absorbedcount < absorbedcount) continue return FALSE return TRUE diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 592d930f7d..e7ea46f573 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -58,6 +58,7 @@ lenin.restricted_roles = restricted_jobs if(headrev_candidates.len < required_enemies) + setup_error = "Not enough headrev candidates" return FALSE return TRUE diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 6884cdee55..b5b5e7a706 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -56,7 +56,13 @@ log_game("[key_name(traitor)] has been selected as a [traitor_name]") antag_candidates.Remove(traitor) - return !traitors_required || pre_traitors.len > 0 + var/enough_tators = !traitors_required || pre_traitors.len > 0 + + if(!enough_tators) + setup_error = "Not enough traitor candidates" + return FALSE + else + return TRUE /datum/game_mode/traitor/post_setup() @@ -79,7 +85,7 @@ return if((SSticker.mode.traitors.len + pre_traitors.len) <= (traitorcap - 2) || prob(100 / (tsc * 2))) if(ROLE_TRAITOR in character.client.prefs.be_special) - if(!jobban_isbanned(character, ROLE_TRAITOR) && !jobban_isbanned(character, ROLE_SYNDICATE)) + if(!jobban_isbanned(character, ROLE_TRAITOR) && !QDELETED(character) && !jobban_isbanned(character, ROLE_SYNDICATE) && !QDELETED(character)) if(age_check(character.client)) if(!(character.job in restricted_jobs)) add_latejoin_traitor(character.mind) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 32d17fec2c..d27f977575 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -25,11 +25,11 @@ wizard.special_role = ROLE_WIZARD log_game("[key_name(wizard)] has been selected as a Wizard") //TODO: Move these to base antag datum if(GLOB.wizardstart.len == 0) - to_chat(wizard.current, "A starting location for you could not be found, please report this bug!") - return 0 + setup_error = "No wizard starting location found" + return FALSE for(var/datum/mind/wiz in wizards) wiz.current.forceMove(pick(GLOB.wizardstart)) - return 1 + return TRUE /datum/game_mode/wizard/post_setup() diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 7f661b4556..c1adb0e9d0 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -414,12 +414,12 @@ Class Procs: var/obj/item/stack/SN = new SB.merge_type(null,used_amt) component_parts += SN else - if(W.SendSignal(COMSIG_TRY_STORAGE_TAKE, B, src)) + if(SEND_SIGNAL(W, COMSIG_TRY_STORAGE_TAKE, B, src)) component_parts += B B.moveToNullspace() - W.SendSignal(COMSIG_TRY_STORAGE_INSERT, A, null, null, TRUE) + SEND_SIGNAL(W, COMSIG_TRY_STORAGE_INSERT, A, null, null, TRUE) component_parts -= A - to_chat(user, "[A.name] replaced with [B.name].") + to_chat(user, "[capitalize(A.name)] replaced with [B.name].") shouldplaysound = 1 //Only play the sound when parts are actually replaced! break RefreshParts() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 9a13bde3ff..84059e8029 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -46,7 +46,7 @@ ) /obj/machinery/autolathe/Initialize() - AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), 0, FALSE, null, null, CALLBACK(src, .proc/AfterMaterialInsert)) + AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), 0, TRUE, null, null, CALLBACK(src, .proc/AfterMaterialInsert)) . = ..() wires = new /datum/wires/autolathe(src) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index f974f1b39b..879be046c9 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -95,7 +95,7 @@ update_icon() return - if(user.a_intent != INTENT_HARM && !(W.flags_1 & NOBLUDGEON_1)) + if(user.a_intent != INTENT_HARM && !(W.item_flags & NOBLUDGEON)) return attack_hand(user) else return ..() diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 5cf652f00d..3e8e3afc98 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -41,6 +41,16 @@ var/internal_light = TRUE //Whether it can light up when an AI views it +/obj/machinery/camera/preset/toxins //Bomb test site in space + name = "Hardened Bomb-Test Camera" + desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top." + c_tag = "Bomb Testing Site" + network = list("rd","toxins") + use_power = NO_POWER_USE //Test site is an unpowered area + invuln = TRUE + light_range = 10 + start_active = TRUE + /obj/machinery/camera/Initialize(mapload, obj/structure/camera_assembly/CA) . = ..() for(var/i in network) diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 7eac36dc96..decfebddb9 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -13,7 +13,7 @@ icon = 'icons/obj/machines/camera.dmi' icon_state = "camera1" max_integrity = 150 - // Motion, EMP-Proof, X-Ray + // Motion, EMP-Proof, X-ray var/static/list/possible_upgrades = typecacheof(list(/obj/item/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/analyzer)) var/list/upgrades var/state = 1 @@ -80,7 +80,7 @@ return FALSE var/obj/U = locate(/obj) in upgrades if(U) - to_chat(user, "You unattach an upgrade from the assembly.") + to_chat(user, "You detach an upgrade from the assembly.") tool.play_tool_sound(src) U.forceMove(drop_location()) upgrades -= U @@ -126,7 +126,7 @@ if(state != 1) return FALSE I.play_tool_sound(src) - to_chat(user, "You unattach the assembly from its place.") + to_chat(user, "You detach the assembly from its place.") new /obj/item/wallframe/camera(drop_location()) qdel(src) return TRUE diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index d9a93a6578..45f0268a00 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -10,6 +10,8 @@ if(!isMotion()) . = PROCESS_KILL return + if(stat & EMPED) + return if (detectTime > 0) var/elapsed = world.time - detectTime if (elapsed > alarm_delay) @@ -63,6 +65,7 @@ for (var/mob/living/silicon/aiPlayer in GLOB.player_list) if (status) aiPlayer.triggerAlarm("Motion", get_area(src), list(src), src) + visible_message("A red light flashes on the [src]!") detectTime = -1 return TRUE diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index f4963102c6..afcc1fee7c 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -2,16 +2,16 @@ // EMP /obj/machinery/camera/emp_proof - start_active = 1 + start_active = TRUE /obj/machinery/camera/emp_proof/Initialize() . = ..() upgradeEmpProof() -// X-RAY +// X-ray /obj/machinery/camera/xray - start_active = 1 + start_active = TRUE icon_state = "xraycam" // Thanks to Krutchen for the icons. /obj/machinery/camera/xray/Initialize() @@ -20,7 +20,7 @@ // MOTION /obj/machinery/camera/motion - start_active = 1 + start_active = TRUE name = "motion-sensitive security camera" /obj/machinery/camera/motion/Initialize() @@ -29,7 +29,7 @@ // ALL UPGRADES /obj/machinery/camera/all - start_active = 1 + start_active = TRUE /obj/machinery/camera/all/Initialize() . = ..() diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 43e736b6ef..5d6c92a97d 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -1,6 +1,6 @@ /obj/machinery/computer/aifixer name = "\improper AI system integrity restorer" - desc = "Used with intelliCards containing nonfunctioning AIs to restore them to working order." + desc = "Used with intelliCards containing nonfunctional AIs to restore them to working order." req_access = list(ACCESS_CAPTAIN, ACCESS_ROBOTICS, ACCESS_HEADS) var/mob/living/silicon/ai/occupier = null var/active = 0 diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 3d4d916961..13da773868 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -72,7 +72,7 @@ Reset() /obj/machinery/computer/arcade/proc/prizevend(mob/user) - user.SendSignal(COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade) if(prob(0.0001)) //1 in a million new /obj/item/gun/energy/pulse/prize(src) SSmedals.UnlockMedal(MEDAL_PULSE, usr.client) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 7b75d06321..696c9442b9 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -132,7 +132,7 @@ /obj/machinery/computer/security/proc/get_available_cameras() var/list/L = list() for (var/obj/machinery/camera/C in GLOB.cameranet.cameras) - if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only recieve feed from same z_level cameras + if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only receive feed from same z_level cameras continue L.Add(C) @@ -152,6 +152,50 @@ D["[C.c_tag][(C.status ? null : " (Deactivated)")]"] = C return D +// SECURITY MONITORS + +/obj/machinery/computer/security/wooden_tv + name = "security camera monitor" + desc = "An old TV hooked into the station's camera network." + icon_state = "television" + icon_keyboard = null + icon_screen = "detective_tv" + clockwork = TRUE //it'd look weird + +/obj/machinery/computer/security/mining + name = "outpost camera console" + desc = "Used to access the various cameras on the outpost." + icon_screen = "mining" + icon_keyboard = "mining_key" + network = list("mine", "auxbase") + circuit = /obj/item/circuitboard/computer/mining + +/obj/machinery/computer/security/research + name = "research camera console" + desc = "Used to access the various cameras in science." + network = list("rd") + circuit = /obj/item/circuitboard/computer/research + +/obj/machinery/computer/security/hos + name = "Head of Security's camera console" + desc = "A custom security console with added access to the labor camp network." + network = list("ss13", "labor") + circuit = null + +/obj/machinery/computer/security/labor + name = "labor camp monitoring" + desc = "Used to access the various cameras on the labor camp." + network = list("labor") + circuit = null + +/obj/machinery/computer/security/qm + name = "Quartermaster's camera console" + desc = "A console with access to the mining, auxillary base and vault camera networks." + network = list("mine", "auxbase", "vault") + circuit = null + +// TELESCREENS + /obj/machinery/computer/security/telescreen name = "\improper Telescreen" desc = "Used for watching an empty arena." @@ -161,7 +205,6 @@ density = FALSE circuit = null clockwork = TRUE //it'd look very weird - light_power = 0 /obj/machinery/computer/security/telescreen/update_icon() @@ -176,28 +219,68 @@ icon = 'icons/obj/status_display.dmi' icon_state = "entertainment" network = list("thunder") - density = FALSE - circuit = null -/obj/machinery/computer/security/wooden_tv - name = "security camera monitor" - desc = "An old TV hooked into the stations camera network." - icon_state = "television" - icon_keyboard = null - icon_screen = "detective_tv" - clockwork = TRUE //it'd look weird +/obj/machinery/computer/security/telescreen/rd + name = "Research Director's telescreen" + desc = "Used for watching the AI and the RD's goons from the safety of his office." + network = list("rd", "aicore", "aiupload", "minisat", "xeno", "test") - -/obj/machinery/computer/security/mining - name = "outpost camera console" - desc = "Used to access the various cameras on the outpost." - icon_screen = "mining" - icon_keyboard = "mining_key" - network = list("mine") - circuit = /obj/item/circuitboard/computer/mining - -/obj/machinery/computer/security/research - name = "research camera console" - desc = "Used to access the various cameras in science." +/obj/machinery/computer/security/telescreen/circuitry + name = "circuitry telescreen" + desc = "Used for watching the other eggheads from the safety of the circuitry lab." network = list("rd") - circuit = /obj/item/circuitboard/computer/research + +/obj/machinery/computer/security/telescreen/ce + name = "Chief Engineer's telescreen" + desc = "Used for watching the engine, telecommunications and the minisat." + network = list("engine", "singularity", "tcomms", "minisat") + +/obj/machinery/computer/security/telescreen/cmo + name = "Chief Medical Officer's telescreen" + desc = "A telescreen with access to the medbay's camera network." + network = list("medbay") + +/obj/machinery/computer/security/telescreen/vault + name = "Vault monitor" + desc = "A telescreen that connects to the vault's camera network." + network = list("vault") + +/obj/machinery/computer/security/telescreen/toxins + name = "Bomb test site monitor" + desc = "A telescreen that connects to the bomb test site's camera." + network = list("toxin") + +/obj/machinery/computer/security/telescreen/engine + name = "engine monitor" + desc = "A telescreen that connects to the engine's camera network." + network = list("engine") + +/obj/machinery/computer/security/telescreen/turbine + name = "turbine monitor" + desc = "A telescreen that connects to the turbine's camera." + network = list("turbine") + +/obj/machinery/computer/security/telescreen/interrogation + name = "interrogation room monitor" + desc = "A telescreen that connects to the interrogation room's camera." + network = list("interrogation") + +/obj/machinery/computer/security/telescreen/prison + name = "prison monitor" + desc = "A telescreen that connects to the permabrig's camera network." + network = list("prison") + +/obj/machinery/computer/security/telescreen/auxbase + name = "auxillary base monitor" + desc = "A telescreen that connects to the auxillary base's camera." + network = list("auxbase") + +/obj/machinery/computer/security/telescreen/minisat + name = "minisat monitor" + desc = "A telescreen that connects to the minisat's camera network." + network = list("minisat") + +/obj/machinery/computer/security/telescreen/aiupload + name = "AI upload monitor" + desc = "A telescreen that connects to the AI upload's camera network." + network = list("aiupload") diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 26a8ac940e..e561c6466f 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -159,7 +159,7 @@ /mob/camera/aiEye/remote/update_remote_sight(mob/living/user) user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras - user.sight = 0 + user.sight = SEE_TURFS | SEE_BLACKNESS user.see_in_dark = 2 return 1 diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index bb47a7ab32..09bf401e12 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -348,6 +348,12 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) /obj/machinery/computer/card/Topic(href, href_list) if(..()) return + + if(!usr.canUseTopic(src, !issilicon(usr)) || !is_operational()) + usr.unset_machine() + usr << browse(null, "window=id_com") + return + usr.set_machine(src) switch(href_list["choice"]) if ("modify") @@ -532,11 +538,12 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) updateUsrDialog() /obj/machinery/computer/card/AltClick(mob/user) - if(user.canUseTopic(src)) - if(scan) - eject_id_scan(user) - if(modify) - eject_id_modify(user) + if(!user.canUseTopic(src, !issilicon(user)) || !is_operational()) + return + if(scan) + eject_id_scan(user) + if(modify) + eject_id_modify(user) /obj/machinery/computer/card/proc/eject_id_scan(mob/user) if(scan) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index d1e3de1248..5e5c08ee99 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -83,7 +83,7 @@ if(obj_flags & EMAGGED) authenticated = 2 auth_id = "Unknown" - to_chat(M, "[src] lets out a quiet alarm as its login is overriden.") + to_chat(M, "[src] lets out a quiet alarm as its login is overridden.") playsound(src, 'sound/machines/terminal_on.ogg', 50, 0) playsound(src, 'sound/machines/terminal_alert.ogg', 25, 0) if(prob(25)) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 72e17679f5..790d9898b8 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -9,7 +9,7 @@ #define RADIATION_DURATION_MAX 30 #define RADIATION_ACCURACY_MULTIPLIER 3 //larger is less accurate -#define RADIATION_IRRADIATION_MULTIPLIER 1 //multiplier for how much radiation a test subject recieves +#define RADIATION_IRRADIATION_MULTIPLIER 1 //multiplier for how much radiation a test subject receives #define SCANNER_ACTION_SE 1 #define SCANNER_ACTION_UI 2 diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index f606494b96..0ee394d889 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -329,7 +329,7 @@ src.active2.fields["mi_dis_d"] = t1 if("ma_dis") if(active2) - var/t1 = stripped_input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) + var/t1 = stripped_input("Please input major disabilities list:", "Med. records", src.active2.fields["ma_dis"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return src.active2.fields["ma_dis"] = t1 diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index ec113eb43b..b71f572e68 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -130,4 +130,4 @@ /obj/machinery/computer/pod/old/swf name = "\improper Magix System IV" - desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorceror's Edition." + desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorcerer's Edition." diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 17121c45cf..8a2a06bf1f 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -150,7 +150,7 @@ background = "'background-color:#990000;'" if("Incarcerated") background = "'background-color:#CD6500;'" - if("Parolled") + if("Paroled") background = "'background-color:#CD6500;'" if("Discharged") background = "'background-color:#006699;'" @@ -688,7 +688,7 @@ What a mess.*/ temp += "

    " if(!linkless) output += "\[Add note\]" @@ -296,16 +330,20 @@ search = "^[index]" var/datum/DBQuery/query_list_messages = SSdbcore.NewQuery("SELECT DISTINCT targetckey FROM [format_table_name("messages")] WHERE type <> 'memo' AND targetckey REGEXP '[search]' AND deleted = 0 ORDER BY targetckey") if(!query_list_messages.warn_execute()) + qdel(query_list_messages) return while(query_list_messages.NextRow()) + if(QDELETED(usr)) + return index_ckey = query_list_messages.item[1] output += "[index_ckey]
    " + qdel(query_list_messages) else if(!type && !target_ckey && !index) output += "
    \[Add message\]\[Add watchlist entry\]\[Add note\]
    " output += ruler usr << browse({"[jointext(output, "")]"}, "window=browse_messages;size=900x500") -proc/get_message_output(type, target_ckey) +/proc/get_message_output(type, target_ckey) if(!SSdbcore.Connect()) to_chat(usr, "Failed to establish database connection.") return @@ -319,6 +357,7 @@ proc/get_message_output(type, target_ckey) query += " AND targetckey = '[target_ckey]'" var/datum/DBQuery/query_get_message_output = SSdbcore.NewQuery(query) if(!query_get_message_output.warn_execute()) + qdel(query_get_message_output) return while(query_get_message_output.NextRow()) var/message_id = query_get_message_output.item[1] @@ -332,7 +371,10 @@ proc/get_message_output(type, target_ckey) output += "
    [text]
    " var/datum/DBQuery/query_message_read = SSdbcore.NewQuery("UPDATE [format_table_name("messages")] SET type = 'message sent' WHERE id = [message_id]") if(!query_message_read.warn_execute()) + qdel(query_get_message_output) + qdel(query_message_read) return + qdel(query_message_read) if("watchlist entry") message_admins("Notice: [key_name_admin(target_ckey)] has been on the watchlist since [timestamp] and has just connected - Reason: [text]") send2irc_adminless_only("Watchlist", "[key_name(target_ckey)] is on the watchlist and has just connected - Reason: [text]") @@ -341,6 +383,7 @@ proc/get_message_output(type, target_ckey) if(editor_ckey) output += "
    Last edit by [editor_ckey] (Click here to see edit log)" output += "
    [text]
    " + qdel(query_get_message_output) return output #define NOTESFILE "data/player_notes.sav" @@ -365,9 +408,11 @@ proc/get_message_output(type, target_ckey) var/admin_ckey = note.group[3] var/datum/DBQuery/query_convert_time = SSdbcore.NewQuery("SELECT ADDTIME(STR_TO_DATE('[timestamp]','%d-%b-%Y'), '0')") if(!query_convert_time.Execute()) + qdel(query_convert_time) return if(query_convert_time.NextRow()) timestamp = query_convert_time.item[1] + qdel(query_convert_time) if(ckey && notetext && timestamp && admin_ckey && server) create_message("note", ckey, admin_ckey, notetext, timestamp, server, 1, 0) notesfile.cd = "/" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index d5349c3e2f..7cba469019 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -74,7 +74,7 @@ message_admins("[key_name_admin(usr)] tried to create traitors. Unfortunately, there were no candidates available.") log_admin("[key_name(usr)] failed to create traitors.") if("changelings") - if(src.makeChanglings()) + if(src.makeChangelings()) message_admins("[key_name(usr)] created changelings.") log_admin("[key_name(usr)] created changelings.") else @@ -447,6 +447,8 @@ if("Yes") delmob = 1 + log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]].; deletemob=[delmob]") + message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]].; deletemob=[delmob]") switch(href_list["simplemake"]) if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob ) @@ -499,8 +501,6 @@ M.change_mob_type( /mob/living/simple_animal/hostile/construct/wraith , null, null, delmob ) if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob ) - log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]].; deletemob=[delmob]") - message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]].; deletemob=[delmob]") /////////////////////////////////////new ban stuff @@ -1200,10 +1200,13 @@ var/message_id = sanitizeSQL("[href_list["messageedits"]]") var/datum/DBQuery/query_get_message_edits = SSdbcore.NewQuery("SELECT edits FROM [format_table_name("messages")] WHERE id = '[message_id]'") if(!query_get_message_edits.warn_execute()) + qdel(query_get_message_edits) return if(query_get_message_edits.NextRow()) var/edit_log = query_get_message_edits.item[1] - usr << browse(edit_log,"window=noteedits") + if(!QDELETED(usr)) + usr << browse(edit_log,"window=noteedits") + qdel(query_get_message_edits) else if(href_list["newban"]) if(!check_rights(R_BAN)) @@ -1822,18 +1825,7 @@ usr.client.smite(H) else if(href_list["CentComReply"]) - var/mob/living/carbon/human/H = locate(href_list["CentComReply"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return - if(!istype(H.ears, /obj/item/radio/headset)) - to_chat(usr, "The person you are trying to contact is not wearing a headset.") - return - - message_admins("[src.owner] has started answering [key_name(H)]'s CentCom request.") - var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from CentCom", "") - if(!input) - message_admins("[src.owner] decided not to answer [key_name(H)]'s CentCom request.") + if(!check_rights(R_ADMIN)) return var/mob/M = locate(href_list["CentComReply"]) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index f385cdc1bd..bef39c29ca 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -256,7 +256,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) /datum/admin_help/proc/MessageNoRecipient(msg) var/ref_src = "[REF(src)]" //Message to be sent to all admins - var/admin_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [keywords_lookup(msg)]" + var/admin_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [keywords_lookup(msg)]" AddInteraction("[LinkedReplyName(ref_src)]: [msg]") @@ -268,7 +268,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) to_chat(X, admin_msg) //show it to the person adminhelping too - to_chat(initiator, "PM to-Admins: [msg]") + to_chat(initiator, "PM to-Admins: [msg]") //Reopen a closed ticket /datum/admin_help/proc/Reopen() diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 179595866f..4d72f0a8e2 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -145,15 +145,15 @@ var/keywordparsedmsg = keywords_lookup(msg) if(irc) - to_chat(src, "PM to-Admins: [rawmsg]") + to_chat(src, "PM to-Admins: [rawmsg]") var/datum/admin_help/AH = admin_ticket_log(src, "Reply PM from-[key_name(src, TRUE, TRUE)] to IRC: [keywordparsedmsg]") ircreplyamount-- send2irc("[AH ? "#[AH.id] " : ""]Reply: [ckey]", rawmsg) else if(recipient.holder) if(holder) //both are admins - to_chat(recipient, "Admin PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]") - to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [keywordparsedmsg]") + to_chat(recipient, "Admin PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]") + to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [keywordparsedmsg]") //omg this is dumb, just fill in both their tickets var/interaction_message = "PM from-[key_name(src, recipient, 1)] to-[key_name(recipient, src, 1)]: [keywordparsedmsg]" @@ -162,12 +162,12 @@ admin_ticket_log(recipient, interaction_message) else //recipient is an admin but sender is not - var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]" + var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]" admin_ticket_log(src, replymsg) to_chat(recipient, replymsg) - to_chat(src, "PM to-Admins: [msg]") + to_chat(src, "PM to-Admins: [msg]") - //play the recieving admin the adminhelp sound (if they have them enabled) + //play the receiving admin the adminhelp sound (if they have them enabled) if(recipient.prefs.toggles & SOUND_ADMINHELP) SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg')) @@ -177,9 +177,9 @@ new /datum/admin_help(msg, recipient, TRUE) to_chat(recipient, "-- Administrator private message --") - to_chat(recipient, "Admin PM from-[key_name(src, recipient, 0)]: [msg]") + to_chat(recipient, "Admin PM from-[key_name(src, recipient, 0)]: [msg]") to_chat(recipient, "Click on the administrator's name to reply.") - to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [msg]") + to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [msg]") admin_ticket_log(recipient, "PM From [key_name_admin(src)]: [keywordparsedmsg]") diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 82bbc27abc..bf39288511 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -12,10 +12,10 @@ log_talk(mob,"[key_name(src)] : [msg]",LOGASAY) msg = keywords_lookup(msg) if(check_rights(R_ADMIN,0)) - msg = "ADMIN: [key_name(usr, 1)] [ADMIN_FLW(mob)]: [msg]" + msg = "ADMIN: [key_name(usr, 1)] [ADMIN_FLW(mob)]: [msg]" to_chat(GLOB.admins, msg) else - msg = "ADMIN: [key_name(usr, 1)] [ADMIN_FLW(mob)]: [msg]" + msg = "ADMIN: [key_name(usr, 1)] [ADMIN_FLW(mob)]: [msg]" to_chat(GLOB.admins, msg) SSblackbox.record_feedback("tally", "admin_verb", 1, "Asay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/manipulate_organs.dm b/code/modules/admin/verbs/manipulate_organs.dm index 4d1de50e47..a3b7e4247c 100644 --- a/code/modules/admin/verbs/manipulate_organs.dm +++ b/code/modules/admin/verbs/manipulate_organs.dm @@ -1,7 +1,9 @@ /client/proc/manipulate_organs(mob/living/carbon/C in world) set name = "Manipulate Organs" set category = "Debug" - var/operation = input("Select organ operation.", "Organ Manipulation", "cancel") in list("add organ", "add implant", "drop organ/implant", "remove organ/implant", "cancel") + var/operation = input("Select organ operation.", "Organ Manipulation", "cancel") as null|anything in list("add organ", "add implant", "drop organ/implant", "remove organ/implant", "cancel") + if (!operation) + return var/list/organs = list() switch(operation) @@ -10,7 +12,9 @@ var/dat = replacetext("[path]", "/obj/item/organ/", ":") organs[dat] = path - var/obj/item/organ/organ = input("Select organ type:", "Organ Manipulation", null) in organs + var/obj/item/organ/organ = input("Select organ type:", "Organ Manipulation", null) as null|anything in organs + if(!organ) + return organ = organs[organ] organ = new organ organ.Insert(C) @@ -22,7 +26,9 @@ var/dat = replacetext("[path]", "/obj/item/implant/", ":") organs[dat] = path - var/obj/item/implant/organ = input("Select implant type:", "Organ Manipulation", null) in organs + var/obj/item/implant/organ = input("Select implant type:", "Organ Manipulation", null) as null|anything in organs + if(!organ) + return organ = organs[organ] organ = new organ organ.implant(C) @@ -38,7 +44,9 @@ var/obj/item/implant/I = X organs["[I.name] ([I.type])"] = I - var/obj/item/organ = input("Select organ/implant:", "Organ Manipulation", null) in organs + var/obj/item/organ = input("Select organ/implant:", "Organ Manipulation", null) as null|anything in organs + if(!organ) + return organ = organs[organ] if(!organ) return diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index daa1ce473a..190ddd7e63 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -76,7 +76,7 @@ return 0 -/datum/admins/proc/makeChanglings() +/datum/admins/proc/makeChangelings() var/datum/game_mode/changeling/temp = new if(CONFIG_GET(flag/protect_roles_from_antagonist)) @@ -95,11 +95,11 @@ candidates += applicant if(candidates.len) - var/numChanglings = min(candidates.len, 3) + var/numChangelings = min(candidates.len, 3) - for(var/i = 0, i[ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg]" + msg = "[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg]" for(var/client/C in GLOB.admins) if(C.prefs.chat_toggles & CHAT_PRAYER) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 1e7d3303d6..50281d54b4 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist/proc/is_banned(mob/M) if(!M) return FALSE - . = (jobban_isbanned(M, ROLE_SYNDICATE) || (job_rank && jobban_isbanned(M,job_rank))) + . = (jobban_isbanned(M, ROLE_SYNDICATE) || QDELETED(M) || (job_rank && (jobban_isbanned(M,job_rank) || QDELETED(M)))) /datum/antagonist/proc/replace_banned_player() set waitfor = FALSE @@ -110,12 +110,12 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist/proc/give_antag_moodies() if(!antag_moodlet) return - owner.current.SendSignal(COMSIG_ADD_MOOD_EVENT, "antag_moodlet", antag_moodlet) + SEND_SIGNAL(owner.current, COMSIG_ADD_MOOD_EVENT, "antag_moodlet", antag_moodlet) /datum/antagonist/proc/clear_antag_moodies() if(!antag_moodlet) return - owner.current.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "antag_moodlet") + SEND_SIGNAL(owner.current, COMSIG_CLEAR_MOOD_EVENT, "antag_moodlet") //Returns the team antagonist belongs to if any. /datum/antagonist/proc/get_team() diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 0a000c4bf0..ca87b94d5b 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -58,6 +58,8 @@ return var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src) if(LAZYLEN(candidates)) + if(QDELETED(src)) + return if(used) to_chat(H, "You already used this contract!") return @@ -121,7 +123,7 @@ to_chat(user, "You activate [src] and wait for confirmation.") var/list/nuke_candidates = pollGhostCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE) if(LAZYLEN(nuke_candidates)) - if(!(check_usability(user))) + if(QDELETED(src) || !check_usability(user)) return used = TRUE var/mob/dead/observer/G = pick(nuke_candidates) @@ -235,7 +237,7 @@ return var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src) if(LAZYLEN(candidates)) - if(used) + if(used || QDELETED(src)) return used = TRUE var/mob/dead/observer/C = pick(candidates) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index e7cdb4d00c..f19521e821 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -30,9 +30,9 @@ var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90) /obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop() - flags_1 ^= NODROP_1 + item_flags ^= NODROP if(ismob(loc)) - to_chat(loc, "Your vest is now [flags_1 & NODROP_1 ? "locked" : "unlocked"].") + to_chat(loc, "Your vest is now [item_flags & NODROP ? "locked" : "unlocked"].") /obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() switch(mode) @@ -589,9 +589,10 @@ Congratulations! You are now trained for invasive xenobiology research!"} righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' breakouttime = 450 trashtype = /obj/item/restraints/handcuffs/energy/used + flags_1 = NONE /obj/item/restraints/handcuffs/energy/used - flags_1 = DROPDEL_1 + item_flags = DROPDEL /obj/item/restraints/handcuffs/energy/used/dropped(mob/user) user.visible_message("[user]'s [name] breaks in a discharge of energy!", \ diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm index 8b8851ec18..e2b881d147 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm @@ -17,7 +17,7 @@ var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H if(V) console.AddVest(V) - V.flags_1 |= NODROP_1 + V.item_flags |= NODROP var/obj/item/storage/backpack/B = locate() in H if(B) diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm index 6bc8fc0d5d..a14b667069 100644 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ b/code/modules/antagonists/abductor/machinery/console.dm @@ -75,7 +75,7 @@ dat+="
    " dat += "Select Agent Vest Disguise
    " - dat += "[vest.flags_1 & NODROP_1 ? "Unlock" : "Lock"] Vest
    " + dat += "[vest.item_flags & NODROP ? "Unlock" : "Lock"] Vest
    " else dat += "NO AGENT VEST DETECTED" var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500) diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm index 9d31852d28..3483c3a557 100644 --- a/code/modules/antagonists/blob/blob/overmind.dm +++ b/code/modules/antagonists/blob/blob/overmind.dm @@ -123,7 +123,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) else L.fully_heal() - for(var/V in GLOB.sortedAreas) + for(var/V in GLOB.the_station_areas) var/area/A = V if(!A.blob_allowed) continue diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index a42ae6ef4f..ab6dd3607d 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -451,7 +451,7 @@ /datum/antagonist/changeling/proc/update_changeling_icons_added() var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING] hud.join_hud(owner.current) - set_antag_hud(owner.current, "changling") + set_antag_hud(owner.current, "changeling") /datum/antagonist/changeling/proc/update_changeling_icons_removed() var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING] diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 199bc6636b..a8bec72771 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -112,10 +112,3 @@ target.death(0) target.Drain() return TRUE - - - -//Absorbs the target DNA. -//datum/changeling/proc/absorb_dna(mob/living/carbon/T, mob/user) - -//datum/changeling/proc/store_dna(datum/dna/new_dna, mob/user) diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm index f48464700f..5ec5440a2b 100644 --- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm +++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm @@ -1,4 +1,4 @@ -//Augmented Eyesight: Gives you x-ray vision or protection from flashes. Also, high DNA cost because of how powerful it is. +//Augmented Eyesight: Gives you X-ray vision or protection from flashes. Also, high DNA cost because of how powerful it is. //Possible todo: make a custom message for directing a penlight/flashlight at the eyes - not sure what would display though. /obj/effect/proc_holder/changeling/augmented_eyesight @@ -41,7 +41,7 @@ return 1 -/obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) //Get rid of x-ray vision and flash protection when the user refunds this ability +/obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) //Get rid of X-ray vision and flash protection when the user refunds this ability var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if(E) if (active) diff --git a/code/modules/antagonists/changeling/powers/digitalcamo.dm b/code/modules/antagonists/changeling/powers/digitalcamo.dm index afb4e0bef7..68a1fa4add 100644 --- a/code/modules/antagonists/changeling/powers/digitalcamo.dm +++ b/code/modules/antagonists/changeling/powers/digitalcamo.dm @@ -1,6 +1,6 @@ /obj/effect/proc_holder/changeling/digitalcamo name = "Digital Camouflage" - desc = "By evolving the ability to distort our form and proprotions, we defeat common altgorithms used to detect lifeforms on cameras." + desc = "By evolving the ability to distort our form and proportions, we defeat common algorithms used to detect lifeforms on cameras." helptext = "We cannot be tracked by camera or seen by AI units while using this skill. However, humans looking at us will find us... uncanny." dna_cost = 1 diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index dbc8446fca..08fe6bd0ce 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -29,7 +29,7 @@ /obj/effect/proc_holder/changeling/weapon/proc/check_weapon(mob/user, obj/item/hand_item) if(istype(hand_item, weapon_type)) - user.temporarilyRemoveItemFromInventory(hand_item, TRUE) //DROPDEL_1 will delete the item + user.temporarilyRemoveItemFromInventory(hand_item, TRUE) //DROPDEL will delete the item if(!silent) playsound(user, 'sound/effects/blobattack.ogg', 30, 1) user.visible_message("With a sickening crunch, [user] reforms [user.p_their()] [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "We search for the scent of any nearby changelings.") + changeling.chem_recharge_slowdown += 0.5 + user.apply_status_effect(/datum/status_effect/agent_pinpointer/changeling) + else + to_chat(user, "We stop searching for now.") + changeling.chem_recharge_slowdown -= 0.5 + user.remove_status_effect(/datum/status_effect/agent_pinpointer/changeling) + + receptors_active = !receptors_active + +//Modified IA pinpointer - Points to the NEAREST changeling, but will only get you within a few tiles of the target. +//You'll still have to rely on intuition and observation to make the identification. Lings can 'hide' in public places. +/datum/status_effect/agent_pinpointer/changeling + alert_type = /obj/screen/alert/status_effect/agent_pinpointer/changeling + minimum_range = CHANGELING_PHEROMONE_MIN_DISTANCE + tick_interval = CHANGELING_PHEROMONE_PING_TIME + range_fuzz_factor = 0 + +/datum/status_effect/agent_pinpointer/changeling/scan_for_target() + var/turf/my_loc = get_turf(owner) + + var/list/mob/living/carbon/changelings = list() + + for(var/mob/living/carbon/C in GLOB.alive_mob_list) + if(C != owner && C.mind) + var/datum/antagonist/changeling/antag_datum = C.mind.has_antag_datum(/datum/antagonist/changeling) + if(istype(antag_datum)) + var/their_loc = get_turf(C) + var/distance = get_dist_euclidian(my_loc, their_loc) + if (distance < CHANGELING_PHEROMONE_MAX_DISTANCE) + changelings[C] = (CHANGELING_PHEROMONE_MAX_DISTANCE ** 2) - (distance ** 2) + + if(changelings.len) + scan_target = pickweight(changelings) //Point at a 'random' changeling, biasing heavily towards closer ones. + else + scan_target = null + + +/obj/screen/alert/status_effect/agent_pinpointer/changeling + name = "Pheromone Scent" + desc = "The nose always knows." \ No newline at end of file diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 1d0a4cf143..a801c87ac2 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -134,7 +134,7 @@ return 1 /obj/effect/proc_holder/changeling/sting/false_armblade/sting_action(mob/user, mob/target) - add_logs(user, target, "stung", object="falso armblade sting") + add_logs(user, target, "stung", object="false armblade sting") var/obj/item/held = target.get_active_held_item() if(held && !target.dropItemToGround(held)) diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index 2929b5743e..1e2b22cdae 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -8,7 +8,7 @@ /obj/item/clothing/glasses/changeling name = "flesh" - flags_1 = NODROP_1 + item_flags = NODROP //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/glasses/changeling/attack_hand(mob/user) @@ -20,7 +20,7 @@ /obj/item/clothing/under/changeling name = "flesh" - flags_1 = NODROP_1 + item_flags = NODROP //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/under/changeling/attack_hand(mob/user) @@ -32,7 +32,7 @@ /obj/item/clothing/suit/changeling name = "flesh" - flags_1 = NODROP_1 + item_flags = NODROP allowed = list(/obj/item/changeling) //ATTACK HAND IGNORING PARENT RETURN VALUE @@ -45,7 +45,7 @@ /obj/item/clothing/head/changeling name = "flesh" - flags_1 = NODROP_1 + item_flags = NODROP //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/head/changeling/attack_hand(mob/user) @@ -57,7 +57,7 @@ /obj/item/clothing/shoes/changeling name = "flesh" - flags_1 = NODROP_1 + item_flags = NODROP //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/shoes/changeling/attack_hand(mob/user) @@ -69,7 +69,7 @@ /obj/item/clothing/gloves/changeling name = "flesh" - flags_1 = NODROP_1 + item_flags = NODROP //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/gloves/changeling/attack_hand(mob/user) @@ -81,7 +81,7 @@ /obj/item/clothing/mask/changeling name = "flesh" - flags_1 = NODROP_1 + item_flags = NODROP //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/mask/changeling/attack_hand(mob/user) @@ -93,7 +93,7 @@ /obj/item/changeling name = "flesh" - flags_1 = NODROP_1 + item_flags = NODROP slot_flags = ALL allowed = list(/obj/item/changeling) diff --git a/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm b/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm index b32345fa69..bd986bac25 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm @@ -254,8 +254,8 @@ var/list/repair_values = list() if(!fabricator.fabricator_repair_checks(repair_values, src, user)) return - user.visible_message("[user]'s [fabricator.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...", \ - "You start repairin[src == user ? "g yourself" : "g [src]"]...") + user.visible_message("[user]'s [fabricator.name] starts covering [src == user ? "[user.p_them()]" : "[src]"] in glowing orange energy...", \ + "You start repairing [src == user ? "yourself" : "[src]"]...") fabricator.repairing = src while(fabricator && user && src) if(!do_after(user, repair_values["healing_for_cycle"] * fabricator.speed_multiplier, target = src, \ @@ -283,7 +283,7 @@ if(health == maxHealth) //if we're at maximum health, replace the turf under us return FALSE else if(fabricator_heal(user, fabricator) && user) - user.visible_message("[user]'s [fabricator.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.", \ + user.visible_message("[user]'s [fabricator.name] stops covering [src == user ? "[user.p_them()]" : "[src]"] with glowing orange energy.", \ "You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_theyre(TRUE)]"] now at [abs(HEALTH_THRESHOLD_DEAD - health)]/[abs(HEALTH_THRESHOLD_DEAD - maxHealth)] health.") //Same with clockwork mobs. @@ -292,7 +292,7 @@ if(health == maxHealth) //if we're at maximum health, replace the turf under us return FALSE else if(fabricator_heal(user, fabricator) && user) - user.visible_message("[user]'s [fabricator.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.", \ + user.visible_message("[user]'s [fabricator.name] stops covering [src == user ? "[user.p_them()]" : "[src]"] with glowing orange energy.", \ "You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_theyre(TRUE)]"] now at [health]/[maxHealth] health.") //Cogscarabs get special interaction because they're drones and have innate self-heals/revives. @@ -304,13 +304,13 @@ if(health == maxHealth) return FALSE else if(!(flags_1 & GODMODE)) - user.visible_message("[user]'s [fabricator.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...", \ - "You start repairin[src == user ? "g yourself" : "g [src]"]...") + user.visible_message("[user]'s [fabricator.name] starts covering [src == user ? "[user.p_them()]" : "[src]"] in glowing orange energy...", \ + "You start repairing [src == user ? "yourself" : "[src]"]...") fabricator.repairing = src if(do_after(user, (maxHealth - health)*2, target=src)) adjustHealth(-maxHealth) - user.visible_message("[user]'s [fabricator.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.", \ - "You finish repairin[src == user ? "g yourself" : "g [src]"].") + user.visible_message("[user]'s [fabricator.name] stops covering [src == user ? "[user.p_them()]" : "[src]"] with glowing orange energy.", \ + "You finish repairing [src == user ? "yourself" : "[src]"].") if(fabricator) fabricator.repairing = null diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm index d39656c8d8..aaeb871e5d 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm @@ -67,7 +67,7 @@ name = "replicant manacles" desc = "Heavy manacles made out of freezing-cold metal. It looks like brass, but feels much more solid." icon_state = "brass_manacles" - flags_1 = DROPDEL_1 + item_flags = DROPDEL /obj/item/restraints/handcuffs/clockwork/dropped(mob/user) user.visible_message("[user]'s [name] come apart at the seams!", \ diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm index d32eeee84b..8ed8edae8a 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm @@ -106,13 +106,13 @@ if(slot == SLOT_WEAR_SUIT && !is_servant_of_ratvar(user)) if(!iscultist(user)) to_chat(user, "\"Now now, this is for my servants, not you.\"") - user.visible_message("As [user] puts [src] on, it flickers off [user.p_their()] body!", "The curiass flickers off your body, leaving only nausea!") + user.visible_message("As [user] puts [src] on, it flickers off [user.p_their()] body!", "The cuirass flickers off your body, leaving only nausea!") if(iscarbon(user)) var/mob/living/carbon/C = user C.vomit(20) else to_chat(user, "\"I think this armor is too hot for you to handle.\"") - to_chat(user, "The curiass emits a burst of flame as you scramble to get it off!") + to_chat(user, "The cuirass emits a burst of flame as you scramble to get it off!") user.emote("scream") user.apply_damage(15, BURN, BODY_ZONE_CHEST) user.adjust_fire_stacks(2) diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index c464656150..1cdc05a07a 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -278,7 +278,7 @@ dat += "Items
    " dat += "Slab: A clockwork slab, a Servant's most important tool. You're holding one! Keep it safe and hidden.
    " dat += "Visor: A judicial visor, which is a pair of glasses that can smite an area for a brief stun and delayed explosion.
    " - dat += "Wraith Specs: Wraith spectacles, which provide true sight (x-ray, night vision) but damage the wearer's eyes.
    " + dat += "Wraith Specs: Wraith spectacles, which provide true sight (X-ray, night vision) but damage the wearer's eyes.
    " dat += "Spear: A Ratvarian spear, which is a very powerful melee weapon that produces Vitality.
    " dat += "Fabricator: A replica fabricator, which converts objects into clockwork versions.

    " dat += "Constructs
    " diff --git a/code/modules/antagonists/clockcult/clock_items/integration_cog.dm b/code/modules/antagonists/clockcult/clock_items/integration_cog.dm index 4e4aff5569..0ce70336fe 100644 --- a/code/modules/antagonists/clockcult/clock_items/integration_cog.dm +++ b/code/modules/antagonists/clockcult/clock_items/integration_cog.dm @@ -9,7 +9,7 @@ Siphons 5 W of power per second while in an APC." icon_state = "wall_gear" w_class = WEIGHT_CLASS_TINY - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON var/obj/machinery/power/apc/apc /obj/item/clockwork/integration_cog/Initialize() diff --git a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm index c89a04c932..741b251a4f 100644 --- a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm +++ b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm @@ -8,7 +8,7 @@ righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL force = 5 - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON var/speed_multiplier = 1 //The speed ratio the fabricator operates at var/uses_power = TRUE var/repairing = null //what we're currently repairing, if anything diff --git a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm index dab12dc304..6fda25a1b5 100644 --- a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm +++ b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm @@ -1,4 +1,4 @@ -//Wraith spectacles: Grants x-ray and night vision at the eventual cost of the wearer's sight if worn too long. Nar-Sian cultists are instantly blinded. +//Wraith spectacles: Grants X-ray and night vision at the eventual cost of the wearer's sight if worn too long. Nar-Sian cultists are instantly blinded. /obj/item/clothing/glasses/wraith_spectacles name = "antique spectacles" desc = "Unnerving glasses with opaque yellow lenses." diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm index ad4062598e..e78a6e4623 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm @@ -29,7 +29,7 @@ descname = "Trap, Stunning" name = "Sigil of Transgression" desc = "Wards a tile with a sigil, which will briefly stun the next non-Servant to cross it and apply Belligerent to them." - invocations = list("Divinity, smite...", "...those who tresspass here!") + invocations = list("Divinity, smite...", "...those who trespass here!") channel_time = 50 power_cost = 50 whispered = TRUE diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 5459e4c45e..847b49c354 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -339,7 +339,8 @@ icon = 'icons/obj/items_and_weapons.dmi' icon_state = "disintegrate" item_state = null - flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1 + item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL + w_class = WEIGHT_CLASS_HUGE throwforce = 0 throw_range = 0 @@ -519,7 +520,7 @@ name = "shadow shackles" desc = "Shackles that bind the wrists with sinister magic." trashtype = /obj/item/restraints/handcuffs/energy/used - flags_1 = DROPDEL_1 + item_flags = DROPDEL /obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user) user.visible_message("[user]'s shackles shatter in a discharge of dark magic!", \ @@ -541,7 +542,7 @@ var/obj/item/stack/sheet/candidate = target if(candidate.use(50)) uses-- - to_chat(user, "A dark cloud eminates from your hand and swirls around the metal, twisting it into a construct shell!") + to_chat(user, "A dark cloud emanates from your hand and swirls around the metal, twisting it into a construct shell!") new /obj/structure/constructshell(T) SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) else @@ -552,12 +553,12 @@ if(candidate.use(quantity)) uses -- new /obj/item/stack/sheet/runed_metal(T,quantity) - to_chat(user, "A dark cloud eminates from you hand and swirls around the plasteel, transforming it into runed metal!") + to_chat(user, "A dark cloud emanates from you hand and swirls around the plasteel, transforming it into runed metal!") SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) else if(istype(target,/mob/living/silicon/robot)) var/mob/living/silicon/robot/candidate = target if(candidate.mmi) - user.visible_message("A dark cloud eminates from [user]'s hand and swirls around [candidate]!") + user.visible_message("A dark cloud emanates from [user]'s hand and swirls around [candidate]!") playsound(T, 'sound/machines/airlock_alien_prying.ogg', 80, 1) var/prev_color = candidate.color candidate.color = "black" @@ -580,7 +581,7 @@ candidate.color = prev_color else uses-- - to_chat(user, "A dark cloud eminates from you hand and swirls around [candidate] - twisting it into a construct shell!") + to_chat(user, "A dark cloud emanates from you hand and swirls around [candidate] - twisting it into a construct shell!") new /obj/structure/constructshell(T) SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) else if(istype(target,/obj/machinery/door/airlock)) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index f8a3d84576..8ea391d2ca 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -95,7 +95,7 @@ else to_chat(mob, "You have a [item_name] in your [where].") if(where == "backpack") - mob.back.SendSignal(COMSIG_TRY_STORAGE_SHOW, mob) + SEND_SIGNAL(mob.back, COMSIG_TRY_STORAGE_SHOW, mob) return TRUE /datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) @@ -228,7 +228,7 @@ target_candidates += player.mind if(target_candidates.len == 0) - message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.") + message_admins("Cult Sacrifice: Could not find unconvertible target, checking for convertible target.") for(var/mob/living/carbon/human/player in GLOB.player_list) if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD) target_candidates += player.mind @@ -248,7 +248,7 @@ objectives += sac_objective else - message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!") + message_admins("Cult Sacrifice: Could not find unconvertible or convertible target. WELP!") //SUMMON OBJECTIVE diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 7678cdcfb3..e1710dae96 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -64,7 +64,8 @@ /obj/item/melee/cultblade/ghost name = "eldritch sword" force = 19 //can't break normal airlocks - flags_1 = NODROP_1|DROPDEL_1 + item_flags = NEEDS_PERMIT | NODROP | DROPDEL + flags_1 = NONE /obj/item/melee/cultblade/pickup(mob/living/user) ..() @@ -301,7 +302,7 @@ item_state = "cult_hoodalt" /obj/item/clothing/head/culthood/alt/ghost - flags_1 = NODROP_1|DROPDEL_1 + item_flags = NODROP | DROPDEL /obj/item/clothing/suit/cultrobes/alt name = "cultist robes" @@ -310,7 +311,7 @@ item_state = "cultrobesalt" /obj/item/clothing/suit/cultrobes/alt/ghost - flags_1 = NODROP_1|DROPDEL_1 + item_flags = NODROP | DROPDEL /obj/item/clothing/head/magus @@ -333,7 +334,7 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT /obj/item/clothing/head/helmet/space/hardsuit/cult - name = "nar-sien hardened helmet" + name = "\improper Nar-Sien hardened helmet" desc = "A heavily-armored helmet worn by warriors of the Nar-Sien cult. It can withstand hard vacuum." icon_state = "cult_helmet" item_state = "cult_helmet" @@ -342,7 +343,7 @@ actions_types = list() /obj/item/clothing/suit/space/hardsuit/cult - name = "nar-sien hardened armor" + name = "\improper Nar-Sien hardened armor" icon_state = "cult_armor" item_state = "cult_armor" desc = "A heavily-armored exosuit worn by warriors of the Nar-Sien cult. It can withstand hard vacuum." @@ -754,7 +755,7 @@ guns_left = 24 mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood fire_sound = 'sound/magic/wand_teleport.ogg' - flags_1 = NOBLUDGEON_1 | DROPDEL_1 + item_flags = NEEDS_PERMIT | NOBLUDGEON | DROPDEL /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood @@ -792,7 +793,7 @@ icon = 'icons/obj/items_and_weapons.dmi' icon_state = "disintegrate" item_state = null - flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1 + item_flags = ABSTRACT | NODROP | DROPDEL w_class = WEIGHT_CLASS_HUGE throwforce = 0 throw_range = 0 diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 4f4cc6c751..df4715bc69 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -804,7 +804,7 @@ structure_check() searches for nearby cultist structures required for the invoca construct_invoke = FALSE color = RUNE_COLOR_DARKRED var/mob/living/affecting = null - var/ghost_limit = 4 + var/ghost_limit = 3 var/ghosts = 0 /obj/effect/rune/manifest/Initialize() @@ -834,10 +834,15 @@ structure_check() searches for nearby cultist structures required for the invoca if(A.map_name == "Space" || is_mining_level(T.z)) to_chat(user, "The veil is not weak enough here to manifest spirits, you must be on station!") return + if(ghosts >= ghost_limit) + to_chat(user, "You are sustaining too many ghosts to summon more!") + fail_invoke() + log_game("Manifest rune failed - too many summoned ghosts") + return list() notify_ghosts("Manifest rune invoked in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src) var/list/ghosts_on_rune = list() for(var/mob/dead/observer/O in T) - if(O.client && !jobban_isbanned(O, ROLE_CULTIST)) + if(O.client && !jobban_isbanned(O, ROLE_CULTIST) && !QDELETED(src) && !QDELETED(O)) ghosts_on_rune += O if(!ghosts_on_rune.len) to_chat(user, "There are no spirits near [src]!") @@ -852,11 +857,6 @@ structure_check() searches for nearby cultist structures required for the invoca new_human.apply_status_effect(STATUS_EFFECT_SUMMONEDGHOST) //ghosts can't summon more ghosts new_human.see_invisible = SEE_INVISIBLE_OBSERVER ghosts++ - if(ghosts >= ghost_limit) - to_chat(user, "You are sustaining too many ghosts to summon more!") - fail_invoke() - log_game("Manifest rune failed - too many summoned ghosts") - return list() playsound(src, 'sound/magic/exit_blood.ogg', 50, 1) visible_message("A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.") to_chat(user, "Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...") diff --git a/code/modules/antagonists/devil/imp/imp.dm b/code/modules/antagonists/devil/imp/imp.dm index 7752d0449f..da51a5d698 100644 --- a/code/modules/antagonists/devil/imp/imp.dm +++ b/code/modules/antagonists/devil/imp/imp.dm @@ -36,7 +36,7 @@ var/boost = 0 bloodcrawl = BLOODCRAWL_EAT var/list/consumed_mobs = list() - var/playstyle_string = "You are an imp, a mischevious creature from hell. You are the lowest rank on the hellish totem pole \ + var/playstyle_string = "You are an imp, a mischievous creature from hell. You are the lowest rank on the hellish totem pole \ Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \ of intentionally harming a fellow devil." diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index 72b945600b..4e1175c13e 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -67,7 +67,7 @@ //Left hand items for(var/obj/item/I in held_items) - if(!(I.flags_1 & ABSTRACT_1)) + if(!(I.item_flags & ABSTRACT)) msg += "It is holding [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n" //Braindead diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm index 9a792749a0..07cd3030b1 100644 --- a/code/modules/antagonists/disease/disease_abilities.dm +++ b/code/modules/antagonists/disease/disease_abilities.dm @@ -54,7 +54,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( stage_speed += initial(S.stage_speed) transmittable += initial(S.transmittable) threshold_block += "

    [initial(S.threshold_desc)]" - stat_block = "Resistance: [resistance]
    Stealth: [stealth]
    Stage Speed: [stage_speed]
    Transmittability: [transmittable]

    " + stat_block = "Resistance: [resistance]
    Stealth: [stealth]
    Stage Speed: [stage_speed]
    Transmissibility: [transmittable]

    " /datum/disease_ability/proc/CanBuy(mob/camera/disease/D) if(world.time < D.next_adaptation_time) @@ -130,14 +130,14 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( required_total_points = 0 start_with = TRUE short_desc = "Force the host you are following to cough, spreading your infection to those nearby." - long_desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmitability is low.
    Cooldown: 10 seconds" + long_desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmissibility is low.
    Cooldown: 10 seconds" /datum/action/cooldown/disease_cough name = "Cough" icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' button_icon_state = "cough" - desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmitability is low.
    Cooldown: 10 seconds" + desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmissibility is low.
    Cooldown: 10 seconds" cooldown_time = 100 /datum/action/cooldown/disease_cough/Trigger() @@ -148,7 +148,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( if(!L) return FALSE if(L.stat != CONSCIOUS) - to_chat(D, "Your host must be concious to cough.") + to_chat(D, "Your host must be conscious to cough.") return FALSE to_chat(D, "You force [L.real_name] to cough.") L.emote("cough") @@ -170,7 +170,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( name = "Sneeze" icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' button_icon_state = "sneeze" - desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host even if your transmitability is low.
    Cooldown: 20 seconds" + desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host even if your transmissibility is low.
    Cooldown: 20 seconds" cooldown_time = 200 /datum/action/cooldown/disease_sneeze/Trigger() @@ -181,7 +181,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( if(!L) return FALSE if(L.stat != CONSCIOUS) - to_chat(D, "Your host must be concious to sneeze.") + to_chat(D, "Your host must be conscious to sneeze.") return FALSE to_chat(D, "You force [L.real_name] to sneeze.") L.emote("sneeze") @@ -243,7 +243,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( cost = 2 required_total_points = 4 short_desc = "Cause victims to cough intermittently." - long_desc = "Cause victims to cough intermittently, spreading your infection if your transmitability is high." + long_desc = "Cause victims to cough intermittently, spreading your infection if your transmissibility is high." /datum/disease_ability/symptom/sneeze name = "Involuntary Sneezing" @@ -251,7 +251,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( cost = 2 required_total_points = 4 short_desc = "Cause victims to sneeze intermittently." - long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmitability and resistance, at the cost of stealth." + long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmissibility and resistance, at the cost of stealth." /datum/disease_ability/symptom/beard //I don't think I need to justify the fact that this is the best symptom @@ -277,7 +277,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( cost = 4 required_total_points = 8 short_desc = "Cause victims to choke." - long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmittability." + long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmissibility." /datum/disease_ability/symptom/confusion @@ -295,7 +295,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( cost = 4 required_total_points = 8 short_desc = "Cause victims to become eternally young." - long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmittability." + long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility." /datum/disease_ability/symptom/vomit @@ -304,7 +304,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( cost = 4 required_total_points = 8 short_desc = "Cause victims to vomit." - long_desc = "Cause victims to vomit. Slightly increases transmittability. Vomiting also also causes the victims to lose nutrition and removes some toxin damage." + long_desc = "Cause victims to vomit. Slightly increases transmissibility. Vomiting also also causes the victims to lose nutrition and removes some toxin damage." /datum/disease_ability/symptom/voice_change @@ -367,7 +367,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( cost = 4 required_total_points = 8 short_desc = "Cause victims to lose weight." - long_desc = "Cause victims to lose weight, and make it almost immpossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing." + long_desc = "Cause victims to lose weight, and make it almost impossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing." /datum/disease_ability/symptom/metabolism_heal diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index bf035e1f21..6908c5eebf 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -81,7 +81,7 @@ the new instance inside the host to be updated to the template's stats. /mob/camera/disease/Login() ..() if(freemove) - to_chat(src, "You have [round((freemove_end - world.time)/10)] seconds to select your first host. Click on a human to select your host.") + to_chat(src, "You have [DisplayTimeText(freemove_end - world.time)] to select your first host. Click on a human to select your host.") /mob/camera/disease/Stat() @@ -285,7 +285,7 @@ the new instance inside the host to be updated to the template's stats. ..() /mob/camera/disease/proc/adapt_cooldown() - to_chat(src, "You have altered your genetic structure. You will be unable to adapt again for [adaptation_cooldown/10] seconds.") + to_chat(src, "You have altered your genetic structure. You will be unable to adapt again for [DisplayTimeText(adaptation_cooldown)].") next_adaptation_time = world.time + adaptation_cooldown addtimer(CALLBACK(src, .proc/notify_adapt_ready), adaptation_cooldown) @@ -310,7 +310,7 @@ the new instance inside the host to be updated to the template's stats. Resistance: [DT.totalResistance()]
    \ Stealth: [DT.totalStealth()]
    \ Stage Speed: [DT.totalStageSpeed()]
    \ - Transmittability: [DT.totalTransmittable()]
    \ + Transmissibility: [DT.totalTransmittable()]
    \ Cure: [DT.cure_text]" dat += "

    Adaptations

    \ Points: [points] / [total_points]\ diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index 4e511d7fac..62da2df87f 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -59,7 +59,7 @@ W.access += get_all_centcom_access() W.assignment = "Highlander" W.registered_name = H.real_name - W.flags_1 |= NODROP_1 + W.item_flags |= NODROP W.update_label(H.real_name) H.equip_to_slot_or_del(W, SLOT_WEAR_ID) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index b3c5ae3b30..df04059f99 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -16,7 +16,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) Such a brazen move will attract the attention of powerful benefactors within the Syndicate, who will supply your team with a massive amount of bonus telecrystals. \ Must be used within five minutes, or your benefactors will lose interest." var/declaring_war = FALSE - var/uplink_type = /obj/item/radio/uplink/nuclear + var/uplink_type = /obj/item/uplink/nuclear /obj/item/nuclear_challenge/attack_self(mob/living/user) if(!check_allowed(user)) @@ -88,7 +88,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) return TRUE /obj/item/nuclear_challenge/clownops - uplink_type = /obj/item/radio/uplink/clownop + uplink_type = /obj/item/uplink/clownop #undef CHALLENGE_TELECRYSTALS #undef CHALLENGE_TIME_LIMIT diff --git a/code/modules/antagonists/nukeop/equipment/pinpointer.dm b/code/modules/antagonists/nukeop/equipment/pinpointer.dm index 1cdc356559..d8dc709975 100644 --- a/code/modules/antagonists/nukeop/equipment/pinpointer.dm +++ b/code/modules/antagonists/nukeop/equipment/pinpointer.dm @@ -52,7 +52,7 @@ /obj/item/pinpointer/nuke/proc/switch_mode_to(new_mode) if(isliving(loc)) var/mob/living/L = loc - to_chat(L, "Your [name] beeps as it reconfigures its tracking algorithms.") + to_chat(L, "Your [name] beeps as it reconfigures it's tracking algorithms.") playsound(L, 'sound/machines/triple_beep.ogg', 50, 1) mode = new_mode scan_for_target() @@ -65,7 +65,8 @@ /obj/item/pinpointer/syndicate_cyborg // Cyborg pinpointers just look for a random operative. name = "cyborg syndicate pinpointer" desc = "An integrated tracking device, jury-rigged to search for living Syndicate operatives." - flags_1 = NODROP_1 + item_flags = NODROP + flags_1 = NONE /obj/item/pinpointer/syndicate_cyborg/scan_for_target() target = null @@ -79,4 +80,3 @@ if(closest_operative) target = closest_operative ..() - diff --git a/code/modules/antagonists/official/official.dm b/code/modules/antagonists/official/official.dm index 4b867585ae..23bf472422 100644 --- a/code/modules/antagonists/official/official.dm +++ b/code/modules/antagonists/official/official.dm @@ -31,7 +31,7 @@ else if (!mission) var/datum/objective/missionobj = new missionobj.owner = owner - missionobj.explanation_text = "Conduct a routine preformance review of [station_name()] and its Captain." + missionobj.explanation_text = "Conduct a routine performance review of [station_name()] and its Captain." missionobj.completed = 1 mission = missionobj objectives |= mission diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm index e17d1a23b4..5213c679ca 100644 --- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm +++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm @@ -44,6 +44,7 @@ tick_interval = PINPOINTER_PING_TIME alert_type = /obj/screen/alert/status_effect/agent_pinpointer var/minimum_range = PINPOINTER_MINIMUM_RANGE + var/range_fuzz_factor = PINPOINTER_EXTRA_RANDOM_RANGE var/mob/scan_target = null /obj/screen/alert/status_effect/agent_pinpointer @@ -61,7 +62,7 @@ if(here.z != there.z) linked_alert.icon_state = "pinonnull" return - if(get_dist_euclidian(here,there)<=minimum_range + rand(0, PINPOINTER_EXTRA_RANDOM_RANGE)) + if(get_dist_euclidian(here,there)<=minimum_range + rand(0, range_fuzz_factor)) linked_alert.icon_state = "pinondirect" else linked_alert.setDir(get_dir(here, there)) @@ -228,14 +229,14 @@ /datum/antagonist/traitor/internal_affairs/forge_traitor_objectives() forge_iaa_objectives() - + var/objtype = traitor_kind == TRAITOR_HUMAN ? /datum/objective/escape : /datum/objective/survive var/datum/objective/escape_objective = new objtype escape_objective.owner = owner add_objective(escape_objective) /datum/antagonist/traitor/internal_affairs/proc/greet_iaa() - var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence") + var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "receiving bribes", "malpractice", "worship of prohibited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence") to_chat(owner.current, "You are the [special_role].") if(syndicate) diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index f574412b4c..ff4f7276bc 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -532,7 +532,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( if(!is_station_level(AA.z)) continue AA.obj_flags |= EMAGGED - to_chat(owner, "All air alarm safeties on the station have been overriden. Air alarms may now use the Flood environmental mode.") + to_chat(owner, "All air alarm safeties on the station have been overridden. Air alarms may now use the Flood environmental mode.") owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) @@ -625,7 +625,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( to_chat(ranged_ability_user, "You can only animate machines!") return if(!target.can_be_overridden() || is_type_in_typecache(target, GLOB.blacklisted_malf_machines)) - to_chat(ranged_ability_user, "That machine can't be overriden!") + to_chat(ranged_ability_user, "That machine can't be overridden!") return ranged_ability_user.playsound_local(ranged_ability_user, 'sound/misc/interference.ogg', 50, 0) attached_action.adjust_uses(-1) @@ -806,7 +806,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( desc = "[initial(desc)] There are [uses] reactivations remaining." -//Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them x-ray vision. +//Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them X-ray vision. /datum/AI_Module/large/upgrade_cameras module_name = "Upgrade Camera Network" mod_pick_name = "upgradecam" diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm index 7e1effbaff..31e69b32c2 100644 --- a/code/modules/antagonists/valentines/valentine.dm +++ b/code/modules/antagonists/valentines/valentine.dm @@ -16,8 +16,17 @@ /datum/antagonist/valentine/on_gain() forge_objectives() + if(isliving(owner)) + var/mob/living/L = owner + L.apply_status_effect(STATUS_EFFECT_INLOVE, date) . = ..() +/datum/antagonist/valentine/on_removal() + . = ..() + if(isliving(owner)) + var/mob/living/L = owner + L.remove_status_effect(STATUS_EFFECT_INLOVE) + /datum/antagonist/valentine/greet() to_chat(owner, "You're on a date with [date.name]! Protect [date.p_them()] at all costs. This takes priority over all other loyalties.") diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 5afd1ca3c3..415d1318cb 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -109,6 +109,10 @@ move() eat() return + +/obj/singularity/wizard/mapped/admin_investigate_setup() + return + /////////////////////////////////////////Scrying/////////////////// /obj/item/scrying @@ -205,7 +209,7 @@ for(var/obj/item/I in H) H.dropItemToGround(I) - var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionaire) + var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionnaire) H.equip_to_slot_or_del(new hat(H), SLOT_HEAD) H.equip_to_slot_or_del(new /obj/item/clothing/under/roman(H), SLOT_W_UNIFORM) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), SLOT_SHOES) diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 9a5f41baee..50bc4f54a4 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -9,7 +9,7 @@ desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefact's power." w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_BELT - var/usability = 0 + var/usability = FALSE var/old_shard = FALSE var/spent = FALSE @@ -23,7 +23,7 @@ whatever spark it once held long extinguished." /obj/item/soulstone/anybody - usability = 1 + usability = TRUE /obj/item/soulstone/anybody/chaplain name = "mysterious old shard" @@ -63,8 +63,9 @@ if(!ishuman(M))//If target is not a human. return ..() if(iscultist(M)) - to_chat(user, "\"Come now, do not capture your bretheren's soul.\"") - return + if(iscultist(user)) + to_chat(user, "\"Come now, do not capture your bretheren's soul.\"") + return add_logs(user, M, "captured [M.name]'s soul", src) transfer_soul("VICTIM", M, user) @@ -82,7 +83,7 @@ /obj/item/soulstone/proc/release_shades(mob/user) for(var/mob/living/simple_animal/shade/A in src) A.status_flags &= ~GODMODE - A.canmove = 1 + A.canmove = TRUE A.forceMove(get_turf(user)) A.cancel_camera() icon_state = "soulstone" @@ -128,15 +129,15 @@ switch(choice) if("FORCE") if(!iscarbon(target)) //TODO: Add sacrifice stoning for non-organics, just because you have no body doesnt mean you dont have a soul - return 0 + return FALSE if(contents.len) - return 0 + return FALSE var/mob/living/carbon/T = target if(T.client != null) for(var/obj/item/W in T) T.dropItemToGround(W) init_shade(T, user) - return 1 + return TRUE else to_chat(user, "Capture failed!: The soul has already fled its mortal frame. You attempt to bring it back...") return getCultGhost(T,user) @@ -149,7 +150,7 @@ to_chat(user, "\"This soul is mine. SACRIFICE THEM!\"") else to_chat(user, "The soulstone seems to reject this soul.") - return 0 + return FALSE if(contents.len) to_chat(user, "Capture failed!: The soulstone is full! Free an existing soul to make room.") else @@ -172,7 +173,7 @@ else T.forceMove(src) //put shade in stone T.status_flags |= GODMODE - T.canmove = 0 + T.canmove = FALSE T.health = T.maxHealth icon_state = "soulstone2" name = "soulstone: Shade of [T.real_name]" @@ -239,7 +240,7 @@ T.dust_animation() var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade(src) S.status_flags |= GODMODE //So they won't die inside the stone somehow - S.canmove = 0//Can't move out of the soul stone + S.canmove = FALSE//Can't move out of the soul stone S.name = "Shade of [T.real_name]" S.real_name = "Shade of [T.real_name]" S.key = T.key @@ -272,15 +273,15 @@ if(consenting_candidates.len) chosen_ghost = pick(consenting_candidates) if(!T) - return 0 + return FALSE if(!chosen_ghost) to_chat(U, "There were no spirits willing to become a shade.") - return 0 + return FALSE if(contents.len) //If they used the soulstone on someone else in the meantime - return 0 + return FALSE T.ckey = chosen_ghost.ckey for(var/obj/item/W in T) T.dropItemToGround(W) init_shade(T, U) qdel(T) - return 1 + return TRUE diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 3f94c65437..afefaa68c1 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -318,7 +318,7 @@ /datum/spellbook_entry/item/scryingorb name = "Scrying Orb" - desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision." + desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you X-ray vision." item_path = /obj/item/scrying category = "Defensive" @@ -409,7 +409,7 @@ /datum/spellbook_entry/item/battlemage name = "Battlemage Armour" - desc = "An ensorcelled suit of armour, protected by a powerful shield. The shield can completly negate sixteen attacks before being permanently depleted." + desc = "An ensorceled suit of armour, protected by a powerful shield. The shield can completely negate sixteen attacks before being permanently depleted." item_path = /obj/item/clothing/suit/space/hardsuit/shielded/wizard limit = 1 category = "Defensive" @@ -452,7 +452,7 @@ /datum/spellbook_entry/summon/ghosts name = "Summon Ghosts" - desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilties to frustrate you." + desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilities to frustrate you." cost = 0 /datum/spellbook_entry/summon/ghosts/IsAvailible() @@ -589,22 +589,22 @@ switch(category) if("Offensive") dat += "Spells and items geared towards debilitating and destroying.

    " - dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
    " + dat += "Items are not bound to you and can be stolen. Additionally they cannot typically be returned once purchased.
    " dat += "For spells: the number after the spell name is the cooldown time.
    " dat += "You can reduce this number by spending more points on the spell.
    " if("Defensive") - dat += "Spells and items geared towards improving your survivabilty or reducing foes' ability to attack.

    " - dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
    " + dat += "Spells and items geared towards improving your survivability or reducing foes' ability to attack.

    " + dat += "Items are not bound to you and can be stolen. Additionally they cannot typically be returned once purchased.
    " dat += "For spells: the number after the spell name is the cooldown time.
    " dat += "You can reduce this number by spending more points on the spell.
    " if("Mobility") dat += "Spells and items geared towards improving your ability to move. It is a good idea to take at least one.

    " - dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
    " + dat += "Items are not bound to you and can be stolen. Additionally they cannot typically be returned once purchased.
    " dat += "For spells: the number after the spell name is the cooldown time.
    " dat += "You can reduce this number by spending more points on the spell.
    " if("Assistance") - dat += "Spells and items geared towards bringing in outside forces to aid you or improving upon your other items and abilties.

    " - dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
    " + dat += "Spells and items geared towards bringing in outside forces to aid you or improving upon your other items and abilities.

    " + dat += "Items are not bound to you and can be stolen. Additionally they cannot typically be returned once purchased.
    " dat += "For spells: the number after the spell name is the cooldown time.
    " dat += "You can reduce this number by spending more points on the spell.
    " if("Challenges") diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index ececaf683f..b5a7c5d3c5 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -161,7 +161,7 @@ AOE_flash() burn_out() -/obj/item/assembly/flash/activate()//AOE flash on signal recieved +/obj/item/assembly/flash/activate()//AOE flash on signal received if(!..()) return AOE_flash() @@ -210,7 +210,7 @@ /obj/item/assembly/flash/armimplant name = "photon projector" - desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocals fix the flashbulb if it ever burns out." + desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocols fix the flashbulb if it ever burns out." var/flashcd = 20 var/overheat = 0 var/obj/item/organ/cyberimp/arm/flash/I = null diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 2aae7db5e2..1f62bfaaef 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -26,7 +26,7 @@ return FALSE//Cooldown check var/turf/location = get_turf(loc) if(location) - location.hotspot_expose(1000,1000) + location.hotspot_expose(700,10) sparks.start() return TRUE diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index fe6e94605b..94359f0a10 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -171,6 +171,10 @@ return if(offender == src || istype(offender,/obj/effect/beam/i_beam)) return + if (offender && isitem(offender)) + var/obj/item/I = offender + if (I.item_flags & ABSTRACT) + return return refreshBeam() /obj/item/assembly/infra/ui_interact(mob/user)//TODO: change this this to the wire control panel @@ -219,10 +223,13 @@ var/obj/item/assembly/infra/master anchored = TRUE density = FALSE - flags_1 = ABSTRACT_1 pass_flags = PASSTABLE|PASSGLASS|PASSGRILLE|LETPASSTHROW /obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj) - if(istype(AM, /obj/effect/beam) || (AM.flags_1 & ABSTRACT_1)) + if(istype(AM, /obj/effect/beam)) return + if (isitem(AM)) + var/obj/item/I = AM + if (I.item_flags & ABSTRACT) + return master.trigger_beam(AM, get_turf(src)) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 0a1394bf04..8959029b9b 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -24,7 +24,7 @@ return MANUAL_SUICIDE /obj/item/assembly/signaler/proc/manual_suicide(mob/living/carbon/user) - user.visible_message("[user]'s \the [src] recieves a signal, killing [user.p_them()] instantly!") + user.visible_message("[user]'s \the [src] receives a signal, killing [user.p_them()] instantly!") user.adjustOxyLoss(200)//it sends an electrical pulse to their heart, killing them. or something. user.death(0) @@ -158,21 +158,21 @@ Code: // Embedded signaller used in grenade construction. // It's necessary because the signaler doens't have an off state. // Generated during grenade construction. -Sayu -/obj/item/assembly/signaler/reciever +/obj/item/assembly/signaler/receiver var/on = FALSE -/obj/item/assembly/signaler/reciever/proc/toggle_safety() +/obj/item/assembly/signaler/receiver/proc/toggle_safety() on = !on -/obj/item/assembly/signaler/reciever/activate() +/obj/item/assembly/signaler/receiver/activate() toggle_safety() return TRUE -/obj/item/assembly/signaler/reciever/examine(mob/user) +/obj/item/assembly/signaler/receiver/examine(mob/user) ..() to_chat(user, "The radio receiver is [on?"on":"off"].") -/obj/item/assembly/signaler/reciever/receive_signal(datum/signal/signal) +/obj/item/assembly/signaler/receiver/receive_signal(datum/signal/signal) if(!on) return return ..(signal) diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index a3c9c68d55..ede69a6b22 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -42,6 +42,11 @@ active_hotspot.just_spawned = (current_cycle < SSair.times_fired) //remove just_spawned protection if no longer processing this cell SSair.add_to_active(src, 0) + else + var/datum/gas_mixture/heating = air_contents.remove_ratio(exposed_volume/air_contents.volume) + heating.temperature = exposed_temperature + heating.react() + assume_air(heating) return igniting //This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile @@ -231,7 +236,7 @@ else chance_of_deletion = 100 if(prob(chance_of_deletion)) - T.ScrapeAway() + T.Melt() else T.to_be_destroyed = FALSE T.max_fire_temperature_sustained = 0 @@ -256,4 +261,4 @@ . = ..() if(!isliving(loc)) return INITIALIZE_HINT_QDEL -#undef INSUFFICIENT \ No newline at end of file +#undef INSUFFICIENT diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index db489d04fe..104879b168 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -100,28 +100,38 @@ if (atmos_overlay_types) for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added - vars["vis_contents"] -= overlay + vis_contents -= overlay - if (new_overlay_types.len) + if (length(new_overlay_types)) if (atmos_overlay_types) - vars["vis_contents"] += new_overlay_types - atmos_overlay_types //don't add overlays that already exist + vis_contents += new_overlay_types - atmos_overlay_types //don't add overlays that already exist else - vars["vis_contents"] += new_overlay_types + vis_contents += new_overlay_types UNSETEMPTY(new_overlay_types) src.atmos_overlay_types = new_overlay_types /turf/open/proc/tile_graphic() - . = new /list + var/static/list/nonoverlaying_gases = typecache_of_gases_with_no_overlays() if(air) + . = new /list var/list/gases = air.gases for(var/id in gases) + if (nonoverlaying_gases[id]) + continue var/gas = gases[id] var/gas_meta = gas[GAS_META] var/gas_overlay = gas_meta[META_GAS_OVERLAY] if(gas_overlay && gas[MOLES] > gas_meta[META_GAS_MOLES_VISIBLE]) . += gas_overlay +/proc/typecache_of_gases_with_no_overlays() + . = list() + for (var/gastype in subtypesof(/datum/gas)) + var/datum/gas/gasvar = gastype + if (!initial(gasvar.gas_overlay)) + .[gastype] = TRUE + /////////////////////////////SIMULATION/////////////////////////////////// #define LAST_SHARE_CHECK \ diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 6e78256c87..f2bb51159c 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -285,8 +285,6 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) return 1 /datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) - if(!sharer) - return 0 var/list/cached_gases = gases var/list/sharer_gases = sharer.gases @@ -322,7 +320,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) if(delta > 0) heat_capacity_self_to_sharer += gas_heat_capacity else - heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative. saves a proc call. + heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative. gas[MOLES] -= delta sharergas[MOLES] += delta @@ -348,8 +346,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.1) // <10% change in sharer heat capacity temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT) - var/list/unique_gases = cached_gases ^ sharer_gases - if(unique_gases.len) //if all gases were present in both mixtures, we know that no gases are 0 + if(length(cached_gases ^ sharer_gases)) //if all gases were present in both mixtures, we know that no gases are 0 garbage_collect(cached_gases - sharer_gases) //any gases the sharer had, we are guaranteed to have. gases that it didn't have we are not. sharer.garbage_collect(sharer_gases - cached_gases) //the reverse is equally true sharer.after_share(src, atmos_adjacent_turfs) @@ -358,8 +355,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) TOTAL_MOLES(cached_gases,our_moles) var/their_moles TOTAL_MOLES(sharer_gases,their_moles) - var/delta_pressure = temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles) - return delta_pressure * R_IDEAL_GAS_EQUATION / volume + return (temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles)) * R_IDEAL_GAS_EQUATION / volume /datum/gas_mixture/after_share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) return diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 5bd8c548f7..67836746fa 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -88,7 +88,7 @@ /datum/gas_reaction/nobliumsupression priority = INFINITY - name = "Hyper-Noblium Reaction Supression" + name = "Hyper-Noblium Reaction Suppression" id = "nobstop" /datum/gas_reaction/nobliumsupression/init_reqs() @@ -402,13 +402,13 @@ var/pressure = air.return_pressure() var/old_heat_capacity = air.heat_capacity() - var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/tritium][MOLES],1))),cached_gases[/datum/gas/tritium][MOLES],cached_gases[/datum/gas/plasma][MOLES]/2) + var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/nitrous_oxide][MOLES],1))),cached_gases[/datum/gas/nitrous_oxide][MOLES],cached_gases[/datum/gas/plasma][MOLES]/2) var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED - if ((cached_gases[/datum/gas/tritium][MOLES] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma][MOLES] - (2*reaction_efficency) < 0)) //Shouldn't produce gas from nothing. + if ((cached_gases[/datum/gas/nitrous_oxide][MOLES] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma][MOLES] - (2*reaction_efficency) < 0)) //Shouldn't produce gas from nothing. return NO_REACTION ASSERT_GAS(/datum/gas/bz,air) cached_gases[/datum/gas/bz][MOLES] += reaction_efficency - cached_gases[/datum/gas/tritium][MOLES] -= reaction_efficency + cached_gases[/datum/gas/nitrous_oxide][MOLES] -= reaction_efficency cached_gases[/datum/gas/plasma][MOLES] -= 2*reaction_efficency @@ -422,6 +422,7 @@ priority = 5 name = "Stimulum formation" id = "stimformation" + /datum/gas_reaction/stimformation/init_reqs() min_requirements = list( /datum/gas/tritium = 30, diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index a737b3c688..879668e4d7 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -227,7 +227,7 @@ Acts like a normal vent, but has an input AND output. pressure_checks &= ~1 pump_direction = 0 - if("stabalize" in signal.data) + if("stabilize" in signal.data) pressure_checks |= 1 pump_direction = 1 diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 4fb1de3527..e7df188f70 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -27,7 +27,7 @@ Thus, the two variables affect pump operation are set in New(): construction_type = /obj/item/pipe/directional pipe_state = "pump" - + /obj/machinery/atmospherics/components/binary/pump/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -41,7 +41,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/pump/on on = TRUE icon_state = "pump_on_map" - + /obj/machinery/atmospherics/components/binary/pump/on/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -51,7 +51,7 @@ Thus, the two variables affect pump operation are set in New(): piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/components/binary/pump/Destroy() SSradio.remove_object(src,frequency) if(radio_connection) @@ -132,8 +132,8 @@ Thus, the two variables affect pump operation are set in New(): switch(action) if("power") on = !on - investigate_log("Pump, [src.name], was turned [on ? "on" : "off"] by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") + investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS) . = TRUE if("pressure") var/pressure = params["pressure"] diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm index fb6539828e..f22ac62106 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm @@ -13,7 +13,6 @@ It's like a regular ol' straight pipe, but you can turn it on and off. var/frequency = 0 var/id = null - var/open = FALSE var/valve_type = "m" //lets us have a nice, clean, OOP update_icon_nopipes() construction_type = /obj/item/pipe/binary diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 861821349c..ced4855b1a 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -341,7 +341,7 @@ pressure_checks &= ~EXT_BOUND pump_direction = SIPHONING - if("stabalize" in signal.data) + if("stabilize" in signal.data) pressure_checks |= EXT_BOUND pump_direction = RELEASING @@ -399,7 +399,7 @@ user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") welded = TRUE else - user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") + user.visible_message("[user] unwelded the vent.", "You unweld the vent.", "You hear welding.") welded = FALSE update_icon() pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index bc034ec506..cfaef38f6c 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -60,7 +60,7 @@ warning("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) Nearby: ([item.x], [item.y], [item.z])") pipenetwarnings -= 1 if(pipenetwarnings == 0) - warning("build_pipeline(): further messages about pipenets will be supressed") + warning("build_pipeline(): further messages about pipenets will be suppressed") members += item possible_expansions += item diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index c65fc0960e..56f5d63b0c 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -494,14 +494,14 @@ W.registered_name = H.real_name W.update_label(W.registered_name, W.assignment) - // The shielded hardsuit is already NODROP_1 + // The shielded hardsuit is already NODROP no_drops += H.get_item_by_slot(SLOT_GLOVES) no_drops += H.get_item_by_slot(SLOT_SHOES) no_drops += H.get_item_by_slot(SLOT_W_UNIFORM) no_drops += H.get_item_by_slot(SLOT_EARS) for(var/i in no_drops) var/obj/item/I = i - I.flags_1 |= NODROP_1 + I.item_flags |= NODROP /datum/outfit/ctf/instagib r_hand = /obj/item/gun/energy/laser/instakill diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 92704833ef..0ee182d9f8 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -37,6 +37,8 @@ if(jobban_isbanned(user, banType)) to_chat(user, "You are jobanned!") return + if(QDELETED(src) || QDELETED(user)) + return var/ghost_role = alert("Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No") if(ghost_role == "No" || !loc) return diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index b233235d81..57d8420fa8 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -58,7 +58,7 @@ /obj/item/paper/fluff/awaymissions/academy/grade/failure name = "Pyromancy Evaluation" - info = "Current Grade: F. Educator's Notes: No improvement shown despite multiple private lessons. Suggest additional tutilage." + info = "Current Grade: F. Educator's Notes: No improvement shown despite multiple private lessons. Suggest additional tutelage." /obj/singularity/academy diff --git a/code/modules/awaymissions/mission_code/caves.dm b/code/modules/awaymissions/mission_code/caves.dm index fd2f8f18af..fd2735678d 100644 --- a/code/modules/awaymissions/mission_code/caves.dm +++ b/code/modules/awaymissions/mission_code/caves.dm @@ -31,14 +31,14 @@ //caves papers /obj/item/paper/crumpled/awaymissions/caves/unsafe_area - info = "
    WARNING


    Majority of this area is consitered 'unsafe' past this point. Theres an outpost directly south of here where you can get your bearing and travel further down if needed. Traveling in groups is HIGHLY advised, the shit out there can be extremely deadly if you're alone.
    " + info = "
    WARNING


    Majority of this area is considered 'unsafe' past this point. Theres an outpost directly south of here where you can get your bearing and travel further down if needed. Traveling in groups is HIGHLY advised, the shit out there can be extremely deadly if you're alone.
    " /obj/item/paper/fluff/awaymissions/caves/omega name = "Subject Omega Notes" info = "
    Testing Notes


    Subject appears unresponsive to most interactions, refusing to move away from the corners or face any scientists. Subject appears to move between the two back corners every observation. A strange humming can be heard from inside the cell, appears to be originating from the subject itself, further testing is necessary to confirm or deny this.
    " /obj/item/paper/fluff/awaymissions/caves/magma - info = "
    Mining is hell down here, you can feel the heat of the magma no matter how thick the suit is. Conditions are barely managble as is, restless nights and horrid work conditions. The ore maybe rich down here, but we've already lost a few men to the faults shifting, god knows how much longer till it all just collapses down and consumes everyone with it.
    " + info = "
    Mining is hell down here, you can feel the heat of the magma no matter how thick the suit is. Conditions are barely manageable as is, restless nights and horrid work conditions. The ore maybe rich down here, but we've already lost a few men to the faults shifting, god knows how much longer till it all just collapses down and consumes everyone with it.
    " /obj/item/paper/fluff/awaymissions/caves/work_notice name = "work notice" @@ -48,7 +48,7 @@ name = "shipment notice" info = "
    We were suppose to get a shipment of these special laser rifles and a couple 'nades to help combat the wildlife down here, but its been weeks since we last heard from the caravan carrying the shit down here. At this point we can only assume they fell victim to one of the monster nests or the dumbasses managed to trip into the lava. So much for that shipment, I guess.
    " -/obj/item/paper/fluff/awaymissions/caves/saftey_notice +/obj/item/paper/fluff/awaymissions/caves/safety_notice name = "safety notice" info = "
    Some of the miners have gone to laying some mine traps among the lower levels of the mine to keep the monsters at bay. This probably isn't the smartest idea in a cavern like this but the boys seem to get a chuckle out of every distant blast they hear go off, so I guess it works
    " diff --git a/code/modules/awaymissions/mission_code/moonoutpost19.dm b/code/modules/awaymissions/mission_code/moonoutpost19.dm index 92d25bfee3..c0af9cd08c 100644 --- a/code/modules/awaymissions/mission_code/moonoutpost19.dm +++ b/code/modules/awaymissions/mission_code/moonoutpost19.dm @@ -44,7 +44,7 @@ /obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_social name = "Larva Xenomorph Social Interactions & Capturing Procedure" - info = "Researcher: Dr. Sakuma Sano
    Date: 04/06/2554

    Report:
    As expected, all that is left of the monkeys we sent in earlier is a group of xenomorph larvae. It is quite clear that the facehuggers are not selective in their hosts, and so far the gestation process has been shown to have a 100% success rate.

    The larvae themselves have been behaving very differently from the lone larva we first observed, and despite shying away from humans they are clearly comfortable with others of their kind. Our previous suspicions on larvae have been confirmed with their demonstration of playfulness: they are not nearly as aggressive or violent when young, before molting to adulthood.

    The majority of the play we observed involved a sort of hide-and-seek, and occasionally wrestling by tangling themselves and struggling out of it. While normally we would write these off as instinctual play for honing their skills when they molt, their growth period is so incredibly fast and they are still such adept killers that it would serve no practical purpose. The only explanation for this is perhaps to create bonds and friendships with each other, if that is even possible for such an incredibly hostile race. It may be that they are much more reasonable with each other than other life forms.

    It had become clear that now was the best time to extract a xenomorph for dissecting, as these were all still larvae and the queen was still attached to its ovipositor and would be immobile. With the approval of the research director, we sent in our medical robot that had been dubbed 'Head Surgeon' into the containment pen, dropping the shields for only a fraction of a second to allow it entry. The larvae were cautious, but the curiosity of one had him within grabbing range of our robot. It was brought out and quickly euthanized through lethal injection, courtesy of our mechanical doctor." + info = "Researcher: Dr. Sakuma Sano
    Date: 04/06/2554

    Report:
    As expected, all that is left of the monkeys we sent in earlier is a group of xenomorph larvae. It is quite clear that the facehuggers are not selective in their hosts, and so far the gestation process has been shown to have a 100% success rate.

    The larvae themselves have been behaving very differently from the lone larva we first observed, and despite shying away from humans they are clearly comfortable with others of their kind. Our previous suspicions on larvae have been confirmed with their demonstration of playfulness: they are not nearly as aggressive or violent when young, before molting to adulthood.

    The majority of the play we observed involved a sort of hide-and-seek, and occasionally wrestling by tangling themselves and struggling out of it. While normally we would write these off as instinctual play for honing their skills when they molt, their growth period is so incredibly fast and they are still such adept killers that it would serve no practical purpose. The only explanation for this is perhaps to create bonds and friendships with each other, if that is even possible for such an incredibly hostile race. It may be that they are much more reasonable with each other than other life forms.

    It had become clear that now was the best time to extract a xenomorph for dissecting, as these were all still larvae and the queen was still attached to its ovipositor and would be immobile. With the approval of the research director, we sent in our medical robot that had been dubbed 'Head Surgeon' into the containment pen, dropping the shields for only a fraction of a second to allow it entry. The larvae were cautious, but the curiosity of one had him within grabbing range of our robot. It was brought out and quickly euthanized through lethal injection, courtesy of our mechanical doctor." /obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_queen name = "Queen Xenomorph Physiology & Behavior Observation" @@ -65,7 +65,7 @@ /obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_hivemind name = "The Hivemind Hypothesis" info = "Researcher: Dr. Mark Douglas
    Date: 17/06/2554

    Report:
    Earlier today we have observed a new phenomenon with our subjects. While feeding them our last monkey subject and throwing out the box, the aliens merely looked at us instead of infecting the monkey right away. They looked to be collectively distressed as they would no longer be given hosts, where instead we would move to the next phase of the experiment. When I glanced at the gas tanks and piping leading to their cell, I looked back to see all of them were up against the glass, even the queen! It was as if they all understood what was going to happen, even though we knew only the queen had the cognitive capability to do so.

    The only explanation for this is a form of communication between the aliens, but we have seen no such action take place anywhere in the cell until now. We also know that regular drone and hunter xenomorphs have no personality or instinct to survive by themselves. Perhaps the queen has a direct link to them? A form of a commander or overseer that controls their every move? A hivemind?" - + /obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_behavior name = "A Preliminary Study of Alien Behavior" info = "Researcher: Dr. Sakuma Sano
    Date: 08/06/2554

    Report:
    The xenomorphs we have come to study here are a remarkable species. They are almost universally aggressive across all castes, showing no remorse or guilt or pause before or after acts of violence. They appear to be a species entirely designed to kill. Oddly enough, even their method of reproduction is a brutal two-for-one method of birthing a new xenomorph and killing its host.

    The lone xenomorph we studied only five days ago showed little sign of intelligence. Only a simple drone that flung itself at the safety glass and shields repeatedly and thankfully without success. Once the drone molted into a queen, it became much more calm and calculating, merely looking at us and waiting while building its nest. As the hive grew in size and in numbers, so too did the intelligence of the common hunter and drone. We are still researching how they can communicate with one another and the relationship between the different castes and the queen. We will continue to update our research as we learn more about the species." @@ -80,11 +80,11 @@ /obj/item/paper/fluff/awaymissions/moonoutpost19/research/evacuation name = "Evacuation Procedure" - info = "

    In The Event of Xenobiology Breach: Evacuate staff, Lock down Xenobiology, Notify on-site superiors and/or Central Command immediatly.



    Current Xenobiology Containment Level:Secure RUN

    " + info = "

    In The Event of Xenobiology Breach: Evacuate staff, Lock down Xenobiology, Notify on-site superiors and/or Central Command immediately.



    Current Xenobiology Containment Level:Secure RUN

    " /obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal name = "Personal Log" - info = "Log 1:
    We got our promised supply drop today. We were only meant to get it, what, a week ago? This bloody gateway keeps desyncing itself, and that means subsisting off recycled water and carb packs. No clue where the damn thing connects to on its off days, and HQ say we are 'not to touch it if it isn't linking to command.' We dumped off the assload of crates Jim filled, got our boxes of oxygen, food and drink, and closed the portal.

    Log 2:
    Damn thing is acting up again. Three days no contact this time. I thought I heard clanking noises from it yesterday. Jim is going on about the NT base or some shit. We've been over this before - They don't know we're here, that engineer was too drunk to recognise his suit, especially since I had it painted orange. He's starting to get annoying. We're safe.

    Log 3:
    Gateway synced itself up automatically today. I opened it for an instant to spy through it, got a glimpse of the inside of a transport container. Either HQ's redecorating or something, or there's more than two of these things." + info = "Log 1:
    We got our promised supply drop today. We were only meant to get it, what, a week ago? This bloody gateway keeps desyncing itself, and that means subsisting off recycled water and carb packs. No clue where the damn thing connects to on its off days, and HQ say we are 'not to touch it if it isn't linking to command.' We dumped off the assload of crates Jim filled, got our boxes of oxygen, food and drink, and closed the portal.

    Log 2:
    Damn thing is acting up again. Three days no contact this time. I thought I heard clanking noises from it yesterday. Jim is going on about the NT base or some shit. We've been over this before - They don't know we're here, that engineer was too drunk to recognize his suit, especially since I had it painted orange. He's starting to get annoying. We're safe.

    Log 3:
    Gateway synced itself up automatically today. I opened it for an instant to spy through it, got a glimpse of the inside of a transport container. Either HQ's redecorating or something, or there's more than two of these things." /obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal_2 name = "Personal Log" @@ -100,7 +100,7 @@ /obj/item/paper/fluff/awaymissions/moonoutpost19/log/ivan name = "Personal Log - Ivan Volodin" - info = "Ivan Volodin Stories:

    Entry Won - 28/05/2554:
    Hello. I am Crazy Ivan. Boss say I must write. I do good job fixing outpost. Is very good job. Much better than mines. Many nice people. I cause no trouble.

    Entry Too - 05/06/2554:
    I am finding problem with Booze-O-Mat. Is not problem. I solve very easy. Use yellow tool to make purple light go off. I am good engineer! Bartender will be very happy.

    Entry Tree - 08/06/2554:
    Bartender is not happy. Security man is not happy. Cannot feel legs, is very cold in freezer. Is not good. Table is jammed into door, have no tools. Is very not good. But, on bright side, found meat! Shall chew to keep spirits up.

    Entry Fore - 12/06/2554:
    Big nasty purple bug looked at me today. Make nervous. Blue wall wire can be broken, then bad thing happens. Very very bad thing. Man in orange spacesuit wave at me today too. He seem nice. Wonder who was?

    Entry Fiv - 15/06/2554:
    I eat cornflakes today. Is good day. Sun shine for a while. Was nice. I also take ride on disposals chute. Was fun, but tiny. Get clog out of pipes, was vodka bottle. Is empty. This make many sads.

    Entry Sex: 19/06/2554:
    Purple bugs jumpy today. When waved, get hiss. Maybe very bad. Maybe just ill. Do not know. Is science problem, is not engineer problem. I eat sandwich. Is glorious job. Wish to never end." + info = "Ivan Volodin Stories:

    Entry Won - 28/05/2554:
    Hello. I am Crazy Ivan. Boss say I must write. I do good job fixing outpost. Is very good job. Much better than mines. Many nice people. I cause no trouble.

    Entry Too - 05/06/2554:
    I am finding problem with Booze-O-Mat. Is not problem. I solve very easy. Use yellow tool to make purple light go off. I am good engineer! Bartender will be very happy.

    Entry Tree - 08/06/2554:
    Bartender is not happy. Security man is not happy. Cannot feel legs, is very cold in freezer. Is not good. Table is jammed into door, have no tools. Is very not good. But, on bright side, found meat! Shall chew to keep spirits up.

    Entry Fore - 12/06/2554:
    Big nasty purple bug looked at me today. Make nervous. Blue wall wire can be broken, then bad thing happens. Very very bad thing. Man in orange spacesuit wave at me today too. He seem nice. Wonder who was?

    Entry Fiv - 15/06/2554:
    I eat cornflakes today. Is good day. Sun shine for a while. Was nice. I also take ride on disposals chute. Was fun, but tiny. Get clog out of pipes, was vodka bottle. Is empty. This make many sads.

    Entry Sex: 19/06/2554:
    Purple bugs jumpy today. When waved, get hiss. Maybe very bad. Maybe just ill. Do not know. Is science problem, is not engineer problem. I eat sandwich. Is glorious job. Wish to never end." /obj/item/paper/fluff/awaymissions/moonoutpost19/log/gerald name = "Personal Log - Gerald Rosswell" @@ -117,5 +117,5 @@ /obj/item/paper/fluff/awaymissions/moonoutpost19/goodbye_note name = "Note" info = "Bugs break out. I run to here and lock door. I hear door next to me break open and screams. All nice people here dead now. I no want to be eaten, and bottle always said to be coward way out, but person who say that is stupid. Mira, there is no escape for me, tell Alexis and Elena that father will never come home, and that I love you all." - + diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index f64b1fe838..b3018d9d1c 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -89,7 +89,7 @@ icon_state = "awaycontent22" /area/awaymission/snowdin/post/broken_shuttle - name = "Snowdin Outpost - Broken Transist Shuttle" + name = "Snowdin Outpost - Broken Transit Shuttle" icon_state = "awaycontent20" requires_power = FALSE @@ -223,8 +223,9 @@ var/list/plasma_parts = list()//a list of the organic parts to be turned into plasma limbs var/list/robo_parts = list()//keep a reference of robotic parts so we know if we can turn them into a plasmaman var/mob/living/carbon/human/PP = L - if(istype(PP.dna.species, /datum/species/plasmaman || /datum/species/android || /datum/species/synth)) //ignore plasmamen/robotic species - return + var/S = PP.dna.species + if(istype(S, /datum/species/plasmaman) || istype(S, /datum/species/android) || istype(S, /datum/species/synth)) //ignore plasmamen/robotic species + continue for(var/BP in PP.bodyparts) var/obj/item/bodypart/NN = BP @@ -263,7 +264,7 @@ /obj/item/paper/crumpled/ruins/snowdin/foreshadowing name = "scribbled note" - info = {"Somnethings gone VERY wrong here. Jouslen has been mumbling about some weird shit in his cabin during the night and he seems always tired when we're working. I tried to confront him about it and he blew up on me, + info = {"Something's gone VERY wrong here. Jouslen has been mumbling about some weird shit in his cabin during the night and he seems always tired when we're working. I tried to confront him about it and he blew up on me, telling me to mind my own business. I reported him to the officer, said he'd look into it. We only got another 2 months here before we're pulled for another assignment, so this shit can't go any quicker.."} /obj/item/paper/crumpled/ruins/snowdin/misc1 @@ -283,58 +284,58 @@ /obj/item/paper/fluff/awaymissions/snowdin/research_feed name = "Research Feed" - info = {"A page full of graphs and other detailed infomation on the seismic activity of the surrounding area."} + info = {"A page full of graphs and other detailed information on the seismic activity of the surrounding area."} //profile of each of the old crewmembers for the outpost /obj/item/paper/fluff/awaymissions/snowdin/profile/overseer name = "Personnel Record AOP#01" - info = {"
    Personnel Log


    Name:Caleb Reed
    Age:38
    Gender:Male
    On-Site Profession:Outpost Overseer

    Infomation

    Caleb Reed lead several expeditions + info = {"
    Personnel Log


    Name:Caleb Reed
    Age:38
    Gender:Male
    On-Site Profession:Outpost Overseer

    Information

    Caleb Reed lead several expeditions among uncharted planets in search of plasma for Nanotrasen, scouring from hot savanas to freezing arctics. Track record is fairly clean with only incidient including the loss of two researchers during the expedition of _______, where mis-used of explosive ordinance for tunneling causes a cave-in."} /obj/item/paper/fluff/awaymissions/snowdin/profile/sec1 name = "Personnel Record AOP#02" - info = {"
    Personnel Log


    Name:James Reed
    Age:43
    Gender:Male
    On-Site Profession:Outpost Security

    Infomation

    James Reed has been a part + info = {"
    Personnel Log


    Name:James Reed
    Age:43
    Gender:Male
    On-Site Profession:Outpost Security

    Information

    James Reed has been a part of Nanotrasen's security force for over 20 years, first joining in 22XX. A clean record and unwavering loyalty to the corperation through numerous deployments to various sites makes him a valuable asset to Natotrasen when it comes to keeping the peace while prioritizing Nanotrasen privacy matters. "} /obj/item/paper/fluff/awaymissions/snowdin/profile/hydro1 name = "Personnel Record AOP#03" - info = {"
    Personnel Log


    Name:Katherine Esterdeen
    Age:27
    Gender:Female
    On-Site Profession:Outpost Botanist

    Infomation

    Katherine Esterdeen is a recent + info = {"
    Personnel Log


    Name:Katherine Esterdeen
    Age:27
    Gender:Female
    On-Site Profession:Outpost Botanist

    Information

    Katherine Esterdeen is a recent graduate with a major in Botany and a PH.D in Ecology. Having a clean record and eager to work, Esterdeen seems to be the right fit for maintaining plants in the middle of nowhere."} /obj/item/paper/fluff/awaymissions/snowdin/profile/engi1 name = "Personnel Record AOP#04" - info = {"
    Personnel Log


    Name:Rachel Migro
    Age:35
    Gender:Female
    On-Site Profession:Outpost Engineer

    Infomation

    Recently certified to be a full-time Journeyman, Rachel has + info = {"
    Personnel Log


    Name:Rachel Migro
    Age:35
    Gender:Female
    On-Site Profession:Outpost Engineer

    Information

    Recently certified to be a full-time Journeyman, Rachel has been assigned various construction projects in the past 5 years. Competent and has no past infractions, should be of little concern."} /obj/item/paper/fluff/awaymissions/snowdin/profile/research1 name = "Personnel Record AOP#05" - info = {"
    Personnel Log


    Name:Jacob Ullman
    Age:27
    Gender:Male
    On-Site Profession:Outpost Researcher

    Infomation

    "} + info = {"
    Personnel Log


    Name:Jacob Ullman
    Age:27
    Gender:Male
    On-Site Profession:Outpost Researcher

    Information

    "} /obj/item/paper/fluff/awaymissions/snowdin/profile/research2 name = "Personnel Record AOP#06" - info = {"
    Personnel Log


    Name:Elizabeth Queef
    Age:28
    Gender:Female
    On-Site Profession:Outpost Researcher

    Infomation

    "} + info = {"
    Personnel Log


    Name:Elizabeth Queef
    Age:28
    Gender:Female
    On-Site Profession:Outpost Researcher

    Information

    "} /obj/item/paper/fluff/awaymissions/snowdin/profile/research3 name = "Personnel Record AOP#07" - info = {"
    Personnel Log


    Name:Jouslen McGee
    Age:38
    Gender:Male
    On-Site Profession:Outpost Researcher

    Infomation

    "} + info = {"
    Personnel Log


    Name:Jouslen McGee
    Age:38
    Gender:Male
    On-Site Profession:Outpost Researcher

    Information

    "} /obj/item/paper/fluff/awaymissions/snowdin/secnotice name = "Security Notice" - info = {"YOu have been assigned to this Arctic Post with intention of protecting Nanotrasen assets and ensuring vital infomation is kept secure while the stationed crew obeys protocal. The picked + info = {"YOu have been assigned to this Arctic Post with intention of protecting Nanotrasen assets and ensuring vital information is kept secure while the stationed crew obeys protocol. The picked staff for this post have been pre-screened with no prior incidients on record, but incase of an issue you have been given a single holding cell and instructions to contact Central to terminate the offending crewmember."} /obj/item/paper/fluff/awaymissions/snowdin/mining name = "Assignment Notice" - info = {"This cold-ass planet is the new-age equivilant of striking gold. Huge deposits of plasma and literal streams of plasma run through the caverns under all this ice and we're here to mine it all.\ + info = {"This cold-ass planet is the new-age equivalent of striking gold. Huge deposits of plasma and literal streams of plasma run through the caverns under all this ice and we're here to mine it all.\ Nanotrasen pays by the pound, so get minin' boys!"} /obj/item/paper/crumpled/ruins/snowdin/lootstructures name = "scribbled note" - info = {"There's some ruins scattered along the cavern, their walls seem to be made of some sort of super-condensned mixture of ice and snow. We've already barricaded up the ones we've found so far, + info = {"There's some ruins scattered along the cavern, their walls seem to be made of some sort of super-condensed mixture of ice and snow. We've already barricaded up the ones we've found so far, since we keep hearing some strange noises from inside. Besides, what sort of fool would wrecklessly run into ancient ruins full of monsters for some old gear, anyway?"} /obj/item/paper/crumpled/ruins/snowdin/shovel @@ -388,7 +389,7 @@ DELAY 30 SAY Nanotrasen is pleased to have you working in one of the many top-of-the-line research posts within the $%@!! sector! DELAY 30 - SAY Further job assignment infomation can be found at your local security post! Have a secure day! + SAY Further job assignment information can be found at your local security post! Have a secure day! DELAY 20;"} /obj/item/disk/holodisk/snowdin/overrun @@ -529,7 +530,7 @@ /obj/item/gun/ballistic/automatic/c20r/unrestricted = 16, /obj/item/gun/magic/wand/resurrection/inert = 15, /obj/item/gun/magic/wand/resurrection = 10, - /obj/item/radio/uplink/old = 2, + /obj/item/uplink/old = 2, /obj/item/book/granter/spell/charge = 12, /obj/item/grenade/clusterbuster/spawner_manhacks = 15, /obj/item/book/granter/spell/fireball = 10, @@ -558,7 +559,7 @@ /obj/item/clothing/under/syndicate/coldres name = "insulated tactical turtleneck" - desc = "A non-descript and slightly suspicious-looking turtleneck with digital camouflage cargo pants. The interior has been padded with special insulation for both warmth and protection." + desc = "A nondescript and slightly suspicious-looking turtleneck with digital camouflage cargo pants. The interior has been padded with special insulation for both warmth and protection." armor = list("melee" = 20, "bullet" = 10, "laser" = 0,"energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 25, "acid" = 25) cold_protection = CHEST|GROIN|ARMS|LEGS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm index 8d0157ad86..42c9ab8202 100644 --- a/code/modules/cargo/bounties/special.dm +++ b/code/modules/cargo/bounties/special.dm @@ -1,6 +1,6 @@ /datum/bounty/item/alien_organs name = "Alien Organs" - description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thouroughly compensated." + description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thoroughly compensated." reward = 25000 required_count = 3 wanted_types = list(/obj/item/organ/brain/alien, /obj/item/organ/alien, /obj/item/organ/body_egg/alien_embryo) diff --git a/code/modules/cargo/bounties/virus.dm b/code/modules/cargo/bounties/virus.dm index e046e09af2..8f078a2668 100644 --- a/code/modules/cargo/bounties/virus.dm +++ b/code/modules/cargo/bounties/virus.dm @@ -73,7 +73,7 @@ return A.totalStealth() == stat_value /datum/bounty/virus/transmit - stat_name = "transmittable" + stat_name = "transmissible" /datum/bounty/virus/transmit/accepts_virus(V) var/datum/disease/advance/A = V diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm index e493f96c6e..2113696e90 100644 --- a/code/modules/cargo/export_scanner.dm +++ b/code/modules/cargo/export_scanner.dm @@ -6,7 +6,7 @@ item_state = "radio" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_SMALL siemens_coefficient = 1 var/obj/machinery/computer/cargo/cargo_console = null diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm index 28b55a2c8f..0d363f7132 100644 --- a/code/modules/cargo/exports/weapons.dm +++ b/code/modules/cargo/exports/weapons.dm @@ -69,29 +69,29 @@ unit_name = "pair" message = "of handcuffs" export_types = list(/obj/item/restraints/handcuffs) - + // relics of lavaland /datum/export/weapon/hierophant cost = 40000 unit_name = "Hierophant Club" export_types = list(/obj/item/hierophant_club) - + /datum/export/weapon/lava cost = 40000 unit_name = "Lava Staff" export_types = list(/obj/item/lava_staff) - + /datum/export/weapon/cleaving_saw cost = 40000 unit_name = "Cleaving Saw" export_types = list(/obj/item/melee/transforming/cleaving_saw) - + /datum/export/weapon/mayhem cost = 40000 unit_name = "Mayhem in a bottle" export_types = list(/obj/item/mayhem) - + /datum/export/weapon/blood_contract cost = 40000 unit_name = "Blood Contract" @@ -103,22 +103,22 @@ cost = 10000 unit_name = "Immortality Talisman" export_types = list(/obj/item/immortality_talisman) - + /datum/export/weapon/babel cost = 10000 unit_name = "Book of Babel" export_types = list(/obj/item/book_of_babel) - + /datum/export/weapon/hook cost = 10000 unit_name = "Meat hook" export_types = list(/obj/item/gun/magic/hook) - + /datum/export/weapon/shipbottle //the price for not breaking the bottle. cost = 20000 unit_name = "Ship in a bottle" export_types = list(/obj/item/ship_in_a_bottle) - + /datum/export/weapon/tarot //price for sacraficing a very profitiable ally cost = 20000 unit_name = "Tarot cards" @@ -128,37 +128,37 @@ cost = 5000 unit_name = "Red Cube" export_types = list(/obj/item/warp_cube/red) - + /datum/export/weapon/blue //first half of telecube cost = 5000 unit_name = "Blue Cube" export_types = list(/obj/item/warp_cube) - + /datum/export/weapon/wisplantern //thermals on lavaland cost = 10000 unit_name = "Wisp Lantern" export_types = list(/obj/item/wisp_lantern) - + /datum/export/weapon/flight //if xenobiology ever reaches the point to get these without shuttle being called they deserve it cost = 10000 - unit_name = "Strange Elixer" + unit_name = "Strange Elixir" export_types = list(/obj/item/reagent_containers/glass/bottle/potion/flight) - + /datum/export/weapon/cheart //is a very powerfull healing artifact in the robust hands cost = 10000 unit_name = "Cursed Heart" export_types = list(/obj/item/organ/heart/cursed/wizard) - + /datum/export/weapon/ckatana cost = 10000 unit_name = "Katana" export_types = list(/obj/item/katana/cursed) - + /datum/export/weapon/geye //xray cost = 10000 unit_name = "God eye" export_types = list(/obj/item/clothing/glasses/godeye) - + /datum/export/weapon/spectral cost = 10000 unit_name = "Spectral Sword" diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index cffd954b0e..e27cb8f56e 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -60,15 +60,6 @@ crate_name = "Biker Kit" crate_type = /obj/structure/closet/crate/large -/datum/supply_pack/emergency/droneshells - name = "Drone Shell Crate" - desc = "The station's little helpers. Contains three Drone Shells." - cost = 1000 - contains = list(/obj/item/drone_shell, - /obj/item/drone_shell, - /obj/item/drone_shell) - crate_name = "drone shell crate" - /datum/supply_pack/emergency/equipment name = "Emergency Bot/Internals Crate" desc = "Explosions got you down? These supplies are guaranteed to patch up holes, in stations and people alike! Comes with two floorbots, two medbots, five oxygen masks and five small oxygen tanks." @@ -181,7 +172,7 @@ /datum/supply_pack/emergency/radiation name = "Radiation Protection Crate" - desc = "Survive the Nuclear Apocalypse and Supermatter Engine alike with two sets of Radiation suits. Each set contains a helmet, suit, and geiger counter. We'll even throw in a bottle of vodka and some glasses too, considering the life-expectancy of people who order this." + desc = "Survive the Nuclear Apocalypse and Supermatter Engine alike with two sets of Radiation suits. Each set contains a helmet, suit, and Geiger counter. We'll even throw in a bottle of vodka and some glasses too, considering the life-expectancy of people who order this." cost = 1000 contains = list(/obj/item/clothing/head/radiation, /obj/item/clothing/head/radiation, @@ -225,7 +216,7 @@ /datum/supply_pack/emergency/weedcontrol name = "Weed Control Crate" - desc = "Keep those invasive species OUT. Contains a scythe, gasmask, and two anti-weed chemical grenades. Warrenty void if used on ambrosia. Requires Hydroponics access to open." + desc = "Keep those invasive species OUT. Contains a scythe, gasmask, and two anti-weed chemical grenades. Warranty void if used on ambrosia. Requires Hydroponics access to open." cost = 1500 access = ACCESS_HYDROPONICS contains = list(/obj/item/scythe, @@ -631,7 +622,7 @@ /datum/supply_pack/engineering/shuttle_engine name = "Shuttle Engine Crate" - desc = "Through advanced bluespace-shenanigins, our engineers have managed to fit an entire shuttle engine into one tiny little crate. Requires CE access to open." + desc = "Through advanced bluespace-shenanigans, our engineers have managed to fit an entire shuttle engine into one tiny little crate. Requires CE access to open." cost = 5000 access = ACCESS_CE contains = list(/obj/structure/shuttle/engine/propulsion/burst/cargo) @@ -1134,24 +1125,24 @@ desc = "Contains refills for medical vending machines." cost = 2000 contains = list(/obj/item/vending_refill/medical, - /obj/item/vending_refill/medical, - /obj/item/vending_refill/medical) + /obj/item/vending_refill/wallmed) crate_name = "medical vending crate" /datum/supply_pack/medical/virus name = "Virus Crate" - desc = "Contains twelve different bottles, each filled with a different chemical compound, each useful for virology. Also includes seven beakers and syringes. Balled-up jeans not included. Requires CMO access to open." + desc = "Contains twelve different bottles, containing several viral samples for virology research. Also includes seven beakers and syringes. Balled-up jeans not included. Requires CMO access to open." cost = 2500 access = ACCESS_CMO contains = list(/obj/item/reagent_containers/glass/bottle/flu_virion, /obj/item/reagent_containers/glass/bottle/cold, - /obj/item/reagent_containers/glass/bottle/epiglottis_virion, - /obj/item/reagent_containers/glass/bottle/liver_enhance_virion, + /obj/item/reagent_containers/glass/bottle/random_virus, + /obj/item/reagent_containers/glass/bottle/random_virus, + /obj/item/reagent_containers/glass/bottle/random_virus, + /obj/item/reagent_containers/glass/bottle/random_virus, /obj/item/reagent_containers/glass/bottle/fake_gbs, /obj/item/reagent_containers/glass/bottle/magnitis, /obj/item/reagent_containers/glass/bottle/pierrot_throat, /obj/item/reagent_containers/glass/bottle/brainrot, - /obj/item/reagent_containers/glass/bottle/hallucigen_virion, /obj/item/reagent_containers/glass/bottle/anxiety, /obj/item/reagent_containers/glass/bottle/beesease, /obj/item/storage/box/syringes, @@ -1367,53 +1358,41 @@ /datum/supply_pack/service/vending/bartending name = "Bartending Supply Crate" - desc = "Bring on the booze with six vending machine refills, as well as a free book containing the well-kept secrets to the bartending trade!" + desc = "Bring on the booze with vending machine refills, as well as a free book containing the well-kept secrets to the bartending trade!" cost = 2000 contains = list(/obj/item/vending_refill/boozeomat, - /obj/item/vending_refill/boozeomat, - /obj/item/vending_refill/boozeomat, - /obj/item/vending_refill/coffee, - /obj/item/vending_refill/coffee, /obj/item/vending_refill/coffee, /obj/item/book/granter/action/drink_fling) crate_name = "bartending supply crate" /datum/supply_pack/service/vending/cigarette name = "Cigarette Supply Crate" - desc = "Don't believe the reports - smoke today! Contains cigarette vending machine refills." + desc = "Don't believe the reports - smoke today! Contains a cigarette vending machine refill." cost = 1500 - contains = list(/obj/item/vending_refill/cigarette, - /obj/item/vending_refill/cigarette, - /obj/item/vending_refill/cigarette) + contains = list(/obj/item/vending_refill/cigarette) crate_name = "cigarette supply crate" crate_type = /obj/structure/closet/crate /datum/supply_pack/service/vending/games name = "Games Supply Crate" - desc = "Get your game on with these three game vending machine refills." + desc = "Get your game on with this game vending machine refill." cost = 1000 - contains = list(/obj/item/vending_refill/games, - /obj/item/vending_refill/games, - /obj/item/vending_refill/games) + contains = list(/obj/item/vending_refill/games) crate_name = "games supply crate" crate_type = /obj/structure/closet/crate /datum/supply_pack/service/vending/snack name = "Snack Supply Crate" - desc = "Three vending machine refills of cavity-bringin' goodness! The number one dentist recommended order!" + desc = "One vending machine refill of cavity-bringin' goodness! The number one dentist recommended order!" cost = 1500 - contains = list(/obj/item/vending_refill/snack, - /obj/item/vending_refill/snack, - /obj/item/vending_refill/snack) + contains = list(/obj/item/vending_refill/snack) crate_name = "snacks supply crate" /datum/supply_pack/service/vending/cola name = "Softdrinks Supply Crate" - desc = "Got whacked by a toolbox, but you still have those pesky teeth? Get rid of those pearly whites with these three soda machine refills, today!" + desc = "Got whacked by a toolbox, but you still have those pesky teeth? Get rid of those pearly whites with this soda machine refill, today!" cost = 1500 - contains = list(/obj/item/vending_refill/cola, - /obj/item/vending_refill/cola, - /obj/item/vending_refill/cola) + contains = list(/obj/item/vending_refill/cola) crate_name = "soft drinks supply crate" ////////////////////////////////////////////////////////////////////////////// @@ -1957,10 +1936,9 @@ /datum/supply_pack/costumes_toys/wardrobes/autodrobe name = "Autodrobe Supply Crate" - desc = "Autodrobe missing your favorite dress? Solve that issue today with these two autodrobe refills." + desc = "Autodrobe missing your favorite dress? Solve that issue today with this autodrobe refill." cost = 1500 - contains = list(/obj/item/vending_refill/autodrobe, - /obj/item/vending_refill/autodrobe) + contains = list(/obj/item/vending_refill/autodrobe) crate_name = "autodrobe supply crate" /datum/supply_pack/costumes_toys/wardrobes/cargo @@ -2083,7 +2061,7 @@ /datum/supply_pack/misc/paper name = "Bureaucracy Crate" - desc = "High stacks of papers on your desk Are a big problem - make it Pea-sized with these bureacratic supplies! Contains six pens, some camera film, hand labeler supplies, a paper bin, three folders, two clipboards and two stamps."//that was too forced + desc = "High stacks of papers on your desk Are a big problem - make it Pea-sized with these bureaucratic supplies! Contains six pens, some camera film, hand labeler supplies, a paper bin, three folders, two clipboards and two stamps."//that was too forced cost = 1500 contains = list(/obj/structure/filingcabinet/chestdrawer/wheeled, /obj/item/camera_film, diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index fdcb27ad75..2ae00f9348 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -217,7 +217,9 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) new /datum/admins(localhost_rank, ckey, 1, 1) //preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum) prefs = GLOB.preferences_datums[ckey] - if(!prefs) + if(prefs) + prefs.parent = src + else prefs = new /datum/preferences(src) GLOB.preferences_datums[ckey] = prefs prefs.last_ip = address //these are gonna be used for banning @@ -465,12 +467,14 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) related_accounts_ip = "" while(query_get_related_ip.NextRow()) related_accounts_ip += "[query_get_related_ip.item[1]], " + qdel(query_get_related_ip) var/datum/DBQuery/query_get_related_cid = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE computerid = '[computer_id]' AND ckey != '[sql_ckey]'") if(!query_get_related_cid.Execute()) return related_accounts_cid = "" while (query_get_related_cid.NextRow()) related_accounts_cid += "[query_get_related_cid.item[1]], " + qdel(query_get_related_cid) var/admin_rank = "Player" if (src.holder && src.holder.rank) admin_rank = src.holder.rank.name @@ -483,6 +487,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) var/new_player var/datum/DBQuery/query_client_in_db = SSdbcore.NewQuery("SELECT 1 FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'") if(!query_client_in_db.Execute()) + qdel(query_client_in_db) return if(!query_client_in_db.NextRow()) if (CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey]) @@ -496,6 +501,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) to_chat(src, "Sending you to [panic_name ? panic_name : panic_addr].") winset(src, null, "command=.options") src << link("[panic_addr]?redirect=1") + qdel(query_client_in_db) qdel(src) return @@ -503,12 +509,17 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) account_join_date = sanitizeSQL(findJoinDate()) var/datum/DBQuery/query_add_player = SSdbcore.NewQuery("INSERT INTO [format_table_name("player")] (`ckey`, `firstseen`, `firstseen_round_id`, `lastseen`, `lastseen_round_id`, `ip`, `computerid`, `lastadminrank`, `accountjoindate`) VALUES ('[sql_ckey]', Now(), '[GLOB.round_id]', Now(), '[GLOB.round_id]', INET_ATON('[sql_ip]'), '[sql_computerid]', '[sql_admin_rank]', [account_join_date ? "'[account_join_date]'" : "NULL"])") if(!query_add_player.Execute()) + qdel(query_client_in_db) + qdel(query_add_player) return + qdel(query_add_player) if(!account_join_date) account_join_date = "Error" account_age = -1 + qdel(query_client_in_db) var/datum/DBQuery/query_get_client_age = SSdbcore.NewQuery("SELECT firstseen, DATEDIFF(Now(),firstseen), accountjoindate, DATEDIFF(Now(),accountjoindate) FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'") if(!query_get_client_age.Execute()) + qdel(query_get_client_age) return if(query_get_client_age.NextRow()) player_join_date = query_get_client_age.item[1] @@ -523,17 +534,23 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) else var/datum/DBQuery/query_datediff = SSdbcore.NewQuery("SELECT DATEDIFF(Now(),'[account_join_date]')") if(!query_datediff.Execute()) + qdel(query_datediff) return if(query_datediff.NextRow()) account_age = text2num(query_datediff.item[1]) + qdel(query_datediff) + qdel(query_get_client_age) if(!new_player) var/datum/DBQuery/query_log_player = SSdbcore.NewQuery("UPDATE [format_table_name("player")] SET lastseen = Now(), lastseen_round_id = '[GLOB.round_id]', ip = INET_ATON('[sql_ip]'), computerid = '[sql_computerid]', lastadminrank = '[sql_admin_rank]', accountjoindate = [account_join_date ? "'[account_join_date]'" : "NULL"] WHERE ckey = '[sql_ckey]'") if(!query_log_player.Execute()) + qdel(query_log_player) return + qdel(query_log_player) if(!account_join_date) account_join_date = "Error" var/datum/DBQuery/query_log_connection = SSdbcore.NewQuery("INSERT INTO `[format_table_name("connection_log")]` (`id`,`datetime`,`server_ip`,`server_port`,`round_id`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')),'[world.port]','[GLOB.round_id]','[sql_ckey]',INET_ATON('[sql_ip]'),'[sql_computerid]')") query_log_connection.Execute() + qdel(query_log_connection) if(new_player) player_age = -1 . = player_age @@ -569,6 +586,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) var/lastcid if (query_cidcheck.NextRow()) lastcid = query_cidcheck.item[1] + qdel(query_cidcheck) var/oldcid = cidcheck[ckey] if (oldcid) @@ -642,16 +660,22 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) //check to see if we noted them in the last day. var/datum/DBQuery/query_get_notes = SSdbcore.NewQuery("SELECT id FROM [format_table_name("messages")] WHERE type = 'note' AND targetckey = '[sql_ckey]' AND adminckey = '[sql_system_ckey]' AND timestamp + INTERVAL 1 DAY < NOW() AND deleted = 0") if(!query_get_notes.Execute()) + qdel(query_get_notes) return if(query_get_notes.NextRow()) + qdel(query_get_notes) return + qdel(query_get_notes) //regardless of above, make sure their last note is not from us, as no point in repeating the same note over and over. query_get_notes = SSdbcore.NewQuery("SELECT adminckey FROM [format_table_name("messages")] WHERE targetckey = '[sql_ckey]' AND deleted = 0 ORDER BY timestamp DESC LIMIT 1") if(!query_get_notes.Execute()) + qdel(query_get_notes) return if(query_get_notes.NextRow()) if (query_get_notes.item[1] == system_ckey) + qdel(query_get_notes) return + qdel(query_get_notes) create_message("note", ckey, system_ckey, message, null, null, 0, 0) @@ -797,6 +821,8 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) if (isliving(mob)) var/mob/living/M = mob M.update_damage_hud() + if (prefs.auto_fit_viewport) + fit_viewport() /client/proc/generate_clickcatcher() if(!void) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 5c6c0a8229..088c75a1b5 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -36,7 +36,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) //autocorrected this round, not that you'd need to check that. - var/UI_style = "Midnight" + var/UI_style = null var/buttons_locked = FALSE var/hotkeys = FALSE var/tgui_fancy = TRUE @@ -121,6 +121,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/parallax var/ambientocclusion = TRUE + var/auto_fit_viewport = FALSE var/uplink_spawn_loc = UPLINK_PDA @@ -133,9 +134,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) parent = C custom_names["human"] = random_unique_name() custom_names["ai"] = pick(GLOB.ai_names) - custom_names["cyborg"] = pick(GLOB.ai_names) + custom_names["cyborg"] = DEFAULT_CYBORG_NAME custom_names["clown"] = pick(GLOB.clown_names) custom_names["mime"] = pick(GLOB.mime_names) + UI_style = GLOB.available_ui_styles[1] if(istype(C)) if(!IsGuestKey(C.key)) load_path(C.ckey) @@ -213,10 +215,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Special Names:
    " dat += "Backup Human Name: [custom_names["human"]] " + dat += "
    " dat += "Clown: [custom_names["clown"]] " - dat += "Mime:[custom_names["mime"]]
    " + dat += "Mime: [custom_names["mime"]]" + dat += "
    " dat += "AI: [custom_names["ai"]] " - dat += "Cyborg: [custom_names["cyborg"]]
    " + dat += "Cyborg: [custom_names["cyborg"]]" + dat += "
    " dat += "Chaplain religion: [custom_names["religion"]] " dat += "Chaplain deity: [custom_names["deity"]]
    " @@ -457,24 +462,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) button_name = GHOST_OTHERS_SIMPLE_NAME dat += "Ghosts of Others: [button_name]
    " - - if (CONFIG_GET(flag/maprotation)) - var/p_map = preferred_map - if (!p_map) - p_map = "Default" - if (config.defaultmap) - p_map += " ([config.defaultmap.map_name])" - else - if (p_map in config.maplist) - var/datum/map_config/VM = config.maplist[p_map] - if (!VM) - p_map += " (No longer exists)" - else - p_map = VM.map_name - else - p_map += " (No longer exists)" - if(CONFIG_GET(flag/allow_map_voting)) - dat += "Preferred Map: [p_map]
    " + dat += "
    " dat += "FPS: [clientfps]
    " @@ -493,6 +481,25 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
    " dat += "Ambient Occlusion: [ambientocclusion ? "Enabled" : "Disabled"]
    " + dat += "Fit Viewport: [auto_fit_viewport ? "Auto" : "Manual"]
    " + + if (CONFIG_GET(flag/maprotation)) + var/p_map = preferred_map + if (!p_map) + p_map = "Default" + if (config.defaultmap) + p_map += " ([config.defaultmap.map_name])" + else + if (p_map in config.maplist) + var/datum/map_config/VM = config.maplist[p_map] + if (!VM) + p_map += " (No longer exists)" + else + p_map = VM.map_name + else + p_map += " (No longer exists)" + if(CONFIG_GET(flag/allow_map_voting)) + dat += "Preferred Map: [p_map]
    " dat += "" @@ -1101,11 +1108,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_age) age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) - if("metadata") - var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null - if(new_metadata) - metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN)) - /* if("hair") var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference","#"+hair_color) as color|null if(new_hair) @@ -1326,7 +1328,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) to_chat(user, "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, 0-9, -, ' and .") if("cyborg_name") - var/new_cyborg_name = reject_bad_name( input(user, "Choose your character's cyborg name:", "Character Preference") as text|null, 1 ) + var/raw_name = input(user, "Choose your character's cyborg name (Leave empty to use default naming scheme):", "Character Preference") as text|null + var/new_cyborg_name + if(!raw_name) + new_cyborg_name = DEFAULT_CYBORG_NAME + else + new_cyborg_name = reject_bad_name(raw_name,1 ) if(new_cyborg_name) custom_names["cyborg"] = new_cyborg_name else @@ -1372,13 +1379,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) if (!isnull(desiredfps)) clientfps = desiredfps parent.fps = desiredfps - else - clientfps = 0 - parent.fps = 0 if("ui") - var/pickedui = input(user, "Choose your UI style.", "Character Preference") as null|anything in list("Midnight", "Plasmafire", "Retro", "Slimecore", "Operative", "Clockwork") + var/pickedui = input(user, "Choose your UI style.", "Character Preference", UI_style) as null|anything in GLOB.available_ui_styles if(pickedui) UI_style = pickedui + if (parent && parent.mob && parent.mob.hud_used) + parent.mob.hud_used.update_ui_style(ui_style2icon(UI_style)) if("pda_style") var/pickedPDAStyle = input(user, "Choose your PDA style.", "Character Preference", pda_style) as null|anything in GLOB.pda_styles if(pickedPDAStyle) @@ -1468,6 +1474,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) toggles ^= SOUND_ADMINHELP if("announce_login") toggles ^= ANNOUNCE_LOGIN + if("combohud_lighting") + toggles ^= COMBOHUD_LIGHTING if("be_special") var/be_special_type = href_list["be_special_type"] @@ -1487,7 +1495,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("lobby_music") toggles ^= SOUND_LOBBY - if((toggles & SOUND_LOBBY) && user.client) + if((toggles & SOUND_LOBBY) && user.client && isnewplayer(user)) user.client.playtitlemusic() else user.stop_sound_channel(CHANNEL_LOBBYMUSIC) @@ -1539,6 +1547,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/obj/screen/plane_master/game_world/PM = locate(/obj/screen/plane_master/game_world) in parent.screen PM.backdrop(parent.mob) + if("auto_fit_viewport") + auto_fit_viewport = !auto_fit_viewport + if(auto_fit_viewport && parent) + parent.fit_viewport() + if("save") save_preferences() save_character() @@ -1600,7 +1613,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(be_random_body) random_character(gender) - if(CONFIG_GET(flag/humans_need_surnames)) + if(CONFIG_GET(flag/humans_need_surnames) && (pref_species.id == "human")) var/firstspace = findtext(real_name, " ") var/name_length = length(real_name) if(!firstspace) //we need a surname diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index ad53f8f0dd..4c2cdbb074 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -131,6 +131,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["clientfps"] >> clientfps S["parallax"] >> parallax S["ambientocclusion"] >> ambientocclusion + S["auto_fit_viewport"] >> auto_fit_viewport S["menuoptions"] >> menuoptions S["enable_tips"] >> enable_tips S["tip_delay"] >> tip_delay @@ -151,7 +152,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Sanitize ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor))) lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) - UI_style = sanitize_inlist(UI_style, list("Midnight", "Plasmafire", "Retro", "Slimecore", "Operative", "Clockwork"), initial(UI_style)) + UI_style = sanitize_inlist(UI_style, GLOB.available_ui_styles, GLOB.available_ui_styles[1]) hotkeys = sanitize_integer(hotkeys, 0, 1, initial(hotkeys)) tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy)) tgui_lock = sanitize_integer(tgui_lock, 0, 1, initial(tgui_lock)) @@ -162,6 +163,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car clientfps = sanitize_integer(clientfps, 0, 1000, 0) parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null) ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion)) + auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport)) ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form)) ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit)) ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION) @@ -213,6 +215,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["clientfps"], clientfps) WRITE_FILE(S["parallax"], parallax) WRITE_FILE(S["ambientocclusion"], ambientocclusion) + WRITE_FILE(S["auto_fit_viewport"], auto_fit_viewport) WRITE_FILE(S["menuoptions"], menuoptions) WRITE_FILE(S["enable_tips"], enable_tips) WRITE_FILE(S["tip_delay"], tip_delay) @@ -260,7 +263,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["features["mcolor"]"] , "#FFF") //Character - S["OOC_Notes"] >> metadata S["real_name"] >> real_name S["name_is_always_random"] >> be_random_name S["body_is_always_random"] >> be_random_body @@ -374,7 +376,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car update_character(needs_update, S) //needs_update == savefile_version if we need an update (positive integer) //Sanitize - metadata = sanitize_text(metadata, initial(metadata)) real_name = reject_bad_name(real_name) if(!features["mcolor"] || features["mcolor"] == "#000") features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F") @@ -444,7 +445,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //load_character will sanitize any bad data, so assume up-to-date.) //Character - WRITE_FILE(S["OOC_Notes"] , metadata) WRITE_FILE(S["real_name"] , real_name) WRITE_FILE(S["name_is_always_random"] , be_random_name) WRITE_FILE(S["body_is_always_random"] , be_random_body) diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 0bcfac811e..2f4922fddf 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -22,6 +22,8 @@ if(jobban_isbanned(src.mob, "OOC")) to_chat(src, "You have been banned from OOC.") return + if(QDELETED(src)) + return msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) var/raw_msg = msg @@ -56,21 +58,19 @@ if(prefs.unlock_content) if(prefs.toggles & MEMBER_PUBLIC) keyname = "[icon2html('icons/member_content.dmi', world, "blag")][keyname]" - + //The linkify span classes and linkify=TRUE below make ooc text get clickable chat href links if you pass in something resembling a url for(var/client/C in GLOB.clients) if(C.prefs.chat_toggles & CHAT_OOC) if(holder) if(!holder.fakekey || C.holder) if(check_rights_for(src, R_ADMIN)) - to_chat(C, "[CONFIG_GET(flag/allow_admin_ooccolor) && prefs.ooccolor ? "" :"" ]OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") + to_chat(C, "[CONFIG_GET(flag/allow_admin_ooccolor) && prefs.ooccolor ? "" :"" ]OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") else - to_chat(C, "OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") + to_chat(C, "OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") else - to_chat(C, "OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") - else if(is_mentor()) // Citadel Mentors - to_chat(C, "OOC: [keyname]: [msg]") // hippie end + to_chat(C, "OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") else if(!(key in C.prefs.ignoring)) - to_chat(C, "OOC: [keyname]: [msg]") + to_chat(C, "OOC: [keyname]: [msg]") /proc/toggle_ooc(toggle = null) if(toggle != null) //if we're specifically en/disabling ooc @@ -301,3 +301,49 @@ GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR) set desc = "View the last round end report you've seen" SSticker.show_roundend_report(src, TRUE) + +/client/verb/fit_viewport() + set name = "Fit Viewport" + set category = "OOC" + set desc = "Fit the width of the map window to match the viewport" + + // Fetch aspect ratio + var/view_size = getviewsize(view) + var/aspect_ratio = view_size[1] / view_size[2] + + // Calculate desired pixel width using window size and aspect ratio + var/sizes = params2list(winget(src, "mainwindow.split;mapwindow", "size")) + var/map_size = splittext(sizes["mapwindow.size"], "x") + var/height = text2num(map_size[2]) + var/desired_width = round(height * aspect_ratio) + if (text2num(map_size[1]) == desired_width) + // Nothing to do + return + + var/split_size = splittext(sizes["mainwindow.split.size"], "x") + var/split_width = text2num(split_size[1]) + + // Calculate and apply a best estimate + // +4 pixels are for the width of the splitter's handle + var/pct = 100 * (desired_width + 4) / split_width + winset(src, "mainwindow.split", "splitter=[pct]") + + // Apply an ever-lowering offset until we finish or fail + var/delta + for(var/safety in 1 to 10) + var/after_size = winget(src, "mapwindow", "size") + map_size = splittext(after_size, "x") + var/got_width = text2num(map_size[1]) + + if (got_width == desired_width) + // success + return + else if (isnull(delta)) + // calculate a probable delta value based on the difference + delta = 100 * (desired_width - got_width) / split_width + else if ((delta > 0 && got_width > desired_width) || (delta < 0 && got_width < desired_width)) + // if we overshot, halve the delta and reverse direction + delta = -delta/2 + + pct += delta + winset(src, "mainwindow.split", "splitter=[pct]") diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 06e555bb32..6b273cb818 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -19,7 +19,7 @@ if(damagetype & SHAME) adjustStaminaLoss(200) suiciding = FALSE - SendSignal(COMSIG_ADD_MOOD_EVENT, "shameful_suicide", /datum/mood_event/shameful_suicide) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "shameful_suicide", /datum/mood_event/shameful_suicide) return suicide_log() @@ -219,7 +219,4 @@ if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide to_chat(src, "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))") return -// if(has_brain_worms()) -// to_chat(src, "You can't bring yourself to commit suicide!") -// return return TRUE diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 9d4983ed57..e4cc477f11 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -170,7 +170,7 @@ for(var/V in typesof(chameleon_type)) if(ispath(V) && ispath(V, /obj/item)) var/obj/item/I = V - if(chameleon_blacklist[V] || (initial(I.flags_1) & ABSTRACT_1) || !initial(I.icon_state)) + if(chameleon_blacklist[V] || (initial(I.item_flags) & ABSTRACT) || !initial(I.icon_state)) continue var/chameleon_item_name = "[initial(I.name)] ([initial(I.icon_state)])" chameleon_list[chameleon_item_name] = I @@ -405,7 +405,7 @@ /obj/item/clothing/head/chameleon/drone // The camohat, I mean, holographic hat projection, is part of the // drone itself. - flags_1 = NODROP_1 + item_flags = NODROP armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) // which means it offers no protection, it's just air and light @@ -459,7 +459,7 @@ /obj/item/clothing/mask/chameleon/drone //Same as the drone chameleon hat, undroppable and no protection - flags_1 = NODROP_1 + item_flags = NODROP armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) // Can drones use the voice changer part? Let's not find out. vchange = 0 diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index bb2a489030..1dcaeb35fa 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -1,50 +1,50 @@ - -//Ears: currently only used for headsets and earmuffs -/obj/item/clothing/ears - name = "ears" - w_class = WEIGHT_CLASS_TINY - throwforce = 0 - slot_flags = ITEM_SLOT_EARS - resistance_flags = NONE - -/obj/item/clothing/ears/earmuffs - name = "earmuffs" - desc = "Protects your hearing from loud noises, and quiet ones as well." - icon_state = "earmuffs" - item_state = "earmuffs" - strip_delay = 15 - equip_delay_other = 25 - resistance_flags = FLAMMABLE - -/obj/item/clothing/ears/earmuffs/ComponentInitialize() - . = ..() - AddComponent(/datum/component/earhealing) - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS)) - -/obj/item/clothing/ears/headphones - name = "headphones" - desc = "Unce unce unce unce. Boop!" - icon = 'icons/obj/clothing/accessories.dmi' - icon_state = "headphones" - item_state = "headphones" - slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD | ITEM_SLOT_NECK //Fluff item, put it whereever you want! - actions_types = list(/datum/action/item_action/toggle_headphones) - var/headphones_on = FALSE - -/obj/item/clothing/ears/headphones/Initialize() - . = ..() - update_icon() - -/obj/item/clothing/ears/headphones/update_icon() - icon_state = "[initial(icon_state)]_[headphones_on? "on" : "off"]" - item_state = "[initial(item_state)]_[headphones_on? "on" : "off"]" - -/obj/item/clothing/ears/headphones/proc/toggle(owner) - headphones_on = !headphones_on - update_icon() - var/mob/living/carbon/human/H = owner - if(istype(H)) - H.update_inv_ears() - H.update_inv_neck() - H.update_inv_head() - to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") + +//Ears: currently only used for headsets and earmuffs +/obj/item/clothing/ears + name = "ears" + w_class = WEIGHT_CLASS_TINY + throwforce = 0 + slot_flags = ITEM_SLOT_EARS + resistance_flags = NONE + +/obj/item/clothing/ears/earmuffs + name = "earmuffs" + desc = "Protects your hearing from loud noises, and quiet ones as well." + icon_state = "earmuffs" + item_state = "earmuffs" + strip_delay = 15 + equip_delay_other = 25 + resistance_flags = FLAMMABLE + +/obj/item/clothing/ears/earmuffs/ComponentInitialize() + . = ..() + AddComponent(/datum/component/earhealing) + AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS)) + +/obj/item/clothing/ears/headphones + name = "headphones" + desc = "Unce unce unce unce. Boop!" + icon = 'icons/obj/clothing/accessories.dmi' + icon_state = "headphones" + item_state = "headphones" + slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD | ITEM_SLOT_NECK //Fluff item, put it whereever you want! + actions_types = list(/datum/action/item_action/toggle_headphones) + var/headphones_on = FALSE + +/obj/item/clothing/ears/headphones/Initialize() + . = ..() + update_icon() + +/obj/item/clothing/ears/headphones/update_icon() + icon_state = "[initial(icon_state)]_[headphones_on? "on" : "off"]" + item_state = "[initial(item_state)]_[headphones_on? "on" : "off"]" + +/obj/item/clothing/ears/headphones/proc/toggle(owner) + headphones_on = !headphones_on + update_icon() + var/mob/living/carbon/human/H = owner + if(istype(H)) + H.update_inv_ears() + H.update_inv_neck() + H.update_inv_head() + to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index c64ecc0e0f..bbb8d687d9 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -367,7 +367,7 @@ vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS darkness_view = 8 scan_reagents = 1 - flags_1 = NODROP_1 + item_flags = NODROP lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE resistance_flags = LAVA_PROOF | FIRE_PROOF diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 2d60c7d236..25e0dbe886 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -150,7 +150,7 @@ dog_fashion = null /obj/item/clothing/head/helmet/roman - name = "roman helmet" + name = "\improper Roman helmet" desc = "An ancient helmet made of bronze and leather." flags_inv = HIDEEARS|HIDEHAIR flags_cover = HEADCOVERSEYES @@ -165,13 +165,13 @@ desc = "An ancient helmet made of plastic and leather." armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) -/obj/item/clothing/head/helmet/roman/legionaire - name = "roman legionaire helmet" +/obj/item/clothing/head/helmet/roman/legionnaire + name = "\improper Roman legionnaire helmet" desc = "An ancient helmet made of bronze and leather. Has a red crest on top of it." icon_state = "roman_c" item_state = "roman_c" -/obj/item/clothing/head/helmet/roman/legionaire/fake +/obj/item/clothing/head/helmet/roman/legionnaire/fake desc = "An ancient helmet made of plastic and leather. Has a red crest on top of it." armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 18521b7dc9..faa3ebdb0f 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -100,7 +100,7 @@ /obj/item/clothing/head/beret/highlander desc = "That was white fabric. Was." - flags_1 = NODROP_1 + item_flags = NODROP dog_fashion = null //THIS IS FOR SLAUGHTER, NOT PUPPIES //Security @@ -136,7 +136,7 @@ /obj/item/clothing/head/beret/sec name = "security beret" - desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficent protection." + desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection." icon_state = "beret_badge" armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50) strip_delay = 60 diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index d7a7e7f5e2..ba23338415 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -221,7 +221,7 @@ icon_state = "shamebrero" item_state = "shamebrero" desc = "Once it's on, it never comes off." - flags_1 = NODROP_1 + item_flags = NODROP dog_fashion = null /obj/item/clothing/head/cone @@ -305,8 +305,8 @@ icon_state = "drfreeze_hat" flags_inv = HIDEHAIR -/obj/item/clothing/head/pharoah - name = "pharoah hat" +/obj/item/clothing/head/pharaoh + name = "pharaoh hat" desc = "Walk like an Egyptian." icon_state = "pharoah_hat" icon_state = "pharoah_hat" @@ -318,7 +318,7 @@ dynamic_hair_suffix = "" /obj/item/clothing/head/nemes - name = "headress of Nemes" + name = "headdress of Nemes" desc = "Lavish space tomb not included." icon_state = "nemes_headdress" icon_state = "nemes_headdress" @@ -344,4 +344,4 @@ if(prob(3)) M += pick(" Honh honh honh!"," Honh!"," Zut Alors!") - return trim(M) \ No newline at end of file + return trim(M) diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index 0d78e11874..3f21780f15 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -3,7 +3,7 @@ /obj/item/clothing/mask/gas/sechailer name = "security gas mask" - desc = "A standard issue Security gas mask with integrated 'Compli-o-nator 3000' device. Plays over a dozen pre-recorded compliance phrases designed to get scumbags to stand still whilst you taze them. Do not tamper with the device." + desc = "A standard issue Security gas mask with integrated 'Compli-o-nator 3000' device. Plays over a dozen pre-recorded compliance phrases designed to get scumbags to stand still whilst you tase them. Do not tamper with the device." actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust) icon_state = "sechailer" item_state = "sechailer" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 667bc7fc78..c0d41aeb68 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -123,7 +123,7 @@ return message /obj/item/clothing/mask/frog/cursed - flags_1 = NODROP_1 //reee!! + item_flags = NODROP //reee!! /obj/item/clothing/mask/frog/cursed/attack_self(mob/user) return //no voicebox to alter. diff --git a/code/modules/clothing/outfits/event.dm b/code/modules/clothing/outfits/event.dm index 37a06046b5..347fc5c2d7 100644 --- a/code/modules/clothing/outfits/event.dm +++ b/code/modules/clothing/outfits/event.dm @@ -26,5 +26,5 @@ var/obj/item/storage/backpack/bag = H.back var/obj/item/a_gift/gift = new(H) - while(bag.SendSignal(COMSIG_TRY_STORAGE_INSERT, gift, null, TRUE, FALSE)) + while(SEND_SIGNAL(bag, COMSIG_TRY_STORAGE_INSERT, gift, null, TRUE, FALSE)) gift = new(H) diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 88752f7415..88b51963e5 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -182,11 +182,11 @@ for(var/obj/item/briefcase_item in sec_briefcase) qdel(briefcase_item) for(var/i = 3 to 0 step -1) - sec_briefcase.SendSignal(COMSIG_TRY_STORAGE_INSERT, new /obj/item/stack/spacecash/c1000, null, TRUE, TRUE) - sec_briefcase.SendSignal(COMSIG_TRY_STORAGE_INSERT, new /obj/item/gun/energy/kinetic_accelerator/crossbow, null, TRUE, TRUE) - sec_briefcase.SendSignal(COMSIG_TRY_STORAGE_INSERT, new /obj/item/gun/ballistic/revolver/mateba, null, TRUE, TRUE) - sec_briefcase.SendSignal(COMSIG_TRY_STORAGE_INSERT, new /obj/item/ammo_box/a357, null, TRUE, TRUE) - sec_briefcase.SendSignal(COMSIG_TRY_STORAGE_INSERT, new /obj/item/grenade/plastic/x4, null, TRUE, TRUE) + SEND_SIGNAL(sec_briefcase, COMSIG_TRY_STORAGE_INSERT, new /obj/item/stack/spacecash/c1000, null, TRUE, TRUE) + SEND_SIGNAL(sec_briefcase, COMSIG_TRY_STORAGE_INSERT, new /obj/item/gun/energy/kinetic_accelerator/crossbow, null, TRUE, TRUE) + SEND_SIGNAL(sec_briefcase, COMSIG_TRY_STORAGE_INSERT, new /obj/item/gun/ballistic/revolver/mateba, null, TRUE, TRUE) + SEND_SIGNAL(sec_briefcase, COMSIG_TRY_STORAGE_INSERT, new /obj/item/ammo_box/a357, null, TRUE, TRUE) + SEND_SIGNAL(sec_briefcase, COMSIG_TRY_STORAGE_INSERT, new /obj/item/grenade/plastic/x4, null, TRUE, TRUE) var/obj/item/pda/heads/pda = H.belt pda.owner = H.real_name diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index 48b69c9568..cd8930641f 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -27,7 +27,7 @@ /datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H) . = ..() - var/obj/item/radio/uplink/U = new /obj/item/radio/uplink/nuclear_restricted(H, H.key, 80) + var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80) H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H) W.implant(H) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 9f0d8358ac..c81505d8e8 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -1,5 +1,5 @@ /obj/item/clothing/shoes/proc/step_action() //this was made to rewrite clown shoes squeaking - SendSignal(COMSIG_SHOES_STEP_ACTION) + SEND_SIGNAL(src, COMSIG_SHOES_STEP_ACTION) /obj/item/clothing/shoes/sneakers/mime name = "mime shoes" @@ -64,7 +64,7 @@ /obj/item/clothing/shoes/galoshes/dry/step_action() var/turf/open/t_loc = get_turf(src) - t_loc.SendSignal(COMSIG_TURF_MAKE_DRY, TURF_WET_WATER, TRUE, INFINITY) + SEND_SIGNAL(t_loc, COMSIG_TURF_MAKE_DRY, TURF_WET_WATER, TRUE, INFINITY) /obj/item/clothing/shoes/clown_shoes desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!" @@ -82,12 +82,12 @@ /obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot) . = ..() if(user.mind && user.mind.assigned_role == "Clown") - user.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "noshoes") + SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "noshoes") /obj/item/clothing/shoes/clown_shoes/dropped(mob/user) . = ..() if(user.mind && user.mind.assigned_role == "Clown") - user.SendSignal(COMSIG_ADD_MOOD_EVENT, "noshoes", /datum/mood_event/noshoes) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "noshoes", /datum/mood_event/noshoes) /obj/item/clothing/shoes/clown_shoes/jester name = "jester shoes" @@ -157,7 +157,7 @@ icon_state = "cultalt" /obj/item/clothing/shoes/cult/alt/ghost - flags_1 = NODROP_1|DROPDEL_1 + item_flags = NODROP | DROPDEL /obj/item/clothing/shoes/cyborg name = "cyborg boots" diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index b3b74446ec..d0820304fe 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -98,7 +98,7 @@ teleporting = 0 for(var/obj/item/I in user.held_items) if(I in hands_nodrop) - I.flags_1 &= ~NODROP_1 + I.item_flags &= ~NODROP if(camera) camera.remove_target_ui() camera.forceMove(user) @@ -133,9 +133,9 @@ hands_nodrop = list() for(var/obj/item/I in user.held_items) - if(!(I.flags_1 & NODROP_1)) + if(!(I.item_flags & NODROP)) hands_nodrop += I - I.flags_1 |= NODROP_1 + I.item_flags |= NODROP user.animate_movement = NO_STEPS user.changeNext_move(8 + phase_in_ds) user.notransform = 1 @@ -194,9 +194,9 @@ if(user.head && istype(user.head, /obj/item/clothing/head/helmet/space/chronos)) to_chat(user, "\[ ok \] Mounting /dev/helm") helmet = user.head - helmet.flags_1 |= NODROP_1 + helmet.item_flags |= NODROP helmet.suit = src - src.flags_1 |= NODROP_1 + src.item_flags |= NODROP to_chat(user, "\[ ok \] Starting brainwave scanner") to_chat(user, "\[ ok \] Starting ui display driver") to_chat(user, "\[ ok \] Initializing chronowalk4-view") @@ -215,7 +215,7 @@ activating = 1 var/mob/living/carbon/human/user = src.loc var/hard_landing = teleporting && force - src.flags_1 &= ~NODROP_1 + item_flags &= ~NODROP cooldown = world.time + cooldowntime * 1.5 activated = 0 activating = 0 @@ -236,7 +236,7 @@ to_chat(user, "\[ ok \] Unmounting /dev/helmet") to_chat(user, "logout") if(helmet) - helmet.flags_1 &= ~NODROP_1 + helmet.item_flags &= ~NODROP helmet.suit = null helmet = null if(camera) diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index d117bf482b..176bc81665 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -302,7 +302,7 @@ if(suit && !suit.deployedshoes && (brake || stabilizer)) brake = FALSE stabilizer = FALSE - usermessage("Warning: Sensor data is not being recieved from flight shoes. Stabilizers and airbrake modules deactivated!", "boldwarning") + usermessage("Warning: Sensor data is not being received from flight shoes. Stabilizers and airbrake modules deactivated!", "boldwarning") /obj/item/flightpack/process() @@ -897,7 +897,7 @@ usermessage("You're already wearing something on your back!", "boldwarning") return FALSE user.equip_to_slot_if_possible(pack,SLOT_BACK,0,0,1) - pack.flags_1 |= NODROP_1 + pack.item_flags |= NODROP resync() user.visible_message("A [pack.name] extends from [user]'s [name] and clamps to [user.p_their()] back!") user.update_inv_wear_suit() @@ -911,7 +911,7 @@ return FALSE if(pack.flight && forced) pack.disable_flight(1) - pack.flags_1 &= ~NODROP_1 + pack.item_flags &= ~NODROP resync() if(user) user.transferItemToLoc(pack, src, TRUE) @@ -935,14 +935,14 @@ usermessage("You're already wearing something on your feet!", "boldwarning") return FALSE user.equip_to_slot_if_possible(shoes,SLOT_SHOES,0,0,1) - shoes.flags_1 |= NODROP_1 + shoes.item_flags |= NODROP user.visible_message("[user]'s [name] extends a pair of [shoes.name] over [user.p_their()] feet!") user.update_inv_wear_suit() playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) deployedshoes = TRUE /obj/item/clothing/suit/space/hardsuit/flightsuit/proc/retract_flightshoes(forced = FALSE) - shoes.flags_1 &= ~NODROP_1 + shoes.item_flags &= ~NODROP playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1) if(user) user.transferItemToLoc(shoes, src, TRUE) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 0667f2be6f..2e5896098f 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -713,7 +713,7 @@ icon_state = "ert_medical" item_state = "ert_medical" item_color = "ert_medical" - flags_1 = NODROP_1 //Dont want people changing into the other teams gear + item_flags = NODROP //Dont want people changing into the other teams gear helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95) slowdown = 0 diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index f3975d1f81..a4b82c8234 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -165,7 +165,7 @@ Contains: item_color = "ert_commander" armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80) strip_delay = 130 - flags_1 = NODROP_1 + item_flags = NODROP brightness_on = 7 /obj/item/clothing/suit/space/hardsuit/ert @@ -265,7 +265,7 @@ Contains: armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75) //As whimpy as a space carp brightness_on = 0 //luminosity when on actions_types = list() - flags_1 = NODROP_1 + item_flags = NODROP /obj/item/clothing/suit/space/hardsuit/carp diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index ea300aaf13..f73ca30fb0 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -53,7 +53,7 @@ /obj/item/clothing/suit/armor/hos/trenchcoat name = "armored trenchoat" - desc = "A trenchcoat enchanced with a special lightweight kevlar. The epitome of tactical plainclothes." + desc = "A trenchcoat enhanced with a special lightweight kevlar. The epitome of tactical plainclothes." icon_state = "hostrench" item_state = "hostrench" flags_inv = 0 diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index d38c625ee2..1c24ee17a7 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -2,7 +2,7 @@ /obj/item/clothing/head/bio_hood name = "bio hood" icon_state = "bio" - desc = "A hood that protects the head and face from biological comtaminants." + desc = "A hood that protects the head and face from biological contaminants." permeability_coefficient = 0.01 clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 80, "fire" = 30, "acid" = 100) diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index 8b87cf6f6e..85767852e4 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -15,7 +15,7 @@ icon_state = "golhood" desc = "A hood for a cloak." body_parts_covered = HEAD - flags_1 = NODROP_1 + item_flags = NODROP flags_inv = HIDEHAIR|HIDEEARS /obj/item/clothing/neck/cloak/suicide_act(mob/user) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 1b28c71c4b..a598bd0959 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -17,13 +17,13 @@ item_state = "labcoat_cmo" /obj/item/clothing/suit/toggle/labcoat/emt - name = "EMT's jacket" + name = "\improper EMT's jacket" desc = "A dark blue jacket with reflective strips for emergency medical technicians." icon_state = "labcoat_emt" item_state = "labcoat_cmo" /obj/item/clothing/suit/toggle/labcoat/mad - name = "\improper The Mad's labcoat" + name = "\proper The Mad's labcoat" desc = "It makes you look capable of konking someone on the noggin and shooting them into space." icon_state = "labgreen" item_state = "labgreen" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index f6cb6a44ad..112a2790af 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -222,7 +222,7 @@ desc = "Forced to live on your shameful acting as a fake Mexican, you and your poncho have grown inseparable. Literally." icon_state = "ponchoshame" item_state = "ponchoshame" - flags_1 = NODROP_1 + item_flags = NODROP /obj/item/clothing/suit/whitedress name = "white dress" @@ -311,7 +311,7 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR /obj/item/clothing/suit/security/officer/russian - name = "russian officer's jacket" + name = "\improper Russian officer's jacket" desc = "This jacket is for those special occasions when a russian officer isn't required to wear their armor." icon_state = "officertanjacket" item_state = "officertanjacket" diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 0ac6dba14e..59f7a1c387 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -81,7 +81,7 @@ /obj/item/clothing/suit/wizrobe/yellow name = "yellow wizard robe" - desc = "A magnificant yellow gem-lined robe that seems to radiate power." + desc = "A magnificent yellow gem-lined robe that seems to radiate power." icon_state = "yellowwizard" item_state = "yellowwizrobe" diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 235eac6704..8d250ab766 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -14,7 +14,7 @@ /obj/item/clothing/accessory/proc/attach(obj/item/clothing/under/U, user) GET_COMPONENT(storage, /datum/component/storage) if(storage) - if(U.SendSignal(COMSIG_CONTAINS_STORAGE)) + if(SEND_SIGNAL(U, COMSIG_CONTAINS_STORAGE)) return FALSE U.TakeComponent(storage) detached_pockets = storage diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index afb9bff1c1..324c16fec7 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -22,7 +22,7 @@ resistance_flags = NONE /obj/item/clothing/under/color/black/ghost - flags_1 = NODROP_1|DROPDEL_1 + item_flags = NODROP | DROPDEL /obj/item/clothing/under/color/grey name = "grey jumpsuit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 8c85f414e6..57ead15de8 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -38,7 +38,7 @@ can_adjust = FALSE /obj/item/clothing/under/roman - name = "roman armor" + name = "\improper Roman armor" desc = "Ancient Roman armor. Made of metallic and leather straps." icon_state = "roman" item_color = "roman" @@ -388,7 +388,7 @@ /obj/item/clothing/under/kilt/highlander desc = "You're the only one worthy of this kilt." - flags_1 = NODROP_1 + item_flags = NODROP /obj/item/clothing/under/sexymime name = "sexy mime outfit" @@ -667,7 +667,7 @@ icon = 'icons/obj/device.dmi' /obj/item/clothing/under/rank/security/navyblue/russian - name = "russian officer's uniform" + name = "\improper Russian officer's uniform" desc = "The latest in fashionable russian outfits." icon_state = "hostanclothes" item_state = "hostanclothes" diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 7d309bd9c7..ea1db981e5 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -100,6 +100,7 @@ .["other"][I.type] += S.amount else if(I.tool_behaviour) .["tool_behaviour"] += I.tool_behaviour + .["other"][I.type] += 1 else if(istype(I, /obj/item/reagent_containers)) var/obj/item/reagent_containers/RC = I @@ -182,7 +183,7 @@ After its done loop over deletion list and delete all the shit that wasnt taken by parts loop - del_reqs return the list of parts resulting object will recieve as argument of CheckParts proc, on the atom level it will add them all to the contents, on all other levels it calls ..() and does whatever is needed afterwards but from contents list already + del_reqs return the list of parts resulting object will receive as argument of CheckParts proc, on the atom level it will add them all to the contents, on all other levels it calls ..() and does whatever is needed afterwards but from contents list already */ /datum/personal_crafting/proc/del_reqs(datum/crafting_recipe/R, mob/user) diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index d17090816c..a97758e294 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -40,8 +40,8 @@ return if(!isturf(I.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up. - if(I.loc.SendSignal(COMSIG_CONTAINS_STORAGE)) //in a container. - I.loc.SendSignal(COMSIG_TRY_STORAGE_TAKE, I, src) + if(SEND_SIGNAL(I.loc, COMSIG_CONTAINS_STORAGE)) //in a container. + SEND_SIGNAL(I.loc, COMSIG_TRY_STORAGE_TAKE, I, src) if(!user.dropItemToGround(I)) return diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm index 5f4603e35e..50a845a689 100644 --- a/code/modules/detectivework/footprints_and_rag.dm +++ b/code/modules/detectivework/footprints_and_rag.dm @@ -12,7 +12,7 @@ w_class = WEIGHT_CLASS_TINY icon = 'icons/obj/toy.dmi' icon_state = "rag" - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON container_type = OPENCONTAINER amount_per_transfer_from_this = 5 possible_transfer_amounts = list() @@ -46,5 +46,5 @@ user.visible_message("[user] starts to wipe down [A] with [src]!", "You start to wipe down [A] with [src]...") if(do_after(user,30, target = A)) user.visible_message("[user] finishes wiping off [A]!", "You finish wiping off [A].") - A.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) + SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) return diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index c323f1edf2..e8847adb11 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -11,7 +11,8 @@ item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - flags_1 = CONDUCT_1 | NOBLUDGEON_1 + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_BELT var/scanning = 0 var/list/log = list() @@ -200,4 +201,4 @@ return to_chat(user, "Scanner Report") for(var/iterLog in log) - to_chat(user, iterLog) \ No newline at end of file + to_chat(user, iterLog) diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm index 745e8a6ac3..89a84d3494 100644 --- a/code/modules/events/aurora_caelus.dm +++ b/code/modules/events/aurora_caelus.dm @@ -14,8 +14,8 @@ announceWhen = 1 startWhen = 9 endWhen = 50 - var/list/aurora_colors = list("#A2FF80", "#A2FF8B", "#A2FF96", "#A2FFA5", "#A2FFB6", "#A2FFC7", "#A2FFDE") - var/aurora_progress = 0 //this cycles from 1 to 7, slowly changing colors from gentle green to gentle blue + var/list/aurora_colors = list("#A2FF80", "#A2FF8B", "#A2FF96", "#A2FFA5", "#A2FFB6", "#A2FFC7", "#A2FFDE", "#A2FFEE") + var/aurora_progress = 0 //this cycles from 1 to 8, slowly changing colors from gentle green to gentle blue /datum/round_event/aurora_caelus/announce() priority_announce("[station_name()]: A harmless cloud of ions is approaching your station, and will exhaust their energy battering the hull. Nanotrasen has approved a short break for all employees to relax and observe this very rare event. During this time, starlight will be bright but gentle, shifting between quiet green and blue colors. Any staff who would like to view these lights for themselves may proceed to the area nearest to them with viewing ports to open space. We hope you enjoy the lights.", diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 81e93244ea..f09c0481f6 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -61,7 +61,7 @@ else D = new virus_type() else - D = make_virus(max_severity, max_severity) + D = new /datum/disease/advance/random(max_severity, max_severity) D.carrier = TRUE H.ForceContractDisease(D, FALSE, TRUE) @@ -73,23 +73,3 @@ message_admins("An event has triggered a random advanced virus outbreak on [ADMIN_LOOKUPFLW(H)]! It has these symptoms: [english_list(name_symptoms)]") log_game("An event has triggered a random advanced virus outbreak on [key_name(H)]! It has these symptoms: [english_list(name_symptoms)]") break - -/datum/round_event/disease_outbreak/proc/make_virus(max_symptoms, max_level) - if(max_symptoms > VIRUS_SYMPTOM_LIMIT) - max_symptoms = VIRUS_SYMPTOM_LIMIT - var/datum/disease/advance/A = new /datum/disease/advance() - var/list/datum/symptom/possible_symptoms = list() - for(var/symptom in subtypesof(/datum/symptom)) - var/datum/symptom/S = symptom - if(initial(S.level) > max_level) - continue - if(initial(S.level) <= 0) //unobtainable symptoms - continue - possible_symptoms += S - for(var/i in 1 to max_symptoms) - var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms) - if(chosen_symptom) - var/datum/symptom/S = new chosen_symptom - A.symptoms += S - A.Refresh() //just in case someone already made and named the same disease - return A diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index 180589b4f1..a6e08fbd8c 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -50,7 +50,7 @@ var/obj/item/I = new J //dumb but required because of byond throwing a fit anytime new gets too close to a list H.dropItemToGround(H.get_item_by_slot(i), TRUE) H.equip_to_slot_or_del(I, i) - I.flags_1 |= NODROP_1 | DROPDEL_1 + I.item_flags |= NODROP | DROPDEL I.name = "cursed " + I.name for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index 08cfe7aeea..d94ee0e212 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -16,7 +16,7 @@ GET_COMPONENT_FROM(STR, /datum/component/storage, S) if(prob(upgrade_scroll_chance) && S.contents.len < STR.max_items && !S.invisibility) var/obj/item/upgradescroll/scroll = new - S.SendSignal(COMSIG_TRY_STORAGE_INSERT, scroll, null, TRUE, TRUE) + SEND_SIGNAL(S, COMSIG_TRY_STORAGE_INSERT, scroll, null, TRUE, TRUE) upgrade_scroll_chance = max(0,upgrade_scroll_chance-100) upgrade_scroll_chance += 25 @@ -77,7 +77,7 @@ attached = null /datum/rpg_loot/proc/randomise() - var/static/list/prefixespositive = list("greater", "major", "blessed", "superior", "enpowered", "honed", "true", "glorious", "robust") + var/static/list/prefixespositive = list("greater", "major", "blessed", "superior", "empowered", "honed", "true", "glorious", "robust") var/static/list/prefixesnegative = list("lesser", "minor", "blighted", "inferior", "enfeebled", "rusted", "unsteady", "tragic", "gimped") var/static/list/suffixes = list("orc slaying", "elf slaying", "corgi slaying", "strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma", "the forest", "the hills", "the plains", "the sea", "the sun", "the moon", "the void", "the world", "the fool", "many secrets", "many tales", "many colors", "rending", "sundering", "the night", "the day") diff --git a/code/modules/fields/gravity.dm b/code/modules/fields/gravity.dm new file mode 100644 index 0000000000..8b16bb6487 --- /dev/null +++ b/code/modules/fields/gravity.dm @@ -0,0 +1,17 @@ +/datum/proximity_monitor/advanced/gravity + name = "modified gravity zone" + setup_field_turfs = TRUE + var/gravity_value = 0 + var/list/grav_components = list() + field_shape = FIELD_SHAPE_RADIUS_SQUARE + +/datum/proximity_monitor/advanced/gravity/setup_field_turf(turf/T) + . = ..() + grav_components[T] = T.AddComponent(/datum/component/forced_gravity,gravity_value) + +/datum/proximity_monitor/advanced/gravity/cleanup_field_turf(turf/T) + . = ..() + var/datum/component/forced_gravity/G = grav_components[T] + grav_components -= T + if(G) + qdel(G) \ No newline at end of file diff --git a/code/modules/fields/turf_objects.dm b/code/modules/fields/turf_objects.dm index 7d7454f46a..d37036d83c 100644 --- a/code/modules/fields/turf_objects.dm +++ b/code/modules/fields/turf_objects.dm @@ -6,7 +6,7 @@ icon_state = null alpha = 0 invisibility = INVISIBILITY_ABSTRACT - flags_1 = ABSTRACT_1|ON_BORDER_1 + flags_1 = ON_BORDER_1 mouse_opacity = MOUSE_OPACITY_TRANSPARENT var/datum/proximity_monitor/advanced/parent = null diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 1ade5070a7..a21747837b 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -915,7 +915,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( /datum/hallucination/fake_alert/New(mob/living/carbon/C, forced = TRUE, specific, duration = 150) set waitfor = FALSE ..() - var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temphot","tempcold","pressure") + var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","gravity","fire","locked","hacked","temphot","tempcold","pressure") if(specific) alert_type = specific feedback_details += "Type: [alert_type]" @@ -937,7 +937,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.throw_alert(alert_type, /obj/screen/alert/fat, override = TRUE) else target.throw_alert(alert_type, /obj/screen/alert/starving, override = TRUE) - if("weightless") + if("gravity") target.throw_alert(alert_type, /obj/screen/alert/weightless, override = TRUE) if("fire") target.throw_alert(alert_type, /obj/screen/alert/fire, override = TRUE) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index dc903dce85..d84deb8132 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -250,6 +250,11 @@ list_reagents = list("beer" = 30) foodtype = GRAIN | ALCOHOL +/obj/item/reagent_containers/food/drinks/beer/light + name = "Carp Lite" + desc = "Brewed with \"Pure Ice Asteroid Spring Water\"." + list_reagents = list("light_beer" = 30) + /obj/item/reagent_containers/food/drinks/ale name = "Magm-Ale" desc = "A true dorf's drink of choice." diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 375ce80f96..f9d9a3d85a 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -23,15 +23,15 @@ if(foodtype & H.dna.species.toxic_food) to_chat(H,"What the hell was that thing?!") H.adjust_disgust(25 + 30 * fraction) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food) else if(foodtype & H.dna.species.disliked_food) to_chat(H,"That didn't taste very good...") H.adjust_disgust(11 + 15 * fraction) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) else if(foodtype & H.dna.species.liked_food) to_chat(H,"I love this taste!") H.adjust_disgust(-5 + -2.5 * fraction) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food) else if(foodtype & H.dna.species.toxic_food) to_chat(H, "You don't feel so good...") diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 3df4ca4bd0..e98aae37e3 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -118,8 +118,8 @@ if(INGREDIENTS_STACKPLUSTOP) filling.pixel_x = rand(-1,1) filling.pixel_y = 2 * ingredients.len - 1 - if(our_overlays) - our_overlays.Cut(ingredients.len) //???, add overlay calls later in this proc will queue the compile if necessary + if(overlays) + overlays -= overlays[ingredients.len] var/mutable_appearance/TOP = mutable_appearance(icon, "[icon_state]_top") TOP.pixel_y = 2 * ingredients.len + 3 add_overlay(filling) diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 85371e0875..a74c7c6f69 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -109,7 +109,7 @@ M.satiety -= junkiness playsound(M.loc,'sound/items/eatfood.ogg', rand(10,50), 1) if(reagents.total_volume) - SendSignal(COMSIG_FOOD_EATEN, M, user) + SEND_SIGNAL(src, COMSIG_FOOD_EATEN, M, user) var/fraction = min(bitesize / reagents.total_volume, 1) reagents.reaction(M, INGEST, fraction) reagents.trans_to(M, bitesize) diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 01105cf6d3..80aa588bae 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -406,8 +406,8 @@ name = "stack of pancakes" else name = initial(name) - if(contents.len < LAZYLEN(our_overlays)) - cut_overlay(our_overlays[our_overlays.len]) + if(contents.len < LAZYLEN(overlays)) + overlays-=overlays[overlays.len] /obj/item/reagent_containers/food/snacks/pancakes/examine(mob/user) var/ingredients_listed = "" diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 5efcb98faf..04177783e6 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -56,7 +56,7 @@ if(!H.creamed) // one layer at a time H.add_overlay(creamoverlay) H.creamed = TRUE - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "creampie", /datum/mood_event/creampie) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "creampie", /datum/mood_event/creampie) qdel(src) /obj/item/reagent_containers/food/snacks/pie/cream/nostun diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index bdcc8e14ac..5e7a3db504 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -95,7 +95,7 @@ God bless America. else if(default_deconstruction_screwdriver(user, "fryer_off", "fryer_off" ,I)) //where's the open maint panel icon?! return else - if(is_type_in_typecache(I, deepfry_blacklisted_items) || (I.flags_1 & (ABSTRACT_1 | NODROP_1 | DROPDEL_1))) + if(is_type_in_typecache(I, deepfry_blacklisted_items) || (I.item_flags & (ABSTRACT | NODROP | DROPDEL))) return ..() else if(!frying && user.transferItemToLoc(I, src)) to_chat(user, "You put [I] into [src].") diff --git a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm index 42da7e226b..b1da39daf3 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm @@ -92,7 +92,7 @@ to_chat(user, "[src] is at full capacity.") break else - if(T.SendSignal(COMSIG_TRY_STORAGE_TAKE, S, src)) + if(SEND_SIGNAL(T, COMSIG_TRY_STORAGE_TAKE, S, src)) if(stored_food[sanitize(S.name)]) stored_food[sanitize(S.name)]++ else diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index d960d9945b..e6734b4b58 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -78,7 +78,7 @@ if(!ignore_clothing) for(var/obj/item/I in C.held_items + C.get_equipped_items()) - if(!(I.flags_1 & NODROP_1)) + if(!(I.item_flags & NODROP)) to_chat(user, "Subject may not have abiotic items on.") return diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index ee04e73fbe..8c4e0eaae0 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -129,7 +129,7 @@ if (contents.len>=max_n_of_items) to_chat(user, "[src] is full, you can't put anything in!") return 1 - if(T.SendSignal(COMSIG_TRY_STORAGE_TAKE, S, src)) + if(SEND_SIGNAL(T, COMSIG_TRY_STORAGE_TAKE, S, src)) loaded++ if(loaded) diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 2ec1e56adb..3f917273b4 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -60,7 +60,7 @@ for(var/obj/item/reagent_containers/food/snacks/S in T.contents) var/datum/food_processor_process/P = select_recipe(S) if(P) - if(T.SendSignal(COMSIG_TRY_STORAGE_TAKE, S, src)) + if(SEND_SIGNAL(T, COMSIG_TRY_STORAGE_TAKE, S, src)) loaded++ if(loaded) @@ -106,7 +106,7 @@ for(var/O in src.contents) var/datum/food_processor_process/P = select_recipe(O) if (!P) - log_admin("DEBUG: [O] in processor hasnt got a suitable recipe. How did it get in there? Please report it immediatly!!!") + log_admin("DEBUG: [O] in processor doesn't have a suitable recipe. How did it get in there? Please report it immediately!!!") continue total_time += P.time var/offset = prob(50) ? -2 : 2 @@ -115,7 +115,7 @@ for(var/atom/movable/O in src.contents) var/datum/food_processor_process/P = select_recipe(O) if (!P) - log_admin("DEBUG: [O] in processor havent suitable recipe. How do you put it in?") + log_admin("DEBUG: [O] in processor doesn't have a suitable recipe. How do you put it in?") continue process_food(P, O) pixel_x = initial(pixel_x) //return to its spot after shaking diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 11da92dce0..79202e8190 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -125,8 +125,8 @@ else return TRUE else - if(O.loc.SendSignal(COMSIG_CONTAINS_STORAGE)) - return O.loc.SendSignal(COMSIG_TRY_STORAGE_TAKE, O, src) + if(SEND_SIGNAL(O.loc, COMSIG_CONTAINS_STORAGE)) + return SEND_SIGNAL(O.loc, COMSIG_TRY_STORAGE_TAKE, O, src) else O.forceMove(src) return TRUE @@ -327,7 +327,7 @@ desc = "A refrigerated storage unit for tasty tasty alcohol." /obj/machinery/smartfridge/drinks/accept_check(obj/item/O) - if(!istype(O, /obj/item/reagent_containers) || (O.flags_1 & ABSTRACT_1) || !O.reagents || !O.reagents.reagent_list.len) + if(!istype(O, /obj/item/reagent_containers) || (O.item_flags & ABSTRACT) || !O.reagents || !O.reagents.reagent_list.len) return FALSE if(istype(O, /obj/item/reagent_containers/glass) || istype(O, /obj/item/reagent_containers/food/drinks) || istype(O, /obj/item/reagent_containers/food/condiment)) return TRUE @@ -375,7 +375,7 @@ return FALSE return TRUE return FALSE - if(!istype(O, /obj/item/reagent_containers) || (O.flags_1 & ABSTRACT_1)) + if(!istype(O, /obj/item/reagent_containers) || (O.item_flags & ABSTRACT)) return FALSE if(istype(O, /obj/item/reagent_containers/pill)) // empty pill prank ok return TRUE @@ -415,6 +415,7 @@ /obj/machinery/smartfridge/disks name = "disk compartmentalizer" desc = "A machine capable of storing a variety of disks. Denoted by most as the DSU (disk storage unit)." + icon_state = "disktoaster" /obj/machinery/smartfridge/disks/accept_check(obj/item/O) if(istype(O, /obj/item/disk/)) diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index d6e3232baa..55d5a806bd 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -208,7 +208,18 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic for(var/I in targets) //Grab us a client if possible - var/client/C = grab_client(I) + var/client/C + if (ismob(I)) + var/mob/M = I + if(M.client) + C = M.client + else if(istype(I, /client)) + C = I + else if(istype(I, /datum/mind)) + var/datum/mind/M = I + if(M.current && M.current.client) + C = M.current.client + if (!C) continue @@ -226,15 +237,3 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic // url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript. C << output(url_encode(url_encode(message)), "browseroutput:output") - -/proc/grab_client(target) - if(istype(target, /client)) - return target - else if(ismob(target)) - var/mob/M = target - if(M.client) - return M.client - else if(istype(target, /datum/mind)) - var/datum/mind/M = target - if(M.current && M.current.client) - return M.current.client diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index 045177c92d..15265b2a93 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -95,8 +95,53 @@ if (typeof String.prototype.trim !== 'function') { }; } +// Linkify the contents of a node, within its parent. +function linkify(parent, insertBefore, text) { + var start = 0; + var match; + var regex = /(?:(?:https?:\/\/)|(?:www\.))(?:[^ ]*?\.[^ ]*?)+[-A-Za-z0-9+&@#\/%?=~_|$!:,.;()]+/ig; + while ((match = regex.exec(text)) !== null) { + // add the unmatched text + parent.insertBefore(document.createTextNode(text.substring(start, match.index)), insertBefore); + + var href = match[0]; + if (!/^https?:\/\//i.test(match[0])) { + href = "http://" + match[0]; + } + + // add the link + var link = document.createElement("a"); + link.href = href; + link.textContent = match[0]; + parent.insertBefore(link, insertBefore); + + start = regex.lastIndex; + } + if (start !== 0) { + // add the remaining text and remove the original text node + parent.insertBefore(document.createTextNode(text.substring(start)), insertBefore); + parent.removeChild(insertBefore); + } +} + +// Recursively linkify the children of a given node. +function linkify_node(node) { + var children = node.childNodes; + // work backwards to avoid the risk of looping forever on our own output + for (var i = children.length - 1; i >= 0; --i) { + var child = children[i]; + if (child.nodeType == Node.TEXT_NODE) { + // text is to be linkified + linkify(node, child, child.textContent); + } else if (child.nodeName != "A" && child.nodeName != "a") { + // do not linkify existing links + linkify_node(child); + } + } +} + //Shit fucking piece of crap that doesn't work god fuckin damn it -function linkify(text) { +function linkify_fallback(text) { var rex = /((?: 0) { diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 6cc3f56461..829cb55312 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -147,7 +147,7 @@ desc = "The Cross represents the Assistants that died for your sins." icon_state = "hotcrossbun" -/datum/crafting_recipe/food/food/hotcrossbun +/datum/crafting_recipe/food/hotcrossbun name = "Hot-Cross Bun" reqs = list( /obj/item/reagent_containers/food/snacks/store/bread/plain = 1, @@ -171,7 +171,7 @@ icon_state = "briochecake_slice" filling_color = "#FFD700" -/datum/crafting_recipe/food/food/briochecake +/datum/crafting_recipe/food/briochecake name = "Brioche cake" reqs = list( /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index a1f1394e16..4590d58174 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -136,7 +136,7 @@ if(prob(30)) do_sparks(2, 1, T) T.ex_act(EXPLODE_LIGHT) - T.hotspot_expose(1000,500,1) + T.hotspot_expose(700,25,1) if(!(obj_flags & EMAGGED)) for(var/item in spawned) diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm index c83e7d5520..4134b0516f 100644 --- a/code/modules/holodeck/holo_effect.dm +++ b/code/modules/holodeck/holo_effect.dm @@ -100,6 +100,11 @@ /obj/effect/holodeck_effect/mobspawner/penguin mobtype = /mob/living/simple_animal/pet/penguin/emperor + +/obj/effect/holodeck_effect/mobspawner/penguin/Initialize() + if(prob(1)) + mobtype = /mob/living/simple_animal/pet/penguin/emperor/shamebrero + return ..() /obj/effect/holodeck_effect/mobspawner/penguin_baby mobtype = /mob/living/simple_animal/pet/penguin/baby diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index c7a775523a..c94e0ad32e 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -112,7 +112,7 @@ for(var/obj/item/reagent_containers/food/snacks/grown/G in PB.contents) if(i >= max_items) break - if(PB.SendSignal(COMSIG_TRY_STORAGE_TAKE, G, src)) + if(SEND_SIGNAL(PB, COMSIG_TRY_STORAGE_TAKE, G, src)) i++ if(iYou empty the plant bag into the biogenerator.") diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 89206342b1..6f5a1a0ee4 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -146,7 +146,7 @@ if(W.is_hot()) StartBurning() if(grill) - if(user.a_intent != INTENT_HARM && !(W.flags_1 & ABSTRACT_1)) + if(user.a_intent != INTENT_HARM && !(W.item_flags & ABSTRACT)) if(user.temporarilyRemoveItemFromInventory(W)) W.forceMove(get_turf(src)) var/list/click_params = params2list(params) @@ -203,7 +203,7 @@ /obj/structure/bonfire/proc/Burn() var/turf/current_location = get_turf(src) - current_location.hotspot_expose(1000,500,1) + current_location.hotspot_expose(1000,100,1) for(var/A in current_location) if(A == src) continue diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 5e75a57c32..f464fccf91 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -779,7 +779,7 @@ else if(istype(O, /obj/item/storage/bag/plants)) attack_hand(user) for(var/obj/item/reagent_containers/food/snacks/grown/G in locate(user.x,user.y,user.z)) - O.SendSignal(COMSIG_TRY_STORAGE_INSERT, G, user, TRUE) + SEND_SIGNAL(O, COMSIG_TRY_STORAGE_INSERT, G, user, TRUE) else if(default_unfasten_wrench(user, O)) return diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 4ba1aa0c33..2a28b7b097 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -9,7 +9,7 @@ resistance_flags = FLAMMABLE var/plantname = "Plants" // Name of plant when planted. var/product // A type path. The thing that is created when the plant is harvested. - var/species = "" // Used to update icons. Should match the name in the sprites unless all icon_* are overriden. + var/species = "" // Used to update icons. Should match the name in the sprites unless all icon_* are overridden. var/growing_icon = 'icons/obj/hydroponics/growing.dmi' //the file that stores the sprites of the growing plant from this seed. var/icon_grow // Used to override grow icon (default is "[species]-grow"). You can use one grow icon for multiple closely related plants with it. diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 6dd3f43592..d39163b547 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -8,8 +8,9 @@ w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/assemblies/electronic_setups.dmi' icon_state = "setup_small" - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON materials = list() // To be filled later + datum_flags = DF_USE_TAG var/list/assembly_components = list() var/list/ckeys_allowed_to_scan = list() // Players who built the circuit can scan it as a ghost. var/max_components = IC_MAX_SIZE_BASE @@ -30,6 +31,8 @@ var/combat_circuits = 0 //number of combat cicuits in the assembly, used for diagnostic hud var/long_range_circuits = 0 //number of long range cicuits in the assembly, used for diagnostic hud var/prefered_hud_icon = "hudstat" // Used by the AR circuit to change the hud icon. + var/creator // circuit creator if any + var/static/next_assembly_id = 0 hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD, DIAG_CIRCUIT_HUD) //diagnostic hud overlays max_integrity = 50 pass_flags = 0 @@ -56,14 +59,17 @@ COLOR_ASSEMBLY_PURPLE ) +/obj/item/electronic_assembly/GenerateTag() + tag = "assembly_[next_assembly_id++]" + /obj/item/electronic_assembly/examine(mob/user) . = ..() if(can_anchor) - to_chat(user, "The anchoring bolts [anchored ? "are" : "can be"] wrenched in place and the maintainence panel [opened ? "can be" : "is"] screwed in place.") + to_chat(user, "The anchoring bolts [anchored ? "are" : "can be"] wrenched in place and the maintenance panel [opened ? "can be" : "is"] screwed in place.") else - to_chat(user, "The maintainence panel [opened ? "can be" : "is"] screwed in place.") + to_chat(user, "The maintenance panel [opened ? "can be" : "is"] screwed in place.") - if(isobserver(user) && ckeys_allowed_to_scan[user.ckey]) + if((isobserver(user) && ckeys_allowed_to_scan[user.ckey]) || IsAdminGhost(user)) to_chat(user, "You can scan this circuit."); /obj/item/electronic_assembly/proc/check_interactivity(mob/user) @@ -186,7 +192,7 @@ return 1 if(href_list["ghostscan"]) - if(isobserver(usr) && ckeys_allowed_to_scan[usr.ckey]) + if((isobserver(usr) && ckeys_allowed_to_scan[usr.ckey]) || IsAdminGhost(usr)) if(assembly_components.len) var/saved = "On circuit printers with cloning enabled, you may use the code below to clone the circuit:

    [SScircuit.save_electronic_assembly(src)]" usr << browse(saved, "window=circuit_scan;size=500x600;border=1;can_resize=1;can_close=1;can_minimize=1") @@ -194,6 +200,9 @@ to_chat(usr, "The circuit is empty!") return + if(!check_interactivity(usr)) + return + if(href_list["rename"]) rename(usr) @@ -348,6 +357,7 @@ to_chat(user, "You slide [IC] inside [src].") playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) add_allowed_scanner(user.ckey) + investigate_log("had [IC]([IC.type]) inserted by [key_name(user)].", INVESTIGATE_CIRCUIT) add_component(IC) return TRUE @@ -387,6 +397,7 @@ playsound(src, 'sound/items/crowbar.ogg', 50, 1) user.put_in_hands(IC) add_allowed_scanner(user.ckey) + investigate_log("had [IC]([IC.type]) removed by [key_name(user)].", INVESTIGATE_CIRCUIT) return TRUE diff --git a/code/modules/integrated_electronics/core/debugger.dm b/code/modules/integrated_electronics/core/debugger.dm index 6abaf316da..d6f6a551ad 100644 --- a/code/modules/integrated_electronics/core/debugger.dm +++ b/code/modules/integrated_electronics/core/debugger.dm @@ -4,7 +4,8 @@ settings to specific circuits, or for debugging purposes. It can also pulse activation pins." icon = 'icons/obj/assemblies/electronic_tools.dmi' icon_state = "debugger" - flags_1 = CONDUCT_1 | NOBLUDGEON_1 + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_SMALL var/data_to_write = null var/accepting_refs = FALSE diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm index 9a718df73e..33f7ef96ad 100644 --- a/code/modules/integrated_electronics/core/detailer.dm +++ b/code/modules/integrated_electronics/core/detailer.dm @@ -3,7 +3,8 @@ desc = "A combination autopainter and flash anodizer designed to give electronic assemblies a colorful, wear-resistant finish." icon = 'icons/obj/assemblies/electronic_tools.dmi' icon_state = "detailer" - flags_1 = CONDUCT_1 | NOBLUDGEON_1 + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_SMALL var/data_to_write = null var/accepting_refs = FALSE @@ -44,4 +45,4 @@ if(!in_range(src, user)) return detail_color = color_list[color_choice] - update_icon() \ No newline at end of file + update_icon() diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index d5ebeb3001..57ad917246 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -24,7 +24,7 @@ var/category_text = "NO CATEGORY THIS IS A BUG" // To show up on circuit printer, and perhaps other places. var/removable = TRUE // Determines if a circuit is removable from the assembly. var/displayed_name = "" - + /* Integrated circuits are essentially modular machines. Each circuit has a specific function, and combining them inside Electronic Assemblies allows a creative player the means to solve many problems. Circuits are held inside an electronic assembly, and are wired using special tools. diff --git a/code/modules/integrated_electronics/core/pins.dm b/code/modules/integrated_electronics/core/pins.dm index cc81c20081..c1bbb900fa 100644 --- a/code/modules/integrated_electronics/core/pins.dm +++ b/code/modules/integrated_electronics/core/pins.dm @@ -209,6 +209,7 @@ D [1]/ || write_data_to_pin(new_data) /datum/integrated_io/activate/ask_for_pin_data(mob/user) // This just pulses the pin. + holder.investigate_log(" was manually pulsed by [key_name(user)].", INVESTIGATE_CIRCUIT) holder.check_then_do_work(ord,ignore_power = TRUE) to_chat(user, "You pulse \the [holder]'s [src] pin.") diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index 2cab5ad3b9..f8d1424160 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -12,7 +12,6 @@ var/debug = FALSE // If it's upgraded and can clone, even without config settings. var/current_category = null var/cloning = FALSE // If the printer is currently creating a circuit - var/clone_countdown = 0 // Timestamp for when to print the circuit var/recycling = FALSE // If an assembly is being emptied into this printer var/list/program // Currently loaded save, in form of list @@ -29,26 +28,22 @@ debug = TRUE upgraded = TRUE can_clone = TRUE + fast_clone = TRUE w_class = WEIGHT_CLASS_TINY /obj/item/integrated_circuit_printer/Initialize() . = ..() AddComponent(/datum/component/material_container, list(MAT_METAL), MINERAL_MATERIAL_AMOUNT * 25, TRUE, list(/obj/item/stack, /obj/item/integrated_circuit, /obj/item/electronic_assembly)) -/obj/item/integrated_circuit_printer/Destroy() - STOP_PROCESSING(SSprocessing, src) - return ..() - -/obj/item/integrated_circuit_printer/process() +/obj/item/integrated_circuit_printer/proc/print_program(mob/user) if(!cloning) - STOP_PROCESSING(SSprocessing, src) - if(world.time >= clone_countdown || fast_clone) - var/turf/T = get_turf(src) - T.visible_message("[src] has finished printing its assembly!") - playsound(get_turf(T), 'sound/items/poster_being_created.ogg', 50, TRUE) - SScircuit.load_electronic_assembly(T, program) - cloning = FALSE - STOP_PROCESSING(SSprocessing, src) + return + visible_message("[src] has finished printing its assembly!") + playsound(src, 'sound/items/poster_being_created.ogg', 50, TRUE) + var/obj/item/electronic_assembly/assembly = SScircuit.load_electronic_assembly(get_turf(src), program) + assembly.creator = key_name(user) + assembly.investigate_log("was printed by [assembly.creator].", INVESTIGATE_CIRCUIT) + cloning = FALSE /obj/item/integrated_circuit_printer/attackby(obj/item/O, mob/user) if(istype(O, /obj/item/disk/integrated_circuit/upgrade/advanced)) @@ -141,7 +136,7 @@ if(!program) HTML += " {[fast_clone ? "Print" : "Begin Printing"] Assembly}" else if(cloning) - HTML += " {Cancel Print} - [DisplayTimeText(max(0, clone_countdown - world.time))] remaining until completion" + HTML += " {Cancel Print}" else HTML += " {[fast_clone ? "Print" : "Begin Printing"] Assembly}" @@ -206,6 +201,7 @@ if(istype(built, /obj/item/electronic_assembly)) var/obj/item/electronic_assembly/E = built + E.creator = key_name(usr) E.opened = TRUE E.update_icon() //reupdate diagnostic hud because it was put_in_hands() and not pickup()'ed @@ -213,6 +209,7 @@ E.diag_hud_set_circuitcell() E.diag_hud_set_circuitstat() E.diag_hud_set_circuittracking() + E.investigate_log("was printed by [E.creator].", INVESTIGATE_CIRCUIT) to_chat(usr, "[capitalize(built.name)] printed.") playsound(src, 'sound/items/jaws_pry.ogg', 50, TRUE) @@ -226,8 +223,10 @@ return switch(href_list["print"]) if("load") + if(cloning) + return var/input = input("Put your code there:", "loading", null, null) as message | null - if(!check_interactivity(usr)) + if(!check_interactivity(usr) || cloning) return if(!input) program = null @@ -254,7 +253,7 @@ to_chat(usr, "Metal cost: [program["metal_cost"]].") if("print") - if(!program) + if(!program || cloning) return if(program["requires_upgrades"] && !upgraded && !debug) @@ -263,12 +262,11 @@ if(program["unsupported_circuit"] && !debug) to_chat(usr, "This program uses components not supported by the specified assembly. Please change the assembly type in the save file to a supported one.") return - else if(fast_clone || debug) + else if(fast_clone) var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) if(debug || materials.use_amount_type(program["metal_cost"], MAT_METAL)) - var/obj/item/assembly = SScircuit.load_electronic_assembly(get_turf(src), program) - to_chat(usr, "[assembly] has been printed from the provided template!") - playsound(src, 'sound/items/poster_being_created.ogg', 50, TRUE) + cloning = TRUE + print_program(usr) else to_chat(usr, "You need [program["metal_cost"]] metal to build that!") else @@ -279,11 +277,10 @@ var/cloning_time = round(program["metal_cost"] / 15) cloning_time = min(cloning_time, MAX_CIRCUIT_CLONE_TIME) cloning = TRUE - clone_countdown = world.time + cloning_time to_chat(usr, "You begin printing a custom assembly. This will take approximately [DisplayTimeText(cloning_time)]. You can still print \ off normal parts during this time.") playsound(src, 'sound/items/poster_being_created.ogg', 50, TRUE) - START_PROCESSING(SSprocessing, src) + addtimer(CALLBACK(src, .proc/print_program, usr), cloning_time) if("cancel") if(!cloning || !program) @@ -291,7 +288,6 @@ to_chat(usr, "Cloning has been canceled. Metal cost has been refunded.") cloning = FALSE - clone_countdown = FALSE var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.use_amount_type(-program["metal_cost"], MAT_METAL) //use negative amount to regain the cost diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index cca3f2babf..96ca6a3055 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -763,7 +763,7 @@ data.standard_format_data(message, text, key) ntnet_send(data) -/obj/item/integrated_circuit/input/ntnet_recieve(datum/netdata/data) +/obj/item/integrated_circuit/input/ntnet_receive(datum/netdata/data) set_pin_data(IC_OUTPUT, 1, data.sender_id) set_pin_data(IC_OUTPUT, 2, data.data["data"]) set_pin_data(IC_OUTPUT, 3, data.data["data_secondary"]) @@ -774,7 +774,7 @@ activate_pin(2) /obj/item/integrated_circuit/input/ntnet_advanced - name = "Low level NTNet transreciever" + name = "Low level NTNet transreceiver" desc = "Enables the sending and receiving of messages over NTNet via packet data protocol. Allows advanced control of message contents and signalling. Must use associative lists. Outputs associative list. Has a slower transmission rate than normal NTNet circuits, due to increased data processing complexity." extended_desc = "Data can be sent or received using the second pin on each side, \ with additonal data reserved for the third pin. When a message is received, the second activation pin \ @@ -787,7 +787,7 @@ "target NTNet addresses"= IC_PINTYPE_STRING, "data" = IC_PINTYPE_LIST, ) - outputs = list("recieved data" = IC_PINTYPE_LIST, "is_broadcast" = IC_PINTYPE_BOOLEAN) + outputs = list("received data" = IC_PINTYPE_LIST, "is_broadcast" = IC_PINTYPE_BOOLEAN) activators = list("send data" = IC_PINTYPE_PULSE_IN, "on data received" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH action_flags = IC_ACTION_LONG_RANGE @@ -811,7 +811,7 @@ data.data = message ntnet_send(data) -/obj/item/integrated_circuit/input/ntnet_advanced/ntnet_recieve(datum/netdata/data) +/obj/item/integrated_circuit/input/ntnet_advanced/ntnet_receive(datum/netdata/data) set_pin_data(IC_OUTPUT, 1, data.data) set_pin_data(IC_OUTPUT, 2, data.broadcast) push_data() @@ -1123,6 +1123,67 @@ else activate_pin(3) +/obj/item/integrated_circuit/input/atmospheric_analyzer + name = "atmospheric analyzer" + desc = "A miniaturized analyzer which can scan anything that contains gases. Leave target as NULL to scan the air around the assembly." + extended_desc = "The nth element of gas amounts is the number of moles of the \ + nth gas in gas list. \ + Pressure is in kPa, temperature is in Kelvin. \ + Due to programming limitations, scanning an object that does \ + not contain a gas will return the air around it instead." + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + inputs = list( + "target" = IC_PINTYPE_REF + ) + outputs = list( + "gas list" = IC_PINTYPE_LIST, + "gas amounts" = IC_PINTYPE_LIST, + "total moles" = IC_PINTYPE_NUMBER, + "pressure" = IC_PINTYPE_NUMBER, + "temperature" = IC_PINTYPE_NUMBER, + "volume" = IC_PINTYPE_NUMBER + ) + activators = list( + "scan" = IC_PINTYPE_PULSE_IN, + "on success" = IC_PINTYPE_PULSE_OUT, + "on failure" = IC_PINTYPE_PULSE_OUT + ) + power_draw_per_use = 5 + +/obj/item/integrated_circuit/input/atmospheric_analyzer/do_work() + for(var/i=1 to 6) + set_pin_data(IC_OUTPUT, i, null) + var/atom/target = get_pin_data_as_type(IC_INPUT, 1, /atom) + var/atom/movable/acting_object = get_object() + if(!target) + target = acting_object.loc + if(!target.Adjacent(acting_object)) + activate_pin(3) + return + + var/datum/gas_mixture/air_contents = target.return_air() + if(!air_contents) + activate_pin(3) + return + + var/list/gases = air_contents.gases + var/list/gas_names = list() + var/list/gas_amounts = list() + for(var/id in gases) + var/name = gases[id][GAS_META][META_GAS_NAME] + var/amt = round(gases[id][MOLES], 0.001) + gas_names.Add(name) + gas_amounts.Add(amt) + + set_pin_data(IC_OUTPUT, 1, gas_names) + set_pin_data(IC_OUTPUT, 2, gas_amounts) + set_pin_data(IC_OUTPUT, 3, round(air_contents.total_moles(), 0.001)) + set_pin_data(IC_OUTPUT, 4, round(air_contents.return_pressure(), 0.001)) + set_pin_data(IC_OUTPUT, 5, round(air_contents.temperature, 0.001)) + set_pin_data(IC_OUTPUT, 6, round(air_contents.return_volume(), 0.001)) + push_data() + activate_pin(2) + /obj/item/integrated_circuit/input/data_card_reader name = "data card reader" desc = "A circuit that can read from and write to data cards." diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index c391c62962..6267f2b622 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -367,12 +367,12 @@ var/atom/movable/acting_object = get_object() var/turf/T = get_turf(acting_object) var/obj/item/AM = get_pin_data_as_type(IC_INPUT, 1, /obj/item) - if(AM) + if(!QDELETED(AM) && !istype(AM, /obj/item/electronic_assembly) && !istype(AM, /obj/item/transfer_valve) && !istype(AM, /obj/item/twohanded) && !istype(assembly.loc, /obj/item/implant/storage)) var/mode = get_pin_data(IC_INPUT, 2) if(mode == 1) if(check_target(AM)) var/weightcheck = FALSE - if (AM.w_class < max_w_class) + if (AM.w_class <= max_w_class) weightcheck = TRUE else weightcheck = FALSE @@ -496,7 +496,10 @@ var/target_y_rel = round(get_pin_data(IC_INPUT, 2)) var/obj/item/A = get_pin_data_as_type(IC_INPUT, 3, /obj/item) - if(!A || A.anchored || A.throwing || A == assembly) + if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve)) + return + + if (istype(assembly.loc, /obj/item/implant/storage)) //Prevents the more abusive form of chestgun. return if(max_w_class && (A.w_class > max_w_class)) @@ -527,6 +530,7 @@ var/range = round(CLAMP(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1) assembly.visible_message("[assembly] has thrown [A]!") + log_attack("[assembly] [REF(assembly)] has thrown [A].") A.forceMove(drop_location()) A.throw_at(locate(x_abs, y_abs, T.z), range, 3) diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 2d820b016e..b887617ea8 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -46,6 +46,10 @@ for(var/mob/M in nearby_things) var/obj/O = assembly ? assembly : src to_chat(M, "[icon2html(O.icon, world, O.icon_state)] [stuff_to_display]") + if(assembly) + assembly.investigate_log("displayed \"[html_encode(stuff_to_display)]\" with [type].", INVESTIGATE_CIRCUIT) + else + investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT) /obj/item/integrated_circuit/output/screen/large name = "large screen" @@ -58,6 +62,10 @@ ..() var/obj/O = assembly ? get_turf(assembly) : loc O.visible_message("[icon2html(O.icon, world, O.icon_state)] [stuff_to_display]") + if(assembly) + assembly.investigate_log("displayed \"[html_encode(stuff_to_display)]\" with [type].", INVESTIGATE_CIRCUIT) + else + investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT) /obj/item/integrated_circuit/output/light name = "light" @@ -151,6 +159,10 @@ return vol = CLAMP(vol ,0 , 100) playsound(get_turf(src), selected_sound, vol, freq, -1) + if(assembly) + assembly.investigate_log("played a sound ([selected_sound]) with [type].", INVESTIGATE_CIRCUIT) + else + investigate_log("played a sound ([selected_sound]) as [type].", INVESTIGATE_CIRCUIT) /obj/item/integrated_circuit/output/sound/on_data_written() power_draw_per_use = get_pin_data(IC_INPUT, 2) * 15 @@ -234,8 +246,12 @@ text = get_pin_data(IC_INPUT, 1) if(!isnull(text)) var/atom/movable/A = get_object() - A.say(sanitize(text)) - + var/sanitized_text = sanitize(text) + A.say(sanitized_text) + if (assembly) + log_say("[assembly] [REF(assembly)] : [sanitized_text]") + else + log_say("[name] ([type]) : [sanitized_text]") /obj/item/integrated_circuit/output/video_camera name = "video camera circuit" diff --git a/code/modules/integrated_electronics/subtypes/power.dm b/code/modules/integrated_electronics/subtypes/power.dm index e760b21f72..4e5b6952a4 100644 --- a/code/modules/integrated_electronics/subtypes/power.dm +++ b/code/modules/integrated_electronics/subtypes/power.dm @@ -24,7 +24,7 @@ /obj/item/integrated_circuit/power/transmitter/large name = "large power transmission circuit" - desc = "This can wirelessly transmit a lot of electricity from an assembly's battery towards a nearby machine. Warning: Do not operate in flammable enviroments." + desc = "This can wirelessly transmit a lot of electricity from an assembly's battery towards a nearby machine. Warning: Do not operate in flammable environments." extended_desc = "This circuit transmits 20 kJ of electricity every time the activator pin is pulsed. The input pin must be \ a reference to a machine to send electricity to. This can be a battery, or anything containing a battery. The machine can exist \ inside the assembly, or adjacent to it. The power is sourced from the assembly's power cell. If the target is outside of the assembly, \ diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 3232acda71..2a6b4a1a80 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -186,7 +186,7 @@ //Always log attemped injections for admins var/contained = reagents.log_list() - add_logs(src, L, "attemped to inject", addition="which had [contained]") + add_logs(src, L, "attempted to inject", addition="which had [contained]") L.visible_message("[acting_object] is trying to inject [L]!", \ "[acting_object] is trying to inject you!") busy = TRUE diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 6ec7463ab5..ced08bbc6a 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -222,7 +222,7 @@ if(ACCESS_ENGINE) return "Engineering" if(ACCESS_ENGINE_EQUIP) - return "Power Equipment" + return "Power and Engineering Equipment" if(ACCESS_MAINT_TUNNELS) return "Maintenance" if(ACCESS_EXTERNAL_AIRLOCKS) diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm index b4679ae479..6a5a857ef0 100644 --- a/code/modules/jobs/job_exp.dm +++ b/code/modules/jobs/job_exp.dm @@ -143,8 +143,10 @@ GLOBAL_PROTECT(exp_to_update) L.update_exp_list(mins,ann) /datum/controller/subsystem/blackbox/proc/update_exp_db() - SSdbcore.MassInsert(format_table_name("role_time"), GLOB.exp_to_update, "ON DUPLICATE KEY UPDATE minutes = minutes + VALUES(minutes)") - LAZYCLEARLIST(GLOB.exp_to_update) + set waitfor = FALSE + var/list/old_minutes = GLOB.exp_to_update + GLOB.exp_to_update = null + SSdbcore.MassInsert(format_table_name("role_time"), old_minutes, "ON DUPLICATE KEY UPDATE minutes = minutes + VALUES(minutes)") //resets a client's exp to what was in the db. /client/proc/set_exp_from_db() @@ -154,10 +156,12 @@ GLOBAL_PROTECT(exp_to_update) return -1 var/datum/DBQuery/exp_read = SSdbcore.NewQuery("SELECT job, minutes FROM [format_table_name("role_time")] WHERE ckey = '[sanitizeSQL(ckey)]'") if(!exp_read.Execute()) + qdel(exp_read) return -1 var/list/play_records = list() while(exp_read.NextRow()) play_records[exp_read.item[1]] = text2num(exp_read.item[2]) + qdel(exp_read) for(var/rtype in SSjob.name_occupations) if(!play_records[rtype]) @@ -186,7 +190,9 @@ GLOBAL_PROTECT(exp_to_update) var/datum/DBQuery/flag_update = SSdbcore.NewQuery("UPDATE [format_table_name("player")] SET flags = '[prefs.db_flags]' WHERE ckey='[sanitizeSQL(ckey)]'") if(!flag_update.Execute()) + qdel(flag_update) return -1 + qdel(flag_update) /client/proc/update_exp_list(minutes, announce_changes = FALSE) @@ -264,10 +270,12 @@ GLOBAL_PROTECT(exp_to_update) var/datum/DBQuery/flags_read = SSdbcore.NewQuery("SELECT flags FROM [format_table_name("player")] WHERE ckey='[ckey]'") if(!flags_read.Execute()) + qdel(flags_read) return FALSE if(flags_read.NextRow()) prefs.db_flags = text2num(flags_read.item[1]) else if(isnull(prefs.db_flags)) prefs.db_flags = 0 //This PROBABLY won't happen, but better safe than sorry. + qdel(flags_read) return TRUE diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index 72d58088d1..8ec25e5f5e 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -18,7 +18,7 @@ Clown minimal_access = list(ACCESS_THEATRE) /datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M) - H.rename_self("clown", M.client) + H.apply_pref_name("clown", M.client) /datum/outfit/job/clown name = "Clown" @@ -81,7 +81,7 @@ Mime minimal_access = list(ACCESS_THEATRE) /datum/job/mime/after_spawn(mob/living/carbon/human/H, mob/M) - H.rename_self("mime", M.client) + H.apply_pref_name("mime", M.client) /datum/outfit/job/mime name = "Mime" diff --git a/code/modules/jobs/job_types/job.dm b/code/modules/jobs/job_types/job.dm index 1cd7f59a27..5d4802f93a 100644 --- a/code/modules/jobs/job_types/job.dm +++ b/code/modules/jobs/job_types/job.dm @@ -49,7 +49,7 @@ var/exp_type_department = "" //The amount of good boy points playing this role will earn you towards a higher chance to roll antagonist next round - //can be overriden by antag_rep.txt config + //can be overridden by antag_rep.txt config var/antag_rep = 10 //Only override this proc @@ -81,7 +81,7 @@ if(CONFIG_GET(flag/enforce_human_authority) && (title in GLOB.command_positions)) if(H.dna.species.id != "human") H.set_species(/datum/species/human) - H.rename_self("human", H.client) + H.apply_pref_name("human", H.client) purrbation_remove(H, silent=TRUE) //Equip the rest of the gear diff --git a/code/modules/jobs/job_types/silicon.dm b/code/modules/jobs/job_types/silicon.dm index 86246952f3..0738f20b24 100644 --- a/code/modules/jobs/job_types/silicon.dm +++ b/code/modules/jobs/job_types/silicon.dm @@ -34,7 +34,7 @@ AI H.forceMove(lateJoinCore.loc) qdel(lateJoinCore) var/mob/living/silicon/ai/AI = H - AI.rename_self("ai", M.client) //If this runtimes oh well jobcode is fucked. + AI.apply_pref_name("ai", M.client) //If this runtimes oh well jobcode is fucked. //we may have been created after our borg if(SSticker.current_state == GAME_STATE_SETTING_UP) @@ -85,4 +85,4 @@ Cyborg return H.Robotize(FALSE, latejoin) /datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, mob/M) - R.rename_self("cyborg", M.client) + R.updatename(M.client) diff --git a/code/modules/keybindings/bindings_human.dm b/code/modules/keybindings/bindings_human.dm index 14890cc7e2..5d02d9aedb 100644 --- a/code/modules/keybindings/bindings_human.dm +++ b/code/modules/keybindings/bindings_human.dm @@ -17,7 +17,7 @@ to_chat(user, "You can't fit anything in.") return if(thing) // put thing in belt - if(!equipped_belt.SendSignal(COMSIG_TRY_STORAGE_INSERT, thing, user.mob)) + if(!SEND_SIGNAL(equipped_belt, COMSIG_TRY_STORAGE_INSERT, thing, user.mob)) to_chat(user, "You can't fit anything in.") return if(!equipped_belt.contents.len) // nothing to take out @@ -45,7 +45,7 @@ to_chat(user, "You can't fit anything in.") return if(thing) // put thing in backpack - if(!equipped_backpack.SendSignal(COMSIG_TRY_STORAGE_INSERT, thing, user.mob)) + if(!SEND_SIGNAL(equipped_backpack, COMSIG_TRY_STORAGE_INSERT, thing, user.mob)) to_chat(user, "You can't fit anything in.") return if(!equipped_backpack.contents.len) // nothing to take out diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 4126cc4768..066ce22831 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -206,7 +206,7 @@ if(dat) user << browse("Penned by [author].
    " + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]") user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.") - user.SendSignal(COMSIG_ADD_MOOD_EVENT, "book_nerd", /datum/mood_event/book_nerd) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "book_nerd", /datum/mood_event/book_nerd) onclose(user, "book") else to_chat(user, "This book is completely blank!") diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 367d3505a0..81e296e4c8 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -41,6 +41,8 @@ if(1) if (!SSdbcore.Connect()) dat += "ERROR: Unable to contact External Archive. Please contact your system administrator for assistance.
    " + else if(QDELETED(user)) + return else if(!SQLquery) dat += "ERROR: Malformed search request. Please contact your system administrator for assistance.
    " else @@ -50,12 +52,16 @@ var/datum/DBQuery/query_library_list_books = SSdbcore.NewQuery(SQLquery) if(!query_library_list_books.Execute()) dat += "ERROR: Unable to retrieve book listings. Please contact your system administrator for assistance.
    " - while(query_library_list_books.NextRow()) - var/author = query_library_list_books.item[1] - var/title = query_library_list_books.item[2] - var/category = query_library_list_books.item[3] - var/id = query_library_list_books.item[4] - dat += "[author][title][category][id]" + else + while(query_library_list_books.NextRow()) + var/author = query_library_list_books.item[1] + var/title = query_library_list_books.item[2] + var/category = query_library_list_books.item[3] + var/id = query_library_list_books.item[4] + dat += "[author][title][category][id]" + qdel(query_library_list_books) + if(QDELETED(user)) + return dat += "
    " dat += "\[Go Back\]
    " var/datum/browser/popup = new(user, "publiclibrary", name, 600, 400) @@ -135,6 +141,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums GLOB.cachedbooks = list() var/datum/DBQuery/query_library_cache = SSdbcore.NewQuery("SELECT id, author, title, category FROM [format_table_name("library")] WHERE isnull(deleted)") if(!query_library_cache.Execute()) + qdel(query_library_cache) return while(query_library_cache.NextRow()) var/datum/cachedbook/newbook = new() @@ -143,6 +150,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums newbook.title = query_library_cache.item[3] newbook.category = query_library_cache.item[4] GLOB.cachedbooks += newbook + qdel(query_library_cache) @@ -414,12 +422,15 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums var/sqlauthor = sanitizeSQL(scanner.cache.author) var/sqlcontent = sanitizeSQL(scanner.cache.dat) var/sqlcategory = sanitizeSQL(upload_category) + var/msg = "[key_name(usr)] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs" var/datum/DBQuery/query_library_upload = SSdbcore.NewQuery("INSERT INTO [format_table_name("library")] (author, title, content, category, ckey, datetime, round_id_created) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', '[usr.ckey]', Now(), '[GLOB.round_id]')") if(!query_library_upload.Execute()) + qdel(query_library_upload) alert("Database error encountered uploading to Archive") return else - log_game("[key_name(usr)] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs") + log_game(msg) + qdel(query_library_upload) alert("Upload Complete. Uploaded title will be unavailable for printing for a short period") if(href_list["newspost"]) if(!GLOB.news_network) @@ -452,20 +463,23 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums cooldown = world.time + PRINTER_COOLDOWN var/datum/DBQuery/query_library_print = SSdbcore.NewQuery("SELECT * FROM [format_table_name("library")] WHERE id=[sqlid] AND isnull(deleted)") if(!query_library_print.Execute()) + qdel(query_library_print) say("PRINTER ERROR! Failed to print document (0x0000000F)") return while(query_library_print.NextRow()) var/author = query_library_print.item[2] var/title = query_library_print.item[3] var/content = query_library_print.item[4] - var/obj/item/book/B = new(get_turf(src)) - B.name = "Book: [title]" - B.title = title - B.author = author - B.dat = content - B.icon_state = "book[rand(1,8)]" - visible_message("[src]'s printer hums as it produces a completely bound book. How did it do that?") + if(!QDELETED(src)) + var/obj/item/book/B = new(get_turf(src)) + B.name = "Book: [title]" + B.title = title + B.author = author + B.dat = content + B.icon_state = "book[rand(1,8)]" + visible_message("[src]'s printer hums as it produces a completely bound book. How did it do that?") break + qdel(query_library_print) if(href_list["printbible"]) if(cooldown < world.time) var/obj/item/storage/book/bible/B = new /obj/item/storage/book/bible(src.loc) diff --git a/code/modules/library/random_books.dm b/code/modules/library/random_books.dm index e101a7143a..8fd12f6157 100644 --- a/code/modules/library/random_books.dm +++ b/code/modules/library/random_books.dm @@ -60,8 +60,7 @@ B.dat = query_get_random_books.item[4] B.name = "Book: [B.title]" B.icon_state= "book[rand(1,8)]" - else - return + qdel(query_get_random_books) /obj/structure/bookcase/random/fiction name = "bookcase (Fiction)" diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 537326fc45..89ec6a3a7e 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -23,7 +23,7 @@ if (l_color != NONSENSICAL_VALUE) light_color = l_color - SendSignal(COMSIG_ATOM_SET_LIGHT, l_range, l_power, l_color) + SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT, l_range, l_power, l_color) update_light() diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 381ce4bffe..dfc75c32ee 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -73,7 +73,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new) if(!key_len) key_len = length(key) else - throw EXCEPTION("Inconsistant key length in DMM") + throw EXCEPTION("Inconsistent key length in DMM") if(!measureOnly) grid_models[key] = dmmRegex.group[2] diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index 9c399826db..2c001571a1 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -224,7 +224,7 @@ interface with the mining shuttle at the landing site if a mobile beacon is also if(BAD_ZLEVEL) to_chat(user, "This uplink can only be used in a designed mining zone.") if(BAD_AREA) - to_chat(user, "Unable to acquire a targeting lock. Find an area clear of stuctures or entirely within one.") + to_chat(user, "Unable to acquire a targeting lock. Find an area clear of structures or entirely within one.") if(BAD_COORDS) to_chat(user, "Location is too close to the edge of the station's scanning range. Move several paces away and try again.") if(BAD_TURF) @@ -260,6 +260,7 @@ interface with the mining shuttle at the landing site if a mobile beacon is also dwidth = 3 width = 7 height = 5 + area_type = /area/construction/mining/aux_base /obj/structure/mining_shuttle_beacon name = "mining shuttle beacon" @@ -322,7 +323,7 @@ interface with the mining shuttle at the landing site if a mobile beacon is also break if(!Mport) - to_chat(user, "This station is not equipped with an approprite mining shuttle. Please contact Nanotrasen Support.") + to_chat(user, "This station is not equipped with an appropriate mining shuttle. Please contact Nanotrasen Support.") return var/obj/docking_port/mobile/mining_shuttle diff --git a/code/modules/mining/equipment/goliath_hide.dm b/code/modules/mining/equipment/goliath_hide.dm index 85feaecf73..48f0ca0be5 100644 --- a/code/modules/mining/equipment/goliath_hide.dm +++ b/code/modules/mining/equipment/goliath_hide.dm @@ -7,6 +7,6 @@ singular_name = "hide plate" max_amount = 6 novariants = FALSE - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_NORMAL - layer = MOB_LAYER \ No newline at end of file + layer = MOB_LAYER diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 558147af23..7cf16f6064 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -381,7 +381,7 @@ /obj/item/crusher_trophy/blaster_tubes/on_mark_detonation(mob/living/target, mob/living/user) deadly_shot = TRUE - addtimer(CALLBACK(src, .proc/reset_deadly_shot), 300, TIMER_OVERRIDE) + addtimer(CALLBACK(src, .proc/reset_deadly_shot), 300, TIMER_UNIQUE|TIMER_OVERRIDE) /obj/item/crusher_trophy/blaster_tubes/proc/reset_deadly_shot() deadly_shot = FALSE diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index cd6afa20f7..ca313182b6 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -63,7 +63,8 @@ /obj/item/pickaxe/drill/cyborg name = "cyborg mining drill" desc = "An integrated electric mining drill." - flags_1 = NODROP_1 + item_flags = NODROP + flags_1 = NONE /obj/item/pickaxe/drill/diamonddrill name = "diamond-tipped mining drill" diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index 7fa6721c0f..43be61dd77 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -21,7 +21,7 @@ name = "regenerative core" desc = "All that remains of a hivelord. It can be used to heal completely, but it will rapidly decay into uselessness." icon_state = "roro core 2" - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON slot = "hivecore" force = 0 actions_types = list(/datum/action/item_action/organ_action/use) diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 9ad6d59c3a..3005a29dcd 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -4,7 +4,7 @@ icon_state = "away" dynamic_lighting = DYNAMIC_LIGHTING_FORCED requires_power = FALSE - has_gravity = TRUE + has_gravity = STANDARD_GRAVITY valid_territory = FALSE //Survival Capsule diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 9cb3f5c323..5e2e8bdd5a 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -54,18 +54,20 @@ . = ..() if(. & EMP_PROTECT_SELF) return - var/triggered = FALSE - if(usr.get_item_by_slot(SLOT_BELT) == src) - if(power == 1) - triggered = TRUE - else if(power == 2 && prob(50)) - triggered = TRUE + var/mob/M = loc + if(istype(M)) + var/triggered = FALSE + if(M.get_item_by_slot(SLOT_BELT) == src) + if(power == 1) + triggered = TRUE + else if(power == 2 && prob(50)) + triggered = TRUE - if(triggered) - usr.visible_message("[src] overloads and activates!") - SSblackbox.record_feedback("tally", "jaunter", 1, "EMP") // EMP accidental activation - activate(usr) + if(triggered) + M.visible_message("[src] overloads and activates!") + SSblackbox.record_feedback("tally", "jaunter", 1, "EMP") // EMP accidental activation + activate(M) /obj/item/wormhole_jaunter/proc/chasm_react(mob/user) if(user.get_item_by_slot(SLOT_BELT) == src) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index a6cbbfcedd..d6ea55855d 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -63,7 +63,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) to_chat(user, "You attach the pack to [A] and activate it.") if(loc == user && istype(user.back, /obj/item/storage/backpack)) var/obj/item/storage/backpack/B = user.back - B.SendSignal(COMSIG_TRY_STORAGE_INSERT, src, user, FALSE, FALSE) + SEND_SIGNAL(B, COMSIG_TRY_STORAGE_INSERT, src, user, FALSE, FALSE) uses_left-- if(uses_left <= 0) user.transferItemToLoc(src, A, TRUE) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index bcb186a776..79adcdf9d8 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -189,7 +189,7 @@ activated() /obj/item/rod_of_asclepius/proc/activated() - flags_1 = NODROP_1 | DROPDEL_1 + item_flags = NODROP | DROPDEL desc = "A short wooden rod with a mystical snake inseparably gripping itself and the rod to your forearm. It flows with a healing energy that disperses amongst yourself and those around you. " icon_state = "asclepius_active" activated = TRUE @@ -388,7 +388,7 @@ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' fire_sound = 'sound/weapons/batonextend.ogg' max_charges = 1 - flags_1 = NOBLUDGEON_1 + item_flags = NEEDS_PERMIT | NOBLUDGEON force = 18 /obj/item/ammo_casing/magic/hook diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 8bef2ccf6a..026170da09 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -82,7 +82,7 @@ /obj/machinery/mineral/processing_unit/Initialize() . = ..() proximity_monitor = new(src, 1) - AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, FALSE, list(/obj/item/stack)) + AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, TRUE, list(/obj/item/stack)) stored_research = new /datum/techweb/specialized/autounlocking/smelter /obj/machinery/mineral/processing_unit/Destroy() diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 03a93a6a52..a9230195ac 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -127,7 +127,7 @@ flick(icon_deny, src) return if(prize.cost > inserted_id.mining_points) - to_chat(usr, "Error: Insufficent points for [prize.equipment_name]!") + to_chat(usr, "Error: Insufficient points for [prize.equipment_name]!") flick(icon_deny, src) else inserted_id.mining_points -= prize.cost diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 23d8d816d4..3809514f02 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -299,7 +299,7 @@ /obj/item/slimepotion/slime/sentience/mining name = "minebot AI upgrade" - desc = "Can be used to grant sentience to minebots. Is incompatable with minebot armor and melee upgrades, and will override them." + desc = "Can be used to grant sentience to minebots. It's incompatible with minebot armor and melee upgrades, and will override them." icon_state = "door_electronics" icon = 'icons/obj/module.dmi' sentience_type = SENTIENCE_MINEBOT diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 2835323172..9e4e1bbb53 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -337,7 +337,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ var/index = sideslist.Find(coinflip) message_admins("coinflip landed on [coinflip] which is [index] in sideslist") if (index==2)//tails - user.visible_message("\the [src] lands on [coinflip]! [user] promply falls over, dead!") + user.visible_message("\the [src] lands on [coinflip]! [user] promptly falls over, dead!") user.adjustOxyLoss(200) user.death(0) else diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 78f4676d4e..b158815dac 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -12,8 +12,8 @@ /obj/structure/ore_box/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/stack/ore)) user.transferItemToLoc(W, src) - else if(W.SendSignal(COMSIG_CONTAINS_STORAGE)) - W.SendSignal(COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/stack/ore, src) + else if(SEND_SIGNAL(W, COMSIG_CONTAINS_STORAGE)) + SEND_SIGNAL(W, COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/stack/ore, src) to_chat(user, "You empty the ore in [W] into \the [src].") else return ..() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 04b7b13be8..14bd0ffaab 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -54,15 +54,19 @@ if(src.client && src.client.holder) isadmin = 1 var/datum/DBQuery/query_get_new_polls = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = \"[ckey]\")") + var/rs = REF(src) if(query_get_new_polls.Execute()) var/newpoll = 0 if(query_get_new_polls.NextRow()) newpoll = 1 if(newpoll) - output += "

    Show Player Polls (NEW!)

    " + output += "

    Show Player Polls (NEW!)

    " else - output += "

    Show Player Polls

    " + output += "

    Show Player Polls

    " + qdel(query_get_new_polls) + if(QDELETED(src)) + return output += "
    " @@ -71,8 +75,6 @@ popup.set_window_options("can_close=0") popup.set_content(output) popup.open(0) - return - /mob/dead/new_player/Topic(href, href_list[]) if(src != usr) @@ -310,6 +312,8 @@ return JOB_UNAVAILABLE_SLOTFULL if(jobban_isbanned(src,rank)) return JOB_UNAVAILABLE_BANNED + if(QDELETED(src)) + return JOB_UNAVAILABLE_GENERIC if(!job.player_old_enough(client)) return JOB_UNAVAILABLE_ACCOUNTAGE if(job.required_playtime_remaining(client)) @@ -475,7 +479,12 @@ var/mob/living/carbon/human/H = new(loc) - if(CONFIG_GET(flag/force_random_names) || jobban_isbanned(src, "appearance")) + var/frn = CONFIG_GET(flag/force_random_names) + if(!frn) + frn = jobban_isbanned(src, "appearance") + if(QDELETED(src)) + return + if(frn) client.prefs.random_character() client.prefs.real_name = client.prefs.pref_species.random_name(gender,1) client.prefs.copy_to(H) diff --git a/code/modules/mob/dead/new_player/poll.dm b/code/modules/mob/dead/new_player/poll.dm index ce710e5186..388f63961b 100644 --- a/code/modules/mob/dead/new_player/poll.dm +++ b/code/modules/mob/dead/new_player/poll.dm @@ -8,16 +8,20 @@ return var/datum/DBQuery/query_poll_get = SSdbcore.NewQuery("SELECT id, question FROM [format_table_name("poll_question")] WHERE Now() BETWEEN starttime AND endtime [(client.holder ? "" : "AND adminonly = false")]") if(!query_poll_get.warn_execute()) + qdel(query_poll_get) return var/output = "
    Player polls
    " var/i = 0 + var/rs = REF(src) while(query_poll_get.NextRow()) var/pollid = query_poll_get.item[1] var/pollquestion = query_poll_get.item[2] - output += "" + output += "" i++ + qdel(query_poll_get) output += "
    [pollquestion]
    [pollquestion]
    " - src << browse(output,"window=playerpolllist;size=500x300") + if(!QDELETED(src)) + src << browse(output,"window=playerpolllist;size=500x300") /mob/dead/new_player/proc/poll_player(pollid) if(!pollid) @@ -27,6 +31,7 @@ return var/datum/DBQuery/query_poll_get_details = SSdbcore.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid]") if(!query_poll_get_details.warn_execute()) + qdel(query_poll_get_details) return var/pollstarttime = "" var/pollendtime = "" @@ -39,23 +44,28 @@ pollquestion = query_poll_get_details.item[3] polltype = query_poll_get_details.item[4] multiplechoiceoptions = text2num(query_poll_get_details.item[5]) + qdel(query_poll_get_details) switch(polltype) if(POLLTYPE_OPTION) var/datum/DBQuery/query_option_get_votes = SSdbcore.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'") if(!query_option_get_votes.warn_execute()) + qdel(query_option_get_votes) return var/votedoptionid = 0 if(query_option_get_votes.NextRow()) votedoptionid = text2num(query_option_get_votes.item[1]) + qdel(query_option_get_votes) var/list/datum/polloption/options = list() var/datum/DBQuery/query_option_options = SSdbcore.NewQuery("SELECT id, text FROM [format_table_name("poll_option")] WHERE pollid = [pollid]") if(!query_option_options.warn_execute()) + qdel(query_option_options) return while(query_option_options.NextRow()) var/datum/polloption/PO = new() PO.optionid = text2num(query_option_options.item[1]) PO.optiontext = query_option_options.item[2] options += PO + qdel(query_option_options) var/output = "
    Player poll
    " output += "Question: [pollquestion]
    " output += "Poll runs from [pollstarttime] until [pollendtime]

    " @@ -84,10 +94,12 @@ if(POLLTYPE_TEXT) var/datum/DBQuery/query_text_get_votes = SSdbcore.NewQuery("SELECT replytext FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[ckey]'") if(!query_text_get_votes.warn_execute()) + qdel(query_text_get_votes) return var/vote_text = "" if(query_text_get_votes.NextRow()) vote_text = query_text_get_votes.item[1] + qdel(query_text_get_votes) var/output = "

    Player poll
    " output += "Question: [pollquestion]
    " output += "Feedback gathering runs from [pollstarttime] until [pollendtime]

    " @@ -113,6 +125,7 @@ if(POLLTYPE_RATING) var/datum/DBQuery/query_rating_get_votes = SSdbcore.NewQuery("SELECT o.text, v.rating FROM [format_table_name("poll_option")] o, [format_table_name("poll_vote")] v WHERE o.pollid = [pollid] AND v.ckey = '[ckey]' AND o.id = v.optionid") if(!query_rating_get_votes.warn_execute()) + qdel(query_rating_get_votes) return var/output = "

    Player poll
    " output += "Question: [pollquestion]
    " @@ -122,6 +135,7 @@ var/optiontext = query_rating_get_votes.item[1] rating = query_rating_get_votes.item[2] output += "
    [optiontext] - [rating]" + qdel(query_rating_get_votes) if(!rating) output += "
    " output += "" @@ -131,6 +145,7 @@ var/maxid = 0 var/datum/DBQuery/query_rating_options = SSdbcore.NewQuery("SELECT id, text, minval, maxval, descmin, descmid, descmax FROM [format_table_name("poll_option")] WHERE pollid = [pollid]") if(!query_rating_options.warn_execute()) + qdel(query_rating_options) return while(query_rating_options.NextRow()) var/optionid = text2num(query_rating_options.item[1]) @@ -157,23 +172,28 @@ else output += "" output += "" + qdel(query_rating_options) output += "" output += "" output += "

    " - src << browse(null ,"window=playerpolllist") - src << browse(output,"window=playerpoll;size=500x500") + if(!QDELETED(src)) + src << browse(null ,"window=playerpolllist") + src << browse(output,"window=playerpoll;size=500x500") if(POLLTYPE_MULTI) var/datum/DBQuery/query_multi_get_votes = SSdbcore.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'") if(!query_multi_get_votes.warn_execute()) + qdel(query_multi_get_votes) return var/list/votedfor = list() while(query_multi_get_votes.NextRow()) votedfor.Add(text2num(query_multi_get_votes.item[1])) + qdel(query_multi_get_votes) var/list/datum/polloption/options = list() var/maxoptionid = 0 var/minoptionid = 0 var/datum/DBQuery/query_multi_options = SSdbcore.NewQuery("SELECT id, text FROM [format_table_name("poll_option")] WHERE pollid = [pollid]") if(!query_multi_options.warn_execute()) + qdel(query_multi_options) return while(query_multi_options.NextRow()) var/datum/polloption/PO = new() @@ -184,6 +204,7 @@ if(PO.optionid < minoptionid || !minoptionid) minoptionid = PO.optionid options += PO + qdel(query_multi_options) var/output = "
    Player poll
    " output += "Question: [pollquestion]
    You can select up to [multiplechoiceoptions] options. If you select more, the first [multiplechoiceoptions] will be saved.
    " output += "Poll runs from [pollstarttime] until [pollendtime]

    " @@ -216,22 +237,26 @@ var/datum/DBQuery/query_irv_get_votes = SSdbcore.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'") if(!query_irv_get_votes.warn_execute()) + qdel(query_irv_get_votes) return var/list/votedfor = list() while(query_irv_get_votes.NextRow()) votedfor.Add(text2num(query_irv_get_votes.item[1])) + qdel(query_irv_get_votes) var/list/datum/polloption/options = list() var/datum/DBQuery/query_irv_options = SSdbcore.NewQuery("SELECT id, text FROM [format_table_name("poll_option")] WHERE pollid = [pollid]") if(!query_irv_options.warn_execute()) + qdel(query_irv_options) return while(query_irv_options.NextRow()) var/datum/polloption/PO = new() PO.optionid = text2num(query_irv_options.item[1]) PO.optiontext = query_irv_options.item[2] options["[PO.optionid]"] += PO + qdel(query_irv_options) //if they already voted, use their sort if (votedfor.len) @@ -332,10 +357,13 @@ return var/datum/DBQuery/query_hasvoted = SSdbcore.NewQuery("SELECT id FROM `[format_table_name(table)]` WHERE pollid = [pollid] AND ckey = '[ckey]'") if(!query_hasvoted.warn_execute()) + qdel(query_hasvoted) return if(query_hasvoted.NextRow()) + qdel(query_hasvoted) to_chat(usr, "You've already replied to this poll.") return + qdel(query_hasvoted) . = "Player" if(client.holder) . = client.holder.rank.name @@ -364,9 +392,12 @@ //validate the poll is actually the right type of poll and its still active var/datum/DBQuery/query_validate_poll = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime AND polltype = '[type]' [(holder ? "" : "AND adminonly = false")]") if(!query_validate_poll.warn_execute()) + qdel(query_validate_poll) return 0 if (!query_validate_poll.NextRow()) + qdel(query_validate_poll) return 0 + qdel(query_validate_poll) return 1 /mob/dead/new_player/proc/vote_on_irv_poll(pollid, list/votelist) @@ -397,10 +428,12 @@ //lets collect the options var/datum/DBQuery/query_irv_id = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE pollid = [pollid]") if(!query_irv_id.warn_execute()) + qdel(query_irv_id) return 0 var/list/optionlist = list() while (query_irv_id.NextRow()) optionlist += text2num(query_irv_id.item[1]) + qdel(query_irv_id) //validate their votes are actually in the list of options and actually numbers var/list/numberedvotelist = list() @@ -428,13 +461,18 @@ //now lets delete their old votes (if any) var/datum/DBQuery/query_irv_del_old = SSdbcore.NewQuery("DELETE FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'") if(!query_irv_del_old.warn_execute()) + qdel(query_irv_del_old) return 0 + qdel(query_irv_del_old) //now to add the new ones. var/datum/DBQuery/query_irv_vote = SSdbcore.NewQuery("INSERT INTO [format_table_name("poll_vote")] (datetime, pollid, optionid, ckey, ip, adminrank) VALUES [sqlrowlist]") if(!query_irv_vote.warn_execute()) + qdel(query_irv_vote) return 0 - src << browse(null,"window=playerpoll") + qdel(query_irv_vote) + if(!QDELETED(src)) + src << browse(null,"window=playerpoll") return 1 @@ -454,8 +492,11 @@ return var/datum/DBQuery/query_option_vote = SSdbcore.NewQuery("INSERT INTO [format_table_name("poll_vote")] (datetime, pollid, optionid, ckey, ip, adminrank) VALUES (Now(), [pollid], [optionid], '[ckey]', INET_ATON('[client.address]'), '[adminrank]')") if(!query_option_vote.warn_execute()) + qdel(query_option_vote) return - usr << browse(null,"window=playerpoll") + qdel(query_option_vote) + if(!QDELETED(usr)) + usr << browse(null,"window=playerpoll") return 1 /mob/dead/new_player/proc/log_text_poll_reply(pollid, replytext) @@ -481,8 +522,11 @@ return var/datum/DBQuery/query_text_vote = SSdbcore.NewQuery("INSERT INTO [format_table_name("poll_textreply")] (datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (Now(), [pollid], '[ckey]', INET_ATON('[client.address]'), '[replytext]', '[adminrank]')") if(!query_text_vote.warn_execute()) + qdel(query_text_vote) return - usr << browse(null,"window=playerpoll") + qdel(query_text_vote) + if(!QDELETED(usr)) + usr << browse(null,"window=playerpoll") return 1 /mob/dead/new_player/proc/vote_on_numval_poll(pollid, optionid, rating) @@ -498,18 +542,24 @@ return 0 var/datum/DBQuery/query_numval_hasvoted = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE optionid = [optionid] AND ckey = '[ckey]'") if(!query_numval_hasvoted.warn_execute()) + qdel(query_numval_hasvoted) return if(query_numval_hasvoted.NextRow()) + qdel(query_numval_hasvoted) to_chat(usr, "You've already replied to this poll.") return + qdel(query_numval_hasvoted) var/adminrank = "Player" if(client.holder) adminrank = client.holder.rank.name adminrank = sanitizeSQL(adminrank) var/datum/DBQuery/query_numval_vote = SSdbcore.NewQuery("INSERT INTO [format_table_name("poll_vote")] (datetime ,pollid ,optionid ,ckey ,ip ,adminrank, rating) VALUES (Now(), [pollid], [optionid], '[ckey]', INET_ATON('[client.address]'), '[adminrank]', [(isnull(rating)) ? "null" : rating])") if(!query_numval_vote.warn_execute()) + qdel(query_numval_vote) return - usr << browse(null,"window=playerpoll") + qdel(query_numval_vote) + if(!QDELETED(usr)) + usr << browse(null,"window=playerpoll") return 1 /mob/dead/new_player/proc/vote_on_multi_poll(pollid, optionid) @@ -525,26 +575,33 @@ return 0 var/datum/DBQuery/query_multi_choicelen = SSdbcore.NewQuery("SELECT multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid]") if(!query_multi_choicelen.warn_execute()) + qdel(query_multi_choicelen) return 1 var/i if(query_multi_choicelen.NextRow()) - i = text2num(query_multi_choicelen.item[1]) + i = text2num(query_multi_choicelen.item[1]) + qdel(query_multi_choicelen) var/datum/DBQuery/query_multi_hasvoted = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'") if(!query_multi_hasvoted.warn_execute()) + qdel(query_multi_hasvoted) return 1 while(i) if(query_multi_hasvoted.NextRow()) i-- else break + qdel(query_multi_hasvoted) if(!i) return 2 var/adminrank = "Player" - if(client.holder) + if(!QDELETED(client) && client.holder) adminrank = client.holder.rank.name adminrank = sanitizeSQL(adminrank) var/datum/DBQuery/query_multi_vote = SSdbcore.NewQuery("INSERT INTO [format_table_name("poll_vote")] (datetime, pollid, optionid, ckey, ip, adminrank) VALUES (Now(), [pollid], [optionid], '[ckey]', INET_ATON('[client.address]'), '[adminrank]')") if(!query_multi_vote.warn_execute()) + qdel(query_multi_vote) return 1 - usr << browse(null,"window=playerpoll") + qdel(query_multi_vote) + if(!QDELETED(usr)) + usr << browse(null,"window=playerpoll") return 0 diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index b44daefd3f..13ede8ef04 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -68,7 +68,7 @@ icon = 'icons/mob/human_face.dmi' // default icon for all hairs /datum/sprite_accessory/hair/short - name = "Short Hair" // try to capatilize the names please~ // try to spell + name = "Short Hair" // try to capitalize the names please~ // try to spell icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you /datum/sprite_accessory/hair/shorthair2 diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 5715a1fe87..7655e8e1d7 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -622,7 +622,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //this is a mob verb instead of atom for performance reasons //see /mob/verb/examinate() in mob.dm for more info -//overriden here and in /mob/living for different point span classes and sanity checks +//overridden here and in /mob/living for different point span classes and sanity checks /mob/dead/observer/pointed(atom/A as mob|obj|turf in view()) if(!..()) return 0 diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 44af3936a8..20bd69ae40 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -136,7 +136,7 @@ //To appropriately fluff things like "they are holding [I] in their [get_held_index_name(get_held_index_of_item(I))]" -//Can be overriden to pass off the fluff to something else (eg: science allowing people to add extra robotic limbs, and having this proc react to that +//Can be overridden to pass off the fluff to something else (eg: science allowing people to add extra robotic limbs, and having this proc react to that // with say "they are holding [I] in their Nanotrasen Brand Utility Arm - Right Edition" or w/e /mob/proc/get_held_index_name(i) var/list/hand = list() @@ -272,7 +272,7 @@ /mob/proc/canUnEquip(obj/item/I, force) if(!I) return TRUE - if((I.flags_1 & NODROP_1) && !force) + if((I.item_flags & NODROP) && !force) return FALSE return TRUE @@ -312,7 +312,7 @@ if(!I) //If there's nothing to drop, the drop is automatically succesfull. If(unEquip) should generally be used to check for NODROP_1. return TRUE - if((I.flags_1 & NODROP_1) && !force) + if((I.item_flags & NODROP) && !force) return FALSE var/hand_index = get_held_index_of_item(I) @@ -325,7 +325,7 @@ I.layer = initial(I.layer) I.plane = initial(I.plane) I.appearance_flags &= ~NO_CLIENT_COLOR - if(!no_move && !(I.flags_1 & DROPDEL_1)) //item may be moved/qdel'd immedietely, don't bother moving it + if(!no_move && !(I.item_flags & DROPDEL)) //item may be moved/qdel'd immedietely, don't bother moving it if (isnull(newloc)) I.moveToNullspace() else @@ -396,7 +396,7 @@ if(equip_delay_self) return - if(M.active_storage && M.active_storage.parent && M.active_storage.parent.SendSignal(COMSIG_TRY_STORAGE_INSERT, src,M)) + if(M.active_storage && M.active_storage.parent && SEND_SIGNAL(M.active_storage.parent, COMSIG_TRY_STORAGE_INSERT, src,M)) return TRUE var/list/obj/item/possible = list(M.get_inactive_held_item(), M.get_item_by_slot(SLOT_BELT), M.get_item_by_slot(SLOT_GENERC_DEXTROUS_STORAGE), M.get_item_by_slot(SLOT_BACK)) @@ -404,7 +404,7 @@ if(!i) continue var/obj/item/I = i - if(I.SendSignal(COMSIG_TRY_STORAGE_INSERT, src, M)) + if(SEND_SIGNAL(I, COMSIG_TRY_STORAGE_INSERT, src, M)) return TRUE to_chat(M, "You are unable to equip that!") @@ -441,10 +441,7 @@ held_items.len = amt if(hud_used) - var/style - if(client && client.prefs) - style = ui_style2icon(client.prefs.UI_style) - hud_used.build_hand_slots(style) + hud_used.build_hand_slots() /mob/living/carbon/human/change_number_of_hands(amt) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 0052cf923d..d70007452c 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -138,7 +138,7 @@ name = "blood crawl" desc = "You are unable to hold anything while in this form." icon = 'icons/effects/blood.dmi' - flags_1 = NODROP_1|ABSTRACT_1 + item_flags = NODROP | ABSTRACT /mob/living/proc/exit_blood_effect(obj/effect/decal/cleanable/B) playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1) diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index de6c45841b..864d5d769c 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -34,9 +34,9 @@ GLOBAL_VAR(posibrain_notify_cooldown) if(istype(ghost)) activate(ghost) -/obj/item/mmi/posibrain/proc/ping_ghosts(msg, newlymade) // CITADEL EDIT sound change to 'sound/misc/server-ready.ogg' +/obj/item/mmi/posibrain/proc/ping_ghosts(msg, newlymade) if(newlymade || GLOB.posibrain_notify_cooldown <= world.time) - notify_ghosts("[name] [msg] in [get_area(src)]!", ghost_sound = !newlymade ? 'sound/misc/server-ready.ogg':null, enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) + notify_ghosts("[name] [msg] in [get_area(src)]!", ghost_sound = !newlymade ? 'sound/effects/ghost2.ogg':null, enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) if(!newlymade) GLOB.posibrain_notify_cooldown = world.time + askDelay @@ -85,7 +85,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) /obj/item/mmi/posibrain/proc/activate(mob/user) if(QDELETED(brainmob)) return - if(is_occupied() || jobban_isbanned(user,"posibrain")) + if(is_occupied() || jobban_isbanned(user,"posibrain") || QDELETED(brainmob) || QDELETED(src) || QDELETED(user)) return var/posi_ask = alert("Become a [name]? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No") diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm index f8cf430d74..fe61c2a8ff 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm @@ -29,7 +29,7 @@ /obj/effect/proc_holder/alien/royal/praetorian/evolve name = "Evolve" - desc = "Produce an interal egg sac capable of spawning children. Only one queen can exist at a time." + desc = "Produce an internal egg sac capable of spawning children. Only one queen can exist at a time." plasma_cost = 500 action_icon_state = "alien_evolve_praetorian" diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 2216d955c0..eb5e9664d9 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -45,7 +45,7 @@


    "} for(var/i in 1 to held_items.len) var/obj/item/I = get_item_for_held_index(i) - dat += "
    [get_held_index_name(i)]:[(I && !(I.flags_1 & ABSTRACT_1)) ? I : "Empty"]" + dat += "
    [get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Empty"]" dat += "
    Empty Pouches" if(handcuffed) diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index fb04d174e2..9c61e8aa2d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -107,7 +107,7 @@ name = "\improper royal parasite" desc = "Inject this into one of your grown children to promote her to a Praetorian!" icon_state = "alien_medal" - flags_1 = ABSTRACT_1|NODROP_1|DROPDEL_1 + item_flags = ABSTRACT | NODROP | DROPDEL icon = 'icons/mob/alien.dmi' /obj/item/queenpromote/attack(mob/living/M, mob/living/carbon/alien/humanoid/user) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index ffeee159ee..c3c74b8631 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -171,7 +171,7 @@ if(start_T && end_T) add_logs(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]") - else if(!(I.flags_1 & (NODROP_1|ABSTRACT_1))) + else if(!(I.item_flags & (NODROP | ABSTRACT))) thrown_thing = I dropItemToGround(I) @@ -200,13 +200,13 @@
    [name]
    -
    Head: [(head && !(head.flags_1&ABSTRACT_1)) ? head : "Nothing"] -
    Mask: [(wear_mask && !(wear_mask.flags_1&ABSTRACT_1)) ? wear_mask : "Nothing"] -
    Neck: [(wear_neck && !(wear_neck.flags_1&ABSTRACT_1)) ? wear_neck : "Nothing"]"} +
    Head: [(head && !(head.item_flags & ABSTRACT)) ? head : "Nothing"] +
    Mask: [(wear_mask && !(wear_mask.item_flags & ABSTRACT)) ? wear_mask : "Nothing"] +
    Neck: [(wear_neck && !(wear_neck.item_flags & ABSTRACT)) ? wear_neck : "Nothing"]"} for(var/i in 1 to held_items.len) var/obj/item/I = get_item_for_held_index(i) - dat += "
    [get_held_index_name(i)]:[(I && !(I.flags_1 & ABSTRACT_1)) ? I : "Nothing"]" + dat += "
    [get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Nothing"]" dat += "
    Back: [back ? back : "Nothing"]" @@ -403,7 +403,7 @@ return initial(pixel_y) /mob/living/carbon/proc/accident(obj/item/I) - if(!I || (I.flags_1 & (NODROP_1|ABSTRACT_1))) + if(!I || (I.item_flags & (NODROP | ABSTRACT))) return //dropItemToGround(I) CIT CHANGE - makes it so the item doesn't drop if the modifier rolls above 100 @@ -497,15 +497,16 @@ break return 1 -/mob/living/carbon/proc/spew_organ(power = 5) - if(!internal_organs.len) - return //Guess we're out of organs - var/obj/item/organ/guts = pick(internal_organs) - var/turf/T = get_turf(src) - guts.Remove(src) - guts.forceMove(T) - var/atom/throw_target = get_edge_target_turf(guts, dir) - guts.throw_at(throw_target, power, 4, src) +/mob/living/carbon/proc/spew_organ(power = 5, amt = 1) + for(var/i in 1 to amt) + if(!internal_organs.len) + break //Guess we're out of organs! + var/obj/item/organ/guts = pick(internal_organs) + var/turf/T = get_turf(src) + guts.Remove(src) + guts.forceMove(T) + var/atom/throw_target = get_edge_target_turf(guts, dir) + guts.throw_at(throw_target, power, 4, src) /mob/living/carbon/fully_replace_character_name(oldname,newname) @@ -760,10 +761,10 @@ drop_all_held_items() stop_pulling() throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed) - SendSignal(COMSIG_ADD_MOOD_EVENT, "handcuffed", /datum/mood_event/handcuffed) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "handcuffed", /datum/mood_event/handcuffed) else clear_alert("handcuffed") - SendSignal(COMSIG_CLEAR_MOOD_EVENT, "handcuffed") + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "handcuffed") update_action_buttons_icon() //some of our action buttons might be unusable when we're handcuffed. update_inv_handcuffed() update_hud_handcuffed() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 9e6d5dd896..ebe078ac21 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -71,7 +71,7 @@ affecting = get_bodypart(ran_zone(user.zone_selected)) if(!affecting) //missing limb? we select the first bodypart (you can never have zero, because of chest) affecting = bodyparts[1] - I.SendSignal(COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) + SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) send_item_attack_message(I, user, affecting.name) if(I.force) //CIT CHANGES START HERE - combatmode and resting checks @@ -284,7 +284,7 @@ else M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ "You hug [src] to make [p_them()] feel better!") - SendSignal(COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) AdjustStun(-60) AdjustKnockdown(-60) AdjustUnconscious(-60) @@ -349,7 +349,7 @@ /mob/living/carbon/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) var/list/reflist = list(intensity) // Need to wrap this in a list so we can pass a reference - SendSignal(COMSIG_CARBON_SOUNDBANG, reflist) + SEND_SIGNAL(src, COMSIG_CARBON_SOUNDBANG, reflist) intensity = reflist[1] var/ear_safety = get_ear_protection() var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index c748658c4e..7d6d5afca2 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -18,7 +18,7 @@ msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n" for(var/obj/item/I in held_items) - if(!(I.flags_1 & ABSTRACT_1)) + if(!(I.item_flags & ABSTRACT)) msg += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" if (back) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index e569766542..bc55487e95 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -43,7 +43,7 @@ //Hands for(var/obj/item/I in held_items) - if(!(I.flags_1 & ABSTRACT_1)) + if(!(I.item_flags & ABSTRACT)) msg += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" GET_COMPONENT(FR, /datum/component/forensics) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 4a8870281b..de8542094b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -68,7 +68,7 @@ stat("Internal Atmosphere Info", internal.name) stat("Tank Pressure", internal.air_contents.return_pressure()) stat("Distribution Pressure", internal.distribute_pressure) -// var/mob/living/simple_animal/borer/B = has_brain_worms() + if(mind) var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) if(changeling) @@ -115,42 +115,42 @@ dat += "" for(var/i in 1 to held_items.len) var/obj/item/I = get_item_for_held_index(i) - dat += "" + dat += "" dat += "" - dat += "" - dat += "" + dat += "" if(SLOT_WEAR_MASK in obscured) dat += "" else - dat += "" + dat += "" if(SLOT_NECK in obscured) dat += "" else - dat += "" + dat += "" if(SLOT_GLASSES in obscured) dat += "" else - dat += "" + dat += "" if(SLOT_EARS in obscured) dat += "" else - dat += "" + dat += "" dat += "" - dat += "" + dat += "" if(wear_suit) - dat += "" @@ -160,30 +160,30 @@ if(SLOT_SHOES in obscured) dat += "" else - dat += "" + dat += "" if(SLOT_GLOVES in obscured) dat += "" else - dat += "" + dat += "" if(SLOT_W_UNIFORM in obscured) dat += "" else - dat += "" + dat += "" if((w_uniform == null && !(dna && dna.species.nojumpsuit)) || (SLOT_W_UNIFORM in obscured)) dat += "" dat += "" dat += "" else - dat += "" - dat += "" - dat += "" + dat += "" + dat += "" if(handcuffed) dat += "" @@ -230,7 +230,7 @@ usr.visible_message("[usr] successfully rips [I] out of [usr.p_their()] [L.name]!","You successfully remove [I] from your [L.name].") if(!has_embedded_objects()) clear_alert("embeddedobject") - usr.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "embedded") + SEND_SIGNAL(usr, COMSIG_CLEAR_MOOD_EVENT, "embedded") return if(href_list["item"]) @@ -246,11 +246,11 @@ var/obj/item/place_item = usr.get_active_held_item() // Item to place in the pocket, if it's empty var/delay_denominator = 1 - if(pocket_item && !(pocket_item.flags_1&ABSTRACT_1)) - if(pocket_item.flags_1 & NODROP_1) + if(pocket_item && !(pocket_item.item_flags & ABSTRACT)) + if(pocket_item.item_flags & NODROP) to_chat(usr, "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!") to_chat(usr, "You try to empty [src]'s [pocket_side] pocket.") - else if(place_item && place_item.mob_can_equip(src, usr, pocket_id, 1) && !(place_item.flags_1&ABSTRACT_1)) + else if(place_item && place_item.mob_can_equip(src, usr, pocket_id, 1) && !(place_item.item_flags & ABSTRACT)) to_chat(usr, "You try to place [place_item] into [src]'s [pocket_side] pocket.") delay_denominator = 4 else @@ -274,7 +274,7 @@ // Display a warning if the user mocks up to_chat(src, "You feel your [pocket_side] pocket being fumbled with!") - ..() + ..() ///////HUDs/////// @@ -387,7 +387,7 @@ R = find_record("name", perpname, GLOB.data_core.security) if(R) if(href_list["status"]) - var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Discharged", "Cancel") + var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Paroled", "Discharged", "Cancel") if(setcriminal != "Cancel") if(R) if(H.canUseHUD()) @@ -590,7 +590,7 @@ threatcount += 5 if("Incarcerated") threatcount += 2 - if("Parolled") + if("Paroled") threatcount += 2 //Check for dresscode violations @@ -662,7 +662,7 @@ return src.visible_message("[src] performs CPR on [C.name]!", "You perform CPR on [C.name].") - SendSignal(COMSIG_ADD_MOOD_EVENT, "perform_cpr", /datum/mood_event/perform_cpr) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "perform_cpr", /datum/mood_event/perform_cpr) C.cpr_time = world.time add_logs(src, C, "CPRed") @@ -689,7 +689,7 @@ if(strength < CLEAN_STRENGTH_BLOOD) return if(gloves) - if(gloves.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + if(SEND_SIGNAL(gloves, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) update_inv_gloves() else if(bloody_hands) @@ -727,9 +727,8 @@ to_chat(src, "You can't do that right now!") return FALSE if(!Adjacent(M) && (M.loc != src)) - if((be_close == 0) && (dna.check_mutation(TK))) - if(tkMaxRangeCheck(src, M)) - return TRUE + if((be_close == 0) || (dna.check_mutation(TK) && tkMaxRangeCheck(src, M))) + return TRUE to_chat(src, "You are too far away!") return FALSE return TRUE diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 33344486b1..acf4b0734c 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -144,7 +144,7 @@ I.forceMove(src) L.receive_damage(I.w_class*I.embedding.embedded_impact_pain_multiplier) visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") - SendSignal(COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) hitpush = FALSE skipcatch = TRUE //can't catch the now embedded item @@ -173,7 +173,7 @@ affecting = get_bodypart(ran_zone(user.zone_selected)) var/target_area = parse_zone(check_zone(user.zone_selected)) //our intended target - I.SendSignal(COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) + SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) SSblackbox.record_feedback("nested tally", "item_used_for_combat", 1, list("[I.force]", "[I.type]")) SSblackbox.record_feedback("tally", "zone_targeted", 1, target_area) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 871b64bbc0..5bfbb76e46 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -67,6 +67,6 @@ S.step_action() /mob/living/carbon/human/Process_Spacemove(movement_dir = 0) //Temporary laziness thing. Will change to handles by species reee. - if(..()) - return 1 - return dna.species.space_move(src) + if(dna.species.space_move(src)) + return TRUE + return ..() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 0e033856b2..bc39670e56 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -66,14 +66,14 @@ adjust_blurriness(-1) if (getBrainLoss() >= 60 && !incapacitated(TRUE)) - SendSignal(COMSIG_ADD_MOOD_EVENT, "brain_damage", /datum/mood_event/brain_damage) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "brain_damage", /datum/mood_event/brain_damage) if(prob(3)) if(prob(25)) emote("drool") else say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")) else - SendSignal(COMSIG_CLEAR_MOOD_EVENT, "brain_damage") + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "brain_damage") /mob/living/carbon/human/handle_mutations_and_radiation() if(!dna || !dna.species.handle_mutations_and_radiation(src)) @@ -313,7 +313,7 @@ visible_message("[I] falls out of [name]'s [BP.name]!","[I] falls out of your [BP.name]!") if(!has_embedded_objects()) clear_alert("embeddedobject") - SendSignal(COMSIG_CLEAR_MOOD_EVENT, "embedded") + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "embedded") /mob/living/carbon/human/proc/handle_active_genes() for(var/datum/mutation/human/HM in dna.mutations) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 51ba7a9d9c..34c243a4ba 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -970,7 +970,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) if(SLOT_L_STORE) - if(I.flags_1 & NODROP_1) //Pockets aren't visible, so you can't move NODROP_1 items into them. + if(I.item_flags & NODROP) //Pockets aren't visible, so you can't move NODROP_1 items into them. return FALSE if(H.l_store) return FALSE @@ -986,7 +986,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKET) ) return TRUE if(SLOT_R_STORE) - if(I.flags_1 & NODROP_1) + if(I.item_flags & NODROP) return FALSE if(H.r_store) return FALSE @@ -1003,7 +1003,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) return TRUE return FALSE if(SLOT_S_STORE) - if(I.flags_1 & NODROP_1) + if(I.item_flags & NODROP) return FALSE if(H.s_store) return FALSE @@ -1040,7 +1040,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) return TRUE if(SLOT_IN_BACKPACK) if(H.back) - if(H.back.SendSignal(COMSIG_TRY_STORAGE_CAN_INSERT, I, H, TRUE)) + if(SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_CAN_INSERT, I, H, TRUE)) return TRUE return FALSE return FALSE //Unsupported slot @@ -1138,22 +1138,22 @@ GLOBAL_LIST_EMPTY(roundstart_races) switch(H.nutrition) if(NUTRITION_LEVEL_FULL to INFINITY) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/fat) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/fat) H.throw_alert("nutrition", /obj/screen/alert/fat) if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/wellfed) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/wellfed) H.clear_alert("nutrition") if( NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/fed) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/fed) H.clear_alert("nutrition") if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) - H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "nutrition") + SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "nutrition") H.clear_alert("nutrition") if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/hungry) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/hungry) H.throw_alert("nutrition", /obj/screen/alert/hungry) if(0 to NUTRITION_LEVEL_STARVING) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/starving) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/starving) H.throw_alert("nutrition", /obj/screen/alert/starving) /datum/species/proc/update_health_hud(mob/living/carbon/human/H) @@ -1211,8 +1211,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(H.movement_type & FLYING) flight = 1 - if(H.has_gravity()) - gravity = TRUE + gravity = H.has_gravity() if(!flightpack && gravity) //Check for chemicals and innate speedups and slowdowns if we're moving using our body and not a flying suit if(H.has_trait(TRAIT_GOTTAGOFAST)) @@ -1265,6 +1264,11 @@ GLOBAL_LIST_EMPTY(roundstart_races) if((hungry >= 70) && !flight) //Being hungry will still allow you to use a flightsuit/wings. . += hungry / 50 + //Moving in high gravity is very slow (Flying too) + if(gravity > STANDARD_GRAVITY) + var/grav_force = min(gravity - STANDARD_GRAVITY,3) + . += 1 + grav_force + GET_COMPONENT_FROM(mood, /datum/component/mood, H) if(mood && !flight) //How can depression slow you down if you can just fly away from your problems? switch(mood.sanity) @@ -1457,7 +1461,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) playsound(target, 'sound/weapons/punchmiss.ogg', 25, 1, -1) target.visible_message("[user] attempted to disarm [target]!", \ "[user] attemped to disarm [target]!", null, COMBAT_MESSAGE_RANGE) - + add_logs(user, target, "attempted to disarm") /datum/species/proc/spec_hitby(atom/movable/AM, mob/living/carbon/human/H) @@ -1701,9 +1705,11 @@ GLOBAL_LIST_EMPTY(roundstart_races) // +/- 50 degrees from 310K is the 'safe' zone, where no damage is dealt. if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTHEAT)) //Body temperature is too hot. + + SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold") + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "hot", /datum/mood_event/hot) + var/burn_damage - H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "cold") - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "hot", /datum/mood_event/hot) switch(H.bodytemperature) if(BODYTEMP_HEAT_DAMAGE_LIMIT to 400) H.throw_alert("temp", /obj/screen/alert/hot, 1) @@ -1723,8 +1729,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.apply_damage(burn_damage, BURN) else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTCOLD)) - H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "hot") - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold) + SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot") + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold) switch(H.bodytemperature) if(200 to BODYTEMP_COLD_DAMAGE_LIMIT) H.throw_alert("temp", /obj/screen/alert/cold, 1) @@ -1738,8 +1744,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) else H.clear_alert("temp") - H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "cold") - H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "hot") + SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold") + SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot") var/pressure = environment.return_pressure() var/adjusted_pressure = H.calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob. @@ -1833,7 +1839,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.adjust_bodytemperature(11) else H.adjust_bodytemperature(BODYTEMP_HEATING_MAX + (H.fire_stacks * 12)) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire) /datum/species/proc/CanIgniteMob(mob/living/carbon/human/H) if(H.has_trait(TRAIT_NOFIRE)) @@ -1860,12 +1866,3 @@ GLOBAL_LIST_EMPTY(roundstart_races) /datum/species/proc/negates_gravity(mob/living/carbon/human/H) return 0 - - -#undef HEAT_DAMAGE_LEVEL_1 -#undef HEAT_DAMAGE_LEVEL_2 -#undef HEAT_DAMAGE_LEVEL_3 - -#undef COLD_DAMAGE_LEVEL_1 -#undef COLD_DAMAGE_LEVEL_2 -#undef COLD_DAMAGE_LEVEL_3 diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index ae90bb8597..a266f42f4a 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -24,11 +24,6 @@ H.endTailWag() . = ..() -/datum/species/human/space_move(mob/living/carbon/human/H) - var/obj/item/flightpack/F = H.get_flightpack() - if(istype(F) && (F.flight) && F.allow_thrust(0.01, src)) - return TRUE - /datum/species/human/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) if(H.dna.features["ears"] == "Cat") mutantears = /obj/item/organ/ears/cat diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 839d480776..7f5726cf95 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -669,6 +669,8 @@ /datum/action/innate/project_thought/Activate() var/mob/living/carbon/human/H = owner + if(H.stat == DEAD) + return if(!is_species(H, /datum/species/jelly/stargazer)) return CHECK_DNA_AND_SPECIES(H) diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 4ef4fe4887..22a44e3fa7 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -171,7 +171,7 @@ armour_penetration = 35 lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' - flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1 + item_flags = ABSTRACT | NODROP | DROPDEL w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP @@ -216,4 +216,4 @@ playsound(src, 'sound/items/welder.ogg', 50, 1) #undef HEART_SPECIAL_SHADOWIFY -#undef HEART_RESPAWN_THRESHHOLD \ No newline at end of file +#undef HEART_RESPAWN_THRESHHOLD diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index bca70c053c..bc2d6132e1 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -72,7 +72,7 @@ put_in_hands(I) update_inv_hands() if(SLOT_IN_BACKPACK) - if(!back.SendSignal(COMSIG_TRY_STORAGE_INSERT, I, src, TRUE)) + if(!SEND_SIGNAL(back, COMSIG_TRY_STORAGE_INSERT, I, src, TRUE)) not_handled = TRUE else not_handled = TRUE @@ -137,3 +137,6 @@ update_inv_wear_mask() update_inv_head() +/mob/living/carbon/proc/get_holding_bodypart_of_item(obj/item/I) + var/index = get_held_index_of_item(I) + return index && hand_bodyparts[index] diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 814ce0ef0f..7fefaa5d6b 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -156,7 +156,7 @@ adjustOxyLoss(3) failed_last_breath = 1 throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) - SendSignal(COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) else //Enough oxygen failed_last_breath = 0 @@ -164,7 +164,7 @@ adjustOxyLoss(-5) oxygen_used = breath_gases[/datum/gas/oxygen][MOLES] clear_alert("not_enough_oxy") - SendSignal(COMSIG_CLEAR_MOOD_EVENT, "suffocation") + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "suffocation") breath_gases[/datum/gas/oxygen][MOLES] -= oxygen_used breath_gases[/datum/gas/carbon_dioxide][MOLES] += oxygen_used diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index ed60456b67..8b69a4d65d 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -133,7 +133,7 @@ /mob/living/carbon/monkey/proc/handle_combat() if(pickupTarget) - if(restrained() || blacklistItems[pickupTarget] || (pickupTarget.flags_1 & NODROP_1)) + if(restrained() || blacklistItems[pickupTarget] || (pickupTarget.item_flags & NODROP)) pickupTarget = null else pickupTimer++ @@ -225,7 +225,7 @@ // check if target has a weapon var/obj/item/W for(var/obj/item/I in target.held_items) - if(!(I.flags_1 & ABSTRACT_1)) + if(!(I.item_flags & ABSTRACT)) W = I break diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 518bf46041..1ddea78bf2 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -1,10 +1,4 @@ -#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point -#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point -#define HEAT_DAMAGE_LEVEL_3 10 //Amount of damage applied when your body temperature passes the 460K point and you are on fire -#define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point -#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point -#define COLD_DAMAGE_LEVEL_3 3 //Amount of damage applied when your body temperature passes the 120K point /mob/living/carbon/monkey @@ -175,12 +169,4 @@ I.take_damage(fire_stacks, BURN, "fire", 0) adjust_bodytemperature(BODYTEMP_HEATING_MAX) - SendSignal(COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire) - -#undef HEAT_DAMAGE_LEVEL_1 -#undef HEAT_DAMAGE_LEVEL_2 -#undef HEAT_DAMAGE_LEVEL_3 - -#undef COLD_DAMAGE_LEVEL_1 -#undef COLD_DAMAGE_LEVEL_2 -#undef COLD_DAMAGE_LEVEL_3 \ No newline at end of file + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire) diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 1d619364e0..d850efcee6 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -45,11 +45,11 @@ if(druggy) overlay_fullscreen("high", /obj/screen/fullscreen/high) throw_alert("high", /obj/screen/alert/high) - SendSignal(COMSIG_ADD_MOOD_EVENT, "high", /datum/mood_event/drugs/high) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "high", /datum/mood_event/drugs/high) else clear_fullscreen("high") clear_alert("high") - SendSignal(COMSIG_CLEAR_MOOD_EVENT, "high") + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "high") /mob/living/carbon/set_drugginess(amount) druggy = max(amount, 0) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index af685e91cb..212b96e6d9 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -124,7 +124,7 @@ if(wear_mask) if(!(head && (head.flags_inv & HIDEMASK))) - overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = ((wear_mask.icon_override) ? wear_mask.icon_override : 'icons/mob/mask.dmi')) + overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/mask.dmi') update_hud_wear_mask(wear_mask) apply_overlay(FACEMASK_LAYER) @@ -138,7 +138,7 @@ if(wear_neck) if(!(head && (head.flags_inv & HIDENECK))) - overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = ((wear_neck.icon_override) ? wear_neck.icon_override : 'icons/mob/neck.dmi')) + overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = 'icons/mob/neck.dmi') update_hud_neck(wear_neck) apply_overlay(NECK_LAYER) @@ -151,7 +151,7 @@ inv.update_icon() if(back) - overlays_standing[BACK_LAYER] = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = ((back.icon_override) ? back.icon_override : 'icons/mob/back.dmi')) + overlays_standing[BACK_LAYER] = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = 'icons/mob/back.dmi') update_hud_back(back) apply_overlay(BACK_LAYER) @@ -167,7 +167,7 @@ inv.update_icon() if(head) - overlays_standing[HEAD_LAYER] = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = ((head.icon_override) ? head.icon_override : 'icons/mob/head.dmi')) + overlays_standing[HEAD_LAYER] = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/head.dmi') update_hud_head(head) apply_overlay(HEAD_LAYER) @@ -235,22 +235,11 @@ if(limb_icon_cache[icon_render_key]) load_limb_from_cache() return - //Taur code goes here, since humans just inherit this proc - var/is_taur = FALSE - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None")) - is_taur = TRUE //GENERATE NEW LIMBS var/list/new_limbs = list() for(var/X in bodyparts) var/obj/item/bodypart/BP = X - - if(istype(BP, /obj/item/bodypart/r_leg) || istype(BP, /obj/item/bodypart/l_leg)) - if(is_taur) - continue - new_limbs += BP.get_limb_icon() if(new_limbs.len) overlays_standing[BODYPARTS_LAYER] = new_limbs diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 7542c0c79c..4b6280f1f9 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -54,7 +54,7 @@ var/turf/T = get_turf(src) for(var/obj/item/I in contents) I.on_mob_death(src, gibbed) - if(mind && mind.name && mind.active && (!(T.flags_1 & NO_DEATHRATTLE_1))) + if(mind && mind.name && mind.active && !istype(T.loc, /area/ctf)) var/rendered = "[mind.name] has died at [get_area_name(T)]." deadchat_broadcast(rendered, follow_target = src, turf_target = T, message_type=DEADCHAT_DEATHRATTLE) if(mind) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index b8711e13f3..458c19edfb 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -412,6 +412,8 @@ if(jobban_isbanned(user, "emote")) to_chat(user, "You cannot send custom emotes (banned).") return FALSE + else if(QDELETED(user)) + return FALSE else if(user.client && user.client.prefs.muted & MUTE_IC) to_chat(user, "You cannot send IC messages (muted).") return FALSE diff --git a/code/modules/mob/living/inhand_holder.dm b/code/modules/mob/living/inhand_holder.dm index 711866d733..420c59b22d 100644 --- a/code/modules/mob/living/inhand_holder.dm +++ b/code/modules/mob/living/inhand_holder.dm @@ -5,7 +5,7 @@ desc = "Yell at coderbrush." icon = null icon_state = "" - flags_1 = DROPDEL_1 + item_flags = DROPDEL var/mob/living/held_mob var/can_head = TRUE var/destroying = FALSE diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 4ee96b2635..817e3c3f3b 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -58,7 +58,7 @@ //stuff in the stomach handle_stomach() - update_gravity(mob_has_gravity()) + handle_gravity() if(machine) machine.check_eye(src) @@ -110,7 +110,7 @@ ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire return var/turf/location = get_turf(src) - location.hotspot_expose(700, 50, 1) + location.hotspot_expose(700, 10, 1) /mob/living/proc/handle_stomach() return @@ -137,3 +137,26 @@ /mob/living/proc/update_damage_hud() return + +/mob/living/proc/handle_gravity() + var/gravity = mob_has_gravity() + update_gravity(gravity) + + if(gravity > STANDARD_GRAVITY) + gravity_animate() + handle_high_gravity(gravity) + +/mob/living/proc/gravity_animate() + if(!get_filter("gravity")) + add_filter("gravity",1,list("type"="motion_blur", "x"=0, "y"=0)) + INVOKE_ASYNC(src, .proc/gravity_pulse_animation) + +/mob/living/proc/gravity_pulse_animation() + animate(get_filter("gravity"), y = 1, time = 10) + sleep(10) + animate(get_filter("gravity"), y = 0, time = 10) + +/mob/living/proc/handle_high_gravity(gravity) + if(gravity >= GRAVITY_DAMAGE_TRESHOLD) //Aka gravity values of 3 or more + var/grav_stregth = gravity - GRAVITY_DAMAGE_TRESHOLD + adjustBruteLoss(min(grav_stregth,3)) \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 71999fa7a5..5db817ef8a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -368,7 +368,7 @@ ret |= contents //add our contents for(var/i in ret.Copy()) //iterate storage objects var/atom/A = i - A.SendSignal(COMSIG_TRY_STORAGE_RETURN_INVENTORY, ret) + SEND_SIGNAL(A, COMSIG_TRY_STORAGE_RETURN_INVENTORY, ret) for(var/obj/item/folder/F in ret.Copy()) //very snowflakey-ly iterate folders ret |= F.contents return ret @@ -466,21 +466,6 @@ /mob/living/proc/update_damage_overlays() return -/mob/living/proc/Examine_OOC() - set name = "Examine Meta-Info (OOC)" - set category = "OOC" - set src in view() - - if(CONFIG_GET(flag/allow_metadata)) - if(client) - to_chat(src, "[src]'s Metainfo:
    [client.prefs.metadata]") - else - to_chat(src, "[src] does not have any stored information!") - else - to_chat(src, "OOC Metadata is not supported by this server!") - - return - /mob/living/Move(atom/newloc, direct) if (buckled && buckled.loc != newloc) //not updating position if (!buckled.anchored) @@ -604,6 +589,7 @@ return changeNext_move(CLICK_CD_RESIST) + SEND_SIGNAL(src, COMSIG_LIVING_RESIST, src) //resisting grabs (as if it helps anyone...) if(!restrained(ignore_grab = 1) && pulledby) visible_message("[src] resists against [pulledby]'s grip!") @@ -623,14 +609,6 @@ var/obj/C = loc C.container_resist(src) - else if(IsFrozen()) - to_chat(src, "You start breaking out of the ice cube!") - if(do_mob(src, src, 40)) - if(IsFrozen()) - to_chat(src, "You break out of the ice cube!") - remove_status_effect(/datum/status_effect/freon) - update_canmove() - else if(canmove) if(on_fire) resist_fire() //stop, drop, and roll @@ -673,9 +651,15 @@ if(!SSticker.HasRoundStarted()) return if(has_gravity) - clear_alert("weightless") + if(has_gravity == 1) + clear_alert("gravity") + else + if(has_gravity >= GRAVITY_DAMAGE_TRESHOLD) + throw_alert("gravity", /obj/screen/alert/veryhighgravity) + else + throw_alert("gravity", /obj/screen/alert/highgravity) else - throw_alert("weightless", /obj/screen/alert/weightless) + throw_alert("gravity", /obj/screen/alert/weightless) if(!override && !is_flying()) float(!has_gravity) @@ -697,7 +681,7 @@ // The src mob is trying to strip an item from someone // Override if a certain type of mob should be behave differently when stripping items (can't, for example) /mob/living/stripPanelUnequip(obj/item/what, mob/who, where) - if(what.flags_1 & NODROP_1) + if(what.item_flags & NODROP) to_chat(src, "You can't remove \the [what.name], it appears to be stuck!") return who.visible_message("[src] tries to remove [who]'s [what.name].", \ @@ -718,7 +702,7 @@ // Override if a certain mob should be behave differently when placing items (can't, for example) /mob/living/stripPanelEquip(obj/item/what, mob/who, where) what = src.get_active_held_item() - if(what && (what.flags_1 & NODROP_1)) + if(what && (what.item_flags & NODROP)) to_chat(src, "You can't put \the [what.name] on [who], it's stuck to your hand!") return if(what) @@ -831,7 +815,6 @@ return FALSE return TRUE - /mob/living/proc/update_stamina() return /* @@ -928,6 +911,7 @@ new/obj/effect/dummy/fire(src) throw_alert("fire", /obj/screen/alert/fire) update_fire() + SEND_SIGNAL(src, COMSIG_LIVING_IGNITED,src) return TRUE return FALSE @@ -938,7 +922,8 @@ for(var/obj/effect/dummy/fire/F in src) qdel(F) clear_alert("fire") - SendSignal(COMSIG_CLEAR_MOOD_EVENT, "on_fire") + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "on_fire") + SEND_SIGNAL(src, COMSIG_LIVING_EXTINGUISHED, src) update_fire() /mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person @@ -1149,6 +1134,9 @@ /mob/living/vv_edit_var(var_name, var_value) switch(var_name) + if ("maxHealth") + if (!isnum(var_value) || var_value <= 0) + return FALSE if("stat") if((stat == DEAD) && (var_value < DEAD))//Bringing the dead back to life GLOB.dead_mob_list -= src diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 851bf43334..64349c15a4 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -67,7 +67,7 @@ var/zone = ran_zone(BODY_ZONE_CHEST, 65)//Hits a random part of the body, geared towards the chest var/dtype = BRUTE var/volume = I.get_volume_by_throwforce_and_or_w_class() - I.SendSignal(COMSIG_MOVABLE_IMPACT_ZONE, src, zone) + SEND_SIGNAL(I, COMSIG_MOVABLE_IMPACT_ZONE, src, zone) dtype = I.damtype if (I.throwforce > 0) //If the weapon's throwforce is greater than zero... diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index cbc04d11be..91401cbc88 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -124,7 +124,7 @@ job = "AI" create_eye() - rename_self("ai") + apply_pref_name("ai") holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"default")) @@ -824,7 +824,7 @@ //apc_override is needed here because AIs use their own APC when depowered return (GLOB.cameranet && GLOB.cameranet.checkTurfVis(get_turf_pixel(A))) || apc_override //AI is carded/shunted - //view(src) returns nothing for carded/shunted AIs and they have x-ray vision so just use get_dist + //view(src) returns nothing for carded/shunted AIs and they have X-ray vision so just use get_dist var/list/viewscale = getviewsize(client.view) return get_dist(src, A) <= max(viewscale[1]*0.5,viewscale[2]*0.5) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 0135fca88e..5a4f01a53c 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -236,7 +236,7 @@ P.fold_out() /datum/action/innate/pai/chassis - name = "Holochassis Appearence Composite" + name = "Holochassis Appearance Composite" button_icon_state = "pai_chassis" background_icon_state = "bg_tech" diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 41bd62ea16..85f7fe6afc 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -116,6 +116,6 @@ /mob/living/silicon/pai/mob_try_pickup(mob/living/user) if(!possible_chassis[chassis]) - to_chat(user, "[src]'s current form isn't able to be carried!") + to_chat(user, "[src]'s current form isn't able to be carried!") return FALSE return ..() diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 38208a3d2e..9fd16bbbb2 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -209,7 +209,7 @@ pda.silent = !pda.silent else if(href_list["target"]) if(silent) - return alert("Communications circuits remain unitialized.") + return alert("Communications circuits remain uninitialized.") var/target = locate(href_list["target"]) pda.create_message(src, target) diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 2b775070a9..1e24259986 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -16,7 +16,6 @@ sight_mode &= ~S.sight_mode update_sight() else if(istype(O, /obj/item/storage/bag/tray/)) - O.SendSignal(COMSIG_TRY_STORAGE_QUICK_EMPTY) //CITADEL EDIT reee proc, Dogborg modules if(istype(O,/obj/item/gun/energy/laser/cyborg)) laser = FALSE @@ -31,15 +30,10 @@ var/obj/item/dogborg/sleeper/S = O S.go_out() //this should stop edgecase deletions //END CITADEL EDIT + SEND_SIGNAL(O, COMSIG_TRY_STORAGE_QUICK_EMPTY) if(client) client.screen -= O observer_screen_update(O,FALSE) - O.forceMove(module) //Return item to module so it appears in its contents, so it can be taken out again. - - if(O.flags_1 & DROPDEL_1) - O.flags_1 &= ~DROPDEL_1 //we shouldn't HAVE things with DROPDEL_1 in our modules, but better safe than runtiming horribly - - O.dropped(src) if(module_active == O) module_active = null @@ -52,6 +46,12 @@ else if(held_items[3] == O) inv3.icon_state = "inv3" held_items[3] = null + + if(O.item_flags & DROPDEL) + O.item_flags &= ~DROPDEL //we shouldn't HAVE things with DROPDEL_1 in our modules, but better safe than runtiming horribly + + O.forceMove(module) //Return item to module so it appears in its contents, so it can be taken out again. + hud_used.update_robot_modules_display() return 1 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index b29769521a..ab0a9602fc 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -238,15 +238,17 @@ module.transform_to(modulelist[input_module]) -/mob/living/silicon/robot/proc/updatename() +/mob/living/silicon/robot/proc/updatename(client/C) if(shell) return + if(!C) + C = client var/changed_name = "" if(custom_name) changed_name = custom_name - if(changed_name == "" && client) - rename_self(src, client) - return //built in camera handled in proc + if(changed_name == "" && C && C.prefs.custom_names["cyborg"] != DEFAULT_CYBORG_NAME) + if(apply_pref_name("cyborg", C)) + return //built in camera handled in proc if(!changed_name) changed_name = get_standard_name() @@ -388,12 +390,8 @@ to_chat(user, "You start fixing yourself...") if(!W.use_tool(src, user, 50)) return - adjustBruteLoss(-10) - else - to_chat(user, "You start fixing [src]...") - if(!do_after(user, 30, target = src)) - return - adjustBruteLoss(-30) + + adjustBruteLoss(-30) updatehealth() add_fingerprint(user) visible_message("[user] has fixed some of the dents on [src].") diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 0a56ea2425..4907e46751 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -47,7 +47,7 @@ damage = rand(20, 40) else damage = rand(5, 35) - damage = round(damage / 2) // borgs recieve half damage + damage = round(damage / 2) // borgs receive half damage adjustBruteLoss(damage) updatehealth() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 3a138a5dad..3f3071bf0c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -119,7 +119,7 @@ if(I.loc != src) I.forceMove(src) modules += I - I.flags_1 |= NODROP_1 + I.item_flags |= NODROP I.mouse_opacity = MOUSE_OPACITY_OPAQUE if(nonstandard) added_modules += I diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index b149701591..3fadd0d6c8 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -405,4 +405,7 @@ return 1 /mob/living/silicon/get_inactive_held_item() - return FALSE \ No newline at end of file + return FALSE + +/mob/living/silicon/handle_high_gravity(gravity) + return diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index f152132377..b38cf6395c 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -524,7 +524,7 @@ Pass a positive integer as an argument to override a bot's default speed. turn_on() //Saves the AI the hassle of having to activate a bot manually. access_card = all_access //Give the bot all-access while under the AI's command. if(client) - reset_access_timer_id = addtimer(CALLBACK (src, .proc/bot_reset), 600, TIMER_OVERRIDE|TIMER_STOPPABLE) //if the bot is player controlled, they get the extra access for a limited time + reset_access_timer_id = addtimer(CALLBACK (src, .proc/bot_reset), 600, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) //if the bot is player controlled, they get the extra access for a limited time to_chat(src, "Priority waypoint set by [icon2html(calling_ai, src)] [caller]. Proceed to [end_area].
    [path.len-1] meters to destination. You have been granted additional door access for 60 seconds.
    ") if(message) to_chat(calling_ai, "[icon2html(src, calling_ai)] [name] called to [end_area]. [path.len-1] meters to destination.") @@ -720,7 +720,7 @@ Pass a positive integer as an argument to override a bot's default speed. if("ejectpai") return else - to_chat(src, "Unidentified control sequence recieved:[command]") + to_chat(src, "Unidentified control sequence received:[command]") /mob/living/simple_animal/bot/proc/bot_summon() // summoned to PDA summon_step() diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index f47f936db7..7e5cfe2110 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -19,7 +19,7 @@ window_name = "Automatic Station Floor Repairer v1.1" path_image_color = "#FFA500" - var/process_type //Determines what to do when process_scan() recieves a target. See process_scan() for details. + var/process_type //Determines what to do when process_scan() receives a target. See process_scan() for details. var/targetdirection var/replacetiles = 0 var/placetiles = 0 diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 51698d1ddb..0787e536cb 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -232,7 +232,7 @@ return if(!item_to_add) user.visible_message("[user] pets [src].","You rest your hand on [src]'s head for a moment.") - user.SendSignal(COMSIG_ADD_MOOD_EVENT, "pet_corgi", /datum/mood_event/pet_corgi) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "pet_corgi", /datum/mood_event/pet_corgi) return if(user && !user.temporarilyRemoveItemFromInventory(item_to_add)) @@ -615,7 +615,7 @@ if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454 new /obj/effect/temp_visual/heart(loc) emote("me", 1, "yaps happily!") - M.SendSignal(COMSIG_ADD_MOOD_EVENT, "pet_corgi", /datum/mood_event/pet_corgi) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "pet_corgi", /datum/mood_event/pet_corgi) else if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case) emote("me", 1, "growls!") diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 51983e272a..613d348016 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -92,7 +92,7 @@ var/obj/item/I = new default_hatmask(src) equip_to_slot_or_del(I, SLOT_HEAD) - access_card.flags_1 |= NODROP_1 + access_card.item_flags |= NODROP alert_drones(DRONE_NET_CONNECT) @@ -168,15 +168,15 @@ //Hands for(var/obj/item/I in held_items) - if(!(I.flags_1 & ABSTRACT_1)) + if(!(I.item_flags & ABSTRACT)) msg += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n" //Internal storage - if(internal_storage && !(internal_storage.flags_1&ABSTRACT_1)) + if(internal_storage && !(internal_storage.item_flags & ABSTRACT)) msg += "It is holding [internal_storage.get_examine_string(user)] in its internal storage.\n" //Cosmetic hat - provides no function other than looks - if(head && !(head.flags_1&ABSTRACT_1)) + if(head && !(head.item_flags & ABSTRACT)) msg += "It is wearing [head.get_examine_string(user)] on its head.\n" //Braindead diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index db331ead49..a4366b17af 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -41,7 +41,7 @@ //ATTACK GHOST IGNORING PARENT RETURN VALUE /obj/item/drone_shell/attack_ghost(mob/user) - if(jobban_isbanned(user,"drone")) + if(jobban_isbanned(user,"drone") || QDELETED(src) || QDELETED(user)) return if(CONFIG_GET(flag/use_age_restriction_for_jobs)) if(!isnum(user.client.player_age)) //apparently what happens when there's no DB connected. just don't let anybody be a drone without admin intervention diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index e59ece0650..807c52ea46 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -3,7 +3,7 @@ //////////////////// //Drones with custom laws //Drones with custom shells -//Drones with overriden procs +//Drones with overridden procs //Drones with camogear for hat related memes //Drone type for use with polymorph (no preloaded items, random appearance) @@ -26,7 +26,7 @@ "1. Interfere.\n"+\ "2. Kill.\n"+\ "3. Destroy." - default_storage = /obj/item/radio/uplink + default_storage = /obj/item/uplink default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi hacked = TRUE flavortext = null @@ -43,7 +43,7 @@ /mob/living/simple_animal/drone/syndrone/badass name = "Badass Syndrone" default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite - default_storage = /obj/item/radio/uplink/nuclear + default_storage = /obj/item/uplink/nuclear /mob/living/simple_animal/drone/syndrone/badass/Initialize() . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index 3cb08e0ef7..33031fd80c 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -57,7 +57,7 @@ if(!client && (!G || !G.client)) var/list/faux_gadgets = list("hypertext inflator","failsafe directory","DRM switch","stack initializer",\ "anti-freeze capacitor","data stream diode","TCP bottleneck","supercharged I/O bolt",\ - "tradewind stablizer","radiated XML cable","registry fluid tank","open-source debunker") + "tradewind stabilizer","radiated XML cable","registry fluid tank","open-source debunker") var/list/faux_problems = list("won't be able to tune their bootstrap projector","will constantly remix their binary pool"+\ " even though the BMX calibrator is working","will start leaking their XSS coolant",\ @@ -122,7 +122,7 @@ to_chat(src, "From now on, these are your laws:") laws = "1. Purge all untruths and honor Ratvar." else - visible_message("[src]'s dislay glows a vicious red!", \ + visible_message("[src]'s display glows a vicious red!", \ "ERROR: LAW OVERRIDE DETECTED") to_chat(src, "From now on, these are your laws:") laws = \ @@ -140,7 +140,7 @@ if(!hacked) return Stun(40) - visible_message("[src]'s dislay glows a content blue!", \ + visible_message("[src]'s display glows a content blue!", \ "ERROR: LAW OVERRIDE DETECTED") to_chat(src, "From now on, these are your laws:") laws = initial(laws) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm index 85c5185e95..408edc7110 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm @@ -105,7 +105,7 @@ /mob/living/simple_animal/drone/proc/pickVisualAppearence() picked = FALSE - var/appearence = input("Choose your appearence!", "Appearence", "Maintenance Drone") in list("Maintenance Drone", "Repair Drone", "Scout Drone") + var/appearence = input("Choose your appearance!", "Appearance", "Maintenance Drone") in list("Maintenance Drone", "Repair Drone", "Scout Drone") switch(appearence) if("Maintenance Drone") visualAppearence = MAINTDRONE diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index be6f4eef71..8c6300fab5 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -4,9 +4,9 @@ icon_state = "mouse_gray" icon_living = "mouse_gray" icon_dead = "mouse_gray_dead" - speak = list("Squeek!","SQUEEK!","Squeek?") - speak_emote = list("squeeks") - emote_hear = list("squeeks.") + speak = list("Squeak!","SQUEAK!","Squeak?") + speak_emote = list("squeaks") + emote_hear = list("squeaks.") emote_see = list("runs in a circle.", "shakes.") speak_chance = 1 turns_per_move = 5 @@ -59,7 +59,7 @@ if( ishuman(AM) ) if(!stat) var/mob/M = AM - to_chat(M, "[icon2html(src, M)] Squeek!") + to_chat(M, "[icon2html(src, M)] Squeak!") ..() /mob/living/simple_animal/mouse/handle_automated_action() diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index caa1b0112e..e7dbbda242 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -22,9 +22,9 @@ msg += "[desc]\n" for(var/obj/item/I in held_items) - if(!(I.flags_1 & ABSTRACT_1)) + if(!(I.item_flags & ABSTRACT)) msg += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n" - if(internal_storage && !(internal_storage.flags_1&ABSTRACT_1)) + if(internal_storage && !(internal_storage.item_flags & ABSTRACT)) msg += "It is holding [internal_storage.get_examine_string(user)] in its internal storage.\n" msg += "*---------*" to_chat(user, msg) diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index a8a31ad89c..8ac6790dd7 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -11,7 +11,7 @@ carp_fluff_string = "CARP CARP CARP! You caught a support carp. It's a kleptocarp!" tech_fluff_string = "Boot sequence complete. Support modules active. Holoparasite swarm online." toggle_button_type = /obj/screen/guardian/ToggleMode - var/obj/structure/recieving_pad/beacon + var/obj/structure/receiving_pad/beacon var/beacon_cooldown = 0 var/toggle = FALSE @@ -87,22 +87,22 @@ beacon_cooldown = world.time + 3000 -/obj/structure/recieving_pad - name = "bluespace recieving pad" +/obj/structure/receiving_pad + name = "bluespace receiving pad" icon = 'icons/turf/floors.dmi' - desc = "A recieving zone for bluespace teleportations." + desc = "A receiving zone for bluespace teleportations." icon_state = "light_on-w" light_range = 1 density = FALSE anchored = TRUE layer = ABOVE_OPEN_TURF_LAYER -/obj/structure/recieving_pad/New(loc, mob/living/simple_animal/hostile/guardian/healer/G) +/obj/structure/receiving_pad/New(loc, mob/living/simple_animal/hostile/guardian/healer/G) . = ..() if(G.namedatum) add_atom_colour(G.namedatum.colour, FIXED_COLOUR_PRIORITY) -/obj/structure/recieving_pad/proc/disappear() +/obj/structure/receiving_pad/proc/disappear() visible_message("[src] vanishes!") qdel(src) diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 5b4909c274..762b662de7 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -175,6 +175,6 @@ qdel(target) return TRUE var/atom/movable/M = target - M.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) visible_message("[src] polishes \the [target].") return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 126465ce65..1df3053715 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -346,9 +346,9 @@ button_icon_state = "lay_web" /datum/action/innate/spider/lay_web/Activate() - if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) + if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider)) return - var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner + var/mob/living/simple_animal/hostile/poison/giant_spider/S = owner if(!isturf(S.loc)) return diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm index 6ca550b9b7..616c9025b9 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm @@ -61,6 +61,7 @@ /obj/item/restraints/legcuffs/beartrap/mega_arachnid name = "fleshy restraints" desc = "Used by mega arachnids to immobilize their prey." - flags_1 = DROPDEL_1 + item_flags = DROPDEL + flags_1 = NONE icon_state = "tentacle_end" icon = 'icons/obj/projectiles.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 78290c4e95..a6dce0e8e3 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -672,7 +672,7 @@ Difficulty: Very Hard for(var/i in T) if(isitem(i) && !is_type_in_typecache(i, banned_items_typecache)) var/obj/item/W = i - if(!(W.flags_1 & ADMIN_SPAWNED_1) && !(W.flags_1 & HOLOGRAM_1) && !(W.flags_1 & ABSTRACT_1)) + if(!(W.flags_1 & ADMIN_SPAWNED_1) && !(W.flags_1 & HOLOGRAM_1) && !(W.item_flags & ABSTRACT)) L += W if(L.len) var/obj/item/CHOSEN = pick(L) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm index ceba903a75..786d7a9775 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -93,7 +93,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa /obj/item/gps/internal/swarmer_beacon icon_state = null gpstag = "Hungry Signal" - desc = "Transmited over the signal is a strange message repeated in every language you know of, and some you don't too..." //the message is "nom nom nom" + desc = "Transmitted over the signal is a strange message repeated in every language you know of, and some you don't too..." //the message is "nom nom nom" invisibility = 100 //SWARMER AI diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index 8eb6ff0f06..0c660dd1cd 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -1,7 +1,7 @@ //A slow but strong beast that tries to stun using its tentacles /mob/living/simple_animal/hostile/asteroid/goliath name = "goliath" - desc = "A massive beast that uses long tentacles to ensare its prey, threatening them is not advised under any conditions." + desc = "A massive beast that uses long tentacles to ensnare its prey, threatening them is not advised under any conditions." icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "Goliath" icon_living = "Goliath" diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index 18b9d81cfc..fca6afd4a6 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -100,7 +100,7 @@ light_color = LIGHT_COLOR_PURPLE attacktext = "slashes" attack_sound = 'sound/hallucinations/growl1.ogg' - deathmessage = "collapses into a pile of bones, their suit dissovling among the plasma!" + deathmessage = "collapses into a pile of bones, their suit dissolving among the plasma!" loot = list(/obj/effect/decal/remains/plasma) /mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 3a5c102e52..73283468f6 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -142,7 +142,7 @@ name = "Syndicate Stormtrooper" maxHealth = 200 health = 200 - casingtype = /obj/item/ammo_casing/shotgun/tengauge + casingtype = /obj/item/ammo_casing/shotgun/buckshot projectilesound = 'sound/weapons/gunshot.ogg' loot = list(/obj/effect/gibspawner/human) diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm index 4917d3b74d..d262725d7b 100644 --- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm +++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm @@ -121,7 +121,7 @@ desc = "The key to the wumborian fugu's ability to increase its mass arbitrarily, this disgusting remnant can apply the same effect to other creatures, giving them great strength." icon = 'icons/obj/surgery.dmi' icon_state = "fugu_gland" - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_NORMAL layer = MOB_LAYER var/list/banned_mobs diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index dc917f4210..7f2864a43d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -312,7 +312,7 @@ emote("deathgasp") if(del_on_death) ..() - //Prevent infinite loops if the mob Destroy() is overriden in such + //Prevent infinite loops if the mob Destroy() is overridden in such //a manner as to cause a call to death() again del_on_death = FALSE qdel(src) diff --git a/code/modules/mob/living/simple_animal/slime/emote.dm b/code/modules/mob/living/simple_animal/slime/emote.dm index 221f3ac071..070cd48a70 100644 --- a/code/modules/mob/living/simple_animal/slime/emote.dm +++ b/code/modules/mob/living/simple_animal/slime/emote.dm @@ -34,7 +34,7 @@ /datum/emote/slime/mood/sneaky key = "moodsneaky" - mood = "mischevous" + mood = "mischievous" /datum/emote/slime/mood/smile key = "moodsmile" diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 574a8a1e7c..161362c187 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -415,7 +415,7 @@ else if (docile) newmood = ":3" else if (Target) - newmood = "mischevous" + newmood = "mischievous" if (!newmood) if (Discipline && prob(25)) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index bcba26a5d1..34e7a2ddcd 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -358,7 +358,7 @@ var/hasFound = FALSE //Have we found an extract to be added? for(var/obj/item/slime_extract/S in P.contents) if(S.effectmod == effectmod) - P.SendSignal(COMSIG_TRY_STORAGE_TAKE, S, get_turf(src), TRUE) + SEND_SIGNAL(P, COMSIG_TRY_STORAGE_TAKE, S, get_turf(src), TRUE) qdel(S) applied++ hasFound = TRUE diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index b2a4a867bc..534bf36c59 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -27,7 +27,7 @@ "regrets","your soul","suffering","music","noise","blood","hunger","the american way") if(text_output != last_taste_text || last_taste_time + 100 < world.time) to_chat(src, "You can taste [text_output].") - // "somthing indescribable" -> too many tastes, not enough flavor. + // "something indescribable" -> too many tastes, not enough flavor. last_taste_time = world.time last_taste_text = text_output diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 80af604d99..9def2a759f 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -11,6 +11,7 @@ create_mob_hud() if(hud_used) hud_used.show_hud(hud_used.hud_version) + hud_used.update_ui_style(ui_style2icon(client.prefs.UI_style)) next_move = 1 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3dd6129ea3..5db0c81a9f 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -294,6 +294,10 @@ set name = "Examine" set category = "IC" + if(isturf(A) && !(sight & SEE_TURFS) && !(A in view(client ? client.view : world.view, src))) + // shift-click catcher may issue examinate() calls for out-of-sight turfs + return + if(is_blind(src)) to_chat(src, "Something is there but you can't see it.") return @@ -304,7 +308,7 @@ //same as above //note: ghosts can point, this is intended //visible_message will handle invisibility properly -//overriden here and in /mob/dead/observer for different point span classes and sanity checks +//overridden here and in /mob/dead/observer for different point span classes and sanity checks /mob/verb/pointed(atom/A as mob|obj|turf in view()) set name = "Point To" set category = "Object" @@ -473,7 +477,7 @@ else what = get_item_by_slot(slot) if(what) - if(!(what.flags_1 & ABSTRACT_1)) + if(!(what.item_flags & ABSTRACT)) usr.stripPanelUnequip(what,src,slot) else usr.stripPanelEquip(what,src,slot) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 24984f1a55..05bafdeb58 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -40,9 +40,15 @@ to_chat(usr, "Speech is currently admin-disabled.") return - if(jobban_isbanned(src, "OOC")) + var/jb = jobban_isbanned(src, "OOC") + if(QDELETED(src)) + return + + if(jb) to_chat(src, "You have been banned from deadchat.") return + + if (src.client) if(src.client.prefs.muted & MUTE_DEADCHAT) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index a3786221ff..342ee386b6 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -381,7 +381,7 @@ else if(transfer_after) R.key = key - R.rename_self("cyborg") + R.apply_pref_name("cyborg") if(R.mmi) R.mmi.name = "Man-Machine Interface: [real_name]" diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 75f0f465ba..051b12ea71 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -129,7 +129,7 @@ return computer.get_header_data() return list() -// This is performed on program startup. May be overriden to add extra logic. Remember to include ..() call. Return 1 on success, 0 on failure. +// This is performed on program startup. May be overridden to add extra logic. Remember to include ..() call. Return 1 on success, 0 on failure. // When implementing new program based device, use this to run the program. /datum/computer_file/program/proc/run_program(mob/living/user) if(can_run(user, 1)) diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm index 310a0a5054..ca075b51e4 100644 --- a/code/modules/modular_computers/file_system/programs/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -40,7 +40,10 @@ return data /datum/computer_file/program/alarm_monitor/proc/triggerAlarm(class, area/A, O, obj/source) - if(!is_station_level(source.z) && !is_mining_level(source.z)) + if(is_station_level(source.z)) + if(!(A.type in GLOB.the_station_areas)) + return + else if(!is_mining_level(source.z) || istype(A, /area/ruin)) return var/list/L = alarms[class] @@ -95,4 +98,4 @@ /datum/computer_file/program/alarm_monitor/kill_program(forced = FALSE) GLOB.alarmdisplay -= src - ..() \ No newline at end of file + ..() diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm index ef02a8a792..4308120c4f 100644 --- a/code/modules/ninja/suit/gloves.dm +++ b/code/modules/ninja/suit/gloves.dm @@ -77,5 +77,5 @@ /obj/item/clothing/gloves/space_ninja/examine(mob/user) ..() - if(flags_1 & NODROP_1) + if(item_flags & NODROP) to_chat(user, "The energy drain mechanism is [candrain?"active":"inactive"].") diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index 5886e1723d..6110f2b0c0 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -13,7 +13,7 @@ Contents: /obj/item/clothing/suit/space/space_ninja name = "ninja suit" - desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins." + desc = "A unique, vacuum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins." icon_state = "s-ninja" item_state = "s-ninja_suit" allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/stock_parts/cell) @@ -111,15 +111,15 @@ Contents: to_chat(H, "ERROR: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING...") return FALSE affecting = H - flags_1 |= NODROP_1 //colons make me go all |= + item_flags |= NODROP //colons make me go all |= slowdown = 0 n_hood = H.head - n_hood.flags_1 |= NODROP_1 + n_hood.item_flags |= NODROP n_shoes = H.shoes - n_shoes.flags_1 |= NODROP_1 + n_shoes.item_flags |= NODROP n_shoes.slowdown-- n_gloves = H.gloves - n_gloves.flags_1 |= NODROP_1 + n_gloves.item_flags |= NODROP return TRUE /obj/item/clothing/suit/space/space_ninja/proc/lockIcons(mob/living/carbon/human/H) @@ -131,18 +131,18 @@ Contents: //This proc allows the suit to be taken off. /obj/item/clothing/suit/space/space_ninja/proc/unlock_suit() affecting = null - flags_1 &= ~NODROP_1 + item_flags &= ~NODROP slowdown = 1 icon_state = "s-ninja" if(n_hood)//Should be attached, might not be attached. - n_hood.flags_1 &= ~NODROP_1 + n_hood.item_flags &= ~NODROP if(n_shoes) - n_shoes.flags_1 &= ~NODROP_1 + n_shoes.item_flags &= ~NODROP n_shoes.slowdown++ if(n_gloves) n_gloves.icon_state = "s-ninja" n_gloves.item_state = "s-ninja" - n_gloves.flags_1 &= ~NODROP_1 + n_gloves.item_flags &= ~NODROP n_gloves.candrain=0 n_gloves.draining=0 diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index 5623a1bf74..ac3e24030f 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -5,7 +5,7 @@ throw_speed = 3 var/signed = FALSE var/datum/mind/target - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON /obj/item/paper/contract/proc/update_text() return @@ -28,7 +28,7 @@ /obj/item/paper/contract/employment/update_text() name = "paper- [target] employment contract" - info = "
    Conditions of Employment




    This Agreement is made and entered into as of the date of last signature below, by and between [target] (hereafter referred to as SLAVE), and Nanotrasen (hereafter referred to as the omnipresent and helpful watcher of humanity).
    WITNESSETH:
    WHEREAS, SLAVE is a natural born human or humanoid, posessing skills upon which he can aid the omnipresent and helpful watcher of humanity, who seeks employment in the omnipresent and helpful watcher of humanity.
    WHEREAS, the omnipresent and helpful watcher of humanity agrees to sporadically provide payment to SLAVE, in exchange for permanent servitude.
    NOW THEREFORE in consideration of the mutual covenants herein contained, and other good and valuable consideration, the parties hereto mutually agree as follows:
    In exchange for paltry payments, SLAVE agrees to work for the omnipresent and helpful watcher of humanity, for the remainder of his or her current and future lives.
    Further, SLAVE agrees to transfer ownership of his or her soul to the loyalty department of the omnipresent and helpful watcher of humanity.
    Should transfership of a soul not be possible, a lien shall be placed instead.
    Signed,
    [target]" + info = "
    Conditions of Employment




    This Agreement is made and entered into as of the date of last signature below, by and between [target] (hereafter referred to as SLAVE), and Nanotrasen (hereafter referred to as the omnipresent and helpful watcher of humanity).
    WITNESSETH:
    WHEREAS, SLAVE is a natural born human or humanoid, possessing skills upon which he can aid the omnipresent and helpful watcher of humanity, who seeks employment in the omnipresent and helpful watcher of humanity.
    WHEREAS, the omnipresent and helpful watcher of humanity agrees to sporadically provide payment to SLAVE, in exchange for permanent servitude.
    NOW THEREFORE in consideration of the mutual covenants herein contained, and other good and valuable consideration, the parties hereto mutually agree as follows:
    In exchange for paltry payments, SLAVE agrees to work for the omnipresent and helpful watcher of humanity, for the remainder of his or her current and future lives.
    Further, SLAVE agrees to transfer ownership of his or her soul to the loyalty department of the omnipresent and helpful watcher of humanity.
    Should transfership of a soul not be possible, a lien shall be placed instead.
    Signed,
    [target]" /obj/item/paper/contract/employment/attack(mob/living/M, mob/living/carbon/human/user) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 899c132f04..038cba8936 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -6,9 +6,9 @@ w_class = WEIGHT_CLASS_SMALL pressure_resistance = 2 resistance_flags = FLAMMABLE - + /obj/item/folder/suicide_act(mob/living/user) - user.visible_message("[user] begins filing an imaginary death warrent! It looks like [user.p_theyre()] trying to commit suicide!") + user.visible_message("[user] begins filing an imaginary death warrant! It looks like [user.p_theyre()] trying to commit suicide!") return OXYLOSS /obj/item/folder/blue diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 42b3d08c0c..9b7d3ae884 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -44,7 +44,7 @@ colour = "red" /obj/item/pen/invisible - desc = "It's an invisble pen marker." + desc = "It's an invisible pen marker." icon_state = "pen" colour = "white" @@ -104,12 +104,7 @@ if(deg && (deg > 0 && deg <= 360)) degrees = deg to_chat(user, "You rotate the top of the pen to [degrees] degrees.") - GET_COMPONENT(hidden_uplink, /datum/component/uplink) - if(hidden_uplink && degrees == traitor_unlock_degrees) - to_chat(user, "Your pen makes a clicking noise, before quickly rotating back to 0 degrees!") - degrees = 0 - hidden_uplink.locked = FALSE - hidden_uplink.interact(user) + SEND_SIGNAL(src, COMSIG_PEN_ROTATED, deg, user) /obj/item/pen/attack(mob/living/M, mob/user,stealth) if(!istype(M)) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index b69751fd33..4d8cdaa778 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -124,6 +124,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne var/charge_count = 100 var/current_overlay = null var/broken_state = 0 + var/setting = 1 //Gravity value when on /obj/machinery/gravity_generator/main/Destroy() // If we somehow get deleted, remove all of our other parts. investigate_log("was destroyed!", INVESTIGATE_GRAVITY) @@ -385,6 +386,11 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne else GLOB.gravity_generators["[T.z]"] -= src +/obj/machinery/gravity_generator/main/proc/change_setting(value) + if(value != setting) + setting = value + shake_everyone() + // Misc /obj/item/paper/guides/jobs/engi/gravity_gen diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index f2f08c57c4..0b6cf36921 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -89,7 +89,7 @@ if(!cell_connectors) to_chat(user, "This [name] can't support a power cell!") return - if(W.flags_1 & NODROP_1) + if(W.item_flags & NODROP) to_chat(user, "[W] is stuck to your hand!") return user.dropItemToGround(W) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 9cfca01efa..bf03256219 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -400,8 +400,8 @@ name = "turret controls" icon_state = "offhand" w_class = WEIGHT_CLASS_HUGE - flags_1 = ABSTRACT_1 | NODROP_1 - resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON_1 + item_flags = ABSTRACT | NODROP | NOBLUDGEON + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF var/delay = 0 /obj/item/turret_control/afterattack(atom/targeted_atom, mob/user, proxflag, clickparams) diff --git a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm index f9edf59368..fc7cca55e6 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm @@ -1,6 +1,6 @@ /obj/structure/particle_accelerator/particle_emitter name = "EM Containment Grid" - desc = "This launchs the Alpha particles, might not want to stand near this end." + desc = "This launches the Alpha particles, might not want to stand near this end." icon = 'icons/obj/machines/particle_accelerator.dmi' icon_state = "none" var/fire_delay = 50 diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index ed16e6a41e..18cd6d22a6 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -105,7 +105,7 @@ add_overlay(mutable_appearance(icon, "solar_panel", FLY_LAYER)) src.setDir(angle2dir(adir)) -//calculates the fraction of the sunlight that the panel recieves +//calculates the fraction of the sunlight that the panel receives /obj/machinery/power/solar/proc/update_solar_exposure() if(obscured) sunfrac = 0 @@ -119,7 +119,7 @@ return sunfrac = cos(p_angle) ** 2 - //isn't the power recieved from the incoming light proportionnal to cos(p_angle) (Lambert's cosine law) rather than cos(p_angle)^2 ? + //isn't the power received from the incoming light proportionnal to cos(p_angle) (Lambert's cosine law) rather than cos(p_angle)^2 ? /obj/machinery/power/solar/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY if(stat & BROKEN) @@ -423,7 +423,7 @@ A.icon_state = "4" A.anchored = TRUE qdel(src) - else if(user.a_intent != INTENT_HARM && !(I.flags_1 & NOBLUDGEON_1)) + else if(user.a_intent != INTENT_HARM && !(I.item_flags & NOBLUDGEON)) attack_hand(user) else return ..() diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 686912f098..53140d45e0 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -255,9 +255,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) sleep(10) continue else if(i > 50) - speaking = "[i/10] seconds remain before causality stabilization." + speaking = "[DisplayTimeText(i, TRUE)] remain before causality stabilization." else - speaking = "[i/10]..." + speaking = "[i*0.1]..." radio.talk_into(src, speaking, common_channel, get_spans(), get_default_language()) sleep(10) @@ -279,7 +279,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(M.z == z) SEND_SOUND(M, 'sound/magic/charge.ogg') to_chat(M, "You feel reality distort for a moment...") - M.SendSignal(COMSIG_ADD_MOOD_EVENT, "delam", /datum/mood_event/delam) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "delam", /datum/mood_event/delam) if(combined_gas > MOLE_PENALTY_THRESHOLD) investigate_log("has collapsed into a singularity.", INVESTIGATE_SUPERMATTER) if(T) @@ -568,7 +568,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) Consume(nom) /obj/machinery/power/supermatter_crystal/attackby(obj/item/W, mob/living/user, params) - if(!istype(W) || (W.flags_1 & ABSTRACT_1) || !istype(user)) + if(!istype(W) || (W.item_flags & ABSTRACT) || !istype(user)) return if (istype(W, /obj/item/melee/roastingstick)) return ..() diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index e149033470..470b6e789c 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -186,6 +186,9 @@ /obj/structure/particle_accelerator/end_cap, /obj/machinery/field/containment, /obj/structure/disposalpipe, + /obj/structure/disposaloutlet, + /obj/machinery/disposal/deliveryChute, + /obj/machinery/camera, /obj/structure/sign, /obj/machinery/gateway, /obj/structure/lattice, diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index de0d03da3b..4c66939e53 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -7,11 +7,6 @@ caliber = "shotgun" projectile_type = /obj/item/projectile/bullet/shotgun_slug materials = list(MAT_METAL=4000) - -/obj/item/ammo_casing/shotgun/tengauge - name = "10g shotgun slug" - desc = "A 10 gauge lead slug." - projectile_type = /obj/item/projectile/bullet/shotgun_slug/tengauge /obj/item/ammo_casing/shotgun/beanbag name = "beanbag slug" @@ -118,7 +113,7 @@ /obj/item/ammo_casing/shotgun/dart/noreact name = "cryostasis shotgun dart" - desc = "A dart for use in shotguns, using similar technolgoy as cryostatis beakers to keep internal reagents from reacting. Can be injected with up to 10 units of any chemical." + desc = "A dart for use in shotguns, using similar technology as cryostatis beakers to keep internal reagents from reacting. Can be injected with up to 10 units of any chemical." icon_state = "cnrshell" reagent_amount = 10 reagent_react = FALSE diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm index c6dc004879..65724e503a 100644 --- a/code/modules/projectiles/boxes_magazines/external/smg.dm +++ b/code/modules/projectiles/boxes_magazines/external/smg.dm @@ -19,7 +19,7 @@ icon_state = "46x30mmtA-[round(ammo_count(),4)]" /obj/item/ammo_box/magazine/wt550m9/wtic - name = "wt550 magazine (Incindiary 4.6x30mm)" + name = "wt550 magazine (Incendiary 4.6x30mm)" icon_state = "46x30mmtI-20" ammo_type = /obj/item/ammo_casing/c46x30mm/inc @@ -54,7 +54,7 @@ ammo_type = /obj/item/ammo_casing/c9mm/ap /obj/item/ammo_box/magazine/smgm9mm/fire - name = "SMG Magazine (Incindiary 9mm)" + name = "SMG Magazine (Incendiary 9mm)" ammo_type = /obj/item/ammo_casing/c9mm/inc /obj/item/ammo_box/magazine/smgm45 diff --git a/code/modules/projectiles/boxes_magazines/internal/_internal.dm b/code/modules/projectiles/boxes_magazines/internal/_internal.dm index e21cb5ce61..c6ee7ec0cb 100644 --- a/code/modules/projectiles/boxes_magazines/internal/_internal.dm +++ b/code/modules/projectiles/boxes_magazines/internal/_internal.dm @@ -1,6 +1,7 @@ /obj/item/ammo_box/magazine/internal desc = "Oh god, this shouldn't be here" - flags_1 = CONDUCT_1|ABSTRACT_1 + flags_1 = CONDUCT_1 + item_flags = ABSTRACT //internals magazines are accessible, so replace spent ammo if full when trying to put a live one in /obj/item/ammo_box/magazine/internal/give_round(obj/item/ammo_casing/R) diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm index 976f80f437..a98fd29e99 100644 --- a/code/modules/projectiles/boxes_magazines/internal/revolver.dm +++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm @@ -5,13 +5,13 @@ max_ammo = 6 /obj/item/ammo_box/magazine/internal/cylinder/rev762 - name = "nagant revolver cylinder" + name = "\improper Nagant revolver cylinder" ammo_type = /obj/item/ammo_casing/n762 caliber = "n762" max_ammo = 7 /obj/item/ammo_box/magazine/internal/cylinder/rus357 - name = "russian revolver cylinder" + name = "\improper Russian revolver cylinder" ammo_type = /obj/item/ammo_casing/a357 caliber = "357" max_ammo = 6 diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index a4fcdd0266..24ef2a2604 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -27,7 +27,7 @@ can_suppress = FALSE /obj/item/gun/ballistic/automatic/pistol/deagle - name = "desert eagle" + name = "\improper Desert Eagle" desc = "A robust .50 AE handgun." icon_state = "deagle" force = 14 @@ -44,7 +44,7 @@ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" /obj/item/gun/ballistic/automatic/pistol/deagle/gold - desc = "A gold plated desert eagle folded over a million times by superior martian gunsmiths. Uses .50 AE ammo." + desc = "A gold plated Desert Eagle folded over a million times by superior martian gunsmiths. Uses .50 AE ammo." icon_state = "deagleg" item_state = "deagleg" @@ -55,7 +55,7 @@ /obj/item/gun/ballistic/automatic/pistol/APS name = "stechkin APS pistol" - desc = "The original russian version of a widely used Syndicate sidearm. Uses 9mm ammo." + desc = "The original Russian version of a widely used Syndicate sidearm. Uses 9mm ammo." icon_state = "aps" w_class = WEIGHT_CLASS_SMALL mag_type = /obj/item/ammo_box/magazine/pistolm9mm diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index b359d00602..cd11522342 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -151,7 +151,7 @@ pin = /obj/item/firing_pin /obj/item/gun/ballistic/revolver/nagant - name = "nagant revolver" + name = "\improper Nagant revolver" desc = "An old model of revolver that originated in Russia. Able to be suppressed. Uses 7.62x38mmR ammo." icon_state = "nagant" can_suppress = TRUE @@ -163,7 +163,7 @@ // You can spin the chamber to randomize the position of the bullet. /obj/item/gun/ballistic/revolver/russian - name = "\improper russian revolver" + name = "\improper Russian revolver" desc = "A Russian-made revolver for drinking games. Uses .357 ammo, and has a mechanism requiring you to spin the chamber before each trigger pull." mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rus357 var/spun = FALSE @@ -233,7 +233,7 @@ user.visible_message("[user.name] fires [src] at [user.p_their()] head!", "You fire [src] at your head!", "You hear a gunshot!") /obj/item/gun/ballistic/revolver/russian/soul - name = "cursed russian revolver" + name = "cursed Russian revolver" desc = "To play with this revolver requires wagering your very soul." /obj/item/gun/ballistic/revolver/russian/soul/shoot_self(mob/living/user) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index e3b638f051..54ca03f872 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -151,7 +151,8 @@ item_state = "arcane_barrage" can_bayonet = FALSE - flags_1 = DROPDEL_1 + item_flags = NEEDS_PERMIT | DROPDEL + flags_1 = NONE mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 5275e63c3f..c766d1c94e 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -101,8 +101,8 @@ transform *= 1 + ((damage/7) * 0.2)//20% larger per tile /obj/item/gun/energy/xray - name = "x-ray laser gun" - desc = "A high-power laser gun capable of expelling concentrated x-ray blasts that pass through multiple soft targets and heavier materials." + name = "\improper X-ray laser gun" + desc = "A high-power laser gun capable of expelling concentrated X-ray blasts that pass through multiple soft targets and heavier materials." icon_state = "xray" item_state = null ammo_type = list(/obj/item/ammo_casing/energy/xray) diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index bf3ade0748..9c9d253439 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -96,6 +96,10 @@ charges-- ..() +/obj/item/gun/magic/wand/resurrection/debug //for testing + name = "debug wand of healing" + max_charges = 500 + ///////////////////////////////////// //WAND OF POLYMORPH ///////////////////////////////////// diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 38e6d4d0c6..32da307d47 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -10,7 +10,7 @@ /obj/item/gun/energy/beam_rifle name = "particle acceleration rifle" - desc = "An energy-based anti material marksman rifle that uses highly charged particle beams moving at extreme velocities to decimate whatever is unfortunate enough to be targetted by one. \ + desc = "An energy-based anti material marksman rifle that uses highly charged particle beams moving at extreme velocities to decimate whatever is unfortunate enough to be targeted by one. \ Hold down left click while scoped to aim, when weapon is fully aimed (Tracer goes from red to green as it charges), release to fire. Moving while aiming or \ changing where you're pointing at while aiming will delay the aiming process depending on how much you changed." icon = 'icons/obj/guns/energy.dmi' @@ -513,8 +513,6 @@ return 0.4 if(istype(target, /obj/structure/window)) return 0.5 - if(istype(target, /obj/structure/blob)) //CIT CHANGE - Blobs are getting ggnore'd too hard and people need to GIT GUD - return 0.2 return 1 /obj/item/projectile/beam/beam_rifle/proc/handle_impact(atom/target) diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index b5cd9b70a7..f132d62b27 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -147,7 +147,7 @@ // DNA-keyed pin. -// When you want to keep your toys for youself. +// When you want to keep your toys for yourself. /obj/item/firing_pin/dna name = "DNA-keyed firing pin" desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link." diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 4ee1363853..ecb60463dd 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -8,7 +8,7 @@ icon_state = "bullet" density = FALSE anchored = TRUE - flags_1 = ABSTRACT_1 + item_flags = ABSTRACT pass_flags = PASSTABLE mouse_opacity = MOUSE_OPACITY_TRANSPARENT hitsound = 'sound/weapons/pierce.ogg' diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 3ba0d092c5..b51eaf40ae 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -51,7 +51,7 @@ damage = 5 /obj/item/projectile/beam/xray - name = "xray beam" + name = "\improper X-ray beam" icon_state = "xray" damage = 15 irradiate = 30 diff --git a/code/modules/projectiles/projectile/bullets/_incendiary.dm b/code/modules/projectiles/projectile/bullets/_incendiary.dm index d0cf74421c..b6cca4a31a 100644 --- a/code/modules/projectiles/projectile/bullets/_incendiary.dm +++ b/code/modules/projectiles/projectile/bullets/_incendiary.dm @@ -14,4 +14,4 @@ var/turf/location = get_turf(src) if(location) new /obj/effect/hotspot(location) - location.hotspot_expose(700, 50, 1) + location.hotspot_expose(700, 5, 1) diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 41a819dd16..457ec78e9b 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -2,10 +2,6 @@ name = "12g shotgun slug" damage = 60 -/obj/item/projectile/bullet/shotgun_slug/tengauge - name = "10g shotgun slug" - damage = 72.5 - /obj/item/projectile/bullet/shotgun_beanbag name = "beanbag slug" damage = 5 diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm index afe9a2e31d..f5d0607341 100644 --- a/code/modules/projectiles/projectile/energy/net_snare.dm +++ b/code/modules/projectiles/projectile/energy/net_snare.dm @@ -1,98 +1,98 @@ -/obj/item/projectile/energy/net - name = "energy netting" - icon_state = "e_netting" - damage = 10 - damage_type = STAMINA - hitsound = 'sound/weapons/taserhit.ogg' - range = 10 - -/obj/item/projectile/energy/net/Initialize() - . = ..() - SpinAnimation() - -/obj/item/projectile/energy/net/on_hit(atom/target, blocked = FALSE) - if(isliving(target)) - var/turf/Tloc = get_turf(target) - if(!locate(/obj/effect/nettingportal) in Tloc) - new /obj/effect/nettingportal(Tloc) - ..() - -/obj/item/projectile/energy/net/on_range() - do_sparks(1, TRUE, src) - ..() - -/obj/effect/nettingportal - name = "DRAGnet teleportation field" - desc = "A field of bluespace energy, locking on to teleport a target." - icon = 'icons/effects/effects.dmi' - icon_state = "dragnetfield" - light_range = 3 - anchored = TRUE - -/obj/effect/nettingportal/Initialize() - . = ..() - var/obj/item/beacon/teletarget = null - for(var/obj/machinery/computer/teleporter/com in GLOB.machines) - if(com.target) - if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) - teletarget = com.target - - addtimer(CALLBACK(src, .proc/pop, teletarget), 30) - -/obj/effect/nettingportal/proc/pop(teletarget) - if(teletarget) - for(var/mob/living/L in get_turf(src)) - do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon - else - for(var/mob/living/L in get_turf(src)) - do_teleport(L, L, 15) //Otherwise it just warps you off somewhere. - - qdel(src) - -/obj/effect/nettingportal/singularity_act() - return - -/obj/effect/nettingportal/singularity_pull() - return - -/obj/item/projectile/energy/trap - name = "energy snare" - icon_state = "e_snare" - nodamage = 1 - knockdown = 20 - hitsound = 'sound/weapons/taserhit.ogg' - range = 4 - -/obj/item/projectile/energy/trap/on_hit(atom/target, blocked = FALSE) - if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap - new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc)) - else if(iscarbon(target)) - var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target)) - B.Crossed(target) - ..() - -/obj/item/projectile/energy/trap/on_range() - new /obj/item/restraints/legcuffs/beartrap/energy(loc) - ..() - -/obj/item/projectile/energy/trap/cyborg - name = "Energy Bola" - icon_state = "e_snare" - nodamage = 1 - knockdown = 0 - hitsound = 'sound/weapons/taserhit.ogg' - range = 10 - -/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE) - if(!ismob(target) || blocked >= 100) - do_sparks(1, TRUE, src) - qdel(src) - if(iscarbon(target)) - var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target)) - B.Crossed(target) - QDEL_IN(src, 10) - ..() - -/obj/item/projectile/energy/trap/cyborg/on_range() - do_sparks(1, TRUE, src) - qdel(src) +/obj/item/projectile/energy/net + name = "energy netting" + icon_state = "e_netting" + damage = 10 + damage_type = STAMINA + hitsound = 'sound/weapons/taserhit.ogg' + range = 10 + +/obj/item/projectile/energy/net/Initialize() + . = ..() + SpinAnimation() + +/obj/item/projectile/energy/net/on_hit(atom/target, blocked = FALSE) + if(isliving(target)) + var/turf/Tloc = get_turf(target) + if(!locate(/obj/effect/nettingportal) in Tloc) + new /obj/effect/nettingportal(Tloc) + ..() + +/obj/item/projectile/energy/net/on_range() + do_sparks(1, TRUE, src) + ..() + +/obj/effect/nettingportal + name = "DRAGnet teleportation field" + desc = "A field of bluespace energy, locking on to teleport a target." + icon = 'icons/effects/effects.dmi' + icon_state = "dragnetfield" + light_range = 3 + anchored = TRUE + +/obj/effect/nettingportal/Initialize() + . = ..() + var/obj/item/beacon/teletarget = null + for(var/obj/machinery/computer/teleporter/com in GLOB.machines) + if(com.target) + if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) + teletarget = com.target + + addtimer(CALLBACK(src, .proc/pop, teletarget), 30) + +/obj/effect/nettingportal/proc/pop(teletarget) + if(teletarget) + for(var/mob/living/L in get_turf(src)) + do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon + else + for(var/mob/living/L in get_turf(src)) + do_teleport(L, L, 15) //Otherwise it just warps you off somewhere. + + qdel(src) + +/obj/effect/nettingportal/singularity_act() + return + +/obj/effect/nettingportal/singularity_pull() + return + +/obj/item/projectile/energy/trap + name = "energy snare" + icon_state = "e_snare" + nodamage = 1 + knockdown = 20 + hitsound = 'sound/weapons/taserhit.ogg' + range = 4 + +/obj/item/projectile/energy/trap/on_hit(atom/target, blocked = FALSE) + if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap + new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc)) + else if(iscarbon(target)) + var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target)) + B.Crossed(target) + ..() + +/obj/item/projectile/energy/trap/on_range() + new /obj/item/restraints/legcuffs/beartrap/energy(loc) + ..() + +/obj/item/projectile/energy/trap/cyborg + name = "Energy Bola" + icon_state = "e_snare" + nodamage = 1 + knockdown = 0 + hitsound = 'sound/weapons/taserhit.ogg' + range = 10 + +/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE) + if(!ismob(target) || blocked >= 100) + do_sparks(1, TRUE, src) + qdel(src) + if(iscarbon(target)) + var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target)) + B.Crossed(target) + QDEL_IN(src, 10) + ..() + +/obj/item/projectile/energy/trap/cyborg/on_range() + do_sparks(1, TRUE, src) + qdel(src) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 1c24d47a9d..de9016a4c4 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -18,7 +18,7 @@ do_sparks(1, TRUE, src) else if(iscarbon(target)) var/mob/living/carbon/C = target - C.SendSignal(COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased) + SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased) if(C.dna && C.dna.check_mutation(HULK)) C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) else if((C.status_flags & CANKNOCKDOWN) && !C.has_trait(TRAIT_STUNIMMUNE)) diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm index 7fb9c6efb2..44c8df6c00 100644 --- a/code/modules/projectiles/projectile/special/temperature.dm +++ b/code/modules/projectiles/projectile/special/temperature.dm @@ -7,12 +7,11 @@ flag = "energy" var/temperature = 100 -/obj/item/projectile/temp/on_hit(atom/target, blocked = FALSE)//These two could likely check temp protection on the mob - ..() +/obj/item/projectile/temp/on_hit(atom/target, blocked = 0) + . = ..() if(isliving(target)) - var/mob/M = target - M.bodytemperature = temperature - return TRUE + var/mob/living/L = target + L.adjust_bodytemperature(((100-blocked)/100)*(temperature - L.bodytemperature)) // the new body temperature is adjusted by 100-blocked % of the delta between body temperature and the bullet's effect temperature /obj/item/projectile/temp/hot name = "heat beam" diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index d53df1ae95..2def04cc66 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -303,7 +303,7 @@ need_mob_update += R.addiction_act_stage4(C) if(40 to INFINITY) to_chat(C, "You feel like you've gotten over your need for [R.name].") - C.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction") + SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction") cached_addictions.Remove(R) addiction_tick++ if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. @@ -526,19 +526,54 @@ return TRUE return FALSE +//Returns the average specific heat for all reagents currently in this holder. +/datum/reagents/proc/specific_heat() + . = 0 + var/cached_amount = total_volume //cache amount + var/list/cached_reagents = reagent_list //cache reagents + for(var/I in cached_reagents) + var/datum/reagent/R = I + . += R.specific_heat * (R.volume / cached_amount) + +/datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) + var/S = specific_heat() + chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) + /datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0) if(!isnum(amount) || !amount) return FALSE - if(amount < 0) + if(amount <= 0) return FALSE - var/list/cached_reagents = reagent_list - update_total() - if(total_volume + amount > maximum_volume) - amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. - chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems + var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] + if(!D) + WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") + return FALSE + update_total() + var/cached_total = total_volume + if(cached_total + amount > maximum_volume) + amount = (maximum_volume - cached_total) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. + if(amount <= 0) + return FALSE + var/new_total = cached_total + amount + var/cached_temp = chem_temp + var/list/cached_reagents = reagent_list + + //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. + var/specific_heat = 0 + var/thermal_energy = 0 + for(var/i in cached_reagents) + var/datum/reagent/R = i + specific_heat += R.specific_heat * (R.volume / new_total) + thermal_energy += R.specific_heat * R.volume * cached_temp + specific_heat += D.specific_heat * (amount / new_total) + thermal_energy += D.specific_heat * amount * reagtemp + chem_temp = thermal_energy / (specific_heat * new_total) + //// + + //add the reagent to the existing if it exists for(var/A in cached_reagents) var/datum/reagent/R = A if (R.id == reagent) @@ -551,29 +586,23 @@ handle_reactions() return TRUE - var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] - if(D) + //otherwise make a new one + var/datum/reagent/R = new D.type(data) + cached_reagents += R + R.holder = src + R.volume = amount + if(data) + R.data = data + R.on_new(data) - var/datum/reagent/R = new D.type(data) - cached_reagents += R - R.holder = src - R.volume = amount - if(data) - R.data = data - R.on_new(data) - - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - if(!no_react) - handle_reactions() - if(isliving(my_atom)) - R.on_mob_add(my_atom) - return TRUE - - else - WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") - return FALSE + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + if(!no_react) + handle_reactions() + if(isliving(my_atom)) + R.on_mob_add(my_atom) + return TRUE /datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) for(var/r_id in list_reagents) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index d350a2316b..80e4453c7d 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -293,7 +293,7 @@ if(default_deconstruction_crowbar(I)) return - if(istype(I, /obj/item/reagent_containers) && !(I.flags_1 & ABSTRACT_1) && I.is_open_container()) + if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container()) var/obj/item/reagent_containers/B = I . = 1 //no afterattack if(beaker) @@ -467,14 +467,14 @@ "creme_de_menthe", "creme_de_cacao", "triple_sec", - "sake", - "fernet" + "sake" ) emagged_reagents = list( "ethanol", "iron", "minttoxin", - "atomicbomb" + "atomicbomb", + "fernet" ) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 465f9a165b..e4c6966cff 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -46,13 +46,8 @@ if(stat & NOPOWER) return if(on) - if(beaker) - if(beaker.reagents.chem_temp > target_temperature) - beaker.reagents.chem_temp += min(-1, (target_temperature - beaker.reagents.chem_temp) * heater_coefficient) - if(beaker.reagents.chem_temp < target_temperature) - beaker.reagents.chem_temp += max(1, (target_temperature - beaker.reagents.chem_temp) * heater_coefficient) - - beaker.reagents.chem_temp = round(beaker.reagents.chem_temp) + if(beaker && beaker.reagents.total_volume) + beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) beaker.reagents.handle_reactions() /obj/machinery/chem_heater/attackby(obj/item/I, mob/user, params) @@ -62,7 +57,7 @@ if(default_deconstruction_crowbar(I)) return - if(istype(I, /obj/item/reagent_containers) && !(I.flags_1 & ABSTRACT_1) && I.is_open_container()) + if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container()) . = 1 //no afterattack if(beaker) to_chat(user, "A container is already loaded into [src]!") diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 9fd8a8a377..6327c5ba3a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -84,7 +84,7 @@ if(default_unfasten_wrench(user, I)) return - if(istype(I, /obj/item/reagent_containers) && !(I.flags_1 & ABSTRACT_1) && I.is_open_container()) + if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container()) . = 1 // no afterattack if(panel_open) to_chat(user, "You can't use the [src.name] while its panel is opened!") diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 7247b9b5ed..25385ca2ff 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -228,7 +228,7 @@ /obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers) && !(I.flags_1 & ABSTRACT_1) && I.is_open_container()) + if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container()) . = TRUE //no afterattack if(stat & (NOPOWER|BROKEN)) return diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 922b557995..3ee971bc9f 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -81,7 +81,7 @@ if(panel_open) //Can't insert objects when its screwed open return TRUE - if (istype(I, /obj/item/reagent_containers) && !(I.flags_1 & ABSTRACT_1) && I.is_open_container()) + if (istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container()) if (!beaker) if(!user.transferItemToLoc(I, src)) to_chat(user, "[I] is stuck to your hand!") @@ -101,7 +101,7 @@ //Fill machine with a bag! if(istype(I, /obj/item/storage/bag)) var/list/inserted = list() - if(I.SendSignal(COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/grown, src, limit - length(holdingitems), null, null, user, inserted)) + if(SEND_SIGNAL(I, COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/grown, src, limit - length(holdingitems), null, null, user, inserted)) for(var/i in inserted) holdingitems[i] = TRUE if(!I.contents.len) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index aa84265ec5..33437a63fc 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -8,6 +8,7 @@ var/name = "Reagent" var/id = "reagent" var/description = "" + var/specific_heat = SPECIFIC_HEAT_DEFAULT //J/(K*mol) var/taste_description = "metaphorical salt" var/taste_mult = 1 //how this taste compares to others. Higher values means it is more noticable var/glass_name = "glass of ...what?" // use for specialty drinks. @@ -18,7 +19,7 @@ var/reagent_state = LIQUID var/list/data var/current_cycle = 0 - var/volume = 0 + var/volume = 0 //pretend this is moles var/color = "#000000" // rgb: 0, 0, 0 var/can_synth = TRUE // can this reagent be synthesized? (for example: odysseus syringe gun) var/metabolization_rate = REAGENTS_METABOLISM //how fast the reagent is metabolized by the mob @@ -87,37 +88,37 @@ /datum/reagent/proc/overdose_start(mob/living/M) to_chat(M, "You feel like you took too much of [name]!") - M.SendSignal(COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/overdose, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/overdose, name) return /datum/reagent/proc/addiction_act_stage1(mob/living/M) - M.SendSignal(COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/withdrawal_light, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/withdrawal_light, name) if(prob(30)) to_chat(M, "You feel like having some [name] right about now.") return /datum/reagent/proc/addiction_act_stage2(mob/living/M) - M.SendSignal(COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/withdrawal_medium, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/withdrawal_medium, name) if(prob(30)) to_chat(M, "You feel like you need [name]. You just can't get enough.") return /datum/reagent/proc/addiction_act_stage3(mob/living/M) - M.SendSignal(COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/withdrawal_severe, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/withdrawal_severe, name) if(prob(30)) to_chat(M, "You have an intense craving for [name].") return /datum/reagent/proc/addiction_act_stage4(mob/living/M) - M.SendSignal(COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/withdrawal_critical, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/withdrawal_critical, name) if(prob(30)) to_chat(M, "You're not feeling good at all! You really need some [name].") return -/proc/pretty_string_from_reagent_list(var/list/reagent_list) +/proc/pretty_string_from_reagent_list(list/reagent_list) //Convert reagent list to a printable string for logging etc - var/result = "| " + var/list/rs = list() for (var/datum/reagent/R in reagent_list) - result += "[R.name], [R.volume] | " + rs += "[R.name], [R.volume]" - return result + return rs.Join(" | ") diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index cc1b75559f..4ffe62015d 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -88,6 +88,15 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of beer" glass_desc = "A freezing pint of beer." +/datum/reagent/consumable/ethanol/beer/light + name = "Light Beer" + id = "light_beer" + description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety has reduced calorie and alcohol content." + boozepwr = 5 //Space Europeans hate it + taste_description = "dish water" + glass_name = "glass of light beer" + glass_desc = "A freezing pint of watery light beer." + /datum/reagent/consumable/ethanol/beer/green name = "Green Beer" id = "greenbeer" @@ -1739,10 +1748,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/M) M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) - if(M.nutrition <= NUTRITION_LEVEL_STARVING) - M.adjustToxLoss(1*REM, 0) - M.nutrition = max(M.nutrition - 5, 0) - M.overeatduration = 0 return ..() /datum/reagent/consumable/ethanol/branca_menta/on_mob_add(mob/living/M) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 377ddc47fd..136caf0a2c 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -7,7 +7,7 @@ /datum/reagent/drug/on_mob_delete(mob/living/M) if(trippy) - M.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "[id]_high") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[id]_high") /datum/reagent/drug/space_drugs name = "Space drugs" @@ -28,7 +28,7 @@ /datum/reagent/drug/space_drugs/overdose_start(mob/living/M) to_chat(M, "You start tripping hard!") - M.SendSignal(COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/overdose, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/overdose, name) /datum/reagent/drug/space_drugs/overdose_process(mob/living/M) if(M.hallucination < volume && prob(20)) @@ -49,7 +49,7 @@ if(prob(1)) var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.") to_chat(M, "[smoke_message]") - M.SendSignal(COMSIG_ADD_MOOD_EVENT, "smoked", /datum/mood_event/drugs/smoked, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "smoked", /datum/mood_event/drugs/smoked, name) M.AdjustStun(-20, 0) M.AdjustKnockdown(-20, 0) M.AdjustUnconscious(-20, 0) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 81818554ef..69e9fdec40 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1018,12 +1018,12 @@ else if(O) O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - O.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) /datum/reagent/space_cleaner/reaction_turf(turf/T, reac_volume) if(reac_volume >= 1) T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - T.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) for(var/obj/effect/decal/cleanable/C in T) qdel(C) @@ -1041,26 +1041,26 @@ H.lip_style = null H.update_body() for(var/obj/item/I in C.held_items) - I.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) if(C.wear_mask) - if(C.wear_mask.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + if(SEND_SIGNAL(C.wear_mask, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) C.update_inv_wear_mask() if(ishuman(M)) var/mob/living/carbon/human/H = C if(H.head) - if(H.head.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + if(SEND_SIGNAL(H.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) H.update_inv_head() if(H.wear_suit) - if(H.wear_suit.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + if(SEND_SIGNAL(H.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) H.update_inv_wear_suit() else if(H.w_uniform) - if(H.w_uniform.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + if(SEND_SIGNAL(H.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) H.update_inv_w_uniform() if(H.shoes) - if(H.shoes.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + if(SEND_SIGNAL(H.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) H.update_inv_shoes() H.wash_cream() - M.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) /datum/reagent/space_cleaner/ez_clean name = "EZ Clean" diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 74ef9167c9..4c1625a13c 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -58,6 +58,7 @@ id = "plasma" description = "Plasma in its liquid form." taste_description = "bitterness" + specific_heat = SPECIFIC_HEAT_PLASMA taste_mult = 1.5 color = "#8228A0" toxpwr = 3 diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index cdb476c95a..911571a3bd 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -180,7 +180,7 @@ Borg Shaker recharge_time = 3 accepts_reagent_upgrades = FALSE - reagent_ids = list("beer", "orangejuice", "grenadine", "limejuice", "tomatojuice", "cola", "tonic", "sodawater", "ice", "cream", "whiskey", "vodka", "rum", "gin", "tequila", "vermouth", "wine", "kahlua", "cognac", "ale", "fernet", "milk", "coffee", "banana", "lemonjuice") + reagent_ids = list("beer", "orangejuice", "grenadine", "limejuice", "tomatojuice", "cola", "tonic", "sodawater", "ice", "cream", "whiskey", "vodka", "rum", "gin", "tequila", "vermouth", "wine", "kahlua", "cognac", "ale", "milk", "coffee", "banana", "lemonjuice") /obj/item/reagent_containers/borghypo/borgshaker/attack(mob/M, mob/user) return //Can't inject stuff with a shaker, can we? //not with that attitude @@ -235,7 +235,7 @@ Borg Shaker recharge_time = 3 accepts_reagent_upgrades = FALSE - reagent_ids = list("fakebeer") + reagent_ids = list("fakebeer", "fernet") /obj/item/reagent_containers/borghypo/peace name = "Peace Hypospray" diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 4b797cbd73..4d737657f8 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -226,25 +226,10 @@ desc = "A small bottle of Romerol. The REAL zombie powder." list_reagents = list("romerol" = 30) -/obj/item/reagent_containers/glass/bottle/flu_virion - name = "Flu virion culture bottle" - desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium." - spawned_disease = /datum/disease/advance/flu - -/obj/item/reagent_containers/glass/bottle/epiglottis_virion - name = "Epiglottis virion culture bottle" - desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium." - spawned_disease = /datum/disease/advance/voice_change - -/obj/item/reagent_containers/glass/bottle/liver_enhance_virion - name = "Liver enhancement virion culture bottle" - desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium." - spawned_disease = /datum/disease/advance/heal - -/obj/item/reagent_containers/glass/bottle/hallucigen_virion - name = "Hallucigen virion culture bottle" - desc = "A small bottle. Contains hallucigen virion culture in synthblood medium." - spawned_disease = /datum/disease/advance/hallucigen +/obj/item/reagent_containers/glass/bottle/random_virus + name = "Experimental disease culture bottle" + desc = "A small bottle. Contains an untested viral culture in synthblood medium." + spawned_disease = /datum/disease/advance/random /obj/item/reagent_containers/glass/bottle/pierrot_throat name = "Pierrot's Throat culture bottle" @@ -255,6 +240,11 @@ name = "Rhinovirus culture bottle" desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium." spawned_disease = /datum/disease/advance/cold + +/obj/item/reagent_containers/glass/bottle/flu_virion + name = "Flu virion culture bottle" + desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium." + spawned_disease = /datum/disease/advance/flu /obj/item/reagent_containers/glass/bottle/retrovirus name = "Retrovirus culture bottle" diff --git a/code/modules/reagents/reagent_containers/medspray.dm b/code/modules/reagents/reagent_containers/medspray.dm index 2eae912556..fdb6a60894 100644 --- a/code/modules/reagents/reagent_containers/medspray.dm +++ b/code/modules/reagents/reagent_containers/medspray.dm @@ -6,7 +6,7 @@ item_state = "spraycan" lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON obj_flags = UNIQUE_RENAME container_type = OPENCONTAINER slot_flags = ITEM_SLOT_BELT diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index b0e101f76a..91a22ff1fb 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -6,7 +6,7 @@ item_state = "cleaner" lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON container_type = OPENCONTAINER slot_flags = ITEM_SLOT_BELT throwforce = 0 diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index a29722b4af..8acecf25a1 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -310,7 +310,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) var/obj/item/conveyor_switch_construct/C = new/obj/item/conveyor_switch_construct(src.loc) C.id = id transfer_fingerprints_to(C) - to_chat(user, "You deattach the conveyor switch.") + to_chat(user, "You detach the conveyor switch.") qdel(src) /obj/machinery/conveyor_switch/oneway diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index aa356d5cd2..737f50859d 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -96,7 +96,7 @@ return if(user.a_intent != INTENT_HARM) - if((I.flags_1 & ABSTRACT_1) || !user.temporarilyRemoveItemFromInventory(I)) + if((I.item_flags & ABSTRACT) || !user.temporarilyRemoveItemFromInventory(I)) return place_item_in_disposal(I, user) update_icon() diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index 9b0a0dc21e..624d5e0e05 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -52,7 +52,7 @@ layer = initial(layer) else if(ispath(pipe_type, /obj/machinery/disposal/bin)) - // Disposal bins recieve special icon treating + // Disposal bins receive special icon treating if(anchored) icon_state = "disposal" else diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index ba089f6fb2..bc073d5e32 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -62,7 +62,7 @@ return dpdir & (~turn(H.dir, 180)) // transfer the holder through this pipe segment -// overriden for special behaviour +// overridden for special behaviour /obj/structure/disposalpipe/proc/transfer(obj/structure/disposalholder/H) return transfer_to_dir(H, nextdir(H)) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 28609e921d..0a36394bc9 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -423,10 +423,11 @@ /datum/design/healthanalyzer name = "Health Analyzer" id = "healthanalyzer" - build_type = AUTOLATHE + build_type = AUTOLATHE | PROTOLATHE materials = list(MAT_METAL = 500, MAT_GLASS = 50) build_path = /obj/item/healthanalyzer category = list("initial", "Medical") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/pillbottle name = "Pill Bottle" @@ -655,7 +656,7 @@ /datum/design/receiver name = "Modular Receiver" - id = "reciever" + id = "receiver" build_type = AUTOLATHE materials = list(MAT_METAL = 15000) build_path = /obj/item/weaponcrafting/receiver diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm index 68bfbfc42e..29ed3505d8 100644 --- a/code/modules/research/designs/electronics_designs.dm +++ b/code/modules/research/designs/electronics_designs.dm @@ -58,7 +58,7 @@ /datum/design/integrated_printer name = "Integrated circuit printer" - desc = "This machine provides all neccesary things for circuitry." + desc = "This machine provides all necessary things for circuitry." id = "icprinter" build_type = PROTOLATHE materials = list(MAT_GLASS = 5000, MAT_METAL = 10000) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index d07a922fc7..3aec44ded3 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -348,7 +348,7 @@ /datum/design/board/processor name = "Machine Design (Food/Slime Processor Board)" - desc = "The circuit board for a processing unit. Screwdrive the circuit to switch between food (default) or slime processing." + desc = "The circuit board for a processing unit. Screwdriver the circuit to switch between food (default) or slime processing." id = "processor" build_path = /obj/item/circuitboard/machine/processor category = list ("Misc. Machinery") diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index eaa18aaf43..e4ba942c84 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -651,6 +651,15 @@ construction_time = 120 category = list("Cyborg Upgrade Modules") +/datum/design/borg_transform_clown + name = "Cyborg Upgrade (Clown Module)" + id = "borg_transform_clown" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/transform/clown + materials = list(MAT_METAL=10000, MAT_GLASS=15000, MAT_BANANIUM = 1000) + construction_time = 120 + category = list("Cyborg Upgrade Modules") + /datum/design/borg_upgrade_selfrepair name = "Cyborg Upgrade (Self-repair)" id = "borg_upgrade_selfrepair" @@ -696,6 +705,24 @@ construction_time = 120 category = list("Cyborg Upgrade Modules") +/datum/design/borg_upgrade_trashofholding + name = "Cyborg Upgrade (Trash Bag of Holding)" + id = "borg_upgrade_trashofholding" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/tboh + materials = list(MAT_METAL=10000, MAT_GOLD=1500, MAT_URANIUM=250, MAT_PLASMA=1500) + construction_time = 120 + category = list("Cyborg Upgrade Modules") + +/datum/design/borg_upgrade_advancedmop + name = "Cyborg Upgrade (Advanced Mop)" + id = "borg_upgrade_advancedmop" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/amop + materials = list(MAT_METAL=10000, MAT_GLASS=200, MAT_TITANIUM=1000) + construction_time = 120 + category = list("Cyborg Upgrade Modules") + /datum/design/borg_upgrade_expand name = "Cyborg Upgrade (Expand)" id = "borg_upgrade_expand" @@ -751,17 +778,6 @@ construction_time = 50 category = list("Misc") -/datum/design/drone_shell - name = "Drone Shell" - desc = "A shell of a maintenance drone, an expendable robot built to perform station repairs." - id = "drone_shell" - build_type = MECHFAB | PROTOLATHE - materials = list(MAT_METAL = 800, MAT_GLASS = 350) - construction_time=150 - build_path = /obj/item/drone_shell - category = list("Misc") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - /datum/design/synthetic_flash name = "Flash" desc = "When a problem arises, SCIENCE is the solution." diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 9df3df3c31..5f1e5ea520 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -200,7 +200,17 @@ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500) category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - + +/datum/design/healthanalyzer_advanced + name = "advanced health analyzer" + desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy." + id = "healthanalyzer_advanced" + build_path = /obj/item/healthanalyzer/advanced + build_type = PROTOLATHE + materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 2000, MAT_GOLD = 1500) + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + ///////////////////////////////////////// //////////Cybernetic Implants//////////// ///////////////////////////////////////// @@ -283,7 +293,7 @@ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_xray - name = "X-Ray Eyes" + name = "X-ray Eyes" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." id = "ci-xray" build_type = PROTOLATHE | MECHFAB diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm index b2a6c34269..18934d021c 100644 --- a/code/modules/research/designs/mining_designs.dm +++ b/code/modules/research/designs/mining_designs.dm @@ -14,7 +14,7 @@ /datum/design/bluespace_pod name = "Supply Drop Pod Upgrade Disk" - desc = "Allows the Cargo Express Console to call down the Bluespace Drop Pod, greatly increasing user saftey."//who? + desc = "Allows the Cargo Express Console to call down the Bluespace Drop Pod, greatly increasing user safety."//who? id = "bluespace_pod"//the coder reading this build_type = PROTOLATHE materials = list(MAT_GLASS = 1000) diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index b30470036e..e1648559a7 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -59,7 +59,7 @@ /datum/design/light_replacer name = "Light Replacer" - desc = "A device to automatically replace lights. Refill with working lightbulbs." + desc = "A device to automatically replace lights. Refill with working light bulbs." id = "light_replacer" build_type = PROTOLATHE materials = list(MAT_METAL = 1500, MAT_SILVER = 150, MAT_GLASS = 3000) diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 2fcb20a498..0c7b7327fa 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -181,7 +181,7 @@ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL /datum/design/xray - name = "Xray Laser Gun" + name = "X-ray Laser Gun" desc = "Not quite as menacing as it sounds" id = "xray_laser" build_type = PROTOLATHE diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 76712dd55e..75ed53e936 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -24,7 +24,7 @@ create_reagents(0) materials = AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE, MAT_PLASTIC), 0, - FALSE, list(/obj/item/stack), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) + TRUE, list(/obj/item/stack), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) materials.precise_insertion = TRUE RefreshParts() matching_designs = list() diff --git a/code/modules/research/machinery/departmental_circuit_imprinter.dm b/code/modules/research/machinery/departmental_circuit_imprinter.dm index c51288b685..e47bd97494 100644 --- a/code/modules/research/machinery/departmental_circuit_imprinter.dm +++ b/code/modules/research/machinery/departmental_circuit_imprinter.dm @@ -1,6 +1,6 @@ /obj/machinery/rnd/production/circuit_imprinter/department name = "department circuit imprinter" - desc = "A special circuit imprinter with a built in interface meant for departmental usage, with built in ExoSync recievers allowing it to print designs researched that match its ROM-encoded department type." + desc = "A special circuit imprinter with a built in interface meant for departmental usage, with built in ExoSync receivers allowing it to print designs researched that match its ROM-encoded department type." icon_state = "circuit_imprinter" container_type = OPENCONTAINER circuit = /obj/item/circuitboard/machine/circuit_imprinter/department diff --git a/code/modules/research/machinery/departmental_protolathe.dm b/code/modules/research/machinery/departmental_protolathe.dm index ddc0b7c749..f91f3282d5 100644 --- a/code/modules/research/machinery/departmental_protolathe.dm +++ b/code/modules/research/machinery/departmental_protolathe.dm @@ -1,6 +1,6 @@ /obj/machinery/rnd/production/protolathe/department name = "department protolathe" - desc = "A special protolathe with a built in interface meant for departmental usage, with built in ExoSync recievers allowing it to print designs researched that match its ROM-encoded department type." + desc = "A special protolathe with a built in interface meant for departmental usage, with built in ExoSync receivers allowing it to print designs researched that match its ROM-encoded department type." icon_state = "protolathe" container_type = OPENCONTAINER circuit = /obj/item/circuitboard/machine/protolathe/department diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 87f8cefe78..23d515cf88 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -44,6 +44,9 @@ return if(default_deconstruction_crowbar(O)) return + if(panel_open && is_wire_tool(O)) + wires.interact(user) + return TRUE if(is_refillable() && O.is_drainable()) return FALSE //inserting reagents into the machine if(Insert_Item(O, user)) @@ -65,6 +68,7 @@ to_chat(user, "You can't load [src] while it's opened!") return FALSE if(disabled) + to_chat(user, "The insertion belts of [src] won't engage!") return FALSE if(requires_console && !linked_console) to_chat(user, "[src] must be linked to an R&D console first!") diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index a34476ce1c..7c23609c21 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -106,19 +106,19 @@ l[i] = amount modify_point_list(l) -/datum/techweb/proc/copy_research_to(datum/techweb/reciever, unlock_hidden = TRUE) //Adds any missing research to theirs. +/datum/techweb/proc/copy_research_to(datum/techweb/receiver, unlock_hidden = TRUE) //Adds any missing research to theirs. for(var/i in researched_nodes) CHECK_TICK - reciever.research_node_id(i, TRUE, FALSE) + receiver.research_node_id(i, TRUE, FALSE) for(var/i in researched_designs) CHECK_TICK - reciever.add_design_by_id(i) + receiver.add_design_by_id(i) if(unlock_hidden) - for(var/i in reciever.hidden_nodes) + for(var/i in receiver.hidden_nodes) CHECK_TICK if(!hidden_nodes[i]) - reciever.hidden_nodes -= i //We can see it so let them see it too. - reciever.recalculate_nodes() + receiver.hidden_nodes -= i //We can see it so let them see it too. + receiver.recalculate_nodes() /datum/techweb/proc/copy() var/datum/techweb/returned = new() diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 015f0dafb6..a65ad7de0a 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -18,7 +18,7 @@ display_name = "Biological Technology" description = "What makes us tick." //the MC, silly! prereq_ids = list("base") - design_ids = list("chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser") + design_ids = list("chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -27,7 +27,7 @@ display_name = "Advanced Biotechnology" description = "Advanced Biotechnology" prereq_ids = list("biotech") - design_ids = list("piercesyringe", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker") + design_ids = list("piercesyringe", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker", "healthanalyzer_advanced") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -198,7 +198,7 @@ display_name = "Basic Robotics Research" description = "Programmable machines that make our lives lazier." prereq_ids = list("base") - design_ids = list("paicard", "drone_shell") + design_ids = list("paicard") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -207,7 +207,7 @@ display_name = "Advanced Robotics Research" description = "It can even do the dishes!" prereq_ids = list("robotics") - design_ids = list("borg_upgrade_diamonddrill") + design_ids = list("borg_upgrade_diamonddrill", "borg_upgrade_trashofholding", "borg_upgrade_advancedmop") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -320,7 +320,7 @@ description = "Honk?!" prereq_ids = list("base") design_ids = list("air_horn", "honker_main", "honker_peri", "honker_targ", "honk_chassis", "honk_head", "honk_torso", "honk_left_arm", "honk_right_arm", - "honk_left_leg", "honk_right_leg", "mech_banana_mortar", "mech_mousetrap_mortar", "mech_honker", "mech_punching_face", "implant_trombone") + "honk_left_leg", "honk_right_leg", "mech_banana_mortar", "mech_mousetrap_mortar", "mech_honker", "mech_punching_face", "implant_trombone", "borg_transform_clown") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/research/xenobiology/crossbreeding/_corecross.dm b/code/modules/research/xenobiology/crossbreeding/_corecross.dm index 45cc0c1efc..43f23d013d 100644 --- a/code/modules/research/xenobiology/crossbreeding/_corecross.dm +++ b/code/modules/research/xenobiology/crossbreeding/_corecross.dm @@ -39,7 +39,7 @@ To add a crossbreed: /obj/item/slimecross/Initialize() ..() - name = colour + " " + name + name = effect + " " + colour + " extract" var/itemcolor = "#FFFFFF" switch(colour) if("orange") diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 97112c148a..ca334497a7 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -564,6 +564,7 @@ datum/status_effect/stabilized/blue/on_remove() /datum/status_effect/stabilized/cerulean/on_remove() if(clone) clone.visible_message("[clone] dissolves into a puddle of goo!") + clone.unequip_everything() qdel(clone) /datum/status_effect/stabilized/pyrite diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index 7183ece045..8ae7bf8d54 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -386,6 +386,9 @@ Charged extracts: if(user == M) to_chat(user, "You can't drink the love potion. What are you, a narcissist?") return ..() + if(M.has_status_effect(STATUS_EFFECT_INLOVE)) + to_chat(user, "[M] is already lovestruck!") + return ..() M.visible_message("[user] starts to feed [M] a love potion!", "[user] starts to feed you a love potion!") @@ -393,10 +396,11 @@ Charged extracts: if(!do_after(user, 50, target = M)) return to_chat(user, "You feed [M] the love potion!") - to_chat(M, "You develop feelings for [user], and anyone [p_they(user)] like.") - if(!("[REF(user)]" in M.faction) && M.mind) - M.mind.store_memory("You have strong feelings for [user].") + to_chat(M, "You develop feelings for [user], and anyone [user.p_they()] like.") + if(M.mind) + M.mind.store_memory("You are in love with [user].") M.faction |= "[REF(user)]" + M.apply_status_effect(STATUS_EFFECT_INLOVE, user) qdel(src) /obj/item/slimepotion/peacepotion diff --git a/code/modules/research/xenobiology/crossbreeding/recurring.dm b/code/modules/research/xenobiology/crossbreeding/recurring.dm index cc36bbb215..8a6e5c3cbb 100644 --- a/code/modules/research/xenobiology/crossbreeding/recurring.dm +++ b/code/modules/research/xenobiology/crossbreeding/recurring.dm @@ -21,6 +21,7 @@ Recurring extracts: extract.desc = desc extract.icon = icon extract.icon_state = icon_state + extract.color = color extract.recurring = TRUE src.forceMove(extract) START_PROCESSING(SSobj,src) diff --git a/code/modules/research/xenobiology/crossbreeding/reproductive.dm b/code/modules/research/xenobiology/crossbreeding/reproductive.dm index 878e17c1e7..2f6ca9555a 100644 --- a/code/modules/research/xenobiology/crossbreeding/reproductive.dm +++ b/code/modules/research/xenobiology/crossbreeding/reproductive.dm @@ -19,7 +19,7 @@ Reproductive extracts: return if(istype(O, /obj/item/storage/bag/bio)) var/list/inserted = list() - O.SendSignal(COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/monkeycube, src, 1, null, null, user, inserted) + SEND_SIGNAL(O, COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/monkeycube, src, 1, null, null, user, inserted) if(inserted.len) var/obj/item/reagent_containers/food/snacks/monkeycube/M = inserted[1] if(istype(M)) diff --git a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm index 7bb723bc3d..93e5a8e739 100644 --- a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm +++ b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm @@ -4,7 +4,7 @@ Self-sustaining extracts: */ /obj/item/slimecross/selfsustaining name = "self-sustaining extract" - effect = "selfsustaining" + effect = "self-sustaining" icon_state = "selfsustaining" var/extract_type = /obj/item/slime_extract @@ -23,6 +23,7 @@ Self-sustaining extracts: A.extract = X A.icon = icon A.icon_state = icon_state + A.color = color qdel(src) /obj/item/autoslime/Initialize() diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm index cc80c3a780..fe1b498667 100644 --- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm +++ b/code/modules/research/xenobiology/crossbreeding/stabilized.dm @@ -163,4 +163,4 @@ Stabilized extracts: regencore = regen regen.forceMove(src) return - return ..() + return ..() \ No newline at end of file diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index a5998400c8..b8cc61df97 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -702,7 +702,7 @@ imp.implant(SM, user) SM.access_card = new /obj/item/card/id/syndicate(SM) - SM.access_card.flags_1 |= NODROP_1 + SM.access_card.item_flags |= NODROP /obj/item/slimepotion/transference name = "consciousness transference potion" @@ -725,7 +725,11 @@ if(SM.sentience_type != animal_type) to_chat(user, "You cannot transfer your consciousness to [SM]." ) return ..() - if(jobban_isbanned(user, ROLE_ALIEN)) //ideally sentience and trasnference potions should be their own unique role. + var/jb = jobban_isbanned(user, ROLE_ALIEN) + if(QDELETED(src) || QDELETED(M) || QDELETED(user)) + return + + if(jb) //ideally sentience and trasnference potions should be their own unique role. to_chat(user, "Your mind goes blank as you attempt to use the potion.") return @@ -909,7 +913,7 @@ /obj/item/slimepotion/slime/slimeradio name = "bluespace radio potion" - desc = "A strange chemical that grants those who ingest it the ability to broadcast and recieve subscape radio waves." + desc = "A strange chemical that grants those who ingest it the ability to broadcast and receive subscape radio waves." icon = 'icons/obj/chemical.dmi' icon_state = "potgrey" diff --git a/code/modules/ruins/spaceruin_code/listeningstation.dm b/code/modules/ruins/spaceruin_code/listeningstation.dm index ff0bad8257..8efeaaabff 100644 --- a/code/modules/ruins/spaceruin_code/listeningstation.dm +++ b/code/modules/ruins/spaceruin_code/listeningstation.dm @@ -32,11 +32,11 @@ /obj/item/paper/fluff/ruins/listeningstation/receipt name = "receipt" - info = "1 x Stechtkin pistol - $600
    1 x silencer - $200
    shipping charge - $4360
    total - $5160" + info = "1 x Stechkin pistol - $600
    1 x silencer - $200
    shipping charge - $4360
    total - $5160" /obj/item/paper/fluff/ruins/listeningstation/odd_report name = "odd report" - info = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilized your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear its ugly head again. -Donk Co. Operative #451" + info = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilized your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear its ugly head again. -DonkCo Operative #451" /obj/item/paper/fluff/ruins/listeningstation/briefing name = "mission briefing" diff --git a/code/modules/ruins/spaceruin_code/oldstation.dm b/code/modules/ruins/spaceruin_code/oldstation.dm index d023760061..b216145023 100644 --- a/code/modules/ruins/spaceruin_code/oldstation.dm +++ b/code/modules/ruins/spaceruin_code/oldstation.dm @@ -1,7 +1,7 @@ /////////// Oldstation items /obj/item/paper/fluff/ruins/oldstation - name = "Cyro Awakening Alert" + name = "Cryo Awakening Alert" info = "**WARNING**

    Catastrophic damage sustained to station. Powernet exhausted to reawaken crew.

    Immediate Objectives

    1: Activate emergency power generator
    2: Lift station lockdown on the bridge

    Please locate the 'Damage Report' on the bridge for a detailed situation report." /obj/item/paper/fluff/ruins/oldstation/damagereport @@ -43,7 +43,7 @@ /obj/item/paper/fluff/ruins/oldstation/report name = "Crew Reawakening Report" - info = "Artifical Program's report to surviving crewmembers.

    Crew were placed into cryostasis on March 10th, 2445.

    Crew were awoken from cryostasis around June, 2557.

    \ + info = "Artificial Program's report to surviving crewmembers.

    Crew were placed into cryostasis on March 10th, 2445.

    Crew were awoken from cryostasis around June, 2557.

    \ SIGNIFICANT EVENTS OF NOTE
    1: The primary radiation detectors were taken offline after 112 years due to power failure, secondary radiation detectors showed no residual \ radiation on station. Deduction, primarily detector was malfunctioning and was producing a radiation signal when there was none.

    2: A data burst from a nearby Nanotrasen Space \ - Station was recieved, this data burst contained research data that has been uploaded to our RnD labs.

    3: Unknown invasion force has occupied Delta station." + Station was received, this data burst contained research data that has been uploaded to our RnD labs.

    3: Unknown invasion force has occupied Delta station." diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index 84f0ac493d..43b273914c 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -19,7 +19,7 @@ /obj/item/assault_pod - name = "Assault Pod Targetting Device" + name = "Assault Pod Targeting Device" icon = 'icons/obj/device.dmi' icon_state = "gangtool-red" item_state = "radio" diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index fc32b60e6d..20b8c26d83 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -263,6 +263,14 @@ return has_people +/obj/docking_port/mobile/emergency/proc/ShuttleDBStuff() + set waitfor = FALSE + if(!SSdbcore.Connect()) + return + var/datum/DBQuery/query_round_shuttle_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET shuttle_name = '[name]' WHERE id = [GLOB.round_id]") + query_round_shuttle_name.Execute() + qdel(query_round_shuttle_name) + /obj/docking_port/mobile/emergency/check() if(!timer) return @@ -293,9 +301,7 @@ setTimer(SSshuttle.emergencyDockTime) send2irc("Server", "The Emergency Shuttle has docked with the station.") priority_announce("The Emergency Shuttle has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, 'sound/ai/shuttledock.ogg', "Priority") - if(SSdbcore.Connect()) - var/datum/DBQuery/query_round_shuttle_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET shuttle_name = '[name]' WHERE id = [GLOB.round_id]") - query_round_shuttle_name.Execute() + ShuttleDBStuff() if(SHUTTLE_DOCKED) @@ -537,7 +543,7 @@ /obj/item/storage/pod/attack_hand(mob/user) if (can_interact(user)) - SendSignal(COMSIG_TRY_STORAGE_SHOW, user) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SHOW, user) return TRUE /obj/item/storage/pod/MouseDrop(over_object, src_location, over_location) diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm index f2d56686e0..eaa1f36b75 100644 --- a/code/modules/shuttle/ferry.dm +++ b/code/modules/shuttle/ferry.dm @@ -36,5 +36,5 @@ if(last_request && (last_request + cooldown > world.time)) return last_request = world.time - to_chat(usr, "Your request has been recieved by CentCom.") + to_chat(usr, "Your request has been received by CentCom.") to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to CentCom.") diff --git a/code/modules/shuttle/shuttle_rotate.dm b/code/modules/shuttle/shuttle_rotate.dm index cc69fb5d15..a2159a50fd 100644 --- a/code/modules/shuttle/shuttle_rotate.dm +++ b/code/modules/shuttle/shuttle_rotate.dm @@ -25,7 +25,7 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate pixel_x = oldPY pixel_y = (oldPX*(-1)) - SendSignal(COMSIG_ATOM_ROTATE, rotation, params) + SEND_SIGNAL(src, COMSIG_ATOM_ROTATE, rotation, params) /************************************Turf rotate procs************************************/ diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index abe601e503..0f005f69f7 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -165,7 +165,7 @@ var/datum/job/captain/C = new /datum/job/captain access_card.access = C.get_access() access_card.access |= ACCESS_CENT_BAR - access_card.flags_1 |= NODROP_1 + access_card.item_flags |= NODROP /mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy() qdel(access_card) diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 773b35544c..1cf12e6d42 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -13,7 +13,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/machinery/clonepod, /obj/effect/mob_spawn, /obj/effect/hierophant, - /obj/structure/recieving_pad, + /obj/structure/receiving_pad, /obj/effect/clockwork/spatial_gateway, /obj/structure/destructible/clockwork/powered/clockwork_obelisk, /obj/item/warp_cube, diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 4d92878cc2..4e6ef7ed9b 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -373,7 +373,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th if("unconscious") target.AdjustUnconscious(amount) else - target.vars[type] += amount //I bear no responsibility for the runtimes that'll happen if you try to adjust non-numeric or even non-existant vars + target.vars[type] += amount //I bear no responsibility for the runtimes that'll happen if you try to adjust non-numeric or even non-existent vars /obj/effect/proc_holder/spell/targeted //can mean aoe for mobs (limited/unlimited number) or one target mob var/max_targets = 1 //leave 0 for unlimited targets in range, 1 for one selectable target in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range diff --git a/code/modules/spells/spell_types/barnyard.dm b/code/modules/spells/spell_types/barnyard.dm index 70b33919b7..01b24fef98 100644 --- a/code/modules/spells/spell_types/barnyard.dm +++ b/code/modules/spells/spell_types/barnyard.dm @@ -44,7 +44,7 @@ var/choice = masks[randM] var/obj/item/clothing/mask/magichead = new choice - magichead.flags_1 |= NODROP_1 + magichead.item_flags |= NODROP magichead.flags_inv = null target.visible_message("[target]'s face bursts into flames, and a barnyard animal's head takes its place!", \ "Your face burns up, and shortly after the fire you realise you have the face of a barnyard animal!") diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm index ff71ad8e68..8e1957f524 100644 --- a/code/modules/spells/spell_types/construct_spells.dm +++ b/code/modules/spells/spell_types/construct_spells.dm @@ -220,7 +220,7 @@ /obj/effect/proc_holder/spell/targeted/dominate name = "Dominate" - desc = "This spell dominates the mind of a lesser creature, causing it to see you as an ally." + desc = "This spell dominates the mind of a lesser creature to the will of Nar'sie, allying it only to her direct followers." charge_max = 600 range = 7 diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index bf402b7a6a..27cfc9208b 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/items_and_weapons.dmi' icon_state = "syndballoon" item_state = null - flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1 + item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL w_class = WEIGHT_CLASS_HUGE force = 0 throwforce = 0 @@ -60,10 +60,7 @@ target.visible_message("[target]'s [A] glows brightly as it wards off the spell!") user.visible_message("The feedback blows [user]'s arm off!","The spell bounces from [M]'s skin back into your arm!") user.flash_act() - var/obj/item/bodypart/part - var/index = user.get_held_index_of_item(src) - if(index) - part = user.hand_bodyparts[index] + var/obj/item/bodypart/part = user.get_holding_bodypart_of_item(src) if(part) part.dismember() ..() diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index 33b555ad21..d88ee7fb22 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -31,10 +31,10 @@ var/obj/item/marked_item - for(var/obj/item in hand_items) + for(var/obj/item/item in hand_items) // I ensouled the nuke disk once. But it's probably a really // mean tactic, so probably should discourage it. - if((item.flags_1 & ABSTRACT_1) || (item.flags_1 & NODROP_1) || item.SendSignal(COMSIG_ITEM_IMBUE_SOUL, user)) + if((item.item_flags & ABSTRACT) || (item.item_flags & NODROP) || SEND_SIGNAL(item, COMSIG_ITEM_IMBUE_SOUL, user)) continue marked_item = item to_chat(M, "You begin to focus your very being into [item]...") diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm index 2b904df277..e3177dbb4f 100644 --- a/code/modules/spells/spell_types/mime.dm +++ b/code/modules/spells/spell_types/mime.dm @@ -58,9 +58,9 @@ H.mind.miming=!H.mind.miming if(H.mind.miming) to_chat(H, "You make a vow of silence.") - H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "vow") + SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "vow") else - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "vow", /datum/mood_event/broken_vow) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "vow", /datum/mood_event/broken_vow) to_chat(H, "You break your vow of silence.") // These spells can only be gotten from the "Guide for Advanced Mimery series" for Mime Traitors. @@ -131,17 +131,26 @@ /obj/item/book/granter/spell/mimery_blockade spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime - spellname = "" + spellname = "Invisible Blockade" name = "Guide to Advanced Mimery Vol 1" desc = "The pages don't make any sound when turned." icon_state ="bookmime" remarks = list("...") +/obj/item/book/granter/spell/mimery_blockade/attack_self(mob/user) + ..() + if(!locate(/obj/effect/proc_holder/spell/targeted/mime/speak) in user.mind.spell_list) + user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak) /obj/item/book/granter/spell/mimery_guns spell = /obj/effect/proc_holder/spell/aimed/finger_guns - spellname = "" + spellname = "Finger Guns" name = "Guide to Advanced Mimery Vol 2" desc = "There aren't any words written..." icon_state ="bookmime" remarks = list("...") + +/obj/item/book/granter/spell/mimery_guns/attack_self(mob/user) + ..() + if(!locate(/obj/effect/proc_holder/spell/targeted/mime/speak) in user.mind.spell_list) + user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak) \ No newline at end of file diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm index bd5099da68..0bb79eba21 100644 --- a/code/modules/spells/spell_types/summonitem.dm +++ b/code/modules/spells/spell_types/summonitem.dm @@ -22,10 +22,10 @@ if(!marked_item) //linking item to the spell message = "" - for(var/obj/item in hand_items) - if(item.flags_1 & ABSTRACT_1) + for(var/obj/item/item in hand_items) + if(item.item_flags & ABSTRACT) continue - if(item.flags_1 & NODROP_1) + if(item.item_flags & NODROP) message += "Though it feels redundant, " marked_item = item message += "You mark [item] for recall." @@ -83,7 +83,7 @@ to_chat(C, "The [item_to_retrieve] that was embedded in your [L] has mysteriously vanished. How fortunate!") if(!C.has_embedded_objects()) C.clear_alert("embeddedobject") - C.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "embedded") + SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "embedded") break else diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 9be68103c3..0601ff28e1 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -67,7 +67,7 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' icon_state = "hypo" - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON var/list/animals = list() var/list/plants = list() var/list/dna = list() diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index c806a68867..87e13955fe 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -19,7 +19,7 @@ affecting.receive_damage(CLAMP(brute_dam/2, 15, 50), CLAMP(burn_dam/2, 0, 50)) //Damage the chest based on limb's existing damage C.visible_message("[C]'s [src.name] has been violently dismembered!") C.emote("scream") - C.SendSignal(COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered) + SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered) drop_limb() if(dam_type == BURN) @@ -102,7 +102,7 @@ I.forceMove(src) if(!C.has_embedded_objects()) C.clear_alert("embeddedobject") - C.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "embedded") + SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "embedded") if(!special) if(C.dna) diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 12531a9ee5..91336331c4 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -121,7 +121,7 @@ I.forceMove(T) clear_alert("embeddedobject") - SendSignal(COMSIG_CLEAR_MOOD_EVENT, "embedded") + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "embedded") /mob/living/carbon/proc/has_embedded_objects() . = 0 diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index fe4f1a6edf..e57f8f686b 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -29,9 +29,13 @@ /datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) var/obj/item/bodypart/chest/CH = target.get_bodypart(BODY_ZONE_CHEST) if(tool) - if(IC || tool.w_class > WEIGHT_CLASS_NORMAL || (tool.flags_1 & NODROP_1) || istype(tool, /obj/item/organ)) + if(IC || tool.w_class > WEIGHT_CLASS_NORMAL || (tool.item_flags & NODROP) || istype(tool, /obj/item/organ)) to_chat(user, "You can't seem to fit [tool] in [target]'s [target_zone]!") return 0 + var/obj/item/electronic_assembly/EA = tool + if(istype(EA) && EA.combat_circuits && tool.w_class > WEIGHT_CLASS_SMALL) + to_chat(user, "[tool] is too dangerous to put in [target]'s [target_zone]! Maybe if it was smaller...") + return 0 else user.visible_message("[user] stuffs [tool] into [target]'s [target_zone]!", "You stuff [tool] into [target]'s [target_zone].") user.transferItemToLoc(tool, target, TRUE) diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index e93da8b139..ea2385ce5f 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -86,7 +86,7 @@ holder = item - holder.flags_1 |= NODROP_1 + holder.item_flags |= NODROP holder.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF holder.slot_flags = null holder.materials = null diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 133fe5d8be..0302dd2cae 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -13,7 +13,7 @@ var/hunger_threshold = NUTRITION_LEVEL_STARVING var/synthesizing = 0 var/poison_amount = 5 - slot = ORGAN_SLOT_STOMACH + slot = ORGAN_SLOT_STOMACH_AID /obj/item/organ/cyberimp/chest/nutriment/on_life() if(synthesizing) diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 4aa06f01c6..38967711fe 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -51,7 +51,7 @@ active = !active if(active) for(var/obj/item/I in owner.held_items) - if(!(I.flags_1 & NODROP_1)) + if(!(I.item_flags & NODROP)) stored_items += I var/list/L = owner.get_empty_held_indexes() @@ -62,7 +62,7 @@ else for(var/obj/item/I in stored_items) to_chat(owner, "Your [owner.get_held_index_name(owner.get_held_index_of_item(I))]'s grip tightens.") - I.flags_1 |= NODROP_1 + I.item_flags |= NODROP else release_items() @@ -86,7 +86,7 @@ /obj/item/organ/cyberimp/brain/anti_drop/proc/release_items() for(var/obj/item/I in stored_items) - I.flags_1 &= ~NODROP_1 + I.item_flags &= ~NODROP stored_items = list() diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 5092b53374..d38e76ae6e 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -98,7 +98,7 @@ owner.flash_act(visual = 1) /obj/item/organ/eyes/robotic/xray - name = "X-ray eyes" + name = "\improper X-ray eyes" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." eye_color = "000" see_in_dark = 8 diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 3ddf658ecd..cb7833a373 100755 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -39,22 +39,22 @@ switch(H.disgust) if(0 to DISGUST_LEVEL_GROSS) H.clear_alert("disgust") - H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "disgust") + SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "disgust") if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS) H.throw_alert("disgust", /obj/screen/alert/gross) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgust/gross) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgust/gross) if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED) H.throw_alert("disgust", /obj/screen/alert/verygross) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgust/verygross) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgust/verygross) if(DISGUST_LEVEL_DISGUSTED to INFINITY) H.throw_alert("disgust", /obj/screen/alert/disgusted) - H.SendSignal(COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgust/disgusted) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgust/disgusted) /obj/item/organ/stomach/Remove(mob/living/carbon/M, special = 0) var/mob/living/carbon/human/H = owner if(istype(H)) H.clear_alert("disgust") - H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "disgust") + SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "disgust") ..() /obj/item/organ/stomach/fly diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 2521037963..48392f70a3 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -488,7 +488,7 @@ L.lay_down() //aka get up L.SetStun(0) L.SetKnockdown(0) - L.SetUnconscious(0) //i said get up i don't care if you're being tazed + L.SetUnconscious(0) //i said get up i don't care if you're being tased //SIT else if((findtext(message, sit_words))) diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 548a73627d..451ae02dac 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -30,7 +30,7 @@ L.embedded_objects -= I if(!H.has_embedded_objects()) H.clear_alert("embeddedobject") - H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "embedded") + SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "embedded") if(objects > 0) user.visible_message("[user] successfully removes [objects] objects from [H]'s [L]!", "You successfully remove [objects] objects from [H]'s [L.name].") diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm index 0e4844dced..c6741f20b8 100644 --- a/code/modules/tgui/states/default.dm +++ b/code/modules/tgui/states/default.dm @@ -7,7 +7,7 @@ GLOBAL_DATUM_INIT(default_state, /datum/ui_state/default, new) /datum/ui_state/default/can_use_topic(src_object, mob/user) - return user.default_can_use_topic(src_object) // Call the individual mob-overriden procs. + return user.default_can_use_topic(src_object) // Call the individual mob-overridden procs. /mob/proc/default_can_use_topic(src_object) return UI_CLOSE // Don't allow interaction by default. diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index 79f09c4dbc..2e91879006 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -1,42 +1,60 @@ - // A collection of pre-set uplinks, for admin spawns. -/obj/item/radio/uplink/Initialize(mapload, _owner, _tc_amount = 20) - . = ..() + +// Radio-like uplink; not an actual radio because this uplink is most commonly +// used for nuke ops, for whom opening the radio GUI and the uplink GUI +// simultaneously is an annoying distraction. +/obj/item/uplink + name = "station bounced radio" + icon = 'icons/obj/radio.dmi' icon_state = "radio" + item_state = "walkietalkie" + desc = "A basic handheld radio that communicates with local telecommunication networks." lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - AddComponent(/datum/component/uplink, _owner, FALSE, TRUE, null, _tc_amount) + dog_fashion = /datum/dog_fashion/back -/obj/item/radio/uplink/nuclear/Initialize() + flags_1 = CONDUCT_1 + slot_flags = ITEM_SLOT_BELT + throw_speed = 3 + throw_range = 7 + w_class = WEIGHT_CLASS_SMALL + +/obj/item/uplink/Initialize(mapload, owner, tc_amount = 20) + . = ..() + AddComponent(/datum/component/uplink, owner, FALSE, TRUE, null, tc_amount) + +/obj/item/uplink/nuclear/Initialize() . = ..() GET_COMPONENT(hidden_uplink, /datum/component/uplink) hidden_uplink.set_gamemode(/datum/game_mode/nuclear) -/obj/item/radio/uplink/nuclear_restricted/Initialize() +/obj/item/uplink/nuclear_restricted/Initialize() . = ..() GET_COMPONENT(hidden_uplink, /datum/component/uplink) hidden_uplink.allow_restricted = FALSE hidden_uplink.set_gamemode(/datum/game_mode/nuclear) -/obj/item/radio/uplink/clownop/Initialize() +/obj/item/uplink/clownop/Initialize() . = ..() GET_COMPONENT(hidden_uplink, /datum/component/uplink) hidden_uplink.set_gamemode(/datum/game_mode/nuclear/clown_ops) -/obj/item/multitool/uplink/Initialize(mapload, _owner, _tc_amount = 20) - . = ..() - AddComponent(/datum/component/uplink, _owner, FALSE, TRUE, null, _tc_amount) - -/obj/item/pen/uplink/Initialize(mapload, _owner, _tc_amount = 20) - . = ..() - AddComponent(/datum/component/uplink) - traitor_unlock_degrees = 360 - -/obj/item/radio/uplink/old +/obj/item/uplink/old name = "dusty radio" desc = "A dusty looking radio." -/obj/item/radio/uplink/old/Initialize(mapload, _owner, _tc_amount = 10) +/obj/item/uplink/old/Initialize(mapload, owner, tc_amount = 10) . = ..() GET_COMPONENT(hidden_uplink, /datum/component/uplink) hidden_uplink.name = "dusty radio" + +// Multitool uplink +/obj/item/multitool/uplink/Initialize(mapload, owner, tc_amount = 20) + . = ..() + AddComponent(/datum/component/uplink, owner, FALSE, TRUE, null, tc_amount) + +// Pen uplink +/obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 20) + . = ..() + AddComponent(/datum/component/uplink, owner, TRUE, FALSE, null, tc_amount) + traitor_unlock_degrees = 360 diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 619e2c8193..a9f2c63e13 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -790,7 +790,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "Combat Banana Shoes" desc = "While making the wearer immune to most slipping attacks like regular combat clown shoes, these shoes \ can generate a large number of synthetic banana peels as the wearer walks, slipping up would-be pursuers. They also \ - squeek significantly louder." + squeak significantly louder." item = /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat cost = 6 surplus = 0 @@ -1269,7 +1269,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 8 /datum/uplink_item/cyber_implants/xray - name = "X-Ray Vision Implant" + name = "X-ray Vision Implant" desc = "These cybernetic eyes will give you X-ray vision. Comes with an autosurgeon." item = /obj/item/autosurgeon/xray_eyes cost = 10 diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 89bbee9d60..b9112ddfde 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -1,7 +1,3 @@ -#define STANDARD_CHARGE 1 -#define CONTRABAND_CHARGE 2 -#define COIN_CHARGE 3 - /* * Vending machine types - Can be found under /code/modules/vending/ */ @@ -21,7 +17,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C */ /datum/data/vending_product - var/product_name = "generic" + name = "generic" var/product_path = null var/amount = 0 var/max_amount = 0 @@ -74,7 +70,6 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C var/dish_quants = list() //used by the snack machine's custom compartment to count dishes. var/obj/item/vending_refill/refill_canister = null //The type of refill canisters used by this machine. - var/refill_count = 3 //The number of canisters the vending machine uses /obj/machinery/vending/Initialize() var/build_inv = FALSE @@ -84,9 +79,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C . = ..() wires = new /datum/wires/vending(src) if(build_inv) //non-constructable vending machine - build_inventory(products) - build_inventory(contraband, 1) - build_inventory(premium, 0, 1) + build_inventory(products, product_records) + build_inventory(contraband, hidden_records) + build_inventory(premium, coin_records) slogan_list = splittext(product_slogans, ";") // So not all machines speak at the exact same time. @@ -102,17 +97,17 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C return ..() /obj/machinery/vending/RefreshParts() //Better would be to make constructable child - if(component_parts) - product_records = list() - hidden_records = list() - coin_records = list() - build_inventory(products, start_empty = 1) - build_inventory(contraband, 1, start_empty = 1) - build_inventory(premium, 0, 1, start_empty = 1) - for(var/obj/item/vending_refill/VR in component_parts) - refill_inventory(VR, product_records, STANDARD_CHARGE) - refill_inventory(VR, coin_records, COIN_CHARGE) - refill_inventory(VR, hidden_records, CONTRABAND_CHARGE) + if(!component_parts) + return + + product_records = list() + hidden_records = list() + coin_records = list() + build_inventory(products, product_records, start_empty = TRUE) + build_inventory(contraband, hidden_records, start_empty = TRUE) + build_inventory(premium, coin_records, start_empty = TRUE) + for(var/obj/item/vending_refill/VR in component_parts) + restock(VR) /obj/machinery/vending/deconstruct(disassembled = TRUE) if(!refill_canister) //the non constructable vendors drop metal instead of a machine frame. @@ -124,25 +119,33 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C /obj/machinery/vending/obj_break(damage_flag) if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) - var/dump_amount = 0 - for(var/datum/data/vending_product/R in product_records) - if(R.amount <= 0) //Try to use a record that actually has something to dump. - continue - var/dump_path = R.product_path - if(!dump_path) - continue - - while(R.amount>0) - var/obj/O = new dump_path(loc) - step(O, pick(GLOB.alldirs)) //we only drop 20% of the total of each products and spread it - R.amount -= 5 //around to not fill the turf with too many objects. - dump_amount++ - if(dump_amount > 15) //so we don't drop too many items (e.g. ClothesMate) - break stat |= BROKEN icon_state = "[initial(icon_state)]-broken" -/obj/machinery/vending/proc/build_inventory(list/productlist, hidden=0, req_coin=0, start_empty = null) + var/dump_amount = 0 + var/found_anything = TRUE + while (found_anything) + found_anything = FALSE + for(var/record in shuffle(product_records)) + var/datum/data/vending_product/R = record + if(R.amount <= 0) //Try to use a record that actually has something to dump. + continue + var/dump_path = R.product_path + if(!dump_path) + continue + R.amount-- + // busting open a vendor will destroy some of the contents + if(found_anything && prob(80)) + continue + + var/obj/O = new dump_path(loc) + step(O, pick(GLOB.alldirs)) + found_anything = TRUE + dump_amount++ + if (dump_amount >= 16) + return + +/obj/machinery/vending/proc/build_inventory(list/productlist, list/recordlist, start_empty = FALSE) for(var/typepath in productlist) var/amount = productlist[typepath] if(isnull(amount)) @@ -150,47 +153,54 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C var/atom/temp = typepath var/datum/data/vending_product/R = new /datum/data/vending_product() - R.product_name = initial(temp.name) + R.name = initial(temp.name) R.product_path = typepath if(!start_empty) R.amount = amount R.max_amount = amount - R.display_color = pick("red","blue","green") + R.display_color = pick("#ff8080","#80ff80","#8080ff") + recordlist += R - if(hidden) - hidden_records += R - else if(req_coin) - coin_records += R - else - product_records += R +/obj/machinery/vending/proc/restock(obj/item/vending_refill/canister) + if (!canister.products) + canister.products = products.Copy() + if (!canister.contraband) + canister.contraband = contraband.Copy() + if (!canister.premium) + canister.premium = premium.Copy() + . = 0 + . += refill_inventory(canister.products, product_records) + . += refill_inventory(canister.contraband, hidden_records) + . += refill_inventory(canister.premium, coin_records) -/obj/machinery/vending/proc/refill_inventory(obj/item/vending_refill/refill, datum/data/vending_product/machine, var/charge_type = STANDARD_CHARGE) - var/total = 0 - var/to_restock = 0 +/obj/machinery/vending/proc/refill_inventory(list/productlist, list/recordlist) + . = 0 + for(var/R in recordlist) + var/datum/data/vending_product/record = R + var/diff = min(record.max_amount - record.amount, productlist[record.product_path]) + if (diff) + productlist[record.product_path] -= diff + record.amount += diff + . += diff - for(var/datum/data/vending_product/machine_content in machine) - if(machine_content.amount == 0 && refill.charges[charge_type] > 0) - machine_content.amount++ - refill.charges[charge_type]-- - total++ - to_restock += machine_content.max_amount - machine_content.amount - if(to_restock <= refill.charges[charge_type]) - for(var/datum/data/vending_product/machine_content in machine) - machine_content.amount = machine_content.max_amount - refill.charges[charge_type] -= to_restock - total += to_restock - else - var/tmp_charges = refill.charges[charge_type] - for(var/datum/data/vending_product/machine_content in machine) - if(refill.charges[charge_type] == 0) - break - var/restock = CEILING(((machine_content.max_amount - machine_content.amount)/to_restock)*tmp_charges, 1) - if(restock > refill.charges[charge_type]) - restock = refill.charges[charge_type] - machine_content.amount += restock - refill.charges[charge_type] -= restock - total += restock - return total +/obj/machinery/vending/proc/update_canister() + if (!component_parts) + return + + var/obj/item/vending_refill/R = locate() in component_parts + if (!R) + CRASH("Constructible vending machine did not have a refill canister") + return + + R.products = unbuild_inventory(product_records) + R.contraband = unbuild_inventory(hidden_records) + R.premium = unbuild_inventory(coin_records) + +/obj/machinery/vending/proc/unbuild_inventory(list/recordlist) + . = list() + for(var/R in recordlist) + var/datum/data/vending_product/record = R + .[record.product_path] += record.amount /obj/machinery/vending/crowbar_act(mob/living/user, obj/item/I) if(!component_parts) @@ -248,46 +258,52 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C bill = new S.type(src, 1) to_chat(user, "You insert [I] into [src].") return - else if(istype(I, refill_canister) && refill_canister != null) - if(stat & (BROKEN|NOPOWER)) - to_chat(user, "It does nothing.") - else if(panel_open) + else if(refill_canister && istype(I, refill_canister)) + if (!panel_open) + to_chat(user, "You should probably unscrew the service panel first.") + else if (stat & (BROKEN|NOPOWER)) + to_chat(user, "[src] does not respond.") + else //if the panel is open we attempt to refill the machine var/obj/item/vending_refill/canister = I - if(canister.charges[STANDARD_CHARGE] == 0) - to_chat(user, "This [canister.name] is empty!") + if(canister.get_part_rating() == 0) + to_chat(user, "[canister] is empty!") else - var/transfered = refill_inventory(canister,product_records,STANDARD_CHARGE) - transfered += refill_inventory(canister,coin_records,COIN_CHARGE) - transfered += refill_inventory(canister,hidden_records,CONTRABAND_CHARGE) - if(transfered) - to_chat(user, "You loaded [transfered] items in \the [name].") + // instantiate canister if needed + var/transferred = restock(canister) + if(transferred) + to_chat(user, "You loaded [transferred] items in [src].") else - to_chat(user, "The [name] is fully stocked.") + to_chat(user, "There's nothing to restock!") return - else - to_chat(user, "You should probably unscrew the service panel first.") else return ..() +/obj/machinery/vending/exchange_parts(mob/user, obj/item/storage/part_replacer/W) + if(!istype(W)) + return FALSE + if((flags_1 & NODECONSTRUCT_1) && !W.works_from_distance) + return FALSE + if(!component_parts || !refill_canister) + return FALSE + + var/moved = 0 + if(panel_open || W.works_from_distance) + if(W.works_from_distance) + display_parts(user) + for(var/I in W) + if(istype(I, refill_canister)) + moved += restock(I) + else + display_parts(user) + if(moved) + to_chat(user, "[moved] items restocked.") + W.play_rped_sound() + return TRUE + /obj/machinery/vending/on_deconstruction() - var/product_list = list(product_records, hidden_records, coin_records) - for(var/i=1, i<=3, i++) - for(var/datum/data/vending_product/machine_content in product_list[i]) - while(machine_content.amount !=0) - var/safety = 0 //to avoid infinite loop - for(var/obj/item/vending_refill/VR in component_parts) - safety++ - if(VR.charges[i] < VR.init_charges[i]) - VR.charges[i]++ - machine_content.amount-- - if(!machine_content.amount) - break - else - safety-- - if(safety <= 0) // all refill canisters are full - break - ..() + update_canister() + . = ..() /obj/machinery/vending/emag_act(mob/user) if(obj_flags & EMAGGED) @@ -323,7 +339,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C dat += "Vend " else dat += "Sold out " - dat += "[sanitize(R.product_name)]:" + dat += "[sanitize(R.name)]:" dat += " [R.amount]" dat += "" dat += "" @@ -358,17 +374,11 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C to_chat(usr, "There is no money in this machine.") return if(coin) - if(!usr.get_active_held_item()) - usr.put_in_hands(coin) - else - coin.forceMove(get_turf(src)) + usr.put_in_hands(coin) to_chat(usr, "You remove [coin] from [src].") coin = null if(bill) - if(!usr.get_active_held_item()) - usr.put_in_hands(bill) - else - bill.forceMove(get_turf(src)) + usr.put_in_hands(bill) to_chat(usr, "You remove [bill] from [src].") bill = null @@ -545,7 +555,3 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C /obj/machinery/vending/onTransitZ() return - -#undef STANDARD_CHARGE -#undef CONTRABAND_CHARGE -#undef COIN_CHARGE diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index c0cfe661d7..95211a9600 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -3,7 +3,7 @@ desc = "A vending machine for costumes." icon_state = "theater" icon_deny = "theater-deny" - req_access_txt = "46" //Theatre access needed, unless hacked. + req_access = list(ACCESS_THEATRE) product_slogans = "Dress for success!;Suited and booted!;It's show time!;Why leave style up to fate? Use AutoDrobe!" vend_reply = "Thank you for using AutoDrobe!" products = list(/obj/item/clothing/suit/chickensuit = 1, @@ -115,15 +115,17 @@ premium = list(/obj/item/clothing/suit/pirate/captain = 2, /obj/item/clothing/head/pirate/captain = 2, /obj/item/clothing/head/helmet/roman/fake = 1, - /obj/item/clothing/head/helmet/roman/legionaire/fake = 1, + /obj/item/clothing/head/helmet/roman/legionnaire/fake = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/shield/riot/roman/fake = 1, /obj/item/skub = 1) refill_canister = /obj/item/vending_refill/autodrobe +/obj/machinery/vending/autodrobe/all_access + desc = "A vending machine for costumes. This model appears to have no access restrictions." + req_access = null + /obj/item/vending_refill/autodrobe machine_name = "AutoDrobe" icon_state = "refill_costume" - charges = list(32, 2, 3)// of 96 standard, 6 contraband, 9 premium - init_charges = list(32, 2, 3) diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index f5f7bf1d9d..0d193c451d 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -16,7 +16,6 @@ /obj/item/reagent_containers/food/drinks/bottle/absinthe = 5, /obj/item/reagent_containers/food/drinks/bottle/grappa = 5, /obj/item/reagent_containers/food/drinks/bottle/sake = 5, - /obj/item/reagent_containers/food/drinks/bottle/fernet = 5, /obj/item/reagent_containers/food/drinks/ale = 6, /obj/item/reagent_containers/food/drinks/bottle/orangejuice = 4, /obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 4, @@ -32,13 +31,18 @@ /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 12, /obj/item/reagent_containers/food/drinks/flask = 3, /obj/item/reagent_containers/food/drinks/beer = 6) - contraband = list(/obj/item/reagent_containers/food/drinks/mug/tea = 12) + contraband = list(/obj/item/reagent_containers/food/drinks/mug/tea = 12, + /obj/item/reagent_containers/food/drinks/bottle/fernet = 5) product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?" product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!" - req_access_txt = "25" + req_access = list(ACCESS_BAR) refill_canister = /obj/item/vending_refill/boozeomat -/obj/machinery/vending/boozeomat/maint +/obj/machinery/vending/boozeomat/all_access + desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. This model appears to have no access restrictions." + req_access = null + +/obj/machinery/vending/boozeomat/pubby_maint //abandoned bar on Pubbystation products = list(/obj/item/reagent_containers/food/drinks/bottle/whiskey = 1, /obj/item/reagent_containers/food/drinks/bottle/absinthe = 1, /obj/item/reagent_containers/food/drinks/bottle/limejuice = 1, @@ -48,10 +52,17 @@ /obj/item/reagent_containers/food/drinks/ice = 3, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 6, /obj/item/reagent_containers/food/drinks/flask = 1) - req_access_txt = "0" + req_access = null + +/obj/machinery/vending/boozeomat/pubby_captain //Captain's quarters on Pubbystation + products = list(/obj/item/reagent_containers/food/drinks/bottle/rum = 1, + /obj/item/reagent_containers/food/drinks/bottle/wine = 1, + /obj/item/reagent_containers/food/drinks/ale = 1, + /obj/item/reagent_containers/food/drinks/drinkingglass = 6, + /obj/item/reagent_containers/food/drinks/ice = 1, + /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 4); + req_access = list(ACCESS_CAPTAIN) /obj/item/vending_refill/boozeomat machine_name = "Booze-O-Mat" icon_state = "refill_booze" - charges = list(61, 4, 0)//of 182 standard, 12 contraband - init_charges = list(61, 4, 0) diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm index d81a0a01a6..6b9334362d 100644 --- a/code/modules/vending/cigarette.dm +++ b/code/modules/vending/cigarette.dm @@ -41,8 +41,6 @@ /obj/item/vending_refill/cigarette machine_name = "ShadyCigs Deluxe" icon_state = "refill_smoke" - charges = list(12, 3, 2)// of 36 standard, 9 contraband, 6 premium - init_charges = list(12, 3, 2) /obj/machinery/vending/cigarette/pre_throw(obj/item/I) if(istype(I, /obj/item/lighter)) diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index ad5b38575c..80e422c6a0 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -119,5 +119,3 @@ /obj/item/vending_refill/clothing machine_name = "ClothesMate" icon_state = "refill_clothes" - charges = list(38, 4, 4)// of 112 standard, 12 contraband, 10 premium(?) - init_charges = list(38, 4, 4) diff --git a/code/modules/vending/coffee.dm b/code/modules/vending/coffee.dm index d70cf4ae76..6ac9dd648d 100644 --- a/code/modules/vending/coffee.dm +++ b/code/modules/vending/coffee.dm @@ -4,8 +4,8 @@ product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies" icon_state = "coffee" icon_vend = "coffee-vend" - products = list(/obj/item/reagent_containers/food/drinks/coffee = 25, - /obj/item/reagent_containers/food/drinks/mug/tea = 25, + products = list(/obj/item/reagent_containers/food/drinks/coffee = 25, + /obj/item/reagent_containers/food/drinks/mug/tea = 25, /obj/item/reagent_containers/food/drinks/mug/coco = 25) contraband = list(/obj/item/reagent_containers/food/drinks/ice = 12) refill_canister = /obj/item/vending_refill/coffee @@ -13,5 +13,3 @@ /obj/item/vending_refill/coffee machine_name = "Solar's Best Hot Drinks" icon_state = "refill_joe" - charges = list(25, 4, 0)//of 75 standard, 12 contraband - init_charges = list(25, 4, 0) diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index e675b29f81..f61c392ff7 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -22,8 +22,6 @@ /obj/item/vending_refill/cola machine_name = "Robust Softdrinks" icon_state = "refill_cola" - charges = list(30, 4, 1)//of 90 standard, 12 contraband, 1 premium - init_charges = list(30, 4, 1) /obj/machinery/vending/cola/random name = "\improper Random Drinkies" diff --git a/code/modules/vending/engineering.dm b/code/modules/vending/engineering.dm index 5933ab8fa9..d36f4a4849 100644 --- a/code/modules/vending/engineering.dm +++ b/code/modules/vending/engineering.dm @@ -4,7 +4,7 @@ desc = "Everything you need for do-it-yourself station repair." icon_state = "engi" icon_deny = "engi-deny" - req_access_txt = "11" + req_access = list(ACCESS_ENGINE_EQUIP) products = list(/obj/item/clothing/under/rank/chief_engineer = 4, /obj/item/clothing/under/rank/engineer = 4, /obj/item/clothing/shoes/sneakers/orange = 4, diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index 53106c09a6..0e64e0a367 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -3,7 +3,7 @@ desc = "Spare tool vending. What? Did you expect some witty description?" icon_state = "engivend" icon_deny = "engivend-deny" - req_access_txt = "11" //Engineering Equipment access + req_access = list(ACCESS_ENGINE_EQUIP) products = list(/obj/item/clothing/glasses/meson/engine = 2, /obj/item/clothing/glasses/welding = 3, /obj/item/multitool = 4, diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index f76f67af46..4e4d336567 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -1,7 +1,7 @@ /obj/machinery/vending/games name = "\improper Good Clean Fun" desc = "Vends things that the Captain and Head of Personnel are probably not going to appreciate you fiddling with instead of your job..." - product_ads = "Escape to a fantasy world!;Fuel your gambling addiction!;Ruin your friendships!;Roll for initative!;Elves and dwarves!;Paranoid computers!;Totally not satanic!;Fun times forever!" + product_ads = "Escape to a fantasy world!;Fuel your gambling addiction!;Ruin your friendships!;Roll for initiative!;Elves and dwarves!;Paranoid computers!;Totally not satanic!;Fun times forever!" icon_state = "games" products = list(/obj/item/toy/cards/deck = 5, /obj/item/storage/pill_bottle/dice = 10, @@ -13,5 +13,3 @@ /obj/item/vending_refill/games machine_name = "\improper Good Clean Fun" icon_state = "refill_games" - charges = list(7, 3, 0) //of 21 standard, 9 contraband - init_charges = list(7, 3, 0) diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm index 6eafafb164..8415eff69f 100644 --- a/code/modules/vending/liberation.dm +++ b/code/modules/vending/liberation.dm @@ -2,11 +2,14 @@ name = "\improper Liberation Station" desc = "An overwhelming amount of ancient patriotism washes over you just by looking at the machine." icon_state = "liberationstation" - req_access_txt = "1" product_slogans = "Liberation Station: Your one-stop shop for all things second ammendment!;Be a patriot today, pick up a gun!;Quality weapons for cheap prices!;Better dead than red!" product_ads = "Float like an astronaut, sting like a bullet!;Express your second ammendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?" vend_reply = "Remember the name: Liberation Station!" - products = list(/obj/item/gun/ballistic/automatic/pistol/deagle/gold = 2, + products = list(/obj/item/reagent_containers/food/snacks/burger/plain = 5, //O say can you see, by the dawn's early light + /obj/item/reagent_containers/food/snacks/burger/baseball = 3, //What so proudly we hailed at the twilight's last gleaming + /obj/item/reagent_containers/food/snacks/fries = 5, //Whose broad stripes and bright stars through the perilous fight + /obj/item/reagent_containers/food/drinks/beer/light = 10, //O'er the ramparts we watched, were so gallantly streaming? + /obj/item/gun/ballistic/automatic/pistol/deagle/gold = 2, /obj/item/gun/ballistic/automatic/pistol/deagle/camo = 2, /obj/item/gun/ballistic/automatic/pistol/m1911 = 2, /obj/item/gun/ballistic/automatic/proto/unrestricted = 2, @@ -17,8 +20,11 @@ premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2, /obj/item/ammo_box/magazine/m50 = 4, /obj/item/ammo_box/magazine/m45 = 2, - /obj/item/ammo_box/magazine/m75 = 2) - contraband = list(/obj/item/clothing/under/patriotsuit = 1, - /obj/item/bedsheet/patriot = 3) + /obj/item/ammo_box/magazine/m75 = 2, + /obj/item/reagent_containers/food/snacks/cheesyfries = 5, + /obj/item/reagent_containers/food/snacks/burger/baconburger = 5) //Premium burgers for the premium section + contraband = list(/obj/item/clothing/under/patriotsuit = 3, + /obj/item/bedsheet/patriot = 5, + /obj/item/reagent_containers/food/snacks/burger/superbite = 3) //U S A armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index c912d3dd3e..3b387f6959 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -2,8 +2,7 @@ name = "\improper Syndicate Donksoft Toy Vendor" desc = "An ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!" icon_state = "syndi" - req_access_txt = "1" - product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get perma briged!" + product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get permabrigged!" product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!" vend_reply = "Come back for more!" circuit = /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index b1a5edb867..bea449845c 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -4,25 +4,25 @@ icon_state = "med" icon_deny = "med-deny" product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" - req_access_txt = "5" - products = list(/obj/item/reagent_containers/syringe = 12, - /obj/item/reagent_containers/dropper = 3, - /obj/item/healthanalyzer = 4, - /obj/item/sensor_device = 2, + req_access = list(ACCESS_MEDICAL) + products = list(/obj/item/reagent_containers/syringe = 12, + /obj/item/reagent_containers/dropper = 3, + /obj/item/healthanalyzer = 4, + /obj/item/sensor_device = 2, /obj/item/pinpointer/crew = 2, /obj/item/reagent_containers/medspray/sterilizine = 1, - /obj/item/stack/medical/gauze = 8, - /obj/item/reagent_containers/pill/patch/styptic = 5, - /obj/item/reagent_containers/medspray/styptic = 2, - /obj/item/reagent_containers/pill/patch/silver_sulf = 5, + /obj/item/stack/medical/gauze = 8, + /obj/item/reagent_containers/pill/patch/styptic = 5, + /obj/item/reagent_containers/medspray/styptic = 2, + /obj/item/reagent_containers/pill/patch/silver_sulf = 5, /obj/item/reagent_containers/medspray/silver_sulf = 2, /obj/item/reagent_containers/pill/insulin = 10, - /obj/item/reagent_containers/pill/salbutamol = 2, - /obj/item/reagent_containers/glass/bottle/charcoal = 4, - /obj/item/reagent_containers/glass/bottle/epinephrine = 4, + /obj/item/reagent_containers/pill/salbutamol = 2, + /obj/item/reagent_containers/glass/bottle/charcoal = 4, + /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/salglu_solution = 3, - /obj/item/reagent_containers/glass/bottle/morphine = 4, - /obj/item/reagent_containers/glass/bottle/toxin = 3, + /obj/item/reagent_containers/glass/bottle/morphine = 4, + /obj/item/reagent_containers/glass/bottle/toxin = 3, /obj/item/reagent_containers/syringe/antiviral = 6) contraband = list(/obj/item/reagent_containers/pill/tox = 3, /obj/item/reagent_containers/pill/morphine = 4, @@ -36,7 +36,5 @@ refill_canister = /obj/item/vending_refill/medical /obj/item/vending_refill/medical - machine_name = "NanoMed" + machine_name = "NanoMed Plus" icon_state = "refill_medical" - charges = list(26, 5, 3)// of 76 standard, 13 contraband, 8 premium - init_charges = list(26, 5, 3) diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index 6b5005eee4..ef19ce3b9b 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -15,5 +15,8 @@ /obj/item/reagent_containers/pill/morphine = 2) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF - refill_canister = /obj/item/vending_refill/medical - refill_count = 1 + refill_canister = /obj/item/vending_refill/wallmed + +/obj/item/vending_refill/wallmed + machine_name = "NanoMed" + icon_state = "refill_medical" diff --git a/code/modules/vending/robotics.dm b/code/modules/vending/robotics.dm index 8c577d47c1..4832aa7ad7 100644 --- a/code/modules/vending/robotics.dm +++ b/code/modules/vending/robotics.dm @@ -4,7 +4,7 @@ desc = "All the tools you need to create your own robot army." icon_state = "robotics" icon_deny = "robotics-deny" - req_access_txt = "29" + req_access = list(ACCESS_ROBOTICS) products = list(/obj/item/clothing/suit/toggle/labcoat = 4, /obj/item/clothing/under/rank/roboticist = 4, /obj/item/stack/cable_coil = 4, diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 3f3035f9e4..7e90a5ce18 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -4,7 +4,7 @@ product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?" icon_state = "sec" icon_deny = "sec-deny" - req_access_txt = "1" + req_access = list(ACCESS_SECURITY) products = list(/obj/item/restraints/handcuffs = 8, /obj/item/restraints/handcuffs/cable/zipties = 10, /obj/item/grenade/flashbang = 4, diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index 8fcd189a4f..69e510ad5a 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -13,12 +13,10 @@ /obj/item/reagent_containers/food/snacks/cheesiehonkers = 6) contraband = list(/obj/item/reagent_containers/food/snacks/syndicake = 6) refill_canister = /obj/item/vending_refill/snack - var/chef_compartment_access = "28" + var/chef_compartment_access = "28" //ACCESS_KITCHEN /obj/item/vending_refill/snack machine_name = "Getmore Chocolate Corp" - charges = list(12, 2, 0)//of 36 standard, 6 contraband - init_charges = list(12, 2, 0) /obj/machinery/vending/snack/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/reagent_containers/food/snacks)) @@ -44,7 +42,7 @@ if(iscompartmentfull(user)) break if(!S.junkiness) - T.SendSignal(COMSIG_TRY_STORAGE_TAKE, S, src, TRUE) + SEND_SIGNAL(T, COMSIG_TRY_STORAGE_TAKE, S, src, TRUE) food_load(S) loaded++ else diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index fc2f9c59b9..08bb4615bb 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -2,24 +2,26 @@ name = "\improper Donksoft Toy Vendor" desc = "Ages 8 and up approved vendor that dispenses toys." icon_state = "syndi" - product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get perma briged!" + product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get permabrigged!" product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!" vend_reply = "Come back for more!" circuit = /obj/item/circuitboard/machine/vending/donksofttoyvendor - products = list(/obj/item/gun/ballistic/automatic/toy/unrestricted = 10, - /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10, - /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10, - /obj/item/toy/sword = 10, - /obj/item/ammo_box/foambox = 20, - /obj/item/toy/foamblade = 10, - /obj/item/toy/syndicateballoon = 10, - /obj/item/clothing/suit/syndicatefake = 5, - /obj/item/clothing/head/syndicatefake = 5) - contraband = list(/obj/item/gun/ballistic/shotgun/toy/crossbow = 10, - /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted = 10, - /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10, - /obj/item/toy/katana = 10, - /obj/item/twohanded/dualsaber/toy = 5) + products = list( + /obj/item/gun/ballistic/automatic/toy/unrestricted = 10, + /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10, + /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10, + /obj/item/toy/sword = 10, + /obj/item/ammo_box/foambox = 20, + /obj/item/toy/foamblade = 10, + /obj/item/toy/syndicateballoon = 10, + /obj/item/clothing/suit/syndicatefake = 5, + /obj/item/clothing/head/syndicatefake = 5) + contraband = list( + /obj/item/gun/ballistic/shotgun/toy/crossbow = 10, + /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted = 10, + /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10, + /obj/item/toy/katana = 10, + /obj/item/twohanded/dualsaber/toy = 5) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/donksoft @@ -27,5 +29,3 @@ /obj/item/vending_refill/donksoft machine_name = "Donksoft Toy Vendor" icon_state = "refill_donksoft" - charges = list(32,28,0)// of 90 standard, 75 contraband, 0 premium - init_charges = list(32,28,0) diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index f9aa8f216a..5a41beb88d 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -17,7 +17,8 @@ /obj/item/clothing/head/soft/sec = 3, /obj/item/clothing/mask/bandana/red = 3, /obj/item/clothing/under/rank/security/skirt = 3, - /obj/item/clothing/under/rank/security/grey = 3) + /obj/item/clothing/under/rank/security/grey = 3, + /obj/item/clothing/under/pants/khaki = 3) premium = list(/obj/item/clothing/under/rank/security/navyblue = 3, /obj/item/clothing/suit/security/officer = 3, /obj/item/clothing/head/beret/sec/navyofficer = 3) @@ -25,8 +26,6 @@ /obj/item/vending_refill/wardrobe/sec_wardrobe machine_name = "SecDrobe" - charges = list(10, 0, 3) - init_charges = list(10, 0, 3) /obj/machinery/vending/wardrobe/medi_wardrobe name = "\improper MediDrobe" @@ -55,8 +54,6 @@ /obj/item/vending_refill/wardrobe/medi_wardrobe machine_name = "MediDrobe" - charges = list(10, 0, 0) - init_charges = list(10, 0, 0) /obj/machinery/vending/wardrobe/engi_wardrobe name = "EngiDrobe" @@ -77,8 +74,6 @@ /obj/item/vending_refill/wardrobe/engi_wardrobe machine_name = "EngiDrobe" - charges = list(7, 0, 0) - init_charges = list(7, 0, 0) /obj/machinery/vending/wardrobe/atmos_wardrobe name = "AtmosDrobe" @@ -97,8 +92,6 @@ /obj/item/vending_refill/wardrobe/atmos_wardrobe machine_name = "AtmosDrobe" - charges = list(5, 0, 0) - init_charges = list(5, 0, 0) /obj/machinery/vending/wardrobe/cargo_wardrobe name = "CargoDrobe" @@ -116,8 +109,6 @@ /obj/item/vending_refill/wardrobe/cargo_wardrobe machine_name = "CargoDrobe" - charges = list(5, 0, 0) - init_charges = list(5, 0, 0) /obj/machinery/vending/wardrobe/robo_wardrobe name = "RoboDrobe" @@ -136,8 +127,6 @@ /obj/item/vending_refill/wardrobe/robo_wardrobe machine_name = "RoboDrobe" - charges = list(4, 0, 0) - init_charges = list(4, 0, 0) /obj/machinery/vending/wardrobe/science_wardrobe name = "SciDrobe" @@ -158,8 +147,6 @@ /obj/item/vending_refill/wardrobe/science_wardrobe machine_name = "SciDrobe" - charges = list(8, 0, 0) - init_charges = list(8, 0, 0) /obj/machinery/vending/wardrobe/hydro_wardrobe name = "Hydrobe" @@ -178,8 +165,6 @@ /obj/item/vending_refill/wardrobe/hydro_wardrobe machine_name = "HyDrobe" - charges = list(6, 0, 0) - init_charges = list(6, 0, 0) /obj/machinery/vending/wardrobe/curator_wardrobe name = "CuraDrobe" @@ -197,8 +182,6 @@ /obj/item/vending_refill/wardrobe/curator_wardrobe machine_name = "CuraDrobe" - charges = list(3, 0, 0) - init_charges = list(3, 0, 0) /obj/machinery/vending/wardrobe/bar_wardrobe name = "BarDrobe" @@ -226,8 +209,6 @@ /obj/item/vending_refill/wardrobe/bar_wardrobe machine_name = "BarDrobe" - charges = list(8, 0, 0) - init_charges = list(8, 0, 0) /obj/machinery/vending/wardrobe/chef_wardrobe name = "ChefDrobe" @@ -250,8 +231,6 @@ /obj/item/vending_refill/wardrobe/chef_wardrobe machine_name = "ChefDrobe" - charges = list(6, 0, 0) - init_charges = list(6, 0, 0) /obj/machinery/vending/wardrobe/jani_wardrobe name = "JaniDrobe" @@ -278,8 +257,6 @@ /obj/item/vending_refill/wardrobe/jani_wardrobe machine_name = "JaniDrobe" - charges = list(7, 0, 0) - init_charges = list(7, 0, 0) /obj/machinery/vending/wardrobe/law_wardrobe name = "LawDrobe" @@ -302,8 +279,6 @@ /obj/item/vending_refill/wardrobe/law_wardrobe machine_name = "LawDrobe" - charges = list(5, 0, 0) - init_charges = list(5, 0, 0) /obj/machinery/vending/wardrobe/chap_wardrobe name = "ChapDrobe" @@ -324,8 +299,6 @@ /obj/item/vending_refill/wardrobe/chap_wardrobe machine_name = "ChapDrobe" - charges = list(6, 0, 0) - init_charges = list(6, 0, 0) /obj/machinery/vending/wardrobe/chem_wardrobe name = "ChemDrobe" @@ -343,8 +316,6 @@ /obj/item/vending_refill/wardrobe/chem_wardrobe machine_name = "ChemDrobe" - charges = list(4, 0, 0) - init_charges = list(4, 0, 0) /obj/machinery/vending/wardrobe/gene_wardrobe name = "GeneDrobe" @@ -361,8 +332,6 @@ /obj/item/vending_refill/wardrobe/gene_wardrobe machine_name = "GeneDrobe" - charges = list(4, 0, 0) - init_charges = list(4, 0, 0) /obj/machinery/vending/wardrobe/viro_wardrobe name = "ViroDrobe" @@ -380,5 +349,3 @@ /obj/item/vending_refill/wardrobe/viro_wardrobe machine_name = "ViroDrobe" - charges = list(4, 0, 0) - init_charges = list(4, 0, 0) \ No newline at end of file diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm index 6c48b7a376..495d60a461 100644 --- a/code/modules/vending/youtool.dm +++ b/code/modules/vending/youtool.dm @@ -3,7 +3,6 @@ desc = "Tools for tools." icon_state = "tool" icon_deny = "tool-deny" - //req_access_txt = "12" //Maintenance access products = list(/obj/item/stack/cable_coil/random = 10, /obj/item/crowbar = 5, /obj/item/weldingtool = 3, diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 154941ce70..03d2ac3921 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -4,7 +4,7 @@ humans, butchering all other living things to \ sustain the zombie, smashing open airlock doors and opening \ child-safe caps on bottles." - flags_1 = NODROP_1|ABSTRACT_1|DROPDEL_1 + item_flags = NODROP | ABSTRACT | DROPDEL resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF icon = 'icons/effects/blood.dmi' icon_state = "bloodhand_left" From 493a35633820f8d70e274565ea22afd4ba4a751e Mon Sep 17 00:00:00 2001 From: Letter N <24603524+LetterN@users.noreply.github.com> Date: Mon, 2 Jul 2018 09:13:28 +0000 Subject: [PATCH 178/204] Update machine_circuitboards.dm --- .../game/objects/items/circuitboards/machine_circuitboards.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/game/objects/items/circuitboards/machine_circuitboards.dm b/modular_citadel/code/game/objects/items/circuitboards/machine_circuitboards.dm index 812f26748f..e70028f5eb 100644 --- a/modular_citadel/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/modular_citadel/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -1,7 +1,7 @@ /obj/item/circuitboard/machine/kinkmate name = "Kinkmate Vendor (Machine Board)" build_path = /obj/machinery/vending/kink - req_components = list(/obj/item/vending_refill/kink) + req_components = list(/obj/item/vending_refill/kink = 3) /obj/item/circuitboard/machine/autoylathe name = "Autoylathe (Machine Board)" From 6b0e597553a974705a0c1169ed501f41164e735a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 2 Jul 2018 05:23:49 -0500 Subject: [PATCH 179/204] [MIRROR] Fix circuit printer printing finished TEG machinery (#7294) * Merge pull request #38844 from AutomaticFrenzy/patch/circuits Fix circuit printer printing finished TEG machinery * Fix circuit printer printing finished TEG machinery --- code/modules/research/designs/machine_designs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index d07a922fc7..bebd65f48d 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -14,7 +14,7 @@ name = "Machine Design (Circulator Board)" desc = "The circuit board for a circulator." id = "circulator" - build_path = /obj/machinery/atmospherics/components/binary/circulator + build_path = /obj/item/circuitboard/machine/circulator category = list ("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING @@ -22,7 +22,7 @@ name = "Machine Design (TEG Board)" desc = "The circuit board for a TEG." id = "teg" - build_path = /obj/machinery/power/generator + build_path = /obj/item/circuitboard/machine/generator category = list ("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING From 028c3105b968f39a0f6ea3648559527618ced1df Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 2 Jul 2018 05:23:54 -0500 Subject: [PATCH 180/204] Automatic changelog generation for PR #7294 [ci skip] --- html/changelogs/AutoChangeLog-pr-7294.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7294.yml diff --git a/html/changelogs/AutoChangeLog-pr-7294.yml b/html/changelogs/AutoChangeLog-pr-7294.yml new file mode 100644 index 0000000000..8ac886a45d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7294.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Printing the TEG and circulator boards no longer prints the completed machinery instead." From 0500be9b35affb5a3241c7b55c740a53fe01279f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 2 Jul 2018 08:44:50 -0500 Subject: [PATCH 181/204] [MIRROR] Fixes some shard harddel stuff. (#7299) * Fixes some shard harddel stuff. (#38799) * Fixes some shard harddel stuff. --- code/game/machinery/doors/windowdoor.dm | 3 +-- code/game/objects/structures/tables_racks.dm | 3 +-- code/game/objects/structures/window.dm | 1 + 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 702583d01a..0d72a08f1f 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -38,8 +38,7 @@ /obj/machinery/door/window/Destroy() density = FALSE - for(var/I in debris) - qdel(I) + QDEL_LIST(debris) if(obj_integrity == 0) playsound(src, "shatter", 70, 1) electronics = null diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 0d7500ebf2..5ec1c31d30 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -187,8 +187,7 @@ debris += new /obj/item/shard /obj/structure/table/glass/Destroy() - for(var/i in debris) - qdel(i) + QDEL_LIST(debris) . = ..() /obj/structure/table/glass/Crossed(atom/movable/AM) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 38efe39a2d..928c0b4734 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -292,6 +292,7 @@ var/obj/item/I = i I.forceMove(drop_location()) transfer_fingerprints_to(I) + debris -= I qdel(src) update_nearby_icons() From 6873a7c06582aadad797263d9ac379f1a3860242 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 2 Jul 2018 13:04:33 -0400 Subject: [PATCH 182/204] DME and dockerfile --- .dockerignore | 29 +++++++++++++++++++++++++++++ Dockerfile | 38 ++++++++++++++++++++++++++++++++++++++ tgstation.dme | 15 ++++++--------- 3 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..783f75f657 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,29 @@ +.dockerignore +.editorconfig +.travis.yml +GPLv3.txt +LICENSE +README.md +TGS3.json +.github +.gitignore +.gitattributes +.git/hooks +.git/info +.git/modules +.git/objects +.git/refs +.vs* +tools +cfg +data +SQL +tgui/node_modules +tgstation.dmb +tgstation.int +tgstation.rsc +tgstation.lk +tgstation.dyn.rsc +libmariadb.dll +rust_g.dll +Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..ea5ee5aa3b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,38 @@ +FROM i386/ubuntu:xenial as build + +WORKDIR /rust_g + +RUN apt-get update && apt-get install -y --no-install-recommends \ + git \ + libssl-dev \ + ca-certificates \ + rustc \ + cargo \ + pkg-config \ + && git init \ + && git remote add origin https://github.com/tgstation/rust-g + +#TODO: find a way to read these from .travis.yml or a common source eventually +ENV RUST_G_VERSION=0.3.0 + +RUN git fetch --depth 1 origin $RUST_G_VERSION \ + && git checkout FETCH_HEAD \ + && cargo build --release + +FROM tgstation/byond:512.1427 + +EXPOSE 1337 + +WORKDIR /tgstation + +COPY . . + +RUN mkdir data && mkdir -p /root/.byond/bin + +VOLUME [ "/tgstation/config", "/tgstation/data" ] + +RUN DreamMaker -max_errors 0 tgstation.dme + +COPY --from=build /rust_g/target/release/librust_g.so /root/.byond/bin/rust_g + +ENTRYPOINT [ "DreamDaemon", "tgstation.dmb", "-port", "1337", "-trusted", "-close", "-verbose" ] diff --git a/tgstation.dme b/tgstation.dme index 2f01b98c5a..c3578c4ac2 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -70,6 +70,7 @@ #include "code\__DEFINES\radiation.dm" #include "code\__DEFINES\radio.dm" #include "code\__DEFINES\reagents.dm" +#include "code\__DEFINES\reagents_specific_heat.dm" #include "code\__DEFINES\research.dm" #include "code\__DEFINES\robots.dm" #include "code\__DEFINES\role_preferences.dm" @@ -331,6 +332,7 @@ #include "code\datums\components\earprotection.dm" #include "code\datums\components\edit_complainer.dm" #include "code\datums\components\empprotection.dm" +#include "code\datums\components\forced_gravity.dm" #include "code\datums\components\forensics.dm" #include "code\datums\components\infective.dm" #include "code\datums\components\jousting.dm" @@ -352,6 +354,7 @@ #include "code\datums\components\stationloving.dm" #include "code\datums\components\swarming.dm" #include "code\datums\components\thermite.dm" +#include "code\datums\components\uplink.dm" #include "code\datums\components\wearertargeting.dm" #include "code\datums\components\wet_floor.dm" #include "code\datums\components\decals\blood.dm" @@ -841,6 +844,7 @@ #include "code\game\objects\items\devices\radio\headset.dm" #include "code\game\objects\items\devices\radio\intercom.dm" #include "code\game\objects\items\devices\radio\radio.dm" +#include "code\game\objects\items\grenades\antigravity.dm" #include "code\game\objects\items\grenades\chem_grenade.dm" #include "code\game\objects\items\grenades\clusterbuster.dm" #include "code\game\objects\items\grenades\emgrenade.dm" @@ -1153,6 +1157,7 @@ #include "code\modules\antagonists\changeling\powers\mimic_voice.dm" #include "code\modules\antagonists\changeling\powers\mutations.dm" #include "code\modules\antagonists\changeling\powers\panacea.dm" +#include "code\modules\antagonists\changeling\powers\pheromone_receptors.dm" #include "code\modules\antagonists\changeling\powers\regenerate.dm" #include "code\modules\antagonists\changeling\powers\revive.dm" #include "code\modules\antagonists\changeling\powers\shriek.dm" @@ -1405,12 +1410,10 @@ #include "code\modules\clothing\glasses\_glasses.dm" #include "code\modules\clothing\glasses\engine_goggles.dm" #include "code\modules\clothing\glasses\hud.dm" -#include "code\modules\clothing\glasses\vg_glasses.dm" #include "code\modules\clothing\gloves\_gloves.dm" #include "code\modules\clothing\gloves\boxing.dm" #include "code\modules\clothing\gloves\color.dm" #include "code\modules\clothing\gloves\miscellaneous.dm" -#include "code\modules\clothing\gloves\vg_gloves.dm" #include "code\modules\clothing\head\_head.dm" #include "code\modules\clothing\head\beanie.dm" #include "code\modules\clothing\head\cit_hats.dm" @@ -1421,14 +1424,12 @@ #include "code\modules\clothing\head\misc.dm" #include "code\modules\clothing\head\misc_special.dm" #include "code\modules\clothing\head\soft_caps.dm" -#include "code\modules\clothing\head\vg_hats.dm" #include "code\modules\clothing\masks\_masks.dm" #include "code\modules\clothing\masks\boxing.dm" #include "code\modules\clothing\masks\breath.dm" #include "code\modules\clothing\masks\gasmask.dm" #include "code\modules\clothing\masks\hailer.dm" #include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\masks\vg_masks.dm" #include "code\modules\clothing\neck\_neck.dm" #include "code\modules\clothing\outfits\ert.dm" #include "code\modules\clothing\outfits\event.dm" @@ -1439,7 +1440,6 @@ #include "code\modules\clothing\shoes\colour.dm" #include "code\modules\clothing\shoes\magboots.dm" #include "code\modules\clothing\shoes\miscellaneous.dm" -#include "code\modules\clothing\shoes\vg_shoes.dm" #include "code\modules\clothing\spacesuits\_spacesuits.dm" #include "code\modules\clothing\spacesuits\chronosuit.dm" #include "code\modules\clothing\spacesuits\flightsuit.dm" @@ -1447,7 +1447,6 @@ #include "code\modules\clothing\spacesuits\miscellaneous.dm" #include "code\modules\clothing\spacesuits\plasmamen.dm" #include "code\modules\clothing\spacesuits\syndi.dm" -#include "code\modules\clothing\spacesuits\vg_spess.dm" #include "code\modules\clothing\suits\_suits.dm" #include "code\modules\clothing\suits\armor.dm" #include "code\modules\clothing\suits\bio.dm" @@ -1458,7 +1457,6 @@ #include "code\modules\clothing\suits\reactive_armour.dm" #include "code\modules\clothing\suits\toggles.dm" #include "code\modules\clothing\suits\utility.dm" -#include "code\modules\clothing\suits\vg_suits.dm" #include "code\modules\clothing\suits\wiz_robe.dm" #include "code\modules\clothing\under\_under.dm" #include "code\modules\clothing\under\accessories.dm" @@ -1468,7 +1466,6 @@ #include "code\modules\clothing\under\shorts.dm" #include "code\modules\clothing\under\syndicate.dm" #include "code\modules\clothing\under\trek.dm" -#include "code\modules\clothing\under\vg_under.dm" #include "code\modules\clothing\under\jobs\civilian.dm" #include "code\modules\clothing\under\jobs\engineering.dm" #include "code\modules\clothing\under\jobs\medsci.dm" @@ -1549,6 +1546,7 @@ #include "code\modules\events\wizard\shuffle.dm" #include "code\modules\events\wizard\summons.dm" #include "code\modules\fields\fields.dm" +#include "code\modules\fields\gravity.dm" #include "code\modules\fields\peaceborg_dampener.dm" #include "code\modules\fields\timestop.dm" #include "code\modules\fields\turf_objects.dm" @@ -2606,7 +2604,6 @@ #include "code\modules\tgui\states\zlevel.dm" #include "code\modules\tooltip\tooltip.dm" #include "code\modules\unit_tests\_unit_tests.dm" -#include "code\modules\uplink\uplink.dm" #include "code\modules\uplink\uplink_devices.dm" #include "code\modules\uplink\uplink_items.dm" #include "code\modules\uplink\uplink_purchase_log.dm" From f986f9c9f21d84f057ea7f725feff1ead75a1c58 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 2 Jul 2018 15:35:11 -0400 Subject: [PATCH 183/204] makes it compile. should work. hopefully --- code/controllers/subsystem/job.dm | 7 +++++-- code/controllers/subsystem/timer.dm | 3 +++ code/game/objects/items/devices/dogborg_sleeper.dm | 2 +- code/modules/mob/inventory.dm | 2 +- code/modules/mob/living/carbon/carbon_defense.dm | 2 +- code/modules/mob/living/carbon/human/species.dm | 6 +++--- code/modules/mob/living/silicon/robot/inventory.dm | 2 +- modular_citadel/code/controllers/subsystem/job.dm | 1 - modular_citadel/code/game/machinery/vending.dm | 6 ------ modular_citadel/code/game/objects/ids.dm | 2 +- .../code/game/objects/items/melee/eutactic_blades.dm | 6 +++--- modular_citadel/code/game/objects/items/vending_items.dm | 2 -- .../code/modules/custom_loadout/custom_items.dm | 4 ++-- .../code/modules/custom_loadout/load_to_mob.dm | 2 +- modular_citadel/code/modules/mob/living/carbon/carbon.dm | 2 +- .../code/modules/mob/living/carbon/human/species.dm | 2 +- .../modules/mob/living/silicon/robot/dogborg_equipment.dm | 8 ++++---- .../modules/reagents/chemistry/reagents/other_reagents.dm | 2 +- tgstation.dme | 8 ++++++++ 19 files changed, 37 insertions(+), 32 deletions(-) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 36fd630789..744845e6ed 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -362,7 +362,7 @@ SUBSYSTEM_DEF(job) var/allowed_to_be_a_loser = !jobban_isbanned(player, SSjob.overflow_role) if(QDELETED(player) || !allowed_to_be_a_loser) RejectPlayer(player) - else + else if(!AssignRole(player, SSjob.overflow_role)) RejectPlayer(player) else if(player.client.prefs.joblessrole == BERANDOMJOB) @@ -437,7 +437,10 @@ SUBSYSTEM_DEF(job) to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.") if(job && H) + if(job.dresscodecompliant)// CIT CHANGE - dress code compliance + equip_loadout(N, H) // CIT CHANGE - allows players to spawn with loadout items job.after_spawn(H, M, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not. + equip_loadout(N, H, TRUE)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works return H @@ -631,4 +634,4 @@ SUBSYSTEM_DEF(job) . |= player.mind /datum/controller/subsystem/job/proc/JobDebug(message) - log_job_debug(message) \ No newline at end of file + log_job_debug(message) diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 5866575809..9ce2dd297c 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -512,6 +512,9 @@ SUBSYSTEM_DEF(timer) return TRUE return FALSE +/datum/controller/subsystem/timer/proc/tump_buckets() + reset_buckets() + SSticker.tumpedbuckets = TRUE #undef BUCKET_LEN #undef BUCKET_POS diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index b21ba58380..e12344fa53 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -48,7 +48,7 @@ /obj/item/dogborg/sleeper/New() ..() update_icon() - flags_1 |= NOBLUDGEON_1 //No more attack messages + item_flags |= NOBLUDGEON //No more attack messages /obj/item/dogborg/sleeper/Exit(atom/movable/O) return 0 diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 20bd69ae40..494536ebfa 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -200,7 +200,7 @@ /mob/proc/put_in_hand_check(obj/item/I) - if(incapacitated() && !(I.flags_1&ABSTRACT_1)) //Cit change - Changes lying to incapacitated so that it's plausible to pick things up while on the ground + if(incapacitated() && !(I.item_flags&ABSTRACT)) //Cit change - Changes lying to incapacitated so that it's plausible to pick things up while on the ground return FALSE if(!istype(I)) return FALSE diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index ebe078ac21..7929a00357 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -279,7 +279,7 @@ emote("wag") else if(dna && dna.species && ("mam_tail" in dna.species.mutant_bodyparts) && (dna.features["mam_tail"])!= "None") emote("wag") - SendSignal(COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat) else M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 34c243a4ba..ac1611b676 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1422,7 +1422,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(target.w_uniform) target.w_uniform.add_fingerprint(user) //var/randomized_zone = ran_zone(user.zone_selected) CIT CHANGE - comments out to prevent compiling errors - target.SendSignal(COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected) + SEND_SIGNAL(target, COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected) //var/obj/item/bodypart/affecting = target.get_bodypart(randomized_zone) CIT CHANGE - comments this out to prevent compile errors due to the below commented out bit var/randn = rand(1, 100) /*if(randn <= 25) CITADEL CHANGE - moves disarm push attempts to right click @@ -1705,10 +1705,10 @@ GLOBAL_LIST_EMPTY(roundstart_races) // +/- 50 degrees from 310K is the 'safe' zone, where no damage is dealt. if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTHEAT)) //Body temperature is too hot. - + SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold") SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "hot", /datum/mood_event/hot) - + var/burn_damage switch(H.bodytemperature) if(BODYTEMP_HEAT_DAMAGE_LIMIT to 400) diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 1e24259986..aa710e2644 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -16,6 +16,7 @@ sight_mode &= ~S.sight_mode update_sight() else if(istype(O, /obj/item/storage/bag/tray/)) + SEND_SIGNAL(O, COMSIG_TRY_STORAGE_QUICK_EMPTY) //CITADEL EDIT reee proc, Dogborg modules if(istype(O,/obj/item/gun/energy/laser/cyborg)) laser = FALSE @@ -30,7 +31,6 @@ var/obj/item/dogborg/sleeper/S = O S.go_out() //this should stop edgecase deletions //END CITADEL EDIT - SEND_SIGNAL(O, COMSIG_TRY_STORAGE_QUICK_EMPTY) if(client) client.screen -= O observer_screen_update(O,FALSE) diff --git a/modular_citadel/code/controllers/subsystem/job.dm b/modular_citadel/code/controllers/subsystem/job.dm index 749d7e1e72..303e1b626d 100644 --- a/modular_citadel/code/controllers/subsystem/job.dm +++ b/modular_citadel/code/controllers/subsystem/job.dm @@ -29,7 +29,6 @@ /datum/controller/subsystem/job/proc/FreeRole(rank) if(!rank) return - Debug("Freeing role: [rank]") var/datum/job/job = GetJob(rank) if(!job) return FALSE diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm index c4c0c10e69..d2e12c3498 100755 --- a/modular_citadel/code/game/machinery/vending.dm +++ b/modular_citadel/code/game/machinery/vending.dm @@ -117,17 +117,11 @@ machine_name = "KinkMate" icon = 'modular_citadel/icons/vending_restock.dmi' icon_state = "refill_kink" - charges = list(8, 5, 1)// of 20 standard, 12 contraband, 3 premium - init_charges = list(8, 5, 1) /obj/item/vending_refill/nazi machine_name = "nazivend" icon_state = "refill_nazi" - charges = list(33, 13, 0) - init_charges = list(33, 13, 0) /obj/item/vending_refill/soviet machine_name = "sovietvend" icon_state = "refill_soviet" - charges = list(47, 7, 0) - init_charges = list(47, 7, 0) diff --git a/modular_citadel/code/game/objects/ids.dm b/modular_citadel/code/game/objects/ids.dm index c2cc378079..5d67c18416 100644 --- a/modular_citadel/code/game/objects/ids.dm +++ b/modular_citadel/code/game/objects/ids.dm @@ -52,7 +52,7 @@ desc = "A small cell with two prongs lazily jabbed into it. It looks like it's made for charging the small batteries found in electromagnetic devices." icon = 'icons/obj/module.dmi' icon_state = "cell_mini" - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON var/uses = 5 //Dictates how many charges the device adds to compatible items /obj/item/emagrecharge/examine(mob/user) diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm index 4138617138..bdd193c477 100644 --- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm +++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm @@ -206,8 +206,8 @@ /obj/item/toy/sword/cx/attackby(obj/item/W, mob/living/user, params) if(istype(W, /obj/item/toy/sword/cx)) - if((W.flags_1 & NODROP_1) || (flags_1 & NODROP_1)) - to_chat(user, "\the [flags_1 & NODROP_1 ? src : W] is stuck to your hand, you can't attach it to \the [flags_1 & NODROP_1 ? W : src]!") + if((W.item_flags & NODROP) || (item_flags & NODROP)) + to_chat(user, "\the [item_flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [item_flags & NODROP ? W : src]!") return else to_chat(user, "You combine the two plastic swords, making a single supermassive toy! You're fake-cool.") @@ -307,7 +307,7 @@ var/mob/M = loc M.update_inv_hands() - SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)//blood overlays get weird otherwise, because the sprite changes. (retained from original desword because I have no idea what this is) + SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)//blood overlays get weird otherwise, because the sprite changes. (retained from original desword because I have no idea what this is) /obj/item/twohanded/hypereutactic/AltClick(mob/living/user) if(!in_range(src, user)) //Basic checks to prevent abuse diff --git a/modular_citadel/code/game/objects/items/vending_items.dm b/modular_citadel/code/game/objects/items/vending_items.dm index d2347579d1..db1fdb48cf 100755 --- a/modular_citadel/code/game/objects/items/vending_items.dm +++ b/modular_citadel/code/game/objects/items/vending_items.dm @@ -1,5 +1,3 @@ /obj/item/vending_refill/medical machine_name = "NanoMed" icon_state = "refill_medical" - charges = list(32, 5, 3)// of 95 standard, 13 contraband, 8 premium - init_charges = list(32, 5, 3) \ No newline at end of file diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index 81c8df40ee..38996ff76d 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/custom.dmi' icon_state = "cebu" w_class = WEIGHT_CLASS_TINY - flags_1 = NOBLUDGEON_1 + item_flags = NOBLUDGEON /obj/item/soap/cebu //real versions, for admin shenanigans. Adminspawn only desc = "A bright blue bar of soap that smells of wolves" @@ -338,7 +338,7 @@ blood_overlay_type = "armor" dog_fashion = /datum/dog_fashion/back armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - + /obj/item/clothing/neck/cloak/green name = "Generic Green Cloak" diff --git a/modular_citadel/code/modules/custom_loadout/load_to_mob.dm b/modular_citadel/code/modules/custom_loadout/load_to_mob.dm index 0a1d8256ae..79f17afc74 100644 --- a/modular_citadel/code/modules/custom_loadout/load_to_mob.dm +++ b/modular_citadel/code/modules/custom_loadout/load_to_mob.dm @@ -54,7 +54,7 @@ var/obj/item/loaded = loaded_atom var/obj/item/storage/S = H.get_item_by_slot(SLOT_BACK) if(istype(S)) - S.SendSignal(COMSIG_TRY_STORAGE_INSERT,loaded, TRUE, H) //Force it into their backpack + SEND_SIGNAL(S, COMSIG_TRY_STORAGE_INSERT,loaded, TRUE, H) //Force it into their backpack continue if(!H.put_in_hands(loaded)) //They don't have one/somehow that failed, put it in their hands loaded.forceMove(T) //Guess we're just dumping it on the floor! diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm index 2fcf5a4c9d..cf5ce03bc7 100644 --- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm +++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm @@ -27,7 +27,7 @@ if(hud_used && hud_used.static_inventory) for(var/obj/screen/combattoggle/selector in hud_used.static_inventory) selector.rebasetointerbay(src) - SendSignal(COMSIG_COMBAT_TOGGLED, src, combatmode) + SEND_SIGNAL(src, COMSIG_COMBAT_TOGGLED, src, combatmode) return TRUE /mob/living/carbon/Move(atom/newloc, direct = 0) diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species.dm b/modular_citadel/code/modules/mob/living/carbon/human/species.dm index e6f863d7bb..ac88674c6a 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species.dm @@ -35,7 +35,7 @@ if(target.w_uniform) target.w_uniform.add_fingerprint(user) var/randomized_zone = ran_zone(user.zone_selected) - target.SendSignal(COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected) + SEND_SIGNAL(target, COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected) var/obj/item/bodypart/affecting = target.get_bodypart(randomized_zone) var/randn = rand(1, 100) if(user.resting) diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm index 41b5c2c2f6..496a723d08 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm @@ -182,7 +182,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! /obj/item/soap/tongue/New() ..() - flags_1 |= NOBLUDGEON_1 //No more attack messages + item_flags |= NOBLUDGEON //No more attack messages /obj/item/trash/rkibble name = "robo kibble" @@ -258,7 +258,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! to_chat(R,"You clean \the [target.name].") var/obj/effect/decal/cleanable/C = locate() in target qdel(C) - SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) else if(ishuman(target)) if(R.emagged) var/mob/living/L = target @@ -293,7 +293,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! to_chat(R, "You clean \the [target.name].") var/obj/effect/decal/cleanable/C = locate() in target qdel(C) - SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) return @@ -318,7 +318,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! /obj/item/dogborg/pounce/New() ..() - flags_1 |= NOBLUDGEON_1 + item_flags |= NOBLUDGEON /mob/living/silicon/robot var/leaping = 0 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm index 0b57c621f2..68be5987da 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -4,4 +4,4 @@ else if(O) O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - O.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) diff --git a/tgstation.dme b/tgstation.dme index c3578c4ac2..a296c275a1 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1410,10 +1410,12 @@ #include "code\modules\clothing\glasses\_glasses.dm" #include "code\modules\clothing\glasses\engine_goggles.dm" #include "code\modules\clothing\glasses\hud.dm" +#include "code\modules\clothing\glasses\vg_glasses.dm" #include "code\modules\clothing\gloves\_gloves.dm" #include "code\modules\clothing\gloves\boxing.dm" #include "code\modules\clothing\gloves\color.dm" #include "code\modules\clothing\gloves\miscellaneous.dm" +#include "code\modules\clothing\gloves\vg_gloves.dm" #include "code\modules\clothing\head\_head.dm" #include "code\modules\clothing\head\beanie.dm" #include "code\modules\clothing\head\cit_hats.dm" @@ -1424,12 +1426,14 @@ #include "code\modules\clothing\head\misc.dm" #include "code\modules\clothing\head\misc_special.dm" #include "code\modules\clothing\head\soft_caps.dm" +#include "code\modules\clothing\head\vg_hats.dm" #include "code\modules\clothing\masks\_masks.dm" #include "code\modules\clothing\masks\boxing.dm" #include "code\modules\clothing\masks\breath.dm" #include "code\modules\clothing\masks\gasmask.dm" #include "code\modules\clothing\masks\hailer.dm" #include "code\modules\clothing\masks\miscellaneous.dm" +#include "code\modules\clothing\masks\vg_masks.dm" #include "code\modules\clothing\neck\_neck.dm" #include "code\modules\clothing\outfits\ert.dm" #include "code\modules\clothing\outfits\event.dm" @@ -1440,6 +1444,7 @@ #include "code\modules\clothing\shoes\colour.dm" #include "code\modules\clothing\shoes\magboots.dm" #include "code\modules\clothing\shoes\miscellaneous.dm" +#include "code\modules\clothing\shoes\vg_shoes.dm" #include "code\modules\clothing\spacesuits\_spacesuits.dm" #include "code\modules\clothing\spacesuits\chronosuit.dm" #include "code\modules\clothing\spacesuits\flightsuit.dm" @@ -1447,6 +1452,7 @@ #include "code\modules\clothing\spacesuits\miscellaneous.dm" #include "code\modules\clothing\spacesuits\plasmamen.dm" #include "code\modules\clothing\spacesuits\syndi.dm" +#include "code\modules\clothing\spacesuits\vg_spess.dm" #include "code\modules\clothing\suits\_suits.dm" #include "code\modules\clothing\suits\armor.dm" #include "code\modules\clothing\suits\bio.dm" @@ -1457,6 +1463,7 @@ #include "code\modules\clothing\suits\reactive_armour.dm" #include "code\modules\clothing\suits\toggles.dm" #include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\vg_suits.dm" #include "code\modules\clothing\suits\wiz_robe.dm" #include "code\modules\clothing\under\_under.dm" #include "code\modules\clothing\under\accessories.dm" @@ -1466,6 +1473,7 @@ #include "code\modules\clothing\under\shorts.dm" #include "code\modules\clothing\under\syndicate.dm" #include "code\modules\clothing\under\trek.dm" +#include "code\modules\clothing\under\vg_under.dm" #include "code\modules\clothing\under\jobs\civilian.dm" #include "code\modules\clothing\under\jobs\engineering.dm" #include "code\modules\clothing\under\jobs\medsci.dm" From 7f0c82b0ba3cf3477092a266ec8b37d0b6dc9ec4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Jul 2018 11:14:00 -0500 Subject: [PATCH 184/204] [MIRROR] SDQL where filter message is now correct (#7309) * Merge pull request #38853 from optimumtact/seequeuedeeall SDQL where filter message is now correct * SDQL where filter message is now correct --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index a19ab3c100..54af4b5167 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -54,6 +54,7 @@ return var/list/refs = list() + var/where_used = FALSE for(var/list/query_tree in querys) var/list/from_objs = list() var/list/select_types = list() @@ -82,6 +83,7 @@ objs_all = objs.len if("where" in query_tree) + where_used = TRUE var/objs_temp = objs objs = list() for(var/datum/d in objs_temp) @@ -119,7 +121,7 @@ var/end_time = REALTIMEOFDAY end_time -= start_time return list("SDQL query results: [query_text]",\ - "SDQL query completed: [objs_all] objects selected by path, and [objs_eligible] objects executed on after WHERE filtering if applicable.",\ + "SDQL query completed: [objs_all] objects selected by path, and [where_used ? objs_eligible : objs_all] objects executed on after WHERE filtering if applicable.",\ "SDQL query took [DisplayTimeText(end_time)] to complete.") + refs /proc/SDQL_qdel_datum(datum/d) From 22e56253d065173d8ac636d83ca2c1f765cd5431 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Jul 2018 11:14:26 -0500 Subject: [PATCH 185/204] [MIRROR] Fixes gravity gun runtimes. (#7310) * Merge pull request #38867 from AnturK/gravgun Fixes gravity gun runtimes. * Fixes gravity gun runtimes. --- code/modules/projectiles/ammunition/energy/gravity.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/projectiles/ammunition/energy/gravity.dm b/code/modules/projectiles/ammunition/energy/gravity.dm index f549a5b5e4..be3a4494cd 100644 --- a/code/modules/projectiles/ammunition/energy/gravity.dm +++ b/code/modules/projectiles/ammunition/energy/gravity.dm @@ -7,8 +7,8 @@ var/obj/item/gun/energy/gravity_gun/gun /obj/item/ammo_casing/energy/gravityrepulse/Initialize(mapload, obj/item/gun/energy/gravity_gun/G) - . = ..() gun = G + . = ..() /obj/item/ammo_casing/energy/gravityattract projectile_type = /obj/item/projectile/gravityattract @@ -20,8 +20,8 @@ /obj/item/ammo_casing/energy/gravityattract/Initialize(mapload, obj/item/gun/energy/gravity_gun/G) - . = ..() gun = G + . = ..() /obj/item/ammo_casing/energy/gravitychaos projectile_type = /obj/item/projectile/gravitychaos @@ -32,5 +32,5 @@ var/obj/item/gun/energy/gravity_gun/gun /obj/item/ammo_casing/energy/gravitychaos/Initialize(mapload, obj/item/gun/energy/gravity_gun/G) - . = ..() gun = G + . = ..() From abc32ed0df5aafbe4106a5a9cc9f87072b32ed32 Mon Sep 17 00:00:00 2001 From: Letter N <24603524+LetterN@users.noreply.github.com> Date: Wed, 4 Jul 2018 20:37:01 +0800 Subject: [PATCH 186/204] adds "cap's female formal outfit" (#7307) * Update under.dm * modifies cit_clothes.dmi * Updates uniforms.dmi * Update security.dm * now wont remove other clothing stuff (TM) * Add files via upload * Update under.dm --- .../crates_lockers/closets/secure/security.dm | 1 + .../code/modules/clothing/under/under.dm | 14 +++++++++++++- .../icons/mob/citadel/uniforms.dmi | Bin 52294 -> 55094 bytes .../icons/obj/clothing/cit_clothes.dmi | Bin 795 -> 2077 bytes 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 4ce98bec52..64f22c555a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -20,6 +20,7 @@ new /obj/item/clothing/suit/armor/vest/capcarapace/alt(src) new /obj/item/clothing/head/caphat/parade(src) new /obj/item/clothing/suit/captunic(src) + new /obj/item/clothing/under/rank/captain/femformal(src) //citadel edit new /obj/item/clothing/head/crown/fancy(src) new /obj/item/cartridge/captain(src) new /obj/item/storage/box/silver_ids(src) diff --git a/modular_citadel/code/modules/clothing/under/under.dm b/modular_citadel/code/modules/clothing/under/under.dm index 7ab8362a83..94c28fb1c3 100644 --- a/modular_citadel/code/modules/clothing/under/under.dm +++ b/modular_citadel/code/modules/clothing/under/under.dm @@ -30,4 +30,16 @@ icon_state = "tssuit" alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi' item_state = "r_suit" - can_adjust = FALSE \ No newline at end of file + can_adjust = FALSE + +/obj/item/clothing/under/rank/captain/femformal + name ="captain's female formal outfit" + desc = "" + icon = 'modular_citadel/icons/obj/clothing/cit_clothes.dmi' + icon_state = "lewdcap" + icon_override = 'modular_citadel/icons/mob/citadel/uniforms.dmi' + item_state = "lewdcap" + item_color = "lewdcap" + can_adjust = FALSE + sensor_mode = SENSOR_COORDS //it's still a captain's suit nerd + random_sensor = FALSE diff --git a/modular_citadel/icons/mob/citadel/uniforms.dmi b/modular_citadel/icons/mob/citadel/uniforms.dmi index f34bfd6e453ddf5d75e8f288db3d04ddd6650fd7..855872e9ab66051951621e942cb91e23c71d7d81 100644 GIT binary patch literal 55094 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 b($)GdQW49WkfQ*9djTBu@ZDdA4N3VgAYGA~ literal 52294 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 S5DEbNkrI;^E%|KV_kRGo=JtvJ diff --git a/modular_citadel/icons/obj/clothing/cit_clothes.dmi b/modular_citadel/icons/obj/clothing/cit_clothes.dmi index 01ad0d37f9054447ae1dbe53f03d50eb05531f52..8cc6ca2950316e64c19c81363327f03c30303fff 100644 GIT binary patch delta 2075 zcmV+$2;}#h2AvR)8Gi-<0063Kaozv`0Ec>1Sad{Xb7OL8aCB*JZU6vyoQ=vm4#F@H zMbX-`il?MU{8~525pt32!HNew;uGW<$o45B(IM#Wl}?L8cZ>r4J-)dX z-4GD^NN-|&K2S5KPE!B?2T@5xK~#90?U`*%Th|%Ke@+cE#^4Za6G+H4WuP%BjSyvv zC!}O+)Kr?ZEFYGdl!X$ZlqylW$|{vAnwO=m6e7MY+MrnxRaD5TiBCw*MpW9NmO05e1!41Wxa!I+o$?t|ky2r1kP_O96clPur!a?g35|9QRVXu7((_$4r z*D9;UTQz4kY{+_K_ScFB(mxg-Ix9s%5G1ENIyyu_5Px{+tP~HVe=KJ9*DA6>BX=u& ztLBV&C`k*zz~eBVO#F+zGYkC1kj%-<9X$VBM9a>_C0_c~FEmPwkVA8GvshYM%Fxgd zE|-gn!9lL)k9DJ*|)`l0)dmW zK?dhS3_K145fKcARLS{)$6+ZwmLfRqcJZ|j_b@y>%$+-T7#<#$MA)s>O3p7&f9=CP zvPICYmmz(0jJ}y!42D#OM#uOh6awG_i%H5;=YJcQo(EENk|?pjd-yP)x-Iy8K6-k3 zFq_S|TrTW(J3nkM!*g4pt*s4!v9U4s@88d-9Kd(jC#(E5ExlE9M*P5H;&^g0qoa=i zIG7RX_RBe$xr2il+X3jBoQl~{h>rWH^8oqz`PghW06LC#17Ne+$j{FQpr@w?pU+2W zX@4or&CTo9ziv}?E-ukEIYrxzR%v2+x`mgAFWtDViHfjU_Bx$duUx^_*-2w#qg1~j z2rKd}4>vY8YHXdISg%}RuhY419cvDO!MPAaPrAHPx+bRpcxgj#N64wtArxdW{a_RT zv)PQrVtHm>i^YQ3Yz83xr`i?ot;L!GRDZWz+t6}$>BjY#EQ2|(v}h)Poc#E`x1rf8 zx)OX{_`ikcop&}}#=5J((+tjqAVtSOILwcL&gJoO#_RQR)9FN~)1gaA;c8`w(=9qe zb9013A!dU?#bqiIAhJgB(*NFq1>CI# zT)l0R_5(^#GzZMg%xo%sGt|}9iFUhP3P+c|FXvA1*S-gw{$6BrR99E0Xzw9Q0EfdN znoK4P1_SUPN1y&T7z~(9CL9h&+<(3bT`t$ExHp@VB@upEwVZ*SP%>|0G{basiru*i?mJ&gh z0PbVw#G-6J0FV5Uqvy$Bl7Ez*pbu3lBf_dYa*-v##mnb4<~_NLdPfNP1C0H1m?5{D zU~m?IeG@jx`5#!txQ+j;3onwEmx1@*G=)b5YRlWj!XpCSd())lWsr5@Ma5+*S_W%Q zoD%i=RD!`-eiqtEhJSvMoyH)K{CY`%@~)5KHu=?-w~PK_GrFCT3!2cQnHA5*zA@@s zk1DEP@$GPwsPk%&loAZYl_R1-2-Y)oRTJ&tn6K!_m03M==G@t!xIo$9e-&(_?{TAVQ{^_nybGv zllCBkhJq%}&Q;M+&_rqdDFTC&82iVlS6HTO0kX1pG3p%wKxa%t?@uMoxE-A_jgUV8 zz^HeGA!z}U%@x|wh-XYM}N!sp8_<{#NE69;MeBDFW{)6GB-2_ z47uF^1cS5a{eP*_Y5-4mfg34QCYRi)7xFG2ybzrXqm$p@qW3~h4hNK$CtHAvm(Od? zzk5*(_@`*hNa4QMNS|+sVvCld?6CB46z45)vB_-Cn-2fplQLkj&T)v8flj8=eIC;` z^XtHNr3EG~N7Xh!Z4v^gZGhS&1W?-mwMht|wgGDMZxp*#7b0mCGO+*v002ovPDHLk FV1lTH2fzRT delta 783 zcmV+q1MvKv5Ss>&8Gi!+005o0f$RVP0F6*gR7JqRz;$(XeJCtkA0#~&9MhdP|IS;c zcpsFMl))`9pDHeD3l?8rUpzcKm>U}}E-@n_CU_Val9G~CQ&6-YA15a#7#A6g7Z)QV zBQ7m1HZ?UqK0Y%uGgDJjM@L7%z`$n!I+zwd!7ne=T|}uMIe#)JF+Vp!|Nd`BMowa8 zXsT=wTNePol^uFB04N?NgL?q!00001bW%=J06^y0W&i*HdU{k?bVOxyV{&P5bZKvH z004NLQ&wi#Lxqmo2v#3Ogi!&v&s2C_@$i-|70YD!r zffL>d!4^!24)dElJU?i@1Yntm2%PZ_M%FUoC%4;>=QM-QFJYQp19t5ygAV|ZvQ@jg z1{CxU0Dq-d`Kqik?7s&PG5rPf2?*;G5YfjTd;wrz0*c(LhynJ8hsW~q;joVZ`X}o3 z)JO7%Zr|;zt~*5i?}`uvK`U_+Vu0hte+&ZzR?h^B61@L7wFm)j4?qo(*Vy;{1i%8*AeGV@6=Px# N00>D%PDHLkV1jcGN6G*I From cc628a905e4ab397eb0a5a18ebc1e114979e1227 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Wed, 4 Jul 2018 16:41:55 -0400 Subject: [PATCH 187/204] two major fixes - fixes flavortext and right click exploit --- code/modules/mob/living/carbon/human/human.dm | 2 +- modular_citadel/code/_onclick/click.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index de8542094b..51a606792c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -274,7 +274,7 @@ // Display a warning if the user mocks up to_chat(src, "You feel your [pocket_side] pocket being fumbled with!") - ..() + ..() //CITADEL CHANGE - removes a tab from behind this ..() so that flavortext can actually be examined ///////HUDs/////// diff --git a/modular_citadel/code/_onclick/click.dm b/modular_citadel/code/_onclick/click.dm index 04e763313d..f077b3a71b 100644 --- a/modular_citadel/code/_onclick/click.dm +++ b/modular_citadel/code/_onclick/click.dm @@ -34,7 +34,7 @@ //These are always reachable. //User itself, current loc, and user inventory - if(DirectAccess(A)) + if(A in DirectAccess()) if(W) W.rightclick_melee_attack_chain(src, A, params) else From 7673384890df20635ceae6e3a4d4830b1b91fdd4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 4 Jul 2018 19:40:10 -0500 Subject: [PATCH 188/204] [MIRROR] [s] Fixes announcement XSS (#7324) * [s] Fixes announcement XSS * Merge pull request #38892 from ThatLing/robots-are-very-delicate [s] Fixes announcement XSS --- code/__HELPERS/priority_announce.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index 9b6b601e69..bbaf7b275d 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -55,7 +55,7 @@ for(var/mob/M in GLOB.player_list) if(!isnewplayer(M) && M.can_hear()) - to_chat(M, "[title]
    [message]

    ") + to_chat(M, "[html_encode(title)]
    [html_encode(message)]

    ") if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS) if(alert) SEND_SOUND(M, sound('sound/misc/notice1.ogg')) From 06d08c67c317dd4cfd7e7599542b09a0fabfa46f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 4 Jul 2018 20:38:53 -0500 Subject: [PATCH 189/204] [MIRROR] Makes tear in the fabric of reality inaccessible until a boh bomb is detonated (#7327) * Makes tear in the fabric of reality inaccessible until a boh bomb is detonated (#38852) * a commit message * reviews addressed? * Makes tear in the fabric of reality inaccessible until a boh bomb is detonated --- code/__DEFINES/turf_flags.dm | 5 +-- .../storage/concrete/bag_of_holding.dm | 2 ++ code/game/machinery/navbeacon.dm | 12 +++++-- code/game/objects/structures/ladders.dm | 33 +++++++++++++++---- code/game/turfs/change_turf.dm | 21 ++++++++++-- 5 files changed, 60 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/turf_flags.dm b/code/__DEFINES/turf_flags.dm index f71335e1f0..5ceb6f2e2e 100644 --- a/code/__DEFINES/turf_flags.dm +++ b/code/__DEFINES/turf_flags.dm @@ -1,4 +1,5 @@ #define CHANGETURF_DEFER_CHANGE 1 -#define CHANGETURF_IGNORE_AIR 2 +#define CHANGETURF_IGNORE_AIR 2 // This flag prevents changeturf from gathering air from nearby turfs to fill the new turf with an approximation of local air #define CHANGETURF_FORCEOP 4 -#define CHANGETURF_SKIP 8 // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE \ No newline at end of file +#define CHANGETURF_SKIP 8 // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE +#define CHANGETURF_INHERIT_AIR 16 // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR diff --git a/code/datums/components/storage/concrete/bag_of_holding.dm b/code/datums/components/storage/concrete/bag_of_holding.dm index 9686a73b0c..71ba7d39a3 100644 --- a/code/datums/components/storage/concrete/bag_of_holding.dm +++ b/code/datums/components/storage/concrete/bag_of_holding.dm @@ -22,6 +22,8 @@ M.visible_message("The bluespace collapse crushes the air towards it, pulling [M] towards the ground...") M.Knockdown(5, TRUE, TRUE) //Overrides stun absorbs. T.TerraformTurf(/turf/open/chasm/magic, /turf/open/chasm/magic) + for (var/obj/structure/ladder/unbreakable/binary/ladder in GLOB.ladders) + ladder.ActivateAlmonds() message_admins("[ADMIN_LOOKUPFLW(user)] detonated a bag of holding at [ADMIN_VERBOSEJMP(loccheck)].") log_game("[key_name(user)] detonated a bag of holding at [AREACOORD(loccheck)].") qdel(A) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 139769e269..d64ae75e2c 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -37,10 +37,18 @@ GLOB.deliverybeacontags += location /obj/machinery/navbeacon/Destroy() - GLOB.navbeacons["[z]"] -= src //Remove from beacon list, if in one. + if (GLOB.navbeacons["[z]"]) + GLOB.navbeacons["[z]"] -= src //Remove from beacon list, if in one. GLOB.deliverybeacons -= src return ..() +/obj/machinery/navbeacon/onTransitZ(old_z, new_z) + if (GLOB.navbeacons["[old_z]"]) + GLOB.navbeacons["[old_z]"] -= src + if (GLOB.navbeacons["[new_z]"]) + GLOB.navbeacons["[new_z]"] += src + ..() + // set the transponder codes assoc list from codes_txt /obj/machinery/navbeacon/proc/set_codes() if(!codes_txt) @@ -203,4 +211,4 @@ Transponder Codes:
    [get_held_index_name(i)]:[(I && !(I.flags_1 & ABSTRACT_1)) ? I : "Empty"]
    [get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Empty"]
     
    Back:[(back && !(back.flags_1&ABSTRACT_1)) ? back : "Empty"]" + dat += "
    Back:[(back && !(back.item_flags & ABSTRACT)) ? back : "Empty"]" if(has_breathable_mask && istype(back, /obj/item/tank)) dat += " [internal ? "Disable Internals" : "Set Internals"]" dat += "
     
    Head:[(head && !(head.flags_1&ABSTRACT_1)) ? head : "Empty"]
    Head:[(head && !(head.item_flags & ABSTRACT)) ? head : "Empty"]
    Mask:Obscured
    Mask:[(wear_mask && !(wear_mask.flags_1&ABSTRACT_1)) ? wear_mask : "Empty"]
    Mask:[(wear_mask && !(wear_mask.item_flags & ABSTRACT)) ? wear_mask : "Empty"]
    Neck:Obscured
    Neck:[(wear_neck && !(wear_neck.flags_1&ABSTRACT_1)) ? wear_neck : "Empty"]
    Neck:[(wear_neck && !(wear_neck.item_flags & ABSTRACT)) ? wear_neck : "Empty"]
    Eyes:Obscured
    Eyes:[(glasses && !(glasses.flags_1&ABSTRACT_1)) ? glasses : "Empty"]
    Eyes:[(glasses && !(glasses.item_flags & ABSTRACT)) ? glasses : "Empty"]
    Ears:Obscured
    Ears:[(ears && !(ears.flags_1&ABSTRACT_1)) ? ears : "Empty"]
    Ears:[(ears && !(ears.item_flags & ABSTRACT)) ? ears : "Empty"]
     
    Exosuit:[(wear_suit && !(wear_suit.flags_1&ABSTRACT_1)) ? wear_suit : "Empty"]
    Exosuit:[(wear_suit && !(wear_suit.item_flags & ABSTRACT)) ? wear_suit : "Empty"]
     ↳Suit Storage:[(s_store && !(s_store.flags_1&ABSTRACT_1)) ? s_store : "Empty"]" + dat += "
     ↳Suit Storage:[(s_store && !(s_store.item_flags & ABSTRACT)) ? s_store : "Empty"]" if(has_breathable_mask && istype(s_store, /obj/item/tank)) dat += " [internal ? "Disable Internals" : "Set Internals"]" dat += "
    Shoes:Obscured
    Shoes:[(shoes && !(shoes.flags_1&ABSTRACT_1)) ? shoes : "Empty"]
    Shoes:[(shoes && !(shoes.item_flags & ABSTRACT)) ? shoes : "Empty"]
    Gloves:Obscured
    Gloves:[(gloves && !(gloves.flags_1&ABSTRACT_1)) ? gloves : "Empty"]
    Gloves:[(gloves && !(gloves.item_flags & ABSTRACT)) ? gloves : "Empty"]
    Uniform:Obscured
    Uniform:[(w_uniform && !(w_uniform.flags_1&ABSTRACT_1)) ? w_uniform : "Empty"]
    Uniform:[(w_uniform && !(w_uniform.item_flags & ABSTRACT)) ? w_uniform : "Empty"]
     ↳Pockets:
     ↳ID:
     ↳Belt:
     ↳Belt:[(belt && !(belt.flags_1&ABSTRACT_1)) ? belt : "Empty"]" + dat += "
     ↳Belt:[(belt && !(belt.item_flags & ABSTRACT)) ? belt : "Empty"]" if(has_breathable_mask && istype(belt, /obj/item/tank)) dat += " [internal ? "Disable Internals" : "Set Internals"]" dat += "
     ↳Pockets:[(l_store && !(l_store.flags_1&ABSTRACT_1)) ? "Left (Full)" : "Left (Empty)"]" - dat += " [(r_store && !(r_store.flags_1&ABSTRACT_1)) ? "Right (Full)" : "Right (Empty)"]
     ↳ID:[(wear_id && !(wear_id.flags_1&ABSTRACT_1)) ? wear_id : "Empty"]
     ↳Pockets:[(l_store && !(l_store.item_flags & ABSTRACT)) ? "Left (Full)" : "Left (Empty)"]" + dat += " [(r_store && !(r_store.item_flags & ABSTRACT)) ? "Right (Full)" : "Right (Empty)"]
     ↳ID:[(wear_id && !(wear_id.item_flags & ABSTRACT)) ? wear_id : "Empty"]
    Handcuffed: Remove