diff --git a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm
index 4faed2fee9..8113c586ff 100644
--- a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm
@@ -4,32 +4,32 @@
/area/template_noop)
"ab" = (
/turf/closed/mineral/random/low_chance,
-/area/ruin/space)
+/area/ruin/unpowered)
"ac" = (
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/unpowered)
"ad" = (
/obj/machinery/hydroponics/soil,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"ae" = (
/turf/closed/wall/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"af" = (
/obj/effect/spawner/structure/window/shuttle,
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"ag" = (
/obj/structure/shuttle/engine/propulsion/right{
dir = 4
},
/turf/closed/wall/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"ah" = (
/obj/structure/table/wood,
/obj/item/shovel,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"ai" = (
/obj/structure/lattice,
/turf/template_noop,
@@ -37,35 +37,33 @@
"aj" = (
/obj/machinery/computer/cryopod,
/turf/closed/wall/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"ak" = (
/obj/structure/fluff/empty_cryostasis_sleeper,
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"al" = (
/obj/machinery/status_display/shuttle,
/turf/closed/wall/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"am" = (
-/obj/item/circuitboard/computer/rdconsole,
-/obj/item/circuitboard/machine/protolathe/department/science,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"an" = (
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"ao" = (
/obj/structure/chair/comfy/shuttle{
dir = 8
},
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"ap" = (
/obj/machinery/light{
dir = 1
},
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"aq" = (
/obj/machinery/computer{
desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages.";
@@ -73,37 +71,38 @@
name = "Broken Computer"
},
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"ar" = (
/obj/machinery/door/airlock/titanium{
name = "Escape Pod Airlock"
},
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"as" = (
/obj/machinery/light,
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"at" = (
/obj/structure/shuttle/engine/propulsion/left{
dir = 4
},
/turf/closed/wall/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"au" = (
/obj/item/seeds/tower,
/obj/item/seeds/tower,
/obj/item/seeds/tower,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"av" = (
/obj/structure/table/wood,
/obj/item/paper/crumpled{
info = "
So this is it, I guess.. Always thought I'd go out doing something stupid, but.. not like this.
Should anyone find this note, tell Jeremy Clarke he can kiss my ass. Launching the pod unprepared like that..
Well. Now that I'm keeling over here, I guess I should write how I came to be the last one standing here.
Four of us took this pod.. only three of us woke up though.. fourth pod is locked from the inside, we couldn't figure out how to get it open.
Me and the clown set up a farm s'we can survive at least a while.. though, he didn't seem to understand that man cannot live on banana alone.
Had a bunch of circuits on him for some reason when he eventually passed, whispered to me something about a chem dispenser.. I.. don't know what he meant by that. I was never good with machinary. Maybe he wanted space lube?
The assistant that we gave the space suit to go out and find help never came back.. I'm betting he found salvation and left us behind.. never can trust those grubby greytiders."
},
/obj/item/pen,
+/obj/item/stock_parts/cell/hyper,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aw" = (
/obj/item/stack/sheet/mineral/wood,
/obj/item/stack/sheet/mineral/wood,
@@ -111,51 +110,53 @@
/obj/item/stack/sheet/mineral/wood,
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"ax" = (
/obj/item/twohanded/spear,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"ay" = (
/obj/item/grown/log,
/obj/item/grown/log,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"az" = (
/obj/structure/table/wood,
/obj/item/storage/bag/plants/portaseeder,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aA" = (
/turf/open/floor/plating/asteroid/airless,
-/area/ruin/space)
+/area/ruin/unpowered)
"aB" = (
/obj/item/seeds/banana,
/obj/item/seeds/banana,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aC" = (
/obj/effect/mob_spawn/human/clown/corpse,
/obj/structure/fans/tiny/invisible,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aD" = (
/obj/item/mining_scanner,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
+"aE" = (
+/turf/open/floor/plating/asteroid/airless,
+/area/ruin/powered)
"aF" = (
-/obj/item/pickaxe/emergency,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aG" = (
/obj/structure/sink/puddle,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aH" = (
/obj/structure/table/wood,
/obj/item/storage/firstaid/regular,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aI" = (
/obj/effect/mob_spawn/human/corpse/assistant,
/turf/template_noop,
@@ -164,17 +165,17 @@
/obj/structure/table/wood,
/obj/item/storage/bag/ore,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aK" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aL" = (
/obj/structure/table/wood,
/obj/item/storage/toolbox/mechanical,
/obj/item/clothing/head/welding,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aM" = (
/mob/living/simple_animal/hostile/carp,
/turf/template_noop,
@@ -182,38 +183,38 @@
"aN" = (
/obj/structure/mineral_door/sandstone,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aO" = (
/mob/living/simple_animal/hostile/carp,
/turf/open/floor/plating/asteroid/airless,
-/area/ruin/space)
+/area/ruin/unpowered)
"aP" = (
/obj/item/stack/ore/gold,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aQ" = (
/obj/item/stack/ore/gold,
/obj/item/stack/ore/gold,
/obj/item/stack/ore/gold,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aR" = (
/obj/item/stack/ore/iron,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aS" = (
/turf/closed/wall/mineral/iron,
-/area/ruin/space)
+/area/ruin/powered)
"aT" = (
/obj/item/stack/ore/iron,
/obj/item/stack/ore/iron,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aU" = (
/obj/item/flashlight/lamp,
/obj/structure/table/wood,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aV" = (
/obj/item/clothing/suit/space/orange,
/turf/template_noop,
@@ -232,76 +233,84 @@
job_description = "Space Hermit"
},
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
+"aZ" = (
+/turf/closed/mineral/random/low_chance,
+/area/ruin/powered)
+"ba" = (
+/turf/closed/mineral/random/low_chance/earth_like,
+/area/ruin/powered)
+"bb" = (
+/turf/closed/mineral/random/earth_like,
+/area/ruin/powered)
"bc" = (
/obj/item/circuitboard/machine/circuit_imprinter,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bd" = (
/obj/item/grown/bananapeel,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"be" = (
/obj/effect/mob_spawn/human/corpse/cargo_tech,
/obj/structure/fans/tiny/invisible,
-/obj/effect/decal/cleanable/vomit,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bf" = (
/obj/item/clothing/glasses/meson,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bg" = (
-/obj/item/stock_parts/matter_bin,
+/obj/item/stock_parts/matter_bin/adv,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bh" = (
/obj/item/circuitboard/machine/autolathe,
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"bi" = (
-/obj/item/stock_parts/manipulator,
+/obj/item/stock_parts/manipulator/pico,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bj" = (
/obj/item/holosign_creator/atmos,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bk" = (
/obj/structure/holosign/barrier/atmos,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bl" = (
/obj/machinery/power/floodlight,
/obj/structure/cable{
icon_state = "0-2"
},
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bm" = (
/obj/structure/cable{
icon_state = "1-4"
},
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bn" = (
/obj/structure/cable{
icon_state = "2-8"
},
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bo" = (
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bp" = (
/obj/item/stack/ore/iron,
/obj/item/stack/ore/iron,
/obj/item/stack/ore/iron,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bq" = (
/obj/structure/cable,
/obj/machinery/power/port_gen/pacman{
@@ -310,20 +319,54 @@
sheets = 10
},
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"br" = (
/obj/item/stack/ore/iron,
/obj/item/stack/sheet/mineral/plasma,
/obj/item/stack/sheet/mineral/plasma,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bs" = (
/obj/item/flashlight/lamp/bananalamp,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bt" = (
/turf/closed/mineral/random/low_chance/earth_like,
-/area/ruin/space)
+/area/ruin/unpowered)
+"bC" = (
+/obj/item/pickaxe/titanium,
+/turf/open/floor/plating/asteroid,
+/area/ruin/powered)
+"fp" = (
+/turf/closed/mineral/random/high_chance/earth_like,
+/area/ruin/powered)
+"jx" = (
+/turf/closed/mineral/silver/earth_like,
+/area/ruin/powered)
+"nc" = (
+/turf/closed/mineral/bscrystal/earth_like,
+/area/ruin/powered)
+"JZ" = (
+/turf/closed/mineral/titanium/earth_like,
+/area/ruin/powered)
+"Lt" = (
+/obj/structure/mirror,
+/turf/closed/wall/mineral/iron,
+/area/ruin/powered)
+"PG" = (
+/turf/closed/mineral/gold/earth_like,
+/area/ruin/powered)
+"Ue" = (
+/turf/closed/mineral/diamond/earth_like,
+/area/ruin/powered)
+"VS" = (
+/turf/closed/mineral/uranium/earth_like,
+/area/ruin/powered)
+"WH" = (
+/obj/item/circuitboard/machine/mining_equipment_vendor/golem,
+/obj/item/circuitboard/machine/ore_redemption,
+/turf/open/floor/plating/asteroid,
+/area/ruin/powered)
(1,1,1) = {"
aa
@@ -408,13 +451,13 @@ aA
aA
aA
aA
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aZ
+aZ
+aZ
+aZ
+aZ
+aZ
+aZ
aA
aA
aA
@@ -455,20 +498,20 @@ aA
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-ab
+aZ
+aZ
+aZ
+aZ
+aZ
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+aZ
+aZ
ab
aA
aA
@@ -503,27 +546,27 @@ aa
aa
aa
aA
-ab
-ab
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-ab
+aZ
+aZ
+aZ
+ba
+ba
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+aZ
+aZ
aA
aa
aa
@@ -554,29 +597,29 @@ aA
aA
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aZ
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+fp
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+ba
+ba
+aZ
aA
aa
aa
@@ -600,36 +643,36 @@ aa
aa
aa
aA
-ab
-ab
-ab
-ab
+aZ
+aZ
+aZ
+aZ
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aZ
+ba
+ba
+fp
+ba
+bb
+ba
+bb
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+ba
+aZ
aA
aa
aM
@@ -651,38 +694,38 @@ aa
aM
aa
aA
-ab
-bt
-bt
-bt
-bt
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aZ
+bb
+bb
+bb
+bb
+aZ
+ba
+fp
+ba
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+bb
+bb
+bb
+bb
+ba
+ba
+aZ
aA
aa
aa
@@ -703,39 +746,39 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+VS
+ba
+ba
+ba
+ba
+bb
+ba
+bb
+bb
+JZ
+bb
+bb
+bb
+bb
ae
af
ae
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+aZ
aA
aa
aa
@@ -755,40 +798,40 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+fp
+fp
+fp
+ba
+ba
+ba
+ba
+bb
+bb
+ba
+JZ
+ba
+ba
+ba
+bb
+bb
+bb
af
aq
af
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+ba
+bb
+bb
+bb
+bb
+fp
+ba
+ba
+aZ
aA
aa
aa
@@ -807,40 +850,40 @@ aa
aa
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+fp
+VS
+fp
+ba
+bb
+fp
+fp
+bb
+ba
+bb
+bb
+bb
+bb
+fp
+bb
+bb
ae
ae
ao
ae
ae
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+ba
+fp
+bb
+bb
+bb
+bb
+bb
+aZ
aA
aa
aa
@@ -859,41 +902,41 @@ aa
aa
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+ba
+ba
+bb
+ba
+Ue
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+bb
+bb
af
an
an
an
af
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+ba
+fp
+bb
+bb
+bb
+fp
+bb
+ba
+aZ
aA
aa
"}
@@ -912,25 +955,25 @@ aa
aA
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+bb
+Ue
+ba
+bb
+ba
+ba
+bb
+fp
+bb
+fp
+fp
+ba
+ba
+bb
ae
ae
bh
@@ -938,14 +981,14 @@ an
an
ae
ae
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+fp
+fp
+bb
+jx
+fp
+bb
+ba
+aZ
aA
aa
"}
@@ -964,25 +1007,25 @@ aa
aA
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+ba
+bb
+ba
+bb
+ba
+ba
+ba
+ba
+bb
af
aY
ao
@@ -990,14 +1033,14 @@ ao
ao
ak
af
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+ba
+bb
+fp
+bb
+bb
+bb
+ba
+aZ
aA
aa
"}
@@ -1016,25 +1059,25 @@ aa
aA
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+bb
+fp
+bb
+ba
+fp
+ba
+bb
+bb
+bb
+ba
+ba
+ba
+bb
+bb
al
aj
ap
@@ -1042,14 +1085,14 @@ an
as
aj
al
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+ba
+bb
+jx
+bb
+bb
+fp
+ba
+aZ
aA
aa
"}
@@ -1068,25 +1111,25 @@ aa
aA
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+fp
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+fp
+fp
+fp
+bb
+bb
+bb
+bb
+bb
af
ak
ao
@@ -1094,14 +1137,14 @@ ao
ao
ak
af
-ac
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aF
+bb
+bb
+bb
+bb
+bb
+ba
+aZ
aA
aa
"}
@@ -1120,24 +1163,24 @@ aa
aA
aA
ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
ah
az
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+bb
aR
ae
ae
@@ -1146,14 +1189,14 @@ an
an
ae
ae
-ac
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aF
+bb
+bb
+bb
+bb
+bb
+bb
+aZ
aA
aM
"}
@@ -1172,24 +1215,24 @@ aa
aA
aA
ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+aF
+aF
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+bb
aR
ag
ag
@@ -1198,14 +1241,14 @@ ar
af
at
at
-ac
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aF
+bb
+fp
+bb
+bb
+bb
+bb
+aZ
aA
aa
"}
@@ -1224,40 +1267,40 @@ aa
aA
aA
ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+ba
+bb
+bb
+bb
+bb
+bb
+bb
ad
-ac
-ac
-ac
-ac
-bt
+aF
+aF
+aF
+aF
+ba
aH
aJ
aL
-bt
-bt
+bb
+bb
aT
-ac
-ac
-ac
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
+aF
+aF
+aF
aR
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+bb
+bb
+bb
+bb
+bb
+bb
+aZ
aA
aa
"}
@@ -1273,43 +1316,43 @@ aa
aa
aa
aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
ad
au
-ac
+aF
aB
-am
-ac
-ac
-ac
-ac
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
+aF
+ba
+bb
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
bg
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+bb
+fp
+jx
+bb
+bb
+bb
+aZ
aA
aa
"}
@@ -1325,43 +1368,43 @@ aa
aa
aa
aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
ad
aw
bs
aC
-ac
-ac
-ac
-ac
-ac
-bt
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+bC
+WH
+aF
+aF
+aF
+ba
+bb
+bb
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+aZ
aA
aa
"}
@@ -1377,43 +1420,43 @@ aM
aa
aa
aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
ad
ax
-ac
+aF
aD
aF
-ac
-ac
-ac
-bt
-bt
-bt
+aF
+aF
+aF
+bb
+bb
+bb
aU
bd
-ac
-ac
+aF
+aF
bl
bm
-ac
-ac
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aF
+aF
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+aZ
aA
aa
"}
@@ -1429,43 +1472,43 @@ aa
aa
aa
aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+bb
+fp
+bb
+fp
+bb
+bb
+bb
ad
ay
-ac
-ac
-ac
+aF
+aF
+aF
aG
-ac
-ac
-bt
-bt
-bt
+aF
+aF
+bb
+bb
+ba
av
be
-ac
-ac
-ac
+aF
+aF
+aF
bn
bo
bo
bq
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+bb
+bb
+bb
+fp
+ba
+ba
+aZ
aA
aa
"}
@@ -1481,43 +1524,43 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-bt
-bt
-bt
+aZ
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+bb
+bb
+bb
bc
bf
-ac
-ac
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
+aF
+aF
br
-bt
-bt
-bt
-bt
-bt
-ab
-aA
+bb
+bb
+bb
+bb
+ba
+aZ
+aE
aa
aa
"}
@@ -1532,43 +1575,43 @@ aa
aa
aa
aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-bt
-ac
-ac
-ac
-ac
-ac
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-bt
-bt
-bt
-bt
-bt
-ab
+aE
+aZ
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+aF
+aF
+aF
+aF
+aF
+bb
+bb
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+bb
+bb
+bb
+fp
+ba
+aZ
aA
aa
aa
@@ -1584,42 +1627,42 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
-ac
-ac
-ac
+aZ
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+fp
+bb
+bb
+bb
+bb
+bb
+bb
+aF
+aF
+aF
+aF
+aF
aN
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
aR
-ac
-ac
-ac
-ac
-bt
-bt
-bt
-bt
-bt
-ab
+aF
+aF
+aF
+aF
+bb
+bb
+fp
+bb
+bb
+aZ
aA
aa
aa
@@ -1636,42 +1679,42 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
-ac
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-bt
-bt
-bt
-ab
+aZ
+ba
+ba
+ba
+bb
+nc
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+aF
+aF
+aF
+ba
+ba
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+ba
+ba
+ba
+aZ
aa
aa
aa
@@ -1688,42 +1731,42 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
aK
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
-ac
+ba
+ba
+aF
+aF
+aF
+aF
+aF
+aF
+aF
bp
-ac
-ac
+aF
+aF
aR
-bt
-bt
-ab
-aA
+ba
+ba
+aZ
+aE
aa
aa
aa
@@ -1740,41 +1783,41 @@ aa
aa
aa
aa
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+ba
+nc
+bb
+bb
+fp
+fp
+bb
+bb
+fp
+bb
+bb
+bb
+bb
+bb
+fp
+ba
+fp
+ba
aP
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
aR
-bt
-bt
-ab
+ba
+ba
+aZ
aA
aa
aa
@@ -1792,41 +1835,41 @@ aa
aa
aa
aa
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+ba
+ba
+bb
+bb
+bb
+fp
+bb
+fp
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
aQ
aP
-ac
-ac
+aF
+aF
aR
-ac
-ac
-ac
-ac
-bt
-ac
-bt
-bt
-ab
+aF
+aF
+aF
+aF
+bb
+aF
+ba
+ba
+aZ
aA
aa
aa
@@ -1844,41 +1887,41 @@ aa
aa
aa
aa
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
-ac
-ac
+aE
+aZ
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+PG
+bb
+bb
+ba
+ba
+ba
+ba
+ba
+aF
+aF
+aF
+aF
aP
-ac
+aF
bg
-bt
-bt
-bt
-bt
-ab
+bb
+bb
+bb
+ba
+aZ
aa
aa
aa
@@ -1896,41 +1939,41 @@ aa
aa
aa
aa
-aA
-ab
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
+aE
+aZ
+aZ
+ba
+ba
+bb
+bb
+bb
+fp
+bb
+bb
+bb
+fp
+bb
+PG
+fp
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+aF
+aF
+aF
+aF
+aF
+aF
aS
-bt
-bt
-bt
-ab
-aA
+bb
+fp
+bb
+aZ
+aE
aa
aa
aa
@@ -1951,38 +1994,38 @@ aa
aa
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+ba
+bb
+bb
+bb
+fp
+fp
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
bg
-ac
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
+aF
aS
-bt
-bt
-bt
-ab
-aA
+bb
+fp
+bb
+aZ
+aE
aa
aa
aO
@@ -2003,38 +2046,38 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
+aZ
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+bb
+bb
+fp
+ba
+aF
+aF
bj
-ac
-ac
-ac
+aF
+aF
+aF
aS
-bt
-bt
-bt
-ab
-aA
+fp
+bb
+bb
+aZ
+aE
aa
aA
ab
@@ -2055,38 +2098,38 @@ aa
aa
aa
aa
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+ba
+ba
aS
bi
-ac
-ac
-ac
+aF
+aF
+aF
aS
aS
-bt
-bt
-bt
-ab
-aA
+bb
+bb
+bb
+aZ
+aE
aa
aA
ab
@@ -2108,36 +2151,36 @@ aa
aa
aM
aa
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-bt
+aE
+aZ
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+fp
+ba
+ba
+ba
+aZ
+ba
aS
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
aS
aS
-bt
-bt
-ab
-aA
+ba
+ba
+aZ
+aE
aa
aa
aA
@@ -2160,36 +2203,36 @@ aa
aa
aa
aa
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-aA
-aS
+aE
+aZ
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+fp
+bb
+bb
+bb
+bb
+ba
+ba
+aZ
+aE
aS
aS
+Lt
bk
bk
aS
aS
aS
aS
-ab
-ab
-aA
+aZ
+aZ
+aE
aa
aa
aa
@@ -2212,25 +2255,25 @@ aa
aa
aa
aa
-aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-aA
-aA
-aA
+aE
+aE
+aZ
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+fp
+fp
+ba
+aZ
+aE
+aE
+aE
aS
aS
aS
@@ -2238,10 +2281,10 @@ bk
aS
aS
aS
-aA
-aA
-ab
-aA
+aE
+aE
+aZ
+aE
aa
aa
aa
@@ -2265,23 +2308,23 @@ aa
aa
aa
aa
-aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-aA
-aA
+aE
+aE
+aZ
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+aZ
+aE
+aE
ai
ai
ai
@@ -2318,21 +2361,21 @@ aa
aa
aa
aa
-aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-aA
+aE
+aE
+aZ
+ba
+fp
+fp
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+aZ
+aE
aa
aa
aa
@@ -2371,21 +2414,21 @@ aa
aa
aa
aa
-aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-ab
+aE
+aE
+aZ
+ba
+ba
+ba
+ba
+ba
+bb
+bb
+ba
+ba
+ba
+aZ
+aZ
aa
aa
aa
@@ -2424,20 +2467,20 @@ aa
aa
aa
aa
-aA
-aA
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-bt
-bt
-bt
-ab
+aE
+aE
+aZ
+aZ
+aZ
+aZ
+aZ
+aZ
+aZ
+aZ
+ba
+ba
+ba
+aZ
aa
aa
aa
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 6573e34c4d..d380d30d10 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -3512,15 +3512,6 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
-"agW" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/door/airlock/command,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/hos)
"agX" = (
/obj/machinery/door/poddoor/shutters{
id = "armory2";
@@ -6222,6 +6213,9 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"amd" = (
@@ -49556,6 +49550,10 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
+"cqQ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"cqR" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel,
@@ -49825,17 +49823,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/aisat_interior)
-"csK" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/door/window/northright{
- name = "Brig Operations";
- req_one_access_txt = "4; 1"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"csM" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/yellow/visible,
@@ -53139,6 +53126,16 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/circuit,
/area/ai_monitored/nuke_storage)
+"cKC" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"cMC" = (
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -53159,14 +53156,6 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
-"cME" = (
-/obj/structure/rack,
-/obj/item/storage/firstaid,
-/obj/item/clothing/glasses/hud/health,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"cMQ" = (
/obj/structure/cable{
icon_state = "0-2"
@@ -53337,6 +53326,22 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"cOV" = (
+/obj/machinery/door/firedoor,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/sign/warning/securearea{
+ pixel_x = -32
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "Prison Gate";
+ name = "prison blast door"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/security/prison)
"cPn" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/freezer,
@@ -53815,22 +53820,13 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
-"daA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
+"cZe" = (
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel,
-/area/security/processing)
+/area/security/brig)
"daI" = (
/obj/structure/reagent_dispensers/foamtank,
/obj/effect/turf_decal/tile/yellow{
@@ -53925,29 +53921,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
-"dmX" = (
-/obj/machinery/door/window/brigdoor/security/cell{
- id = "Cell 2";
- name = "Cell 2"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"dqb" = (
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/pool)
@@ -53955,16 +53928,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall/r_wall,
/area/maintenance/disposal/incinerator)
-"drO" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"dsC" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -54002,27 +53965,12 @@
},
/turf/closed/wall,
/area/science/circuit)
-"dys" = (
-/obj/effect/spawner/structure/window/reinforced,
+"dyE" = (
/obj/structure/cable{
- icon_state = "0-4"
+ icon_state = "1-2"
},
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "Secure Gate";
- name = "brig shutters"
- },
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/security/brig)
-"dyB" = (
-/obj/effect/decal/cleanable/vomit,
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
"dyS" = (
/obj/effect/turf_decal/tile/green{
dir = 8
@@ -54073,24 +54021,18 @@
"dFX" = (
/turf/closed/wall,
/area/crew_quarters/fitness/pool)
-"dHU" = (
-/obj/structure/bed/dogbed{
- desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off.";
- name = "pet bed"
- },
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"dIP" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+"dJL" = (
+/obj/structure/cable{
+ icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/machinery/door/airlock/command{
+ name = "Head of Security's Office";
+ req_access_txt = "58"
},
-/turf/open/floor/plasteel,
-/area/security/processing)
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/heads/hos)
"dKP" = (
/turf/closed/wall,
/area/maintenance/bar)
@@ -54124,6 +54066,12 @@
/obj/item/clothing/shoes/jackboots,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"dPq" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore)
"dTI" = (
/obj/structure/urinal{
pixel_y = 32
@@ -54133,22 +54081,6 @@
"dVU" = (
/turf/open/floor/plating,
/area/space/nearstation)
-"dWM" = (
-/obj/structure/table,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/recharger,
-/obj/item/gun/energy/laser/practice,
-/obj/item/gun/energy/laser/practice,
-/turf/open/floor/plasteel,
-/area/security/range)
"dXq" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -54159,8 +54091,9 @@
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
-"dXP" = (
-/turf/closed/wall/r_wall,
+"dYZ" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/security/range)
"eaI" = (
/obj/structure/table/reinforced,
@@ -54183,10 +54116,6 @@
dir = 4
},
/area/crew_quarters/fitness/pool)
-"ecD" = (
-/obj/item/cigbutt/cigarbutt,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"edA" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -54228,6 +54157,12 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
+"ene" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"enB" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
@@ -54262,6 +54197,27 @@
},
/turf/open/floor/plasteel/freezer,
/area/security/prison)
+"esK" = (
+/obj/machinery/door/airlock/maintenance/abandoned{
+ name = "Chemical Storage";
+ req_access_txt = "12"
+ },
+/obj/structure/barricade/wooden,
+/obj/structure/girder,
+/turf/open/floor/plating,
+/area/maintenance/fore)
+"esL" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/item/radio/intercom{
+ pixel_y = 20
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"esZ" = (
/obj/machinery/door/airlock{
desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals.";
@@ -54300,6 +54256,11 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
+"eAG" = (
+/obj/item/clothing/under/pj/blue,
+/obj/item/clothing/shoes/sneakers/white,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"eAJ" = (
/obj/structure/chair{
dir = 4
@@ -54335,27 +54296,6 @@
/obj/item/clothing/under/lawyer/red,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"eCQ" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/rack,
-/obj/item/storage/box/zipties{
- pixel_x = -1;
- pixel_y = 1
- },
-/obj/item/storage/box/zipties{
- pixel_x = 1;
- pixel_y = -1
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"eCR" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -54374,6 +54314,25 @@
},
/turf/open/floor/wood,
/area/crew_quarters/theatre)
+"eFx" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/ai_monitored/security/armory)
"eFW" = (
/obj/effect/spawner/structure/window/shuttle,
/turf/open/floor/plating/airless,
@@ -54408,17 +54367,6 @@
"eQb" = (
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
-"eRh" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "Secure Gate";
- name = "brig shutters"
- },
-/turf/open/floor/plating,
-/area/security/brig)
"eRz" = (
/obj/structure/lattice,
/obj/structure/grille,
@@ -54452,6 +54400,23 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
+"eWL" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/preopen{
+ id = "Prison Gate";
+ name = "prison blast door"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/security/prison)
+"eXz" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1;
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"fcn" = (
/obj/structure/lattice,
/turf/closed/wall/r_wall,
@@ -54462,6 +54427,11 @@
},
/turf/closed/wall/r_wall,
/area/science/mixing)
+"fdQ" = (
+/obj/structure/bed,
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"feE" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -54542,6 +54512,25 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
+"foT" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"fpl" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -54575,6 +54564,25 @@
dir = 1
},
/area/hallway/secondary/entry)
+"fsa" = (
+/obj/machinery/button/door{
+ id = "armory3";
+ name = "Armory Shutters";
+ pixel_y = 26;
+ req_access_txt = "3"
+ },
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#cee5d2"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ai_monitored/security/armory)
"fsj" = (
/obj/structure/table,
/obj/item/clothing/glasses/sunglasses{
@@ -54633,6 +54641,10 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
+"fxx" = (
+/obj/structure/disposalpipe/segment,
+/turf/closed/wall,
+/area/security/brig)
"fxV" = (
/turf/closed/wall/r_wall,
/area/hallway/primary/central)
@@ -54675,16 +54687,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"fEw" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"fFA" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -54709,21 +54711,26 @@
/obj/structure/lattice,
/turf/open/floor/plating,
/area/space/nearstation)
+"fJY" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/plasteel,
+/area/security/processing)
"fKl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel,
/area/science/circuit)
-"fLS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/holopad,
-/turf/open/floor/plasteel,
-/area/security/prison)
+"fMp" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"fOA" = (
/obj/machinery/door/airlock{
name = "Theatre Backstage";
@@ -54764,6 +54771,22 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
+"gav" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"gbd" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
@@ -54795,16 +54818,6 @@
/obj/effect/spawner/lootdrop/bedsheet,
/turf/open/floor/plating,
/area/security/prison)
-"gbM" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"gbT" = (
/obj/structure/table,
/obj/item/stack/sheet/metal/fifty,
@@ -54854,21 +54867,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"gjc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/item/radio/intercom{
- pixel_y = 20
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"gjl" = (
/turf/closed/wall,
/area/quartermaster/warehouse)
@@ -54909,34 +54907,12 @@
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness)
-"guS" = (
-/obj/machinery/light/small{
- dir = 8
+"gsM" = (
+/obj/machinery/door/airlock/maintenance/abandoned{
+ req_access_txt = "12"
},
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/item/radio/intercom{
- desc = "Talk through this. It looks like it has been modified to not broadcast.";
- name = "Prison Intercom (General)";
- pixel_x = -27;
- pixel_y = -27;
- prison_radio = 1
- },
-/obj/machinery/flasher{
- id = "Cell 3";
- pixel_x = -24;
- pixel_y = -36
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1;
- pixel_x = 0
- },
-/obj/structure/bed,
-/obj/item/bedsheet/yellow,
-/turf/open/floor/plasteel,
-/area/security/brig)
+/turf/open/floor/plating,
+/area/maintenance/fore)
"gvX" = (
/turf/open/floor/plasteel/yellowsiding,
/area/crew_quarters/fitness/pool)
@@ -54962,6 +54938,10 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
+"gyr" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/security/brig)
"gzf" = (
/obj/structure/window/reinforced/tinted{
dir = 8
@@ -54972,24 +54952,16 @@
/obj/structure/curtain,
/turf/open/floor/mineral/titanium/blue,
/area/crew_quarters/dorms)
+"gzY" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"gBo" = (
/obj/structure/cable{
icon_state = "1-8"
},
/turf/open/floor/wood,
/area/maintenance/bar)
-"gCm" = (
-/obj/machinery/disposal/bin,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/structure/disposalpipe/trunk,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"gCC" = (
/obj/structure/sign/poster/contraband/tools,
/turf/closed/wall,
@@ -54998,6 +54970,20 @@
/obj/effect/landmark/carpspawn,
/turf/open/space/basic,
/area/space)
+"gDP" = (
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 28;
+ pixel_y = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
+/obj/item/radio/intercom{
+ pixel_y = 20
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"gIU" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -55008,6 +54994,16 @@
/obj/structure/lattice/catwalk,
/turf/open/space/basic,
/area/space/nearstation)
+"gLz" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"gLH" = (
/obj/machinery/door/airlock/external{
name = "External Access";
@@ -55035,6 +55031,17 @@
},
/turf/open/floor/wood,
/area/bridge/meeting_room)
+"gNE" = (
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plating,
+/area/security/brig)
"gOZ" = (
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
@@ -55083,6 +55090,9 @@
},
/turf/open/floor/plating,
/area/construction)
+"gWo" = (
+/turf/closed/wall,
+/area/security/range)
"gXs" = (
/obj/structure/lattice,
/turf/open/space/basic,
@@ -55094,20 +55104,6 @@
dir = 8
},
/area/medical/sleeper)
-"gZQ" = (
-/obj/machinery/door/airlock/security/glass{
- id_tag = "innerbrig";
- name = "Brig Infirmary";
- req_access_txt = "2";
- req_one_access_txt = "0"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/security/brig)
"haL" = (
/obj/structure/lattice,
/turf/open/space/basic,
@@ -55165,25 +55161,17 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/maintenance/department/electrical)
-"hkH" = (
-/obj/structure/cable{
- icon_state = "4-8"
+"hlT" = (
+/obj/machinery/door/airlock/external{
+ name = "Labor Camp Shuttle Airlock";
+ req_access_txt = "2";
+ shuttledocked = 1
},
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
+/turf/open/floor/plating,
+/area/security/processing)
"hlV" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -55206,21 +55194,6 @@
},
/turf/open/floor/plating,
/area/security/range)
-"hrE" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
"hrF" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -55241,43 +55214,15 @@
},
/turf/open/floor/plating,
/area/space/nearstation)
-"hwJ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/closet/secure_closet/brig{
- id = "Cell 1";
- name = "Cell 1 Locker"
- },
-/obj/item/radio/headset{
- desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast.";
- name = "prisoner headset";
- prison_radio = 1
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1;
- pixel_x = 0
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"hxc" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"hzK" = (
/turf/open/floor/plasteel/yellowsiding/corner{
dir = 1
},
/area/crew_quarters/fitness/pool)
+"hBw" = (
+/obj/structure/lattice,
+/turf/closed/wall,
+/area/maintenance/fore)
"hBA" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/table,
@@ -55316,43 +55261,6 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
-"hIS" = (
-/obj/machinery/vending/snack/random,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"hMo" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Prisoner Processing";
- dir = 8
- },
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
-"hMM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/fore";
- dir = 1;
- name = "Fore Maintenance APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
"hOv" = (
/obj/structure/table/wood/fancy,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
@@ -55397,6 +55305,21 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
+"hSl" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore)
"hSZ" = (
/obj/structure/chair/comfy/brown{
dir = 1
@@ -55410,22 +55333,9 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"hXr" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating/airless,
-/area/maintenance/port/fore)
-"iaX" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
+"ibK" = (
/turf/open/floor/plasteel,
-/area/security/brig)
+/area/security/processing)
"idK" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -55440,11 +55350,6 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel,
/area/security/range)
-"iiQ" = (
-/obj/structure/table/wood,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"iiW" = (
/turf/open/floor/wood,
/area/maintenance/bar)
@@ -55481,6 +55386,20 @@
/obj/structure/falsewall,
/turf/open/floor/plating,
/area/maintenance/bar)
+"inq" = (
+/obj/structure/table/wood,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/fore)
+"inw" = (
+/mob/living/simple_animal/hostile/retaliate/goose{
+ desc = "Some evil loose goose.";
+ name = "Cere"
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore)
"inR" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -55501,17 +55420,13 @@
"ipA" = (
/turf/open/floor/plating,
/area/maintenance/department/medical/morgue)
-"iqU" = (
-/obj/machinery/door/airlock/external{
- name = "Labor Camp Shuttle Airlock";
- req_access_txt = "2";
- shuttledocked = 1
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+"itD" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plating,
-/area/security/processing)
+/obj/machinery/holopad,
+/turf/open/floor/plasteel,
+/area/security/brig)
"itG" = (
/obj/structure/table/reinforced,
/obj/item/paper_bin,
@@ -55544,18 +55459,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
-"iuJ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/security/glass{
- name = "Prisoner Processing";
- req_access_txt = "2"
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
"iuR" = (
/obj/effect/turf_decal/tile/green{
dir = 1
@@ -55573,6 +55476,10 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
/area/maintenance/port)
+"izg" = (
+/obj/item/cigbutt/cigarbutt,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"izv" = (
/obj/machinery/vending/clothing,
/obj/machinery/light/small{
@@ -55640,13 +55547,25 @@
/obj/structure/reagent_dispensers/cooking_oil,
/turf/open/floor/plasteel/showroomfloor,
/area/crew_quarters/kitchen)
-"iSW" = (
-/mob/living/simple_animal/hostile/retaliate/goose{
- desc = "Some evil loose goose.";
- name = "Cere"
+"iPX" = (
+/obj/structure/table,
+/obj/machinery/reagentgrinder{
+ desc = "Used to grind things up into raw materials and liquids.";
+ pixel_y = 5
},
+/obj/item/lighter,
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/maintenance/fore)
+"iRj" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/structure/sign/warning/electricshock{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
"iTq" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -55712,6 +55631,14 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
+"jdj" = (
+/obj/docking_port/stationary/random{
+ dir = 4;
+ id = "pod_lavaland3";
+ name = "lavaland"
+ },
+/turf/open/space,
+/area/space)
"jex" = (
/obj/machinery/smartfridge/organ/preloaded,
/turf/closed/wall,
@@ -55740,15 +55667,6 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
-"jhb" = (
-/obj/machinery/door/airlock/security{
- name = "Interrogation";
- req_access_txt = "2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/security/brig)
"jjC" = (
/obj/structure/table/wood,
/obj/item/toy/cards/deck,
@@ -55770,30 +55688,6 @@
/obj/machinery/rnd/production/techfab/department/cargo,
/turf/open/floor/plasteel,
/area/quartermaster/office)
-"jmg" = (
-/obj/machinery/light{
- dir = 4;
- light_color = "#e8eaff"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Brig East";
- dir = 8
- },
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"jmV" = (
/obj/structure/table/wood/fancy,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -55818,10 +55712,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
-"jtV" = (
-/obj/machinery/chem_master/condimaster,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"juG" = (
/obj/structure/table/reinforced,
/obj/machinery/door/firedoor,
@@ -55838,11 +55728,6 @@
/obj/structure/closet/athletic_mixed,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"jvO" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/rack,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"jxF" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -55850,6 +55735,21 @@
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
/area/maintenance/port)
+"jyO" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
+/area/ai_monitored/security/armory)
"jAD" = (
/obj/structure/grille,
/turf/open/floor/plating/airless,
@@ -55909,21 +55809,6 @@
dir = 1
},
/area/crew_quarters/fitness)
-"jFe" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
"jFH" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -55962,16 +55847,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"jIr" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
"jIs" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -55996,11 +55871,6 @@
},
/turf/open/floor/wood,
/area/maintenance/port/aft)
-"jKC" = (
-/obj/item/clothing/under/pj/blue,
-/obj/item/clothing/shoes/sneakers/white,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"jKP" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -56011,12 +55881,6 @@
},
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
-"jLl" = (
-/obj/structure/sign/warning/securearea{
- pixel_x = 32
- },
-/turf/open/space,
-/area/space)
"jLn" = (
/obj/machinery/door/airlock/engineering{
name = "Gravity Generator";
@@ -56027,6 +55891,12 @@
},
/turf/open/floor/plasteel,
/area/engine/engine_smes)
+"jLv" = (
+/obj/structure/sign/warning/securearea{
+ pixel_x = 32
+ },
+/turf/open/space,
+/area/space)
"jLT" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -56044,25 +55914,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/pool)
-"jOY" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
"jRw" = (
/obj/machinery/computer/arcade/minesweeper{
dir = 4
@@ -56099,6 +55950,29 @@
"kaq" = (
/turf/closed/wall/mineral/titanium,
/area/space/nearstation)
+"kbm" = (
+/obj/machinery/door/window/brigdoor/security/cell{
+ id = "Cell 2";
+ name = "Cell 2"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"kdO" = (
/obj/machinery/pool/controller,
/turf/open/floor/plasteel/yellowsiding,
@@ -56110,10 +55984,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/security/range)
-"kdS" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/brig)
"ker" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral,
@@ -56157,10 +56027,6 @@
},
/turf/open/floor/plating,
/area/security/prison)
-"kgH" = (
-/obj/structure/lattice,
-/turf/closed/wall,
-/area/maintenance/fore)
"khb" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
@@ -56256,6 +56122,26 @@
"ktS" = (
/turf/open/space/basic,
/area/space/nearstation)
+"kuh" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
+"kuA" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/item/radio/intercom{
+ pixel_y = 20
+ },
+/turf/open/floor/plasteel,
+/area/security/range)
"kvl" = (
/obj/structure/grille,
/turf/closed/wall/r_wall,
@@ -56288,14 +56174,6 @@
dir = 4
},
/area/crew_quarters/fitness)
-"kxG" = (
-/obj/item/cigbutt/cigarbutt,
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
"kyF" = (
/obj/effect/landmark/xeno_spawn,
/turf/open/floor/wood,
@@ -56326,6 +56204,15 @@
/obj/structure/window,
/turf/open/floor/wood,
/area/crew_quarters/bar)
+"kCa" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/security/range)
"kCo" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -56346,17 +56233,6 @@
/obj/effect/landmark/stationroom/box/engine,
/turf/open/space/basic,
/area/space)
-"kGl" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/door/window/northleft{
- name = "Brig Operations";
- req_one_access_txt = "4; 1"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"kGJ" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -56373,6 +56249,23 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"kHd" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Prisoner Processing";
+ dir = 8
+ },
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"kMt" = (
/obj/machinery/computer/prisoner/gulag_teleporter_computer,
/turf/open/floor/plasteel,
@@ -56406,7 +56299,16 @@
/obj/structure/disposalpipe/junction/flip,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
-"kPY" = (
+"kQk" = (
+/obj/structure/rack,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
+ },
+/obj/item/storage/toolbox/electrical,
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
+"kQz" = (
/obj/structure/cable{
icon_state = "4-8"
},
@@ -56421,15 +56323,6 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
-"kQk" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/obj/item/storage/toolbox/electrical,
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
"kQO" = (
/obj/structure/reagent_dispensers/keg/semen,
/turf/open/floor/plating,
@@ -56438,16 +56331,28 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
+"kTj" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/maintenance/abandoned{
+ name = "maintenance access";
+ req_access_txt = "12"
+ },
+/obj/structure/barricade/wooden,
+/obj/structure/girder,
+/turf/open/floor/plating,
+/area/maintenance/fore)
+"kUC" = (
+/obj/machinery/chem_master/condimaster,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"kWp" = (
/obj/structure/shuttle/engine/heater{
dir = 1
},
/turf/closed/wall/mineral/titanium,
/area/space/nearstation)
-"kXd" = (
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"kYk" = (
/obj/machinery/door/firedoor,
/obj/structure/sign/departments/evac{
@@ -56455,10 +56360,22 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
-"kZo" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/dark,
-/area/security/courtroom)
+"kZS" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/security/brig)
"laq" = (
/obj/structure/cable{
icon_state = "2-8"
@@ -56469,28 +56386,22 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/security/range)
-"lcu" = (
+"lfV" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/event_spawn,
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
-"lhh" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/firealarm{
+ pixel_y = 24
},
/turf/open/floor/plasteel,
/area/security/brig)
@@ -56555,26 +56466,41 @@
},
/turf/open/floor/plasteel,
/area/hydroponics)
-"lAa" = (
-/turf/open/floor/plating,
-/area/security/range)
+"lwN" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"lAB" = (
/obj/structure/sign/nanotrasen,
/turf/closed/wall,
/area/science/circuit)
-"lCf" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
+"lAH" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
+/area/security/processing)
+"lBz" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/door/window/northleft{
+ name = "Brig Operations";
+ req_one_access_txt = "4; 1"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"lCi" = (
/obj/docking_port/stationary/public_mining_dock{
dir = 8
@@ -56596,16 +56522,31 @@
},
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
-"lKL" = (
-/obj/structure/disposalpipe/segment,
-/turf/closed/wall,
-/area/security/brig)
+"lJC" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "Escape Pod Three"
+ },
+/turf/open/floor/plating,
+/area/security/main)
"lMg" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
},
/turf/open/floor/plasteel,
/area/science/circuit)
+"lNH" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/light_switch{
+ pixel_x = 27
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"lPr" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "applebush"
@@ -56616,6 +56557,16 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/science/circuit)
+"lRb" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/security/range)
"lSa" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
@@ -56635,12 +56586,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"lXX" = (
-/obj/effect/decal/cleanable/vomit,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"lZl" = (
/obj/structure/closet,
/obj/effect/spawner/lootdrop/maintenance,
@@ -56649,27 +56594,32 @@
/obj/item/coin/gold,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"lZn" = (
+/obj/machinery/door/airlock/security/glass{
+ id_tag = "innerbrig";
+ name = "Brig Infirmary";
+ req_access_txt = "2";
+ req_one_access_txt = "0"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/brig)
+"lZs" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"lZK" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
/turf/closed/wall,
/area/crew_quarters/fitness/pool)
-"lZR" = (
-/obj/structure/sign/plaques/golden{
- pixel_y = 32
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
"mbU" = (
/obj/machinery/vr_sleeper{
dir = 8
@@ -56689,15 +56639,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/security/range)
-"mdo" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- name = "Chemical Storage";
- req_access_txt = "12"
- },
-/obj/structure/barricade/wooden,
-/obj/structure/girder,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"meb" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/bed,
@@ -56729,18 +56670,63 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/toilet)
+"mkU" = (
+/obj/machinery/door/airlock/external{
+ name = "Labor Camp Shuttle Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/security/processing)
+"mml" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/ai_monitored/security/armory)
"mnC" = (
/obj/structure/target_stake,
/obj/item/target/syndicate,
/turf/open/floor/plating,
/area/security/range)
-"mnQ" = (
+"mos" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow,
+/obj/item/radio/intercom{
+ desc = "Talk through this. It looks like it has been modified to not broadcast.";
+ name = "Prison Intercom (General)";
+ pixel_x = -27;
+ pixel_y = -27;
+ prison_radio = 1
+ },
+/obj/machinery/flasher{
+ id = "Cell 3";
+ pixel_x = -24;
+ pixel_y = -36
+ },
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1;
pixel_x = 0
},
+/obj/structure/bed,
+/obj/item/bedsheet/yellow,
/turf/open/floor/plasteel,
-/area/security/processing)
+/area/security/brig)
"moD" = (
/obj/structure/table,
/obj/item/reagent_containers/food/snacks/bluecherrycupcake{
@@ -56782,40 +56768,21 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
+"mxn" = (
+/obj/machinery/door/airlock/external{
+ name = "Escape Pod Three"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/security/main)
"myh" = (
/obj/structure/piano,
/obj/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/wood,
/area/crew_quarters/theatre)
-"mym" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green,
-/obj/item/radio/intercom{
- desc = "Talk through this. It looks like it has been modified to not broadcast.";
- name = "Prison Intercom (General)";
- pixel_x = -27;
- pixel_y = -27;
- prison_radio = 1
- },
-/obj/machinery/flasher{
- id = "Cell 1";
- pixel_x = -24;
- pixel_y = -36
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1;
- pixel_x = 0
- },
-/obj/structure/bed,
-/obj/item/bedsheet/green,
-/turf/open/floor/plasteel,
-/area/security/brig)
"mzB" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/door/window,
@@ -56872,12 +56839,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
/area/science/circuit)
-"mNJ" = (
-/obj/item/radio/intercom{
- pixel_y = 20
- },
-/turf/open/floor/plating,
-/area/security/vacantoffice/b)
"mNW" = (
/obj/structure/sign/poster/official/fruit_bowl{
pixel_y = 32
@@ -56969,28 +56930,9 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
-"nat" = (
-/obj/machinery/door/airlock/external{
- name = "Labor Camp Shuttle Airlock";
- req_access_txt = "2"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/processing)
"naI" = (
/turf/open/space,
/area/space/station_ruins)
-"nbK" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Escape Pod Three"
- },
-/turf/open/floor/plating,
-/area/security/main)
"nbT" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -57005,25 +56947,19 @@
},
/turf/open/floor/plating,
/area/hallway/primary/central)
+"nbY" = (
+/obj/item/melee/baton/cattleprod,
+/obj/item/stock_parts/cell/high,
+/obj/item/electropack,
+/obj/structure/closet/secure_closet{
+ name = "Persuasion Storage";
+ req_access = "list(2)"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/brig)
"ndq" = (
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
-"ndJ" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"nea" = (
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"neq" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/security/courtroom)
"nez" = (
/obj/structure/table/wood,
/obj/item/instrument/piano_synth,
@@ -57039,6 +56975,14 @@
},
/turf/open/floor/wood,
/area/crew_quarters/theatre)
+"ngU" = (
+/obj/structure/rack,
+/obj/item/storage/firstaid,
+/obj/item/clothing/glasses/hud/health,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"ngV" = (
/obj/structure/table/wood,
/obj/item/instrument/guitar,
@@ -57060,6 +57004,11 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
+"nnp" = (
+/obj/structure/closet/secure_closet/medical1,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"noy" = (
/obj/structure/sign/poster/contraband/smoke{
desc = "This poster reminds us all that the Detective is a parasite. Year after year, they must get replacement lungs because of their addiction. ";
@@ -57073,21 +57022,17 @@
},
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/fore)
-"nqz" = (
-/obj/machinery/light/small{
- dir = 4
+"nss" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
},
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"nrg" = (
-/obj/machinery/door/window/southright{
- name = "Target Storage"
+/obj/machinery/door/window/northright{
+ name = "Brig Operations";
+ req_one_access_txt = "4; 1"
},
-/obj/item/target/alien,
-/obj/item/target/alien,
-/obj/item/target/syndicate,
-/turf/open/floor/plating,
-/area/security/range)
+/turf/open/floor/plasteel,
+/area/security/brig)
"nsA" = (
/turf/closed/wall,
/area/crew_quarters/abandoned_gambling_den)
@@ -57114,14 +57059,22 @@
},
/turf/open/floor/plating,
/area/construction)
-"nBM" = (
-/obj/docking_port/stationary/random{
- dir = 4;
- id = "pod_lavaland3";
- name = "lavaland"
+"nBI" = (
+/obj/item/cigbutt/cigarbutt,
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/chair{
+ dir = 1
},
-/turf/open/space,
-/area/space)
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
+"nEj" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = 0;
+ pixel_y = 32
+ },
+/turf/open/floor/plating,
+/area/security/processing)
"nGf" = (
/obj/machinery/hydroponics/constructable,
/obj/machinery/light{
@@ -57179,14 +57132,6 @@
/obj/machinery/recharge_station,
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
-"nQM" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = 0;
- pixel_y = -32
- },
-/turf/open/floor/plating,
-/area/security/processing)
"nRG" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
@@ -57205,35 +57150,21 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
+"nTG" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"nUV" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/open/floor/plasteel,
/area/hydroponics)
-"nVk" = (
-/obj/machinery/door/window/brigdoor/security/cell{
- id = "Cell 3";
- name = "Cell 3"
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"nYe" = (
/obj/structure/safe,
/obj/item/clothing/head/bearpelt,
@@ -57287,21 +57218,21 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
-"oaZ" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
+"oby" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+/obj/effect/turf_decal/tile/red{
dir = 1
},
+/obj/item/radio/intercom{
+ pixel_y = 20
+ },
/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
+/area/security/brig)
"oce" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
@@ -57335,26 +57266,34 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/pool)
-"oiW" = (
-/obj/structure/cable{
- icon_state = "1-8"
+"okK" = (
+/obj/machinery/light/small{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/effect/turf_decal/tile/green{
+ dir = 8
},
+/obj/effect/turf_decal/tile/green,
+/obj/item/radio/intercom{
+ desc = "Talk through this. It looks like it has been modified to not broadcast.";
+ name = "Prison Intercom (General)";
+ pixel_x = -27;
+ pixel_y = -27;
+ prison_radio = 1
+ },
+/obj/machinery/flasher{
+ id = "Cell 1";
+ pixel_x = -24;
+ pixel_y = -36
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1;
+ pixel_x = 0
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/green,
/turf/open/floor/plasteel,
/area/security/brig)
-"okI" = (
-/obj/machinery/door/airlock/security{
- name = "Firing Range";
- req_access_txt = "2"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/security/range)
"old" = (
/obj/effect/turf_decal/tile/red{
dir = 8
@@ -57369,6 +57308,16 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"omX" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/holopad,
+/turf/open/floor/plasteel,
+/area/security/prison)
"omY" = (
/obj/item/flashlight/lamp/green{
pixel_x = -3;
@@ -57413,6 +57362,22 @@
/obj/item/pen/fountain,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"ovv" = (
+/obj/structure/table,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/recharger,
+/obj/item/gun/energy/laser/practice,
+/obj/item/gun/energy/laser/practice,
+/turf/open/floor/plasteel,
+/area/security/range)
"oxm" = (
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/sparsegrass,
@@ -57471,6 +57436,10 @@
/obj/structure/fireplace,
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
+"oDm" = (
+/obj/machinery/gulag_teleporter,
+/turf/open/floor/plasteel,
+/area/security/prison)
"oDN" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -57486,11 +57455,6 @@
/obj/effect/spawner/lootdrop/keg,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"oFV" = (
-/obj/structure/closet/secure_closet/medical1,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"oHB" = (
/turf/open/floor/plasteel/dark,
/area/crew_quarters/dorms)
@@ -57530,49 +57494,23 @@
},
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
-"oMS" = (
-/obj/machinery/door/airlock/external{
- name = "Labor Camp Shuttle Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/processing)
-"oMZ" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/item/radio/intercom{
- pixel_y = 20
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"oNz" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
-"oOt" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/red{
- dir = 1
+"oSl" = (
+/obj/machinery/door/airlock/security{
+ name = "Firing Range";
+ req_access_txt = "2"
},
-/obj/effect/turf_decal/tile/red{
- dir = 4
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/effect/turf_decal/tile/red,
+/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
-/area/security/processing)
-"oRg" = (
-/obj/structure/bed,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/plating,
-/area/maintenance/fore)
+/area/security/range)
"oTW" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -57595,23 +57533,6 @@
/obj/structure/pool/ladder,
/turf/open/pool,
/area/crew_quarters/fitness/pool)
-"oWe" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"oWB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/security/main)
"oZl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/closet/wardrobe/pjs,
@@ -57626,15 +57547,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"pek" = (
-/obj/machinery/door/airlock/external{
- name = "Labor Camp Shuttle Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/processing)
"pem" = (
/obj/machinery/button/door{
desc = "Bolts the doors to the Private Study.";
@@ -57656,6 +57568,11 @@
},
/turf/open/floor/plating,
/area/security/range)
+"pjg" = (
+/obj/structure/table/wood,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"pkF" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/extinguisher_cabinet{
@@ -57685,6 +57602,29 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
+"plS" = (
+/obj/machinery/door/window/brigdoor/security/cell{
+ id = "Cell 1";
+ name = "Cell 1"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"poc" = (
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -57747,33 +57687,48 @@
dir = 1
},
/area/crew_quarters/fitness)
-"pwd" = (
-/obj/structure/table,
-/obj/machinery/reagentgrinder{
- desc = "Used to grind things up into raw materials and liquids.";
- pixel_y = 5
- },
-/obj/item/lighter,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"pzk" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"pAK" = (
+/obj/machinery/door/window/brigdoor/security/cell{
+ id = "Cell 3";
+ name = "Cell 3"
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"pBp" = (
/obj/effect/landmark/event_spawn,
/turf/closed/wall,
/area/crew_quarters/fitness)
-"pEL" = (
-/obj/machinery/light/small{
- dir = 8
+"pDe" = (
+/obj/machinery/door/window/southright{
+ name = "Target Storage"
},
-/obj/effect/decal/cleanable/dirt,
+/obj/item/target/alien,
+/obj/item/target/alien,
+/obj/item/target/syndicate,
/turf/open/floor/plating,
-/area/maintenance/fore)
+/area/security/range)
"pFX" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/drinks/soda_cans/starkist{
@@ -57833,22 +57788,6 @@
},
/turf/open/floor/wood,
/area/library)
-"pKR" = (
-/obj/machinery/door/firedoor,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/sign/warning/securearea{
- pixel_x = -32
- },
-/obj/machinery/door/poddoor/preopen{
- id = "Prison Gate";
- name = "prison blast door"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/security/prison)
"pLn" = (
/obj/machinery/conveyor/inverted{
dir = 5;
@@ -57883,6 +57822,16 @@
},
/turf/open/floor/plating,
/area/crew_quarters/fitness)
+"pQr" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"pQN" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -57907,17 +57856,16 @@
},
/turf/open/space,
/area/solar/starboard/aft)
-"pWM" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-4"
+"pUy" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
},
-/obj/machinery/door/poddoor/preopen{
- id = "Secure Gate";
- name = "brig shutters"
+/obj/effect/turf_decal/tile/red{
+ dir = 4
},
-/turf/open/floor/plating,
-/area/security/brig)
+/turf/open/floor/plasteel,
+/area/security/processing)
"qaY" = (
/obj/structure/table/reinforced,
/obj/effect/turf_decal/tile/bar,
@@ -58001,23 +57949,6 @@
/obj/structure/table,
/turf/open/floor/plasteel,
/area/security/prison)
-"qmV" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/structure/sign/warning/electricshock{
- pixel_y = 32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
-"qpg" = (
-/obj/structure/closet/secure_closet/chemical,
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"qqs" = (
/obj/structure/mirror{
pixel_y = 32
@@ -58045,9 +57976,6 @@
/obj/structure/grille/broken,
/turf/open/space/basic,
/area/space/nearstation)
-"qxq" = (
-/turf/closed/wall,
-/area/security/range)
"qyj" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
@@ -58057,15 +57985,6 @@
/obj/structure/lattice,
/turf/closed/wall/r_wall,
/area/crew_quarters/heads/captain)
-"qCC" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/range)
"qIw" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -58079,16 +57998,6 @@
},
/turf/open/space,
/area/solar/port/aft)
-"qLc" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/preopen{
- id = "Prison Gate";
- name = "prison blast door"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/security/prison)
"qLR" = (
/obj/structure/mirror{
pixel_y = 32
@@ -58134,15 +58043,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
-"qUk" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"qVP" = (
/obj/effect/spawner/structure/window,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -58166,6 +58066,32 @@
},
/turf/closed/wall/r_wall,
/area/science/circuit)
+"rcI" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/closet/secure_closet/brig{
+ id = "Cell 1";
+ name = "Cell 1 Locker"
+ },
+/obj/item/radio/headset{
+ desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast.";
+ name = "prisoner headset";
+ prison_radio = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1;
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"rdG" = (
/obj/machinery/hydroponics/constructable,
/obj/item/radio/intercom{
@@ -58189,6 +58115,10 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/maintenance/disposal/incinerator)
+"rhX" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/security/processing)
"rjQ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/wood,
@@ -58291,6 +58221,10 @@
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
+"rtC" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"ruo" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -58337,17 +58271,44 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
+"rAR" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"rBq" = (
/obj/item/clothing/head/kitty,
/obj/item/clothing/under/maid,
/obj/item/clothing/mask/muzzle,
/turf/open/floor/plating,
/area/maintenance/bar)
-"rFw" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+"rCl" = (
+/obj/machinery/door/firedoor,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
dir = 4
},
-/obj/machinery/holopad,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/machinery/door/airlock/security/glass{
+ id_tag = "outerbrig";
+ name = "Brig";
+ req_access_txt = "63"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"rGq" = (
@@ -58367,16 +58328,30 @@
},
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
+"rJv" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "Secure Gate";
+ name = "brig shutters"
+ },
+/turf/open/floor/plating,
+/area/security/brig)
+"rJw" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating/airless,
+/area/maintenance/port/fore)
"rKP" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
/turf/open/floor/plating,
/area/construction)
-"rKX" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/range)
"rMN" = (
/obj/structure/bed,
/obj/item/tank/internals/anesthetic,
@@ -58404,6 +58379,13 @@
dir = 4
},
/area/crew_quarters/theatre)
+"rQJ" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"rTu" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -58414,6 +58396,11 @@
},
/turf/open/floor/plasteel/dark,
/area/bridge/meeting_room)
+"rTD" = (
+/obj/machinery/vending/snack/random,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/hallway/primary/central)
"rXl" = (
/obj/structure/chair/office/light,
/obj/machinery/firealarm{
@@ -58425,48 +58412,6 @@
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
-"rYg" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
-"rZB" = (
-/obj/machinery/door/window/brigdoor/security/cell{
- id = "Cell 1";
- name = "Cell 1"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"saK" = (
/obj/structure/closet/crate,
/obj/item/target/alien,
@@ -58504,16 +58449,6 @@
dir = 4
},
/area/crew_quarters/fitness)
-"sea" = (
-/obj/item/melee/baton/cattleprod,
-/obj/item/stock_parts/cell/high,
-/obj/item/electropack,
-/obj/structure/closet/secure_closet{
- name = "Persuasion Storage";
- req_access = "list(2)"
- },
-/turf/open/floor/plasteel/dark,
-/area/security/brig)
"seP" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -58531,6 +58466,10 @@
},
/turf/open/floor/plating,
/area/security/brig)
+"sfs" = (
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"shR" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -58549,31 +58488,12 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plating,
/area/maintenance/department/medical/morgue)
-"soA" = (
-/obj/machinery/door/firedoor,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/door/airlock/security/glass{
- id_tag = "outerbrig";
- name = "Brig";
- req_access_txt = "63"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
+"sqg" = (
+/obj/structure/table/wood,
+/obj/item/clothing/under/pj/red,
+/obj/item/clothing/shoes/sneakers/white,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"sqp" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -58644,8 +58564,13 @@
},
/turf/open/floor/wood,
/area/crew_quarters/theatre)
-"sAr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+"sAk" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"sAM" = (
@@ -58839,6 +58764,9 @@
/obj/machinery/vending/boozeomat/all_access,
/turf/closed/wall,
/area/maintenance/bar)
+"sXV" = (
+/turf/closed/wall/r_wall,
+/area/security/range)
"sYR" = (
/obj/machinery/door/airlock{
name = "Unisex Restrooms"
@@ -58850,22 +58778,16 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/area/hallway/secondary/service)
-"tcg" = (
+"tgH" = (
+/obj/structure/filingcabinet/employment,
+/turf/open/floor/wood,
+/area/crew_quarters/heads/captain)
+"thB" = (
/obj/structure/sign/warning/securearea{
pixel_y = -32
},
/turf/open/space,
/area/space)
-"tfG" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"tgH" = (
-/obj/structure/filingcabinet/employment,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
"tif" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -59007,6 +58929,18 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
+"tHh" = (
+/obj/machinery/disposal/bin,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/structure/disposalpipe/trunk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"tJi" = (
/obj/machinery/airalarm{
dir = 4;
@@ -59043,6 +58977,12 @@
/obj/effect/spawner/lootdrop/keg,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"tKb" = (
+/obj/item/radio/intercom{
+ pixel_y = 20
+ },
+/turf/open/floor/plating,
+/area/security/vacantoffice/b)
"tKk" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -59083,13 +59023,6 @@
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/maintenance/bar)
-"tQi" = (
-/obj/structure/table/wood,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"tRe" = (
/obj/machinery/chem_master,
/turf/open/floor/plasteel/white,
@@ -59112,24 +59045,12 @@
},
/turf/open/floor/wood,
/area/crew_quarters/theatre)
-"tXk" = (
-/obj/machinery/gulag_teleporter,
-/turf/open/floor/plasteel,
-/area/security/prison)
"tXL" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
/turf/closed/wall/r_wall,
/area/maintenance/disposal/incinerator)
-"tYH" = (
-/obj/structure/rack,
-/obj/item/instrument/banjo,
-/obj/item/instrument/harmonica,
-/obj/item/instrument/accordion,
-/obj/item/instrument/recorder,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"tZe" = (
/obj/effect/turf_decal/bot,
/obj/structure/sign/poster/official/pda_ad{
@@ -59168,16 +59089,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
-"ubI" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/light{
- light_color = "#cee5d2"
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
"ucq" = (
/obj/structure/sign/poster/contraband/red_rum{
pixel_y = 32
@@ -59272,19 +59183,9 @@
},
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
-"usv" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"usK" = (
-/obj/structure/table/wood,
-/obj/item/clothing/under/pj/red,
-/obj/item/clothing/shoes/sneakers/white,
+"usE" = (
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/structure/rack,
/turf/open/floor/plating,
/area/maintenance/fore)
"usO" = (
@@ -59294,12 +59195,6 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
-"uto" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"uua" = (
/obj/machinery/atmospherics/components/binary/valve,
/turf/open/floor/plating,
@@ -59323,21 +59218,6 @@
/obj/structure/mineral_door/wood,
/turf/open/floor/wood,
/area/maintenance/bar)
-"uwb" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"uwq" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/security/brig)
"uxY" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable{
@@ -59372,6 +59252,21 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
+"uCo" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore)
+"uCU" = (
+/obj/machinery/door/airlock/security{
+ name = "Interrogation";
+ req_access_txt = "2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/security/brig)
"uDO" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -59402,9 +59297,23 @@
},
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
+"uFZ" = (
+/obj/structure/closet/emcloset,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/light{
+ light_color = "#cee5d2"
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"uGI" = (
/turf/open/floor/grass,
/area/security/prison)
+"uHp" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall,
+/area/security/main)
"uIO" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -59492,6 +59401,19 @@
/obj/machinery/pool/drain,
/turf/open/pool,
/area/crew_quarters/fitness/pool)
+"uTe" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/brig)
+"uUi" = (
+/obj/effect/decal/cleanable/vomit,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"uVS" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -59504,6 +59426,10 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"uXt" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/turf/open/floor/plasteel,
+/area/security/brig)
"vae" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -59543,16 +59469,6 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
-"vcQ" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/light{
- dir = 1;
- light_color = "#d1dfff"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
"vda" = (
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -59570,22 +59486,36 @@
},
/turf/open/floor/wood,
/area/security/vacantoffice)
-"vdU" = (
-/obj/machinery/door/window/southleft{
- name = "Target Storage"
- },
-/obj/item/target/clown,
-/obj/item/target/clown,
-/obj/item/target,
-/obj/item/target,
-/turf/open/floor/plating,
-/area/security/range)
"veS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/closed/wall,
/area/crew_quarters/fitness/pool)
+"vfX" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
+"vgJ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/maintenance/fore";
+ dir = 1;
+ name = "Fore Maintenance APC";
+ pixel_y = 24
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore)
"vhb" = (
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -59655,6 +59585,14 @@
/obj/item/clothing/under/pj/blue,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
+"vqP" = (
+/obj/structure/bed/dogbed{
+ desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off.";
+ name = "pet bed"
+ },
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"vsM" = (
/obj/machinery/power/apc/auto_name/south,
/obj/structure/cable,
@@ -59695,35 +59633,30 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"vxA" = (
+"vxX" = (
/obj/machinery/door/airlock/external{
- name = "Escape Pod Three"
+ name = "Labor Camp Shuttle Airlock"
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/main)
-"vyc" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/brig)
+/turf/open/floor/plating,
+/area/security/processing)
"vyp" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
/area/crew_quarters/dorms)
+"vyK" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "Secure Gate";
+ name = "brig shutters"
+ },
+/turf/open/floor/plating,
+/area/security/brig)
"vzp" = (
/obj/structure/table/reinforced,
/obj/machinery/firealarm{
@@ -59824,6 +59757,18 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
+"vGn" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/security/glass{
+ name = "Prisoner Processing";
+ req_access_txt = "2"
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"vHj" = (
/obj/machinery/door/airlock/public/glass{
name = "Cryogenics "
@@ -59872,6 +59817,30 @@
},
/turf/open/floor/plasteel,
/area/security/range)
+"vIo" = (
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#e8eaff"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Brig East";
+ dir = 8
+ },
+/obj/machinery/firealarm{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"vJu" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk{
@@ -59879,6 +59848,14 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
+"vLo" = (
+/obj/structure/closet/secure_closet/chemical,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"vOU" = (
/obj/structure/sign/warning/securearea,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -59897,10 +59874,16 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
-"vQo" = (
-/obj/effect/decal/cleanable/dirt,
+"vTP" = (
+/obj/machinery/door/airlock/external{
+ name = "Labor Camp Shuttle Airlock";
+ req_access_txt = "2"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
/turf/open/floor/plating,
-/area/maintenance/fore)
+/area/security/processing)
"vZA" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable,
@@ -59912,15 +59895,6 @@
},
/turf/open/floor/wood,
/area/library)
-"vZS" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"wag" = (
/obj/structure/chair/comfy/black{
dir = 8
@@ -59955,6 +59929,16 @@
"wcR" = (
/turf/open/floor/plasteel/yellowsiding/corner,
/area/crew_quarters/fitness/pool)
+"wdr" = (
+/obj/machinery/door/window/southleft{
+ name = "Target Storage"
+ },
+/obj/item/target/clown,
+/obj/item/target/clown,
+/obj/item/target,
+/obj/item/target,
+/turf/open/floor/plating,
+/area/security/range)
"wdv" = (
/obj/structure/fans/tiny/invisible,
/turf/open/space/basic,
@@ -59963,33 +59947,6 @@
/obj/structure/girder,
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"weW" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = 0;
- pixel_y = 32
- },
-/turf/open/floor/plating,
-/area/security/processing)
-"wfA" = (
-/obj/machinery/button/door{
- id = "armory3";
- name = "Armory Shutters";
- pixel_y = 26;
- req_access_txt = "3"
- },
-/obj/machinery/light{
- dir = 1;
- light_color = "#cee5d2"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
"wfR" = (
/obj/item/electropack/shockcollar,
/obj/item/assembly/signaler,
@@ -60001,9 +59958,21 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/pool)
+"wje" = (
+/obj/structure/rack,
+/obj/item/instrument/banjo,
+/obj/item/instrument/harmonica,
+/obj/item/instrument/accordion,
+/obj/item/instrument/recorder,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"wkN" = (
/turf/closed/wall,
/area/science/circuit)
+"wlI" = (
+/obj/machinery/holopad,
+/turf/open/floor/plasteel/showroomfloor,
+/area/security/main)
"woR" = (
/obj/machinery/cryopod{
dir = 1
@@ -60054,16 +60023,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
-"wsI" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/light_switch{
- pixel_x = 27
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
"wvX" = (
/obj/structure/table/reinforced,
/obj/machinery/light,
@@ -60083,36 +60042,6 @@
},
/turf/closed/wall,
/area/hallway/secondary/service)
-"wBr" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Security Maintenance";
- req_access_txt = "1"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/main)
-"wGf" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 28;
- pixel_y = 0
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/obj/item/radio/intercom{
- pixel_y = 20
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
"wHk" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -60137,22 +60066,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
-"wMI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/security/brig)
-"wPh" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel,
-/area/security/range)
"wQg" = (
/obj/structure/pool/ladder{
dir = 2;
@@ -60189,10 +60102,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/carpet,
/area/crew_quarters/theatre)
-"wUV" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/processing)
"wUY" = (
/obj/structure/table,
/obj/item/stack/packageWrap,
@@ -60200,17 +60109,6 @@
/obj/item/hand_labeler,
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
-"wVh" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/item/radio/intercom{
- pixel_y = 20
- },
-/turf/open/floor/plasteel,
-/area/security/range)
-"wWS" = (
-/obj/machinery/holopad,
-/turf/open/floor/plasteel/showroomfloor,
-/area/security/main)
"wWT" = (
/obj/effect/landmark/start/roboticist,
/turf/open/floor/plasteel/white,
@@ -60239,15 +60137,6 @@
},
/turf/open/floor/plasteel,
/area/security/prison)
-"wZe" = (
-/obj/structure/chair{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
"wZI" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -60257,6 +60146,17 @@
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/captain)
+"xal" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "Secure Gate";
+ name = "brig shutters"
+ },
+/turf/open/floor/plating,
+/area/security/brig)
"xaB" = (
/obj/structure/closet/athletic_mixed,
/obj/item/toy/poolnoodle/red,
@@ -60336,18 +60236,6 @@
icon_state = "wood-broken5"
},
/area/maintenance/bar)
-"xhn" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/airlock/maintenance/abandoned{
- name = "maintenance access";
- req_access_txt = "12"
- },
-/obj/structure/barricade/wooden,
-/obj/structure/girder,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"xhS" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -60393,12 +60281,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"xkL" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
"xmo" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
@@ -60418,6 +60300,15 @@
/obj/effect/landmark/start/assistant,
/turf/open/floor/plasteel/grimy,
/area/hallway/secondary/entry)
+"xnm" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"xqG" = (
/obj/structure/table/reinforced,
/obj/effect/turf_decal/tile/bar,
@@ -60462,6 +60353,9 @@
},
/turf/open/floor/plating,
/area/maintenance/fore)
+"xxp" = (
+/turf/open/floor/plating,
+/area/security/range)
"xzd" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -60473,6 +60367,18 @@
/obj/effect/landmark/start/assistant,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
+"xzv" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"xAk" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -60502,13 +60408,6 @@
/obj/item/radio/headset/headset_cargo,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
-"xCp" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/brig)
"xDM" = (
/obj/machinery/camera{
c_tag = "Locker Room South";
@@ -60517,9 +60416,6 @@
/obj/structure/closet/secure_closet/personal,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
-"xDQ" = (
-/turf/open/floor/plasteel,
-/area/security/processing)
"xEu" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
@@ -60552,11 +60448,42 @@
/obj/machinery/vending/wardrobe/curator_wardrobe,
/turf/open/floor/carpet,
/area/library)
+"xGQ" = (
+/obj/structure/sign/plaques/golden{
+ pixel_y = 32
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ai_monitored/security/armory)
"xIa" = (
/obj/structure/table,
/obj/effect/spawner/lootdrop/grille_or_trash,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"xJW" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Security Maintenance";
+ req_access_txt = "1"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/security/main)
"xLX" = (
/obj/structure/lattice/catwalk,
/obj/item/stack/marker_beacon{
@@ -60607,6 +60534,34 @@
},
/turf/open/floor/plating,
/area/hallway/secondary/entry)
+"xSW" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/ai_monitored/security/armory)
+"xTe" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/turf/open/floor/plasteel,
+/area/ai_monitored/security/armory)
"xTy" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -60636,6 +60591,35 @@
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/nuke_storage)
+"xUX" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/rack,
+/obj/item/storage/box/zipties{
+ pixel_x = -1;
+ pixel_y = 1
+ },
+/obj/item/storage/box/zipties{
+ pixel_x = 1;
+ pixel_y = -1
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
+"xWq" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = 0;
+ pixel_y = -32
+ },
+/turf/open/floor/plating,
+/area/security/processing)
"xXi" = (
/obj/machinery/vending/clothing,
/turf/open/floor/plasteel,
@@ -60653,13 +60637,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/pool)
-"ybm" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/security/brig)
"ycd" = (
/obj/structure/toilet{
dir = 4
@@ -60690,11 +60667,40 @@
},
/turf/open/floor/plasteel,
/area/science/circuit)
+"ycY" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#d1dfff"
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
+"yds" = (
+/obj/effect/decal/cleanable/vomit,
+/obj/structure/chair{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
"ydD" = (
/obj/effect/turf_decal/bot,
/obj/machinery/suit_storage_unit/rd,
/turf/open/floor/plasteel,
/area/science/mixing)
+"ydM" = (
+/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plating,
+/area/maintenance/fore/secondary)
+"yhx" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/turf/closed/wall/r_wall,
+/area/security/brig)
"yhz" = (
/obj/structure/table,
/obj/item/folder/blue,
@@ -79816,7 +79822,7 @@ alU
amC
alU
aaH
-hXr
+rJw
arO
amC
amC
@@ -80074,7 +80080,7 @@ anK
ali
aaf
alU
-hXr
+rJw
alU
atW
atW
@@ -80840,7 +80846,7 @@ aae
aaa
aaa
ali
-dyB
+yds
amC
aon
aoW
@@ -81101,7 +81107,7 @@ aKY
amC
amC
amC
-ndJ
+gsM
aqR
aqR
aGh
@@ -81354,7 +81360,7 @@ aaa
aaa
aaa
ali
-kxG
+nBI
anL
aoo
aoX
@@ -81617,9 +81623,9 @@ alU
alU
arP
aqR
-tYH
-pEL
-lXX
+wje
+rQJ
+uUi
avZ
xtP
ayA
@@ -81872,11 +81878,11 @@ aaa
aaa
aaa
arP
-dHU
-iSW
-vQo
-kXd
-ecD
+vqP
+inw
+gzY
+rtC
+izg
awa
axq
qyj
@@ -82129,12 +82135,12 @@ aaa
aaa
aaa
aqQ
-nea
-vQo
-jKC
+uCo
+gzY
+eAG
aqR
aqR
-xhn
+kTj
xxi
ayD
cGz
@@ -82388,9 +82394,9 @@ aaa
aqQ
aqR
aqR
-iiQ
-usK
-tQi
+pjg
+sqg
+inq
avZ
xxi
ayD
@@ -82643,8 +82649,8 @@ aaa
aaa
aaa
aqQ
-nea
-vQo
+uCo
+gzY
arP
arP
arP
@@ -83149,16 +83155,16 @@ aaa
aaa
aaa
aiU
-iqU
+hlT
aiU
aaa
aiU
-oMS
+vxX
aiU
gXs
arP
-tfG
-nqz
+lZs
+dPq
arP
asP
cya
@@ -83392,16 +83398,16 @@ aaa
aaa
aaa
aaa
-jLl
+jLv
aaa
aaa
aaa
-qxq
-qxq
-qxq
-rKX
-qxq
-qxq
+gWo
+gWo
+gWo
+dYZ
+gWo
+gWo
gXs
gXs
gXs
@@ -83654,27 +83660,27 @@ abc
abc
afu
abc
-vdU
+wdr
itQ
pgn
tmO
-qxq
+gWo
xUe
aiU
aiT
-weW
-nat
+nEj
+vTP
aiU
amK
aiU
-pek
-nQM
+mkU
+xWq
arP
asR
-vQo
-oRg
-cME
-jtV
+gzY
+fdQ
+ngU
+kUC
arP
awc
axt
@@ -83911,13 +83917,13 @@ aea
aeH
aft
abc
-nrg
+pDe
dly
mnC
mcp
-qxq
-tXk
-xDQ
+gWo
+oDm
+ibK
akb
ahq
akI
@@ -83925,14 +83931,14 @@ ahU
aiT
aiD
akI
-ubI
-kgH
-qpg
-vQo
+uFZ
+hBw
+vLo
+gzY
aqR
-vQo
-vQo
-mdo
+gzY
+gzY
+esK
awb
axt
ayG
@@ -84170,25 +84176,25 @@ afw
abc
abc
dly
-lAa
+xxp
mcp
-rKX
+dYZ
kMt
-wZe
-wUV
+nTG
+rhX
ahr
ahD
ahV
agr
-oOt
-mnQ
-jIr
+fJY
+eXz
+pUy
arP
arP
arP
arP
-pwd
-oFV
+iPX
+nnp
arP
awb
axt
@@ -84427,19 +84433,19 @@ afv
agf
abc
dly
-lAa
+xxp
mcp
-qxq
-wGf
-dIP
-wsI
+gWo
+gDP
+lAH
+lNH
akG
akG
-hMo
-iuJ
-daA
+kHd
+vGn
+gav
cxP
-jIr
+pUy
arP
aqU
arg
@@ -84447,8 +84453,8 @@ arP
arP
arP
arP
-hMM
-jFe
+vgJ
+hSl
ayG
azL
aBf
@@ -84683,10 +84689,10 @@ aeL
afy
agh
abc
-qCC
+kCa
hnU
vda
-dXP
+sXV
agv
amM
aiX
@@ -84694,15 +84700,15 @@ aiX
aiX
aiX
aiX
-rYg
-xDQ
-jIr
+foT
+ibK
+pUy
arP
aqR
arl
arP
asS
-uwb
+sfs
aqR
awb
axt
@@ -84940,11 +84946,11 @@ aeK
afx
agg
abc
-dWM
+ovv
dCV
idK
age
-vyc
+kZS
agu
agj
amL
@@ -84958,7 +84964,7 @@ arP
arc
arP
arP
-jvO
+usE
aqR
aqR
awb
@@ -85197,7 +85203,7 @@ aeN
afA
afA
abc
-wVh
+kuA
laq
kdP
mGw
@@ -85452,15 +85458,15 @@ adF
aef
aeM
afz
-okI
+oSl
ail
-wPh
+lRb
vIi
fsj
-dXP
-vZS
-qUk
-jhb
+sXV
+xnm
+rAR
+uCU
and
arS
anq
@@ -85692,7 +85698,7 @@ aaa
aaa
aaa
aag
-tcg
+thB
aai
aai
aai
@@ -85709,20 +85715,20 @@ adH
aei
aeO
afJ
-dXP
-dXP
-dXP
-dXP
-dXP
-dXP
-gjc
+sXV
+sXV
+sXV
+sXV
+sXV
+sXV
+oby
ajX
agj
amL
asp
-sea
+nbY
aiX
-qmV
+iRj
anz
aov
cCi
@@ -85972,14 +85978,14 @@ agY
ahS
aiI
afn
-usv
+vfX
akD
agj
agj
agj
agj
aiX
-vcQ
+ycY
anz
aov
cCi
@@ -86228,14 +86234,14 @@ afI
ahb
ahZ
aiL
-gZQ
+lZn
akg
-oWe
+kuh
aly
anP
-sAr
-mym
-pWM
+gyr
+okK
+xal
aqC
anz
aov
@@ -86487,11 +86493,11 @@ aid
aiM
ajz
alz
-xCp
+cZe
alg
-rZB
-uto
-drO
+plS
+dyE
+pQr
aou
aqC
anz
@@ -86735,7 +86741,7 @@ abM
acG
adI
aem
-fLS
+omX
afG
aim
afL
@@ -86743,18 +86749,18 @@ ahu
aie
aiO
afn
-iaX
+xzv
agL
akT
-uwq
-fEw
-hwJ
+gNE
+gLz
+rcI
seP
aqC
anz
aov
cCi
-mNJ
+tKb
arT
arT
asn
@@ -87001,7 +87007,7 @@ afn
agj
agj
agM
-oiW
+sAk
akp
akQ
amB
@@ -87257,13 +87263,13 @@ afM
aig
agp
agj
-hkH
+lfV
akl
akM
amm
-sAr
+gyr
anM
-dys
+rJv
aqC
anz
aox
@@ -87513,13 +87519,13 @@ ajg
afM
akU
afM
-kGl
+lBz
alA
-hxc
+ene
alg
-dmX
-uto
-lhh
+kbm
+dyE
+cKC
seP
aqC
anR
@@ -87770,12 +87776,12 @@ ajL
akj
afM
afM
-csK
-kPY
+nss
+kQz
alB
akT
-uwq
-fEw
+gNE
+gLz
anB
amR
aqC
@@ -88024,12 +88030,12 @@ aeV
agj
agj
agj
-gCm
+tHh
ahG
ajY
-lKL
+fxx
ako
-hxc
+ene
amj
akQ
amB
@@ -88279,7 +88285,7 @@ acd
aeP
afC
agk
-pKR
+cOV
agP
ajJ
agT
@@ -88289,9 +88295,9 @@ aku
akl
amk
amm
-sAr
-guS
-dys
+gyr
+mos
+rJv
aqC
anz
aov
@@ -88536,17 +88542,17 @@ acd
aer
afB
agi
-qLc
+eWL
afN
ajK
aiH
akF
aiy
akv
-kdS
+uXt
alg
-nVk
-uto
+pAK
+dyE
anQ
seP
aqC
@@ -88798,9 +88804,9 @@ afS
ahx
aiX
aiQ
-eCQ
+xUX
akx
-ybm
+uTe
akT
amx
any
@@ -89057,7 +89063,7 @@ aij
aiR
ajc
akz
-hxc
+ene
als
akQ
amB
@@ -89314,7 +89320,7 @@ aim
aiW
ajc
akz
-hxc
+ene
alg
alt
amp
@@ -89569,11 +89575,11 @@ agt
aaZ
aaZ
aaZ
-wfA
+fsa
akz
-rFw
+itD
alg
-eRh
+vyK
amI
alg
alv
@@ -89826,14 +89832,14 @@ agz
ahW
ain
aiZ
-lcu
+jyO
ajC
akC
akX
alw
amJ
aoY
-soA
+rCl
aqE
anz
aoz
@@ -89879,7 +89885,7 @@ aDt
aEO
aGc
vOU
-hIS
+rTD
dml
dml
oNz
@@ -90083,7 +90089,7 @@ agH
agH
aip
aja
-lCf
+xTe
akz
alg
agn
@@ -90340,7 +90346,7 @@ afd
ahB
aiq
ajb
-hrE
+mml
ajF
akN
akY
@@ -90597,7 +90603,7 @@ agI
ahQ
ait
aje
-jOY
+eFx
alj
afM
akZ
@@ -90854,7 +90860,7 @@ ahK
ahR
aiv
adg
-oaZ
+xSW
ajI
alC
ala
@@ -91111,7 +91117,7 @@ agX
aaZ
aaZ
aaZ
-lZR
+xGQ
ajN
amc
alo
@@ -91356,7 +91362,7 @@ aaf
aaa
adR
abO
-wWS
+wlI
abO
abV
ags
@@ -91368,7 +91374,7 @@ akc
aik
akh
adR
-oMZ
+esL
aiG
amf
anr
@@ -91626,7 +91632,7 @@ aju
aki
akk
akq
-gbM
+lwN
amq
agn
amb
@@ -91884,7 +91890,7 @@ aia
aiP
aka
akE
-sAr
+gyr
alq
amd
anu
@@ -92139,7 +92145,7 @@ agZ
ahI
aiw
adR
-jmg
+vIo
ake
ame
aaQ
@@ -92398,7 +92404,7 @@ aiz
adR
akf
akJ
-wMI
+yhx
agn
agn
agn
@@ -92918,7 +92924,7 @@ alI
ams
amZ
amZ
-kZo
+cqQ
anW
aoH
cSA
@@ -93416,7 +93422,7 @@ abQ
abU
acj
acv
-agW
+dJL
afj
afX
agC
@@ -93946,7 +93952,7 @@ ale
alD
ana
ana
-neq
+fMp
amu
ajo
aps
@@ -94707,7 +94713,7 @@ aga
abp
ahj
abp
-wBr
+xJW
abp
ajo
ajo
@@ -94959,11 +94965,11 @@ abp
abp
adR
abp
-nbK
+lJC
agj
adR
ahl
-oWB
+uHp
aic
ahT
ahT
@@ -94976,7 +94982,7 @@ alL
ahT
anb
ahT
-xkL
+ydM
anZ
apu
arf
@@ -95226,8 +95232,8 @@ aif
aif
aif
aif
-fpz
aif
+fpz
bkV
jKP
alK
@@ -95473,7 +95479,7 @@ abp
abp
abp
abp
-vxA
+mxn
abp
abp
ahn
@@ -96758,7 +96764,7 @@ aaa
aaa
bvG
aaa
-nBM
+jdj
aaa
oyN
aaa
diff --git a/_maps/shuttles/arrival_cog.dmm b/_maps/shuttles/arrival_cog.dmm
new file mode 100644
index 0000000000..2ecbccaaab
--- /dev/null
+++ b/_maps/shuttles/arrival_cog.dmm
@@ -0,0 +1,278 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/arrival)
+"c" = (
+/obj/structure/shuttle/engine/propulsion/right{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"d" = (
+/obj/structure/shuttle/engine/propulsion/left{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"e" = (
+/obj/docking_port/mobile/arrivals{
+ dir = 2;
+ dwidth = 4;
+ height = 12;
+ name = "cog arrivals shuttle";
+ width = 9
+ },
+/turf/template_noop,
+/area/template_noop)
+"f" = (
+/turf/closed/wall/mineral/titanium/nosmooth,
+/area/shuttle/arrival)
+"g" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 1
+ },
+/obj/structure/window/reinforced/spawner,
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"h" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 1
+ },
+/turf/closed/wall/mineral/titanium/nosmooth,
+/area/shuttle/arrival)
+"i" = (
+/obj/machinery/sleeper,
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/arrival)
+"j" = (
+/obj/structure/closet/emcloset/anchored,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/arrival)
+"k" = (
+/obj/structure/table/reinforced,
+/obj/item/radio,
+/obj/item/storage/toolbox/emergency,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/arrival)
+"l" = (
+/obj/machinery/sleeper,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/arrival)
+"m" = (
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"n" = (
+/obj/structure/window/shuttle,
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"o" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"p" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"q" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"r" = (
+/obj/machinery/door/airlock/external{
+ name = "Arrival Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"s" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/firstaid/regular,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"t" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/emergency,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"u" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"v" = (
+/obj/structure/table/reinforced,
+/obj/item/radio,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"w" = (
+/obj/machinery/computer{
+ dir = 1;
+ name = "Shuttle computer"
+ },
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"x" = (
+/obj/machinery/computer{
+ dir = 1;
+ name = "Shuttle computer"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"y" = (
+/obj/machinery/computer{
+ dir = 1;
+ name = "Shuttle computer"
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+
+(1,1,1) = {"
+a
+c
+h
+b
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+b
+f
+b
+b
+n
+b
+b
+r
+b
+b
+b
+a
+"}
+(3,1,1) = {"
+c
+g
+i
+m
+o
+o
+p
+m
+s
+u
+b
+b
+"}
+(4,1,1) = {"
+d
+g
+j
+m
+o
+o
+o
+m
+o
+o
+w
+n
+"}
+(5,1,1) = {"
+e
+f
+k
+m
+m
+m
+m
+m
+m
+m
+x
+n
+"}
+(6,1,1) = {"
+c
+g
+j
+m
+o
+o
+o
+m
+o
+o
+y
+n
+"}
+(7,1,1) = {"
+d
+g
+l
+m
+o
+o
+q
+m
+t
+v
+b
+b
+"}
+(8,1,1) = {"
+b
+f
+b
+b
+n
+b
+b
+r
+b
+b
+b
+a
+"}
+(9,1,1) = {"
+a
+d
+h
+b
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/shuttles/emergency_cog.dmm b/_maps/shuttles/emergency_cog.dmm
new file mode 100644
index 0000000000..ad71dba4bd
--- /dev/null
+++ b/_maps/shuttles/emergency_cog.dmm
@@ -0,0 +1,546 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"c" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"d" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"e" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"f" = (
+/obj/machinery/status_display/evac,
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"g" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"h" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"i" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"j" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/emergency,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"k" = (
+/obj/structure/chair/comfy/brown{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"l" = (
+/obj/machinery/vending/wallmed,
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"m" = (
+/obj/effect/spawner/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"n" = (
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"o" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/obj/docking_port/mobile/emergency{
+ dheight = 0;
+ dir = 2;
+ dwidth = 9;
+ name = "NES Classic";
+ width = 22
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"p" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"q" = (
+/obj/machinery/sleeper,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"r" = (
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"s" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"t" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"u" = (
+/obj/structure/chair/comfy/brown{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"v" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/table/reinforced,
+/obj/item/radio,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"w" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Emergency Shuttle Infirmary"
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"x" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Emergency Shuttle Cockpit";
+ req_access_txt = "19"
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"y" = (
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"z" = (
+/obj/machinery/computer/emergency_shuttle{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"A" = (
+/obj/structure/chair/comfy/brown{
+ dir = 4
+ },
+/obj/machinery/light/small,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"B" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced,
+/obj/item/storage/firstaid/regular,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"C" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/firstaid/regular,
+/obj/structure/window/reinforced,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"D" = (
+/obj/machinery/light,
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"H" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"J" = (
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"K" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Emergency Shuttle Brig";
+ req_access_txt = "2"
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"P" = (
+/obj/structure/table/optable,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"Q" = (
+/obj/machinery/light,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"R" = (
+/obj/machinery/light/small,
+/obj/structure/table,
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"T" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"V" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"W" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"X" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 4
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Y" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+a
+d
+b
+b
+b
+d
+b
+b
+b
+d
+a
+"}
+(2,1,1) = {"
+W
+d
+p
+p
+p
+d
+p
+p
+p
+d
+X
+"}
+(3,1,1) = {"
+c
+d
+q
+n
+P
+d
+H
+H
+H
+d
+Y
+"}
+(4,1,1) = {"
+d
+l
+q
+n
+R
+d
+T
+J
+H
+d
+d
+"}
+(5,1,1) = {"
+d
+d
+d
+w
+f
+d
+f
+K
+d
+d
+d
+"}
+(6,1,1) = {"
+d
+t
+t
+r
+s
+s
+s
+r
+s
+s
+d
+"}
+(7,1,1) = {"
+g
+r
+r
+r
+s
+s
+s
+r
+s
+s
+m
+"}
+(8,1,1) = {"
+m
+r
+r
+Q
+d
+m
+d
+V
+s
+s
+m
+"}
+(9,1,1) = {"
+g
+r
+r
+r
+r
+r
+r
+r
+s
+s
+m
+"}
+(10,1,1) = {"
+m
+r
+r
+s
+s
+s
+s
+r
+r
+r
+m
+"}
+(11,1,1) = {"
+d
+d
+r
+s
+s
+s
+s
+r
+r
+d
+d
+"}
+(12,1,1) = {"
+m
+h
+r
+r
+r
+r
+r
+r
+r
+h
+m
+"}
+(13,1,1) = {"
+d
+e
+s
+s
+s
+r
+s
+s
+s
+D
+d
+"}
+(14,1,1) = {"
+m
+s
+s
+s
+s
+r
+s
+s
+s
+s
+m
+"}
+(15,1,1) = {"
+o
+r
+r
+r
+r
+r
+s
+s
+s
+s
+m
+"}
+(16,1,1) = {"
+m
+r
+r
+s
+s
+r
+s
+s
+s
+s
+m
+"}
+(17,1,1) = {"
+g
+r
+r
+r
+i
+r
+i
+r
+r
+r
+d
+"}
+(18,1,1) = {"
+d
+d
+d
+m
+d
+x
+f
+m
+d
+d
+d
+"}
+(19,1,1) = {"
+a
+a
+m
+j
+k
+y
+k
+C
+m
+a
+a
+"}
+(20,1,1) = {"
+a
+a
+d
+d
+u
+k
+A
+d
+d
+a
+a
+"}
+(21,1,1) = {"
+a
+a
+a
+m
+v
+z
+B
+m
+a
+a
+a
+"}
+(22,1,1) = {"
+a
+a
+a
+d
+m
+m
+m
+d
+a
+a
+a
+"}
diff --git a/_maps/shuttles/labour_cog.dmm b/_maps/shuttles/labour_cog.dmm
new file mode 100644
index 0000000000..10f6561ed3
--- /dev/null
+++ b/_maps/shuttles/labour_cog.dmm
@@ -0,0 +1,349 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/labor)
+"b" = (
+/obj/structure/shuttle/engine/propulsion{
+ icon_state = "propulsion";
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/labor)
+"c" = (
+/obj/structure/shuttle/engine/heater{
+ icon_state = "heater";
+ dir = 1
+ },
+/obj/structure/window/reinforced,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/labor)
+"d" = (
+/obj/structure/closet/crate/internals,
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"e" = (
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"f" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"g" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/door/airlock/shuttle{
+ id_tag = "prisonshuttle";
+ name = "Labor Shuttle Airlock"
+ },
+/turf/open/floor/plating,
+/area/shuttle/labor)
+"h" = (
+/obj/structure/grille,
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/labor)
+"i" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"j" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"k" = (
+/obj/machinery/flasher{
+ id = "gulagshuttleflasher";
+ pixel_x = 25
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"l" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"m" = (
+/obj/machinery/light,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"n" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/labor)
+"o" = (
+/obj/machinery/mineral/labor_claim_console{
+ machinedir = 2;
+ pixel_x = 30
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"p" = (
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"q" = (
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#c1caff"
+ },
+/obj/machinery/button/flasher{
+ dir = 1;
+ id = "gulagshuttleflasher";
+ name = "Flash Control";
+ pixel_y = 26;
+ req_access_txt = "1"
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"r" = (
+/obj/docking_port/mobile{
+ dir = 8;
+ dwidth = 2;
+ height = 5;
+ id = "laborcamp";
+ name = "labor camp shuttle";
+ port_direction = 4;
+ width = 9
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/door/airlock/shuttle{
+ name = "Labor Shuttle Airlock";
+ req_access_txt = "2"
+ },
+/turf/open/floor/plating,
+/area/shuttle/labor)
+"s" = (
+/obj/machinery/computer/shuttle/labor{
+ dir = 4
+ },
+/obj/structure/reagent_dispensers/peppertank{
+ pixel_x = -31
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"t" = (
+/obj/structure/chair/office/dark,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"u" = (
+/obj/structure/table/reinforced,
+/obj/item/folder/red,
+/obj/item/restraints/handcuffs,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"v" = (
+/obj/structure/window/shuttle,
+/turf/open/floor/plating/airless,
+/area/shuttle/labor)
+"w" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Labor Shuttle Airlock";
+ req_access_txt = "2"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"x" = (
+/obj/machinery/mineral/stacking_machine/laborstacker{
+ input_dir = 2;
+ output_dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"y" = (
+/obj/machinery/mineral/stacking_unit_console{
+ machinedir = 2;
+ pixel_x = 30;
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+
+(1,1,1) = {"
+a
+a
+a
+h
+a
+a
+h
+a
+a
+"}
+(2,1,1) = {"
+b
+a
+d
+j
+l
+w
+p
+s
+v
+"}
+(3,1,1) = {"
+b
+c
+f
+e
+m
+n
+q
+t
+v
+"}
+(4,1,1) = {"
+b
+a
+i
+k
+o
+x
+y
+u
+v
+"}
+(5,1,1) = {"
+a
+a
+g
+a
+a
+a
+r
+a
+a
+"}
diff --git a/_maps/shuttles/whiteship_cog.dmm b/_maps/shuttles/whiteship_cog.dmm
new file mode 100644
index 0000000000..9410682219
--- /dev/null
+++ b/_maps/shuttles/whiteship_cog.dmm
@@ -0,0 +1,428 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/structure/shuttle/engine/propulsion/left{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"b" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/turf/closed/wall/mineral/titanium/nosmooth,
+/area/shuttle/abandoned)
+"c" = (
+/turf/closed/wall/mineral/titanium/interior,
+/area/shuttle/abandoned)
+"d" = (
+/turf/template_noop,
+/area/template_noop)
+"e" = (
+/obj/structure/shuttle/engine/propulsion/burst{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"f" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/turf/closed/wall/mineral/titanium/interior,
+/area/shuttle/abandoned)
+"g" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/abandoned)
+"h" = (
+/obj/machinery/door/airlock/external,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"i" = (
+/obj/machinery/suit_storage_unit/security,
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/obj/machinery/airalarm/all_access{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+"j" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/abandoned)
+"k" = (
+/obj/machinery/door/airlock/external,
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+"l" = (
+/obj/structure/shuttle/engine/propulsion/right{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"m" = (
+/obj/structure/bed,
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"n" = (
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"o" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"p" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"q" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced/spawner/east,
+/obj/machinery/recharger,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+"r" = (
+/obj/structure/filingcabinet,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"s" = (
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"t" = (
+/turf/closed/wall/mineral/titanium/nosmooth,
+/area/shuttle/abandoned)
+"u" = (
+/obj/machinery/door/airlock/security,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"v" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"w" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"x" = (
+/obj/machinery/door/firedoor/border_only/closed{
+ icon_state = "door_closed";
+ dir = 4
+ },
+/obj/machinery/door/window/eastright,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+"y" = (
+/obj/structure/table/reinforced,
+/obj/item/paper_bin,
+/obj/item/pen,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"z" = (
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"A" = (
+/obj/machinery/door/window/eastright,
+/obj/structure/toilet{
+ contents = newlist(/obj/item/toy/snappop/phoenix);
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"B" = (
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#c1caff"
+ },
+/obj/machinery/flasher{
+ id = "cogws";
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"C" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/closet/crate/secure/weapon,
+/obj/item/gun/energy/laser/carbine,
+/obj/machinery/button/flasher{
+ id = "cogws";
+ pixel_x = -24;
+ pixel_y = 8
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"D" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/closet/crate/secure/weapon,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/item/gun/energy/e_gun/stun,
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"E" = (
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/obj/machinery/airalarm/all_access{
+ dir = 4;
+ pixel_x = -24
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"F" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"G" = (
+/obj/machinery/computer/shuttle/white_ship{
+ dir = 8
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"H" = (
+/obj/item/clothing/glasses/sunglasses/blindfold,
+/obj/machinery/airalarm/all_access{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"I" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/glasses/sunglasses,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"J" = (
+/obj/structure/curtain,
+/obj/machinery/shower{
+ name = "shower";
+ pixel_y = 12
+ },
+/obj/item/soap/nanotrasen,
+/turf/open/floor/plasteel/white,
+/area/shuttle/abandoned)
+"K" = (
+/obj/structure/mirror{
+ pixel_y = 32
+ },
+/obj/structure/sink{
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/abandoned)
+"L" = (
+/obj/machinery/door/airlock/shuttle,
+/turf/open/floor/plasteel/white,
+/area/shuttle/abandoned)
+"M" = (
+/obj/structure/toilet{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/obj/machinery/airalarm/all_access{
+ dir = 1;
+ pixel_y = -24
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/abandoned)
+"N" = (
+/obj/machinery/door/airlock/external,
+/obj/structure/fans/tiny,
+/obj/docking_port/mobile{
+ dir = 2;
+ dwidth = 7;
+ height = 9;
+ id = "whiteship";
+ movement_force = list("KNOCKDOWN" = 0, "THROW" = 0);
+ name = "Prisoner Transport";
+ port_direction = 8;
+ preferred_direction = 4;
+ width = 13
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+
+(1,1,1) = {"
+a
+e
+l
+g
+c
+g
+a
+e
+l
+"}
+(2,1,1) = {"
+b
+f
+f
+t
+A
+t
+f
+f
+b
+"}
+(3,1,1) = {"
+c
+g
+m
+n
+n
+n
+m
+g
+c
+"}
+(4,1,1) = {"
+d
+c
+m
+n
+n
+n
+m
+c
+d
+"}
+(5,1,1) = {"
+d
+h
+n
+n
+B
+H
+n
+h
+d
+"}
+(6,1,1) = {"
+d
+g
+c
+u
+c
+g
+c
+g
+d
+"}
+(7,1,1) = {"
+c
+c
+o
+v
+C
+c
+J
+c
+c
+"}
+(8,1,1) = {"
+c
+i
+p
+w
+D
+c
+K
+M
+c
+"}
+(9,1,1) = {"
+c
+g
+q
+x
+c
+g
+L
+g
+c
+"}
+(10,1,1) = {"
+d
+j
+r
+s
+E
+s
+s
+j
+d
+"}
+(11,1,1) = {"
+d
+N
+s
+s
+F
+s
+s
+k
+d
+"}
+(12,1,1) = {"
+d
+j
+j
+y
+G
+I
+j
+j
+d
+"}
+(13,1,1) = {"
+d
+d
+j
+z
+z
+z
+j
+d
+d
+"}
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index f1f0d45e90..7bcca68713 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -36,39 +36,38 @@
#define CAN_CLIMAX_WITH (1<<7)
#define GENITAL_CAN_AROUSE (1<<8)
+
+#define DEF_VAGINA_SHAPE "Human"
+
#define COCK_SIZE_MIN 1
+#define COCK_SIZE_DEF 6
#define COCK_SIZE_MAX 20
#define COCK_DIAMETER_RATIO_MAX 0.42
#define COCK_DIAMETER_RATIO_DEF 0.25
#define COCK_DIAMETER_RATIO_MIN 0.15
-#define KNOT_GIRTH_RATIO_MAX 3
-#define KNOT_GIRTH_RATIO_DEF 2.1
-#define KNOT_GIRTH_RATIO_MIN 1.25
-
+#define DEF_COCK_SHAPE "Human"
#define BALLS_VOLUME_BASE 25
#define BALLS_VOLUME_MULT 1
+#define DEF_BALLS_SHAPE "Single"
+
#define BALLS_SIZE_MIN 1
#define BALLS_SIZE_DEF 2
#define BALLS_SIZE_MAX 3
-#define BALLS_SACK_SIZE_MIN 1
-#define BALLS_SACK_SIZE_DEF 8
-#define BALLS_SACK_SIZE_MAX 40
-
#define CUM_RATE 2 // holy shit what a really shitty define name - relates to units per arbitrary measure of time?
#define CUM_RATE_MULT 1
#define CUM_EFFICIENCY 1 //amount of nutrition required per life()
-#define EGG_GIRTH_MIN 1//inches
-#define EGG_GIRTH_DEF 6
-#define EGG_GIRTH_MAX 16
-
#define BREASTS_VOLUME_BASE 50 //base volume for the reagents in the breasts, multiplied by the size then multiplier. 50u for A cups, 850u for HH cups.
#define BREASTS_VOLUME_MULT 1 //global multiplier for breast volume.
+#define BREASTS_SIZE_DEF "c" //lowercase cause those sprite accessory don't use uppercased letters.
+
+#define DEF_BREASTS_SHAPE "Pair"
+
#define MILK_RATE 5
#define MILK_RATE_MULT 1
#define MILK_EFFICIENCY 1
@@ -83,8 +82,6 @@
//Citadel istypes
#define isgenital(A) (istype(A, /obj/item/organ/genital))
-#define isborer(A) (istype(A, /mob/living/simple_animal/borer))
-
#define CITADEL_MENTOR_OOC_COLOUR "#224724"
//xenobio console upgrade stuff
@@ -92,14 +89,6 @@
#define XENOBIO_UPGRADE_SLIMEBASIC 2
#define XENOBIO_UPGRADE_SLIMEADV 4
-//stamina stuff
-#define STAMINA_SOFTCRIT 100 //softcrit for stamina damage. prevents standing up, prevents performing actions that cost stamina, etc, but doesn't force a rest or stop movement
-#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit
-#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations
-#define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT
-
-#define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob
-
//Citadel toggles because bitflag memes
#define MEDIHOUND_SLEEPER (1<<0)
#define EATING_NOISES (1<<1)
@@ -117,8 +106,6 @@
#define TOGGLES_CITADEL (EATING_NOISES|DIGESTION_NOISES|BREAST_ENLARGEMENT|PENIS_ENLARGEMENT)
//component stuff
-#define COMSIG_COMBAT_TOGGLED "combatmode_toggled" //called by combat mode toggle on all equipped items. args: (mob/user, combatmode)
-
#define COMSIG_VORE_TOGGLED "voremode_toggled" // totally not copypasta
//belly sound pref things
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 4304af77f3..c750119701 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -29,7 +29,54 @@
#define EFFECT_DROWSY "drowsy"
#define EFFECT_JITTER "jitter"
+// /mob/living/combat_flags
+#define CAN_TOGGLE_COMBAT_MODE(mob) FORCE_BOOLEAN((mob.stat == CONSCIOUS) && !(mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
+
+/// Default combat flags for those affected by ((stamina combat))
+#define COMBAT_FLAGS_DEFAULT NONE
+/// Default combat flags for everyone else (so literally everyone but humans)
+#define COMBAT_FLAGS_STAMSYSTEM_EXEMPT (COMBAT_FLAG_SPRINT_ACTIVE | COMBAT_FLAG_COMBAT_ACTIVE | COMBAT_FLAG_SPRINT_TOGGLED | COMBAT_FLAG_COMBAT_TOGGLED)
+/// Default combat flags for those only affected by sprint (so just silicons)
+#define COMBAT_FLAGS_STAMEXEMPT_YESSPRINT (COMBAT_FLAG_COMBAT_ACTIVE | COMBAT_FLAG_COMBAT_TOGGLED)
+
+/// The user wants combat mode on
+#define COMBAT_FLAG_COMBAT_TOGGLED (1<<0)
+/// The user wants sprint mode on
+#define COMBAT_FLAG_SPRINT_TOGGLED (1<<1)
+/// Combat mode is currently active
+#define COMBAT_FLAG_COMBAT_ACTIVE (1<<2)
+/// Sprint is currently active
+#define COMBAT_FLAG_SPRINT_ACTIVE (1<<3)
+/// Currently attempting to crawl under someone
+#define COMBAT_FLAG_ATTEMPTING_CRAWL (1<<4)
+/// Currently stamcritted
+#define COMBAT_FLAG_HARD_STAMCRIT (1<<5)
+/// Currently attempting to resist up from the ground
+#define COMBAT_FLAG_RESISTING_REST (1<<6)
+/// Intentionally resting
+#define COMBAT_FLAG_INTENTIONALLY_RESTING (1<<7)
+/// Currently stamcritted but not as violently
+#define COMBAT_FLAG_SOFT_STAMCRIT (1<<8)
+
+// Helpers for getting someone's stamcrit state. Cast to living.
+#define NOT_STAMCRIT 0
+#define SOFT_STAMCRIT 1
+#define HARD_STAMCRIT 2
+
+// Stamcrit check helpers
+#define IS_STAMCRIT(mob) (CHECK_STAMCRIT(mob) != NOT_STAMCRIT)
+#define CHECK_STAMCRIT(mob) ((mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)? HARD_STAMCRIT : ((mob.combat_flags & COMBAT_FLAG_SOFT_STAMCRIT)? SOFT_STAMCRIT : NOT_STAMCRIT))
+
+//stamina stuff
+#define STAMINA_SOFTCRIT 100 //softcrit for stamina damage. prevents standing up, prevents performing actions that cost stamina, etc, but doesn't force a rest or stop movement
+#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit
+#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations
+#define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT
+
+#define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob
+
//Bitflags defining which status effects could be or are inflicted on a mob
+// This is a bit out of date/inaccurate in light of all the new status effects and is probably pending rework.
#define CANSTUN (1<<0)
#define CANKNOCKDOWN (1<<1)
#define CANUNCONSCIOUS (1<<2)
@@ -203,3 +250,5 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting.
#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default.
#define BULLET_ACT_TURF "TURF" //It hit us but it should hit something on the same turf too. Usually used for turfs.
+
+
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index c4e57154c2..3d76390ce1 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -186,6 +186,8 @@
#define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive)
#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client)
#define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override)
+#define COMSIG_LIVING_COMBAT_ENABLED "combatmode_enabled" //from base of mob/living/enable_combat_mode() (was_forced)
+#define COMSIG_LIVING_COMBAT_DISABLED "combatmode_disabled" //from base of mob/living/disable_combat_mode() (was_forced)
//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS!
#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore)
@@ -195,6 +197,7 @@
#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //from base of mob/living/Unconscious() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //from base of mob/living/Sleeping() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_DAZE "living_daze" //from base of mob/living/Daze() (amount, update, ignore)
+#define COMSIG_LIVING_STATUS_STAGGER "living_stagger" //from base of mob/living/Stagger() (amount, update, ignore)
#define COMPONENT_NO_STUN 1 //For all of them
// /mob/living/carbon signals
diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm
index 939f6698cb..6d263473b0 100644
--- a/code/__DEFINES/maths.dm
+++ b/code/__DEFINES/maths.dm
@@ -201,4 +201,7 @@
#define RULE_OF_THREE(a, b, x) ((a*x)/b)
// )
-#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y))
\ No newline at end of file
+#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y))
+
+/// Make sure something is a boolean TRUE/FALSE 1/0 value, since things like bitfield & bitflag doesn't always give 1s and 0s.
+#define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE)
diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm
index 49cfba8cd2..5775e128f8 100644
--- a/code/__DEFINES/say.dm
+++ b/code/__DEFINES/say.dm
@@ -81,7 +81,8 @@
//Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
#define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen?
-#define MAX_FAVOR_LEN 4096 //double the maximum message length.
+#define MAX_FLAVOR_LEN 4096 //double the maximum message length.
+#define MAX_TASTE_LEN 40 //lick... vore... ew...
#define MAX_NAME_LEN 42
#define MAX_BROADCAST_LEN 512
#define MAX_CHARTER_LEN 80
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index ef86db07cb..a7ffd1c543 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -53,6 +53,9 @@
#define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep
+/// Blocks sprint
+#define STATUS_EFFECT_STAGGERED /datum/status_effect/staggered
+
#define STATUS_EFFECT_TASED_WEAK /datum/status_effect/electrode //not as crippling, just slows down
#define STATUS_EFFECT_TASED /datum/status_effect/electrode/no_combat_mode //the affected has been tased, preventing fine muscle control
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index ba96b7cc7f..4f4b7c6baa 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -131,6 +131,8 @@
#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech"
#define TRAIT_SOOTHED_THROAT "soothed-throat"
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
+#define TRAIT_QUICK_CARRY "quick-carry"
+#define TRAIT_QUICKER_CARRY "quicker-carry"
#define TRAIT_STRONG_GRABBER "strong_grabber"
#define TRAIT_CALCIUM_HEALER "calcium_healer"
#define TRAIT_MAGIC_CHOKE "magic_choke"
@@ -144,6 +146,7 @@
#define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites.
#define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat.
#define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events"
+#define TRAIT_NO_MIDROUND_ANTAG "no-midround-antag" //can't be turned into an antag by random events
// mobility flag traits
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
@@ -159,6 +162,15 @@
#define TRAIT_SWIMMING "swimming" //only applied by /datum/element/swimming, for checking
+/**
+ * COMBAT MODE/SPRINT MODE TRAITS
+ */
+
+/// Prevents combat mode from being active.
+#define TRAIT_COMBAT_MODE_LOCKED "combatmode_locked"
+/// Prevents sprinting from being active.
+#define TRAIT_SPRINT_LOCKED "sprint_locked"
+
//non-mob traits
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
@@ -222,10 +234,13 @@
#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention
#define GHOSTROLE_TRAIT "ghostrole"
#define APHRO_TRAIT "aphro"
+#define BLOODSUCKER_TRAIT "bloodsucker"
+#define CLOTHING_TRAIT "clothing" //used for quirky carrygloves
// unique trait sources, still defines
#define STATUE_MUTE "statue"
#define CLONING_POD_TRAIT "cloning-pod"
+#define VIRTUAL_REALITY_TRAIT "vr_trait"
#define CHANGELING_DRAIN "drain"
#define CHANGELING_HIVEMIND_MUTE "ling_mute"
#define ABYSSAL_GAZE_BLIND "abyssal_gaze"
diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm
index ffc1bcc6b7..1954a159b3 100644
--- a/code/__HELPERS/_cit_helpers.dm
+++ b/code/__HELPERS/_cit_helpers.dm
@@ -139,18 +139,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
return TRUE
return FALSE
-/mob/living/carbon/proc/has_ovipositor()
- var/obj/item/organ/genital/G = getorganslot(ORGAN_SLOT_PENIS)
- if(G && istype(G, /obj/item/organ/genital/ovipositor))
- return TRUE
- return FALSE
-
-/mob/living/carbon/human/proc/has_eggsack()
- var/obj/item/organ/genital/G = getorganslot(ORGAN_SLOT_TESTICLES)
- if(G && istype(G, /obj/item/organ/genital/eggsack))
- return TRUE
- return FALSE
-
/mob/living/carbon/proc/is_groin_exposed(list/L)
if(!L)
L = get_equipped_items()
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 7852ab9d06..d847423853 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -181,35 +181,21 @@
"genitals_use_skintone" = FALSE,
"has_cock" = FALSE,
"cock_shape" = pick(GLOB.cock_shapes_list),
- "cock_length" = 6,
+ "cock_length" = COCK_SIZE_DEF,
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
- "has_sheath" = FALSE,
- "sheath_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"has_balls" = FALSE,
"balls_internal" = FALSE,
"balls_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
- "balls_amount" = 2,
- "balls_sack_size" = BALLS_SACK_SIZE_DEF,
"balls_size" = BALLS_SIZE_DEF,
- "balls_shape" = "Single",
+ "balls_shape" = DEF_BALLS_SHAPE,
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY,
- "has_ovi" = FALSE,
- "ovi_shape" = "knotted",
- "ovi_length" = 6,
- "ovi_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
- "has_eggsack" = FALSE,
- "eggsack_internal" = TRUE,
- "eggsack_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
- "eggsack_size" = BALLS_SACK_SIZE_DEF,
- "eggsack_egg_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
- "eggsack_egg_size" = EGG_GIRTH_DEF,
"has_breasts" = FALSE,
"breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"breasts_size" = pick(GLOB.breasts_size_list),
- "breasts_shape" = "Pair",
+ "breasts_shape" = DEF_BREASTS_SHAPE,
"breasts_producing" = FALSE,
"has_vag" = FALSE,
"vag_shape" = pick(GLOB.vagina_shapes_list),
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index b4cc682075..5367322d8e 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -238,5 +238,16 @@ GLOBAL_LIST_INIT(bitfields, list(
"MOBILITY_PULL" = MOBILITY_PULL,
"MOBILITY_HOLD" = MOBILITY_HOLD,
"MOBILITY_RESIST" = MOBILITY_RESIST
+ ),
+ "combat_flags" = list(
+ "COMBAT_FLAG_COMBAT_TOGGLED" = COMBAT_FLAG_COMBAT_TOGGLED,
+ "COMBAT_FLAG_SPRINT_TOGGLED" = COMBAT_FLAG_SPRINT_TOGGLED,
+ "COMBAT_FLAG_COMBAT_ACTIVE" = COMBAT_FLAG_COMBAT_ACTIVE,
+ "COMBAT_FLAG_SPRINT_ACTIVE" = COMBAT_FLAG_SPRINT_ACTIVE,
+ "COMBAT_FLAG_ATTEMPTING_CRAWL" = COMBAT_FLAG_ATTEMPTING_CRAWL,
+ "COMBAT_FLAG_HARD_STAMCRIT" = COMBAT_FLAG_HARD_STAMCRIT,
+ "COMBAT_FLAG_SOFT_STAMCRIT" = COMBAT_FLAG_SOFT_STAMCRIT,
+ "COMBAT_FLAG_INTENTIONALLY_RESTING" = COMBAT_FLAG_INTENTIONALLY_RESTING,
+ "COMBAT_FLAG_RESISTING_REST" = COMBAT_FLAG_RESISTING_REST
)
))
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index a6d7286e80..490f0aa0f0 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -128,7 +128,7 @@
//CITADEL CHANGES - sprint button
using = new /obj/screen/sprintbutton
using.icon = tg_ui_icon_to_cit_ui(ui_style)
- using.icon_state = (owner.sprinting ? "act_sprint_on" : "act_sprint")
+ using.icon_state = ((owner.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) ? "act_sprint_on" : "act_sprint")
using.screen_loc = ui_movi
using.hud = src
static_inventory += using
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 2fa2a8e85f..fe407509fe 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -11,7 +11,7 @@
if(item_flags & NO_ATTACK_CHAIN_SOFT_STAMCRIT)
if(isliving(user))
var/mob/living/L = user
- if(L.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(L))
to_chat(L, "You are too exhausted to swing [src]!")
return
if(tool_behaviour && target.tool_act(user, src, tool_behaviour))
@@ -58,7 +58,7 @@
if(item_flags & NOBLUDGEON)
return
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit
+ if(IS_STAMCRIT(user)) // CIT CHANGE - makes it impossible to attack in stamina softcrit
to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto
return // CIT CHANGE - ditto
@@ -88,7 +88,7 @@
return
if(item_flags & NOBLUDGEON)
return
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit
+ if(IS_STAMCRIT(user)) // CIT CHANGE - makes it impossible to attack in stamina softcrit
to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto
return // CIT CHANGE - ditto
user.adjustStaminaLossBuffered(getweight()*1.2)//CIT CHANGE - makes attacking things cause stamina loss
@@ -109,10 +109,8 @@
/mob/living/attacked_by(obj/item/I, mob/living/user)
//CIT CHANGES START HERE - combatmode and resting checks
var/totitemdamage = I.force
- if(iscarbon(user))
- var/mob/living/carbon/tempcarb = user
- if(!tempcarb.combatmode)
- totitemdamage *= 0.5
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ totitemdamage *= 0.5
if(!CHECK_MOBILITY(user, MOBILITY_STAND))
totitemdamage *= 0.5
//CIT CHANGES END HERE
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 52d2fe45cd..13facc7666 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -257,8 +257,7 @@ SUBSYSTEM_DEF(air)
T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY)
#endif
T.excited = TRUE
- active_turfs |= T
- SSair_turfs.currentrun |= T
+ active_turfs[T] = SSair_turfs.currentrun[T] = TRUE
if(blockchanges && T.excited_group)
T.excited_group.garbage_collect()
add_to_react_queue(T)
@@ -274,10 +273,9 @@ SUBSYSTEM_DEF(air)
/datum/controller/subsystem/air/proc/add_to_react_queue(turf/open/T)
if(istype(T) && T.air)
- turf_react_queue |= T
+ turf_react_queue[T] = TRUE
if(currentpart == SSAIR_REACTQUEUE)
- currentrun |= T
- return
+ currentrun[T] = TRUE
/datum/controller/subsystem/air/proc/remove_from_react_queue(turf/open/T)
turf_react_queue -= T
diff --git a/code/controllers/subsystem/processing/status_effects.dm b/code/controllers/subsystem/processing/status_effects.dm
new file mode 100644
index 0000000000..e8984a44cb
--- /dev/null
+++ b/code/controllers/subsystem/processing/status_effects.dm
@@ -0,0 +1,3 @@
+PROCESSING_SUBSYSTEM_DEF(status_effects)
+ wait = 1
+ flags = SS_TICKER
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 144f5f7946..19e418579e 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -676,7 +676,8 @@
//Preset for general and toggled actions
/datum/action/innate
- check_flags = 0
+ check_flags = NONE
+ required_mobility_flags = NONE
var/active = 0
/datum/action/innate/Trigger()
diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
index 0c41fb3e52..aa3f2d3969 100644
--- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
+++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
@@ -278,7 +278,7 @@
/datum/crafting_recipe/arrow
name = "Arrow"
- result = /obj/item/ammo_casing/caseless/arrow
+ result = /obj/item/ammo_casing/caseless/arrow/wood
time = 30
reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
/obj/item/stack/sheet/silk = 1,
@@ -293,17 +293,17 @@
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 1,
/obj/item/stack/sheet/sinew = 1,
- /obj/item/ammo_casing/caseless/arrow/ashen = 1)
+ /obj/item/ammo_casing/caseless/arrow/ash = 1)
category = CAT_WEAPONRY
subcategory = CAT_AMMO
/datum/crafting_recipe/ashen_arrow
name = "Fire Hardened Arrow"
- result = /obj/item/ammo_casing/caseless/arrow/ashen
+ result = /obj/item/ammo_casing/caseless/arrow/ash
tools = list(TOOL_WELDER)
time = 30
always_availible = FALSE
- reqs = list(/obj/item/ammo_casing/caseless/arrow = 1)
+ reqs = list(/obj/item/ammo_casing/caseless/arrow/wood = 1)
category = CAT_WEAPONRY
subcategory = CAT_AMMO
diff --git a/code/datums/components/phantomthief.dm b/code/datums/components/phantomthief.dm
index 7afe64994f..ede222d001 100644
--- a/code/datums/components/phantomthief.dm
+++ b/code/datums/components/phantomthief.dm
@@ -2,7 +2,7 @@
/datum/component/wearertargeting/phantomthief
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
- signals = list(COMSIG_COMBAT_TOGGLED)
+ signals = list(COMSIG_LIVING_COMBAT_ENABLED)
proctype = .proc/handlefilterstuff
var/filter_x
var/filter_y
diff --git a/code/datums/components/virtual_reality.dm b/code/datums/components/virtual_reality.dm
index 63e4f4f092..9239d4c565 100644
--- a/code/datums/components/virtual_reality.dm
+++ b/code/datums/components/virtual_reality.dm
@@ -58,6 +58,7 @@
RegisterSignal(current_mind, COMSIG_PRE_MIND_TRANSFER, .proc/pre_player_transfer)
if(mastermind?.current)
mastermind.current.audiovisual_redirect = M
+ ADD_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG, VIRTUAL_REALITY_TRAIT)
/datum/component/virtual_reality/UnregisterFromParent()
. = ..()
@@ -69,6 +70,7 @@
current_mind = null
if(mastermind?.current)
mastermind.current.audiovisual_redirect = null
+ REMOVE_TRAIT(parent, TRAIT_NO_MIDROUND_ANTAG, VIRTUAL_REALITY_TRAIT)
/**
* Called when attempting to connect a mob to a virtual reality mob.
@@ -235,7 +237,7 @@
qdel(src)
/**
- * Used for recursive virtual realities shenanigeans and should be called only through the above proc.
+ * Used for recursive virtual realities shenanigeans and should be called by the above proc.
*/
/datum/component/virtual_reality/proc/vr_in_a_vr(mob/player, deathcheck = FALSE, lethal_cleanup = FALSE)
var/mob/M = parent
diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm
index f5ad72e731..373647d6f5 100644
--- a/code/datums/elements/flavor_text.dm
+++ b/code/datums/elements/flavor_text.dm
@@ -7,10 +7,10 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
var/list/texts_by_atom = list()
var/addendum = "This can also be used for OOC notes and preferences!"
var/always_show = FALSE
- var/max_len = MAX_FAVOR_LEN
+ var/max_len = MAX_FLAVOR_LEN
var/can_edit = TRUE
-/datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FAVOR_LEN, _always_show = FALSE, _edit = TRUE)
+/datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE)
. = ..()
if(. == ELEMENT_INCOMPATIBLE || !isatom(target)) //no reason why this shouldn't work on atoms too.
@@ -115,7 +115,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
//subtypes with additional hooks for DNA and preferences.
/datum/element/flavor_text/carbon
-/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FAVOR_LEN, _always_show = FALSE, _edit = TRUE)
+/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE)
if(!iscarbon(target))
return ELEMENT_INCOMPATIBLE
. = ..()
diff --git a/code/datums/elements/sword_point.dm b/code/datums/elements/sword_point.dm
index 5eaa9eaa70..8e1d923e33 100644
--- a/code/datums/elements/sword_point.dm
+++ b/code/datums/elements/sword_point.dm
@@ -15,4 +15,4 @@
/datum/element/sword_point/proc/point(datum/source, atom/target, mob/user, proximity_flag, params)
if(!proximity_flag && ismob(target))
- user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].")
+ user.visible_message("[user] points the tip of [source] at [target].", "You point the tip of [src] at [target].")
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index edd5c25e2e..57b9a25904 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -95,8 +95,7 @@
SStgui.on_transfer(current, new_character)
if(iscarbon(current))
var/mob/living/carbon/C = current
- if(C.combatmode)
- C.toggle_combat_mode(TRUE, TRUE)
+ C.disable_intentional_combat_mode(TRUE)
if(!language_holder)
var/datum/language_holder/mob_holder = new_character.get_language_holder(shadow = FALSE)
language_holder = mob_holder.copy(src)
diff --git a/code/datums/mutations/combined.dm b/code/datums/mutations/combined.dm
index 5fc9df7550..d3cc83f9c0 100644
--- a/code/datums/mutations/combined.dm
+++ b/code/datums/mutations/combined.dm
@@ -11,10 +11,6 @@
if(findtext(A, "[mutation1]") && findtext(A, "[mutation2]"))
return GLOB.mutation_recipes[A]
-/datum/generecipe/x_ray
- required = "/datum/mutation/human/thermal; /datum/mutation/human/radioactive"
- result = /datum/mutation/human/thermal/x_ray
-
/datum/generecipe/shock
required = "/datum/mutation/human/insulated; /datum/mutation/human/radioactive"
result = SHOCKTOUCH
@@ -29,4 +25,4 @@
/datum/generecipe/tonguechem
required = "/datum/mutation/human/tongue_spike; /datum/mutation/human/stimmed"
- result = TONGUESPIKECHEM
\ No newline at end of file
+ result = TONGUESPIKECHEM
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 779de8ff03..0a44954e51 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -480,6 +480,12 @@
admin_notes = "Comes with turrets that will target any simplemob."
credit_cost = 12500
+/datum/map_template/shuttle/emergency/cog
+ suffix = "cog"
+ name = "NES Classic"
+ description = "A blast from the past! This recreation of the Nanotrasen Emergency Shuttle Port features the same focus on seating as the original, but on a slightly longer frame to better accommodate modern shuttle docks."
+ credit_cost = 750
+
/datum/map_template/shuttle/arrival/box
suffix = "box"
name = "arrival shuttle (Box)"
@@ -500,6 +506,10 @@
suffix = "kilo"
name = "labour shuttle (Kilo)"
+/datum/map_template/shuttle/labour/cog
+ suffix = "cog"
+ name = "labour shuttle (Cog)"
+
/datum/map_template/shuttle/infiltrator/basic
suffix = "basic"
name = "basic syndicate infiltrator"
@@ -544,6 +554,10 @@
suffix = "omega"
name = "arrival shuttle (Omega)"
+/datum/map_template/shuttle/arrival/cog
+ suffix = "cog"
+ name = "arrival shuttle (Cog)"
+
/datum/map_template/shuttle/aux_base/default
suffix = "default"
name = "auxilliary base (Default)"
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 43afcdd807..f9f9e22685 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -20,11 +20,11 @@
owner.adjustFireLoss(-15)
/datum/status_effect/shadow_mend/on_remove()
+ . = ..()
owner.visible_message("The violet light around [owner] glows black!", "The tendrils around you cinch tightly and reap their toll...")
playsound(owner, 'sound/magic/teleport_diss.ogg', 50, 1)
owner.apply_status_effect(STATUS_EFFECT_VOID_PRICE)
-
/datum/status_effect/void_price
id = "void_price"
duration = 300
@@ -84,6 +84,7 @@
progbar.update(duration - world.time)
/datum/status_effect/vanguard_shield/on_remove()
+ . = ..()
var/vanguard = owner.stun_absorption["vanguard"]
var/stuns_blocked = 0
if(vanguard)
@@ -107,7 +108,6 @@
owner.visible_message("[owner]'s glowing aura fades!", message_to_owner)
owner.log_message("lost Vanguard stun immunity[stuns_blocked ? "and was stunned for [stuns_blocked]":""]", LOG_ATTACK)
-
/datum/status_effect/inathneqs_endowment
id = "inathneqs_endowment"
duration = 150
@@ -133,12 +133,12 @@
return ..()
/datum/status_effect/inathneqs_endowment/on_remove()
+ . = ..()
owner.log_message("lost Inath-neq's invulnerability", LOG_ATTACK)
owner.visible_message("The light around [owner] flickers and dissipates!", "You feel Inath-neq's power fade from your body!")
owner.status_flags &= ~GODMODE
playsound(owner, 'sound/magic/ethereal_exit.ogg', 50, 1)
-
/datum/status_effect/cyborg_power_regen
id = "power_regen"
duration = 100
@@ -210,11 +210,11 @@
owner.adjustStaminaLoss(-(grace_heal * 25))
/datum/status_effect/his_grace/on_remove()
+ . = ..()
owner.log_message("lost His Grace's stun immunity", LOG_ATTACK)
if(islist(owner.stun_absorption) && owner.stun_absorption["hisgrace"])
owner.stun_absorption -= "hisgrace"
-
/datum/status_effect/wish_granters_gift //Fully revives after ten seconds.
id = "wish_granters_gift"
duration = 50
@@ -225,6 +225,7 @@
return ..()
/datum/status_effect/wish_granters_gift/on_remove()
+ . = ..()
owner.revive(full_heal = TRUE, admin_revive = TRUE)
owner.visible_message("[owner] appears to wake from the dead, having healed all wounds!", "You have regenerated.")
@@ -366,6 +367,7 @@
last_health = owner.health
/datum/status_effect/blooddrunk/on_remove()
+ . = ..()
tick()
owner.maxHealth *= 0.1
owner.bruteloss *= 0.1
@@ -404,7 +406,6 @@
playsound(owner, 'sound/weapons/fwoosh.wav', 75, 0)
return ..()
-
/datum/status_effect/sword_spin/tick()
playsound(owner, 'sound/weapons/fwoosh.wav', 75, 0)
var/obj/item/slashy
@@ -413,9 +414,9 @@
slashy.attack(M, owner)
/datum/status_effect/sword_spin/on_remove()
+ . = ..()
owner.visible_message("[owner]'s inhuman strength dissipates and the sword's runes grow cold!")
-
//Used by changelings to rapidly heal
//Heals 10 brute and oxygen damage every second, and 5 fire
//Being on fire will suppress this healing
@@ -472,6 +473,7 @@
return ..()
/datum/status_effect/hippocraticOath/on_remove()
+ . = ..()
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "hippocraticOath")
var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
H.remove_hud_from(owner)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index ce71bdb212..cf10244890 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -17,6 +17,7 @@
owner.update_stat()
/datum/status_effect/incapacitating/on_remove()
+ . = ..()
owner.update_mobility()
if(needs_update_stat || issilicon(owner)) //silicons need stat updates in addition to normal canmove updates
owner.update_stat()
@@ -86,6 +87,15 @@
if(prob(10) && owner.health > owner.crit_threshold)
owner.emote("snore")
+/datum/status_effect/staggered
+ id = "staggered"
+ blocks_sprint = TRUE
+
+/datum/status_effect/staggered/on_creation(mob/living/new_owner, set_duration)
+ if(isnum(set_duration))
+ duration = set_duration
+ return ..()
+
/obj/screen/alert/status_effect/asleep
name = "Asleep"
desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
@@ -101,10 +111,6 @@
if(isnum(set_duration))
duration = set_duration
. = ..()
- if(iscarbon(owner))
- var/mob/living/carbon/C = owner
- if(C.combatmode)
- C.toggle_combat_mode(TRUE)
/datum/status_effect/no_combat_mode/mesmerize
id = "Mesmerize"
@@ -133,7 +139,7 @@
var/slowdown_priority = 50 //to make sure the stronger effect overrides
var/affect_crawl = FALSE
var/nextmove_modifier = 1
- var/stamdmg_per_ds = 1 //a 20 duration would do 20 stamdmg, disablers do 24 or something
+ var/stamdmg_per_ds = 0 //a 20 duration would do 20 stamdmg, disablers do 24 or something
var/last_tick = 0 //fastprocess processing speed is a goddamn sham, don't trust it.
/datum/status_effect/electrode/on_creation(mob/living/new_owner, set_duration)
@@ -143,8 +149,6 @@
last_tick = world.time
if(iscarbon(owner))
var/mob/living/carbon/C = owner
- if(C.combatmode)
- C.toggle_combat_mode(TRUE)
C.add_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]", TRUE, priority = slowdown_priority, override = TRUE, multiplicative_slowdown = slowdown, blacklisted_movetypes = affect_crawl? NONE : CRAWLING)
/datum/status_effect/electrode/on_remove()
@@ -172,15 +176,7 @@
slowdown_priority = 100
nextmove_modifier = 2
blocks_combatmode = TRUE
-
-/datum/status_effect/electrode/no_combat_mode/on_creation(mob/living/new_owner, set_duration)
- . = ..()
- if(iscarbon(owner))
- var/mob/living/carbon/C = owner
- if(HAS_TRAIT(C, TRAIT_TASED_RESISTANCE))
- return
- if(C.combatmode)
- C.toggle_combat_mode(TRUE)
+ stamdmg_per_ds = 1
//OTHER DEBUFFS
/datum/status_effect/his_wrath //does minor damage over time unless holding His Grace
@@ -219,6 +215,7 @@
alerttooltipstyle = "clockcult"
/datum/status_effect/belligerent/on_apply()
+ . = ..()
return do_movement_toggle(TRUE)
/datum/status_effect/belligerent/tick()
@@ -249,6 +246,7 @@
/datum/status_effect/belligerent/on_remove()
if(owner.m_intent == MOVE_INTENT_WALK)
owner.toggle_move_intent()
+ return ..()
/datum/status_effect/maniamotor
id = "maniamotor"
@@ -348,6 +346,7 @@
alert_type = null
/datum/status_effect/cultghost/on_apply()
+ . = ..()
owner.see_invisible = SEE_INVISIBLE_OBSERVER
owner.see_in_dark = 2
@@ -369,6 +368,7 @@
hammer_synced = new_hammer_synced
/datum/status_effect/crusher_mark/on_apply()
+ . = ..()
if(owner.mob_size >= MOB_SIZE_LARGE)
marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2")
marked_underlay.pixel_x = -owner.pixel_x
@@ -450,6 +450,7 @@
qdel(src)
/datum/status_effect/saw_bleed/on_remove()
+ . = ..()
if(needs_to_bleed)
var/turf/T = get_turf(owner)
new /obj/effect/temp_visual/bleed/explode(T)
@@ -508,6 +509,7 @@
return ..()
/datum/status_effect/necropolis_curse/on_remove()
+ . = ..()
remove_curse(curse_flags)
/datum/status_effect/necropolis_curse/proc/apply_curse(set_curse)
@@ -597,6 +599,7 @@
old_oxyloss = owner.getOxyLoss()
/datum/status_effect/kindle/on_remove()
+ . = ..()
owner.visible_message("The light in [owner]'s eyes fades!", \
"You snap out of your daze!")
@@ -616,11 +619,13 @@
alert_type = /obj/screen/alert/status_effect/ichorial_stain
/datum/status_effect/ichorial_stain/on_apply()
+ . = ..()
owner.visible_message("[owner] gets back up, [owner.p_their()] body dripping blue ichor!", \
"Thick blue ichor covers your body; you can't be revived like this again until it dries!")
return TRUE
/datum/status_effect/ichorial_stain/on_remove()
+ . = ..()
owner.visible_message("The blue ichor on [owner]'s body dries out!", \
"The ichor on your body is dry - you can now be revived by vitality matrices again!")
@@ -642,6 +647,7 @@
owner.add_movespeed_modifier(MOVESPEED_ID_ELECTROSTAFF, multiplicative_slowdown = 1, movetypes = GROUND)
/datum/status_effect/electrostaff/on_remove()
+ . = ..()
owner.remove_movespeed_modifier(MOVESPEED_ID_ELECTROSTAFF)
//GOLEM GANG
@@ -693,6 +699,7 @@ datum/status_effect/pacify
/datum/status_effect/pacify/on_remove()
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "status_effect")
+ return ..()
/datum/status_effect/trance
id = "trance"
@@ -714,6 +721,7 @@ datum/status_effect/pacify
owner.dizziness = 20
/datum/status_effect/trance/on_apply()
+ . = ..()
if(!iscarbon(owner))
return FALSE
RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize)
@@ -734,6 +742,7 @@ datum/status_effect/pacify
owner.dizziness = 0
owner.remove_client_colour(/datum/client_colour/monochrome/trance)
to_chat(owner, "You snap out of your trance!")
+ return ..()
/datum/status_effect/trance/proc/hypnotize(datum/source, list/hearing_args)
if(!owner.can_hear())
@@ -819,8 +828,9 @@ datum/status_effect/pacify
return
var/mob/living/carbon/human/H = owner
H.something_horrible(kill_either_way)
+ return ..()
/obj/screen/alert/status_effect/dna_melt
name = "Genetic Breakdown"
desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate."
- icon_state = "dna_melt"
\ No newline at end of file
+ icon_state = "dna_melt"
diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm
index 608dbb2d7a..d3d39e625a 100644
--- a/code/datums/status_effects/gas.dm
+++ b/code/datums/status_effects/gas.dm
@@ -40,6 +40,7 @@
owner.adjust_bodytemperature(100)
owner.update_mobility()
UnregisterSignal(owner, COMSIG_LIVING_RESIST)
+ return ..()
/datum/status_effect/freon/watcher
duration = 8
diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm
index cb2b4174b5..5f59359193 100644
--- a/code/datums/status_effects/neutral.dm
+++ b/code/datums/status_effects/neutral.dm
@@ -46,7 +46,7 @@
/datum/status_effect/syphon_mark/on_remove()
get_kill()
- . = ..()
+ return ..()
/obj/screen/alert/status_effect/in_love
name = "In Love"
@@ -81,5 +81,5 @@
ADD_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]")
/datum/status_effect/throat_soothed/on_remove()
- . = ..()
- REMOVE_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]")
\ No newline at end of file
+ REMOVE_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]")
+ return ..()
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index 0d84aab763..e2114f0778 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -11,7 +11,10 @@
var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted
var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves
var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description
- var/blocks_combatmode //Does this status effect prevent the user from toggling combat mode?
+ /// If this is TRUE, the user will have combt mode forcefully disabled while this is active.
+ var/blocks_combatmode = FALSE
+ /// If this is TRUE, the user will have sprint forcefully disabled while this is active.
+ var/blocks_sprint = FALSE
var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists
/datum/status_effect/New(list/arguments)
@@ -32,11 +35,11 @@
var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type)
A.attached_effect = src //so the alert can reference us, if it needs to
linked_alert = A //so we can reference the alert, if we need to
- START_PROCESSING(SSfastprocess, src)
+ START_PROCESSING(SSstatus_effects, src)
return TRUE
/datum/status_effect/Destroy()
- STOP_PROCESSING(SSfastprocess, src)
+ STOP_PROCESSING(SSstatus_effects, src)
if(owner)
owner.clear_alert(id)
LAZYREMOVE(owner.status_effects, src)
@@ -55,9 +58,21 @@
qdel(src)
/datum/status_effect/proc/on_apply() //Called whenever the buff is applied; returning FALSE will cause it to autoremove itself.
+ SHOULD_CALL_PARENT(TRUE)
+ if(blocks_combatmode)
+ ADD_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src)
+ if(blocks_sprint)
+ ADD_TRAIT(owner, TRAIT_SPRINT_LOCKED, src)
return TRUE
+
/datum/status_effect/proc/tick() //Called every tick.
+
/datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null
+ SHOULD_CALL_PARENT(TRUE)
+ REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src)
+ REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src)
+ return TRUE
+
/datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself or when a status effect with on_remove_on_mob_delete = FALSE has its mob deleted
owner.clear_alert(id)
LAZYREMOVE(owner.status_effects, src)
diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm
index 3247b890c6..b44778054e 100644
--- a/code/datums/weather/weather_types/ash_storm.dm
+++ b/code/datums/weather/weather_types/ash_storm.dm
@@ -94,7 +94,7 @@
if(is_ash_immune(L))
return
if(is_species(L, /datum/species/lizard/ashwalker))
- if(L.getStaminaLoss() <= STAMINA_SOFTCRIT)
+ if(!IS_STAMCRIT(L))
L.adjustStaminaLossBuffered(4)
return
L.adjustFireLoss(4)
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
index 039fc102e8..638d8b53b6 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
@@ -43,7 +43,7 @@
if (!istype(M, required_type))
trimmed_list.Remove(M)
continue
- if (M.GetComponent(/datum/component/virtual_reality))
+ if (HAS_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG))
trimmed_list.Remove(M)
continue
if (!M.client) // Are they connected?
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 632d59c84d..48a298984c 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -165,7 +165,7 @@
/datum/outfit/syndicate/full
name = "Syndicate Operative - Full Kit"
- glasses = /obj/item/clothing/glasses/night
+ glasses = /obj/item/clothing/glasses/night/syndicate
mask = /obj/item/clothing/mask/gas/syndicate
suit = /obj/item/clothing/suit/space/hardsuit/syndi
r_pocket = /obj/item/tank/internals/emergency_oxygen/engi
@@ -180,7 +180,7 @@
/datum/outfit/syndicate/lone
name = "Syndicate Operative - Lone"
- glasses = /obj/item/clothing/glasses/night
+ glasses = /obj/item/clothing/glasses/night/syndicate
mask = /obj/item/clothing/mask/gas/syndicate
suit = /obj/item/clothing/suit/space/syndicate/black/red
head = /obj/item/clothing/head/helmet/space/syndicate/black/red
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index d84c104a2f..2e5dae3e04 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -205,13 +205,18 @@
difficulty = 10
/datum/objective_item/special/boh
- name = "a bag of holding."
+ name = "a type of bag of holding."
targetitem = /obj/item/storage/backpack/holding
difficulty = 10
-/datum/objective_item/special/hypercell
- name = "a hyper-capacity power cell."
- targetitem = /obj/item/stock_parts/cell/hyper
+/datum/objective_item/special/adv_surgical_drapes
+ name = "a set of smart surgical drapes."
+ targetitem = /obj/item/surgical_drapes/advanced
+ difficulty = 10 //would be 15 but cmo rarely have it on themselfs and leave it in their lockers...
+
+/datum/objective_item/special/bluespace
+ name = "a bluespace power cell."
+ targetitem = /obj/item/stock_parts/cell/bluespace
difficulty = 5
/datum/objective_item/special/laserpointer
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index eac94081cb..7654070cf1 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -219,7 +219,7 @@
if(!is_operational()) //Autoeject if power is lost
if(mob_occupant)
go_out()
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
connected_message("Clone Ejected: Loss of power.")
else if(mob_occupant && (mob_occupant.loc == src))
@@ -229,7 +229,7 @@
SPEAK("The cloning has been \
aborted due to unrecoverable tissue failure.")
go_out()
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
else if(mob_occupant.cloneloss > (100 - heal_level))
mob_occupant.Unconscious(80)
@@ -275,7 +275,7 @@
BP.attach_limb(mob_occupant)
go_out()
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
else if (!mob_occupant || mob_occupant.loc != src)
occupant = null
@@ -323,7 +323,7 @@
SPEAK("An emergency ejection of the current clone has occurred. Survival not guaranteed.")
to_chat(user, "You force an emergency ejection. ")
go_out()
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
else
return ..()
@@ -421,7 +421,7 @@
if(mob_occupant && prob(100/(severity*efficiency)))
connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of, ERROR: John Doe, prematurely." ,0))
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
go_out()
/obj/machinery/clonepod/ex_act(severity, target)
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index 5662737ff7..b9bd3da95e 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -136,7 +136,7 @@
if(connected && connected.is_operational())
if(connected.occupant) //set occupant_status message
viable_occupant = connected.occupant
- if(viable_occupant.has_dna() && !HAS_TRAIT(viable_occupant, TRAIT_RADIMMUNE) && !HAS_TRAIT(viable_occupant, TRAIT_NOCLONE) || (connected.scan_level == 3)) //occupant is viable for dna modification
+ if(viable_occupant.has_dna() && !HAS_TRAIT_NOT_FROM(viable_occupant, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) && !HAS_TRAIT(viable_occupant, TRAIT_NOCLONE) || (connected.scan_level == 3)) //occupant is viable for dna modification
occupant_status += "[viable_occupant.name] => "
switch(viable_occupant.stat)
if(CONSCIOUS)
@@ -948,7 +948,7 @@
var/mob/living/carbon/viable_occupant = null
if(connected)
viable_occupant = connected.occupant
- if(!istype(viable_occupant) || !viable_occupant.dna || HAS_TRAIT(viable_occupant, TRAIT_RADIMMUNE) || HAS_TRAIT(viable_occupant, TRAIT_NOCLONE))
+ if(!istype(viable_occupant) || !viable_occupant.dna || HAS_TRAIT_NOT_FROM(viable_occupant, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) || HAS_TRAIT(viable_occupant, TRAIT_NOCLONE))
viable_occupant = null
return viable_occupant
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 97c89c9168..3acbaba4fd 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -17,7 +17,7 @@ Buildable meters
icon = 'icons/obj/atmospherics/pipes/pipe_item.dmi'
icon_state = "simple"
item_state = "buildpipe"
- w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_SMALL
level = 2
var/piping_layer = PIPING_LAYER_DEFAULT
var/RPD_type
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index bab5c4d93e..ff79038a96 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -409,7 +409,7 @@
if(iscarbon(A))
var/mob/living/carbon/C = A
//If not emagged, only target non downed carbons
- if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || C.recoveringstam))//CIT CHANGE - replaces check for lying with check for recoveringstam
+ if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || (C.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)))//CIT CHANGE - replaces check for lying with check for recoveringstam
continue
//If emagged, target all but dead carbons
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 49cdc3667c..9f2530e43e 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm
@@ -52,9 +52,7 @@
pixel_y += round((cos(angle_override)+16*cos(angle_override)*2), 1)
/obj/effect/projectile_lighting
- var/owner
-/obj/effect/projectile_lighting/Initialize(mapload, color, range, intensity, owner_key)
+/obj/effect/projectile_lighting/Initialize(mapload, color, range, intensity)
. = ..()
set_light(range, intensity, color)
- owner = owner_key
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
index bd2c6c6e87..eb50ae43a7 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
@@ -1,4 +1,4 @@
-/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, beam_type, color, qdel_in = 5, light_range = 2, light_color_override, light_intensity = 1, instance_key) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported!
+/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, beam_type, color, qdel_in = 5, light_range = 2, light_color_override, light_intensity = 1, list/turfs) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported!
if(!istype(starting) || !istype(ending) || !ispath(beam_type))
return
var/datum/point/midpoint = point_midpoint_points(starting, ending)
@@ -9,17 +9,15 @@
. = PB
if(light_range > 0 && light_intensity > 0)
var/list/turf/line = getline(starting.return_turf(), ending.return_turf())
- tracing_line:
- for(var/i in line)
- var/turf/T = i
- for(var/obj/effect/projectile_lighting/PL in T)
- if(PL.owner == instance_key)
- continue tracing_line
- QDEL_IN(new /obj/effect/projectile_lighting(T, light_color_override, light_range, light_intensity, instance_key), qdel_in > 0? qdel_in : 5)
+ for(var/i in line)
+ if(turfs[i])
+ continue
+ turfs[i] = TRUE
+ QDEL_IN(new /obj/effect/projectile_lighting(i, light_color_override, light_range, light_intensity), qdel_in > 0? qdel_in : 5)
line = null
if(qdel_in)
QDEL_IN(PB, qdel_in)
-
+d
/obj/effect/projectile/tracer
name = "beam"
icon = 'icons/obj/projectiles_tracer.dmi'
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 5c2f151e38..5a215f0396 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -399,7 +399,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
//If this were before the above checks, then trying to click on items would act a little funky and signal overrides wouldn't work.
if(iscarbon(usr))
var/mob/living/carbon/C = usr
- if(C.combatmode && ((C.CanReach(src) || (src in directaccess)) && (C.CanReach(over) || (over in directaccess))))
+ if((C.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && ((C.CanReach(src) || (src in directaccess)) && (C.CanReach(over) || (over in directaccess))))
if(!C.get_active_held_item())
C.UnarmedAttack(src, TRUE)
if(C.get_active_held_item() == src)
@@ -496,7 +496,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
to_chat(user, "You cannot locate any organic eyes on this brain!")
return
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes eyestabbing impossible if you're in stamina softcrit
+ if(IS_STAMCRIT(user))//CIT CHANGE - makes eyestabbing impossible if you're in stamina softcrit
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return //CIT CHANGE - ditto
@@ -855,4 +855,19 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
return
/obj/item/proc/unembedded()
- return
\ No newline at end of file
+ return
+
+/**
+ * Sets our slowdown and updates equipment slowdown of any mob we're equipped on.
+ */
+/obj/item/proc/set_slowdown(new_slowdown)
+ slowdown = new_slowdown
+ if(CHECK_BITFIELD(item_flags, IN_INVENTORY))
+ var/mob/living/L = loc
+ if(istype(L))
+ L.update_equipment_speed_mods()
+
+/obj/item/vv_edit_var(var_name, var_value)
+ . = ..()
+ if(var_name == NAMEOF(src, slowdown))
+ set_slowdown(var_value) //don't care if it's a duplicate edit as slowdown'll be set, do it anyways to force normal behavior.
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 8802698b5d..0e109cd400 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -803,7 +803,7 @@ SLIME SCANNER
/obj/item/sequence_scanner/attack(mob/living/M, mob/living/carbon/human/user)
add_fingerprint(user)
- if (!HAS_TRAIT(M, TRAIT_RADIMMUNE)) //no scanning if its a husk or DNA-less Species
+ if (!HAS_TRAIT_NOT_FROM(M, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT)) //no scanning if its a husk or DNA-less Species
user.visible_message("[user] analyzes [M]'s genetic sequence.", \
"You analyze [M]'s genetic sequence.")
gene_scan(M, user)
@@ -879,4 +879,4 @@ SLIME SCANNER
if(mutation in discovered)
return "[HM.name] ([HM.alias])"
else
- return HM.alias
\ No newline at end of file
+ return HM.alias
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index 60b1e81c94..90c9d78272 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -20,7 +20,7 @@
return attack_hand(user)
/obj/item/dnainjector/proc/inject(mob/living/carbon/M, mob/user)
- if(M.has_dna() && !HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M, TRAIT_NOCLONE))
+ if(M.has_dna() && !HAS_TRAIT_NOT_FROM(M, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) && !HAS_TRAIT(M, TRAIT_NOCLONE))
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]"
for(var/HM in remove_mutations)
@@ -525,7 +525,7 @@
var/filled = FALSE
/obj/item/dnainjector/activator/inject(mob/living/carbon/M, mob/user)
- if(M.has_dna() && !HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M,TRAIT_NOCLONE))
+ if(M.has_dna() && !HAS_TRAIT_NOT_FROM(M, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) && !HAS_TRAIT(M,TRAIT_NOCLONE))
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]"
for(var/mutation in add_mutations)
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 8e93aa4fb4..cbbd50b573 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -143,33 +143,61 @@
/obj/item/melee/rapier
name = "plastitanium rapier"
- desc = "A impossibly thin blade made of plastitanium with a tip made of diamond. It looks to be able to cut through any armor."
+ desc = "A thin blade made of plastitanium with a diamond tip. It appears to be coated in a persistent layer of an unknown substance."
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "rapier"
item_state = "rapier"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- force = 25
- throwforce = 35
- block_chance = 0
- armour_penetration = 100
+ force = 15
+ throwforce = 25
+ block_chance = 50
+ armour_penetration = 200 //Apparently this gives it the ability to pierce block
flags_1 = CONDUCT_1
obj_flags = UNIQUE_RENAME
w_class = WEIGHT_CLASS_BULKY
sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_-
- attack_verb = list("slashed", "cut", "pierces", "pokes")
- total_mass = 3.4
+ attack_verb = list("stabs", "punctures", "pierces", "pokes")
+ hitsound = 'sound/weapons/rapierhit.ogg'
+ total_mass = 0.4
/obj/item/melee/rapier/Initialize()
. = ..()
AddComponent(/datum/component/butchering, 20, 65, 0)
+/obj/item/melee/rapier/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(attack_type == PROJECTILE_ATTACK)
+ final_block_chance = 0
+ return ..()
+
+/obj/item/melee/rapier/on_exit_storage(datum/component/storage/S)
+ var/obj/item/storage/belt/sabre/rapier/B = S.parent
+ if(istype(B))
+ playsound(B, 'sound/items/unsheath.ogg', 25, 1)
+ ..()
+
+/obj/item/melee/rapier/on_enter_storage(datum/component/storage/S)
+ var/obj/item/storage/belt/sabre/rapier/B = S.parent
+ if(istype(B))
+ playsound(B, 'sound/items/sheath.ogg', 25, 1)
+ ..()
+
/obj/item/melee/rapier/get_belt_overlay()
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "rapier")
/obj/item/melee/rapier/get_worn_belt_overlay(icon_file)
return mutable_appearance(icon_file, "-rapier")
+/obj/item/melee/rapier/attack(mob/living/target, mob/living/user)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/H = target
+ var/loss = H.getStaminaLoss()
+ H.Dizzy(10)
+ H.adjustStaminaLoss(30)
+ if((loss > 40) && prob(loss)) // if above 40, roll for sleep using 1% every 1 stamina damage
+ H.Sleeping(180)
+
/obj/item/melee/classic_baton
name = "police baton"
desc = "A wooden truncheon for beating criminal scum."
@@ -240,7 +268,7 @@
if(!on)
return ..()
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes batons unusuable in stamina softcrit
+ if(IS_STAMCRIT(user))//CIT CHANGE - makes batons unusuable in stamina softcrit
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return //CIT CHANGE - ditto
diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm
index 233eabd4ca..3a06c7d7fe 100644
--- a/code/game/objects/items/mop.dm
+++ b/code/game/objects/items/mop.dm
@@ -42,7 +42,7 @@
var/mob/living/L = user
- if(istype(L) && L.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(istype(L) && IS_STAMCRIT(L))
to_chat(user, "You're too exhausted for that.")
return
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index fe1f3ebd6c..0ca2fbd386 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -80,7 +80,7 @@
else
user.visible_message("[user] hugs [M] to make [M.p_them()] feel better!", \
"You hug [M] to make [M.p_them()] feel better!")
- if(M.resting && !M.recoveringstam)
+ if(M.resting && !(M.combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
M.set_resting(FALSE, TRUE)
else
user.visible_message("[user] pets [M]!", \
@@ -99,7 +99,7 @@
else
user.visible_message("[user] hugs [M] in a firm bear-hug! [M] looks uncomfortable...", \
"You hug [M] firmly to make [M.p_them()] feel better! [M] looks uncomfortable...")
- if(!CHECK_MOBILITY(M, MOBILITY_STAND) && !M.recoveringstam)
+ if(!CHECK_MOBILITY(M, MOBILITY_STAND) && !(M.combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
M.set_resting(FALSE, TRUE)
else
user.visible_message("[user] bops [M] on the head!", \
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 4e03d029a8..0a29562d6b 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -795,18 +795,12 @@
/obj/item/storage/belt/sabre/rapier
name = "rapier sheath"
- desc = "A black, thin sheath that looks to house only a long thin blade. Feels like its made of metal."
+ desc = "A sinister, thin sheath, suitable for a rapier."
icon_state = "rsheath"
item_state = "rsheath"
force = 5
throwforce = 15
- block_chance = 30
w_class = WEIGHT_CLASS_BULKY
attack_verb = list("bashed", "slashes", "prods", "pokes")
fitting_swords = list(/obj/item/melee/rapier)
starting_sword = /obj/item/melee/rapier
-
-/obj/item/storage/belt/sabre/rapier/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(attack_type == PROJECTILE_ATTACK)
- final_block_chance = 0 //To thin to block bullets
- return ..()
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index c9c686414d..01193d0e21 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -189,7 +189,7 @@
new /obj/item/reagent_containers/medspray/silver_sulf(src)
new /obj/item/healthanalyzer/advanced(src)
new /obj/item/reagent_containers/syringe/lethal/choral(src) // what the fuck does anyone use this piece of shit for
- new /obj/item/clothing/glasses/hud/health/night(src)
+ new /obj/item/clothing/glasses/hud/health/night/syndicate(src)
/obj/item/storage/firstaid/tactical/nukeop
name = "improved combat medical kit"
@@ -204,7 +204,7 @@
new /obj/item/reagent_containers/medspray/silver_sulf(src)
new /obj/item/healthanalyzer/advanced(src)
new /obj/item/reagent_containers/syringe/lethal/choral(src) // what the fuck does anyone use this piece of shit for
- new /obj/item/clothing/glasses/hud/health/night(src)
+ new /obj/item/clothing/glasses/hud/health/night/syndicate(src)
/*
* Pill Bottles
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index 4f7948c738..68db9b4807 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -259,6 +259,42 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
new /obj/item/ammo_box/a762(src)
new /obj/item/ammo_box/a762(src)
+/obj/item/storage/toolbox/infiltrator
+ name = "insidious case"
+ desc = "Bearing the emblem of the Syndicate, this case contains a full infiltrator stealth suit, and has enough room to fit weaponry if necessary while being quite the heavy bludgeoning implement when in a pinch."
+ icon_state = "infiltrator_case"
+ item_state = "infiltrator_case"
+ force = 12
+ throwforce = 16
+ w_class = WEIGHT_CLASS_NORMAL
+ has_latches = FALSE
+
+/obj/item/storage/toolbox/infiltrator/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.silent = TRUE
+ STR.max_items = 10
+ STR.max_w_class = WEIGHT_CLASS_NORMAL
+ STR.can_hold = typecacheof(list(
+ /obj/item/clothing/head/helmet/infiltrator,
+ /obj/item/clothing/suit/armor/vest/infiltrator,
+ /obj/item/clothing/under/syndicate/bloodred,
+ /obj/item/clothing/gloves/color/latex/nitrile/infiltrator,
+ /obj/item/clothing/mask/infiltrator,
+ /obj/item/clothing/shoes/combat/sneakboots,
+ /obj/item/gun/ballistic/automatic/pistol,
+ /obj/item/gun/ballistic/revolver,
+ /obj/item/ammo_box
+ ))
+
+/obj/item/storage/toolbox/infiltrator/PopulateContents()
+ new /obj/item/clothing/head/helmet/infiltrator(src)
+ new /obj/item/clothing/suit/armor/vest/infiltrator(src)
+ new /obj/item/clothing/under/syndicate/bloodred(src)
+ new /obj/item/clothing/gloves/color/latex/nitrile/infiltrator(src)
+ new /obj/item/clothing/mask/infiltrator(src)
+ new /obj/item/clothing/shoes/combat/sneakboots(src)
+
/obj/item/storage/toolbox/plastitanium/gold_real
name = "golden toolbox"
desc = "A larger then normal toolbox made of gold plated plastitanium."
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index d4d45b603c..aeb7bc8f59 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -374,6 +374,12 @@
for(var/i in 1 to 3)
new /obj/item/grenade/spawnergrenade/buzzkill(src)
+/obj/item/storage/box/syndie_kit/sleepytime/PopulateContents()
+ new /obj/item/clothing/under/syndicate/bloodred/sleepytime(src)
+ new /obj/item/reagent_containers/food/drinks/mug/coco(src)
+ new /obj/item/toy/plush/carpplushie(src)
+ new /obj/item/bedsheet/syndie(src)
+
/obj/item/storage/box/syndie_kit/kitchen_gun
name = "Kitchen Gun (TM) package"
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index 78ba6d4f5f..f821f47466 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -153,7 +153,7 @@
return FALSE
if(status && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
clowning_around(user)
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CIT CHANGE - makes it impossible to baton in stamina softcrit
+ if(IS_STAMCRIT(user)) //CIT CHANGE - makes it impossible to baton in stamina softcrit
to_chat(user, "You're too exhausted for that.")
return TRUE
if(ishuman(M))
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index 2c31e4addf..b188250fff 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -58,7 +58,7 @@
var/obj/item/twohanded/offhand/O = user.get_inactive_held_item()
if(O && istype(O))
O.unwield()
- slowdown -= slowdown_wielded
+ set_slowdown(slowdown - slowdown_wielded)
/obj/item/twohanded/proc/wield(mob/living/carbon/user)
if(wielded)
@@ -88,7 +88,7 @@
O.desc = "Your second grip on [src]."
O.wielded = TRUE
user.put_in_inactive_hand(O)
- slowdown += slowdown_wielded
+ set_slowdown(slowdown + slowdown_wielded)
/obj/item/twohanded/dropped(mob/user)
. = ..()
@@ -248,7 +248,7 @@
/obj/item/twohanded/fireaxe/afterattack(atom/A, mob/living/user, proximity)
. = ..()
- if(!proximity || (user.getStaminaLoss() > STAMINA_SOFTCRIT))
+ if(!proximity || IS_STAMCRIT(user)) //don't make stamcrit message they'll already have gotten one from the primary attack.
return
if(wielded) //destroys windows and grilles in one hit (or more if it has a ton of health like plasmaglass)
if(istype(A, /obj/structure/window))
@@ -1171,7 +1171,7 @@
turn_off()
/obj/item/twohanded/electrostaff/attack(mob/living/target, mob/living/user)
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes it impossible to baton in stamina softcrit
+ if(IS_STAMCRIT(user))//CIT CHANGE - makes it impossible to baton in stamina softcrit
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return //CIT CHANGE - ditto
if(on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index e0c2d6e2c7..06c1d96711 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -101,7 +101,7 @@
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
to_chat(user, "You can't do that right now!")
return TRUE
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(user))
to_chat(user, "You're too exhausted for that.")
return TRUE
var/mob/living/poordude = buckled_mobs[1]
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index b967b4efe1..da11f858f8 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -15,7 +15,7 @@
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/storage/belt/military(src)
new /obj/item/crowbar/red(src)
- new /obj/item/clothing/glasses/night(src)
+ new /obj/item/clothing/glasses/night/syndicate(src)
/obj/structure/closet/syndicate/nuclear
desc = "It's a storage unit for a Syndicate boarding party."
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 77416c45e5..711bc09069 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -195,9 +195,7 @@
return
if(isgolem(user) && can_transfer)
var/transfer_choice = alert("Transfer your soul to [src]? (Warning, your old body will die!)",,"Yes","No")
- if(transfer_choice != "Yes")
- return
- if(QDELETED(src) || uses <= 0)
+ if(transfer_choice != "Yes" || QDELETED(src) || uses <= 0 || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERY, NO_TK))
return
log_game("[key_name(user)] golem-swapped into [src]")
user.visible_message("A faint light leaves [user], moving to [src] and animating it!","You leave your old body behind, and transfer into [src]!")
@@ -680,8 +678,9 @@
new_spawn.AddElement(/datum/element/dusts_on_catatonia)
new_spawn.AddElement(/datum/element/dusts_on_leaving_area,list(A.type,/area/hilbertshotel))
ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT)
- ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT)
- ADD_TRAIT(new_spawn,TRAIT_PACIFISM,GHOSTROLE_TRAIT)
+ ADD_TRAIT(new_spawn, TRAIT_EXEMPT_HEALTH_EVENTS, GHOSTROLE_TRAIT)
+ ADD_TRAIT(new_spawn, TRAIT_NO_MIDROUND_ANTAG, GHOSTROLE_TRAIT) //The mob can't be made into a random antag, they are still elegible for ghost roles popups.
+ ADD_TRAIT(new_spawn, TRAIT_PACIFISM, GHOSTROLE_TRAIT)
to_chat(new_spawn,"You may be sharing your cafe with some ninja-captured individuals, so make sure to only interact with the ghosts you hear as a ghost!")
to_chat(new_spawn,"You can turn yourself into a ghost and freely reenter your body with the ghost action.")
var/datum/action/ghost/G = new(new_spawn)
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index 066249505d..d5b5cfc695 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -260,7 +260,7 @@
return FALSE
if(ishuman(C) && !(lube & SLIP_WHEN_JOGGING))
var/mob/living/carbon/human/H = C
- if(!H.sprinting && H.getStaminaLoss() <= 20)
+ if(!(H.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) && H.getStaminaLoss() <= 20)
return FALSE
if(!(lube&SLIDE_ICE))
to_chat(C, "You slipped[ O ? " on the [O.name]" : ""]!")
diff --git a/code/modules/antagonists/blood_contract/blood_contract.dm b/code/modules/antagonists/blood_contract/blood_contract.dm
index 4e7238647e..5d2fda08fc 100644
--- a/code/modules/antagonists/blood_contract/blood_contract.dm
+++ b/code/modules/antagonists/blood_contract/blood_contract.dm
@@ -27,7 +27,7 @@
INVOKE_ASYNC(B, /obj/effect/mine/pickup/bloodbath/.proc/mineEffect, H) //could use moving out from the mine
for(var/mob/living/carbon/human/P in GLOB.player_list)
- if(P == H)
+ if(P == H || HAS_TRAIT(P, TRAIT_NO_MIDROUND_ANTAG))
continue
to_chat(P, "You have an overwhelming desire to kill [H]. [H.p_theyve(TRUE)] been marked red! Whoever [H.p_they()] [H.p_were()], friend or foe, go kill [H.p_them()]!")
P.put_in_hands(new /obj/item/kitchen/knife/butcher(P), TRUE)
diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
index 4d06c127d4..755d12ae09 100644
--- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
+++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
@@ -185,10 +185,10 @@
BuyPower(new /datum/action/bloodsucker/veil)
// Traits
for(var/T in defaultTraits)
- ADD_TRAIT(owner.current, T, "bloodsucker")
+ ADD_TRAIT(owner.current, T, BLOODSUCKER_TRAIT)
if(HAS_TRAIT(owner.current, TRAIT_TOXINLOVER)) //No slime bonuses here, no thank you
had_toxlover = TRUE
- REMOVE_TRAIT(owner.current, TRAIT_TOXINLOVER, "species")
+ REMOVE_TRAIT(owner.current, TRAIT_TOXINLOVER, SPECIES_TRAIT)
// Traits: Species
if(ishuman(owner.current))
var/mob/living/carbon/human/H = owner.current
@@ -235,9 +235,9 @@
// owner.RemoveSpell(power)
// Traits
for(var/T in defaultTraits)
- REMOVE_TRAIT(owner.current, T, "bloodsucker")
+ REMOVE_TRAIT(owner.current, T, BLOODSUCKER_TRAIT)
if(had_toxlover == TRUE)
- ADD_TRAIT(owner.current, TRAIT_TOXINLOVER, "species")
+ ADD_TRAIT(owner.current, TRAIT_TOXINLOVER, SPECIES_TRAIT)
// Traits: Species
if(ishuman(owner.current))
@@ -387,7 +387,7 @@
add_objective(heartthief_objective)
/*
else
-
+
// Solars Objective, doesnt work due to TG updates.
var/datum/objective/bloodsucker/solars/solars_objective = new
solars_objective.owner = owner
diff --git a/code/modules/antagonists/traitor/classes/freeform.dm b/code/modules/antagonists/traitor/classes/freeform.dm
index f84eadb9f6..998373a77c 100644
--- a/code/modules/antagonists/traitor/classes/freeform.dm
+++ b/code/modules/antagonists/traitor/classes/freeform.dm
@@ -6,7 +6,7 @@
/datum/traitor_class/human/freeform/forge_objectives(datum/antagonist/traitor/T)
var/datum/objective/escape/O = new
- O.explanation_text = "You have no goals! Whatever you can do do antagonize Nanotrasen, do it! The gimmickier, the better! Make sure to escape alive, though!"
+ O.explanation_text = "You have no explicit goals! While we don't approve of mindless slaughter, you may antagonize nanotrasen any way you wish! Make sure to escape alive and not in custody, though!"
O.owner = T.owner
T.add_objective(O)
return
diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm
index c75a1c0bff..836dc044b7 100644
--- a/code/modules/cargo/exports/weapons.dm
+++ b/code/modules/cargo/exports/weapons.dm
@@ -211,7 +211,7 @@
/datum/export/weapon/arrows
cost = 150
unit_name = "arrow"
- export_types = list(/obj/item/ammo_casing/caseless/arrow, /obj/item/ammo_casing/caseless/arrow/bone, /obj/item/ammo_casing/caseless/arrow/ashen)
+ export_types = list(/obj/item/ammo_casing/caseless/arrow, /obj/item/ammo_casing/caseless/arrow/bone, /obj/item/ammo_casing/caseless/arrow/ash)
/datum/export/weapon/bow_teaching
cost = 500
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index dc550179f8..84096b1367 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -223,7 +223,6 @@ 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]
- prefs_vr = GLOB.vore_preferences_datums[ckey] //CITADEL EDIT bypassing a failing hook
if(prefs)
prefs.parent = src
@@ -231,13 +230,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
prefs = new /datum/preferences(src)
GLOB.preferences_datums[ckey] = prefs
- if(prefs_vr) //CITADEL EDIT bypassing a failing hook START
- prefs_vr.client = src
- else
- prefs_vr = new/datum/vore_preferences(src)
- GLOB.vore_preferences_datums[ckey] = prefs_vr
- //CITADEL EDIT bypassing a failing hook END
-
prefs.last_ip = address //these are gonna be used for banning
prefs.last_id = computer_id //these are gonna be used for banning
fps = prefs.clientfps
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index a9deba070a..4629ed5c35 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -121,39 +121,25 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"taur" = "None",
"genitals_use_skintone" = FALSE,
"has_cock" = FALSE,
- "cock_shape" = "Human",
- "cock_length" = 6,
+ "cock_shape" = DEF_COCK_SHAPE,
+ "cock_length" = COCK_SIZE_DEF,
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = "fff",
- "has_sheath" = FALSE,
- "sheath_color" = "fff",
"has_balls" = FALSE,
"balls_internal" = FALSE,
"balls_color" = "fff",
- "balls_amount" = 2,
- "balls_sack_size" = BALLS_SACK_SIZE_DEF,
- "balls_shape" = "Single",
+ "balls_shape" = DEF_BALLS_SHAPE,
"balls_size" = BALLS_SIZE_DEF,
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY,
- "has_ovi" = FALSE,
- "ovi_shape" = "knotted",
- "ovi_length" = 6,
- "ovi_color" = "fff",
- "has_eggsack" = FALSE,
- "eggsack_internal" = TRUE,
- "eggsack_color" = "fff",
- "eggsack_size" = BALLS_SACK_SIZE_DEF,
- "eggsack_egg_color" = "fff",
- "eggsack_egg_size" = EGG_GIRTH_DEF,
"has_breasts" = FALSE,
"breasts_color" = "fff",
- "breasts_size" = "C",
- "breasts_shape" = "Pair",
+ "breasts_size" = BREASTS_SIZE_DEF,
+ "breasts_shape" = DEF_BREASTS_SHAPE,
"breasts_producing" = FALSE,
"has_vag" = FALSE,
- "vag_shape" = "Human",
+ "vag_shape" = DEF_VAGINA_SHAPE,
"vag_color" = "fff",
"vag_clits" = 1,
"vag_clit_diam" = 0.25,
@@ -205,6 +191,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/action_buttons_screen_locs = list()
+ //bad stuff
+ var/digestable = FALSE
+ var/devourable = FALSE
+ var/feeding = FALSE
+ var/lickable = FALSE
+ var/list/belly_prefs = list()
+ var/vore_taste = "nothing in particular"
+
//backgrounds
var/mutable_appearance/character_background
var/icon/bgstate = "steel"
@@ -1483,7 +1477,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
if("flavor_text")
- var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", features["flavor_text"], MAX_FAVOR_LEN, TRUE)
+ var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", features["flavor_text"], MAX_FLAVOR_LEN, TRUE)
if(!isnull(msg))
features["flavor_text"] = html_decode(msg)
@@ -1916,6 +1910,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
new_dors = input(user, "Choose your character's dorsal tube type:", "Character Preference") as null|anything in GLOB.xeno_dorsal_list
if(new_dors)
features["xenodorsal"] = new_dors
+
//Genital code
if("cock_color")
var/new_cockcolor = input(user, "Penis color:", "Character Preference") as color|null
@@ -1956,22 +1951,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_shape)
features["balls_shape"] = new_shape
- if("egg_size")
- var/new_size
- var/list/egg_sizes = list(1,2,3)
- new_size = input(user, "Egg Diameter(inches):", "Egg Size") as null|anything in egg_sizes
- if(new_size)
- features["eggsack_egg_size"] = new_size
-
- if("egg_color")
- var/new_egg_color = input(user, "Egg Color:", "Character Preference") as color|null
- if(new_egg_color)
- var/temp_hsv = RGBtoHSV(new_egg_color)
- if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
- features["eggsack_egg_color"] = sanitize_hexcolor(new_egg_color)
- else
- to_chat(user,"Invalid color. Your color is not bright enough.")
-
if("breasts_size")
var/new_size
new_size = input(user, "Breast Size", "Character Preference") as null|anything in GLOB.breasts_size_list
@@ -2105,14 +2084,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["has_balls"] = FALSE
if("has_balls")
features["has_balls"] = !features["has_balls"]
- if("has_ovi")
- features["has_ovi"] = !features["has_ovi"]
- if("has_eggsack")
- features["has_eggsack"] = !features["has_eggsack"]
if("balls_internal")
features["balls_internal"] = !features["balls_internal"]
- if("eggsack_internal")
- features["eggsack_internal"] = !features["eggsack_internal"]
if("has_breasts")
features["has_breasts"] = !features["has_breasts"]
if(features["has_breasts"] == FALSE)
@@ -2301,16 +2274,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("load")
load_preferences()
load_character()
- if(parent && parent.prefs_vr)
- attempt_vr(parent.prefs_vr,"load_vore","")
if("changeslot")
if(!load_character(text2num(href_list["num"])))
random_character()
real_name = random_unique_name(gender)
save_character()
- if(parent && parent.prefs_vr)
- attempt_vr(parent.prefs_vr,"load_vore","")
if("tab")
if (href_list["tab"])
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 86148ee17c..63a9ca40e9 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
-#define SAVEFILE_VERSION_MAX 25
+#define SAVEFILE_VERSION_MAX 26
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -115,6 +115,36 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(digi == "Digitigrade Legs")
WRITE_FILE(S["feature_lizard_legs"], "Digitigrade")
+ if(current_version < 26)
+ var/vr_path = "data/player_saves/[parent.ckey[1]]/[parent.ckey]/vore/character[default_slot].json"
+ if(fexists(vr_path))
+ var/list/json_from_file = json_decode(file2text(vr_path))
+ if(json_from_file)
+ digestable = json_from_file["digestable"]
+ devourable = json_from_file["devourable"]
+ feeding = json_from_file["feeding"]
+ lickable = json_from_file["lickable"]
+ belly_prefs = json_from_file["belly_prefs"]
+ vore_taste = json_from_file["vore_taste"]
+
+ for(var/V in all_quirks) // quirk migration
+ switch(V)
+ if("Acute hepatic pharmacokinesis")
+ DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT)
+ DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT)
+ ENABLE_BITFIELD(cit_toggles,FORCED_FEM)
+ ENABLE_BITFIELD(cit_toggles,FORCED_MASC)
+ all_quirks -= V
+ if("Crocin Immunity")
+ ENABLE_BITFIELD(cit_toggles,NO_APHRO)
+ all_quirks -= V
+ if("Buns of Steel")
+ ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP)
+ all_quirks -= V
+
+ if(features["meat_type"] == "Inesct")
+ features["meat_type"] = "Insect"
+
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
return
@@ -422,7 +452,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_balls_color"] >> features["balls_color"]
S["feature_balls_size"] >> features["balls_size"]
S["feature_balls_shape"] >> features["balls_shape"]
- S["feature_balls_sack_size"] >> features["balls_sack_size"]
//breasts features
S["feature_has_breasts"] >> features["has_breasts"]
S["feature_breasts_size"] >> features["breasts_size"]
@@ -446,6 +475,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
else //We have no old flavortext, default to new
S["feature_flavor_text"] >> features["flavor_text"]
+ S["digestable"] >> digestable
+ S["devourable"] >> devourable
+ S["feeding"] >> feeding
+ S["vore_taste"] >> vore_taste
+ S["lickable"] >> lickable
+ S["belly_prefs"] >> belly_prefs
//try to fix any outdated data if necessary
if(needs_update >= 0)
@@ -510,6 +545,19 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None")
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
+ features["breasts_size"] = sanitize_inlist(features["breasts_size"], GLOB.breasts_size_list, BREASTS_SIZE_DEF)
+ features["breasts_shape"] = sanitize_inlist(features["breasts_shape"], GLOB.breasts_shapes_list, DEF_BREASTS_SHAPE)
+ features["cock_shape"] = sanitize_inlist(features["cock_shape"], GLOB.cock_shapes_list, DEF_COCK_SHAPE)
+ features["cock_length"] = sanitize_integer(features["cock_length"], COCK_SIZE_MIN, COCK_SIZE_MAX, COCK_SIZE_DEF)
+ features["balls_shape"] = sanitize_inlist(features["balls_shape"], GLOB.balls_shapes_list, DEF_BALLS_SHAPE)
+ features["vag_shape"] = sanitize_inlist(features["vag_shape"], GLOB.vagina_shapes_list, DEF_VAGINA_SHAPE)
+ features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 3, FALSE, "FFF")
+ features["cock_color"] = sanitize_hexcolor(features["cock_color"], 3, FALSE, "FFF")
+ features["balls_color"] = sanitize_hexcolor(features["balls_color"], 3, FALSE, "FFF")
+ features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, FALSE, "FFF")
+
+ features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN)
+
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
//Validate job prefs
for(var/j in job_preferences)
@@ -518,23 +566,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
all_quirks = SANITIZE_LIST(all_quirks)
- for(var/V in all_quirks) // quirk migration
- switch(V)
- if("Acute hepatic pharmacokinesis")
- DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT)
- DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT)
- ENABLE_BITFIELD(cit_toggles,FORCED_FEM)
- ENABLE_BITFIELD(cit_toggles,FORCED_MASC)
- all_quirks -= V
- if("Crocin Immunity")
- ENABLE_BITFIELD(cit_toggles,NO_APHRO)
- all_quirks -= V
- if("Buns of Steel")
- ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP)
- all_quirks -= V
+ lickable = sanitize_integer(lickable, FALSE, TRUE, initial(lickable))
+ devourable = sanitize_integer(devourable, FALSE, TRUE, initial(devourable))
+ digestable = sanitize_integer(digestable, FALSE, TRUE, initial(digestable))
+ feeding = sanitize_integer(feeding, FALSE, TRUE, initial(feeding))
+ vore_taste = copytext(vore_taste, 1, MAX_TASTE_LEN)
+ belly_prefs = SANITIZE_LIST(belly_prefs)
- if(features["meat_type"] == "Inesct")
- features["meat_type"] = "Insect"
cit_character_pref_load(S)
return 1
@@ -613,6 +651,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Quirks
WRITE_FILE(S["all_quirks"] , all_quirks)
+ WRITE_FILE(S["digestable"] , digestable)
+ WRITE_FILE(S["devourable"] , devourable)
+ WRITE_FILE(S["feeding"] , feeding)
+ WRITE_FILE(S["vore_taste"] , vore_taste)
+ WRITE_FILE(S["lickable"] , lickable)
+ WRITE_FILE(S["belly_prefs"] , belly_prefs)
+
cit_character_pref_save(S)
return 1
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index b67fe2b462..cbd1fcff87 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -447,7 +447,7 @@
permeability_coefficient = 0.01
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
- var/vchange = 1
+ var/voice_change = 1 ///This determines if the voice changer is on or off.
var/datum/action/item_action/chameleon/change/chameleon_action
@@ -470,15 +470,14 @@
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/mask/chameleon/attack_self(mob/user)
- vchange = !vchange
- to_chat(user, "The voice changer is now [vchange ? "on" : "off"]!")
-
+ voice_change = !voice_change
+ to_chat(user, "The voice changer is now [voice_change ? "on" : "off"]!")
/obj/item/clothing/mask/chameleon/drone
//Same as the drone chameleon hat, undroppable and no protection
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
+ voice_change = 0
/obj/item/clothing/mask/chameleon/drone/Initialize()
. = ..()
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index d3ecccfcf8..66dcf89a7a 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -82,6 +82,7 @@
icon_state = "nvgmeson"
item_state = "nvgmeson"
darkness_view = 8
+ flash_protect = -2
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
@@ -119,10 +120,11 @@
/obj/item/clothing/glasses/night
name = "night vision goggles"
- desc = "You can totally see in the dark now!"
+ desc = "You can totally see in the dark now! Just don't look too closely at bright lights. This lacks any flash correction."
icon_state = "night"
item_state = "glasses"
darkness_view = 8
+ flash_protect = -2
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
@@ -130,6 +132,12 @@
name = "prescription night vision goggles"
desc = "NVGs but for those with nearsightedness."
vision_correction = 1
+
+/obj/item/clothing/glasses/night/syndicate
+ name = "combat night vision goggles"
+ desc = "See everything, without fear."
+ flash_protect = 1
+ vision_correction = 1
/obj/item/clothing/glasses/science/suicide_act(mob/living/carbon/user)
user.visible_message("[user] is tightening \the [src]'s straps around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 5c0bb33a29..c745cd74f0 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -63,12 +63,19 @@
/obj/item/clothing/glasses/hud/health/night
name = "night vision health scanner HUD"
- desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
+ desc = "An advanced medical heads-up display that allows doctors to find patients in complete darkness."
icon_state = "healthhudnight"
item_state = "glasses"
darkness_view = 8
+ flash_protect = -2
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
+
+/obj/item/clothing/glasses/hud/health/night/syndicate
+ name = "combat night vision health scanner HUD"
+ desc = "An advanced shielded medical heads-up display that allows soldiers to approximate how much lead poisoning their allies have suffered in complete darkness."
+ flash_protect = 1
+ vision_correction = 1
/obj/item/clothing/glasses/hud/health/sunglasses
name = "medical HUDSunglasses"
@@ -126,6 +133,7 @@
icon_state = "diagnostichudnight"
item_state = "glasses"
darkness_view = 8
+ flash_protect = -2
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
@@ -199,6 +207,7 @@
desc = "An advanced heads-up display which provides id data and vision in complete darkness."
icon_state = "securityhudnight"
darkness_view = 8
+ flash_protect = -2 //You either are flashproof or you can see in the dark, pick one.
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
diff --git a/code/modules/clothing/glasses/phantomthief.dm b/code/modules/clothing/glasses/phantomthief.dm
index 96f5cfc201..1c9afcfd6f 100644
--- a/code/modules/clothing/glasses/phantomthief.dm
+++ b/code/modules/clothing/glasses/phantomthief.dm
@@ -35,10 +35,10 @@
return
if(slot != SLOT_GLASSES)
return
- RegisterSignal(user, COMSIG_COMBAT_TOGGLED, .proc/injectadrenaline)
+ RegisterSignal(user, COMSIG_LIVING_COMBAT_ENABLED, .proc/injectadrenaline)
/obj/item/clothing/glasses/phantomthief/syndicate/dropped(mob/user)
. = ..()
if(!istype(user))
return
- UnregisterSignal(user, COMSIG_COMBAT_TOGGLED)
+ UnregisterSignal(user, COMSIG_LIVING_COMBAT_ENABLED)
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index f4b04f5bfe..cf3541fd89 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -194,7 +194,7 @@
/obj/item/clothing/gloves/color/latex
name = "latex gloves"
- desc = "Cheap sterile gloves made from latex."
+ desc = "Cheap sterile gloves made from latex. Transfers basic paramedical knowledge to the wearer via the use of nanochips."
icon_state = "latex"
item_state = "lgloves"
siemens_coefficient = 0.3
@@ -202,14 +202,34 @@
item_color="mime"
transfer_prints = TRUE
resistance_flags = NONE
+ var/carrytrait = TRAIT_QUICK_CARRY
+
+/obj/item/clothing/gloves/color/latex/equipped(mob/user, slot)
+ ..()
+ if(slot == SLOT_GLOVES)
+ ADD_TRAIT(user, carrytrait, CLOTHING_TRAIT)
+
+/obj/item/clothing/gloves/color/latex/dropped(mob/user)
+ ..()
+ REMOVE_TRAIT(user, carrytrait, CLOTHING_TRAIT)
/obj/item/clothing/gloves/color/latex/nitrile
name = "nitrile gloves"
- desc = "Pricy sterile gloves that are stronger than latex."
+ desc = "Pricy sterile gloves that are stronger than latex. Transfers advanced paramedical knowledge to the wearer via the use of nanochips."
icon_state = "nitrile"
item_state = "nitrilegloves"
item_color = "cmo"
transfer_prints = FALSE
+ carrytrait = TRAIT_QUICKER_CARRY
+
+/obj/item/clothing/gloves/color/latex/nitrile/infiltrator
+ name = "insidious combat gloves"
+ desc = "Specialized combat gloves for carrying people around. Transfers tactical kidnapping knowledge to the user via the use of nanochips."
+ icon_state = "infiltrator"
+ item_state = "infiltrator"
+ siemens_coefficient = 0
+ permeability_coefficient = 0.3
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/gloves/color/white
name = "white gloves"
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 3b1b92ea78..6e2e655c1b 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -256,6 +256,21 @@
strip_delay = 100
mutantrace_variation = STYLE_MUZZLE
+/obj/item/clothing/head/helmet/infiltrator
+ name = "insidious helmet"
+ desc = "An insidious armored combat helmet signed with Syndicate insignia. The visor is coated with a resistant paste guaranteed to withstand bright flashes perfectly."
+ icon_state = "infiltrator"
+ item_state = "infiltrator"
+ armor = list("melee" = 40, "bullet" = 40, "laser" = 30, "energy" = 40, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ flash_protect = 2
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+ dynamic_hair_suffix = ""
+ dynamic_fhair_suffix = ""
+ strip_delay = 80
+ mutantrace_variation = STYLE_MUZZLE
+
//LightToggle
/obj/item/clothing/head/helment/ComponentInitialize()
diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm
index dc151cdd42..a87c1cf82b 100644
--- a/code/modules/clothing/masks/boxing.dm
+++ b/code/modules/clothing/masks/boxing.dm
@@ -12,6 +12,20 @@
/obj/item/clothing/mask/balaclava/attack_self(mob/user)
adjustmask(user)
+/obj/item/clothing/mask/infiltrator
+ name = "insidious balaclava"
+ desc = "An incredibly suspicious balaclava made with Syndicate nanofibers to absorb impacts slightly while obfuscating the voice and face using a garbled vocoder."
+ icon_state = "syndicate_balaclava"
+ item_state = "syndicate_balaclava"
+ clothing_flags = ALLOWINTERNALS
+ flags_cover = HEADCOVERSEYES
+ flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
+ visor_flags_inv = HIDEFACE|HIDEFACIALHAIR
+ w_class = WEIGHT_CLASS_SMALL
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 100, "acid" = 40)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ var/voice_unknown = TRUE ///This makes it so that your name shows up as unknown when wearing the mask.
+
/obj/item/clothing/mask/luchador
name = "Luchador Mask"
desc = "Worn by robust fighters, flying high to defeat their foes!"
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index c0e566cc0e..519e4e7fcd 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -19,6 +19,14 @@
permeability_coefficient = 0.05 //Thick soles, and covers the ankle
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+/obj/item/clothing/shoes/combat/sneakboots
+ name = "insidious sneakboots"
+ desc = "A pair of insidious boots with special noise muffling soles which very slightly drown out your footsteps. They would be absolutely perfect for stealth operations were it not for the iconic Syndicate flairs."
+ icon_state = "sneakboots"
+ item_state = "sneakboots"
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ clothing_flags = TRAIT_SILENT_STEP
+
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
name = "\improper SWAT boots"
desc = "High speed, no drag combat boots."
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 3b84a227ef..9a43f77381 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -191,6 +191,15 @@
. = ..()
allowed = GLOB.detective_vest_allowed
+/obj/item/clothing/suit/armor/vest/infiltrator
+ name = "insidious combat vest"
+ desc = "An insidious combat vest designed using Syndicate nanofibers to absorb the supreme majority of kinetic blows. Although it doesn't look like it'll do too much for energy impacts."
+ icon_state = "infiltrator"
+ item_state = "infiltrator"
+ armor = list("melee" = 30, "bullet" = 40, "laser" = 20, "energy" = 30, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ strip_delay = 80
+
//All of the armor below is mostly unused
/obj/item/clothing/suit/armor/centcom
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index 63e3a63968..ab85a1b59b 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -12,6 +12,7 @@
var/can_adjust = TRUE
var/adjusted = NORMAL_STYLE
var/alt_covers_chest = FALSE // for adjusted/rolled-down jumpsuits, FALSE = exposes chest and arms, TRUE = exposes arms only
+ var/dummy_thick = FALSE // is able to hold accessories on its item
var/obj/item/clothing/accessory/attached_accessory
var/mutable_appearance/accessory_overlay
mutantrace_variation = STYLE_DIGITIGRADE
@@ -82,6 +83,10 @@
if(user)
to_chat(user, "[src] already has an accessory.")
return
+ if(dummy_thick)
+ if(user)
+ to_chat(user, "[src] is too bulky and cannot have accessories attached to it!")
+ return
else
if(user && !user.temporarilyRemoveItemFromInventory(I))
return
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 37d2dcffbc..1250f4ed19 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -19,6 +19,25 @@
alt_covers_chest = TRUE
fitted = FEMALE_UNIFORM_TOP
+/obj/item/clothing/under/syndicate/bloodred
+ name = "blood-red sneaksuit"
+ desc = "An insidious armored jumpsuit lined with Syndicate nanofibers and prototype platings, slightly resistant to most forms of damage, but is far too bulky to have anything attached to it. It still counts as stealth if there are no witnesses."
+ icon_state = "bloodred_pajamas"
+ item_state = "bl_suit"
+ item_color = "bloodred_pajamas"
+ dummy_thick = TRUE
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 50, "acid" = 40)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ can_adjust = FALSE
+
+/obj/item/clothing/under/syndicate/bloodred/sleepytime
+ name = "blood-red pajamas"
+ desc = "Do operatives dream of nuclear sheep?"
+ icon_state = "bloodred_pajamas"
+ item_state = "bl_suit"
+ item_color = "bloodred_pajamas"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
+
/obj/item/clothing/under/syndicate/tacticool
name = "tacticool turtleneck"
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
@@ -75,7 +94,7 @@
item_color = "rus_under"
can_adjust = FALSE
armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- resistance_flags = NONE
+ resistance_flags = NONE
/obj/item/clothing/under/syndicate/baseball
name = "major league, number unknown"
diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm
index d3cbf03581..cb742ca27f 100644
--- a/code/modules/events/holiday/vday.dm
+++ b/code/modules/events/holiday/vday.dm
@@ -16,13 +16,14 @@
..()
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
H.put_in_hands(new /obj/item/valentine)
- var/obj/item/storage/backpack/b = locate() in H.contents
- new /obj/item/reagent_containers/food/snacks/candyheart(b)
- new /obj/item/storage/fancy/heart_box(b)
+ var/obj/item/storage/backpack/B = locate() in H.contents
+ if(B)
+ new /obj/item/reagent_containers/food/snacks/candyheart(B)
+ new /obj/item/storage/fancy/heart_box(B)
var/list/valentines = list()
for(var/mob/living/M in GLOB.player_list)
- if(!M.stat && M.client && M.mind)
+ if(!M.stat && M.client && M.mind && !HAS_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG))
valentines |= M
diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm
index 1186268e31..dc0b07b464 100644
--- a/code/modules/events/mass_hallucination.dm
+++ b/code/modules/events/mass_hallucination.dm
@@ -4,11 +4,26 @@
weight = 10
max_occurrences = 2
min_players = 1
+ var/forced_hallucination
+
+/datum/round_event_control/mass_hallucination/admin_setup()
+ if(!check_rights(R_FUN))
+ return
+
+ forced_hallucination = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in subtypesof(/datum/hallucination)
/datum/round_event/mass_hallucination
fakeable = FALSE
/datum/round_event/mass_hallucination/start()
+ var/datum/round_event_control/mass_hallucination/M = control
+ if(M.forced_hallucination)
+ for(var/mob/living/carbon/C in GLOB.alive_mob_list)
+ if (HAS_TRAIT(C,TRAIT_EXEMPT_HEALTH_EVENTS))
+ continue
+ new M.forced_hallucination(C, TRUE)
+ return
+
switch(rand(1,4))
if(1) //same sound for everyone
var/sound = pick("airlock","airlock_pry","console","explosion","far_explosion","mech","glass","alarm","beepsky","mech","wall_decon","door_hack","tesla")
@@ -37,4 +52,4 @@
for(var/mob/living/carbon/C in GLOB.alive_mob_list)
if (HAS_TRAIT(C,TRAIT_EXEMPT_HEALTH_EVENTS))
continue
- new picked_hallucination(C, TRUE)
\ No newline at end of file
+ new picked_hallucination(C, TRUE)
diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm
index 1c31113332..11bb44ce97 100644
--- a/code/modules/hydroponics/fermenting_barrel.dm
+++ b/code/modules/hydroponics/fermenting_barrel.dm
@@ -49,6 +49,10 @@
to_chat(user, "You place [I] into [src] to start the fermentation process.")
addtimer(CALLBACK(src, .proc/makeWine, fruit), rand(80, 120) * speed_multiplier)
return TRUE
+ var/obj/item/W = I
+ if(W)
+ if(W.is_refillable())
+ return FALSE //so we can refill them via their afterattack.
else
return ..()
diff --git a/code/modules/keybindings/bindings_carbon.dm b/code/modules/keybindings/bindings_carbon.dm
index eef170cea9..e344bc9d20 100644
--- a/code/modules/keybindings/bindings_carbon.dm
+++ b/code/modules/keybindings/bindings_carbon.dm
@@ -4,6 +4,6 @@
toggle_throw_mode()
return
if("C")
- toggle_combat_mode()
+ user_toggle_intentional_combat_mode()
return
return ..()
\ No newline at end of file
diff --git a/code/modules/keybindings/bindings_human.dm b/code/modules/keybindings/bindings_human.dm
index ed033935b2..9569de338c 100644
--- a/code/modules/keybindings/bindings_human.dm
+++ b/code/modules/keybindings/bindings_human.dm
@@ -59,11 +59,11 @@
switch(_key)
if("Shift")
if(!user.prefs.sprint_spacebar)
- user.prefs.sprint_toggle ? togglesprint() : sprint_hotkey(TRUE) //Yes, this looks hacky. Yes, this works.
+ user.prefs.sprint_toggle ? default_toggle_sprint() : sprint_hotkey(TRUE) //Yes, this looks hacky. Yes, this works.
return
if("Space")
if(user.prefs.sprint_spacebar)
- user.prefs.sprint_toggle ? togglesprint() : sprint_hotkey(TRUE)
+ user.prefs.sprint_toggle ? default_toggle_sprint() : sprint_hotkey(TRUE)
return
return ..()
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index bf25bb9da8..a95c0e24ed 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -136,7 +136,7 @@
desc = "A device which causes kinetic accelerators to permanently gain damage against creature types killed with it."
id = "bountymod"
materials = list(/datum/material/iron = 4000, /datum/material/silver = 4000, /datum/material/gold = 4000, /datum/material/bluespace = 4000)
- reagents_list = list("blood" = 40)
+ reagents_list = list(/datum/reagent/blood = 40)
build_path = /obj/item/borg/upgrade/modkit/bounty
//Spooky special loot
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index c569a2c59a..41f2c7142f 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -237,7 +237,7 @@
return /datum/reagent/blood/jellyblood
if(dna?.species?.exotic_blood)
return dna.species.exotic_blood
- else if((NOBLOOD in dna.species.species_traits) || (HAS_TRAIT(src, TRAIT_NOCLONE)))
+ else if((dna && (NOBLOOD in dna.species.species_traits)) || HAS_TRAIT(src, TRAIT_NOCLONE))
return
else
return /datum/reagent/blood
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index fda136df0b..cdb8aff2c6 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -21,7 +21,7 @@ In all, this is a lot like the monkey code. /N
return
switch(M.a_intent)
if (INTENT_HELP)
- if(!recoveringstam)
+ if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
set_resting(FALSE, TRUE, FALSE)
AdjustAllImmobility(-60, FALSE)
AdjustUnconscious(-60, FALSE)
diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm
index 4d362ca554..00d929a1e0 100644
--- a/code/modules/mob/living/carbon/alien/larva/life.dm
+++ b/code/modules/mob/living/carbon/alien/larva/life.dm
@@ -27,7 +27,7 @@
else
if(stat == UNCONSCIOUS)
stat = CONSCIOUS
- if(!recoveringstam)
+ if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
set_resting(FALSE, TRUE)
adjust_blindness(-1)
update_mobility()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 5bb1e6d17d..f5f9a734ae 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -153,7 +153,7 @@
return
//CIT CHANGES - makes it impossible to throw while in stamina softcrit
- if(getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(src))
to_chat(src, "You're too exhausted.")
return
var/random_turn = a_intent == INTENT_HARM
@@ -448,7 +448,7 @@
modifier -= 40 //Clumsy people are more likely to hit themselves -Honk!
//CIT CHANGES START HERE
- else if(combatmode)
+ else if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)
modifier += 50
if(modifier < 100)
@@ -820,15 +820,13 @@
return
if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || (health <= HEALTH_THRESHOLD_FULLCRIT && !HAS_TRAIT(src, TRAIT_NOHARDCRIT)))
stat = UNCONSCIOUS
+ disable_intentional_combat_mode(FALSE, FALSE)
if(!eye_blind)
blind_eyes(1)
- if(combatmode)
- toggle_combat_mode(TRUE, TRUE)
else
if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT))
stat = SOFT_CRIT
- if(combatmode)
- toggle_combat_mode(TRUE, TRUE)
+ disable_intentional_combat_mode(FALSE, FALSE)
else
stat = CONSCIOUS
adjust_blindness(-1)
@@ -1011,8 +1009,7 @@
return TRUE
/mob/living/carbon/transfer_ckey(mob/new_mob, send_signal = TRUE)
- if(combatmode)
- toggle_combat_mode(TRUE, TRUE)
+ disable_intentional_combat_mode(TRUE, FALSE)
return ..()
/mob/living/carbon/can_see_reagents()
diff --git a/code/modules/mob/living/carbon/carbon_combat.dm b/code/modules/mob/living/carbon/carbon_combat.dm
new file mode 100644
index 0000000000..f43d850401
--- /dev/null
+++ b/code/modules/mob/living/carbon/carbon_combat.dm
@@ -0,0 +1,6 @@
+/mob/living/carbon/enable_intentional_combat_mode()
+ . = ..()
+ if(.)
+ if(voremode)
+ toggle_vore_mode()
+
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 8bd1a35e07..32d8d7e605 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -79,13 +79,11 @@
/mob/living/carbon/attacked_by(obj/item/I, mob/living/user)
//CIT CHANGES START HERE - combatmode and resting checks
var/totitemdamage = I.force
- if(iscarbon(user))
- var/mob/living/carbon/tempcarb = user
- if(!tempcarb.combatmode)
- totitemdamage *= 0.5
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ totitemdamage *= 0.5
if(!CHECK_MOBILITY(user, MOBILITY_STAND))
totitemdamage *= 0.5
- if(!combatmode)
+ if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
totitemdamage *= 1.5
//CIT CHANGES END HERE
if(user != src && check_shields(I, totitemdamage, "the [I.name]", MELEE_ATTACK, I.armour_penetration))
@@ -348,7 +346,7 @@
AdjustAllImmobility(-60, FALSE)
AdjustUnconscious(-60, FALSE)
AdjustSleeping(-100, FALSE)
- if(recoveringstam)
+ if(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
adjustStaminaLoss(-15)
else
set_resting(FALSE, FALSE)
diff --git a/code/modules/mob/living/carbon/carbon_sprint.dm b/code/modules/mob/living/carbon/carbon_sprint.dm
new file mode 100644
index 0000000000..63d3e03356
--- /dev/null
+++ b/code/modules/mob/living/carbon/carbon_sprint.dm
@@ -0,0 +1,18 @@
+/// Sprint buffer ///
+/mob/living/carbon/doSprintLossTiles(tiles)
+ doSprintBufferRegen(FALSE) //first regen.
+ if(sprint_buffer)
+ var/use = min(tiles, sprint_buffer)
+ sprint_buffer -= use
+ tiles -= use
+ update_hud_sprint_bar()
+ if(!tiles) //we had enough, we're done!
+ return
+ adjustStaminaLoss(tiles * sprint_stamina_cost) //use stamina to cover deficit.
+
+/mob/living/carbon/proc/doSprintBufferRegen(updating = TRUE)
+ var/diff = world.time - sprint_buffer_regen_last
+ sprint_buffer_regen_last = world.time
+ sprint_buffer = min(sprint_buffer_max, sprint_buffer + sprint_buffer_regen_ds * diff)
+ if(updating)
+ update_hud_sprint_bar()
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index e0c394b2e0..28e0f2028d 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -7,8 +7,8 @@
if(!gibbed)
emote("deathgasp")
- if(combatmode)
- toggle_combat_mode(TRUE, TRUE)
+
+ disable_intentional_combat_mode(TRUE, FALSE)
. = ..()
@@ -67,6 +67,5 @@
BP.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
/mob/living/carbon/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE, voluntary = FALSE)
- if(combatmode)
- toggle_combat_mode(TRUE, TRUE)
+ disable_intentional_combat_mode(TRUE, FALSE)
return ..()
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index efd81c1744..1ee3369701 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -90,7 +90,7 @@
if(digitalcamo)
. += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner."
- if(combatmode)
+ if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)
. += "[t_He] [t_is] visibly tense[CHECK_MOBILITY(src, MOBILITY_STAND) ? "." : ", and [t_is] standing in combative stance."]"
var/trait_exam = common_trait_examine()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 41f8283ab9..b2691f4474 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -29,7 +29,7 @@
. = ..()
if(CONFIG_GET(flag/disable_stambuffer))
- togglesprint()
+ enable_intentional_sprint_mode()
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
@@ -707,7 +707,7 @@
/mob/living/carbon/human/wash_cream()
if(creamed) //clean both to prevent a rare bug
- cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_lizard"))
+ cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_snout"))
cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_human"))
creamed = FALSE
@@ -880,10 +880,20 @@
return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND))
/mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target)
- if(can_be_firemanned(target))
- visible_message("[src] starts lifting [target] onto their back...",
- "You start lifting [target] onto your back...")
- if(do_after(src, 30, TRUE, target))
+ var/carrydelay = 50 //if you have latex you are faster at grabbing
+ var/skills_space = "" //cobby told me to do this
+ if(HAS_TRAIT(src, TRAIT_QUICKER_CARRY))
+ carrydelay = 30
+ skills_space = "expertly"
+ else if(HAS_TRAIT(src, TRAIT_QUICK_CARRY))
+ carrydelay = 40
+ skills_space = "quickly"
+ if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE))
+ visible_message("[src] starts [skills_space] lifting [target] onto their back..",
+ //Joe Medic starts quickly/expertly lifting Grey Tider onto their back..
+ "[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]")
+ //(Using your gloves' nanochips, you/You) ( /quickly/expertly) start to lift Grey Tider onto your back(, while assisted by the nanochips in your gloves../...)
+ if(do_after(src, carrydelay, TRUE, target))
//Second check to make sure they're still valid to be carried
if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE))
target.set_resting(FALSE, TRUE)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 63c7d8f668..2e5efa3105 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -6,6 +6,9 @@
can_buckle = TRUE
buckle_lying = FALSE
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
+ /// Enable stamina combat
+ combat_flags = COMBAT_FLAGS_DEFAULT
+
//Hair colour and style
var/hair_color = "000"
var/hair_style = "Bald"
diff --git a/code/modules/mob/living/carbon/human/human_mobility.dm b/code/modules/mob/living/carbon/human/human_mobility.dm
index 61ceb42336..dc498c4153 100644
--- a/code/modules/mob/living/carbon/human/human_mobility.dm
+++ b/code/modules/mob/living/carbon/human/human_mobility.dm
@@ -1,5 +1,5 @@
/mob/living/carbon/human/resist_a_rest(automatic = FALSE, ignoretimer = FALSE)
- if(!resting || stat || attemptingstandup)
+ if(!resting || stat || (combat_flags & COMBAT_FLAG_RESISTING_REST))
return FALSE
if(ignoretimer)
set_resting(FALSE, FALSE)
@@ -13,10 +13,10 @@
return FALSE
else
var/totaldelay = 3 //A little bit less than half of a second as a baseline for getting up from a rest
- if(getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(src))
to_chat(src, "You're too exhausted to get up!")
return FALSE
- attemptingstandup = TRUE
+ combat_flags |= COMBAT_FLAG_RESISTING_REST
var/health_deficiency = max((maxHealth - (health - getStaminaLoss()))*0.5, 0)
if(!has_gravity())
health_deficiency = health_deficiency*0.2
@@ -37,10 +37,11 @@
visible_message("[standupwarning]", usernotice, vision_distance = 5)
if(do_after(src, totaldelay, target = src, required_mobility_flags = MOBILITY_RESIST))
set_resting(FALSE, TRUE)
- attemptingstandup = FALSE
+
+ combat_flags &= ~COMBAT_FLAG_RESISTING_REST
return TRUE
else
- attemptingstandup = FALSE
+ combat_flags &= ~COMBAT_FLAG_RESISTING_REST
if(resting) //we didn't shove ourselves up or something
visible_message("[src] falls right back down.", "You fall right back down.")
if(has_gravity())
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 608ad76128..b6cf0f5a82 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -9,6 +9,13 @@
/mob/living/carbon/human/movement_delay()
. = ..()
+ if(CHECK_MOBILITY(src, MOBILITY_STAND) && m_intent == MOVE_INTENT_RUN && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ var/static/datum/config_entry/number/movedelay/sprint_speed_increase/SSI
+ if(!SSI)
+ SSI = CONFIG_GET_ENTRY(number/movedelay/sprint_speed_increase)
+ . -= SSI.config_entry_value
+ if(wrongdirmovedelay)
+ . += 1
if (m_intent == MOVE_INTENT_WALK && HAS_TRAIT(src, TRAIT_SPEEDY_STEP))
. -= 1.5
@@ -42,10 +49,18 @@
return ((shoes && shoes.negates_gravity()) || (dna.species.negates_gravity(src)))
/mob/living/carbon/human/Move(NewLoc, direct)
+ var/oldpseudoheight = pseudo_z_axis
. = ..()
for(var/datum/mutation/human/HM in dna.mutations)
HM.on_move(src, NewLoc)
-
+ if(. && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) && !(movement_type & FLYING) && CHECK_ALL_MOBILITY(src, MOBILITY_MOVE|MOBILITY_STAND) && m_intent == MOVE_INTENT_RUN && has_gravity(loc) && !pulledby)
+ if(!HAS_TRAIT(src, TRAIT_FREESPRINT))
+ doSprintLossTiles(1)
+ if((oldpseudoheight - pseudo_z_axis) >= 8)
+ to_chat(src, "You trip off of the elevated surface!")
+ for(var/obj/item/I in held_items)
+ accident(I)
+ DefaultCombatKnockdown(80)
if(shoes)
if(!lying && !buckled)
if(loc == NewLoc)
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 1079c48bf9..d703f6a4e2 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -13,7 +13,7 @@
/mob/living/carbon/human/GetVoice()
if(istype(wear_mask, /obj/item/clothing/mask/chameleon))
var/obj/item/clothing/mask/chameleon/V = wear_mask
- if(V.vchange && wear_id)
+ if(V.voice_change && wear_id)
var/obj/item/card/id/idcard = wear_id.GetID()
if(istype(idcard))
return idcard.registered_name
@@ -21,6 +21,12 @@
return real_name
else
return real_name
+ if(istype(wear_mask, /obj/item/clothing/mask/infiltrator))
+ var/obj/item/clothing/mask/infiltrator/V = wear_mask
+ if(V.voice_unknown)
+ return ("Unknown")
+ else
+ return real_name
if(mind)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling && changeling.mimicing )
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index fc2817f134..18d2393470 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1450,15 +1450,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
target.grabbedby(user)
return 1
-
-
-
-
/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(!attacker_style && HAS_TRAIT(user, TRAIT_PACIFISM))
to_chat(user, "You don't want to harm [target]!")
return FALSE
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit
+ if(IS_STAMCRIT(user)) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit
to_chat(user, "You're too exhausted.") //CITADEL CHANGE - ditto
return FALSE //CITADEL CHANGE - ditto
if(target.check_block())
@@ -1487,11 +1483,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
//CITADEL CHANGES - makes resting and disabled combat mode reduce punch damage, makes being out of combat mode result in you taking more damage
- if(!target.combatmode && damage < user.dna.species.punchstunthreshold)
+ if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && damage < user.dna.species.punchstunthreshold)
damage = user.dna.species.punchstunthreshold - 1
if(!CHECK_MOBILITY(user, MOBILITY_STAND))
damage *= 0.5
- if(!user.combatmode)
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
damage *= 0.25
//END OF CITADEL CHANGES
@@ -1540,12 +1536,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/aim_for_groin = user.zone_selected == "groin"
var/target_aiming_for_groin = target.zone_selected == "groin"
- if(target.check_block()) //END EDIT
- target.visible_message("[target] blocks [user]'s disarm attempt!")
- return 0
- else if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(user))
to_chat(user, "You're too exhausted!")
return FALSE
+ else if(target.check_block())
+ target.visible_message("[target] blocks [user]'s disarm attempt!")
+ return FALSE
else if(aim_for_mouth && ( target_on_help || target_restrained || target_aiming_for_mouth))
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
@@ -1605,11 +1601,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
target.forcesay(GLOB.hit_appends)
log_combat(user, target, "pushed over")
return*/
- if(!target.combatmode) // CITADEL CHANGE
+ if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) // CITADEL CHANGE
randn += -10 //CITADEL CHANGE - being out of combat mode makes it easier for you to get disarmed
if(!CHECK_MOBILITY(user, MOBILITY_STAND)) //CITADEL CHANGE
randn += 100 //CITADEL CHANGE - No kosher disarming if you're resting
- if(!user.combatmode) //CITADEL CHANGE
+ if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) //CITADEL CHANGE
randn += 25 //CITADEL CHANGE - Makes it harder to disarm outside of combat mode
if(user.pulling == target)
randn += -20 //If you have the time to get someone in a grab, you should have a greater chance at snatching the thing in their hand. Will be made completely obsolete by the grab rework but i've got a poor track record for releasing big projects on time so w/e i guess
@@ -1686,14 +1682,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
//CIT CHANGES START HERE - combatmode and resting checks
var/totitemdamage = I.force
- if(iscarbon(user))
- var/mob/living/carbon/tempcarb = user
- if(!tempcarb.combatmode)
- totitemdamage *= 0.5
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ totitemdamage *= 0.5
if(!CHECK_MOBILITY(user, MOBILITY_STAND))
totitemdamage *= 0.5
if(istype(H))
- if(!H.combatmode)
+ if(!(H.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
totitemdamage *= 1.5
//CIT CHANGES END HERE
var/weakness = H.check_weakness(I, user)
@@ -1803,9 +1797,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/althelp(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(user == target && istype(user))
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(user))
to_chat(user, "You're too exhausted for that.")
return
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ to_chat(user, "You need combat mode to be active to that!")
+ return
if(user.IsKnockdown() || user.IsParalyzed() || user.IsStun())
to_chat(user, "You can't seem to force yourself up right now!")
return
@@ -1818,7 +1815,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
playsound(user, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
/datum/species/proc/altdisarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(user))
to_chat(user, "You're too exhausted.")
return FALSE
if(target.check_block())
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index 410ad05d93..8257238e9c 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -24,7 +24,7 @@
id = "spaceskeleton"
limbs_id = "skeleton"
blacklisted = 1
- inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
+ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT, TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
/datum/species/skeleton/space/check_roundstart_eligible()
return FALSE
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 4aae10c444..ebb5a3dd31 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -507,10 +507,10 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
//this updates all special effects: stun, sleeping, knockdown, druggy, stuttering, etc..
/mob/living/carbon/handle_status_effects()
..()
- if(getStaminaLoss() && !combatmode)//CIT CHANGE - prevents stamina regen while combat mode is active
- adjustStaminaLoss(!CHECK_MOBILITY(src, MOBILITY_STAND) ? (recoveringstam ? -7.5 : -6) : -3)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke
+ if(getStaminaLoss() && !(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) //CIT CHANGE - prevents stamina regen while combat mode is active
+ adjustStaminaLoss(!CHECK_MOBILITY(src, MOBILITY_STAND) ? ((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) ? -7.5 : -6) : -3)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke
- if(!recoveringstam && incomingstammult != 1)
+ if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && incomingstammult != 1)
incomingstammult = max(0.01, incomingstammult)
incomingstammult = min(1, incomingstammult*2)
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index 3d567b0eff..edbd1562b3 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -35,7 +35,7 @@
gorillize()
return
if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB))
- if(!recoveringstam)
+ if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
emote("collapse")
DefaultCombatKnockdown(RAD_MOB_KNOCKDOWN_AMOUNT)
to_chat(src, "You feel weak.")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 3544f1b82f..265d520749 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -118,22 +118,22 @@
if(!CHECK_MOBILITY(src, MOBILITY_STAND) && CHECK_MOBILITY(L, MOBILITY_STAND))
var/origtargetloc = L.loc
if(!pulledby)
- if(attemptingcrawl)
+ if(combat_flags & COMBAT_FLAG_ATTEMPTING_CRAWL)
return TRUE
- if(getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(src))
to_chat(src, "You're too exhausted to crawl under [L].")
return TRUE
- attemptingcrawl = TRUE
+ ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL)
visible_message("[src] is attempting to crawl under [L].", "You are now attempting to crawl under [L].")
if(!do_after(src, CRAWLUNDER_DELAY, target = src) || CHECK_MOBILITY(src, MOBILITY_STAND))
- attemptingcrawl = FALSE
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL)
return TRUE
var/src_passmob = (pass_flags & PASSMOB)
pass_flags |= PASSMOB
Move(origtargetloc)
if(!src_passmob)
pass_flags &= ~PASSMOB
- attemptingcrawl = FALSE
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL)
return TRUE
//END OF CIT CHANGES
@@ -368,9 +368,8 @@
to_chat(src, "You have given up life and succumbed to death.")
death()
-
/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE)
- if(stat || IsUnconscious() || IsStun() || IsParalyzed() || recoveringstam || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)))
+ if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)))
return TRUE
/mob/living/canUseStorage()
diff --git a/code/modules/mob/living/living_combat.dm b/code/modules/mob/living/living_combat.dm
new file mode 100644
index 0000000000..4cd2def5a8
--- /dev/null
+++ b/code/modules/mob/living/living_combat.dm
@@ -0,0 +1,88 @@
+/mob/living/ComponentInitialize()
+ . = ..()
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_COMBAT_MODE_LOCKED), .proc/update_combat_lock)
+
+/mob/living/proc/update_combat_lock()
+ var/locked = HAS_TRAIT(src, TRAIT_COMBAT_MODE_LOCKED)
+ var/desired = (combat_flags & COMBAT_FLAG_COMBAT_TOGGLED)
+ var/actual = (combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)
+ if(actual)
+ if(locked)
+ disable_combat_mode(FALSE, TRUE, FALSE, FALSE)
+ else if(!desired)
+ disable_combat_mode(TRUE, TRUE, FALSE, FALSE)
+ else
+ if(desired && !locked)
+ enable_combat_mode(FALSE, TRUE, FALSE, FALSE)
+ update_combat_mode_icon()
+
+/mob/living/proc/disable_combat_mode(silent = TRUE, was_forced = FALSE, visible = FALSE, update_icon = TRUE)
+ if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ return
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_ACTIVE)
+ SEND_SIGNAL(src, COMSIG_LIVING_COMBAT_DISABLED, was_forced)
+ if(visible)
+ visible_message("[src] goes limp.", "Your muscles are forcibly relaxed!")
+ else if(!silent)
+ to_chat(src, was_forced? "Your muscles are forcibly relaxed!" : "You relax your muscles.")
+ if(update_icon)
+ update_combat_mode_icon()
+
+/mob/living/proc/enable_combat_mode(silent = TRUE, was_forced = FALSE, visible = FALSE, update_icon = TRUE)
+ if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)
+ return
+ ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_ACTIVE)
+ SEND_SIGNAL(src, COMSIG_LIVING_COMBAT_ENABLED, was_forced)
+ if(visible)
+ visible_message("[src] drops into a combative stance!", "You drop into a combative stance!")
+ else if(!silent)
+ to_chat(src, was_forced? "Your muscles reflexively tighten!" : "You tighten your muscles.")
+ if(update_icon)
+ update_combat_mode_icon()
+
+/// Updates the combat mode HUD icon.
+/mob/living/proc/update_combat_mode_icon()
+ var/obj/screen/combattoggle/T = locate() in hud_used?.static_inventory
+ T?.update_icon_state()
+
+/// Enables intentionally being in combat mode. Please try not to use this proc for feedback whenever possible.
+/mob/living/proc/enable_intentional_combat_mode(silent = TRUE, visible = FALSE)
+ if((combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) && (combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ return
+ ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_TOGGLED)
+ if(!HAS_TRAIT(src, TRAIT_COMBAT_MODE_LOCKED) && !(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ enable_combat_mode(silent, FALSE, visible, FALSE)
+ update_combat_mode_icon()
+ client?.show_popup_menus = FALSE
+ return TRUE
+
+/// Disables intentionally being in combat mode. Please try not to use this proc for feedback whenever possible.
+/mob/living/proc/disable_intentional_combat_mode(silent = TRUE, visible = FALSE)
+ if(!(combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) && !(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ return
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_TOGGLED)
+ if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)
+ disable_combat_mode(silent, FALSE, visible, FALSE)
+ update_combat_mode_icon()
+ client?.show_popup_menus = TRUE
+ return TRUE
+
+/// Toggles whether the user is intentionally in combat mode. THIS should be the proc you generally use! Has built in visual/to other player feedback, as well as an audible cue to ourselves.
+/mob/living/proc/user_toggle_intentional_combat_mode(visible = TRUE)
+ var/old = (combat_flags & COMBAT_FLAG_COMBAT_TOGGLED)
+ if(old)
+ disable_intentional_combat_mode()
+ playsound_local(src, 'sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above!
+ else if(CAN_TOGGLE_COMBAT_MODE(src))
+ enable_intentional_combat_mode()
+ var/current = (combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) //because we could be locked
+ if(current != old) //only sound effect if you succeeded. Could have the feedback system be better but shrug, someone else can do it.
+ if(current)
+ playsound_local(src, 'sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay!
+ if(visible)
+ if(world.time >= combatmessagecooldown)
+ combatmessagecooldown = world.time + 10 SECONDS
+ if(a_intent != INTENT_HELP)
+ visible_message("[src] [resting ? "tenses up" : (prob(95)? "drops into a combative stance" : (prob(95)? "poses aggressively" : "asserts dominance with their pose"))].")
+ else
+ visible_message("[src] [pick("looks","seems","goes")] [pick("alert","attentive","vigilant")].")
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index ed46568489..0b4be7d463 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -118,3 +118,22 @@
/// Next world.time when we can get the "you can't move while buckled to [thing]" message.
var/buckle_message_cooldown = 0
+
+ //// CITADEL STATION COMBAT ////
+ /// See __DEFINES/combat.dm
+ var/combat_flags = COMBAT_FLAGS_STAMSYSTEM_EXEMPT
+ /// Next world.time when we will show a visible message on entering combat mode voluntarily again.
+ var/combatmessagecooldown = 0
+
+ var/incomingstammult = 1
+ var/bufferedstam = 0
+ var/stambuffer = 20
+ var/stambufferregentime
+
+ //Sprint buffer---
+ var/sprint_buffer = 42 //Tiles
+ var/sprint_buffer_max = 42
+ var/sprint_buffer_regen_ds = 0.3 //Tiles per world.time decisecond
+ var/sprint_buffer_regen_last = 0 //last world.time this was regen'd for math.
+ var/sprint_stamina_cost = 0.70 //stamina loss per tile while insufficient sprint buffer.
+ //---End
diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm
index 8829e3a7f2..938a2355b4 100644
--- a/code/modules/mob/living/living_mobility.dm
+++ b/code/modules/mob/living/living_mobility.dm
@@ -33,9 +33,9 @@
set name = "Rest"
set category = "IC"
if(client?.prefs?.autostand)
- intentionalresting = !intentionalresting
- to_chat(src, "You are now attempting to [intentionalresting ? "[!resting ? "lay down and ": ""]stay down" : "[resting ? "get up and ": ""]stay up"].")
- if(intentionalresting && !resting)
+ TOGGLE_BITFIELD(combat_flags, COMBAT_FLAG_INTENTIONALLY_RESTING)
+ to_chat(src, "You are now attempting to [(combat_flags & COMBAT_FLAG_INTENTIONALLY_RESTING) ? "[!resting ? "lay down and ": ""]stay down" : "[resting ? "get up and ": ""]stay up"].")
+ if((combat_flags & COMBAT_FLAG_INTENTIONALLY_RESTING) && !resting)
set_resting(TRUE, FALSE)
else
resist_a_rest()
@@ -71,8 +71,8 @@
var/restrained = restrained()
var/pinned = resting && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE // Cit change - adds pinning for aggressive-grabbing people on the ground
var/has_limbs = has_arms || ignore_legs || has_legs
- var/canmove = !immobilize && !stun && conscious && !paralyze && (!stat_softcrit || !pulledby) && !chokehold && !IsFrozen() && has_limbs && !pinned && !recoveringstam
- var/canresist = !stun && conscious && !stat_softcrit && !paralyze && has_limbs && !recoveringstam
+ var/canmove = !immobilize && !stun && conscious && !paralyze && (!stat_softcrit || !pulledby) && !chokehold && !IsFrozen() && has_limbs && !pinned && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
+ var/canresist = !stun && conscious && !stat_softcrit && !paralyze && has_limbs && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
if(canmove)
mobility_flags |= MOBILITY_MOVE
@@ -84,7 +84,7 @@
else
mobility_flags &= ~MOBILITY_RESIST
- var/canstand_involuntary = conscious && !stat_softcrit && !knockdown && !chokehold && !paralyze && (ignore_legs || has_legs) && !(buckled && buckled.buckle_lying) && !recoveringstam
+ var/canstand_involuntary = conscious && !stat_softcrit && !knockdown && !chokehold && !paralyze && (ignore_legs || has_legs) && !(buckled && buckled.buckle_lying) && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
var/canstand = canstand_involuntary && !resting
var/should_be_lying = !canstand
@@ -107,7 +107,7 @@
else
mobility_flags |= MOBILITY_UI|MOBILITY_PULL
- var/canitem_general = !paralyze && !stun && conscious && !(stat_softcrit) && !chokehold && !restrained && has_arms && !recoveringstam
+ var/canitem_general = !paralyze && !stun && conscious && !(stat_softcrit) && !chokehold && !restrained && has_arms && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
if(canitem_general)
mobility_flags |= (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_STORAGE | MOBILITY_HOLD)
else
@@ -149,7 +149,7 @@
lying_prev = lying
//Handle citadel autoresist
- if(CHECK_MOBILITY(src, MOBILITY_MOVE) && !intentionalresting && canstand_involuntary && iscarbon(src) && client?.prefs?.autostand)//CIT CHANGE - adds autostanding as a preference
+ if(CHECK_MOBILITY(src, MOBILITY_MOVE) && !(combat_flags & COMBAT_FLAG_INTENTIONALLY_RESTING) && canstand_involuntary && iscarbon(src) && client?.prefs?.autostand)//CIT CHANGE - adds autostanding as a preference
addtimer(CALLBACK(src, .proc/resist_a_rest, TRUE), 0) //CIT CHANGE - ditto
// Movespeed mods based on arms/legs quantity
diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm
index 410e5b28db..ec291094fe 100644
--- a/code/modules/mob/living/living_movement.dm
+++ b/code/modules/mob/living/living_movement.dm
@@ -31,8 +31,16 @@
/mob/living/update_config_movespeed()
update_move_intent_slowdown()
+ sprint_buffer_max = CONFIG_GET(number/movedelay/sprint_buffer_max)
+ sprint_buffer_regen_ds = CONFIG_GET(number/movedelay/sprint_buffer_regen_per_ds)
+ sprint_stamina_cost = CONFIG_GET(number/movedelay/sprint_stamina_cost)
return ..()
+/mob/living/movement_delay(ignorewalk = 0)
+ . = ..()
+ if(!CHECK_MOBILITY(src, MOBILITY_STAND))
+ . += 6
+
/// whether or not we can slide under another living mob. defaults to if we're not dense. CanPass should check "overriding circumstances" like buckled mobs/having PASSMOB flag, etc.
/mob/living/proc/can_move_under_living(mob/living/other)
return !density
diff --git a/code/modules/mob/living/living_sprint.dm b/code/modules/mob/living/living_sprint.dm
new file mode 100644
index 0000000000..66aa3ebc6f
--- /dev/null
+++ b/code/modules/mob/living/living_sprint.dm
@@ -0,0 +1,79 @@
+/mob/living/ComponentInitialize()
+ . = ..()
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_SPRINT_LOCKED), .proc/update_sprint_lock)
+
+/mob/living/proc/update_sprint_icon()
+ var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory
+ S?.update_icon_state()
+
+/mob/living/proc/update_hud_sprint_bar()
+ hud_used?.sprint_buffer?.update_to_mob(src)
+
+/mob/living/proc/update_sprint_lock()
+ var/locked = HAS_TRAIT(src, TRAIT_SPRINT_LOCKED)
+ var/current = (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
+ var/desired = (combat_flags & COMBAT_FLAG_SPRINT_TOGGLED)
+ if(locked)
+ if(current)
+ disable_sprint_mode(FALSE)
+ else
+ if(current)
+ if(!desired)
+ disable_sprint_mode(FALSE)
+ else
+ if(desired)
+ enable_sprint_mode(FALSE)
+ update_sprint_icon()
+
+/mob/living/proc/enable_sprint_mode(update_icon = TRUE)
+ if(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
+ return
+ ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_ACTIVE)
+ if(update_icon)
+ update_sprint_icon()
+
+/mob/living/proc/disable_sprint_mode(update_icon = TRUE)
+ if(!(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ return
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_ACTIVE)
+ if(update_icon)
+ update_sprint_icon()
+
+/mob/living/proc/enable_intentional_sprint_mode()
+ if((combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ return
+ ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_TOGGLED)
+ if(!HAS_TRAIT(src, TRAIT_SPRINT_LOCKED) && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ enable_sprint_mode(FALSE)
+ update_sprint_icon()
+ return TRUE
+
+/mob/living/proc/disable_intentional_sprint_mode()
+ if(!(combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ return
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_TOGGLED)
+ if(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
+ disable_sprint_mode(FALSE)
+ update_sprint_icon()
+
+/mob/living/proc/user_toggle_intentional_sprint_mode()
+ var/old = (combat_flags & COMBAT_FLAG_SPRINT_TOGGLED)
+ if(old)
+ disable_intentional_sprint_mode()
+ if((m_intent == MOVE_INTENT_RUN) && CHECK_ALL_MOBILITY(src, MOBILITY_STAND|MOBILITY_MOVE))
+ playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
+ else
+ enable_intentional_sprint_mode()
+ if((m_intent == MOVE_INTENT_RUN) && CHECK_ALL_MOBILITY(src, MOBILITY_STAND|MOBILITY_MOVE))
+ playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
+
+/mob/living/proc/sprint_hotkey(targetstatus)
+ if(targetstatus != FORCE_BOOLEAN(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ default_toggle_sprint()
+
+/mob/living/proc/doSprintLossTiles(amount)
+ return
+
+// Silicons have snowflake behavior.
+/mob/living/proc/default_toggle_sprint()
+ return user_toggle_intentional_sprint_mode()
diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm
index f2e6fdce03..e0bd8a16b3 100644
--- a/code/modules/mob/living/login.dm
+++ b/code/modules/mob/living/login.dm
@@ -24,4 +24,4 @@
if(ranged_ability)
ranged_ability.add_ranged_ability(src, "You currently have [ranged_ability] active!")
if(vore_init && !vorepref_init) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing.
- apply_vore_prefs()
+ copy_from_prefs_vr()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 4f20a95dab..d3e7d7c395 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -913,8 +913,8 @@
/obj/item/crowbar/cyborg,
/obj/item/reagent_containers/borghypo/syndicate,
/obj/item/twohanded/shockpaddles/syndicate,
- /obj/item/healthanalyzer,
- /obj/item/surgical_drapes,
+ /obj/item/healthanalyzer/advanced,
+ /obj/item/surgical_drapes/advanced,
/obj/item/retractor,
/obj/item/hemostat,
/obj/item/cautery,
diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm
index 623174157b..e3a640bca0 100644
--- a/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ b/code/modules/mob/living/silicon/robot/robot_movement.dm
@@ -12,3 +12,15 @@
/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
if(!magpulse)
return ..()
+
+/mob/living/silicon/robot/Move(NewLoc, direct)
+ . = ..()
+ if(. && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) && !(movement_type & FLYING) && CHECK_ALL_MOBILITY(src, MOBILITY_STAND | MOBILITY_MOVE))
+ if(!(cell?.use(25)))
+ default_toggle_sprint(TRUE)
+
+/mob/living/silicon/robot/movement_delay()
+ . = ..()
+ if(!resting && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ . += 1
+ . += speed
diff --git a/code/modules/mob/living/silicon/robot/robot_sprint.dm b/code/modules/mob/living/silicon/robot/robot_sprint.dm
new file mode 100644
index 0000000000..dff0d9dd0d
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/robot_sprint.dm
@@ -0,0 +1,12 @@
+/mob/living/silicon/robot/default_toggle_sprint(shutdown = FALSE)
+ var/current = (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
+ if(current || shutdown || !cell || (cell.charge < 25) || !cansprint)
+ disable_intentional_sprint_mode()
+ if(CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE))
+ if(shutdown)
+ playsound_local(src, 'sound/effects/light_flicker.ogg', 50, FALSE, pressure_affected = FALSE)
+ playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
+ else
+ enable_intentional_sprint_mode()
+ if(CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE))
+ playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 531faff056..aae020beb0 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -15,6 +15,8 @@
speech_span = SPAN_ROBOT
flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1
no_vore = TRUE
+ /// Enable sprint system but not stamina
+ combat_flags = COMBAT_FLAGS_STAMEXEMPT_YESSPRINT
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
var/last_lawchange_announce = 0
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 2ab0f1721c..469a395169 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -276,7 +276,7 @@ Auto Patrol[]"},
if(BOT_PREP_ARREST) // preparing to arrest target
// see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again.
- if(!Adjacent(target) || !isturf(target.loc) || !target.recoveringstam || target.getStaminaLoss() <= 120) // CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks
+ if(!Adjacent(target) || !isturf(target.loc) || !(target.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || target.getStaminaLoss() <= 120) // CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks
back_to_hunt()
return
@@ -303,7 +303,7 @@ Auto Patrol[]"},
back_to_idle()
return
- if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !target.recoveringstam && target.getStaminaLoss() <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks
+ if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !(target.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && target.getStaminaLoss() <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks
back_to_hunt()
return
else
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 3ff97f2cc0..5754f8c3b2 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -312,7 +312,7 @@ Auto Patrol: []"},
if(BOT_PREP_ARREST) // preparing to arrest target
// see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again.
- if( !Adjacent(target) || !isturf(target.loc) || target.getStaminaLoss() <= 120 || !target.recoveringstam) //CIT CHANGE - replaces amountknockdown with checks for stamina so secbots dont run into an infinite loop
+ if( !Adjacent(target) || !isturf(target.loc) || target.getStaminaLoss() <= 120 || !(target.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) //CIT CHANGE - replaces amountknockdown with checks for stamina so secbots dont run into an infinite loop
back_to_hunt()
return
@@ -339,7 +339,7 @@ Auto Patrol: []"},
back_to_idle()
return
- if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !target.recoveringstam && target.getStaminaLoss() <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss check
+ if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !(target.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && target.getStaminaLoss() <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss check
back_to_hunt()
return
else //Try arresting again if the target escapes.
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
index fd3221d900..39b66fbdc2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
@@ -39,7 +39,8 @@
animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch
childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55)
- wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/)
+ wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/, /obj/item/bodypart, /obj/item/organ/appendix, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/heart, /obj/item/organ/liver, \
+ /obj/item/organ/lungs, /obj/item/organ/stomach, /obj/item/organ/tongue) // So we dont eat implants or brains. Still can eat robotic stuff thats subtyped of base line but thats a issue for a nother day.
var/obj/item/udder/gutlunch/udder = null
/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize()
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index 40b4212aac..5cdeaecd37 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -30,45 +30,48 @@
/mob/living/proc/Stun(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/stun/S = IsStun()
- if(S)
- S.duration = max(world.time + amount, S.duration)
- else if(amount > 0)
- S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
- return S
+ if(!ignore_canstun && (!(status_flags & CANSTUN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/stun/S = IsStun()
+ if(S)
+ S.duration = max(world.time + amount, S.duration)
+ else if(amount > 0)
+ S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
+ return S
/mob/living/proc/SetStun(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- var/datum/status_effect/incapacitating/stun/S = IsStun()
- if(amount <= 0)
- if(S)
- qdel(S)
+ if(!ignore_canstun && (!(status_flags & CANSTUN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ var/datum/status_effect/incapacitating/stun/S = IsStun()
+ if(amount <= 0)
+ if(S)
+ qdel(S)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(S)
+ S.duration = world.time + amount
else
- if(absorb_stun(amount, ignore_canstun))
- return
- if(S)
- S.duration = world.time + amount
- else
- S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
- return S
+ S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
+ return S
/mob/living/proc/AdjustStun(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/stun/S = IsStun()
- if(S)
- S.duration += amount
- else if(amount > 0)
- S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
- return S
+ if(!ignore_canstun && (!(status_flags & CANSTUN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/stun/S = IsStun()
+ if(S)
+ S.duration += amount
+ else if(amount > 0)
+ S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
+ return S
///////////////////////////////// KNOCKDOWN /////////////////////////////////////
@@ -84,45 +87,48 @@
/mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
- if(K)
- K.duration = max(world.time + amount, K.duration)
- else if(amount > 0)
- K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
- return K
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
+ if(K)
+ K.duration = max(world.time + amount, K.duration)
+ else if(amount > 0)
+ K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
+ return K
/mob/living/proc/SetKnockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
- if(amount <= 0)
- if(K)
- qdel(K)
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
+ if(amount <= 0)
+ if(K)
+ qdel(K)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(K)
+ K.duration = world.time + amount
else
- if(absorb_stun(amount, ignore_canstun))
- return
- if(K)
- K.duration = world.time + amount
- else
- K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
- return K
+ K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
+ return K
/mob/living/proc/AdjustKnockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
- if(K)
- K.duration += amount
- else if(amount > 0)
- K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
- return K
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
+ if(K)
+ K.duration += amount
+ else if(amount > 0)
+ K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
+ return K
///////////////////////////////// IMMOBILIZED ////////////////////////////////////
/mob/living/proc/IsImmobilized() //If we're immobilized
@@ -137,45 +143,48 @@
/mob/living/proc/Immobilize(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
- if(I)
- I.duration = max(world.time + amount, I.duration)
- else if(amount > 0)
- I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
- return I
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
+ if(I)
+ I.duration = max(world.time + amount, I.duration)
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
+ return I
/mob/living/proc/SetImmobilized(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
- if(amount <= 0)
- if(I)
- qdel(I)
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
+ if(amount <= 0)
+ if(I)
+ qdel(I)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(I)
+ I.duration = world.time + amount
else
- if(absorb_stun(amount, ignore_canstun))
- return
- if(I)
- I.duration = world.time + amount
- else
- I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
- return I
+ I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
+ return I
/mob/living/proc/AdjustImmobilized(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
- if(I)
- I.duration += amount
- else if(amount > 0)
- I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
- return I
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
+ if(I)
+ I.duration += amount
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
+ return I
///////////////////////////////// PARALYZED //////////////////////////////////
/mob/living/proc/IsParalyzed() //If we're immobilized
@@ -190,45 +199,48 @@
/mob/living/proc/Paralyze(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
- if(P)
- P.duration = max(world.time + amount, P.duration)
- else if(amount > 0)
- P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
- return P
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
+ if(P)
+ P.duration = max(world.time + amount, P.duration)
+ else if(amount > 0)
+ P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
+ return P
/mob/living/proc/SetParalyzed(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
- if(amount <= 0)
- if(P)
- qdel(P)
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
+ if(amount <= 0)
+ if(P)
+ qdel(P)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(P)
+ P.duration = world.time + amount
else
- if(absorb_stun(amount, ignore_canstun))
- return
- if(P)
- P.duration = world.time + amount
- else
- P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
- return P
+ P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
+ return P
/mob/living/proc/AdjustParalyzed(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
- if(P)
- P.duration += amount
- else if(amount > 0)
- P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
- return P
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
+ if(P)
+ P.duration += amount
+ else if(amount > 0)
+ P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
+ return P
///////////////////////////////// DAZED ////////////////////////////////////
/mob/living/proc/IsDazed() //If we're Dazed
@@ -243,45 +255,104 @@
/mob/living/proc/Daze(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/dazed/I = IsDazed()
- if(I)
- I.duration = max(world.time + amount, I.duration)
- else if(amount > 0)
- I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
- return I
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/dazed/I = IsDazed()
+ if(I)
+ I.duration = max(world.time + amount, I.duration)
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
+ return I
/mob/living/proc/SetDazed(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- var/datum/status_effect/incapacitating/dazed/I = IsDazed()
- if(amount <= 0)
- if(I)
- qdel(I)
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ var/datum/status_effect/incapacitating/dazed/I = IsDazed()
+ if(amount <= 0)
+ if(I)
+ qdel(I)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(I)
+ I.duration = world.time + amount
else
- if(absorb_stun(amount, ignore_canstun))
- return
- if(I)
- I.duration = world.time + amount
- else
- I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
- return I
+ I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
+ return I
/mob/living/proc/AdjustDazed(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/dazed/I = IsDazed()
+ if(I)
+ I.duration += amount
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
+ return I
+
+///////////////////////////////// STAGGERED ////////////////////////////////////
+/mob/living/proc/IsStaggered() //If we're Staggered
+ return has_status_effect(STATUS_EFFECT_STAGGERED)
+
+/mob/living/proc/AmountStaggered() //How many deciseconds remain in our Staggered status effect
+ var/datum/status_effect/staggered/I = IsStaggered()
+ if(I)
+ return I.duration - world.time
+ return 0
+
+/mob/living/proc/Stagger(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STAGGER, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/staggered/I = IsStaggered()
+ if(I)
+ I.duration = max(world.time + amount, I.duration)
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_STAGGERED, amount, updating)
+ return I
+
+/mob/living/proc/SetStaggered(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STAGGER, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ var/datum/status_effect/staggered/I = IsStaggered()
+ if(amount <= 0)
+ if(I)
+ qdel(I)
+ else
if(absorb_stun(amount, ignore_canstun))
return
- var/datum/status_effect/incapacitating/dazed/I = IsDazed()
if(I)
- I.duration += amount
- else if(amount > 0)
- I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
- return I
+ I.duration = world.time + amount
+ else
+ I = apply_status_effect(STATUS_EFFECT_STAGGERED, amount, updating)
+ return I
+
+/mob/living/proc/AdjustStaggered(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STAGGER, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/staggered/I = IsStaggered()
+ if(I)
+ I.duration += amount
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_STAGGERED, amount, updating)
+ return I
//Blanket
/mob/living/proc/AllImmobility(amount, updating, ignore_canstun = FALSE)
@@ -290,6 +361,7 @@
Stun(amount, FALSE, ignore_canstun)
Immobilize(amount, FALSE, ignore_canstun)
Daze(amount, FALSE, ignore_canstun)
+ Stagger(amount, FALSE, ignore_canstun)
if(updating)
update_mobility()
@@ -299,6 +371,7 @@
SetStun(amount, FALSE, ignore_canstun)
SetImmobilized(amount, FALSE, ignore_canstun)
SetDazed(amount, FALSE, ignore_canstun)
+ SetStaggered(amount, FALSE, ignore_canstun)
if(updating)
update_mobility()
@@ -308,6 +381,7 @@
AdjustStun(amount, FALSE, ignore_canstun)
AdjustImmobilized(amount, FALSE, ignore_canstun)
AdjustDazed(amount, FALSE, ignore_canstun)
+ AdjustStaggered(amount, FALSE, ignore_canstun)
if(updating)
update_mobility()
@@ -323,11 +397,13 @@
SetImmobilized(amount, FALSE, ignore_canstun)
if(AmountDazed() > amount)
SetImmobilized(amount, FALSE, ignore_canstun)
+ if(AmountStaggered() > amount)
+ SetStaggered(amount, FALSE, ignore_canstun)
if(updating)
update_mobility()
/mob/living/proc/HighestImmobilityAmount()
- return max(max(max(max(AmountStun(), AmountKnockdown()), AmountParalyzed()), AmountImmobilized()), AmountDazed())
+ return max(AmountStun(), AmountKnockdown(), AmountParalyzed(), AmountImmobilized(), AmountDazed(), AmountStaggered())
//////////////////UNCONSCIOUS
/mob/living/proc/IsUnconscious() //If we're unconscious
diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm
index 323deed5c4..983ef0585a 100644
--- a/code/modules/ninja/outfit.dm
+++ b/code/modules/ninja/outfit.dm
@@ -2,7 +2,7 @@
name = "Space Ninja"
uniform = /obj/item/clothing/under/color/black/trackless
suit = /obj/item/clothing/suit/space/space_ninja
- glasses = /obj/item/clothing/glasses/night
+ glasses = /obj/item/clothing/glasses/night/syndicate
mask = /obj/item/clothing/mask/gas/space_ninja
head = /obj/item/clothing/head/helmet/space/space_ninja
ears = /obj/item/radio/headset
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 227e22d499..2b09954f08 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -204,7 +204,7 @@
w_class = WEIGHT_CLASS_NORMAL
name = "energy dagger"
hitsound = 'sound/weapons/blade1.ogg'
- embedding = embedding.setRating(embed_chance = 100) //rule of cool
+ embedding = list("embed_chance" = 100, "embedded_fall_chance" = 0)//rule of cool
throwforce = 35
playsound(user, 'sound/weapons/saberon.ogg', 5, 1)
to_chat(user, "[src] is now active.")
diff --git a/code/modules/projectiles/ammunition/caseless/arrow.dm b/code/modules/projectiles/ammunition/caseless/arrow.dm
index 0543e48f96..08f6ba8c70 100644
--- a/code/modules/projectiles/ammunition/caseless/arrow.dm
+++ b/code/modules/projectiles/ammunition/caseless/arrow.dm
@@ -1,17 +1,21 @@
/obj/item/ammo_casing/caseless/arrow
- name = "wooden arrow"
- desc = "An arrow made of wood, typically fired from a bow."
+ name = "arrow of questionable material"
+ desc = "You shouldn't be seeing this arrow."
projectile_type = /obj/item/projectile/bullet/reusable/arrow
caliber = "arrow"
icon_state = "arrow"
throwforce = 3 //good luck hitting someone with the pointy end of the arrow
throw_speed = 3
-/obj/item/ammo_casing/caseless/arrow/ashen
+/obj/item/ammo_casing/caseless/arrow/wood
+ name = "wooden arrow"
+ desc = "An arrow made of wood, typically fired from a bow."
+
+/obj/item/ammo_casing/caseless/arrow/ash
name = "ashen arrow"
desc = "An arrow made of wood, hardened by fire."
icon_state = "ashenarrow"
- projectile_type = /obj/item/projectile/bullet/reusable/arrow/ashen
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/ash
/obj/item/ammo_casing/caseless/arrow/bone
name = "bone arrow"
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 1f9f211154..d06ad972e6 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -168,7 +168,7 @@
return
if(firing)
return
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //respect stamina softcrit
+ if(IS_STAMCRIT(user)) //respect stamina softcrit
to_chat(user, "You are too exhausted to fire [src]!")
return
if(flag) //It's adjacent, is the user, or is on the user's person
@@ -562,11 +562,11 @@
update_icon()
/obj/item/gun/proc/getinaccuracy(mob/living/user)
- if(!iscarbon(user))
+ if(!isliving(user))
return FALSE
else
- var/mob/living/carbon/holdingdude = user
- if(istype(holdingdude) && holdingdude.combatmode)
- return (max((holdingdude.lastdirchange + weapon_weight * 25) - world.time,0) * inaccuracy_modifier)
+ var/mob/living/holdingdude = user
+ if(istype(holdingdude) && (holdingdude.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ return 0
else
return ((weapon_weight * 25) * inaccuracy_modifier)
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 7f01db466f..56aebc891d 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -37,7 +37,7 @@
/obj/item/gun/ballistic/shotgun/attack_self(mob/living/user)
if(recentpump > world.time)
return
- if(istype(user) && user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit
+ if(IS_STAMCRIT(user))//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return//CIT CHANGE - ditto
pump(user, TRUE)
diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm
index 2f0aa00027..7fa81f513f 100644
--- a/code/modules/projectiles/guns/energy/dueling.dm
+++ b/code/modules/projectiles/guns/energy/dueling.dm
@@ -28,6 +28,16 @@
/datum/duel/New()
id = next_id++
+/datum/duel/Destroy()
+ if(gun_A)
+ gun_A.duel = null
+ gun_A = null
+ if(gun_B)
+ gun_B.duel = null
+ gun_B = null
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
/datum/duel/proc/try_begin()
//Check if both guns are held and if so begin.
var/mob/living/A = get_duelist(gun_A)
@@ -45,13 +55,13 @@
message_duelists("Set your gun setting and move [required_distance] steps away from your opponent.")
- START_PROCESSING(SSobj,src)
+ START_PROCESSING(SSobj, src)
-/datum/duel/proc/get_duelist(obj/gun)
- var/mob/living/G = gun.loc
- if(!istype(G) || !G.is_holding(gun))
- return null
- return G
+/datum/duel/proc/get_duelist(obj/item/gun/energy/dueling/G)
+ var/mob/living/L = G.loc
+ if(!istype(L) || !L.is_holding(G))
+ return
+ return L
/datum/duel/proc/message_duelists(message)
var/mob/living/LA = get_duelist(gun_A)
@@ -66,7 +76,7 @@
/datum/duel/proc/end()
message_duelists("Duel finished. Re-engaging safety.")
- STOP_PROCESSING(SSobj,src)
+ STOP_PROCESSING(SSobj, src)
state = DUEL_IDLE
/datum/duel/process()
@@ -129,10 +139,11 @@
return FALSE
if(!isturf(A.loc) || !isturf(B.loc))
return FALSE
- if(get_dist(A,B) != required_distance)
+ if(get_dist(A, B) != required_distance)
return FALSE
- for(var/turf/T in getline(get_turf(A),get_turf(B)))
- if(is_blocked_turf(T,TRUE))
+ for(var/i in getline(A.loc, B.loc))
+ var/turf/T = i
+ if(is_blocked_turf(T, TRUE))
return FALSE
return TRUE
@@ -180,7 +191,6 @@
return "duel_red"
/obj/item/gun/energy/dueling/attack_self(mob/living/user)
- . = ..()
if(duel.state == DUEL_IDLE)
duel.try_begin()
else
@@ -205,12 +215,9 @@
add_overlay(setting_overlay)
/obj/item/gun/energy/dueling/Destroy()
- . = ..()
- if(duel.gun_A == src)
- duel.gun_A = null
- if(duel.gun_B == src)
- duel.gun_B = null
- duel = null
+ if(duel)
+ qdel(duel)
+ return ..()
/obj/item/gun/energy/dueling/can_trigger_gun(mob/living/user)
. = ..()
@@ -234,10 +241,8 @@
if(duel.state == DUEL_READY)
duel.confirmations[src] = TRUE
to_chat(user,"You confirm your readiness.")
- return
else if(!is_duelist(target)) //I kinda want to leave this out just to see someone shoot a bystander or missing.
to_chat(user,"[src] safety system prevents shooting anyone but your designated opponent.")
- return
else
duel.fired[src] = TRUE
. = ..()
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index c295adde60..f230dc7fea 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -181,13 +181,6 @@
listeningTo = null
return ..()
-/obj/item/gun/energy/beam_rifle/emp_act(severity)
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- chambered = null
- recharge_newshot()
-
/obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE)
var/diff = abs(aiming_lastangle - lastangle)
if(!check_user())
@@ -302,7 +295,7 @@
if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher))
return
process_aim()
- if(aiming_time_left <= aiming_time_fire_threshold && check_user() && ((lastfire + delay) <= world.time))
+ if(fire_check())
sync_ammo()
do_fire(M.client.mouseObject, M, FALSE, M.client.mouseParams, M.zone_selected)
stop_aiming()
@@ -310,11 +303,16 @@
return ..()
/obj/item/gun/energy/beam_rifle/do_fire(atom/target, mob/living/user, message = TRUE, params, zone_override = "", bonus_spread = 0)
+ if(!fire_check())
+ return
. = ..()
if(.)
lastfire = world.time
stop_aiming()
+/obj/item/gun/energy/beam_rifle/proc/fire_check()
+ return (aiming_time_left <= aiming_time_fire_threshold) && check_user() && ((lastfire + delay) <= world.time)
+
/obj/item/gun/energy/beam_rifle/proc/sync_ammo()
for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents)
AC.sync_stats()
@@ -531,21 +529,15 @@
tracer_type = /obj/effect/projectile/tracer/tracer/beam_rifle
var/constant_tracer = FALSE
-/obj/item/projectile/beam/beam_rifle/hitscan/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE, highlander)
- set waitfor = FALSE
- if(isnull(highlander))
- highlander = constant_tracer
- if(highlander && istype(gun))
- QDEL_LIST(gun.current_tracers)
- for(var/datum/point/p in beam_segments)
- gun.current_tracers += generate_tracer_between_points(p, beam_segments[p], tracer_type, color, 0, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity)
+/obj/item/projectile/beam/beam_rifle/hitscan/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE, generation, highlander = constant_tracer)
+ if(!highlander)
+ return ..()
else
- for(var/datum/point/p in beam_segments)
- generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity)
- if(cleanup)
- QDEL_LIST(beam_segments)
- beam_segments = null
- QDEL_NULL(beam_index)
+ duration = 0
+ . = ..()
+ if(!generation) //first one
+ QDEL_LIST(gun.current_tracers)
+ gun.current_tracers += .
/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam
tracer_type = /obj/effect/projectile/tracer/tracer/aiming
@@ -560,4 +552,5 @@
hitscan_light_color_override = "#99ff99"
/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target)
+ qdel(src)
return FALSE
diff --git a/code/modules/projectiles/guns/misc/chameleon.dm b/code/modules/projectiles/guns/misc/chameleon.dm
new file mode 100644
index 0000000000..d2afe2bd78
--- /dev/null
+++ b/code/modules/projectiles/guns/misc/chameleon.dm
@@ -0,0 +1,169 @@
+// this is all shitcode never ever add it to the game it's for debugging only.
+
+/datum/action/item_action/chameleon/change/gun/update_look(mob/user, obj/item/picked_item)
+ . = ..()
+ var/obj/item/gun/energy/laser/chameleon/CG = target
+ CG.get_chameleon_projectile(picked_item)
+
+/obj/item/gun/energy/laser/chameleon
+ name = "practice laser gun"
+ desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice."
+ ammo_type = list(/obj/item/ammo_casing/energy/chameleon)
+ clumsy_check = 0
+ item_flags = NONE
+ pin = /obj/item/firing_pin
+ cell_type = /obj/item/stock_parts/cell/bluespace
+
+ var/datum/action/item_action/chameleon/change/gun/chameleon_action
+ var/list/chameleon_projectile_vars
+ var/list/chameleon_ammo_vars
+ var/list/chameleon_gun_vars
+ var/list/projectile_copy_vars
+ var/list/ammo_copy_vars
+ var/list/gun_copy_vars
+ var/badmin_mode = FALSE
+ var/can_hitscan = FALSE
+ var/hitscan_mode = FALSE
+
+/obj/item/gun/energy/laser/chameleon/Initialize()
+ . = ..()
+ chameleon_action = new(src)
+ chameleon_action.chameleon_type = /obj/item/gun
+ chameleon_action.chameleon_name = "Gun"
+ chameleon_action.chameleon_blacklist = typecacheof(/obj/item/gun/magic, ignore_root_path = FALSE)
+ chameleon_action.initialize_disguises()
+
+ projectile_copy_vars = list("name", "icon", "icon_state", "item_state", "speed", "color", "hitsound", "forcedodge", "impact_effect_type", "range", "suppressed", "hitsound_wall", "impact_effect_type", "pass_flags", "tracer_type", "muzzle_type", "impact_type")
+ chameleon_projectile_vars = list("name" = "practice laser", "icon" = 'icons/obj/projectiles.dmi', "icon_state" = "laser")
+ gun_copy_vars = list("fire_sound", "burst_size", "fire_delay")
+ chameleon_gun_vars = list()
+ ammo_copy_vars = list("firing_effect_type")
+ chameleon_ammo_vars = list()
+ recharge_newshot()
+ get_chameleon_projectile(/obj/item/gun/energy/laser)
+
+/obj/item/gun/energy/laser/chameleon/emp_act(severity)
+ return
+
+/obj/item/gun/energy/laser/chameleon/proc/reset_chameleon_vars()
+ chameleon_ammo_vars = list()
+ chameleon_gun_vars = list()
+ chameleon_projectile_vars = list()
+ var/static/list/blacklisted_vars = list("locs", "loc", "contents", "x", "y", "z", "parent_type", "type", "vars")
+ if(chambered)
+ for(var/v in ammo_copy_vars)
+ if(v in blacklisted_vars) //Just in case admins go crazy.
+ continue
+ chambered.vv_edit_var(v, initial(chambered.vars[v]))
+ for(var/v in gun_copy_vars)
+ if(v in blacklisted_vars)
+ continue
+ vv_edit_var(v, initial(vars[v]))
+ vars[v] = initial(vars[v])
+ QDEL_NULL(chambered.BB)
+ chambered.newshot()
+
+/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_ammo(obj/item/ammo_casing/AC, passthrough = TRUE, reset = FALSE)
+ if(!istype(AC))
+ CRASH("[AC] is not /obj/item/ammo_casing!")
+ return FALSE
+ for(var/V in ammo_copy_vars)
+ if(AC.vars.Find(V))
+ chameleon_ammo_vars[V] = AC.vars[V]
+ chambered?.vv_edit_var(V, AC.vars[V])
+ if(passthrough)
+ var/obj/item/projectile/P = AC.BB
+ set_chameleon_projectile(P)
+
+/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_projectile(obj/item/projectile/P)
+ if(!istype(P))
+ CRASH("[P] is not /obj/item/projectile!")
+ return FALSE
+ chameleon_projectile_vars = list("name" = "practice laser", "icon" = 'icons/obj/projectiles.dmi', "icon_state" = "laser", "nodamage" = TRUE)
+ for(var/V in projectile_copy_vars)
+ if(P.vars.Find(V))
+ chameleon_projectile_vars[V] = P.vars[V]
+ if(istype(chambered, /obj/item/ammo_casing/energy/chameleon))
+ var/obj/item/ammo_casing/energy/chameleon/AC = chambered
+ AC.projectile_vars = chameleon_projectile_vars.Copy()
+ if(!P.tracer_type)
+ can_hitscan = FALSE
+ set_hitscan(FALSE)
+ else
+ can_hitscan = TRUE
+ if(badmin_mode)
+ qdel(chambered.BB)
+ chambered.projectile_type = P.type
+ chambered.newshot()
+
+/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_gun(obj/item/gun/G , passthrough = TRUE)
+ if(!istype(G))
+ CRASH("[G] is not /obj/item/gun!")
+ return FALSE
+ for(var/V in gun_copy_vars)
+ if(vars.Find(V) && G.vars.Find(V))
+ chameleon_gun_vars[V] = G.vars[V]
+ vv_edit_var(V, G.vars[V])
+ if(passthrough)
+ if(istype(G, /obj/item/gun/ballistic))
+ var/obj/item/gun/ballistic/BG = G
+ var/obj/item/ammo_box/AB = new BG.mag_type(G)
+ qdel(BG)
+ if(!istype(AB)||!AB.ammo_type)
+ qdel(AB)
+ return FALSE
+ var/obj/item/ammo_casing/AC = new AB.ammo_type(G)
+ set_chameleon_ammo(AC)
+ else if(istype(G, /obj/item/gun/magic))
+ var/obj/item/gun/magic/MG = G
+ var/obj/item/ammo_casing/AC = new MG.ammo_type(G)
+ set_chameleon_ammo(AC)
+ else if(istype(G, /obj/item/gun/energy))
+ var/obj/item/gun/energy/EG = G
+ if(islist(EG.ammo_type) && EG.ammo_type.len)
+ var/obj/item/ammo_casing/AC = EG.ammo_type[1]
+ set_chameleon_ammo(AC)
+ else if(istype(G, /obj/item/gun/syringe))
+ var/obj/item/ammo_casing/AC = new /obj/item/ammo_casing/syringegun(src)
+ set_chameleon_ammo(AC)
+
+/obj/item/gun/energy/laser/chameleon/attack_self(mob/user)
+ . = ..()
+ if(!can_hitscan)
+ to_chat(user, "[src]'s current disguised gun does not allow it to enable high velocity mode!")
+ return
+ if(!chambered)
+ to_chat(user, "Unknown error in energy lens: Please reset chameleon disguise and try again.")
+ return
+ set_hitscan(!hitscan_mode)
+ to_chat(user, "You toggle [src]'s high velocity beam mode to [hitscan_mode? "on" : "off"].")
+
+/obj/item/gun/energy/laser/chameleon/proc/set_hitscan(hitscan)
+ var/obj/item/ammo_casing/energy/chameleon/AC = chambered
+ AC.hitscan_mode = hitscan
+ hitscan_mode = hitscan
+
+/obj/item/gun/energy/laser/chameleon/proc/get_chameleon_projectile(guntype)
+ reset_chameleon_vars()
+ var/obj/item/gun/G = new guntype(src)
+ set_chameleon_gun(G)
+ qdel(G)
+
+/obj/item/ammo_casing/energy/chameleon
+ projectile_type = /obj/item/projectile/energy/chameleon
+ e_cost = 0
+ var/hitscan_mode = FALSE
+ var/list/projectile_vars = list()
+
+/obj/item/ammo_casing/energy/chameleon/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ . = ..()
+ if(!BB)
+ newshot()
+ for(var/V in projectile_vars)
+ if(BB.vars.Find(V))
+ BB.vv_edit_var(V, projectile_vars[V])
+ if(hitscan_mode)
+ BB.hitscan = TRUE
+
+/obj/item/projectile/energy/chameleon
+ nodamage = TRUE
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 139f5a051c..9b60f96d16 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -52,6 +52,8 @@
var/hitscan = FALSE //Whether this is hitscan. If it is, speed is basically ignored.
var/list/beam_segments //assoc list of datum/point or datum/point/vector, start = end. Used for hitscan effect generation.
var/datum/point/beam_index
+ /// Used in generate_hitscan_tracers to determine which "cycle" we're on.
+ var/hitscan_effect_generation = 0
var/tracer_type
var/muzzle_type
var/impact_type
@@ -89,10 +91,10 @@
var/decayedRange //stores original range
var/reflect_range_decrease = 5 //amount of original range that falls off when reflecting, so it doesn't go forever
var/is_reflectable = FALSE // Can it be reflected or not?
-
+
/// factor to multiply by for zone accuracy percent.
var/zone_accuracy_factor = 1
-
+
//Effects
var/stun = 0
var/knockdown = 0
@@ -656,18 +658,20 @@
if(trajectory && beam_index)
var/datum/point/pcache = trajectory.copy_to()
beam_segments[beam_index] = pcache
- generate_hitscan_tracers(null, null, impacting)
+ generate_hitscan_tracers(null, null, impacting, hitscan_effect_generation++)
-/obj/item/projectile/proc/generate_hitscan_tracers(cleanup = TRUE, duration = 3, impacting = TRUE)
+/obj/item/projectile/proc/generate_hitscan_tracers(cleanup = TRUE, duration = 3, impacting = TRUE, generation)
if(!length(beam_segments))
return
+ . = list()
if(tracer_type)
- var/tempref = REF(src)
+ var/list/turfs = list()
for(var/datum/point/p in beam_segments)
- generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity, tempref)
+ . += generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity, turfs)
if(muzzle_type && duration > 0)
var/datum/point/p = beam_segments[1]
var/atom/movable/thing = new muzzle_type
+ . += thing
p.move_atom_to_src(thing)
var/matrix/M = new
M.Turn(original_angle)
@@ -678,6 +682,7 @@
if(impacting && impact_type && duration > 0)
var/datum/point/p = beam_segments[beam_segments[beam_segments.len]]
var/atom/movable/thing = new impact_type
+ . += thing
p.move_atom_to_src(thing)
var/matrix/M = new
M.Turn(Angle)
diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm
index 6ae6564671..e3449a0c1d 100644
--- a/code/modules/projectiles/projectile/energy/stun.dm
+++ b/code/modules/projectiles/projectile/energy/stun.dm
@@ -9,7 +9,8 @@
stutter = 10
jitter = 20
hitsound = 'sound/weapons/taserhit.ogg'
- range = 7
+ range = 14
+ speed = 0.6
tracer_type = /obj/effect/projectile/tracer/stun
muzzle_type = /obj/effect/projectile/muzzle/stun
impact_type = /obj/effect/projectile/impact/stun
@@ -42,9 +43,9 @@
knockdown_stamoverride = 0
knockdown_stam_max = 0
strong_tase = FALSE
- range = 12
/obj/item/projectile/energy/electrode/security/hos
knockdown = 100
knockdown_stamoverride = 30
knockdown_stam_max = null
+ tase_duration = 10
diff --git a/code/modules/projectiles/projectile/reusable/arrow.dm b/code/modules/projectiles/projectile/reusable/arrow.dm
index d00de79eb1..7c1a06f72c 100644
--- a/code/modules/projectiles/projectile/reusable/arrow.dm
+++ b/code/modules/projectiles/projectile/reusable/arrow.dm
@@ -3,13 +3,13 @@
desc = "Woosh!"
damage = 15
icon_state = "arrow"
- ammo_type = /obj/item/ammo_casing/caseless/arrow
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/wood
-/obj/item/projectile/bullet/reusable/arrow/ashen
+/obj/item/projectile/bullet/reusable/arrow/ash
name = "ashen arrow"
desc = "Fire harderned arrow."
damage = 25
- ammo_type = /obj/item/ammo_casing/caseless/arrow/ashen
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/ash
/obj/item/projectile/bullet/reusable/arrow/bone //AP for ashwalkers
name = "bone arrow"
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 2d177318aa..2974df29a6 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -356,7 +356,6 @@
replace_beaker(user, B)
to_chat(user, "You add [B] to [src].")
updateUsrDialog()
- update_icon()
else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/card/emag))
to_chat(user, "You can't load [I] into [src]!")
return ..()
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 2c8be10ace..15842299e3 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -114,9 +114,12 @@
/datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, multiplier)
var/location = get_turf(holder.my_atom)
- // 100 multiplier = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes.
- // 200 multiplier = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades.
- empulse(location, round(multiplier / 12), round(multiplier / 7), 1)
+ // 50 multiplier = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes.
+ // 100 multiplier = 5 heavy range & 10 light range.
+ // 200 multiplier = 7 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades.
+ // 300 multiplier = 8 heavy range & 17 light range. Still rather significant, considering that you can get dozens of bluespace beakers 30 minutes in with a competent crew.
+ // 900 multiplier = 12 heavy range & 30 light range. Still less than 300 before this commit.
+ empulse(location, round(multiplier ** (3/8)), round(multiplier ** (1/2)), 1)
holder.clear_reagents()
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 0104bfba7b..be1b9460b0 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -55,6 +55,10 @@ Nothing else in the console has ID requirements.
if (istype(ID, /datum/material))
var/datum/material/material = ID
return material.name
+
+ else if(GLOB.chemical_reagents_list[ID])
+ var/datum/reagent/reagent = GLOB.chemical_reagents_list[ID]
+ return reagent.name
return ID
/obj/machinery/computer/rdconsole/proc/SyncRDevices() //Makes sure it is properly sync'ed up with the devices attached to it (if any).
diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
index 9efbe58a29..b9897db303 100644
--- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
@@ -27,6 +27,7 @@
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "slimestatus")
owner.visible_message("[owner] stops glowing, the rainbow light fading away.",
"You no longer feel protected...")
+ return ..()
/obj/screen/alert/status_effect/slimeskin
name = "Adamantine Slimeskin"
@@ -56,6 +57,7 @@
H.physiology.damage_resistance -= 10
owner.visible_message("[owner]'s gel coating liquefies and dissolves away.",
"Your gel second-skin dissolves!")
+ return ..()
/datum/status_effect/slimerecall
id = "slime_recall"
@@ -87,6 +89,7 @@
"The unknown force snatches briefly you from reality, and deposits you next to [target]!")
do_sparks(3, TRUE, owner)
owner.forceMove(target.loc)
+ return ..()
/obj/screen/alert/status_effect/freon/stasis
desc = "You're frozen inside of a protective ice cube! While inside, you can't do anything, but are immune to harm! Resist to get out."
@@ -117,6 +120,7 @@
qdel(cube)
owner.status_flags &= ~GODMODE
UnregisterSignal(owner, COMSIG_LIVING_RESIST)
+ return ..()
/datum/status_effect/slime_clone
id = "slime_cloned"
@@ -156,6 +160,7 @@
if(clone)
clone.unequip_everything()
qdel(clone)
+ return ..()
/obj/screen/alert/status_effect/clone_decay
name = "Clone Decay"
@@ -195,6 +200,7 @@
/datum/status_effect/bloodchill/on_remove()
owner.remove_movespeed_modifier("bloodchilled")
+ return ..()
/obj/screen/alert/status_effect/bloodchill
name = "Bloodchilled"
@@ -218,6 +224,7 @@
/datum/status_effect/bonechill/on_remove()
owner.remove_movespeed_modifier("bonechilled")
+ return ..()
/obj/screen/alert/status_effect/bonechill
name = "Bonechilled"
@@ -249,6 +256,7 @@ datum/status_effect/rebreathing/tick()
/datum/status_effect/firecookie/on_remove()
REMOVE_TRAIT(owner, TRAIT_RESISTCOLD,"firecookie")
+ return ..()
/datum/status_effect/watercookie
id = "watercookie"
@@ -266,6 +274,7 @@ datum/status_effect/rebreathing/tick()
/datum/status_effect/watercookie/on_remove()
REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER,"watercookie")
+ return ..()
/datum/status_effect/metalcookie
id = "metalcookie"
@@ -283,6 +292,7 @@ datum/status_effect/rebreathing/tick()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.brute_mod /= 0.9
+ return ..()
/datum/status_effect/sparkcookie
id = "sparkcookie"
@@ -302,6 +312,7 @@ datum/status_effect/rebreathing/tick()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.siemens_coeff = original_coeff
+ return ..()
/datum/status_effect/toxincookie
id = "toxincookie"
@@ -315,6 +326,7 @@ datum/status_effect/rebreathing/tick()
/datum/status_effect/toxincookie/on_remove()
REMOVE_TRAIT(owner, TRAIT_TOXINLOVER,"toxincookie")
+ return ..()
/datum/status_effect/timecookie
id = "timecookie"
@@ -332,6 +344,7 @@ datum/status_effect/rebreathing/tick()
if(ishuman(owner))
var/mob/living/carbon/human/H
H.physiology.do_after_speed /= 0.95
+ return ..()
/datum/status_effect/lovecookie
id = "lovecookie"
@@ -377,6 +390,7 @@ datum/status_effect/rebreathing/tick()
/datum/status_effect/tarfoot/on_remove()
owner.remove_movespeed_modifier(MOVESPEED_ID_TARFOOT)
+ return ..()
/datum/status_effect/spookcookie
id = "spookcookie"
@@ -392,6 +406,7 @@ datum/status_effect/rebreathing/tick()
/datum/status_effect/spookcookie/on_remove()
owner.remove_alt_appearance("spookyscary")
+ return ..()
/datum/status_effect/peacecookie
id = "peacecookie"
@@ -415,6 +430,7 @@ datum/status_effect/rebreathing/tick()
/datum/status_effect/plur/on_remove()
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "peacecookie")
+ return ..()
/datum/status_effect/adamantinecookie
id = "adamantinecookie"
@@ -432,6 +448,7 @@ datum/status_effect/rebreathing/tick()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.burn_mod /= 0.9
+ return ..()
///////////////////////////////////////////////////////
//////////////////STABILIZED EXTRACTS//////////////////
@@ -513,6 +530,7 @@ datum/status_effect/rebreathing/tick()
datum/status_effect/stabilized/blue/on_remove()
REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus")
+ return ..()
/datum/status_effect/stabilized/metal
id = "stabilizedmetal"
@@ -536,7 +554,6 @@ datum/status_effect/stabilized/blue/on_remove()
to_chat(owner, "[linked_extract] adds a layer of slime to [S], which metamorphosizes into another sheet of material!")
return ..()
-
/datum/status_effect/stabilized/yellow
id = "stabilizedyellow"
colour = "yellow"
@@ -591,6 +608,7 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/darkpurple/on_remove()
REMOVE_TRAIT(owner, TRAIT_RESISTHEATHANDS, "slimestatus")
qdel(fire)
+ return ..()
/datum/status_effect/stabilized/darkblue
id = "stabilizeddarkblue"
@@ -638,6 +656,7 @@ datum/status_effect/stabilized/blue/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.hunger_mod /= 0.8
+ return ..()
//Bluespace has an icon because it's kinda active.
/obj/screen/alert/status_effect/bluespaceslime
@@ -697,6 +716,7 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/sepia/on_remove()
owner.remove_movespeed_modifier(MOVESPEED_ID_SEPIA)
+ return ..()
/datum/status_effect/stabilized/cerulean
id = "stabilizedcerulean"
@@ -733,6 +753,7 @@ datum/status_effect/stabilized/blue/on_remove()
clone.visible_message("[clone] dissolves into a puddle of goo!")
clone.unequip_everything()
qdel(clone)
+ return ..()
/datum/status_effect/stabilized/pyrite
id = "stabilizedpyrite"
@@ -749,6 +770,7 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/pyrite/on_remove()
owner.color = originalcolor
+ return ..()
/datum/status_effect/stabilized/red
id = "stabilizedred"
@@ -760,6 +782,7 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/red/on_remove()
owner.unignore_slowdown("slimestatus")
+ return ..()
/datum/status_effect/stabilized/green
id = "stabilizedgreen"
@@ -791,6 +814,7 @@ datum/status_effect/stabilized/blue/on_remove()
originalDNA.transfer_identity(H)
H.real_name = originalname
H.updateappearance(mutcolor_update=1)
+ return ..()
/datum/status_effect/brokenpeace
id = "brokenpeace"
@@ -854,6 +878,7 @@ datum/status_effect/stabilized/blue/on_remove()
for(var/i in owner.faction)
if(i == faction_name)
owner.faction -= faction_name
+ return ..()
/datum/status_effect/stabilized/oil
id = "stabilizedoil"
@@ -947,6 +972,7 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/gold/on_remove()
if(familiar)
qdel(familiar)
+ return ..()
/datum/status_effect/stabilized/adamantine/on_apply()
if(ishuman(owner))
@@ -958,6 +984,7 @@ datum/status_effect/stabilized/blue/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.damage_resistance -= 5
+ return ..()
/datum/status_effect/stabilized/rainbow
id = "stabilizedrainbow"
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index af825eb5ee..967f874a02 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -705,8 +705,9 @@
desc = "A miraculous chemical mix that grants human like intelligence to living beings. It has been modified with Syndicate technology to also grant an internal radio implant to the target and authenticate with identification systems."
/obj/item/slimepotion/slime/sentience/nuclear/after_success(mob/living/user, mob/living/simple_animal/SM)
- var/obj/item/implant/radio/syndicate/imp = new
- imp.implant(SM, user)
+ if(SM.can_be_implanted())
+ var/obj/item/implant/radio/syndicate/imp = new
+ imp.implant(SM, user)
SM.access_card = new /obj/item/card/id/syndicate(SM)
ADD_TRAIT(SM.access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
@@ -961,11 +962,12 @@
icon_state = "potgrey"
/obj/item/slimepotion/slime/slimeradio/attack(mob/living/M, mob/user)
- if(!ismob(M))
- return
if(!isanimal(M))
to_chat(user, "[M] is too complex for the potion!")
return
+ if(!M.can_be_implanted())
+ to_chat(user, "[M] is incompatible with the potion!")
+ return
if(M.stat)
to_chat(user, "[M] is dead!")
return
diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm
index ea131fb996..2beaa97b3d 100644
--- a/code/modules/spells/spell_types/rightandwrong.dm
+++ b/code/modules/spells/spell_types/rightandwrong.dm
@@ -163,7 +163,7 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE)
for(var/mob/living/carbon/human/H in GLOB.player_list)
var/turf/T = get_turf(H)
- if(T && is_away_level(T.z))
+ if((T && is_away_level(T.z)) || HAS_TRAIT(H, TRAIT_NO_MIDROUND_ANTAG))
continue
if(summon_type == SUMMON_MAGIC)
give_magic(H)
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index 8dae96eaf9..287d9492fb 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -289,7 +289,7 @@
/obj/item/surgical_drapes/advanced
name = "smart surgical drapes"
- desc = "A quite quirky set of drapes with wireless synchronization to the station's research networks, with an integrated display allowing users to execute advanced surgeries without the aid of an operating computer."
+ desc = "A smart set of drapes with wireless synchronization to the station's research networks, with an integrated display allowing users to execute advanced surgeries without the aid of an operating computer."
var/datum/techweb/linked_techweb
/obj/item/surgical_drapes/advanced/Initialize(mapload)
diff --git a/code/modules/uplink/uplink_items/uplink_badass.dm b/code/modules/uplink/uplink_items/uplink_badass.dm
index 8dc5afbadd..681efea5b3 100644
--- a/code/modules/uplink/uplink_items/uplink_badass.dm
+++ b/code/modules/uplink/uplink_items/uplink_badass.dm
@@ -75,3 +75,20 @@
item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate
cost = 2
illegal_tech = FALSE
+
+/datum/uplink_item/badass/tactical_naptime
+ name = "Sleepy Time Pajama Bundle"
+ desc = "Even soldiers need to get a good nights rest. Comes with some cozy as heck sleeping wear, a blankie to keep yourself warm in deep space, a hot mug of cocoa for you and your fuzzy friend."
+ item = /obj/item/storage/box/syndie_kit/sleepytime
+ cost = 4
+ limited_stock = 1
+ cant_discount = TRUE
+ include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+
+/datum/uplink_item/badass/shades
+ name = "Big Sunglasses"
+ desc = "Prevents flashes and looks badbass with some Smokes."
+ item = /obj/item/clothing/glasses/sunglasses/big
+ cost = 1
+ surplus = 5
+ illegal_tech = FALSE
diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm
index fcbe0fb9a6..2a3fd9b8bd 100644
--- a/code/modules/uplink/uplink_items/uplink_clothing.dm
+++ b/code/modules/uplink/uplink_items/uplink_clothing.dm
@@ -9,18 +9,28 @@
/datum/uplink_item/suits/turtlenck
name = "Tactical Turtleneck"
- desc = "A slightly armored suit that has no sensor on them, if someone sees you in this hope they think its a fake."
+ desc = "A slightly armored conspicious jumpsuit that has no suit sensors attached to them, if someone sees you in this hope they think its a fake."
item = /obj/item/clothing/under/syndicate
cost = 1
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) //They already get these
/datum/uplink_item/suits/turtlenck_skirt
name = "Tactical Skirtleneck"
- desc = "A slightly armored suit that has no sensor on them, if someone sees you in this hope they think its a fake."
+ desc = "A slightly armored conspicious jumpsuit that has no suit sensors attached to them, if someone sees you in this hope they think its a fake."
item = /obj/item/clothing/under/syndicate/skirt
cost = 1
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) //They already get these
+/datum/uplink_item/suits/infiltrator_bundle
+ name = "Insidious Infiltration Gear Case"
+ desc = "Developed by Roseus Galactic in conjunction with the Gorlex Marauders to produce a functional suit for urban operations, \
+ this suit proves to be cheaper than your standard issue hardsuit, with none of the movement restrictions (or the space proofing) of the outdated spacesuits employed by the company. \
+ Comes with an armored vest, helmet, blood-red sneaksuit, sneakboots, specialized combat gloves and a high-tech balaclava which obfuscates both your voice and your face. The case is also rather useful as a storage container and bludgeoning implement."
+ item = /obj/item/storage/toolbox/infiltrator
+ cost = 3
+ limited_stock = 1 //you only get one so you don't end up with too many gun cases
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+
/datum/uplink_item/suits/padding
name = "Soft Padding"
desc = "An inconspicious soft padding meant to be worn underneath jumpsuits, will cushion the user from melee harm."
diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm
index 56ebda1af7..819ba51623 100644
--- a/code/modules/uplink/uplink_items/uplink_dangerous.dm
+++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm
@@ -147,9 +147,9 @@
/datum/uplink_item/dangerous/rapier
name = "Rapier"
- desc = "A fancy rapier with a diamond tip piercing anything that it comes into contack with. \
- The rapier comes with its own sheath, this is rather noticeable as only the captain is known to carry a sheath. \
- The sheath itself can be used to block melee attacks only. Its also jet black colours."
+ desc = "An elegant plastitanium rapier with a diamond tip and coated in a specialized knockout poison. \
+ The rapier comes with its own sheath, and is capable of puncturing through almost any defense. \
+ However, due to the size of the blade and obvious nature of the sheath, the weapon stands out as being obviously nefarious."
item = /obj/item/storage/belt/sabre/rapier
cost = 8
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm
index 05731722f7..06fd9aab43 100644
--- a/code/modules/uplink/uplink_items/uplink_devices.dm
+++ b/code/modules/uplink/uplink_items/uplink_devices.dm
@@ -139,7 +139,7 @@
name = "Headset Upgrader"
desc = "A device that can be used to make one headset immune to flashbangs."
item = /obj/item/headsetupgrader
- cost = 3
+ cost = 1
/datum/uplink_item/device_tools/medgun
name = "Medbeam Gun"
diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm
index 114a6373f4..868610a149 100644
--- a/code/modules/vehicles/secway.dm
+++ b/code/modules/vehicles/secway.dm
@@ -27,9 +27,9 @@
/obj/vehicle/ridden/secway/relaymove(mob/user, direction)
var/new_speed = normalspeed
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.sprinting && charge)
+ if(isliving(user))
+ var/mob/living/L = user
+ if((L.combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) && charge)
charge--
new_speed = chargespeed
var/datum/component/riding/D = GetComponent(/datum/component/riding)
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index 2ab6a59c0a..c59662d5b6 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -41,7 +41,7 @@
return TRUE
//We'll load our client's organs if we have one
- if(client && client.prefs_vr)
+ if(client?.prefs)
if(!copy_from_prefs_vr())
to_chat(src,"ERROR: You seem to have saved vore prefs, but they couldn't be loaded.")
return FALSE
@@ -262,47 +262,22 @@
else
to_chat(src,"You aren't inside anyone, though, is the thing.")
-//
-// Verb for saving vore preferences to save file
-//
-/mob/living/proc/save_vore_prefs()
- if(!client || !client.prefs_vr)
- return FALSE
- if(!copy_to_prefs_vr())
- return FALSE
- if(!client.prefs_vr.save_vore())
- return FALSE
-
- return TRUE
-
-/mob/living/proc/apply_vore_prefs()
- if(!client || !client.prefs_vr)
- return FALSE
- if(!client.prefs_vr.load_vore())
- return FALSE
- if(!copy_from_prefs_vr())
- return FALSE
-
- return TRUE
-
/mob/living/proc/copy_to_prefs_vr()
- if(!client || !client.prefs_vr)
- to_chat(src,"You attempted to save your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.")
+ if(!client || !client.prefs)
+ to_chat(src,"You attempted to save your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.")
return FALSE
- var/datum/vore_preferences/P = client.prefs_vr
-
- P.digestable = src.digestable
- P.devourable = src.devourable
- P.feeding = src.feeding
- P.vore_taste = src.vore_taste
+ client.prefs.digestable = digestable
+ client.prefs.devourable = devourable
+ client.prefs.feeding = feeding
+ client.prefs.vore_taste = vore_taste
var/list/serialized = list()
- for(var/belly in src.vore_organs)
+ for(var/belly in vore_organs)
var/obj/belly/B = belly
serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks.
- P.belly_prefs = serialized
+ client.prefs.belly_prefs = serialized
return TRUE
@@ -310,21 +285,20 @@
// Proc for applying vore preferences, given bellies
//
/mob/living/proc/copy_from_prefs_vr()
- if(!client || !client.prefs_vr)
- to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.")
+ if(!client || !client.prefs)
+ to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.")
return FALSE
vorepref_init = TRUE
- var/datum/vore_preferences/P = client.prefs_vr
- digestable = P.digestable
- devourable = P.devourable
- feeding = P.feeding
- vore_taste = P.vore_taste
+ digestable = client.prefs.digestable
+ devourable = client.prefs.devourable
+ feeding = client.prefs.feeding
+ vore_taste = client.prefs.vore_taste
release_vore_contents(silent = TRUE)
- vore_organs.Cut()
- for(var/entry in P.belly_prefs)
+ QDEL_LIST(vore_organs)
+ for(var/entry in client.prefs.belly_prefs)
list_to_object(entry,src)
return TRUE
@@ -376,23 +350,31 @@
//
// Clearly super important. Obviously.
//
-/mob/living/proc/lick(var/mob/living/tasted in oview(1))
+/mob/living/proc/lick()
set name = "Lick Someone"
set category = "Vore"
set desc = "Lick someone nearby!"
- if(!istype(tasted))
+ if(incapacitated(ignore_restraints = TRUE))
+ to_chat(src, "You can't do that while incapacitated.")
return
- if(!tasted.client?.prefs_vr.lickable)
+ var/list/choices
+ for(var/mob/living/L in view(1))
+ if(L != src && (!L.ckey || L.client?.prefs.lickable) && Adjacent(L))
+ LAZYADD(choices, L)
+
+ if(!choices)
return
- if(src == stat)
+ var/mob/living/tasted = input(src, "Who would you like to lick? (Excluding yourself and those with the preference disabled)", "Licking") as null|anything in choices
+
+ if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.lickable)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE))
return
- src.setClickCooldown(100)
+ setClickCooldown(100)
- src.visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!")
+ visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!")
/mob/living/proc/get_taste_message(allow_generic = TRUE, datum/species/mrace)
@@ -408,3 +390,11 @@
else
taste_message += "a plain old normal [src]"
return taste_message
+// Check if an object is capable of eating things, based on vore_organs
+//
+/proc/is_vore_predator(var/mob/living/O)
+ if(istype(O))
+ if(O.vore_organs.len > 0)
+ return TRUE
+
+ return FALSE
diff --git a/code/modules/vore/eating/vore.dm b/code/modules/vore/eating/vore.dm
deleted file mode 100644
index abb5bbb988..0000000000
--- a/code/modules/vore/eating/vore.dm
+++ /dev/null
@@ -1,174 +0,0 @@
-
-/*
-VVVVVVVV VVVVVVVV OOOOOOOOO RRRRRRRRRRRRRRRRR EEEEEEEEEEEEEEEEEEEEEE
-V::::::V V::::::V OO:::::::::OO R::::::::::::::::R E::::::::::::::::::::E
-V::::::V V::::::V OO:::::::::::::OO R::::::RRRRRR:::::R E::::::::::::::::::::E
-V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEEE::::E
- V:::::V V:::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE
- V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E:::::E
- V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E::::::EEEEEEEEEE
- V:::::V V:::::V O:::::O O:::::O R:::::::::::::RR E:::::::::::::::E
- V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E:::::::::::::::E
- V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E::::::EEEEEEEEEE
- V:::::V:::::V O:::::O O:::::O R::::R R:::::R E:::::E
- V:::::::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE
- V:::::::V O:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEE:::::E
- V:::::V OO:::::::::::::OO R::::::R R:::::RE::::::::::::::::::::E
- V:::V OO:::::::::OO R::::::R R:::::RE::::::::::::::::::::E
- VVV OOOOOOOOO RRRRRRRR RRRRRRREEEEEEEEEEEEEEEEEEEEEE
-
--Aro <3 */
-
-//
-// Overrides/additions to stock defines go here, as well as hooks. Sort them by
-// the object they are overriding. So all /mob/living together, etc.
-//
-
-//
-// The datum type bolted onto normal preferences datums for storing Vore stuff
-//
-
-#define VORE_VERSION 4
-
-GLOBAL_LIST_EMPTY(vore_preferences_datums)
-
-/client
- var/datum/vore_preferences/prefs_vr
-
-/datum/vore_preferences
- //Actual preferences
- var/digestable = FALSE
- var/devourable = FALSE
- var/feeding = FALSE
- var/lickable = FALSE
-// var/allowmobvore = TRUE
- var/list/belly_prefs = list()
- var/vore_taste = "nothing in particular"
-// var/can_be_drop_prey = FALSE
-// var/can_be_drop_pred = FALSE
-
- //Mechanically required
- var/path
- var/slot
- var/client/client
- var/client_ckey
-
-/datum/vore_preferences/New(client/C)
- if(istype(C))
- client = C
- client_ckey = C.ckey
- load_vore()
-
-//
-// Check if an object is capable of eating things, based on vore_organs
-//
-/proc/is_vore_predator(var/mob/living/O)
- if(istype(O,/mob/living))
- if(O.vore_organs.len > 0)
- return TRUE
-
- return FALSE
-
-//
-// Belly searching for simplifying other procs
-// Mostly redundant now with belly-objects and isbelly(loc)
-//
-/proc/check_belly(atom/movable/A)
- return isbelly(A.loc)
-
-//
-// Save/Load Vore Preferences
-//
-/datum/vore_preferences/proc/load_path(ckey,slot,filename="character",ext="json")
- if(!ckey || !slot) return
- path = "data/player_saves/[ckey[1]]/[ckey]/vore/[filename][slot].[ext]"
-
-/datum/vore_preferences/proc/load_vore()
- if(!client || !client_ckey)
- return FALSE //No client, how can we save?
- if(!client.prefs || !client.prefs.default_slot)
- return FALSE //Need to know what character to load!
-
- slot = client.prefs.default_slot
-
- load_path(client_ckey,slot)
-
- if(!path) return FALSE //Path couldn't be set?
- if(!fexists(path)) //Never saved before
- save_vore() //Make the file first
- return TRUE
-
- var/list/json_from_file = json_decode(file2text(path))
- if(!json_from_file)
- return FALSE //My concern grows
-
- var/version = json_from_file["version"]
- json_from_file = patch_version(json_from_file,version)
-
- digestable = json_from_file["digestable"]
- devourable = json_from_file["devourable"]
- feeding = json_from_file["feeding"]
- lickable = json_from_file["lickable"]
- vore_taste = json_from_file["vore_taste"]
- belly_prefs = json_from_file["belly_prefs"]
-
- //Quick sanitize
- if(isnull(digestable))
- digestable = FALSE
- if(isnull(devourable))
- devourable = FALSE
- if(isnull(feeding))
- feeding = FALSE
- if(isnull(lickable))
- lickable = FALSE
- if(isnull(belly_prefs))
- belly_prefs = list()
-
- return TRUE
-
-/datum/vore_preferences/proc/save_vore()
- if(!path)
- return FALSE
-
- var/version = VORE_VERSION //For "good times" use in the future
- var/list/settings_list = list(
- "version" = version,
- "digestable" = digestable,
- "devourable" = devourable,
- "feeding" = feeding,
- "lickable" = lickable,
- "vore_taste" = vore_taste,
- "belly_prefs" = belly_prefs,
- )
-
- //List to JSON
- var/json_to_file = json_encode(settings_list)
- if(!json_to_file)
- testing("Saving: [path] failed jsonencode")
- return FALSE
-
- //Write it out
-//#ifdef RUST_G
-// call(RUST_G, "file_write")(json_to_file, path)
-//#else
- // Fall back to using old format if we are not using rust-g
- if(fexists(path))
- fdel(path) //Byond only supports APPENDING to files, not replacing.
- text2file(json_to_file, path)
-//#endif
- if(!fexists(path))
- testing("Saving: [path] failed file write")
- return FALSE
-
- return TRUE
-
-/* commented out list things
- "allowmobvore" = allowmobvore,
- "can_be_drop_prey" = can_be_drop_prey,
- "can_be_drop_pred" = can_be_drop_pred, */
-
-//Can do conversions here
-datum/vore_preferences/proc/patch_version(var/list/json_from_file,var/version)
- return json_from_file
-
-#undef VORE_VERSION
diff --git a/code/modules/vore/eating/vorepanel.dm b/code/modules/vore/eating/vorepanel.dm
index f34872bd25..9c1ff4a84e 100644
--- a/code/modules/vore/eating/vorepanel.dm
+++ b/code/modules/vore/eating/vorepanel.dm
@@ -6,7 +6,6 @@
#define BELLIES_NAME_MIN 2
#define BELLIES_NAME_MAX 12
#define BELLIES_DESC_MAX 1024
-#define FLAVOR_MAX 40
/mob/living/proc/insidePanel()
set name = "Vore Panel"
@@ -247,8 +246,8 @@
dat += "
Toggle Digestable (Currently: [user.digestable ? "ON" : "OFF"])"
dat += "
Toggle Devourable (Currently: [user.devourable ? "ON" : "OFF"])"
dat += "
Toggle Feeding (Currently: [user.feeding ? "ON" : "OFF"])"
- if(user.client.prefs_vr)
- dat += "
Toggle Licking (Currently: [user.client.prefs_vr.lickable ? "ON" : "OFF"])"
+ if(user.client.prefs)
+ dat += "
Toggle Licking (Currently: [user.client.prefs.lickable ? "ON" : "OFF"])"
//Returns the dat html to the vore_look
return dat
@@ -659,18 +658,19 @@
user.vore_selected = user.vore_organs[1]
if(href_list["saveprefs"])
- if(!user.save_vore_prefs())
+ if(!(user.client?.prefs))
+ return FALSE
+ if(!user.client.prefs.save_character())
to_chat(user, "Belly Preferences not saved!")
-
+ log_admin("Could not save vore prefs on USER: [user].")
else
to_chat(user, "Belly Preferences were saved!")
- log_admin("Could not save vore prefs on USER: [user].")
if(href_list["applyprefs"])
- var/alert = alert("Are you sure you want to reload character slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel")
+ var/alert = alert("Are you sure you want to reload the current slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel")
if(!alert == "Reload")
return FALSE
- if(!user.apply_vore_prefs())
+ if(!user.copy_from_prefs_vr())
alert("ERROR: Vore preferences failed to apply!","Error")
else
to_chat(user,"Vore preferences applied from active slot!")
@@ -681,13 +681,15 @@
return FALSE
new_flavor = readd_quotes(new_flavor)
- if(length(new_flavor) > FLAVOR_MAX)
- alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!")
+ if(length(new_flavor) > MAX_TASTE_LEN)
+ alert("Entered flavor/taste text too long. [MAX_TASTE_LEN] character limit.","Error!")
return FALSE
user.vore_taste = new_flavor
if(href_list["toggledg"])
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
+ if(!user || !user.client)
+ return
switch(choice)
if("Cancel")
return FALSE
@@ -696,11 +698,12 @@
if("Prevent Digestion")
user.digestable = FALSE
- if(user.client.prefs_vr)
- user.client.prefs_vr.digestable = user.digestable
+ user.client.prefs.digestable = user.digestable
if(href_list["toggledvor"])
var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment")
+ if(!user || !user.client)
+ return
switch(choice)
if("Cancel")
return FALSE
@@ -709,11 +712,12 @@
if("Prevent Devourment")
user.devourable = FALSE
- if(user.client.prefs_vr)
- user.client.prefs_vr.devourable = user.devourable
+ user.client.prefs.devourable = user.devourable
if(href_list["toggledfeed"])
var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [user.feeding ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding")
+ if(!user || !user.client)
+ return
switch(choice)
if("Cancel")
return FALSE
@@ -722,19 +726,19 @@
if("Prevent Feeding")
user.feeding = FALSE
- if(user.client.prefs_vr)
- user.client.prefs_vr.feeding = user.feeding
+ user.client.prefs.feeding = user.feeding
if(href_list["toggledlickable"])
- if(user.client.prefs_vr)
- var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [user.client.prefs_vr.lickable ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking")
- switch(choice)
- if("Cancel")
- return FALSE
- if("Allow Licking")
- user.client.prefs_vr.lickable = TRUE
- if("Prevent Licking")
- user.client.prefs_vr.lickable = FALSE
+ var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [user.client.prefs.lickable ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking")
+ if(!user || !user.client)
+ return
+ switch(choice)
+ if("Cancel")
+ return FALSE
+ if("Allow Licking")
+ user.client.prefs.lickable = TRUE
+ if("Prevent Licking")
+ user.client.prefs.lickable = FALSE
//Refresh when interacted with, returning 1 makes vore_look.Topic update
return TRUE
diff --git a/html/changelogs/AutoChangeLog-pr-11351.yml b/html/changelogs/AutoChangeLog-pr-11351.yml
new file mode 100644
index 0000000000..f4c3218a83
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11351.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "disabler taser alt fire shots are faster and have a 14 tile range now"
diff --git a/html/changelogs/AutoChangeLog-pr-11352.yml b/html/changelogs/AutoChangeLog-pr-11352.yml
new file mode 100644
index 0000000000..b7745a26e5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11352.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "HoS taser now only applies tased effect for 1 second and warden's pump action stun blaster no longer applies it at all."
diff --git a/html/changelogs/AutoChangeLog-pr-11375.yml b/html/changelogs/AutoChangeLog-pr-11375.yml
new file mode 100644
index 0000000000..3e1fd45ac7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11375.yml
@@ -0,0 +1,4 @@
+author: "Auris456852"
+delete-after: True
+changes:
+ - balance: "Made EMP reaction growth logarithmic."
diff --git a/html/changelogs/AutoChangeLog-pr-11376.yml b/html/changelogs/AutoChangeLog-pr-11376.yml
new file mode 100644
index 0000000000..fbb37ff40e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11376.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - refactor: "combat mode/sprint/resisting lying down/attempting to crawl under all refactored, added combat/sprint mode lockouts, being locked out of combat mode no longer disables it and allows right click interactions etc etc"
diff --git a/html/changelogs/AutoChangeLog-pr-11491.yml b/html/changelogs/AutoChangeLog-pr-11491.yml
new file mode 100644
index 0000000000..dedbe68dfd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11491.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - rscadd: "Mass hallucination can better be admemed"
diff --git a/html/changelogs/AutoChangeLog-pr-11507.yml b/html/changelogs/AutoChangeLog-pr-11507.yml
new file mode 100644
index 0000000000..b5b75bcd96
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11507.yml
@@ -0,0 +1,5 @@
+author: "necromanceranne"
+delete-after: True
+changes:
+ - balance: "Altered the plastitanium rapier from a perfect AP but weaker esword equivalent to a more unique sleep inducing melee weapon."
+ - rscadd: "Touched up all the relevant sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-11511.yml b/html/changelogs/AutoChangeLog-pr-11511.yml
new file mode 100644
index 0000000000..db03ee30be
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11511.yml
@@ -0,0 +1,6 @@
+author: "EmeraldSundisk"
+delete-after: True
+changes:
+ - rscadd: "Adds CogStation's shuttles to-be."
+ - rscadd: "Adds the \"NES Classic\" escape shuttle."
+ - refactor: "Accounts for the new shuttles."
diff --git a/html/changelogs/AutoChangeLog-pr-11512.yml b/html/changelogs/AutoChangeLog-pr-11512.yml
new file mode 100644
index 0000000000..3652bca20e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11512.yml
@@ -0,0 +1,4 @@
+author: "dapnee"
+delete-after: True
+changes:
+ - rscadd: "Lambdastation and it's accompanying files"
diff --git a/html/changelogs/AutoChangeLog-pr-11516.yml b/html/changelogs/AutoChangeLog-pr-11516.yml
new file mode 100644
index 0000000000..e4721b6d42
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11516.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - tweak: "Arrow crafting has been finagled with, preventing fire-hardened arrows from being fire-hardened repeatedly. Or something."
diff --git a/html/changelogs/AutoChangeLog-pr-11517.yml b/html/changelogs/AutoChangeLog-pr-11517.yml
new file mode 100644
index 0000000000..142759e66c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11517.yml
@@ -0,0 +1,5 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - bugfix: "Space hermits (those quirky fellas stuck in a rock with carp surrounding them) now have gravity! But they lost their perpetual generators."
+ - balance: "Space hermits now have to mine for their research tech (golem vendor board, ORM board). They have slightly less bad parts, though. And better(?) rocks."
diff --git a/html/changelogs/AutoChangeLog-pr-11518.yml b/html/changelogs/AutoChangeLog-pr-11518.yml
new file mode 100644
index 0000000000..b4ff6b0800
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11518.yml
@@ -0,0 +1,4 @@
+author: "NecromancerAnne and goldnharl"
+delete-after: True
+changes:
+ - imageadd: "Sprite cleanups and animations for energy guns."
diff --git a/html/changelogs/AutoChangeLog-pr-11519.yml b/html/changelogs/AutoChangeLog-pr-11519.yml
new file mode 100644
index 0000000000..f932aced0a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11519.yml
@@ -0,0 +1,5 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - rscadd: "mentor de/rementor button"
+ - bugfix: "mentor !msg"
diff --git a/html/changelogs/AutoChangeLog-pr-11520.yml b/html/changelogs/AutoChangeLog-pr-11520.yml
new file mode 100644
index 0000000000..663e7d7e43
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11520.yml
@@ -0,0 +1,4 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - balance: "bloodsuckers being unable to accept genes"
diff --git a/html/changelogs/AutoChangeLog-pr-11527.yml b/html/changelogs/AutoChangeLog-pr-11527.yml
new file mode 100644
index 0000000000..72acad545e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11527.yml
@@ -0,0 +1,6 @@
+author: "Ghommie (plus a fix originally done by Skogol)"
+delete-after: True
+changes:
+ - bugfix: "Drinks dispensers now only show the container they are holding."
+ - bugfix: "Ghost cafe patrons are warded against a few more events now."
+ - bugfix: "Fixed RnD machineries UI displaying designs' required reagents' typepaths instead of names."
diff --git a/html/changelogs/AutoChangeLog-pr-11528.yml b/html/changelogs/AutoChangeLog-pr-11528.yml
new file mode 100644
index 0000000000..795af7d387
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11528.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - bugfix: "beam rifles are less terrible code"
diff --git a/html/changelogs/AutoChangeLog-pr-11529.yml b/html/changelogs/AutoChangeLog-pr-11529.yml
new file mode 100644
index 0000000000..3000213bf3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11529.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - balance: "Pipes are small now"
diff --git a/html/changelogs/AutoChangeLog-pr-11532.yml b/html/changelogs/AutoChangeLog-pr-11532.yml
new file mode 100644
index 0000000000..b3bd048fac
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11532.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - bugfix: "box station hos office"
diff --git a/html/changelogs/AutoChangeLog-pr-11533.yml b/html/changelogs/AutoChangeLog-pr-11533.yml
new file mode 100644
index 0000000000..3e293bdf87
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11533.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "Edaggers now enbed as intended"
diff --git a/html/changelogs/AutoChangeLog-pr-11534.yml b/html/changelogs/AutoChangeLog-pr-11534.yml
new file mode 100644
index 0000000000..5490304287
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11534.yml
@@ -0,0 +1,4 @@
+author: "wesoda25"
+delete-after: True
+changes:
+ - code_imp: "You no longer hit fermenting barrels when taking reagents from them"
diff --git a/html/changelogs/AutoChangeLog-pr-11537.yml b/html/changelogs/AutoChangeLog-pr-11537.yml
new file mode 100644
index 0000000000..bcd3a9f2ac
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11537.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "The sleeper agents can be outfitted with some larger then normal sunglasses for 1TC in Badass category"
diff --git a/html/changelogs/AutoChangeLog-pr-11538.yml b/html/changelogs/AutoChangeLog-pr-11538.yml
new file mode 100644
index 0000000000..2cb5aa37e8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11538.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - imageadd: "Resprited some sprite_accessory icon states."
diff --git a/html/changelogs/AutoChangeLog-pr-11539.yml b/html/changelogs/AutoChangeLog-pr-11539.yml
new file mode 100644
index 0000000000..ffc727811a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11539.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - tweak: "Waffle co objective rewritten to make more clear it's not a murderbone objective"
diff --git a/html/changelogs/AutoChangeLog-pr-11540.yml b/html/changelogs/AutoChangeLog-pr-11540.yml
new file mode 100644
index 0000000000..12aa207a93
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11540.yml
@@ -0,0 +1,7 @@
+author: "NecromancerAnne and zawo and zeroisthebiggay and carlarctg"
+delete-after: True
+changes:
+ - rscadd: "The Infiltrator Bundle, an armor kit for 3TC. Murder people in style!"
+ - rscadd: "Some pajamas for nukies to get plenty of bed rest."
+ - rscadd: "halved firefight carry delay with latex or nitrile gloves"
+ - tweak: "headset upgrade is cheaper"
diff --git a/html/changelogs/AutoChangeLog-pr-11541.yml b/html/changelogs/AutoChangeLog-pr-11541.yml
new file mode 100644
index 0000000000..74ecaf278c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11541.yml
@@ -0,0 +1,4 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - balance: "removes xray from the gene pool"
diff --git a/html/changelogs/AutoChangeLog-pr-11542.yml b/html/changelogs/AutoChangeLog-pr-11542.yml
new file mode 100644
index 0000000000..d0d4ba42a0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11542.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "The Syndi Medical borg has been outfitted with the newest and latest ~~Stolen~~ MediCo Gear on the market"
diff --git a/html/changelogs/AutoChangeLog-pr-11544.yml b/html/changelogs/AutoChangeLog-pr-11544.yml
new file mode 100644
index 0000000000..51a72f3e03
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11544.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Ninjas may be asked to steal the CMO's smart drapes"
+ - tweak: "Hyper Cell steal goal is upgraded to a bluespace cell, as well as the BoH goal now wants a type of BoH rather then the normal default one."
diff --git a/html/changelogs/AutoChangeLog-pr-11545.yml b/html/changelogs/AutoChangeLog-pr-11545.yml
new file mode 100644
index 0000000000..7a08ec08bb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11545.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Gutlunches have gotten teeth now and will eat legs, arms, and organs! - Tho are picky and will not eat the brain just laying about!"
diff --git a/html/changelogs/AutoChangeLog-pr-11547.yml b/html/changelogs/AutoChangeLog-pr-11547.yml
new file mode 100644
index 0000000000..8fd683e8c7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11547.yml
@@ -0,0 +1,4 @@
+author: "YakumoChen"
+delete-after: True
+changes:
+ - server: "Templates Headers will now correctly use the Citadel Official Wiki Link"
diff --git a/html/changelogs/AutoChangeLog-pr-11548.yml b/html/changelogs/AutoChangeLog-pr-11548.yml
new file mode 100644
index 0000000000..542da5792c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11548.yml
@@ -0,0 +1,5 @@
+author: "necromanceranne"
+delete-after: True
+changes:
+ - balance: "Nightvision goggles are nerfed all-round. Flashes have actual use against people using nightvision, as do flashbangs."
+ - balance: "Syndicate nuclear agents get to live peacefully knowing their eyes are well protected by their special night vision goggles. Spider clan also get these goggles."
diff --git a/html/changelogs/AutoChangeLog-pr-11553.yml b/html/changelogs/AutoChangeLog-pr-11553.yml
new file mode 100644
index 0000000000..e7c8f67227
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11553.yml
@@ -0,0 +1,5 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - code_imp: "slowdown on items should now be set by set_slowdown()."
+ - bugfix: "hypereutactic blades properly slow down their wielders when being used and vv-editing an item's slowdown will once again properly update someone's slowdown to take the new value into account."
diff --git a/html/changelogs/AutoChangeLog-pr-11565.yml b/html/changelogs/AutoChangeLog-pr-11565.yml
new file mode 100644
index 0000000000..ce1f59aa61
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11565.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed permanent slapstick comedy pie'd overlay for snouted humanoids."
diff --git a/html/templates/header.html b/html/templates/header.html
index 0792e0f025..29759234e2 100644
--- a/html/templates/header.html
+++ b/html/templates/header.html
@@ -25,7 +25,7 @@