diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index b3a0289761..738148c948 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -209,6 +209,8 @@
dir = 8
},
/obj/item/malf_upgrade,
+/obj/item/disk/tech_disk/illegal,
+/obj/structure/safe,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"aB" = (
diff --git a/_maps/RandomRuins/SpaceRuins/arcade.dmm b/_maps/RandomRuins/SpaceRuins/arcade.dmm
new file mode 100644
index 0000000000..771c33c55b
--- /dev/null
+++ b/_maps/RandomRuins/SpaceRuins/arcade.dmm
@@ -0,0 +1,711 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/turf/open/floor/plating/asteroid,
+/area/ruin/powered)
+"c" = (
+/turf/closed/mineral/random/high_chance,
+/area/ruin/powered)
+"d" = (
+/turf/closed/wall/mineral/titanium/survival/pod,
+/area/ruin/powered)
+"e" = (
+/obj/machinery/computer/arcade,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"f" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/vending/coffee,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"g" = (
+/obj/item/coin,
+/obj/item/toy/plush/random,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"h" = (
+/obj/effect/mob_spawn/human/corpse/assistant,
+/obj/effect/decal/cleanable/blood,
+/obj/item/toy/plush/random,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"i" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/item/toy/plush/random,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"j" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/ruin/powered)
+"k" = (
+/obj/item/coin/gold,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"l" = (
+/turf/open/floor/engine,
+/area/ruin/powered)
+"m" = (
+/obj/item/coin/iron,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"n" = (
+/obj/item/toy/plush/random,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"o" = (
+/obj/item/kitchen/knife{
+ pixel_x = 5;
+ pixel_y = 11
+ },
+/obj/item/toy/plush/random,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"p" = (
+/turf/closed/wall/mineral/titanium/survival/nodiagonal,
+/area/ruin/powered)
+"q" = (
+/turf/open/floor/light/colour_cycle/dancefloor_b,
+/area/ruin/powered)
+"r" = (
+/turf/open/floor/light/colour_cycle/dancefloor_a,
+/area/ruin/powered)
+"s" = (
+/obj/machinery/door/airlock/external/glass,
+/obj/structure/fans/tiny,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"t" = (
+/obj/item/trash/chips,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"u" = (
+/obj/item/trash/cheesie,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"v" = (
+/obj/item/coin,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"w" = (
+/obj/item/coin/diamond,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"x" = (
+/obj/machinery/jukebox/disco/indestructible,
+/turf/open/floor/light/colour_cycle/dancefloor_b,
+/area/ruin/powered)
+"y" = (
+/obj/machinery/light,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"z" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/ruin/powered)
+"A" = (
+/obj/machinery/door/airlock/external/glass,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"B" = (
+/obj/machinery/vending/cola/random,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"C" = (
+/obj/machinery/vending/snack/random,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"D" = (
+/obj/item/trash/can,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"E" = (
+/obj/item/trash/sosjerky,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"F" = (
+/obj/structure/closet/crate/trashcart,
+/turf/open/floor/plating/asteroid,
+/area/ruin/powered)
+"G" = (
+/obj/structure/chair/sofa/right,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"H" = (
+/obj/structure/chair/sofa/left,
+/obj/item/bedsheet/ian,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"I" = (
+/obj/item/aiModule/toyAI,
+/turf/open/floor/engine,
+/area/ruin/powered)
+"J" = (
+/obj/item/twohanded/dualsaber/toy,
+/turf/open/floor/light/colour_cycle/dancefloor_b,
+/area/ruin/powered)
+"K" = (
+/obj/item/gun/energy/pumpaction/toy,
+/turf/open/floor/engine,
+/area/ruin/powered)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+a
+b
+b
+b
+b
+b
+b
+b
+b
+a
+a
+a
+b
+b
+b
+b
+a
+a
+"}
+(4,1,1) = {"
+a
+a
+a
+b
+b
+b
+b
+b
+b
+b
+b
+a
+a
+b
+b
+b
+b
+b
+b
+a
+"}
+(5,1,1) = {"
+a
+a
+a
+b
+b
+c
+c
+c
+c
+b
+b
+b
+b
+b
+b
+c
+c
+c
+b
+b
+"}
+(6,1,1) = {"
+a
+a
+a
+b
+c
+c
+c
+c
+c
+b
+b
+b
+b
+c
+c
+c
+c
+c
+c
+b
+"}
+(7,1,1) = {"
+a
+a
+a
+b
+c
+c
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+c
+c
+c
+b
+"}
+(8,1,1) = {"
+a
+a
+a
+b
+c
+c
+d
+e
+j
+l
+l
+K
+j
+G
+B
+d
+c
+c
+b
+b
+"}
+(9,1,1) = {"
+a
+a
+a
+b
+c
+c
+d
+e
+k
+l
+v
+l
+l
+H
+C
+d
+c
+c
+b
+a
+"}
+(10,1,1) = {"
+a
+a
+b
+b
+c
+c
+d
+e
+l
+I
+l
+l
+l
+k
+B
+d
+c
+c
+b
+a
+"}
+(11,1,1) = {"
+a
+a
+b
+c
+c
+c
+d
+e
+l
+l
+w
+l
+y
+d
+d
+p
+c
+b
+b
+a
+"}
+(12,1,1) = {"
+a
+a
+b
+c
+c
+c
+d
+e
+m
+J
+r
+q
+l
+A
+l
+s
+b
+b
+b
+a
+"}
+(13,1,1) = {"
+a
+b
+b
+c
+c
+c
+d
+f
+l
+r
+x
+r
+l
+d
+d
+d
+b
+b
+b
+a
+"}
+(14,1,1) = {"
+a
+b
+b
+c
+c
+c
+d
+e
+l
+q
+r
+q
+D
+A
+l
+s
+b
+b
+b
+a
+"}
+(15,1,1) = {"
+a
+b
+b
+b
+c
+c
+d
+e
+t
+u
+l
+E
+y
+d
+d
+p
+b
+b
+b
+a
+"}
+(16,1,1) = {"
+a
+b
+b
+b
+c
+c
+d
+e
+g
+n
+t
+k
+l
+l
+B
+d
+c
+b
+b
+a
+"}
+(17,1,1) = {"
+a
+b
+b
+c
+c
+c
+d
+e
+h
+o
+D
+l
+D
+l
+C
+d
+c
+c
+b
+b
+"}
+(18,1,1) = {"
+a
+a
+b
+c
+c
+c
+d
+e
+i
+n
+E
+l
+z
+m
+B
+d
+c
+c
+c
+b
+"}
+(19,1,1) = {"
+a
+a
+b
+c
+c
+c
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+c
+c
+c
+b
+"}
+(20,1,1) = {"
+a
+a
+b
+b
+c
+c
+c
+c
+c
+c
+b
+F
+b
+c
+c
+c
+c
+c
+c
+b
+"}
+(21,1,1) = {"
+a
+a
+a
+b
+c
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+b
+b
+"}
+(22,1,1) = {"
+a
+a
+a
+b
+b
+c
+c
+c
+c
+b
+b
+b
+b
+b
+b
+c
+c
+b
+b
+a
+"}
+(23,1,1) = {"
+a
+a
+a
+a
+b
+b
+b
+b
+b
+b
+a
+b
+b
+b
+b
+b
+b
+b
+a
+a
+"}
+(24,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+b
+a
+a
+a
+"}
+(25,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+a
+a
+a
+a
+"}
diff --git a/_maps/RandomRuins/SpaceRuins/augmentationfacility.dmm b/_maps/RandomRuins/SpaceRuins/augmentationfacility.dmm
new file mode 100644
index 0000000000..c64050ce3a
--- /dev/null
+++ b/_maps/RandomRuins/SpaceRuins/augmentationfacility.dmm
@@ -0,0 +1,731 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/turf/open/floor/plating/asteroid,
+/area/ruin/powered)
+"c" = (
+/turf/closed/mineral/random/high_chance,
+/area/ruin/powered)
+"d" = (
+/turf/closed/wall/r_wall/rust,
+/area/ruin/powered)
+"e" = (
+/obj/machinery/mecha_part_fabricator,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"f" = (
+/turf/closed/wall/rust,
+/area/ruin/powered)
+"g" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/stack/sheet/glass/fifty,
+/obj/item/stack/sheet/metal/fifty,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"h" = (
+/obj/machinery/mecha_part_fabricator,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"i" = (
+/obj/structure/table,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/stack/sheet/glass/fifty,
+/obj/item/stack/sheet/metal/fifty,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"j" = (
+/obj/structure/chair/sofa/right,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"k" = (
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"l" = (
+/obj/structure/chair/sofa/left,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"m" = (
+/obj/machinery/computer/rdconsole/production{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"n" = (
+/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"o" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"p" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"q" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/aug_manipulator,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"r" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/organ/cyberimp/chest/reviver,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"s" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/organ/cyberimp/arm/surgery,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"t" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"u" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"v" = (
+/obj/machinery/porta_turret/syndicate/energy{
+ mode = 1
+ },
+/turf/closed/wall/r_wall/rust,
+/area/ruin/powered)
+"w" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/computer/mech_bay_power_console{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"x" = (
+/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"y" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"z" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/storage/belt/utility/full,
+/obj/item/clothing/glasses/welding,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"A" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/mmi/posibrain{
+ pixel_y = 9
+ },
+/obj/item/mmi,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"B" = (
+/obj/structure/table/optable,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"C" = (
+/obj/machinery/mech_bay_recharge_port,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"D" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/mech_bay_recharge_floor,
+/area/ruin/powered)
+"E" = (
+/obj/machinery/computer/operating{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"F" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/autosurgeon{
+ name = "rusted autosurgeon";
+ desc = "A device that automatically inserts an implant or organ into the user without the hassle of extensive surgery. It has a slot to insert an organ of implant. But this rusted version looks like it could only manage one implant....";
+ uses = 1
+ },
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"G" = (
+/obj/machinery/light,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"H" = (
+/obj/effect/decal/cleanable/oil,
+/obj/machinery/light,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"I" = (
+/obj/machinery/door/airlock/external/glass,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"J" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer1{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid,
+/area/ruin/powered)
+"K" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
+ dir = 4
+ },
+/turf/closed/mineral/random/high_chance,
+/area/ruin/powered)
+"L" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
+ dir = 4
+ },
+/turf/closed/wall/r_wall/rust,
+/area/ruin/powered)
+"M" = (
+/obj/structure/mecha_wreckage/ripley,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"N" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"O" = (
+/obj/machinery/turretid{
+ lethal = 1;
+ pixel_y = -25;
+ req_access = null
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 5
+ },
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"P" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"Q" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"R" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"S" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"T" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/tank/air{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"U" = (
+/obj/machinery/door/airlock/external/glass,
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+"V" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plasteel,
+/area/ruin/powered)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+a
+a
+b
+b
+c
+c
+c
+c
+J
+b
+b
+a
+a
+a
+a
+a
+a
+a
+"}
+(4,1,1) = {"
+a
+a
+a
+b
+c
+c
+c
+c
+c
+c
+K
+c
+b
+b
+b
+a
+a
+a
+a
+a
+"}
+(5,1,1) = {"
+a
+a
+b
+c
+c
+d
+d
+d
+d
+d
+L
+d
+c
+c
+b
+a
+a
+a
+a
+a
+"}
+(6,1,1) = {"
+a
+a
+b
+c
+d
+d
+m
+q
+w
+C
+M
+d
+d
+c
+b
+a
+a
+a
+a
+a
+"}
+(7,1,1) = {"
+a
+b
+b
+c
+d
+e
+n
+o
+x
+D
+N
+f
+d
+v
+b
+a
+a
+a
+a
+a
+"}
+(8,1,1) = {"
+a
+b
+c
+c
+d
+g
+o
+o
+y
+Q
+S
+I
+k
+U
+b
+a
+a
+a
+a
+a
+"}
+(9,1,1) = {"
+a
+b
+c
+c
+d
+h
+p
+r
+z
+o
+G
+f
+f
+d
+b
+a
+a
+a
+a
+a
+"}
+(10,1,1) = {"
+a
+b
+c
+c
+d
+i
+p
+s
+A
+o
+H
+f
+f
+d
+b
+a
+a
+a
+a
+a
+"}
+(11,1,1) = {"
+a
+b
+c
+c
+d
+j
+p
+t
+F
+o
+p
+I
+k
+U
+b
+a
+a
+a
+a
+a
+"}
+(12,1,1) = {"
+a
+b
+c
+c
+d
+l
+p
+p
+P
+R
+O
+f
+d
+v
+b
+b
+a
+a
+a
+a
+"}
+(13,1,1) = {"
+a
+b
+b
+c
+d
+d
+V
+u
+B
+E
+T
+d
+d
+c
+c
+b
+a
+a
+a
+a
+"}
+(14,1,1) = {"
+a
+a
+b
+c
+c
+d
+d
+d
+d
+d
+d
+d
+c
+c
+c
+b
+a
+a
+a
+a
+"}
+(15,1,1) = {"
+a
+a
+a
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+a
+a
+a
+a
+"}
+(16,1,1) = {"
+a
+a
+a
+b
+b
+b
+b
+c
+c
+c
+c
+b
+b
+b
+b
+a
+a
+a
+a
+a
+"}
+(17,1,1) = {"
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(18,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(19,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(20,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/RandomRuins/SpaceRuins/bigape.dmm b/_maps/RandomRuins/SpaceRuins/bigape.dmm
new file mode 100644
index 0000000000..09e85e129d
--- /dev/null
+++ b/_maps/RandomRuins/SpaceRuins/bigape.dmm
@@ -0,0 +1,196 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/template_noop)
+"c" = (
+/turf/open/floor/plating/beach/sand,
+/area/ruin/powered)
+"d" = (
+/obj/structure/fans/tiny/invisible,
+/turf/open/floor/plating/beach/sand,
+/area/ruin/powered)
+"e" = (
+/obj/item/reagent_containers/food/snacks/grown/banana,
+/obj/item/reagent_containers/food/snacks/grown/banana,
+/obj/item/reagent_containers/food/snacks/grown/banana,
+/obj/item/reagent_containers/food/snacks/grown/banana,
+/obj/item/reagent_containers/food/snacks/grown/banana,
+/obj/structure/fans/tiny/invisible,
+/obj/structure/closet/secure_closet/freezer,
+/turf/open/floor/plating/beach/sand,
+/area/ruin/powered)
+"f" = (
+/obj/structure/chair/sofa/left{
+ dir = 4
+ },
+/turf/open/floor/plating/beach/sand,
+/area/ruin/powered)
+"g" = (
+/obj/item/flashlight/lamp/bananalamp{
+ brightness_on = 10
+ },
+/obj/structure/table/wood,
+/obj/structure/fans/tiny/invisible,
+/turf/open/floor/plating/beach/sand,
+/area/ruin/powered)
+"h" = (
+/obj/structure/table/wood,
+/obj/machinery/computer/security/wooden_tv,
+/turf/open/floor/plating/beach/sand,
+/area/ruin/powered)
+"i" = (
+/obj/structure/chair/sofa/right{
+ dir = 4
+ },
+/turf/open/floor/plating/beach/sand,
+/area/ruin/powered)
+"j" = (
+/obj/structure/sink/puddle,
+/turf/open/floor/plating/beach/sand,
+/area/ruin/powered)
+"k" = (
+/obj/structure/chair/sofa{
+ dir = 4
+ },
+/mob/living/simple_animal/hostile/gorilla{
+ AIStatus = null;
+ desc = "There is no need to be upset.";
+ dir = 4;
+ name = "Familiar Gorilla"
+ },
+/turf/open/floor/plating/beach/sand,
+/area/ruin/powered)
+"l" = (
+/obj/effect/overlay/palmtree_r,
+/obj/structure/fans/tiny/invisible,
+/turf/open/floor/plating/beach/sand,
+/area/ruin/powered)
+"m" = (
+/obj/item/grown/bananapeel,
+/turf/open/floor/plating/beach/sand,
+/area/ruin/powered)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+b
+a
+"}
+(2,1,1) = {"
+a
+a
+b
+b
+b
+b
+b
+b
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+b
+b
+g
+d
+d
+b
+b
+a
+"}
+(4,1,1) = {"
+a
+a
+b
+d
+f
+k
+i
+d
+d
+b
+"}
+(5,1,1) = {"
+a
+a
+b
+e
+c
+c
+m
+j
+d
+b
+"}
+(6,1,1) = {"
+a
+a
+b
+d
+c
+h
+c
+l
+d
+b
+"}
+(7,1,1) = {"
+a
+b
+b
+b
+d
+d
+d
+b
+b
+a
+"}
+(8,1,1) = {"
+a
+b
+a
+a
+b
+b
+b
+b
+b
+b
+"}
+(9,1,1) = {"
+a
+b
+a
+a
+a
+b
+a
+a
+a
+b
+"}
+(10,1,1) = {"
+a
+a
+a
+a
+a
+b
+a
+a
+a
+a
+"}
diff --git a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm
index 624aa03d7c..5f0dd0434a 100644
--- a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm
+++ b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm
@@ -742,6 +742,7 @@
/turf/open/indestructible/paper,
/area/ruin/powered)
"cc" = (
+/obj/item/book/granter/action/origami,
/mob/living/simple_animal/hostile/boss/paper_wizard,
/turf/open/indestructible/paper,
/area/ruin/powered)
diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm
index f05bf6f3e1..1f5b82f7bf 100644
--- a/code/__HELPERS/areas.dm
+++ b/code/__HELPERS/areas.dm
@@ -86,6 +86,8 @@
newA.contents += thing
thing.change_area(old_area, newA)
+ newA.reg_in_areas_in_z()
+
var/list/firedoors = oldA.firedoors
for(var/door in firedoors)
var/obj/machinery/door/firedoor/FD = door
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index a2c60618ac..9eb71c9059 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -495,4 +495,9 @@ GLOBAL_LIST_EMPTY(the_station_areas)
clearing |= used_turfs //used turfs is an associative list, BUT, reserve_turfs() can still handle it. If the code above works properly, this won't even be needed as the turfs would be freed already.
unused_turfs.Cut()
used_turfs.Cut()
- reserve_turfs(clearing)
\ No newline at end of file
+ reserve_turfs(clearing)
+
+/datum/controller/subsystem/mapping/proc/reg_in_areas_in_z(list/areas)
+ for(var/B in areas)
+ var/area/A = B
+ A.reg_in_areas_in_z()
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index b0a78211b0..127413262c 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -86,13 +86,13 @@
return 0
/datum/martial_art/krav_maga/proc/leg_sweep(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
- if(D.stat || D.IsKnockdown())
+ if(D.lying || D.IsKnockdown())
return 0
D.visible_message("[A] leg sweeps [D]!", \
"[A] leg sweeps you!")
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
D.apply_damage(5, BRUTE)
- D.Knockdown(40)
+ D.Knockdown(40, override_hardstun = 0.01, 25)
log_combat(A, D, "leg sweeped")
return 1
diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm
index 5c718cf554..d986672924 100644
--- a/code/datums/mutations/speech.dm
+++ b/code/datums/mutations/speech.dm
@@ -229,4 +229,4 @@
/datum/mutation/human/stoner/on_losing(mob/living/carbon/human/owner)
..()
owner.grant_language(/datum/language/common)
- owner.remove_language(/datum/language/beachbum)
+ owner.remove_language(/datum/language/beachbum)
\ No newline at end of file
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index 058c820f7a..e66673d4f5 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -281,3 +281,21 @@
suffix = "cloning_facility.dmm"
name = "Ancient Cloning Lab"
description = "An experimental cloning lab snapped off from an ancient ship. The cloner model inside lacks many modern functionalities and security measures."
+
+/datum/map_template/ruin/space/augmentation
+ id = "augmentationfacility"
+ suffix = "augmentationfacility.dmm"
+ name = "Roboticst Augmentation Facility"
+ description = "A mysterious lab in the depths of space containing robotics supplies and a one use autosurgeon."
+
+/datum/map_template/ruin/space/harambe
+ id = "bigape"
+ suffix = "bigape.dmm"
+ name = "Big Ape"
+ description = "A gorilla? Out here? But why."
+
+/datum/map_template/ruin/space/space_arcade
+ id = "arcade"
+ suffix = "arcade.dmm"
+ name = "Space Arcade"
+ description = "A lonely arcade in the depths of space."
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 10650153d6..099b1b2f9c 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -120,6 +120,14 @@ GLOBAL_LIST_EMPTY(teleportlocs)
if(!IS_DYNAMIC_LIGHTING(src))
add_overlay(/obj/effect/fullbright)
+ reg_in_areas_in_z()
+
+ return INITIALIZE_HINT_LATELOAD
+
+/area/LateInitialize()
+ power_change() // all machines set to current power level, also updates icon
+
+/area/proc/reg_in_areas_in_z()
if(contents.len)
var/list/areas_in_z = SSmapping.areas_in_z
var/z
@@ -137,11 +145,6 @@ GLOBAL_LIST_EMPTY(teleportlocs)
areas_in_z["[z]"] = list()
areas_in_z["[z]"] += src
- return INITIALIZE_HINT_LATELOAD
-
-/area/LateInitialize()
- power_change() // all machines set to current power level, also updates icon
-
/area/Destroy()
if(GLOB.areas_by_type[type] == src)
GLOB.areas_by_type[type] = null
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 7532d18d06..f6b1def645 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -542,6 +542,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
return checking.researched_nodes.len >= target_amount
/datum/objective/capture
+ var/captured_amount = 0
/datum/objective/capture/proc/gen_amount_goal()
target_amount = rand(5,10)
@@ -549,8 +550,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
return target_amount
/datum/objective/capture/check_completion()//Basically runs through all the mobs in the area to determine how much they are worth.
- var/captured_amount = 0
- var/area/centcom/holding/A = GLOB.areas_by_type[/area/centcom/holding]
+ /*var/area/centcom/holding/A = GLOB.areas_by_type[/area/centcom/holding]
for(var/mob/living/carbon/human/M in A)//Humans.
if(M.stat == DEAD)//Dead folks are worth less.
captured_amount+=0.5
@@ -573,7 +573,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
if(M.stat == DEAD)
captured_amount+=1
continue
- captured_amount+=2
+ captured_amount+=2*/ //Removed in favour of adding points on capture, in energy_net_nets.dm
return captured_amount >= target_amount
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 13d5cff3b8..efbbe36228 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -1,6 +1,7 @@
#define ARCADE_WEIGHT_TRICK 4
#define ARCADE_WEIGHT_USELESS 2
#define ARCADE_WEIGHT_RARE 1
+#define ARCADE_WEIGHT_PLUSH 3
/obj/machinery/computer/arcade
@@ -26,7 +27,7 @@
/obj/item/toy/katana = ARCADE_WEIGHT_TRICK,
/obj/item/toy/minimeteor = ARCADE_WEIGHT_TRICK,
/obj/item/toy/nuke = ARCADE_WEIGHT_TRICK,
- /obj/item/toy/plush/random = ARCADE_WEIGHT_USELESS,
+ /obj/item/toy/plush/random = ARCADE_WEIGHT_PLUSH,
/obj/item/toy/redbutton = ARCADE_WEIGHT_TRICK,
/obj/item/toy/spinningtoy = ARCADE_WEIGHT_TRICK,
/obj/item/toy/sword = ARCADE_WEIGHT_TRICK,
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 43f5b96fbd..752765baa1 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -173,14 +173,15 @@
var/obj/machinery/shuttle_manipulator/M = locate() in GLOB.machines
if(M)
SSshuttle.shuttle_purchased = TRUE
- M.unload_preview()
- M.load_template(S)
- M.existing_shuttle = SSshuttle.emergency
- M.action_load(S)
SSshuttle.points -= S.credit_cost
minor_announce("[usr.real_name] has purchased [S.name] for [S.credit_cost] credits." , "Shuttle Purchase")
message_admins("[ADMIN_LOOKUPFLW(usr)] purchased [S.name].")
SSblackbox.record_feedback("text", "shuttle_purchase", 1, "[S.name]")
+ M.unload_preview()
+ M.load_template(S)
+ M.existing_shuttle = SSshuttle.emergency
+ M.action_load(S)
+ message_admins("[S.name] loaded, purchased by [usr]")
else
to_chat(usr, "Something went wrong! The shuttle exchange system seems to be down.")
else
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index b84db2ca8d..90166dacf0 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -51,6 +51,7 @@
/obj/machinery/suit_storage_unit/security
suit_type = /obj/item/clothing/suit/space/hardsuit/security
mask_type = /obj/item/clothing/mask/gas/sechailer
+ storage_type = /obj/item/tank/jetpack/oxygen/security
/obj/machinery/suit_storage_unit/hos
suit_type = /obj/item/clothing/suit/space/hardsuit/security/hos
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 69cb247287..3fbbab087f 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -109,6 +109,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/list/grind_results //A reagent list containing the reagents this item produces when ground up in a grinder - this can be an empty list to allow for reagent transferring only
var/list/juice_results //A reagent list containing blah blah... but when JUICED in a grinder!
+
/obj/item/Initialize()
materials = typelist("materials", materials)
diff --git a/code/game/objects/items/devices/compressionkit.dm b/code/game/objects/items/devices/compressionkit.dm
new file mode 100644
index 0000000000..5ac958328d
--- /dev/null
+++ b/code/game/objects/items/devices/compressionkit.dm
@@ -0,0 +1,127 @@
+/obj/item/compressionkit
+ name = "bluespace compression kit"
+ desc = "An illegally modified BSRPED, capable of reducing the size of most items."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "compression_c"
+ item_state = "RPED"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ w_class = WEIGHT_CLASS_NORMAL
+ var/charges = 5
+ // var/damage_multiplier = 0.2 Not in use yet.
+ var/mode = 0
+
+/obj/item/compressionkit/examine(mob/user)
+ ..()
+ to_chat(user, "It has [charges] charges left. Recharge with bluespace crystals.")
+ to_chat(user, "Use in-hand to swap toggle compress/expand mode (expand mode not yet implemented).")
+
+/obj/item/compressionkit/attack_self(mob/user)
+ if(mode == 0)
+ mode = 1
+ icon_state = "compression_e"
+ to_chat(user, "You switch the compressor to expand mode. This isn't implemented yet, so right now it wont do anything different!")
+ return
+ if(mode == 1)
+ mode = 0
+ icon_state = "compression_c"
+ to_chat(user, "You switch the compressor to compress mode. Usage will now reduce the size of objects.")
+ return
+ else
+ mode = 0
+ icon_state = "compression_c"
+ to_chat(user, "Some coder cocked up or an admin broke your compressor. It's been set back to compress mode..")
+
+/obj/item/compressionkit/proc/sparks()
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(5, 1, get_turf(src))
+ s.start()
+
+/obj/item/compressionkit/suicide_act(mob/living/carbon/M)
+ M.visible_message("[M] is sticking their head in [src] and turning it on! [M.p_theyre(TRUE)] going to compress their own skull!")
+ var/obj/item/bodypart/head = M.get_bodypart("head")
+ if(!head)
+ return
+ var/turf/T = get_turf(M)
+ var/list/organs = M.getorganszone("head") + M.getorganszone("eyes") + M.getorganszone("mouth")
+ for(var/internal_organ in organs)
+ var/obj/item/organ/I = internal_organ
+ I.Remove(M)
+ I.forceMove(T)
+ head.drop_limb()
+ qdel(head)
+ new M.gib_type(T,1,M.get_static_viruses())
+ M.add_splatter_floor(T)
+ playsound(M, 'sound/weapons/flash.ogg', 50, 1)
+ playsound(M, 'sound/effects/splat.ogg', 50, 1)
+
+ return OXYLOSS
+
+/obj/item/compressionkit/afterattack(atom/target, mob/user, proximity)
+ . = ..()
+ if(!proximity || !target)
+ return
+ else
+ if(charges == 0)
+ playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 1)
+ to_chat(user, "The bluespace compression kit is out of charges! Recharge it with bluespace crystals.")
+ return
+ if(istype(target, /obj/item))
+ var/obj/item/O = target
+ if(O.w_class == 1)
+ playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 1)
+ to_chat(user, "[target] cannot be compressed smaller!.")
+ return
+ if(O.GetComponent(/datum/component/storage))
+ to_chat(user, "You feel like compressing an item that stores other items would be counterproductive.")
+ return
+ if(O.w_class > 1)
+ playsound(get_turf(src), 'sound/weapons/flash.ogg', 50, 1)
+ user.visible_message("[user] is compressing [O] with their bluespace compression kit!")
+ if(do_mob(user, O, 40) && charges > 0 && O.w_class > 1)
+ playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 50, 1)
+ sparks()
+ flash_lighting_fx(3, 3, LIGHT_COLOR_CYAN)
+ O.w_class -= 1
+ // O.force_mult -= damage_multiplier
+ charges -= 1
+ to_chat(user, "You successfully compress [target]! The compressor now has [charges] charges.")
+ else
+ to_chat(user, "Anomalous error. Summon a coder.")
+
+ if(istype(target, /mob/living))
+ var/mob/living/victim = target
+ if(istype(victim, /mob/living/carbon/human))
+ if(user.zone_selected == "groin") // pp smol. There's probably a smarter way to do this but im retarded. If you have a simpler method let me know.
+ var/list/organs = victim.getorganszone("groin")
+ for(var/internal_organ in organs)
+ if(istype(internal_organ, /obj/item/organ/genital/penis))
+ var/obj/item/organ/genital/penis/O = internal_organ
+ playsound(get_turf(src), 'sound/weapons/flash.ogg', 50, 1)
+ victim.visible_message("[user] is preparing to shrink [victim]\'s [O.name] with their bluespace compression kit!")
+ if(do_mob(user, victim, 40) && charges > 0 && O.length > 0)
+ victim.visible_message("[user] has shrunk [victim]\'s [O.name]!")
+ playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 50, 1)
+ sparks()
+ flash_lighting_fx(3, 3, LIGHT_COLOR_CYAN)
+ charges -= 1
+ O.length -= 5
+ if(O.length < 1)
+ victim.visible_message("[user]\'s [O.name] vanishes!")
+ qdel(O) // no pp for you
+ else
+ O.update_size()
+ O.update_appearance()
+
+
+
+/obj/item/compressionkit/attackby(obj/item/I, mob/user, params)
+ ..()
+ if(istype(I, /obj/item/stack/ore/bluespace_crystal))
+ var/obj/item/stack/ore/bluespace_crystal/B = I
+ charges += 2
+ to_chat(user, "You insert [I] into [src]. It now has [charges] charges.")
+ if(B.amount > 1)
+ B.amount -= 1
+ else
+ qdel(I)
\ No newline at end of file
diff --git a/code/game/objects/items/devices/glue.dm b/code/game/objects/items/devices/glue.dm
new file mode 100644
index 0000000000..fed582d951
--- /dev/null
+++ b/code/game/objects/items/devices/glue.dm
@@ -0,0 +1,32 @@
+/obj/item/syndie_glue
+ name = "bottle of super glue"
+ desc = "A black market brand of high strength adhesive, rarely sold to the public. Do not ingest."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "glue"
+ w_class = WEIGHT_CLASS_SMALL
+ var/uses = 1
+
+/obj/item/syndie_glue/suicide_act(mob/living/carbon/M)
+ return //todo
+
+/obj/item/syndie_glue/afterattack(atom/target, mob/user, proximity)
+ . = ..()
+ if(!proximity || !target)
+ return
+ else
+ if(uses == 0)
+ to_chat(user, "The bottle of glue is empty!")
+ return
+ if(istype(target, /obj/item))
+ var/obj/item/I = target
+ if(I.item_flags & NODROP)
+ to_chat(user, "[I] is already sticky!")
+ return
+ uses -= 1
+ I.item_flags |= NODROP
+ I.desc += " It looks sticky."
+ to_chat(user, "You smear the [I] with glue, making it incredibly sticky!")
+ if(uses == 0)
+ icon_state = "glue_used"
+ name = "empty bottle of super glue"
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm
index 882a50b3ba..9fb4206845 100644
--- a/code/game/objects/items/extinguisher.dm
+++ b/code/game/objects/items/extinguisher.dm
@@ -110,7 +110,7 @@
to_chat(user, "The safety is [safety ? "on" : "off"].")
if(reagents.total_volume)
- to_chat(user, "Alt-click to empty it.")
+ to_chat(user, "You can loose its screws to empty it.")
/obj/item/extinguisher/proc/AttemptRefill(atom/target, mob/user)
if(istype(target, tanktype) && target.Adjacent(user))
@@ -244,7 +244,7 @@
var/turf/open/theturf = T
theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
- user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] using its release valve.")
+ user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] by loosing the release valve's screws.")
//firebot assembly
/obj/item/extinguisher/attackby(obj/O, mob/user, params)
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 8d0d8d020e..34ce6bc521 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -87,6 +87,33 @@
active = FALSE
UpdateButtonIcon()
+/obj/item/book/granter/action/origami
+ granted_action = /datum/action/innate/origami
+ name = "The Art of Origami"
+ desc = "A meticulously in-depth manual explaining the art of paper folding."
+ icon_state = "origamibook"
+ actionname = "origami"
+ oneuse = TRUE
+ remarks = list("Dead-stick stability...", "Symmetry seems to play a rather large factor...", "Accounting for crosswinds... really?", "Drag coefficients of various paper types...", "Thrust to weight ratios?", "Positive dihedral angle?", "Center of gravity forward of the center of lift...")
+
+/datum/action/innate/origami
+ name = "Origami Folding"
+ desc = "Toggles your ability to fold and catch robust paper airplanes."
+ button_icon_state = "origami_off"
+ check_flags = NONE
+
+/datum/action/innate/origami/Activate()
+ to_chat(owner, "You will now fold origami planes.")
+ button_icon_state = "origami_on"
+ active = TRUE
+ UpdateButtonIcon()
+
+/datum/action/innate/origami/Deactivate()
+ to_chat(owner, "You will no longer fold origami planes.")
+ button_icon_state = "origami_off"
+ active = FALSE
+ UpdateButtonIcon()
+
///SPELLS///
/obj/item/book/granter/spell
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 03dc7e8120..d1061a28a4 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -576,6 +576,7 @@
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
slot_flags = ITEM_SLOT_BELT
+ reach = 2
attack_verb = list("whipped", "lashed")
hitsound = 'sound/weapons/chainhit.ogg'
diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm
index 889f702ee7..3a4295c61e 100644
--- a/code/game/objects/items/implants/implant_misc.dm
+++ b/code/game/objects/items/implants/implant_misc.dm
@@ -33,7 +33,7 @@
/obj/item/implant/adrenalin/activate()
. = ..()
uses--
- imp_in.do_adrenaline(150, TRUE, 0, 0, TRUE, list("inaprovaline" = 3, "synaptizine" = 10, "omnizine" = 10, "stimulants" = 10), "You feel a sudden surge of energy!")
+ imp_in.do_adrenaline(150, TRUE, 0, 0, TRUE, list("inaprovaline" = 3, "synaptizine" = 10, "regen_jelly" = 10, "stimulants" = 10), "You feel a sudden surge of energy!")
to_chat(imp_in, "You feel a sudden surge of energy!")
if(!uses)
qdel(src)
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 9162f3ed91..33a48c17bb 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -20,6 +20,7 @@
slot_flags = ITEM_SLOT_BELT
force = 14
throwforce = 10
+ reach = 2
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
hitsound = 'sound/weapons/chainhit.ogg'
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index b641e15d90..e70e8553ed 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -20,7 +20,6 @@
attack_verb = list("shoved", "bashed")
var/cooldown = 0 //shield bash cooldown. based on world.time
-
/obj/item/shield/riot/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/melee/baton))
if(cooldown < world.time - 25)
@@ -166,3 +165,14 @@
block_chance = 25
force = 5
throwforce = 7
+
+/obj/item/shield/riot/tower
+ name = "tower shield"
+ desc = "A massive shield that can block a lot of attacks, can take a lot of abuse before braking."
+ armor = list("melee" = 95, "bullet" = 95, "laser" = 75, "energy" = 60, "bomb" = 90, "bio" = 90, "rad" = 0, "fire" = 90, "acid" = 10) //Armor for the item, dosnt transfer to user
+ icon_state = "metal"
+ block_chance = 75 //1/4 shots will hit*
+ force = 10
+ slowdown = 2
+ throwforce = 15 //Massive pice of metal
+ w_class = WEIGHT_CLASS_HUGE
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 050e4f7b15..b17bc87ffd 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -409,8 +409,10 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
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), \
- new/datum/stack_recipe("fulltile brass window", /obj/structure/window/reinforced/clockwork/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
+ new/datum/stack_recipe("brass reflector", /obj/structure/destructible/clockwork/reflector, 10, time = 100, one_per_turf = TRUE, on_floor = TRUE, window_checks = TRUE), \
+ null,
+ new/datum/stack_recipe("brass window - directional", /obj/structure/window/reinforced/clockwork/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
+ new/datum/stack_recipe("brass window - fulltile", /obj/structure/window/reinforced/clockwork/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
new/datum/stack_recipe("brass chair", /obj/structure/chair/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \
null,
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index ffeef0c8df..43611ee4e1 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -722,7 +722,7 @@
new /obj/item/ammo_casing/shotgun/rubbershot(src)
/obj/item/storage/box/lethalshot
- name = "box of lethal shotgun shots"
+ name = "box of buckshot (Lethal)"
desc = "A box full of lethal shots, designed for riot shotguns."
icon_state = "lethalshot_box"
illustration = null
@@ -749,7 +749,7 @@
/obj/item/storage/box/lethalslugs/PopulateContents()
for(var/i in 1 to 7)
- new /obj/item/projectile/bullet/shotgun_slug(src)
+ new /obj/item/ammo_casing/shotgun(src)
/obj/item/storage/box/stunslug
name = "box of stun slugs"
@@ -759,7 +759,7 @@
/obj/item/storage/box/stunslug/PopulateContents()
for(var/i in 1 to 7)
- new /obj/item/projectile/bullet/shotgun_stunslug(src)
+ new /obj/item/ammo_casing/shotgun/stunslug(src)
/obj/item/storage/box/techsslug
name = "box of tech shotgun shells"
@@ -773,11 +773,11 @@
/obj/item/storage/box/fireshot
name = "box of incendiary ammo"
- desc = "A box full of tech incendiary ammo."
+ desc = "A box full of incendiary ammo."
icon_state = "fireshot_box"
illustration = null
-/obj/item/storage/box/techsslug/PopulateContents()
+/obj/item/storage/box/fireshot/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/ammo_casing/shotgun/incendiary(src)
diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm
index 002190c341..1f80cec0f5 100644
--- a/code/game/objects/items/storage/briefcase.dm
+++ b/code/game/objects/items/storage/briefcase.dm
@@ -38,7 +38,7 @@
/obj/item/storage/briefcase/lawyer
folder_path = /obj/item/folder/blue
-/obj/item/storage/briefcase/lawyer/family
+/obj/item/storage/briefcase/lawyer/family
name = "battered briefcase"
desc = "An old briefcase, this one has seen better days in its time. It's clear they don't make them nowadays as good as they used to. Comes with an added belt clip!"
slot_flags = ITEM_SLOT_BELT
@@ -80,3 +80,12 @@
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
new /obj/item/suppressor/specialoffer(src)
+/obj/item/storage/briefcase/medical
+ name = "medical briefcase"
+ icon_state = "medbriefcase"
+ desc = "A white with a blue cross brieface, this is ment to hold medical gear that would not be able to normally fit in a bag."
+
+/obj/item/storage/briefcase/medical/PopulateContents()
+ new /obj/item/clothing/neck/stethoscope(src)
+ new /obj/item/healthanalyzer(src)
+ ..() //In case of paperwork
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index b405944802..312ef35430 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -1,3 +1,4 @@
+
/* First aid storage
* Contains:
* First Aid Kits
@@ -331,12 +332,12 @@
/obj/item/storage/pill_bottle/penis_enlargement
name = "penis enlargement pills"
- desc = "Made by Fermichem - They have a little picture of Doctor Ronald Hyatt with a giant dong on them. The warming states not to take more than 10u at a time."
+ 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)
-
+
/obj/item/storage/pill_bottle/breast_enlargement
name = "breast enlargement pills"
desc = "Made by Fermichem - They have a woman with breasts larger than she is on them. The warming states not to take more than 10u at a time."
@@ -344,3 +345,47 @@
/obj/item/storage/pill_bottle/breast_enlargement/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/reagent_containers/pill/breast_enlargement(src)
+
+/////////////
+//Organ Box//
+/////////////
+
+/obj/item/storage/belt/organbox
+ name = "Organ Storge"
+ desc = "A compact box that helps hold massive amounts of implants, organs, and some tools. Has a belt clip for easy carrying"
+ w_class = WEIGHT_CLASS_BULKY
+ icon = 'icons/obj/mysterybox.dmi'
+ icon_state = "organbox_open"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
+ throw_speed = 1
+ throw_range = 1
+
+/obj/item/storage/belt/organbox/ComponentInitialize()
+ . = ..()
+ GET_COMPONENT(STR, /datum/component/storage)
+ STR.max_items = 16
+ STR.max_w_class = WEIGHT_CLASS_BULKY
+ STR.max_combined_w_class = 20
+ STR.can_hold = typecacheof(list(
+ /obj/item/storage/pill_bottle,
+ /obj/item/reagent_containers/hypospray,
+ /obj/item/healthanalyzer,
+ /obj/item/reagent_containers/syringe,
+ /obj/item/clothing/glasses/hud/health,
+ /obj/item/hemostat,
+ /obj/item/scalpel,
+ /obj/item/retractor,
+ /obj/item/cautery,
+ /obj/item/surgical_drapes,
+ /obj/item/autosurgeon,
+ /obj/item/organ,
+ /obj/item/implant,
+ /obj/item/implantpad,
+ /obj/item/implantcase,
+ /obj/item/implanter,
+ /obj/item/circuitboard/computer/operating,
+ /obj/item/stack/sheet/mineral/silver,
+ /obj/item/organ_storage
+ ))
+
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index 9b8d2b4a21..cf220cb415 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -183,6 +183,22 @@
slab_type = /obj/item/clockwork/slab/debug
fabricator_type = /obj/item/clockwork/replica_fabricator/scarab/debug
+/obj/item/storage/toolbox/durasteel
+ name = "durasteel toolbox"
+ desc = "A toolbox made out of durasteel. Probably packs a massive punch."
+ total_mass = 5
+ icon_state = "blue"
+ item_state = "toolbox_blue"
+ w_class = WEIGHT_CLASS_HUGE //heyo no bohing this!
+ force = 18 //spear damage
+
+/obj/item/storage/toolbox/durasteel/afterattack(atom/A, mob/user, proximity)
+ . = ..()
+ if(proximity && isobj(A) && !isitem(A))
+ var/obj/O = A
+ //50 total object damage but split up for stuff like damage deflection.
+ O.take_damage(22)
+ O.take_damage(10)
/obj/item/storage/toolbox/artistic
name = "artistic toolbox"
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 69c8f7aee9..a6a3cea373 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -2,7 +2,7 @@
/obj/item/storage/box/syndicate/PopulateContents()
switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1)))
- if("bloodyspai") // 27 tc now this is more right
+ if("bloodyspai") // 30 tc now this is more right
new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set
new /obj/item/clothing/mask/chameleon(src) // Goes with above
new /obj/item/card/id/syndicate(src) // 2 tc
@@ -11,7 +11,7 @@
new /obj/item/multitool/ai_detect(src) // 1 tc
new /obj/item/encryptionkey/syndicate(src) // 2 tc
new /obj/item/reagent_containers/syringe/mulligan(src) // 4 tc
- new /obj/item/switchblade(src) //I'll count this as 2 tc
+ new /obj/item/switchblade(src) //I'll count this as 5 tc
new /obj/item/storage/fancy/cigarettes/cigpack_syndicate (src) // 2 tc this shit heals
new /obj/item/flashlight/emp(src) // 2 tc
new /obj/item/chameleon(src) // 7 tc
@@ -25,13 +25,13 @@
new /obj/item/clothing/glasses/thermal/syndi(src)
if("bond") // 29 tc
- new /obj/item/gun/ballistic/automatic/pistol(src)
- new /obj/item/suppressor(src)
+ new /obj/item/gun/ballistic/automatic/pistol/suppressed(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/clothing/under/chameleon(src)
new /obj/item/card/id/syndicate(src)
new /obj/item/reagent_containers/syringe/stimulants(src)
+ new /obj/item/clothing/neck/tie/red(src)
if("screwed") // 29 tc
new /obj/item/sbeacondrop/bomb(src)
@@ -41,7 +41,7 @@
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
new /obj/item/encryptionkey/syndicate(src)
- if("guns") // 28 tc now
+ if("guns") // 30 tc now
new /obj/item/gun/ballistic/revolver(src)
new /obj/item/ammo_box/a357(src)
new /obj/item/ammo_box/a357(src)
@@ -50,39 +50,53 @@
new /obj/item/clothing/gloves/color/latex/nitrile(src)
new /obj/item/clothing/mask/gas/clown_hat(src)
new /obj/item/clothing/under/suit_jacket/really_black(src)
+ new /obj/item/screwdriver/power(src) //2 tc item
- if("murder") // 28 tc now
+ if("murder") // 35 tc now
new /obj/item/melee/transforming/energy/sword/saber(src)
new /obj/item/clothing/glasses/thermal/syndi(src)
new /obj/item/card/emag(src)
new /obj/item/clothing/shoes/chameleon/noslip(src)
new /obj/item/encryptionkey/syndicate(src)
new /obj/item/grenade/syndieminibomb(src)
+ new /obj/item/clothing/glasses/phantomthief/syndicate(src)
+ new /obj/item/reagent_containers/syringe/stimulants(src)
- if("implant") // 55+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it?
+ if("implant") // 67+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it?
new /obj/item/implanter/freedom(src)
new /obj/item/implanter/uplink/precharged(src)
new /obj/item/implanter/emp(src)
new /obj/item/implanter/adrenalin(src)
new /obj/item/implanter/explosive(src)
new /obj/item/implanter/storage(src)
+ new /obj/item/implanter/radio/syndicate(src)
+ new /obj/item/implanter/stealth(src)
- if("hacker") // 26 tc
+ if("hacker") // 30 tc
new /obj/item/aiModule/syndicate(src)
new /obj/item/card/emag(src)
new /obj/item/encryptionkey/binary(src)
new /obj/item/aiModule/toyAI(src)
new /obj/item/multitool/ai_detect(src)
+ new /obj/item/flashlight/emp(src)
+ new /obj/item/emagrecharge(src)
- if("lordsingulo") // 24 tc
- new /obj/item/sbeacondrop(src)
- new /obj/item/clothing/suit/space/syndicate/black/red(src)
- new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
- new /obj/item/card/emag(src)
+ if("lordsingulo") // "36" tc aka 23 tc
+ new /obj/item/sbeacondrop(src) // 14 kinda useless
+ new /obj/item/clothing/suit/space/syndicate/black/red(src) //2
+ new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) //2
+ new /obj/item/card/emag(src) //6
+ new /obj/item/emagrecharge(src) //2
+ new /obj/item/storage/toolbox/syndicate(src) //1
+ new /obj/item/card/id/syndicate(src) //2
+ new /obj/item/flashlight/emp(src) //2
+ new /obj/item/jammer(src) //5
- if("sabotage") // 26 tc now
+ if("sabotage") // ~28 tc now
new /obj/item/grenade/plastic/c4 (src)
new /obj/item/grenade/plastic/c4 (src)
+ new /obj/item/grenade/plastic/x4 (src)
+ new /obj/item/grenade/plastic/x4 (src)
new /obj/item/doorCharge(src)
new /obj/item/doorCharge(src)
new /obj/item/camera_bug(src)
@@ -117,15 +131,15 @@
new /obj/item/grenade/plastic/c4 (src) // 1 tc
new /obj/item/card/emag(src) // 6 tc
- if("ninja") // 33 tc worth
- new /obj/item/katana(src) // Unique , hard to tell how much tc this is worth. 8 tc?
+ if("ninja") // 40~ tc worth
+ new /obj/item/katana(src) // Unique , basicly a better esword. 10 tc?
new /obj/item/implanter/adrenalin(src) // 8 tc
new /obj/item/throwing_star(src) // ~5 tc for all 6
new /obj/item/throwing_star(src)
new /obj/item/throwing_star(src)
- new /obj/item/throwing_star(src)
- new /obj/item/throwing_star(src)
- new /obj/item/throwing_star(src)
+ new /obj/item/implanter/emp(src)
+ new /obj/item/grenade/smokebomb(src)
+ new /obj/item/grenade/smokebomb(src)
new /obj/item/storage/belt/chameleon(src) // Unique but worth at least 2 tc
new /obj/item/card/id/syndicate(src) // 2 tc
new /obj/item/chameleon(src) // 7 tc
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index bf7c71dddb..bfe630ba01 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -22,7 +22,10 @@
var/preload_cell_type //if not empty the baton starts with this type of cell
/obj/item/melee/baton/get_cell()
- return cell
+ . = cell
+ if(iscyborg(loc))
+ var/mob/living/silicon/robot/R = loc
+ . = R.get_cell()
/obj/item/melee/baton/suicide_act(mob/user)
user.visible_message("[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!")
@@ -46,14 +49,18 @@
/obj/item/melee/baton/loaded //this one starts with a cell pre-installed.
preload_cell_type = /obj/item/stock_parts/cell/high
-/obj/item/melee/baton/proc/deductcharge(chrgdeductamt, chargecheck = TRUE)
- if(!cell)
+/obj/item/melee/baton/proc/deductcharge(chrgdeductamt, chargecheck = TRUE, explode = TRUE)
+ var/obj/item/stock_parts/cell/copper_top = get_cell()
+ if(!copper_top)
switch_status(FALSE, TRUE)
return FALSE
//Note this value returned is significant, as it will determine
//if a stun is applied or not
- . = cell.use(chrgdeductamt)
- if(status && (!. || (chargecheck && cell.charge < hitcost * STUNBATON_CHARGE_LENIENCY)))
+
+ copper_top.use(min(chrgdeductamt, copper_top.charge), explode)
+ if(QDELETED(src))
+ return FALSE
+ if(status && (!copper_top || !copper_top.charge || (chargecheck && copper_top.charge < (hitcost * STUNBATON_CHARGE_LENIENCY))))
//we're below minimum, turn off
switch_status(FALSE)
@@ -69,7 +76,7 @@
update_icon()
/obj/item/melee/baton/process()
- deductcharge(hitcost * 0.004, FALSE)
+ deductcharge(hitcost * 0.004, FALSE, FALSE)
/obj/item/melee/baton/update_icon()
if(status)
@@ -80,9 +87,10 @@
icon_state = "[initial(name)]"
/obj/item/melee/baton/examine(mob/user)
- ..()
- if(cell)
- to_chat(user, "\The [src] is [round(cell.percent())]% charged.")
+ . = ..()
+ var/obj/item/stock_parts/cell/copper_top = get_cell()
+ if(copper_top)
+ to_chat(user, "\The [src] is [round(copper_top.percent())]% charged.")
else
to_chat(user, "\The [src] does not have a power source installed.")
@@ -92,7 +100,7 @@
if(cell)
to_chat(user, "[src] already has a cell.")
else
- if(C.maxcharge < hitcost * STUNBATON_CHARGE_LENIENCY)
+ if(C.maxcharge < (hitcost * STUNBATON_CHARGE_LENIENCY))
to_chat(user, "[src] requires a higher capacity cell.")
return
if(!user.transferItemToLoc(W, src))
@@ -112,15 +120,16 @@
return ..()
/obj/item/melee/baton/attack_self(mob/user)
- if(cell && cell.charge > hitcost * STUNBATON_CHARGE_LENIENCY)
- switch_status(!status)
- to_chat(user, "[src] is now [status ? "on" : "off"].")
- else
+ var/obj/item/stock_parts/cell/copper_top = get_cell()
+ if(!copper_top || copper_top.charge < (hitcost * STUNBATON_CHARGE_LENIENCY))
switch_status(FALSE, TRUE)
- if(!cell)
+ if(!copper_top)
to_chat(user, "[src] does not have a power source!")
else
to_chat(user, "[src] is out of charge.")
+ else
+ switch_status(!status)
+ to_chat(user, "[src] is now [status ? "on" : "off"].")
add_fingerprint(user)
/obj/item/melee/baton/attack(mob/M, mob/living/carbon/human/user)
@@ -164,16 +173,21 @@
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
return FALSE
var/stunpwr = stunforce
- if(iscyborg(loc))
- var/mob/living/silicon/robot/R = loc
- if(!istype(R) || !R.cell || !R.cell.use(hitcost))
+ var/obj/item/stock_parts/cell/our_cell = get_cell()
+ if(!our_cell)
+ switch_status(FALSE)
+ return FALSE
+ var/stuncharge = our_cell.charge
+ deductcharge(hitcost, FALSE)
+ if(QDELETED(src) || QDELETED(our_cell)) //it was rigged
+ return FALSE
+ if(stuncharge < hitcost)
+ if(stuncharge < (hitcost * STUNBATON_CHARGE_LENIENCY))
+ L.visible_message("[user] has prodded [L] with [src]. Luckily it was out of charge.", \
+ "[user] has prodded you with [src]. Luckily it was out of charge.")
return FALSE
- else
- var/stuncharge = cell.charge
- if(!deductcharge(hitcost, FALSE))
- stunpwr *= round(stuncharge/hitcost)
- if(stunpwr < stunforce * STUNBATON_CHARGE_LENIENCY)
- return FALSE
+ stunpwr *= round(stuncharge/hitcost, 0.1)
+
L.Knockdown(stunpwr)
L.adjustStaminaLoss(stunpwr*0.1, affected_zone = (istype(user) ? user.zone_selected : BODY_ZONE_CHEST))//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented.
@@ -198,14 +212,17 @@
/obj/item/melee/baton/proc/clowning_around(mob/living/user)
user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \
"You accidentally hit yourself with [src]!")
+ SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
user.Knockdown(stunforce*3)
+ playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
deductcharge(hitcost)
/obj/item/melee/baton/emp_act(severity)
. = ..()
if (!(. & EMP_PROTECT_SELF))
switch_status(FALSE)
- deductcharge(1000 / severity)
+ if(!iscyborg(loc))
+ deductcharge(1000 / severity, TRUE, FALSE)
//Makeshift stun baton. Replacement for stun gloves.
/obj/item/melee/baton/cattleprod
diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm
index 2e8074f656..0b520d9dc1 100644
--- a/code/game/objects/items/tanks/jetpack.dm
+++ b/code/game/objects/items/tanks/jetpack.dm
@@ -1,237 +1,239 @@
-/obj/item/tank/jetpack
- name = "jetpack (empty)"
- desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution."
- icon_state = "jetpack"
- item_state = "jetpack"
- lefthand_file = 'icons/mob/inhands/equipment/jetpacks_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/jetpacks_righthand.dmi'
- w_class = WEIGHT_CLASS_BULKY
- distribute_pressure = ONE_ATMOSPHERE * O2STANDARD
- actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
- var/gas_type = /datum/gas/oxygen
- var/on = FALSE
- var/stabilizers = FALSE
- var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not
- var/datum/effect_system/trail_follow/ion/ion_trail
-
-/obj/item/tank/jetpack/New()
- ..()
- if(gas_type)
- air_contents.gases[gas_type] = (6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)
-
- ion_trail = new
- ion_trail.set_up(src)
-
-/obj/item/tank/jetpack/ui_action_click(mob/user, action)
- if(istype(action, /datum/action/item_action/toggle_jetpack))
- cycle(user)
- else if(istype(action, /datum/action/item_action/jetpack_stabilization))
- if(on)
- stabilizers = !stabilizers
- to_chat(user, "You turn the jetpack stabilization [stabilizers ? "on" : "off"].")
- else
- toggle_internals(user)
-
-/obj/item/tank/jetpack/proc/cycle(mob/user)
- if(user.incapacitated())
- return
-
- if(!on)
- turn_on()
- to_chat(user, "You turn the jetpack on.")
- else
- turn_off()
- to_chat(user, "You turn the jetpack off.")
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
-
-/obj/item/tank/jetpack/proc/turn_on()
- on = TRUE
- icon_state = "[initial(icon_state)]-on"
- ion_trail.start()
-
-/obj/item/tank/jetpack/proc/turn_off()
- on = FALSE
- stabilizers = FALSE
- icon_state = initial(icon_state)
- ion_trail.stop()
-
-/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user)
- if(!on)
- return
- if((num < 0.005 || air_contents.total_moles() < num))
- turn_off()
- return
-
- var/datum/gas_mixture/removed = air_contents.remove(num)
- if(removed.total_moles() < 0.005)
- turn_off()
- return
-
- var/turf/T = get_turf(user)
- T.assume_air(removed)
-
- return 1
-
-/obj/item/tank/jetpack/suicide_act(mob/user)
- if (istype(user, /mob/living/carbon/human/))
- var/mob/living/carbon/human/H = user
- H.forcesay("WHAT THE FUCK IS CARBON DIOXIDE?")
- H.visible_message("[user] is suffocating [user.p_them()]self with [src]! It looks like [user.p_they()] didn't read what that jetpack says!")
- return (OXYLOSS)
- else
- ..()
-
-/obj/item/tank/jetpack/improvised
- name = "improvised jetpack"
- desc = "A jetpack made from two air tanks, a fire extinguisher and some atmospherics equipment. It doesn't look like it can hold much."
- icon_state = "jetpack-improvised"
- item_state = "jetpack-sec"
- volume = 30 //normal jetpacks have 70 volume
- gas_type = null //it starts empty
- full_speed = FALSE //moves at hardsuit jetpack speeds
-
-/obj/item/tank/jetpack/improvised/allow_thrust(num, mob/living/user)
- if(!on)
- return
- if((num < 0.005 || air_contents.total_moles() < num))
- turn_off()
- return
- if(rand(0,250) == 0)
- to_chat(user, "You feel your jetpack's engines cut out.")
- turn_off()
- return
-
- var/datum/gas_mixture/removed = air_contents.remove(num)
- if(removed.total_moles() < 0.005)
- turn_off()
- return
-
- var/turf/T = get_turf(user)
- T.assume_air(removed)
-
- return 1
-
-/obj/item/tank/jetpack/void
- name = "void jetpack (oxygen)"
- desc = "It works well in a void."
- volume = 60
- icon_state = "jetpack-void"
- item_state = "jetpack-void"
- full_speed = FALSE //Old pre-hardsuit tech
-
-/obj/item/tank/jetpack/oxygen
- name = "jetpack (oxygen)"
- desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas. Use with caution."
- icon_state = "jetpack"
- item_state = "jetpack"
-
-/obj/item/tank/jetpack/oxygen/harness
- name = "jet harness (oxygen)"
- desc = "A lightweight tactical harness, used by those who don't want to be weighed down by traditional jetpacks."
- icon_state = "jetpack-mini"
- item_state = "jetpack-mini"
- volume = 50
- throw_range = 7
- w_class = WEIGHT_CLASS_NORMAL
-
-/obj/item/tank/jetpack/oxygen/captain
- name = "\improper Captain's jetpack"
- desc = "A compact, lightweight jetpack containing a high amount of compressed oxygen."
- icon_state = "jetpack-captain"
- item_state = "jetpack-captain"
- w_class = WEIGHT_CLASS_NORMAL
- volume = 90
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //steal objective items are hard to destroy.
-
-/obj/item/tank/jetpack/oxygen/security
- name = "security jetpack (oxygen)"
- desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas by security forces."
- icon_state = "jetpack-sec"
- item_state = "jetpack-sec"
-
-/obj/item/tank/jetpack/carbondioxide
- name = "jetpack (carbon dioxide)"
- desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals."
- icon_state = "jetpack-black"
- item_state = "jetpack-black"
- distribute_pressure = 0
- gas_type = /datum/gas/carbon_dioxide
-
-/obj/item/tank/jetpack/suit
- name = "hardsuit jetpack upgrade"
- desc = "A modular, compact set of thrusters designed to integrate with a hardsuit. It is fueled by a tank inserted into the suit's storage compartment."
- icon_state = "jetpack-mining"
- item_state = "jetpack-black"
- w_class = WEIGHT_CLASS_NORMAL
- actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
- volume = 1
- slot_flags = null
- gas_type = null
- full_speed = FALSE
- var/datum/gas_mixture/temp_air_contents
- var/obj/item/tank/internals/tank = null
-
-/obj/item/tank/jetpack/suit/New()
- ..()
- STOP_PROCESSING(SSobj, src)
- temp_air_contents = air_contents
-
-/obj/item/tank/jetpack/suit/attack_self()
- return
-
-/obj/item/tank/jetpack/suit/cycle(mob/user)
- if(!istype(loc, /obj/item/clothing/suit/space/hardsuit))
- to_chat(user, "\The [src] must be connected to a hardsuit!")
- return
-
- var/mob/living/carbon/human/H = user
- if(!istype(H.s_store, /obj/item/tank/internals))
- to_chat(user, "You need a tank in your suit storage!")
- return
- ..()
-
-/obj/item/tank/jetpack/suit/turn_on()
- if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
- return
- var/mob/living/carbon/human/H = loc.loc
- tank = H.s_store
- air_contents = tank.air_contents
- START_PROCESSING(SSobj, src)
- ..()
-
-/obj/item/tank/jetpack/suit/turn_off()
- tank = null
- air_contents = temp_air_contents
- STOP_PROCESSING(SSobj, src)
- ..()
-
-/obj/item/tank/jetpack/suit/process()
- if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
- turn_off()
- return
- var/mob/living/carbon/human/H = loc.loc
- if(!tank || tank != H.s_store)
- turn_off()
- return
- ..()
-
-//Return a jetpack that the mob can use
-//Back worn jetpacks, hardsuit internal packs, and so on.
-//Used in Process_Spacemove() and wherever you want to check for/get a jetpack
-
-/mob/proc/get_jetpack()
- return
-
-/mob/living/carbon/get_jetpack()
- var/obj/item/tank/jetpack/J = back
- if(istype(J))
- return J
-
-/mob/living/carbon/human/get_jetpack()
- var/obj/item/tank/jetpack/J = ..()
- if(!istype(J) && istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
- var/obj/item/clothing/suit/space/hardsuit/C = wear_suit
- J = C.jetpack
- return J
+/obj/item/tank/jetpack
+ name = "jetpack (empty)"
+ desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution."
+ icon_state = "jetpack"
+ item_state = "jetpack"
+ lefthand_file = 'icons/mob/inhands/equipment/jetpacks_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/jetpacks_righthand.dmi'
+ w_class = WEIGHT_CLASS_BULKY
+ distribute_pressure = ONE_ATMOSPHERE * O2STANDARD
+ actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
+ var/gas_type = /datum/gas/oxygen
+ var/on = FALSE
+ var/stabilizers = FALSE
+ var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not
+ var/datum/effect_system/trail_follow/ion/ion_trail
+
+/obj/item/tank/jetpack/New()
+ ..()
+ if(gas_type)
+ air_contents.gases[gas_type] = (6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)
+
+ ion_trail = new
+ ion_trail.set_up(src)
+
+/obj/item/tank/jetpack/ui_action_click(mob/user, action)
+ if(istype(action, /datum/action/item_action/toggle_jetpack))
+ cycle(user)
+ else if(istype(action, /datum/action/item_action/jetpack_stabilization))
+ if(on)
+ stabilizers = !stabilizers
+ to_chat(user, "You turn the jetpack stabilization [stabilizers ? "on" : "off"].")
+ else
+ toggle_internals(user)
+
+/obj/item/tank/jetpack/proc/cycle(mob/user)
+ if(user.incapacitated())
+ return
+
+ if(!on)
+ turn_on()
+ to_chat(user, "You turn the jetpack on.")
+ else
+ turn_off()
+ to_chat(user, "You turn the jetpack off.")
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
+/obj/item/tank/jetpack/proc/turn_on()
+ on = TRUE
+ icon_state = "[initial(icon_state)]-on"
+ ion_trail.start()
+
+/obj/item/tank/jetpack/proc/turn_off()
+ on = FALSE
+ stabilizers = FALSE
+ icon_state = initial(icon_state)
+ ion_trail.stop()
+
+/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user)
+ if(!on)
+ return
+ if((num < 0.005 || air_contents.total_moles() < num))
+ turn_off()
+ return
+
+ var/datum/gas_mixture/removed = air_contents.remove(num)
+ if(removed.total_moles() < 0.005)
+ turn_off()
+ return
+
+ var/turf/T = get_turf(user)
+ T.assume_air(removed)
+
+ return 1
+
+/obj/item/tank/jetpack/suicide_act(mob/user)
+ if (istype(user, /mob/living/carbon/human/))
+ var/mob/living/carbon/human/H = user
+ H.forcesay("WHAT THE FUCK IS CARBON DIOXIDE?")
+ H.visible_message("[user] is suffocating [user.p_them()]self with [src]! It looks like [user.p_they()] didn't read what that jetpack says!")
+ return (OXYLOSS)
+ else
+ ..()
+
+/obj/item/tank/jetpack/improvised
+ name = "improvised jetpack"
+ desc = "A jetpack made from two air tanks, a fire extinguisher and some atmospherics equipment. It doesn't look like it can hold much."
+ icon_state = "jetpack-improvised"
+ item_state = "jetpack-sec"
+ volume = 30 //normal jetpacks have 70 volume
+ gas_type = null //it starts empty
+ full_speed = FALSE //moves at hardsuit jetpack speeds
+
+/obj/item/tank/jetpack/improvised/allow_thrust(num, mob/living/user)
+ if(!on)
+ return
+ if((num < 0.005 || air_contents.total_moles() < num))
+ turn_off()
+ return
+ if(rand(0,250) == 0)
+ to_chat(user, "You feel your jetpack's engines cut out.")
+ turn_off()
+ return
+
+ var/datum/gas_mixture/removed = air_contents.remove(num)
+ if(removed.total_moles() < 0.005)
+ turn_off()
+ return
+
+ var/turf/T = get_turf(user)
+ T.assume_air(removed)
+
+ return 1
+
+/obj/item/tank/jetpack/void
+ name = "void jetpack (oxygen)"
+ desc = "It works well in a void."
+ volume = 60
+ icon_state = "jetpack-void"
+ item_state = "jetpack-void"
+ full_speed = FALSE //Old pre-hardsuit tech
+
+/obj/item/tank/jetpack/oxygen
+ name = "jetpack (oxygen)"
+ desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas. Use with caution."
+ icon_state = "jetpack"
+ item_state = "jetpack"
+
+/obj/item/tank/jetpack/oxygen/harness
+ name = "jet harness (oxygen)"
+ desc = "A lightweight tactical harness, used by those who don't want to be weighed down by traditional jetpacks."
+ icon_state = "jetpack-mini"
+ item_state = "jetpack-mini"
+ volume = 50
+ throw_range = 7
+ w_class = WEIGHT_CLASS_NORMAL
+
+/obj/item/tank/jetpack/oxygen/captain
+ name = "\improper Captain's jetpack"
+ desc = "A compact, lightweight jetpack containing a high amount of compressed oxygen."
+ icon_state = "jetpack-captain"
+ item_state = "jetpack-captain"
+ w_class = WEIGHT_CLASS_NORMAL
+ volume = 90
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //steal objective items are hard to destroy.
+
+/obj/item/tank/jetpack/oxygen/security
+ name = "security jetpack (oxygen)"
+ desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas by security forces."
+ icon_state = "jetpack-sec"
+ item_state = "jetpack-sec"
+ full_speed = FALSE
+
+/obj/item/tank/jetpack/carbondioxide
+ name = "jetpack (carbon dioxide)"
+ desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals."
+ icon_state = "jetpack-black"
+ item_state = "jetpack-black"
+ distribute_pressure = 0
+ gas_type = /datum/gas/carbon_dioxide
+
+/obj/item/tank/jetpack/suit
+ name = "hardsuit jetpack upgrade"
+ desc = "A modular, compact set of thrusters designed to integrate with a hardsuit. It is fueled by a tank inserted into the suit's storage compartment."
+ icon_state = "jetpack-mining"
+ item_state = "jetpack-black"
+ w_class = WEIGHT_CLASS_NORMAL
+ actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
+ volume = 1
+ slot_flags = null
+ gas_type = null
+ full_speed = FALSE
+ var/datum/gas_mixture/temp_air_contents
+ var/obj/item/tank/internals/tank = null
+
+/obj/item/tank/jetpack/suit/New()
+ ..()
+ STOP_PROCESSING(SSobj, src)
+ temp_air_contents = air_contents
+
+/obj/item/tank/jetpack/suit/attack_self()
+ return
+
+/obj/item/tank/jetpack/suit/cycle(mob/user)
+ if(!istype(loc, /obj/item/clothing/suit/space/hardsuit))
+ to_chat(user, "\The [src] must be connected to a hardsuit!")
+ return
+
+ var/mob/living/carbon/human/H = user
+ if(!istype(H.s_store, /obj/item/tank/internals))
+ to_chat(user, "You need a tank in your suit storage!")
+ return
+ ..()
+
+/obj/item/tank/jetpack/suit/turn_on()
+ if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
+ return
+ var/mob/living/carbon/human/H = loc.loc
+ tank = H.s_store
+ air_contents = tank.air_contents
+ START_PROCESSING(SSobj, src)
+ ..()
+
+/obj/item/tank/jetpack/suit/turn_off()
+ tank = null
+ air_contents = temp_air_contents
+ STOP_PROCESSING(SSobj, src)
+ ..()
+
+/obj/item/tank/jetpack/suit/process()
+ if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
+ turn_off()
+ return
+ var/mob/living/carbon/human/H = loc.loc
+ if(!tank || tank != H.s_store)
+ turn_off()
+ return
+ ..()
+
+//Return a jetpack that the mob can use
+//Back worn jetpacks, hardsuit internal packs, and so on.
+//Used in Process_Spacemove() and wherever you want to check for/get a jetpack
+
+/mob/proc/get_jetpack()
+ return
+
+/mob/living/carbon/get_jetpack()
+ var/obj/item/tank/jetpack/J = back
+ if(istype(J))
+ return J
+
+/mob/living/carbon/human/get_jetpack()
+ var/obj/item/tank/jetpack/J = ..()
+ if(!istype(J) && istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
+ var/obj/item/clothing/suit/space/hardsuit/C = wear_suit
+ J = C.jetpack
+ return J
+
diff --git a/code/game/objects/items/teleprod.dm b/code/game/objects/items/teleprod.dm
index c514e5e926..341c85fa1c 100644
--- a/code/game/objects/items/teleprod.dm
+++ b/code/game/objects/items/teleprod.dm
@@ -10,15 +10,14 @@
. = ..()
if(!. || !istype(M) || M.anchored)
return
- else
- SEND_SIGNAL(M, COMSIG_LIVING_MINOR_SHOCK)
- do_teleport(M, get_turf(M), 15)
+ do_teleport(M, get_turf(M), 15)
/obj/item/melee/baton/cattleprod/teleprod/clowning_around(mob/living/user)
user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \
"You accidentally hit yourself with [src]!")
SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
user.Knockdown(stunforce*3)
+ playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
if(do_teleport(user, get_turf(user), 50))
deductcharge(hitcost)
else
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index b4cdff4224..8c06af91a4 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -106,6 +106,7 @@
new /obj/item/radio/headset/headset_sec(src)
new /obj/item/clothing/suit/armor/vest/warden(src)
new /obj/item/clothing/head/warden(src)
+ new /obj/item/clothing/head/warden/drill(src)
new /obj/item/clothing/head/beret/sec/navywarden(src)
new /obj/item/clothing/suit/armor/vest/warden/alt(src)
new /obj/item/clothing/under/rank/warden/navyblue(src)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index bd65a8b422..7c73a1fd8c 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -101,6 +101,12 @@
icon_state = "festivus_pole"
desc = "During last year's Feats of Strength the Research Director was able to suplex this passing immobile rod into a planter."
+/obj/structure/festivus/anchored
+ name = "suplexed rod"
+ desc = "A true feat of strength, almost as good as last year."
+ icon_state = "anchored_rod"
+ anchored = TRUE
+
/obj/structure/flora/tree/dead/Initialize()
icon_state = "tree_[rand(1, 6)]"
. = ..()
diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm
index 8efac31f65..dfc6972578 100644
--- a/code/game/turfs/simulated/wall/misc_walls.dm
+++ b/code/game/turfs/simulated/wall/misc_walls.dm
@@ -77,6 +77,14 @@
return ..()
+/turf/closed/wall/clockwork/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
+ if(heated && the_rcd.canRturf)
+ return ..()
+
+/turf/closed/wall/clockwork/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
+ if(heated && the_rcd.canRturf)
+ return ..()
+
/turf/closed/wall/clockwork/try_destroy(obj/item/I, mob/user, turf/T)
if(!heated)
return ..()
diff --git a/code/modules/antagonists/changeling/powers/adrenaline.dm b/code/modules/antagonists/changeling/powers/adrenaline.dm
index a9d85d0fed..d1088f0025 100644
--- a/code/modules/antagonists/changeling/powers/adrenaline.dm
+++ b/code/modules/antagonists/changeling/powers/adrenaline.dm
@@ -12,5 +12,5 @@
//Recover from stuns.
/obj/effect/proc_holder/changeling/adrenaline/sting_action(mob/living/user)
- user.do_adrenaline(100, FALSE, 70, 0, TRUE, list("epinephrine" = 3, "changelingmeth" = 10, "mannitol" = 10, "omnizine" = 10, "changelingadrenaline" = 5), "Energy rushes through us.")
+ user.do_adrenaline(0, FALSE, 70, 0, TRUE, list("epinephrine" = 3, "changelingmeth" = 10, "mannitol" = 10, "regen_jelly" = 10, "changelingadrenaline" = 5), "Energy rushes through us.", 0, 0.75, 0)
return TRUE
diff --git a/code/modules/antagonists/clockcult/clock_structures/reflector.dm b/code/modules/antagonists/clockcult/clock_structures/reflector.dm
new file mode 100644
index 0000000000..34ad051d19
--- /dev/null
+++ b/code/modules/antagonists/clockcult/clock_structures/reflector.dm
@@ -0,0 +1,86 @@
+/obj/structure/destructible/clockwork/reflector
+ name = "reflector"
+ 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 = "reflector"
+ unanchored_icon = "reflector_unwrenched"
+ max_integrity = 40
+ construction_value = 5
+ layer = WALL_OBJ_LAYER
+ break_message = "The reflectors's fragile shield shatters into pieces!"
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ light_color = "#DAAA18"
+ var/list/allowed_projectile_typecache = list(
+ /obj/item/projectile/beam
+ )
+
+ var/ini_dir = null
+
+/obj/structure/destructible/clockwork/reflector/Initialize()
+ . = ..()
+ allowed_projectile_typecache = typecacheof(allowed_projectile_typecache)
+
+/obj/structure/destructible/clockwork/reflector/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ,null,CALLBACK(src, .proc/can_be_rotated),CALLBACK(src,.proc/after_rotation))
+
+/obj/structure/destructible/clockwork/reflector/bullet_act(obj/item/projectile/P)
+ if(!anchored || !allowed_projectile_typecache[P.type] || !(P.dir in GLOB.cardinals))
+ return ..()
+
+ if(auto_reflect(P, P.dir, get_turf(P), P.Angle) != -1)
+ return ..()
+
+ return -1
+
+/obj/structure/destructible/clockwork/reflector/proc/auto_reflect(obj/item/projectile/P, pdir, turf/ploc, pangle)
+
+ //Yell at me if this exists already.
+
+ var/real_angle = 0
+
+ switch(dir)
+ if(NORTH)
+ real_angle = 0
+ if(EAST)
+ real_angle = 90
+ if(SOUTH)
+ real_angle = 180
+ if(WEST)
+ real_angle = 270
+
+ var/incidence = GET_ANGLE_OF_INCIDENCE(real_angle, (P.Angle + 180))
+ if(abs(incidence) > 90 && abs(incidence) < 270)
+ return FALSE
+ var/new_angle = SIMPLIFY_DEGREES(real_angle + incidence)
+ P.setAngle(new_angle)
+ P.ignore_source_check = TRUE
+ P.range = P.decayedRange
+ P.decayedRange = max(P.decayedRange--, 0)
+ return -1
+
+/obj/structure/destructible/clockwork/reflector/proc/can_be_rotated(mob/user,rotation_type)
+ if(anchored)
+ to_chat(user, "[src] cannot be rotated while it is fastened to the floor!")
+ return FALSE
+
+ return TRUE
+
+/obj/structure/destructible/clockwork/reflector/Move()
+ . = ..()
+ setDir(ini_dir)
+
+/obj/structure/destructible/clockwork/reflector/proc/after_rotation(mob/user,rotation_type)
+ ini_dir = dir
+ add_fingerprint(user)
+
+
+/obj/structure/destructible/clockwork/reflector/wrench_act(mob/living/user, obj/item/I)
+
+ if(!is_servant_of_ratvar(user))
+ return ..()
+
+ anchored = !anchored
+ to_chat(user, "You [anchored ? "secure" : "unsecure"] \the [src].")
+ I.play_tool_sound(src)
+ return TRUE
\ No newline at end of file
diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm
index 32442ee72c..47cf2abf3f 100644
--- a/code/modules/antagonists/cult/cult.dm
+++ b/code/modules/antagonists/cult/cult.dm
@@ -361,6 +361,7 @@
reshape.Shift(EAST, 1)
reshape.Crop(7,4,26,31)
reshape.Crop(-5,-3,26,30)
+ return reshape
/mob/living/carbon/human/get_sac_image()
var/datum/job/sacjob = SSjob.GetJob(mind.assigned_role)
@@ -370,6 +371,7 @@
reshape.Shift(EAST, 1)
reshape.Crop(7,4,26,31)
reshape.Crop(-5,-3,26,30)
+ return reshape
/datum/objective/sacrifice
var/sacced = FALSE
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
index abdc3ada57..1de5b93332 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
@@ -27,7 +27,12 @@ Thus, the two variables affect pump operation are set in New():
construction_type = /obj/item/pipe/directional
pipe_state = "pump"
-
+
+/obj/machinery/atmospherics/components/binary/pump/examine(mob/user)
+ . = ..()
+ to_chat(user,"You can hold Ctrl and click on it to toggle it on and off.")
+ to_chat(user,"You can hold Alt and click on it to maximize its pressure.")
+
/obj/machinery/atmospherics/components/binary/pump/CtrlClick(mob/user)
var/area/A = get_area(src)
var/turf/T = get_turf(src)
@@ -37,7 +42,7 @@ Thus, the two variables affect pump operation are set in New():
investigate_log("Pump, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
return ..()
-
+
/obj/machinery/atmospherics/components/binary/pump/AltClick(mob/user)
var/area/A = get_area(src)
var/turf/T = get_turf(src)
@@ -46,7 +51,7 @@ Thus, the two variables affect pump operation are set in New():
to_chat(user,"You maximize the pressure on the [src].")
investigate_log("Pump, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
message_admins("Pump, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
-
+
/obj/machinery/atmospherics/components/binary/pump/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
index 2efff16301..3a2321c395 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
@@ -28,16 +28,21 @@ Thus, the two variables affect pump operation are set in New():
construction_type = /obj/item/pipe/directional
pipe_state = "volumepump"
+/obj/machinery/atmospherics/components/binary/volume_pump/examine(mob/user)
+ . = ..()
+ to_chat(user,"You can hold Ctrl and click on it to toggle it on and off.")
+ to_chat(user,"You can hold Alt and click on it to maximize its pressure.")
+
/obj/machinery/atmospherics/components/binary/volume_pump/CtrlClick(mob/user)
var/area/A = get_area(src)
var/turf/T = get_turf(src)
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
on = !on
update_icon()
- investigate_log("Pump, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
- message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
+ investigate_log("Volume Pump, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
+ message_admins("Volume Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
return ..()
-
+
/obj/machinery/atmospherics/components/binary/volume_pump/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index 52e8d9eb83..ac05c94a78 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -12,24 +12,29 @@
construction_type = /obj/item/pipe/trinary/flippable
pipe_state = "filter"
+/obj/machinery/atmospherics/components/trinary/filter/examine(mob/user)
+ . = ..()
+ to_chat(user,"You can hold Ctrl and click on it to toggle it on and off.")
+ to_chat(user,"You can hold Alt and click on it to maximize its pressure.")
+
/obj/machinery/atmospherics/components/trinary/filter/CtrlClick(mob/user)
var/area/A = get_area(src)
var/turf/T = get_turf(src)
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
on = !on
update_icon()
- investigate_log("Pump, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
- message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
+ investigate_log("Filter, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
+ message_admins("Filter, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
return ..()
-
+
/obj/machinery/atmospherics/components/trinary/filter/AltClick(mob/user)
var/area/A = get_area(src)
var/turf/T = get_turf(src)
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
target_pressure = MAX_OUTPUT_PRESSURE
to_chat(user,"You maximize the pressure on the [src].")
- investigate_log("Pump, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
- message_admins("Pump, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
+ investigate_log("Filter, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
+ message_admins("Filter, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
/obj/machinery/atmospherics/components/trinary/filter/layer1
piping_layer = PIPING_LAYER_MIN
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
index ba9fdf31af..fc866c3d6a 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
@@ -14,25 +14,31 @@
pipe_state = "mixer"
//node 3 is the outlet, nodes 1 & 2 are intakes
+/obj/machinery/atmospherics/components/trinary/mixer/examine(mob/user)
+ . = ..()
+ to_chat(user,"You can hold Ctrl and click on it to toggle it on and off.")
+ to_chat(user,"You can hold Alt and click on it to maximize its pressure.")
+
/obj/machinery/atmospherics/components/trinary/mixer/CtrlClick(mob/user)
var/area/A = get_area(src)
var/turf/T = get_turf(src)
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
on = !on
update_icon()
- investigate_log("Pump, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
- message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
+ investigate_log("Mixer, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
+ message_admins("Mixer, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
return ..()
-
+
/obj/machinery/atmospherics/components/trinary/mixer/AltClick(mob/user)
var/area/A = get_area(src)
var/turf/T = get_turf(src)
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
target_pressure = MAX_OUTPUT_PRESSURE
to_chat(user,"You maximize the pressure on the [src].")
- investigate_log("Pump, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
- message_admins("Pump, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
-
+ investigate_log("Mixer, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
+ message_admins("Mixer, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
+
+ //node 3 is the outlet, nodes 1 & 2 are intakes
/obj/machinery/atmospherics/components/trinary/mixer/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 2effbd7ada..7042913b0d 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -516,14 +516,16 @@
/datum/supply_pack/security/armory/ballistic
name = "Combat Shotguns Crate"
- desc = "For when the enemy absolutely needs to be replaced with lead. Contains three Aussec-designed Combat Shotguns, and three Shotgun Bandoliers. Requires Armory access to open."
+ desc = "For when the enemy absolutely needs to be replaced with lead. Contains three Aussec-designed Combat Shotguns, with three Shotgun Bandoliers, as well as seven buchshot and 12g shotgun slugs. Requires Armory access to open."
cost = 8000
contains = list(/obj/item/gun/ballistic/shotgun/automatic/combat,
/obj/item/gun/ballistic/shotgun/automatic/combat,
/obj/item/gun/ballistic/shotgun/automatic/combat,
/obj/item/storage/belt/bandolier,
/obj/item/storage/belt/bandolier,
- /obj/item/storage/belt/bandolier)
+ /obj/item/storage/belt/bandolier,
+ /obj/item/storage/box/lethalshot,
+ /obj/item/storage/box/lethalslugs)
crate_name = "combat shotguns crate"
/datum/supply_pack/security/armory/dragnetgun
@@ -567,7 +569,7 @@
/datum/supply_pack/security/armory/fire
name = "Incendiary Weapons Crate"
- desc = "Burn, baby burn. Contains three incendiary grenades, three plasma canisters, and a flamethrower. Requires Brige access to open."
+ desc = "Burn, baby burn. Contains three incendiary grenades, seven incendiary slugs, three plasma canisters, and a flamethrower. Requires Brige access to open."
cost = 1500
access = ACCESS_HEADS
contains = list(/obj/item/flamethrower/full,
@@ -576,7 +578,8 @@
/obj/item/tank/internals/plasma,
/obj/item/grenade/chem_grenade/incendiary,
/obj/item/grenade/chem_grenade/incendiary,
- /obj/item/grenade/chem_grenade/incendiary)
+ /obj/item/grenade/chem_grenade/incendiary,
+ /obj/item/storage/box/fireshot)
crate_name = "incendiary weapons crate"
crate_type = /obj/structure/closet/crate/secure/plasma
dangerous = TRUE
@@ -629,11 +632,13 @@
/datum/supply_pack/security/armory/riotshotguns
name = "Riot Shotgun Crate"
- desc = "For when the greytide gets really uppity. Contains three riot Shotguns. Requires Armory access to open."
+ desc = "For when the greytide gets really uppity. Contains three riot shotguns, seven rubber shot and beanbag shells. Requires Armory access to open."
cost = 6000
contains = list(/obj/item/gun/ballistic/shotgun/riot,
/obj/item/gun/ballistic/shotgun/riot,
- /obj/item/gun/ballistic/shotgun/riot)
+ /obj/item/gun/ballistic/shotgun/riot,
+ /obj/item/storage/box/rubbershot,
+ /obj/item/storage/box/beanbag)
crate_name = "riot shotgun crate"
/datum/supply_pack/security/armory/swat
@@ -1540,6 +1545,15 @@
crate_type = /obj/structure/closet/crate/secure/science
dangerous = TRUE
+/datum/supply_pack/science/tech_slugs
+ name = "Tech Slug Ammo Shells"
+ desc = "A new type of shell that is able to be made into a few different dangerous types. Contains two boxes of tech slugs, 14 shells in all."
+ cost = 1000
+ contains = list(/obj/item/storage/box/techsslug,
+ /obj/item/storage/box/techsslug)
+ crate_name = "tech slug crate"
+
+
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Service //////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index b6c5a5417a..07817ec4e4 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -1,3 +1,8 @@
+//defines the drill hat's yelling setting
+#define DRILL_DEFAULT "default"
+#define DRILL_SHOUTING "shouting"
+#define DRILL_YELLING "yelling"
+#define DRILL_CANADIAN "canadian"
//Chef
/obj/item/clothing/head/chefhat
@@ -148,6 +153,65 @@
strip_delay = 60
dog_fashion = /datum/dog_fashion/head/warden
+/obj/item/clothing/head/warden/drill
+ name = "warden's campaign hat"
+ desc = "A special armored campaign hat with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection. Has the letters 'FMJ' enscribed on its side."
+ icon_state = "wardendrill"
+ item_state = "wardendrill"
+ dog_fashion = null
+ var/mode = DRILL_DEFAULT
+
+/obj/item/clothing/head/warden/drill/screwdriver_act(mob/living/carbon/human/user, obj/item/I)
+ if(..())
+ return TRUE
+ switch(mode)
+ if(DRILL_DEFAULT)
+ to_chat(user, "You set the voice circuit to the middle position.")
+ mode = DRILL_SHOUTING
+ if(DRILL_SHOUTING)
+ to_chat(user, "You set the voice circuit to the last position.")
+ mode = DRILL_YELLING
+ if(DRILL_YELLING)
+ to_chat(user, "You set the voice circuit to the first position.")
+ mode = DRILL_DEFAULT
+ if(DRILL_CANADIAN)
+ to_chat(user, "You adjust voice circuit but nothing happens, probably because it's broken.")
+ return TRUE
+
+/obj/item/clothing/head/warden/drill/wirecutter_act(mob/living/user, obj/item/I)
+ if(mode != DRILL_CANADIAN)
+ to_chat(user, "You broke the voice circuit!")
+ mode = DRILL_CANADIAN
+ return TRUE
+
+/obj/item/clothing/head/warden/drill/speechModification(M)
+ if(copytext(M, 1, 2) != "*")
+ if(mode == DRILL_DEFAULT)
+ M = " [M]"
+ return trim(M)
+ if(mode == DRILL_SHOUTING)
+ M = " [M]!"
+ return trim(M)
+ if(mode == DRILL_YELLING)
+ M = " [M]!!"
+ return trim(M)
+ if(mode == DRILL_CANADIAN)
+ M = " [M]"
+ var/list/canadian_words = strings("canadian_replacement.json", "canadian")
+
+ for(var/key in canadian_words)
+ var/value = canadian_words[key]
+ if(islist(value))
+ value = pick(value)
+
+ M = replacetextEx(M, " [uppertext(key)]", " [uppertext(value)]")
+ M = replacetextEx(M, " [capitalize(key)]", " [capitalize(value)]")
+ M = replacetextEx(M, " [key]", " [value]")
+
+ if(prob(30))
+ M += pick(", eh?", ", EH?")
+ return trim(M)
+
/obj/item/clothing/head/beret/sec
name = "security beret"
desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection."
@@ -201,3 +265,8 @@
name = "quartermaster's beret"
desc = "This headwear shows off your Cargonian leadership"
icon_state = "qmberet"
+
+#undef DRILL_DEFAULT
+#undef DRILL_SHOUTING
+#undef DRILL_YELLING
+#undef DRILL_CANADIAN
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index bcd9642662..97e9a8f8ca 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -749,3 +749,11 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
+
+/obj/item/clothing/under/permit
+ name = "public nudity permit"
+ desc = "This permit entitles the bearer to conduct their duties without a uniform. Normally issued to furred crewmembers or those with nothing to hide."
+ icon = 'icons/obj/card.dmi'
+ icon_state = "fingerprint1"
+ item_state = "golem" //This is dumb and hacky but was here when I got here.//No, it really isn't. Why make a new blank clothing sprite if we already have one?
+ body_parts_covered = CHEST|GROIN
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index abf13bcab9..d9654b395d 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -45,6 +45,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
throwforce = 100
density = TRUE
anchored = TRUE
+ var/mob/living/wizard
var/z_original = 0
var/destination
var/notify = TRUE
@@ -140,3 +141,23 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
H.adjustBruteLoss(160)
if(L && (L.density || prob(10)))
L.ex_act(EXPLODE_HEAVY)
+
+obj/effect/immovablerod/attack_hand(mob/living/user)
+ if(ishuman(user))
+ var/mob/living/carbon/human/U = user
+ if(U.job in list("Research Director"))
+ playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
+ for(var/mob/M in urange(8, src))
+ if(!M.stat)
+ shake_camera(M, 2, 3)
+ if(wizard)
+ U.visible_message("[src] transforms into [wizard] as [U] suplexes them!", "As you grab [src], it suddenly turns into [wizard] as you suplex them!")
+ to_chat(wizard, "You're suddenly jolted out of rod-form as [U] somehow manages to grab you, slamming you into the ground!")
+ wizard.Stun(60)
+ wizard.apply_damage(25, BRUTE)
+ qdel(src)
+ else
+ U.visible_message("[U] suplexes [src] into the ground!", "You suplex [src] into the ground!")
+ new /obj/structure/festivus/anchored(drop_location())
+ new /obj/effect/anomaly/flux(drop_location())
+ qdel(src)
diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm
index 8264b4153e..9d63d48f34 100644
--- a/code/modules/food_and_drinks/food/snacks_pie.dm
+++ b/code/modules/food_and_drinks/food/snacks_pie.dm
@@ -53,6 +53,7 @@
H.adjust_blurriness(1)
H.visible_message("[H] is creamed by [src]!", "You've been creamed by [src]!")
playsound(H, "desceration", 50, TRUE)
+ reagents.trans_to(H,15) //Transfers the cream pies total volume of reagents to target on it
if(!H.creamed) // one layer at a time
H.add_overlay(creamoverlay)
H.creamed = TRUE
@@ -268,3 +269,24 @@
bonus_reagents = list("nutriment" = 4, "vitamin" = 6)
tastes = list("mint" = 1, "pie" = 1)
foodtype = GRAIN | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/pie/baklava
+ name = "baklava"
+ desc = "A delightful healthy snake made of nut layers with thin bread."
+ icon_state = "baklava"
+ slice_path = /obj/item/reagent_containers/food/snacks/baklavaslice
+ slices_num = 6
+ bonus_reagents = list("nutriment" = 2, "vitamin" = 6)
+ tastes = list("nuts" = 1, "pie" = 1)
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/baklavaslice
+ name = "baklava dish"
+ desc = "A portion delightful healthy snake made of nut layers with thin bread"
+ icon = 'icons/obj/food/piecake.dmi'
+ icon_state = "baklavaslice"
+ trash = /obj/item/trash/plate
+ filling_color = "#1E90FF"
+ list_reagents = list("nutriment" = 2, "vitamins" = 4)
+ tastes = list("nuts" = 1, "pie" = 1)
+ foodtype = GRAIN
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
index 8effc2599a..79d761c2e2 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
@@ -159,3 +159,13 @@
)
result = /obj/item/reagent_containers/food/snacks/pie/frostypie
subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/baklava
+ name = "Baklava pie"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/butter = 1,
+ /obj/item/reagent_containers/food/snacks/tortilla = 4, //Layers
+ /obj/item/seeds/wheat/oat = 3
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/baklava
+ subcategory = CAT_PIE
\ No newline at end of file
diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm
index ceba29baec..1f55f18823 100644
--- a/code/modules/mapping/map_template.dm
+++ b/code/modules/mapping/map_template.dm
@@ -29,6 +29,7 @@
var/list/obj/machinery/atmospherics/atmos_machines = list()
var/list/obj/structure/cable/cables = list()
var/list/atom/atoms = list()
+ var/list/area/areas = list()
var/list/turfs = block( locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]),
locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ]))
@@ -37,6 +38,7 @@
for(var/L in turfs)
var/turf/B = L
atoms += B
+ areas |= B.loc
for(var/A in B)
atoms += A
if(istype(A, /obj/structure/cable))
@@ -48,6 +50,7 @@
var/turf/T = L
T.air_update_turf(TRUE) //calculate adjacent turfs along the border to prevent runtimes
+ SSmapping.reg_in_areas_in_z(areas)
SSatoms.InitializeAtoms(atoms)
SSmachines.setup_template_powernets(cables)
SSair.setup_template_machinery(atmos_machines)
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index dd7f642243..5193545c4b 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -144,7 +144,12 @@ GLOBAL_LIST(labor_sheet_values)
points += inp.point_value * inp.amount
..()
-
+/obj/machinery/mineral/stacking_machine/laborstacker/attackby(obj/item/I, mob/living/user)
+ if(istype(I, /obj/item/stack/sheet) && user.canUnEquip(I))
+ var/obj/item/stack/sheet/inp = I
+ points += inp.point_value * inp.amount
+ return ..()
+
/**********************Point Lookup Console**************************/
/obj/machinery/mineral/labor_points_checker
name = "points checking console"
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index e96bb7f121..57483f64e7 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -48,18 +48,27 @@
if(affecting && affecting.dismemberable && affecting.get_damage() >= (affecting.max_damage - P.dismemberment))
affecting.dismember(P.damtype)
+/mob/living/carbon/proc/can_catch_item(skip_throw_mode_check)
+ . = FALSE
+ if(!skip_throw_mode_check && !in_throw_mode)
+ return
+ if(get_active_held_item())
+ return
+ if(restrained())
+ return
+ return TRUE
+
/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE)
if(!skipcatch) //ugly, but easy
- if(in_throw_mode && !get_active_held_item()) //empty active hand and we're in throw mode
- if(canmove && !restrained())
- if(istype(AM, /obj/item))
- var/obj/item/I = AM
- if(isturf(I.loc))
- I.attack_hand(src)
- if(get_active_held_item() == I) //if our attack_hand() picks up the item...
- visible_message("[src] catches [I]!") //catch that sucker!
- throw_mode_off()
- return 1
+ if(can_catch_item())
+ if(istype(AM, /obj/item))
+ var/obj/item/I = AM
+ if(isturf(I.loc))
+ I.attack_hand(src)
+ if(get_active_held_item() == I) //if our attack_hand() picks up the item...
+ visible_message("[src] catches [I]!") //catch that sucker!
+ throw_mode_off()
+ return 1
..()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 0f962d7b0f..129e600b00 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -851,7 +851,7 @@
/mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user)
//If they dragged themselves and we're currently aggressively grabbing them try to piggyback
- if(user == target && can_piggyback(target) && pulling == target && grab_state >= GRAB_AGGRESSIVE && stat == CONSCIOUS)
+ if(user == target && can_piggyback(target) && pulling == target && (HAS_TRAIT(src, TRAIT_PACIFISM) || grab_state >= GRAB_AGGRESSIVE) && stat == CONSCIOUS)
buckle_mob(target,TRUE,TRUE)
. = ..()
@@ -861,9 +861,11 @@
return TRUE
return FALSE
-/mob/living/carbon/human/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
+/mob/living/carbon/human/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE, bypass_piggybacking = FALSE)
if(!force)//humans are only meant to be ridden through piggybacking and special cases
return
+ if(bypass_piggybacking)
+ return ..()
if(!is_type_in_typecache(M, can_ride_typecache))
M.visible_message("[M] really can't seem to mount [src]...")
return
@@ -876,7 +878,7 @@
if(can_piggyback(M))
riding_datum.ride_check_ridden_incapacitated = TRUE
visible_message("[M] starts to climb onto [src]...")
- if(do_after(M, 15, target = src))
+ if(force || do_after(M, 15, target = src))
if(can_piggyback(M))
if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE))
M.visible_message("[M] can't hang onto [src]!")
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 458a319ecd..62a4d42672 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -502,10 +502,13 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else
standing += mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER)
- if(H.socks && H.get_num_legs(FALSE) >= 2 && !(DIGITIGRADE in species_traits))
+ if(H.socks && H.get_num_legs(FALSE) >= 2)
var/datum/sprite_accessory/socks/socks = GLOB.socks_list[H.socks]
if(socks)
- standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER)
+ if(DIGITIGRADE in species_traits)
+ standing += mutable_appearance(socks.icon, socks.icon_state + "_d", -BODY_LAYER)
+ else
+ standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER)
if(standing.len)
H.overlays_standing[BODY_LAYER] = standing
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 49eeea8fa3..e20422a839 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1189,9 +1189,13 @@
clamp_unconscious_to = 0,
clamp_immobility_to = 0,
reset_misc = TRUE,
- healing_chems = list("inaprovaline" = 3, "synaptizine" = 10, "omnizine" = 10, "stimulants" = 10),
- message = "You feel a surge of energy!"
+ healing_chems = list("inaprovaline" = 3, "synaptizine" = 10, "regen_jelly" = 10, "stimulants" = 10),
+ message = "You feel a surge of energy!",
+ stamina_buffer_boost = 0, //restores stamina buffer rather than just health
+ scale_stamina_loss_recovery, //defaults to null. if this is set, restores loss * this stamina. make sure it's a fraction.
+ stamina_loss_recovery_bypass = 0 //amount of stamina loss to ignore during calculation
)
+ to_chat(src, message)
if(AmountSleeping() > clamp_unconscious_to)
SetSleeping(clamp_unconscious_to)
if(AmountUnconscious() > clamp_unconscious_to)
@@ -1200,7 +1204,10 @@
SetStun(clamp_immobility_to)
if(AmountKnockdown() > clamp_immobility_to)
SetKnockdown(clamp_immobility_to)
- adjustStaminaLoss(max(0, -stamina_boost))
+ adjustStaminaLoss(min(0, -stamina_boost))
+ adjustStaminaLossBuffered(min(0, -stamina_buffer_boost))
+ if(scale_stamina_loss_recovery)
+ adjustStaminaLoss(min(-((getStaminaLoss() - stamina_loss_recovery_bypass) * scale_stamina_loss_recovery), 0))
if(put_on_feet)
resting = FALSE
lying = FALSE
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index a70ca2a8e6..368c5ad4a8 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -348,7 +348,7 @@
if(vore_active)
if(isliving(target))
var/mob/living/L = target
- if(L.Adjacent(src) && L.devourable) // aggressive check to ensure vore attacks can be made
+ if(!client && L.Adjacent(src) && L.devourable) // aggressive check to ensure vore attacks can be made
if(prob(voracious_chance))
vore_attack(src,L,src)
else
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index 4308120c4f..a01b354ca1 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -37,6 +37,8 @@
var/mindrain = 200
var/maxdrain = 400
+ var/stunforce = 140 //Same as stunbaton, adjustable.
+
/obj/item/clothing/gloves/space_ninja/Touch(atom/A,proximity)
if(!candrain || draining)
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index 270e1f106f..c98a0440e3 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -14,7 +14,7 @@ It is possible to destroy the net by the occupant or someone else.
mouse_opacity = MOUSE_OPACITY_ICON//So you can hit it with stuff.
anchored = TRUE//Can't drag/grab the net.
layer = ABOVE_ALL_MOB_LAYER
- max_integrity = 25 //How much health it has.
+ max_integrity = 50 //How much health it has.
can_buckle = 1
buckle_lying = 0
buckle_prevents_pull = TRUE
@@ -59,6 +59,41 @@ It is possible to destroy the net by the occupant or someone else.
continue
H.dropItemToGround(W)
+ var/datum/antagonist/antag_datum
+ for(var/datum/antagonist/ninja/AD in GLOB.antagonists) //Because only ninjas get capture objectives; They're not doable without the suit.
+ if(AD.owner == master)
+ antag_datum = AD
+ break
+
+ for(var/datum/objective/capture/capture in antag_datum)
+ if(istype(affecting, /mob/living/carbon/human)) //Humans.
+ if(affecting.stat == DEAD)//Dead folks are worth less.
+ capture.captured_amount+=0.5
+ continue
+ capture.captured_amount+=1
+ if(istype(affecting, /mob/living/carbon/monkey)) //Monkeys are almost worthless, you failure.
+ capture.captured_amount+=0.1
+ if(istype(affecting, /mob/living/carbon/alien/larva)) //Larva are important for research.
+ if(affecting.stat == DEAD)
+ capture.captured_amount+=0.5
+ continue
+ capture.captured_amount+=1
+ if(istype(affecting, /mob/living/carbon/alien/humanoid)) //Aliens are worth twice as much as humans.
+ if(istype(affecting, /mob/living/carbon/alien/humanoid/royal/queen)) //Queens are worth three times as much as humans.
+ if(affecting.stat == DEAD)
+ capture.captured_amount+=1.5
+ else
+ capture.captured_amount+=3
+ continue
+ if(affecting.stat == DEAD)
+ capture.captured_amount+=1
+ continue
+ capture.captured_amount+=2
+
+
+ affecting.revive(1, 1) //Basically a revive and full heal, including limbs/organs
+ //In case people who have been captured dead want to hang out at the holding area
+
playsound(affecting, 'sound/effects/sparks4.ogg', 50, 1)
new /obj/effect/temp_visual/dir_setting/ninja/phase/out(affecting.drop_location(), affecting.dir)
@@ -73,8 +108,9 @@ It is possible to destroy the net by the occupant or someone else.
playsound(affecting, 'sound/effects/sparks2.ogg', 50, 1)
new /obj/effect/temp_visual/dir_setting/ninja/phase(affecting.drop_location(), affecting.dir)
-/obj/structure/energy_net/attack_paw(mob/user)
- return attack_hand()
+/obj/attack_alien(mob/living/carbon/alien/humanoid/user)
+ if(attack_generic(user, 15, BRUTE, "melee", 0)) //Aliens normally deal 60 damage to structures. They'd one-shot nets without this.
+ playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
/obj/structure/energy_net/user_buckle_mob(mob/living/M, mob/living/user)
return//We only want our target to be buckled
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
index 8c8f92e522..41f7b8af83 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
@@ -2,21 +2,34 @@
//Allows the ninja to kidnap people
/obj/item/clothing/suit/space/space_ninja/proc/ninjanet()
var/mob/living/carbon/human/H = affecting
- var/mob/living/carbon/C = input("Select who to capture:","Capture who?",null) as null|mob in oview(H)
+ var/mob/living/carbon/C
+
+ //If there's only one valid target, let's actually try to capture it, rather than forcing
+ //the user to fiddle with the dialog displaying a list of one
+ //Also, let's make this smarter and not list mobs you can't currently net.
+ var/Candidates[]
+ for(var/mob/mob in oview(H))
+ if(!mob.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
+ //to_chat(H, "[C.p_they(TRUE)] will bring no honor to your Clan!")
+ continue
+ if(locate(/obj/structure/energy_net) in get_turf(mob))//Check if they are already being affected by an energy net.
+ //to_chat(H, "[C.p_they(TRUE)] are already trapped inside an energy net!")
+ continue
+ for(var/turf/T in getline(get_turf(H), get_turf(mob)))
+ if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
+ //to_chat(H, "You may not use an energy net through solid obstacles!")
+ continue
+ Candidates+=mob
+
+ if(Candidates.len == 1)
+ C = Candidates[1]
+ else
+ C = input("Select who to capture:","Capture who?",null) as null|mob in Candidates
+
if(QDELETED(C)||!(C in oview(H)))
return 0
- if(!C.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
- to_chat(H, "[C.p_they(TRUE)] will bring no honor to your Clan!")
- return
- if(locate(/obj/structure/energy_net) in get_turf(C))//Check if they are already being affected by an energy net.
- to_chat(H, "[C.p_they(TRUE)] are already trapped inside an energy net!")
- return
- for(var/turf/T in getline(get_turf(H), get_turf(C)))
- if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
- to_chat(H, "You may not use an energy net through solid obstacles!")
- return
if(!ninjacost(200,N_STEALTH_CANCEL))
H.Beam(C,"n_beam",time=15)
H.say("Get over here!", forced = "ninja net")
diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm
index 861ffb9446..10fce3d74e 100644
--- a/code/modules/ninja/suit/ninjaDrainAct.dm
+++ b/code/modules/ninja/suit/ninjaDrainAct.dm
@@ -261,4 +261,19 @@ They *could* go in their appropriate files, but this is supposed to be modular
spark_system.set_up(5, 0, loc)
playsound(src, "sparks", 50, 1)
visible_message("[H] electrocutes [src] with [H.p_their()] touch!", "[H] electrocutes you with [H.p_their()] touch!")
- electrocute_act(25, H)
+ electrocute_act(15, H)
+
+ Knockdown(G.stunforce)
+ adjustStaminaLoss(G.stunforce*0.1, affected_zone = (istype(H) ? H.zone_selected : BODY_ZONE_CHEST))
+ apply_effect(EFFECT_STUTTER, G.stunforce)
+ SEND_SIGNAL(src, COMSIG_LIVING_MINOR_SHOCK)
+
+ lastattacker = H.real_name
+ lastattackerckey = H.ckey
+ log_combat(H, src, "stunned")
+
+ playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
+
+ if(ishuman(src))
+ var/mob/living/carbon/human/Hsrc = src
+ Hsrc.forcesay(GLOB.hit_appends)
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index e3ce30066a..2a298d39b1 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -1,3 +1,4 @@
+
/obj/item/paperplane
name = "paper plane"
desc = "Paper, folded in the shape of a plane."
@@ -10,8 +11,14 @@
resistance_flags = FLAMMABLE
max_integrity = 50
+ var/hit_probability = 2//%
var/obj/item/paper/internalPaper
+/obj/item/paperplane/origami
+ desc = "Paper, masterfully folded in the shape of a plane."
+ throwforce = 20 //same as throwing stars, but no chance of embedding.
+ hit_probability = 100 //guaranteed to cause eye damage when it hits a mob.
+
/obj/item/paperplane/Initialize(mapload, obj/item/paper/newPaper)
. = ..()
pixel_y = rand(-8, 8)
@@ -22,13 +29,18 @@
color = newPaper.color
newPaper.forceMove(src)
else
- internalPaper = new /obj/item/paper(src)
+ internalPaper = new(src)
update_icon()
-/obj/item/paperplane/Destroy()
- if(internalPaper)
- qdel(internalPaper)
+/obj/item/paperplane/handle_atom_del(atom/A)
+ if(A == internalPaper)
internalPaper = null
+ if(!QDELETED(src))
+ qdel(src)
+ return ..()
+
+/obj/item/paperplane/Destroy()
+ QDEL_NULL(internalPaper)
return ..()
/obj/item/paperplane/suicide_act(mob/living/user)
@@ -48,7 +60,7 @@
/obj/item/paperplane/attack_self(mob/user)
to_chat(user, "You unfold [src].")
- var/atom/movable/internal_paper_tmp = internalPaper
+ var/obj/item/paper/internal_paper_tmp = internalPaper
internal_paper_tmp.forceMove(loc)
internalPaper = null
qdel(src)
@@ -86,11 +98,18 @@
. = ..(target, range, speed, thrower, FALSE, diagonals_first, callback)
/obj/item/paperplane/throw_impact(atom/hit_atom)
+ if(iscarbon(hit_atom))
+ var/mob/living/carbon/C = hit_atom
+ if(C.can_catch_item(TRUE))
+ var/datum/action/innate/origami/origami_action = locate() in C.actions
+ if(origami_action?.active) //if they're a master of origami and have the ability turned on, force throwmode on so they'll automatically catch the plane.
+ C.throw_mode_on()
+
if(..() || !ishuman(hit_atom))//if the plane is caught or it hits a nonhuman
return
var/mob/living/carbon/human/H = hit_atom
- if(prob(2))
- if((H.head && H.head.flags_cover & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) || (H.glasses && H.glasses.flags_cover & GLASSESCOVERSEYES))
+ if(prob(hit_probability))
+ if(H.is_eyes_covered())
return
visible_message("\The [src] hits [H] in the eye!")
H.adjust_blurriness(6)
@@ -107,5 +126,11 @@
return
to_chat(user, "You fold [src] into the shape of a plane!")
user.temporarilyRemoveItemFromInventory(src)
- I = new /obj/item/paperplane(user, src)
+ var/obj/item/paperplane/plane_type = /obj/item/paperplane
+ //Origami Master
+ var/datum/action/innate/origami/origami_action = locate() in user.actions
+ if(origami_action?.active)
+ plane_type = /obj/item/paperplane/origami
+
+ I = new plane_type(user, src)
user.put_in_hands(I)
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index b6473b8913..3e93d9f42b 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -26,7 +26,8 @@
/obj/item/stock_parts/cell/Initialize(mapload, override_maxcharge)
. = ..()
- START_PROCESSING(SSobj, src)
+ if(self_recharge)
+ START_PROCESSING(SSobj, src)
create_reagents(5, INJECTABLE | DRAINABLE)
if (override_maxcharge)
maxcharge = override_maxcharge
@@ -69,8 +70,8 @@
return 100*charge/maxcharge
// use power from a cell
-/obj/item/stock_parts/cell/use(amount)
- if(rigged && amount > 0)
+/obj/item/stock_parts/cell/use(amount, can_explode = TRUE)
+ if(rigged && amount > 0 && can_explode)
explode()
return 0
if(charge < amount)
@@ -103,9 +104,8 @@
return (FIRELOSS)
/obj/item/stock_parts/cell/on_reagent_change(changetype)
- rigged = !isnull(reagents.has_reagent("plasma", 5)) //has_reagent returns the reagent datum
..()
-
+ rigged = reagents?.has_reagent("plasma", 5) ? TRUE : FALSE //has_reagent returns the reagent datum
/obj/item/stock_parts/cell/proc/explode()
var/turf/T = get_turf(src.loc)
diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm
index 3f033ac904..c9e60ddc1d 100644
--- a/code/modules/projectiles/ammunition/energy/stun.dm
+++ b/code/modules/projectiles/ammunition/energy/stun.dm
@@ -24,4 +24,4 @@
e_cost = 40
fire_sound = 'sound/weapons/taser2.ogg'
harmful = FALSE
- click_cooldown_override = 3
+ click_cooldown_override = 3.5
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 10282e5e0a..d10e57783d 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -9,7 +9,6 @@
interaction_flags_machine = INTERACT_MACHINE_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE
resistance_flags = FIRE_PROOF | ACID_PROOF
circuit = /obj/item/circuitboard/machine/chem_dispenser
- var/cell_type = /obj/item/stock_parts/cell/high
var/obj/item/stock_parts/cell/cell
var/powerefficiency = 0.1
var/amount = 30
@@ -79,7 +78,6 @@
/obj/machinery/chem_dispenser/Initialize()
. = ..()
- cell = new cell_type
dispensable_reagents = sortList(dispensable_reagents)
update_icon()
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index b9405a87b2..867986d992 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -172,6 +172,16 @@
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+/datum/design/organbox
+ name = "Empty Organ Box"
+ desc = "A large cool box that can hold large amouts of medical tools or organs."
+ id = "organbox"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 3000, MAT_GLASS = 1000, MAT_SILVER= 3500, MAT_GOLD = 3500, MAT_PLASTIC = 5000)
+ build_path = /obj/item/storage/belt/organbox
+ category = list("Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
////////////////////////////////////////
//////////Defibrillator Tech////////////
////////////////////////////////////////
diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm
index ac3007203f..838753d308 100644
--- a/code/modules/research/designs/misc_designs.dm
+++ b/code/modules/research/designs/misc_designs.dm
@@ -1,486 +1,527 @@
-
-/////////////////////////////////////////
-/////////////////HUDs////////////////////
-/////////////////////////////////////////
-
-/datum/design/health_hud
- name = "Health Scanner HUD"
- desc = "A heads-up display that scans the humans in view and provides accurate data about their health status."
- id = "health_hud"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500)
- build_path = /obj/item/clothing/glasses/hud/health
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-/datum/design/health_hud_prescription
- name = "Prescription Health Scanner HUD"
- desc = "A heads-up display that scans the humans in view and provides accurate data about their health status. This one has a prescription lens."
- id = "health_hud_prescription"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 350)
- build_path = /obj/item/clothing/glasses/hud/health/prescription
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-/datum/design/health_hud_night
- name = "Night Vision Health Scanner HUD"
- desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
- id = "health_hud_night"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_URANIUM = 1000, MAT_SILVER = 350)
- build_path = /obj/item/clothing/glasses/hud/health/night
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-/datum/design/security_hud
- name = "Security HUD"
- desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status."
- id = "security_hud"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500)
- build_path = /obj/item/clothing/glasses/hud/security
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/security_hud_prescription
- name = "Prescription Security HUD"
- desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status. This one has a prescription lens."
- id = "security_hud_prescription"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 350)
- build_path = /obj/item/clothing/glasses/hud/security/prescription
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-
-/datum/design/security_hud_night
- name = "Night Vision Security HUD"
- desc = "A heads-up display which provides id data and vision in complete darkness."
- id = "security_hud_night"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_URANIUM = 1000, MAT_GOLD = 350)
- build_path = /obj/item/clothing/glasses/hud/security/night
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/diagnostic_hud
- name = "Diagnostic HUD"
- desc = "A HUD used to analyze and determine faults within robotic machinery."
- id = "diagnostic_hud"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500)
- build_path = /obj/item/clothing/glasses/hud/diagnostic
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/diagnostic_hud_prescription
- name = "Prescription Diagnostic HUD"
- desc = "A HUD used to analyze and determine faults within robotic machinery. This one has a prescription lens."
- id = "diagnostic_hud_prescription"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_GOLD = 350)
- build_path = /obj/item/clothing/glasses/hud/diagnostic/prescription
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/diagnostic_hud_night
- name = "Night Vision Diagnostic HUD"
- desc = "Upgraded version of the diagnostic HUD designed to function during a power failure."
- id = "diagnostic_hud_night"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_URANIUM = 1000, MAT_PLASMA = 300)
- build_path = /obj/item/clothing/glasses/hud/diagnostic/night
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/sci_goggles
- name = "Science Goggles"
- desc = "Goggles fitted with a portable analyzer capable of determining the research worth of an item or components of a machine."
- id = "scigoggles"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500)
- build_path = /obj/item/clothing/glasses/science
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/mesons
- name = "Optical Meson Scanners"
- desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
- id = "mesons"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500)
- build_path = /obj/item/clothing/glasses/meson
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/mesons_prescription
- name = "Prescription Optical Meson Scanners"
- desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition. Prescription lens has been added into this design."
- id = "mesons_prescription"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 350)
- build_path = /obj/item/clothing/glasses/meson/prescription
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/engine_goggles
- name = "Engineering Scanner Goggles"
- desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes."
- id = "engine_goggles"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_PLASMA = 100)
- build_path = /obj/item/clothing/glasses/meson/engine
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/engine_goggles_prescription
- name = "Prescription Engineering Scanner Goggles"
- desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes. Prescription lens has been added into this design."
- id = "engine_goggles_prescription"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_PLASMA = 100, MAT_SILVER = 350)
- build_path = /obj/item/clothing/glasses/meson/engine/prescription
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/tray_goggles
- name = "Optical T-Ray Scanners"
- desc = "Used by engineering staff to see underfloor objects such as cables and pipes."
- id = "tray_goggles"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500)
- build_path = /obj/item/clothing/glasses/meson/engine/tray
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/tray_goggles_prescription
- name = "Prescription Optical T-Ray Scanners"
- desc = "Used by engineering staff to see underfloor objects such as cables and pipes. Prescription lens has been added into this design."
- id = "tray_goggles_prescription"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 150)
- build_path = /obj/item/clothing/glasses/meson/engine/tray/prescription
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/nvgmesons
- name = "Night Vision Optical Meson Scanners"
- desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display."
- id = "nvgmesons"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_PLASMA = 350, MAT_URANIUM = 1000)
- build_path = /obj/item/clothing/glasses/meson/night
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO
-
-/datum/design/night_vision_goggles
- name = "Night Vision Goggles"
- desc = "Goggles that let you see through darkness unhindered."
- id = "night_visision_goggles"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_PLASMA = 350, MAT_URANIUM = 1000)
- build_path = /obj/item/clothing/glasses/night
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/night_vision_goggles_glasses
- name = "Prescription Night Vision Goggles"
- desc = "Goggles that let you see through darkness unhindered. Corrects vision."
- id = "night_visision_goggles_glasses"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_PLASMA = 350, MAT_URANIUM = 1000)
- build_path = /obj/item/clothing/glasses/night/prescription
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
-
-/////////////////////////////////////////
-//////////////////Misc///////////////////
-/////////////////////////////////////////
-
-/datum/design/welding_mask
- name = "Welding Gas Mask"
- desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd."
- id = "weldingmask"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 3000, MAT_GLASS = 1000)
- build_path = /obj/item/clothing/mask/gas/welding
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/portaseeder
- name = "Portable Seed Extractor"
- desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant."
- id = "portaseeder"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 1000, MAT_GLASS = 400)
- build_path = /obj/item/storage/bag/plants/portaseeder
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/air_horn
- name = "Air Horn"
- desc = "Damn son, where'd you find this?"
- id = "air_horn"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 4000, MAT_BANANIUM = 1000)
- build_path = /obj/item/bikehorn/airhorn
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ALL //HONK!
-
-/datum/design/magboots
- name = "Magnetic Boots"
- desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle."
- id = "magboots"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 4500, MAT_SILVER = 1500, MAT_GOLD = 2500)
- build_path = /obj/item/clothing/shoes/magboots
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/diskplantgene
- name = "Plant Data Disk"
- desc = "A disk for storing plant genetic data."
- id = "diskplantgene"
- build_type = PROTOLATHE
- materials = list(MAT_METAL=200, MAT_GLASS=100)
- build_path = /obj/item/disk/plantgene
- category = list("Electronics")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/roastingstick
- name = "Advanced roasting stick"
- desc = "A roasting stick for cooking sausages in exotic ovens."
- id = "roastingstick"
- build_type = PROTOLATHE
- materials = list(MAT_METAL=1000, MAT_GLASS=500, MAT_BLUESPACE = 250)
- build_path = /obj/item/melee/roastingstick
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/locator
- name = "Bluespace locator"
- desc = "Used to track portable teleportation beacons and targets with embedded tracking implants."
- id = "locator"
- build_type = PROTOLATHE
- materials = list(MAT_METAL=1000, MAT_GLASS=500, MAT_SILVER = 500)
- build_path = /obj/item/locator
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/////////////////////////////////////////
-////////////Janitor Designs//////////////
-/////////////////////////////////////////
-
-/datum/design/advmop
- name = "Advanced Mop"
- desc = "An upgraded mop with a large internal capacity for holding water or other cleaning chemicals."
- id = "advmop"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 2500, MAT_GLASS = 200)
- build_path = /obj/item/mop/advanced
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/blutrash
- name = "Trashbag of Holding"
- desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage."
- id = "blutrash"
- build_type = PROTOLATHE
- materials = list(MAT_GOLD = 1500, MAT_URANIUM = 250, MAT_PLASMA = 1500)
- build_path = /obj/item/storage/bag/trash/bluespace
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/buffer
- name = "Floor Buffer Upgrade"
- desc = "A floor buffer that can be attached to vehicular janicarts."
- id = "buffer"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 3000, MAT_GLASS = 200)
- build_path = /obj/item/janiupgrade
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/////////////////////////////////////////
-////////////Holosign Designs/////////////
-/////////////////////////////////////////
-
-/datum/design/holosign
- name = "Holographic Sign Projector"
- desc = "A holograpic projector used to project various warning signs."
- id = "holosign"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
- build_path = /obj/item/holosign_creator
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/holosignsec
- name = "Security Holobarrier Projector"
- desc = "A holographic projector that creates holographic security barriers."
- id = "holosignsec"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_GOLD = 1000, MAT_SILVER = 1000)
- build_path = /obj/item/holosign_creator/security
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/holosignengi
- name = "Engineering Holobarrier Projector"
- desc = "A holographic projector that creates holographic engineering barriers."
- id = "holosignengi"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_GOLD = 1000, MAT_SILVER = 1000)
- build_path = /obj/item/holosign_creator/engineering
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/holosignatmos
- name = "ATMOS Holofan Projector"
- desc = "A holographic projector that creates holographic barriers that prevent changes in atmospheric conditions."
- id = "holosignatmos"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_GOLD = 1000, MAT_SILVER = 1000)
- build_path = /obj/item/holosign_creator/atmos
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/forcefield_projector
- name = "Forcefield Projector"
- desc = "A device which can project temporary forcefields to seal off an area."
- id = "forcefield_projector"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 2500, MAT_GLASS = 1000)
- build_path = /obj/item/forcefield_projector
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-///////////////////////////////
-////////////Tools//////////////
-///////////////////////////////
-
-/datum/design/exwelder
- name = "Experimental Welding Tool"
- desc = "An experimental welder capable of self-fuel generation."
- id = "exwelder"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_PLASMA = 1500, MAT_URANIUM = 200)
- build_path = /obj/item/weldingtool/experimental
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/handdrill
- name = "Hand Drill"
- desc = "A small electric hand drill with an interchangeable screwdriver and bolt bit"
- id = "handdrill"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 3500, MAT_SILVER = 1500, MAT_TITANIUM = 2500)
- build_path = /obj/item/screwdriver/power
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/jawsoflife
- name = "Jaws of Life"
- desc = "A small, compact Jaws of Life with an interchangeable pry jaws and cutting jaws"
- id = "jawsoflife" // added one more requirment since the Jaws of Life are a bit OP
- build_path = /obj/item/crowbar/power
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 4500, MAT_SILVER = 2500, MAT_TITANIUM = 3500)
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/alienwrench
- name = "Alien Wrench"
- desc = "An advanced wrench obtained through Abductor technology."
- id = "alien_wrench"
- build_path = /obj/item/wrench/abductor
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/alienwirecutters
- name = "Alien Wirecutters"
- desc = "Advanced wirecutters obtained through Abductor technology."
- id = "alien_wirecutters"
- build_path = /obj/item/wirecutters/abductor
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/alienscrewdriver
- name = "Alien Screwdriver"
- desc = "An advanced screwdriver obtained through Abductor technology."
- id = "alien_screwdriver"
- build_path = /obj/item/screwdriver/abductor
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/aliencrowbar
- name = "Alien Crowbar"
- desc = "An advanced crowbar obtained through Abductor technology."
- id = "alien_crowbar"
- build_path = /obj/item/crowbar/abductor
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/alienwelder
- name = "Alien Welding Tool"
- desc = "An advanced welding tool obtained through Abductor technology."
- id = "alien_welder"
- build_path = /obj/item/weldingtool/abductor
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/alienmultitool
- name = "Alien Multitool"
- desc = "An advanced multitool obtained through Abductor technology."
- id = "alien_multitool"
- build_path = /obj/item/multitool/abductor
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/anomaly_neutralizer
- name = "Anomaly Neutralizer"
- desc = "An advanced tool capable of instantly neutralizing anomalies, designed to capture the fleeting aberrations created by the engine."
- id = "anomaly_neutralizer"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 2000, MAT_GOLD = 2000, MAT_PLASMA = 5000, MAT_URANIUM = 2000)
- build_path = /obj/item/anomaly_neutralizer
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/pHmeter
- name = "pH meter"
- desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution."
- id = "pHmeter"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 1000, MAT_SILVER = 100, MAT_DIAMOND = 100)
- build_path = /obj/item/FermiChem/pHmeter
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-
-/////////////////////////////////////////
-////////////Armour///////////////////////
-/////////////////////////////////////////
-
-/datum/design/reactive_armour
- name = "Reactive Armour Shell"
- desc = "An experimental suit of armour capable of utilizing an implanted anomaly core to protect the user."
- id = "reactive_armour"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 10000, MAT_DIAMOND = 5000, MAT_URANIUM = 8000, MAT_SILVER = 4500, MAT_GOLD = 5000)
- build_path = /obj/item/reactive_armour_shell
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+/////////////////////////////////////////
+/////////////////HUDs////////////////////
+/////////////////////////////////////////
+
+/datum/design/health_hud
+ name = "Health Scanner HUD"
+ desc = "A heads-up display that scans the humans in view and provides accurate data about their health status."
+ id = "health_hud"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/clothing/glasses/hud/health
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+/datum/design/health_hud_prescription
+ name = "Prescription Health Scanner HUD"
+ desc = "A heads-up display that scans the humans in view and provides accurate data about their health status. This one has a prescription lens."
+ id = "health_hud_prescription"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 350)
+ build_path = /obj/item/clothing/glasses/hud/health/prescription
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+/datum/design/health_hud_night
+ name = "Night Vision Health Scanner HUD"
+ desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
+ id = "health_hud_night"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_URANIUM = 1000, MAT_SILVER = 350)
+ build_path = /obj/item/clothing/glasses/hud/health/night
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+/datum/design/security_hud
+ name = "Security HUD"
+ desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status."
+ id = "security_hud"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/clothing/glasses/hud/security
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/security_hud_prescription
+ name = "Prescription Security HUD"
+ desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status. This one has a prescription lens."
+ id = "security_hud_prescription"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 350)
+ build_path = /obj/item/clothing/glasses/hud/security/prescription
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/security_hud_night
+ name = "Night Vision Security HUD"
+ desc = "A heads-up display which provides id data and vision in complete darkness."
+ id = "security_hud_night"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_URANIUM = 1000, MAT_GOLD = 350)
+ build_path = /obj/item/clothing/glasses/hud/security/night
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/diagnostic_hud
+ name = "Diagnostic HUD"
+ desc = "A HUD used to analyze and determine faults within robotic machinery."
+ id = "diagnostic_hud"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/clothing/glasses/hud/diagnostic
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/diagnostic_hud_prescription
+ name = "Prescription Diagnostic HUD"
+ desc = "A HUD used to analyze and determine faults within robotic machinery. This one has a prescription lens."
+ id = "diagnostic_hud_prescription"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_GOLD = 350)
+ build_path = /obj/item/clothing/glasses/hud/diagnostic/prescription
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/diagnostic_hud_night
+ name = "Night Vision Diagnostic HUD"
+ desc = "Upgraded version of the diagnostic HUD designed to function during a power failure."
+ id = "diagnostic_hud_night"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_URANIUM = 1000, MAT_PLASMA = 300)
+ build_path = /obj/item/clothing/glasses/hud/diagnostic/night
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/sci_goggles
+ name = "Science Goggles"
+ desc = "Goggles fitted with a portable analyzer capable of determining the research worth of an item or components of a machine."
+ id = "scigoggles"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/clothing/glasses/science
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/mesons
+ name = "Optical Meson Scanners"
+ desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
+ id = "mesons"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/clothing/glasses/meson
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/mesons_prescription
+ name = "Prescription Optical Meson Scanners"
+ desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition. Prescription lens has been added into this design."
+ id = "mesons_prescription"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 350)
+ build_path = /obj/item/clothing/glasses/meson/prescription
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/engine_goggles
+ name = "Engineering Scanner Goggles"
+ desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes."
+ id = "engine_goggles"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_PLASMA = 100)
+ build_path = /obj/item/clothing/glasses/meson/engine
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/engine_goggles_prescription
+ name = "Prescription Engineering Scanner Goggles"
+ desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes. Prescription lens has been added into this design."
+ id = "engine_goggles_prescription"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_PLASMA = 100, MAT_SILVER = 350)
+ build_path = /obj/item/clothing/glasses/meson/engine/prescription
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/tray_goggles
+ name = "Optical T-Ray Scanners"
+ desc = "Used by engineering staff to see underfloor objects such as cables and pipes."
+ id = "tray_goggles"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/clothing/glasses/meson/engine/tray
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/tray_goggles_prescription
+ name = "Prescription Optical T-Ray Scanners"
+ desc = "Used by engineering staff to see underfloor objects such as cables and pipes. Prescription lens has been added into this design."
+ id = "tray_goggles_prescription"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 150)
+ build_path = /obj/item/clothing/glasses/meson/engine/tray/prescription
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/nvgmesons
+ name = "Night Vision Optical Meson Scanners"
+ desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display."
+ id = "nvgmesons"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_PLASMA = 350, MAT_URANIUM = 1000)
+ build_path = /obj/item/clothing/glasses/meson/night
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO
+
+/datum/design/night_vision_goggles
+ name = "Night Vision Goggles"
+ desc = "Goggles that let you see through darkness unhindered."
+ id = "night_visision_goggles"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_PLASMA = 350, MAT_URANIUM = 1000)
+ build_path = /obj/item/clothing/glasses/night
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/night_vision_goggles_glasses
+ name = "Prescription Night Vision Goggles"
+ desc = "Goggles that let you see through darkness unhindered. Corrects vision."
+ id = "night_visision_goggles_glasses"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_PLASMA = 350, MAT_URANIUM = 1000)
+ build_path = /obj/item/clothing/glasses/night/prescription
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
+
+/////////////////////////////////////////
+//////////////////Misc///////////////////
+/////////////////////////////////////////
+
+/datum/design/welding_mask
+ name = "Welding Gas Mask"
+ desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd."
+ id = "weldingmask"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 3000, MAT_GLASS = 1000)
+ build_path = /obj/item/clothing/mask/gas/welding
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/portaseeder
+ name = "Portable Seed Extractor"
+ desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant."
+ id = "portaseeder"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_GLASS = 400)
+ build_path = /obj/item/storage/bag/plants/portaseeder
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/air_horn
+ name = "Air Horn"
+ desc = "Damn son, where'd you find this?"
+ id = "air_horn"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 4000, MAT_BANANIUM = 1000)
+ build_path = /obj/item/bikehorn/airhorn
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ALL //HONK!
+
+/datum/design/magboots
+ name = "Magnetic Boots"
+ desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle."
+ id = "magboots"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 4500, MAT_SILVER = 1500, MAT_GOLD = 2500)
+ build_path = /obj/item/clothing/shoes/magboots
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/sci_goggles
+ name = "Science Goggles"
+ desc = "Goggles fitted with a portable analyzer capable of determining the research worth of an item or components of a machine."
+ id = "scigoggles"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/clothing/glasses/science
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/diskplantgene
+ name = "Plant Data Disk"
+ desc = "A disk for storing plant genetic data."
+ id = "diskplantgene"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL=200, MAT_GLASS=100)
+ build_path = /obj/item/disk/plantgene
+ category = list("Electronics")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/roastingstick
+ name = "Advanced roasting stick"
+ desc = "A roasting stick for cooking sausages in exotic ovens."
+ id = "roastingstick"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL=1000, MAT_GLASS=500, MAT_BLUESPACE = 250)
+ build_path = /obj/item/melee/roastingstick
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/locator
+ name = "Bluespace locator"
+ desc = "Used to track portable teleportation beacons and targets with embedded tracking implants."
+ id = "locator"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL=1000, MAT_GLASS=500, MAT_SILVER = 500)
+ build_path = /obj/item/locator
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/////////////////////////////////////////
+////////////Janitor Designs//////////////
+/////////////////////////////////////////
+
+/datum/design/advmop
+ name = "Advanced Mop"
+ desc = "An upgraded mop with a large internal capacity for holding water or other cleaning chemicals."
+ id = "advmop"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2500, MAT_GLASS = 200)
+ build_path = /obj/item/mop/advanced
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/blutrash
+ name = "Trashbag of Holding"
+ desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage."
+ id = "blutrash"
+ build_type = PROTOLATHE
+ materials = list(MAT_GOLD = 1500, MAT_URANIUM = 250, MAT_PLASMA = 1500)
+ build_path = /obj/item/storage/bag/trash/bluespace
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/buffer
+ name = "Floor Buffer Upgrade"
+ desc = "A floor buffer that can be attached to vehicular janicarts."
+ id = "buffer"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 3000, MAT_GLASS = 200)
+ build_path = /obj/item/janiupgrade
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/////////////////////////////////////////
+////////////Holosign Designs//////////////
+/////////////////////////////////////////
+
+/datum/design/holosign
+ name = "Holographic Sign Projector"
+ desc = "A holograpic projector used to project various warning signs."
+ id = "holosign"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
+ build_path = /obj/item/holosign_creator
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/holosignsec
+ name = "Security Holobarrier Projector"
+ desc = "A holographic projector that creates holographic security barriers."
+ id = "holosignsec"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_GOLD = 1000, MAT_SILVER = 1000)
+ build_path = /obj/item/holosign_creator/security
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/holosignengi
+ name = "Engineering Holobarrier Projector"
+ desc = "A holographic projector that creates holographic engineering barriers."
+ id = "holosignengi"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_GOLD = 1000, MAT_SILVER = 1000)
+ build_path = /obj/item/holosign_creator/engineering
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/holosignatmos
+ name = "ATMOS Holofan Projector"
+ desc = "A holographic projector that creates holographic barriers that prevent changes in atmospheric conditions."
+ id = "holosignatmos"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_GOLD = 1000, MAT_SILVER = 1000)
+ build_path = /obj/item/holosign_creator/atmos
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/forcefield_projector
+ name = "Forcefield Projector"
+ desc = "A device which can project temporary forcefields to seal off an area."
+ id = "forcefield_projector"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2500, MAT_GLASS = 1000)
+ build_path = /obj/item/forcefield_projector
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+
+///////////////////////////////
+////////////Tools//////////////
+///////////////////////////////
+
+/datum/design/exwelder
+ name = "Experimental Welding Tool"
+ desc = "An experimental welder capable of self-fuel generation."
+ id = "exwelder"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_PLASMA = 1500, MAT_URANIUM = 200)
+ build_path = /obj/item/weldingtool/experimental
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/handdrill
+ name = "Hand Drill"
+ desc = "A small electric hand drill with an interchangeable screwdriver and bolt bit"
+ id = "handdrill"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 3500, MAT_SILVER = 1500, MAT_TITANIUM = 2500)
+ build_path = /obj/item/screwdriver/power
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/jawsoflife
+ name = "Jaws of Life"
+ desc = "A small, compact Jaws of Life with an interchangeable pry jaws and cutting jaws"
+ id = "jawsoflife" // added one more requirment since the Jaws of Life are a bit OP
+ build_path = /obj/item/crowbar/power
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 4500, MAT_SILVER = 2500, MAT_TITANIUM = 3500)
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/alienwrench
+ name = "Alien Wrench"
+ desc = "An advanced wrench obtained through Abductor technology."
+ id = "alien_wrench"
+ build_path = /obj/item/wrench/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/alienwirecutters
+ name = "Alien Wirecutters"
+ desc = "Advanced wirecutters obtained through Abductor technology."
+ id = "alien_wirecutters"
+ build_path = /obj/item/wirecutters/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/alienscrewdriver
+ name = "Alien Screwdriver"
+ desc = "An advanced screwdriver obtained through Abductor technology."
+ id = "alien_screwdriver"
+ build_path = /obj/item/screwdriver/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/aliencrowbar
+ name = "Alien Crowbar"
+ desc = "An advanced crowbar obtained through Abductor technology."
+ id = "alien_crowbar"
+ build_path = /obj/item/crowbar/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/alienwelder
+ name = "Alien Welding Tool"
+ desc = "An advanced welding tool obtained through Abductor technology."
+ id = "alien_welder"
+ build_path = /obj/item/weldingtool/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/alienmultitool
+ name = "Alien Multitool"
+ desc = "An advanced multitool obtained through Abductor technology."
+ id = "alien_multitool"
+ build_path = /obj/item/multitool/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/anomaly_neutralizer
+ name = "Anomaly Neutralizer"
+ desc = "An advanced tool capable of instantly neutralizing anomalies, designed to capture the fleeting aberrations created by the engine."
+ id = "anomaly_neutralizer"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_GOLD = 2000, MAT_PLASMA = 5000, MAT_URANIUM = 2000)
+ build_path = /obj/item/anomaly_neutralizer
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/pHmeter
+ name = "pH meter"
+ desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution."
+ id = "pHmeter"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_SILVER = 100, MAT_DIAMOND = 100)
+ build_path = /obj/item/FermiChem/pHmeter
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+/////////////////////////////////////////
+////////////Armour///////////////////////
+/////////////////////////////////////////
+
+/datum/design/reactive_armour
+ name = "Reactive Armour Shell"
+ desc = "An experimental suit of armour capable of utilizing an implanted anomaly core to protect the user."
+ id = "reactive_armour"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_DIAMOND = 5000, MAT_URANIUM = 8000, MAT_SILVER = 4500, MAT_GOLD = 5000)
+ build_path = /obj/item/reactive_armour_shell
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+
+/////////////////////////////////////////
+////////////Meteor///////////////////////
+/////////////////////////////////////////
+
+/datum/design/meteor_defence
+ name = "Meteor Defence"
+ desc = "A blue print of a early model of the Meteor defence turret."
+ id = "meteor_defence"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 50000, MAT_GLASS = 50000, MAT_SILVER = 8500, MAT_GOLD = 8500, MAT_TITANIUM = 7500, MAT_URANIUM = 7500)
+ build_path = /obj/machinery/satellite/meteor_shield/sci
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/meteor_disk
+ name = "Meteor Defence Upgrade Disk"
+ desc = "A disk containing debugging programming to solve and monitor meteors more effectively."
+ id = "meteor_disk"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1500, MAT_GLASS = 1500, MAT_SILVER = 2500, MAT_GOLD = 1000)
+ build_path = /obj/item/disk/meteor
+ category = list("Electronics")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/board/meteor_console
+ name = "Computer Design (Meteor Satellite Console)"
+ desc = "Allows for the construction of circuit boards used to build a new Meteor Satellite monitor console."
+ id = "meteor_console"
+ build_path = /obj/item/circuitboard/computer/sat_control
+ category = list("Computer Boards")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
diff --git a/code/modules/research/research_disk.dm b/code/modules/research/research_disk.dm
index 268e6a1be9..2ec2398d88 100644
--- a/code/modules/research/research_disk.dm
+++ b/code/modules/research/research_disk.dm
@@ -20,3 +20,12 @@
/obj/item/disk/tech_disk/debug/Initialize()
. = ..()
stored_research = new /datum/techweb/admin
+
+/obj/item/disk/tech_disk/illegal
+ name = "Illegal technology disk"
+ desc = "A technology disk containing schematics for syndicate inspired equipment."
+ materials = list()
+
+/obj/item/disk/tech_disk/illegal/Initialize()
+ . = ..()
+ stored_research = new /datum/techweb/syndicate
diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm
index dbfca477d6..cd5a190fd6 100644
--- a/code/modules/research/techweb/_techweb.dm
+++ b/code/modules/research/techweb/_techweb.dm
@@ -41,6 +41,14 @@
research_points[i] = INFINITY
hidden_nodes = list()
+/datum/techweb/syndicate
+ id = "SYNDICATE"
+ organization = "Syndicate"
+
+/datum/techweb/syndicate/New()
+ var/datum/techweb_node/syndicate_basic/Node = new()
+ research_node(Node, TRUE)
+
/datum/techweb/science //Global science techweb for RND consoles.
id = "SCIENCE"
organization = "Nanotrasen"
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 901bcdd92a..3ca7dcbf41 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -115,7 +115,7 @@
display_name = "Advanced Surgery"
description = "When simple medicine doesn't cut it."
prereq_ids = list("adv_biotech")
- design_ids = list("surgery_lobotomy", "surgery_reconstruction")
+ design_ids = list("surgery_lobotomy", "surgery_reconstruction", "organbox")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -203,6 +203,24 @@
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
export_price = 5000
+/datum/techweb_node/basic_meteor_defense
+ id = "basic_meteor_defense"
+ display_name = "Meteor Defense Research"
+ description = "Unlock the potential of the mysterious of why CC decided to not build these around the station themselves."
+ prereq_ids = list("adv_engi", "high_efficiency")
+ design_ids = list("meteor_defence", "meteor_console")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 5000
+
+//datum/techweb_node/adv_meteor_defense
+ //id = "adv_meteor_defense"
+ //display_name = "Meteor Defense Research"
+ //description = "New and improved coding and lock on tech for meteor defence!"
+ //prereq_ids = list("basic_meteor_defense", "adv_datatheory", "emp_adv")
+ //design_ids = list("meteor_disk")
+ //research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
+ //export_price = 5000
+
/////////////////////////Bluespace tech/////////////////////////
/datum/techweb_node/bluespace_basic //Bluespace-memery
id = "bluespace_basic"
diff --git a/code/modules/spells/spell_types/rod_form.dm b/code/modules/spells/spell_types/rod_form.dm
index 06f38b8346..5a532db7ac 100644
--- a/code/modules/spells/spell_types/rod_form.dm
+++ b/code/modules/spells/spell_types/rod_form.dm
@@ -28,7 +28,6 @@
/obj/effect/immovablerod/wizard
var/max_distance = 13
var/damage_bonus = 0
- var/mob/living/wizard
var/turf/start_turf
notify = FALSE
diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm
index 44746e595e..98f5534d06 100644
--- a/code/modules/station_goals/shield.dm
+++ b/code/modules/station_goals/shield.dm
@@ -134,6 +134,31 @@
speed_process = TRUE
var/kill_range = 14
+/obj/machinery/satellite/meteor_shield/sci
+ name = "\improper Meteor Shield Satellite"
+ desc = "A station made meteor point-defense satellite."
+ mode = "M-SHIELD"
+
+/obj/item/disk/meteor
+ name = "Meteor Shield Upgrade Disk"
+ desc = "A floppy disk that allows meteor shields to fire at longer ranges and lowers meteor drawing from gravitational fields.."
+
+/obj/machinery/satellite/meteor_shield/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/disk/meteor))
+ to_chat(user, "The disk uploads better tracking and rang modification software.")
+ kill_range = 17
+ else
+ return ..()
+
+/obj/machinery/satellite/meteor_shield/sci/toggle(user)
+ if(!..(user))
+ return FALSE
+ if(obj_flags & EMAGGED)
+ if(active)
+ change_meteor_chance(8)
+ else
+ change_meteor_chance(0.125)
+
/obj/machinery/satellite/meteor_shield/proc/space_los(meteor)
for(var/turf/T in getline(src,meteor))
if(!isspaceturf(T))
@@ -177,4 +202,4 @@
obj_flags |= EMAGGED
to_chat(user, "You access the satellite's debug mode, increasing the chance of meteor strikes.")
if(active)
- change_meteor_chance(2)
+ change_meteor_chance(4)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index bcf1861cde..63808345c5 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1262,6 +1262,23 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes
item = /obj/item/codespeak_manual/unlimited
cost = 3
+/datum/uplink_item/device_tools/compressionkit
+ name = "Bluespace Compression Kit"
+ desc = "A modified version of a BSRPED that can be used to reduce the size of most items while retaining their original functions! \
+ Does not work on storage items. \
+ Recharge using bluespace crystals. \
+ Comes with 5 charges."
+ item = /obj/item/compressionkit
+ cost = 5
+
+/datum/uplink_item/device_tools/syndie_glue
+ name = "Glue"
+ desc = "A cheap bottle of one use syndicate brand super glue. \
+ Use on any item to make it undroppable. \
+ Be careful not to glue an item you're already holding!"
+ item = /obj/item/syndie_glue
+ cost = 2
+
// Implants
/datum/uplink_item/implants
category = "Implants"
@@ -1605,6 +1622,12 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes
cost = 20
cant_discount = TRUE
+/datum/uplink_item/badass/durasteel_toolbox
+ name = "Durasteel Toolbox"
+ desc = "A very high impact toolbox. Excels at destroying stationary structures."
+ item = /obj/item/storage/toolbox/durasteel
+ cost = 2 //18 damage on mobs, 50 on objects, 4.5 stam/hit
+
/datum/uplink_item/badass/costumes
surplus = 0
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm
index e1039a00ca..bdb2d2c113 100644
--- a/code/modules/vending/medical.dm
+++ b/code/modules/vending/medical.dm
@@ -23,7 +23,8 @@
/obj/item/reagent_containers/glass/bottle/salglu_solution = 3,
/obj/item/reagent_containers/glass/bottle/morphine = 4,
/obj/item/reagent_containers/glass/bottle/toxin = 3,
- /obj/item/reagent_containers/syringe/antiviral = 6)
+ /obj/item/reagent_containers/syringe/antiviral = 6,
+ /obj/item/storage/briefcase/medical = 2)
contraband = list(/obj/item/reagent_containers/pill/tox = 3,
/obj/item/reagent_containers/pill/morphine = 4,
/obj/item/reagent_containers/pill/charcoal = 6)
@@ -32,7 +33,8 @@
/obj/item/storage/pill_bottle/psicodine = 2,
/obj/item/reagent_containers/hypospray/medipen = 3,
/obj/item/storage/belt/medical = 3,
- /obj/item/wrench/medical = 1)
+ /obj/item/wrench/medical = 1,
+ /obj/item/storage/briefcase/medical = 2)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/medical
diff --git a/config/spaceRuinBlacklist.txt b/config/spaceRuinBlacklist.txt
index 628e08f8f1..6e74857e66 100644
--- a/config/spaceRuinBlacklist.txt
+++ b/config/spaceRuinBlacklist.txt
@@ -45,3 +45,6 @@
#_maps/RandomRuins/SpaceRuins/way_home.dmm
#_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm
#_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm
+#_maps/RandomRuins/SpaceRuins/augmentationfacility.dmm
+#_maps/RandomRuins/SpaceRuins/bigape.dmm
+#_maps/RandomRuins/SpaceRuins/arcade.dmm
diff --git a/html/changelogs/AutoChangeLog-pr-8416.yml b/html/changelogs/AutoChangeLog-pr-8416.yml
new file mode 100644
index 0000000000..34bac362be
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8416.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "adds the sec jetpack to sec hardsuit storge"
diff --git a/html/changelogs/AutoChangeLog-pr-8479.yml b/html/changelogs/AutoChangeLog-pr-8479.yml
new file mode 100644
index 0000000000..b6c8340527
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8479.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - balance: "Buffed krav maga leg sweep stun and stamina damage. On the other hand, it's now unable to be used on already lying targets."
diff --git a/html/changelogs/AutoChangeLog-pr-8497.yml b/html/changelogs/AutoChangeLog-pr-8497.yml
new file mode 100644
index 0000000000..4c42899313
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8497.yml
@@ -0,0 +1,5 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - rscadd: "Adds clockwork reflectors, a fragile anti-laser reflection shield object that can be constructed for 10 brass sheets. Upon firing on the object in the direction where it is shielded, it ricochets the bullet off of it relative to the shooting angle."
+ - tweak: "Renames some windows in the build menu for consistency."
diff --git a/html/changelogs/AutoChangeLog-pr-8505.yml b/html/changelogs/AutoChangeLog-pr-8505.yml
new file mode 100644
index 0000000000..57d6399680
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8505.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - balance: "Clockwork Cult walls can no longer be deconstructed by RCDs when heated."
diff --git a/html/changelogs/AutoChangeLog-pr-8561.yml b/html/changelogs/AutoChangeLog-pr-8561.yml
new file mode 100644
index 0000000000..dca2bff2ff
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8561.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (Original PR by JJRcop)"
+delete-after: True
+changes:
+ - rscadd: "Ports in more emojis, including : flushed :"
diff --git a/html/changelogs/AutoChangeLog-pr-8565.yml b/html/changelogs/AutoChangeLog-pr-8565.yml
new file mode 100644
index 0000000000..91faa4d8b6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8565.yml
@@ -0,0 +1,4 @@
+author: "Skully)"
+delete-after: True
+changes:
+ - rscadd: "Nudity Permit, a completely invisible uniform that still has pockets and such, to loadout options. It is more or less a direct port from the RP server."
diff --git a/html/changelogs/AutoChangeLog-pr-8570.yml b/html/changelogs/AutoChangeLog-pr-8570.yml
new file mode 100644
index 0000000000..787b486685
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8570.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "origami"
diff --git a/html/changelogs/AutoChangeLog-pr-8578.yml b/html/changelogs/AutoChangeLog-pr-8578.yml
new file mode 100644
index 0000000000..39ded33f2d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8578.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - spellcheck: "Properly rewords the extinguisher's instructions on how to empty it on the floor since it was changed to be a screwdriver action instead of Alt Click a while ago."
diff --git a/html/changelogs/AutoChangeLog-pr-8579.yml b/html/changelogs/AutoChangeLog-pr-8579.yml
new file mode 100644
index 0000000000..56ecea119f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8579.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "gang tower shield"
+ - tweak: "costs of boots"
diff --git a/html/changelogs/AutoChangeLog-pr-8584.yml b/html/changelogs/AutoChangeLog-pr-8584.yml
new file mode 100644
index 0000000000..2621812d64
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8584.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "organ box"
diff --git a/html/changelogs/AutoChangeLog-pr-8591.yml b/html/changelogs/AutoChangeLog-pr-8591.yml
new file mode 100644
index 0000000000..09eb449899
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8591.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (Original PR by Vile Beggar)"
+delete-after: True
+changes:
+ - rscadd: "Warden now has an added drill hat in his locker. You can change the loudness setting of it by using a screwdriver on it. Use wirecutters on it for a surprise."
diff --git a/html/changelogs/AutoChangeLog-pr-8605.yml b/html/changelogs/AutoChangeLog-pr-8605.yml
new file mode 100644
index 0000000000..c6a601f1ca
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8605.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Medical breifcaseses"
diff --git a/html/changelogs/AutoChangeLog-pr-8611.yml b/html/changelogs/AutoChangeLog-pr-8611.yml
new file mode 100644
index 0000000000..8176d10a84
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8611.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Added digitigrade socks of all known ones anyway."
diff --git a/html/changelogs/AutoChangeLog-pr-8614.yml b/html/changelogs/AutoChangeLog-pr-8614.yml
new file mode 100644
index 0000000000..e9473181fb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8614.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PR by SpaceManiac)"
+delete-after: True
+changes:
+ - bugfix: "Disassembling a chem dispenser for the first time will no longer always yield a fully-charged cell."
diff --git a/html/changelogs/AutoChangeLog-pr-8618.yml b/html/changelogs/AutoChangeLog-pr-8618.yml
new file mode 100644
index 0000000000..77ba2439a1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8618.yml
@@ -0,0 +1,7 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "New cargo crate for tech-slugs!"
+ - rscadd: "Ammo to each fitting crate"
+ - bugfix: "Cat-code"
+ - spellcheck: "fixed a few typos - Again my bad"
diff --git a/html/changelogs/AutoChangeLog-pr-8623.yml b/html/changelogs/AutoChangeLog-pr-8623.yml
new file mode 100644
index 0000000000..63f51b18eb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8623.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - rscadd: "The RD can now suplex a immovable rod. Good fucking luck."
diff --git a/html/changelogs/AutoChangeLog-pr-8633.yml b/html/changelogs/AutoChangeLog-pr-8633.yml
new file mode 100644
index 0000000000..3cbc9a78aa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8633.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - rscadd: "You can now examine pumps filters and mixers to see if you can use CTRL and Alt click on them."
diff --git a/html/changelogs/AutoChangeLog-pr-8634.yml b/html/changelogs/AutoChangeLog-pr-8634.yml
new file mode 100644
index 0000000000..d351579640
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8634.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes power cells being unable to be rigged. Also prevents them from starting processing on init if they don't self recharge."
+ - bugfix: "Fixes many, little or otherwise, issues with the stunbaton status refactor."
diff --git a/html/changelogs/AutoChangeLog-pr-8639.yml b/html/changelogs/AutoChangeLog-pr-8639.yml
new file mode 100644
index 0000000000..f2f24d33ad
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8639.yml
@@ -0,0 +1,10 @@
+author: "Useroth"
+delete-after: True
+changes:
+ - tweak: "Makes the netting much less clunky. If there's only one target you can net while you press the
+button, it will just net that target instead of bringing up a list of mobs."
+ - tweak: "Energy nets now revive and fully heal capturees (even dead ones, after calculating points). If someone's got a scan and wants to get cloned, they can always kill themselves still."
+ - tweak: "Capture points are added on capture, rather than round-end, so it no longer matters whether your captures kill themselves in the holding facility or not."
+ - balance: "Makes the nets a bit more sturdy. (previously it took mere two welder hits to break one)"
+ - balance: "Makes stungloves actually stun people (currently comparably with stunbatons, adjustable). Because electrocute_act(25, H) did fuck all, stunwise, and on top of that, people in insulated gloves were completely unaffected."
+ - balance: "Reduced the stunglove electrocute_act value to 15 due to above. Could possibly be lowered further."
diff --git a/html/changelogs/AutoChangeLog-pr-8640.yml b/html/changelogs/AutoChangeLog-pr-8640.yml
new file mode 100644
index 0000000000..b06feb4613
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8640.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "baklava"
diff --git a/html/changelogs/AutoChangeLog-pr-8643.yml b/html/changelogs/AutoChangeLog-pr-8643.yml
new file mode 100644
index 0000000000..b172071e2e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8643.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "The sacrificial target icon will now display onto the cult objective ui alert once again."
diff --git a/html/changelogs/AutoChangeLog-pr-8645.yml b/html/changelogs/AutoChangeLog-pr-8645.yml
new file mode 100644
index 0000000000..c299dcbbb5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8645.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Stopping borgs from sprinting into negative cell charge."
diff --git a/html/changelogs/AutoChangeLog-pr-8648.yml b/html/changelogs/AutoChangeLog-pr-8648.yml
new file mode 100644
index 0000000000..8d0f9d20c8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8648.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - balance: "makes uplink kits more usefull for the risk"
diff --git a/html/changelogs/AutoChangeLog-pr-8652.yml b/html/changelogs/AutoChangeLog-pr-8652.yml
new file mode 100644
index 0000000000..b788c5785c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8652.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (Original PR by Dennok)"
+delete-after: True
+changes:
+ - bugfix: "Now areas_in_z get areas spawned by templates and blueprints."
diff --git a/icons/emoji.dmi b/icons/emoji.dmi
index f0286dd33c..128a3b243c 100644
Binary files a/icons/emoji.dmi and b/icons/emoji.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 0ef4996b07..65b5733ffe 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/custom_w.dmi b/icons/mob/custom_w.dmi
index dcb36e7b47..22f5e85977 100644
Binary files a/icons/mob/custom_w.dmi and b/icons/mob/custom_w.dmi differ
diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi
index 0b63685668..cf16eb9e32 100644
Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ
diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi
index 56cfdf468b..1948bb605c 100644
Binary files a/icons/obj/clockwork_objects.dmi and b/icons/obj/clockwork_objects.dmi differ
diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi
index 9faaf8f81a..f9660c6b38 100644
Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ
diff --git a/icons/obj/flora/pinetrees.dmi b/icons/obj/flora/pinetrees.dmi
index a68e0388b0..3ee4a89f07 100644
Binary files a/icons/obj/flora/pinetrees.dmi and b/icons/obj/flora/pinetrees.dmi differ
diff --git a/icons/obj/food/piecake.dmi b/icons/obj/food/piecake.dmi
index 16bb9bf448..57dda21757 100644
Binary files a/icons/obj/food/piecake.dmi and b/icons/obj/food/piecake.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index fbb55434d1..140f6a4d9e 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index 8f6b844a23..cfb36bb3ae 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/modular_citadel/code/game/gamemodes/gangs/gang_items.dm b/modular_citadel/code/game/gamemodes/gangs/gang_items.dm
index 0f16b6462b..2e9ca4dcc0 100644
--- a/modular_citadel/code/game/gamemodes/gangs/gang_items.dm
+++ b/modular_citadel/code/game/gamemodes/gangs/gang_items.dm
@@ -83,14 +83,12 @@
return
return TRUE
-
/datum/gang_item/clothing/hat
name = "Pimp Hat"
id = "hat"
cost = 16
item_path = /obj/item/clothing/head/collectable/petehat/gang
-
/obj/item/clothing/head/collectable/petehat/gang
name = "pimpin' hat"
desc = "The undisputed king of style."
@@ -109,7 +107,7 @@
/datum/gang_item/clothing/shoes
name = "Bling Boots"
id = "boots"
- cost = 22
+ cost = 20
item_path = /obj/item/clothing/shoes/gang
/obj/item/clothing/shoes/gang
@@ -258,7 +256,6 @@ datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang m
/datum/gang_item/equipment
category = "Purchase Equipment:"
-
/datum/gang_item/equipment/spraycan
name = "Territory Spraycan"
id = "spraycan"
@@ -275,7 +272,6 @@ datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang m
cost = 3
item_path = /obj/item/sharpener
-
/datum/gang_item/equipment/emp
name = "EMP Grenade"
id = "EMP"
@@ -329,6 +325,12 @@ datum/gang_item/equipment/shield
cost = 25
item_path = /obj/item/shield/riot
+datum/gang_item/equipment/gangsheild
+ name = "Tower Shield"
+ id = "metal"
+ cost = 45 //High block of melee and even higher for bullets
+ item_path = /obj/item/shield/riot/tower
+
/datum/gang_item/equipment/pen
name = "Recruitment Pen"
id = "pen"
@@ -352,7 +354,6 @@ datum/gang_item/equipment/shield
return "(GET ONE FREE)"
return ..()
-
/datum/gang_item/equipment/gangtool
id = "gangtool"
cost = 5
@@ -413,4 +414,4 @@ datum/gang_item/equipment/shield
/datum/gang_item/equipment/dominator/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool)
new item_path(user.loc)
- to_chat(user, spawn_msg)
\ No newline at end of file
+ to_chat(user, spawn_msg)
diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
index 0cf698392c..0b86d58208 100644
--- a/modular_citadel/code/modules/arousal/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -45,6 +45,7 @@
linked_organ = (owner.getorganslot("penis"))
if(linked_organ)
linked_organ.linked_organ = src
+ size = linked_organ.size
else
if(linked_organ)
@@ -57,20 +58,22 @@
return TRUE
/obj/item/organ/genital/testicles/update_appearance()
- if(owner)
- if(size == 0)
- size_name = "nonexistant"
- if(size == 1)
+ switch(size)
+ if(0.1 to 1)
size_name = "average"
- if(size == 2)
+ if(1.1 to 2)
size_name = "enlarged"
- if(size >= 3)
+ if(2.1 to INFINITY)
size_name = "engorged"
-
- if(!internal)
- desc = "You see an [size_name] pair of testicles dangling."
else
- desc = "They don't have any testicles you can see."
+ size_name = "nonexistant"
+
+ if(!internal)
+ desc = "You see an [size_name] pair of testicles."
+ else
+ desc = "They don't have any testicles you can see."
+
+ if(owner)
var/string
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/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 7dfaa4a386..d8168d01a6 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -391,4 +391,16 @@ datum/gear/darksabresheath
name = "Fritz Plushie"
category = SLOT_IN_BACKPACK
path = /obj/item/toy/plush/mammal/dog/fritz
- ckeywhitelist = list("analwerewolf")
\ No newline at end of file
+ ckeywhitelist = list("analwerewolf")
+
+/datum/gear/kimono
+ name = "Kimono"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/kimono
+ ckeywhitelist = list("sfox63")
+
+/datum/gear/commjacket
+ name = "Dusty Commisar's Cloak"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/commjacket
+ ckeywhitelist = list("sadisticbatter")
diff --git a/modular_citadel/code/modules/client/loadout/_medical.dm b/modular_citadel/code/modules/client/loadout/_medical.dm
index a0d0e3f2b2..eed1ad32a1 100644
--- a/modular_citadel/code/modules/client/loadout/_medical.dm
+++ b/modular_citadel/code/modules/client/loadout/_medical.dm
@@ -1,5 +1,32 @@
+/datum/gear/stethoscope
+ name = "Medical Briefcase"
+ category = SLOT_HANDS
+ path = /obj/item/storage/briefcase/medical
+ restricted_roles = list("Medical Doctor", "Chief Medical Officer")
+
/datum/gear/stethoscope
name = "Stethoscope"
category = SLOT_NECK
path = /obj/item/clothing/neck/stethoscope
restricted_roles = list("Medical Doctor", "Chief Medical Officer")
+
+/datum/gear/bluescrubs
+ name = "Blue Scrubs"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/rank/medical/blue
+ restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Geneticist", "Chemist", "Virologist")
+ restricted_desc = "Medical"
+
+/datum/gear/greenscrubs
+ name = "Green Scrubs"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/rank/medical/green
+ restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Geneticist", "Chemist", "Virologist")
+ restricted_desc = "Medical"
+
+/datum/gear/purplescrubs
+ name = "Purple Scrubs"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/rank/medical/purple
+ restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Geneticist", "Chemist", "Virologist")
+ restricted_desc = "Medical"
diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm
index bd26f44482..2d65f093bb 100644
--- a/modular_citadel/code/modules/client/loadout/head.dm
+++ b/modular_citadel/code/modules/client/loadout/head.dm
@@ -54,6 +54,11 @@
path = /obj/item/clothing/head/flakhelm
cost = 2
+/datum/gear/bunnyears
+ name = "Bunny Ears"
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/rabbitears
+
//trek fancy Hats!
/datum/gear/trekcap
name = "Federation Officer's Cap (White)"
diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm
index 07309ffd0d..4172230dbf 100644
--- a/modular_citadel/code/modules/client/loadout/uniform.dm
+++ b/modular_citadel/code/modules/client/loadout/uniform.dm
@@ -93,6 +93,11 @@
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/schoolgirl/orange
+/datum/gear/stripeddress
+ name = "Striped Dress"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/stripeddress
+
/datum/gear/kilt
name = "Kilt"
category = SLOT_W_UNIFORM
@@ -303,3 +308,9 @@
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")
+
+//memes
+/datum/gear/nudepermit
+ name = "Nudity Permit"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/permit
\ No newline at end of file
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index e1b1110cf8..0338a4f48e 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -484,4 +484,24 @@
icon_state = "redgoldjacket"
item_state = "redgoldjacket"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- mutantrace_variation = NO_MUTANTRACE_VARIATION
\ No newline at end of file
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
+
+/obj/item/clothing/suit/kimono
+ name = "Blue Kimono"
+ desc = "A traditional kimono, this one is blue with purple flowers."
+ icon_state = "kimono"
+ item_state = "kimono"
+ icon = 'icons/obj/custom.dmi'
+ alternate_worn_icon = 'icons/mob/custom_w.dmi'
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
+
+/obj/item/clothing/suit/commjacket
+ name = "Dusty Commisar's Cloak"
+ desc = "An Imperial Commisar's Coat, straight from the frontline of battle, filled with dirt, bulletholes, and dozens of little pockets. Alongside a curious golden eagle sitting on it's left breast, the marking '200th Venoland' is clearly visible on the inner workings of the coat. It certainly holds an imposing flair, however."
+ icon_state = "commjacket"
+ item_state = "commjacket"
+ icon = 'icons/obj/custom.dmi'
+ alternate_worn_icon = 'icons/mob/custom_w.dmi'
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
+
+
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
index 598690590c..c7a2447be6 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
@@ -4,20 +4,24 @@
/mob/living/silicon/robot/Move(NewLoc, direct)
. = ..()
if(. && sprinting && !(movement_type & FLYING) && canmove && !resting)
- if(istype(cell))
- cell.charge -= 25
+ if(!(cell?.use(25)))
+ togglesprint(TRUE)
/mob/living/silicon/robot/movement_delay()
. = ..()
if(!resting && !sprinting)
. += 1
-/mob/living/silicon/robot/proc/togglesprint() //Basically a copypaste of the proc from /mob/living/carbon/human
- sprinting = !sprinting
+/mob/living/silicon/robot/proc/togglesprint(shutdown = FALSE) //Basically a copypaste of the proc from /mob/living/carbon/human
+ if(!shutdown && (!cell || cell.charge < 25))
+ return FALSE
+ sprinting = shutdown ? FALSE : !sprinting
if(!resting && canmove)
if(sprinting)
playsound_local(src, 'modular_citadel/sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
else
+ if(shutdown)
+ playsound_local(src, 'sound/effects/light_flicker.ogg', 50, FALSE, pressure_affected = FALSE)
playsound_local(src, 'modular_citadel/sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
if(hud_used && hud_used.static_inventory)
for(var/obj/screen/sprintbutton/selector in hud_used.static_inventory)
diff --git a/modular_citadel/icons/mob/clothing/trek_item_icon.dmi b/modular_citadel/icons/mob/clothing/trek_item_icon.dmi
deleted file mode 100644
index ed3286615b..0000000000
Binary files a/modular_citadel/icons/mob/clothing/trek_item_icon.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/uniform_digi.dmi b/modular_citadel/icons/mob/uniform_digi.dmi
index 9513f82c9c..5ff291f400 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/clothing/trek_item_icon.dmi b/modular_citadel/icons/obj/clothing/trek_item_icon.dmi
index 86afe16b03..ed3286615b 100644
Binary files a/modular_citadel/icons/obj/clothing/trek_item_icon.dmi and b/modular_citadel/icons/obj/clothing/trek_item_icon.dmi differ
diff --git a/strings/canadian_replacement.json b/strings/canadian_replacement.json
new file mode 100644
index 0000000000..1430ae8793
--- /dev/null
+++ b/strings/canadian_replacement.json
@@ -0,0 +1,45 @@
+{
+
+ "canadian": {
+ "toilet": "washroom",
+ "bathroom": "washroom",
+ "restroom": "washroom",
+ "coffee": "doubledouble",
+ "backpack": "knapsack",
+ "rucksack": "knapsack",
+ "candybar": "chocolate bar",
+ "about": "aboot",
+ "friend": "buddy",
+ "pal": "buddy",
+ "donut": "doughnut",
+ "faucet": "tap",
+ "give": "give'r",
+ "bar": "boozecan",
+ "leave": "leave'r",
+ "scruffle": "kerfuffle",
+ "couch": "chesterfield",
+ "sofa": "chesterfield",
+ "alcohol": "mickey",
+ "shoes": "runners",
+ "cigarrete": "dart",
+ "cig": "dart",
+ "color": "colour",
+ "armor": "armour",
+ "armory": "armoury",
+ "defense": "defence",
+ "honor": "honour",
+ "labor": "labour",
+ "humor": "humour",
+ "humorous": "humourous",
+ "gray": "grey",
+ "labeled": "labelled",
+ "luster": "lustre",
+ "inch": "centimetre",
+ "yard": "metre",
+ "tumor": "tumour",
+ "mile": "kilometre",
+ "pound": "kilogram"
+ }
+
+
+}
diff --git a/tgstation.dme b/tgstation.dme
index 026d65d7ec..db2e7f77e7 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -838,12 +838,14 @@
#include "code\game\objects\items\devices\beacon.dm"
#include "code\game\objects\items\devices\camera_bug.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
+#include "code\game\objects\items\devices\compressionkit.dm"
#include "code\game\objects\items\devices\dogborg_sleeper.dm"
#include "code\game\objects\items\devices\doorCharge.dm"
#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm"
#include "code\game\objects\items\devices\flashlight.dm"
#include "code\game\objects\items\devices\forcefieldprojector.dm"
#include "code\game\objects\items\devices\geiger_counter.dm"
+#include "code\game\objects\items\devices\glue.dm"
#include "code\game\objects\items\devices\gps.dm"
#include "code\game\objects\items\devices\instruments.dm"
#include "code\game\objects\items\devices\laserpointer.dm"
@@ -1236,6 +1238,7 @@
#include "code\modules\antagonists\clockcult\clock_structures\mania_motor.dm"
#include "code\modules\antagonists\clockcult\clock_structures\ocular_warden.dm"
#include "code\modules\antagonists\clockcult\clock_structures\ratvar_the_clockwork_justicar.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\reflector.dm"
#include "code\modules\antagonists\clockcult\clock_structures\stargazer.dm"
#include "code\modules\antagonists\clockcult\clock_structures\taunting_trail.dm"
#include "code\modules\antagonists\clockcult\clock_structures\wall_gear.dm"