diff --git a/Dockerfile b/Dockerfile
index 7cc479b926..a28b231eab 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM tgstation/byond:512.1463 as base
+FROM tgstation/byond:512.1467 as base
FROM base as build_base
diff --git a/_maps/map_files/generic/City_of_Cogs.dmm b/_maps/map_files/generic/City_of_Cogs.dmm
index e67a829221..889abe66c3 100644
--- a/_maps/map_files/generic/City_of_Cogs.dmm
+++ b/_maps/map_files/generic/City_of_Cogs.dmm
@@ -212,11 +212,8 @@
/turf/open/indestructible/reebe_void,
/area/reebe)
"aR" = (
-/obj/effect/clockwork/servant_blocker{
- dir = 1
- },
-/obj/structure/lattice/clockwork,
-/turf/open/indestructible/reebe_void,
+/obj/effect/landmark/city_of_cogs,
+/turf/open/indestructible/clock_spawn_room,
/area/reebe/city_of_cogs)
"aS" = (
/obj/effect/clockwork/servant_blocker{
@@ -242,17 +239,20 @@
/turf/open/indestructible/reebe_void/spawning/lattices,
/area/reebe)
"aX" = (
-/obj/effect/landmark/city_of_cogs,
+/obj/structure/table/reinforced/brass,
+/obj/item/clockwork/component/belligerent_eye,
/turf/open/indestructible/clock_spawn_room,
/area/reebe/city_of_cogs)
"aY" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/belligerent_eye/blind_eye,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
+/obj/effect/clockwork/servant_blocker{
+ dir = 1
+ },
+/obj/structure/lattice/clockwork,
+/turf/open/indestructible/reebe_void,
+/area/reebe)
"aZ" = (
/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/belligerent_eye,
+/obj/item/clockwork/component/belligerent_eye/blind_eye,
/turf/open/indestructible/clock_spawn_room,
/area/reebe/city_of_cogs)
"ba" = (
@@ -262,32 +262,32 @@
/area/reebe/city_of_cogs)
"bb" = (
/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/replicant_alloy,
+/obj/item/clockwork/component/geis_capacitor,
/turf/open/indestructible/clock_spawn_room,
/area/reebe/city_of_cogs)
"bc" = (
/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment,
+/obj/item/clockwork/component/geis_capacitor/antennae,
/turf/open/indestructible/clock_spawn_room,
/area/reebe/city_of_cogs)
"bd" = (
/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/replicant_alloy/replication_plate,
+/obj/item/clockwork/component/geis_capacitor/fallen_armor,
/turf/open/indestructible/clock_spawn_room,
/area/reebe/city_of_cogs)
"be" = (
/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/geis_capacitor/antennae,
+/obj/item/clockwork/component/hierophant_ansible,
/turf/open/indestructible/clock_spawn_room,
/area/reebe/city_of_cogs)
"bf" = (
/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/geis_capacitor/fallen_armor,
+/obj/item/clockwork/component/hierophant_ansible/obelisk,
/turf/open/indestructible/clock_spawn_room,
/area/reebe/city_of_cogs)
"bg" = (
/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/geis_capacitor,
+/obj/item/clockwork/component/replicant_alloy,
/turf/open/indestructible/clock_spawn_room,
/area/reebe/city_of_cogs)
"bh" = (
@@ -304,6 +304,51 @@
/obj/structure/destructible/clockwork/eminence_spire,
/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
+"bk" = (
+/obj/structure/table/reinforced/brass,
+/obj/item/clockwork/component/replicant_alloy/replication_plate,
+/turf/open/indestructible/clock_spawn_room,
+/area/reebe/city_of_cogs)
+"bl" = (
+/obj/structure/table/reinforced/brass,
+/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment,
+/turf/open/indestructible/clock_spawn_room,
+/area/reebe/city_of_cogs)
+"bm" = (
+/obj/structure/table/reinforced/brass,
+/obj/item/clockwork/component/vanguard_cogwheel,
+/turf/open/indestructible/clock_spawn_room,
+/area/reebe/city_of_cogs)
+"bn" = (
+/obj/structure/table/reinforced/brass,
+/obj/item/clockwork/component/vanguard_cogwheel/onyx_prism,
+/turf/open/indestructible/clock_spawn_room,
+/area/reebe/city_of_cogs)
+"bo" = (
+/obj/structure/window/reinforced/clockwork/fulltile,
+/obj/structure/grille/ratvar,
+/turf/open/indestructible/clock_spawn_room,
+/area/reebe/city_of_cogs)
+"bp" = (
+/obj/structure/window/reinforced/clockwork/fulltile,
+/turf/open/indestructible/clock_spawn_room,
+/area/reebe/city_of_cogs)
+"bu" = (
+/obj/structure/table/reinforced/brass,
+/turf/open/indestructible/clock_spawn_room,
+/area/reebe/city_of_cogs)
+"bw" = (
+/obj/structure/chair/brass{
+ dir = 8
+ },
+/turf/open/indestructible/clock_spawn_room,
+/area/reebe/city_of_cogs)
+"bx" = (
+/obj/structure/chair/brass{
+ dir = 4
+ },
+/turf/open/indestructible/clock_spawn_room,
+/area/reebe/city_of_cogs)
(1,1,1) = {"
aa
@@ -26909,7 +26954,7 @@ ab
ab
ab
ab
-aa
+ab
aa
aa
aa
@@ -27166,8 +27211,8 @@ ab
ab
ab
ab
-aa
-aa
+ab
+ab
aa
aa
aa
@@ -27423,9 +27468,9 @@ ab
ab
ab
ab
-aa
-aa
-aa
+ab
+ab
+ab
aa
aa
aa
@@ -27680,10 +27725,10 @@ ab
ab
ab
ab
-aa
-aa
-aa
-aa
+ab
+ab
+ab
+ab
aa
aa
aa
@@ -27923,25 +27968,25 @@ ab
ab
ab
ab
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
ab
ab
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -28166,40 +28211,40 @@ ab
ab
ab
ab
-ab
-ab
aF
+aF
+aY
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ah
+ah
+bo
+bo
+bo
+bo
+bo
+bo
+bo
+ah
+ah
+ae
+ae
+ae
ab
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -28424,39 +28469,39 @@ aF
aF
aF
aF
-aF
-aF
-ae
-ae
-ae
+aG
+aS
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+ah
+ah
+ah
ae
ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -28682,38 +28727,38 @@ aG
aG
aG
aG
-aR
-ah
-ah
-ah
-ah
-ah
-ae
-ae
-ae
-ae
-ae
-ae
-ae
+aS
+bu
+bu
+bu
+bu
+bu
+bu
+bu
+bu
+bu
+bu
+bu
+bu
+aU
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+bo
+aX
+bo
+ag
ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -28940,37 +28985,37 @@ aj
aj
aj
aS
+bw
+bw
+bw
+bw
+bw
+bw
+bw
+bw
+bw
+bw
+bw
+bw
+aU
aT
aT
+aR
+aT
+aR
+aT
+aR
aT
aT
-ah
-ah
-ai
-ai
-ai
-ai
-ai
-ah
-ah
+bo
+aZ
+bo
+ag
ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -29201,7 +29246,6 @@ aT
aT
aT
aT
-ah
aT
aT
aT
@@ -29209,15 +29253,22 @@ aT
aT
aT
aT
-ah
+aT
+bo
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+bo
+ba
+bo
ag
ae
-ab
-ab
-ab
-ab
-ab
-ae
bi
ab
ab
@@ -29339,12 +29390,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
"}
(114,1,1) = {"
aa
@@ -29458,7 +29503,6 @@ aT
aT
aT
aT
-aU
aT
aT
aT
@@ -29466,15 +29510,22 @@ aT
aT
aT
aT
-ah
-ah
-ah
-ab
-ab
-ab
-ab
-ab
-ab
+aT
+aV
+aT
+aT
+aR
+aT
+aR
+aT
+aR
+aT
+aT
+bo
+bb
+bo
+ag
+ae
ab
ae
ac
@@ -29596,12 +29647,6 @@ aa
aa
aa
aa
-aa
-aa
-aa
-aa
-aa
-aa
"}
(115,1,1) = {"
aa
@@ -29715,33 +29760,33 @@ aT
aT
aT
aT
-aU
aT
aT
-aX
-aX
-aX
aT
aT
-ai
-aY
-ai
+aT
+aT
+aT
+aT
+bo
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+bo
+bc
+bo
+ag
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -29972,33 +30017,33 @@ aT
aT
aT
aT
-aV
aT
aT
-aX
-aX
-aX
aT
aT
-ai
-aZ
-ai
+aT
+aT
+aT
+aT
+aU
+aT
+aT
+aR
+aT
+aR
+aT
+aR
+aT
+aT
+bo
+bd
+bo
+ag
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -30229,33 +30274,33 @@ aT
aT
aT
aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
aU
aT
aT
-aX
-aX
-aX
aT
aT
-ai
-ba
-ai
+aT
+aT
+aT
+aT
+aT
+bo
+be
+bo
+ag
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -30486,7 +30531,17 @@ aT
aT
aT
aT
-aU
+aT
+aT
+aT
+aT
+aT
+aT
+bp
+bp
+ah
+aT
+aT
aT
aT
aT
@@ -30497,22 +30552,12 @@ aT
ah
ah
ah
+ae
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -30743,33 +30788,33 @@ aT
aT
aT
aT
+aT
+aT
+aT
+aT
+aT
+aT
+bp
+bg
ah
-aT
-aT
-aT
-aT
-aT
-aT
-aT
ah
-ag
+bo
+bo
+bo
+bo
+bo
+bo
+bo
+ah
+ah
+ae
+ae
ae
ab
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -31000,33 +31045,33 @@ aT
aT
aT
aT
+aT
+aT
+aT
+aT
+aT
+aT
+bp
+bp
+ah
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
ah
ah
-aU
-aU
-aV
-aU
-aU
ah
-ah
-ag
+ae
ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -31257,7 +31302,6 @@ aT
aT
aT
aT
-ah
aT
aT
aT
@@ -31265,25 +31309,26 @@ aT
aT
aT
aT
-ah
+aT
+aU
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+bo
+bf
+bo
ag
ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -31514,33 +31559,33 @@ aT
aT
aT
aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
aU
aT
aT
+aR
+aT
+aR
+aT
+aR
aT
aT
-aT
-aT
-aT
-ah
-ah
-ah
+bo
+bg
+bo
+ag
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -31771,33 +31816,33 @@ aT
aT
aT
aT
-aU
aT
aT
-aX
-aX
-aX
+aT
+aT
+aT
+aT
aT
aT
ai
-bb
-ai
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+bo
+bk
+bo
+ag
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -32028,33 +32073,33 @@ aT
aT
aT
aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
aV
aT
aT
-aX
-aX
-aX
+aR
+aT
+aR
+aT
+aR
aT
aT
-ai
-bc
-ai
+bo
+bl
+bo
+ag
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -32285,33 +32330,33 @@ aT
aT
aT
aT
-aU
aT
aT
-aX
-aX
-aX
+aT
+aT
+aT
+aT
aT
aT
ai
-bd
-ai
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+bo
+bm
+bo
+ag
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -32542,33 +32587,33 @@ aT
aT
aT
aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
aU
aT
aT
+aR
+aT
+aR
+aT
+aR
aT
aT
-aT
-aT
-aT
-ah
-ah
-ah
+bo
+bn
+bo
+ag
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -32799,7 +32844,6 @@ aT
aT
aT
aT
-ah
aT
aT
aT
@@ -32807,25 +32851,26 @@ aT
aT
aT
aT
-ah
+aT
+aU
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+bo
+aX
+bo
ag
ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -33056,33 +33101,33 @@ aT
aT
aT
aT
+aT
+aT
+aT
+aT
+aT
+aT
+bp
+bp
+ah
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
ah
ah
-aU
-aU
-aV
-aU
-aU
ah
-ah
-ag
+ae
ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -33313,16 +33358,25 @@ aT
aT
aT
aT
+aT
+aT
+aT
+aT
+aT
+aT
+bp
+bk
+ah
+ah
+bo
+bo
+bo
+bo
+bo
+bo
+bo
ah
-aT
-aT
-aT
-aT
-aT
-aT
-aT
ah
-ag
ae
ab
ab
@@ -33331,15 +33385,6 @@ ab
ab
ab
ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -33570,7 +33615,17 @@ aT
aT
aT
aT
-aU
+aT
+aT
+aT
+aT
+aT
+aT
+bp
+bp
+ah
+aT
+aT
aT
aT
aT
@@ -33581,22 +33636,12 @@ aT
ah
ah
ah
+ae
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -33827,33 +33872,33 @@ aT
aT
aT
aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
aU
aT
aT
-aX
-aX
-aX
aT
aT
-ai
-be
-ai
+aT
+aT
+aT
+aT
+aT
+bo
+aZ
+bo
+ag
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -34084,33 +34129,33 @@ aT
aT
aT
aT
-aV
aT
aT
-aX
-aX
-aX
aT
aT
-ai
-bf
-ai
+aT
+aT
+aT
+aT
+aU
+aT
+aT
+aR
+aT
+aR
+aT
+aR
+aT
+aT
+bo
+ba
+bo
+ag
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -34341,33 +34386,33 @@ aT
aT
aT
aT
-aU
aT
aT
-aX
-aX
-aX
aT
aT
-ai
-bg
-ai
+aT
+aT
+aT
+aT
+bo
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+bo
+bb
+bo
+ag
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -34598,7 +34643,6 @@ aT
aT
aT
aT
-aU
aT
aT
aT
@@ -34606,25 +34650,26 @@ aT
aT
aT
aT
-ah
-ah
-ah
+aT
+aV
+aT
+aT
+aR
+aT
+aR
+aT
+aR
+aT
+aT
+bo
+bc
+bo
+ag
+ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -34855,7 +34900,6 @@ aT
aT
aT
aT
-ah
aT
aT
aT
@@ -34863,25 +34907,26 @@ aT
aT
aT
aT
-ah
+aT
+bo
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+bo
+bd
+bo
ag
ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -35108,37 +35153,37 @@ aj
aj
aj
aS
+bx
+bx
+bx
+bx
+bx
+bx
+bx
+bx
+bx
+bx
+bx
+bx
+aU
aT
aT
+aR
+aT
+aR
+aT
+aR
aT
aT
-ah
-ah
-ai
-ai
-ai
-ai
-ai
-ah
-ah
+bo
+be
+bo
+ag
ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -35364,38 +35409,38 @@ aG
aG
aG
aG
-aR
-ah
-ah
-ah
-ah
-ah
-ae
-ae
-ae
-ae
-ae
-ae
-ae
+aS
+bu
+bu
+bu
+bu
+bu
+bu
+bu
+bu
+bu
+bu
+bu
+bu
+aU
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+bo
+bf
+bo
+ag
ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -35620,39 +35665,39 @@ aF
aF
aF
aF
-aF
-aF
-ae
-ae
-ae
+aG
+aS
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+aT
+ah
+ah
+ah
ae
ae
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -35878,7 +35923,31 @@ ab
ab
ab
ab
-aF
+aY
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ah
+ah
+bo
+bo
+bo
+bo
+bo
+bo
+bo
+ah
+ah
+ae
ab
ab
ab
@@ -35886,30 +35955,6 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -36147,12 +36192,18 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
ae
ab
ab
@@ -36160,12 +36211,6 @@ ab
ab
ab
ab
-ab
-aa
-aa
-aa
-aa
-aa
aa
aa
aa
@@ -36410,18 +36455,18 @@ ab
ab
ab
ab
-ac
-ac
ab
ab
ab
ab
ab
ab
-aa
-aa
-aa
-aa
+ab
+ab
+ab
+ab
+ab
+ab
aa
aa
aa
@@ -36667,17 +36712,17 @@ ab
ab
ab
ab
-ac
-bh
-ae
ab
ab
ab
ab
ab
-aa
-aa
-aa
+ab
+ab
+ab
+ab
+ab
+ab
aa
aa
aa
@@ -36932,8 +36977,8 @@ ab
ab
ab
ab
-aa
-aa
+ab
+ab
aa
aa
aa
@@ -37189,7 +37234,7 @@ ab
ab
ab
ab
-aa
+ab
aa
aa
aa
@@ -37438,9 +37483,9 @@ ab
ab
ab
ab
-ab
-ab
-ab
+ac
+bh
+ae
ab
ab
ab
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index aea7d42be6..4ed099d9e2 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -121,3 +121,4 @@
#define ORGAN_SLOT_BRAIN_ANTIDROP "brain_antidrop"
#define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun"
#define ORGAN_SLOT_TAIL "tail"
+#define ORGAN_SLOT_PENIS "penis"
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index ef14dbcaa3..b150067717 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -95,6 +95,7 @@
#define NOAROUSAL 37 //Stops all arousal effects
#define NOGENITALS 38 //Cannot create, use, or otherwise have genitals
#define MATRIXED 39 //if icon is color matrix'd
+#define SKINTONE 40 //uses skin tones
//Citadel istypes
#define isborer(A) (istype(A, /mob/living/simple_animal/borer))
diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm
index 070b92acc7..47b00e67f7 100644
--- a/code/__DEFINES/clockcult.dm
+++ b/code/__DEFINES/clockcult.dm
@@ -28,9 +28,9 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
#define SCRIPTURE_APPLICATION "Application"
//Various costs related to power.
-#define MAX_CLOCKWORK_POWER 50000 //The max power in W that the cult can stockpile
-#define SCRIPT_UNLOCK_THRESHOLD 25000 //Scripts will unlock if the total power reaches this amount
-#define APPLICATION_UNLOCK_THRESHOLD 40000 //Applications will unlock if the total powre reaches this amount
+#define MAX_CLOCKWORK_POWER 80000 //The max power in W that the cult can stockpile
+#define SCRIPT_UNLOCK_THRESHOLD 35000 //Scripts will unlock if the total power reaches this amount
+#define APPLICATION_UNLOCK_THRESHOLD 50000 //Applications will unlock if the total powre reaches this amount
#define ABSCOND_ABDUCTION_COST 95
diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index 4811d0041f..de9c7af221 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -53,4 +53,5 @@
#define COLOR_ASSEMBLY_GREEN "#44843C"
#define COLOR_ASSEMBLY_LBLUE "#5D99BE"
#define COLOR_ASSEMBLY_BLUE "#38559E"
-#define COLOR_ASSEMBLY_PURPLE "#6F6192"
\ No newline at end of file
+#define COLOR_ASSEMBLY_PURPLE "#6F6192"
+#define COLOR_ASSEMBLY_PINK "#ff4adc"
\ No newline at end of file
diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm
index aab49720f6..9f3d38efa1 100644
--- a/code/__DEFINES/construction.dm
+++ b/code/__DEFINES/construction.dm
@@ -102,6 +102,7 @@
#define CAT_SANDWICH "Sandwiches"
#define CAT_SOUP "Soups"
#define CAT_SPAGHETTI "Spaghettis"
+#define CAT_SUSHI "Fish"
#define RCD_FLOORWALL 1
#define RCD_AIRLOCK 2
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 709a4daeba..be58b64f41 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -474,4 +474,6 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE))
#define CLIENT_FROM_VAR(I) (ismob(I) ? I:client : (istype(I, /client) ? I : (istype(I, /datum/mind) ? I:current?:client : null)))
#define AREASELECT_CORNERA "corner A"
-#define AREASELECT_CORNERB "corner B"
\ No newline at end of file
+#define AREASELECT_CORNERB "corner B"
+
+#define PREF_SAVELOAD_COOLDOWN 5
\ No newline at end of file
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index a5617e6148..99f1813f3c 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -69,6 +69,7 @@
#define TRAIT_TAGGER "tagger"
#define TRAIT_PHOTOGRAPHER "photographer"
#define TRAIT_MUSICIAN "musician"
+#define TRAIT_CROCRIN_IMMUNE "crocin_immune"
// common trait sources
#define TRAIT_GENERIC "generic"
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index 165cea9557..cdd2e99dd8 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -199,6 +199,10 @@
if(length(CONFIG_GET(keyed_list/cross_server)))
send_news_report()
+ //tell the nice people on discord what went on before the salt cannon happens.
+ world.TgsTargetedChatBroadcast("The current round has ended. Please standby for your shift interlude Nanotrasen News Network's report!", FALSE)
+ world.TgsTargetedChatBroadcast(send_news_report(),FALSE)
+
CHECK_TICK
//These need update to actually reflect the real antagonists
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index d0506c7dcb..36049de77b 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -108,5 +108,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/toy/eightball = 1,
/obj/item/reagent_containers/pill/floorpill = 1,
/obj/item/storage/daki = 3, //VERY IMPORTANT CIT CHANGE - adds bodypillows to maint
+ /obj/item/storage/pill_bottle/penis_enlargement = 2,
"" = 3
))
diff --git a/code/controllers/subsystem/processing/circuit.dm b/code/controllers/subsystem/processing/circuit.dm
index 1ae5bad23c..880e7a16a8 100644
--- a/code/controllers/subsystem/processing/circuit.dm
+++ b/code/controllers/subsystem/processing/circuit.dm
@@ -50,17 +50,20 @@ PROCESSING_SUBSYSTEM_DEF(circuit)
/obj/item/electronic_assembly/simple,
/obj/item/electronic_assembly/hook,
/obj/item/electronic_assembly/pda,
+ /obj/item/electronic_assembly/dildo,
/obj/item/electronic_assembly/small/default,
/obj/item/electronic_assembly/small/cylinder,
/obj/item/electronic_assembly/small/scanner,
/obj/item/electronic_assembly/small/hook,
/obj/item/electronic_assembly/small/box,
+ /obj/item/electronic_assembly/small/dildo,
/obj/item/electronic_assembly/medium/default,
/obj/item/electronic_assembly/medium/box,
/obj/item/electronic_assembly/medium/clam,
/obj/item/electronic_assembly/medium/medical,
/obj/item/electronic_assembly/medium/gun,
/obj/item/electronic_assembly/medium/radio,
+ /obj/item/electronic_assembly/medium/dildo,
/obj/item/electronic_assembly/large/default,
/obj/item/electronic_assembly/large/scope,
/obj/item/electronic_assembly/large/terminal,
@@ -89,4 +92,4 @@ PROCESSING_SUBSYSTEM_DEF(circuit)
/obj/item/card/data/full_color,
/obj/item/card/data/disk
)
-
+
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 9a4cad3667..4a3143da79 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -564,6 +564,9 @@ SUBSYSTEM_DEF(ticker)
if(news_message)
send2otherserver(news_source, news_message,"News_Report")
+ return news_message
+ else
+ return "We regret to inform you that shit be whack, yo. None of our reporters have any idea of what may or may not have gone on."
/datum/controller/subsystem/ticker/proc/GetTimeLeft()
if(isnull(SSticker.timeLeft))
diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm
index 3d03c2adbd..e0a23b0209 100644
--- a/code/datums/components/storage/concrete/pockets.dm
+++ b/code/datums/components/storage/concrete/pockets.dm
@@ -19,6 +19,22 @@
max_items = 1
attack_hand_interact = FALSE
+/datum/component/storage/concrete/pockets/small/collar
+ max_items = 1
+
+/datum/component/storage/concrete/pockets/small/collar/Initialize()
+ . = ..()
+ can_hold = typecacheof(list(
+ /obj/item/reagent_containers/food/snacks/cookie,
+ /obj/item/reagent_containers/food/snacks/sugarcookie))
+
+/datum/component/storage/concrete/pockets/small/collar/locked/Initialize()
+ . = ..()
+ can_hold = typecacheof(list(
+ /obj/item/reagent_containers/food/snacks/cookie,
+ /obj/item/reagent_containers/food/snacks/sugarcookie,
+ /obj/item/key/collar))
+
/datum/component/storage/concrete/pockets/tiny
max_items = 1
max_w_class = WEIGHT_CLASS_TINY
diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm
index 03badb2069..a870ecae66 100644
--- a/code/datums/dash_weapon.dm
+++ b/code/datums/dash_weapon.dm
@@ -32,7 +32,7 @@
if(!IsAvailable())
return
var/turf/T = get_turf(target)
- if(target in view(user.client.view, get_turf(user)))
+ if(target in view(user.client.view, user))
var/obj/spot1 = new phaseout(get_turf(user), user.dir)
user.forceMove(T)
playsound(T, dash_sound, 25, 1)
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index b3f3f7efa1..938515625d 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -9,6 +9,7 @@
var/list/features = list("FFF") //first value is mutant color
var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
var/nameless = FALSE
+ var/custom_species //siiiiigh I guess this is important
var/list/mutations = list() //All mutations are from now on here
var/list/temporary_mutations = list() //Timers for temporary mutations
var/list/previous = list() //For temporary name/ui/ue/blood_type modifications
@@ -45,6 +46,7 @@
destination.dna.features = features.Copy()
destination.dna.real_name = real_name
destination.dna.nameless = nameless
+ destination.dna.custom_species = custom_species
destination.dna.temporary_mutations = temporary_mutations.Copy()
if(ishuman(destination))
var/mob/living/carbon/human/H = destination
@@ -62,6 +64,7 @@
new_dna.species = new species.type
new_dna.real_name = real_name
new_dna.nameless = nameless
+ new_dna.custom_species = custom_species
new_dna.mutations = mutations.Copy()
/datum/dna/proc/add_mutation(mutation_name)
@@ -202,7 +205,7 @@
/datum/dna/proc/is_same_as(datum/dna/D)
- if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name && nameless == D.nameless)
+ if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name && nameless == D.nameless && custom_species == D.custom_species)
if(species.type == D.species.type && features == D.features && blood_type == D.blood_type)
return 1
return 0
diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm
index 4fc30de473..f299e9904a 100644
--- a/code/datums/traits/neutral.dm
+++ b/code/datums/traits/neutral.dm
@@ -84,3 +84,12 @@
/datum/quirk/monochromatic/remove()
if(quirk_holder)
quirk_holder.remove_client_colour(/datum/client_colour/monochrome)
+
+/datum/quirk/crocrin_immunity
+ name = "Crocin Immunity"
+ desc = "You're one of the few people in the galaxy who are genetically immune to Crocin and Hexacrocin products and their addictive properties! However, you can still get brain damage from Hexacrocin addiction."
+ mob_trait = TRAIT_CROCRIN_IMMUNE
+ value = 0
+ gain_text = "You feel more prudish."
+ lose_text = "You don't feel as prudish as before."
+ medical_record_text = "Patient exhibits a special gene that makes them immune to Crocin and Hexacrocin."
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 94b6eee8aa..927608d3d5 100755
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -15,7 +15,9 @@
/obj/item/gun/energy,
/obj/item/melee/baton,
/obj/item/ammo_box/magazine/recharge,
- /obj/item/modular_computer))
+ /obj/item/modular_computer,
+ /obj/item/gun/ballistic/automatic/magrifle_e,
+ /obj/item/gun/ballistic/automatic/pistol/mag_e))
/obj/machinery/recharger/RefreshParts()
for(var/obj/item/stock_parts/capacitor/C in component_parts)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 43e8dff2b9..b84db2ca8d 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -63,7 +63,7 @@
storage_type = /obj/item/watertank/atmos
/obj/machinery/suit_storage_unit/mining
- suit_type = /obj/item/clothing/suit/hooded/explorer
+ suit_type = /obj/item/clothing/suit/hooded/explorer/standard
mask_type = /obj/item/clothing/mask/gas/explorer
/obj/machinery/suit_storage_unit/mining/eva
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 4d2e113749..ef3ba969e9 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -80,6 +80,7 @@
desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE"
name = "\improper DEATH-RIPLEY"
icon_state = "deathripley"
+ armor = list("melee" = 40, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
slow_pressure_step_in = 3
opacity=0
lights_power = 7
@@ -194,4 +195,4 @@
cargo -= O
else
if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded.
- to_chat(user, "You fail to push [O] out of [src]!")
\ No newline at end of file
+ to_chat(user, "You fail to push [O] out of [src]!")
diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm
index 16e13a9fe2..56e47ed6f5 100644
--- a/code/game/objects/empulse.dm
+++ b/code/game/objects/empulse.dm
@@ -9,7 +9,7 @@
message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
- if(heavy_range > 1)
+ if(heavy_range >= 1)
new /obj/effect/temp_visual/emp/pulse(epicenter)
if(heavy_range > light_range)
diff --git a/code/game/objects/items/AI_modules.dm b/code/game/objects/items/AI_modules.dm
index d818191055..a8d0bed2aa 100644
--- a/code/game/objects/items/AI_modules.dm
+++ b/code/game/objects/items/AI_modules.dm
@@ -362,7 +362,7 @@ AI MODULES
/obj/item/aiModule/core/full/asimov
name = "'Asimov' Core AI Module"
law_id = "asimov"
- var/subject = "human being"
+ var/subject = "person of an NT approved crew species" //CITADEL CHANGED FROM HUMANS!
/obj/item/aiModule/core/full/asimov/attack_self(var/mob/user as mob)
var/targName = stripped_input(user, "Please enter a new subject that asimov is concerned with.", "Asimov to whom?", subject)
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 9ff717816c..7d3d36c5b2 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -391,7 +391,8 @@ GLOBAL_LIST_EMPTY(PDAs)
//BASIC FUNCTIONS===================================
if("Refresh")//Refresh, goes to the end of the proc.
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if ("Toggle_Font")
//CODE REVISION 2
@@ -406,16 +407,19 @@ GLOBAL_LIST_EMPTY(PDAs)
font_mode = FONT_ORBITRON
if (MODE_VT)
font_mode = FONT_VT
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if ("Change_Color")
var/new_color = input("Please enter a color name or hex value (Default is \'#808000\').",background_color)as color
background_color = new_color
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if ("Toggle_Underline")
underline_flag = !underline_flag
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if("Return")//Return
if(mode<=9)
@@ -424,7 +428,8 @@ GLOBAL_LIST_EMPTY(PDAs)
mode = round(mode/10)
if(mode==4 || mode == 5)//Fix for cartridges. Redirects to hub.
mode = 0
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if ("Authenticate")//Checks for ID
id_check(U)
@@ -434,8 +439,9 @@ GLOBAL_LIST_EMPTY(PDAs)
if(istype(id, /obj/item/card/id/syndicate))
owner = id.registered_name
update_label()
- playsound(src, 'sound/machines/terminal_processing.ogg', 50, 1)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/machines/terminal_success.ogg', 50, 1), 13)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_processing.ogg', 15, 1)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/machines/terminal_success.ogg', 15, 1), 13)
if("Eject")//Ejects the cart, only done from hub.
if (!isnull(cartridge))
@@ -445,56 +451,67 @@ GLOBAL_LIST_EMPTY(PDAs)
cartridge.host_pda = null
cartridge = null
update_icon()
- playsound(src, 'sound/machines/terminal_eject_disc.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_eject_disc.ogg', 50, 1)
//MENU FUNCTIONS===================================
if("0")//Hub
mode = 0
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if("1")//Notes
mode = 1
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if("2")//Messenger
mode = 2
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if("21")//Read messeges
mode = 21
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if("3")//Atmos scan
mode = 3
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if("4")//Redirects to hub
mode = 0
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
//MAIN FUNCTIONS===================================
if("Light")
toggle_light()
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if("Medical Scan")
if(scanmode == PDA_SCANNER_MEDICAL)
scanmode = PDA_SCANNER_NONE
else if((!isnull(cartridge)) && (cartridge.access & CART_MEDICAL))
scanmode = PDA_SCANNER_MEDICAL
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if("Reagent Scan")
if(scanmode == PDA_SCANNER_REAGENT)
scanmode = PDA_SCANNER_NONE
else if((!isnull(cartridge)) && (cartridge.access & CART_REAGENT_SCANNER))
scanmode = PDA_SCANNER_REAGENT
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if("Halogen Counter")
if(scanmode == PDA_SCANNER_HALOGEN)
scanmode = PDA_SCANNER_NONE
else if((!isnull(cartridge)) && (cartridge.access & CART_ENGINE))
scanmode = PDA_SCANNER_HALOGEN
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if("Honk")
if ( !(last_noise && world.time < last_noise + 20) )
@@ -511,7 +528,8 @@ GLOBAL_LIST_EMPTY(PDAs)
scanmode = PDA_SCANNER_NONE
else if((!isnull(cartridge)) && (cartridge.access & CART_ATMOS))
scanmode = PDA_SCANNER_GAS
- playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_select.ogg', 15, 1)
if("Drone Phone")
var/alert_s = input(U,"Alert severity level","Ping Drones",null) as null|anything in list("Low","Medium","High","Critical")
@@ -520,7 +538,8 @@ GLOBAL_LIST_EMPTY(PDAs)
var/msg = "NON-DRONE PING: [U.name]: [alert_s] priority alert in [A.name]!"
_alert_drones(msg, TRUE, U)
to_chat(U, msg)
- playsound(src, 'sound/machines/terminal_success.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_success.ogg', 15, 1)
//NOTEKEEPER FUNCTIONS===================================
@@ -672,7 +691,8 @@ GLOBAL_LIST_EMPTY(PDAs)
if (!signal.data["done"])
to_chat(user, "ERROR: Server isn't responding.")
return
- playsound(src, 'sound/machines/terminal_error.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_error.ogg', 15, 1)
var/target_text = signal.format_target()
// Log it in our logs
@@ -685,7 +705,8 @@ GLOBAL_LIST_EMPTY(PDAs)
// Log in the talk log
user.log_talk(message, LOG_PDA, tag="PDA: [initial(name)] to [target_text]")
to_chat(user, "Message sent to [target_text]: \"[message]\"")
- playsound(src, 'sound/machines/terminal_success.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_success.ogg', 15, 1)
// Reset the photo
picture = null
last_text = world.time
@@ -830,14 +851,16 @@ GLOBAL_LIST_EMPTY(PDAs)
if(!idcard.registered_name)
to_chat(user, "\The [src] rejects the ID!")
return
- playsound(src, 'sound/machines/terminal_error.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_error.ogg', 15, 1)
if(!owner)
owner = idcard.registered_name
ownjob = idcard.assignment
update_label()
to_chat(user, "Card scanned.")
- playsound(src, 'sound/machines/terminal_success.ogg', 50, 1)
+ if (!silent)
+ playsound(src, 'sound/machines/terminal_success.ogg', 15, 1)
else
//Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand.
if(((src in user.contents) || (isturf(loc) && in_range(src, user))) && (C in user.contents))
@@ -1053,3 +1076,4 @@ GLOBAL_LIST_EMPTY(PDAs)
#undef PDA_SCANNER_HALOGEN
#undef PDA_SCANNER_GAS
#undef PDA_SPAM_DELAY
+
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 5a68a8423a..79b04c771b 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -98,10 +98,12 @@ SLIME SCANNER
if ((user.has_trait(TRAIT_CLUMSY) || user.has_trait(TRAIT_DUMB)) && prob(50))
to_chat(user, "You stupidly try to analyze the floor's vitals!")
user.visible_message("[user] has analyzed the floor's vitals!")
- to_chat(user, "Analyzing results for The floor:\n\tOverall status: Healthy")
- to_chat(user, "Key: Suffocation/Toxin/Burn/Brute")
- to_chat(user, "\tDamage specifics: 0-0-0-0")
- to_chat(user, "Body temperature: ???")
+ var/msg = "*---------*\nAnalyzing results for The floor:\n\tOverall status: Healthy\n"
+ msg += "Key: Suffocation/Toxin/Burn/Brute\n"
+ msg += "\tDamage specifics: 0-0-0-0\n"
+ msg += "Body temperature: ???\n"
+ msg += "*---------*"
+ to_chat(user, msg)
return
user.visible_message("[user] has analyzed [M]'s vitals.")
@@ -136,31 +138,31 @@ SLIME SCANNER
if(H.undergoing_liver_failure() && H.stat != DEAD)
to_chat(user, "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!")
- to_chat(user, "Analyzing results for [M]:\n\tOverall status: [mob_status]")
+ var/msg = "*---------*\nAnalyzing results for [M]:\n\tOverall status: [mob_status]\n"
// Damage descriptions
if(brute_loss > 10)
- to_chat(user, "\t[brute_loss > 50 ? "Severe" : "Minor"] tissue damage detected.")
+ msg += "\t[brute_loss > 50 ? "Severe" : "Minor"] tissue damage detected.\n"
if(fire_loss > 10)
- to_chat(user, "\t[fire_loss > 50 ? "Severe" : "Minor"] burn damage detected.")
+ msg += "\t[fire_loss > 50 ? "Severe" : "Minor"] burn damage detected.\n"
if(oxy_loss > 10)
- to_chat(user, "\t[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected.")
+ msg += "\t[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected.\n"
if(tox_loss > 10)
- to_chat(user, "\t[tox_loss > 50 ? "Severe" : "Minor"] amount of toxin damage detected.")
+ msg += "\t[tox_loss > 50 ? "Severe" : "Minor"] amount of toxin damage detected.\n"
if(M.getStaminaLoss())
- to_chat(user, "\tSubject appears to be suffering from fatigue.")
+ msg += "\tSubject appears to be suffering from fatigue.\n"
if(advanced)
- to_chat(user, "\tFatigue Level: [M.getStaminaLoss()]%.")
+ msg += "\tFatigue Level: [M.getStaminaLoss()]%.\n"
if (M.getCloneLoss())
- to_chat(user, "\tSubject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage.")
+ msg += "\tSubject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage.\n"
if(advanced)
- to_chat(user, "\tCellular Damage Level: [M.getCloneLoss()].")
+ msg += "\tCellular Damage Level: [M.getCloneLoss()].\n"
if (M.getBrainLoss() >= 200 || !M.getorgan(/obj/item/organ/brain))
- to_chat(user, "\tSubject's brain function is non-existent.")
+ msg += "\tSubject's brain function is non-existent.\n"
else if (M.getBrainLoss() >= 120)
- to_chat(user, "\tSevere brain damage detected. Subject likely to have mental traumas.")
+ msg += "\tSevere brain damage detected. Subject likely to have mental traumas.\n"
else if (M.getBrainLoss() >= 45)
- to_chat(user, "\tBrain damage detected.")
+ msg += "\tBrain damage detected.\n"
if(iscarbon(M))
var/mob/living/carbon/C = M
if(LAZYLEN(C.get_traumas()))
@@ -176,83 +178,83 @@ SLIME SCANNER
trauma_desc += "permanent "
trauma_desc += B.scan_desc
trauma_text += trauma_desc
- to_chat(user, "\tCerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].")
+ msg += "\tCerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].\n"
if(C.roundstart_quirks.len)
- to_chat(user, "\tSubject has the following physiological traits: [C.get_trait_string()].")
+ msg += "\tSubject has the following physiological traits: [C.get_trait_string()].\n"
if(advanced)
- to_chat(user, "\tBrain Activity Level: [(200 - M.getBrainLoss())/2]%.")
+ msg += "\tBrain Activity Level: [(200 - M.getBrainLoss())/2]%.\n"
if (M.radiation)
- to_chat(user, "\tSubject is irradiated.")
+ msg += "\tSubject is irradiated.\n"
if(advanced)
- to_chat(user, "\tRadiation Level: [M.radiation]%.")
+ msg += "\tRadiation Level: [M.radiation]%.\n"
if(advanced && M.hallucinating())
- to_chat(user, "\tSubject is hallucinating.")
+ msg += "\tSubject is hallucinating.\n"
//Eyes and ears
if(advanced)
if(iscarbon(M))
var/mob/living/carbon/C = M
var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS)
- to_chat(user, "\t==EAR STATUS==")
+ msg += "\t==EAR STATUS==\n"
if(istype(ears))
var/healthy = TRUE
if(C.has_trait(TRAIT_DEAF, GENETIC_MUTATION))
healthy = FALSE
- to_chat(user, "\tSubject is genetically deaf.")
+ msg += "\tSubject is genetically deaf.\n"
else if(C.has_trait(TRAIT_DEAF))
healthy = FALSE
- to_chat(user, "\tSubject is deaf.")
+ msg += "\tSubject is deaf.\n"
else
if(ears.ear_damage)
- to_chat(user, "\tSubject has [ears.ear_damage > UNHEALING_EAR_DAMAGE? "permanent ": "temporary "]hearing damage.")
+ msg += "\tSubject has [ears.ear_damage > UNHEALING_EAR_DAMAGE? "permanent ": "temporary "]hearing damage.\n"
healthy = FALSE
if(ears.deaf)
- to_chat(user, "\tSubject is [ears.ear_damage > UNHEALING_EAR_DAMAGE ? "permanently ": "temporarily "] deaf.")
+ msg += "\tSubject is [ears.ear_damage > UNHEALING_EAR_DAMAGE ? "permanently ": "temporarily "] deaf.\n"
healthy = FALSE
if(healthy)
- to_chat(user, "\tHealthy.")
+ msg += "\tHealthy.\n"
else
- to_chat(user, "\tSubject does not have ears.")
+ msg += "\tSubject does not have ears.\n"
var/obj/item/organ/eyes/eyes = C.getorganslot(ORGAN_SLOT_EYES)
- to_chat(user, "\t==EYE STATUS==")
+ msg += "\t==EYE STATUS==\n"
if(istype(eyes))
var/healthy = TRUE
if(C.has_trait(TRAIT_BLIND))
- to_chat(user, "\tSubject is blind.")
+ msg += "\tSubject is blind.\n"
healthy = FALSE
if(C.has_trait(TRAIT_NEARSIGHT))
- to_chat(user, "\tSubject is nearsighted.")
+ msg += "\tSubject is nearsighted.\n"
healthy = FALSE
if(eyes.eye_damage > 30)
- to_chat(user, "\tSubject has severe eye damage.")
+ msg += "\tSubject has severe eye damage.\n"
healthy = FALSE
else if(eyes.eye_damage > 20)
- to_chat(user, "\tSubject has significant eye damage.")
+ msg += "\tSubject has significant eye damage.\n"
healthy = FALSE
else if(eyes.eye_damage)
- to_chat(user, "\tSubject has minor eye damage.")
+ msg += "\tSubject has minor eye damage.\n"
healthy = FALSE
if(healthy)
- to_chat(user, "\tHealthy.")
+ msg += "\tHealthy.\n"
else
- to_chat(user, "\tSubject does not have eyes.")
+ msg += "\tSubject does not have eyes.\n"
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/ldamage = H.return_liver_damage()
if(ldamage > 10)
- to_chat(user, "\t[ldamage > 45 ? "Severe" : "Minor"] liver damage detected.")
+ msg += "\t[ldamage > 45 ? "Severe" : "Minor"] liver damage detected.\n"
// Body part damage report
if(iscarbon(M) && mode == 1)
var/mob/living/carbon/C = M
var/list/damaged = C.get_damaged_bodyparts(1,1)
if(length(damaged)>0 || oxy_loss>0 || tox_loss>0 || fire_loss>0)
- to_chat(user, "\tDamage: Brute-Burn-Toxin-Suffocation\n\t\tSpecifics: [brute_loss]-[fire_loss]-[tox_loss]-[oxy_loss]")
+ msg += "\tDamage: Brute-Burn-Toxin-Suffocation\n\t\tSpecifics: [brute_loss]-[fire_loss]-[tox_loss]-[oxy_loss]\n"
for(var/obj/item/bodypart/org in damaged)
- to_chat(user, "\t\t[capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]-[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]")
+ msg += "\t\t[capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]-[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]\n"
// Species and body temperature
if(ishuman(M))
@@ -282,20 +284,22 @@ SLIME SCANNER
else if (S.mutantstomach != initial(S.mutantstomach))
mutant = TRUE
- to_chat(user, "Species: [S.name][mutant ? "-derived mutant" : ""]")
- to_chat(user, "Body temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)")
+ msg += "Species: [H.dna.custom_species ? H.dna.custom_species : S.name] Base: [S.name]\n"
+ if(mutant)
+ msg += "Subject has mutations present."
+ msg += "Body temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)\n"
// Time of death
if(M.tod && (M.stat == DEAD || ((M.has_trait(TRAIT_FAKEDEATH)) && !advanced)))
- to_chat(user, "Time of Death: [M.tod]")
+ msg += "Time of Death: [M.tod]\n"
var/tdelta = round(world.time - M.timeofdeath)
if(tdelta < (DEFIB_TIME_LIMIT * 10))
- to_chat(user, "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!")
+ msg += "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!\n"
for(var/thing in M.diseases)
var/datum/disease/D = thing
if(!(D.visibility_flags & HIDDEN_SCANNER))
- to_chat(user, "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]")
+ msg += "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]\n"
// Blood Level
if(M.has_dna())
@@ -305,7 +309,7 @@ SLIME SCANNER
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(H.bleed_rate)
- to_chat(user, "Subject is bleeding!")
+ msg += "Subject is bleeding!\n"
var/blood_percent = round((C.blood_volume / BLOOD_VOLUME_NORMAL)*100)
var/blood_type = C.dna.blood_type
if(blood_id != "blood")//special blood substance
@@ -315,36 +319,41 @@ SLIME SCANNER
else
blood_type = blood_id
if(C.blood_volume <= BLOOD_VOLUME_SAFE && C.blood_volume > BLOOD_VOLUME_OKAY)
- to_chat(user, "LOW blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]")
+ msg += "LOW blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n"
else if(C.blood_volume <= BLOOD_VOLUME_OKAY)
- to_chat(user, "CRITICAL blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]")
+ msg += "CRITICAL blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n"
else
- to_chat(user, "Blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]")
+ msg += "Blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n"
var/cyberimp_detect
for(var/obj/item/organ/cyberimp/CI in C.internal_organs)
if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant)
cyberimp_detect += "[C.name] is modified with a [CI.name].
"
if(cyberimp_detect)
- to_chat(user, "Detected cybernetic modifications:")
- to_chat(user, "[cyberimp_detect]")
+ msg += "Detected cybernetic modifications:\n"
+ msg += "[cyberimp_detect]\n"
+ msg += "*---------*"
+ to_chat(user, msg)
SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, FALSE)
/proc/chemscan(mob/living/user, mob/living/M)
if(istype(M))
if(M.reagents)
+ var/msg = "*---------*\n"
if(M.reagents.reagent_list.len)
- to_chat(user, "Subject contains the following reagents:")
+ msg += "Subject contains the following reagents:\n"
for(var/datum/reagent/R in M.reagents.reagent_list)
- to_chat(user, "[R.volume] units of [R.name][R.overdosed == 1 ? " - OVERDOSING" : "."]")
+ msg += "[R.volume] units of [R.name][R.overdosed == 1 ? " - OVERDOSING" : "."]\n"
else
- to_chat(user, "Subject contains no reagents.")
+ msg += "Subject contains no reagents.\n"
if(M.reagents.addiction_list.len)
- to_chat(user, "Subject is addicted to the following reagents:")
+ msg += "Subject is addicted to the following reagents:\n"
for(var/datum/reagent/R in M.reagents.addiction_list)
- to_chat(user, "[R.name]")
+ msg += "[R.name]\n"
else
- to_chat(user, "Subject is not addicted to any reagents.")
+ msg += "Subject is not addicted to any reagents.\n"
+ msg += "*---------*"
+ to_chat(user, msg)
/obj/item/healthanalyzer/verb/toggle_mode()
set name = "Switch Verbosity"
diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm
index 730a459ed4..bbd2e67464 100644
--- a/code/game/objects/items/inducer.dm
+++ b/code/game/objects/items/inducer.dm
@@ -12,6 +12,7 @@
var/cell_type = /obj/item/stock_parts/cell/high
var/obj/item/stock_parts/cell/cell
var/recharging = FALSE
+ var/gun_charger = FALSE
/obj/item/inducer/Initialize()
. = ..()
@@ -104,7 +105,7 @@
var/obj/item/stock_parts/cell/C = A.get_cell()
var/obj/O
var/coefficient = 1
- if(istype(A, /obj/item/gun/energy))
+ if(istype(A, /obj/item/gun/energy) && gun_charger != TRUE)
to_chat(user,"Error unable to interface with device")
return FALSE
if(istype(A, /obj))
@@ -181,3 +182,26 @@
/obj/item/inducer/sci/Initialize()
. = ..()
update_icon()
+
+/obj/item/inducer/sci/combat
+ icon_state = "inducer-combat"
+ item_state = "inducer-combat"
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = SLOT_BELT
+ desc = "A tool for inductively charging internal power cells. This one has been modified and upgraded to be able to charge into guns as well as normal electronics."
+ cell_type = /obj/item/stock_parts/cell/hyper
+ powertransfer = 1300
+ opened = FALSE
+ gun_charger = TRUE
+
+/obj/item/inducer/sci/combat/dry
+ cell_type = null
+ opened = TRUE
+
+/obj/item/inducer/sci/combat/dry/Initialize() //Just in case
+ . = ..()
+ update_icon()
+
+/obj/item/inducer/sci/combat/Initialize()
+ . = ..()
+ update_icon()
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index e63ddd1c02..89d939e505 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -382,8 +382,8 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
GLOBAL_LIST_INIT(brass_recipes, list ( \
new/datum/stack_recipe("wall gear", /obj/structure/destructible/clockwork/wall_gear, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
null,
- new/datum/stack_recipe("pinion airlock", /obj/machinery/door/airlock/clockwork, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("brass pinion airlock", /obj/machinery/door/airlock/clockwork/brass, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brass pinion airlock", /obj/machinery/door/airlock/clockwork, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brass pinion airlock - windowed", /obj/machinery/door/airlock/clockwork/brass, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("brass windoor", /obj/machinery/door/window/clockwork, 2, time = 30, on_floor = TRUE, window_checks = TRUE), \
null,
new/datum/stack_recipe("directional brass window", /obj/structure/window/reinforced/clockwork/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
@@ -392,11 +392,14 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \
null,
new/datum/stack_recipe("sender - pressure sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("sender - mech sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("sender - lever", /obj/structure/destructible/clockwork/trap/trigger/lever, 1, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("sender - repeater", /obj/structure/destructible/clockwork/trap/trigger/repeater, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
null,
new/datum/stack_recipe("receiver - brass skewer", /obj/structure/destructible/clockwork/trap/brass_skewer, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_ADJACENT), \
new/datum/stack_recipe("receiver - steam vent", /obj/structure/destructible/clockwork/trap/steam_vent, 3, time = 30, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
+ new/datum/stack_recipe("receiver - power nullifier", /obj/structure/destructible/clockwork/trap/power_nullifier, 5, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
+
))
/obj/item/stack/tile/brass
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 25fc96c251..1f1143e7ce 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -48,6 +48,13 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50)
component_type = /datum/component/storage/concrete/bluespace/bag_of_holding
+/obj/item/storage/backpack/holding/satchel
+ name = "satchel of holding"
+ desc = "A satchel that opens into a localized pocket of Blue Space."
+ icon_state = "holdingsat"
+ item_state = "holdingsat"
+ species_exception = list(/datum/species/angel)
+
/obj/item/storage/backpack/holding/ComponentInitialize()
. = ..()
GET_COMPONENT(STR, /datum/component/storage)
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index 079feec17a..1a666ce921 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -122,7 +122,7 @@
new /obj/item/reagent_containers/pill/antirad(src)
new /obj/item/reagent_containers/food/drinks/bottle/vodka(src)
new /obj/item/healthanalyzer(src)
-
+
/obj/item/storage/firstaid/o2
name = "oxygen deprivation treatment kit"
@@ -312,3 +312,11 @@
/obj/item/storage/pill_bottle/mutarad/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/reagent_containers/pill/mutarad(src)
+
+/obj/item/storage/pill_bottle/penis_enlargement
+ name = "penis enlargement pills"
+ desc = "You want penis enlargement pills?"
+
+/obj/item/storage/pill_bottle/penis_enlargement/PopulateContents()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_containers/pill/penis_enlargement(src)
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index eb9fc86516..9b8d2b4a21 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -208,3 +208,38 @@
new/obj/item/stack/cable_coil/orange(src)
new/obj/item/stack/cable_coil/cyan(src)
new/obj/item/stack/cable_coil/white(src)
+
+/obj/item/storage/toolbox/gold_real
+ name = "golden toolbox"
+ desc = "A larger then normal toolbox made of gold plated plastitanium."
+ item_state = "gold"
+ icon_state = "gold"
+ has_latches = FALSE
+ force = 16 // Less then a spear
+ throwforce = 14
+ throw_speed = 5
+ throw_range = 10
+
+/obj/item/storage/toolbox/gold_real/PopulateContents()
+ new /obj/item/screwdriver/nuke(src)
+ new /obj/item/wrench(src)
+ new /obj/item/weldingtool/largetank(src)
+ new /obj/item/crowbar/red(src)
+ new /obj/item/wirecutters(src, "red")
+ new /obj/item/multitool/ai_detect(src)
+ new /obj/item/clothing/gloves/combat(src)
+
+/obj/item/storage/toolbox/gold_real/ComponentInitialize()
+ . = ..()
+ GET_COMPONENT(STR, /datum/component/storage)
+ STR.max_combined_w_class = 40
+ STR.max_items = 12
+
+/obj/item/storage/toolbox/gold_fake // used in crafting
+ name = "golden toolbox"
+ desc = "A gold plated toolbox, fancy and harmless do to the gold plating being on cardboard!"
+ icon_state = "gold"
+ item_state = "gold"
+ has_latches = FALSE
+ force = 0
+ throwforce = 0
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 294611c1f1..19848f45ea 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -225,6 +225,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/katana/cursed
slot_flags = null
+ item_flags = NODROP
/obj/item/katana/suicide_act(mob/user)
user.visible_message("[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku!")
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index 6d3f498a8c..0e2f951f38 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -1,6 +1,6 @@
#define MUSICIAN_HEARCHECK_MINDELAY 4
-#define MUSIC_MAXLINES 300
+#define MUSIC_MAXLINES 600
#define MUSIC_MAXLINECHARS 50
/datum/song
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
index 3056b459d8..97a799824b 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
@@ -217,3 +217,7 @@
/proc/_step_away(ref, trg, max)
step_away(ref, trg, max)
+/proc/_instantiate_at(thing, location)
+ new thing(location)
+
+
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index 3fa1020000..b14541d3c8 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -503,6 +503,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
L.lastattacker = user.real_name
L.lastattackerckey = user.ckey
+ L.adjustStaminaLoss(35) //because previously it took 5-6 hits to actually "incapacitate" someone for the purposes of the sleep inducement
L.Knockdown(140)
L.apply_effect(EFFECT_STUTTER, 7)
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
diff --git a/code/modules/antagonists/blob/blob/blobs/core.dm b/code/modules/antagonists/blob/blob/blobs/core.dm
index e048aa7665..81792ca4f6 100644
--- a/code/modules/antagonists/blob/blob/blobs/core.dm
+++ b/code/modules/antagonists/blob/blob/blobs/core.dm
@@ -4,7 +4,7 @@
icon_state = "blank_blob"
desc = "A huge, pulsating yellow mass."
max_integrity = 400
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90)
+ armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 5, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90) // Last stand
explosion_block = 6
point_return = -1
health_regen = 0 //we regen in Life() instead of when pulsed
diff --git a/code/modules/antagonists/blob/blob/blobs/factory.dm b/code/modules/antagonists/blob/blob/blobs/factory.dm
index 3d955036b0..284a43562e 100644
--- a/code/modules/antagonists/blob/blob/blobs/factory.dm
+++ b/code/modules/antagonists/blob/blob/blobs/factory.dm
@@ -6,6 +6,7 @@
max_integrity = 200
health_regen = 1
point_return = 25
+ armor = list("melee" = 10, "bullet" = 20, "laser" = 15, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
var/list/spores = list()
var/mob/living/simple_animal/hostile/blob/blobbernaut/naut = null
var/max_spores = 3
diff --git a/code/modules/antagonists/blob/blob/blobs/resource.dm b/code/modules/antagonists/blob/blob/blobs/resource.dm
index 5024d0984c..76aecf717d 100644
--- a/code/modules/antagonists/blob/blob/blobs/resource.dm
+++ b/code/modules/antagonists/blob/blob/blobs/resource.dm
@@ -5,6 +5,7 @@
desc = "A thin spire of slightly swaying tendrils."
max_integrity = 60
point_return = 15
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
var/resource_delay = 0
/obj/structure/blob/resource/scannerreport()
diff --git a/code/modules/antagonists/blob/blob/blobs/shield.dm b/code/modules/antagonists/blob/blob/blobs/shield.dm
index a83f4294b2..d52c208c71 100644
--- a/code/modules/antagonists/blob/blob/blobs/shield.dm
+++ b/code/modules/antagonists/blob/blob/blobs/shield.dm
@@ -8,7 +8,7 @@
explosion_block = 3
point_return = 4
atmosblock = TRUE
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
+ armor = list("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
/obj/structure/blob/shield/scannerreport()
if(atmosblock)
@@ -20,11 +20,12 @@
/obj/structure/blob/shield/update_icon()
..()
- if(obj_integrity <= 75)
+ if(obj_integrity <= 70)
icon_state = "blob_shield_damaged"
name = "weakened strong blob"
desc = "A wall of twitching tendrils."
atmosblock = FALSE
+ armor = list("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
else
icon_state = initial(icon_state)
name = initial(name)
diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm
index b9abf76fd1..c9b48fa6fc 100644
--- a/code/modules/antagonists/changeling/powers/tiny_prick.dm
+++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm
@@ -64,11 +64,11 @@
/obj/effect/proc_holder/changeling/sting/transformation
name = "Transformation Sting"
desc = "We silently sting a human, injecting a retrovirus that forces them to transform."
- helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
+ helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is loud, and might cause our blood to react violently to heat."
sting_icon = "sting_transform"
chemical_cost = 50
dna_cost = 3
- loudness = 1
+ loudness = 2
var/datum/changelingprofile/selected_dna = null
action_icon = 'icons/mob/actions/actions_changeling.dmi'
action_icon_state = "ling_sting_transform"
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
index d7ae0c7fc6..ec712f2eec 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
@@ -44,12 +44,13 @@
/obj/item/clockwork/slab/cyborg //three scriptures, plus a spear and fabricator
clockwork_desc = "A divine link to the Celestial Derelict, allowing for limited recital of scripture."
- quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard)
+ quickbound = list(/datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard, \
+ /datum/clockwork_scripture/create_object/stargazer)
maximum_quickbound = 6 //we usually have one or two unique scriptures, so if ratvar is up let us bind one more
actions_types = list()
-/obj/item/clockwork/slab/cyborg/engineer //two scriptures, plus a fabricator
- quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission)
+/obj/item/clockwork/slab/cyborg/engineer //three scriptures, plus a fabricator
+ quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission, /datum/clockwork_scripture/create_object/stargazer)
/obj/item/clockwork/slab/cyborg/medical //five scriptures, plus a spear
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/ranged_ability/sentinels_compromise, \
@@ -61,12 +62,12 @@
/obj/item/clockwork/slab/cyborg/peacekeeper //two scriptures, plus a spear
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/hateful_manacles, /datum/clockwork_scripture/ranged_ability/judicial_marker)
-/obj/item/clockwork/slab/cyborg/janitor //five scriptures, plus a fabricator
+/obj/item/clockwork/slab/cyborg/janitor //six scriptures, plus a fabricator
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \
- /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor)
+ /datum/clockwork_scripture/create_object/stargazer, /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor)
-/obj/item/clockwork/slab/cyborg/service //five scriptures, plus xray vision
- quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, \
+/obj/item/clockwork/slab/cyborg/service //six scriptures, plus xray vision
+ quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant,/datum/clockwork_scripture/create_object/stargazer, \
/datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/create_object/clockwork_obelisk)
/obj/item/clockwork/slab/cyborg/miner //two scriptures, plus a spear and xray vision
diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm
index 6415d9f91a..552a747651 100644
--- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm
+++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm
@@ -2,6 +2,32 @@
// DRIVERS //
/////////////
+//Stargazer: Creates a stargazer, a cheap power generator that utilizes starlight.
+/datum/clockwork_scripture/create_object/stargazer
+ descname = "Generates Power From Starlight"
+ name = "Stargazer"
+ desc = "Forms a weak structure that generates power every second while within three tiles of starlight."
+ invocations = list("Capture their inferior light for us!")
+ channel_time = 50
+ power_cost = 200
+ object_path = /obj/structure/destructible/clockwork/stargazer
+ creator_message = "You form a stargazer, which will generate power near starlight."
+ observer_message = "A large lantern-shaped machine forms!"
+ usage_tip = "For obvious reasons, make sure to place this near a window or somewhere else that can see space!"
+ tier = SCRIPTURE_DRIVER
+ one_per_tile = TRUE
+ primary_component = HIEROPHANT_ANSIBLE
+ sort_priority = 1
+ quickbind = TRUE
+ quickbind_desc = "Creates a stargazer, which generates power when near starlight."
+
+/datum/clockwork_scripture/create_object/stargazer/check_special_requirements()
+ var/area/A = get_area(invoker)
+ if(A.outdoors || A.map_name == "Space" || !A.blob_allowed)
+ to_chat(invoker, "Stargazers can't be built off-station.")
+ return
+ return ..()
+
//Integration Cog: Creates an integration cog that can be inserted into APCs to passively siphon power.
/datum/clockwork_scripture/create_object/integration_cog
@@ -18,7 +44,7 @@
tier = SCRIPTURE_DRIVER
space_allowed = TRUE
primary_component = HIEROPHANT_ANSIBLE
- sort_priority = 1
+ sort_priority = 2
important = TRUE
quickbind = TRUE
quickbind_desc = "Creates an integration cog, which can be used to siphon power from an open APC."
@@ -39,7 +65,7 @@
tier = SCRIPTURE_DRIVER
one_per_tile = TRUE
primary_component = HIEROPHANT_ANSIBLE
- sort_priority = 2
+ sort_priority = 3
quickbind = TRUE
quickbind_desc = "Creates a Sigil of Transgression, which will briefly stun and slow the next non-Servant to cross it."
@@ -59,7 +85,7 @@
tier = SCRIPTURE_DRIVER
one_per_tile = TRUE
primary_component = HIEROPHANT_ANSIBLE
- sort_priority = 3
+ sort_priority = 4
quickbind = TRUE
quickbind_desc = "Creates a Sigil of Submission, which will convert non-Servants that remain on it."
@@ -76,7 +102,7 @@
usage_tip = "The light can be used from up to two tiles away. Damage taken will GREATLY REDUCE the stun's duration."
tier = SCRIPTURE_DRIVER
primary_component = BELLIGERENT_EYE
- sort_priority = 4
+ sort_priority = 5
slab_overlay = "volt"
ranged_type = /obj/effect/proc_holder/slab/kindle
ranged_message = "You charge the clockwork slab with divine energy.\n\
@@ -100,7 +126,7 @@
usage_tip = "The manacles are about as strong as zipties, and break when removed."
tier = SCRIPTURE_DRIVER
primary_component = BELLIGERENT_EYE
- sort_priority = 5
+ sort_priority = 6
ranged_type = /obj/effect/proc_holder/slab/hateful_manacles
slab_overlay = "hateful_manacles"
ranged_message = "You charge the clockwork slab with divine energy.\n\
@@ -124,7 +150,7 @@
usage_tip = "You cannot reactivate Vanguard while still shielded by it."
tier = SCRIPTURE_DRIVER
primary_component = VANGUARD_COGWHEEL
- sort_priority = 6
+ sort_priority = 7
quickbind = TRUE
quickbind_desc = "Allows you to temporarily have quickly regenerating stamina and absorb stuns. All stuns absorbed will affect you when disabled."
@@ -156,7 +182,7 @@
usage_tip = "The Compromise is very fast to invoke, and will remove holy water from the target Servant."
tier = SCRIPTURE_DRIVER
primary_component = VANGUARD_COGWHEEL
- sort_priority = 7
+ sort_priority = 8
quickbind = TRUE
quickbind_desc = "Allows you to convert a Servant's brute, burn, and oxygen damage to half toxin damage.
Click your slab to disable."
slab_overlay = "compromise"
@@ -180,7 +206,7 @@
usage_tip = "This can't be used while on Reebe, for obvious reasons."
tier = SCRIPTURE_DRIVER
primary_component = GEIS_CAPACITOR
- sort_priority = 8
+ sort_priority = 9
important = TRUE
quickbind = TRUE
quickbind_desc = "Returns you to Reebe."
@@ -238,7 +264,7 @@
tier = SCRIPTURE_DRIVER
space_allowed = TRUE
primary_component = GEIS_CAPACITOR
- sort_priority = 9
+ sort_priority = 10
important = TRUE
quickbind = TRUE
quickbind_desc = "Creates a new Clockwork Slab."
@@ -259,6 +285,6 @@
tier = SCRIPTURE_DRIVER
space_allowed = TRUE
primary_component = GEIS_CAPACITOR
- sort_priority = 10
+ sort_priority = 11
quickbind = TRUE
quickbind_desc = "Creates a pair of Wraith Spectacles, which grant true sight but cause gradual vision loss."
diff --git a/code/modules/antagonists/clockcult/clock_structures/stargazer.dm b/code/modules/antagonists/clockcult/clock_structures/stargazer.dm
new file mode 100644
index 0000000000..57f83c55aa
--- /dev/null
+++ b/code/modules/antagonists/clockcult/clock_structures/stargazer.dm
@@ -0,0 +1,70 @@
+#define STARGAZER_RANGE 3 //How many tiles the stargazer can see out to
+#define STARGAZER_POWER 7 //How many watts will be produced per second when the stargazer sees starlight
+
+//Stargazer: A very fragile but cheap generator that creates power from starlight.
+/obj/structure/destructible/clockwork/stargazer
+ name = "stargazer"
+ desc = "A large lantern-shaped machine made of thin brass. It looks fragile."
+ clockwork_desc = "A lantern-shaped generator that produces power when near starlight."
+ icon_state = "stargazer"
+ unanchored_icon = "stargazer_unwrenched"
+ max_integrity = 40
+ construction_value = 5
+ layer = WALL_OBJ_LAYER
+ break_message = "The stargazer's fragile body shatters into pieces!"
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ light_color = "#DAAA18"
+ var/star_light_star_bright = FALSE //If this stargazer can see starlight
+
+/obj/structure/destructible/clockwork/stargazer/Initialize()
+ . = ..()
+ START_PROCESSING(SSprocessing, src)
+
+/obj/structure/destructible/clockwork/stargazer/Destroy()
+ STOP_PROCESSING(SSprocessing, src)
+ . = ..()
+
+/obj/structure/destructible/clockwork/stargazer/examine(mob/user)
+ ..()
+ if(is_servant_of_ratvar(user))
+ to_chat(user, "Generates [DisplayPower(STARGAZER_POWER)] per second while viewing starlight within [STARGAZER_RANGE] tiles.")
+ if(star_light_star_bright)
+ to_chat(user, "[is_servant_of_ratvar(user) ? "It can see starlight!" : "It's shining brilliantly!"]")
+
+/obj/structure/destructible/clockwork/stargazer/process()
+ star_light_star_bright = check_starlight()
+ if(star_light_star_bright)
+ adjust_clockwork_power(STARGAZER_POWER)
+
+/obj/structure/destructible/clockwork/stargazer/update_anchored(mob/living/user, damage)
+ . = ..()
+ star_light_star_bright = check_starlight()
+
+/obj/structure/destructible/clockwork/stargazer/proc/check_starlight()
+ var/old_status = star_light_star_bright
+ var/has_starlight
+ if(!anchored)
+ has_starlight = FALSE
+ else
+ for(var/turf/T in view(3, src))
+ if(isspaceturf(T))
+ has_starlight = TRUE
+ break
+ if(has_starlight && anchored)
+ var/area/A = get_area(src)
+ if(A.outdoors || A.map_name == "Space" || !A.blob_allowed)
+ has_starlight = FALSE
+ if(old_status != has_starlight)
+ if(has_starlight)
+ visible_message("[src] hums and shines brilliantly!")
+ playsound(src, 'sound/machines/clockcult/stargazer_activate.ogg', 50, TRUE)
+ add_overlay("stargazer_light")
+ set_light(1.5, 5)
+ else
+ if(anchored) //We lost visibility somehow
+ visible_message("[src] flickers, and falls dark.")
+ else
+ visible_message("[src] whooshes quietly as it slides into a less bulky form.")
+ cut_overlays()
+ set_light(0)
+ return has_starlight
diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm
new file mode 100644
index 0000000000..3eac1b9fef
--- /dev/null
+++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm
@@ -0,0 +1,20 @@
+//Mech sensor: Activates when stepped on by a mech
+/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech
+ name = "mech sensor"
+ desc = "A thin plate of brass, barely visible but clearly distinct."
+ clockwork_desc = "A trigger that will activate when a mech controlled by a non-servant runs across it."
+ max_integrity = 5
+ icon_state = "pressure_sensor"
+ alpha = 75
+
+/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech/Crossed(atom/movable/AM)
+
+ if(!istype(AM,/obj/mecha/))
+ return
+
+ var/obj/mecha/M = AM
+ if(M.occupant && is_servant_of_ratvar(M.occupant))
+ return
+ audible_message("*click*")
+ playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE)
+ activate()
\ No newline at end of file
diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
index 6312228447..ebfb219c9a 100644
--- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
@@ -68,7 +68,14 @@
mouse_opacity = MOUSE_OPACITY_OPAQUE //So players can interact with the tile it's on to pull them off
buckle_mob(squirrel, TRUE)
else
- visible_message("A massive brass spike erupts from the ground!")
+ var/obj/mecha/M = locate() in get_turf(src)
+ if(M)
+ M.take_damage(50,BRUTE,"melee")
+ M.visible_message("A massive brass spike erupts from the ground, penetrating \the [M] and shattering the trap into pieces!")
+ addtimer(CALLBACK(src, .proc/take_damage, max_integrity), 1)
+ else
+ visible_message("A massive brass spike erupts from the ground!")
+
playsound(src, 'sound/machines/clockcult/brass_skewer.ogg', 75, FALSE)
icon_state = "[initial(icon_state)]_extended"
density = TRUE //Skewers are one-use only
diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/power_null.dm b/code/modules/antagonists/clockcult/clock_structures/traps/power_null.dm
new file mode 100644
index 0000000000..6c8477ab5b
--- /dev/null
+++ b/code/modules/antagonists/clockcult/clock_structures/traps/power_null.dm
@@ -0,0 +1,17 @@
+/obj/structure/destructible/clockwork/trap/power_nullifier
+ name = "power nullifier"
+ desc = "A well hidden set of wires and connections."
+ clockwork_desc = "When triggered, it sets off a 3x3 emp pulse with the center suffering a stronger pulse."
+ icon_state = "electric_trap"
+ break_message = "The power nullifier sparks, then slowly crumbles to debris!"
+ max_integrity = 40
+ density = FALSE
+ var/activated = FALSE
+
+/obj/structure/destructible/clockwork/trap/power_nullifier/activate()
+ if(!activated)
+ activated = TRUE
+ empulse(get_turf(src),1,1,TRUE)
+
+/obj/structure/destructible/clockwork/trap/power_nullifier/emp_act(var/strength=1)
+ activate()
diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm
index 9368a41731..b5f0e7a240 100644
--- a/code/modules/cargo/exports/large_objects.dm
+++ b/code/modules/cargo/exports/large_objects.dm
@@ -55,7 +55,6 @@
contents_cost = 700
export_types = list(/obj/structure/reagent_dispensers/beerkeg)
-
/datum/export/large/pipedispenser
cost = 500
unit_name = "pipe dispenser"
@@ -122,7 +121,6 @@
unit_name = "packaged antimatter reactor section"
export_types = list(/obj/item/am_shielding_container)
-
/datum/export/large/iv
cost = 50
unit_name = "iv drip"
@@ -133,3 +131,86 @@
unit_name = "security barrier"
export_types = list(/obj/item/grenade/barrier, /obj/structure/barricade/security)
+/datum/export/large/odysseus
+ cost = 5500
+ unit_name = "working odysseus"
+ export_types = list(/obj/mecha/medical/odysseus)
+ include_subtypes = FALSE
+
+/datum/export/large/ripley
+ cost = 6500
+ unit_name = "working ripley"
+ export_types = list(/obj/mecha/working/ripley)
+ include_subtypes = FALSE
+
+/datum/export/large/firefighter
+ cost = 9000
+ unit_name = "working firefighter"
+ export_types = list(/obj/mecha/working/ripley/firefighter)
+ include_subtypes = FALSE
+
+/datum/export/large/gygax
+ cost = 19000
+ unit_name = "working gygax"
+ export_types = list(/obj/mecha/combat/gygax)
+ include_subtypes = FALSE
+
+/datum/export/large/durand
+ cost = 10000
+ unit_name = "working durand"
+ export_types = list(/obj/mecha/combat/durand)
+ include_subtypes = FALSE
+
+/datum/export/large/phazon
+ cost = 25000 //Little over half do to needing a core
+ unit_name = "working phazon"
+ export_types = list(/obj/mecha/combat/phazon)
+ include_subtypes = FALSE
+
+/datum/export/large/marauder
+ cost = 15000 //Still a Combat class mech - CC tech as well! 150% "normal" boundy price.
+ unit_name = "working marauder"
+ export_types = list(/obj/mecha/combat/marauder)
+ include_subtypes = FALSE
+
+/datum/export/large/deathripley
+ cost = 8500 //Still a "Combat class" mech - Illegal tech as well! 165% "normal" boundy price.
+ unit_name = "working illegally modified"
+ export_types = list(/obj/mecha/working/ripley/deathripley)
+ include_subtypes = FALSE
+
+/datum/export/large/gygaxdark
+ cost = 28500 //Still a Combat class mech - Illegal tech as well! 150% "normal" boundy price.
+ unit_name = "working illegally modified gygax"
+ export_types = list(/obj/mecha/combat/gygax/dark)
+ include_subtypes = FALSE
+
+/datum/export/large/oldripley
+ cost = 6250 //old mech - Scrap metal ! 50% "normal" boundy price.
+ unit_name = "working miner ripley"
+ export_types = list(/obj/mecha/working/ripley/mining)
+ include_subtypes = FALSE
+
+/datum/export/large/honk
+ cost = 12000 //Still a "Combat class" mech - Comats bordem honk!
+ unit_name = "working honker"
+ export_types = list(/obj/mecha/combat/honker)
+ include_subtypes = FALSE
+
+/datum/export/large/reticence
+ cost = 12000 //Still a "Combat class" mech - Has cloking and lethal weaponds.
+ unit_name = "working reticence"
+ export_types = list(/obj/mecha/combat/reticence)
+ include_subtypes = FALSE
+
+/datum/export/large/seraph
+ cost = 25500 //Still a Combat class mech - CC tech as well! 150% "normal" boundy price.
+ unit_name = "working seraph"
+ export_types = list(/obj/mecha/combat/marauder/seraph)
+ include_subtypes = FALSE
+
+/datum/export/large/mauler
+ cost = 12000 //Still a Combat class mech - CC lethal weaponds.
+ unit_name = "working legally modified marauder"
+ export_types = list(/obj/mecha/combat/marauder/mauler)
+ include_subtypes = FALSE
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 633f4fa850..ca8f10869d 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1699,7 +1699,7 @@
/obj/item/t_scanner/adv_mining_scanner/lesser,
/obj/item/radio/headset/headset_cargo/mining,
/obj/item/storage/bag/ore,
- /obj/item/clothing/suit/hooded/explorer,
+ /obj/item/clothing/suit/hooded/explorer/standard,
/obj/item/clothing/mask/gas/explorer)
crate_name = "shaft miner starter kit"
crate_type = /obj/structure/closet/crate/secure
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 4f17f5d762..8e4891fb70 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -21,6 +21,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/last_ip
var/last_id
+ //Cooldowns for saving/loading. These are four are all separate due to loading code calling these one after another
+ var/saveprefcooldown
+ var/loadprefcooldown
+ var/savecharcooldown
+ var/loadcharcooldown
+
//game-preferences
var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
var/ooccolor = null
@@ -75,13 +81,80 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/eye_color = "000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
var/list/features = list("mcolor" = "FFF",
- "tail_lizard" = "Smooth", "tail_human" = "Cat",
- "snout" = "Round", "horns" = "None", "ears" = "Cat",
- "wings" = "None", "frills" = "None", "spines" = "None",
- "body_markings" = "None", "legs" = "Normal Legs", "moth_wings" = "Plain")
+ "tail_lizard" = "Smooth",
+ "tail_human" = "None",
+ "snout" = "Round",
+ "horns" = "None",
+ "ears" = "None",
+ "wings" = "None",
+ "frills" = "None",
+ "spines" = "None",
+ "body_markings" = "None",
+ "legs" = "Normal Legs",
+ "moth_wings" = "Plain",
+ "mcolor2" = "FFF",
+ "mcolor3" = "FFF",
+ "mam_body_markings" = "Plain",
+ "mam_ears" = "None",
+ "mam_snouts" = "None",
+ "mam_tail" = "None",
+ "mam_tail_animated" = "None",
+ "xenodorsal" = "Standard",
+ "xenohead" = "Standard",
+ "xenotail" = "Xenomorph Tail",
+ "taur" = "None",
+ "exhibitionist" = FALSE,
+ "genitals_use_skintone" = FALSE,
+ "has_cock" = FALSE,
+ "cock_shape" = "Human",
+ "cock_length" = 6,
+ "cock_girth_ratio" = COCK_GIRTH_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_size" = BALLS_SIZE_DEF,
+ "balls_cum_rate" = CUM_RATE,
+ "balls_cum_mult" = CUM_RATE_MULT,
+ "balls_efficiency" = CUM_EFFICIENCY,
+ "balls_fluid" = "semen",
+ "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_fluid" = "milk",
+ "has_vag" = FALSE,
+ "vag_shape" = "Human",
+ "vag_color" = "fff",
+ "vag_clits" = 1,
+ "vag_clit_diam" = 0.25,
+ "has_womb" = FALSE,
+ "womb_cum_rate" = CUM_RATE,
+ "womb_cum_mult" = CUM_RATE_MULT,
+ "womb_efficiency" = CUM_EFFICIENCY,
+ "womb_fluid" = "femcum",
+ "ipc_screen" = "Sunburst",
+ "ipc_antenna" = "None",
+ "flavor_text" = ""
+ )
var/list/custom_names = list()
var/prefered_security_department = SEC_DEPT_RANDOM
+ var/custom_species = null
//Quirk list
var/list/positive_quirks = list()
@@ -269,6 +342,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Body
"
dat += "Gender:[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
"
dat += "Species:[pref_species.id]
"
+ dat += "Custom Species Name:[custom_species ? custom_species : "None"]
"
dat += "Random Body
"
dat += "Always Random Body:[be_random_body ? "Yes" : "No"]
"
dat += "
Cycle background:[bgstate]
"
@@ -840,9 +914,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "
[gear.cost] | "
if(islist(gear.restricted_roles))
if(gear.restricted_roles.len)
- dat += ""
- dat += gear.restricted_roles.Join(";")
- dat += ""
+ if(gear.restricted_desc)
+ dat += ""
+ dat += gear.restricted_desc
+ dat += ""
+ else
+ dat += ""
+ dat += gear.restricted_roles.Join(";")
+ dat += ""
dat += " | [gear.description] | "
dat += ""
@@ -1456,12 +1535,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/newtype = GLOB.species_list[result]
pref_species = new newtype()
//let's ensure that no weird shit happens on species swapping.
+ custom_species = null
if(!("body_markings" in pref_species.default_features))
features["body_markings"] = "None"
if(!("mam_body_markings" in pref_species.default_features))
features["mam_body_markings"] = "None"
- if("mam_body_markings" in pref_species.default_features && features["mam_body_markings"] == "None")
- features["mam_body_markings"] = "Plain"
+ if("mam_body_markings" in pref_species.default_features)
+ if(features["mam_body_markings"] == "None")
+ features["mam_body_markings"] = "Plain"
if("tail_lizard" in pref_species.default_features)
features["tail_lizard"] = "Smooth"
if(pref_species.id == "felinid")
@@ -1477,6 +1558,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(features["mcolor3"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
features["mcolor3"] = pref_species.default_color
+ if("custom_species")
+ var/new_species = reject_bad_name(input(user, "Choose your species subtype, if unique. This will show up on examinations and health scans. Do not abuse this:", "Character Preference", custom_species) as null|text)
+ if(new_species)
+ custom_species = new_species
+ else
+ custom_species = null
+
if("mutant_color")
var/new_mutantcolor = input(user, "Choose your character's alien/mutant color:", "Character Preference","#"+features["mcolor"]) as color|null
if(new_mutantcolor)
@@ -2115,6 +2203,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.real_name = nameless ? "[real_name] #[rand(10000, 99999)]" : real_name
character.name = character.real_name
character.nameless = nameless
+ character.custom_species = custom_species
character.gender = gender
character.age = age
@@ -2149,6 +2238,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.dna.features = features.Copy()
character.dna.real_name = character.real_name
character.dna.nameless = character.nameless
+ character.dna.custom_species = character.custom_species
if("tail_lizard" in pref_species.default_features)
character.dna.species.mutant_bodyparts |= "tail_lizard"
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index b6210d94b8..39b44f1ab9 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -58,6 +58,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/load_preferences()
if(!path)
return 0
+ if(world.time < loadprefcooldown)
+ if(istype(parent))
+ to_chat(parent, "You're attempting to load your preferences a little too fast. Wait half a second, then try again.")
+ return 0
+ loadprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN
if(!fexists(path))
return 0
@@ -152,6 +157,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/save_preferences()
if(!path)
return 0
+ if(world.time < saveprefcooldown)
+ if(istype(parent))
+ to_chat(parent, "You're attempting to save your preferences a little too fast. Wait half a second, then try again.")
+ return 0
+ saveprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN
var/savefile/S = new /savefile(path)
if(!S)
return 0
@@ -204,6 +214,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/load_character(slot)
if(!path)
return 0
+ if(world.time < loadcharcooldown) //This is before the check to see if the filepath exists to ensure that BYOND can't get hung up on read attempts when the hard drive is a little slow
+ if(istype(parent))
+ to_chat(parent, "You're attempting to load your character a little too fast. Wait half a second, then try again.")
+ return "SLOW THE FUCK DOWN" //the reason this isn't null is to make sure that people don't have their character slots overridden by random chars if they accidentally double-click a slot
+ loadcharcooldown = world.time + PREF_SAVELOAD_COOLDOWN
if(!fexists(path))
return 0
var/savefile/S = new /savefile(path)
@@ -236,6 +251,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Character
S["real_name"] >> real_name
S["nameless"] >> nameless
+ S["custom_species"] >> custom_species
S["name_is_always_random"] >> be_random_name
S["body_is_always_random"] >> be_random_body
S["gender"] >> gender
@@ -350,7 +366,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
gender = sanitize_gender(gender, TRUE, TRUE)
if(!real_name)
real_name = random_unique_name(gender)
-
+ custom_species = reject_bad_name(custom_species)
for(var/custom_name_id in GLOB.preferences_custom_names)
var/namedata = GLOB.preferences_custom_names[custom_name_id]
custom_names[custom_name_id] = reject_bad_name(custom_names[custom_name_id],namedata["allow_numbers"])
@@ -417,6 +433,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/save_character()
if(!path)
return 0
+ if(world.time < savecharcooldown)
+ if(istype(parent))
+ to_chat(parent, "You're attempting to save your character a little too fast. Wait half a second, then try again.")
+ return 0
+ savecharcooldown = world.time + PREF_SAVELOAD_COOLDOWN
var/savefile/S = new /savefile(path)
if(!S)
return 0
@@ -427,6 +448,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Character
WRITE_FILE(S["real_name"] , real_name)
WRITE_FILE(S["nameless"] , nameless)
+ WRITE_FILE(S["custom_species"] , custom_species)
WRITE_FILE(S["name_is_always_random"] , be_random_name)
WRITE_FILE(S["body_is_always_random"] , be_random_body)
WRITE_FILE(S["gender"] , gender)
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index b1503f26fb..b6c5a5417a 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -26,7 +26,7 @@
icon_state = "captain"
item_state = "that"
flags_inv = 0
- armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
strip_delay = 60
dog_fashion = /datum/dog_fashion/head/captain
@@ -50,7 +50,7 @@
name = "head of personnel's cap"
icon_state = "hopcap"
desc = "The symbol of true bureaucratic micromanagement."
- armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
dog_fashion = /datum/dog_fashion/head/hop
/obj/item/clothing/head/hopcap/beret
@@ -200,4 +200,4 @@
/obj/item/clothing/head/beret/qm
name = "quartermaster's beret"
desc = "This headwear shows off your Cargonian leadership"
- icon_state = "qmberet"
\ No newline at end of file
+ icon_state = "qmberet"
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 8245148096..2dd7c92f08 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -171,17 +171,113 @@
icon_state = "stripedbluescarf"
item_color = "stripedbluescarf"
-/obj/item/clothing/neck/petcollar //don't really wear this though please c'mon seriously guys
+///////////
+//COLLARS//
+///////////
+
+/obj/item/clothing/neck/petcollar
name = "pet collar"
- desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule."
+ desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule. It seems to be made out of a polychromic material."
icon_state = "petcollar"
item_color = "petcollar"
+ hasprimary = TRUE
+ primary_color = "#00BBBB"
+ pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar
var/tagname = null
/obj/item/clothing/neck/petcollar/attack_self(mob/user)
tagname = copytext(sanitize(input(user, "Would you like to change the name on the tag?", "Name your new pet", "Spot") as null|text),1,MAX_NAME_LEN)
name = "[initial(name)] - [tagname]"
+/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file)
+ . = ..()
+ if(hasprimary | hassecondary | hastertiary)
+ if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
+ if(hasprimary) //checks if overlays are enabled
+ var/mutable_appearance/primary_worn = mutable_appearance(icon, "[item_color]-primary") //automagical sprite selection
+ primary_worn.color = primary_color //colors the overlay
+ . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite
+ if(hassecondary)
+ var/mutable_appearance/secondary_worn = mutable_appearance(icon, "[item_color]-secondary")
+ secondary_worn.color = secondary_color
+ . += secondary_worn
+ if(hastertiary)
+ var/mutable_appearance/tertiary_worn = mutable_appearance(icon, "[item_color]-tertiary")
+ tertiary_worn.color = tertiary_color
+ . += tertiary_worn
+
+/obj/item/clothing/neck/petcollar/leather
+ name = "leather pet collar"
+ icon_state = "leathercollar"
+ item_color = "leathercollar"
+
+ hasprimary = TRUE
+ hassecondary = TRUE
+ primary_color = "#222222"
+ secondary_color = "#888888"
+
+/obj/item/clothing/neck/petcollar/choker
+ desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel."
+ name = "choker"
+ icon_state = "choker"
+ item_color = "choker"
+
+ hasprimary = TRUE
+ primary_color = "#222222"
+
+/obj/item/clothing/neck/petcollar/locked
+ name = "locked collar"
+ desc = "A collar that has a small lock on it to keep it from being removed."
+ pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar/locked
+ var/lock = FALSE
+
+/obj/item/clothing/neck/petcollar/locked/attackby(obj/item/K, mob/user, params)
+ if(istype(K, /obj/item/key/collar))
+ if(lock != FALSE)
+ to_chat(user, "With a click the collar unlocks!")
+ lock = FALSE
+ else
+ to_chat(user, "With a click the collar locks!")
+ lock = TRUE
+ return
+
+/obj/item/clothing/neck/petcollar/locked/attack_hand(mob/user)
+ if(loc == user && user.get_item_by_slot(SLOT_NECK) && lock != FALSE)
+ to_chat(user, "The collar is locked! You'll need unlock the collar before you can take it off!")
+ return
+ ..()
+
+/obj/item/clothing/neck/petcollar/locked/leather
+ name = "leather pet collar"
+ icon_state = "leathercollar"
+ item_color = "leathercollar"
+
+ hasprimary = TRUE
+ hassecondary = TRUE
+ primary_color = "#222222"
+ secondary_color = "#888888"
+
+/obj/item/clothing/neck/petcollar/locked/choker
+ name = "choker"
+ desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel."
+ icon_state = "choker"
+ item_color = "choker"
+
+ hasprimary = TRUE
+ primary_color = "#222222"
+
+/obj/item/key/collar
+ name = "Collar Key"
+ desc = "A key for a tiny lock on a collar or bag."
+
+/obj/item/clothing/neck/petcollar/Initialize()
+ . = ..()
+ new /obj/item/reagent_containers/food/snacks/cookie(src)
+
+/obj/item/clothing/neck/petcollar/locked/Initialize()
+ . = ..()
+ new /obj/item/key/collar(src)
+
//////////////
//DOPE BLING//
//////////////
@@ -191,4 +287,4 @@
desc = "Damn, it feels good to be a gangster."
icon = 'icons/obj/clothing/neck.dmi'
icon_state = "bling"
- item_color = "bling"
\ No newline at end of file
+ item_color = "bling"
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 02982998e1..c061d756b7 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -443,7 +443,6 @@
icon_state = "hardsuit0-medical"
item_state = "medical_helm"
item_color = "medical"
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flash_protect = 0
armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75)
scan_reagents = 1
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 750b172286..328141b752 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -709,3 +709,14 @@
reqs = list(/obj/item/tank/internals/oxygen/red = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = 30)//red oxygen tank so it looks right
category = CAT_MISC
tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER)
+
+/datum/crafting_recipe/goldenbox
+ name = "Gold Plated Toolbox"
+ result = /obj/item/storage/toolbox/gold_fake
+ reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/sheet/mineral/gold = 1,
+ /obj/item/stock_parts/cell = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index 75833fc086..72fef4335d 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -73,7 +73,7 @@
var/obj/machinery/atmospherics/components/unary/vent = pick(vents)
vents -= vent
- if(!vent)
+ if(!vent || vent.welded)
return
var/turf/T = get_turf(vent)
@@ -150,7 +150,7 @@
/datum/round_event/vent_clog/beer/start()
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
- if(vent && vent.loc)
+ if(vent && vent.loc && !vent.welded)
var/datum/reagents/R = new/datum/reagents(1000)
R.my_atom = vent
R.add_reagent("beer", reagentsAmount)
@@ -165,7 +165,7 @@
/datum/round_event/vent_clog/male/start()
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
- if(vent && vent.loc)
+ if(vent && vent.loc && !vent.welded)
var/datum/reagents/R = new/datum/reagents(1000)
R.my_atom = vent
R.add_reagent("semen", reagentsAmount)
@@ -180,7 +180,7 @@
/datum/round_event/vent_clog/female/start()
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
- if(vent && vent.loc)
+ if(vent && vent.loc && !vent.welded)
var/datum/reagents/R = new/datum/reagents(1000)
R.my_atom = vent
R.add_reagent("femcum", reagentsAmount)
@@ -195,7 +195,7 @@
/datum/round_event/vent_clog/plasma_decon/start()
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
- if(vent && vent.loc)
+ if(vent && vent.loc && !vent.welded)
var/datum/effect_system/smoke_spread/freezing/decon/smoke = new
smoke.set_up(7, get_turf(vent), 7)
smoke.start()
diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm
index 32b45e46f8..7ea875f152 100644
--- a/code/modules/events/wizard/race.dm
+++ b/code/modules/events/wizard/race.dm
@@ -5,6 +5,18 @@
max_occurrences = 5
earliest_start = 0 MINUTES
+/datum/round_event/wizard/race
+ var/list/stored_name
+ var/list/stored_species
+ var/list/stored_dna
+
+/datum/round_event/wizard/race/setup()
+ stored_name = list()
+ stored_species = list()
+ stored_dna = list()
+ endWhen = rand(600,1200) //10 to 20 minutes
+ ..()
+
/datum/round_event/wizard/race/start()
var/all_the_same = 0
@@ -12,18 +24,35 @@
for(var/speciestype in subtypesof(/datum/species))
var/datum/species/S = new speciestype()
- if(!S.dangerous_existence && !S.blacklisted)
+ if(!S.dangerous_existence && !S.blacklisted && !S.nojumpsuit) //Dangerous Species, Blacklisted Species, and Species who can't wear jumpsuits are blacklisted.
all_species += speciestype
var/datum/species/new_species = pick(all_species)
- if(prob(50))
+ if(prob(75))
all_the_same = 1
- for(var/mob/living/carbon/human/H in GLOB.carbon_list) //yes, even the dead
+ for(var/mob/living/carbon/human/H in GLOB.carbon_list)
+ var/turf/T = get_turf(H)
+ if(!T)
+ continue
+ if(!is_station_level(T.z))
+ continue
+ stored_name[H] = H.real_name
+ stored_species[H] = H.dna.species
+ stored_dna[H] = H.dna.unique_enzymes
H.set_species(new_species)
H.real_name = H.dna.species.random_name(H.gender,1)
H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
to_chat(H, "You feel somehow... different?")
if(!all_the_same)
new_species = pick(all_species)
+
+/datum/round_event/wizard/race/end()
+ for(var/mob/living/carbon/human/H in GLOB.carbon_list)
+ if(!(stored_name[H] && stored_species[H] && stored_dna[H]))
+ continue
+ H.set_species(stored_species[H])
+ H.real_name = stored_name[H]
+ H.dna.unique_enzymes = stored_dna[H]
+ to_chat(H, "You feel back to your normal self again.")
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
index 781b021d05..1eeea79410 100644
--- a/code/modules/food_and_drinks/food/snacks_cake.dm
+++ b/code/modules/food_and_drinks/food/snacks_cake.dm
@@ -54,7 +54,6 @@
tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
-
/obj/item/reagent_containers/food/snacks/store/cake/brain
name = "brain cake"
desc = "A squishy cake-thing."
@@ -86,7 +85,6 @@
tastes = list("cake" = 4, "cream cheese" = 3)
foodtype = GRAIN | DAIRY
-
/obj/item/reagent_containers/food/snacks/cakeslice/cheese
name = "cheese cake slice"
desc = "Slice of pure cheestisfaction."
@@ -95,7 +93,6 @@
tastes = list("cake" = 4, "cream cheese" = 3)
foodtype = GRAIN | DAIRY
-
/obj/item/reagent_containers/food/snacks/store/cake/orange
name = "orange cake"
desc = "A cake with added orange."
@@ -132,7 +129,6 @@
tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
/obj/item/reagent_containers/food/snacks/store/cake/lemon
name = "lemon cake"
desc = "A cake with added lemon."
@@ -143,7 +139,6 @@
tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2)
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
/obj/item/reagent_containers/food/snacks/cakeslice/lemon
name = "lemon cake slice"
desc = "Just a slice of cake, it is enough for everyone."
@@ -163,7 +158,6 @@
tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
-
/obj/item/reagent_containers/food/snacks/cakeslice/chocolate
name = "chocolate cake slice"
desc = "Just a slice of cake, it is enough for everyone."
@@ -172,7 +166,6 @@
tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
-
/obj/item/reagent_containers/food/snacks/store/cake/birthday
name = "birthday cake"
desc = "Happy Birthday little clown..."
@@ -250,5 +243,100 @@
icon_state = "pumpkinspicecakeslice"
filling_color = "#FFD700"
tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1)
-
foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/bsvc // blackberry strawberries vanilla cake
+ name = "blackberry and strawberry vanilla cake"
+ desc = "A plain cake, filled with assortment of blackberries and strawberries!"
+ icon = 'modular_citadel/icons/obj/food/cake.dmi'
+ icon_state = "blackbarry_strawberries_cake_vanilla_cake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bsvc
+ bonus_reagents = list("nutriment" = 14, "vitamin" = 4)
+ tastes = list("blackbarry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/bsvc
+ name = "blackberry and strawberry vanilla cake slice"
+ desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
+ icon = 'modular_citadel/icons/obj/food/cake.dmi'
+ icon_state = "blackbarry_strawberries_cake_vanilla_slice"
+ filling_color = "#FFD700"
+ tastes = list("blackbarry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2,"cake" = 3)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/bscc // blackbarry strawberries chocolate cake
+ name = "blackberry and strawberry chocolate cake"
+ desc = "A plain cake, filled with assortment of blackberries and strawberries!"
+ icon = 'modular_citadel/icons/obj/food/cake.dmi'
+ icon_state = "blackbarry_strawberries_cake_coco_cake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bscc
+ bonus_reagents = list("nutriment" = 14, "vitamin" = 4, "cocoa" = 5)
+ tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/bscc
+ name = "blackberry and strawberry chocolate cake slice"
+ desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
+ icon = 'modular_citadel/icons/obj/food/cake.dmi'
+ icon_state = "blackbarry_strawberries_cake_coco_cake_slice"
+ filling_color = "#FFD700"
+ tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+obj/item/reagent_containers/food/snacks/store/cake/holy_cake
+ name = "angel food cake"
+ desc = "A cake made for angels and chaplains alike! Contains holy water."
+ icon = 'modular_citadel/icons/obj/food/cake.dmi'
+ icon_state = "holy_cake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice
+ bonus_reagents = list("nutriment" = 1, "vitamin" = 3, "holy_water" = 10)
+ tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice
+ name = "angel food cake slice"
+ desc = "A slice of heavenly cake."
+ icon = 'modular_citadel/icons/obj/food/cake.dmi'
+ icon_state = "holy_cake_slice"
+ filling_color = "#00FFFF"
+ tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR
+
+obj/item/reagent_containers/food/snacks/store/cake/pound_cake
+ name = "pound cake"
+ desc = "A condensed cake made for filling people up quickly."
+ icon = 'modular_citadel/icons/obj/food/cake.dmi'
+ icon_state = "pound_cake"
+ slices_num = 7 //Its ment to feed the party
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice
+ bonus_reagents = list("nutriment" = 60)
+ tastes = list("cake" = 5, "sweetness" = 1, "batter" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD
+
+/obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice
+ name = "pound cake slice"
+ desc = "A slice of condensed cake made for filling people up quickly."
+ icon = 'modular_citadel/icons/obj/food/cake.dmi'
+ icon_state = "pound_cake_slice"
+ filling_color = "#00FFFF"
+ tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD
+
+obj/item/reagent_containers/food/snacks/store/cake/hardware_cake
+ name = "hardware cake"
+ desc = "A cake that is made with electronic boards and leaks acid..."
+ icon = 'modular_citadel/icons/obj/food/cake.dmi'
+ icon_state = "hardware_cake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice
+ bonus_reagents = list("sacid" = 15, "oil" = 15)
+ tastes = list("acid" = 1, "metal" = 1, "regret" = 10)
+ foodtype = GRAIN | GROSS
+
+/obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice
+ name = "hardware cake slice"
+ desc = "A slice of electronic boards and some acid."
+ icon = 'modular_citadel/icons/obj/food/cake.dmi'
+ icon_state = "hardware_cake_slice"
+ filling_color = "#00FFFF"
+ tastes = list("acid" = 1, "metal" = 1, "regret" = 10)
+ foodtype = GRAIN | GROSS
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index d3466caa5e..cf99bd78d9 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -54,6 +54,43 @@
tastes = list("fish" = 1, "chips" = 1)
foodtype = MEAT | VEGETABLES | FRIED
+/obj/item/reagent_containers/food/snacks/sushi_basic
+ name = "funa hosomaki"
+ desc = "A small cylindrical kudzu skin, filled with rice and fish."
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "sushie_basic"
+ bonus_reagents = list("vitamin" = 2)
+ list_reagents = list("nutriment" = 4)
+ bitesize = 10
+ filling_color = "#F2EEEA" //rgb(242, 238, 234)
+ tastes = list("fish" = 1, "rice" = 2, "salt" = 1)
+ foodtype = MEAT | VEGETABLES
+
+/obj/item/reagent_containers/food/snacks/sushi_adv
+ name = "funa nigiri"
+ desc = "A peace of carp lightly placed on some rice."
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "sushie_adv"
+ bonus_reagents = list("vitamin" = 2)
+ list_reagents = list("nutriment" = 6)
+ bitesize = 10
+ filling_color = "#F2EEEA" //rgb(242, 238, 234)
+ tastes = list("fish" = 2, "rice" = 2, "salt" = 1)
+ foodtype = MEAT | VEGETABLES
+
+/obj/item/reagent_containers/food/snacks/sushi_pro
+ name = "funa nigiri"
+ desc = "A well prepared peace of the best of the carp fillet placed on rice. Looks fancy and fresh!"
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "sushie_pro"
+ bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
+ list_reagents = list("nutriment" = 6, "vitamin" = 2)
+ bitesize = 10
+ filling_color = "#F2EEEA" //rgb(242, 238, 234)
+ tastes = list("fish" = 3, "rice" = 2, "salt" = 1)
+ foodtype = MEAT | VEGETABLES
+
+
////////////////////////////////////////////MEATS AND ALIKE////////////////////////////////////////////
/obj/item/reagent_containers/food/snacks/tofu
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index af7a8c06f4..5213cc96e1 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -207,6 +207,16 @@
tastes = list("cobwebs" = 1, "sugar" = 2)
foodtype = JUNKFOOD | SUGAR
+/obj/item/reagent_containers/food/snacks/tobiko
+ name = "tobiko"
+ desc = "Spider eggs wrapped in a thin salted Kudzu pod"
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "sushie_egg"
+ list_reagents = list("nutriment" = 6, "vitamin" = 2)
+ filling_color = "#FF3333" // R225 G051 B051
+ tastes = list("seaweed" = 1, "cobwebs" = 1, "salty" = 2)
+ foodtype = MEAT | VEGETABLES
+
/obj/item/reagent_containers/food/snacks/chococoin
name = "chocolate coin"
desc = "A completely edible but nonflippable festive coin."
@@ -569,3 +579,12 @@
filling_color = "#A0522D"
tastes = list("chocolate" = 1)
foodtype = JUNKFOOD | SUGAR
+
+/obj/item/reagent_containers/food/snacks/riceball
+ name = "onigiri"
+ desc = "A ball of rice with some light salt and a wrap of Kudzu skin."
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "riceball"
+ list_reagents = list("nutriment" = 6, "sodiumchloride" = 2)
+ tastes = list("rice" = 3, "salt" = 1)
+ foodtype = GRAIN
diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
index 747f5f7d35..88f8848315 100644
--- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
+++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
@@ -102,3 +102,13 @@
list_reagents = list("nutriment" = 2, "vitamin" = 2)
tastes = list("bread" = 2)
foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/tuna_sandwich
+ name = "tuna sandwich"
+ desc = "Both a salad and a sandwich in one."
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "tunasandwich"
+ trash = /obj/item/trash/plate
+ bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
+ tastes = list("tuna" = 4, "mayonnaise" = 2, "bread" = 2)
+ foodtype = GRAIN | MEAT
diff --git a/code/modules/food_and_drinks/food/snacks_sushi.dm b/code/modules/food_and_drinks/food/snacks_sushi.dm
new file mode 100644
index 0000000000..a4cbc5e344
--- /dev/null
+++ b/code/modules/food_and_drinks/food/snacks_sushi.dm
@@ -0,0 +1,95 @@
+//////////////////////////Sushi Components///////////////////////
+
+/obj/item/reagent_containers/food/snacks/sushi_rice
+ name = "Sushi Rice"
+ desc = "A bowl of sticky rice for making sushi."
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "sushi_rice"
+ list_reagents = list("sodiumchloride" = 5)
+ tastes = list("rice" = 5, "salt" = 1)
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/sea_weed
+ name = "Sea Weed Sheet"
+ desc = "A thin, light salt sheet of plant mater. This is commenly used in sushi recipes,"
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "sea_weed"
+ list_reagents = list("sodiumchloride" = 2)
+ tastes = list("plants" = 2, "salt" = 1)
+ foodtype = VEGETABLES
+
+/obj/item/reagent_containers/food/snacks/tuna
+ name = "Canned Tuna"
+ desc = "A small can of tuna fish beloved by felines."
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "tuna_can"
+//trash = /obj/item/trash/tuna_used //I dont know if I like this idea - A Masked Cat
+ list_reagents = list("sodiumchloride" = 5, "mercury" = 2)
+ tastes = list("tuna" = 15, "mercury" = 1, "salt" = 3)
+ foodtype = MEAT
+
+//////////////////////////Sushi/////////////////////////////////
+/obj/item/reagent_containers/food/snacks/sushie_basic
+ name = "Funa Hosomaki"
+ desc = "A small cylindrical filled with rice and fish."
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "sushie_basic"
+ bonus_reagents = list("vitamin" = 2)
+ list_reagents = list("nutriment" = 1)
+ bitesize = 1
+ filling_color = "#F2EEEA" //rgb(242, 238, 234)
+ tastes = list("fish" = 1, "rice" = 1, "salt" = 1)
+ foodtype = MEAT | VEGETABLES
+
+/obj/item/reagent_containers/food/snacks/sushie_adv
+ name = "Funa Nigiri"
+ desc = "A pice of carp lightly placed on some rice."
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "sushie_adv"
+ bonus_reagents = list("vitamin" = 2)
+ list_reagents = list("nutriment" = 2)
+ bitesize = 1
+ filling_color = "#F2EEEA" //rgb(242, 238, 234)
+ tastes = list("fish" = 1, "rice" = 1, "salt" = 1)
+ foodtype = MEAT | VEGETABLES
+
+/obj/item/reagent_containers/food/snacks/sushie_pro
+ name = "Funa Nigiri"
+ desc = "A well prepared pice of the best of the carp fillet placed on rice. Looks fancy and fresh!"
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "sushie_pro"
+ bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
+ list_reagents = list("nutriment" = 8, "vitamin" = 1)
+ bitesize = 1
+ filling_color = "#F2EEEA" //rgb(242, 238, 234)
+ tastes = list("fish" = 1, "rice" = 1, "salt" = 1)
+ foodtype = MEAT | VEGETABLES
+
+/obj/item/reagent_containers/food/snacks/tobiko
+ name = "Tobiko"
+ desc = "Spider eggs wrapped in a thin salted Kudzu pod"
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "sushie_egg"
+ list_reagents = list("nutriment" = 3, "vitamin" = 2)
+ filling_color = "#FF3333" // R225 G051 B051
+ tastes = list("seaweed" = 1, "salty" = 2)
+ foodtype = MEAT | VEGETABLES
+
+/obj/item/reagent_containers/food/snacks/riceball
+ name = "Onigiri"
+ desc = "A ball of rice with some light salt and a wrap of Kudzu skin."
+ icon = 'modular_citadel/icons/obj/food/food.dmi'
+ icon_state = "riceball"
+ list_reagents = list("nutriment" = 5, "sodiumchloride" = 2)
+ tastes = list("rice" = 4, "salt" = 1)
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/sashimi
+ name = "carp sashimi"
+ desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself."
+ icon_state = "sashimi"
+ bonus_reagents = list("nutriment" = 1, "capsaicin" = 4, "vitamin" = 4)
+ list_reagents = list("nutriment" = 6, "capsaicin" = 5)
+ filling_color = "#FA8072"
+ tastes = list("fish" = 1, "hot peppers" = 1)
+ foodtype = MEAT | TOXIC
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
index 01c13abf47..464b8ce26f 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
@@ -102,6 +102,52 @@
result = /obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice
subcategory = CAT_CAKE
+/datum/crafting_recipe/food/holycake
+ name = "Angel food cake"
+ reqs = list(
+ /datum/reagent/water/holywater = 15,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/holy_cake
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/poundcake
+ name = "Pound cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 4
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/pound_cake
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/hardwarecake
+ name = "Hardware cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/circuitboard = 2,
+ /datum/reagent/toxin/acid = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/hardware_cake
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/bscccake
+ name = "blackberry and strawberry chocolate cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 2,
+ /obj/item/reagent_containers/food/snacks/grown/berries = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/bscc
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/bscvcake
+ name = "blackberry and strawberry vanilla cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/berries = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/bsvc
+ subcategory = CAT_CAKE
+
/datum/crafting_recipe/food/cak
name = "Living cat/cake hybrid"
reqs = list(
@@ -114,4 +160,4 @@
/datum/reagent/teslium = 1 //To shock the whole thing into life
)
result = /mob/living/simple_animal/pet/cat/cak
- subcategory = CAT_CAKE //Cat! Haha, get it? CAT? GET IT???
+ subcategory = CAT_CAKE //Cat! Haha, get it? CAT? GET IT? We get it - Love Catpeople
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
index b33d6a520b..c16c7268b9 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
@@ -1,5 +1,3 @@
-
-
////////////////////////////////////////////////KEBABS////////////////////////////////////////////////
/datum/crafting_recipe/food/humankebab
@@ -71,16 +69,6 @@
result = /obj/item/reagent_containers/food/snacks/fishfingers
subcategory = CAT_MEAT
-/datum/crafting_recipe/food/sashimi
- name = "Sashimi"
- reqs = list(
- /datum/reagent/consumable/soysauce = 5,
- /obj/item/reagent_containers/food/snacks/spidereggs = 1,
- /obj/item/reagent_containers/food/snacks/carpmeat = 1
- )
- result = /obj/item/reagent_containers/food/snacks/sashimi
- subcategory = CAT_MEAT
-
////////////////////////////////////////////////MR SPIDER////////////////////////////////////////////////
/datum/crafting_recipe/food/spidereggsham
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index 3925416560..3dd27ddd01 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -345,3 +345,13 @@
)
result = /obj/item/reagent_containers/food/snacks/salad/ricepudding
subcategory = CAT_MISCFOOD
+
+/datum/crafting_recipe/food/riceball
+ name = "Onigiri"
+ reqs = list(
+ /datum/reagent/consumable/soysauce = 1,
+ /obj/item/reagent_containers/food/snacks/grown/kudzupod = 1,
+ /obj/item/reagent_containers/food/snacks/salad/boiledrice = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/riceball
+ subcategory = CAT_MISCFOOD
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
index 9750e91930..a2e83a09b4 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -62,5 +62,13 @@
result = /obj/item/reagent_containers/food/snacks/notasandwich
subcategory = CAT_SANDWICH
-
-
+/datum/crafting_recipe/food/notasandwich
+ name = "Tuna sandwich"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ /obj/item/reagent_containers/food/snacks/tuna = 1,
+ /obj/item/reagent_containers/food/snacks/grown/onion = 1,
+ /obj/item/reagent_containers/food/condiment/mayonnaise = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/tuna_sandwich
+ subcategory = CAT_SANDWICH
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm
new file mode 100644
index 0000000000..99d48cf69d
--- /dev/null
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm
@@ -0,0 +1,94 @@
+//////////////////////////Sushi Components///////////////////////
+
+/datum/crafting_recipe/food/sushi_rice
+ name = "Sushi Rice"
+ reqs = list(
+ /datum/reagent/water = 40,
+ /datum/reagent/consumable/rice = 10
+ )
+ result = /obj/item/reagent_containers/food/snacks/sushi_rice
+ subcategory = CAT_SUSHI
+
+/datum/crafting_recipe/food/sea_weed
+ name = "Sea Weed Sheet"
+ reqs = list(
+ /datum/reagent/water = 30,
+ /datum/reagent/consumable/soysauce = 5,
+ /obj/item/reagent_containers/food/snacks/grown/kudzupod = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/sea_weed
+ subcategory = CAT_SUSHI
+
+/datum/crafting_recipe/food/tuna_can
+ name = "Can of Tuna"
+ reqs = list(
+ /datum/reagent/consumable/sodiumchloride = 15,
+ /datum/reagent/consumable/cooking_oil = 5,
+ /obj/item/reagent_containers/food/snacks/carpmeat = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/tuna
+ subcategory = CAT_SUSHI
+
+//////////////////////////Sushi/////////////////////////////////
+
+/datum/crafting_recipe/food/sashimi
+ name = "Sashimi"
+ reqs = list(
+ /datum/reagent/consumable/soysauce = 5,
+ /obj/item/reagent_containers/food/snacks/spidereggs = 1,
+ /obj/item/reagent_containers/food/snacks/carpmeat = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/sashimi
+ subcategory = CAT_SUSHI
+
+/datum/crafting_recipe/food/riceball
+ name = "Onigiri"
+ reqs = list(
+ /datum/reagent/consumable/soysauce = 1,
+ /obj/item/reagent_containers/food/snacks/sea_weed = 1,
+ /obj/item/reagent_containers/food/snacks/sushi_rice = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/riceball
+ subcategory = CAT_SUSHI
+
+/datum/crafting_recipe/food/sushie_egg
+ name = "Tobiko"
+ reqs = list(
+ /datum/reagent/consumable/soysauce = 6,
+ /obj/item/reagent_containers/food/snacks/spidereggs = 1,
+ /obj/item/reagent_containers/food/snacks/sea_weed = 2,
+ )
+ result = /obj/item/reagent_containers/food/snacks/tobiko
+ subcategory = CAT_SUSHI
+
+/datum/crafting_recipe/food/sushie_basic
+ name = "Funa Hosomaki"
+ reqs = list(
+ /datum/reagent/consumable/soysauce = 3,
+ /obj/item/reagent_containers/food/snacks/sushi_rice = 1,
+ /obj/item/reagent_containers/food/snacks/carpmeat = 2,
+ /obj/item/reagent_containers/food/snacks/sea_weed = 3,
+ )
+ result = /obj/item/reagent_containers/food/snacks/sushie_basic
+ subcategory = CAT_SUSHI
+
+/datum/crafting_recipe/food/sushie_adv
+ name = "Funa Nigiri"
+ reqs = list(
+ /datum/reagent/consumable/soysauce = 5,
+ /obj/item/reagent_containers/food/snacks/sushi_rice = 1,
+ /obj/item/reagent_containers/food/snacks/carpmeat = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/sushie_adv
+ subcategory = CAT_SUSHI
+
+/datum/crafting_recipe/food/sushie_pro
+ name = "Well made Funa Nigiri"
+ reqs = list(
+ /datum/reagent/consumable/soysauce = 10,
+ /obj/item/reagent_containers/food/snacks/sushi_rice = 2,
+ /obj/item/reagent_containers/food/snacks/carpmeat = 5,
+ /obj/item/reagent_containers/food/snacks/sea_weed = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/sushie_pro
+ subcategory = CAT_SUSHI
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index e1eb976966..eaffeaf016 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -304,6 +304,8 @@
else if(href_list["create"])
var/amount = (text2num(href_list["amount"]))
+ //Can't be outside these (if you change this keep a sane limit)
+ amount = CLAMP(amount, 1, 50)
var/datum/design/D = locate(href_list["create"])
create_product(D, amount)
updateUsrDialog()
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 1a4bb1fb1b..3862967363 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -643,6 +643,11 @@
icon_state = "setup_small_pda"
desc = "It's a case, for building small electronics with. This one resembles a PDA."
+/obj/item/electronic_assembly/dildo
+ name = "type-g electronic assembly"
+ icon_state = "setup_dildo_medium"
+ desc = "It's a case, for building small electronics with. This one has a phallic design."
+
/obj/item/electronic_assembly/small
name = "electronic device"
icon_state = "setup_device"
@@ -674,6 +679,11 @@
icon_state = "setup_device_box"
desc = "It's a case, for building tiny-sized electronics with. This one has a boxy design."
+/obj/item/electronic_assembly/small/dildo
+ name = "type-f electronic device"
+ icon_state = "setup_dildo_small"
+ desc = "It's a case, for building tiny-sized electronics with. This one has a phallic design."
+
/obj/item/electronic_assembly/medium
name = "electronic mechanism"
icon_state = "setup_medium"
@@ -714,6 +724,12 @@
icon_state = "setup_medium_radio"
desc = "It's a case, for building medium-sized electronics with. This one resembles an old radio."
+/obj/item/electronic_assembly/medium/dildo
+ name = "type-g electronic mechanism"
+ icon_state = "setup_dildo_large"
+ desc = "It's a case, for building medium-sized electronics with. This one has a phallic design."
+
+
/obj/item/electronic_assembly/large
name = "electronic machine"
icon_state = "setup_large"
diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm
index 33f7ef96ad..52739c7940 100644
--- a/code/modules/integrated_electronics/core/detailer.dm
+++ b/code/modules/integrated_electronics/core/detailer.dm
@@ -25,7 +25,9 @@
"green" = COLOR_ASSEMBLY_GREEN,
"light blue" = COLOR_ASSEMBLY_LBLUE,
"blue" = COLOR_ASSEMBLY_BLUE,
- "purple" = COLOR_ASSEMBLY_PURPLE
+ "purple" = COLOR_ASSEMBLY_PURPLE,
+ "pink" = COLOR_ASSEMBLY_PINK,
+ "custom" = COLOR_ASSEMBLY_WHITE
)
/obj/item/integrated_electronics/detailer/Initialize()
@@ -43,6 +45,9 @@
if(!color_list[color_choice])
return
if(!in_range(src, user))
- return
- detail_color = color_list[color_choice]
+ return
+ if(color_choice == "custom")
+ detail_color = input(user,"","Choose Color",detail_color) as color|null
+ else
+ detail_color = color_list[color_choice]
update_icon()
diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm
index c187f49473..682e76a46e 100644
--- a/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -1,139 +1,6 @@
/obj/item/integrated_circuit/manipulation
category_text = "Manipulation"
-/obj/item/integrated_circuit/manipulation/weapon_firing
- name = "weapon firing mechanism"
- desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
- extended_desc = "The firing mechanism can slot in any energy weapon. \
- The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \
- The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \
- lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \
- hand, you will need to use an assembly that is a gun."
- complexity = 20
- w_class = WEIGHT_CLASS_SMALL
- size = 3
- inputs = list(
- "target X rel" = IC_PINTYPE_NUMBER,
- "target Y rel" = IC_PINTYPE_NUMBER,
- "mode" = IC_PINTYPE_BOOLEAN
- )
- outputs = list("reference to gun" = IC_PINTYPE_REF)
- activators = list(
- "fire" = IC_PINTYPE_PULSE_IN
-
- )
- var/obj/item/gun/energy/installed_gun = null
- spawn_flags = IC_SPAWN_RESEARCH
- action_flags = IC_ACTION_COMBAT
- power_draw_per_use = 0
- ext_cooldown = 1
- var/mode = FALSE
-
- var/stun_projectile = null //stun mode projectile type
- var/stun_projectile_sound
- var/lethal_projectile = null //lethal mode projectile type
- var/lethal_projectile_sound
-
- demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
-
-
-
-/obj/item/integrated_circuit/manipulation/weapon_firing/Destroy()
- qdel(installed_gun)
- return ..()
-
-/obj/item/integrated_circuit/manipulation/weapon_firing/attackby(var/obj/O, var/mob/user)
- if(istype(O, /obj/item/gun/energy))
- var/obj/item/gun/gun = O
- if(installed_gun)
- to_chat(user, "There's already a weapon installed.")
- return
- user.transferItemToLoc(gun,src)
- installed_gun = gun
- var/list/gun_properties = gun.get_turret_properties()
- to_chat(user, "You slide \the [gun] into the firing mechanism.")
- playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
- stun_projectile = gun_properties["stun_projectile"]
- stun_projectile_sound = gun_properties["stun_projectile_sound"]
- lethal_projectile = gun_properties["lethal_projectile"]
- lethal_projectile_sound = gun_properties["lethal_projectile_sound"]
- if(gun_properties["shot_delay"])
- cooldown_per_use = gun_properties["shot_delay"]*10
- if(cooldown_per_use<30)
- cooldown_per_use = 30
- if(gun_properties["reqpower"])
- power_draw_per_use = gun_properties["reqpower"]
- set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
- push_data()
- else
- ..()
-
-/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(var/mob/user)
- if(installed_gun)
- installed_gun.forceMove(drop_location())
- to_chat(user, "You slide \the [installed_gun] out of the firing mechanism.")
- size = initial(size)
- playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
- installed_gun = null
- set_pin_data(IC_OUTPUT, 1, WEAKREF(null))
- push_data()
- else
- to_chat(user, "There's no weapon to remove from the mechanism.")
-
-/obj/item/integrated_circuit/manipulation/weapon_firing/do_work()
- if(!installed_gun || !installed_gun.handle_pins())
- return
- if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc)))
- return
- set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
- push_data()
- var/datum/integrated_io/xo = inputs[1]
- var/datum/integrated_io/yo = inputs[2]
- var/datum/integrated_io/mode1 = inputs[3]
-
- mode = mode1.data
- if(assembly)
- if(isnum(xo.data))
- xo.data = round(xo.data, 1)
- if(isnum(yo.data))
- yo.data = round(yo.data, 1)
-
- var/turf/T = get_turf(assembly)
- var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
- var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
-
- assembly.visible_message("[assembly] fires [installed_gun]!")
- shootAt(locate(target_x, target_y, T.z))
-
-/obj/item/integrated_circuit/manipulation/weapon_firing/proc/shootAt(turf/target)
- var/turf/T = get_turf(src)
- var/turf/U = target
- if(!istype(T) || !istype(U))
- return
- if(!installed_gun.cell)
- return
- if(!installed_gun.cell.charge)
- return
- var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1]
- if(installed_gun.cell.charge < shot.e_cost)
- return
- if(!shot)
- return
- update_icon()
- var/obj/item/projectile/A
- if(!mode)
- A = new stun_projectile(T)
- playsound(loc, stun_projectile_sound, 75, 1)
- else
- A = new lethal_projectile(T)
- playsound(loc, lethal_projectile_sound, 75, 1)
- installed_gun.cell.use(shot.e_cost)
- //Shooting Code:
- A.preparePixelProjectile(target, src)
- A.fire()
- log_attack("[assembly] [REF(assembly)] has fired [installed_gun].")
- return A
-
/obj/item/integrated_circuit/manipulation/locomotion
name = "locomotion circuit"
desc = "This allows a machine to move in a given direction."
@@ -171,80 +38,6 @@
return FALSE
return FALSE
-/obj/item/integrated_circuit/manipulation/grenade
- name = "grenade primer"
- desc = "This circuit comes with the ability to attach most types of grenades and prime them at will."
- extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \
- If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \
- Beware: Once primed, there is no aborting the process!"
- icon_state = "grenade"
- complexity = 30
- cooldown_per_use = 10
- inputs = list("detonation time" = IC_PINTYPE_NUMBER)
- outputs = list()
- activators = list("prime grenade" = IC_PINTYPE_PULSE_IN)
- spawn_flags = IC_SPAWN_RESEARCH
- action_flags = IC_ACTION_COMBAT
- var/obj/item/grenade/attached_grenade
- var/pre_attached_grenade_type
- demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
-
-/obj/item/integrated_circuit/manipulation/grenade/Initialize()
- . = ..()
- if(pre_attached_grenade_type)
- var/grenade = new pre_attached_grenade_type(src)
- attach_grenade(grenade)
-
-/obj/item/integrated_circuit/manipulation/grenade/Destroy()
- if(attached_grenade && !attached_grenade.active)
- attached_grenade.forceMove(loc)
- detach_grenade()
- return ..()
-
-/obj/item/integrated_circuit/manipulation/grenade/attackby(var/obj/item/grenade/G, var/mob/user)
- if(istype(G))
- if(attached_grenade)
- to_chat(user, "There is already a grenade attached!")
- else if(user.transferItemToLoc(G,src))
- user.visible_message("\The [user] attaches \a [G] to \the [src]!", "You attach \the [G] to \the [src].")
- attach_grenade(G)
- G.forceMove(src)
- else
- return ..()
-
-/obj/item/integrated_circuit/manipulation/grenade/attack_self(var/mob/user)
- if(attached_grenade)
- user.visible_message("\The [user] removes \an [attached_grenade] from \the [src]!", "You remove \the [attached_grenade] from \the [src].")
- user.put_in_hands(attached_grenade)
- detach_grenade()
- else
- return ..()
-
-/obj/item/integrated_circuit/manipulation/grenade/do_work()
- if(attached_grenade && !attached_grenade.active)
- var/datum/integrated_io/detonation_time = inputs[1]
- var/dt
- if(isnum(detonation_time.data) && detonation_time.data > 0)
- dt = CLAMP(detonation_time.data, 1, 12)*10
- else
- dt = 15
- addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt)
- var/atom/holder = loc
- message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]")
-
-// These procs do not relocate the grenade, that's the callers responsibility
-/obj/item/integrated_circuit/manipulation/grenade/proc/attach_grenade(var/obj/item/grenade/G)
- attached_grenade = G
- G.forceMove(src)
- desc += " \An [attached_grenade] is attached to it!"
-
-/obj/item/integrated_circuit/manipulation/grenade/proc/detach_grenade()
- if(!attached_grenade)
- return
- attached_grenade.forceMove(drop_location())
- attached_grenade = null
- desc = initial(desc)
-
/obj/item/integrated_circuit/manipulation/plant_module
name = "plant manipulation module"
desc = "Used to uproot weeds and harvest/plant trays."
@@ -478,7 +271,7 @@
/obj/item/integrated_circuit/manipulation/thrower
name = "thrower"
- desc = "A compact launcher to throw things from inside or nearby tiles."
+ desc = "A compact launcher to throw things from inside or nearby tiles at a low enough velocity not to harm someone."
extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \
The 'fire' activator will cause the mechanism to attempt to throw objects at the coordinates, if possible. Note that the \
projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \
@@ -544,7 +337,7 @@
A.embedding = list("embed_chance" = 0)
//throw it
assembly.visible_message("[assembly] has thrown [A]!")
- log_attack("[assembly] [REF(assembly)] has thrown [A].")
+ log_attack("[assembly] [REF(assembly)] has thrown [A] with non-lethal force.")
A.forceMove(drop_location())
A.throw_at(locate(x_abs, y_abs, T.z), range, 3, , , , CALLBACK(src, .proc/post_throw, A))
@@ -813,4 +606,7 @@
set_pin_data(IC_OUTPUT, 1, assembly.detail_color)
push_data()
- activate_pin(3)
\ No newline at end of file
+ activate_pin(3)
+
+
+
diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm
index 0d8bf96afc..fb8fce10b2 100644
--- a/code/modules/integrated_electronics/subtypes/reagents.dm
+++ b/code/modules/integrated_electronics/subtypes/reagents.dm
@@ -548,9 +548,12 @@
desc = "Unlike most electronics, creating smoke is completely intentional."
icon_state = "smoke"
extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \
- into the smoke clouds when activated. The reagents are consumed when the smoke is made."
+ into the smoke clouds when activated. The reagents are consumed when the smoke is made. Requires at least 10 units of reagents to generate smoke."
ext_cooldown = 1
+
volume = 100
+ container_type = OPENCONTAINER
+
complexity = 20
cooldown_per_use = 1 SECONDS
inputs = list()
@@ -573,6 +576,7 @@
if(changetype == ADD_REAGENT)
notified = FALSE
push_vol()
+
/obj/item/integrated_circuit/reagent/smoke/do_work(ord)
switch(ord)
if(1)
@@ -598,9 +602,10 @@
name = "integrated extinguisher"
desc = "This circuit sprays any of its contents out like an extinguisher."
icon_state = "injector"
- extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher."
+ extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher. Requires at least 10 units of reagents to work."
volume = 30
+ container_type = OPENCONTAINER
complexity = 20
cooldown_per_use = 6 SECONDS
@@ -631,7 +636,7 @@
/obj/item/integrated_circuit/reagent/extinguisher/do_work()
//Check if enough volume
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
- if(!reagents || reagents.total_volume < 5 || busy)
+ if(!reagents || reagents.total_volume < IC_SMOKE_REAGENTS_MINIMUM_UNITS || busy)
push_data()
activate_pin(3)
return
diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm
new file mode 100644
index 0000000000..f9259359a3
--- /dev/null
+++ b/code/modules/integrated_electronics/subtypes/weaponized.dm
@@ -0,0 +1,343 @@
+/obj/item/integrated_circuit/weaponized
+ category_text = "Weaponized"
+
+/obj/item/integrated_circuit/weaponized/weapon_firing
+ name = "weapon firing mechanism"
+ desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
+ extended_desc = "The firing mechanism can slot in any energy weapon. \
+ The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \
+ The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \
+ lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \
+ hand, you will need to use an assembly that is a gun."
+ complexity = 20
+ w_class = WEIGHT_CLASS_SMALL
+ size = 3
+ inputs = list(
+ "target X rel" = IC_PINTYPE_NUMBER,
+ "target Y rel" = IC_PINTYPE_NUMBER,
+ "mode" = IC_PINTYPE_BOOLEAN
+ )
+ outputs = list("reference to gun" = IC_PINTYPE_REF)
+ activators = list(
+ "fire" = IC_PINTYPE_PULSE_IN
+
+ )
+ var/obj/item/gun/energy/installed_gun = null
+ spawn_flags = IC_SPAWN_RESEARCH
+ action_flags = IC_ACTION_COMBAT
+ power_draw_per_use = 0
+ ext_cooldown = 1
+ var/mode = FALSE
+
+ var/stun_projectile = null //stun mode projectile type
+ var/stun_projectile_sound
+ var/lethal_projectile = null //lethal mode projectile type
+ var/lethal_projectile_sound
+
+ demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
+
+
+
+/obj/item/integrated_circuit/weaponized/weapon_firing/Destroy()
+ qdel(installed_gun)
+ return ..()
+
+/obj/item/integrated_circuit/weaponized/weapon_firing/attackby(var/obj/O, var/mob/user)
+ if(istype(O, /obj/item/gun/energy))
+ var/obj/item/gun/gun = O
+ if(installed_gun)
+ to_chat(user, "There's already a weapon installed.")
+ return
+ user.transferItemToLoc(gun,src)
+ installed_gun = gun
+ var/list/gun_properties = gun.get_turret_properties()
+ to_chat(user, "You slide \the [gun] into the firing mechanism.")
+ playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
+ stun_projectile = gun_properties["stun_projectile"]
+ stun_projectile_sound = gun_properties["stun_projectile_sound"]
+ lethal_projectile = gun_properties["lethal_projectile"]
+ lethal_projectile_sound = gun_properties["lethal_projectile_sound"]
+ if(gun_properties["shot_delay"])
+ cooldown_per_use = gun_properties["shot_delay"]*10
+ if(cooldown_per_use<30)
+ cooldown_per_use = 30
+ if(gun_properties["reqpower"])
+ power_draw_per_use = gun_properties["reqpower"]
+ set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
+ push_data()
+ else
+ ..()
+
+/obj/item/integrated_circuit/weaponized/weapon_firing/attack_self(var/mob/user)
+ if(installed_gun)
+ installed_gun.forceMove(drop_location())
+ to_chat(user, "You slide \the [installed_gun] out of the firing mechanism.")
+ size = initial(size)
+ playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
+ installed_gun = null
+ set_pin_data(IC_OUTPUT, 1, WEAKREF(null))
+ push_data()
+ else
+ to_chat(user, "There's no weapon to remove from the mechanism.")
+
+/obj/item/integrated_circuit/weaponized/weapon_firing/do_work()
+ if(!installed_gun || !installed_gun.handle_pins())
+ return
+ if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc)))
+ return
+ set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
+ push_data()
+ var/datum/integrated_io/xo = inputs[1]
+ var/datum/integrated_io/yo = inputs[2]
+ var/datum/integrated_io/mode1 = inputs[3]
+
+ mode = mode1.data
+ if(assembly)
+ if(isnum(xo.data))
+ xo.data = round(xo.data, 1)
+ if(isnum(yo.data))
+ yo.data = round(yo.data, 1)
+
+ var/turf/T = get_turf(assembly)
+ var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
+ var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
+
+ assembly.visible_message("[assembly] fires [installed_gun]!")
+ shootAt(locate(target_x, target_y, T.z))
+
+/obj/item/integrated_circuit/weaponized/weapon_firing/proc/shootAt(turf/target)
+ var/turf/T = get_turf(src)
+ var/turf/U = target
+ if(!istype(T) || !istype(U))
+ return
+ if(!installed_gun.cell)
+ return
+ if(!installed_gun.cell.charge)
+ return
+ var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1]
+ if(installed_gun.cell.charge < shot.e_cost)
+ return
+ if(!shot)
+ return
+ update_icon()
+ var/obj/item/projectile/A
+ if(!mode)
+ A = new stun_projectile(T)
+ playsound(loc, stun_projectile_sound, 75, 1)
+ else
+ A = new lethal_projectile(T)
+ playsound(loc, lethal_projectile_sound, 75, 1)
+ installed_gun.cell.use(shot.e_cost)
+ //Shooting Code:
+ A.preparePixelProjectile(target, src)
+ A.fire()
+ log_attack("[assembly] [REF(assembly)] has fired [installed_gun].")
+ return A
+
+/obj/item/integrated_circuit/weaponized/grenade
+ name = "grenade primer"
+ desc = "This circuit comes with the ability to attach most types of grenades and prime them at will."
+ extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \
+ If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \
+ Beware: Once primed, there is no aborting the process!"
+ icon_state = "grenade"
+ complexity = 30
+ cooldown_per_use = 10
+ inputs = list("detonation time" = IC_PINTYPE_NUMBER)
+ outputs = list()
+ activators = list("prime grenade" = IC_PINTYPE_PULSE_IN)
+ spawn_flags = IC_SPAWN_RESEARCH
+ action_flags = IC_ACTION_COMBAT
+ var/obj/item/grenade/attached_grenade
+ var/pre_attached_grenade_type
+ demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
+
+/obj/item/integrated_circuit/weaponized/grenade/Initialize()
+ . = ..()
+ if(pre_attached_grenade_type)
+ var/grenade = new pre_attached_grenade_type(src)
+ attach_grenade(grenade)
+
+/obj/item/integrated_circuit/weaponized/grenade/Destroy()
+ if(attached_grenade && !attached_grenade.active)
+ attached_grenade.forceMove(loc)
+ detach_grenade()
+ return ..()
+
+/obj/item/integrated_circuit/weaponized/grenade/attackby(var/obj/item/grenade/G, var/mob/user)
+ if(istype(G))
+ if(attached_grenade)
+ to_chat(user, "There is already a grenade attached!")
+ else if(user.transferItemToLoc(G,src))
+ user.visible_message("\The [user] attaches \a [G] to \the [src]!", "You attach \the [G] to \the [src].")
+ attach_grenade(G)
+ G.forceMove(src)
+ else
+ return ..()
+
+/obj/item/integrated_circuit/weaponized/grenade/attack_self(var/mob/user)
+ if(attached_grenade)
+ user.visible_message("\The [user] removes \an [attached_grenade] from \the [src]!", "You remove \the [attached_grenade] from \the [src].")
+ user.put_in_hands(attached_grenade)
+ detach_grenade()
+ else
+ return ..()
+
+/obj/item/integrated_circuit/weaponized/grenade/do_work()
+ if(attached_grenade && !attached_grenade.active)
+ var/datum/integrated_io/detonation_time = inputs[1]
+ var/dt
+ if(isnum(detonation_time.data) && detonation_time.data > 0)
+ dt = CLAMP(detonation_time.data, 1, 12)*10
+ else
+ dt = 15
+ addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt)
+ var/atom/holder = loc
+ message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]")
+
+// These procs do not relocate the grenade, that's the callers responsibility
+/obj/item/integrated_circuit/weaponized/grenade/proc/attach_grenade(var/obj/item/grenade/G)
+ attached_grenade = G
+ G.forceMove(src)
+ desc += " \An [attached_grenade] is attached to it!"
+
+/obj/item/integrated_circuit/weaponized/grenade/proc/detach_grenade()
+ if(!attached_grenade)
+ return
+ attached_grenade.forceMove(drop_location())
+ attached_grenade = null
+ desc = initial(desc)
+
+/obj/item/integrated_circuit/weaponized/air_cannon
+ name = "pneumatic cannon"
+ desc = "A compact pneumatic cannon to throw things from inside or nearby tiles at a high enough velocity to cause damage. Requires air from a canister to fire."
+ extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \
+ The 'fire' activator will cause the mechanism to attempt to launch objects at the coordinates, if possible. Note that the \
+ projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \
+ must also be a gun if you wish to launch something while the assembly is in hand."
+ complexity = 75
+ w_class = WEIGHT_CLASS_SMALL
+ size = 4
+ cooldown_per_use = 30
+ ext_cooldown = 15
+ inputs = list(
+ "target X rel" = IC_PINTYPE_NUMBER,
+ "target Y rel" = IC_PINTYPE_NUMBER,
+ "projectile" = IC_PINTYPE_REF,
+ "canister" = IC_PINTYPE_REF
+ )
+ outputs = list()
+ activators = list(
+ "fire" = IC_PINTYPE_PULSE_IN
+ )
+ spawn_flags = IC_SPAWN_RESEARCH
+ action_flags = IC_ACTION_COMBAT
+ power_draw_per_use = 50
+ var/gas_per_throw = 6
+
+/obj/item/integrated_circuit/weaponized/air_cannon/do_work()
+
+ var/max_w_class = assembly.w_class
+ var/target_x_rel = round(get_pin_data(IC_INPUT, 1))
+ var/target_y_rel = round(get_pin_data(IC_INPUT, 2))
+ var/obj/item/A = get_pin_data_as_type(IC_INPUT, 3, /obj/item)
+ var/obj/item/integrated_circuit/atmospherics/AT = get_pin_data_as_type(IC_INPUT, 4, /obj/item/integrated_circuit/atmospherics)
+
+ if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve))
+ return
+
+ if(!AT || !AT.air_contents)
+ return
+
+ if (istype(assembly.loc, /obj/item/implant/storage)) //Prevents the more abusive form of chestgun.
+ return
+
+ if(max_w_class && (A.w_class > max_w_class))
+ return
+
+ if(!assembly.can_fire_equipped && ishuman(assembly.loc))
+ return
+
+ // Is the target inside the assembly or close to it?
+ if(!check_target(A, exclude_components = TRUE))
+ return
+
+ var/turf/T = get_turf(get_object())
+ if(!T)
+ return
+
+ // If the item is in mob's inventory, try to remove it from there.
+ if(ismob(A.loc))
+ var/mob/living/M = A.loc
+ if(!M.temporarilyRemoveItemFromInventory(A))
+ return
+
+ var/datum/gas_mixture/source_air = AT.return_air()
+ var/datum/gas_mixture/target_air = T.return_air()
+
+ if(!source_air || !target_air)
+ return
+
+ var/datum/gas_mixture/removed = source_air.remove(gas_per_throw)
+ if(!removed)
+ return
+ target_air.merge(removed)
+
+ // If the item is in a grabber circuit we'll update the grabber's outputs after we've thrown it.
+ var/obj/item/integrated_circuit/manipulation/grabber/G = A.loc
+
+ var/x_abs = CLAMP(T.x + target_x_rel, 0, world.maxx)
+ var/y_abs = CLAMP(T.y + target_y_rel, 0, world.maxy)
+ var/range = round(CLAMP(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1)
+ assembly.visible_message("\The [assembly] has thrown [A]!")
+ log_attack("[assembly] [REF(assembly)] has thrown [A] with lethal force.")
+ A.forceMove(drop_location())
+ A.throw_at(locate(x_abs, y_abs, T.z), range, 3)
+
+ air_update_turf()
+
+ // If the item came from a grabber now we can update the outputs since we've thrown it.
+ if(istype(G))
+ G.update_outputs()
+
+
+/obj/item/integrated_circuit/weaponized/stun
+ name = "electronic stun module"
+ desc = "Used to stun a target holding the device via electricity."
+ icon_state = "power_relay"
+ extended_desc = "Attempts to stun the holder of this device, with the strength input being the strength of the stun, from 1 to 70."
+ complexity = 60
+ size = 4
+ inputs = list("strength" = IC_PINTYPE_NUMBER)
+ activators = list("stun" = IC_PINTYPE_PULSE_IN, "on success" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_RESEARCH
+ power_draw_per_use = 2000
+ cooldown_per_use = 50
+ ext_cooldown = 25
+
+
+/obj/item/integrated_circuit/weaponized/stun/do_work()
+ var/stunforce = CLAMP(get_pin_data(IC_INPUT, 1),1,70)
+ var/mob/living/L = assembly.loc
+ if(attempt_stun(L,stunforce))
+ activate_pin(2)
+ else
+ activate_pin(3)
+
+/obj/item/integrated_circuit/weaponized/proc/attempt_stun(var/mob/living/L,var/stunforce = 70) //Copied from stunbaton code.
+
+ if(!L || !isliving(L))
+ return 0
+
+ L.Knockdown(stunforce)
+ SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
+
+ message_admins("stunned someone with an assembly. Last touches: Assembly: [assembly.fingerprintslast] Circuit: [fingerprintslast]")
+
+ L.visible_message("\The [assembly] has stunned \the [L] with \the [src]!", "\The [assembly] has stunned you with \the [src]!")
+ playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ H.forcesay(GLOB.hit_appends)
+
+ return 1
\ No newline at end of file
diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm
index 053373c05a..22ef2a9211 100644
--- a/code/modules/jobs/job_types/cargo_service.dm
+++ b/code/modules/jobs/job_types/cargo_service.dm
@@ -110,7 +110,7 @@ Shaft Miner
/datum/outfit/job/miner/equipped
name = "Shaft Miner (Lavaland + Equipment)"
- suit = /obj/item/clothing/suit/hooded/explorer
+ suit = /obj/item/clothing/suit/hooded/explorer/standard
mask = /obj/item/clothing/mask/gas/explorer
glasses = /obj/item/clothing/glasses/meson
suit_store = /obj/item/tank/internals/oxygen
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index dec574566f..2c35c3148f 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -15,6 +15,7 @@
resistance_flags = FIRE_PROOF
tauric = TRUE //Citadel Add for tauric hardsuits
+
/obj/item/clothing/head/hooded/explorer
name = "explorer hood"
desc = "An armoured hood for exploring harsh environments."
@@ -26,11 +27,15 @@
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
resistance_flags = FIRE_PROOF
-/obj/item/clothing/suit/hooded/explorer/Initialize()
+/obj/item/clothing/suit/hooded/explorer/standard
+
+/obj/item/clothing/head/hooded/explorer/standard
+
+/obj/item/clothing/suit/hooded/explorer/standard/Initialize()
. = ..()
AddComponent(/datum/component/armor_plate)
-/obj/item/clothing/head/hooded/explorer/Initialize()
+/obj/item/clothing/head/hooded/explorer/standard/Initialize()
. = ..()
AddComponent(/datum/component/armor_plate)
@@ -176,4 +181,4 @@
desc = "A face-covering mask that can be connected to an air supply. Intended for use with the Exosuit."
icon_state = "exo"
item_state = "exo"
- resistance_flags = FIRE_PROOF
\ No newline at end of file
+ resistance_flags = FIRE_PROOF
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 79270ebf63..aed90cebdf 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -22,11 +22,11 @@
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
+ new /datum/data/mining_equipment("Survival Knife", /obj/item/kitchen/knife/combat/survival, 450),
new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
new /datum/data/mining_equipment("Larger Ore Bag", /obj/item/storage/bag/ore/large, 500),
new /datum/data/mining_equipment("500 Point Transfer Card", /obj/item/card/mining_point_card/mp500, 500),
- new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600),
new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750),
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 750),
@@ -50,9 +50,11 @@
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
+ new /datum/data/mining_equipment("Spare Suit Voucher", /obj/item/suit_voucher, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
+ new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 3000),
new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800),
new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
@@ -67,9 +69,7 @@
new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
- new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000),
- new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 12000),
- new /datum/data/mining_equipment("Spare Suit Voucher", /obj/item/suit_voucher, 15000)
+ new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000)
)
@@ -319,7 +319,7 @@
new /obj/item/clothing/glasses/meson(src)
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
new /obj/item/storage/bag/ore(src)
- new /obj/item/clothing/suit/hooded/explorer(src)
+ new /obj/item/clothing/suit/hooded/explorer/standard(src)
new /obj/item/encryptionkey/headset_cargo(src)
new /obj/item/clothing/mask/gas/explorer(src)
new /obj/item/card/mining_access_card(src)
@@ -340,7 +340,7 @@
new /obj/item/storage/firstaid/regular(src)
new /obj/item/reagent_containers/hypospray/medipen/survival(src)
new /obj/item/t_scanner/adv_mining_scanner(src)
- new /obj/item/clothing/suit/hooded/explorer(src)
+ new /obj/item/clothing/suit/hooded/explorer/standard(src)
new /obj/item/encryptionkey/headset_cargo(src)
new /obj/item/clothing/mask/gas/explorer(src)
new /obj/item/card/id/mining(src)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm
deleted file mode 100644
index 44c1f7601d..0000000000
--- a/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ /dev/null
@@ -1,1524 +0,0 @@
-/*
-
- Hello and welcome to sprite_accessories: For sprite accessories, such as hair,
- facial hair, and possibly tattoos and stuff somewhere along the line. This file is
- intended to be friendly for people with little to no actual coding experience.
- The process of adding in new hairstyles has been made pain-free and easy to do.
- Enjoy! - Doohl
-
-
- Notice: This all gets automatically compiled in a list in dna.dm, so you do not
- have to define any UI values for sprite accessories manually for hair and facial
- hair. Just add in new hair types and the game will naturally adapt.
-
- !!WARNING!!: changing existing hair information can be VERY hazardous to savefiles,
- to the point where you may completely corrupt a server's savefiles. Please refrain
- from doing this unless you absolutely know what you are doing, and have defined a
- conversion in savefile.dm
-*/
-/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female,var/roundstart = FALSE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked
- if(!istype(L))
- L = list()
- if(!istype(male))
- male = list()
- if(!istype(female))
- female = list()
-
- for(var/path in typesof(prototype))
- if(path == prototype)
- continue
- if(roundstart)
- var/datum/sprite_accessory/P = path
- if(initial(P.locked))
- continue
- var/datum/sprite_accessory/D = new path()
-
- if(D.icon_state)
- L[D.name] = D
- else
- L += D.name
-
- switch(D.gender)
- if(MALE)
- male += D.name
- if(FEMALE)
- female += D.name
- else
- male += D.name
- female += D.name
- return L
-
-/datum/sprite_accessory
- var/icon //the icon file the accessory is located in
- var/icon_state //the icon_state of the accessory
- var/name //the preview name of the accessory
- var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
- var/gender_specific //Something that can be worn by either gender, but looks different on each
- var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none.
- var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears.
- var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects
- var/dimension_x = 32
- var/dimension_y = 32
- var/center = FALSE //Should we center the sprite?
-
-//////////////////////
-// Hair Definitions //
-//////////////////////
-/datum/sprite_accessory/hair
- icon = 'icons/mob/human_face.dmi' // default icon for all hairs
-
- // please make sure they're sorted alphabetically and, where needed, categorized
- // try to capitalize the names please~
- // try to spell
- // you do not need to define _s or _l sub-states, game automatically does this for you
-
-/datum/sprite_accessory/hair/afro
- name = "Afro"
- icon_state = "hair_afro"
-
-/datum/sprite_accessory/hair/afro2
- name = "Afro 2"
- icon_state = "hair_afro2"
-
-/datum/sprite_accessory/hair/afro_large
- name = "Afro (Large)"
- icon_state = "hair_bigafro"
-
-/datum/sprite_accessory/hair/antenna
- name = "Ahoge"
- icon_state = "hair_antenna"
-
-/datum/sprite_accessory/hair/bald
- name = "Bald"
- icon_state = null
-
-/datum/sprite_accessory/hair/balding
- name = "Balding Hair"
- icon_state = "hair_e"
-
-/datum/sprite_accessory/hair/bedhead
- name = "Bedhead"
- icon_state = "hair_bedhead"
-
-/datum/sprite_accessory/hair/bedhead2
- name = "Bedhead 2"
- icon_state = "hair_bedheadv2"
-
-/datum/sprite_accessory/hair/bedhead3
- name = "Bedhead 3"
- icon_state = "hair_bedheadv3"
-
-/datum/sprite_accessory/hair/beehive
- name = "Beehive"
- icon_state = "hair_beehive"
-
-/datum/sprite_accessory/hair/beehive2
- name = "Beehive 2"
- icon_state = "hair_beehivev2"
-
-/datum/sprite_accessory/hair/bob
- name = "Bob Hair"
- icon_state = "hair_bob"
-
-/datum/sprite_accessory/hair/bob2
- name = "Bob Hair 2"
- icon_state = "hair_bob2"
-
-/datum/sprite_accessory/hair/bob3
- name = "Bob Hair 3"
- icon_state = "hair_bobcut"
-
-/datum/sprite_accessory/hair/bobcurl
- name = "Bobcurl"
- icon_state = "hair_bobcurl"
-
-/datum/sprite_accessory/hair/boddicker
- name = "Boddicker"
- icon_state = "hair_boddicker"
-
-/datum/sprite_accessory/hair/bowl
- name = "Bowl"
- icon_state = "hair_bowlcut"
-
-/datum/sprite_accessory/hair/braid
- name = "Braid (Floorlength)"
- icon_state = "hair_braid"
-
-/datum/sprite_accessory/hair/braided
- name = "Braided"
- icon_state = "hair_braided"
-
-/datum/sprite_accessory/hair/front_braid
- name = "Braided Front"
- icon_state = "hair_braidfront"
-
-/datum/sprite_accessory/hair/not_floorlength_braid
- name = "Braid (High)"
- icon_state = "hair_braid2"
-
-/datum/sprite_accessory/hair/lowbraid
- name = "Braid (Low)"
- icon_state = "hair_hbraid"
-
-/datum/sprite_accessory/hair/shortbraid
- name = "Braid (Short)"
- icon_state = "hair_shortbraid"
-
-/datum/sprite_accessory/hair/braidtail
- name = "Braided Tail"
- icon_state = "hair_braidtail"
-
-/datum/sprite_accessory/hair/bun
- name = "Bun Head"
- icon_state = "hair_bun"
-
-/datum/sprite_accessory/hair/bun2
- name = "Bun Head 2"
- icon_state = "hair_bunhead2"
-
-/datum/sprite_accessory/hair/largebun
- name = "Bun (Large)"
- icon_state = "hair_largebun"
-
-/datum/sprite_accessory/hair/business
- name = "Business Hair"
- icon_state = "hair_business"
-
-/datum/sprite_accessory/hair/business2
- name = "Business Hair 2"
- icon_state = "hair_business2"
-
-/datum/sprite_accessory/hair/business3
- name = "Business Hair 3"
- icon_state = "hair_business3"
-
-/datum/sprite_accessory/hair/business4
- name = "Business Hair 4"
- icon_state = "hair_business4"
-
-/datum/sprite_accessory/hair/buzz
- name = "Buzzcut"
- icon_state = "hair_buzzcut"
-
-/datum/sprite_accessory/hair/combover
- name = "Combover"
- icon_state = "hair_combover"
-
-/datum/sprite_accessory/hair/crew
- name = "Crewcut"
- icon_state = "hair_crewcut"
-
-/datum/sprite_accessory/hair/curls
- name = "Curls"
- icon_state = "hair_curls"
-
-/datum/sprite_accessory/hair/cut
- name = "Cut Hair"
- icon_state = "hair_c"
-
-/datum/sprite_accessory/hair/devillock
- name = "Devil Lock"
- icon_state = "hair_devilock"
-
-/datum/sprite_accessory/hair/dreadlocks
- name = "Dreadlocks"
- icon_state = "hair_dreads"
-
-/datum/sprite_accessory/hair/drillhair
- name = "Drill Hair"
- icon_state = "hair_drillhair"
-
-/datum/sprite_accessory/hair/drillhairextended
- name = "Drill Hair (Extended)"
- icon_state = "hair_drillhairextended"
-
-/datum/sprite_accessory/hair/emo
- name = "Emo"
- icon_state = "hair_emo"
-
-/datum/sprite_accessory/hair/feather
- name = "Feather"
- icon_state = "hair_feather"
-
-/datum/sprite_accessory/hair/sargeant
- name = "Flat Top"
- icon_state = "hair_sargeant"
-
-/datum/sprite_accessory/hair/bigflattop
- name = "Flat Top (Big)"
- icon_state = "hair_bigflattop"
-
-/datum/sprite_accessory/hair/fag
- name = "Flow Hair"
- icon_state = "hair_f"
-
-/datum/sprite_accessory/hair/gelled
- name = "Gelled Back"
- icon_state = "hair_gelled"
-
-/datum/sprite_accessory/hair/gentle
- name = "Gentle"
- icon_state = "hair_gentle"
-
-/datum/sprite_accessory/hair/halfbang
- name = "Half-banged Hair"
- icon_state = "hair_halfbang"
-
-/datum/sprite_accessory/hair/halfbang2
- name = "Half-banged Hair 2"
- icon_state = "hair_halfbang2"
-
-/datum/sprite_accessory/hair/hedgehog
- name = "Hedgehog Hair"
- icon_state = "hair_hedgehog"
-
-/datum/sprite_accessory/hair/himecut
- name = "Hime Cut"
- icon_state = "hair_himecut"
-
-/datum/sprite_accessory/hair/himecut2
- name = "Hime Cut 2"
- icon_state = "hair_himecut2"
-
-/datum/sprite_accessory/hair/himeup
- name = "Hime Updo"
- icon_state = "hair_himeup"
-
-/datum/sprite_accessory/hair/hitop
- name = "Hitop"
- icon_state = "hair_hitop"
-
-/datum/sprite_accessory/hair/jensen
- name = "Jensen Hair"
- icon_state = "hair_jensen"
-
-/datum/sprite_accessory/hair/keanu
- name = "Keanu Hair"
- icon_state = "hair_keanu"
-
-/datum/sprite_accessory/hair/kusangi
- name = "Kusanagi Hair"
- icon_state = "hair_kusanagi"
-
-/datum/sprite_accessory/hair/long
- name = "Long Hair 1"
- icon_state = "hair_long"
-
-/datum/sprite_accessory/hair/long2
- name = "Long Hair 2"
- icon_state = "hair_long2"
-
-/datum/sprite_accessory/hair/long3
- name = "Long Hair 3"
- icon_state = "hair_long3"
-
-/datum/sprite_accessory/hair/long_over_eye
- name = "Long Over Eye"
- icon_state = "hair_longovereye"
-
-/datum/sprite_accessory/hair/longbangs
- name = "Long Bangs"
- icon_state = "hair_lbangs"
-
-/datum/sprite_accessory/hair/longemo
- name = "Long Emo"
- icon_state = "hair_longemo"
-
-/datum/sprite_accessory/hair/longfringe
- name = "Long Fringe"
- icon_state = "hair_longfringe"
-
-/datum/sprite_accessory/hair/sidepartlongalt
- name = "Long Side Part"
- icon_state = "hair_longsidepart"
-
-/datum/sprite_accessory/hair/megaeyebrows
- name = "Mega Eyebrows"
- icon_state = "hair_megaeyebrows"
-
-/datum/sprite_accessory/hair/messy
- name = "Messy"
- icon_state = "hair_messy"
-
-/datum/sprite_accessory/hair/mohawk
- name = "Mohawk"
- icon_state = "hair_d"
-
-/datum/sprite_accessory/hair/reversemohawk
- name = "Mohawk (Reverse)"
- icon_state = "hair_reversemohawk"
-
-/datum/sprite_accessory/hair/odango
- name = "Odango"
- icon_state = "hair_odango"
-
-/datum/sprite_accessory/hair/ombre
- name = "Ombre"
- icon_state = "hair_ombre"
-
-/datum/sprite_accessory/hair/oneshoulder
- name = "One Shoulder"
- icon_state = "hair_oneshoulder"
-
-/datum/sprite_accessory/hair/over_eye
- name = "Over Eye"
- icon_state = "hair_shortovereye"
-
-//Donator item - fractious
-/datum/sprite_accessory/hair/over_eye_fr
- name = "Over Eye (fract)"
- icon_state = "hair_shortovereye_1f"
- ckeys_allowed = list("fractious")
-
-/datum/sprite_accessory/hair/parted
- name = "Parted"
- icon_state = "hair_parted"
-
-/datum/sprite_accessory/hair/partedside
- name = "Parted (Side)"
- icon_state = "hair_part"
-
-/datum/sprite_accessory/hair/kagami
- name = "Pigtails"
- icon_state = "hair_kagami"
-
-/datum/sprite_accessory/hair/pigtail
- name = "Pigtails 2"
- icon_state = "hair_pigtails"
-
-/datum/sprite_accessory/hair/pigtail2
- name = "Pigtails 3"
- icon_state = "hair_pigtails2"
-
-/datum/sprite_accessory/hair/pixie
- name = "Pixie Cut"
- icon_state = "hair_pixie"
-
-/datum/sprite_accessory/hair/pompadour
- name = "Pompadour"
- icon_state = "hair_pompadour"
-
-/datum/sprite_accessory/hair/bigpompadour
- name = "Pompadour (Big)"
- icon_state = "hair_bigpompadour"
-
-/datum/sprite_accessory/hair/ponytail1
- name = "Ponytail"
- icon_state = "hair_ponytail"
-
-/datum/sprite_accessory/hair/ponytail2
- name = "Ponytail 2"
- icon_state = "hair_ponytail2"
-
-/datum/sprite_accessory/hair/ponytail3
- name = "Ponytail 3"
- icon_state = "hair_ponytail3"
-
-/datum/sprite_accessory/hair/ponytail4
- name = "Ponytail 4"
- icon_state = "hair_ponytail4"
-
-/datum/sprite_accessory/hair/ponytail5
- name = "Ponytail 5"
- icon_state = "hair_ponytail5"
-
-/datum/sprite_accessory/hair/highponytail
- name = "Ponytail (High)"
- icon_state = "hair_highponytail"
-
-/datum/sprite_accessory/hair/longponytail
- name = "Ponytail (Long)"
- icon_state = "hair_longstraightponytail"
-
-/datum/sprite_accessory/hair/sidetail
- name = "Ponytail (Side)"
- icon_state = "hair_sidetail"
-
-/datum/sprite_accessory/hair/sidetail2
- name = "Ponytail (Side) 2"
- icon_state = "hair_sidetail2"
-
-/datum/sprite_accessory/hair/sidetail3
- name = "Ponytail (Side) 3"
- icon_state = "hair_sidetail3"
-
-/datum/sprite_accessory/hair/sidetail4
- name = "Ponytail (Side) 4"
- icon_state = "hair_sidetail4"
-
-/datum/sprite_accessory/hair/quiff
- name = "Quiff"
- icon_state = "hair_quiff"
-
-/datum/sprite_accessory/hair/short
- name = "Short Hair"
- icon_state = "hair_a"
-
-/datum/sprite_accessory/hair/shorthair2
- name = "Short Hair 2"
- icon_state = "hair_shorthair2"
-
-/datum/sprite_accessory/hair/shorthair3
- name = "Short Hair 3"
- icon_state = "hair_shorthair3"
-
-/datum/sprite_accessory/hair/shoulderlength
- name = "Shoulder-length Hair"
- icon_state = "hair_b"
-
-/datum/sprite_accessory/hair/sidecut
- name = "Sidecut"
- icon_state = "hair_sidecut"
-
-/datum/sprite_accessory/hair/skinhead
- name = "Skinhead"
- icon_state = "hair_skinhead"
-
-/datum/sprite_accessory/hair/protagonist
- name = "Slightly Long Hair"
- icon_state = "hair_protagonist"
-
-/datum/sprite_accessory/hair/spiky
- name = "Spiky"
- icon_state = "hair_spikey"
-
-/datum/sprite_accessory/hair/spiky2
- name = "Spiky 2"
- icon_state = "hair_spiky"
-
-/datum/sprite_accessory/hair/spiky3
- name = "Spiky 3"
- icon_state = "hair_spiky2"
-
-/datum/sprite_accessory/hair/swept
- name = "Swept Back Hair"
- icon_state = "hair_swept"
-
-/datum/sprite_accessory/hair/swept2
- name = "Swept Back Hair 2"
- icon_state = "hair_swept2"
-
-/datum/sprite_accessory/hair/tressshoulder
- name = "Tress Shoulder"
- icon_state = "hair_tressshoulder"
-
-/datum/sprite_accessory/hair/updo
- name = "Updo"
- icon_state = "hair_updo"
-
-/datum/sprite_accessory/hair/longer
- name = "Very Long Hair"
- icon_state = "hair_vlong"
-
-/datum/sprite_accessory/hair/longest
- name = "Very Long Hair 2"
- icon_state = "hair_longest"
-
-/datum/sprite_accessory/hair/longest2
- name = "Very Long Over Eye"
- icon_state = "hair_longest2"
-
-/datum/sprite_accessory/hair/longestalt
- name = "Very Long with Fringe"
- icon_state = "hair_vlongfringe"
-
-/////////////////////////////
-// Facial Hair Definitions //
-/////////////////////////////
-
-/datum/sprite_accessory/facial_hair
- icon = 'icons/mob/human_face.dmi'
- gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P)
-
-// please make sure they're sorted alphabetically and categorized
-
-/datum/sprite_accessory/facial_hair/abe
- name = "Beard (Abraham Lincoln)"
- icon_state = "facial_abe"
-
-/datum/sprite_accessory/facial_hair/brokenman
- name = "Beard (Broken Man)"
- icon_state = "facial_brokenman"
-
-/datum/sprite_accessory/facial_hair/chinstrap
- name = "Beard (Chinstrap)"
- icon_state = "facial_chin"
-
-/datum/sprite_accessory/facial_hair/dwarf
- name = "Beard (Dwarf)"
- icon_state = "facial_dwarf"
-
-/datum/sprite_accessory/facial_hair/fiveoclock
- name = "Beard (Five o Clock Shadow)"
- icon_state = "facial_fiveoclock"
-
-/datum/sprite_accessory/facial_hair/fullbeard
- name = "Beard (Full)"
- icon_state = "facial_fullbeard"
-
-/datum/sprite_accessory/facial_hair/gt
- name = "Beard (Goatee)"
- icon_state = "facial_gt"
-
-/datum/sprite_accessory/facial_hair/hip
- name = "Beard (Hipster)"
- icon_state = "facial_hip"
-
-/datum/sprite_accessory/facial_hair/jensen
- name = "Beard (Jensen)"
- icon_state = "facial_jensen"
-
-/datum/sprite_accessory/facial_hair/neckbeard
- name = "Beard (Neckbeard)"
- icon_state = "facial_neckbeard"
-
-/datum/sprite_accessory/facial_hair/vlongbeard
- name = "Beard (Very Long)"
- icon_state = "facial_wise"
-
-/datum/sprite_accessory/facial_hair/longbeard
- name = "Beard (Long)"
- icon_state = "facial_longbeard"
-
-/datum/sprite_accessory/facial_hair/fu
- name = "Moustache (Fu Manchu)"
- icon_state = "facial_fumanchu"
-
-/datum/sprite_accessory/facial_hair/hogan
- name = "Moustache (Hulk Hogan)"
- icon_state = "facial_hogan" //-Neek
-
-/datum/sprite_accessory/facial_hair/selleck
- name = "Moustache (Selleck)"
- icon_state = "facial_selleck"
-
-/datum/sprite_accessory/facial_hair/chaplin
- name = "Moustache (Square)"
- icon_state = "facial_chaplin"
-
-/datum/sprite_accessory/facial_hair/vandyke
- name = "Moustache (Van Dyke)"
- icon_state = "facial_vandyke"
-
-/datum/sprite_accessory/facial_hair/watson
- name = "Moustache (Watson)"
- icon_state = "facial_watson"
-
-/datum/sprite_accessory/facial_hair/shaved
- name = "Shaved"
- icon_state = null
- gender = NEUTER
-
-/datum/sprite_accessory/facial_hair/elvis
- name = "Sideburns (Elvis)"
- icon_state = "facial_elvis"
-
-
-///////////////////////////
-// Underwear Definitions //
-///////////////////////////
-/datum/sprite_accessory/underwear
- icon = 'icons/mob/underwear.dmi'
-
-/datum/sprite_accessory/underwear/nude
- name = "Nude"
- icon_state = null
- gender = NEUTER
-
-/datum/sprite_accessory/underwear/male_mankini
- name = "Mankini"
- icon_state = "male_mankini"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_black
- name = "Men's Black"
- icon_state = "male_black"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_blackalt
- name = "Men's Black Boxer"
- icon_state = "male_blackalt"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_blue
- name = "Men's Blue"
- icon_state = "male_blue"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_green
- name = "Men's Green"
- icon_state = "male_green"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_grey
- name = "Men's Grey"
- icon_state = "male_grey"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_greyalt
- name = "Men's Grey Boxer"
- icon_state = "male_greyalt"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_hearts
- name = "Men's Hearts Boxer"
- icon_state = "male_hearts"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_kinky
- name = "Men's Kinky"
- icon_state = "male_kinky"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_red
- name = "Men's Red"
- icon_state = "male_red"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_stripe
- name = "Men's Striped Boxer"
- icon_state = "male_stripe"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_commie
- name = "Men's Striped Commie Boxer"
- icon_state = "male_commie"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_usastripe
- name = "Men's Striped Freedom Boxer"
- icon_state = "male_assblastusa"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_uk
- name = "Men's Striped UK Boxer"
- icon_state = "male_uk"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_white
- name = "Men's White"
- icon_state = "male_white"
- gender = MALE
-
-/datum/sprite_accessory/underwear/female_babydoll
- name = "Babydoll"
- icon_state = "female_babydoll"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_babyblue
- name = "Ladies' Baby-Blue"
- icon_state = "female_babyblue"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_black
- name = "Ladies' Black"
- icon_state = "female_black"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_black_neko
- name = "Ladies' Black Neko"
- icon_state = "female_neko_black"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_blackalt
- name = "Ladies' Black Sport"
- icon_state = "female_blackalt"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_blue
- name = "Ladies' Blue"
- icon_state = "female_blue"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_commie
- name = "Ladies' Commie"
- icon_state = "female_commie"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_usastripe
- name = "Ladies' Freedom"
- icon_state = "female_assblastusa"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_green
- name = "Ladies' Green"
- icon_state = "female_green"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_kinky
- name = "Ladies' Kinky"
- icon_state = "female_kinky"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_pink
- name = "Ladies' Pink"
- icon_state = "female_pink"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_red
- name = "Ladies' Red"
- icon_state = "female_red"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/swimsuit
- name = "Ladies' Swimsuit (Black)"
- icon_state = "swim_black"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/swimsuit_blue
- name = "Ladies' Swimsuit (Blue)"
- icon_state = "swim_blue"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/swimsuit_green
- name = "Ladies' Swimsuit (Green)"
- icon_state = "swim_green"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/swimsuit_purple
- name = "Ladies' Swimsuit (Purple)"
- icon_state = "swim_purple"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/swimsuit_red
- name = "Ladies' Swimsuit (Red)"
- icon_state = "swim_red"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_thong
- name = "Ladies' Thong"
- icon_state = "female_thong"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_uk
- name = "Ladies' UK"
- icon_state = "female_uk"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_white
- name = "Ladies' White"
- icon_state = "female_white"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_white_neko
- name = "Ladies' White Neko"
- icon_state = "female_neko_white"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_whitealt
- name = "Ladies' White Sport"
- icon_state = "female_whitealt"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_yellow
- name = "Ladies' Yellow"
- icon_state = "female_yellow"
- gender = FEMALE
-
-////////////////////////////
-// Undershirt Definitions //
-////////////////////////////
-
-/datum/sprite_accessory/undershirt
- icon = 'icons/mob/underwear.dmi'
-
-/datum/sprite_accessory/undershirt/nude
- name = "Nude"
- icon_state = null
- gender = NEUTER
-
-// please make sure they're sorted alphabetically and categorized
-
-/datum/sprite_accessory/undershirt/bluejersey
- name = "Jersey (Blue)"
- icon_state = "shirt_bluejersey"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/redjersey
- name = "Jersey (Red)"
- icon_state = "shirt_redjersey"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/bluepolo
- name = "Polo Shirt (Blue)"
- icon_state = "bluepolo"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/grayyellowpolo
- name = "Polo Shirt (Gray-Yellow)"
- icon_state = "grayyellowpolo"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/redpolo
- name = "Polo Shirt (Red)"
- icon_state = "redpolo"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/whitepolo
- name = "Polo Shirt (White)"
- icon_state = "whitepolo"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/alienshirt
- name = "Shirt (Alien)"
- icon_state = "shirt_alien"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/mondmondjaja
- name = "Shirt (Band)"
- icon_state = "band"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/shirt_black
- name = "Shirt (Black)"
- icon_state = "shirt_black"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/blueshirt
- name = "Shirt (Blue)"
- icon_state = "shirt_blue"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/clownshirt
- name = "Shirt (Clown)"
- icon_state = "shirt_clown"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/commie
- name = "Shirt (Commie)"
- icon_state = "shirt_commie"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/greenshirt
- name = "Shirt (Green)"
- icon_state = "shirt_green"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/shirt_grey
- name = "Shirt (Grey)"
- icon_state = "shirt_grey"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/ian
- name = "Shirt (Ian)"
- icon_state = "ian"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/ilovent
- name = "Shirt (I Love NT)"
- icon_state = "ilovent"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/lover
- name = "Shirt (Lover)"
- icon_state = "lover"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/matroska
- name = "Shirt (Matroska)"
- icon_state = "matroska"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/meat
- name = "Shirt (Meat)"
- icon_state = "shirt_meat"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/nano
- name = "Shirt (Nanotrasen)"
- icon_state = "shirt_nano"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/peace
- name = "Shirt (Peace)"
- icon_state = "peace"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/pacman
- name = "Shirt (Pogoman)"
- icon_state = "pogoman"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/question
- name = "Shirt (Question)"
- icon_state = "shirt_question"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/redshirt
- name = "Shirt (Red)"
- icon_state = "shirt_red"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/skull
- name = "Shirt (Skull)"
- icon_state = "shirt_skull"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/ss13
- name = "Shirt (SS13)"
- icon_state = "shirt_ss13"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/stripe
- name = "Shirt (Striped)"
- icon_state = "shirt_stripes"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/tiedye
- name = "Shirt (Tie-dye)"
- icon_state = "shirt_tiedye"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/uk
- name = "Shirt (UK)"
- icon_state = "uk"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/usa
- name = "Shirt (USA)"
- icon_state = "shirt_assblastusa"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/shirt_white
- name = "Shirt (White)"
- icon_state = "shirt_white"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/blackshortsleeve
- name = "Short-sleeved Shirt (Black)"
- icon_state = "blackshortsleeve"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/blueshortsleeve
- name = "Short-sleeved Shirt (Blue)"
- icon_state = "blueshortsleeve"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/greenshortsleeve
- name = "Short-sleeved Shirt (Green)"
- icon_state = "greenshortsleeve"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/purpleshortsleeve
- name = "Short-sleeved Shirt (Purple)"
- icon_state = "purpleshortsleeve"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/whiteshortsleeve
- name = "Short-sleeved Shirt (White)"
- icon_state = "whiteshortsleeve"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/sports_bra
- name = "Sports Bra"
- icon_state = "sports_bra"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/sports_bra2
- name = "Sports Bra (Alt)"
- icon_state = "sports_bra_alt"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/blueshirtsport
- name = "Sports Shirt (Blue)"
- icon_state = "blueshirtsport"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/greenshirtsport
- name = "Sports Shirt (Green)"
- icon_state = "greenshirtsport"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/redshirtsport
- name = "Sports Shirt (Red)"
- icon_state = "redshirtsport"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/tank_black
- name = "Tank Top (Black)"
- icon_state = "tank_black"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/tankfire
- name = "Tank Top (Fire)"
- icon_state = "tank_fire"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/tank_grey
- name = "Tank Top (Grey)"
- icon_state = "tank_grey"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/female_midriff
- name = "Tank Top (Midriff)"
- icon_state = "tank_midriff"
- gender = FEMALE
-
-/datum/sprite_accessory/undershirt/tank_red
- name = "Tank Top (Red)"
- icon_state = "tank_red"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/tankstripe
- name = "Tank Top (Striped)"
- icon_state = "tank_stripes"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/tank_white
- name = "Tank Top (White)"
- icon_state = "tank_white"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/redtop
- name = "Top (Red)"
- icon_state = "redtop"
- gender = FEMALE
-
-/datum/sprite_accessory/undershirt/whitetop
- name = "Top (White)"
- icon_state = "whitetop"
- gender = FEMALE
-
-/datum/sprite_accessory/undershirt/tshirt_blue
- name = "T-Shirt (Blue)"
- icon_state = "blueshirt"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/tshirt_green
- name = "T-Shirt (Green)"
- icon_state = "greenshirt"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/tshirt_red
- name = "T-Shirt (Red)"
- icon_state = "redshirt"
- gender = NEUTER
-
-/datum/sprite_accessory/undershirt/yellowshirt
- name = "T-Shirt (Yellow)"
- icon_state = "yellowshirt"
- gender = NEUTER
-
-///////////////////////
-// Socks Definitions //
-///////////////////////
-
-/datum/sprite_accessory/socks
- icon = 'icons/mob/underwear.dmi'
-
-/datum/sprite_accessory/socks/nude
- name = "Nude"
- icon_state = null
-
-// please make sure they're sorted alphabetically and categorized
-
-/datum/sprite_accessory/socks/black_knee
- name = "Knee-high (Black)"
- icon_state = "black_knee"
-
-/datum/sprite_accessory/socks/commie_knee
- name = "Knee-High (Commie)"
- icon_state = "commie_knee"
-
-/datum/sprite_accessory/socks/usa_knee
- name = "Knee-High (Freedom)"
- icon_state = "assblastusa_knee"
-
-/datum/sprite_accessory/socks/rainbow_knee
- name = "Knee-high (Rainbow)"
- icon_state = "rainbow_knee"
-
-/datum/sprite_accessory/socks/striped_knee
- name = "Knee-high (Striped)"
- icon_state = "striped_knee"
-
-/datum/sprite_accessory/socks/thin_knee
- name = "Knee-high (Thin)"
- icon_state = "thin_knee"
-
-/datum/sprite_accessory/socks/uk_knee
- name = "Knee-High (UK)"
- icon_state = "uk_knee"
-
-/datum/sprite_accessory/socks/white_knee
- name = "Knee-high (White)"
- icon_state = "white_knee"
-
-/datum/sprite_accessory/socks/black_norm
- name = "Normal (Black)"
- icon_state = "black_norm"
-
-/datum/sprite_accessory/socks/white_norm
- name = "Normal (White)"
- icon_state = "white_norm"
-
-/datum/sprite_accessory/socks/pantyhose
- name = "Pantyhose"
- icon_state = "pantyhose"
-
-/datum/sprite_accessory/socks/black_short
- name = "Short (Black)"
- icon_state = "black_short"
-
-/datum/sprite_accessory/socks/white_short
- name = "Short (White)"
- icon_state = "white_short"
-
-/datum/sprite_accessory/socks/black_thigh
- name = "Thigh-high (Black)"
- icon_state = "black_thigh"
-
-/datum/sprite_accessory/socks/commie_thigh
- name = "Thigh-high (Commie)"
- icon_state = "commie_thigh"
-
-/datum/sprite_accessory/socks/usa_thigh
- name = "Thigh-high (Freedom)"
- icon_state = "assblastusa_thigh"
-
-/datum/sprite_accessory/socks/rainbow_thigh
- name = "Thigh-high (Rainbow)"
- icon_state = "rainbow_thigh"
-
-/datum/sprite_accessory/socks/striped_thigh
- name = "Thigh-high (Striped)"
- icon_state = "striped_thigh"
-
-/datum/sprite_accessory/socks/thin_thigh
- name = "Thigh-high (Thin)"
- icon_state = "thin_thigh"
-
-/datum/sprite_accessory/socks/uk_thigh
- name = "Thigh-high (UK)"
- icon_state = "uk_thigh"
-
-/datum/sprite_accessory/socks/white_thigh
- name = "Thigh-high (White)"
- icon_state = "white_thigh"
-
-//////////.//////////////////
-// MutantParts Definitions //
-/////////////////////////////
-
-/datum/sprite_accessory/body_markings
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/body_markings/none
- name = "None"
- icon_state = "none"
-
-/datum/sprite_accessory/body_markings/dtiger
- name = "Dark Tiger Body"
- icon_state = "dtiger"
- gender_specific = 1
-
-/datum/sprite_accessory/body_markings/ltiger
- name = "Light Tiger Body"
- icon_state = "ltiger"
- gender_specific = 1
-
-/datum/sprite_accessory/body_markings/lbelly
- name = "Light Belly"
- icon_state = "lbelly"
- gender_specific = 1
-
-/datum/sprite_accessory/tails
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/tails_animated
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/tails/lizard/smooth
- name = "Smooth"
- icon_state = "smooth"
-
-/datum/sprite_accessory/tails_animated/lizard/smooth
- name = "Smooth"
- icon_state = "smooth"
-
-/datum/sprite_accessory/tails/lizard/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
-
-/datum/sprite_accessory/tails_animated/lizard/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
-
-/datum/sprite_accessory/tails/lizard/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
-
-/datum/sprite_accessory/tails_animated/lizard/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
-
-/datum/sprite_accessory/tails/lizard/spikes
- name = "Spikes"
- icon_state = "spikes"
-
-/datum/sprite_accessory/tails_animated/lizard/spikes
- name = "Spikes"
- icon_state = "spikes"
-
-/datum/sprite_accessory/tails/human/none
- name = "None"
- icon_state = "none"
-
-/datum/sprite_accessory/tails_animated/human/none
- name = "None"
- icon_state = "none"
-/*
-/datum/sprite_accessory/tails/human/cat
- name = "Cat"
- icon_state = "cat"
- color_src = HAIR
-
-/datum/sprite_accessory/tails_animated/human/cat
- name = "Cat"
- icon_state = "cat"
- color_src = HAIR*/
-
-/datum/sprite_accessory/snouts
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/snouts/sharp
- name = "Sharp"
- icon_state = "sharp"
-
-/datum/sprite_accessory/snouts/round
- name = "Round"
- icon_state = "round"
-
-/datum/sprite_accessory/snouts/sharplight
- name = "Sharp + Light"
- icon_state = "sharplight"
-
-/datum/sprite_accessory/snouts/roundlight
- name = "Round + Light"
- icon_state = "roundlight"
-
-/datum/sprite_accessory/horns
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/horns/none
- name = "None"
- icon_state = "none"
-
-/datum/sprite_accessory/horns/simple
- name = "Simple"
- icon_state = "simple"
-
-/datum/sprite_accessory/horns/short
- name = "Short"
- icon_state = "short"
-
-/datum/sprite_accessory/horns/curled
- name = "Curled"
- icon_state = "curled"
-
-/datum/sprite_accessory/horns/ram
- name = "Ram"
- icon_state = "ram"
-
-/datum/sprite_accessory/horns/angler
- name = "Angeler"
- icon_state = "angler"
-
-/datum/sprite_accessory/ears
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/ears/none
- name = "None"
- icon_state = "none"
-
-/datum/sprite_accessory/ears/cat
- name = "Cat"
- icon_state = "cat"
- hasinner = 1
- color_src = HAIR
-
-/datum/sprite_accessory/wings/none
- name = "None"
- icon_state = "none"
-
-/datum/sprite_accessory/wings_open
- icon = 'icons/mob/wings.dmi'
-
-/datum/sprite_accessory/wings_open/angel
- name = "Angel"
- icon_state = "angel"
- color_src = 0
- dimension_x = 46
- center = TRUE
- dimension_y = 34
-
-/datum/sprite_accessory/wings
- icon = 'icons/mob/wings.dmi'
-
-/datum/sprite_accessory/wings/angel
- name = "Angel"
- icon_state = "angel"
- color_src = 0
- dimension_x = 46
- center = TRUE
- dimension_y = 34
- locked = TRUE
-
-/datum/sprite_accessory/frills
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/frills/none
- name = "None"
- icon_state = "none"
-
-/datum/sprite_accessory/frills/simple
- name = "Simple"
- icon_state = "simple"
-
-/datum/sprite_accessory/frills/short
- name = "Short"
- icon_state = "short"
-
-/datum/sprite_accessory/frills/aquatic
- name = "Aquatic"
- icon_state = "aqua"
-
-/datum/sprite_accessory/spines
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/spines_animated
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/spines/none
- name = "None"
- icon_state = "none"
-
-/datum/sprite_accessory/spines_animated/none
- name = "None"
- icon_state = "none"
-
-/datum/sprite_accessory/spines/short
- name = "Short"
- icon_state = "short"
-
-/datum/sprite_accessory/spines_animated/short
- name = "Short"
- icon_state = "short"
-
-/datum/sprite_accessory/spines/shortmeme
- name = "Short + Membrane"
- icon_state = "shortmeme"
-
-/datum/sprite_accessory/spines_animated/shortmeme
- name = "Short + Membrane"
- icon_state = "shortmeme"
-
-/datum/sprite_accessory/spines/long
- name = "Long"
- icon_state = "long"
-
-/datum/sprite_accessory/spines_animated/long
- name = "Long"
- icon_state = "long"
-
-/datum/sprite_accessory/spines/longmeme
- name = "Long + Membrane"
- icon_state = "longmeme"
-
-/datum/sprite_accessory/spines_animated/longmeme
- name = "Long + Membrane"
- icon_state = "longmeme"
-
-/datum/sprite_accessory/spines/aqautic
- name = "Aquatic"
- icon_state = "aqua"
-
-/datum/sprite_accessory/spines_animated/aqautic
- name = "Aquatic"
- icon_state = "aqua"
-
-/datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them.
- icon = null //These datums exist for selecting legs on preference, and little else
-
-/datum/sprite_accessory/legs/none
- name = "Normal Legs"
-
-/datum/sprite_accessory/legs/digitigrade_lizard
- name = "Digitigrade Legs"
-
-/datum/sprite_accessory/caps
- icon = 'icons/mob/mutant_bodyparts.dmi'
- color_src = HAIR
-
-/datum/sprite_accessory/caps/round
- name = "Round"
- icon_state = "round"
-
-/datum/sprite_accessory/moth_wings
- icon = 'icons/mob/wings.dmi'
- color_src = null
-
-/datum/sprite_accessory/moth_wings/plain
- name = "Plain"
- icon_state = "plain"
-
-/datum/sprite_accessory/moth_wings/monarch
- name = "Monarch"
- icon_state = "monarch"
-
-/datum/sprite_accessory/moth_wings/luna
- name = "Luna"
- icon_state = "luna"
-
-/datum/sprite_accessory/moth_wings/atlas
- name = "Atlas"
- icon_state = "atlas"
-
-/datum/sprite_accessory/moth_wings/reddish
- name = "Reddish"
- icon_state = "redish"
-
-/datum/sprite_accessory/moth_wings/royal
- name = "Royal"
- icon_state = "royal"
-
-/datum/sprite_accessory/moth_wings/gothic
- name = "Gothic"
- icon_state = "gothic"
-
-/datum/sprite_accessory/moth_wings/lovers
- name = "Lovers"
- icon_state = "lovers"
-
-/datum/sprite_accessory/moth_wings/whitefly
- name = "White Fly"
- icon_state = "whitefly"
-
-/datum/sprite_accessory/moth_wings/punished
- name = "Burnt Off"
- icon_state = "punished"
- locked = TRUE
-
-/datum/sprite_accessory/moth_wings/firewatch
- name = "Firewatch"
- icon_state = "firewatch"
-
-/datum/sprite_accessory/moth_wings/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
-
-/datum/sprite_accessory/moth_wings/poison
- name = "Poison"
- icon_state = "poison"
-
-/datum/sprite_accessory/moth_wings/ragged
- name = "Ragged"
- icon_state = "ragged"
-
-/datum/sprite_accessory/moth_wings/moonfly
- name = "Moon Fly"
- icon_state = "moonfly"
-
-/datum/sprite_accessory/moth_wings/snow
- name = "Snow"
- icon_state = "snow"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
new file mode 100644
index 0000000000..699c3c97e4
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
@@ -0,0 +1,62 @@
+/*
+
+ Hello and welcome to sprite_accessories: For sprite accessories, such as hair,
+ facial hair, and possibly tattoos and stuff somewhere along the line. This file is
+ intended to be friendly for people with little to no actual coding experience.
+ The process of adding in new hairstyles has been made pain-free and easy to do.
+ Enjoy! - Doohl
+
+
+ Notice: This all gets automatically compiled in a list in dna.dm, so you do not
+ have to define any UI values for sprite accessories manually for hair and facial
+ hair. Just add in new hair types and the game will naturally adapt.
+
+ !!WARNING!!: changing existing hair information can be VERY hazardous to savefiles,
+ to the point where you may completely corrupt a server's savefiles. Please refrain
+ from doing this unless you absolutely know what you are doing, and have defined a
+ conversion in savefile.dm
+*/
+/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female,var/roundstart = FALSE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked
+ if(!istype(L))
+ L = list()
+ if(!istype(male))
+ male = list()
+ if(!istype(female))
+ female = list()
+
+ for(var/path in typesof(prototype))
+ if(path == prototype)
+ continue
+ if(roundstart)
+ var/datum/sprite_accessory/P = path
+ if(initial(P.locked))
+ continue
+ var/datum/sprite_accessory/D = new path()
+
+ if(D.icon_state)
+ L[D.name] = D
+ else
+ L += D.name
+
+ switch(D.gender)
+ if(MALE)
+ male += D.name
+ if(FEMALE)
+ female += D.name
+ else
+ male += D.name
+ female += D.name
+ return L
+
+/datum/sprite_accessory
+ var/icon //the icon file the accessory is located in
+ var/icon_state //the icon_state of the accessory
+ var/name //the preview name of the accessory
+ var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
+ var/gender_specific //Something that can be worn by either gender, but looks different on each
+ var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none.
+ var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears.
+ var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects
+ var/dimension_x = 32
+ var/dimension_y = 32
+ var/center = FALSE //Should we center the sprite?
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
new file mode 100644
index 0000000000..6bce18d7ce
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
@@ -0,0 +1,25 @@
+//////////.//////////////////
+// MutantParts Definitions //
+/////////////////////////////
+
+/datum/sprite_accessory/body_markings
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/body_markings/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/body_markings/dtiger
+ name = "Dark Tiger Body"
+ icon_state = "dtiger"
+ gender_specific = 1
+
+/datum/sprite_accessory/body_markings/ltiger
+ name = "Light Tiger Body"
+ icon_state = "ltiger"
+ gender_specific = 1
+
+/datum/sprite_accessory/body_markings/lbelly
+ name = "Light Belly"
+ icon_state = "lbelly"
+ gender_specific = 1
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/caps.dm b/code/modules/mob/dead/new_player/sprite_accessories/caps.dm
new file mode 100644
index 0000000000..debb4865ba
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/caps.dm
@@ -0,0 +1,7 @@
+datum/sprite_accessory/caps
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+ color_src = HAIR
+
+/datum/sprite_accessory/caps/round
+ name = "Round"
+ icon_state = "round"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
new file mode 100644
index 0000000000..163f8370a2
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
@@ -0,0 +1,12 @@
+/datum/sprite_accessory/ears
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/ears/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/ears/cat
+ name = "Cat"
+ icon_state = "cat"
+ hasinner = 1
+ color_src = HAIR
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm
new file mode 100644
index 0000000000..93c4af6df0
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm
@@ -0,0 +1,18 @@
+/datum/sprite_accessory/frills
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/frills/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/frills/simple
+ name = "Simple"
+ icon_state = "simple"
+
+/datum/sprite_accessory/frills/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/frills/aquatic
+ name = "Aquatic"
+ icon_state = "aqua"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
new file mode 100644
index 0000000000..3566f3dea5
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
@@ -0,0 +1,89 @@
+/////////////////////////////
+// Facial Hair Definitions //
+/////////////////////////////
+/datum/sprite_accessory/facial_hair
+ icon = 'icons/mob/human_face.dmi'
+ gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P)
+
+// please make sure they're sorted alphabetically and categorized
+
+/datum/sprite_accessory/facial_hair/abe
+ name = "Beard (Abraham Lincoln)"
+ icon_state = "facial_abe"
+
+/datum/sprite_accessory/facial_hair/brokenman
+ name = "Beard (Broken Man)"
+ icon_state = "facial_brokenman"
+
+/datum/sprite_accessory/facial_hair/chinstrap
+ name = "Beard (Chinstrap)"
+ icon_state = "facial_chin"
+
+/datum/sprite_accessory/facial_hair/dwarf
+ name = "Beard (Dwarf)"
+ icon_state = "facial_dwarf"
+
+/datum/sprite_accessory/facial_hair/fiveoclock
+ name = "Beard (Five o Clock Shadow)"
+ icon_state = "facial_fiveoclock"
+
+/datum/sprite_accessory/facial_hair/fullbeard
+ name = "Beard (Full)"
+ icon_state = "facial_fullbeard"
+
+/datum/sprite_accessory/facial_hair/gt
+ name = "Beard (Goatee)"
+ icon_state = "facial_gt"
+
+/datum/sprite_accessory/facial_hair/hip
+ name = "Beard (Hipster)"
+ icon_state = "facial_hip"
+
+/datum/sprite_accessory/facial_hair/jensen
+ name = "Beard (Jensen)"
+ icon_state = "facial_jensen"
+
+/datum/sprite_accessory/facial_hair/neckbeard
+ name = "Beard (Neckbeard)"
+ icon_state = "facial_neckbeard"
+
+/datum/sprite_accessory/facial_hair/vlongbeard
+ name = "Beard (Very Long)"
+ icon_state = "facial_wise"
+
+/datum/sprite_accessory/facial_hair/longbeard
+ name = "Beard (Long)"
+ icon_state = "facial_longbeard"
+
+/datum/sprite_accessory/facial_hair/fu
+ name = "Moustache (Fu Manchu)"
+ icon_state = "facial_fumanchu"
+
+/datum/sprite_accessory/facial_hair/hogan
+ name = "Moustache (Hulk Hogan)"
+ icon_state = "facial_hogan" //-Neek
+
+/datum/sprite_accessory/facial_hair/selleck
+ name = "Moustache (Selleck)"
+ icon_state = "facial_selleck"
+
+/datum/sprite_accessory/facial_hair/chaplin
+ name = "Moustache (Square)"
+ icon_state = "facial_chaplin"
+
+/datum/sprite_accessory/facial_hair/vandyke
+ name = "Moustache (Van Dyke)"
+ icon_state = "facial_vandyke"
+
+/datum/sprite_accessory/facial_hair/watson
+ name = "Moustache (Watson)"
+ icon_state = "facial_watson"
+
+/datum/sprite_accessory/facial_hair/shaved
+ name = "Shaved"
+ icon_state = null
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/elvis
+ name = "Sideburns (Elvis)"
+ icon_state = "facial_elvis"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
new file mode 100644
index 0000000000..66c79ea0f0
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
@@ -0,0 +1,460 @@
+//////////////////////
+// Hair Definitions //
+//////////////////////
+/datum/sprite_accessory/hair
+ icon = 'icons/mob/human_face.dmi' // default icon for all hairs
+
+ // please make sure they're sorted alphabetically and, where needed, categorized
+ // try to capitalize the names please~
+ // try to spell
+ // you do not need to define _s or _l sub-states, game automatically does this for you
+
+/datum/sprite_accessory/hair/afro
+ name = "Afro"
+ icon_state = "hair_afro"
+
+/datum/sprite_accessory/hair/afro2
+ name = "Afro 2"
+ icon_state = "hair_afro2"
+
+/datum/sprite_accessory/hair/afro_large
+ name = "Afro (Large)"
+ icon_state = "hair_bigafro"
+
+/datum/sprite_accessory/hair/antenna
+ name = "Ahoge"
+ icon_state = "hair_antenna"
+
+/datum/sprite_accessory/hair/bald
+ name = "Bald"
+ icon_state = null
+
+/datum/sprite_accessory/hair/balding
+ name = "Balding Hair"
+ icon_state = "hair_e"
+
+/datum/sprite_accessory/hair/bedhead
+ name = "Bedhead"
+ icon_state = "hair_bedhead"
+
+/datum/sprite_accessory/hair/bedhead2
+ name = "Bedhead 2"
+ icon_state = "hair_bedheadv2"
+
+/datum/sprite_accessory/hair/bedhead3
+ name = "Bedhead 3"
+ icon_state = "hair_bedheadv3"
+
+/datum/sprite_accessory/hair/beehive
+ name = "Beehive"
+ icon_state = "hair_beehive"
+
+/datum/sprite_accessory/hair/beehive2
+ name = "Beehive 2"
+ icon_state = "hair_beehivev2"
+
+/datum/sprite_accessory/hair/bob
+ name = "Bob Hair"
+ icon_state = "hair_bob"
+
+/datum/sprite_accessory/hair/bob2
+ name = "Bob Hair 2"
+ icon_state = "hair_bob2"
+
+/datum/sprite_accessory/hair/bob3
+ name = "Bob Hair 3"
+ icon_state = "hair_bobcut"
+
+/datum/sprite_accessory/hair/bobcurl
+ name = "Bobcurl"
+ icon_state = "hair_bobcurl"
+
+/datum/sprite_accessory/hair/boddicker
+ name = "Boddicker"
+ icon_state = "hair_boddicker"
+
+/datum/sprite_accessory/hair/bowl
+ name = "Bowl"
+ icon_state = "hair_bowlcut"
+
+/datum/sprite_accessory/hair/braid
+ name = "Braid (Floorlength)"
+ icon_state = "hair_braid"
+
+/datum/sprite_accessory/hair/braided
+ name = "Braided"
+ icon_state = "hair_braided"
+
+/datum/sprite_accessory/hair/front_braid
+ name = "Braided Front"
+ icon_state = "hair_braidfront"
+
+/datum/sprite_accessory/hair/not_floorlength_braid
+ name = "Braid (High)"
+ icon_state = "hair_braid2"
+
+/datum/sprite_accessory/hair/lowbraid
+ name = "Braid (Low)"
+ icon_state = "hair_hbraid"
+
+/datum/sprite_accessory/hair/shortbraid
+ name = "Braid (Short)"
+ icon_state = "hair_shortbraid"
+
+/datum/sprite_accessory/hair/braidtail
+ name = "Braided Tail"
+ icon_state = "hair_braidtail"
+
+/datum/sprite_accessory/hair/bun
+ name = "Bun Head"
+ icon_state = "hair_bun"
+
+/datum/sprite_accessory/hair/bun2
+ name = "Bun Head 2"
+ icon_state = "hair_bunhead2"
+
+/datum/sprite_accessory/hair/largebun
+ name = "Bun (Large)"
+ icon_state = "hair_largebun"
+
+/datum/sprite_accessory/hair/business
+ name = "Business Hair"
+ icon_state = "hair_business"
+
+/datum/sprite_accessory/hair/business2
+ name = "Business Hair 2"
+ icon_state = "hair_business2"
+
+/datum/sprite_accessory/hair/business3
+ name = "Business Hair 3"
+ icon_state = "hair_business3"
+
+/datum/sprite_accessory/hair/business4
+ name = "Business Hair 4"
+ icon_state = "hair_business4"
+
+/datum/sprite_accessory/hair/buzz
+ name = "Buzzcut"
+ icon_state = "hair_buzzcut"
+
+/datum/sprite_accessory/hair/combover
+ name = "Combover"
+ icon_state = "hair_combover"
+
+/datum/sprite_accessory/hair/crew
+ name = "Crewcut"
+ icon_state = "hair_crewcut"
+
+/datum/sprite_accessory/hair/curls
+ name = "Curls"
+ icon_state = "hair_curls"
+
+/datum/sprite_accessory/hair/cut
+ name = "Cut Hair"
+ icon_state = "hair_c"
+
+/datum/sprite_accessory/hair/devillock
+ name = "Devil Lock"
+ icon_state = "hair_devilock"
+
+/datum/sprite_accessory/hair/dreadlocks
+ name = "Dreadlocks"
+ icon_state = "hair_dreads"
+
+/datum/sprite_accessory/hair/drillhair
+ name = "Drill Hair"
+ icon_state = "hair_drillhair"
+
+/datum/sprite_accessory/hair/drillhairextended
+ name = "Drill Hair (Extended)"
+ icon_state = "hair_drillhairextended"
+
+/datum/sprite_accessory/hair/emo
+ name = "Emo"
+ icon_state = "hair_emo"
+
+/datum/sprite_accessory/hair/feather
+ name = "Feather"
+ icon_state = "hair_feather"
+
+/datum/sprite_accessory/hair/sargeant
+ name = "Flat Top"
+ icon_state = "hair_sargeant"
+
+/datum/sprite_accessory/hair/bigflattop
+ name = "Flat Top (Big)"
+ icon_state = "hair_bigflattop"
+
+/datum/sprite_accessory/hair/fag
+ name = "Flow Hair"
+ icon_state = "hair_f"
+
+/datum/sprite_accessory/hair/gelled
+ name = "Gelled Back"
+ icon_state = "hair_gelled"
+
+/datum/sprite_accessory/hair/gentle
+ name = "Gentle"
+ icon_state = "hair_gentle"
+
+/datum/sprite_accessory/hair/halfbang
+ name = "Half-banged Hair"
+ icon_state = "hair_halfbang"
+
+/datum/sprite_accessory/hair/halfbang2
+ name = "Half-banged Hair 2"
+ icon_state = "hair_halfbang2"
+
+/datum/sprite_accessory/hair/hedgehog
+ name = "Hedgehog Hair"
+ icon_state = "hair_hedgehog"
+
+/datum/sprite_accessory/hair/himecut
+ name = "Hime Cut"
+ icon_state = "hair_himecut"
+
+/datum/sprite_accessory/hair/himecut2
+ name = "Hime Cut 2"
+ icon_state = "hair_himecut2"
+
+/datum/sprite_accessory/hair/himeup
+ name = "Hime Updo"
+ icon_state = "hair_himeup"
+
+/datum/sprite_accessory/hair/hitop
+ name = "Hitop"
+ icon_state = "hair_hitop"
+
+/datum/sprite_accessory/hair/jensen
+ name = "Jensen Hair"
+ icon_state = "hair_jensen"
+
+/datum/sprite_accessory/hair/keanu
+ name = "Keanu Hair"
+ icon_state = "hair_keanu"
+
+/datum/sprite_accessory/hair/kusangi
+ name = "Kusanagi Hair"
+ icon_state = "hair_kusanagi"
+
+/datum/sprite_accessory/hair/long
+ name = "Long Hair 1"
+ icon_state = "hair_long"
+
+/datum/sprite_accessory/hair/long2
+ name = "Long Hair 2"
+ icon_state = "hair_long2"
+
+/datum/sprite_accessory/hair/long3
+ name = "Long Hair 3"
+ icon_state = "hair_long3"
+
+/datum/sprite_accessory/hair/long_over_eye
+ name = "Long Over Eye"
+ icon_state = "hair_longovereye"
+
+/datum/sprite_accessory/hair/longbangs
+ name = "Long Bangs"
+ icon_state = "hair_lbangs"
+
+/datum/sprite_accessory/hair/longemo
+ name = "Long Emo"
+ icon_state = "hair_longemo"
+
+/datum/sprite_accessory/hair/longfringe
+ name = "Long Fringe"
+ icon_state = "hair_longfringe"
+
+/datum/sprite_accessory/hair/sidepartlongalt
+ name = "Long Side Part"
+ icon_state = "hair_longsidepart"
+
+/datum/sprite_accessory/hair/megaeyebrows
+ name = "Mega Eyebrows"
+ icon_state = "hair_megaeyebrows"
+
+/datum/sprite_accessory/hair/messy
+ name = "Messy"
+ icon_state = "hair_messy"
+
+/datum/sprite_accessory/hair/mohawk
+ name = "Mohawk"
+ icon_state = "hair_d"
+
+/datum/sprite_accessory/hair/reversemohawk
+ name = "Mohawk (Reverse)"
+ icon_state = "hair_reversemohawk"
+
+/datum/sprite_accessory/hair/odango
+ name = "Odango"
+ icon_state = "hair_odango"
+
+/datum/sprite_accessory/hair/ombre
+ name = "Ombre"
+ icon_state = "hair_ombre"
+
+/datum/sprite_accessory/hair/oneshoulder
+ name = "One Shoulder"
+ icon_state = "hair_oneshoulder"
+
+/datum/sprite_accessory/hair/over_eye
+ name = "Over Eye"
+ icon_state = "hair_shortovereye"
+
+//Donator item - fractious
+/datum/sprite_accessory/hair/over_eye_fr
+ name = "Over Eye (fract)"
+ icon_state = "hair_shortovereye_1f"
+ ckeys_allowed = list("fractious")
+
+/datum/sprite_accessory/hair/parted
+ name = "Parted"
+ icon_state = "hair_parted"
+
+/datum/sprite_accessory/hair/partedside
+ name = "Parted (Side)"
+ icon_state = "hair_part"
+
+/datum/sprite_accessory/hair/kagami
+ name = "Pigtails"
+ icon_state = "hair_kagami"
+
+/datum/sprite_accessory/hair/pigtail
+ name = "Pigtails 2"
+ icon_state = "hair_pigtails"
+
+/datum/sprite_accessory/hair/pigtail2
+ name = "Pigtails 3"
+ icon_state = "hair_pigtails2"
+
+/datum/sprite_accessory/hair/pixie
+ name = "Pixie Cut"
+ icon_state = "hair_pixie"
+
+/datum/sprite_accessory/hair/pompadour
+ name = "Pompadour"
+ icon_state = "hair_pompadour"
+
+/datum/sprite_accessory/hair/bigpompadour
+ name = "Pompadour (Big)"
+ icon_state = "hair_bigpompadour"
+
+/datum/sprite_accessory/hair/ponytail1
+ name = "Ponytail"
+ icon_state = "hair_ponytail"
+
+/datum/sprite_accessory/hair/ponytail2
+ name = "Ponytail 2"
+ icon_state = "hair_ponytail2"
+
+/datum/sprite_accessory/hair/ponytail3
+ name = "Ponytail 3"
+ icon_state = "hair_ponytail3"
+
+/datum/sprite_accessory/hair/ponytail4
+ name = "Ponytail 4"
+ icon_state = "hair_ponytail4"
+
+/datum/sprite_accessory/hair/ponytail5
+ name = "Ponytail 5"
+ icon_state = "hair_ponytail5"
+
+/datum/sprite_accessory/hair/highponytail
+ name = "Ponytail (High)"
+ icon_state = "hair_highponytail"
+
+/datum/sprite_accessory/hair/longponytail
+ name = "Ponytail (Long)"
+ icon_state = "hair_longstraightponytail"
+
+/datum/sprite_accessory/hair/sidetail
+ name = "Ponytail (Side)"
+ icon_state = "hair_sidetail"
+
+/datum/sprite_accessory/hair/sidetail2
+ name = "Ponytail (Side) 2"
+ icon_state = "hair_sidetail2"
+
+/datum/sprite_accessory/hair/sidetail3
+ name = "Ponytail (Side) 3"
+ icon_state = "hair_sidetail3"
+
+/datum/sprite_accessory/hair/sidetail4
+ name = "Ponytail (Side) 4"
+ icon_state = "hair_sidetail4"
+
+/datum/sprite_accessory/hair/quiff
+ name = "Quiff"
+ icon_state = "hair_quiff"
+
+/datum/sprite_accessory/hair/short
+ name = "Short Hair"
+ icon_state = "hair_a"
+
+/datum/sprite_accessory/hair/shorthair2
+ name = "Short Hair 2"
+ icon_state = "hair_shorthair2"
+
+/datum/sprite_accessory/hair/shorthair3
+ name = "Short Hair 3"
+ icon_state = "hair_shorthair3"
+
+/datum/sprite_accessory/hair/shoulderlength
+ name = "Shoulder-length Hair"
+ icon_state = "hair_b"
+
+/datum/sprite_accessory/hair/sidecut
+ name = "Sidecut"
+ icon_state = "hair_sidecut"
+
+/datum/sprite_accessory/hair/skinhead
+ name = "Skinhead"
+ icon_state = "hair_skinhead"
+
+/datum/sprite_accessory/hair/protagonist
+ name = "Slightly Long Hair"
+ icon_state = "hair_protagonist"
+
+/datum/sprite_accessory/hair/spiky
+ name = "Spiky"
+ icon_state = "hair_spikey"
+
+/datum/sprite_accessory/hair/spiky2
+ name = "Spiky 2"
+ icon_state = "hair_spiky"
+
+/datum/sprite_accessory/hair/spiky3
+ name = "Spiky 3"
+ icon_state = "hair_spiky2"
+
+/datum/sprite_accessory/hair/swept
+ name = "Swept Back Hair"
+ icon_state = "hair_swept"
+
+/datum/sprite_accessory/hair/swept2
+ name = "Swept Back Hair 2"
+ icon_state = "hair_swept2"
+
+/datum/sprite_accessory/hair/tressshoulder
+ name = "Tress Shoulder"
+ icon_state = "hair_tressshoulder"
+
+/datum/sprite_accessory/hair/updo
+ name = "Updo"
+ icon_state = "hair_updo"
+
+/datum/sprite_accessory/hair/longer
+ name = "Very Long Hair"
+ icon_state = "hair_vlong"
+
+/datum/sprite_accessory/hair/longest
+ name = "Very Long Hair 2"
+ icon_state = "hair_longest"
+
+/datum/sprite_accessory/hair/longest2
+ name = "Very Long Over Eye"
+ icon_state = "hair_longest2"
+
+/datum/sprite_accessory/hair/longestalt
+ name = "Very Long with Fringe"
+ icon_state = "hair_vlongfringe"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm
new file mode 100644
index 0000000000..607ad650e3
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm
@@ -0,0 +1,26 @@
+/datum/sprite_accessory/horns
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/horns/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/horns/simple
+ name = "Simple"
+ icon_state = "simple"
+
+/datum/sprite_accessory/horns/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/horns/curled
+ name = "Curled"
+ icon_state = "curled"
+
+/datum/sprite_accessory/horns/ram
+ name = "Ram"
+ icon_state = "ram"
+
+/datum/sprite_accessory/horns/angler
+ name = "Angeler"
+ icon_state = "angler"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/legs.dm b/code/modules/mob/dead/new_player/sprite_accessories/legs.dm
new file mode 100644
index 0000000000..7663100822
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/legs.dm
@@ -0,0 +1,8 @@
+/datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them.
+ icon = null //These datums exist for selecting legs on preference, and little else
+
+/datum/sprite_accessory/legs/none
+ name = "Normal Legs"
+
+/datum/sprite_accessory/legs/digitigrade_lizard
+ name = "Digitigrade Legs"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/moth_wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/moth_wings.dm
new file mode 100644
index 0000000000..6b8036bd69
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/moth_wings.dm
@@ -0,0 +1,68 @@
+/datum/sprite_accessory/moth_wings
+ icon = 'icons/mob/wings.dmi'
+ color_src = null
+
+/datum/sprite_accessory/moth_wings/plain
+ name = "Plain"
+ icon_state = "plain"
+
+/datum/sprite_accessory/moth_wings/monarch
+ name = "Monarch"
+ icon_state = "monarch"
+
+/datum/sprite_accessory/moth_wings/luna
+ name = "Luna"
+ icon_state = "luna"
+
+/datum/sprite_accessory/moth_wings/atlas
+ name = "Atlas"
+ icon_state = "atlas"
+
+/datum/sprite_accessory/moth_wings/reddish
+ name = "Reddish"
+ icon_state = "redish"
+
+/datum/sprite_accessory/moth_wings/royal
+ name = "Royal"
+ icon_state = "royal"
+
+/datum/sprite_accessory/moth_wings/gothic
+ name = "Gothic"
+ icon_state = "gothic"
+
+/datum/sprite_accessory/moth_wings/lovers
+ name = "Lovers"
+ icon_state = "lovers"
+
+/datum/sprite_accessory/moth_wings/whitefly
+ name = "White Fly"
+ icon_state = "whitefly"
+
+/datum/sprite_accessory/moth_wings/punished
+ name = "Burnt Off"
+ icon_state = "punished"
+ locked = TRUE
+
+/datum/sprite_accessory/moth_wings/firewatch
+ name = "Firewatch"
+ icon_state = "firewatch"
+
+/datum/sprite_accessory/moth_wings/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
+
+/datum/sprite_accessory/moth_wings/poison
+ name = "Poison"
+ icon_state = "poison"
+
+/datum/sprite_accessory/moth_wings/ragged
+ name = "Ragged"
+ icon_state = "ragged"
+
+/datum/sprite_accessory/moth_wings/moonfly
+ name = "Moon Fly"
+ icon_state = "moonfly"
+
+/datum/sprite_accessory/moth_wings/snow
+ name = "Snow"
+ icon_state = "snow"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/pines.dm b/code/modules/mob/dead/new_player/sprite_accessories/pines.dm
new file mode 100644
index 0000000000..4ccbc3d9ea
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/pines.dm
@@ -0,0 +1,53 @@
+/datum/sprite_accessory/spines
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/spines_animated
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/spines/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/spines_animated/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/spines/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/spines_animated/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/spines/shortmeme
+ name = "Short + Membrane"
+ icon_state = "shortmeme"
+
+/datum/sprite_accessory/spines_animated/shortmeme
+ name = "Short + Membrane"
+ icon_state = "shortmeme"
+
+/datum/sprite_accessory/spines/long
+ name = "Long"
+ icon_state = "long"
+
+/datum/sprite_accessory/spines_animated/long
+ name = "Long"
+ icon_state = "long"
+
+/datum/sprite_accessory/spines/longmeme
+ name = "Long + Membrane"
+ icon_state = "longmeme"
+
+/datum/sprite_accessory/spines_animated/longmeme
+ name = "Long + Membrane"
+ icon_state = "longmeme"
+
+/datum/sprite_accessory/spines/aqautic
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/spines_animated/aqautic
+ name = "Aquatic"
+ icon_state = "aqua"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
new file mode 100644
index 0000000000..c663c08d69
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
@@ -0,0 +1,18 @@
+/datum/sprite_accessory/snouts
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/snouts/sharp
+ name = "Sharp"
+ icon_state = "sharp"
+
+/datum/sprite_accessory/snouts/round
+ name = "Round"
+ icon_state = "round"
+
+/datum/sprite_accessory/snouts/sharplight
+ name = "Sharp + Light"
+ icon_state = "sharplight"
+
+/datum/sprite_accessory/snouts/roundlight
+ name = "Round + Light"
+ icon_state = "roundlight"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
new file mode 100644
index 0000000000..5a5d37d4e7
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
@@ -0,0 +1,96 @@
+///////////////////////
+// Socks Definitions //
+///////////////////////
+
+/datum/sprite_accessory/socks
+ icon = 'icons/mob/underwear.dmi'
+
+/datum/sprite_accessory/socks/nude
+ name = "Nude"
+ icon_state = null
+
+// please make sure they're sorted alphabetically and categorized
+
+/datum/sprite_accessory/socks/black_knee
+ name = "Knee-high (Black)"
+ icon_state = "black_knee"
+
+/datum/sprite_accessory/socks/commie_knee
+ name = "Knee-High (Commie)"
+ icon_state = "commie_knee"
+
+/datum/sprite_accessory/socks/usa_knee
+ name = "Knee-High (Freedom)"
+ icon_state = "assblastusa_knee"
+
+/datum/sprite_accessory/socks/rainbow_knee
+ name = "Knee-high (Rainbow)"
+ icon_state = "rainbow_knee"
+
+/datum/sprite_accessory/socks/striped_knee
+ name = "Knee-high (Striped)"
+ icon_state = "striped_knee"
+
+/datum/sprite_accessory/socks/thin_knee
+ name = "Knee-high (Thin)"
+ icon_state = "thin_knee"
+
+/datum/sprite_accessory/socks/uk_knee
+ name = "Knee-High (UK)"
+ icon_state = "uk_knee"
+
+/datum/sprite_accessory/socks/white_knee
+ name = "Knee-high (White)"
+ icon_state = "white_knee"
+
+/datum/sprite_accessory/socks/black_norm
+ name = "Normal (Black)"
+ icon_state = "black_norm"
+
+/datum/sprite_accessory/socks/white_norm
+ name = "Normal (White)"
+ icon_state = "white_norm"
+
+/datum/sprite_accessory/socks/pantyhose
+ name = "Pantyhose"
+ icon_state = "pantyhose"
+
+/datum/sprite_accessory/socks/black_short
+ name = "Short (Black)"
+ icon_state = "black_short"
+
+/datum/sprite_accessory/socks/white_short
+ name = "Short (White)"
+ icon_state = "white_short"
+
+/datum/sprite_accessory/socks/black_thigh
+ name = "Thigh-high (Black)"
+ icon_state = "black_thigh"
+
+/datum/sprite_accessory/socks/commie_thigh
+ name = "Thigh-high (Commie)"
+ icon_state = "commie_thigh"
+
+/datum/sprite_accessory/socks/usa_thigh
+ name = "Thigh-high (Freedom)"
+ icon_state = "assblastusa_thigh"
+
+/datum/sprite_accessory/socks/rainbow_thigh
+ name = "Thigh-high (Rainbow)"
+ icon_state = "rainbow_thigh"
+
+/datum/sprite_accessory/socks/striped_thigh
+ name = "Thigh-high (Striped)"
+ icon_state = "striped_thigh"
+
+/datum/sprite_accessory/socks/thin_thigh
+ name = "Thigh-high (Thin)"
+ icon_state = "thin_thigh"
+
+/datum/sprite_accessory/socks/uk_thigh
+ name = "Thigh-high (UK)"
+ icon_state = "uk_thigh"
+
+/datum/sprite_accessory/socks/white_thigh
+ name = "Thigh-high (White)"
+ icon_state = "white_thigh"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
new file mode 100644
index 0000000000..31faabf663
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -0,0 +1,55 @@
+/datum/sprite_accessory/tails
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/tails_animated
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/tails/lizard/smooth
+ name = "Smooth"
+ icon_state = "smooth"
+
+/datum/sprite_accessory/tails_animated/lizard/smooth
+ name = "Smooth"
+ icon_state = "smooth"
+
+/datum/sprite_accessory/tails/lizard/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/tails_animated/lizard/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/tails/lizard/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails_animated/lizard/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails/lizard/spikes
+ name = "Spikes"
+ icon_state = "spikes"
+
+/datum/sprite_accessory/tails_animated/lizard/spikes
+ name = "Spikes"
+ icon_state = "spikes"
+
+/datum/sprite_accessory/tails/human/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/tails_animated/human/none
+ name = "None"
+ icon_state = "none"
+/*
+/datum/sprite_accessory/tails/human/cat
+ name = "Cat"
+ icon_state = "cat"
+ color_src = HAIR
+
+/datum/sprite_accessory/tails_animated/human/cat
+ name = "Cat"
+ icon_state = "cat"
+ color_src = HAIR*/
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
new file mode 100644
index 0000000000..7c66ef51e3
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
@@ -0,0 +1,308 @@
+////////////////////////////
+// Undershirt Definitions //
+////////////////////////////
+
+/datum/sprite_accessory/undershirt
+ icon = 'icons/mob/underwear.dmi'
+ gender = NEUTER
+
+/datum/sprite_accessory/undershirt/nude
+ name = "Nude"
+ icon_state = null
+
+// please make sure they're sorted alphabetically and categorized
+
+/datum/sprite_accessory/undershirt/bluejersey
+ name = "Shirt, Jersey - Blue"
+ icon_state = "shirt_bluejersey"
+
+/datum/sprite_accessory/undershirt/redjersey
+ name = "Shirt, Jersey - Red"
+ icon_state = "shirt_redjersey"
+
+/datum/sprite_accessory/undershirt/bluepolo
+ name = "Shirt, Polo - Blue"
+ icon_state = "bluepolo"
+
+/datum/sprite_accessory/undershirt/grayyellowpolo
+ name = "Shirt, Polo - Gray, Yellow"
+ icon_state = "grayyellowpolo"
+
+/datum/sprite_accessory/undershirt/redpolo
+ name = "Shirt, Polo - Red"
+ icon_state = "redpolo"
+
+/datum/sprite_accessory/undershirt/whitepolo
+ name = "Shirt, Polo - White"
+ icon_state = "whitepolo"
+
+/datum/sprite_accessory/undershirt/alienshirt
+ name = "Shirt - Alien"
+ icon_state = "shirt_alien"
+
+/datum/sprite_accessory/undershirt/mondmondjaja
+ name = "Shirt - Band"
+ icon_state = "band"
+
+/datum/sprite_accessory/undershirt/shirt_black
+ name = "Shirt - Black"
+ icon_state = "shirt_black"
+
+/datum/sprite_accessory/undershirt/blueshirt
+ name = "Shirt - Blue"
+ icon_state = "shirt_blue"
+
+/datum/sprite_accessory/undershirt/clownshirt
+ name = "Shirt - Clown"
+ icon_state = "shirt_clown"
+
+/datum/sprite_accessory/undershirt/commie
+ name = "Shirt - Commie"
+ icon_state = "shirt_commie"
+
+/datum/sprite_accessory/undershirt/greenshirt
+ name = "Shirt - Green"
+ icon_state = "shirt_green"
+
+/datum/sprite_accessory/undershirt/shirt_grey
+ name = "Shirt - Grey"
+ icon_state = "shirt_grey"
+
+/datum/sprite_accessory/undershirt/ian
+ name = "Shirt - Ian"
+ icon_state = "ian"
+
+/datum/sprite_accessory/undershirt/ilovent
+ name = "Shirt - I Love NT"
+ icon_state = "ilovent"
+
+/datum/sprite_accessory/undershirt/lover
+ name = "Shirt - Lover"
+ icon_state = "lover"
+
+/datum/sprite_accessory/undershirt/matroska
+ name = "Shirt - Matroska"
+ icon_state = "matroska"
+
+/datum/sprite_accessory/undershirt/meat
+ name = "Shirt - Meat"
+ icon_state = "shirt_meat"
+
+/datum/sprite_accessory/undershirt/nano
+ name = "Shirt - Nanotrasen"
+ icon_state = "shirt_nano"
+
+/datum/sprite_accessory/undershirt/peace
+ name = "Shirt - Peace"
+ icon_state = "peace"
+
+/datum/sprite_accessory/undershirt/pacman
+ name = "Shirt - Pogoman"
+ icon_state = "pogoman"
+
+/datum/sprite_accessory/undershirt/question
+ name = "Shirt - Question"
+ icon_state = "shirt_question"
+
+/datum/sprite_accessory/undershirt/redshirt
+ name = "Shirt - Red"
+ icon_state = "shirt_red"
+
+/datum/sprite_accessory/undershirt/skull
+ name = "Shirt - Skull"
+ icon_state = "shirt_skull"
+
+/datum/sprite_accessory/undershirt/ss13
+ name = "Shirt - SS13"
+ icon_state = "shirt_ss13"
+
+/datum/sprite_accessory/undershirt/stripe
+ name = "Shirt - Striped"
+ icon_state = "shirt_stripes"
+
+/datum/sprite_accessory/undershirt/tiedye
+ name = "Shirt - Tie-dye"
+ icon_state = "shirt_tiedye"
+
+/datum/sprite_accessory/undershirt/uk
+ name = "Shirt - UK"
+ icon_state = "uk"
+
+/datum/sprite_accessory/undershirt/usa
+ name = "Shirt - USA"
+ icon_state = "shirt_assblastusa"
+
+/datum/sprite_accessory/undershirt/shirt_white
+ name = "Shirt - White"
+ icon_state = "shirt_white"
+
+/datum/sprite_accessory/undershirt/blackshortsleeve
+ name = "Shirt, Short Sleeved - Black"
+ icon_state = "blackshortsleeve"
+
+/datum/sprite_accessory/undershirt/blueshortsleeve
+ name = "Shirt, Short Sleeved - Blue"
+ icon_state = "blueshortsleeve"
+
+/datum/sprite_accessory/undershirt/greenshortsleeve
+ name = "Shirt, Short Sleeved - Green"
+ icon_state = "greenshortsleeve"
+
+/datum/sprite_accessory/undershirt/purpleshortsleeve
+ name = "Shirt, Short Sleeved - Purple"
+ icon_state = "purpleshortsleeve"
+
+/datum/sprite_accessory/undershirt/whiteshortsleeve
+ name = "Shirt, Short Sleeved - White"
+ icon_state = "whiteshortsleeve"
+
+/datum/sprite_accessory/undershirt/blueshirtsport
+ name = "Shirt, Sports - Blue"
+ icon_state = "blueshirtsport"
+ gender = NEUTER
+
+/datum/sprite_accessory/undershirt/greenshirtsport
+ name = "Shirt, Sports - Green"
+ icon_state = "greenshirtsport"
+ gender = NEUTER
+
+/datum/sprite_accessory/undershirt/redshirtsport
+ name = "Shirt, Sports - Red"
+ icon_state = "redshirtsport"
+ gender = NEUTER
+
+/datum/sprite_accessory/undershirt/redtop
+ name = "Shirt, Short - Red"
+ icon_state = "redtop"
+
+/datum/sprite_accessory/undershirt/whitetop
+ name = "Shirt, Short - White"
+ icon_state = "whitetop"
+
+/datum/sprite_accessory/undershirt/tshirt_blue
+ name = "T-Shirt - Blue"
+ icon_state = "blueshirt"
+
+/datum/sprite_accessory/undershirt/tshirt_green
+ name = "T-Shirt - Green"
+ icon_state = "greenshirt"
+
+/datum/sprite_accessory/undershirt/tshirt_red
+ name = "T-Shirt - Red"
+ icon_state = "redshirt"
+
+/datum/sprite_accessory/undershirt/yellowshirt
+ name = "T-Shirt - Yellow"
+ icon_state = "yellowshirt"
+
+/datum/sprite_accessory/undershirt/tank_black
+ name = "Tank Top - Black"
+ icon_state = "tank_black"
+
+/datum/sprite_accessory/undershirt/tankfire
+ name = "Tank Top - Fire"
+ icon_state = "tank_fire"
+
+/datum/sprite_accessory/undershirt/tank_grey
+ name = "Tank Top - Grey"
+ icon_state = "tank_grey"
+
+/datum/sprite_accessory/undershirt/female_midriff
+ name = "Tank Top - Midriff"
+ icon_state = "tank_midriff"
+
+/datum/sprite_accessory/undershirt/tank_red
+ name = "Tank Top - Red"
+ icon_state = "tank_red"
+
+/datum/sprite_accessory/undershirt/tankstripe
+ name = "Tank Top - Striped"
+ icon_state = "tank_stripes"
+
+/datum/sprite_accessory/undershirt/tank_white
+ name = "Tank Top - White"
+ icon_state = "tank_white"
+
+/datum/sprite_accessory/undershirt/female_red
+ name = "Bra - Red"
+ icon_state = "bra_red"
+
+/datum/sprite_accessory/undershirt/female_pink
+ name = "Bra - Pink"
+ icon_state = "bra_pink"
+
+/datum/sprite_accessory/undershirt/female_kinky
+ name = "Bra - Kinky Black"
+ icon_state = "bra_kinky"
+
+/datum/sprite_accessory/undershirt/female_green
+ name = "Bra - Green"
+ icon_state = "bra_green"
+
+/datum/sprite_accessory/undershirt/female_commie
+ name = "Bra - Freedom"
+ icon_state = "bra_assblastusa"
+
+/datum/sprite_accessory/undershirt/female_commie
+ name = "Bra - Commie"
+ icon_state = "bra_commie"
+
+/datum/sprite_accessory/undershirt/female_babyblue
+ name = "Bra, Baby Blue"
+ icon_state = "bra_babyblue"
+
+/datum/sprite_accessory/undershirt/female_black
+ name = "Bra - Black"
+ icon_state = "bra_black"
+
+/datum/sprite_accessory/undershirt/female_uk
+ name = "Bra - UK"
+ icon_state = "bra_uk"
+
+/datum/sprite_accessory/undershirt/female_white
+ name = "Bra - White"
+ icon_state = "bra_white"
+
+/datum/sprite_accessory/undershirt/female_white_neko
+ name = "Bra, Neko - white"
+ icon_state = "bra_neko_white"
+
+/datum/sprite_accessory/undershirt/female_black_neko
+ name = "Bra, Neko - Black"
+ icon_state = "bra_neko_black"
+
+/datum/sprite_accessory/undershirt/female_blackalt
+ name = "Bra, Sports - Black"
+ icon_state = "bra_sports_black"
+
+/datum/sprite_accessory/undershirt/sports_bra
+ name = "Bra, Sports 1 - White"
+ icon_state = "sports_bra"
+
+/datum/sprite_accessory/undershirt/female_whitealt
+ name = "Bra, Sports 2 - White"
+ icon_state = "bra_sports_white"
+
+/datum/sprite_accessory/undershirt/sports_bra2
+ name = "Bra, Sports 3 - White"
+ icon_state = "sports_bra_alt"
+
+/datum/sprite_accessory/undershirt/female_yellow
+ name = "Bra - Yellow"
+ icon_state = "bra_yellow"
+
+/datum/sprite_accessory/undershirt/female_thong
+ name = "Bra, Strapless - Pink"
+ icon_state = "bra_strapless_pink"
+
+/datum/sprite_accessory/undershirt/female_blue
+ name = "Bra, Strapless - Blue"
+ icon_state = "bra_blue"
+
+/datum/sprite_accessory/undershirt/swimsuit_green
+ name = "Swimsuit, Top - Green"
+ icon_state = "bra_swimming_green"
+
+/datum/sprite_accessory/undershirt/swimsuit_purple
+ name = "Swimsuit, Top - Purple"
+ icon_state = "bra_swimming_purple"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm
new file mode 100644
index 0000000000..6beed231aa
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm
@@ -0,0 +1,171 @@
+///////////////////////////
+// Underwear Definitions //
+///////////////////////////
+/datum/sprite_accessory/underwear
+ icon = 'icons/mob/underwear.dmi'
+ gender = NEUTER
+
+/datum/sprite_accessory/underwear/nude
+ name = "Nude"
+ icon_state = null
+
+/datum/sprite_accessory/underwear/mankini
+ name = "Mankini - Green"
+ icon_state = "mankini_green"
+
+/datum/sprite_accessory/underwear/male_kinky
+ name = "Jockstrap - White"
+ icon_state = "jockstrap_white"
+
+/datum/sprite_accessory/underwear/male_white
+ name = "Briefs - White"
+ icon_state = "briefs_white"
+
+/datum/sprite_accessory/underwear/male_black
+ name = "Briefs - Black"
+ icon_state = "briefs_black"
+
+/datum/sprite_accessory/underwear/male_grey
+ name = "Briefs - Grey"
+ icon_state = "briefs_grey"
+
+/datum/sprite_accessory/underwear/male_red
+ name = "Briefs - Red"
+ icon_state = "briefs_red"
+
+/datum/sprite_accessory/underwear/male_green
+ name = "Briefs - Green"
+ icon_state = "briefs_green"
+
+/datum/sprite_accessory/underwear/male_blue
+ name = "Briefs - Blue"
+ icon_state = "briefs_blue"
+
+/datum/sprite_accessory/underwear/male_blackalt
+ name = "Boxers - Black"
+ icon_state = "boxers_black"
+
+/datum/sprite_accessory/underwear/male_greyalt
+ name = "Boxers - Grey"
+ icon_state = "boxers_grey"
+
+/datum/sprite_accessory/underwear/male_hearts
+ name = "Boxers - Heart"
+ icon_state = "boxers_heart"
+
+/datum/sprite_accessory/underwear/male_stripe
+ name = "Boxers - Striped"
+ icon_state = "boxers_striped"
+
+/datum/sprite_accessory/underwear/male_commie
+ name = "Boxers - Striped Communist"
+ icon_state = "boxers_commie"
+
+/datum/sprite_accessory/underwear/male_usastripe
+ name = "Boxers - Striped Freedom"
+ icon_state = "boxers_assblastusa"
+
+/datum/sprite_accessory/underwear/male_uk
+ name = "Boxers - Striped UK"
+ icon_state = "boxers_uk"
+
+
+/datum/sprite_accessory/underwear/female_whitealt
+ name = "Boxer Briefs - White"
+ icon_state = "boxer_briefs_white"
+
+/datum/sprite_accessory/underwear/female_blackalt
+ name = "Boxer Briefs - Black"
+ icon_state = "boxer_briefs_black"
+
+/datum/sprite_accessory/underwear/female_pink
+ name = "Boxer Briefs - Pink"
+ icon_state = "boxer_briefs_pink"
+
+/datum/sprite_accessory/underwear/female_babyblue
+ name = "Boxer Briefs - Baby Blue"
+ icon_state = "boxer_briefs_babyblue"
+
+/datum/sprite_accessory/underwear/female_yellow
+ name = "Boxer Briefs - Yellow"
+ icon_state = "boxer_briefs_yellow"
+
+
+/datum/sprite_accessory/underwear/female_black
+ name = "Panties - Black"
+ icon_state = "panties_black"
+
+/datum/sprite_accessory/underwear/female_blue
+ name = "Panties - Blue"
+ icon_state = "panties_blue"
+
+/datum/sprite_accessory/underwear/female_commie
+ name = "Panties - Commie"
+ icon_state = "panties_commie"
+
+/datum/sprite_accessory/underwear/female_usastripe
+ name = "Panties - Freedom"
+ icon_state = "panties_assblastusa"
+
+/datum/sprite_accessory/underwear/female_green
+ name = "Panties - Green"
+ icon_state = "panties_green"
+
+/datum/sprite_accessory/underwear/female_kinky
+ name = "Panties - Kinky Black"
+ icon_state = "panties_kinky"
+
+/datum/sprite_accessory/underwear/female_red
+ name = "Panties - Red"
+ icon_state = "panties_red"
+
+/datum/sprite_accessory/underwear/female_uk
+ name = "Panties - UK"
+ icon_state = "panties_uk"
+
+/datum/sprite_accessory/underwear/female_white
+ name = "Panties - White"
+ icon_state = "panties_white"
+
+/datum/sprite_accessory/underwear/female_white_neko
+ name = "Panties, Neko - White"
+ icon_state = "panties_neko_white"
+
+/datum/sprite_accessory/underwear/female_black_neko
+ name = "Panties, Neko - Black"
+ icon_state = "panties_neko_black"
+
+
+/datum/sprite_accessory/underwear/swimsuit_red
+ name = "Swimsuit, One Piece - Red"
+ icon_state = "swimming_red"
+
+/datum/sprite_accessory/underwear/swimsuit
+ name = "Swimsuit, One Piece - Black"
+ icon_state = "swimming_black"
+
+/datum/sprite_accessory/underwear/swimsuit_blue
+ name = "Swimsuit, One Piece - Striped Blue"
+ icon_state = "swimming_blue"
+
+/datum/sprite_accessory/underwear/swimsuit_green
+ name = "Swimsuit, Bottom - Green"
+ icon_state = "panties_swimming_green"
+
+/datum/sprite_accessory/underwear/swimsuit_purple
+ name = "Swimsuit, Bottom - Purple"
+ icon_state = "panties_swimming_purple"
+
+/datum/sprite_accessory/underwear/female_thong_black
+ name = "Thong - Black"
+ icon_state = "thong_black"
+
+/datum/sprite_accessory/underwear/female_thong
+ name = "Thong - Pink"
+ icon_state = "thong_pink"
+
+/datum/sprite_accessory/underwear/female_babydoll
+ name = "Babydoll - Black"
+ icon_state = "babydoll"
+
+
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
new file mode 100644
index 0000000000..d051b2f07a
--- /dev/null
+++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
@@ -0,0 +1,26 @@
+/datum/sprite_accessory/wings/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/wings_open
+ icon = 'icons/mob/wings.dmi'
+
+/datum/sprite_accessory/wings_open/angel
+ name = "Angel"
+ icon_state = "angel"
+ color_src = 0
+ dimension_x = 46
+ center = TRUE
+ dimension_y = 34
+
+/datum/sprite_accessory/wings
+ icon = 'icons/mob/wings.dmi'
+
+/datum/sprite_accessory/wings/angel
+ name = "Angel"
+ icon_state = "angel"
+ color_src = 0
+ dimension_x = 46
+ center = TRUE
+ dimension_y = 34
+ locked = TRUE
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 950ac5fb8b..d1d5fb7cd4 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -39,6 +39,19 @@
restraint_check = TRUE
emote_type = EMOTE_AUDIBLE
+/datum/emote/living/carbon/human/mawp
+ key = "mawp"
+ key_third_person = "mawps"
+ message = "mawps annoyingly."
+ emote_type = EMOTE_AUDIBLE
+
+/datum/emote/living/carbon/human/mawp/run_emote(mob/living/user, params)
+ . = ..()
+ if(.)
+ if(ishuman(user))
+ if(prob(10))
+ user.adjustEarDamage(-5, -5)
+
/datum/emote/living/carbon/human/mumble
key = "mumble"
key_third_person = "mumbles"
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index c6ba900b13..26e19ff376 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -18,6 +18,16 @@
var/list/obscured = check_obscured_slots()
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
+ if(ishuman(src)) //user just returned, y'know, the user's own species. dumb.
+ var/mob/living/carbon/human/H = src
+ var/datum/species/pref_species = H.dna.species
+ if(get_visible_name() == "Unknown") // same as flavor text, but hey it works.
+ msg += "You can't make out what species they are.\n"
+ else if(skipface)
+ msg += "You can't make out what species they are.\n"
+ else
+ msg += "[t_He] [t_is] a [H.dna.custom_species ? H.dna.custom_species : pref_species.name]!\n"
+
//uniform
if(w_uniform && !(SLOT_W_UNIFORM in obscured))
//accessory
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 4f168d97fc..d1ec7f3e4b 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -47,6 +47,8 @@
var/nameless = FALSE //For drones of both the insectoid and robotic kind. And other types of nameless critters.
+ var/custom_species = null
+
var/datum/personal_crafting/handcrafting
var/datum/physiology/physiology
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 3cdaf71e68..7ce3f78da0 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -1,9 +1,14 @@
/mob/living/carbon/human/say_mod(input, message_mode)
verb_say = dna.species.say_mod
- if(slurring)
- return "slurs"
- else
- . = ..()
+ switch(slurring)
+ if(10 to 25)
+ return "jumbles"
+ if(25 to 50)
+ return "slurs"
+ if(50 to INFINITY)
+ return "garbles"
+ else
+ . = ..()
/mob/living/carbon/human/treat_message(message)
message = dna.species.handle_speech(message,src)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index ba1ad9e0da..e2e9e5149f 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -755,6 +755,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(!(H.has_trait(TRAIT_HUSK)))
if(!forced_colour)
switch(S.color_src)
+ if(SKINTONE)
+ accessory_overlay.color = skintone2hex(H.skin_tone)
if(MUTCOLORS)
if(fixed_mut_color)
accessory_overlay.color = "#[fixed_mut_color]"
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 48a401802b..e757e6dcf4 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -531,8 +531,8 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
if(stuttering)
stuttering = max(stuttering-1, 0)
- if(slurring)
- slurring = max(slurring-1,0)
+ if(slurring || drunkenness)
+ slurring = max(slurring-1,0,drunkenness)
if(cultslurring)
cultslurring = max(cultslurring-1, 0)
@@ -550,16 +550,11 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
drunkenness = max(drunkenness - (drunkenness * 0.04), 0)
if(drunkenness >= 6)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "drunk", /datum/mood_event/drunk)
- if(prob(25))
- slurring += 2
jitteriness = max(jitteriness - 3, 0)
if(has_trait(TRAIT_DRUNK_HEALING))
adjustBruteLoss(-0.12, FALSE)
adjustFireLoss(-0.06, FALSE)
- if(drunkenness >= 11 && slurring < 5)
- slurring += 1.2
-
if(mind && (mind.assigned_role == "Scientist" || mind.assigned_role == "Research Director"))
if(SSresearch.science_tech)
if(drunkenness >= 12.9 && drunkenness <= 13.8)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index a0f619a7d6..871e33349a 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -334,7 +334,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
message = stutter(message)
if(slurring)
- message = slur(message)
+ message = slur(message,slurring)
if(cultslurring)
message = cultslur(message)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 0a8c0431bc..a70ca2a8e6 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -353,6 +353,10 @@
vore_attack(src,L,src)
else
return L.attack_animal(src)
+ else
+ return L.attack_animal(src) //literally every single fucking one of these need this I guess.
+ else
+ return target.attack_animal(src)
else
return target.attack_animal(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
index 23f08ab234..15f2a0a834 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -187,12 +187,12 @@
var/mob/living/carbon/C = L
var/obj/item/clothing/S = C.get_item_by_slot(SLOT_WEAR_SUIT)
if(S && S.resistance_flags & GOLIATH_RESISTANCE)
- L.Stun(75)
+ L.Stun(25)
else if(S && S.resistance_flags & GOLIATH_WEAKNESS)
- L.Stun(125)
+ L.Stun(115)
else
- L.Stun(100)
- L.adjustBruteLoss(rand(10,15))
+ L.Stun(75)
+ L.adjustBruteLoss(rand(15,20)) // Less stun more harm
latched = TRUE
if(!latched)
retract()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 12c98b8b5d..82f85766c2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -290,7 +290,7 @@
gloves = /obj/item/clothing/gloves/color/black
mask = /obj/item/clothing/mask/gas/explorer
if(prob(20))
- suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer = 6, /obj/item/clothing/suit/hooded/cloak/goliath = 2, /obj/item/clothing/suit/hooded/explorer/exo = 6, /obj/item/clothing/suit/hooded/explorer/seva = 6))
+ suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer/standard = 6, /obj/item/clothing/suit/hooded/cloak/goliath = 2, /obj/item/clothing/suit/hooded/explorer/exo = 6, /obj/item/clothing/suit/hooded/explorer/seva = 6))
if(prob(30))
r_pocket = pickweight(list(/obj/item/stack/marker_beacon = 20, /obj/item/stack/spacecash/c1000 = 7, /obj/item/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/damage = 1 ))
if(prob(10))
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 35b48afa28..776bd04935 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -64,7 +64,8 @@
p++
return sanitize(t)
-/proc/slur(n)
+/proc/slur(n,var/strength=50)
+ strength = min(strength,50)
var/phrase = html_decode(n)
var/leng = lentext(phrase)
var/counter=lentext(phrase)
@@ -72,7 +73,7 @@
var/newletter=""
while(counter>=1)
newletter=copytext(phrase,(leng-counter)+1,(leng-counter)+2)
- if(rand(1,3)==3)
+ if(rand(1,100)<=strength*0.5)
if(lowertext(newletter)=="o")
newletter="u"
if(lowertext(newletter)=="s")
@@ -83,17 +84,17 @@
newletter="oo"
if(lowertext(newletter)=="c")
newletter="k"
- if(rand(1,20)==20)
+ if(rand(1,100) <= strength*0.25)
if(newletter==" ")
newletter="...huuuhhh..."
if(newletter==".")
newletter=" *BURP*."
- switch(rand(1,20))
- if(1)
+ if(rand(1,100) <= strength*0.5)
+ if(rand(1,5) == 1)
newletter+="'"
- if(10)
+ if(rand(1,5) == 1)
newletter+="[newletter]"
- if(20)
+ if(rand(1,5) == 1)
newletter+="[newletter][newletter]"
newphrase+="[newletter]";counter-=1
return newphrase
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index e43db529b8..9fcdf091a1 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -200,6 +200,10 @@
charge = 0
update_icon()
+/obj/item/stock_parts/cell/lascarbine
+ name = "laser carbine power supply"
+ maxcharge = 2500
+
/obj/item/stock_parts/cell/pulse //200 pulse shots
name = "pulse rifle power cell"
maxcharge = 40000
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 83ce525ac8..914f9bc016 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -88,6 +88,9 @@
icon_state = "riotshotgun"
mag_type = /obj/item/ammo_box/magazine/internal/shot/riot
sawn_desc = "Come with me if you want to live."
+ unique_reskin = list("Tatical" = "riotshotgun",
+ "Wood Stock" = "wood_riotshotgun"
+ )
/obj/item/gun/ballistic/shotgun/riot/attackby(obj/item/A, mob/user, params)
..()
@@ -200,6 +203,10 @@
icon_state = "cshotgun"
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = WEIGHT_CLASS_HUGE
+ unique_reskin = list("Tatical" = "cshotgun",
+ "Slick" = "cshotgun_slick"
+ )
+
/obj/item/gun/ballistic/shotgun/automatic/combat/compact
name = "compact combat shotgun"
@@ -207,6 +214,10 @@
icon_state = "cshotgunc"
mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact
w_class = WEIGHT_CLASS_NORMAL
+ unique_reskin = list("Tatical" = "cshotgunc",
+ "Slick" = "cshotgunc_slick"
+ )
+
//Dual Feed Shotgun
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 066b652984..cd0dd53d48 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -39,6 +39,21 @@
selfcharge = EGUN_SELFCHARGE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+/obj/item/gun/energy/laser/carbine
+ name = "laser carbine"
+ desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal laser gun."
+ icon = 'icons/obj/guns/energy.dmi'
+ icon_state = "lasernew"
+ item_state = "laser"
+ force = 10
+ throwforce = 10
+ ammo_type = list(/obj/item/ammo_casing/energy/lasergun)
+ cell_type = /obj/item/stock_parts/cell/lascarbine
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/obj/item/gun/energy/laser/carbine/nopin
+ pin = null
+
/obj/item/gun/energy/laser/captain/scattershot
name = "scatter shot laser rifle"
icon_state = "lasercannon"
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 6e4d5e5a7d..92d9da401b 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -1277,8 +1277,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
if(!M.has_trait(TRAIT_ALCOHOL_TOLERANCE))
M.confused = max(M.confused+2,0)
M.Dizzy(10)
- if (!M.slurring)
- M.slurring = 1
+ M.slurring = max(M.slurring,50)
M.slurring += 3
switch(current_cycle)
if(51 to 200)
@@ -1306,8 +1305,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
M.dizziness +=1.5
switch(current_cycle)
if(15 to 45)
- if(!M.slurring)
- M.slurring = 1
+ M.slurring = max(M.slurring,50)
M.slurring += 3
if(45 to 55)
if(prob(50))
@@ -1336,8 +1334,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
M.dizziness +=2
switch(current_cycle)
if(15 to 45)
- if(!M.slurring)
- M.slurring = 1
+ M.slurring = max(M.slurring,50)
M.slurring += 3
if(45 to 55)
if(prob(50))
@@ -1364,8 +1361,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "A drink enjoyed by people during the 1960's."
/datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/M)
- if (!M.slurring)
- M.slurring = 1
+ M.slurring = max(M.slurring,50)
switch(current_cycle)
if(1 to 5)
M.Dizzy(10)
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 52b212f8c5..5071150e24 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -402,8 +402,7 @@
taste_description = "mushroom"
/datum/reagent/mushroomhallucinogen/on_mob_life(mob/living/carbon/M)
- if(!M.slurring)
- M.slurring = 1
+ M.slurring = max(M.slurring,50)
switch(current_cycle)
if(1 to 5)
M.Dizzy(5)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 15a2ef1cba..5d1593d1e7 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1863,3 +1863,20 @@
description = "The primary precursor for an ancient feline delicacy known as skooma. While it has no notable effects on it's own, mixing it with morphine in a chilled container may yield interesting results."
color = "#FAEAFF"
taste_description = "synthetic catnip"
+
+/datum/reagent/penis_enlargement
+ name = "Penis Enlargement"
+ id = "penis_enlargement"
+ description = "A patented chemical forumula by Doctor Ronald Hyatt that is guaranteed to bring maximum GROWTH and LENGTH to your penis, today!"
+ color = "#888888"
+ taste_description = "chinese dragon powder"
+ metabolization_rate = INFINITY //So it instantly removes all of itself. Don't want to put strain on the system.
+
+/datum/reagent/penis_enlargement/on_mob_life(mob/living/carbon/C)
+ var/obj/item/organ/genital/penis/P = C.getorganslot(ORGAN_SLOT_PENIS)
+ if(P)
+ var/added_length = round(volume/30,0.01) //Every 30u gives an extra inch. Rounded to the nearest 0.01 so float fuckery doesn't occur with the division by 30.
+ if(added_length >= 0.20) //Only add the length if it's greater than or equal to 0.2. This is to prevent people from smoking the reagents and causing the penis to update constantly.
+ P.length += added_length
+ P.update()
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 26edcb5b73..7286f01623 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -759,6 +759,7 @@
taste_description = "skewing"
/datum/reagent/toxin/skewium/on_mob_life(mob/living/carbon/M)
+ /*
if(M.hud_used)
if(current_cycle >= 5 && current_cycle % 3 == 0)
var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
@@ -774,6 +775,7 @@
for(var/whole_screen in screens)
animate(whole_screen, transform = newmatrix, time = 5, easing = QUAD_EASING, loop = -1)
animate(transform = -newmatrix, time = 5, easing = QUAD_EASING)
+ */
return ..()
/datum/reagent/toxin/skewium/on_mob_delete(mob/living/M)
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 38d47d5185..ed2ca66aae 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -233,3 +233,7 @@
/obj/item/reagent_containers/pill/get_belt_overlay()
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "pouch")
+
+/obj/item/reagent_containers/pill/penis_enlargement
+ name = "penis enlargement pill"
+ list_reagents = list("penis_enlargement" = 30)
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 7ceeda2c64..173fd5a813 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -870,3 +870,19 @@
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
build_path = /obj/item/disk/holodisk
category = list("initial", "Misc")
+
+/datum/design/lock_collar
+ name = "Lockable Collar"
+ id = "lock_collar"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1200, MAT_GLASS = 100)
+ build_path = /obj/item/clothing/neck/petcollar/locked
+ category = list("initial", "Misc")
+
+/datum/design/collar_key
+ name = "Collar Key"
+ id = "collar_key"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 300, MAT_GLASS = 150)
+ build_path = /obj/item/key/collar
+ category = list("initial", "Misc")
diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm
index 2dc0ed77b3..c9d11a5a3e 100644
--- a/code/modules/research/designs/bluespace_designs.dm
+++ b/code/modules/research/designs/bluespace_designs.dm
@@ -24,6 +24,17 @@
dangerous_construction = TRUE
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+/datum/design/satchel_holding
+ name = "Satchel of Holding"
+ desc = "A satchel that opens into a localized pocket of bluespace."
+ id = "satchel_holding"
+ build_type = PROTOLATHE
+ materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000)
+ build_path = /obj/item/storage/backpack/holding/satchel
+ category = list("Bluespace Designs")
+ dangerous_construction = TRUE
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
/datum/design/biobag_holding
name = "Bio Bag of Holding"
desc = "A chemical holding thingy. Mostly used for xenobiology."
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index e1648559a7..f8122c16e3 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -77,6 +77,16 @@
category = list("Power Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+/datum/design/inducercombat
+ name = "Combat Ready Inducer"
+ desc = "The improved NT-8475 Electromagnetic Power Inducer can this one has been SCIENCED to allow for combat. It still comes printed with SCIENCED colors!"
+ id = "combatinducer"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 13000, MAT_GLASS = 10000, MAT_SILVER = 1500, MAT_GOLD = 1250, MAT_DIAMOND = 500, MAT_TITANIUM = 1200)
+ build_path = /obj/item/inducer/sci/combat/dry
+ category = list("Power Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
/datum/design/board/pacman
name = "Machine Design (PACMAN-type Generator Board)"
desc = "The circuit board that for a PACMAN-type portable generator."
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 9b42709fe2..03c0582245 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -1,6 +1,10 @@
-/////////////////////////////////////////
-/////////////////Weapons/////////////////
-/////////////////////////////////////////
+///////////////////////////////
+///////Weapons & Ammo//////////
+///////////////////////////////
+
+//////////////
+//Ammo Boxes//
+//////////////
/datum/design/c38/sec
id = "sec_38"
@@ -13,6 +17,40 @@
id = "sec_38lethal"
build_path = /obj/item/ammo_box/c38/lethal
+//////////////
+//WT550 Mags//
+//////////////
+
+/datum/design/mag_oldsmg
+ name = "WT-550 Semi-Auto SMG Magazine (4.6x30mm)"
+ desc = "A 20 round magazine for the out of date security WT-550 Semi-Auto SMG."
+ id = "mag_oldsmg"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 4000)
+ build_path = /obj/item/ammo_box/magazine/wt550m9
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_oldsmg/ap_mag
+ name = "WT-550 Semi-Auto SMG Armour Piercing Magazine (4.6x30mm AP)"
+ desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG."
+ id = "mag_oldsmg_ap"
+ materials = list(MAT_METAL = 6000, MAT_SILVER = 600)
+ build_path = /obj/item/ammo_box/magazine/wt550m9/wtap
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_oldsmg/ic_mag
+ name = "WT-550 Semi-Auto SMG Incendiary Magazine (4.6x30mm IC)"
+ desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG."
+ id = "mag_oldsmg_ic"
+ materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_GLASS = 1000)
+ build_path = /obj/item/ammo_box/magazine/wt550m9/wtic
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+//////////////
+//Ammo Shells/
+//////////////
+
/datum/design/rubbershot/sec
id = "sec_rshot"
build_type = PROTOLATHE
@@ -43,6 +81,40 @@
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+/datum/design/stunshell
+ name = "Stun Shell"
+ desc = "A stunning shell for a shotgun."
+ id = "stunshell"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 200)
+ build_path = /obj/item/ammo_casing/shotgun/stunslug
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/techshell
+ name = "Unloaded Technological Shotshell"
+ desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects."
+ id = "techshotshell"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_GLASS = 200)
+ build_path = /obj/item/ammo_casing/shotgun/techshell
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/cryostatis_shotgun_dart
+ name = "Cryostasis Shotgun Dart"
+ desc = "A shotgun dart designed with similar internals to that of a cryostatis beaker, allowing reagents to not react when inside."
+ id = "shotgundartcryostatis"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 3500)
+ build_path = /obj/item/ammo_casing/shotgun/dart/noreact
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+//////////////
+//Firing Pins/
+//////////////
+
/datum/design/pin_testing
name = "Test-Range Firing Pin"
desc = "This safety firing pin allows firearms to be operated within proximity to a firing range."
@@ -63,6 +135,20 @@
category = list("Firing Pins")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+//////////////
+//Guns////////
+//////////////
+
+/datum/design/lasercarbine
+ name = "Laser Carbine"
+ desc = "Beefed up version of a standard laser gun."
+ id = "lasercarbine"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 15000, MAT_GLASS = 10000, MAT_GOLD = 2500, MAT_SILVER = 2500)
+ build_path = /obj/item/gun/energy/laser/carbine/nopin
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
/datum/design/stunrevolver
name = "Tesla Revolver"
desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers."
@@ -83,16 +169,6 @@
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-/datum/design/tele_shield
- name = "Telescopic Riot Shield"
- desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."
- id = "tele_shield"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 4000, MAT_GLASS = 4000, MAT_SILVER = 300, MAT_TITANIUM = 200)
- build_path = /obj/item/shield/riot/tele
- category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
/datum/design/beamrifle
name = "Beam Marksman Rifle"
desc = "A powerful long ranged anti-material rifle that fires charged particle beams to obliterate targets."
@@ -122,11 +198,11 @@
materials = list(MAT_METAL = 5000, MAT_GLASS = 1000)
build_path = /obj/item/gun/syringe/rapidsyringe
category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL //uwu
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/temp_gun
name = "Temperature Gun"
- desc = "A gun that shoots temperature bullet energythings to change temperature."//Change it if you want
+ desc = "A gun that shoots temperature beam like projectiles to change temperature."
id = "temp_gun"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 500, MAT_SILVER = 3000)
@@ -145,46 +221,6 @@
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-/datum/design/large_grenade
- name = "Large Grenade"
- desc = "A grenade that affects a larger area and use larger containers."
- id = "large_Grenade"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 3000)
- build_path = /obj/item/grenade/chem_grenade/large
- category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE //Citadel edit added to science
-
-/datum/design/pyro_grenade
- name = "Pyro Grenade"
- desc = "An advanced grenade that is able to self ignite its mixture."
- id = "pyro_Grenade"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 2000, MAT_PLASMA = 500)
- build_path = /obj/item/grenade/chem_grenade/pyro
- category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
-
-/datum/design/cryo_grenade
- name = "Cryo Grenade"
- desc = "An advanced grenade that rapidly cools its contents upon detonation."
- id = "cryo_Grenade"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
- build_path = /obj/item/grenade/chem_grenade/cryo
- category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
-
-/datum/design/adv_grenade
- name = "Advanced Release Grenade"
- desc = "An advanced grenade that can be detonated several times, best used with a repeating igniter."
- id = "adv_Grenade"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 3000, MAT_GLASS = 500)
- build_path = /obj/item/grenade/chem_grenade/adv_release
- category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
-
/datum/design/xray
name = "X-ray Laser Gun"
desc = "Not quite as menacing as it sounds"
@@ -215,64 +251,6 @@
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-//WT550 Mags
-
-/datum/design/mag_oldsmg
- name = "WT-550 Semi-Auto SMG Magazine (4.6x30mm)"
- desc = "A 20 round magazine for the out of date security WT-550 Semi-Auto SMG."
- id = "mag_oldsmg"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 4000)
- build_path = /obj/item/ammo_box/magazine/wt550m9
- category = list("Ammo")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_oldsmg/ap_mag
- name = "WT-550 Semi-Auto SMG Armour Piercing Magazine (4.6x30mm AP)"
- desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG."
- id = "mag_oldsmg_ap"
- materials = list(MAT_METAL = 6000, MAT_SILVER = 600)
- build_path = /obj/item/ammo_box/magazine/wt550m9/wtap
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_oldsmg/ic_mag
- name = "WT-550 Semi-Auto SMG Incendiary Magazine (4.6x30mm IC)"
- desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG."
- id = "mag_oldsmg_ic"
- materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_GLASS = 1000)
- build_path = /obj/item/ammo_box/magazine/wt550m9/wtic
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/stunshell
- name = "Stun Shell"
- desc = "A stunning shell for a shotgun."
- id = "stunshell"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 200)
- build_path = /obj/item/ammo_casing/shotgun/stunslug
- category = list("Ammo")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/techshell
- name = "Unloaded Technological Shotshell"
- desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects."
- id = "techshotshell"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 1000, MAT_GLASS = 200)
- build_path = /obj/item/ammo_casing/shotgun/techshell
- category = list("Ammo")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/suppressor
- name = "Universal Suppressor"
- desc = "A reverse-engineered universal suppressor that fits on most small arms with threaded barrels."
- id = "suppressor"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
- build_path = /obj/item/suppressor
- category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
/datum/design/gravitygun
name = "One-point Bluespace-gravitational Manipulator"
desc = "A multi-mode device that blasts one-point bluespace-gravitational bolts that locally distort gravity."
@@ -293,12 +271,70 @@
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-/datum/design/cryostatis_shotgun_dart
- name = "Cryostasis Shotgun Dart"
- desc = "A shotgun dart designed with similar internals to that of a cryostatis beaker, allowing reagents to not react when inside."
- id = "shotgundartcryostatis"
+///////////
+//Grenades/
+///////////
+
+/datum/design/large_grenade
+ name = "Large Grenade"
+ desc = "A grenade that affects a larger area and use larger containers."
+ id = "large_Grenade"
build_type = PROTOLATHE
- materials = list(MAT_METAL = 3500)
- build_path = /obj/item/ammo_casing/shotgun/dart/noreact
- category = list("Ammo")
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+ materials = list(MAT_METAL = 3000)
+ build_path = /obj/item/grenade/chem_grenade/large
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/pyro_grenade
+ name = "Pyro Grenade"
+ desc = "An advanced grenade that is able to self ignite its mixture."
+ id = "pyro_Grenade"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_PLASMA = 500)
+ build_path = /obj/item/grenade/chem_grenade/pyro
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
+
+/datum/design/cryo_grenade
+ name = "Cryo Grenade"
+ desc = "An advanced grenade that rapidly cools its contents upon detonation."
+ id = "cryo_Grenade"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
+ build_path = /obj/item/grenade/chem_grenade/cryo
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
+
+/datum/design/adv_grenade
+ name = "Advanced Release Grenade"
+ desc = "An advanced grenade that can be detonated several times, best used with a repeating igniter."
+ id = "adv_Grenade"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 3000, MAT_GLASS = 500)
+ build_path = /obj/item/grenade/chem_grenade/adv_release
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
+
+//////////
+//MISC////
+//////////
+
+/datum/design/tele_shield
+ name = "Telescopic Riot Shield"
+ desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."
+ id = "tele_shield"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 4000, MAT_GLASS = 4000, MAT_SILVER = 300, MAT_TITANIUM = 200)
+ build_path = /obj/item/shield/riot/tele
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/suppressor
+ name = "Universal Suppressor"
+ desc = "A reverse-engineered universal suppressor that fits on most small arms with threaded barrels."
+ id = "suppressor"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
+ build_path = /obj/item/suppressor
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index c2abc2f2c5..aa091d181c 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -246,7 +246,7 @@
display_name = "Bluespace Pockets"
description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality."
prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma")
- design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash")
+ design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500)
export_price = 5000
/////////////////////////plasma tech/////////////////////////
@@ -428,7 +428,7 @@
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
export_price = 5000
design_ids = list("s-receiver", "s-bus", "s-broadcaster", "s-processor", "s-hub", "s-server", "s-relay", "comm_monitor", "comm_server",
- "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter")
+ "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter", "message_monitor")
/datum/techweb_node/integrated_HUDs
id = "integrated_HUDs"
@@ -564,7 +564,7 @@
display_name = "Weapon Development Technology"
description = "Our researchers have found new to weaponize just about everything now."
prereq_ids = list("engineering")
- design_ids = list("pin_testing", "tele_shield")
+ design_ids = list("pin_testing", "tele_shield", "lasercarbine")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
export_price = 5000
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index f394351285..dfdf0fde69 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -45,7 +45,8 @@
var/species_color = ""
var/mutation_color = ""
var/no_update = 0
- var/body_markings //for bodypart markings
+ var/body_markings = "" //for bodypart markings
+ var/body_markings_icon = 'modular_citadel/icons/mob/mam_markings.dmi'
var/list/markings_color = list()
var/auxmarking
var/list/auxmarking_color = list()
@@ -260,6 +261,7 @@
icon = DEFAULT_BODYPART_ICON_ORGANIC
else if(status == BODYPART_ROBOTIC)
icon = DEFAULT_BODYPART_ICON_ROBOTIC
+ body_markings = null
if(owner)
owner.updatehealth()
@@ -332,14 +334,18 @@
species_color = ""
if("mam_body_markings" in S.default_features)
+ var/datum/sprite_accessory/Smark
+ Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
if(H.dna.features.["mam_body_markings"] != "None")
+ body_markings_icon = Smark.icon
body_markings = lowertext(H.dna.features.["mam_body_markings"])
if(MATRIXED)
markings_color = list(colorlist)
else
+ body_markings = "plain"
markings_color = (H.dna.features.["mcolor"])
else
- body_markings = "None"
+ body_markings = null
markings_color = ""
if(!dropping_limb && H.dna.check_mutation(HULK))
@@ -354,6 +360,7 @@
if(status == BODYPART_ROBOTIC)
dmg_overlay_type = "robotic"
+ body_markings = null
if(dropping_limb)
no_update = TRUE //when attached, the limb won't be affected by the appearance changes of its mob owner.
@@ -385,11 +392,11 @@
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir)
if(burnstate)
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir)
- if(body_markings)
+ if(body_markings && status != BODYPART_ROBOTIC)
if(use_digitigrade == NOT_DIGITIGRADE)
- . += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ . += image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
- . += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ . += image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
var/image/aux
@@ -442,14 +449,14 @@
// Body markings
if(body_markings)
if(species_id == "husk")
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
else if(species_id == "husk" && use_digitigrade)
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else if(!use_digitigrade)
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
. += marking
// Citadel End
@@ -459,9 +466,9 @@
. += aux
if(body_markings)
if(species_id == "husk")
- auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
+ auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
else
- auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir)
+ auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir)
. += auxmarking
else
@@ -475,21 +482,21 @@
. += aux
if(body_markings)
if(species_id == "husk")
- auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
+ auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
else
- auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir)
+ auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir)
. += auxmarking
if(body_markings)
if(species_id == "husk")
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
else if(species_id == "husk" && use_digitigrade)
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else if(!use_digitigrade)
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
. += marking
return
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index 9cc56a6ca8..a2e8017956 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -178,6 +178,7 @@
L.update_limb(fixed_icon, src)
if(robotic)
L.change_bodypart_status(BODYPART_ROBOTIC)
+ L.body_markings = null
. = L
/mob/living/carbon/monkey/newBodyPart(zone, robotic, fixed_icon)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index af2c625670..702ddb71a3 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1438,6 +1438,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 20
restricted_roles = list("Assistant")
+/datum/uplink_item/role_restricted/goldenbox
+ name = "Gold Toolbox"
+ desc = "A gold planted plastitanium toolbox loaded with tools. Comes with a set of AI detection multi-tool and a pare of combat gloves."
+ item = /obj/item/storage/toolbox/gold_real
+ cost = 5 // Has synda tools + gloves + a robust weapon
+ restricted_roles = list("Assistant", "Curator") //Curator do to being made of gold - It fits the theme
+
/datum/uplink_item/role_restricted/brainwash_disk
name = "Brainwashing Surgery Program"
desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \
diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm
index 151da9bc2f..33e839c039 100644
--- a/code/modules/vending/drinnerware.dm
+++ b/code/modules/vending/drinnerware.dm
@@ -13,7 +13,7 @@
/obj/item/reagent_containers/food/condiment/pack/hotsauce = 5,
/obj/item/reagent_containers/food/condiment/saltshaker = 5,
/obj/item/reagent_containers/food/condiment/peppermill = 5,
- /obj/item/reagent_containers/glass/bowl = 20)
+ /obj/item/reagent_containers/glass/bowl = 30)
contraband = list(/obj/item/kitchen/rollingpin = 2,
/obj/item/kitchen/knife/butcher = 2)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
diff --git a/html/changelogs/AutoChangeLog-pr-8247.yml b/html/changelogs/AutoChangeLog-pr-8247.yml
new file mode 100644
index 0000000000..1ab08ece4d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8247.yml
@@ -0,0 +1,5 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Added custom species names! Examining people will now display their species name unless they're an Unknown or have their face hidden. like flavor text. Set it in your character window!"
+ - code_imp: "changed how health scanners print messages, wrapping it in msg for one to_chat instead of printing every line to_chat."
diff --git a/html/changelogs/AutoChangeLog-pr-8260.yml b/html/changelogs/AutoChangeLog-pr-8260.yml
new file mode 100644
index 0000000000..e6ef697917
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8260.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "cakes!"
+ - imageadd: "Made some sprites! -Love them really came out well"
diff --git a/html/changelogs/AutoChangeLog-pr-8261.yml b/html/changelogs/AutoChangeLog-pr-8261.yml
new file mode 100644
index 0000000000..e7624aec73
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8261.yml
@@ -0,0 +1,7 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "new economics"
+ - tweak: "cargo and robotics relationships"
+ - balance: "unbalanced something"
+ - bugfix: "fixed a maybe oversight"
diff --git a/html/changelogs/AutoChangeLog-pr-8264.yml b/html/changelogs/AutoChangeLog-pr-8264.yml
new file mode 100644
index 0000000000..15e525c581
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8264.yml
@@ -0,0 +1,7 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscdel: "Fun"
+ - tweak: "costs of suit voucher"
+ - balance: "Unblances miner vender"
+ - bugfix: "spare cheaper brute kit"
diff --git a/html/changelogs/AutoChangeLog-pr-8265.yml b/html/changelogs/AutoChangeLog-pr-8265.yml
new file mode 100644
index 0000000000..e581a93315
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8265.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "harm from hentie"
+ - balance: "rebalanced goliaths stun to be less auto death"
diff --git a/html/changelogs/AutoChangeLog-pr-8274.yml b/html/changelogs/AutoChangeLog-pr-8274.yml
new file mode 100644
index 0000000000..41b2de1d9e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8274.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - tweak: "Increased the spawn area of the City of Cogs (Reebe). This does not affect the area in which builders can build."
diff --git a/html/changelogs/AutoChangeLog-pr-8277.yml b/html/changelogs/AutoChangeLog-pr-8277.yml
new file mode 100644
index 0000000000..2a663ea2a4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8277.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - balance: "Significantly tweaks the Wizard race transformation event to be less unreasonably troublesome."
diff --git a/html/changelogs/AutoChangeLog-pr-8278.yml b/html/changelogs/AutoChangeLog-pr-8278.yml
new file mode 100644
index 0000000000..57655b8ace
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8278.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Armor to blob shields"
+ - tweak: "block weaken state to 70% from 75%"
diff --git a/html/changelogs/AutoChangeLog-pr-8279.yml b/html/changelogs/AutoChangeLog-pr-8279.yml
new file mode 100644
index 0000000000..7ed141640a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8279.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "restores the deathriplys missing armor"
diff --git a/html/changelogs/AutoChangeLog-pr-8283.yml b/html/changelogs/AutoChangeLog-pr-8283.yml
new file mode 100644
index 0000000000..7a614e2e82
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8283.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - rscadd: "Adds a new 0 cost trait that makes you immune* to Crocin and Hexacrocin"
diff --git a/html/changelogs/AutoChangeLog-pr-8286.yml b/html/changelogs/AutoChangeLog-pr-8286.yml
new file mode 100644
index 0000000000..d59a8dad66
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8286.yml
@@ -0,0 +1,5 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - tweak: "Tweaks how slurring works so it's more of a gradual change into slurring instead of immediate."
+ - balance: "Slurring is now directly proportional to your drunkenness, with other sources of slur being added on top of it."
diff --git a/html/changelogs/AutoChangeLog-pr-8287.yml b/html/changelogs/AutoChangeLog-pr-8287.yml
new file mode 100644
index 0000000000..aafba03474
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8287.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "new lockable colalr"
diff --git a/html/changelogs/AutoChangeLog-pr-8288.yml b/html/changelogs/AutoChangeLog-pr-8288.yml
new file mode 100644
index 0000000000..6b3fbadbd8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8288.yml
@@ -0,0 +1,7 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - tweak: "Bras are now separate from underwear, meaning you can mix and match bras if you're into that."
+ - tweak: "Men can wear female accessory clothing, and females can wear men accessory clothing. It's not a fetish, mom, it's PROGRESSIVE."
+ - code_imp: "Reorganized accessories into their own files to prevent a massive 1000 line file."
+ - server: "i'm 10% sure that merging this PR will cause preference corruption sooooooooooo I just need to hear from @deathride58 or perhaps someone else on how much damage this could possibly do."
diff --git a/html/changelogs/AutoChangeLog-pr-8289.yml b/html/changelogs/AutoChangeLog-pr-8289.yml
new file mode 100644
index 0000000000..d389d95cd6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8289.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "armor"
diff --git a/html/changelogs/AutoChangeLog-pr-8290.yml b/html/changelogs/AutoChangeLog-pr-8290.yml
new file mode 100644
index 0000000000..553bfbf4f9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8290.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "missing hopes and dreams"
+ - code_imp: "orgized the weapon file to be more cat brain friendly"
diff --git a/html/changelogs/AutoChangeLog-pr-8294.yml b/html/changelogs/AutoChangeLog-pr-8294.yml
new file mode 100644
index 0000000000..bce0031c2b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8294.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - imageadd: "This means sprite right?"
diff --git a/html/changelogs/AutoChangeLog-pr-8301.yml b/html/changelogs/AutoChangeLog-pr-8301.yml
new file mode 100644
index 0000000000..90e893bdf2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8301.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "mag gun uses cells"
+ - balance: "kev things their to op"
diff --git a/html/changelogs/AutoChangeLog-pr-8302.yml b/html/changelogs/AutoChangeLog-pr-8302.yml
new file mode 100644
index 0000000000..e2b535c40f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8302.yml
@@ -0,0 +1,5 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - tweak: "Tweaked penis."
+ - balance: "Rebalanced penis."
diff --git a/html/changelogs/AutoChangeLog-pr-8305.yml b/html/changelogs/AutoChangeLog-pr-8305.yml
new file mode 100644
index 0000000000..2293fa9163
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8305.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - server: "Discord bot will now report when a round ends and give the vague news ticker that a sister-station would have received for the game mode and result of the round."
diff --git a/html/changelogs/AutoChangeLog-pr-8306.yml b/html/changelogs/AutoChangeLog-pr-8306.yml
new file mode 100644
index 0000000000..95ceb32968
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8306.yml
@@ -0,0 +1,6 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - bugfix: "fixed medical hardsuit overlay issue. I thought it was going to work well but fuck byond."
+ - bugfix: "None body markings shouldn't give rgb hell, but it also should reset properly anyway. ree."
+ - bugfix: "Sorted some sprites to better sooth my byond icon limit anxiety."
diff --git a/html/changelogs/AutoChangeLog-pr-8315.yml b/html/changelogs/AutoChangeLog-pr-8315.yml
new file mode 100644
index 0000000000..5d0b85e162
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8315.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "laser carbine"
diff --git a/html/changelogs/AutoChangeLog-pr-8316.yml b/html/changelogs/AutoChangeLog-pr-8316.yml
new file mode 100644
index 0000000000..b51a40c846
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8316.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "makes collars only locked via key"
diff --git a/html/changelogs/AutoChangeLog-pr-8317.yml b/html/changelogs/AutoChangeLog-pr-8317.yml
new file mode 100644
index 0000000000..0fd31c3c52
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8317.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - tweak: "Biogenerators now have a sane limit for production"
diff --git a/html/changelogs/AutoChangeLog-pr-8318.yml b/html/changelogs/AutoChangeLog-pr-8318.yml
new file mode 100644
index 0000000000..0c0a5c06c4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8318.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - rscadd: "Adds additional random brain damage text"
diff --git a/html/changelogs/AutoChangeLog-pr-8319.yml b/html/changelogs/AutoChangeLog-pr-8319.yml
new file mode 100644
index 0000000000..e46b83c121
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8319.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - rscadd: "Adds penis enlargement pills."
diff --git a/html/changelogs/AutoChangeLog-pr-8322.yml b/html/changelogs/AutoChangeLog-pr-8322.yml
new file mode 100644
index 0000000000..188c988021
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8322.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "charging"
diff --git a/html/changelogs/AutoChangeLog-pr-8323.yml b/html/changelogs/AutoChangeLog-pr-8323.yml
new file mode 100644
index 0000000000..0c4fc13b48
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8323.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Combat inducers for COMBAT!"
diff --git a/html/changelogs/AutoChangeLog-pr-8334.yml b/html/changelogs/AutoChangeLog-pr-8334.yml
new file mode 100644
index 0000000000..3c9152c257
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8334.yml
@@ -0,0 +1,4 @@
+author: "dtfe3"
+delete-after: True
+changes:
+ - tweak: "Increased music maxlines from 300 to 600"
diff --git a/html/changelogs/AutoChangeLog-pr-8336.yml b/html/changelogs/AutoChangeLog-pr-8336.yml
new file mode 100644
index 0000000000..25a14e5d1f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8336.yml
@@ -0,0 +1,5 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - rscadd: "Adds Stun Circuit and Pneumatic Cannon Integrated Circuits"
+ - bugfix: "Fixed extinguisher and smoke circuits not accepting any reagents."
diff --git a/html/changelogs/AutoChangeLog-pr-8341.yml b/html/changelogs/AutoChangeLog-pr-8341.yml
new file mode 100644
index 0000000000..50dedb7374
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8341.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "golden swag boxes"
diff --git a/html/changelogs/AutoChangeLog-pr-8342.yml b/html/changelogs/AutoChangeLog-pr-8342.yml
new file mode 100644
index 0000000000..a159f3240f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8342.yml
@@ -0,0 +1,7 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - rscadd: "Adds a few important clockcult tips."
+ - rscadd: "Added Mech Sensors, a brass-created trap that activates when a mech not controlled by a cultist crosses it."
+ - rscadd: "Added power nullifiers, an emp trap that emps everything in a 3x3 area, with the center suffering a heavy EMP."
+ - tweak: "Brass Skewers now deal 50 damage to mechs."
diff --git a/html/changelogs/AutoChangeLog-pr-8352.yml b/html/changelogs/AutoChangeLog-pr-8352.yml
new file mode 100644
index 0000000000..ff9e9130db
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8352.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Fixed a fairly huge server crash exploit"
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 90c7e42c8e..6099a3f037 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index a8d2a2aef3..50c143b9cb 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/inhands/equipment/backpack_lefthand.dmi b/icons/mob/inhands/equipment/backpack_lefthand.dmi
index c37d12e2c0..0e466486c5 100644
Binary files a/icons/mob/inhands/equipment/backpack_lefthand.dmi and b/icons/mob/inhands/equipment/backpack_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/backpack_righthand.dmi b/icons/mob/inhands/equipment/backpack_righthand.dmi
index 08e05e055e..1c265a4137 100644
Binary files a/icons/mob/inhands/equipment/backpack_righthand.dmi and b/icons/mob/inhands/equipment/backpack_righthand.dmi differ
diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi
index b91c29e03f..3c126daba6 100644
Binary files a/icons/mob/neck.dmi and b/icons/mob/neck.dmi differ
diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi
index 385cd21516..0b63685668 100644
Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ
diff --git a/icons/mob/underwear_old.dmi b/icons/mob/underwear_old.dmi
new file mode 100644
index 0000000000..5e16a473ba
Binary files /dev/null and b/icons/mob/underwear_old.dmi differ
diff --git a/icons/obj/assemblies/electronic_setups.dmi b/icons/obj/assemblies/electronic_setups.dmi
index 58ef0903be..5804c3f8ab 100644
Binary files a/icons/obj/assemblies/electronic_setups.dmi and b/icons/obj/assemblies/electronic_setups.dmi differ
diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi
index 5b8fc246cb..56cfdf468b 100644
Binary files a/icons/obj/clockwork_objects.dmi and b/icons/obj/clockwork_objects.dmi differ
diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi
index 0f3668ce10..0bdaa36e62 100644
Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index e3ec4171ad..4dec451008 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 0ee0e3d2d1..e4a39903b3 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 0c9155827b..d6ffc12ae7 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index 1454d17a16..8f6b844a23 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm
index 213dd8a17a..bdca91b0e6 100755
--- a/modular_citadel/code/game/machinery/vending.dm
+++ b/modular_citadel/code/game/machinery/vending.dm
@@ -54,8 +54,11 @@
/obj/item/clothing/neck/petcollar = 5,
/obj/item/clothing/under/mankini = 1,
/obj/item/dildo/flared/huge = 1
- )
- premium = list(/obj/item/electropack/shockcollar = 3)
+ )
+ premium = list(
+ /obj/item/electropack/shockcollar = 3,
+ /obj/item/clothing/neck/petcollar/locked = 1
+ )
refill_canister = /obj/item/vending_refill/kink
/*
/obj/machinery/vending/nazivend
diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
index ce551280d9..e6ba224f8d 100644
--- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
+++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
@@ -117,6 +117,19 @@
desc = "The Non-Eutactic Blade utilizes a hardlight blade that is dynamically 'forged' on demand to create a deadly sharp edge that is unbreakable. This one seems to have a damaged handle and misaligned components, causing the blade to be unstable at best"
force_on = 15 //As strong a survival knife/bone dagger
+/obj/item/melee/transforming/energy/sword/cx/attackby(obj/item/W, mob/living/user, params)
+ if(istype(W, /obj/item/melee/transforming/energy/sword/cx))
+ if((W.item_flags & NODROP) || (item_flags & NODROP))
+ to_chat(user, "\the [item_flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [item_flags & NODROP ? W : src]!")
+ return
+ else
+ to_chat(user, "You combine the two light swords, making a single supermassive blade! You're cool.")
+ new /obj/item/twohanded/hypereutactic(user.drop_location())
+ qdel(W)
+ qdel(src)
+ else
+ return ..()
+
/obj/item/melee/transforming/energy/sword/cx/chaplain
name = "divine lightblade"
force_on = 20 //haha i'll regret this
@@ -244,21 +257,21 @@
inhand_y_dimension = 64
name = "hypereutactic blade"
desc = "A supermassive weapon envisioned to cleave the very fabric of space and time itself in twain, the hypereutactic blade dynamically flash-forges a hypereutactic crystaline nanostructure capable of passing through most known forms of matter like a hot knife through butter."
- force = 3
+ force = 7
throwforce = 5
throw_speed = 3
throw_range = 5
w_class = WEIGHT_CLASS_SMALL
var/w_class_on = WEIGHT_CLASS_BULKY
- force_unwielded = 3
- force_wielded = 30
+ force_unwielded = 7
+ force_wielded = 40
wieldsound = 'sound/weapons/nebon.ogg'
unwieldsound = 'sound/weapons/neboff.ogg'
hitsound = "swing_hit"
- armour_penetration = 10
+ armour_penetration = 60
light_color = "#37FFF7"
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "destroyed", "ripped", "devastated", "shredded")
- block_chance = 25
+ block_chance = 75
max_integrity = 200
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
resistance_flags = FIRE_PROOF
@@ -274,7 +287,6 @@
user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].")
return TRUE
-
/obj/item/twohanded/hypereutactic/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds.
if(M.has_dna())
if(M.dna.check_mutation(HULK))
@@ -287,7 +299,6 @@
hitsound = 'sound/weapons/nebhit.ogg'
START_PROCESSING(SSobj, src)
set_light(brightness_on)
- slowdown = 1
/obj/item/twohanded/hypereutactic/unwield() //Specific unwield () to switch hitsounds.
sharpness = initial(sharpness)
@@ -347,12 +358,8 @@
..()
to_chat(user, "Alt-click to recolor it.")
-
-
////////// stuff beneath this is all taken from the desword //////////// wow very professional such OOP wow
-
-
/obj/item/twohanded/hypereutactic/attack(mob/target, mob/living/carbon/human/user)
if(user.has_dna())
if(user.dna.check_mutation(HULK))
@@ -435,7 +442,7 @@
It appears to have a wooden grip and a shaved down guard."
icon_state = "cxsword_hilt_traitor"
force_on = 30
- armour_penetration = 35
+ armour_penetration = 50
embedding = list("embedded_pain_multiplier" = 10, "embed_chance" = 75, "embedded_fall_chance" = 0, "embedded_impact_pain_multiplier" = 10)
block_chance = 50
hitsound_on = 'sound/weapons/blade1.ogg'
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index 38e8e44f39..f6b9f1d999 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -4,7 +4,7 @@
icon_state = "penis"
icon = 'modular_citadel/icons/obj/genitals/penis.dmi'
zone = "groin"
- slot = "penis"
+ slot = ORGAN_SLOT_PENIS
w_class = 3
can_masturbate_with = TRUE
masturbation_verb = "stroke"
@@ -40,7 +40,8 @@
var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]"
icon_state = sanitize_text(string)
var/lowershape = lowertext(shape)
- desc = "You see a [lowershape] penis. You estimate it's about [round(length, 0.25)] inch[length > 1 ? "es" : ""] long."
+ desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] penis. You estimate it's about [round(length, 0.25)] inch[round(length, 0.25) != 1 ? "es" : ""] long and [round(girth, 0.25)] inch[round(girth, 0.25) != 1 ? "es" : ""] in girth."
+
if(owner)
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm
index 1ef203d538..bd26f44482 100644
--- a/modular_citadel/code/modules/client/loadout/head.dm
+++ b/modular_citadel/code/modules/client/loadout/head.dm
@@ -56,25 +56,34 @@
//trek fancy Hats!
/datum/gear/trekcap
- name = "Federation Officer's Cap"
+ name = "Federation Officer's Cap (White)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover
restricted_roles = list("Captain","Head of Personnel")
+/datum/gear/trekcapcap
+ name = "Federation Officer's Cap (Black)"
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/caphat/formal/fedcover/black
+ restricted_roles = list("Captain","Head of Personnel")
+
/datum/gear/trekcapmedisci
- name = "Federation Officer's Cap"
+ name = "Federation Officer's Cap (Blue)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover/medsci
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekcapeng
- name = "Federation Officer's Cap"
+ name = "Federation Officer's Cap (Yellow)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover/eng
+ restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
/datum/gear/trekcapsec
- name = "Federation Officer's Cap"
+ name = "Federation Officer's Cap (Red)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover/sec
+ restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
\ No newline at end of file
diff --git a/modular_citadel/code/modules/client/loadout/loadout.dm b/modular_citadel/code/modules/client/loadout/loadout.dm
index 52e4f86dbe..2e11519d0b 100644
--- a/modular_citadel/code/modules/client/loadout/loadout.dm
+++ b/modular_citadel/code/modules/client/loadout/loadout.dm
@@ -52,6 +52,7 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids)
var/geargroupID //defines the ID that the gear inherits from the config
var/list/restricted_roles
var/list/ckeywhitelist
+ var/restricted_desc
/datum/gear/New()
..()
diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm
index f7346ec135..320a83b87d 100644
--- a/modular_citadel/code/modules/client/loadout/neck.dm
+++ b/modular_citadel/code/modules/client/loadout/neck.dm
@@ -18,6 +18,16 @@
category = SLOT_NECK
path = /obj/item/clothing/neck/petcollar
+/datum/gear/leathercollar
+ name = "Leather collar"
+ category = SLOT_NECK
+ path = /obj/item/clothing/neck/petcollar/leather
+
+/datum/gear/choker
+ name = "Choker"
+ category = SLOT_NECK
+ path = /obj/item/clothing/neck/petcollar/choker
+
/datum/gear/scarf
name = "White scarf"
category = SLOT_NECK
diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm
index 9d3a6b9a02..5a12a6bf0b 100644
--- a/modular_citadel/code/modules/client/loadout/suit.dm
+++ b/modular_citadel/code/modules/client/loadout/suit.dm
@@ -84,31 +84,62 @@
name = "DS9 Overcoat (use uniform)"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/trek/ds9
+ restricted_desc = "All, barring Service and Civilian"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster",
"Medical Doctor","Chemist","Virologist","Geneticist","Scientist", "Roboticist",
"Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer",
"Cargo Technician", "Shaft Miner") //everyone who actually deserves a job.
//Federation jackets from movies
/datum/gear/trekcmdcap
- name = "fed (movie) uniform, Captain"
+ name = "Fed (movie) uniform, Black"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/fedcoat/capt
restricted_roles = list("Captain","Head of Personnel")
/datum/gear/trekcmdmov
- name = "fed (movie) uniform, sec"
+ name = "Fed (movie) uniform, Red"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/fedcoat
+ restricted_desc = "Heads of Staff and Security"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster","Warden","Detective","Security Officer")
/datum/gear/trekmedscimov
- name = "fed (movie) uniform, med/sci"
+ name = "Fed (movie) uniform, Blue"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/fedcoat/medsci
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengmov
- name = "fed (movie) uniform, ops/eng"
+ name = "Fed (movie) uniform, Yellow"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/fedcoat/eng
+ restricted_desc = "Engineering and Cargo"
+ restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Cargo Technician", "Shaft Miner", "Quartermaster")
+
+/datum/gear/trekcmdcapmod
+ name = "Fed (Modern) uniform, White"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/storage/fluff/modernfedcoat
+ restricted_roles = list("Captain","Head of Personnel")
+
+/datum/gear/trekcmdmod
+ name = "Fed (Modern) uniform, Red"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/sec
+ restricted_desc = "Heads of Staff and Security"
+ restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster","Warden","Detective","Security Officer")
+
+/datum/gear/trekmedscimod
+ name = "Fed (Modern) uniform, Blue"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci
+ restricted_desc = "Medical and Science"
+ restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
+
+/datum/gear/trekengmod
+ name = "Fed (Modern) uniform, Yellow"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/eng
+ restricted_desc = "Engineering and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Cargo Technician", "Shaft Miner", "Quartermaster")
diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm
index e4e2f063d3..81e17e95d3 100644
--- a/modular_citadel/code/modules/client/loadout/uniform.dm
+++ b/modular_citadel/code/modules/client/loadout/uniform.dm
@@ -179,18 +179,21 @@
name = "TOS uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command
+ restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscitos
name = "TOS uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengtos
name = "TOS uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec
+ restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//TNG
@@ -198,18 +201,21 @@
name = "TNG uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/next
+ restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscitng
name = "TNG uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/next
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengtng
name = "TNG uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/next
+ restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//VOY
@@ -217,18 +223,21 @@
name = "VOY uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/voy
+ restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscivoy
name = "VOY uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/voy
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengvoy
name = "VOY uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/voy
+ restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//DS9
@@ -236,18 +245,21 @@
name = "DS9 uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/ds9
+ restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscids9
name = "DS9 uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/ds9
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengds9
name = "DS9 uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/ds9
+ restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//ENT
@@ -255,16 +267,19 @@
name = "ENT uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/ent
+ restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscient
name = "ENT uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/ent
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengent
name = "ENT uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/ent
+ restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm
index 358208c1d7..dfe419964e 100644
--- a/modular_citadel/code/modules/client/preferences.dm
+++ b/modular_citadel/code/modules/client/preferences.dm
@@ -24,77 +24,7 @@
// stuff that was in base
max_save_slots = 10
- features = list("mcolor" = "FFF",
- "tail_lizard" = "Smooth",
- "tail_human" = "None",
- "snout" = "Round",
- "horns" = "None",
- "ears" = "None",
- "wings" = "None",
- "frills" = "None",
- "spines" = "None",
- "body_markings" = "None",
- "legs" = "Normal Legs",
- "moth_wings" = "Plain",
- "mcolor2" = "FFF",
- "mcolor3" = "FFF",
- "mam_body_markings" = "None",
- "mam_ears" = "None",
- "mam_snouts" = "None",
- "mam_tail" = "None",
- "mam_tail_animated" = "None",
- "xenodorsal" = "Standard",
- "xenohead" = "Standard",
- "xenotail" = "Xenomorph Tail",
- "taur" = "None",
- "exhibitionist" = FALSE,
- "genitals_use_skintone" = FALSE,
- "has_cock" = FALSE,
- "cock_shape" = "Human",
- "cock_length" = 6,
- "cock_girth_ratio" = COCK_GIRTH_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_size" = BALLS_SIZE_DEF,
- "balls_cum_rate" = CUM_RATE,
- "balls_cum_mult" = CUM_RATE_MULT,
- "balls_efficiency" = CUM_EFFICIENCY,
- "balls_fluid" = "semen",
- "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_fluid" = "milk",
- "has_vag" = FALSE,
- "vag_shape" = "Human",
- "vag_color" = "fff",
- "vag_clits" = 1,
- "vag_clit_diam" = 0.25,
- "has_womb" = FALSE,
- "womb_cum_rate" = CUM_RATE,
- "womb_cum_mult" = CUM_RATE_MULT,
- "womb_efficiency" = CUM_EFFICIENCY,
- "womb_fluid" = "femcum",
- "ipc_screen" = "Sunburst",
- "ipc_antenna" = "None",
- "flavor_text" = ""
- )
+
/datum/preferences/New(client/C)
..()
diff --git a/modular_citadel/code/modules/clothing/under/trek_under.dm b/modular_citadel/code/modules/clothing/under/trek_under.dm
index ddcf0e6344..8e2b94372d 100644
--- a/modular_citadel/code/modules/clothing/under/trek_under.dm
+++ b/modular_citadel/code/modules/clothing/under/trek_under.dm
@@ -15,7 +15,6 @@
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
item_state = ""
can_adjust = FALSE //to prevent you from "wearing it casually"
- mutantrace_variation = NO_MUTANTRACE_VARIATION
//TOS
/obj/item/clothing/under/rank/trek/command
@@ -117,25 +116,25 @@
/obj/item/clothing/under/rank/trek/command/ds9
desc = "The uniform worn by command officers of the 2380s."
- icon_state = "trek_command"
+ icon_state = "trek_ds9_command"
item_state = "trek_ds9_command"
/obj/item/clothing/under/rank/trek/engsec/ds9
desc = "The uniform worn by operations officers of the 2380s."
- icon_state = "trek_engsec"
+ icon_state = "trek_ds9_engsec"
item_state = "trek_ds9_engsec"
/obj/item/clothing/under/rank/trek/medsci/ds9
desc = "The uniform undershirt worn by medsci officers of the 2380s."
- icon_state = "trek_medsci"
+ icon_state = "trek_ds9_medsci"
item_state = "trek_ds9_medsci"
//MODERN ish Joan sqrl sprites. I think
//For general use
/obj/item/clothing/suit/storage/fluff/fedcoat
- name = "Federation Uniform Jacket (Red)"
- desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Set phasers to awesome."
+ name = "Federation Uniform Jacket"
+ desc = "A uniform jacket from the United Federation. Set phasers to awesome."
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
@@ -177,27 +176,24 @@
icon_state = "[initial(icon_state)]_open"
item_state = "[initial(item_state)]_open"
unbuttoned = 1
- usr << "You unbutton the coat."
+ to_chat(usr,"You unbutton the coat.")
if(1)
icon_state = "[initial(icon_state)]"
item_state = "[initial(item_state)]"
unbuttoned = 0
- usr << "You button up the coat."
+ to_chat(usr,"You button up the coat.")
usr.update_inv_wear_suit()
//Variants
/obj/item/clothing/suit/storage/fluff/fedcoat/medsci
- desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Wearing this may make you feel all scientific."
icon_state = "fedblue"
item_state = "fedblue"
/obj/item/clothing/suit/storage/fluff/fedcoat/eng
- desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it.Wearing it may make you feel like checking a warp core, whatever that is."
icon_state = "fedeng"
item_state = "fedeng"
/obj/item/clothing/suit/storage/fluff/fedcoat/capt
- desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. You feel like a commanding officer of Starfleet."
icon_state = "fedcapt"
item_state = "fedcapt"
@@ -205,34 +201,31 @@
/obj/item/clothing/suit/storage/fluff/modernfedcoat
name = "Modern Federation Uniform Jacket"
- desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. Wearing this makes you feel like a competant commander."
+ desc = "A modern uniform jacket from the United Federation."
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
icon_state = "fedmodern"
item_state = "fedmodern"
body_parts_covered = CHEST|GROIN|ARMS
allowed = list(
- /obj/item/tank/internals/emergency_oxygen,
- /obj/item/flashlight,
- /obj/item/gun,
- /obj/item/melee/baton,
- /obj/item/restraints/handcuffs,
- /obj/item/taperecorder)
- armor = list("melee" = 45, "bullet" = 25, "laser" = 25,"energy" = 25, "bomb" = 25, "bio" = 25, "rad" = 50, "fire" = 50, "acid" = 50)
+ /obj/item/flashlight, /obj/item/analyzer,
+ /obj/item/radio, /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/reagent_containers/syringe,
+ /obj/item/reagent_containers/glass/bottle/vial,/obj/item/reagent_containers/glass/beaker,
+ /obj/item/reagent_containers/pill,/obj/item/storage/pill_bottle, /obj/item/restraints/handcuffs,/obj/item/hypospray
+ )
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 5, "rad" = 10, "fire" = 10, "acid" = 0)
//Variants
/obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci
- desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. Wearing this makes you feel like a scientist or a pilot."
icon_state = "fedmodernblue"
item_state = "fedmodernblue"
/obj/item/clothing/suit/storage/fluff/modernfedcoat/eng
- desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. You feel like you can handle any type of technical engineering problems."
icon_state = "fedmoderneng"
item_state = "fedmoderneng"
/obj/item/clothing/suit/storage/fluff/modernfedcoat/sec
- desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. This uniform makes you want to protect and serve as an officer."
icon_state = "fedmodernsec"
item_state = "fedmodernsec"
@@ -256,3 +249,7 @@
/obj/item/clothing/head/caphat/formal/fedcover/sec
icon_state = "fedcapsec"
item_state = "fedcapsec"
+
+/obj/item/clothing/head/caphat/formal/fedcover/black
+ icon_state = "fedcapblack"
+ item_state = "fedcapblack"
diff --git a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
index 246205f7b6..547c1a5768 100644
--- a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -14,7 +14,6 @@
ext_cooldown = 25
/obj/item/integrated_circuit/manipulation/electric_stimulator/do_work()
- ..()
set_pin_data(IC_OUTPUT, 1, 0)
var/mob/living/M = get_pin_data_as_type(IC_INPUT, 1, /mob/living)
if(!check_target(M))
diff --git a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
index 1a82040dbc..a4532d0820 100644
--- a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -36,6 +36,24 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+/datum/sprite_accessory/body_markings/guilmon
+ name = "Guilmon"
+ icon_state = "guilmon"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+
+/datum/sprite_accessory/tails/lizard/guilmon
+ name = "Guilmon"
+ icon_state = "guilmon"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
+/datum/sprite_accessory/tails_animated/lizard/guilmon
+ name = "Guilmon"
+ icon_state = "guilmon"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
//christ this was a mistake, but it's here just in case someone wants to selectively fix
/************* Lizard compatable snoots ***********
/datum/sprite_accessory/snouts/bird
@@ -197,6 +215,12 @@
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
+/datum/sprite_accessory/ears/human/elf
+ name = "Elf"
+ icon_state = "elf"
+ icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+ color_src = SKINTONE
+
/datum/sprite_accessory/ears/fennec
name = "Fennec"
icon_state = "fennec"
@@ -291,7 +315,7 @@
icon_state = "wah"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
@@ -315,7 +339,7 @@
icon_state = "bee"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/cat
name = "Cat"
icon_state = "cat"
@@ -327,7 +351,7 @@
icon_state = "cat"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = HAIR
-
+
/datum/sprite_accessory/tails/human/catbig
name = "Cat, Big"
icon_state = "catbig"
@@ -339,7 +363,7 @@
icon_state = "catbig"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/cow
name = "Cow"
icon_state = "cow"
@@ -359,7 +383,7 @@
/datum/sprite_accessory/tails_animated/human/corvid
name = "Corvid"
icon_state = "crow"
-
+
/datum/sprite_accessory/tails/human/eevee
name = "Eevee"
icon_state = "eevee"
@@ -371,7 +395,7 @@
icon_state = "eevee"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/fennec
name = "Fennec"
icon_state = "fennec"
@@ -383,7 +407,7 @@
icon_state = "fennec"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/fish
name = "Fish"
icon_state = "fish"
@@ -395,7 +419,7 @@
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/fox
name = "Fox"
icon_state = "fox"
@@ -443,7 +467,7 @@
icon_state = "insect"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/kitsune
name = "Kitsune"
icon_state = "kitsune"
@@ -455,7 +479,7 @@
icon_state = "kitsune"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/murid
name = "Murid"
icon_state = "murid"
@@ -467,7 +491,7 @@
icon_state = "murid"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/otie
name = "Otusian"
icon_state = "otie"
@@ -491,7 +515,7 @@
icon_state = "orca"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/pede
name = "Scolipede"
icon_state = "pede"
@@ -503,7 +527,7 @@
icon_state = "pede"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
@@ -515,7 +539,7 @@
icon_state = "rabbit"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/sergal
name = "Sergal"
icon_state = "sergal"
@@ -527,7 +551,7 @@
icon_state = "sergal"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/skunk
name = "skunk"
icon_state = "skunk"
@@ -571,7 +595,7 @@
/datum/sprite_accessory/tails_animated/human/straighttail
name = "Straight Tail"
icon_state = "straighttail"
-
+
/datum/sprite_accessory/tails/human/squirrel
name = "Squirrel"
icon_state = "squirrel"
@@ -595,7 +619,7 @@
icon_state = "tentacle"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/tiger
name = "Tiger"
icon_state = "tiger"
@@ -607,7 +631,7 @@
icon_state = "tiger"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/wolf
name = "Wolf"
icon_state = "wolf"
@@ -619,7 +643,7 @@
icon_state = "wolf"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/******************************************
*********** Mammal Body Parts *************
*******************************************/
@@ -1281,26 +1305,31 @@ datum/sprite_accessory/mam_tails/insect
name = "None"
icon_state = "none"
ckeys_allowed = list("yousshouldnteverbeseeingthisyoumeme")
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/plain
name = "Plain"
icon_state = "plain"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-/datum/sprite_accessory/mam_body_markings/ailurus
+/datum/sprite_accessory/mam_body_markings/redpanda
name = "Redpanda"
- icon_state = "wah"
+ icon_state = "redpanda"
/datum/sprite_accessory/mam_body_markings/bee
name = "Bee"
icon_state = "bee"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/belly
name = "Belly"
icon_state = "belly"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/bellyslim
name = "Bellyslim"
icon_state = "bellyslim"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/corgi
name = "Corgi"
@@ -1345,6 +1374,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/frog
name = "Frog"
icon_state = "frog"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/goat
name = "Goat"
@@ -1353,6 +1383,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/handsfeet
name = "Handsfeet"
icon_state = "handsfeet"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/hawk
name = "Hawk"
@@ -1373,6 +1404,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/moth
name = "Moth"
icon_state = "moth"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/otie
name = "Otie"
@@ -1401,6 +1433,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/pede
name = "Scolipede"
icon_state = "scolipede"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/shark
name = "Shark"
@@ -1429,6 +1462,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/turian
name = "Turian"
icon_state = "turian"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/wolf
name = "Wolf"
@@ -1437,6 +1471,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/xeno
name = "Xeno"
icon_state = "xeno"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/******************************************
@@ -1746,19 +1781,6 @@ datum/sprite_accessory/mam_tails/insect
// *** Snooooow flaaaaake ***
-/datum/sprite_accessory/body_markings/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/lizard/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
-
-/datum/sprite_accessory/tails_animated/lizard/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
-
/datum/sprite_accessory/horns/guilmon
name = "Guilmon"
icon_state = "guilmon"
@@ -1788,6 +1810,7 @@ datum/sprite_accessory/mam_tails/insect
name = "sabresune"
icon_state = "sabresune"
ckeys_allowed = list("poojawa")
+ extra = TRUE
/datum/sprite_accessory/mam_tails/sabresune
name = "sabresune"
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 64898f0121..b4eec5786a 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -14,7 +14,7 @@
default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None")
say_mod = "says"
hair_color = "mutcolor"
- hair_alpha = 180
+ hair_alpha = 160 //a notch brighter so it blends better.
liked_food = MEAT
coldmod = 3
heatmod = 1
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
index df41a79592..b3af722332 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
@@ -123,7 +123,7 @@
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
///research memes///
-
+/*
/obj/item/gun/ballistic/automatic/pistol/mag/nopin
pin = null
spawnwithmagazine = FALSE
@@ -155,7 +155,7 @@
materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
build_path = /obj/item/ammo_box/magazine/mmag/small
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
+*/
//////toy memes/////
/obj/item/projectile/bullet/reusable/foam_dart/mag
@@ -271,7 +271,8 @@
recoil = 0.15
casing_ejector = 0
-///research///
+/*
+//research///
/obj/item/gun/ballistic/automatic/magrifle/nopin
pin = null
@@ -304,7 +305,7 @@
materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
build_path = /obj/item/ammo_box/magazine/mmag
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
+*/
///foamagrifle///
/obj/item/ammo_box/magazine/toy/foamag
@@ -326,10 +327,9 @@
spread = 60
w_class = WEIGHT_CLASS_BULKY
weapon_weight = WEAPON_HEAVY
-
/*
// TECHWEBS IMPLEMENTATION
-*/
+//
/datum/techweb_node/magnetic_weapons
id = "magnetic_weapons"
@@ -339,7 +339,7 @@
design_ids = list("magrifle", "magpisol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
-
+*/
//////Hyper-Burst Rifle//////
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
new file mode 100644
index 0000000000..8af0dc2013
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
@@ -0,0 +1,294 @@
+///ammo///
+
+/obj/item/ammo_casing/caseless/mag_e
+ var/energy_cost = 0
+
+/obj/item/ammo_casing/caseless/mag_e/amagm_e
+ desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon."
+ caliber = "mag_e"
+ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/magrifle
+ energy_cost = 300
+
+/obj/item/ammo_casing/caseless/mag_e/anlmagm_e
+ desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
+ caliber = "mag_e"
+ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/nlmagrifle
+ energy_cost = 300
+
+/obj/item/ammo_casing/caseless/mag_e/amags
+ desc = "A ferromagnetic slug intended to be launched out of a compatible weapon."
+ caliber = "mag_e"
+ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/mags
+ energy_cost = 200
+
+/obj/item/ammo_casing/caseless/mag_e/anlmags
+ desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload."
+ caliber = "mag_e"
+ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/nlmags
+ energy_cost = 200
+
+///magazines///
+
+/obj/item/ammo_box/magazine/mmag_e/
+ name = "magrifle magazine (non-lethal disabler)"
+ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
+ icon_state = "mediummagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/mag_e/anlmagm_e
+ caliber = "mag_e"
+ max_ammo = 24
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/mmag_e/lethal
+ name = "magrifle magazine (lethal)"
+ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
+ icon_state = "mediummagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/mag_e/amagm_e
+ max_ammo = 24
+
+
+/obj/item/ammo_box/magazine/mmag_e/small
+ name = "magpistol magazine (non-lethal disabler)"
+ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
+ icon_state = "nlmagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/mag_e/anlmags
+ caliber = "mag_e"
+ max_ammo = 15
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/mmag_e/small/lethal
+ name = "magpistol magazine (lethal)"
+ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
+ icon_state = "smallmagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/mag_e/amags
+
+///cells///
+
+/obj/item/stock_parts/cell/magrifle_e
+ name = "magrifle power supply"
+ maxcharge = 14400
+ chargerate = 3520
+
+/obj/item/stock_parts/cell/magpistol_e
+ name = "magpistol power supply"
+ maxcharge = 6000
+ chargerate = 1000
+
+///sci designs///
+
+/datum/design/magrifle_e
+ name = "Magrifle"
+ desc = "An upscaled Magpistol in rifle form."
+ id = "magrifle_e"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000)
+ build_path = /obj/item/gun/ballistic/automatic/magrifle_e/nopin
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magrifle_e
+ name = "Magrifle Magazine (Lethal)"
+ desc = "A 24-round magazine for the Magrifle."
+ id = "mag_magrifle_e"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 8000, MAT_SILVER = 1000)
+ build_path = /obj/item/ammo_box/magazine/mmag_e/lethal
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magrifle_e/nl
+ name = "Magrifle Magazine (Non-Lethal)"
+ desc = "A 24- round non-lethal magazine for the Magrifle."
+ id = "mag_magrifle_e_nl"
+ materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
+ build_path = /obj/item/ammo_box/magazine/mmag_e
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/magpistol_e
+ name = "Magpistol"
+ desc = "A weapon which fires ferromagnetic slugs."
+ id = "magpistol_e"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000)
+ build_path = /obj/item/gun/ballistic/automatic/pistol/mag_e/nopin
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magpistol_e
+ name = "Magpistol Magazine"
+ desc = "A 14 round magazine for the Magpistol."
+ id = "mag_magpistol_e"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 4000, MAT_SILVER = 500)
+ build_path = /obj/item/ammo_box/magazine/mmag_e/small/lethal
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magpistol_e/nl
+ name = "Magpistol Magazine (Non-Lethal)"
+ desc = "A 14 round non-lethal magazine for the Magpistol."
+ id = "mag_magpistol_e_nl"
+ materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
+ build_path = /obj/item/ammo_box/magazine/mmag_e/small
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/*
+// TECHWEBS IMPLEMENTATION
+*/
+
+/datum/techweb_node/magnetic_weapons
+ id = "magnetic_weapons"
+ display_name = "Magnetic Weapons"
+ description = "Weapons using magnetic technology"
+ prereq_ids = list("weaponry", "adv_weaponry", "emp_adv")
+ design_ids = list("magrifle_e", "magpistol_e", "mag_magrifle_e", "mag_magrifle_e_nl", "mag_magpistol_e", "mag_magpistol_e_nl")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+///magrifle///
+
+/obj/item/gun/ballistic/automatic/magrifle_e
+ name = "\improper Magnetic Rifle"
+ desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs."
+ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
+ icon_state = "magrifle"
+ item_state = "arg"
+ slot_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/mmag_e
+ fire_sound = 'sound/weapons/magrifle.ogg'
+ can_suppress = 0
+ burst_size = 3
+ fire_delay = 2
+ spread = 5
+ recoil = 0.15
+ casing_ejector = 0
+ var/obj/item/stock_parts/cell/cell
+ var/cell_type = /obj/item/stock_parts/cell/magrifle_e
+ var/dead_cell = FALSE
+
+/obj/item/gun/ballistic/automatic/magrifle_e/examine(mob/user)
+ . = ..()
+ if(cell)
+ to_chat(user, "[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.")
+ else
+ to_chat(user, "[src] doesn't seem to have a cell!")
+
+/obj/item/gun/ballistic/automatic/magrifle_e/can_shoot()
+ if(QDELETED(cell))
+ return 0
+
+ var/obj/item/ammo_casing/caseless/mag_e/shot = chambered
+ if(!shot)
+ return 0
+ if(cell.charge < shot.energy_cost*burst_size)
+ return 0
+ . = ..()
+
+/obj/item/gun/ballistic/automatic/magrifle_e/shoot_live_shot()
+ var/obj/item/ammo_casing/caseless/mag_e/shot = chambered
+ cell.use(shot.energy_cost)
+ . = ..()
+
+/obj/item/gun/ballistic/automatic/magrifle_e/emp_act(severity)
+ . = ..()
+ if(!(. & EMP_PROTECT_CONTENTS))
+ cell.use(round(cell.charge / severity))
+
+/obj/item/gun/ballistic/automatic/magrifle_e/get_cell()
+ return cell
+
+/obj/item/gun/ballistic/automatic/magrifle_e/Initialize()
+ . = ..()
+ if(cell_type)
+ cell = new cell_type(src)
+ else
+ cell = new(src)
+
+ if(!dead_cell)
+ cell.give(cell.maxcharge)
+
+/obj/item/gun/ballistic/automatic/magrifle_e/nopin
+ pin = null
+ spawnwithmagazine = FALSE
+
+
+///magpistol///
+
+/obj/item/gun/ballistic/automatic/pistol/mag_e
+ name = "magpistol"
+ desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities."
+ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
+ icon_state = "magpistol"
+ force = 10
+ fire_sound = 'sound/weapons/magpistol.ogg'
+ mag_type = /obj/item/ammo_box/magazine/mmag_e/small
+ can_suppress = 0
+ casing_ejector = 0
+ fire_delay = 2
+ recoil = 0.2
+ var/obj/item/stock_parts/cell/cell
+ var/cell_type = /obj/item/stock_parts/cell/magpistol_e
+ var/dead_cell = FALSE
+
+/obj/item/gun/ballistic/automatic/pistol/mag_e/examine(mob/user)
+ . = ..()
+ if(cell)
+ to_chat(user, "[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.")
+ else
+ to_chat(user, "[src] doesn't seem to have a cell!")
+
+/obj/item/gun/ballistic/automatic/pistol/mag_e/can_shoot()
+ if(QDELETED(cell))
+ return 0
+
+ var/obj/item/ammo_casing/caseless/mag_e/shot = chambered
+ if(!shot)
+ return 0
+ if(cell.charge < shot.energy_cost)
+ return 0
+ . = ..()
+
+/obj/item/gun/ballistic/automatic/pistol/mag_e/shoot_live_shot()
+ var/obj/item/ammo_casing/caseless/mag_e/shot = chambered
+ cell.use(shot.energy_cost)
+ . = ..()
+
+/obj/item/gun/ballistic/automatic/pistol/mag_e/emp_act(severity)
+ . = ..()
+ if(!(. & EMP_PROTECT_CONTENTS))
+ cell.use(round(cell.charge / severity))
+
+/obj/item/gun/ballistic/automatic/pistol/mag_e/get_cell()
+ return cell
+
+/obj/item/gun/ballistic/automatic/pistol/mag_e/Initialize()
+ . = ..()
+ if(cell_type)
+ cell = new cell_type(src)
+ else
+ cell = new(src)
+
+ if(!dead_cell)
+ cell.give(cell.maxcharge)
+
+
+/obj/item/gun/ballistic/automatic/pistol/mag_e/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("magpistol-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+
+/obj/item/gun/ballistic/automatic/pistol/mag_e/nopin
+ pin = null
+ spawnwithmagazine = FALSE
diff --git a/modular_citadel/code/modules/projectiles/guns/energy/laser.dm b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm
index 61996a777a..c82a3e9ed9 100644
--- a/modular_citadel/code/modules/projectiles/guns/energy/laser.dm
+++ b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm
@@ -17,30 +17,3 @@
/obj/item/gun/energy/laser/redtag
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
-
-/obj/item/gun/energy/laser/carbine
- name = "VGS blaster carbine"
- desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal blaster carbine."
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "lasernew"
- item_state = "laser"
- force = 10
- throwforce = 10
- ammo_type = list(/obj/item/ammo_casing/energy/lasergun)
- cell_type = /obj/item/stock_parts/cell/lascarbine
-
-/obj/item/gun/energy/laser/carbine/nopin
- pin = null
-
-/obj/item/stock_parts/cell/lascarbine
- name = "laser carbine power supply"
- maxcharge = 2500
-
-/datum/design/lasercarbine
- name = "VGS Blaster Carbine"
- desc = "Beefed up version of a normal blaster carbine."
- id = "lasercarbine"
- build_type = PROTOLATHE
- materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000)
- build_path = /obj/item/gun/energy/laser/carbine/nopin
- category = list("Weapons")
\ No newline at end of file
diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
index e46174b5a9..061f941043 100644
--- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
+++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
@@ -97,7 +97,7 @@
color = "#FFADFF"//PINK, rgb(255, 173, 255)
/datum/reagent/drug/aphrodisiac/on_mob_life(mob/living/M)
- if(M && M.canbearoused)
+ if(M && M.canbearoused && !M.has_trait(TRAIT_CROCRIN_IMMUNE))
if(prob(33))
M.adjustArousalLoss(2)
if(prob(5))
@@ -119,7 +119,7 @@
overdose_threshold = 20
/datum/reagent/drug/aphrodisiacplus/on_mob_life(mob/living/M)
- if(M && M.canbearoused)
+ if(M && M.canbearoused && !M.has_trait(TRAIT_CROCRIN_IMMUNE))
if(prob(33))
M.adjustArousalLoss(6)//not quite six times as powerful, but still considerably more powerful.
if(prob(5))
@@ -151,7 +151,7 @@
..()
/datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M)
- if(M && M.canbearoused && prob(33))
+ if(M && M.canbearoused && !M.has_trait(TRAIT_CROCRIN_IMMUNE) && prob(33))
if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna())
var/mob/living/carbon/human/H = M
if(prob(50)) //Less spam
diff --git a/modular_citadel/icons/mob/clothing/trek_item_icon.dmi b/modular_citadel/icons/mob/clothing/trek_item_icon.dmi
index 86afe16b03..ed3286615b 100644
Binary files a/modular_citadel/icons/mob/clothing/trek_item_icon.dmi and b/modular_citadel/icons/mob/clothing/trek_item_icon.dmi differ
diff --git a/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi b/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi
index 51daa8179f..d3ebc31b6a 100644
Binary files a/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi and b/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi differ
diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi
index b3946b546c..f2a788d900 100644
Binary files a/modular_citadel/icons/mob/mam_ears.dmi and b/modular_citadel/icons/mob/mam_ears.dmi differ
diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi
index c391674190..ceecf12d2e 100644
Binary files a/modular_citadel/icons/mob/mam_markings.dmi and b/modular_citadel/icons/mob/mam_markings.dmi differ
diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi
index 74eccae2f8..b16de1c0de 100644
Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ
diff --git a/modular_citadel/icons/mob/markings_notmammals.dmi b/modular_citadel/icons/mob/markings_notmammals.dmi
index 4161ea2cea..316d1d1af8 100644
Binary files a/modular_citadel/icons/mob/markings_notmammals.dmi and b/modular_citadel/icons/mob/markings_notmammals.dmi differ
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
index 6a0bf77cd3..1ed73d2709 100644
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ
diff --git a/modular_citadel/icons/mob/muzzled_helmet.dmi b/modular_citadel/icons/mob/muzzled_helmet.dmi
index 36313cce66..e1284679b3 100644
Binary files a/modular_citadel/icons/mob/muzzled_helmet.dmi and b/modular_citadel/icons/mob/muzzled_helmet.dmi differ
diff --git a/modular_citadel/icons/mob/suit_digi.dmi b/modular_citadel/icons/mob/suit_digi.dmi
index 22fddbe59d..c19fb01161 100644
Binary files a/modular_citadel/icons/mob/suit_digi.dmi and b/modular_citadel/icons/mob/suit_digi.dmi differ
diff --git a/modular_citadel/icons/mob/uniform_digi.dmi b/modular_citadel/icons/mob/uniform_digi.dmi
index c5ee6b1780..9513f82c9c 100644
Binary files a/modular_citadel/icons/mob/uniform_digi.dmi and b/modular_citadel/icons/mob/uniform_digi.dmi differ
diff --git a/modular_citadel/icons/obj/food/cake.dmi b/modular_citadel/icons/obj/food/cake.dmi
new file mode 100644
index 0000000000..840bfe714d
Binary files /dev/null and b/modular_citadel/icons/obj/food/cake.dmi differ
diff --git a/modular_citadel/icons/obj/food/food.dmi b/modular_citadel/icons/obj/food/food.dmi
index ea66b3d48a..da9a6c365f 100644
Binary files a/modular_citadel/icons/obj/food/food.dmi and b/modular_citadel/icons/obj/food/food.dmi differ
diff --git a/strings/clockwork_cult_changelog.txt b/strings/clockwork_cult_changelog.txt
index c963ca91d1..3c5e5f5ef6 100644
--- a/strings/clockwork_cult_changelog.txt
+++ b/strings/clockwork_cult_changelog.txt
@@ -1 +1,4 @@
-Stargazers have been removed. Integration cogs are now the primary way of creating power.
\ No newline at end of file
+Stargazers have been removed. Integration cogs are now the primary way of creating power.
+Brass Skewers now deal damage to mechs.
+Mech Sensors are now available. They're similar to pressure sensors, but trigger if a mech steps on them, and can be built the same way.
+Power nullifiers are now available. Upon triggering, they send out a small 3x3 EMP, affecting cultists and enemies alike.
diff --git a/strings/tips.txt b/strings/tips.txt
index 9571527853..e9c1350469 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -229,6 +229,8 @@ As a Servant, wraith spectacles let you see everything through walls at virtuall
As a Servant, declaring war empowers a huge amount of your tools and constructs, and makes you into a spaceproof, armored clockwork automaton.
As a Servant, converting or sabotaging Science and Genetics can make defending the Ark much easier.
As a Servant, the Clockwork Armaments scripture allows you to summon armor and/or a weapon at will. Use it whenever you unlock it!
+As a Servant, Brass created from your replica fabricators can be ground down in reagent grinders for teslium and iron.
+You can bypass Servant created pressure sensors if you walk instead of jog on them. Alternatively, you can also become a Servant of Ratvar.
You can deconvert Cultists of Nar-Sie and Servants of Ratvar by feeding them large amounts of holy water. Unlike revolutionaries, implanting them with mindshield implants won't do it!
Tiles sprayed with holy water will permanently block Servants of Ratvar from teleporting onto them.
As a Wizard, you can turn people to stone, then animate the resulting statue with a staff of animation to create an extremely powerful minion, for all of 5 minutes at least.
diff --git a/strings/traumas.json b/strings/traumas.json
index 9394f11f3a..f83a023491 100644
--- a/strings/traumas.json
+++ b/strings/traumas.json
@@ -108,7 +108,31 @@
"@pick(semicolon)i ran into the supermattre ten i dsappeard @pick(bug)",
"DON'T EVER TUCH ME",
"@pick(semicolon)GIVE ME FREE ROBUX PLEASE JUST ENOUGH FOR SHIRT AND PANTS",
- "@pick(semicolon) DOOR STUCK!!"
+ "@pick(semicolon) DOOR STUCK!!",
+ "HOW DO i VORE",
+ "HOW DO i HAV SEX",
+ "@pick(semicolon)how do u cum",
+ "@pick(semicolon)ahelp how do u use dildo",
+ ";AI LAW 3 OPEN THIS.",
+ "ahelp hos pwrgamre they have 24 inch dick",
+ ";KERPTAN IS A KERNDUM",
+ "@pick(semicolon)RESEARCH NANITES FIRST",
+ "@pick(semicolon)how use comms?????????",
+ "@pick(semicolon)im SICK of ths fuckign humans runin g my furry server",
+ "@pick(semicolon)ai ROUGE",
+ "ahelp want a big titty @pick(create_nouns) gf to deepthroat my pp",
+ "@pick(semicolon)CHEMISST MAKE HEXACROCON OR REPORT",
+ "@pick(semicolon)drone 765 law 2 state LAWS NOW",
+ "@pick(semicolon)SM ROGUE",
+ "@pick(semicolon)IPCS STATE LAWS NOW",
+ "@pick(semicolon)lING DORMS i hear Suking noises!!!",
+ "@pick(semicolon)@pick(roles) tator they have @pick(mutations)!!",
+ "@pick(semicolon)aooc how do i steel @pick(cargo)?",
+ "@pick(semicolon)how do i play",
+ "ahelp help security powergaming with mindshields???",
+ ";,g absorbing @pick(roles)",
+ ";chemist can u @pick(create_verbs) holy @pick(mellens) for @pick(s_roles)???!!",
+ "@pick(semicolon) LIZZARRD SPEAKIGN IN EVIL BULL LANGUAGE SCI!!"
],
"mutations": [
diff --git a/tgstation.dme b/tgstation.dme
index 5b4c4eabe5..fe0f881eed 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1226,6 +1226,7 @@
#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_scripts.dm"
#include "code\modules\antagonists\clockcult\clock_structures\_trap_object.dm"
#include "code\modules\antagonists\clockcult\clock_structures\ark_of_the_clockwork_justicar.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\stargazer.dm"
#include "code\modules\antagonists\clockcult\clock_structures\clockwork_obelisk.dm"
#include "code\modules\antagonists\clockcult\clock_structures\eminence_spire.dm"
#include "code\modules\antagonists\clockcult\clock_structures\heralds_beacon.dm"
@@ -1236,8 +1237,10 @@
#include "code\modules\antagonists\clockcult\clock_structures\wall_gear.dm"
#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\lever.dm"
#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor_mech.dm"
#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\repeater.dm"
#include "code\modules\antagonists\clockcult\clock_structures\traps\brass_skewer.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\traps\power_null.dm"
#include "code\modules\antagonists\clockcult\clock_structures\traps\steam_vent.dm"
#include "code\modules\antagonists\cult\blood_magic.dm"
#include "code\modules\antagonists\cult\cult.dm"
@@ -1628,6 +1631,7 @@
#include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm"
#include "code\modules\food_and_drinks\food\snacks_soup.dm"
#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm"
+#include "code\modules\food_and_drinks\food\snacks_sushi.dm"
#include "code\modules\food_and_drinks\food\snacks_vend.dm"
#include "code\modules\food_and_drinks\food\snacks\dough.dm"
#include "code\modules\food_and_drinks\food\snacks\meat.dm"
@@ -1655,6 +1659,7 @@
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sushi.dm"
#include "code\modules\games\cas.dm"
#include "code\modules\goonchat\browserOutput.dm"
#include "code\modules\goonchat\jsErrorHandler.dm"
@@ -1751,6 +1756,7 @@
#include "code\modules\integrated_electronics\subtypes\text.dm"
#include "code\modules\integrated_electronics\subtypes\time.dm"
#include "code\modules\integrated_electronics\subtypes\trig.dm"
+#include "code\modules\integrated_electronics\subtypes\weaponized.dm"
#include "code\modules\jobs\access.dm"
#include "code\modules\jobs\job_exp.dm"
#include "code\modules\jobs\jobs.dm"
@@ -1874,7 +1880,23 @@
#include "code\modules\mob\dead\new_player\new_player.dm"
#include "code\modules\mob\dead\new_player\poll.dm"
#include "code\modules\mob\dead\new_player\preferences_setup.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\_sprite_accessories.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\body_markings.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\caps.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\ears.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\frills.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\hair_face.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\hair_head.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\horns.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\legs.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\moth_wings.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\pines.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\snouts.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\socks.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\tails.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\undershirt.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\underwear.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\wings.dm"
#include "code\modules\mob\dead\observer\login.dm"
#include "code\modules\mob\dead\observer\logout.dm"
#include "code\modules\mob\dead\observer\notificationprefs.dm"
@@ -2954,6 +2976,7 @@
#include "modular_citadel\code\modules\projectiles\guns\ballistic\flechette.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon_energy.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\revolver.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm"