diff --git a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
index 512c82e8948..48331364228 100644
--- a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
+++ b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
@@ -4311,7 +4311,6 @@
d2 = 2;
icon_state = "1-2"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fpmaint{
name = "Medical Maintenance"
@@ -5914,7 +5913,6 @@
name = "Research Division"
})
"akv" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
icon_state = "warnplate";
dir = 4
@@ -6424,7 +6422,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fpmaint{
name = "Medical Maintenance"
@@ -6658,7 +6655,6 @@
name = "\improper Toxins Lab"
})
"alH" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "warning"
@@ -9105,7 +9101,6 @@
"apw" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/disposalpipe/segment,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fore)
"apx" = (
@@ -9410,7 +9405,6 @@
icon_state = "1-2";
pixel_y = 0
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -10102,7 +10096,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fore)
"arl" = (
@@ -10130,7 +10123,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -10229,7 +10221,6 @@
/turf/simulated/floor/plasteel,
/area/toxins/misc_lab)
"art" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -11163,7 +11154,6 @@
name = "\improper Toxins Lab"
})
"atf" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -11791,7 +11781,6 @@
/obj/effect/decal/cleanable/robot_debris{
icon_state = "gib6"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
broken = 1;
icon_state = "platingdmg1"
@@ -12618,7 +12607,6 @@
name = "Medbay Maintenance APC";
pixel_y = -24
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fpmaint{
name = "Medical Maintenance"
@@ -13645,7 +13633,6 @@
/area/maintenance/fore)
"axu" = (
/obj/effect/decal/cleanable/blood/old,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fore)
"axv" = (
@@ -13657,7 +13644,6 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/blood/old,
/obj/effect/decal/remains/human,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
broken = 1;
icon_state = "platingdmg3"
@@ -15638,7 +15624,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/decal/cleanable/dirt,
/obj/item/trash/candy,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fore)
"aAN" = (
@@ -17072,7 +17057,6 @@
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fore)
"aDs" = (
@@ -17694,7 +17678,6 @@
/obj/item/weapon/shard{
icon_state = "medium"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
broken = 1;
icon_state = "platingdmg1"
@@ -18129,7 +18112,6 @@
d2 = 2;
icon_state = "1-2"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
broken = 1;
icon_state = "platingdmg1"
@@ -18191,7 +18173,6 @@
/obj/machinery/light_switch{
pixel_x = 23
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -18344,7 +18325,6 @@
/area/storage/tech)
"aFL" = (
/obj/item/stack/rods,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fore)
"aFM" = (
@@ -20473,7 +20453,6 @@
name = "Station Intercom (General)";
pixel_x = 27
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -20507,7 +20486,6 @@
/turf/simulated/floor/plating,
/area/storage/tech)
"aJu" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/storage/tech)
"aJv" = (
@@ -21807,7 +21785,6 @@
icon_state = "1-2"
},
/obj/structure/disposalpipe/segment,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fore)
"aLT" = (
@@ -23053,7 +23030,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
broken = 1;
icon_state = "platingdmg1"
@@ -25127,7 +25103,6 @@
"aRY" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/stack/rods,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fore)
"aRZ" = (
@@ -29127,7 +29102,6 @@
d2 = 4;
icon_state = "1-4"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
burnt = 1;
icon_state = "panelscorched"
@@ -33482,7 +33456,6 @@
loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes");
name = "maint grille or trash spawner"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
broken = 1;
icon_state = "platingdmg2"
@@ -34493,7 +34466,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -34525,7 +34497,6 @@
/obj/effect/decal/cleanable/dirt,
/obj/item/stack/sheet/cardboard,
/obj/structure/disposalpipe/segment,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fpmaint{
name = "Medical Maintenance"
@@ -34622,7 +34593,6 @@
loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes");
name = "maint grille or trash spawner"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"bkG" = (
@@ -35034,7 +35004,6 @@
"bls" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/disposalpipe/segment,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fpmaint{
name = "Medical Maintenance"
@@ -36742,7 +36711,6 @@
/obj/machinery/light_construct/small{
dir = 1
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
broken = 1;
dir = 4;
@@ -37321,7 +37289,6 @@
/obj/machinery/light_construct/small{
dir = 4
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
burnt = 1;
dir = 4;
@@ -37726,7 +37693,6 @@
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"bqD" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"bqE" = (
@@ -38179,7 +38145,6 @@
icon_state = "gib6"
},
/obj/item/weapon/reagent_containers/syringe,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/starboard)
"brq" = (
@@ -38857,7 +38822,6 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/item/weapon/shard,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
broken = 1;
dir = 4;
@@ -40297,7 +40261,6 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
broken = 1;
icon_state = "platingdmg3"
@@ -41698,7 +41661,6 @@
},
/area/crew_quarters/sleep)
"byi" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel,
/area/crew_quarters/sleep)
"byj" = (
@@ -42164,7 +42126,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "hydrofloor"
},
@@ -43552,7 +43513,6 @@
"bBx" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/disposalpipe/segment,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"bBy" = (
@@ -45231,7 +45191,6 @@
/area/maintenance/starboard)
"bEE" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/starboard)
"bEF" = (
@@ -46034,7 +45993,6 @@
icon_state = "2-4"
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/starboard)
"bGb" = (
@@ -47106,7 +47064,6 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/item/stack/rods,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/port{
name = "Chapel Maintenance"
@@ -48473,7 +48430,6 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/item/weapon/crowbar,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/port{
name = "Chapel Maintenance"
@@ -49152,7 +49108,6 @@
on = 1;
pressure_checks = 1
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -49777,7 +49732,6 @@
d2 = 8;
icon_state = "4-8"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/port{
name = "Chapel Maintenance"
@@ -50325,7 +50279,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
broken = 1;
icon_state = "platingdmg3"
@@ -50463,7 +50416,6 @@
/obj/item/weapon/newspaper,
/obj/item/weapon/cigbutt,
/obj/item/clothing/glasses/sunglasses,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
burnt = 1;
icon_state = "panelscorched"
@@ -51629,7 +51581,6 @@
/obj/machinery/light/small{
dir = 1
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "bar"
},
@@ -53573,7 +53524,6 @@
"bTK" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/generic,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "bar"
},
@@ -53684,7 +53634,6 @@
d2 = 2;
icon_state = "1-2"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/port{
name = "Chapel Maintenance"
@@ -54689,7 +54638,6 @@
/area/maintenance/starboard)
"bVQ" = (
/obj/effect/decal/cleanable/dirt,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "cafeteria"
},
@@ -56478,7 +56426,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/starboard)
"bZa" = (
@@ -56663,7 +56610,6 @@
pixel_y = -28;
prison_radio = 1
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/security/prison)
"bZs" = (
@@ -57747,7 +57693,6 @@
/turf/simulated/floor/plating,
/area/security/prison)
"cbB" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -58669,7 +58614,6 @@
d2 = 2;
icon_state = "1-2"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -61275,7 +61219,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
broken = 1;
icon_state = "platingdmg3"
diff --git a/_maps/map_files/MetaStation/MetaStation.v41I.dmm b/_maps/map_files/MetaStation/MetaStation.v41I.dmm
index a1799957075..cdc20d9ac75 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41I.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41I.dmm
@@ -65,7 +65,7 @@
"abm" = (/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/paper/hydroponics,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"abn" = (/obj/structure/table,/obj/machinery/computer/libraryconsole/bookmanagement,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"abo" = (/obj/machinery/computer/arcade,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
-"abp" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel,/area/security/prison)
+"abp" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/security/prison)
"abq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"abr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"abs" = (/obj/structure/holohoop{pixel_y = 29},/obj/item/toy/beach_ball{icon = 'icons/obj/basketball.dmi'; icon_state = "basketball"; item_state = "basketball"; name = "basket ball"},/turf/simulated/floor/plating{icon_state = "platingdmg1"},/area/security/prison)
@@ -137,7 +137,7 @@
"acG" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plating{icon_state = "platingdmg1"},/area/security/prison)
"acH" = (/turf/simulated/floor/plating{icon_state = "panelscorched"},/area/security/prison)
"acI" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/security/prison)
-"acJ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1; initialize_directions = 11},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
+"acJ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/item/device/radio/intercom{desc = "Talk through this. It looks like it has been modified to not broadcast."; dir = 2; name = "Prison Intercom (General)"; pixel_x = 0; pixel_y = -28; prison_radio = 1},/obj/machinery/camera{c_tag = "Prison Chamber"; dir = 1; network = list("SS13","Prison")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison)
@@ -476,9 +476,9 @@
"ajh" = (/turf/simulated/wall/r_wall,/area/engine/gravity_generator)
"aji" = (/obj/machinery/conveyor{dir = 2; id = "garbage"; layer = 2.7},/obj/machinery/door/poddoor/preopen{id = "Disposal Exit"; layer = 3.1; name = "disposal exit vent"},/turf/simulated/floor/plating,/area/maintenance/disposal)
"ajj" = (/obj/machinery/button/door{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/machinery/button/massdriver{id = "trash"; pixel_x = -26; pixel_y = -6},/obj/structure/chair/stool,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"ajk" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/fore)
+"ajk" = (/turf/simulated/floor/plating,/area/maintenance/fore)
"ajl" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"ajm" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/disposal)
+"ajm" = (/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/disposal)
"ajn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/engineering{name = "Fore Port Solar Access"; req_access_txt = "10"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"ajo" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport)
"ajp" = (/obj/structure/table,/obj/item/stack/medical/ointment{pixel_x = 3; pixel_y = -2},/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/epinephrine,/obj/item/weapon/storage/secure/safe{pixel_x = 6; pixel_y = 28},/obj/item/weapon/restraints/handcuffs/cable/pink,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -733,7 +733,7 @@
"aoe" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal)
"aof" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/recycler,/turf/simulated/floor/plating,/area/maintenance/disposal)
"aog" = (/obj/machinery/door/window/eastright{dir = 4; name = "Danger: Conveyor Access"; req_access_txt = "12"},/obj/machinery/conveyor{dir = 10; icon_state = "conveyor0"; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"aoh" = (/obj/effect/decal/cleanable/oil,/obj/machinery/light_switch{pixel_x = 25; pixel_y = 0},/obj/machinery/light/small{dir = 4},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/disposal)
+"aoh" = (/obj/effect/decal/cleanable/oil,/obj/machinery/light_switch{pixel_x = 25; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
"aoi" = (/turf/simulated/floor/plating{icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aoj" = (/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aok" = (/obj/structure/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -774,7 +774,7 @@
"aoT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/fore)
"aoU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore)
"aoV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/fore)
-"aoW" = (/obj/machinery/power/apc{dir = 2; name = "Disposal APC"; pixel_x = 0; pixel_y = -24},/obj/structure/cable/yellow,/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/disposal)
+"aoW" = (/obj/machinery/power/apc{dir = 2; name = "Disposal APC"; pixel_x = 0; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/disposal)
"aoX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore)
"aoY" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fore)
"aoZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/fore)
@@ -1067,7 +1067,7 @@
"auA" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/starboard)
"auB" = (/obj/structure/closet/crate/hydroponics,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
"auC" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"auD" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/fore)
+"auD" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fore)
"auE" = (/obj/structure/closet,/obj/item/weapon/stock_parts/matter_bin,/turf/simulated/floor/plating,/area/maintenance/starboard)
"auF" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/starboard)
"auG" = (/obj/structure/closet/radiation,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; dir = 1; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/gravity_generator)
@@ -1728,7 +1728,7 @@
"aHl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
"aHm" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
"aHn" = (/obj/machinery/door/airlock{id_tag = "Cabin7"; name = "Cabin 1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep)
-"aHo" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aHo" = (/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aHp" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/airalarm{pixel_y = 23},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep)
"aHq" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/item/clothing/under/assistantformal,/turf/simulated/floor/wood,/area/crew_quarters/sleep)
"aHr" = (/obj/structure/table,/obj/item/stack/rods{amount = 50},/obj/item/weapon/wrench,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
@@ -1968,7 +1968,7 @@
"aLR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aLS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aLT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"aLU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aLU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aLV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aLW" = (/obj/structure/table,/obj/item/clothing/gloves/color/fyellow,/obj/item/device/gps{gpstag = "AUX0"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/storage/primary)
"aLX" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/storage/primary)
@@ -2092,7 +2092,7 @@
"aOl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"aOm" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/engineering_guide{pixel_x = 3; pixel_y = 4},/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_x = -2; pixel_y = 3},/obj/machinery/button/door{id = "Singularity"; name = "Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"aOn" = (/obj/machinery/button/door{id = "Singularity"; name = "Shutters Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engine/engineering)
-"aOo" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/starboard)
+"aOo" = (/turf/simulated/floor/plating,/area/maintenance/starboard)
"aOp" = (/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/engine/engineering)
"aOq" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engine/engineering)
"aOr" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
@@ -2787,7 +2787,7 @@
"bbE" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;48;50;1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bbF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bbG" = (/obj/structure/closet/secure_closet/personal,/obj/item/clothing/under/assistantformal,/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/obj/item/clothing/suit/hooded/wintercoat,/obj/item/clothing/shoes/winterboots,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/crew_quarters/locker)
-"bbH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/starboard)
+"bbH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bbI" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bbJ" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Maintenance"; req_access_txt = "0"; req_one_access_txt = "48;50"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bbK" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/storage)
@@ -3575,7 +3575,7 @@
"bqM" = (/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bqN" = (/obj/machinery/reagentgrinder,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bqO" = (/obj/structure/table/wood,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/weapon/gun/projectile/revolver/doublebarrel,/obj/machinery/camera{c_tag = "Bar - Backroom"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bqP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood,/area/crew_quarters/sleep)
+"bqP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep)
"bqQ" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Bar Delivery"; req_access_txt = "25"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/bar)
"bqR" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=1"; freq = 1400; location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/crew_quarters/bar)
"bqS" = (/obj/item/weapon/storage/box/lights/mixed,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
@@ -3897,7 +3897,7 @@
"bwW" = (/obj/machinery/computer/arcade,/obj/machinery/airalarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bwX" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bwY" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/starboard)
-"bwZ" = (/obj/machinery/camera/emp_proof{c_tag = "Engineering - Particle Accelerator"; dir = 2; network = list("Singulo","SS13")},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
+"bwZ" = (/obj/machinery/camera/emp_proof{c_tag = "Engineering - Particle Accelerator"; dir = 2; network = list("Singulo","SS13")},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
"bxa" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/starboard)
"bxb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;25;46"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bxc" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/hallway/primary/starboard)
@@ -4914,7 +4914,7 @@
"bQz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bQA" = (/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/machinery/airalarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"})
"bQB" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"})
-"bQC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bQC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bQD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"})
"bQE" = (/obj/machinery/door/window/northleft{dir = 8; name = "Jetpack Storage"; pixel_x = -1; pixel_y = 0; req_access_txt = "19"},/obj/structure/window/reinforced,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide{pixel_x = 4; pixel_y = -1},/obj/item/weapon/tank/jetpack/carbondioxide{pixel_x = 0; pixel_y = 0},/obj/item/weapon/tank/jetpack/carbondioxide{pixel_x = -4; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"})
"bQF" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"})
@@ -6345,7 +6345,7 @@
"csa" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"csb" = (/obj/structure/lattice/catwalk,/obj/item/weapon/wrench,/turf/space,/area/space)
"csc" = (/obj/structure/chair/stool,/turf/simulated/floor/wood{icon_state = "wood-broken7"},/area/maintenance/aft{name = "Aft Maintenance"})
-"csd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/engine/engineering)
+"csd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/engine/engineering)
"cse" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
"csf" = (/obj/machinery/door/airlock/maintenance{name = "Surgery Maintenance"; req_access_txt = "45"},/turf/simulated/floor/plating,/area/medical/surgery)
"csg" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
@@ -6985,7 +6985,7 @@
"cEq" = (/turf/simulated/wall,/area/medical/morgue)
"cEr" = (/obj/structure/bodycontainer/morgue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"cEs" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
-"cEt" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/construction)
+"cEt" = (/turf/simulated/floor/plating,/area/construction)
"cEu" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"cEv" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"cEw" = (/obj/machinery/airalarm{pixel_y = 32},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
@@ -8371,30 +8371,30 @@
"deY" = (/obj/structure/cable{tag = "icon-0-4"; icon_state = "0-4"},/obj/machinery/power/tesla_coil,/turf/simulated/floor/plating/airless,/area/space)
"deZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
"dfa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
-"dfb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"dfb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"dfc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engine/engineering)
"dfd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
"dfe" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"dff" = (/obj/item/weapon/wirecutters,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
"dfg" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
-"dfh" = (/obj/structure/sink/kitchen{pixel_y = 28},/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"dfh" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"dfi" = (/obj/machinery/camera/emp_proof{c_tag = "Aft Arm - Near"; dir = 4; network = list("Singulo")},/turf/simulated/floor/plating/airless,/area/space)
"dfj" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/tesla_coil,/turf/simulated/floor/plating/airless,/area/space)
"dfk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plating/airless,/area/space)
"dfl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/space)
"dfm" = (/obj/structure/cable{icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/space)
-"dfn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"dfo" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood,/area/security/vacantoffice)
-"dfp" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
-"dfq" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"})
-"dfr" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"dfs" = (/obj/structure/chair/stool,/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"})
-"dft" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"})
-"dfu" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood{icon_state = "wood-broken6"},/area/maintenance/aft{name = "Aft Maintenance"})
-"dfv" = (/obj/machinery/camera{c_tag = "Morgue"; dir = 2; network = list("SS13","Medbay")},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
-"dfw" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
-"dfx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"dfy" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"dfn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/starboard)
+"dfo" = (/turf/simulated/floor/wood,/area/security/vacantoffice)
+"dfp" = (/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
+"dfq" = (/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"})
+"dfr" = (/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"dfs" = (/obj/structure/chair/stool,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"})
+"dft" = (/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"})
+"dfu" = (/turf/simulated/floor/wood{icon_state = "wood-broken6"},/area/maintenance/aft{name = "Aft Maintenance"})
+"dfv" = (/obj/machinery/camera{c_tag = "Morgue"; dir = 2; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
+"dfw" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
+"dfx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"dfy" = (/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"dfz" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/engine/vacuum{tag = "icon-bcircuit"; icon_state = "bcircuit"},/area/toxins/xenobiology)
"dfA" = (/obj/machinery/camera{c_tag = "Xenobiology Lab - Kill Chamber"; dir = 1; network = list("SS13","RD","Xeno"); start_active = 1},/turf/simulated/floor/engine/vacuum{tag = "icon-bcircuit"; icon_state = "bcircuit"},/area/toxins/xenobiology)
"dfB" = (/obj/structure/table/optable,/obj/item/weapon/surgical_drapes,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/syndicate)
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 5e7a7c40f37..c0314ebed82 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -6637,7 +6637,6 @@
/turf/simulated/floor/plating,
/area/maintenance/auxsolarport)
"amB" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/security/prison)
"amC" = (
@@ -11251,7 +11250,6 @@
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"awN" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -18167,7 +18165,6 @@
/area/hydroponics)
"aKY" = (
/obj/effect/decal/cleanable/dirt,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fpmaint2)
"aKZ" = (
@@ -29857,7 +29854,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fsmaint)
"bkW" = (
@@ -30387,12 +30383,10 @@
},
/area/maintenance/disposal)
"blT" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"blU" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/wood,
/area/crew_quarters/sleep)
"blV" = (
@@ -58971,7 +58965,6 @@
d2 = 2;
icon_state = "1-2"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"cpB" = (
@@ -59561,7 +59554,6 @@
d2 = 4;
icon_state = "2-4"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"cqN" = (
@@ -64264,7 +64256,6 @@
/turf/simulated/floor/plating/airless,
/area/space/nearstation)
"cAy" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/electrical)
"cAz" = (
@@ -64275,25 +64266,21 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
/area/chapel/office)
"cAA" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/wood,
/area/crew_quarters/bar)
"cAB" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "showroomfloor"
},
/area/crew_quarters/kitchen)
"cAC" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "cafeteria"
},
@@ -64302,7 +64289,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
icon_state = "warnplate";
dir = 1
@@ -64314,13 +64300,11 @@
d2 = 2;
icon_state = "1-2"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
/area/medical/morgue)
"cAF" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/disposal)
"cAG" = (
@@ -64339,11 +64323,9 @@
d2 = 8;
icon_state = "0-8"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/crew_quarters/heads)
"cAH" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -64354,16 +64336,13 @@
id = "garbage";
name = "disposal coveyor"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/disposal)
"cAJ" = (
/obj/structure/closet,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/disposal)
"cAK" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/asmaint2)
"cAL" = (
@@ -64375,7 +64354,6 @@
/turf/simulated/floor/plasteel,
/area/janitor)
"cAM" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -64391,11 +64369,9 @@
d2 = 8;
icon_state = "1-8"
},
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/engine/engineering)
"cAP" = (
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating{
icon_state = "warnplate";
dir = 4
@@ -64403,7 +64379,6 @@
/area/engine/engineering)
"cAQ" = (
/obj/structure/chair,
-/mob/living/simple_animal/cockroach,
/turf/simulated/floor/plating,
/area/maintenance/aft)
"cAR" = (
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index fd3bc349f4c..54f015fdf44 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -117,47 +117,49 @@
C << "You are no longer running on internals."
icon_state = "internal0"
else
- if(!istype(C.wear_mask, /obj/item/clothing/mask))
- C << "You are not wearing an internals mask!"
- return 1
- else
- var/obj/item/clothing/mask/M = C.wear_mask
- if(M.mask_adjusted) // if mask on face but pushed down
- M.adjustmask(C) // adjust it back
- if( !(M.flags & MASKINTERNALS) )
+ if(!C.getorganslot("breathing_tube"))
+ if(!istype(C.wear_mask, /obj/item/clothing/mask))
C << "You are not wearing an internals mask!"
- return
- if(istype(C.l_hand, /obj/item/weapon/tank))
- C << "You are now running on internals from the [C.l_hand] on your left hand."
- C.internal = C.l_hand
- else if(istype(C.r_hand, /obj/item/weapon/tank))
- C << "You are now running on internals from the [C.r_hand] on your right hand."
- C.internal = C.r_hand
- else if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(istype(H.s_store, /obj/item/weapon/tank))
- H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]."
- H.internal = H.s_store
- else if(istype(H.belt, /obj/item/weapon/tank))
- H << "You are now running on internals from the [H.belt] on your belt."
- H.internal = H.belt
- else if(istype(H.l_store, /obj/item/weapon/tank))
- H << "You are now running on internals from the [H.l_store] in your left pocket."
- H.internal = H.l_store
- else if(istype(H.r_store, /obj/item/weapon/tank))
- H << "You are now running on internals from the [H.r_store] in your right pocket."
- H.internal = H.r_store
-
- //Seperate so CO2 jetpacks are a little less cumbersome.
- if(!C.internal && istype(C.back, /obj/item/weapon/tank))
- C << "You are now running on internals from the [C.back] on your back."
- C.internal = C.back
-
- if(C.internal)
- icon_state = "internal1"
+ return 1
else
- C << "You don't have an oxygen tank!"
- return
+ var/obj/item/clothing/mask/M = C.wear_mask
+ if(M.mask_adjusted) // if mask on face but pushed down
+ M.adjustmask(C) // adjust it back
+ if( !(M.flags & MASKINTERNALS) )
+ C << "You are not wearing an internals mask!"
+ return
+
+ if(istype(C.l_hand, /obj/item/weapon/tank))
+ C << "You are now running on internals from the [C.l_hand] on your left hand."
+ C.internal = C.l_hand
+ else if(istype(C.r_hand, /obj/item/weapon/tank))
+ C << "You are now running on internals from the [C.r_hand] on your right hand."
+ C.internal = C.r_hand
+ else if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ if(istype(H.s_store, /obj/item/weapon/tank))
+ H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]."
+ H.internal = H.s_store
+ else if(istype(H.belt, /obj/item/weapon/tank))
+ H << "You are now running on internals from the [H.belt] on your belt."
+ H.internal = H.belt
+ else if(istype(H.l_store, /obj/item/weapon/tank))
+ H << "You are now running on internals from the [H.l_store] in your left pocket."
+ H.internal = H.l_store
+ else if(istype(H.r_store, /obj/item/weapon/tank))
+ H << "You are now running on internals from the [H.r_store] in your right pocket."
+ H.internal = H.r_store
+
+ //Seperate so CO2 jetpacks are a little less cumbersome.
+ if(!C.internal && istype(C.back, /obj/item/weapon/tank))
+ C << "You are now running on internals from the [C.back] on your back."
+ C.internal = C.back
+
+ if(C.internal)
+ icon_state = "internal1"
+ else
+ C << "You don't have an oxygen tank!"
+ return
C.update_action_buttons_icon()
/obj/screen/mov_intent
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 04c111d3198..eecc54ef93d 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -100,9 +100,10 @@ var/datum/subsystem/garbage_collector/SSgarbage
/datum/subsystem/garbage_collector/proc/QueueForQueuing(datum/A)
if (istype(A) && isnull(A.gc_destroyed))
tobequeued += A
+ A.gc_destroyed = -1
/datum/subsystem/garbage_collector/proc/Queue(datum/A)
- if (!istype(A) || !isnull(A.gc_destroyed))
+ if (!istype(A) || (!isnull(A.gc_destroyed) && A.gc_destroyed >= 0))
return
var/gctime = world.time
var/refid = "\ref[A]"
@@ -110,7 +111,7 @@ var/datum/subsystem/garbage_collector/SSgarbage
A.gc_destroyed = gctime
if (queue[refid])
- queue -= "\ref[A]" // Removing any previous references that were GC'd so that the current object will be at the end of the list.
+ queue -= refid // Removing any previous references that were GC'd so that the current object will be at the end of the list.
queue[refid] = gctime
@@ -166,8 +167,6 @@ var/datum/subsystem/garbage_collector/SSgarbage
return FALSE
if(D.gc_destroyed)
return TRUE
- if(SSgarbage && SSgarbage.tobequeued && SSgarbage.tobequeued.len && D in SSgarbage.tobequeued)
- return TRUE
return FALSE
// Default implementation of clean-up code.
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index 4442bee8933..57e603487fb 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -56,7 +56,7 @@ var/datum/subsystem/shuttle/SSshuttle
var/datum/supply_pack/P = new pack()
if(!P.contains)
continue
- supply_packs["[P.type]"] = P
+ supply_packs[P.type] = P
initial_move()
..()
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index 684ee437c89..e17f41445d0 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -112,3 +112,6 @@
..()
if(M.mind)
M.mind.remove_spell(/obj/effect/proc_holder/spell/bloodcrawl)
+
+/obj/item/organ/internal/heart/demon/Stop()
+ return 0 // Always beating.
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index d5d116a4392..7b935abfdb5 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -63,3 +63,11 @@
track_delay = world.time + 10 // 1 second
return
+
+
+
+/obj/item/device/multitool/cyborg
+ name = "multitool"
+ desc = "Optimised and stripped-down version of a regular multitool."
+ icon = 'icons/obj/items_cyborg.dmi'
+ toolspeed = 2
\ No newline at end of file
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index ae8d23b9ecb..68052b14958 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -129,7 +129,7 @@ MASS SPECTROMETER
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.heart_attack)
+ if(H.heart_attack && H.stat != DEAD)
user << "Subject suffering from heart attack: Apply defibrillator immediately!"
user << "Analyzing results for [M]:\n\tOverall status: [mob_status]"
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 0152f03c41d..88c1ab6393c 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -548,7 +548,7 @@
/obj/item/weapon/twohanded/shockpaddles/syndicate
name = "syndicate defibrillator paddles"
- desc = "A pair of paddles used to revive deceased operatives. It possesses both the ability to penetrate armor and todeliver powerful shocks offensively."
+ desc = "A pair of paddles used to revive deceased operatives. It possesses both the ability to penetrate armor and to deliver powerful shocks offensively."
combat = 1
icon = 'icons/obj/weapons.dmi'
icon_state = "defibpaddles0"
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index e7370d3e027..4d1782496a8 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -145,6 +145,20 @@
else
user << "You need one rod to make a wired rod!"
return
+ else if(istype(I, /obj/item/stack/sheet/metal))
+ var/obj/item/stack/sheet/metal/M = I
+ if(M.amount < 6)
+ user << "You need at least six metal sheets to make good enough weights!"
+ return
+ user << "You begin to apply [I] to [src]..."
+ if(do_after(user, 35, target = src))
+ var/obj/item/weapon/restraints/legcuffs/bola/S = new /obj/item/weapon/restraints/legcuffs/bola
+ M.use(6)
+ user.put_in_hands(S)
+ user << "You make some weights out of [I] and tie them to [src]."
+ if(!remove_item_from_storage(user))
+ user.unEquip(src)
+ qdel(src)
/obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user)
if(isrobot(user))
@@ -266,3 +280,21 @@
/obj/item/weapon/restraints/legcuffs/beartrap/energy/attack_hand(mob/user)
Crossed(user) //honk
+
+/obj/item/weapon/restraints/legcuffs/bola
+ name = "bola"
+ desc = "A restraining device designed to be thrown at the target. Upon connecting with said target, it will wrap around their legs, making it difficult for them to move quickly."
+ icon_state = "bola"
+ breakouttime = 35//easy to apply, easy to break out of
+ gender = NEUTER
+
+/obj/item/weapon/restraints/legcuffs/bola/throw_impact(atom/hit_atom)
+ if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed,
+ return//abort
+ var/mob/living/carbon/C = hit_atom
+ if(!C.legcuffed)
+ C.legcuffed = src
+ src.loc = C
+ C.update_inv_legcuffed()
+ feedback_add_details("handcuffs","B")
+ C << "\The [src] ensares you!"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index f92335d09d0..640a14dec73 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -98,6 +98,12 @@
origin_tech = "materials=2;combat=4"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut")
+/obj/item/weapon/kitchen/knife/combat/cyborg
+ name = "cyborg knife"
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "knife"
+ desc = "A cyborg-mounted plasteel knife. Extremely sharp and durable."
+
/obj/item/weapon/kitchen/knife/carrotshiv
name = "carrot shiv"
icon_state = "carrotshiv"
@@ -118,4 +124,4 @@
w_class = 3
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
-/* Trays moved to /obj/item/weapon/storage/bag */
+/* Trays moved to /obj/item/weapon/storage/bag */
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index b85ad5b5f54..9cda0111094 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -180,6 +180,7 @@
name = "\improper Midori Tabako packet"
desc = "You can't understand the runes, but the packet smells funny."
icon_state = "midori"
+ spawn_type = /obj/item/clothing/mask/cigarette/rollie
/obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims
name ="\improper Shady Jim's Super Slims"
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index 58b230917d2..f62985f47f3 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -28,14 +28,15 @@
H.internal = null
H.update_internals_hud_icon(0)
else
- if(!H.wear_mask)
- H << "You need a mask!"
- return
- if(H.wear_mask.mask_adjusted)
- H.wear_mask.adjustmask(H)
- if(!(H.wear_mask.flags & MASKINTERNALS))
- H << "[H.wear_mask] can't use [src]!"
- return
+ if(!H.getorganslot("breathing_tube"))
+ if(!H.wear_mask)
+ H << "You need a mask!"
+ return
+ if(H.wear_mask.mask_adjusted)
+ H.wear_mask.adjustmask(H)
+ if(!(H.wear_mask.flags & MASKINTERNALS))
+ H << "[H.wear_mask] can't use [src]!"
+ return
if(H.internal)
H << "You switch your internals to [src]."
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 67696207645..3c546350790 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -34,6 +34,12 @@
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
return (BRUTELOSS)
+/obj/item/weapon/wrench/cyborg
+ name = "automatic wrench"
+ desc = "An advanced robotic wrench. Can be found in construction cyborgs."
+ icon = 'icons/obj/items_cyborg.dmi'
+ toolspeed = 2
+
/*
* Screwdriver
*/
@@ -99,6 +105,17 @@
M = user
return eyestab(M,user)
+/obj/item/weapon/screwdriver/cyborg
+ name = "powered screwdriver"
+ desc = "An electrical screwdriver, designed to be both precise and quick."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "screwdriver"
+ item_state = "screwdriver_brown"
+ toolspeed = 2
+
+/obj/item/weapon/screwdriver/cyborg/New(loc, var/param_color = null)
+ return ..(loc, "cyborg")
+
/*
* Wirecutters
*/
@@ -142,6 +159,16 @@
playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1, -1)
return (BRUTELOSS)
+
+/obj/item/weapon/wirecutters/cyborg
+ name = "wirecutters"
+ desc = "This cuts wires."
+ icon = 'icons/obj/items_cyborg.dmi'
+ toolspeed = 2
+
+/obj/item/weapon/wirecutters/cyborg/New(loc, var/param_color = null)
+ return ..(loc, "cyborg")
+
/*
* Welding Tool
*/
@@ -396,6 +423,11 @@
origin_tech = "engineering=2"
/obj/item/weapon/weldingtool/largetank/cyborg
+ name = "integrated welding tool"
+ desc = "An advanced welder designed to be used in robotic systems."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "indwelder"
+ toolspeed = 2
/obj/item/weapon/weldingtool/largetank/flamethrower_screwdriver()
return
@@ -494,3 +526,10 @@
materials = list(MAT_METAL=70)
icon_state = "crowbar_large"
toolspeed = 2
+
+/obj/item/weapon/crowbar/cyborg
+ name = "hydraulic crowbar"
+ desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs."
+ icon = 'icons/obj/items_cyborg.dmi'
+ force = 10
+ toolspeed = 2
\ No newline at end of file
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 5614b8ef4c4..eef13b29223 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -19,6 +19,8 @@
playsound(get_turf(src), W.hitsound, 100, 0, 0)
user.visible_message("[user] begins to cut down [src] with [W].","You begin to cut down [src] with [W].", "You hear the sound of cutting a tree.")
if(do_after(user, 1000/W.force, target = user)) //5 seconds with 20 force, 8 seconds with a hatchet, 20 seconds with a shard.
+ if(cut)
+ return
user.visible_message("[user] falls [src] with the [W].","You fall [src] with the [W].", "You hear the sound of a tree falling.")
playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 100 , 0, 0)
icon_state = "tree_stump"
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index eecfb9537d1..90a14e8d47c 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -200,7 +200,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
. += "[procname] returned an associative list:"
for(var/key in returnedlist)
. += "\n[key] = [returnedlist[key]]"
-
+
else
. += "[procname] returned a list:"
for(var/elem in returnedlist)
@@ -644,8 +644,15 @@ var/global/list/g_fancy_list_of_types = null
E.active = 1
for(var/obj/machinery/field/generator/F in machines)
- if(F.anchored)
- F.Varedit_start = 1
+ if(F.active == 0)
+ F.active = 1
+ F.state = 2
+ F.power = 250
+ F.anchored = 1
+ F.warming_up = 3
+ F.start_fields()
+ F.update_icon()
+
spawn(30)
for(var/obj/machinery/the_singularitygen/G in machines)
if(G.anchored)
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
index 42c71e8da14..66c305e307d 100644
--- a/code/modules/cargo/console.dm
+++ b/code/modules/cargo/console.dm
@@ -105,7 +105,7 @@
say("The supply shuttle has been loaned to Centcom.")
. = TRUE
if("add")
- var/id = params["id"]
+ var/id = text2path(params["id"])
if(!SSshuttle.supply_packs[id])
return
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 9c033b4bf67..06e2e7fc1a1 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -372,7 +372,8 @@
/datum/supply_pack/security/justiceinbound
name = "Standard Justice Enforcer Crate"
- cost = 80 //justice comes at a price. An expensive, noisy price.
+ cost = 60 //justice comes at a price. An expensive, noisy price.
+ contraband = TRUE
contains = list(/obj/item/clothing/head/helmet/justice,
/obj/item/clothing/mask/gas/sechailer)
crate_name = "justice enforcer crate"
@@ -1226,10 +1227,12 @@
name = "Contraband Crate"
contraband = TRUE
cost = 30
- num_contained = 5
+ num_contained = 6
contains = list(/obj/item/weapon/poster/contraband,
- /obj/item/weapon/storage/fancy/cigarettes/dromedaryco,
- /obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims)
+ /obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims,
+ /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori,
+ /obj/item/seeds/ambrosiadeusseed,
+ /obj/item/clothing/tie/dope_necklace)
crate_name = "crate"
/datum/supply_pack/misc/randomised/toys
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 628cb2350cb..a9baaf881f0 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -77,6 +77,14 @@
time = 40
category = CAT_WEAPON
+/datum/table_recipe/bola
+ name = "Bola"
+ result = /obj/item/weapon/restraints/legcuffs/bola
+ reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1,
+ /obj/item/stack/sheet/metal = 6)
+ time = 20//15 faster than crafting them by hand!
+ category= CAT_WEAPON
+
/datum/table_recipe/tailclub
name = "Tail Club"
result = /obj/item/weapon/tailclub
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 23f92bbaf11..f35f90877f9 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -332,9 +332,10 @@
if(internal)
internal = null
update_internals_hud_icon(0)
- else if(ITEM && istype(ITEM, /obj/item/weapon/tank) && wear_mask && (wear_mask.flags & MASKINTERNALS))
- internal = ITEM
- update_internals_hud_icon(1)
+ else if(ITEM && istype(ITEM, /obj/item/weapon/tank))
+ if((wear_mask && (wear_mask.flags & MASKINTERNALS)) || getorganslot("breathing_tube"))
+ internal = ITEM
+ update_internals_hud_icon(1)
visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].", \
"[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].")
@@ -811,10 +812,6 @@ var/const/GALOSHES_DONT_HELP = 4
for(var/datum/disease/D in viruses)
D.cure(0)
- if(dna)
- for(var/datum/mutation/human/HM in dna.mutations)
- if(HM.quality != POSITIVE)
- dna.remove_mutation(HM.name)
..()
/mob/living/carbon/can_be_revived()
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 665ca0422be..544a023160b 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -1,8 +1,9 @@
/mob/living/carbon
gender = MALE
hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD)
- var/list/stomach_contents = list()
- var/list/internal_organs = list() //List of /obj/item/organ/internal in the mob. They don't go in the contents for some reason I don't want to know.
+ var/list/stomach_contents = list()
+ var/list/internal_organs = list() //List of /obj/item/organ/internal in the mob. They don't go in the contents for some reason I don't want to know.
+ var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.
var/silent = 0 //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU.
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 373dfd5d563..c2a6b07536c 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -951,4 +951,7 @@
L.Insert(src)
restore_blood()
remove_all_embedded_objects()
+ for(var/datum/mutation/human/HM in dna.mutations)
+ if(HM.quality != POSITIVE)
+ dna.remove_mutation(HM.name)
..()
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index c7e5f8174fe..3e0ad9b5b3c 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -173,7 +173,7 @@
/mob/living/carbon/human/wear_mask_update(obj/item/clothing/C, toggle_off = 1)
if((C.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || (initial(C.flags_inv) & (HIDEHAIR|HIDEFACIALHAIR)))
update_hair()
- if(toggle_off && internal)
+ if(toggle_off && internal && !getorganslot("breathing_tube"))
update_internals_hud_icon(0)
internal = null
if(C.flags_inv & HIDEEYES)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 5eae2646803..2de0bcc254b 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -203,6 +203,9 @@
if(internal.loc != src)
internal = null
update_internals_hud_icon(0)
+ else if ((!wear_mask || !(wear_mask.flags & MASKINTERNALS)) && !getorganslot("breathing_tube"))
+ internal = null
+ update_internals_hud_icon(0)
else
update_internals_hud_icon(1)
return internal.remove_air_volume(volume_needed)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index fb2e6646e18..de11726345d 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -453,7 +453,7 @@
if (WT.remove_fuel(0, user)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
if(src == user)
user << "You start fixing youself..."
- if(!do_after(user, 50/W.toolspeed, target = src))
+ if(!do_after(user, 50, target = src))
return
adjustBruteLoss(-30)
diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
index 0deb6c4289a..30af1ef94da 100644
--- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
@@ -52,4 +52,5 @@
desc = "One bug squashed. Four more will rise in its place."
icon = 'icons/effects/blood.dmi'
icon_state = "xfloor1"
- random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
\ No newline at end of file
+ random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
+ layer = 2
\ No newline at end of file
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 4517dea695e..a29cc3b29fd 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -100,15 +100,18 @@
if(!affecting.buckled)
affecting.loc = assailant.loc
+ var/breathing_tube = affecting.getorganslot("breathing_tube")
+
if(state >= GRAB_NECK)
affecting.Stun(5) //It will hamper your voice, being choked and all.
- if(isliving(affecting))
+ if(isliving(affecting) && !breathing_tube)
var/mob/living/L = affecting
L.adjustOxyLoss(1)
if(state >= GRAB_KILL)
affecting.Weaken(5) //Should keep you down unless you get help.
- affecting.losebreath = min(affecting.losebreath + 2, 3)
+ if(!breathing_tube)
+ affecting.losebreath = min(affecting.losebreath + 2, 3)
/obj/item/weapon/grab/attack_self(mob/user)
s_click(hud)
@@ -165,7 +168,8 @@
add_logs(assailant, affecting, "strangled")
assailant.changeNext_move(CLICK_CD_TKSTRANGLE)
- affecting.losebreath += 1
+ if(!affecting.getorganslot("breathing_tube"))
+ affecting.losebreath += 1
else
if(assailant)
assailant.visible_message("[assailant] is unable to tighten \his grip on [affecting]'s neck!")
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index c1bdb82a9d8..cb4d7e439f1 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -15,10 +15,8 @@
var/obj/machinery/field/generator/FG2 = null
/obj/machinery/field/containment/Destroy()
- if(FG1 && !FG1.clean_up)
- FG1.cleanup()
- if(FG2 && !FG2.clean_up)
- FG2.cleanup()
+ FG1.fields -= src
+ FG2.fields -= src
return ..()
/obj/machinery/field/containment/attack_hand(mob/user)
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 008416ac9e5..47604070cbd 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -13,6 +13,15 @@ field_generator power level display
*/
#define field_generator_max_power 250
+
+#define FG_UNSECURED 0
+#define FG_SECURED 1
+#define FG_WELDED 2
+
+#define FG_OFFLINE 0
+#define FG_CHARGING 1
+#define FG_ONLINE 2
+
/obj/machinery/field/generator
name = "Field Generator"
desc = "A large thermal battery that projects a high amount of energy when powered."
@@ -22,76 +31,51 @@ field_generator power level display
density = 1
use_power = 0
var/const/num_power_levels = 6 // Total number of power level icon has
- var/Varedit_start = 0
- var/Varpower = 0
- var/active = 0
+ var/power_level = 0
+ var/active = FG_OFFLINE
var/power = 20 // Current amount of power
- var/state = 0
+ var/state = FG_UNSECURED
var/warming_up = 0
var/list/obj/machinery/field/containment/fields
var/list/obj/machinery/field/generator/connected_gens
var/clean_up = 0
-
/obj/machinery/field/generator/update_icon()
overlays.Cut()
if(warming_up)
overlays += "+a[warming_up]"
if(fields.len)
overlays += "+on"
- // Power level indicator
- // Scale % power to % num_power_levels and truncate value
- var/level = round(num_power_levels * power / field_generator_max_power)
- // Clamp between 0 and num_power_levels for out of range power values
- level = Clamp(level, 0, num_power_levels)
- if(level)
- overlays += "+p[level]"
-
- return
+ if(power_level)
+ overlays += "+p[power_level]"
/obj/machinery/field/generator/New()
..()
fields = list()
connected_gens = list()
- return
/obj/machinery/field/generator/process()
- if(Varedit_start == 1)
- if(active == 0)
- active = 1
- state = 2
- power = field_generator_max_power
- anchored = 1
- warming_up = 3
- start_fields()
- update_icon()
- Varedit_start = 0
-
- if(src.active == 2)
+ if(active == FG_ONLINE)
calc_power()
- update_icon()
- return
-
/obj/machinery/field/generator/attack_hand(mob/user)
- if(state == 2)
+ if(state == FG_WELDED)
if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on
- if(src.active >= 1)
- user << "You are unable to turn off the [src.name] once it is online!"
+ if(active >= FG_CHARGING)
+ user << "You are unable to turn off the [name] once it is online!"
return 1
else
- user.visible_message("[user.name] turns on the [src.name].", \
- "You turn on the [src.name].", \
+ user.visible_message("[user.name] turns on the [name].", \
+ "You turn on the [name].", \
"You hear heavy droning.")
turn_on()
investigate_log("activated by [user.key].","singulo")
- src.add_fingerprint(user)
+ add_fingerprint(user)
else
user << "The [src] needs to be firmly secured to the floor first!"
- return
/obj/machinery/field/generator/attackby(obj/item/W, mob/user, params)
@@ -100,54 +84,52 @@ field_generator power level display
return
else if(istype(W, /obj/item/weapon/wrench))
switch(state)
- if(0)
+ if(FG_UNSECURED)
if(isinspace()) return
- state = 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] secures [src.name] to the floor.", \
+ state = FG_SECURED
+ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] secures [name] to the floor.", \
"You secure the external reinforcing bolts to the floor.", \
"You hear ratchet.")
- src.anchored = 1
- if(1)
- state = 0
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
+ anchored = 1
+ if(FG_SECURED)
+ state = FG_UNSECURED
+ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] unsecures [name] reinforcing bolts from the floor.", \
"You undo the external reinforcing bolts.", \
"You hear ratchet.")
- src.anchored = 0
- if(2)
- user << "The [src.name] needs to be unwelded from the floor!"
- return
+ anchored = 0
+ if(FG_WELDED)
+ user << "The [name] needs to be unwelded from the floor!"
+
else if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
switch(state)
- if(0)
- user << "The [src.name] needs to be wrenched to the floor!"
- return
- if(1)
+ if(FG_UNSECURED)
+ user << "The [name] needs to be wrenched to the floor!"
+
+ if(FG_SECURED)
if (WT.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
- user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
+ playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to weld the [name] to the floor.", \
"You start to weld \the [src] to the floor...", \
"You hear welding.")
if (do_after(user,20/W.toolspeed, target = src))
if(!src || !WT.isOn()) return
- state = 2
+ state = FG_WELDED
user << "You weld the field generator to the floor."
- else
- return
- if(2)
+
+ if(FG_WELDED)
if (WT.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
- user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
+ playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to cut the [name] free from the floor.", \
"You start to cut \the [src] free from the floor...", \
"You hear welding.")
if (do_after(user,20/W.toolspeed, target = src))
if(!src || !WT.isOn()) return
- state = 1
+ state = FG_SECURED
user << "You cut \the [src] free from the floor."
- else
- return
+
else
..()
@@ -164,28 +146,33 @@ field_generator power level display
/obj/machinery/field/generator/bullet_act(obj/item/projectile/Proj)
if(Proj.flag != "bullet")
- power += Proj.damage
- update_icon()
+ power = min(power + Proj.damage, field_generator_max_power)
+ check_power_level()
return 0
/obj/machinery/field/generator/Destroy()
- src.cleanup()
+ cleanup()
return ..()
+/obj/machinery/field/generator/proc/check_power_level()
+ var/new_level = round(num_power_levels * power / field_generator_max_power)
+ if(new_level != power_level)
+ power_level = new_level
+ update_icon()
/obj/machinery/field/generator/proc/turn_off()
- active = 0
+ active = FG_OFFLINE
spawn(1)
- src.cleanup()
+ cleanup()
while (warming_up>0 && !active)
sleep(50)
warming_up--
update_icon()
/obj/machinery/field/generator/proc/turn_on()
- active = 1
+ active = FG_CHARGING
spawn(1)
while (warming_up<3 && active)
sleep(50)
@@ -196,44 +183,35 @@ field_generator power level display
/obj/machinery/field/generator/proc/calc_power()
- if(Varpower)
- return 1
+ var/power_draw = 2 + fields.len
- update_icon()
- if(src.power > field_generator_max_power)
- src.power = field_generator_max_power
-
- var/power_draw = 2
- for (var/obj/machinery/field/containment/F in fields)
- if (isnull(F))
- continue
- power_draw++
if(draw_power(round(power_draw/2,1)))
+ check_power_level()
return 1
else
- visible_message("The [src.name] shuts down!", "You hear something shutting down.")
+ visible_message("The [name] shuts down!", "You hear something shutting down.")
turn_off()
investigate_log("ran out of power and deactivated","singulo")
- src.power = 0
+ power = 0
+ check_power_level()
return 0
//This could likely be better, it tends to start loopin if you have a complex generator loop setup. Still works well enough to run the engine fields will likely recode the field gens and fields sometime -Mport
/obj/machinery/field/generator/proc/draw_power(draw = 0, failsafe = 0, obj/machinery/field/generator/G = null, obj/machinery/field/generator/last = null)
- if(Varpower)
- return 1
- if((G && G == src) || (failsafe >= 8))//Loopin, set fail
+ if((G && (G == src)) || (failsafe >= 8))//Loopin, set fail
return 0
else
failsafe++
- if(src.power >= draw)//We have enough power
- src.power -= draw
+
+ if(power >= draw)//We have enough power
+ power -= draw
return 1
+
else//Need more power
- draw -= src.power
- src.power = 0
- for(var/obj/machinery/field/generator/FG in connected_gens)
- if(isnull(FG))
- continue
+ draw -= power
+ power = 0
+ for(var/CG in connected_gens)
+ var/obj/machinery/field/generator/FG = CG
if(FG == last)//We just asked you
continue
if(G)//Another gen is askin for power and we dont have it
@@ -249,7 +227,7 @@ field_generator power level display
/obj/machinery/field/generator/proc/start_fields()
- if(!src.state == 2 || !anchored)
+ if(state != FG_WELDED || !anchored)
turn_off()
return
spawn(1)
@@ -260,82 +238,72 @@ field_generator power level display
setup_field(4)
spawn(4)
setup_field(8)
- src.active = 2
+ active = FG_ONLINE
/obj/machinery/field/generator/proc/setup_field(NSEW)
- var/turf/T = src.loc
- var/obj/machinery/field/generator/G
+ var/turf/T = loc
+ if(!istype(T))
+ return 0
+
+ var/obj/machinery/field/generator/G = null
var/steps = 0
if(!NSEW)//Make sure its ran right
- return
- for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator
+ return 0
+ for(var/dist in 0 to 7) // checks out to 8 tiles away for another generator
T = get_step(T, NSEW)
if(T.density)//We cant shoot a field though this
return 0
- for(var/atom/A in T.contents)
- if(ismob(A))
- continue
- if(!istype(A,/obj/machinery/field/generator))
- if((istype(A,/obj/machinery/door)||istype(A,/obj/machinery/the_singularitygen))&&(A.density))
- return 0
- steps += 1
+
G = locate(/obj/machinery/field/generator) in T
- if(!isnull(G))
+ if(G)
steps -= 1
if(!G.active)
return 0
break
- if(isnull(G))
- return
- T = src.loc
- for(var/dist = 0, dist < steps, dist += 1) // creates each field tile
+
+ for(var/TC in T.contents)
+ var/atom/A = TC
+ if(ismob(A))
+ continue
+ if(A.density)
+ return 0
+
+ steps++
+
+ if(!G)
+ return 0
+
+ T = loc
+ for(var/dist in 0 to steps) // creates each field tile
var/field_dir = get_dir(T,get_step(G.loc, NSEW))
T = get_step(T, NSEW)
if(!locate(/obj/machinery/field/containment) in T)
var/obj/machinery/field/containment/CF = new/obj/machinery/field/containment()
CF.set_master(src,G)
- fields += CF
- G.fields += CF
CF.loc = T
CF.dir = field_dir
- for(var/mob/living/L in CF.loc)
+ fields += CF
+ G.fields += CF
+ for(var/mob/living/L in T)
CF.Crossed(L)
- var/listcheck = 0
- for(var/obj/machinery/field/generator/FG in connected_gens)
- if (isnull(FG))
- continue
- if(FG == G)
- listcheck = 1
- break
- if(!listcheck)
- connected_gens.Add(G)
- listcheck = 0
- for(var/obj/machinery/field/generator/FG2 in G.connected_gens)
- if (isnull(FG2))
- continue
- if(FG2 == src)
- listcheck = 1
- break
- if(!listcheck)
- G.connected_gens.Add(src)
+
+ connected_gens |= G
+ G.connected_gens |= src
+ update_icon()
/obj/machinery/field/generator/proc/cleanup()
clean_up = 1
- for (var/obj/machinery/field/containment/F in fields)
- if (isnull(F))
- continue
+ for (var/F in fields)
qdel(F)
- fields = list()
- for(var/obj/machinery/field/generator/FG in connected_gens)
- if (isnull(FG))
- continue
- FG.connected_gens.Remove(src)
+
+ for(var/CG in connected_gens)
+ var/obj/machinery/field/generator/FG = CG
+ FG.connected_gens -= src
if(!FG.clean_up)//Makes the other gens clean up as well
FG.cleanup()
- connected_gens.Remove(FG)
- connected_gens = list()
+ connected_gens -= FG
clean_up = 0
update_icon()
@@ -359,3 +327,11 @@ field_generator power level display
/obj/machinery/field/generator/bump_field(atom/movable/AM as mob|obj)
if(fields.len)
..()
+
+#undef FG_UNSECURED
+#undef FG_SECURED
+#undef FG_WELDED
+
+#undef FG_OFFLINE
+#undef FG_CHARGING
+#undef FG_ONLINE
diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/mounted.dm
index 84549c8e09f..177445f3b43 100644
--- a/code/modules/projectiles/guns/mounted.dm
+++ b/code/modules/projectiles/guns/mounted.dm
@@ -1,12 +1,11 @@
/obj/item/weapon/gun/energy/gun/advtaser/mounted
name = "mounted taser"
desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots."
- icon_state = "armcannon"
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "taser"
+ item_state = "armcannonstun4"
force = 5
selfcharge = 1
- flags = NODROP
- slot_flags = null
- w_class = 5
can_flashlight = 0
/obj/item/weapon/gun/energy/gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow...
@@ -15,16 +14,13 @@
/obj/item/weapon/gun/energy/laser/mounted
name = "mounted laser"
- desc = "An arm mounted cannon that fires lethal lasers. Doesn't come with a charge beam."
- icon_state = "armcannon"
+ desc = "An arm mounted cannon that fires lethal lasers."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "laser"
item_state = "armcannonlase"
force = 5
selfcharge = 1
- flags = NODROP
- slot_flags = null
- w_class = 5
- materials = null
/obj/item/weapon/gun/energy/laser/mounted/dropped()
..()
- src.loc = null
+ src.loc = null
\ 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 aaa5d9df810..028bc09f8ae 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -121,6 +121,17 @@
build_path = /obj/item/organ/internal/cyberimp/eyes/shield
category = list("Misc", "Medical Designs")
+/datum/design/cyberimp_breather
+ name = "Breathing Tube implant"
+ desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked."
+ id = "ci-breather"
+ req_tech = list("materials" = 3, "biotech" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ construction_time = 35
+ materials = list(MAT_METAL = 200, MAT_GLASS = 250)
+ build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube
+ category = list("Misc", "Medical Designs")
+
/datum/design/cyberimp_medical_hud
name = "Medical HUD implant"
desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control."
@@ -174,7 +185,7 @@
construction_time = 60
materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 400, MAT_GOLD = 400)
build_path = /obj/item/organ/internal/cyberimp/brain/anti_drop
- category = list("Medical Designs")
+ category = list("Misc", "Medical Designs")
/datum/design/cyberimp_antistun
name = "CNS Rebooter implant"
@@ -185,7 +196,7 @@
construction_time = 60
materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 500, MAT_GOLD = 1000)
build_path = /obj/item/organ/internal/cyberimp/brain/anti_stun
- category = list("Medical Designs")
+ category = list("Misc", "Medical Designs")
/datum/design/cyberimp_nutriment
name = "Nutriment pump implant"
@@ -196,7 +207,7 @@
construction_time = 40
materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 500, MAT_URANIUM = 500)
build_path = /obj/item/organ/internal/cyberimp/chest/nutriment
- category = list("Medical Designs")
+ category = list("Misc", "Medical Designs")
/datum/design/cyberimp_nutriment_plus
name = "Nutriment pump implant PLUS"
@@ -207,7 +218,7 @@
construction_time = 50
materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 500, MAT_URANIUM = 750)
build_path = /obj/item/organ/internal/cyberimp/chest/nutriment/plus
- category = list("Medical Designs")
+ category = list("Misc", "Medical Designs")
/datum/design/cyberimp_reviver
name = "Reviver implant"
@@ -237,7 +248,7 @@
/datum/design/implantcase
name = "Implant Case"
- desc = "A glass case containing an implant."
+ desc = "A glass case for containing an implant."
id = "implantcase"
req_tech = list("materials" = 1, "biotech" = 2)
build_type = PROTOLATHE
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
index 26de8b0b6a5..b0cc38c8dc8 100644
--- a/code/modules/surgery/organ_manipulation.dm
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -7,13 +7,13 @@
requires_organic_bodypart = 0
/datum/surgery/organ_manipulation/soft
- possible_locs = list("groin", "eyes", "mouth")
+ possible_locs = list("groin", "eyes", "mouth", "l_arm", "r_arm")
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders,
/datum/surgery_step/incise, /datum/surgery_step/manipulate_organs)
/datum/surgery/organ_manipulation/alien
name = "alien organ manipulation"
- possible_locs = list("chest", "head", "groin", "eyes", "mouth")
+ possible_locs = list("chest", "head", "groin", "eyes", "mouth", "l_arm", "r_arm")
species = list(/mob/living/carbon/alien/humanoid)
steps = list(/datum/surgery_step/saw, /datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/manipulate_organs)
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
new file mode 100644
index 00000000000..247bf322e02
--- /dev/null
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -0,0 +1,182 @@
+/obj/item/organ/internal/cyberimp/arm
+ name = "arm-mounted implant"
+ desc = "You shouldn't see this! Adminhelp and report this as an issue on github!"
+ zone = "r_arm"
+ slot = "r_arm_device"
+ icon_state = "implant-toolkit"
+ w_class = 3
+ actions_types = list(/datum/action/item_action/organ_action/toggle)
+
+ var/list/items_list = list()
+ // Used to store a list of all items inside, for multi-item implants.
+ // I would use contents, but they shuffle on every activation/deactivation leading to interface inconsistencies.
+
+ var/obj/item/holder = null
+ // You can use this var for item path, it would be converted into an item on New()
+
+/obj/item/organ/internal/cyberimp/arm/New()
+ ..()
+ if(ispath(holder))
+ holder = new holder(src)
+
+ update_icon()
+ slot = zone + "_device"
+ items_list = contents.Copy()
+
+/obj/item/organ/internal/cyberimp/arm/update_icon()
+ if(zone == "r_arm")
+ transform = null
+ else // Mirroring the icon
+ transform = matrix(-1, 0, 0, 0, 1, 0)
+
+/obj/item/organ/internal/cyberimp/arm/examine(mob/user)
+ ..()
+ user << "[src] is assembled in the [zone == "r_arm" ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it."
+
+/obj/item/organ/internal/cyberimp/arm/attackby(obj/item/weapon/W, mob/user, params)
+ ..()
+ if(istype(W, /obj/item/weapon/screwdriver))
+ if(zone == "r_arm")
+ zone = "l_arm"
+ else
+ zone = "r_arm"
+ slot = zone + "_device"
+ user << "You modify [src] to be installed on the [zone == "r_arm" ? "right" : "left"] arm."
+ update_icon()
+ else if(istype(W, /obj/item/weapon/card/emag))
+ emag_act()
+
+/obj/item/organ/internal/cyberimp/arm/Remove(mob/living/carbon/M, special = 0)
+ Retract()
+ ..()
+
+/obj/item/organ/internal/cyberimp/arm/emag_act()
+ return 0
+
+/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity)
+ if(prob(15/severity))
+ owner << "[src] is hit by EMP!"
+ // give the owner an idea about why his implant is glitching
+ Retract()
+ ..()
+
+/obj/item/organ/internal/cyberimp/arm/proc/Retract()
+ if(!holder || (holder in src))
+ return
+
+ owner.visible_message("[owner] retracts [holder] back into \his [zone == "r_arm" ? "right" : "left"] arm.",
+ "[holder] snaps back into your [zone == "r_arm" ? "right" : "left"] arm.",
+ "You hear a short mechanical noise.")
+
+ owner.unEquip(holder, 1)
+ holder.loc = src
+ holder = null
+ playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
+
+/obj/item/organ/internal/cyberimp/arm/proc/Extend(var/obj/item/item)
+ if(!(item in src))
+ return
+
+ holder = item
+
+ holder.flags |= NODROP
+ holder.unacidable = 1
+ holder.slot_flags = null
+ holder.w_class = 5
+ holder.materials = null
+
+ var/arm_slot = (zone == "r_arm" ? slot_r_hand : slot_l_hand)
+ var/obj/item/arm_item = owner.get_item_by_slot(arm_slot)
+
+ if(arm_item)
+ if(!owner.unEquip(arm_item))
+ owner << "Your [arm_item] interferes with [src]!"
+ return
+ else
+ owner << "You drop [arm_item] to activate [src]!"
+
+ if(zone == "r_arm" ? !owner.put_in_r_hand(holder) : !owner.put_in_l_hand(holder))
+ owner << "Your [src] fails to activate!"
+ return
+
+ // Activate the hand that now holds our item.
+ if(zone == "r_arm" ? owner.hand : !owner.hand)
+ owner.swap_hand()
+
+ owner.visible_message("[owner] extends [holder] from \his [zone == "r_arm" ? "right" : "left"] arm.",
+ "You extend [holder] from your [zone == "r_arm" ? "right" : "left"] arm.",
+ "You hear a short mechanical noise.")
+ playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
+
+/obj/item/organ/internal/cyberimp/arm/ui_action_click()
+ if(crit_fail || (!holder && !contents.len))
+ owner << "The implant doesn't respond. It seems to be broken..."
+ return
+
+ // You can emag the arm-mounted implant by activating it while holding emag in it's hand.
+ var/arm_slot = (zone == "r_arm" ? slot_r_hand : slot_l_hand)
+ if(istype(owner.get_item_by_slot(arm_slot), /obj/item/weapon/card/emag) && emag_act())
+ return
+
+ if(!holder || (holder in src))
+ holder = null
+ if(contents.len == 1)
+ Extend(contents[1])
+ else // TODO: make it similar to borg's storage-like module selection
+ var/obj/item/choise = input("Activate which item?", "Arm Implant", null, null) as null|anything in items_list
+ if(owner && owner == usr && owner.stat != DEAD && (src in owner.internal_organs) && !holder && istype(choise) && (choise in contents))
+ // This monster sanity check is a nice example of how bad input() is.
+ Extend(choise)
+ else
+ Retract()
+
+
+/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity)
+ if(prob(30/severity) && owner && !crit_fail)
+ Retract()
+ owner.visible_message("A loud bang comes from [owner]\'s [zone == "r_arm" ? "right" : "left"] arm!")
+ playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, 1)
+ owner << "You feel an explosion erupt inside your [zone == "r_arm" ? "right" : "left"] arm as your implant breaks!"
+ owner.adjust_fire_stacks(20)
+ owner.IgniteMob()
+ owner.adjustFireLoss(25)
+ crit_fail = 1
+ else // The gun will still discharge anyway.
+ ..()
+
+
+/obj/item/organ/internal/cyberimp/arm/gun/laser
+ name = "arm-mounted laser implant"
+ desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use."
+ icon_state = "arm_laser"
+ origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4;syndicate=5"//this is kinda nutty and i might lower it
+ holder = /obj/item/weapon/gun/energy/laser/mounted
+
+/obj/item/organ/internal/cyberimp/arm/gun/laser/l/zone = "l_arm"
+
+
+/obj/item/organ/internal/cyberimp/arm/gun/taser
+ name = "arm-mounted taser implant"
+ desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use."
+ icon_state = "arm_taser"
+ origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4"
+ holder = /obj/item/weapon/gun/energy/gun/advtaser/mounted
+
+/obj/item/organ/internal/cyberimp/arm/gun/taser/l/zone = "l_arm"
+
+
+/obj/item/organ/internal/cyberimp/arm/toolset
+ name = "integrated toolset implant"
+ desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm. Contains all neccessary tools."
+ origin_tech = "materials=5;engineering=5;biotech=4;powerstorage=3"
+ contents = newlist(/obj/item/weapon/screwdriver/cyborg, /obj/item/weapon/wrench/cyborg, /obj/item/weapon/weldingtool/largetank/cyborg,
+ /obj/item/weapon/crowbar/cyborg, /obj/item/weapon/wirecutters/cyborg, /obj/item/device/multitool/cyborg)
+
+/obj/item/organ/internal/cyberimp/arm/toolset/l/zone = "l_arm"
+
+/obj/item/organ/internal/cyberimp/arm/toolset/emag_act()
+ if(!(locate(/obj/item/weapon/kitchen/knife/combat/cyborg) in items_list))
+ owner << "You unlock [src]'s integrated knife!"
+ items_list += new /obj/item/weapon/kitchen/knife/combat/cyborg(src)
+ return 1
+ return 0
\ No newline at end of file
diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm
new file mode 100644
index 00000000000..916051d133c
--- /dev/null
+++ b/code/modules/surgery/organs/augments_chest.dm
@@ -0,0 +1,106 @@
+/obj/item/organ/internal/cyberimp/chest
+ name = "cybernetic torso implant"
+ desc = "implants for the organs in your torso"
+ icon_state = "chest_implant"
+ implant_overlay = "chest_implant_overlay"
+ zone = "chest"
+
+/obj/item/organ/internal/cyberimp/chest/nutriment
+ name = "Nutriment pump implant"
+ desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
+ icon_state = "chest_implant"
+ implant_color = "#00AA00"
+ var/hunger_threshold = NUTRITION_LEVEL_STARVING
+ var/synthesizing = 0
+ var/poison_amount = 5
+ slot = "stomach"
+ origin_tech = "materials=5;programming=3;biotech=4"
+
+/obj/item/organ/internal/cyberimp/chest/nutriment/on_life()
+ if(synthesizing)
+ return
+
+ if(owner.nutrition <= hunger_threshold)
+ synthesizing = 1
+ owner << "You feel less hungry..."
+ owner.nutrition += 50
+ spawn(50)
+ synthesizing = 0
+
+/obj/item/organ/internal/cyberimp/chest/nutriment/emp_act(severity)
+ if(!owner)
+ return
+ owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning
+ owner << "You feel like your insides are burning."
+
+
+/obj/item/organ/internal/cyberimp/chest/nutriment/plus
+ name = "Nutriment pump implant PLUS"
+ desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry."
+ icon_state = "chest_implant"
+ implant_color = "#006607"
+ hunger_threshold = NUTRITION_LEVEL_HUNGRY
+ poison_amount = 10
+ origin_tech = "materials=5;programming=3;biotech=5"
+
+
+
+/obj/item/organ/internal/cyberimp/chest/reviver
+ name = "Reviver implant"
+ desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!"
+ icon_state = "chest_implant"
+ implant_color = "#AD0000"
+ origin_tech = "materials=6;programming=3;biotech=6;syndicate=4"
+ slot = "heartdrive"
+ var/revive_cost = 0
+ var/reviving = 0
+ var/cooldown = 0
+
+/obj/item/organ/internal/cyberimp/chest/reviver/on_life()
+ if(reviving)
+ if(owner.stat == UNCONSCIOUS)
+ spawn(30)
+ if(prob(90) && owner.getOxyLoss())
+ owner.adjustOxyLoss(-3)
+ revive_cost += 5
+ if(prob(75) && owner.getBruteLoss())
+ owner.adjustBruteLoss(-1)
+ revive_cost += 20
+ if(prob(75) && owner.getFireLoss())
+ owner.adjustFireLoss(-1)
+ revive_cost += 20
+ if(prob(40) && owner.getToxLoss())
+ owner.adjustToxLoss(-1)
+ revive_cost += 50
+ else
+ cooldown = revive_cost + world.time
+ reviving = 0
+ return
+
+ if(cooldown > world.time)
+ return
+ if(owner.stat != UNCONSCIOUS)
+ return
+ if(owner.suiciding)
+ return
+
+ revive_cost = 0
+ reviving = 1
+
+/obj/item/organ/internal/cyberimp/chest/reviver/emp_act(severity)
+ if(!owner)
+ return
+
+ if(reviving)
+ revive_cost += 200
+ else
+ cooldown += 200
+
+ if(istype(owner, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = owner
+ if(H.stat != DEAD && prob(50 / severity))
+ H.heart_attack = 1
+ spawn(600 / severity)
+ H.heart_attack = 0
+ if(H.stat == CONSCIOUS)
+ H << "You feel your heart beating again!"
\ No newline at end of file
diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm
index 279f912ef06..1693d217906 100644
--- a/code/modules/surgery/organs/augments_eyes.dm
+++ b/code/modules/surgery/organs/augments_eyes.dm
@@ -116,7 +116,7 @@
implant_color = "#101010"
flash_protect = 2
aug_message = null
- eye_color = "fff"
+ eye_color = null
/obj/item/organ/internal/cyberimp/eyes/shield/emp_act(severity)
return
\ No newline at end of file
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index b793fd05fc8..8a3776cce8e 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -26,6 +26,7 @@
icon_state = "brain_implant"
implant_overlay = "brain_implant_overlay"
zone = "head"
+ w_class = 1
/obj/item/organ/internal/cyberimp/brain/emp_act(severity)
if(!owner)
@@ -37,7 +38,7 @@
/obj/item/organ/internal/cyberimp/brain/anti_drop
- name = "Anti-drop implant"
+ name = "anti-drop implant"
desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle."
var/active = 0
var/l_hand_ignore = 0
@@ -101,11 +102,11 @@
if(L_item)
A = pick(oview(range))
L_item.throw_at(A, range, 2)
- owner << "Your left arm spasms and throws the [L_item.name]!"
+ owner << "Your left arm spasms and throws the [L_item.name]!"
if(R_item)
A = pick(oview(range))
R_item.throw_at(A, range, 2)
- owner << "Your right arm spasms and throws the [R_item.name]!"
+ owner << "Your right arm spasms and throws the [R_item.name]!"
/obj/item/organ/internal/cyberimp/brain/anti_drop/proc/release_items()
if(!l_hand_ignore && l_hand_obj in owner.contents)
@@ -144,185 +145,24 @@
crit_fail = 0
-//[[[[CHEST]]]]
+//[[[[MOUTH]]]]
+/obj/item/organ/internal/cyberimp/mouth
+ zone = "mouth"
-/obj/item/organ/internal/cyberimp/chest
- name = "cybernetic torso implant"
- desc = "implants for the organs in your torso"
- icon_state = "chest_implant"
- implant_overlay = "chest_implant_overlay"
- zone = "chest"
+/obj/item/organ/internal/cyberimp/mouth/breathing_tube
+ name = "breathing tube implant"
+ desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked."
+ icon_state = "breathing_tube"
+ slot = "breathing_tube"
+ w_class = 1
+ origin_tech = "materials=2;biotech=3"
-/obj/item/organ/internal/cyberimp/chest/nutriment
- name = "Nutriment pump implant"
- desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
- icon_state = "chest_implant"
- implant_color = "#00AA00"
- var/hunger_threshold = NUTRITION_LEVEL_STARVING
- var/synthesizing = 0
- var/poison_amount = 5
- slot = "stomach"
- origin_tech = "materials=5;programming=3;biotech=4"
-
-/obj/item/organ/internal/cyberimp/chest/nutriment/on_life()
- if(synthesizing)
- return
-
- if(owner.nutrition <= hunger_threshold)
- synthesizing = 1
- owner << "You feel less hungry..."
- owner.nutrition += 50
- spawn(50)
- synthesizing = 0
-
-/obj/item/organ/internal/cyberimp/chest/nutriment/emp_act(severity)
- if(!owner)
- return
- owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning
- owner << "You feel like your insides are burning."
+/obj/item/organ/internal/cyberimp/mouth/breathing_tube/emp_act(severity)
+ if(prob(60/severity))
+ owner << "Your breathing tube suddenly closes!"
+ owner.losebreath += 2
-/obj/item/organ/internal/cyberimp/chest/nutriment/plus
- name = "Nutriment pump implant PLUS"
- desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry."
- icon_state = "chest_implant"
- implant_color = "#006607"
- hunger_threshold = NUTRITION_LEVEL_HUNGRY
- poison_amount = 10
- origin_tech = "materials=5;programming=3;biotech=5"
-
-
-
-/obj/item/organ/internal/cyberimp/chest/reviver
- name = "Reviver implant"
- desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!"
- icon_state = "chest_implant"
- implant_color = "#AD0000"
- origin_tech = "materials=6;programming=3;biotech=6;syndicate=4"
- slot = "heartdrive"
- var/revive_cost = 0
- var/reviving = 0
- var/cooldown = 0
-
-/obj/item/organ/internal/cyberimp/chest/reviver/on_life()
- if(reviving)
- if(owner.stat == UNCONSCIOUS)
- spawn(30)
- if(prob(90) && owner.getOxyLoss())
- owner.adjustOxyLoss(-3)
- revive_cost += 5
- if(prob(75) && owner.getBruteLoss())
- owner.adjustBruteLoss(-1)
- revive_cost += 20
- if(prob(75) && owner.getFireLoss())
- owner.adjustFireLoss(-1)
- revive_cost += 20
- if(prob(40) && owner.getToxLoss())
- owner.adjustToxLoss(-1)
- revive_cost += 50
- else
- cooldown = revive_cost + world.time
- reviving = 0
- return
-
- if(cooldown > world.time)
- return
- if(owner.stat != UNCONSCIOUS)
- return
- if(owner.suiciding)
- return
-
- revive_cost = 0
- reviving = 1
-
-/obj/item/organ/internal/cyberimp/chest/reviver/emp_act(severity)
- if(!owner)
- return
-
- if(reviving)
- revive_cost += 200
- else
- cooldown += 200
-
- if(istype(owner, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = owner
- if(H.stat != DEAD && prob(50 / severity))
- H.heart_attack = 1
- spawn(600 / severity)
- H.heart_attack = 0
- if(H.stat == CONSCIOUS)
- H << "You feel your heart beating again!"
-
-/obj/item/organ/internal/cyberimp/chest/arm_mod//dummy parent item for making arm-mod implants. works best with nodrop items that are sent to nullspace upon being dropped.
- name = "Arm-mounted item implant"
- desc = "You shouldn't see this! Adminhelp and report this as an issue on github!"
- icon_state = "chest_implant"
- implant_color = "#007ACC"
- slot = "shoulders"
- origin_tech = "materials=5;biotech=4;powerstorage=4"
- actions_types = list(/datum/action/item_action/organ_action/toggle)
- var/obj/holder//is defined as the retractable item itself. ensure this is defined somewhere!
- var/out = 0//determines if the item is in the owner's hand or not
- var/overloaded = 0//is set to 1 when owner gets EMPed. if set to 1, implant doesn't work.
-
-/obj/item/organ/internal/cyberimp/chest/arm_mod/ui_action_click()
- if(overloaded)//ensure the implant isn't broken
- owner << "The implant doesn't respond. It seems to be broken..."
- return
- if(holder == null)
- owner << "You should not be attempting to use this implant, as it is a dummy item that should never appear. Please adminhelp and report this as an issue on github."
- return
- if(out)//check if the owner has the item out already
- owner.unEquip(holder, 1)//if he does, take it away. then,
- holder.loc = null//stash it in nullspace
- out = 0//and set this to clarify the item isn't out.
- owner << "You retract [holder]."
- playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
- else//if he doesn't have the item out
- if(owner.put_in_hands(holder))//put it in his hands.
- out = 1
- owner << "You extend [holder]!"
- playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
- else//if this fails to put the item in his hands,
- holder.loc = null//keep it in nullspace
- owner << "You can't extend [holder] if you can't use your hands!"
-
-/obj/item/organ/internal/cyberimp/chest/arm_mod/emp_act(severity)//if the implant gets EMPed...
- if(!owner || overloaded)//ensure that it's in an owner and that it's not already EMPed, then...
- return
- if(out)//check if he has the item out...
- owner.unEquip(holder, 1)//if he does, take it away.
- holder.loc = null
- out = 0
- owner << "[holder] forcibly retracts into your arm."
- owner.visible_message("A loud bang comes from [owner]...")
- playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, 1)
- owner << "You feel an explosion erupt inside you as your chest implant breaks. Is it hot in here?"
- owner.adjust_fire_stacks(20)
- owner.IgniteMob()//ignite the owner, as well as
- owner.say("AUUUUUUUUUUUUUUUUUUGH!!")
- owner.adjustFireLoss(25)//severely injure him!
- overloaded = 1//then make sure this can't happen again by breaking the implant.
-
-/obj/item/organ/internal/cyberimp/chest/arm_mod/tase//mounted, self-charging taser!
- name = "Arm-cannon taser implant"
- desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arms and remains in the shoulders when not in use."
- icon_state = "armcannon_tase_implant"
- origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4"
- actions_types = list(/datum/action/item_action/organ_action/toggle)
-
-/obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created...
- holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun)
-
-/obj/item/organ/internal/cyberimp/chest/arm_mod/lase//mounted, self-charging laser!
- name = "Arm-cannon laser implant"
- desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arms and remains in the shoulders when not in use."
- icon_state = "armcannon_lase_implant"
- origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4;syndicate=5"//this is kinda nutty and i might lower it
- actions_types = list(/datum/action/item_action/organ_action/toggle)
-
-/obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New()
- holder = new /obj/item/weapon/gun/energy/laser/mounted(src)
//BOX O' IMPLANTS
diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm
index 5fa8b0811be..b25f792f336 100644
--- a/code/modules/surgery/organs/helpers.dm
+++ b/code/modules/surgery/organs/helpers.dm
@@ -26,9 +26,7 @@ mob/living/carbon/getorganszone(zone, var/subzones = 0)
return returnorg
mob/living/carbon/getorganslot(slot)
- for(var/obj/item/organ/internal/O in internal_organs)
- if(slot == O.slot)
- return O
+ return internal_organs_slot[slot]
mob/proc/getlimb()
return
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index a5392504cdc..3b92baa70d2 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -5,6 +5,7 @@
throwforce = 0
var/zone = "chest"
var/slot
+ // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list!
var/vital = 0
@@ -18,6 +19,7 @@
owner = M
M.internal_organs |= src
+ M.internal_organs_slot[slot] = src
loc = null
for(var/X in actions)
var/datum/action/A = X
@@ -28,6 +30,8 @@
owner = null
if(M)
M.internal_organs -= src
+ if(M.internal_organs_slot[slot] == src)
+ M.internal_organs_slot.Remove(slot)
if(vital && !special)
M.death()
for(var/X in actions)
@@ -41,6 +45,12 @@
/obj/item/organ/internal/proc/on_life()
return
+/obj/item/organ/internal/examine(mob/user)
+ ..()
+ if(status == ORGAN_ROBOTIC && crit_fail)
+ user << "[src] seems to be broken!"
+
+
/obj/item/organ/internal/proc/prepare_eat()
var/obj/item/weapon/reagent_containers/food/snacks/organ/S = new
S.name = name
@@ -56,7 +66,6 @@
name = "appendix"
icon_state = "appendix"
icon = 'icons/obj/surgery.dmi'
-
list_reagents = list("nutriment" = 5)
@@ -92,7 +101,6 @@
zone = "chest"
slot = "heart"
origin_tech = "biotech=3"
- vital = 1
var/beating = 1
var/icon_base = "heart"
@@ -102,16 +110,46 @@
else
icon_state = "[icon_base]-off"
-/obj/item/organ/internal/heart/Insert(mob/living/carbon/M, special = 0)
- ..()
- beating = 1
- update_icon()
-
/obj/item/organ/internal/heart/Remove(mob/living/carbon/M, special = 0)
..()
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.stat == DEAD || H.heart_attack)
+ Stop()
+ return
+ if(!special)
+ H.heart_attack = 1
+
spawn(120)
- beating = 0
- update_icon()
+ if(!owner)
+ Stop()
+
+/obj/item/organ/internal/heart/attack_self(mob/user)
+ ..()
+ if(!beating)
+ Restart()
+ spawn(80)
+ if(!owner)
+ Stop()
+
+
+/obj/item/organ/internal/heart/Insert(mob/living/carbon/M, special = 0)
+ ..()
+ if(ishuman(M) && beating)
+ var/mob/living/carbon/human/H = M
+ if(H.heart_attack)
+ H.heart_attack = 0
+ return
+
+/obj/item/organ/internal/heart/proc/Stop()
+ beating = 0
+ update_icon()
+ return 1
+
+/obj/item/organ/internal/heart/proc/Restart()
+ beating = 1
+ update_icon()
+ return 1
/obj/item/organ/internal/heart/prepare_eat()
var/obj/S = ..()
diff --git a/html/changelogs/AutoChangeLog-pr-15707.yml b/html/changelogs/AutoChangeLog-pr-15707.yml
new file mode 100644
index 00000000000..9e92412de4a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15707.yml
@@ -0,0 +1,8 @@
+author: CoreOverload
+delete-after: True
+changes:
+ - rscadd: "A new \"breathing tube\" mouth implant. It allows you to use internals without a mask and protects you from being choked. It doesn't protect you from the grab itself."
+ - tweak: "Arm cannon implants are now actually implanted into the arms, not into the chest."
+ - bugfix: "Arm cannons have an action button again."
+ - tweak: "Heart removal is no longer instakill. It puts you in condition similar to heart attack instead. You can fix it by installing a new heart and applying defibrillator if it wasn't beating."
+ - rscadd: "You can now make a stopped heart beat again by squeezing it. It will stop beating very soon, so you better be quick if you want to install it without using defibrillator."
diff --git a/html/changelogs/AutoChangeLog-pr-15780.yml b/html/changelogs/AutoChangeLog-pr-15780.yml
new file mode 100644
index 00000000000..2990d00b445
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15780.yml
@@ -0,0 +1,5 @@
+author: PKPenguin321
+delete-after: True
+changes:
+ - rscadd: "Bolas are now in the game. They're a simple device fashioned from a cable and two weights on the end, designed to entangle enemies by wrapping around their legs upon being thrown at them. The victim can remove them rather quickly, however."
+ - rscadd: "Bolas can be crafted by applying 6 metal sheets to cablecuffs. They can also be tablecrafted."
diff --git a/html/changelogs/AutoChangeLog-pr-15809.yml b/html/changelogs/AutoChangeLog-pr-15809.yml
new file mode 100644
index 00000000000..9e2ef92dc94
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15809.yml
@@ -0,0 +1,4 @@
+author: bgobandit
+delete-after: True
+changes:
+ - rscadd: "CentComm has been informed that cargo is receiving new forms of contraband in crates. Remember, Nanotrasen has a zero-tolerance contraband policy!"
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index e07f665dcb8..59eb1451d27 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/items_cyborg.dmi b/icons/obj/items_cyborg.dmi
new file mode 100644
index 00000000000..dfdd3114194
Binary files /dev/null and b/icons/obj/items_cyborg.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 0d2b1166c19..9252dbf89f6 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index fd7e6d8d7c4..4a0d37630c2 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1600,6 +1600,8 @@
#include "code\modules\surgery\surgery_step.dm"
#include "code\modules\surgery\tail_modification.dm"
#include "code\modules\surgery\tools.dm"
+#include "code\modules\surgery\organs\augments_arms.dm"
+#include "code\modules\surgery\organs\augments_chest.dm"
#include "code\modules\surgery\organs\augments_external.dm"
#include "code\modules\surgery\organs\augments_eyes.dm"
#include "code\modules\surgery\organs\augments_internal.dm"