diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
index 99f7f19621..c64a73eada 100644
--- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
@@ -509,7 +509,9 @@
/obj/machinery/button/door{
id = "a3";
name = "privacy button";
- pixel_y = -24
+ normaldoorcontrol = 1;
+ pixel_y = -24;
+ specialfunctions = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/wood,
@@ -557,7 +559,9 @@
/obj/machinery/button/door{
id = "a4";
name = "privacy button";
- pixel_y = -24
+ normaldoorcontrol = 1;
+ pixel_y = -24;
+ specialfunctions = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/wood,
@@ -605,7 +609,9 @@
/obj/machinery/button/door{
id = "a5";
name = "privacy button";
- pixel_y = -24
+ normaldoorcontrol = 1;
+ pixel_y = -24;
+ specialfunctions = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/wood,
@@ -653,7 +659,9 @@
/obj/machinery/button/door{
id = "a6";
name = "privacy button";
- pixel_y = -24
+ normaldoorcontrol = 1;
+ pixel_y = -24;
+ specialfunctions = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/wood,
@@ -1097,7 +1105,9 @@
/obj/machinery/button/door{
id = "a2";
name = "privacy button";
- pixel_y = 24
+ normaldoorcontrol = 1;
+ pixel_y = 24;
+ specialfunctions = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/wood,
@@ -1159,7 +1169,9 @@
/obj/machinery/button/door{
id = "a1";
name = "privacy button";
- pixel_y = 24
+ normaldoorcontrol = 1;
+ pixel_y = 24;
+ specialfunctions = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/wood,
@@ -1807,7 +1819,9 @@
/area/ruin/space/has_grav/hotel/bar)
"fE" = (
/obj/machinery/vending/boozeomat{
- req_access_txt = "200"
+ extended_inventory = 1;
+ req_access_txt = "200";
+ scan_id = 0
},
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
@@ -4496,7 +4510,6 @@
/turf/closed/wall,
/area/ruin/space/has_grav/hotel/custodial)
"me" = (
-/mob/living/simple_animal/bot/cleanbot,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -4507,6 +4520,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/mob/living/simple_animal/bot/cleanbot,
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/hotel/custodial)
"mf" = (
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index de28ff59fa..c764adca16 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -36664,14 +36664,11 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bHT" = (
-/obj/machinery/door/poddoor/preopen{
- id = "medpriv1";
- name = "privacy door"
- },
/obj/effect/spawner/structure/window,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/machinery/door/firedoor,
/turf/open/floor/plating,
/area/medical/medbay/central)
"bHU" = (
@@ -37987,22 +37984,23 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"bKM" = (
-/obj/machinery/vending/wallmed{
- pixel_y = 28
- },
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
},
+/obj/machinery/airalarm{
+ pixel_y = 24
+ },
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bKN" = (
/obj/machinery/door/airlock/medical{
- name = "Patient Room 2";
+ name = "Apothecary";
req_access_txt = "5"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bKO" = (
@@ -38456,24 +38454,17 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"bLU" = (
-/obj/structure/table,
-/obj/item/folder/white,
-/obj/item/clothing/neck/stethoscope,
/obj/machinery/light/small{
dir = 8
},
+/obj/machinery/chem_dispenser,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bLV" = (
-/obj/structure/closet/secure_closet/personal/patient,
-/obj/machinery/button/door{
- id = "medpriv1";
- name = "Privacy Shutters";
- pixel_y = -25
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/machinery/chem_heater,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bLW" = (
@@ -56742,6 +56733,16 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel,
/area/science/circuit)
+"fTg" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/firealarm{
+ dir = 2;
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"gbq" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -57499,6 +57500,10 @@
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/maintenance/bar)
+"tRe" = (
+/obj/machinery/chem_master,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"tRF" = (
/obj/machinery/light/small{
dir = 8
@@ -95728,8 +95733,8 @@ bof
bof
bof
bJE
-bof
-bof
+bJE
+bJE
bNd
bIJ
bPo
@@ -95985,7 +95990,7 @@ bof
bGT
bIo
bof
-bIo
+tRe
bLU
bNd
bII
@@ -96499,7 +96504,7 @@ bof
bGU
bqQ
bof
-bCR
+fTg
bLV
bNd
bOm
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index bd159e4e9c..c8e551b9fe 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -101814,6 +101814,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 1
},
+/obj/effect/landmark/start/medical_doctor,
/turf/open/floor/plasteel/white,
/area/medical/genetics/cloning)
"dpo" = (
@@ -126296,6 +126297,20 @@
/obj/machinery/atmospherics/pipe/simple/general/visible,
/turf/closed/wall/r_wall,
/area/science/mixing)
+"eLw" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/chem_dispenser,
+/turf/open/floor/plasteel/dark,
+/area/medical/medbay/central)
"eMD" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
@@ -126355,6 +126370,22 @@
},
/turf/open/floor/plasteel/white,
/area/science/misc_lab)
+"fhE" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/medical{
+ name = "Apothecary"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/medical/medbay/central)
"fno" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -126584,6 +126615,13 @@
/obj/item/restraints/handcuffs/fake,
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
+"hSf" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/medical/medbay/central)
"iaF" = (
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -126593,6 +126631,18 @@
/obj/item/reagent_containers/glass/beaker,
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
+"iwL" = (
+/obj/machinery/status_display{
+ pixel_x = 32
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"ixL" = (
/obj/structure/sign/warning/vacuum{
pixel_x = 32
@@ -126743,6 +126793,23 @@
},
/turf/open/floor/plasteel,
/area/medical/morgue)
+"jOE" = (
+/obj/machinery/newscaster{
+ pixel_x = 32
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/chem_master,
+/turf/open/floor/plasteel/dark,
+/area/medical/medbay/central)
"jRy" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -126853,6 +126920,22 @@
},
/turf/open/floor/engine,
/area/science/mixing)
+"lzF" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/firealarm{
+ pixel_y = 26
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/medbay/central)
"lEl" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -126909,6 +126992,23 @@
},
/turf/open/floor/plating,
/area/construction/mining/aux_base)
+"lTx" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/table,
+/obj/machinery/airalarm{
+ pixel_y = 22
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/medbay/central)
"lXF" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -127259,6 +127359,16 @@
dir = 10
},
/area/science/misc_lab)
+"tRT" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/chem_heater,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"upk" = (
/obj/machinery/door/airlock/public/glass{
name = "Holodeck Access"
@@ -174190,9 +174300,9 @@ dfL
dCM
dEb
cPy
-dfL
-dCM
-dEb
+cNz
+fhE
+hSf
cPy
dhs
dMS
@@ -174447,7 +174557,7 @@ dBo
cSF
dEc
cPy
-dBo
+lzF
cSF
dEc
cPy
@@ -174961,8 +175071,8 @@ dBq
dCN
dEe
cPy
-dBq
-dCN
+lTx
+cSK
dEe
cPy
cMg
@@ -175218,9 +175328,9 @@ dBr
dCO
dEf
cPy
-dBr
+eLw
dCO
-dEf
+tRT
cPy
dLo
dMW
@@ -175475,9 +175585,9 @@ dBs
dCP
dEg
cPy
-dBs
+jOE
dCP
-dEg
+iwL
cPy
dLp
dMV
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 228700580a..78ffa3881c 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -64367,6 +64367,7 @@
/obj/structure/cable/yellow{
icon_state = "1-8"
},
+/obj/effect/landmark/start/medical_doctor,
/turf/open/floor/plasteel/white,
/area/medical/patients_rooms/room_a)
"cum" = (
@@ -65463,24 +65464,9 @@
/turf/open/floor/plating,
/area/maintenance/port/aft)
"cwo" = (
-/obj/structure/table,
-/obj/item/folder/white{
- pixel_x = 4;
- pixel_y = -3
- },
-/obj/item/clothing/neck/stethoscope,
/obj/machinery/light/small{
dir = 8
},
-/obj/machinery/power/apc{
- dir = 8;
- name = "Patient Room B APC";
- areastring = "/area/medical/patients_rooms/room_b";
- pixel_x = -26
- },
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
},
@@ -65493,31 +65479,24 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/chem_dispenser{
+ layer = 2.7
+ },
/turf/open/floor/plasteel/white,
-/area/medical/patients_rooms/room_b)
+/area/medical/medbay/aft)
"cwp" = (
/obj/structure/chair/office/light{
dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/effect/landmark/start/medical_doctor,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/machinery/vending/wallmed{
- pixel_y = 28
+/obj/machinery/airalarm{
+ pixel_y = 23
},
/turf/open/floor/plasteel/white,
-/area/medical/patients_rooms/room_b)
+/area/medical/medbay/aft)
"cwq" = (
-/obj/structure/closet/secure_closet/personal/patient,
-/obj/machinery/button/door{
- id = "isolb";
- name = "Privacy Shutters";
- pixel_y = 25
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
@@ -65525,19 +65504,19 @@
/obj/effect/turf_decal/tile/blue{
dir = 4
},
+/obj/machinery/chem_heater{
+ pixel_x = 4
+ },
/turf/open/floor/plasteel/white,
-/area/medical/patients_rooms/room_b)
+/area/medical/medbay/aft)
"cwr" = (
-/obj/effect/spawner/structure/window,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/machinery/door/poddoor/preopen{
- id = "isolb";
- name = "privacy shutters"
- },
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/firedoor,
/turf/open/floor/plating,
-/area/medical/patients_rooms/room_b)
+/area/medical/medbay/aft)
"cws" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -65962,65 +65941,53 @@
/turf/open/floor/plating,
/area/maintenance/port/aft)
"cxe" = (
-/obj/structure/bed,
-/obj/item/bedsheet/medical,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
},
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/chem_master,
/turf/open/floor/plasteel/white,
-/area/medical/patients_rooms/room_b)
+/area/medical/medbay/aft)
"cxf" = (
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
},
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -24
+ },
/turf/open/floor/plasteel/white,
-/area/medical/patients_rooms/room_b)
+/area/medical/medbay/aft)
"cxg" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/medical/patients_rooms/room_b)
+/area/medical/medbay/aft)
"cxh" = (
-/obj/machinery/door/airlock/medical{
- name = "Patient Room B";
- req_access_txt = "5"
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/machinery/door/airlock/medical/glass{
+ name = "Apothecary";
+ req_access_txt = "5"
+ },
+/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/white,
-/area/medical/patients_rooms/room_b)
+/area/medical/medbay/aft)
"cxi" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
/obj/effect/turf_decal/tile/blue{
dir = 1
},
@@ -66033,9 +66000,6 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
/turf/open/floor/plasteel/white,
/area/medical/medbay/aft)
"cxk" = (
@@ -105762,8 +105726,8 @@ css
dux
dux
dux
-dux
-dux
+cxU
+cxU
cxU
cyO
czP
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 15e8048926..7cab82149d 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -79,6 +79,8 @@
#define ATTACK_EFFECT_SMASH "smash"
#define ATTACK_EFFECT_CLAW "claw"
#define ATTACK_EFFECT_DISARM "disarm"
+#define ATTACK_EFFECT_ASS_SLAP "ass_slap"
+#define ATTACK_EFFECT_FACE_SLAP "face_slap"
#define ATTACK_EFFECT_BITE "bite"
#define ATTACK_EFFECT_MECHFIRE "mech_fire"
#define ATTACK_EFFECT_MECHTOXIN "mech_toxin"
diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm
index e66d518644..ef96b83cc8 100644
--- a/code/__DEFINES/footsteps.dm
+++ b/code/__DEFINES/footsteps.dm
@@ -6,6 +6,14 @@
#define FOOTSTEP_GRASS "grass"
#define FOOTSTEP_WATER "water"
#define FOOTSTEP_LAVA "lava"
+//barefoot sounds
+#define FOOTSTEP_WOOD_BAREFOOT "woodbarefoot"
+#define FOOTSTEP_WOOD_CLAW "woodclaw"
+#define FOOTSTEP_HARD_BAREFOOT "hardbarefoot"
+#define FOOTSTEP_HARD_CLAW "hardclaw"
+#define FOOTSTEP_CARPET_BAREFOOT "carpetbarefoot"
+//misc footstep sounds
+#define FOOTSTEP_GENERIC_HEAVY "heavy"
/*
@@ -63,4 +71,104 @@ GLOBAL_LIST_INIT(footstep, list(
'sound/effects/footstep/lava1.ogg',
'sound/effects/footstep/lava2.ogg',
'sound/effects/footstep/lava3.ogg'), 100, 0),
-))
\ No newline at end of file
+))
+
+//bare footsteps lists
+GLOBAL_LIST_INIT(barefootstep, list(
+ FOOTSTEP_WOOD_BAREFOOT = list(list(
+ 'sound/effects/footstep/woodbarefoot1.ogg',
+ 'sound/effects/footstep/woodbarefoot2.ogg',
+ 'sound/effects/footstep/woodbarefoot3.ogg',
+ 'sound/effects/footstep/woodbarefoot4.ogg',
+ 'sound/effects/footstep/woodbarefoot5.ogg'), 80, -1),
+ FOOTSTEP_HARD_BAREFOOT = list(list(
+ 'sound/effects/footstep/hardbarefoot1.ogg',
+ 'sound/effects/footstep/hardbarefoot2.ogg',
+ 'sound/effects/footstep/hardbarefoot3.ogg',
+ 'sound/effects/footstep/hardbarefoot4.ogg',
+ 'sound/effects/footstep/hardbarefoot5.ogg'), 80, -1),
+ FOOTSTEP_CARPET_BAREFOOT = list(list(
+ 'sound/effects/footstep/carpetbarefoot1.ogg',
+ 'sound/effects/footstep/carpetbarefoot2.ogg',
+ 'sound/effects/footstep/carpetbarefoot3.ogg',
+ 'sound/effects/footstep/carpetbarefoot4.ogg',
+ 'sound/effects/footstep/carpetbarefoot5.ogg'), 75, -2),
+ FOOTSTEP_SAND = list(list(
+ 'sound/effects/footstep/asteroid1.ogg',
+ 'sound/effects/footstep/asteroid2.ogg',
+ 'sound/effects/footstep/asteroid3.ogg',
+ 'sound/effects/footstep/asteroid4.ogg',
+ 'sound/effects/footstep/asteroid5.ogg'), 75, 0),
+ FOOTSTEP_GRASS = list(list(
+ 'sound/effects/footstep/grass1.ogg',
+ 'sound/effects/footstep/grass2.ogg',
+ 'sound/effects/footstep/grass3.ogg',
+ 'sound/effects/footstep/grass4.ogg'), 75, 0),
+ FOOTSTEP_WATER = list(list(
+ 'sound/effects/footstep/water1.ogg',
+ 'sound/effects/footstep/water2.ogg',
+ 'sound/effects/footstep/water3.ogg',
+ 'sound/effects/footstep/water4.ogg'), 100, 1),
+ FOOTSTEP_LAVA = list(list(
+ 'sound/effects/footstep/lava1.ogg',
+ 'sound/effects/footstep/lava2.ogg',
+ 'sound/effects/footstep/lava3.ogg'), 100, 0),
+))
+
+//claw footsteps lists
+GLOBAL_LIST_INIT(clawfootstep, list(
+ FOOTSTEP_WOOD_CLAW = list(list(
+ 'sound/effects/footstep/woodclaw1.ogg',
+ 'sound/effects/footstep/woodclaw2.ogg',
+ 'sound/effects/footstep/woodclaw3.ogg',
+ 'sound/effects/footstep/woodclaw2.ogg',
+ 'sound/effects/footstep/woodclaw1.ogg'), 90, 1),
+ FOOTSTEP_HARD_CLAW = list(list(
+ 'sound/effects/footstep/hardclaw1.ogg',
+ 'sound/effects/footstep/hardclaw2.ogg',
+ 'sound/effects/footstep/hardclaw3.ogg',
+ 'sound/effects/footstep/hardclaw4.ogg',
+ 'sound/effects/footstep/hardclaw1.ogg'), 90, 1),
+ FOOTSTEP_CARPET_BAREFOOT = list(list(
+ 'sound/effects/footstep/carpetbarefoot1.ogg',
+ 'sound/effects/footstep/carpetbarefoot2.ogg',
+ 'sound/effects/footstep/carpetbarefoot3.ogg',
+ 'sound/effects/footstep/carpetbarefoot4.ogg',
+ 'sound/effects/footstep/carpetbarefoot5.ogg'), 75, -2),
+ FOOTSTEP_SAND = list(list(
+ 'sound/effects/footstep/asteroid1.ogg',
+ 'sound/effects/footstep/asteroid2.ogg',
+ 'sound/effects/footstep/asteroid3.ogg',
+ 'sound/effects/footstep/asteroid4.ogg',
+ 'sound/effects/footstep/asteroid5.ogg'), 75, 0),
+ FOOTSTEP_GRASS = list(list(
+ 'sound/effects/footstep/grass1.ogg',
+ 'sound/effects/footstep/grass2.ogg',
+ 'sound/effects/footstep/grass3.ogg',
+ 'sound/effects/footstep/grass4.ogg'), 75, 0),
+ FOOTSTEP_WATER = list(list(
+ 'sound/effects/footstep/water1.ogg',
+ 'sound/effects/footstep/water2.ogg',
+ 'sound/effects/footstep/water3.ogg',
+ 'sound/effects/footstep/water4.ogg'), 100, 1),
+ FOOTSTEP_LAVA = list(list(
+ 'sound/effects/footstep/lava1.ogg',
+ 'sound/effects/footstep/lava2.ogg',
+ 'sound/effects/footstep/lava3.ogg'), 100, 0),
+))
+
+//heavy footsteps list
+GLOBAL_LIST_INIT(heavyfootstep, list(
+ FOOTSTEP_GENERIC_HEAVY = list(list(
+ 'sound/effects/footstep/heavy1.ogg',
+ 'sound/effects/footstep/heavy2.ogg'), 100, 2),
+ FOOTSTEP_WATER = list(list(
+ 'sound/effects/footstep/water1.ogg',
+ 'sound/effects/footstep/water2.ogg',
+ 'sound/effects/footstep/water3.ogg',
+ 'sound/effects/footstep/water4.ogg'), 100, 2),
+ FOOTSTEP_LAVA = list(list(
+ 'sound/effects/footstep/lava1.ogg',
+ 'sound/effects/footstep/lava2.ogg',
+ 'sound/effects/footstep/lava3.ogg'), 100, 0),
+))
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 15eaadb2f2..8ff40c3ef9 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -67,7 +67,7 @@
#define islarva(A) (istype(A, /mob/living/carbon/alien/larva))
-#define isalienadult(A) (istype(A, /mob/living/carbon/alien/humanoid))
+#define isalienadult(A) (istype(A, /mob/living/carbon/alien/humanoid) || istype(A, /mob/living/simple_animal/hostile/alien))
#define isalienhunter(A) (istype(A, /mob/living/carbon/alien/humanoid/hunter))
@@ -123,6 +123,47 @@
#define isclown(A) (istype(A, /mob/living/simple_animal/hostile/retaliate/clown))
+GLOBAL_LIST_INIT(shoefootmob, typecacheof(list(
+ /mob/living/carbon/human/,
+ /mob/living/simple_animal/cow,
+ /mob/living/simple_animal/hostile/cat_butcherer,
+ /mob/living/simple_animal/hostile/faithless,
+ /mob/living/simple_animal/hostile/nanotrasen,
+ /mob/living/simple_animal/hostile/pirate,
+ /mob/living/simple_animal/hostile/russian,
+ /mob/living/simple_animal/hostile/syndicate,
+ /mob/living/simple_animal/hostile/wizard,
+ /mob/living/simple_animal/hostile/zombie,
+ /mob/living/simple_animal/hostile/retaliate/clown,
+ /mob/living/simple_animal/hostile/retaliate/spaceman,
+ /mob/living/simple_animal/hostile/retaliate/nanotrasenpeace,
+ /mob/living/simple_animal/hostile/retaliate/goat,
+ /mob/living/carbon/true_devil,
+ )))
+
+GLOBAL_LIST_INIT(clawfootmob, typecacheof(list(
+ /mob/living/carbon/alien/humanoid,
+ /mob/living/simple_animal/hostile/alien,
+ /mob/living/simple_animal/pet/cat,
+ /mob/living/simple_animal/pet/dog,
+ /mob/living/simple_animal/pet/fox,
+ /mob/living/simple_animal/chicken,
+ /mob/living/simple_animal/hostile/bear,
+ /mob/living/simple_animal/hostile/jungle/mega_arachnid
+ )))
+
+GLOBAL_LIST_INIT(barefootmob, typecacheof(list(
+ /mob/living/carbon/monkey,
+ /mob/living/simple_animal/pet/penguin,
+ /mob/living/simple_animal/hostile/gorilla,
+ /mob/living/simple_animal/hostile/jungle/mook
+ )))
+
+GLOBAL_LIST_INIT(heavyfootmob, typecacheof(list(
+ /mob/living/simple_animal/hostile/megafauna,
+ /mob/living/simple_animal/hostile/jungle/leaper
+ )))
+
//Misc mobs
#define isobserver(A) (istype(A, /mob/dead/observer))
@@ -136,6 +177,15 @@
#define iseminence(A) (istype(A, /mob/camera/eminence))
+//Footstep helpers
+#define isshoefoot(A) (is_type_in_typecache(A, GLOB.shoefootmob))
+
+#define isclawfoot(A) (is_type_in_typecache(A, GLOB.clawfootmob))
+
+#define isbarefoot(A) (is_type_in_typecache(A, GLOB.barefootmob))
+
+#define isheavyfoot(A) (is_type_in_typecache(A, GLOB.heavyfootmob))
+
//Objects
#define isobj(A) istype(A, /obj) //override the byond proc because it returns true on children of /atom/movable that aren't objs
diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm
index 9c81305241..0820d63247 100644
--- a/code/__DEFINES/robots.dm
+++ b/code/__DEFINES/robots.dm
@@ -35,6 +35,7 @@
#define CLEAN_BOT (1<<3) // Cleanbots
#define MED_BOT (1<<4) // Medibots
#define HONK_BOT (1<<5) // Honkbots & ED-Honks
+#define FIRE_BOT (1<<6) // Firebots
//AI notification defines
#define NEW_BORG 1
diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm
index c93be4dae3..bfcc49f453 100644
--- a/code/datums/components/footstep.dm
+++ b/code/datums/components/footstep.dm
@@ -1,39 +1,105 @@
-/datum/component/footstep
- var/steps = 0
- var/volume
- var/e_range
-
-/datum/component/footstep/Initialize(volume_ = 0.5, e_range_ = -1)
- if(!isliving(parent))
- return COMPONENT_INCOMPATIBLE
- volume = volume_
- e_range = e_range_
- RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_footstep)
-
-/datum/component/footstep/proc/play_footstep()
- var/turf/open/T = get_turf(parent)
- if(!istype(T))
- return
- var/mob/living/LM = parent
- var/v = volume
- var/e = e_range
- if(!T.footstep || LM.lying || !LM.canmove || LM.resting || LM.buckled || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING))
- return
- if(iscarbon(LM))
- var/mob/living/carbon/C = LM
- if(!C.get_bodypart(BODY_ZONE_L_LEG) && !C.get_bodypart(BODY_ZONE_R_LEG))
- return
- if(ishuman(C) && C.m_intent == MOVE_INTENT_WALK)
- v /= 2
- e -= 5
- steps++
- if(steps >= 3)
- steps = 0
- else
- return
- if(prob(80) && !LM.has_gravity(T)) // don't need to step as often when you hop around
- return
- playsound(T, pick(GLOB.footstep[T.footstep][1]),
- GLOB.footstep[T.footstep][2] * v,
- TRUE,
- GLOB.footstep[T.footstep][3] + e)
+/datum/component/footstep
+ var/steps = 0
+ var/volume
+ var/e_range
+
+/datum/component/footstep/Initialize(volume_ = 0.5, e_range_ = -1)
+ if(!isliving(parent))
+ return COMPONENT_INCOMPATIBLE
+ volume = volume_
+ e_range = e_range_
+ RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_footstep)
+
+/datum/component/footstep/proc/play_footstep()
+ var/turf/open/T = get_turf(parent)
+ if(!istype(T))
+ return
+
+ var/mob/living/LM = parent
+ var/v = volume
+ var/e = e_range
+ if(!T.footstep || LM.buckled || LM.lying || !LM.canmove || LM.resting || LM.buckled || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING))
+ if (LM.lying && !(!T.footstep || LM.movement_type & (VENTCRAWLING | FLYING))) //play crawling sound if we're lying
+ playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v)
+ return
+
+ if(iscarbon(LM))
+ var/mob/living/carbon/C = LM
+ if(!C.get_bodypart(BODY_ZONE_L_LEG) && !C.get_bodypart(BODY_ZONE_R_LEG))
+ return
+ if(ishuman(C) && C.m_intent == MOVE_INTENT_WALK)
+ v /= 2
+ e -= 5
+ steps++
+
+ if(steps >= 3)
+ steps = 0
+
+ else
+ return
+
+ if(prob(80) && !LM.has_gravity(T)) // don't need to step as often when you hop around
+ return
+
+ //begin playsound shenanigans//
+
+ //for barefooted non-clawed mobs like monkeys
+ if(isbarefoot(LM))
+ playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]),
+ GLOB.barefootstep[T.barefootstep][2] * v,
+ TRUE,
+ GLOB.barefootstep[T.barefootstep][3] + e)
+ return
+
+ //for xenomorphs, dogs, and other clawed mobs
+ if(isclawfoot(LM))
+ if(isalienadult(LM)) //xenos are stealthy and get quieter footsteps
+ v /= 3
+ e -= 5
+
+ playsound(T, pick(GLOB.clawfootstep[T.clawfootstep][1]),
+ GLOB.clawfootstep[T.clawfootstep][2] * v,
+ TRUE,
+ GLOB.clawfootstep[T.clawfootstep][3] + e)
+ return
+
+ //for megafauna and other large and imtimidating mobs such as the bloodminer
+ if(isheavyfoot(LM))
+ playsound(T, pick(GLOB.heavyfootstep[T.heavyfootstep][1]),
+ GLOB.heavyfootstep[T.heavyfootstep][2] * v,
+ TRUE,
+ GLOB.heavyfootstep[T.heavyfootstep][3] + e)
+ return
+
+ //for slimes
+ if(isslime(LM))
+ playsound(T, 'sound/effects/footstep/slime1.ogg', 15 * v)
+ return
+
+ //for (simple) humanoid mobs (clowns, russians, pirates, etc.)
+ if(isshoefoot(LM))
+ if(!ishuman(LM))
+ playsound(T, pick(GLOB.footstep[T.footstep][1]),
+ GLOB.footstep[T.footstep][2] * v,
+ TRUE,
+ GLOB.footstep[T.footstep][3] + e)
+ return
+ if(ishuman(LM)) //for proper humans, they're special
+ var/mob/living/carbon/human/H = LM
+ var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET))
+
+ if (H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle") //are we a naga or tentacle taur creature
+ playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v)
+ return
+
+ if(H.shoes || feetCover) //are we wearing shoes
+ playsound(T, pick(GLOB.footstep[T.footstep][1]),
+ GLOB.footstep[T.footstep][2] * v,
+ TRUE,
+ GLOB.footstep[T.footstep][3] + e)
+
+ if((!H.shoes && !feetCover)) //are we NOT wearing shoes
+ playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]),
+ GLOB.barefootstep[T.barefootstep][2] * v,
+ TRUE,
+ GLOB.barefootstep[T.barefootstep][3] + e)
\ No newline at end of file
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 5868ef4b1d..ba4a0ffae8 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -713,12 +713,12 @@
req_defib = FALSE
///////////////////////////////////////////
-/////////Dedibrillators Disks//////////////
+/////////Defibrillator Disks//////////////
///////////////////////////////////////////
/obj/item/disk/medical
name = "Defibrillator Upgrade Disk"
- desc = "A blank defibrillator disk..."
+ desc = "A blank upgrade disk, made for a defibrillator"
icon = 'modular_citadel/icons/obj/defib_disks.dmi'
icon_state = "upgrade_disk"
item_state = "heal_disk"
@@ -726,25 +726,25 @@
/obj/item/disk/medical/defib_heal
name = "Defibrillator Healing Disk"
- desc = "A disk alowing for grater amounts of healing"
+ desc = "An upgrade which increases the healing power of the defibrillator"
icon_state = "heal_disk"
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 6000, MAT_SILVER = 6000)
/obj/item/disk/medical/defib_shock
name = "Defibrillator Anti-Shock Disk"
- desc = "A disk that helps agains shocking anyone, other then the intented target"
+ desc = "A safety upgrade that guarantees only the patient will get shocked"
icon_state = "zap_disk"
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 6000, MAT_SILVER = 6000)
/obj/item/disk/medical/defib_decay
name = "Defibrillator Body-Decay Extender Disk"
- desc = "A disk that helps defibrillators revive the longer decayed"
+ desc = "An upgrade allowing the defibrillator to work on more decayed bodies"
icon_state = "body_disk"
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 16000, MAT_SILVER = 6000, MAT_TITANIUM = 2000)
/obj/item/disk/medical/defib_speed
- name = "Defibrllator Pre-Primer Disk"
- desc = "A disk that cuts the time charg time in half for defibrillator use"
+ name = "Defibrillator Fast Charge Disk"
+ desc = "An upgrade to the defibrillator capacitors, which let it charge faster"
icon_state = "fast_disk"
materials = list(MAT_METAL=16000, MAT_GLASS = 8000, MAT_GOLD = 26000, MAT_SILVER = 26000)
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index fc268e2b3e..1a733fbff2 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -31,7 +31,7 @@
var/remote_door_id = ""
- var/bot_access_flags = 0 //Bit flags. Selection: SEC_BOT | MULE_BOT | FLOOR_BOT | CLEAN_BOT | MED_BOT
+ var/bot_access_flags = 0 //Bit flags. Selection: SEC_BOT | MULE_BOT | FLOOR_BOT | CLEAN_BOT | MED_BOT | FIRE_BOT
var/spam_enabled = 0 //Enables "Send to All" Option
var/obj/item/pda/host_pda = null
@@ -65,7 +65,7 @@
name = "\improper BreatheDeep cartridge"
icon_state = "cart-a"
access = CART_ATMOS | CART_DRONEPHONE
- bot_access_flags = FLOOR_BOT
+ bot_access_flags = FLOOR_BOT | FIRE_BOT
/obj/item/cartridge/medical
name = "\improper Med-U cartridge"
@@ -112,7 +112,7 @@
/obj/item/cartridge/roboticist
name = "\improper B.O.O.P. Remote Control cartridge"
desc = "Packed with heavy duty triple-bot interlink!"
- bot_access_flags = FLOOR_BOT | CLEAN_BOT | MED_BOT
+ bot_access_flags = FLOOR_BOT | CLEAN_BOT | MED_BOT | FIRE_BOT
access = CART_DRONEPHONE
/obj/item/cartridge/signal
@@ -160,7 +160,7 @@
name = "\improper Power-On DELUXE cartridge"
icon_state = "cart-ce"
access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_ENGINE | CART_ATMOS | CART_DRONEPHONE
- bot_access_flags = FLOOR_BOT
+ bot_access_flags = FLOOR_BOT | FIRE_BOT
/obj/item/cartridge/cmo
name = "\improper Med-U DELUXE cartridge"
@@ -172,7 +172,7 @@
name = "\improper Signal Ace DELUXE cartridge"
icon_state = "cart-rd"
access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_REAGENT_SCANNER | CART_ATMOS | CART_DRONEPHONE
- bot_access_flags = FLOOR_BOT | CLEAN_BOT | MED_BOT
+ bot_access_flags = FLOOR_BOT | CLEAN_BOT | MED_BOT | FIRE_BOT
/obj/item/cartridge/rd/Initialize()
. = ..()
@@ -183,7 +183,7 @@
desc = "Now with 350% more value!" //Give the Captain...EVERYTHING! (Except Mime, Clown, and Syndie)
icon_state = "cart-c"
access = ~(CART_CLOWN | CART_MIME | CART_REMOTE_DOOR)
- bot_access_flags = SEC_BOT | MULE_BOT | FLOOR_BOT | CLEAN_BOT | MED_BOT
+ bot_access_flags = SEC_BOT | MULE_BOT | FLOOR_BOT | CLEAN_BOT | MED_BOT | FIRE_BOT
spam_enabled = 1
/obj/item/cartridge/captain/New()
diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm
index e0d6b553fd..ddbc668c05 100644
--- a/code/game/objects/items/extinguisher.dm
+++ b/code/game/objects/items/extinguisher.dm
@@ -71,6 +71,10 @@
sprite_name = "foam_extinguisher"
precision = TRUE
+/obj/item/extinguisher/proc/refill()
+ create_reagents(max_water, AMOUNT_VISIBLE)
+ reagents.add_reagent(chem, max_water)
+
/obj/item/extinguisher/suicide_act(mob/living/carbon/user)
if (!safety && (reagents.total_volume >= 1))
user.visible_message("[user] puts the nozzle to [user.p_their()] mouth. It looks like [user.p_theyre()] trying to extinguish the spark of life!")
@@ -183,7 +187,7 @@
W.reagents = R
R.my_atom = W
reagents.trans_to(W,1)
-
+
//Make em move dat ass, hun
addtimer(CALLBACK(src, /obj/item/extinguisher/proc/move_particles, water_particles), 2)
@@ -243,3 +247,12 @@
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.")
+//firebot assembly
+/obj/item/extinguisher/attackby(obj/O, mob/user, params)
+ if(istype(O, /obj/item/bodypart/l_arm/robot) || istype(O, /obj/item/bodypart/r_arm/robot))
+ to_chat(user, "You add [O] to [src].")
+ qdel(O)
+ qdel(src)
+ user.put_in_hands(new /obj/item/bot_assembly/firebot)
+ else
+ ..()
diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm
index 53fb218755..673337518d 100644
--- a/code/game/objects/items/tanks/jetpack.dm
+++ b/code/game/objects/items/tanks/jetpack.dm
@@ -1,238 +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.assert_gas(gas_type)
- air_contents.gases[gas_type][MOLES] = (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 = 20 //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."
- icon_state = "jetpack-void"
- item_state = "jetpack-void"
- full_speed = FALSE //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 = 40
- 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
+/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.assert_gas(gas_type)
+ air_contents.gases[gas_type][MOLES] = (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/turfs/open.dm b/code/game/turfs/open.dm
index 63b5f4b160..fed922c7b4 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -7,6 +7,9 @@
var/wet
var/footstep = null
+ var/barefootstep = null
+ var/clawfootstep = null
+ var/heavyfootstep = null
/turf/open/ComponentInitialize()
. = ..()
@@ -27,6 +30,9 @@
icon = 'icons/turf/floors.dmi'
icon_state = "floor"
footstep = FOOTSTEP_FLOOR
+ barefootstep = FOOTSTEP_HARD_BAREFOOT
+ clawfootstep = FOOTSTEP_HARD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
tiled_dirt = TRUE
/turf/open/indestructible/Melt()
@@ -42,6 +48,9 @@
/turf/open/indestructible/sound
name = "squeaky floor"
footstep = null
+ barefootstep = null
+ clawfootstep = null
+ heavyfootstep = null
var/sound
/turf/open/indestructible/sound/Entered(var/mob/AM)
@@ -61,6 +70,10 @@
icon = 'icons/turf/floors.dmi'
icon_state = "cobble"
baseturfs = /turf/open/indestructible/cobble
+ footstep = FOOTSTEP_FLOOR
+ barefootstep = FOOTSTEP_HARD_BAREFOOT
+ clawfootstep = FOOTSTEP_HARD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
tiled_dirt = FALSE
/turf/open/indestructible/necropolis
@@ -71,6 +84,9 @@
baseturfs = /turf/open/indestructible/necropolis
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
footstep = FOOTSTEP_LAVA
+ barefootstep = FOOTSTEP_LAVA
+ clawfootstep = FOOTSTEP_LAVA
+ heavyfootstep = FOOTSTEP_LAVA
tiled_dirt = FALSE
/turf/open/indestructible/necropolis/Initialize()
@@ -108,6 +124,9 @@
desc = "A floor made of invulnerable notebook paper."
icon_state = "paperfloor"
footstep = null
+ barefootstep = null
+ clawfootstep = null
+ heavyfootstep = null
tiled_dirt = FALSE
/turf/open/indestructible/binary
@@ -116,6 +135,9 @@
baseturfs = /turf/open/indestructible/binary
icon_state = "binary"
footstep = null
+ barefootstep = null
+ clawfootstep = null
+ heavyfootstep = null
/turf/open/indestructible/airblock
icon_state = "bluespace"
@@ -128,6 +150,9 @@
icon_state = "reebe"
baseturfs = /turf/open/indestructible/clock_spawn_room
footstep = FOOTSTEP_PLATING
+ barefootstep = FOOTSTEP_HARD_BAREFOOT
+ clawfootstep = FOOTSTEP_HARD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
/turf/open/indestructible/clock_spawn_room/Entered()
..()
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 4523cc5b67..b00efc7ed6 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -7,6 +7,9 @@
baseturfs = /turf/open/floor/plating
footstep = FOOTSTEP_FLOOR
+ barefootstep = FOOTSTEP_HARD_BAREFOOT
+ clawfootstep = FOOTSTEP_HARD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default
var/icon_plating = "plating"
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index fc1dec2acb..7b45aa1fbb 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -13,6 +13,9 @@
floor_tile = /obj/item/stack/tile/wood
broken_states = list("wood-broken", "wood-broken2", "wood-broken3", "wood-broken4", "wood-broken5", "wood-broken6", "wood-broken7")
footstep = FOOTSTEP_WOOD
+ barefootstep = FOOTSTEP_WOOD_BAREFOOT
+ clawfootstep = FOOTSTEP_WOOD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
tiled_dirt = FALSE
/turf/open/floor/wood/examine(mob/user)
@@ -73,6 +76,9 @@
flags_1 = NONE
bullet_bounce_sound = null
footstep = FOOTSTEP_GRASS
+ barefootstep = FOOTSTEP_GRASS
+ clawfootstep = FOOTSTEP_GRASS
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
var/ore_type = /obj/item/stack/ore/glass
var/turfverb = "uproot"
tiled_dirt = FALSE
@@ -103,6 +109,9 @@
slowdown = 2
bullet_sizzle = TRUE
footstep = FOOTSTEP_SAND
+ barefootstep = FOOTSTEP_SAND
+ clawfootstep = FOOTSTEP_SAND
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
/turf/open/floor/grass/snow/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
return
@@ -136,6 +145,9 @@
turfverb = "dig up"
slowdown = 0
footstep = FOOTSTEP_SAND
+ barefootstep = FOOTSTEP_SAND
+ clawfootstep = FOOTSTEP_SAND
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
/turf/open/floor/grass/fakebasalt/Initialize()
. = ..()
@@ -156,6 +168,9 @@
flags_1 = NONE
bullet_bounce_sound = null
footstep = FOOTSTEP_CARPET
+ barefootstep = FOOTSTEP_CARPET_BAREFOOT
+ clawfootstep = FOOTSTEP_CARPET_BAREFOOT
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
tiled_dirt = FALSE
/turf/open/floor/carpet/examine(mob/user)
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index 91744f3fa8..bff955086c 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -141,6 +141,9 @@
icon_state = "plating"
baseturfs = /turf/open/floor/clockwork
footstep = FOOTSTEP_PLATING
+ barefootstep = FOOTSTEP_HARD_BAREFOOT
+ clawfootstep = FOOTSTEP_HARD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
var/uses_overlay = TRUE
var/obj/effect/clockwork/overlay/floor/realappearence
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index e783b8a9a0..036f54c710 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -13,6 +13,9 @@
intact = FALSE
baseturfs = /turf/open/space
footstep = FOOTSTEP_PLATING
+ barefootstep = FOOTSTEP_HARD_BAREFOOT
+ clawfootstep = FOOTSTEP_HARD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
var/attachment_holes = TRUE
diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm
index c33612c9bc..d9966ee55c 100644
--- a/code/game/turfs/simulated/floor/plating/asteroid.dm
+++ b/code/game/turfs/simulated/floor/plating/asteroid.dm
@@ -10,6 +10,9 @@
icon_plating = "asteroid"
postdig_icon_change = TRUE
footstep = FOOTSTEP_SAND
+ barefootstep = FOOTSTEP_SAND
+ clawfootstep = FOOTSTEP_SAND
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
var/environment_type = "asteroid"
var/turf_type = /turf/open/floor/plating/asteroid //Because caves do whacky shit to revert to normal
var/floor_variance = 20 //probability floor has a different icon state
@@ -333,6 +336,9 @@
icon_plating = "snow-ice"
environment_type = "snow_cavern"
footstep = FOOTSTEP_FLOOR
+ barefootstep = FOOTSTEP_HARD_BAREFOOT
+ clawfootstep = FOOTSTEP_HARD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
/turf/open/floor/plating/asteroid/snow/ice/burn_tile()
return FALSE
diff --git a/code/game/turfs/simulated/floor/plating/dirt.dm b/code/game/turfs/simulated/floor/plating/dirt.dm
index dc865634f4..b9bcc0937b 100644
--- a/code/game/turfs/simulated/floor/plating/dirt.dm
+++ b/code/game/turfs/simulated/floor/plating/dirt.dm
@@ -9,6 +9,9 @@
planetary_atmos = TRUE
attachment_holes = FALSE
footstep = FOOTSTEP_SAND
+ barefootstep = FOOTSTEP_SAND
+ clawfootstep = FOOTSTEP_SAND
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
tiled_dirt = FALSE
/turf/open/floor/plating/dirt/dark
diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm
index f86ab3c03c..15b039193d 100644
--- a/code/game/turfs/simulated/floor/plating/misc_plating.dm
+++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm
@@ -47,6 +47,9 @@
planetary_atmos = TRUE
attachment_holes = FALSE
footstep = FOOTSTEP_SAND
+ barefootstep = FOOTSTEP_SAND
+ clawfootstep = FOOTSTEP_SAND
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
tiled_dirt = FALSE
/turf/open/floor/plating/ashplanet/Initialize()
@@ -79,6 +82,9 @@
layer = MID_TURF_LAYER
canSmoothWith = list(/turf/open/floor/plating/ashplanet/rocky, /turf/closed)
footstep = FOOTSTEP_FLOOR
+ barefootstep = FOOTSTEP_HARD_BAREFOOT
+ clawfootstep = FOOTSTEP_HARD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
/turf/open/floor/plating/ashplanet/wateryrock
gender = PLURAL
@@ -87,6 +93,9 @@
icon_state = "wateryrock"
slowdown = 2
footstep = FOOTSTEP_FLOOR
+ barefootstep = FOOTSTEP_HARD_BAREFOOT
+ clawfootstep = FOOTSTEP_HARD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
/turf/open/floor/plating/ashplanet/wateryrock/Initialize()
icon_state = "[icon_state][rand(1, 9)]"
@@ -100,6 +109,9 @@
attachment_holes = FALSE
bullet_bounce_sound = null
footstep = FOOTSTEP_SAND
+ barefootstep = FOOTSTEP_SAND
+ clawfootstep = FOOTSTEP_SAND
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
/turf/open/floor/plating/beach/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
return
@@ -141,6 +153,9 @@
name = "iron sand"
desc = "Like sand, but more metal."
footstep = FOOTSTEP_SAND
+ barefootstep = FOOTSTEP_SAND
+ clawfootstep = FOOTSTEP_SAND
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
/turf/open/floor/plating/ironsand/Initialize()
. = ..()
@@ -165,6 +180,9 @@
attachment_holes = FALSE
bullet_sizzle = TRUE
footstep = FOOTSTEP_FLOOR
+ barefootstep = FOOTSTEP_HARD_BAREFOOT
+ clawfootstep = FOOTSTEP_HARD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
/turf/open/floor/plating/ice/Initialize()
. = ..()
@@ -202,6 +220,9 @@
attachment_holes = FALSE
planetary_atmos = TRUE
footstep = FOOTSTEP_SAND
+ barefootstep = FOOTSTEP_SAND
+ clawfootstep = FOOTSTEP_SAND
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
/turf/open/floor/plating/snowed/cavern
initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"
diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm
index e677de8c5c..1a477d5d9a 100644
--- a/code/game/turfs/simulated/floor/reinf_floor.dm
+++ b/code/game/turfs/simulated/floor/reinf_floor.dm
@@ -7,6 +7,9 @@
heat_capacity = INFINITY
floor_tile = /obj/item/stack/rods
footstep = FOOTSTEP_PLATING
+ barefootstep = FOOTSTEP_HARD_BAREFOOT
+ clawfootstep = FOOTSTEP_HARD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
tiled_dirt = FALSE
/turf/open/floor/engine/examine(mob/user)
diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm
index b9e355b122..e24736ecf3 100644
--- a/code/game/turfs/simulated/lava.dm
+++ b/code/game/turfs/simulated/lava.dm
@@ -13,6 +13,9 @@
bullet_bounce_sound = 'sound/items/welder2.ogg'
footstep = FOOTSTEP_LAVA
+ barefootstep = FOOTSTEP_LAVA
+ clawfootstep = FOOTSTEP_LAVA
+ heavyfootstep = FOOTSTEP_LAVA
/turf/open/lava/ex_act(severity, target)
contents_explosion(severity, target)
diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm
index b46dd1d06c..708ca230b1 100644
--- a/code/game/turfs/simulated/water.dm
+++ b/code/game/turfs/simulated/water.dm
@@ -12,3 +12,6 @@
bullet_bounce_sound = null //needs a splashing sound one day.
footstep = FOOTSTEP_WATER
+ barefootstep = FOOTSTEP_WATER
+ clawfootstep = FOOTSTEP_WATER
+ heavyfootstep = FOOTSTEP_WATER
diff --git a/code/modules/antagonists/blob/blob/blobs/shield.dm b/code/modules/antagonists/blob/blob/blobs/shield.dm
index d52c208c71..33e7e4392f 100644
--- a/code/modules/antagonists/blob/blob/blobs/shield.dm
+++ b/code/modules/antagonists/blob/blob/blobs/shield.dm
@@ -9,6 +9,7 @@
point_return = 4
atmosblock = TRUE
armor = list("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
+ var/weakened
/obj/structure/blob/shield/scannerreport()
if(atmosblock)
@@ -25,10 +26,15 @@
name = "weakened strong blob"
desc = "A wall of twitching tendrils."
atmosblock = FALSE
- armor = list("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
+ if(!weakened)
+ armor = armor.setRating("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
+ weakened = TRUE
else
icon_state = initial(icon_state)
name = initial(name)
desc = initial(desc)
atmosblock = TRUE
- air_update_turf(1)
+ if(weakened)
+ armor = armor.setRating("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
+ weakened = FALSE
+ air_update_turf(1)
\ No newline at end of file
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 6ada4629d3..c3858da6ad 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -189,6 +189,16 @@
time = 40
category = CAT_ROBOT
+/datum/crafting_recipe/Firebot
+ name = "Firebot"
+ result = /mob/living/simple_animal/bot/firebot
+ reqs = list(/obj/item/extinguisher = 1,
+ /obj/item/bodypart/r_arm/robot = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/clothing/head/hardhat/red = 1)
+ time = 40
+ category = CAT_ROBOT
+
/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
name = "Pneumatic Cannon"
result = /obj/item/pneumatic_cannon/ghetto
@@ -731,7 +741,7 @@
/datum/crafting_recipe/goldenbox
name = "Gold Plated Toolbox"
- result = /obj/item/storage/toolbox/gold_fake
+ result = /obj/item/storage/toolbox/gold_fake
reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting
/obj/item/stack/cable_coil = 10,
/obj/item/stack/sheet/mineral/gold = 1,
diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm
index 910e94f680..7256ddb6ea 100644
--- a/code/modules/events/pirates.dm
+++ b/code/modules/events/pirates.dm
@@ -48,8 +48,6 @@
if(!shuttle_spawned)
spawn_shuttle()
-
-
/datum/round_event/pirates/start()
if(!paid_off && !shuttle_spawned)
spawn_shuttle()
@@ -150,7 +148,6 @@
to_chat(user,"You retrieve the siphoned credits!")
credits_stored = 0
-
/obj/machinery/shuttle_scrambler/proc/send_notification()
priority_announce("Data theft signal detected, source registered on local gps units.")
@@ -222,8 +219,7 @@
suit_type = /obj/item/clothing/suit/space
helmet_type = /obj/item/clothing/head/helmet/space
mask_type = /obj/item/clothing/mask/breath
- storage_type = /obj/item/tank/internals/oxygen
-
+ storage_type = /obj/item/tank/jetpack/void
/obj/machinery/loot_locator
name = "Booty Locator"
@@ -454,4 +450,4 @@
/datum/export/pirate/cash/get_amount(obj/O)
var/obj/item/stack/spacecash/C = O
- return ..() * C.amount * C.value
\ No newline at end of file
+ return ..() * C.amount * C.value
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index 6466a47e42..33884f8ef0 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -316,7 +316,9 @@ h1.alert, h2.alert {color: #000000;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
.green {color: #03ff39;}
-.nicegreen {color: #14a833;}
+.nicegreen {color: #14a833;}
+.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
+.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
.shadowling {color: #3b2769;}
.cult {color: #960000;}
diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm
index 668f49c98f..c323718c07 100644
--- a/code/modules/integrated_electronics/subtypes/converters.dm
+++ b/code/modules/integrated_electronics/subtypes/converters.dm
@@ -142,13 +142,14 @@
/obj/item/integrated_circuit/converter/concatenator
name = "concatenator"
- desc = "This can join up to 8 strings together to get one big string."
+ desc = "This can join up to 8 strings together to get a string with a maximum of 512 characters."
complexity = 4
inputs = list()
outputs = list("result" = IC_PINTYPE_STRING)
activators = list("concatenate" = IC_PINTYPE_PULSE_IN, "on concatenated" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
var/number_of_pins = 8
+ var/max_string_length = 512
/obj/item/integrated_circuit/converter/concatenator/Initialize()
for(var/i = 1 to number_of_pins)
@@ -157,26 +158,46 @@
/obj/item/integrated_circuit/converter/concatenator/do_work()
var/result = null
+ var/spamprotection
for(var/k in 1 to inputs.len)
var/I = get_pin_data(IC_INPUT, k)
if(!isnull(I))
+ if((result ? length(result) : 0) + length(I) > max_string_length)
+ spamprotection = (result ? length(result) : 0) + length(I)
+ break
result = result + I
+ if(spamprotection >= max_string_length*1.75 && assembly)
+ if(assembly.fingerprintslast)
+ var/mob/M = get_mob_by_key(assembly.fingerprintslast)
+ var/more = ""
+ if(M)
+ more = "[ADMIN_LOOKUPFLW(M)] "
+ message_admins("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. Assembly last touched by [more ? more : assembly.fingerprintslast].")
+ investigate_log("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. Assembly last touched by [assembly.fingerprintslast].", INVESTIGATE_CIRCUIT)
+ else
+ message_admins("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. No associated key.")
+ investigate_log("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. No associated key.", INVESTIGATE_CIRCUIT)
+ qdel(assembly)
+ return
+
set_pin_data(IC_OUTPUT, 1, result)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/converter/concatenator/small
name = "small concatenator"
- desc = "This can join up to 4 strings together to get one big string."
+ desc = "This can join up to 4 strings together to get a string with a maximum of 256 characters."
complexity = 2
number_of_pins = 4
+ max_string_length = 256
/obj/item/integrated_circuit/converter/concatenator/large
name = "large concatenator"
- desc = "This can join up to 16 strings together to get one very big string."
+ desc = "This can join up to 16 strings together to get a string with a maximum of 1024 characters."
complexity = 6
number_of_pins = 16
+ max_string_length = 1024
/obj/item/integrated_circuit/converter/separator
name = "separator"
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 870dfc2ebc..d68c936909 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -300,6 +300,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else
if(C.client)
C.canbearoused = C.client.prefs.arousable
+ if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ if(NOGENITALS in H.dna.species.species_traits)
+ H.give_genitals(TRUE) //call the clean up proc to delete anything on the mob then return.
+
// EDIT ENDS
/datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load)
@@ -1452,39 +1457,51 @@ GLOBAL_LIST_EMPTY(roundstart_races)
/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
// CITADEL EDIT slap mouthy gits and booty
- var/aim_for_mouth = user.zone_selected == "mouth"
- var/target_on_help_and_unarmed = target.a_intent == INTENT_HELP && !target.get_active_held_item()
+ var/aim_for_mouth = user.zone_selected == "mouth"
+ var/target_on_help = target.a_intent == INTENT_HELP
var/target_aiming_for_mouth = target.zone_selected == "mouth"
var/target_restrained = target.restrained()
- if(aim_for_mouth && ( target_on_help_and_unarmed || target_restrained || target_aiming_for_mouth))
- playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
- user.visible_message("[user] slaps [target] in the face!",
- "You slap [target] in the face! ",\
- "You hear a slap.")
- if (!target.has_trait(TRAIT_NYMPHO))
- stop_wagging_tail(target)
- return FALSE
+ var/same_dir = (target.dir & user.dir)
var/aim_for_groin = user.zone_selected == "groin"
var/target_aiming_for_groin = target.zone_selected == "groin"
- if(aim_for_groin && (target_on_help_and_unarmed || target_restrained || target_aiming_for_groin))
+
+ if(target.check_block()) //END EDIT
+ target.visible_message("[target] blocks [user]'s disarm attempt!")
+ return 0
+ else if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ to_chat(user, "You're too exhausted!")
+ return FALSE
+
+ else if(aim_for_mouth && ( target_on_help || target_restrained || target_aiming_for_mouth))
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
- user.visible_message("[user] slaps [target]'s ass!",
- "You slap [target]'s ass! ",\
- "You hear a slap.")
+
+ user.visible_message(
+ "[user] slaps [target] in the face!",
+ "You slap [user == target ? "yourself" : target] in the face! ",\
+ "You hear a slap."
+ )
+ if (!target.has_trait(TRAIT_NYMPHO))
+ stop_wagging_tail(target)
+ user.do_attack_animation(target, ATTACK_EFFECT_FACE_SLAP)
+ user.adjustStaminaLossBuffered(3)
+ return FALSE
+ else if(aim_for_groin && (target == user || target.lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
+ playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
+ user.visible_message(
+ "[user] slaps [target]'s ass!",
+ "You slap [user == target ? "your" : target + "'s"] ass! ",\
+ "You hear a slap."
+ )
if (target.canbearoused)
target.adjustArousalLoss(5)
if (target.getArousalLoss() >= 100 && ishuman(target) && target.has_trait(TRAIT_NYMPHO) && target.has_dna())
target.mob_climax(forced_climax=TRUE)
if (!target.has_trait(TRAIT_NYMPHO))
stop_wagging_tail(target)
+ user.do_attack_animation(target, ATTACK_EFFECT_ASS_SLAP)
+ user.adjustStaminaLossBuffered(3)
return FALSE
- else if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
- to_chat(user, "You're too exhausted.")
- return FALSE
- else if(target.check_block()) //END EDIT
- target.visible_message("[target] blocks [user]'s disarm attempt!")
- return 0
- if(attacker_style && attacker_style.disarm_act(user,target))
+ else if(attacker_style && attacker_style.disarm_act(user,target))
return 1
else
user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm
index 434f59e660..ad1f5c9190 100644
--- a/code/modules/mob/living/carbon/human/species_types/abductors.dm
+++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm
@@ -3,7 +3,7 @@
id = "abductor"
say_mod = "gibbers"
sexes = FALSE
- species_traits = list(NOBLOOD,NOEYES,NOGENITALS)
+ species_traits = list(NOBLOOD,NOEYES,NOGENITALS,NOAROUSAL)
inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NOGUNS,TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutanttongue = /obj/item/organ/tongue/abductor
var/scientist = FALSE // vars to not pollute spieces list with castes
diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm
index 678d5397ee..9f2c07694c 100644
--- a/code/modules/mob/living/carbon/human/species_types/android.dm
+++ b/code/modules/mob/living/carbon/human/species_types/android.dm
@@ -2,7 +2,7 @@
name = "Android"
id = "android"
say_mod = "states"
- species_traits = list(NOBLOOD,NOGENITALS)
+ species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL)
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT)
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
meat = null
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 87e9f950c4..b790ae0489 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -2,7 +2,7 @@
// Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck.
name = "Golem"
id = "iron golem"
- species_traits = list(NOBLOOD,MUTCOLORS,NO_UNDERWEAR,NOGENITALS)
+ species_traits = list(NOBLOOD,MUTCOLORS,NO_UNDERWEAR,NOGENITALS,NOAROUSAL)
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
mutant_organs = list(/obj/item/organ/adamantine_resonator)
diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
index 13199cdad7..7be0265cba 100644
--- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
@@ -9,7 +9,7 @@
nojumpsuit = TRUE
say_mod = "poofs" //what does a mushroom sound like
- species_traits = list(MUTCOLORS, NOEYES, NO_UNDERWEAR,NOGENITALS)
+ species_traits = list(MUTCOLORS, NOEYES, NO_UNDERWEAR,NOGENITALS,NOAROUSAL)
inherent_traits = list(TRAIT_NOBREATH)
speedmod = 1.5 //faster than golems but not by much
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 9716fc2e22..b574df7d79 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -38,7 +38,7 @@
burnmod = 1.5
blacklisted = TRUE
no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM, SLOT_S_STORE)
- species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYES,NOGENITALS)
+ species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYES,NOGENITALS,NOAROUSAL)
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
mutanteyes = /obj/item/organ/eyes/night_vision/nightmare
mutant_organs = list(/obj/item/organ/heart/nightmare)
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index a72c196fdf..5c2b01a179 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -6,7 +6,7 @@
blacklisted = 1
sexes = 0
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
- species_traits = list(NOBLOOD,NOGENITALS)
+ species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL)
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH)
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
mutanttongue = /obj/item/organ/tongue/bone
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index f553367921..7e838c857f 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -3,7 +3,7 @@
id = "synth"
say_mod = "beep boops" //inherited from a user's real species
sexes = 0
- species_traits = list(NOTRANSSTING,NOGENITALS) //all of these + whatever we inherit from the real species
+ species_traits = list(NOTRANSSTING,NOGENITALS,NOAROUSAL) //all of these + whatever we inherit from the real species
inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
dangerous_existence = 1
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 56d37f667c..9db21f13e0 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -505,3 +505,33 @@
to_chat(user, "You unbolt [src]'s energy swords")
for(var/IS in 1 to swordamt)
new /obj/item/melee/transforming/energy/sword/saber(Tsec)
+
+//Firebot Assembly
+/obj/item/bot_assembly/firebot
+ name = "incomplete firebot assembly"
+ desc = "A fire extinguisher with an arm attached to it."
+ icon_state = "firebot_arm"
+ created_name = "Firebot"
+
+/obj/item/bot_assembly/firebot/attackby(obj/item/I, mob/user, params)
+ ..()
+ switch(build_step)
+ if(ASSEMBLY_FIRST_STEP)
+ if(istype(I, /obj/item/clothing/head/hardhat/red))
+ if(!user.temporarilyRemoveItemFromInventory(I))
+ return
+ to_chat(user,"You add the [I] to [src]!")
+ icon_state = "firebot_helmet"
+ desc = "An incomplete firebot assembly with a fire helmet."
+ qdel(I)
+ build_step++
+
+ if(ASSEMBLY_SECOND_STEP)
+ if(isprox(I))
+ if(!can_finish_build(I, user))
+ return
+ to_chat(user, "You add the [I] to [src]! Beep Boop!")
+ var/mob/living/simple_animal/bot/firebot/F = new(drop_location())
+ F.name = created_name
+ qdel(I)
+ qdel(src)
diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm
new file mode 100644
index 0000000000..d8c3bca72a
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/bot/firebot.dm
@@ -0,0 +1,325 @@
+//Firebot
+
+#define SPEECH_INTERVAL 300 // Time between idle speeches
+#define DETECTED_VOICE_INTERVAL 300 // Time between fire detected callouts
+#define FOAM_INTERVAL 50 // Time between deployment of fire fighting foam
+
+/mob/living/simple_animal/bot/firebot
+ name = "\improper Firebot"
+ desc = "A little fire extinguishing bot. He looks rather anxious."
+ icon = 'icons/mob/aibots.dmi'
+ icon_state = "firebot"
+ density = FALSE
+ anchored = FALSE
+ health = 25
+ maxHealth = 25
+ spacewalk = TRUE
+
+ radio_key = /obj/item/encryptionkey/headset_eng
+ radio_channel = "Engineering"
+ bot_type = FIRE_BOT
+ model = "Firebot"
+ bot_core = /obj/machinery/bot_core/firebot
+ window_id = "autoextinguisher"
+ window_name = "Mobile Fire Extinguisher v1.0"
+ path_image_color = "#FFA500"
+
+ var/atom/target_fire
+ var/atom/old_target_fire
+
+ var/obj/item/extinguisher/internal_ext
+
+ var/last_found = 0
+
+ var/speech_cooldown = 0
+ var/detected_cooldown = 0
+ var/foam_cooldown = 0
+
+ var/extinguish_people = TRUE
+ var/extinguish_fires = TRUE
+ var/stationary_mode = FALSE
+
+/mob/living/simple_animal/bot/firebot/Initialize()
+ . = ..()
+ update_icon()
+ var/datum/job/engineer/J = new/datum/job/engineer
+ access_card.access += J.get_access()
+ prev_access = access_card.access
+
+ create_extinguisher()
+
+/mob/living/simple_animal/bot/firebot/bot_reset()
+ create_extinguisher()
+
+/mob/living/simple_animal/bot/firebot/proc/create_extinguisher()
+ internal_ext = new /obj/item/extinguisher(src)
+ internal_ext.safety = FALSE
+ internal_ext.precision = TRUE
+ internal_ext.max_water = INFINITY
+ internal_ext.refill()
+
+/mob/living/simple_animal/bot/firebot/UnarmedAttack(atom/A)
+ if(!on)
+ return
+ if(internal_ext)
+ internal_ext.afterattack(A, src)
+ else
+ return ..()
+
+/mob/living/simple_animal/bot/firebot/RangedAttack(atom/A)
+ if(!on)
+ return
+ if(internal_ext)
+ internal_ext.afterattack(A, src)
+ else
+ return ..()
+
+/mob/living/simple_animal/bot/firebot/turn_on()
+ . = ..()
+ update_icon()
+
+/mob/living/simple_animal/bot/firebot/turn_off()
+ ..()
+ update_icon()
+
+/mob/living/simple_animal/bot/firebot/bot_reset()
+ ..()
+ target_fire = null
+ old_target_fire = null
+ ignore_list = list()
+ anchored = FALSE
+ update_icon()
+
+/mob/living/simple_animal/bot/firebot/proc/soft_reset()
+ path = list()
+ target_fire = null
+ mode = BOT_IDLE
+ last_found = world.time
+ update_icon()
+
+/mob/living/simple_animal/bot/firebot/set_custom_texts()
+ text_hack = "You corrupt [name]'s safety protocols."
+ text_dehack = "You detect errors in [name] and reset his programming."
+ text_dehack_fail = "[name] is not responding to reset commands!"
+
+/mob/living/simple_animal/bot/firebot/get_controls(mob/user)
+ var/dat
+ dat += hack(user)
+ dat += showpai(user)
+ dat += "Mobile Fire Extinguisher v1.0
"
+ dat += "Status: [on ? "On" : "Off"]
"
+ dat += "Maintenance panel panel is [open ? "opened" : "closed"]
"
+
+ dat += "Behaviour controls are [locked ? "locked" : "unlocked"]
"
+ if(!locked || issilicon(user) || IsAdminGhost(user))
+ dat += "Extinguish Fires: [extinguish_fires ? "Yes" : "No"]
"
+ dat += "Extinguish People: [extinguish_people ? "Yes" : "No"]
"
+ dat += "Patrol Station: [auto_patrol ? "Yes" : "No"]
"
+ dat += "Stationary Mode: [stationary_mode ? "Yes" : "No"]
"
+
+ return dat
+
+/mob/living/simple_animal/bot/firebot/emag_act(mob/user)
+ ..()
+ if(emagged == 1)
+ if(user)
+ to_chat(user, "[src] buzzes and beeps.")
+ audible_message("[src] buzzes oddly!")
+ playsound(src, "sparks", 75, TRUE)
+ if(user)
+ old_target_fire = user
+ extinguish_fires = FALSE
+ extinguish_people = TRUE
+
+ internal_ext.chem = "clf3" //Refill the internal extinguisher with liquid fire
+ internal_ext.power = 3
+ internal_ext.safety = FALSE
+ internal_ext.precision = FALSE
+ internal_ext.max_water = INFINITY
+ internal_ext.refill()
+
+/mob/living/simple_animal/bot/firebot/Topic(href, href_list)
+ if(..())
+ return TRUE
+
+ switch(href_list["operation"])
+ if("extinguish_fires")
+ extinguish_fires = !extinguish_fires
+ if("extinguish_people")
+ extinguish_people = !extinguish_people
+ if("stationary_mode")
+ stationary_mode = !stationary_mode
+
+ update_controls()
+ update_icon()
+
+/mob/living/simple_animal/bot/firebot/proc/is_burning(atom/target)
+ if(ismob(target))
+ var/mob/living/M = target
+ if(M.on_fire || (emagged == 1 && !M.on_fire))
+ return TRUE
+
+ else if(isturf(target))
+ var/turf/open/T = target
+ if(T.active_hotspot)
+ return TRUE
+
+ return FALSE
+
+/mob/living/simple_animal/bot/firebot/handle_automated_action()
+ if(!..())
+ return
+
+ if(IsStun())
+ old_target_fire = target_fire
+ target_fire = null
+ mode = BOT_IDLE
+ return
+
+ if(prob(1) && target_fire == null)
+ var/list/messagevoice = list("No fires detected." = 'sound/voice/firebot/nofires.ogg',
+ "Only you can prevent station fires." = 'sound/voice/firebot/onlyyou.ogg',
+ "Temperature nominal." = 'sound/voice/firebot/tempnominal.ogg',
+ "Keep it cool." = 'sound/voice/firebot/keepitcool.ogg')
+ var/message = pick(messagevoice)
+ speak(message)
+ playsound(src, messagevoice[message], 50)
+
+ // Couldn't reach the target, reset and try again ignoring the old one
+ if(frustration > 8)
+ old_target_fire = target_fire
+ soft_reset()
+
+ // We extinguished our target or it was deleted
+ if(QDELETED(target_fire) || !is_burning(target_fire) || isdead(target_fire))
+ target_fire = null
+ var/scan_range = (stationary_mode ? 1 : DEFAULT_SCAN_RANGE)
+
+ if(extinguish_people)
+ target_fire = scan(/mob/living, old_target_fire, scan_range) // Scan for burning humans first
+
+ if(target_fire == null && extinguish_fires)
+ target_fire = scan(/turf/open, old_target_fire, scan_range) // Scan for burning turfs second
+
+ old_target_fire = target_fire
+
+ // Target reached ENGAGE WATER CANNON
+ if(target_fire && (get_dist(src, target_fire) <= (emagged == 1 ? 1 : 2))) // Make the bot spray water from afar when not emagged
+ if((speech_cooldown + SPEECH_INTERVAL) < world.time)
+ if(ishuman(target_fire))
+ speak("Stop, drop and roll!")
+ playsound(src, "sound/voice/firebot/stopdropnroll.ogg", 50, 0)
+ else
+ speak("Extinguishing!")
+ playsound(src, "sound/voice/firebot/extinguishing.ogg", 50, 0)
+ speech_cooldown = world.time
+
+ flick("firebot1_use", src)
+ spray_water(target_fire, src)
+
+ soft_reset()
+
+ // Target ran away
+ else if(target_fire && path.len && (get_dist(target_fire,path[path.len]) > 2))
+ path = list()
+ mode = BOT_IDLE
+ last_found = world.time
+
+ else if(target_fire && stationary_mode)
+ soft_reset()
+ return
+
+ if(target_fire && (get_dist(src, target_fire) > 2))
+
+ path = get_path_to(src, get_turf(target_fire), /turf/proc/Distance_cardinal, 0, 30, 1, id=access_card)
+ mode = BOT_MOVING
+ if(!path.len)
+ soft_reset()
+
+ if(path.len > 0 && target_fire)
+ if(!bot_move(path[path.len]))
+ old_target_fire = target_fire
+ soft_reset()
+ return
+
+ // We got a target but it's too far away from us
+ if(path.len > 8 && target_fire)
+ frustration++
+
+ if(auto_patrol && !target_fire && !stationary_mode)
+ if(mode == BOT_IDLE || mode == BOT_START_PATROL)
+ start_patrol()
+
+ if(mode == BOT_PATROL)
+ bot_patrol()
+
+
+//Look for burning people or turfs around the bot
+/mob/living/simple_animal/bot/firebot/process_scan(atom/scan_target)
+ var/result
+
+ if(scan_target == src)
+ return result
+
+ if(is_burning(scan_target))
+ if((detected_cooldown + DETECTED_VOICE_INTERVAL) < world.time)
+ speak("Fire detected!")
+ playsound(src, "sound/voice/firebot/detected.ogg", 50, 0)
+ detected_cooldown = world.time
+ result = scan_target
+
+ return result
+
+/mob/living/simple_animal/bot/firebot/temperature_expose(datum/gas_mixture/air, temperature, volume)
+ if((temperature > T0C + 200 || temperature < BODYTEMP_COLD_DAMAGE_LIMIT) && foam_cooldown + FOAM_INTERVAL < world.time)
+ new /obj/effect/particle_effect/foam/firefighting(loc)
+ foam_cooldown = world.time
+ ..()
+
+/mob/living/simple_animal/bot/firebot/proc/spray_water(atom/target, mob/user)
+ if(stationary_mode)
+ flick("firebots_use", user)
+ else
+ flick("firebot1_use", user)
+ internal_ext.afterattack(target, user, null)
+
+/mob/living/simple_animal/bot/firebot/update_icon()
+ if(!on)
+ icon_state = "firebot0"
+ return
+ if(IsStun())
+ icon_state = "firebots1"
+ else if(stationary_mode) //Bot has yellow light to indicate stationary mode.
+ icon_state = "firebots1"
+ else
+ icon_state = "firebot1"
+
+
+/mob/living/simple_animal/bot/firebot/explode()
+ on = FALSE
+ visible_message("[src] blows apart!")
+
+ var/atom/Tsec = drop_location()
+
+ new /obj/item/assembly/prox_sensor(Tsec)
+ new /obj/item/clothing/head/hardhat/red(Tsec)
+
+ var/turf/T = get_turf(Tsec)
+
+ if(isopenturf(T))
+ var/turf/open/theturf = T
+ theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
+
+ if(prob(50))
+ drop_part(robot_arm, Tsec)
+
+ do_sparks(3, TRUE, src)
+ ..()
+
+/obj/machinery/bot_core/firebot
+ req_one_access = list(ACCESS_CONSTRUCTION, ACCESS_ROBOTICS)
+
+#undef SPEECH_INTERVAL
+#undef DETECTED_VOICE_INTERVAL
+#undef FOAM_INTERVAL
+
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 2c45743c55..dd08a009d4 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -130,7 +130,7 @@
/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/item/projectile/Proj)
if(!Proj)
return
- if(prob(50))
+ if(prob(25))
return ..()
else
visible_message("[src] blocks [Proj] with its shield!")
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 034ccc4c39..2001c61e12 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -61,6 +61,8 @@
var/mood = "" // To show its face
var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime
var/force_stasis = FALSE
+
+ do_footstep = TRUE
var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)")
///////////TIME FOR SUBSPECIES
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
deleted file mode 100644
index 173fd5a813..0000000000
--- a/code/modules/research/designs/autolathe_designs.dm
+++ /dev/null
@@ -1,888 +0,0 @@
-///////////////////////////////////
-//////////Autolathe Designs ///////
-///////////////////////////////////
-
-/datum/design/bucket
- name = "Bucket"
- id = "bucket"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 200)
- build_path = /obj/item/reagent_containers/glass/bucket
- category = list("initial","Tools")
-
-/datum/design/crowbar
- name = "Pocket Crowbar"
- id = "crowbar"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 50)
- build_path = /obj/item/crowbar
- category = list("initial","Tools")
-
-/datum/design/flashlight
- name = "Flashlight"
- id = "flashlight"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 20)
- build_path = /obj/item/flashlight
- category = list("initial","Tools")
-
-/datum/design/extinguisher
- name = "Fire Extinguisher"
- id = "extinguisher"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 90)
- build_path = /obj/item/extinguisher
- category = list("initial","Tools")
-
-/datum/design/pocketfireextinguisher
- name = "Pocket Fire Extinguisher"
- id = "pocketfireextinguisher"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 40)
- build_path = /obj/item/extinguisher/mini
- category = list("initial","Tools")
-
-/datum/design/multitool
- name = "Multitool"
- id = "multitool"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 20)
- build_path = /obj/item/multitool
- category = list("initial","Tools")
-
-/datum/design/analyzer
- name = "Analyzer"
- id = "analyzer"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30, MAT_GLASS = 20)
- build_path = /obj/item/analyzer
- category = list("initial","Tools")
-
-/datum/design/tscanner
- name = "T-Ray Scanner"
- id = "tscanner"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 150)
- build_path = /obj/item/t_scanner
- category = list("initial","Tools")
-
-/datum/design/weldingtool
- name = "Welding Tool"
- id = "welding_tool"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 70, MAT_GLASS = 20)
- build_path = /obj/item/weldingtool
- category = list("initial","Tools")
-
-/datum/design/mini_weldingtool
- name = "Emergency Welding Tool"
- id = "mini_welding_tool"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30, MAT_GLASS = 10)
- build_path = /obj/item/weldingtool/mini
- category = list("initial","Tools")
-
-/datum/design/screwdriver
- name = "Screwdriver"
- id = "screwdriver"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 75)
- build_path = /obj/item/screwdriver
- category = list("initial","Tools")
-
-/datum/design/wirecutters
- name = "Wirecutters"
- id = "wirecutters"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 80)
- build_path = /obj/item/wirecutters
- category = list("initial","Tools")
-
-/datum/design/wrench
- name = "Wrench"
- id = "wrench"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 150)
- build_path = /obj/item/wrench
- category = list("initial","Tools")
-
-/datum/design/welding_helmet
- name = "Welding Helmet"
- id = "welding_helmet"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 1750, MAT_GLASS = 400)
- build_path = /obj/item/clothing/head/welding
- category = list("initial","Tools")
-
-/datum/design/cable_coil
- name = "Cable Coil"
- id = "cable_coil"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 10, MAT_GLASS = 5)
- build_path = /obj/item/stack/cable_coil/random
- category = list("initial","Tools")
- maxstack = 30
-
-/datum/design/toolbox
- name = "Toolbox"
- id = "tool_box"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 500)
- build_path = /obj/item/storage/toolbox
- category = list("initial","Tools")
-
-/datum/design/apc_board
- name = "APC Module"
- id = "power control"
- build_type = AUTOLATHE | PROTOLATHE
- materials = list(MAT_METAL = 100, MAT_GLASS = 100)
- build_path = /obj/item/electronics/apc
- category = list("initial", "Electronics")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/airlock_board
- name = "Airlock Electronics"
- id = "airlock_board"
- build_type = AUTOLATHE | PROTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 50)
- build_path = /obj/item/electronics/airlock
- category = list("initial", "Electronics")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/firelock_board
- name = "Firelock Circuitry"
- id = "firelock_board"
- build_type = AUTOLATHE | PROTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 50)
- build_path = /obj/item/electronics/firelock
- category = list("initial", "Electronics")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/airalarm_electronics
- name = "Air Alarm Electronics"
- id = "airalarm_electronics"
- build_type = AUTOLATHE | PROTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 50)
- build_path = /obj/item/electronics/airalarm
- category = list("initial", "Electronics")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/firealarm_electronics
- name = "Fire Alarm Electronics"
- id = "firealarm_electronics"
- build_type = AUTOLATHE | PROTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 50)
- build_path = /obj/item/electronics/firealarm
- category = list("initial", "Electronics")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/camera
- name = "Camera"
- id = "camera"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 100)
- build_path = /obj/item/camera
- category = list("initial", "Misc")
-
-/datum/design/camera_film
- name = "Camera Film Cartridge"
- id = "camera_film"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 10, MAT_GLASS = 10)
- build_path = /obj/item/camera_film
- category = list("initial", "Misc")
-
-/datum/design/earmuffs
- name = "Earmuffs"
- id = "earmuffs"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 500)
- build_path = /obj/item/clothing/ears/earmuffs
- category = list("initial", "Misc")
-
-/datum/design/pipe_painter
- name = "Pipe Painter"
- id = "pipe_painter"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 5000, MAT_GLASS = 2000)
- build_path = /obj/item/pipe_painter
- category = list("initial", "Misc")
-
-/datum/design/airlock_painter
- name = "Airlock Painter"
- id = "airlock_painter"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 50)
- build_path = /obj/item/airlock_painter
- category = list("initial", "Misc")
-
-/datum/design/metal
- name = "Metal"
- id = "metal"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT)
- build_path = /obj/item/stack/sheet/metal
- category = list("initial","Construction")
- maxstack = 50
-
-/datum/design/glass
- name = "Glass"
- id = "glass"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
- build_path = /obj/item/stack/sheet/glass
- category = list("initial","Construction")
- maxstack = 50
-
-/datum/design/rglass
- name = "Reinforced Glass"
- id = "rglass"
- build_type = AUTOLATHE | SMELTER | PROTOLATHE
- materials = list(MAT_METAL = 1000, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
- build_path = /obj/item/stack/sheet/rglass
- category = list("initial","Construction","Stock Parts")
- maxstack = 50
-
-/datum/design/rods
- name = "Metal Rod"
- id = "rods"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 1000)
- build_path = /obj/item/stack/rods
- category = list("initial","Construction")
- maxstack = 50
-
-/datum/design/rcd_ammo
- name = "Compressed Matter Cartridge"
- id = "rcd_ammo"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 12000, MAT_GLASS=8000)
- build_path = /obj/item/rcd_ammo
- category = list("initial","Construction")
-
-/datum/design/kitchen_knife
- name = "Kitchen Knife"
- id = "kitchen_knife"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 12000)
- build_path = /obj/item/kitchen/knife
- category = list("initial","Dinnerware")
-
-/datum/design/fork
- name = "Fork"
- id = "fork"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 80)
- build_path = /obj/item/kitchen/fork
- category = list("initial","Dinnerware")
-
-/datum/design/tray
- name = "Tray"
- id = "tray"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 3000)
- build_path = /obj/item/storage/bag/tray
- category = list("initial","Dinnerware")
-
-/datum/design/bowl
- name = "Bowl"
- id = "bowl"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = 500)
- build_path = /obj/item/reagent_containers/glass/bowl
- category = list("initial","Dinnerware")
-
-/datum/design/drinking_glass
- name = "Drinking Glass"
- id = "drinking_glass"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = 500)
- build_path = /obj/item/reagent_containers/food/drinks/drinkingglass
- category = list("initial","Dinnerware")
-
-/datum/design/shot_glass
- name = "Shot Glass"
- id = "shot_glass"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = 100)
- build_path = /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass
- category = list("initial","Dinnerware")
-
-/datum/design/shaker
- name = "Shaker"
- id = "shaker"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 1500)
- build_path = /obj/item/reagent_containers/food/drinks/shaker
- category = list("initial","Dinnerware")
-
-/datum/design/cultivator
- name = "Cultivator"
- id = "cultivator"
- build_type = AUTOLATHE
- materials = list(MAT_METAL=50)
- build_path = /obj/item/cultivator
- category = list("initial","Misc")
-
-/datum/design/plant_analyzer
- name = "Plant Analyzer"
- id = "plant_analyzer"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30, MAT_GLASS = 20)
- build_path = /obj/item/plant_analyzer
- category = list("initial","Misc")
-
-/datum/design/shovel
- name = "Shovel"
- id = "shovel"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 50)
- build_path = /obj/item/shovel
- category = list("initial","Misc")
-
-/datum/design/spade
- name = "Spade"
- id = "spade"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 50)
- build_path = /obj/item/shovel/spade
- category = list("initial","Misc")
-
-/datum/design/hatchet
- name = "Hatchet"
- id = "hatchet"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 15000)
- build_path = /obj/item/hatchet
- category = list("initial","Misc")
-
-/datum/design/foilhat
- name = "Tinfoil Hat"
- id = "tinfoil_hat"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 5500)
- build_path = /obj/item/clothing/head/foilhat
- category = list("hacked", "Misc")
-
-/datum/design/scalpel
- name = "Scalpel"
- id = "scalpel"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000, MAT_GLASS = 1000)
- build_path = /obj/item/scalpel
- category = list("initial", "Medical")
-
-/datum/design/circular_saw
- name = "Circular Saw"
- id = "circular_saw"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
- build_path = /obj/item/circular_saw
- category = list("initial", "Medical")
-
-/datum/design/surgicaldrill
- name = "Surgical Drill"
- id = "surgicaldrill"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
- build_path = /obj/item/surgicaldrill
- category = list("initial", "Medical")
-
-/datum/design/retractor
- name = "Retractor"
- id = "retractor"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 6000, MAT_GLASS = 3000)
- build_path = /obj/item/retractor
- category = list("initial", "Medical")
-
-/datum/design/cautery
- name = "Cautery"
- id = "cautery"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 2500, MAT_GLASS = 750)
- build_path = /obj/item/cautery
- category = list("initial", "Medical")
-
-/datum/design/hemostat
- name = "Hemostat"
- id = "hemostat"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 5000, MAT_GLASS = 2500)
- build_path = /obj/item/hemostat
- category = list("initial", "Medical")
-
-/datum/design/beaker
- name = "Beaker"
- id = "beaker"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = 500)
- build_path = /obj/item/reagent_containers/glass/beaker
- category = list("initial", "Medical")
-
-/datum/design/large_beaker
- name = "Large Beaker"
- id = "large_beaker"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = 2500)
- build_path = /obj/item/reagent_containers/glass/beaker/large
- category = list("initial", "Medical")
-
-/datum/design/healthanalyzer
- name = "Health Analyzer"
- id = "healthanalyzer"
- build_type = AUTOLATHE | PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 50)
- build_path = /obj/item/healthanalyzer
- category = list("initial", "Medical")
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-/datum/design/pillbottle
- name = "Pill Bottle"
- id = "pillbottle"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 20, MAT_GLASS = 100)
- build_path = /obj/item/storage/pill_bottle
- category = list("initial", "Medical")
-
-/datum/design/beanbag_slug
- name = "Beanbag Slug"
- id = "beanbag_slug"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 250)
- build_path = /obj/item/ammo_casing/shotgun/beanbag
- category = list("initial", "Security")
-
-/datum/design/rubbershot
- name = "Rubber Shot"
- id = "rubber_shot"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000)
- build_path = /obj/item/ammo_casing/shotgun/rubbershot
- category = list("initial", "Security")
-
-/datum/design/c38
- name = "Speed Loader (.38 rubber)"
- id = "c38"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 20000)
- build_path = /obj/item/ammo_box/c38
- category = list("initial", "Security")
-
-/datum/design/recorder
- name = "Universal Recorder"
- id = "recorder"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 60, MAT_GLASS = 30)
- build_path = /obj/item/taperecorder/empty
- category = list("initial", "Misc")
-
-/datum/design/tape
- name = "Tape"
- id = "tape"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 20, MAT_GLASS = 5)
- build_path = /obj/item/tape/random
- category = list("initial", "Misc")
-
-/datum/design/igniter
- name = "Igniter"
- id = "igniter"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 50)
- build_path = /obj/item/assembly/igniter
- category = list("initial", "Misc")
-
-/datum/design/signaler
- name = "Remote Signaling Device"
- id = "signaler"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 400, MAT_GLASS = 120)
- build_path = /obj/item/assembly/signaler
- category = list("initial", "T-Comm")
-
-/datum/design/radio_headset
- name = "Radio Headset"
- id = "radio_headset"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 75)
- build_path = /obj/item/radio/headset
- category = list("initial", "T-Comm")
-
-/datum/design/bounced_radio
- name = "Station Bounced Radio"
- id = "bounced_radio"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 75, MAT_GLASS = 25)
- build_path = /obj/item/radio/off
- category = list("initial", "T-Comm")
-
-/datum/design/intercom_frame
- name = "Intercom Frame"
- id = "intercom_frame"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 75, MAT_GLASS = 25)
- build_path = /obj/item/wallframe/intercom
- category = list("initial", "T-Comm")
-
-/datum/design/infrared_emitter
- name = "Infrared Emitter"
- id = "infrared_emitter"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
- build_path = /obj/item/assembly/infra
- category = list("initial", "Misc")
-
-/datum/design/health_sensor
- name = "Health Sensor"
- id = "health_sensor"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 800, MAT_GLASS = 200)
- build_path = /obj/item/assembly/health
- category = list("initial", "Medical")
-
-/datum/design/timer
- name = "Timer"
- id = "timer"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 50)
- build_path = /obj/item/assembly/timer
- category = list("initial", "Misc")
-
-/datum/design/voice_analyser
- name = "Voice Analyser"
- id = "voice_analyser"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 50)
- build_path = /obj/item/assembly/voice
- category = list("initial", "Misc")
-
-/datum/design/light_tube
- name = "Light Tube"
- id = "light_tube"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = 100)
- build_path = /obj/item/light/tube
- category = list("initial", "Construction")
-
-/datum/design/light_bulb
- name = "Light Bulb"
- id = "light_bulb"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = 100)
- build_path = /obj/item/light/bulb
- category = list("initial", "Construction")
-
-/datum/design/camera_assembly
- name = "Camera Assembly"
- id = "camera_assembly"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 400, MAT_GLASS = 250)
- build_path = /obj/item/wallframe/camera
- category = list("initial", "Construction")
-
-/datum/design/newscaster_frame
- name = "Newscaster Frame"
- id = "newscaster_frame"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 14000, MAT_GLASS = 8000)
- build_path = /obj/item/wallframe/newscaster
- category = list("initial", "Construction")
-
-/datum/design/syringe
- name = "Syringe"
- id = "syringe"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 10, MAT_GLASS = 20)
- build_path = /obj/item/reagent_containers/syringe
- category = list("initial", "Medical")
-
-/datum/design/prox_sensor
- name = "Proximity Sensor"
- id = "prox_sensor"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 800, MAT_GLASS = 200)
- build_path = /obj/item/assembly/prox_sensor
- category = list("initial", "Misc")
-
-/datum/design/foam_dart
- name = "Box of Foam Darts"
- id = "foam_dart"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 500)
- build_path = /obj/item/ammo_box/foambox
- category = list("initial", "Misc")
-
-//hacked autolathe recipes
-/datum/design/flamethrower
- name = "Flamethrower"
- id = "flamethrower"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 500)
- build_path = /obj/item/flamethrower/full
- category = list("hacked", "Security")
-
-/datum/design/rcd
- name = "Rapid Construction Device (RCD)"
- id = "rcd"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000)
- build_path = /obj/item/construction/rcd
- category = list("hacked", "Construction")
-
-/datum/design/rpd
- name = "Rapid Pipe Dispenser (RPD)"
- id = "rpd"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 75000, MAT_GLASS = 37500)
- build_path = /obj/item/pipe_dispenser
- category = list("hacked", "Construction")
-
-/datum/design/electropack
- name = "Electropack"
- id = "electropack"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 10000, MAT_GLASS = 2500)
- build_path = /obj/item/electropack
- category = list("hacked", "Tools")
-
-/datum/design/large_welding_tool
- name = "Industrial Welding Tool"
- id = "large_welding_tool"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 70, MAT_GLASS = 60)
- build_path = /obj/item/weldingtool/largetank
- category = list("hacked", "Tools")
-
-/datum/design/handcuffs
- name = "Handcuffs"
- id = "handcuffs"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 500)
- build_path = /obj/item/restraints/handcuffs
- category = list("hacked", "Security")
-
-/datum/design/receiver
- name = "Modular Receiver"
- id = "receiver"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 15000)
- build_path = /obj/item/weaponcrafting/receiver
- category = list("hacked", "Security")
-
-/datum/design/shotgun_slug
- name = "Shotgun Slug"
- id = "shotgun_slug"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000)
- build_path = /obj/item/ammo_casing/shotgun
- category = list("hacked", "Security")
-
-/datum/design/buckshot_shell
- name = "Buckshot Shell"
- id = "buckshot_shell"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000)
- build_path = /obj/item/ammo_casing/shotgun/buckshot
- category = list("hacked", "Security")
-
-/datum/design/shotgun_dart
- name = "Shotgun Dart"
- id = "shotgun_dart"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000)
- build_path = /obj/item/ammo_casing/shotgun/dart
- category = list("hacked", "Security")
-
-/datum/design/incendiary_slug
- name = "Incendiary Slug"
- id = "incendiary_slug"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000)
- build_path = /obj/item/ammo_casing/shotgun/incendiary
- category = list("hacked", "Security")
-
-/datum/design/riot_dart
- name = "Foam Riot Dart"
- id = "riot_dart"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 1000) //Discount for making individually - no box = less metal!
- build_path = /obj/item/ammo_casing/caseless/foam_dart/riot
- category = list("hacked", "Security")
-
-/datum/design/riot_darts
- name = "Foam Riot Dart Box"
- id = "riot_darts"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 50000) //Comes with 40 darts
- build_path = /obj/item/ammo_box/foambox/riot
- category = list("hacked", "Security")
-
-/datum/design/a357
- name = "Speed Loader (.357)"
- id = "a357"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000)
- build_path = /obj/item/ammo_box/a357
- category = list("hacked", "Security")
-
-/datum/design/c10mm
- name = "Ammo Box (10mm)"
- id = "c10mm"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000)
- build_path = /obj/item/ammo_box/c10mm
- category = list("hacked", "Security")
-
-/datum/design/c45
- name = "Ammo Box (.45)"
- id = "c45"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000)
- build_path = /obj/item/ammo_box/c45
- category = list("hacked", "Security")
-
-/datum/design/c9mm
- name = "Ammo Box (9mm)"
- id = "c9mm"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000)
- build_path = /obj/item/ammo_box/c9mm
- category = list("hacked", "Security")
-
-/datum/design/cleaver
- name = "Butcher's Cleaver"
- id = "cleaver"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 18000)
- build_path = /obj/item/kitchen/knife/butcher
- category = list("hacked", "Dinnerware")
-
-/datum/design/spraycan
- name = "Spraycan"
- id = "spraycan"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 100, MAT_GLASS = 100)
- build_path = /obj/item/toy/crayon/spraycan
- category = list("initial", "Tools")
-
-/datum/design/desttagger
- name = "Destination Tagger"
- id = "desttagger"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 250, MAT_GLASS = 125)
- build_path = /obj/item/destTagger
- category = list("initial", "Electronics")
-
-/datum/design/handlabeler
- name = "Hand Labeler"
- id = "handlabel"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 150, MAT_GLASS = 125)
- build_path = /obj/item/hand_labeler
- category = list("initial", "Electronics")
-
-/datum/design/geiger
- name = "Geiger Counter"
- id = "geigercounter"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 150, MAT_GLASS = 150)
- build_path = /obj/item/geiger_counter
- category = list("initial", "Tools")
-
-/datum/design/turret_control_frame
- name = "Turret Control Frame"
- id = "turret_control"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 12000)
- build_path = /obj/item/wallframe/turret_control
- category = list("initial", "Construction")
-
-/datum/design/conveyor_belt
- name = "Conveyor Belt"
- id = "conveyor_belt"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 5000)
- build_path = /obj/item/conveyor_construct
- category = list("initial", "Construction")
-
-/datum/design/conveyor_switch
- name = "Conveyor Belt Switch"
- id = "conveyor_switch"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 450, MAT_GLASS = 190)
- build_path = /obj/item/conveyor_switch_construct
- category = list("initial", "Construction")
-
-/datum/design/laptop
- name = "Laptop Frame"
- id = "laptop"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 10000, MAT_GLASS = 1000)
- build_path = /obj/item/modular_computer/laptop/buildable
- category = list("initial","Misc")
-
-/datum/design/tablet
- name = "Tablet Frame"
- id = "tablet"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
- build_path = /obj/item/modular_computer/tablet
- category = list("initial","Misc")
-
-/datum/design/slime_scanner
- name = "Slime Scanner"
- id = "slime_scanner"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 300, MAT_GLASS = 200)
- build_path = /obj/item/slime_scanner
- category = list("initial", "Misc")
-
-/datum/design/pet_carrier
- name = "Pet Carrier"
- id = "pet_carrier"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 7500, MAT_GLASS = 100)
- build_path = /obj/item/pet_carrier
- category = list("initial", "Misc")
-
-/datum/design/miniature_power_cell
- name = "Light Fixture Battery"
- id = "miniature_power_cell"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = 20)
- build_path = /obj/item/stock_parts/cell/emergency_light
- category = list("initial", "Electronics")
-
-/datum/design/packageWrap
- name = "Package Wrapping"
- id = "packagewrap"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 200, MAT_GLASS = 200)
- build_path = /obj/item/stack/packageWrap
- category = list("initial", "Misc")
- maxstack = 30
-
-/datum/design/holodisk
- name = "Holodisk"
- id = "holodisk"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 100, MAT_GLASS = 100)
- build_path = /obj/item/disk/holodisk
- category = list("initial", "Misc")
-
-/datum/design/lock_collar
- name = "Lockable Collar"
- id = "lock_collar"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 1200, MAT_GLASS = 100)
- build_path = /obj/item/clothing/neck/petcollar/locked
- category = list("initial", "Misc")
-
-/datum/design/collar_key
- name = "Collar Key"
- id = "collar_key"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 300, MAT_GLASS = 150)
- build_path = /obj/item/key/collar
- category = list("initial", "Misc")
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_construction.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_construction.dm
new file mode 100644
index 0000000000..1ae1d3813b
--- /dev/null
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_construction.dm
@@ -0,0 +1,108 @@
+///////////////////////////////////
+//////////Autolathe Designs ///////
+///////////////////////////////////
+
+
+////////////////
+///Construction//
+////////////////
+
+/datum/design/rods
+ name = "Metal Rod"
+ id = "rods"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1000)
+ build_path = /obj/item/stack/rods
+ category = list("initial","Construction")
+ maxstack = 50
+
+/datum/design/metal
+ name = "Metal"
+ id = "metal"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT)
+ build_path = /obj/item/stack/sheet/metal
+ category = list("initial","Construction")
+ maxstack = 50
+
+/datum/design/glass
+ name = "Glass"
+ id = "glass"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
+ build_path = /obj/item/stack/sheet/glass
+ category = list("initial","Construction")
+ maxstack = 50
+
+/datum/design/rglass
+ name = "Reinforced Glass"
+ id = "rglass"
+ build_type = AUTOLATHE | SMELTER | PROTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
+ build_path = /obj/item/stack/sheet/rglass
+ category = list("initial","Construction","Stock Parts")
+ maxstack = 50
+
+/datum/design/light_tube
+ name = "Light Tube"
+ id = "light_tube"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 100)
+ build_path = /obj/item/light/tube
+ category = list("initial", "Construction")
+
+/datum/design/light_bulb
+ name = "Light Bulb"
+ id = "light_bulb"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 100)
+ build_path = /obj/item/light/bulb
+ category = list("initial", "Construction")
+
+/datum/design/camera_assembly
+ name = "Camera Assembly"
+ id = "camera_assembly"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 400, MAT_GLASS = 250)
+ build_path = /obj/item/wallframe/camera
+ category = list("initial", "Construction")
+
+/datum/design/newscaster_frame
+ name = "Newscaster Frame"
+ id = "newscaster_frame"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 14000, MAT_GLASS = 8000)
+ build_path = /obj/item/wallframe/newscaster
+ category = list("initial", "Construction")
+
+/datum/design/turret_control_frame
+ name = "Turret Control Frame"
+ id = "turret_control"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 12000)
+ build_path = /obj/item/wallframe/turret_control
+ category = list("initial", "Construction")
+
+/datum/design/conveyor_belt
+ name = "Conveyor Belt"
+ id = "conveyor_belt"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 5000)
+ build_path = /obj/item/conveyor_construct
+ category = list("initial", "Construction")
+
+/datum/design/conveyor_switch
+ name = "Conveyor Belt Switch"
+ id = "conveyor_switch"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 450, MAT_GLASS = 190)
+ build_path = /obj/item/conveyor_switch_construct
+ category = list("initial", "Construction")
+
+/datum/design/rcd_ammo
+ name = "Compressed Matter Cartridge"
+ id = "rcd_ammo"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 12000, MAT_GLASS=8000)
+ build_path = /obj/item/rcd_ammo
+ category = list("initial","Construction")
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm
new file mode 100644
index 0000000000..5b247efe74
--- /dev/null
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm
@@ -0,0 +1,76 @@
+///////////////////////////////////
+//////////Autolathe Designs ///////
+///////////////////////////////////
+
+////////////////
+///Electronics//
+////////////////
+
+/datum/design/apc_board
+ name = "APC Module"
+ id = "power control"
+ build_type = AUTOLATHE | PROTOLATHE
+ materials = list(MAT_METAL = 100, MAT_GLASS = 100)
+ build_path = /obj/item/electronics/apc
+ category = list("initial", "Electronics")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/airlock_board
+ name = "Airlock Electronics"
+ id = "airlock_board"
+ build_type = AUTOLATHE | PROTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 50)
+ build_path = /obj/item/electronics/airlock
+ category = list("initial", "Electronics")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/firelock_board
+ name = "Firelock Circuitry"
+ id = "firelock_board"
+ build_type = AUTOLATHE | PROTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 50)
+ build_path = /obj/item/electronics/firelock
+ category = list("initial", "Electronics")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/airalarm_electronics
+ name = "Air Alarm Electronics"
+ id = "airalarm_electronics"
+ build_type = AUTOLATHE | PROTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 50)
+ build_path = /obj/item/electronics/airalarm
+ category = list("initial", "Electronics")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/firealarm_electronics
+ name = "Fire Alarm Electronics"
+ id = "firealarm_electronics"
+ build_type = AUTOLATHE | PROTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 50)
+ build_path = /obj/item/electronics/firealarm
+ category = list("initial", "Electronics")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/desttagger
+ name = "Destination Tagger"
+ id = "desttagger"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 250, MAT_GLASS = 125)
+ build_path = /obj/item/destTagger
+ category = list("initial", "Electronics")
+
+/datum/design/handlabeler
+ name = "Hand Labeler"
+ id = "handlabel"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 150, MAT_GLASS = 125)
+ build_path = /obj/item/hand_labeler
+ category = list("initial", "Electronics")
+
+/datum/design/miniature_power_cell
+ name = "Light Fixture Battery"
+ id = "miniature_power_cell"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 20)
+ build_path = /obj/item/stock_parts/cell/emergency_light
+ category = list("initial", "Electronics")
\ No newline at end of file
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm
new file mode 100644
index 0000000000..27852b2798
--- /dev/null
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm
@@ -0,0 +1,179 @@
+///////////////////////////////////
+//////////Autolathe Designs ///////
+///////////////////////////////////
+////////////////
+////Dinnerware//
+////////////////
+
+/datum/design/kitchen_knife
+ name = "Kitchen Knife"
+ id = "kitchen_knife"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 12000)
+ build_path = /obj/item/kitchen/knife
+ category = list("initial","Dinnerware")
+
+/datum/design/fork
+ name = "Fork"
+ id = "fork"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 80)
+ build_path = /obj/item/kitchen/fork
+ category = list("initial","Dinnerware")
+
+/datum/design/tray
+ name = "Tray"
+ id = "tray"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 3000)
+ build_path = /obj/item/storage/bag/tray
+ category = list("initial","Dinnerware")
+
+/datum/design/bowl
+ name = "Bowl"
+ id = "bowl"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 500)
+ build_path = /obj/item/reagent_containers/glass/bowl
+ category = list("initial","Dinnerware")
+
+/datum/design/drinking_glass
+ name = "Drinking Glass"
+ id = "drinking_glass"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 500)
+ build_path = /obj/item/reagent_containers/food/drinks/drinkingglass
+ category = list("initial","Dinnerware")
+
+/datum/design/shot_glass
+ name = "Shot Glass"
+ id = "shot_glass"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 100)
+ build_path = /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass
+ category = list("initial","Dinnerware")
+
+/datum/design/shaker
+ name = "Shaker"
+ id = "shaker"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1500)
+ build_path = /obj/item/reagent_containers/food/drinks/shaker
+ category = list("initial","Dinnerware")
+
+////////////
+///Medical//
+////////////
+
+/datum/design/scalpel
+ name = "Scalpel"
+ id = "scalpel"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 4000, MAT_GLASS = 1000)
+ build_path = /obj/item/scalpel
+ category = list("initial", "Medical")
+
+/datum/design/circular_saw
+ name = "Circular Saw"
+ id = "circular_saw"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
+ build_path = /obj/item/circular_saw
+ category = list("initial", "Medical")
+
+/datum/design/surgicaldrill
+ name = "Surgical Drill"
+ id = "surgicaldrill"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
+ build_path = /obj/item/surgicaldrill
+ category = list("initial", "Medical")
+
+/datum/design/retractor
+ name = "Retractor"
+ id = "retractor"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 6000, MAT_GLASS = 3000)
+ build_path = /obj/item/retractor
+ category = list("initial", "Medical")
+
+/datum/design/cautery
+ name = "Cautery"
+ id = "cautery"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 2500, MAT_GLASS = 750)
+ build_path = /obj/item/cautery
+ category = list("initial", "Medical")
+
+/datum/design/hemostat
+ name = "Hemostat"
+ id = "hemostat"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_GLASS = 2500)
+ build_path = /obj/item/hemostat
+ category = list("initial", "Medical")
+
+/datum/design/beaker
+ name = "Beaker"
+ id = "beaker"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 500)
+ build_path = /obj/item/reagent_containers/glass/beaker
+ category = list("initial", "Medical")
+
+/datum/design/large_beaker
+ name = "Large Beaker"
+ id = "large_beaker"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 2500)
+ build_path = /obj/item/reagent_containers/glass/beaker/large
+ category = list("initial", "Medical")
+
+/datum/design/healthanalyzer
+ name = "Health Analyzer"
+ id = "healthanalyzer"
+ build_type = AUTOLATHE | PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 50)
+ build_path = /obj/item/healthanalyzer
+ category = list("initial", "Medical")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+/datum/design/pillbottle
+ name = "Pill Bottle"
+ id = "pillbottle"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 20, MAT_GLASS = 100)
+ build_path = /obj/item/storage/pill_bottle
+ category = list("initial", "Medical")
+
+/datum/design/syringe
+ name = "Syringe"
+ id = "syringe"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 10, MAT_GLASS = 20)
+ build_path = /obj/item/reagent_containers/syringe
+ category = list("initial", "Medical")
+
+/datum/design/health_sensor
+ name = "Health Sensor"
+ id = "health_sensor"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 200)
+ build_path = /obj/item/assembly/health
+ category = list("initial", "Medical")
+
+/datum/design/hypovialsmall
+ name = "Hypovial"
+ id = "hypovial"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500)
+ build_path = /obj/item/reagent_containers/glass/bottle/vial/small
+ category = list("initial","Medical")
+
+/datum/design/hypoviallarge
+ name = "Large Hypovial"
+ id = "large_hypovial"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 2500)
+ build_path = /obj/item/reagent_containers/glass/bottle/vial/large
+ category = list("initial","Medical")
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm
new file mode 100644
index 0000000000..e5e3a6bb4f
--- /dev/null
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm
@@ -0,0 +1,186 @@
+///////////////////////////////////
+//////////Autolathe Designs ///////
+///////////////////////////////////
+/////////////
+////Secgear//
+/////////////
+
+/datum/design/beanbag_slug
+ name = "Beanbag Slug"
+ id = "beanbag_slug"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 250)
+ build_path = /obj/item/ammo_casing/shotgun/beanbag
+ category = list("initial", "Security")
+
+/datum/design/rubbershot
+ name = "Rubber Shot"
+ id = "rubber_shot"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 4000)
+ build_path = /obj/item/ammo_casing/shotgun/rubbershot
+ category = list("initial", "Security")
+
+/datum/design/c38
+ name = "Speed Loader (.38 rubber)"
+ id = "c38"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 20000)
+ build_path = /obj/item/ammo_box/c38
+ category = list("initial", "Security")
+
+/////////////////
+///Hacked Gear //
+/////////////////
+
+/datum/design/large_welding_tool
+ name = "Industrial Welding Tool"
+ id = "large_welding_tool"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 70, MAT_GLASS = 60)
+ build_path = /obj/item/weldingtool/largetank
+ category = list("hacked", "Tools")
+
+/datum/design/flamethrower
+ name = "Flamethrower"
+ id = "flamethrower"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500)
+ build_path = /obj/item/flamethrower/full
+ category = list("hacked", "Security")
+
+/datum/design/rcd
+ name = "Rapid Construction Device (RCD)"
+ id = "rcd"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/construction/rcd
+ category = list("hacked", "Construction")
+
+/datum/design/rpd
+ name = "Rapid Pipe Dispenser (RPD)"
+ id = "rpd"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 75000, MAT_GLASS = 37500)
+ build_path = /obj/item/pipe_dispenser
+ category = list("hacked", "Construction")
+
+/datum/design/handcuffs
+ name = "Handcuffs"
+ id = "handcuffs"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500)
+ build_path = /obj/item/restraints/handcuffs
+ category = list("hacked", "Security")
+
+/datum/design/receiver
+ name = "Modular Receiver"
+ id = "receiver"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 15000)
+ build_path = /obj/item/weaponcrafting/receiver
+ category = list("hacked", "Security")
+
+/datum/design/shotgun_slug
+ name = "Shotgun Slug"
+ id = "shotgun_slug"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 4000)
+ build_path = /obj/item/ammo_casing/shotgun
+ category = list("hacked", "Security")
+
+/datum/design/buckshot_shell
+ name = "Buckshot Shell"
+ id = "buckshot_shell"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 4000)
+ build_path = /obj/item/ammo_casing/shotgun/buckshot
+ category = list("hacked", "Security")
+
+/datum/design/shotgun_dart
+ name = "Shotgun Dart"
+ id = "shotgun_dart"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 4000)
+ build_path = /obj/item/ammo_casing/shotgun/dart
+ category = list("hacked", "Security")
+
+/datum/design/incendiary_slug
+ name = "Incendiary Slug"
+ id = "incendiary_slug"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 4000)
+ build_path = /obj/item/ammo_casing/shotgun/incendiary
+ category = list("hacked", "Security")
+
+/datum/design/riot_dart
+ name = "Foam Riot Dart"
+ id = "riot_dart"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1000) //Discount for making individually - no box = less metal!
+ build_path = /obj/item/ammo_casing/caseless/foam_dart/riot
+ category = list("hacked", "Security")
+
+/datum/design/riot_darts
+ name = "Foam Riot Dart Box"
+ id = "riot_darts"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 50000) //Comes with 40 darts
+ build_path = /obj/item/ammo_box/foambox/riot
+ category = list("hacked", "Security")
+
+/datum/design/a357
+ name = "Speed Loader (.357)"
+ id = "a357"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/ammo_box/a357
+ category = list("hacked", "Security")
+
+/datum/design/c10mm
+ name = "Ammo Box (10mm)"
+ id = "c10mm"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/ammo_box/c10mm
+ category = list("hacked", "Security")
+
+/datum/design/c45
+ name = "Ammo Box (.45)"
+ id = "c45"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/ammo_box/c45
+ category = list("hacked", "Security")
+
+/datum/design/c9mm
+ name = "Ammo Box (9mm)"
+ id = "c9mm"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/ammo_box/c9mm
+ category = list("hacked", "Security")
+
+/datum/design/electropack
+ name = "Electropack"
+ id = "electropack"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 2500)
+ build_path = /obj/item/electropack
+ category = list("hacked", "Security")
+
+/datum/design/cleaver
+ name = "Butcher's Cleaver"
+ id = "cleaver"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 18000)
+ build_path = /obj/item/kitchen/knife/butcher
+ category = list("hacked", "Dinnerware")
+
+/datum/design/foilhat
+ name = "Tinfoil Hat"
+ id = "tinfoil_hat"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 5500)
+ build_path = /obj/item/clothing/head/foilhat
+ category = list("hacked", "Misc")
\ No newline at end of file
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm
new file mode 100644
index 0000000000..29d28b7132
--- /dev/null
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm
@@ -0,0 +1,251 @@
+///////////////////////////////////
+//////////Autolathe Designs ///////
+///////////////////////////////////
+/////////////
+////T-Comms//
+/////////////
+
+/datum/design/signaler
+ name = "Remote Signaling Device"
+ id = "signaler"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 400, MAT_GLASS = 120)
+ build_path = /obj/item/assembly/signaler
+ category = list("initial", "T-Comm")
+
+/datum/design/radio_headset
+ name = "Radio Headset"
+ id = "radio_headset"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 75)
+ build_path = /obj/item/radio/headset
+ category = list("initial", "T-Comm")
+
+/datum/design/bounced_radio
+ name = "Station Bounced Radio"
+ id = "bounced_radio"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 75, MAT_GLASS = 25)
+ build_path = /obj/item/radio/off
+ category = list("initial", "T-Comm")
+
+/datum/design/intercom_frame
+ name = "Intercom Frame"
+ id = "intercom_frame"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 75, MAT_GLASS = 25)
+ build_path = /obj/item/wallframe/intercom
+ category = list("initial", "T-Comm")
+
+/////////////
+////MISC/////
+/////////////
+
+/datum/design/camera
+ name = "Camera"
+ id = "camera"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 100)
+ build_path = /obj/item/camera
+ category = list("initial", "Misc")
+
+/datum/design/camera_film
+ name = "Camera Film Cartridge"
+ id = "camera_film"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 10, MAT_GLASS = 10)
+ build_path = /obj/item/camera_film
+ category = list("initial", "Misc")
+
+/datum/design/earmuffs
+ name = "Earmuffs"
+ id = "earmuffs"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/clothing/ears/earmuffs
+ category = list("initial", "Misc")
+
+/datum/design/pipe_painter
+ name = "Pipe Painter"
+ id = "pipe_painter"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_GLASS = 2000)
+ build_path = /obj/item/pipe_painter
+ category = list("initial", "Misc")
+
+/datum/design/airlock_painter
+ name = "Airlock Painter"
+ id = "airlock_painter"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 50)
+ build_path = /obj/item/airlock_painter
+ category = list("initial", "Misc")
+
+/datum/design/cultivator
+ name = "Cultivator"
+ id = "cultivator"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL=50)
+ build_path = /obj/item/cultivator
+ category = list("initial","Misc")
+
+/datum/design/plant_analyzer
+ name = "Plant Analyzer"
+ id = "plant_analyzer"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30, MAT_GLASS = 20)
+ build_path = /obj/item/plant_analyzer
+ category = list("initial","Misc")
+
+/datum/design/shovel
+ name = "Shovel"
+ id = "shovel"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 50)
+ build_path = /obj/item/shovel
+ category = list("initial","Misc")
+
+/datum/design/spade
+ name = "Spade"
+ id = "spade"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 50)
+ build_path = /obj/item/shovel/spade
+ category = list("initial","Misc")
+
+/datum/design/hatchet
+ name = "Hatchet"
+ id = "hatchet"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 15000)
+ build_path = /obj/item/hatchet
+ category = list("initial","Misc")
+
+/datum/design/recorder
+ name = "Universal Recorder"
+ id = "recorder"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 60, MAT_GLASS = 30)
+ build_path = /obj/item/taperecorder/empty
+ category = list("initial", "Misc")
+
+/datum/design/tape
+ name = "Tape"
+ id = "tape"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 20, MAT_GLASS = 5)
+ build_path = /obj/item/tape/random
+ category = list("initial", "Misc")
+
+/datum/design/igniter
+ name = "Igniter"
+ id = "igniter"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 50)
+ build_path = /obj/item/assembly/igniter
+ category = list("initial", "Misc")
+
+/datum/design/infrared_emitter
+ name = "Infrared Emitter"
+ id = "infrared_emitter"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
+ build_path = /obj/item/assembly/infra
+ category = list("initial", "Misc")
+
+/datum/design/timer
+ name = "Timer"
+ id = "timer"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 50)
+ build_path = /obj/item/assembly/timer
+ category = list("initial", "Misc")
+
+/datum/design/voice_analyser
+ name = "Voice Analyser"
+ id = "voice_analyser"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 50)
+ build_path = /obj/item/assembly/voice
+ category = list("initial", "Misc")
+
+/datum/design/prox_sensor
+ name = "Proximity Sensor"
+ id = "prox_sensor"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 200)
+ build_path = /obj/item/assembly/prox_sensor
+ category = list("initial", "Misc")
+
+/datum/design/foam_dart
+ name = "Box of Foam Darts"
+ id = "foam_dart"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500)
+ build_path = /obj/item/ammo_box/foambox
+ category = list("initial", "Misc")
+
+/datum/design/laptop
+ name = "Laptop Frame"
+ id = "laptop"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 1000)
+ build_path = /obj/item/modular_computer/laptop/buildable
+ category = list("initial","Misc")
+
+/datum/design/tablet
+ name = "Tablet Frame"
+ id = "tablet"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
+ build_path = /obj/item/modular_computer/tablet
+ category = list("initial","Misc")
+
+/datum/design/slime_scanner
+ name = "Slime Scanner"
+ id = "slime_scanner"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 300, MAT_GLASS = 200)
+ build_path = /obj/item/slime_scanner
+ category = list("initial", "Misc")
+
+/datum/design/pet_carrier
+ name = "Pet Carrier"
+ id = "pet_carrier"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 7500, MAT_GLASS = 100)
+ build_path = /obj/item/pet_carrier
+ category = list("initial", "Misc")
+
+/datum/design/packageWrap
+ name = "Package Wrapping"
+ id = "packagewrap"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 200, MAT_GLASS = 200)
+ build_path = /obj/item/stack/packageWrap
+ category = list("initial", "Misc")
+ maxstack = 30
+
+/datum/design/holodisk
+ name = "Holodisk"
+ id = "holodisk"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 100, MAT_GLASS = 100)
+ build_path = /obj/item/disk/holodisk
+ category = list("initial", "Misc")
+
+/datum/design/lock_collar
+ name = "Lockable Collar"
+ id = "lock_collar"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1200, MAT_GLASS = 100)
+ build_path = /obj/item/clothing/neck/petcollar/locked
+ category = list("initial", "Misc")
+
+/datum/design/collar_key
+ name = "Collar Key"
+ id = "collar_key"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 300, MAT_GLASS = 150)
+ build_path = /obj/item/key/collar
+ category = list("initial", "Misc")
\ No newline at end of file
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
new file mode 100644
index 0000000000..435af80aea
--- /dev/null
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
@@ -0,0 +1,150 @@
+///////////////////////////////////
+//////////Autolathe Designs ///////
+///////////////////////////////////
+///////////
+///Tools //
+///////////
+/datum/design/bucket
+ name = "Bucket"
+ id = "bucket"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 200)
+ build_path = /obj/item/reagent_containers/glass/bucket
+ category = list("initial","Tools")
+
+/datum/design/crowbar
+ name = "Pocket Crowbar"
+ id = "crowbar"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 50)
+ build_path = /obj/item/crowbar
+ category = list("initial","Tools")
+
+/datum/design/flashlight
+ name = "Flashlight"
+ id = "flashlight"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 20)
+ build_path = /obj/item/flashlight
+ category = list("initial","Tools")
+
+/datum/design/extinguisher
+ name = "Fire Extinguisher"
+ id = "extinguisher"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 90)
+ build_path = /obj/item/extinguisher
+ category = list("initial","Tools")
+
+/datum/design/pocketfireextinguisher
+ name = "Pocket Fire Extinguisher"
+ id = "pocketfireextinguisher"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 40)
+ build_path = /obj/item/extinguisher/mini
+ category = list("initial","Tools")
+
+/datum/design/multitool
+ name = "Multitool"
+ id = "multitool"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 20)
+ build_path = /obj/item/multitool
+ category = list("initial","Tools")
+
+/datum/design/analyzer
+ name = "Analyzer"
+ id = "analyzer"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30, MAT_GLASS = 20)
+ build_path = /obj/item/analyzer
+ category = list("initial","Tools")
+
+/datum/design/tscanner
+ name = "T-Ray Scanner"
+ id = "tscanner"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 150)
+ build_path = /obj/item/t_scanner
+ category = list("initial","Tools")
+
+/datum/design/weldingtool
+ name = "Welding Tool"
+ id = "welding_tool"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 70, MAT_GLASS = 20)
+ build_path = /obj/item/weldingtool
+ category = list("initial","Tools")
+
+/datum/design/mini_weldingtool
+ name = "Emergency Welding Tool"
+ id = "mini_welding_tool"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30, MAT_GLASS = 10)
+ build_path = /obj/item/weldingtool/mini
+ category = list("initial","Tools")
+
+/datum/design/screwdriver
+ name = "Screwdriver"
+ id = "screwdriver"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 75)
+ build_path = /obj/item/screwdriver
+ category = list("initial","Tools")
+
+/datum/design/wirecutters
+ name = "Wirecutters"
+ id = "wirecutters"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 80)
+ build_path = /obj/item/wirecutters
+ category = list("initial","Tools")
+
+/datum/design/wrench
+ name = "Wrench"
+ id = "wrench"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 150)
+ build_path = /obj/item/wrench
+ category = list("initial","Tools")
+
+/datum/design/welding_helmet
+ name = "Welding Helmet"
+ id = "welding_helmet"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1750, MAT_GLASS = 400)
+ build_path = /obj/item/clothing/head/welding
+ category = list("initial","Tools")
+
+/datum/design/cable_coil
+ name = "Cable Coil"
+ id = "cable_coil"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 10, MAT_GLASS = 5)
+ build_path = /obj/item/stack/cable_coil/random
+ category = list("initial","Tools")
+ maxstack = 30
+
+/datum/design/toolbox
+ name = "Toolbox"
+ id = "tool_box"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500)
+ build_path = /obj/item/storage/toolbox
+ category = list("initial","Tools")
+
+/datum/design/spraycan
+ name = "Spraycan"
+ id = "spraycan"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 100, MAT_GLASS = 100)
+ build_path = /obj/item/toy/crayon/spraycan
+ category = list("initial", "Tools")
+
+/datum/design/geiger
+ name = "Geiger Counter"
+ id = "geigercounter"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 150, MAT_GLASS = 150)
+ build_path = /obj/item/geiger_counter
+ category = list("initial", "Tools")
\ No newline at end of file
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index aea3a3755f..9005b1cd30 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -196,8 +196,8 @@
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defib_heal
- name = "Defibrillartor Healing disk"
- desc = "A disk allowing for greater amounts of healing"
+ name = "Defibrillator Healing disk"
+ desc = "An upgrade which increases the healing power of the defibrillator"
id = "defib_heal"
build_type = PROTOLATHE
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 6000, MAT_SILVER = 6000)
@@ -207,8 +207,8 @@
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defib_shock
- name = "Defibrillartor Anit-Shock Disk"
- desc = "A disk that helps agains shocking anyone, other then the intented target"
+ name = "Defibrillator Anti-Shock Disk"
+ desc = "A safety upgrade that guarantees only the patient will get shocked"
id = "defib_shock"
build_type = PROTOLATHE
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 6000, MAT_SILVER = 6000)
@@ -218,8 +218,8 @@
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defib_decay
- name = "Defibrillartor Body-Decay extender Disk"
- desc = "A disk that helps defibrillator revive the longer decayed dead"
+ name = "Defibrillator Body-Decay Extender Disk"
+ desc = "An upgrade allowing the defibrillator to work on more decayed bodies"
id = "defib_decay"
build_type = PROTOLATHE
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 16000, MAT_SILVER = 6000, MAT_TITANIUM = 2000)
@@ -229,8 +229,8 @@
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defib_speed
- name = "Defibrllartor Pre-Primer Disk"
- desc = "A disk that cuts the time charg time in half for defibrillator use"
+ name = "Defibrillator Fast Charge Disk"
+ desc = "An upgrade to the defibrillator capacitors, which let it charge faster"
id = "defib_speed"
build_type = PROTOLATHE
build_path = /obj/item/disk/medical/defib_speed
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index aa091d181c..e25dced31c 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -102,8 +102,8 @@
/datum/techweb_node/adv_defibrillator_tec
id = "adv_defibrillator_tec"
- display_name = "Adv Defibrillator tec"
- description = "More ways to bring back the freshly dead."
+ display_name = "Defibrillator Upgrades"
+ description = "More ways to bring back the newly dead."
prereq_ids = list("adv_biotech", "exp_surgery", "adv_engi", "adv_power")
design_ids = list("defib_decay", "defib_shock", "defib_heal", "defib_speed")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index dfdf0fde69..71b659b73f 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -385,6 +385,8 @@
. = list()
var/image_dir = 0
+ var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable
+
if(dropped)
image_dir = SOUTH
if(dmg_overlay_type)
@@ -393,8 +395,11 @@
if(burnstate)
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir)
if(body_markings && status != BODYPART_ROBOTIC)
- if(use_digitigrade == NOT_DIGITIGRADE)
- . += image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ if(!use_digitigrade)
+ if(BODY_ZONE_CHEST)
+ . += image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)
+ else
+ . += image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
. += image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
@@ -417,8 +422,6 @@
limb.icon_state = "[animal_origin]_[body_zone]"
return
- var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable
-
if((body_zone != BODY_ZONE_HEAD && body_zone != BODY_ZONE_CHEST))
should_draw_gender = FALSE
@@ -454,7 +457,10 @@
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else if(!use_digitigrade)
- marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ if(body_zone == BODY_ZONE_CHEST)
+ marking = image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)
+ else
+ marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
. += marking
@@ -494,7 +500,10 @@
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else if(!use_digitigrade)
- marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ if(body_zone == BODY_ZONE_CHEST)
+ marking = image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)
+ else
+ marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
. += marking
diff --git a/html/changelogs/AutoChangeLog-pr-8296.yml b/html/changelogs/AutoChangeLog-pr-8296.yml
new file mode 100644
index 0000000000..78db7ccb0d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8296.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - balance: "25% < --- 50% For NPC blocking bullshit
+ided: Yes"
diff --git a/html/changelogs/AutoChangeLog-pr-8325.yml b/html/changelogs/AutoChangeLog-pr-8325.yml
new file mode 100644
index 0000000000..1e665e7917
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8325.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - code_imp: "made it look nice"
diff --git a/html/changelogs/AutoChangeLog-pr-8384.yml b/html/changelogs/AutoChangeLog-pr-8384.yml
new file mode 100644
index 0000000000..f98b473e6c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8384.yml
@@ -0,0 +1,6 @@
+author: "Nero1024"
+delete-after: True
+changes:
+ - soundadd: "Bare feet will now make the correct footstep sounds."
+ - soundadd: "Other mobs will make the correct footstep sounds."
+ - soundadd: "Crawling/dragging sounds for downed/incapacitated mobs"
diff --git a/html/changelogs/AutoChangeLog-pr-8397.yml b/html/changelogs/AutoChangeLog-pr-8397.yml
new file mode 100644
index 0000000000..28ed98666f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8397.yml
@@ -0,0 +1,5 @@
+author: "WhiteHusky"
+delete-after: True
+changes:
+ - tweak: "Changed the styling of arousal messages to use pink-ish colors."
+ - bugfix: "The orgasm moodlet message new-lines properly."
diff --git a/html/changelogs/AutoChangeLog-pr-8398.yml b/html/changelogs/AutoChangeLog-pr-8398.yml
new file mode 100644
index 0000000000..a7ce2fbe2d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8398.yml
@@ -0,0 +1,6 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - balance: "Ass slapping only works if you're actually behind the target. Ass slapping now respects disarm blocking. You can no longer face/ass slap someone on an intent other than help, unless they are also face/ass slapping."
+ - bugfix: "Fixed ass and face slapping grammar."
+ - rscadd: "Adds meh effects for ass and face slapping."
diff --git a/html/changelogs/AutoChangeLog-pr-8399.yml b/html/changelogs/AutoChangeLog-pr-8399.yml
new file mode 100644
index 0000000000..5c71d19faa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8399.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Large maps have had a patient room transformed into micro chemistry stations with nothing else in them. They've been labelled 'Apothecary' rooms and are accessible by doctors."
diff --git a/html/changelogs/AutoChangeLog-pr-8407.yml b/html/changelogs/AutoChangeLog-pr-8407.yml
new file mode 100644
index 0000000000..5f1d9d0729
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8407.yml
@@ -0,0 +1,6 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "females now have female defined sprites"
+ - bugfix: "Slime legs have had their excess pixels adjusted"
+ - bugfix: "Mammal normal legs are more in line with human legs now"
diff --git a/html/changelogs/AutoChangeLog-pr-8409.yml b/html/changelogs/AutoChangeLog-pr-8409.yml
new file mode 100644
index 0000000000..01f69bf437
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8409.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - bugfix: "fixed species like abductors and golems getting the fat tiddy or pingas"
diff --git a/html/changelogs/AutoChangeLog-pr-8411.yml b/html/changelogs/AutoChangeLog-pr-8411.yml
new file mode 100644
index 0000000000..4d4a122cf2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8411.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - balance: "2 -> 3"
diff --git a/html/changelogs/AutoChangeLog-pr-8413.yml b/html/changelogs/AutoChangeLog-pr-8413.yml
new file mode 100644
index 0000000000..01de909a3b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8413.yml
@@ -0,0 +1,5 @@
+author: "Useroth"
+delete-after: True
+changes:
+ - bugfix: "The space hotel dorms are now properly boltable with the buttons inside."
+ - bugfix: "Makes the booze-o-mat hacked by default. Alternative to https://github.com/Citadel-Station-13/Citadel-Station-13/pull/8350."
diff --git a/html/changelogs/AutoChangeLog-pr-8417.yml b/html/changelogs/AutoChangeLog-pr-8417.yml
new file mode 100644
index 0000000000..2a6eaa6237
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8417.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Added a few jet packs to the space queens men"
+ - tweak: "volume of jet packs"
diff --git a/html/changelogs/AutoChangeLog-pr-8420.yml b/html/changelogs/AutoChangeLog-pr-8420.yml
new file mode 100644
index 0000000000..60c8543647
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8420.yml
@@ -0,0 +1,5 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Shield blobs no longer become completely invulnerable to all forms of damage after reaching a \"\"\"weakened\"\"\" state"
+ - tweak: "Taken care of what appeared to have been an oversight where shield blobs don't recover their armor after becoming weakened."
diff --git a/html/changelogs/AutoChangeLog-pr-8429.yml b/html/changelogs/AutoChangeLog-pr-8429.yml
new file mode 100644
index 0000000000..0769af85aa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8429.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Nerfed concatenators by limiting the amount of characters they're able to output"
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 70a5a71652..29086033c8 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/aibots.dmi b/icons/mob/aibots.dmi
index 913a0dff02..f4049abc41 100644
Binary files a/icons/mob/aibots.dmi and b/icons/mob/aibots.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index 50c143b9cb..f49a27fda4 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/modular_citadel/code/datums/mood_events/generic_positive_events.dm b/modular_citadel/code/datums/mood_events/generic_positive_events.dm
index 4c581d8184..717fe5a47d 100644
--- a/modular_citadel/code/datums/mood_events/generic_positive_events.dm
+++ b/modular_citadel/code/datums/mood_events/generic_positive_events.dm
@@ -21,7 +21,7 @@
timeout = 3000
/datum/mood_event/orgasm
- description = "I came!" //funny meme haha
+ description = "I came!\n" //funny meme haha
mood_change = 3
timeout = 1000
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index 307cdff29f..ef9201af60 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -222,17 +222,17 @@
fluid_source = G.linked_organ.reagents
total_fluids = fluid_source.total_volume
if(mb_time)
- src.visible_message("[src] starts to [G.masturbation_verb] [p_their()] [G.name].", \
- "You start to [G.masturbation_verb] your [G.name].", \
- "You start to [G.masturbation_verb] your [G.name].")
+ src.visible_message("[src] starts to [G.masturbation_verb] [p_their()] [G.name].", \
+ "You start to [G.masturbation_verb] your [G.name].", \
+ "You start to [G.masturbation_verb] your [G.name].")
if(do_after(src, mb_time, target = src))
if(total_fluids > 5)
fluid_source.reaction(src.loc, TOUCH, 1, 0)
fluid_source.clear_reagents()
- src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
- "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \
- "You have relieved yourself.")
+ src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
+ "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \
+ "You have relieved yourself.")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
if(G.can_climax)
setArousalLoss(min_arousal)
@@ -260,16 +260,16 @@
else
total_fluids = fluid_source.total_volume
if(mb_time) //as long as it's not instant, give a warning
- src.visible_message("[src] looks like they're about to cum.", \
- "You feel yourself about to orgasm.", \
- "You feel yourself about to orgasm.")
+ src.visible_message("[src] looks like they're about to cum.", \
+ "You feel yourself about to orgasm.", \
+ "You feel yourself about to orgasm.")
if(do_after(src, mb_time, target = src))
if(total_fluids > 5)
fluid_source.reaction(src.loc, TOUCH, 1, 0)
fluid_source.clear_reagents()
- src.visible_message("[src] orgasms[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""], using [p_their()] [G.name]!", \
- "You climax[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""] with your [G.name].", \
- "You climax using your [G.name].")
+ src.visible_message("[src] orgasms[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""], using [p_their()] [G.name]!", \
+ "You climax[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""] with your [G.name].", \
+ "You climax using your [G.name].")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
if(G.can_climax)
setArousalLoss(min_arousal)
@@ -288,9 +288,9 @@
fluid_source = G.linked_organ.reagents
total_fluids = fluid_source.total_volume
if(mb_time) //Skip warning if this is an instant climax.
- src.visible_message("[src] is about to climax with [L]!", \
- "You're about to climax with [L]!", \
- "You're preparing to climax with someone!")
+ src.visible_message("[src] is about to climax with [L]!", \
+ "You're about to climax with [L]!", \
+ "You're preparing to climax with someone!")
if(spillage)
if(do_after(src, mb_time, target = src) && in_range(src, L))
fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor)
@@ -298,9 +298,9 @@
if(total_fluids > 5)
fluid_source.reaction(L.loc, TOUCH, 1, 0)
fluid_source.clear_reagents()
- src.visible_message("[src] climaxes with [L][spillage ? ", overflowing and spilling":""], using [p_their()] [G.name]!", \
- "You orgasm with [L][spillage ? ", spilling out of them":""], using your [G.name].", \
- "You have climaxed with someone[spillage ? ", spilling out of them":""], using your [G.name].")
+ src.visible_message("[src] climaxes with [L][spillage ? ", overflowing and spilling":""], using [p_their()] [G.name]!", \
+ "You orgasm with [L][spillage ? ", spilling out of them":""], using your [G.name].", \
+ "You have climaxed with someone[spillage ? ", spilling out of them":""], using your [G.name].")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
if(G.can_climax)
@@ -309,9 +309,9 @@
if(do_after(src, mb_time, target = src) && in_range(src, L))
fluid_source.trans_to(L, total_fluids)
total_fluids = 0
- src.visible_message("[src] climaxes with [L], [p_their()] [G.name] spilling nothing!", \
- "You ejaculate with [L], your [G.name] spilling nothing.", \
- "You have climaxed inside someone, your [G.name] spilling nothing.")
+ src.visible_message("[src] climaxes with [L], [p_their()] [G.name] spilling nothing!", \
+ "You ejaculate with [L], your [G.name] spilling nothing.", \
+ "You have climaxed inside someone, your [G.name] spilling nothing.")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
if(G.can_climax)
@@ -335,14 +335,14 @@
// to_chat(src, "You need a container to do this!")
// return
- src.visible_message("[src] starts to [G.masturbation_verb] their [G.name] over [container].", \
- "You start to [G.masturbation_verb] your [G.name] over [container].", \
- "You start to [G.masturbation_verb] your [G.name] over something.")
+ src.visible_message("[src] starts to [G.masturbation_verb] their [G.name] over [container].", \
+ "You start to [G.masturbation_verb] your [G.name] over [container].", \
+ "You start to [G.masturbation_verb] your [G.name] over something.")
if(do_after(src, mb_time, target = src) && in_range(src, container))
fluid_source.trans_to(container, total_fluids)
- src.visible_message("[src] uses [p_their()] [G.name] to fill [container]!", \
- "You used your [G.name] to fill [container].", \
- "You have relieved some pressure.")
+ src.visible_message("[src] uses [p_their()] [G.name] to fill [container]!", \
+ "You used your [G.name] to fill [container].", \
+ "You have relieved some pressure.")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
if(G.can_climax)
setArousalLoss(min_arousal)
diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm
index d13c2f6a97..591bb6f1de 100644
--- a/modular_citadel/code/modules/arousal/organs/genitals.dm
+++ b/modular_citadel/code/modules/arousal/organs/genitals.dm
@@ -133,12 +133,12 @@
//proc to give a player their genitals and stuff when they log in
/mob/living/carbon/human/proc/give_genitals(clean=0)//clean will remove all pre-existing genitals. proc will then give them any genitals that are enabled in their DNA
- if (NOGENITALS in dna.species.species_traits)
- return
if(clean)
var/obj/item/organ/genital/GtoClean
for(GtoClean in internal_organs)
qdel(GtoClean)
+ if (NOGENITALS in dna.species.species_traits)
+ return
//Order should be very important. FIRST vagina, THEN testicles, THEN penis, as this affects the order they are rendered in.
if(dna.features["has_breasts"])
give_breasts()
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
index 8af0dc2013..8d08937f55 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
@@ -9,7 +9,7 @@
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mag-casing-live"
projectile_type = /obj/item/projectile/bullet/magrifle
- energy_cost = 300
+ energy_cost = 200
/obj/item/ammo_casing/caseless/mag_e/anlmagm_e
desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
@@ -17,7 +17,7 @@
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mag-casing-live"
projectile_type = /obj/item/projectile/bullet/nlmagrifle
- energy_cost = 300
+ energy_cost = 200
/obj/item/ammo_casing/caseless/mag_e/amags
desc = "A ferromagnetic slug intended to be launched out of a compatible weapon."
@@ -25,7 +25,7 @@
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mag-casing-live"
projectile_type = /obj/item/projectile/bullet/mags
- energy_cost = 200
+ energy_cost = 125
/obj/item/ammo_casing/caseless/mag_e/anlmags
desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload."
@@ -33,7 +33,7 @@
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mag-casing-live"
projectile_type = /obj/item/projectile/bullet/nlmags
- energy_cost = 200
+ energy_cost = 125
///magazines///
@@ -53,14 +53,13 @@
ammo_type = /obj/item/ammo_casing/caseless/mag_e/amagm_e
max_ammo = 24
-
/obj/item/ammo_box/magazine/mmag_e/small
name = "magpistol magazine (non-lethal disabler)"
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "nlmagmag"
ammo_type = /obj/item/ammo_casing/caseless/mag_e/anlmags
caliber = "mag_e"
- max_ammo = 15
+ max_ammo = 16
multiple_sprites = 2
/obj/item/ammo_box/magazine/mmag_e/small/lethal
@@ -68,6 +67,7 @@
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "smallmagmag"
ammo_type = /obj/item/ammo_casing/caseless/mag_e/amags
+ max_ammo = 16
///cells///
@@ -218,7 +218,6 @@
pin = null
spawnwithmagazine = FALSE
-
///magpistol///
/obj/item/gun/ballistic/automatic/pistol/mag_e
@@ -278,7 +277,6 @@
if(!dead_cell)
cell.give(cell.maxcharge)
-
/obj/item/gun/ballistic/automatic/pistol/mag_e/update_icon()
..()
if(magazine)
@@ -288,7 +286,6 @@
cut_overlays()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
-
/obj/item/gun/ballistic/automatic/pistol/mag_e/nopin
pin = null
spawnwithmagazine = FALSE
diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
index 061f941043..3da35d9c6d 100644
--- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
+++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
@@ -104,7 +104,7 @@
M.emote(pick("moan","blush"))
if(prob(5))
var/aroused_message = pick("You feel frisky.", "You're having trouble suppressing your urges.", "You feel in the mood.")
- to_chat(M, "[aroused_message]")
+ to_chat(M, "[aroused_message]")
..()
/datum/reagent/drug/aphrodisiacplus
@@ -133,7 +133,7 @@
aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!")
else
aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.")
- to_chat(M, "[aroused_message]")
+ to_chat(M, "[aroused_message]")
..()
/datum/reagent/drug/aphrodisiacplus/addiction_act_stage2(mob/living/M)
diff --git a/modular_citadel/code/modules/research/designs/autolathe_designs.dm b/modular_citadel/code/modules/research/designs/autolathe_designs.dm
deleted file mode 100755
index 55b83a2262..0000000000
--- a/modular_citadel/code/modules/research/designs/autolathe_designs.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/datum/design/hypovialsmall
- name = "Hypovial"
- id = "hypovial"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 500)
- build_path = /obj/item/reagent_containers/glass/bottle/vial/small
- category = list("initial","Medical")
-
-/datum/design/hypoviallarge
- name = "Large Hypovial"
- id = "large_hypovial"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 2500)
- build_path = /obj/item/reagent_containers/glass/bottle/vial/large
- category = list("initial","Medical")
diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi
index ceecf12d2e..3575f38e1c 100644
Binary files a/modular_citadel/icons/mob/mam_markings.dmi and b/modular_citadel/icons/mob/mam_markings.dmi differ
diff --git a/modular_citadel/icons/mob/markings_notmammals.dmi b/modular_citadel/icons/mob/markings_notmammals.dmi
index 316d1d1af8..59b10e93aa 100644
Binary files a/modular_citadel/icons/mob/markings_notmammals.dmi and b/modular_citadel/icons/mob/markings_notmammals.dmi differ
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
index 1ed73d2709..5f72d1013b 100644
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ
diff --git a/sound/effects/footstep/carpetbarefoot1.ogg b/sound/effects/footstep/carpetbarefoot1.ogg
new file mode 100644
index 0000000000..81615d2970
Binary files /dev/null and b/sound/effects/footstep/carpetbarefoot1.ogg differ
diff --git a/sound/effects/footstep/carpetbarefoot2.ogg b/sound/effects/footstep/carpetbarefoot2.ogg
new file mode 100644
index 0000000000..d1c7e1627e
Binary files /dev/null and b/sound/effects/footstep/carpetbarefoot2.ogg differ
diff --git a/sound/effects/footstep/carpetbarefoot3.ogg b/sound/effects/footstep/carpetbarefoot3.ogg
new file mode 100644
index 0000000000..13ecb3398b
Binary files /dev/null and b/sound/effects/footstep/carpetbarefoot3.ogg differ
diff --git a/sound/effects/footstep/carpetbarefoot4.ogg b/sound/effects/footstep/carpetbarefoot4.ogg
new file mode 100644
index 0000000000..31850250be
Binary files /dev/null and b/sound/effects/footstep/carpetbarefoot4.ogg differ
diff --git a/sound/effects/footstep/carpetbarefoot5.ogg b/sound/effects/footstep/carpetbarefoot5.ogg
new file mode 100644
index 0000000000..e9a44765b1
Binary files /dev/null and b/sound/effects/footstep/carpetbarefoot5.ogg differ
diff --git a/sound/effects/footstep/crawl1.ogg b/sound/effects/footstep/crawl1.ogg
new file mode 100644
index 0000000000..61a73a58d0
Binary files /dev/null and b/sound/effects/footstep/crawl1.ogg differ
diff --git a/sound/effects/footstep/hardbarefoot1.ogg b/sound/effects/footstep/hardbarefoot1.ogg
new file mode 100644
index 0000000000..2614872191
Binary files /dev/null and b/sound/effects/footstep/hardbarefoot1.ogg differ
diff --git a/sound/effects/footstep/hardbarefoot2.ogg b/sound/effects/footstep/hardbarefoot2.ogg
new file mode 100644
index 0000000000..7d89d96105
Binary files /dev/null and b/sound/effects/footstep/hardbarefoot2.ogg differ
diff --git a/sound/effects/footstep/hardbarefoot3.ogg b/sound/effects/footstep/hardbarefoot3.ogg
new file mode 100644
index 0000000000..639751fab0
Binary files /dev/null and b/sound/effects/footstep/hardbarefoot3.ogg differ
diff --git a/sound/effects/footstep/hardbarefoot4.ogg b/sound/effects/footstep/hardbarefoot4.ogg
new file mode 100644
index 0000000000..9cf363a18c
Binary files /dev/null and b/sound/effects/footstep/hardbarefoot4.ogg differ
diff --git a/sound/effects/footstep/hardbarefoot5.ogg b/sound/effects/footstep/hardbarefoot5.ogg
new file mode 100644
index 0000000000..72ebeca84d
Binary files /dev/null and b/sound/effects/footstep/hardbarefoot5.ogg differ
diff --git a/sound/effects/footstep/hardclaw1.ogg b/sound/effects/footstep/hardclaw1.ogg
new file mode 100644
index 0000000000..1d66eb4d49
Binary files /dev/null and b/sound/effects/footstep/hardclaw1.ogg differ
diff --git a/sound/effects/footstep/hardclaw2.ogg b/sound/effects/footstep/hardclaw2.ogg
new file mode 100644
index 0000000000..a6a7951d77
Binary files /dev/null and b/sound/effects/footstep/hardclaw2.ogg differ
diff --git a/sound/effects/footstep/hardclaw3.ogg b/sound/effects/footstep/hardclaw3.ogg
new file mode 100644
index 0000000000..a2e5462199
Binary files /dev/null and b/sound/effects/footstep/hardclaw3.ogg differ
diff --git a/sound/effects/footstep/hardclaw4.ogg b/sound/effects/footstep/hardclaw4.ogg
new file mode 100644
index 0000000000..bd845a8782
Binary files /dev/null and b/sound/effects/footstep/hardclaw4.ogg differ
diff --git a/sound/effects/footstep/heavy1.ogg b/sound/effects/footstep/heavy1.ogg
new file mode 100644
index 0000000000..bfc80a4270
Binary files /dev/null and b/sound/effects/footstep/heavy1.ogg differ
diff --git a/sound/effects/footstep/heavy2.ogg b/sound/effects/footstep/heavy2.ogg
new file mode 100644
index 0000000000..514e3ac3e2
Binary files /dev/null and b/sound/effects/footstep/heavy2.ogg differ
diff --git a/sound/effects/footstep/slime1.ogg b/sound/effects/footstep/slime1.ogg
new file mode 100644
index 0000000000..a83b7646f1
Binary files /dev/null and b/sound/effects/footstep/slime1.ogg differ
diff --git a/sound/effects/footstep/woodbarefoot1.ogg b/sound/effects/footstep/woodbarefoot1.ogg
new file mode 100644
index 0000000000..bb66da770e
Binary files /dev/null and b/sound/effects/footstep/woodbarefoot1.ogg differ
diff --git a/sound/effects/footstep/woodbarefoot2.ogg b/sound/effects/footstep/woodbarefoot2.ogg
new file mode 100644
index 0000000000..67397d868e
Binary files /dev/null and b/sound/effects/footstep/woodbarefoot2.ogg differ
diff --git a/sound/effects/footstep/woodbarefoot3.ogg b/sound/effects/footstep/woodbarefoot3.ogg
new file mode 100644
index 0000000000..113a89003a
Binary files /dev/null and b/sound/effects/footstep/woodbarefoot3.ogg differ
diff --git a/sound/effects/footstep/woodbarefoot4.ogg b/sound/effects/footstep/woodbarefoot4.ogg
new file mode 100644
index 0000000000..ccc2e82075
Binary files /dev/null and b/sound/effects/footstep/woodbarefoot4.ogg differ
diff --git a/sound/effects/footstep/woodbarefoot5.ogg b/sound/effects/footstep/woodbarefoot5.ogg
new file mode 100644
index 0000000000..6fbce27109
Binary files /dev/null and b/sound/effects/footstep/woodbarefoot5.ogg differ
diff --git a/sound/effects/footstep/woodclaw1.ogg b/sound/effects/footstep/woodclaw1.ogg
new file mode 100644
index 0000000000..181403b93f
Binary files /dev/null and b/sound/effects/footstep/woodclaw1.ogg differ
diff --git a/sound/effects/footstep/woodclaw2.ogg b/sound/effects/footstep/woodclaw2.ogg
new file mode 100644
index 0000000000..29b04a9554
Binary files /dev/null and b/sound/effects/footstep/woodclaw2.ogg differ
diff --git a/sound/effects/footstep/woodclaw3.ogg b/sound/effects/footstep/woodclaw3.ogg
new file mode 100644
index 0000000000..9f4ac6d334
Binary files /dev/null and b/sound/effects/footstep/woodclaw3.ogg differ
diff --git a/sound/voice/firebot/detected.ogg b/sound/voice/firebot/detected.ogg
new file mode 100644
index 0000000000..e5acfa10c7
Binary files /dev/null and b/sound/voice/firebot/detected.ogg differ
diff --git a/sound/voice/firebot/extinguishing.ogg b/sound/voice/firebot/extinguishing.ogg
new file mode 100644
index 0000000000..d7b44b7fce
Binary files /dev/null and b/sound/voice/firebot/extinguishing.ogg differ
diff --git a/sound/voice/firebot/keepitcool.ogg b/sound/voice/firebot/keepitcool.ogg
new file mode 100644
index 0000000000..e04c94337a
Binary files /dev/null and b/sound/voice/firebot/keepitcool.ogg differ
diff --git a/sound/voice/firebot/nofires.ogg b/sound/voice/firebot/nofires.ogg
new file mode 100644
index 0000000000..962f18d135
Binary files /dev/null and b/sound/voice/firebot/nofires.ogg differ
diff --git a/sound/voice/firebot/onlyyou.ogg b/sound/voice/firebot/onlyyou.ogg
new file mode 100644
index 0000000000..e8eb3cdf2e
Binary files /dev/null and b/sound/voice/firebot/onlyyou.ogg differ
diff --git a/sound/voice/firebot/stopdropnroll.ogg b/sound/voice/firebot/stopdropnroll.ogg
new file mode 100644
index 0000000000..9e6b1c1bb6
Binary files /dev/null and b/sound/voice/firebot/stopdropnroll.ogg differ
diff --git a/sound/voice/firebot/tempnominal.ogg b/sound/voice/firebot/tempnominal.ogg
new file mode 100644
index 0000000000..9eaa984cd6
Binary files /dev/null and b/sound/voice/firebot/tempnominal.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index ec265f1aea..4d74c8a95f 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1226,13 +1226,13 @@
#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_scripts.dm"
#include "code\modules\antagonists\clockcult\clock_structures\_trap_object.dm"
#include "code\modules\antagonists\clockcult\clock_structures\ark_of_the_clockwork_justicar.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\stargazer.dm"
#include "code\modules\antagonists\clockcult\clock_structures\clockwork_obelisk.dm"
#include "code\modules\antagonists\clockcult\clock_structures\eminence_spire.dm"
#include "code\modules\antagonists\clockcult\clock_structures\heralds_beacon.dm"
#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\stargazer.dm"
#include "code\modules\antagonists\clockcult\clock_structures\taunting_trail.dm"
#include "code\modules\antagonists\clockcult\clock_structures\wall_gear.dm"
#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\lever.dm"
@@ -2078,6 +2078,7 @@
#include "code\modules\mob\living\simple_animal\bot\cleanbot.dm"
#include "code\modules\mob\living\simple_animal\bot\construction.dm"
#include "code\modules\mob\living\simple_animal\bot\ed209bot.dm"
+#include "code\modules\mob\living\simple_animal\bot\firebot.dm"
#include "code\modules\mob\living\simple_animal\bot\floorbot.dm"
#include "code\modules\mob\living\simple_animal\bot\honkbot.dm"
#include "code\modules\mob\living\simple_animal\bot\medbot.dm"
@@ -2501,7 +2502,12 @@
#include "code\modules\research\server.dm"
#include "code\modules\research\stock_parts.dm"
#include "code\modules\research\designs\AI_module_designs.dm"
-#include "code\modules\research\designs\autolathe_designs.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm"
#include "code\modules\research\designs\biogenerator_designs.dm"
#include "code\modules\research\designs\bluespace_designs.dm"
#include "code\modules\research\designs\comp_board_designs.dm"
@@ -2991,7 +2997,6 @@
#include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm"
#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm"
#include "modular_citadel\code\modules\recycling\disposal\bin.dm"
-#include "modular_citadel\code\modules\research\designs\autolathe_designs.dm"
#include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm"
#include "modular_citadel\code\modules\research\designs\machine_designs.dm"
#include "modular_citadel\code\modules\research\designs\weapon_designs.dm"