diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 4a14660e57..5232c94686 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -38016,6 +38016,7 @@
icon_state = "4-8"
},
/obj/effect/turf_decal/stripes/line,
+/obj/machinery/pipedispenser,
/turf/open/floor/engine,
/area/science/storage)
"bII" = (
@@ -38028,12 +38029,14 @@
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
+/obj/machinery/pipedispenser/disposal,
/turf/open/floor/engine,
/area/science/storage)
"bIJ" = (
/obj/structure/cable{
icon_state = "1-8"
},
+/obj/machinery/pipedispenser/disposal/transit_tube,
/turf/open/floor/engine,
/area/science/storage)
"bIK" = (
@@ -38987,6 +38990,8 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/structure/reagent_dispensers/watertank/high,
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bKT" = (
@@ -39005,6 +39010,10 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/structure/reagent_dispensers/fueltank,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bKU" = (
@@ -39052,9 +39061,6 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bKW" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
/obj/structure/cable{
icon_state = "1-8"
},
@@ -39067,11 +39073,15 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bKX" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 0;
+ name = "Mix to Engine"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -39090,10 +39100,10 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bKZ" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/layer_manifold{
dir = 4
},
-/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/engine/atmos)
"bLa" = (
@@ -39476,6 +39486,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bLZ" = (
@@ -39547,6 +39560,7 @@
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
dir = 4
},
+/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bMf" = (
@@ -39556,6 +39570,9 @@
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bMh" = (
@@ -39570,6 +39587,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bMi" = (
@@ -40010,53 +40030,49 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bNd" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bNe" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 10
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bNf" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
+/obj/item/beacon,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bNg" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "Air to Distro"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/visible{
+ dir = 5
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bNh" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Mix to Ports"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bNi" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+ dir = 4
},
+/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bNj" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 6
- },
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Mix to Ports"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bNk" = (
@@ -40066,13 +40082,13 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bNl" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/manifold/green/visible{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bNm" = (
@@ -40463,81 +40479,75 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/vending/wardrobe/atmos_wardrobe,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOj" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/airlock/atmos/glass{
- name = "Atmospherics Monitoring";
- req_access_txt = "24"
- },
-/turf/open/floor/plasteel,
+/turf/closed/wall,
/area/engine/atmos)
"bOk" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
+/obj/machinery/space_heater,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOl" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
+ dir = 10
+ },
+/obj/machinery/space_heater,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOm" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOn" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOo" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Mix to Port"
- },
+/obj/machinery/atmospherics/pipe/manifold/general/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOp" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Pure to Mix"
- },
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 10
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOq" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/components/binary/pump/on{
+/obj/machinery/atmospherics/components/binary/pump{
dir = 1;
- name = "Unfiltered to Mix"
+ name = "Pure to Mix"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOr" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 10
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+ dir = 1
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/atmos)
"bOs" = (
/obj/structure/sign/warning/fire,
@@ -40740,133 +40750,65 @@
/area/engine/atmos)
"bOQ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+ dir = 10
},
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
+/turf/closed/wall,
/area/engine/atmos)
"bOR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 10
},
-/turf/closed/wall/r_wall,
+/turf/open/floor/plating,
/area/engine/atmos)
"bOS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Atmospherics Monitoring";
- dir = 1
- },
-/obj/machinery/space_heater,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
+/obj/effect/turf_decal/vg_decals/atmos/mix,
+/turf/open/floor/engine/vacuum,
/area/engine/atmos)
"bOT" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 5
},
-/turf/open/floor/plasteel,
+/turf/closed/wall,
/area/engine/atmos)
"bOU" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+/obj/machinery/atmospherics/components/binary/pump/on{
+ name = "Waste to Filter"
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOV" = (
-/obj/structure/table,
-/obj/item/clothing/head/welding{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/clothing/head/welding{
- pixel_x = -5;
- pixel_y = 3
- },
-/obj/item/multitool{
- layer = 4
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOW" = (
-/obj/structure/table,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/storage/belt/utility,
-/obj/item/t_scanner,
-/obj/item/t_scanner,
-/obj/item/t_scanner,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Air to External"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOX" = (
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty{
- pixel_x = 2;
- pixel_y = 2
- },
-/obj/item/stack/sheet/glass,
-/obj/item/stack/rods/fifty,
-/obj/item/pipe_dispenser,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOY" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOZ" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 9
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPa" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bPb" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Pure to Port"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bPc" = (
-/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bPd" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -40879,14 +40821,15 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPf" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/layer_manifold{
dir = 4
},
-/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/engine/atmos)
"bPg" = (
@@ -41104,60 +41047,76 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPO" = (
-/obj/structure/disposalpipe/segment,
+/obj/structure/disposalpipe/sorting/mail{
+ sortType = 6
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPP" = (
-/obj/structure/tank_dispenser,
-/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/structure/closet/secure_closet/atmospherics,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPQ" = (
/turf/closed/wall,
/area/engine/atmos)
"bPR" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- name = "Waste In"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
-/turf/open/floor/plasteel,
+/turf/closed/wall,
/area/engine/atmos)
"bPS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/obj/machinery/camera{
+ c_tag = "Atmospherics Central";
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPT" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Air to Port"
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Air to Distro"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPU" = (
/obj/machinery/atmospherics/components/binary/pump{
- name = "Mix to Port"
+ name = "Air to Ports"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPV" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/general/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPW" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPX" = (
@@ -41172,6 +41131,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPY" = (
@@ -41186,14 +41146,14 @@
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"bQa" = (
-/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
-/obj/machinery/atmospherics/miner/n2o,
+/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide,
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"bQb" = (
/obj/machinery/light/small{
dir = 4
},
+/obj/machinery/atmospherics/miner/n2o,
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"bQc" = (
@@ -41496,10 +41456,6 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQF" = (
-/obj/structure/chair/office/dark{
- dir = 8
- },
-/obj/effect/landmark/start/atmospheric_technician,
/obj/effect/turf_decal/tile/yellow{
dir = 1
},
@@ -41509,54 +41465,48 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQG" = (
-/obj/machinery/computer/atmos_control{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQH" = (
-/obj/machinery/pipedispenser,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQI" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
/area/engine/atmos)
"bQJ" = (
-/obj/structure/closet/secure_closet/atmospherics,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Ports to Filter"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQK" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 4
},
-/obj/machinery/portable_atmospherics/canister,
-/obj/effect/turf_decal/bot,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQL" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQM" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
},
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQN" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{
- dir = 1
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 1;
+ name = "Unfiltered to Mix"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -41830,105 +41780,88 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bRr" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/window/northleft{
- dir = 4;
- name = "Atmospherics Desk";
- req_access_txt = "24"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "atmospherics security door"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bRs" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/structure/chair/office/dark{
- dir = 8
- },
-/obj/effect/landmark/start/atmospheric_technician,
/obj/effect/turf_decal/tile/yellow{
dir = 1
},
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/structure/tank_dispenser,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRt" = (
/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRu" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bRw" = (
+/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
+/obj/machinery/meter,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bRx" = (
+/obj/machinery/computer/atmos_control,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bRy" = (
+/obj/structure/closet/secure_closet/atmospherics,
/obj/machinery/requests_console{
department = "Atmospherics";
departmentType = 4;
name = "Atmos RC";
pixel_x = 30
},
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/computer/atmos_alert{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRv" = (
-/obj/machinery/pipedispenser/disposal,
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Atmospherics Central";
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRw" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/effect/turf_decal/tile/yellow{
dir = 1
},
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRx" = (
-/obj/machinery/suit_storage_unit/atmos,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRy" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
+/obj/effect/turf_decal/tile/yellow,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/meter,
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRz" = (
+/obj/structure/disposalpipe/segment,
/obj/machinery/holopad,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRA" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
+/obj/structure/chair/office/dark{
+ dir = 1
},
-/obj/machinery/meter,
+/obj/effect/landmark/start/atmospheric_technician,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRB" = (
@@ -41939,6 +41872,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRC" = (
@@ -42177,6 +42111,11 @@
id = "atmos";
name = "atmospherics security door"
},
+/obj/machinery/door/window/northleft{
+ dir = 4;
+ name = "Atmospherics Desk";
+ req_access_txt = "24"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSb" = (
@@ -42189,76 +42128,70 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/conveyor_switch{
+ id = "atmosdeliver"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSc" = (
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 2;
- sortType = 6
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
},
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
+/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSd" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/suit_storage_unit/atmos,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bSe" = (
+/obj/machinery/suit_storage_unit/atmos,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bSe" = (
-/obj/machinery/pipedispenser/disposal/transit_tube,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSf" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/obj/item/wrench,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bSg" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/machinery/light{
dir = 8
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSh" = (
-/obj/machinery/camera{
- c_tag = "Atmospherics Starboard";
- dir = 8
- },
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
name = "Plasma Outlet Pump"
},
/obj/effect/turf_decal/tile/yellow,
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bSi" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
"bSj" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
dir = 8;
@@ -42530,31 +42463,42 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSR" = (
-/obj/machinery/light{
- dir = 8
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
},
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Port to Filter"
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27
+/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{
+ dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSS" = (
-/obj/item/beacon,
+/obj/structure/chair/office/dark,
+/obj/effect/landmark/start/atmospheric_technician,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bST" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
+/obj/machinery/computer/atmos_alert{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow{
dir = 8
},
-/obj/structure/chair/stool,
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSU" = (
/obj/machinery/atmospherics/components/unary/thermomachine/heater{
- dir = 8
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -42570,6 +42514,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSW" = (
@@ -42579,14 +42524,14 @@
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"bSX" = (
-/obj/machinery/portable_atmospherics/canister/toxins,
-/obj/machinery/atmospherics/miner/toxins,
+/obj/effect/turf_decal/vg_decals/atmos/plasma,
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"bSY" = (
/obj/machinery/light/small{
dir = 4
},
+/obj/machinery/atmospherics/miner/toxins,
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"bSZ" = (
@@ -42922,19 +42867,22 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 6
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bTI" = (
/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
/obj/effect/turf_decal/tile/yellow{
dir = 1
},
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bTJ" = (
@@ -42947,6 +42895,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bTK" = (
@@ -42986,87 +42937,72 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bTM" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTN" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = 30;
- pixel_y = 26
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/vending/wardrobe/atmos_wardrobe,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/structure/reagent_dispensers/watertank/high,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/structure/fireaxecabinet{
- pixel_y = 32
+ pixel_x = -32
},
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/structure/reagent_dispensers/fueltank,
-/obj/machinery/camera{
- c_tag = "Atmospherics Mixing"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTR" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Port to Filter"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTS" = (
-/obj/item/cigbutt,
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTT" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bTU" = (
+"bTN" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bTO" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/engine/atmos)
+"bTP" = (
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{
dir = 1
},
+/obj/machinery/camera{
+ c_tag = "Atmospherics Starboard";
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bTQ" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "atmospherics security door"
+ },
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/delivery,
+/obj/structure/closet/firecloset,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bTR" = (
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bTS" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/purple/visible,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bTT" = (
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bTV" = (
@@ -43213,9 +43149,6 @@
/obj/machinery/camera{
c_tag = "Engineering Access"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
/obj/item/radio/intercom{
name = "Station Intercom (General)";
pixel_y = 24
@@ -43239,89 +43172,86 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bUp" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bUq" = (
/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bUr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 9
},
+/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bUs" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "O2 to Pure"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bUt" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bUu" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUv" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "incinerator mix pump"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUw" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/obj/structure/cable{
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/purple/visible{
- dir = 4
+ dir = 5
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bUx" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
+"bUv" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bUw" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bUy" = (
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
- dir = 4
- },
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bUz" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
/area/engine/atmos)
"bUA" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
- dir = 10
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
},
-/turf/open/space,
-/area/space/nearstation)
+/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"bUC" = (
/obj/structure/flora/ausbushes/fernybush,
/turf/open/floor/plating/asteroid,
@@ -43613,12 +43543,12 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
/obj/effect/turf_decal/stripes/line{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/break_room)
"bVc" = (
@@ -43630,10 +43560,8 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bVd" = (
@@ -43663,35 +43591,42 @@
/obj/structure/disposalpipe/segment{
dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bVg" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+ dir = 8
},
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bVh" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 6
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+ dir = 8
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/atmos)
"bVi" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
- dir = 1
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 5
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/atmos)
"bVj" = (
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible,
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "incinerator mix pump"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bVk" = (
@@ -43703,24 +43638,25 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bVl" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/machinery/atmospherics/pipe/layer_manifold{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plating,
/area/engine/atmos)
"bVm" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/purple/visible,
-/turf/open/space,
-/area/space/nearstation)
+/obj/machinery/atmospherics/pipe/layer_manifold,
+/turf/open/floor/plating,
+/area/engine/atmos)
"bVn" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/carbon_output{
dir = 8
@@ -44008,44 +43944,21 @@
},
/turf/open/floor/plasteel,
/area/engine/break_room)
-"bVV" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Waste to Space"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bVW" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 9
},
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVX" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
+/turf/closed/wall/r_wall,
+/area/maintenance/disposal/incinerator)
"bVY" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "O2 to Pure"
+/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
+ dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bVZ" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bWa" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "N2 to Pure"
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -44057,6 +43970,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bWc" = (
@@ -44064,24 +43978,19 @@
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plating,
/area/engine/atmos)
-"bWd" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/purple/visible,
-/turf/open/space,
-/area/space/nearstation)
"bWe" = (
/obj/machinery/air_sensor/atmos/carbon_tank,
/turf/open/floor/engine/co2,
/area/engine/atmos)
"bWf" = (
-/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
-/obj/machinery/atmospherics/miner/carbon_dioxide,
+/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide,
/turf/open/floor/engine/co2,
/area/engine/atmos)
"bWg" = (
/obj/machinery/light/small{
dir = 4
},
+/obj/machinery/atmospherics/miner/carbon_dioxide,
/turf/open/floor/engine/co2,
/area/engine/atmos)
"bWh" = (
@@ -44398,43 +44307,34 @@
/area/engine/break_room)
"bWI" = (
/obj/machinery/portable_atmospherics/scrubber,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bWJ" = (
/obj/machinery/portable_atmospherics/pump,
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 10
+ },
+/obj/effect/turf_decal/stripes/line{
dir = 5
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bWK" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bWL" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bWM" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bWN" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 10
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 6
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bWO" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 10
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bWP" = (
@@ -44445,8 +44345,8 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bWQ" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/purple/visible{
+ dir = 10
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -44458,14 +44358,6 @@
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plating,
/area/engine/atmos)
-"bWS" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/purple/visible,
-/turf/open/space,
-/area/space/nearstation)
"bWT" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input{
dir = 8
@@ -44644,11 +44536,13 @@
/area/engine/engineering)
"bXr" = (
/obj/machinery/portable_atmospherics/scrubber,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Waste to Space"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXs" = (
@@ -44657,14 +44551,22 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 5
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXt" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXu" = (
@@ -44675,6 +44577,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXv" = (
@@ -44683,6 +44588,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXw" = (
@@ -44691,7 +44599,10 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/layer_manifold,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXx" = (
@@ -44702,6 +44613,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 10
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXy" = (
@@ -44712,17 +44626,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXz" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
+/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXA" = (
@@ -44753,6 +44657,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXD" = (
@@ -44769,7 +44674,6 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXE" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
@@ -44780,6 +44684,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/purple/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXF" = (
@@ -44793,15 +44698,13 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXG" = (
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
- dir = 6
- },
/turf/closed/wall/r_wall,
/area/engine/atmos)
"bXI" = (
@@ -44998,17 +44901,11 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/engine/atmos)
-"bYq" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
"bYs" = (
/obj/machinery/atmospherics/pipe/simple/green/hidden{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/closed/wall/r_wall,
/area/maintenance/disposal/incinerator)
"bYt" = (
@@ -45019,9 +44916,6 @@
/turf/closed/wall,
/area/maintenance/disposal/incinerator)
"bYu" = (
-/obj/machinery/atmospherics/pipe/simple/green/hidden{
- dir = 9
- },
/obj/structure/cable{
icon_state = "1-2"
},
@@ -45029,9 +44923,16 @@
name = "Incinerator";
req_access_txt = "24"
},
+/obj/machinery/atmospherics/pipe/simple/green/hidden{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/purple/visible,
/turf/open/floor/plasteel/dark,
/area/maintenance/disposal/incinerator)
"bYv" = (
+/obj/machinery/atmospherics/pipe/simple/green/hidden{
+ dir = 9
+ },
/turf/closed/wall,
/area/maintenance/disposal/incinerator)
"bYw" = (
@@ -45430,16 +45331,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"bZd" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/space,
-/area/space/nearstation)
-"bZe" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/space,
-/area/space/nearstation)
"bZf" = (
/obj/machinery/power/apc{
dir = 8;
@@ -45479,6 +45370,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/purple/visible,
/turf/open/floor/plasteel/dark,
/area/maintenance/disposal/incinerator)
"bZh" = (
@@ -45497,7 +45389,6 @@
/area/maintenance/disposal/incinerator)
"bZi" = (
/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/purple/visible,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
@@ -45646,10 +45537,12 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"bZK" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
+/obj/structure/lattice,
+/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{
dir = 1
},
-/turf/open/floor/plating/airless,
+/obj/structure/lattice/catwalk,
+/turf/open/space,
/area/engine/atmos)
"bZL" = (
/obj/machinery/atmospherics/pipe/simple,
@@ -45690,6 +45583,9 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/purple/visible{
+ dir = 5
+ },
/turf/open/floor/plasteel/dark,
/area/maintenance/disposal/incinerator)
"bZQ" = (
@@ -45709,11 +45605,14 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/purple/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/maintenance/disposal/incinerator)
"bZR" = (
/obj/machinery/atmospherics/pipe/simple/purple/visible{
- dir = 5
+ dir = 4
},
/turf/closed/wall/r_wall,
/area/maintenance/disposal/incinerator)
@@ -46166,16 +46065,14 @@
/turf/open/floor/engine/n2,
/area/engine/atmos)
"cbt" = (
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/obj/machinery/atmospherics/miner/nitrogen,
+/obj/effect/turf_decal/vg_decals/atmos/nitrogen,
/turf/open/floor/engine/n2,
/area/engine/atmos)
"cbu" = (
/turf/open/floor/engine/o2,
/area/engine/atmos)
"cbv" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/machinery/atmospherics/miner/oxygen,
+/obj/effect/turf_decal/vg_decals/atmos/oxygen,
/turf/open/floor/engine/o2,
/area/engine/atmos)
"cbw" = (
@@ -46183,8 +46080,8 @@
/turf/open/floor/engine/air,
/area/engine/atmos)
"cbx" = (
-/obj/machinery/portable_atmospherics/canister/air,
/obj/effect/landmark/event_spawn,
+/obj/effect/turf_decal/vg_decals/atmos/air,
/turf/open/floor/engine/air,
/area/engine/atmos)
"cby" = (
@@ -46385,10 +46282,12 @@
/area/engine/engineering)
"ccm" = (
/obj/machinery/light/small,
+/obj/machinery/atmospherics/miner/nitrogen,
/turf/open/floor/engine/n2,
/area/engine/atmos)
"ccn" = (
/obj/machinery/light/small,
+/obj/machinery/atmospherics/miner/oxygen,
/turf/open/floor/engine/o2,
/area/engine/atmos)
"cco" = (
@@ -50093,15 +49992,15 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"cqG" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
/obj/effect/turf_decal/tile/yellow{
dir = 1
},
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"cqH" = (
@@ -53276,7 +53175,9 @@
/area/medical/chemistry)
"dJk" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 9
+ },
/turf/open/floor/plating,
/area/engine/atmos)
"dJm" = (
@@ -53979,12 +53880,6 @@
},
/turf/open/floor/wood,
/area/lawoffice)
-"fuR" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"fvb" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -54801,10 +54696,9 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"hjk" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 6
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"hjD" = (
@@ -54818,6 +54712,17 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/engine/engineering)
+"hka" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow,
+/obj/machinery/camera{
+ c_tag = "Atmospherics Console";
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"hkQ" = (
/obj/machinery/light{
dir = 4
@@ -55907,10 +55812,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
-"jLW" = (
-/obj/machinery/atmospherics/pipe/simple/purple/visible,
-/turf/closed/wall/r_wall,
-/area/maintenance/disposal/incinerator)
"jOB" = (
/turf/open/floor/plating,
/area/storage/emergency/starboard)
@@ -56032,6 +55933,16 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/medical/chemistry)
+"kas" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"kaR" = (
/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
dir = 8
@@ -56559,12 +56470,6 @@
/obj/machinery/atmospherics/pipe/manifold/general/visible,
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
-"lhP" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"liR" = (
/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 4
@@ -56579,12 +56484,6 @@
/obj/machinery/atmospherics/pipe/simple/general/hidden,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
-"ljG" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"lms" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
@@ -58403,10 +58302,13 @@
/turf/open/floor/plasteel/dark,
/area/maintenance/department/crew_quarters/dorms)
"pmB" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "N2 to Pure"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"pnU" = (
@@ -59925,13 +59827,6 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
-"tbw" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 9
- },
-/turf/open/space,
-/area/space/nearstation)
"tbF" = (
/obj/structure/window/reinforced,
/obj/structure/window/reinforced{
@@ -60223,13 +60118,6 @@
/obj/item/wrench,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
-"tDE" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Mix to Engine"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"tHk" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -61498,13 +61386,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"wJP" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
- dir = 9
- },
-/turf/open/space,
-/area/space/nearstation)
"wKa" = (
/obj/machinery/light/small,
/turf/open/floor/plating,
@@ -61520,12 +61401,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/heads/cmo)
-"wLK" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"wMF" = (
/obj/effect/spawner/lootdrop/three_course_meal,
/obj/effect/spawner/lootdrop/three_course_meal,
@@ -96271,7 +96146,7 @@ bRq
bCC
bSP
bTG
-bUo
+bTQ
bVc
bUo
bWH
@@ -96787,7 +96662,7 @@ bLW
bTH
bUp
bVe
-bVV
+bUp
bWI
bXr
bKQ
@@ -97037,14 +96912,14 @@ bMZ
bOh
bOP
bPO
-bPO
+bRz
bRt
bSc
bSQ
bTI
bUq
bVf
-bQI
+bMf
bWJ
bXs
bJN
@@ -97297,12 +97172,12 @@ bPP
bQG
bRu
bSd
-bLW
+bTO
bTJ
bMf
-bUs
bMf
-fuR
+bMf
+bMf
bXt
bYp
eAZ
@@ -97549,17 +97424,17 @@ bJN
bJN
bNb
bOj
-bOR
-bJN
-bJN
-bJN
-bJN
+bPQ
+bRx
+bRA
+bSS
+bST
bJN
bTK
-bUr
-bVg
-bVW
-bWL
+bMf
+bMf
+bMf
+bMf
bXu
bLW
cui
@@ -97806,19 +97681,19 @@ bJN
bLY
bNc
bOk
-bOS
bPQ
+bRy
+hka
bQH
-bRv
bSe
bPQ
bTL
-bUs
bMf
-bVX
+bMf
+bMf
bWM
bXv
-bWc
+bVh
poP
bZL
caB
@@ -98065,18 +97940,18 @@ bNd
bOl
bOT
bPR
+bPQ
+bPQ
bQI
-bQI
-bQI
-bQI
-bTM
-bUs
-ljG
+bPQ
+bNc
+bMf
+bMf
hjk
pmB
bXw
dJk
-tbw
+cui
bJP
bJP
bJP
@@ -98322,18 +98197,18 @@ bNe
bOm
bOU
bPS
-bPS
-bRw
-bMf
-bMf
+bSf
+bUp
+bTM
+bUp
bTN
-bUt
-wLK
-bOk
-bWK
-bXt
+bMf
+bMf
+bVZ
+bOX
+bUA
bYp
-bZd
+eAZ
bZL
caC
cbu
@@ -98576,21 +98451,21 @@ bJL
bKR
bMb
bNf
-bOk
+bQJ
bOV
-bPQ
-bQJ
-bRx
-bQJ
-bPQ
-bTO
-ljG
-lhP
-bOk
-bWL
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bVZ
+bOX
bXx
-bLW
-abI
+bVi
+cui
bMi
caD
cbv
@@ -98834,20 +98709,20 @@ bJN
bMc
bNg
bOn
-bOW
-bPQ
-bPQ
-bPQ
-bPQ
-bPQ
-bTP
-wLK
-bVh
+bOX
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
bVY
-bWM
-bXy
-bWc
-bZe
+bUs
+bVg
+bVm
+poP
bZL
caE
cbu
@@ -99089,22 +98964,22 @@ bIE
bJN
bJN
bMd
-bNf
-bOk
+bPT
+bOn
bOX
-bPQ
-bQK
-bQK
-bQK
-bPQ
-bTQ
-wLK
-bKX
-bOk
-bWN
-bXz
-bYq
-abI
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bVZ
+bOX
+kas
+bNm
+cui
bJP
bJP
bJP
@@ -99348,20 +99223,20 @@ bKS
bMe
bNh
bOo
-bOY
-bPT
-bQL
-bRy
-bSf
-bSR
-bTM
-wLK
-bKX
+bOX
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
bVZ
bWO
bXA
bQO
-bZe
+poP
bZM
caF
cbw
@@ -99602,23 +99477,23 @@ aht
aaa
bJN
bKT
-bMf
+bWM
bNi
-bOk
+bQK
bOZ
bMf
bMf
-bRz
bMf
-bSS
-bTR
-tDE
-bKX
-bWa
+bMf
+bMf
+bMf
+bMf
+bMf
+bVZ
bMf
bXB
bNm
-abI
+cui
bMi
caG
cbx
@@ -99859,23 +99734,23 @@ bCP
bAA
bHw
bKU
-bMf
-bMf
-bOk
-bPa
+bOr
bPU
-bOY
-bRA
-bOY
-bST
-bTS
-bUu
-bVi
-bMe
+bRw
+bPa
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bMf
+bVY
bWP
bXy
bQO
-bZe
+poP
bZN
caH
cby
@@ -100116,23 +99991,23 @@ bCR
bIF
bHw
bKV
+bOX
+bUv
+bQL
+bPa
+bMf
bMf
bMf
-bOk
-bPb
bMf
-bQM
-bQM
-bQM
bSU
bTT
bUv
bKX
-bMf
-bMf
+bTR
+bUt
bXC
bYs
-bYw
+bVW
bYw
bYw
cBT
@@ -100376,17 +100251,17 @@ bKW
bMg
bNj
bOp
-bPc
bPV
bPV
bPV
-bSg
bPV
bPV
bUw
+bUw
+bUw
bVj
-bMg
-bMg
+bTS
+bUu
bXD
bYt
bZf
@@ -100630,19 +100505,19 @@ bCR
bIH
bHw
cqG
-bMf
+bOX
bNk
bOq
bPd
bPW
-bQN
+bPW
bPW
bPd
bPW
-bTU
-bUx
-bPd
bPW
+bPW
+bPd
+bUr
bWQ
bXE
bYu
@@ -100889,18 +100764,18 @@ bHw
bKY
bMh
bNl
-bOi
+bQM
bPe
bPX
-bNl
+bSR
bRB
bSh
bSV
-bNl
+bTP
bUy
bVk
bWb
-bNl
+bUz
bXF
bYv
bZh
@@ -101144,22 +101019,22 @@ bHv
bIJ
bHw
bKZ
-bLW
-bNm
-bOr
+bOR
+bWR
+bWc
bPf
bPY
bQO
bPY
-bSi
+bPf
bPY
bQO
-bUz
+bWc
bVl
bWc
bWR
bXG
-jLW
+bYw
bZi
bZR
caL
@@ -101411,11 +101286,11 @@ abI
bLa
abI
bNn
-bUA
-bVm
-bWd
-bWS
-wJP
+abI
+bLa
+abI
+bNn
+abI
aht
bZj
bZS
@@ -102172,7 +102047,7 @@ buz
abI
bJP
bLd
-bLe
+bOS
bLe
bJP
bPh
diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm
index 65be8258a1..bad64846d6 100644
--- a/code/__DEFINES/MC.dm
+++ b/code/__DEFINES/MC.dm
@@ -25,35 +25,38 @@
//SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier)
//subsystem does not initialize.
-#define SS_NO_INIT 1
+#define SS_NO_INIT (1<<0)
//subsystem does not fire.
// (like can_fire = 0, but keeps it from getting added to the processing subsystems list)
// (Requires a MC restart to change)
-#define SS_NO_FIRE 2
+#define SS_NO_FIRE (1<<1)
//subsystem only runs on spare cpu (after all non-background subsystems have ran that tick)
// SS_BACKGROUND has its own priority bracket
-#define SS_BACKGROUND 4
+#define SS_BACKGROUND (1<<2)
//subsystem does not tick check, and should not run unless there is enough time (or its running behind (unless background))
-#define SS_NO_TICK_CHECK 8
+#define SS_NO_TICK_CHECK (1<<3)
//Treat wait as a tick count, not DS, run every wait ticks.
// (also forces it to run first in the tick, above even SS_NO_TICK_CHECK subsystems)
// (implies all runlevels because of how it works)
// (overrides SS_BACKGROUND)
// This is designed for basically anything that works as a mini-mc (like SStimer)
-#define SS_TICKER 16
+#define SS_TICKER (1<<4)
//keep the subsystem's timing on point by firing early if it fired late last fire because of lag
// ie: if a 20ds subsystem fires say 5 ds late due to lag or what not, its next fire would be in 15ds, not 20ds.
-#define SS_KEEP_TIMING 32
+#define SS_KEEP_TIMING (1<<5)
//Calculate its next fire after its fired.
// (IE: if a 5ds wait SS takes 2ds to run, its next fire should be 5ds away, not 3ds like it normally would be)
// This flag overrides SS_KEEP_TIMING
-#define SS_POST_FIRE_TIMING 64
+#define SS_POST_FIRE_TIMING (1<<6)
+
+/// Show in stat() by default even if SS_NO_FIRE
+#define SS_ALWAYS_SHOW_STAT (1<<7)
//SUBSYSTEM STATES
#define SS_IDLE 0 //aint doing shit.
diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index cc2cd8834a..3d15412efe 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -43,6 +43,7 @@
#define COLOR_RED_GRAY "#B4696A"
#define COLOR_PALE_BLUE_GRAY "#98C5DF"
#define COLOR_PALE_GREEN_GRAY "#B7D993"
+#define COLOR_PALE_ORANGE "#FFC066"
#define COLOR_PALE_RED_GRAY "#D59998"
#define COLOR_PALE_PURPLE_GRAY "#CBB1CA"
#define COLOR_PURPLE_GRAY "#AE8CA8"
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 7de162207d..74ce8519a2 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -248,6 +248,15 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define TOTAL_MASS_MEDIEVAL_WEAPON 3.6 //very, very generic average sword/warpick/etc. weight in pounds.
#define TOTAL_MASS_TOY_SWORD 1.5
+//stamina cost defines.
+#define STAM_COST_ATTACK_OBJ_MULT 1.2
+#define STAM_COST_ATTACK_MOB_MULT 0.8
+#define STAM_COST_BATON_MOB_MULT 1
+#define STAM_COST_NO_COMBAT_MULT 1.25
+#define STAM_COST_W_CLASS_MULT 1.25
+#define STAM_COST_THROW_MULT 2
+
+
//bullet_act() return values
#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting.
#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting.
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index ce4505265f..c74a8cdb05 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -183,7 +183,28 @@
// #define SPEECH_FORCED 7
#define COMSIG_MOB_ANTAG_ON_GAIN "mob_antag_on_gain" //from base of /datum/antagonist/on_gain(): (antag_datum)
-#define COMSIG_MOB_SPELL_CAN_CAST "mob_spell_can_cast" //called from base of /obj/effect/proc_holder/spell/can_cast(): (spell)
+#define COMSIG_MOB_SPELL_CAN_CAST "mob_spell_can_cast" //from base of /obj/effect/proc_holder/spell/can_cast(): (spell)
+
+#define COMSIG_MOB_ACTION_SKILL_MOD "mob_action_skill_mod" //from base of /datum/skill_holder/action_skills_mod() : (proc args list, list/mod_values)
+ #define ACTION_SKILL_MOD_SKILL 1 //redundancy.
+ #define ACTION_SKILL_MOD_VALUE 2
+ #define ACTION_SKILL_MOD_THRESHOLD 3
+ #define ACTION_SKILL_MOD_IS_MULTI 4
+ //other mod values, kept separate from the args
+ #define MOD_VALUES_SKILL_MOD 1
+
+#define COMSIG_MOB_ITEM_ACTION_SKILLS_MOD "mob_item_action_skills_mod" //from base of /datum/skill_holder/item_action_skills_mod() : (proc args list, mod_values)
+ #define ITEM_SKILLS_MOD_ITEM 1 //redundancy
+ #define ITEM_SKILLS_MOD_VALUE 2
+ #define ITEM_SKILLS_MOD_FLAGS 3
+ #define ITEM_SKILLS_MOD_BAD_FLAGS 4
+ #define ITEM_SKILLS_MOD_IS_MULTI 5
+ //other mod values, kept separate from the args
+ #define MOD_VALUES_ITEM_SKILLS_SUM 1
+ #define MOD_VALUES_ITEM_SKILLS_DIV 2
+ #define MOD_VALUES_ITEM_SKILLS_CHECKED 3
+
+#define COMSIG_MOB_SKILL_GET_AFFINITY "mob_skill_get_affinity" //from base of /datum/skill_holder/get_skill_affinity(): (skill_path, list/return_value)
// /mob/living signals
#define COMSIG_LIVING_REGENERATE_LIMBS "living_regenerate_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs)
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 17aff463dc..e0df69bfe9 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -138,6 +138,7 @@
#define MOOD_LEVEL_SAD4 -25
//Sanity levels for humans
+#define SANITY_AMAZING 150
#define SANITY_GREAT 125
#define SANITY_NEUTRAL 100
#define SANITY_DISTURBED 75
diff --git a/code/__DEFINES/skills/defines.dm b/code/__DEFINES/skills/defines.dm
new file mode 100644
index 0000000000..73be86e128
--- /dev/null
+++ b/code/__DEFINES/skills/defines.dm
@@ -0,0 +1,77 @@
+
+/// true/false
+#define SKILL_PROGRESSION_BINARY 1
+/// numerical
+#define SKILL_PROGRESSION_NUMERICAL 2
+/// Enum
+#define SKILL_PROGRESSION_ENUM 3
+/// Levels
+#define SKILL_PROGRESSION_LEVEL 4
+
+
+/// Max value of skill for numerical skills
+#define SKILL_NUMERICAL_MAX 100
+/// Min value of skill for numerical skills
+#define SKILL_NUMERICAL_MIN 0
+
+// Standard values for job starting skills
+
+#define STARTING_SKILL_SURGERY_MEDICAL 35 //out of SKILL_NUMERICAL_MAX
+
+// Standard values for job starting skill affinities
+
+#define STARTING_SKILL_AFFINITY_SURGERY_MEDICAL 1.2
+
+#define STARTING_SKILL_AFFINITY_WIRING_ENGI_ROBO 1.2
+
+// Standard values for skill gain (this is multiplied by affinity)
+
+#define DEF_SKILL_GAIN 1
+#define SKILL_GAIN_SURGERY_PER_STEP 0.25
+
+#define SKILL_AFFINITY_MOOD_BONUS 1.25
+
+///Items skill_flags and other defines
+#define SKILL_USE_TOOL (1<<0)
+#define SKILL_TRAINING_TOOL (1<<1)
+#define SKILL_ATTACK_MOB (1<<2)
+#define SKILL_TRAIN_ATTACK_MOB (1<<3)
+#define SKILL_ATTACK_OBJ (1<<4)
+#define SKILL_TRAIN_ATTACK_OBJ (1<<5)
+#define SKILL_STAMINA_COST (1<<6) //Influences the stamina cost from weapon usage.
+#define SKILL_THROW_STAM_COST (1<<7)
+#define SKILL_COMBAT_MODE (1<<8) //The user must have combat mode on.
+#define SKILL_USE_MOOD (1<<9) //Is the skill negatively affected by bad mood.
+#define SKILL_TRAIN_MOOD (1<<10) //Is this skill training affected by good mood.
+
+///competency_threshold index defines
+#define THRESHOLD_COMPETENT 1
+#define THRESHOLD_EXPERT 2
+#define THRESHOLD_MASTER 3
+
+/// Level/Experience skills defines.
+#define STD_XP_LVL_UP 100
+#define STD_XP_LVL_MULTI 2
+#define STD_MAX_LVL 4
+
+#define RPG_MAX_LVL 100
+
+#define DORF_XP_LVL_UP 400
+#define DORF_XP_LVL_MULTI 100
+#define DORF_MAX_LVL 20 // Dabbling, novice, adequate, [...], legendary +3, legendary +4, legendary +5
+
+//level up methods defines
+#define STANDARD_LEVEL_UP "standard_level_up"
+#define DWARFY_LEVEL_UP "dwarfy_level_up"
+
+//job skill level defines
+#define JOB_SKILL_UNTRAINED 0
+#define JOB_SKILL_BASIC 1
+#define JOB_SKILL_TRAINED 2
+#define JOB_SKILL_EXPERT 3
+#define JOB_SKILL_MASTER 4
+
+//other skill level defines, not an exhaustive catalogue, only contains be most relevant ones.
+#define DORF_SKILL_COMPETENT 3
+#define DORF_SKILL_EXPERT 8
+#define DORF_SKILL_MASTER 12
diff --git a/code/__DEFINES/skills/helpers.dm b/code/__DEFINES/skills/helpers.dm
new file mode 100644
index 0000000000..23669b3739
--- /dev/null
+++ b/code/__DEFINES/skills/helpers.dm
@@ -0,0 +1,8 @@
+
+//How experience levels are calculated.
+#define XP_LEVEL(std, multi, lvl) (std*((multi**lvl)/(multi-1))-std/(multi-1)) //don't use 1 as multi, you'll get division by zero errors
+#define DORF_XP_LEVEL(std, extra, lvl) (std*lvl+extra*(lvl*(lvl/2+0.5)))
+
+//More experience value getter macros
+#define GET_STANDARD_LVL(lvl) XP_LEVEL(STD_XP_LVL_UP, STD_XP_LVL_MULTI, lvl)
+#define GET_DORF_LVL(lvl) DORF_XP_LEVEL(DORF_XP_LVL_UP, DORF_XP_LVL_MULTI, lvl)
diff --git a/code/__DEFINES/skills/skills.dm b/code/__DEFINES/skills/skills.dm
deleted file mode 100644
index b97b921550..0000000000
--- a/code/__DEFINES/skills/skills.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-/// true/false
-#define SKILL_PROGRESSION_BINARY 1
-/// numerical
-#define SKILL_PROGRESSION_NUMERICAL 2
-/// Enum
-#define SKILL_PROGRESSION_ENUM 3
-
-/// Max value of skill for numerical skills
-#define SKILL_NUMERICAL_MAX 100
-/// Min value of skill for numerical skills
-#define SKILL_NUMERICAL_MIN 0
-
-// Standard values for job starting skills
-
-#define STARTING_SKILL_SURGERY_MEDICAL 35 //out of SKILL_NUMERICAL_MAX
-
-// Standard values for job starting skill affinities
-
-#define STARTING_SKILL_AFFINITY_SURGERY_MEDICAL 1.2
-
-// Standard values for skill gain (this is multiplied by affinity)
-
-#define SKILL_GAIN_SURGERY_PER_STEP 0.25
-
-// Misc
-
-/// 40% speedup at 100 skill
-#define SURGERY_SKILL_SPEEDUP_NUMERICAL_SCALE(number) clamp(number / 250, 1, 2)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 98db89a100..f0b38f994d 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -91,7 +91,7 @@
log_combat(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
add_fingerprint(user)
- user.adjustStaminaLossBuffered(getweight()*0.8)//CIT CHANGE - makes attacking things cause stamina loss
+ user.adjustStaminaLossBuffered(getweight(user, STAM_COST_ATTACK_MOB_MULT))//CIT CHANGE - makes attacking things cause stamina loss
//the equivalent of the standard version of attack() but for object targets.
/obj/item/proc/attack_obj(obj/O, mob/living/user)
@@ -102,7 +102,7 @@
if(IS_STAMCRIT(user)) // CIT CHANGE - makes it impossible to attack in stamina softcrit
to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto
return // CIT CHANGE - ditto
- user.adjustStaminaLossBuffered(getweight()*1.2)//CIT CHANGE - makes attacking things cause stamina loss
+ user.adjustStaminaLossBuffered(getweight(user, STAM_COST_ATTACK_OBJ_MULT))//CIT CHANGE - makes attacking things cause stamina loss
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(O)
O.attacked_by(src, user)
@@ -111,26 +111,32 @@
return
/obj/attacked_by(obj/item/I, mob/living/user)
- if(I.force)
+ var/totitemdamage = I.force
+ var/bad_flag = NONE
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && iscarbon(user))
+ totitemdamage *= 0.5
+ bad_flag |= SKILL_COMBAT_MODE //blacklist combat skills.
+ if(I.used_skills && user.mind)
+ if(totitemdamage)
+ totitemdamage = user.mind.skill_holder.item_action_skills_mod(I, totitemdamage, I.skill_difficulty, SKILL_ATTACK_OBJ, bad_flag)
+ for(var/skill in I.used_skills)
+ if(!(I.used_skills[skill] & SKILL_TRAIN_ATTACK_OBJ))
+ continue
+ user.mind.skill_holder.auto_gain_experience(skill, I.skill_gain)
+ if(totitemdamage)
visible_message("[user] has hit [src] with [I]!", null, null, COMBAT_MESSAGE_RANGE)
//only witnesses close by and the victim see a hit message.
log_combat(user, src, "attacked", I)
- take_damage(I.force, I.damtype, "melee", 1)
+ take_damage(totitemdamage, I.damtype, "melee", 1)
/mob/living/attacked_by(obj/item/I, mob/living/user)
- //CIT CHANGES START HERE - combatmode and resting checks
- var/totitemdamage = I.force
- if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
- totitemdamage *= 0.5
- if(!CHECK_MOBILITY(user, MOBILITY_STAND))
- totitemdamage *= 0.5
- //CIT CHANGES END HERE
+ var/totitemdamage = pre_attacked_by(I, user)
if((user != src) && run_block(I, totitemdamage, "the [I.name]", ATTACK_TYPE_MELEE, I.armour_penetration, user) & BLOCK_SUCCESS)
return FALSE
send_item_attack_message(I, user)
- I.do_stagger_action(src, user)
+ I.do_stagger_action(src, user, totitemdamage)
if(I.force)
- apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage
+ apply_damage(totitemdamage, I.damtype)
if(I.damtype == BRUTE)
if(prob(33))
I.add_mob_blood(src)
@@ -146,6 +152,28 @@
else
return ..()
+/mob/living/proc/pre_attacked_by(obj/item/I, mob/living/user)
+ . = I.force
+ var/bad_flag = NONE
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && iscarbon(user))
+ . *= 0.5
+ bad_flag |= SKILL_COMBAT_MODE //blacklist combat skills.
+ if(!CHECK_MOBILITY(user, MOBILITY_STAND))
+ . *= 0.5
+ if(!user.mind || !I.used_skills)
+ return
+ if(.)
+ . = user.mind.skill_holder.item_action_skills_mod(I, ., I.skill_difficulty, SKILL_ATTACK_MOB, bad_flag)
+ for(var/skill in I.used_skills)
+ if(!(I.used_skills[skill] & SKILL_TRAIN_ATTACK_MOB))
+ continue
+ user.mind.skill_holder.auto_gain_experience(skill, I.skill_gain)
+
+/mob/living/carbon/pre_attacked_by(obj/item/I, mob/living/user)
+ . = ..()
+ if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ . *= 1.5
+
// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person.
// Click parameters is the params string from byond Click() code, see that documentation.
/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
@@ -179,22 +207,30 @@
return 1
/// How much stamina this takes to swing this is not for realism purposes hecc off.
-/obj/item/proc/getweight()
- return total_mass || w_class * 1.25
+/obj/item/proc/getweight(mob/living/user, multiplier = 1, flags = SKILL_STAMINA_COST)
+ . = (total_mass || w_class * STAM_COST_W_CLASS_MULT) * multiplier
+ if(!user)
+ return
+ var/bad_flag = NONE
+ if(iscarbon(user) && !(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ . *= STAM_COST_NO_COMBAT_MULT
+ bad_flag |= SKILL_COMBAT_MODE
+ if(used_skills && user.mind)
+ . = user.mind.skill_holder.item_action_skills_mod(src, ., skill_difficulty, flags, bad_flag, FALSE)
/// How long this staggers for. 0 and negatives supported.
-/obj/item/proc/melee_stagger_duration()
+/obj/item/proc/melee_stagger_duration(force_override)
if(!isnull(stagger_force))
return stagger_force
/// totally not an untested, arbitrary equation.
- return clamp((1.5 + (w_class/7.5)) * (force / 2), 0, 10 SECONDS)
+ return clamp((1.5 + (w_class/7.5)) * ((force_override || force) / 2), 0, 10 SECONDS)
-/obj/item/proc/do_stagger_action(mob/living/target, mob/living/user)
+/obj/item/proc/do_stagger_action(mob/living/target, mob/living/user, force_override)
if(!CHECK_BITFIELD(target.status_flags, CANSTAGGER))
return FALSE
if(target.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
target.do_staggered_animation()
- var/duration = melee_stagger_duration()
+ var/duration = melee_stagger_duration(force_override)
if(!duration) //0
return FALSE
else if(duration > 0)
diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm
index 19fef28597..28803f0979 100644
--- a/code/controllers/admin.dm
+++ b/code/controllers/admin.dm
@@ -3,9 +3,7 @@
name = "Initializing..."
var/target
-INITIALIZE_IMMEDIATE(/obj/effect/statclick)
-
-/obj/effect/statclick/Initialize(mapload, text, target) //Don't port this to Initialize it's too critical
+/obj/effect/statclick/New(loc, text, target) //Don't port this to Initialize it's too critical
. = ..()
name = text
src.target = target
@@ -33,6 +31,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick)
usr.client.debug_variables(target)
message_admins("Admin [key_name_admin(usr)] is debugging the [target] [class].")
+/obj/effect/statclick/misc_subsystems/Click()
+ if(!usr.client.holder)
+ return
+ var/subsystem = input(usr, "Debug which subsystem?", "Debug nonprocessing subsystem") as null|anything in (Master.subsystems - Master.statworthy_subsystems)
+ if(!subsystem)
+ return
+ usr.client.debug_variables(subsystem)
+ message_admins("Admin [key_name_admin(usr)] is debugging the [subsystem] subsystem.")
// Debug verbs.
/client/proc/restart_controller(controller in list("Master", "Failsafe"))
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index db828539af..cdbea1de85 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -28,6 +28,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
// List of subsystems to process().
var/list/subsystems
+ /// List of subsystems to include in the MC stat panel.
+ var/list/statworthy_subsystems
// Vars for keeping track of tick drift.
var/init_timeofday
@@ -65,6 +67,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
//used by CHECK_TICK as well so that the procs subsystems call can obey that SS's tick limits
var/static/current_ticklimit = TICK_LIMIT_RUNNING
+ /// Statclick for misc subsystems
+ var/obj/effect/statclick/misc_subsystems/misc_statclick
+
/datum/controller/master/New()
if(!config)
config = new
@@ -87,6 +92,11 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
_subsystems += new I
Master = src
+ // We want to see all subsystems during init.
+ statworthy_subsystems = subsystems.Copy()
+
+ misc_statclick = new(null, "Debug")
+
if(!GLOB)
new /datum/controller/global_vars
@@ -257,10 +267,14 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
var/list/tickersubsystems = list()
var/list/runlevel_sorted_subsystems = list(list()) //ensure we always have at least one runlevel
var/timer = world.time
+ statworthy_subsystems = list()
for (var/thing in subsystems)
var/datum/controller/subsystem/SS = thing
if (SS.flags & SS_NO_FIRE)
+ if(SS.flags & SS_ALWAYS_SHOW_STAT)
+ statworthy_subsystems += SS
continue
+ statworthy_subsystems += SS
SS.queued_time = 0
SS.queue_next = null
SS.queue_prev = null
@@ -603,7 +617,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
stat("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%)) (Internal Tick Usage: [round(MAPTICK_LAST_INTERNAL_TICK_USAGE,0.1)]%)")
stat("Master Controller:", statclick.update("(TickRate:[Master.processing]) (Iteration:[Master.iteration]) (TickLimit: [round(Master.current_ticklimit, 0.1)])"))
-
+ stat("Misc Subsystems", misc_statclick)
/datum/controller/master/StartLoadingMap()
//disallow more than one map to load at once, multithreading it will just cause race conditions
diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm
index 49d7a8dfea..8ee893b2e5 100644
--- a/code/datums/components/crafting/recipes/recipes_misc.dm
+++ b/code/datums/components/crafting/recipes/recipes_misc.dm
@@ -117,7 +117,7 @@
/datum/crafting_recipe/upgraded_gauze
name = "Improved Gauze"
- result = /obj/item/stack/medical/gauze/adv
+ result = /obj/item/stack/medical/gauze/adv/one
time = 1
reqs = list(/obj/item/stack/medical/gauze = 1,
/datum/reagent/space_cleaner/sterilizine = 10)
@@ -126,7 +126,7 @@
/datum/crafting_recipe/bruise_pack
name = "Bruise Pack"
- result = /obj/item/stack/medical/bruise_pack
+ result = /obj/item/stack/medical/bruise_pack/one
time = 1
reqs = list(/obj/item/stack/medical/gauze = 1,
/datum/reagent/medicine/styptic_powder = 10)
@@ -134,8 +134,8 @@
subcategory = CAT_TOOL
/datum/crafting_recipe/burn_pack
- name = "Brun Ointment"
- result = /obj/item/stack/medical/ointment
+ name = "Burn Ointment"
+ result = /obj/item/stack/medical/ointment/one
time = 1
reqs = list(/obj/item/stack/medical/gauze = 1,
/datum/reagent/medicine/silver_sulfadiazine = 10)
diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm
index 6938046e11..23a81716b8 100644
--- a/code/datums/components/mood.dm
+++ b/code/datums/components/mood.dm
@@ -1,5 +1,7 @@
+#define SLIGHT_INSANITY_PEN 1
#define MINOR_INSANITY_PEN 5
#define MAJOR_INSANITY_PEN 10
+#define MOOD_INSANITY_MALUS 0.0054 // per point of sanity below SANITY_DISTURBED, a 40% debuff to skills at rock bottom depression.
/datum/component/mood
var/mood //Real happiness
@@ -22,7 +24,6 @@
RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event)
RegisterSignal(parent, COMSIG_MODIFY_SANITY, .proc/modify_sanity)
RegisterSignal(parent, COMSIG_LIVING_REVIVE, .proc/on_revive)
-
RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud)
var/mob/living/owner = parent
if(owner.hud_used)
@@ -150,7 +151,7 @@
if(8)
setSanity(sanity+0.25, maximum=SANITY_GREAT)
if(9)
- setSanity(sanity+0.4, maximum=SANITY_GREAT)
+ setSanity(sanity+0.4, maximum=SANITY_AMAZING)
HandleNutrition(owner)
@@ -166,6 +167,7 @@
else if(sanity > maximum && amount > sanity - 0.5)
amount = sanity - 0.5
+ var/old_sanity = sanity
// Disturbed stops you from getting any more sane
if(HAS_TRAIT(master, TRAIT_UNSTABLE))
sanity = min(amount,sanity)
@@ -182,7 +184,7 @@
master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/crazy)
sanity_level = 5
if(SANITY_UNSTABLE to SANITY_DISTURBED)
- setInsanityEffect(0)
+ setInsanityEffect(SLIGHT_INSANITY_PEN)
master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/disturbed)
sanity_level = 4
if(SANITY_DISTURBED to SANITY_NEUTRAL)
@@ -197,6 +199,12 @@
setInsanityEffect(0)
master.remove_movespeed_modifier(MOVESPEED_ID_SANITY)
sanity_level = 1
+
+ if(old_sanity > 1 && sanity == 1)
+ RegisterSignal(master, COMSIG_MOB_SKILL_GET_AFFINITY, .proc/on_get_skill_affinity)
+ else if(old_sanity == 1 && sanity > 1)
+ UnregisterSignal(master, COMSIG_MOB_SKILL_GET_AFFINITY)
+
//update_mood_icon()
/datum/component/mood/proc/setInsanityEffect(newval)//More code so that the previous proc works
@@ -204,9 +212,14 @@
return
//var/mob/living/master = parent
//master.crit_threshold = (master.crit_threshold - insanity_effect) + newval
+ if(!insanity_effect && newval)
+ RegisterSignal(parent, COMSIG_MOB_ACTION_SKILL_MOD, .proc/on_mob_action_skill_mod)
+ RegisterSignal(parent, COMSIG_MOB_ITEM_ACTION_SKILLS_MOD, .proc/on_item_action_skills_mod)
+ else if(insanity_effect && !newval)
+ UnregisterSignal(parent, list(COMSIG_MOB_ACTION_SKILL_MOD, COMSIG_MOB_ITEM_ACTION_SKILLS_MOD))
insanity_effect = newval
-/datum/component/mood/proc/modify_sanity(datum/source, amount, minimum = -INFINITY, maximum = INFINITY)
+/datum/component/mood/proc/modify_sanity(datum/source, amount, minimum = SANITY_INSANE, maximum = SANITY_AMAZING)
setSanity(sanity + amount, minimum, maximum)
/datum/component/mood/proc/add_event(datum/source, category, type, param) //Category will override any events in the same category, should be unique unless the event is based on the same thing like hunger.
@@ -288,5 +301,40 @@
remove_temp_moods()
setSanity(initial(sanity))
+/datum/component/mood/proc/on_mob_action_skill_mod(mob/source, list/skill_args, list/mod_values)
+ var/datum/skill/S = GLOB.skill_datums[skill_args[ACTION_SKILL_MOD_SKILL]]
+ if(!(S.skill_flags & SKILL_USE_MOOD))
+ return
+ var/debuff = 1 - (SANITY_DISTURBED - sanity) * MOOD_INSANITY_MALUS
+ mod_values[MOD_VALUES_SKILL_MOD] *= skill_args[ACTION_SKILL_MOD_IS_MULTI] ? debuff : 1/debuff
+
+/datum/component/mood/proc/on_item_action_skills_mod(mob/source, list/skill_args, list/mod_values)
+ if(skill_args[ITEM_SKILLS_MOD_BAD_FLAGS] & SKILL_USE_MOOD)
+ return
+ var/divisor = mod_values[MOD_VALUES_ITEM_SKILLS_DIV]
+ if(!divisor)
+ return
+ var/obj/item/I = skill_args[ITEM_SKILLS_MOD_ITEM]
+ var/list/L = mod_values[MOD_VALUES_ITEM_SKILLS_CHECKED]
+ var/skills_len = length(L)
+ var/affected_skills = skills_len
+ for(var/k in L)
+ var/datum/skill/S = k
+ var/our_flags = I.used_skills[S.type]|S.skill_flags
+ if(!(our_flags & SKILL_USE_MOOD))
+ affected_skills--
+ if(!affected_skills)
+ return
+ var/debuff = 1 - (SANITY_DISTURBED - sanity) * MOOD_INSANITY_MALUS * (affected_skills/skills_len)
+ mod_values[MOD_VALUES_ITEM_SKILLS_SUM] *= skill_args[ITEM_SKILLS_MOD_IS_MULTI] ? debuff : 1/debuff
+
+/datum/component/mood/proc/on_get_skill_affinity(mob/source, skill_path, list/return_value)
+ var/datum/skill/S = GLOB.skill_datums[skill_path]
+ if(!S || !(S.skill_flags & SKILL_TRAIN_MOOD))
+ return
+ return_value[1] *= SKILL_AFFINITY_MOOD_BONUS
+
+#undef SLIGHT_INSANITY_PEN
#undef MINOR_INSANITY_PEN
#undef MAJOR_INSANITY_PEN
+#undef MOOD_INSANITY_MALUS
diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm
index 651acda6e1..747dd8ca61 100644
--- a/code/datums/components/riding.dm
+++ b/code/datums/components/riding.dm
@@ -208,13 +208,13 @@
RegisterSignal(parent, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_host_unarmed_melee)
/datum/component/riding/human/vehicle_mob_unbuckle(datum/source, mob/living/M, force = FALSE)
- . = ..()
var/mob/living/carbon/human/H = parent
if(!length(H.buckled_mobs))
H.remove_movespeed_modifier(/datum/movespeed_modifier/human_carry)
if(!fireman_carrying)
M.Daze(25)
REMOVE_TRAIT(M, TRAIT_MOBILITY_NOUSE, src)
+ return ..()
/datum/component/riding/human/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE)
. = ..()
diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm
index bbacdd885d..79966b8f54 100644
--- a/code/datums/diseases/advance/symptoms/sensory.dm
+++ b/code/datums/diseases/advance/symptoms/sensory.dm
@@ -58,7 +58,7 @@
var/mob/living/carbon/C = M
if(prob(10))
if(trauma_heal_severe)
- C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_LOBOTOMY)
+ C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_SURGERY)
else
C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 728c4fb51b..54fcbbc6aa 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -67,7 +67,7 @@
var/datum/skill_holder/skill_holder
/datum/mind/New(var/key)
- skill_holder = new
+ skill_holder = new(src)
src.key = key
soulOwner = src
martial_art = default_martial_art
@@ -80,6 +80,7 @@
if(antag_datum.delete_on_mind_deletion)
qdel(i)
antag_datums = null
+ QDEL_NULL(skill_holder)
return ..()
/datum/mind/proc/get_language_holder()
diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm
index 2dd321c4c6..f52945536f 100644
--- a/code/datums/skills/_skill.dm
+++ b/code/datums/skills/_skill.dm
@@ -1,4 +1,4 @@
-GLOBAL_LIST_INIT(skill_datums, init_skill_datums())
+GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
/proc/init_skill_datums()
. = list()
@@ -9,16 +9,13 @@ GLOBAL_LIST_INIT(skill_datums, init_skill_datums())
S = new path
.[S.type] = S
-/proc/get_skill_datum(path)
- return GLOB.skill_datums[path]
-
/proc/sanitize_skill_value(path, value)
- var/datum/skill/S = get_skill_datum(path)
+ var/datum/skill/S = GLOB.skill_datums[path]
// don't check, if we runtime let it happen.
return S.sanitize_value(value)
/proc/is_skill_value_greater(path, existing, new_value)
- var/datum/skill/S = get_skill_datum(path)
+ var/datum/skill/S = GLOB.skill_datums[path]
// don't check, if we runtime let it happen.
return S.is_value_greater(existing, new_value)
@@ -30,10 +27,18 @@ GLOBAL_LIST_INIT(skill_datums, init_skill_datums())
var/name
/// Our description
var/desc
+ /// Color of the name as shown in the html readout
+ var/name_color = "#F0F0F0" // White on dark surface.
/// Our progression type
var/progression_type
/// Abstract type
var/abstract_type = /datum/skill
+ /// skill threshold used in generic skill modifiers calculations.
+ var/list/competency_thresholds = list(0, 0, 0)
+ /// Multiplier of the difference of the holder skill value and the selected threshold.
+ var/list/competency_mults = list(0, 0, 0)
+ /// In which way this skil can affect or be affected through actions.
+ var/skill_flags = SKILL_USE_MOOD|SKILL_TRAIN_MOOD
/**
* Ensures what someone's setting as a value for this skill is valid.
@@ -41,6 +46,13 @@ GLOBAL_LIST_INIT(skill_datums, init_skill_datums())
/datum/skill/proc/sanitize_value(new_value)
return new_value
+/**
+ * Sets the new value of this skill in the holder skills list.
+ * As well as possible feedback messages or secondary effects on value change, that's on you.
+ */
+/datum/skill/proc/set_skill_value(datum/skill_holder/H, value, mob/owner)
+ H.skills[type] = value
+
/**
* Checks if a value is greater
*/
@@ -52,7 +64,7 @@ GLOBAL_LIST_INIT(skill_datums, init_skill_datums())
/**
* Standard value "render"
*/
-/datum/skill/proc/standard_render_value(value)
+/datum/skill/proc/standard_render_value(value, level)
return value
// Just saying, the choice to use different sub-parent-types is to force coders to resolve issues as I won't be implementing custom procs to grab skill levels in a certain context.
@@ -61,11 +73,13 @@ GLOBAL_LIST_INIT(skill_datums, init_skill_datums())
/datum/skill/binary
abstract_type = /datum/skill/binary
progression_type = SKILL_PROGRESSION_BINARY
+ competency_thresholds = list(FALSE, TRUE, TRUE)
+ competency_mults = list(0.5, 0.5, 0.5)
/datum/skill/binary/sanitize_value(new_value)
return new_value? TRUE : FALSE
-/datum/skill/binary/standard_render_value(value)
+/datum/skill/binary/standard_render_value(value, level)
return value? "Yes" : "No"
/datum/skill/numerical
@@ -81,7 +95,7 @@ GLOBAL_LIST_INIT(skill_datums, init_skill_datums())
/datum/skill/numerical/sanitize_value(new_value)
return clamp(new_value, min_value, max_value)
-/datum/skill/numerical/standard_render_value(value)
+/datum/skill/numerical/standard_render_value(value, level)
return display_as_percent? "[round(value/max_value/100, 0.01)]%" : "[value] / [max_value]"
/datum/skill/enum
@@ -93,3 +107,102 @@ GLOBAL_LIST_INIT(skill_datums, init_skill_datums())
/datum/skill/enum/sanitize_value(new_value)
if(new_value in valid_values)
return new_value
+
+/**
+ * Classing r p g styled skills, tiered by lvl, and current/nextlvl experience.
+ */
+/datum/skill/level
+ abstract_type = /datum/skill/level
+ progression_type = SKILL_PROGRESSION_LEVEL
+ var/standard_xp_lvl_up = STD_XP_LVL_UP //the standard required to level up. def: 100
+ var/xp_lvl_multiplier = STD_XP_LVL_MULTI //standard required level up exp multiplier. def: 2 (100, 200, 400, 800 etc.)
+ var/max_levels = STD_MAX_LVL
+ var/level_up_method = STANDARD_LEVEL_UP //how levels are calculated.
+ var/list/levels = list() //level thresholds, if associative, these will be preceded by tiers such as "novice" or "trained"
+ var/associative = FALSE //See above.
+ var/unskilled_tier = "Unskilled" //Only relevant for associative experience levels
+
+//Builds the levels list.
+/datum/skill/level/New()
+ . = ..()
+ var/max_assoc = ""
+ var/max_assoc_start = 1
+ for(var/lvl in 1 to max_levels)
+ var/value
+ switch(level_up_method)
+ if(STANDARD_LEVEL_UP)
+ value = XP_LEVEL(standard_xp_lvl_up, xp_lvl_multiplier, lvl)
+ if(DWARFY_LEVEL_UP)
+ value = DORF_XP_LEVEL(standard_xp_lvl_up, xp_lvl_multiplier, lvl)
+ value = round(value, 1)
+ if(!associative)
+ levels += value
+ continue
+ if(max_assoc)
+ levels["[max_assoc] +[max_assoc_start++]"] = value
+ continue
+ var/key = LAZYACCESS(levels, lvl)
+ if(!key)
+ if(lvl == 1) //You dun goof it.
+ stack_trace("Skill datum [src] was set to have an associative levels list despite the latter having no key value.")
+ associative = FALSE
+ levels += value
+ continue
+ max_assoc = levels[lvl-1]
+ levels["[max_assoc] +[max_assoc_start++]"] = value
+ levels[key] = value
+
+/datum/skill/level/sanitize_value(new_value)
+ return max(new_value, 0)
+
+/datum/skill/level/set_skill_value(datum/skill_holder/H, value, datum/mind/M, silent = FALSE)
+ H.skills[type] = value
+ var/new_level
+ for(var/k in levels)
+ if(value < (associative ? levels[k] : k))
+ break
+ new_level++
+ var/old_level = LAZYACCESS(H.skill_levels, type)
+ LAZYSET(H.skill_levels, type, new_level)
+ . = new_level - old_level
+ if(silent || !(M?.current))
+ return
+ if(. > 0)
+ to_chat(M.current, "I feel like I've become more proficient at [name]!")
+ else if(. < 0)
+ to_chat(M.current, "I feel like I've become worse at [name]!")
+
+/datum/skill/level/standard_render_value(value, level)
+ var/current_lvl = associative ? (!level ? unskilled_tier : levels[level]) : level
+ var/current_lvl_xp_sum = 0
+ if(level)
+ current_lvl_xp_sum = associative ? levels[levels[level]] : levels[level]
+ var/next_index = max(max_levels, level+1)
+ var/next_lvl_xp = associative ? levels[levels[next_index]] : levels[next_index]
+ if(next_lvl_xp > current_lvl_xp_sum)
+ next_lvl_xp -= current_lvl_xp_sum
+
+
+ return "[associative ? current_lvl : "Lvl. [current_lvl]"] ([value - current_lvl_xp_sum]/[next_lvl_xp])[level == max_levels ? " \[MAX!\]" : ""]"
+
+/datum/skill/level/job
+ levels = list("Basic", "Trained", "Experienced", "Master")
+ competency_thresholds = list(JOB_SKILL_TRAINED, JOB_SKILL_EXPERT, JOB_SKILL_MASTER)
+ competency_mults = list(0.15, 0.1, 0.1)
+ associative = TRUE
+
+//quite the reference, no?
+/datum/skill/level/dwarfy
+ abstract_type = /datum/skill/level/dwarfy
+ standard_xp_lvl_up = DORF_XP_LVL_UP
+ xp_lvl_multiplier = DORF_XP_LVL_MULTI
+ max_levels = DORF_MAX_LVL
+ level_up_method = DWARFY_LEVEL_UP
+ levels = list("Novice", "Adequate", "Competent", "Skilled",
+ "Proficient", "Talented", "Adept", "Expert",
+ "Professional", "Accomplished", "Great", "Master",
+ "High Master", "Grand Master", "Legendary")
+ competency_thresholds = list(DORF_SKILL_COMPETENT, DORF_SKILL_EXPERT, DORF_SKILL_MASTER)
+ competency_mults = list(0.15, 0.1, 0.08)
+ associative = TRUE
+ unskilled_tier = "Dabbling"
diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm
index e16804ab7f..e252b4c9c6 100644
--- a/code/datums/skills/_skill_holder.dm
+++ b/code/datums/skills/_skill_holder.dm
@@ -2,10 +2,18 @@
* Skill holder datums
*/
/datum/skill_holder
+ var/datum/mind/owner
/// Our list of skills and values. Lazylist. Associative. Keys are datum typepaths to the skill.
var/list/skills
/// Same as [skills] but affinities, which are multiplied to increase amount when gaining skills.
var/list/skill_affinities
+ /// Let's say we want to get a specific skill "level" without looping through a proc everytime.
+ /// Only supported by skills with tiers or levels.
+ var/list/skill_levels
+
+/datum/skill_holder/New(datum/mind/M)
+ . = ..()
+ owner = M
/**
* Grabs the value of a skill.
@@ -15,54 +23,139 @@
CRASH("Invalid get_skill_value call. Use typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this.
if(!skills)
return null
- return LAZYACCESS(skills, skill)
+ return skills[skill]
+
+/**
+ * Grabs the level of a skill. Only supported by skills with tiers or levels.
+ */
+/datum/skill_holder/proc/get_skill_level(skill)
+ if(!ispath(skill, /datum/skill))
+ CRASH("Invalid get_skill_value call. Use skill typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this.
+ if(!skill_levels)
+ return 0
+ return skill_levels[skill]
/**
* Grabs our affinity for a skill. !!This is a multiplier!!
*/
/datum/skill_holder/proc/get_skill_affinity(skill)
- if(!ispath(skill))
- CRASH("Invalid get_skill_affinity call. Use typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this.
- if(!skills)
- return 1
+ . = 1
+ if(!ispath(skill, /datum/skill))
+ CRASH("Invalid get_skill_affinity call. Use skill typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this.
var/affinity = LAZYACCESS(skill_affinities, skill)
- if(isnull(affinity))
- return 1
- return affinity
+ if(!isnull(affinity))
+ . = affinity
+ var/list/wrapped = list(.)
+ SEND_SIGNAL(owner.current, COMSIG_MOB_SKILL_GET_AFFINITY, skill, wrapped)
+ . = wrapped[1]
+
/**
* Sets the value of a skill.
*/
-/datum/skill_holder/proc/set_skill_value(skill, value)
- if(!ispath(skill))
- CRASH("Invalid set_skill_value call. Use typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this.
- LAZYINITLIST(skills)
- value = sanitize_skill_value(skill, value)
+/datum/skill_holder/proc/set_skill_value(skill, value, silent = FALSE)
+ if(!ispath(skill, /datum/skill))
+ CRASH("Invalid set_skill_value call. Use skill typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this.
+ var/datum/skill/S = GLOB.skill_datums[skill]
+ value = S.sanitize_value(value)
if(!isnull(value))
- LAZYSET(skills, skill, value)
+ LAZYINITLIST(skills)
+ S.set_skill_value(src, value, owner, silent)
return TRUE
return FALSE
/**
* Boosts a skill to a value if not aobve
*/
-/datum/skill_holder/proc/boost_skill_value_to(skill, value)
+/datum/skill_holder/proc/boost_skill_value_to(skill, value, silent = FALSE)
var/current = get_skill_value(skill)
if(!is_skill_value_greater(skill, current, value))
return FALSE
- set_skill_value(skill, value)
+ set_skill_value(skill, value, silent)
return TRUE
/**
* Automatic skill increase, multiplied by skill affinity if existing.
* Only works if skill is numerical.
*/
-/datum/skill_holder/proc/auto_gain_experience(skill, value)
- if(!ispath(skill, /datum/skill/numerical))
- CRASH("You cannot auto increment a non numerical skill!")
+/datum/skill_holder/proc/auto_gain_experience(skill, value, maximum, silent = FALSE)
+ if(!ispath(skill, /datum/skill))
+ CRASH("Invalid set_skill_value call. Use skill typepaths.")
+ var/datum/skill/S = GLOB.skill_datums[skill]
+ if(S.progression_type != SKILL_PROGRESSION_NUMERICAL && S.progression_type != SKILL_PROGRESSION_LEVEL)
+ CRASH("You cannot auto increment a non numerical(experience skill!")
var/current = get_skill_value(skill)
var/affinity = get_skill_affinity(skill)
- boost_skill_value_to(skill, current + (value * affinity))
+ var/target_value = current + (value * affinity)
+ if(maximum)
+ target_value = max(target_value, maximum)
+ if(target_value == maximum) //no more experience to gain, early return.
+ return
+ boost_skill_value_to(skill, target_value, silent)
+
+/**
+ * Generic value modifier proc that uses one skill.
+ * Args:
+ * * value : the value to modify, may be a delay, damage, probability.
+ * * threshold : The difficulty of the action, in short. Refer to __DEFINES/skills/defines.dm for the defines.
+ * * modifier_is_multiplier : wheter the modifier is a multiplier or a divisor.
+ */
+/datum/skill_holder/proc/action_skills_mod(skill, value, threshold, modifier_is_multiplier = TRUE)
+ var/mod
+ var/datum/skill/S = GLOB.skill_datums[skill]
+ if(!S)
+ return
+ switch(S.progression_type)
+ if(SKILL_PROGRESSION_LEVEL)
+ mod = LAZYACCESS(skill_levels, S.type)
+ else
+ mod = LAZYACCESS(skills, S.type)
+ mod = (1+(mod-S.competency_thresholds[threshold])*S.competency_mults[threshold])
+
+ var/list/comsig_values = list(mod)
+ SEND_SIGNAL(owner.current, COMSIG_MOB_ACTION_SKILL_MOD, args, comsig_values)
+ mod = comsig_values[MOD_VALUES_SKILL_MOD]
+
+ . = modifier_is_multiplier ? value*mod : value/mod
+
+/**
+ * Generic value modifier proc that uses several skills, intended for items.
+ * Args:
+ * * item/I : the item used in this action. its used_skills list variable contains the skills exercised with it.
+ * * value : the value to modify, may be a delay, damage, probability.
+ * * flags : the required flags that each skill (either in I.used_skills or the skill datum skill_flags) must have to influence
+ * * the value.
+ * * bad_flags : the opposite of the above, skills that must not be present to impact the value.
+ * * modifier_is_multiplier : wheter the modifier is a multiplier or a divisor.
+ */
+/datum/skill_holder/proc/item_action_skills_mod(obj/item/I, value, flags = NONE, bad_flags = NONE, modifier_is_multiplier = TRUE)
+ . = value
+ var/sum = 0
+ var/divisor = 0
+ var/list/checked_skills
+ for(var/k in I.used_skills)
+ var/datum/skill/S = GLOB.skill_datums[k]
+ if(!S)
+ continue
+ var/our_flags = (I.used_skills[k]|S.skill_flags)
+ if((flags && !(our_flags & flags)) || (bad_flags && our_flags & bad_flags))
+ continue
+ var/mod
+ switch(S.progression_type)
+ if(SKILL_PROGRESSION_LEVEL)
+ mod = LAZYACCESS(skill_levels, S.type)
+ else
+ mod = LAZYACCESS(skills, S.type)
+ sum += 1+(mod - S.competency_thresholds[I.skill_difficulty])*S.competency_mults[I.skill_difficulty]
+ LAZYADD(checked_skills, S)
+
+ var/list/comsig_values = list(sum, divisor, checked_skills)
+ SEND_SIGNAL(owner.current, COMSIG_MOB_ITEM_ACTION_SKILLS_MOD, args, comsig_values)
+ sum = comsig_values[MOD_VALUES_ITEM_SKILLS_SUM]
+ divisor = comsig_values[MOD_VALUES_ITEM_SKILLS_DIV]
+
+ if(divisor)
+ . = modifier_is_multiplier ? value*(sum/divisor) : value/(sum/divisor)
/**
* Generates a HTML readout of our skills.
@@ -73,6 +166,6 @@
out += "
| Skill | Value |
"
for(var/path in skills)
var/datum/skill/S = GLOB.skill_datums[path]
- out += "| [S.name] | [S.standard_render_value(skills[path])] |
"
+ out += "| [S.name] | [S.standard_render_value(skills[path], LAZYACCESS(skill_levels, path) || 0)] |
"
out += "
"
return out.Join("")
diff --git a/code/datums/skills/engineering.dm b/code/datums/skills/engineering.dm
new file mode 100644
index 0000000000..59c9436e46
--- /dev/null
+++ b/code/datums/skills/engineering.dm
@@ -0,0 +1,6 @@
+/datum/skill/level/job/wiring
+ name = "Wiring"
+ desc = "How proficient and knowledged you are at wiring beyond laying cables on the floor."
+ name_color = COLOR_PALE_ORANGE
+ competency_thresholds = list(JOB_SKILL_BASIC, JOB_SKILL_EXPERT, JOB_SKILL_MASTER)
+ skill_flags = SKILL_USE_MOOD|SKILL_TRAIN_MOOD|SKILL_USE_TOOL|SKILL_TRAINING_TOOL
diff --git a/code/datums/skills/medical.dm b/code/datums/skills/medical.dm
index 3b67cacb04..aaae1236a6 100644
--- a/code/datums/skills/medical.dm
+++ b/code/datums/skills/medical.dm
@@ -1,3 +1,5 @@
/datum/skill/numerical/surgery
name = "Surgery"
desc = "How proficient you are at doing surgery."
+ name_color = COLOR_PALE_BLUE_GRAY
+ competency_mults = list(0.025, 0.025, 0.025) // 60% surgery speed up at max value of 100.
diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm
index ad24126e45..d2f719c50c 100644
--- a/code/datums/wires/_wires.dm
+++ b/code/datums/wires/_wires.dm
@@ -33,6 +33,9 @@
var/list/assemblies = list() // List of attached assemblies.
var/randomize = 0 // If every instance of these wires should be random.
// Prevents wires from showing up in station blueprints
+ var/req_knowledge = INFINITY //wiring skill level on which the functions are revealed.
+ var/req_skill = JOB_SKILL_BASIC //used in user's cutting/pulsing/mending speed calculations.
+ var/list/current_users //list of untrained people currently interacting with this set of wires.
/datum/wires/New(atom/holder)
..()
@@ -130,8 +133,22 @@
cut_wires += wire
on_cut(wire, mend = FALSE)
-/datum/wires/proc/cut_color(color)
+/datum/wires/proc/cut_color(color, mob/living/user)
+ LAZYINITLIST(current_users)
+ if(current_users[user])
+ return FALSE
+ if(req_skill && user?.mind)
+ var/level_diff = req_skill - user.mind.skill_holder.get_skill_level(/datum/skill/level/job/wiring)
+ if(level_diff > 0)
+ LAZYSET(current_users, user, TRUE)
+ to_chat(user, "You begin cutting [holder]'s [color] wire...")
+ if(!do_after(user, 1.5 SECONDS * level_diff, target = holder) || !interactable(user))
+ LAZYREMOVE(current_users, user)
+ return FALSE
+ LAZYREMOVE(current_users, user)
+ to_chat(user, "You cut [holder]'s [color] wire.")
cut(get_wire(color))
+ return TRUE
/datum/wires/proc/cut_random()
cut(wires[rand(1, wires.len)])
@@ -146,7 +163,21 @@
on_pulse(wire, user)
/datum/wires/proc/pulse_color(color, mob/living/user)
+ LAZYINITLIST(current_users)
+ if(current_users[user])
+ return FALSE
+ if(req_skill && user?.mind)
+ var/level_diff = req_skill - user.mind.skill_holder.get_skill_level(/datum/skill/level/job/wiring)
+ if(level_diff > 0)
+ LAZYSET(current_users, user, TRUE)
+ to_chat(user, "You begin pulsing [holder]'s [color] wire...")
+ if(!do_after(user, 1.5 SECONDS * level_diff, target = holder) || !interactable(user))
+ LAZYREMOVE(current_users, user)
+ return FALSE
+ LAZYREMOVE(current_users, user)
+ to_chat(user, "You pulse [holder]'s [color] wire.")
pulse(get_wire(color), user)
+ return TRUE
/datum/wires/proc/pulse_assembly(obj/item/assembly/S)
for(var/color in assemblies)
@@ -224,7 +255,7 @@
var/reveal_wires = FALSE
// Admin ghost can see a purpose of each wire.
- if(IsAdminGhost(user))
+ if(IsAdminGhost(user) || user.mind.skill_holder.get_skill_level(/datum/skill/level/job/wiring) >= req_knowledge)
reveal_wires = TRUE
// Same for anyone with an abductor multitool.
@@ -259,18 +290,16 @@
if("cut")
I = L.is_holding_tool_quality(TOOL_WIRECUTTER)
if(I || IsAdminGhost(usr))
- if(I && holder)
+ if(cut_color(target_wire, L) && I && holder)
I.play_tool_sound(holder, 20)
- cut_color(target_wire)
. = TRUE
else
to_chat(L, "You need wirecutters!")
if("pulse")
I = L.is_holding_tool_quality(TOOL_MULTITOOL)
if(I || IsAdminGhost(usr))
- if(I && holder)
+ if(pulse_color(target_wire, L) && I && holder)
I.play_tool_sound(holder, 20)
- pulse_color(target_wire, L)
. = TRUE
else
to_chat(L, "You need a multitool!")
diff --git a/code/datums/wires/airalarm.dm b/code/datums/wires/airalarm.dm
index 0c4715e27e..dae92d3c42 100644
--- a/code/datums/wires/airalarm.dm
+++ b/code/datums/wires/airalarm.dm
@@ -1,6 +1,7 @@
/datum/wires/airalarm
holder_type = /obj/machinery/airalarm
proper_name = "Air Alarm"
+ req_knowledge = JOB_SKILL_MASTER
/datum/wires/airalarm/New(atom/holder)
wires = list(
diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm
index b6699540c3..2b13344cc6 100644
--- a/code/datums/wires/airlock.dm
+++ b/code/datums/wires/airlock.dm
@@ -1,6 +1,7 @@
/datum/wires/airlock
holder_type = /obj/machinery/door/airlock
proper_name = "Generic Airlock"
+ req_skill = JOB_SKILL_UNTRAINED //Training wheel, as per request.
var/wiretype
/datum/wires/airlock/secure
@@ -52,10 +53,11 @@
/datum/wires/airlock/interactable(mob/user)
var/obj/machinery/door/airlock/A = holder
+ if(!A.panel_open)
+ return FALSE
if(!A.hasSiliconAccessInArea(user) && A.isElectrified() && A.shock(user, 100))
return FALSE
- if(A.panel_open)
- return TRUE
+ return TRUE
/datum/wires/airlock/get_status()
var/obj/machinery/door/airlock/A = holder
diff --git a/code/datums/wires/apc.dm b/code/datums/wires/apc.dm
index dc126f612e..997c77aa51 100644
--- a/code/datums/wires/apc.dm
+++ b/code/datums/wires/apc.dm
@@ -1,6 +1,7 @@
/datum/wires/apc
holder_type = /obj/machinery/power/apc
proper_name = "APC"
+ req_knowledge = JOB_SKILL_MASTER
/datum/wires/apc/New(atom/holder)
wires = list(
diff --git a/code/datums/wires/autolathe.dm b/code/datums/wires/autolathe.dm
index f83bab5910..01e87228d4 100644
--- a/code/datums/wires/autolathe.dm
+++ b/code/datums/wires/autolathe.dm
@@ -1,6 +1,7 @@
/datum/wires/autolathe
holder_type = /obj/machinery/autolathe
proper_name = "Autolathe"
+ req_knowledge = JOB_SKILL_EXPERT
/datum/wires/autolathe/New(atom/holder)
wires = list(
diff --git a/code/datums/wires/emitter.dm b/code/datums/wires/emitter.dm
index d0e1352c0e..6d82a7db5a 100644
--- a/code/datums/wires/emitter.dm
+++ b/code/datums/wires/emitter.dm
@@ -1,6 +1,8 @@
/datum/wires/emitter
holder_type = /obj/machinery/power/emitter
+ req_knowledge = JOB_SKILL_TRAINED
+ req_skill = JOB_SKILL_UNTRAINED
/datum/wires/emitter/New(atom/holder)
wires = list(WIRE_ZAP,WIRE_HACK)
diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm
index 3d1ed8b746..dc4db9e85d 100644
--- a/code/datums/wires/explosive.dm
+++ b/code/datums/wires/explosive.dm
@@ -15,6 +15,7 @@
/datum/wires/explosive/c4
holder_type = /obj/item/grenade/plastic/c4
randomize = TRUE //Same behaviour since no wire actually disarms it
+ req_skill = JOB_SKILL_UNTRAINED
/datum/wires/explosive/c4/interactable(mob/user)
var/obj/item/grenade/plastic/c4/P = holder
@@ -29,6 +30,7 @@
/datum/wires/explosive/pizza
holder_type = /obj/item/pizzabox
randomize = TRUE
+ req_skill = JOB_SKILL_MASTER
/datum/wires/explosive/pizza/New(atom/holder)
wires = list(
diff --git a/code/datums/wires/microwave.dm b/code/datums/wires/microwave.dm
index 8c74abfa46..c6e6aa13b5 100644
--- a/code/datums/wires/microwave.dm
+++ b/code/datums/wires/microwave.dm
@@ -1,6 +1,8 @@
/datum/wires/microwave
holder_type = /obj/machinery/microwave
proper_name = "Microwave"
+ req_knowledge = JOB_SKILL_TRAINED
+ req_skill = JOB_SKILL_UNTRAINED
/datum/wires/microwave/New(atom/holder)
wires = list(
diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm
index a452b46830..988487727b 100644
--- a/code/datums/wires/mulebot.dm
+++ b/code/datums/wires/mulebot.dm
@@ -1,6 +1,7 @@
/datum/wires/mulebot
holder_type = /mob/living/simple_animal/bot/mulebot
randomize = TRUE
+ req_knowledge = JOB_SKILL_MASTER
/datum/wires/mulebot/New(atom/holder)
wires = list(
diff --git a/code/datums/wires/particle_accelerator.dm b/code/datums/wires/particle_accelerator.dm
index af89f0d6f1..b782e589dd 100644
--- a/code/datums/wires/particle_accelerator.dm
+++ b/code/datums/wires/particle_accelerator.dm
@@ -1,6 +1,8 @@
/datum/wires/particle_accelerator/control_box
holder_type = /obj/machinery/particle_accelerator/control_box
proper_name = "Particle Accelerator"
+ req_knowledge = JOB_SKILL_EXPERT
+ req_skill = JOB_SKILL_TRAINED
/datum/wires/particle_accelerator/control_box/New(atom/holder)
wires = list(
diff --git a/code/datums/wires/r_n_d.dm b/code/datums/wires/r_n_d.dm
index ea61c1779e..25d3b73fe0 100644
--- a/code/datums/wires/r_n_d.dm
+++ b/code/datums/wires/r_n_d.dm
@@ -1,6 +1,7 @@
/datum/wires/rnd
holder_type = /obj/machinery/rnd
randomize = TRUE
+ req_knowledge = JOB_SKILL_EXPERT
/datum/wires/rnd/New(atom/holder)
wires = list(
diff --git a/code/datums/wires/radio.dm b/code/datums/wires/radio.dm
index a1118da6d7..5db6ddd186 100644
--- a/code/datums/wires/radio.dm
+++ b/code/datums/wires/radio.dm
@@ -1,6 +1,8 @@
/datum/wires/radio
holder_type = /obj/item/radio
proper_name = "Radio"
+ req_knowledge = JOB_SKILL_TRAINED
+ req_skill = JOB_SKILL_UNTRAINED
/datum/wires/radio/New(atom/holder)
wires = list(
diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm
index aa7c3cc4c3..6ede0415da 100644
--- a/code/datums/wires/robot.dm
+++ b/code/datums/wires/robot.dm
@@ -1,6 +1,8 @@
/datum/wires/robot
holder_type = /mob/living/silicon/robot
randomize = TRUE
+ req_knowledge = JOB_SKILL_MASTER
+ req_skill = JOB_SKILL_TRAINED
/datum/wires/robot/New(atom/holder)
wires = list(
diff --git a/code/datums/wires/suit_storage_unit.dm b/code/datums/wires/suit_storage_unit.dm
index eb7781203b..4387d0dc76 100644
--- a/code/datums/wires/suit_storage_unit.dm
+++ b/code/datums/wires/suit_storage_unit.dm
@@ -1,6 +1,8 @@
/datum/wires/suit_storage_unit
holder_type = /obj/machinery/suit_storage_unit
proper_name = "Suit Storage Unit"
+ req_knowledge = JOB_SKILL_TRAINED
+ req_skill = JOB_SKILL_UNTRAINED
/datum/wires/suit_storage_unit/New(atom/holder)
wires = list(
diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm
index 53c1a1b9bc..8e1cf5002f 100644
--- a/code/datums/wires/syndicatebomb.dm
+++ b/code/datums/wires/syndicatebomb.dm
@@ -1,6 +1,8 @@
/datum/wires/syndicatebomb
holder_type = /obj/machinery/syndicatebomb
randomize = TRUE
+ req_skill = JOB_SKILL_EXPERT //good luck, wannabe hero.
+
/datum/wires/syndicatebomb/New(atom/holder)
wires = list(
diff --git a/code/datums/wires/tesla_coil.dm b/code/datums/wires/tesla_coil.dm
index fa858a9a8f..68fe8e72fc 100644
--- a/code/datums/wires/tesla_coil.dm
+++ b/code/datums/wires/tesla_coil.dm
@@ -2,6 +2,7 @@
/datum/wires/tesla_coil
randomize = 1 //Only one wire don't need blueprints
holder_type = /obj/machinery/power/tesla_coil
+ req_knowledge = JOB_SKILL_TRAINED
/datum/wires/tesla_coil/New(atom/holder)
wires = list(WIRE_ZAP)
diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm
index 114791e873..6c7e59c24c 100644
--- a/code/datums/wires/vending.dm
+++ b/code/datums/wires/vending.dm
@@ -1,6 +1,7 @@
/datum/wires/vending
holder_type = /obj/machinery/vending
proper_name = "Vending Unit"
+ req_knowledge = JOB_SKILL_EXPERT
/datum/wires/vending/New(atom/holder)
wires = list(
diff --git a/code/game/gamemodes/objective_sabotage.dm b/code/game/gamemodes/objective_sabotage.dm
index d2cdd2e029..f08d84eae2 100644
--- a/code/game/gamemodes/objective_sabotage.dm
+++ b/code/game/gamemodes/objective_sabotage.dm
@@ -90,7 +90,10 @@
sabotage_type = "cloner"
/datum/sabotage_objective/cloner/check_conditions()
- return !(locate(/obj/machinery/clonepod) in GLOB.machines)
+ for(var/obj/machinery/clonepod/cloner in GLOB.machines)
+ if(is_station_level(cloner.z))
+ return FALSE
+ return TRUE
/datum/sabotage_objective/ai_law
name = "Upload a hacked law to the AI."
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index de92e1c249..33560dbb8b 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -17,7 +17,6 @@
var/list/L = list()
var/list/LL = list()
var/hacked = FALSE
- var/hackable = TRUE
var/disabled = 0
var/shocked = FALSE
var/hack_wire
@@ -32,7 +31,7 @@
var/selected_category
var/screen = 1
- var/datum/techweb/stored_research = /datum/techweb/specialized/autounlocking/autolathe
+ var/datum/techweb/specialized/autounlocking/stored_research = /datum/techweb/specialized/autounlocking/autolathe
var/list/categories = list(
"Tools",
"Electronics",
@@ -425,11 +424,11 @@
/obj/machinery/autolathe/proc/adjust_hacked(state)
hacked = state
- if(!hackable && hacked)
- return
for(var/id in SSresearch.techweb_designs)
var/datum/design/D = SSresearch.techweb_design_by_id(id)
- if((D.build_type & AUTOLATHE) && ("hacked" in D.category))
+ if(D.build_type & stored_research.design_autounlock_skip_types)
+ continue
+ if((D.build_type & stored_research.design_autounlock_buildtypes) && ("hacked" in D.category))
if(hacked)
stored_research.add_design(D)
else
@@ -441,8 +440,7 @@
/obj/machinery/autolathe/secure
name = "secured autolathe"
- desc = "An autolathe reprogrammed with security protocols to prevent hacking."
- hackable = FALSE
+ desc = "It produces items using metal and glass. This model was reprogrammed without some of the more hazardous designs."
circuit = /obj/item/circuitboard/machine/autolathe/secure
stored_research = /datum/techweb/specialized/autounlocking/autolathe/public
base_print_speed = 20
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 1766391709..b6af0600e4 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -48,8 +48,7 @@
if(2)
// State 2
if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = W
- if(C.use(2))
+ if(W.use_tool(src, user, 0, 2))
to_chat(user, "You add wires to the assembly.")
state = 3
else
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index b007bc0161..5ee8223625 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -83,7 +83,6 @@
if(istype(P, /obj/item/stack/cable_coil))
if(!P.tool_start_check(user, amount=5))
return
-
to_chat(user, "You start to add cables to the frame...")
if(P.use_tool(src, user, 20, volume=50, amount=5))
to_chat(user, "You add cables to the frame.")
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 1b83bb4b96..28b9796bb6 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -400,12 +400,11 @@
"You begin adding wires to [src]...")
playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1)
if(do_after(user, 60, target = src))
- if(constructionStep != CONSTRUCTION_GUTTED || B.get_amount() < 5 || !B)
+ if(constructionStep != CONSTRUCTION_GUTTED || !B.use_tool(src, user, 0, 5))
return
user.visible_message("[user] adds wires to [src].", \
"You wire [src].")
playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1)
- B.use(5)
constructionStep = CONSTRUCTION_WIRES_EXPOSED
update_icon()
return
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index f4f308c490..4a0042e1da 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -205,11 +205,9 @@
return
if(1)
if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/coil = W
- if(coil.get_amount() < 5)
+ if(!W.use_tool(src, user, 0, 5))
to_chat(user, "You need more cable for this!")
else
- coil.use(5)
buildstage = 2
to_chat(user, "You wire \the [src].")
update_icon()
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index c26c66a55f..8545e6f35c 100755
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -114,7 +114,6 @@
add_fingerprint(user)
if(charging)
charging.update_icon()
- charging.forceMove(drop_location())
user.put_in_hands(charging)
/obj/machinery/recharger/attack_tk(mob/user)
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 34db7b0e08..6793d361b5 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -160,10 +160,7 @@
to_chat(user, "You need one length of cable to repair [src]!")
return
to_chat(user, "You begin to replace the wires...")
- if(do_after(user, 30, target = src))
- if(coil.get_amount() < 1)
- return
- coil.use(1)
+ if(W.use_tool(src, user, 30, 1))
obj_integrity = max_integrity
stat &= ~BROKEN
to_chat(user, "You repair \the [src].")
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index de1c035000..19b6d0a9bd 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -3,6 +3,46 @@
////////////////////////////////
/datum/component/construction/mecha
var/base_icon
+ var/looky_helpy = TRUE
+
+/datum/component/construction/mecha/examine(mob/user)
+ . = ..()
+ if(looky_helpy)
+ switch(steps[index]["key"])
+ if(TOOL_WRENCH)
+ . += "The mech could be wrenched into place."
+ if(TOOL_SCREWDRIVER)
+ . += "The mech could be screwed into place."
+ if(TOOL_WIRECUTTER)
+ . += "The mech wires could be trimmed into place."
+ if(/obj/item/stack/cable_coil)
+ . += "The mech could use some wiring."
+ if(/obj/item/circuitboard)
+ . += "The mech could use a type ofcircuitboard."
+ if(/obj/item/stock_parts/scanning_module)
+ . += "The mech could use a scanning stock part."
+ if(/obj/item/stock_parts/capacitor)
+ . += "The mech could use a power based stock part."
+ if(/obj/item/stock_parts/cell)
+ . += "The mech could use a power source."
+ if(/obj/item/stack/sheet/metal)
+ . += "The mech could use some sheets of metal."
+ if(/obj/item/stack/sheet/plasteel)
+ . += "The mech could use some sheets of strong steel."
+ if(/obj/item/bikehorn)
+ . += "HONK IT!."
+ if(/obj/item/clothing/mask/gas/clown_hat)
+ . += "GIVE IT CLOWN MAKEUP HONK!."
+ if(/obj/item/clothing/shoes/clown_shoes)
+ . += "GIVE IT GOOFY SHOES HONK HONK!."
+ if(/obj/item/mecha_parts/part)
+ . += "The mech could use a mech part."
+ if(/obj/item/stack/ore/bluespace_crystal)
+ . += "The mech could use a crystal of sorts."
+ if(/obj/item/assembly/signaler/anomaly)
+ . += "The mech could use a anomaly of sorts."
+ else
+ return
/datum/component/construction/mecha/spawn_result()
if(!result)
diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm
index 581283d339..53768fe9a9 100644
--- a/code/game/mecha/mecha_defense.dm
+++ b/code/game/mecha/mecha_defense.dm
@@ -220,8 +220,7 @@
return
else if(istype(W, /obj/item/stack/cable_coil))
if(state == 3 && (internal_damage & MECHA_INT_SHORT_CIRCUIT))
- var/obj/item/stack/cable_coil/CC = W
- if(CC.use(2))
+ if(W.use_tool(src, user, 0, 2))
clearInternalDamage(MECHA_INT_SHORT_CIRCUIT)
to_chat(user, "You replace the fused wires.")
else
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 63e73625e6..949ed050f5 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -132,6 +132,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/list/grind_results //A reagent list containing the reagents this item produces when ground up in a grinder - this can be an empty list to allow for reagent transferring only
var/list/juice_results //A reagent list containing blah blah... but when JUICED in a grinder!
+ ///Skills vars
+ //list of skill PATHS exercised when using this item. An associated bitfield can be set to indicate additional ways the skill is used by this specific item.
+ var/list/datum/skill/used_skills
+ var/skill_difficulty = THRESHOLD_COMPETENT //how difficult it's to use this item in general.
+ var/skill_gain = DEF_SKILL_GAIN //base skill value gain from using this item.
+
/obj/item/Initialize()
if (attack_verb)
@@ -783,7 +789,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
// Called when a mob tries to use the item as a tool.
// Handles most checks.
-/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks)
+/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks, skill_gain_mult = 1, max_level = INFINITY)
// No delay means there is no start message, and no reason to call tool_start_check before use_tool.
// Run the start check here so we wouldn't have to call it manually.
if(!delay && !tool_start_check(user, amount))
@@ -795,6 +801,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
play_tool_sound(target, volume)
if(delay)
+ if(user.mind && used_skills)
+ delay = user.mind.skill_holder.item_action_skills_mod(src, delay, skill_difficulty, SKILL_USE_TOOL, NONE, FALSE)
+
// Create a callback with checks that would be called every tick by do_after.
var/datum/callback/tool_check = CALLBACK(src, .proc/tool_check_callback, user, amount, extra_checks)
@@ -819,6 +828,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
if(delay >= MIN_TOOL_SOUND_DELAY)
play_tool_sound(target, volume)
+ if(user.mind && used_skills && skill_gain_mult)
+ for(var/skill in used_skills)
+ if(!(used_skills[skill] & SKILL_TRAINING_TOOL))
+ continue
+ user.mind.skill_holder.auto_gain_experience(skill, skill_gain*skill_gain_mult, GET_STANDARD_LVL(max_level))
+
return TRUE
// Called before use_tool if there is a delay, or by use_tool if there isn't.
diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm
index acd71c57ac..91dde2899d 100644
--- a/code/game/objects/items/grenades/chem_grenade.dm
+++ b/code/game/objects/items/grenades/chem_grenade.dm
@@ -97,8 +97,7 @@
to_chat(user, "You add [A] to the [initial(name)] assembly.")
else if(stage == EMPTY && istype(I, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = I
- if (C.use(1))
+ if (I.use_tool(src, user, 0, 1, max_level = JOB_SKILL_BASIC))
det_time = 50 // In case the cable_coil was removed and readded.
stage_change(WIRED)
to_chat(user, "You rig the [initial(name)] assembly.")
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 1e0a6ce6dc..8a4dfdf09f 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -118,7 +118,7 @@
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
custom_materials = list(/datum/material/iron=150, /datum/material/glass=75)
breakouttime = 300 //Deciseconds = 30s
- cuffsound = 'sound/weapons/cablecuff.ogg'
+ cuffsound = 'sound/weapons/cablecuff.ogg'
/obj/item/restraints/handcuffs/cable/attack_self(mob/user)
to_chat(user, "You start unwinding the cable restraints back into coil")
@@ -130,7 +130,7 @@
user.put_in_hands(coil)
coil.color = color
to_chat(user, "You unwind the cable restraints back into coil")
-
+
/obj/item/restraints/handcuffs/cable/red
color = "#ff0000"
@@ -225,7 +225,6 @@
/obj/item/restraints/handcuffs/fake/kinky
name = "kinky handcuffs"
desc = "Fake handcuffs meant for erotic roleplay."
- icon = 'modular_citadel/icons/obj/items_and_weapons.dmi'
icon_state = "handcuffgag"
item_state = "kinkycuff"
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index c2db529675..3504ed2f50 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -325,7 +325,7 @@
else
target.LAssailant = WEAKREF(user)
cooldown_check = world.time + cooldown
- user.adjustStaminaLossBuffered(getweight())//CIT CHANGE - makes swinging batons cost stamina
+ user.adjustStaminaLossBuffered(getweight(user, STAM_COST_BATON_MOB_MULT))
else
var/wait_desc = get_wait_description()
if(wait_desc)
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index adc4970175..19c15b309b 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -59,6 +59,9 @@
self_delay = 20
grind_results = list(/datum/reagent/medicine/styptic_powder = 10)
+/obj/item/stack/medical/bruise_pack/one
+ amount = 1
+
/obj/item/stack/medical/bruise_pack/heal(mob/living/M, mob/user)
if(M.stat == DEAD)
to_chat(user, " [M] is dead. You can not help [M.p_them()]!")
@@ -134,6 +137,9 @@
singular_name = "sterilized medical gauze"
self_delay = 5
+/obj/item/stack/medical/gauze/adv/one
+ amount = 1
+
/obj/item/stack/medical/gauze/cyborg
custom_materials = null
is_cyborg = 1
@@ -151,6 +157,9 @@
self_delay = 20
grind_results = list(/datum/reagent/medicine/silver_sulfadiazine = 10)
+/obj/item/stack/medical/ointment/one
+ amount = 1
+
/obj/item/stack/medical/ointment/heal(mob/living/M, mob/user)
if(M.stat == DEAD)
to_chat(user, " [M] is dead. You can not help [M.p_them()]!")
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index fa218c5caa..c34ad44d5c 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -69,7 +69,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
if (get_amount() < 1 || CC.get_amount() < 5)
to_chat(user, "You attach wire to the [name].")
var/obj/item/stack/light_w/new_tile = new(user.loc)
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index 0fc47f649a..231dcc80e7 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -163,7 +163,7 @@
if(status)
if(baton_stun(M, user, disarming))
user.do_attack_animation(M)
- user.adjustStaminaLossBuffered(getweight()) //CIT CHANGE - makes stunbatonning others cost stamina
+ user.adjustStaminaLossBuffered(getweight(user, STAM_COST_BATON_MOB_MULT))
else if(user.a_intent != INTENT_HARM) //they'll try to bash in the last proc.
M.visible_message("[user] has prodded [M] with [src]. Luckily it was off.", \
"[user] has prodded you with [src]. Luckily it was off")
@@ -232,11 +232,8 @@
/obj/item/melee/baton/stunsword
name = "stunsword"
desc = "not actually sharp, this sword is functionally identical to a stunbaton"
- icon = 'modular_citadel/icons/obj/stunsword.dmi'
icon_state = "stunsword"
item_state = "sword"
- lefthand_file = 'modular_citadel/icons/mob/inhands/stunsword_left.dmi'
- righthand_file = 'modular_citadel/icons/mob/inhands/stunsword_right.dmi'
/obj/item/melee/baton/stunsword/get_belt_overlay()
if(istype(loc, /obj/item/storage/belt/sabre))
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 9291b72467..722f6178bc 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -241,11 +241,13 @@
playsound(user, activation_sound, transform_volume, 1)
w_class = WEIGHT_CLASS_BULKY
AddElement(/datum/element/sword_point)
+ total_mass = total_mass_on
else
to_chat(user, "[deactivation_message]")
playsound(user, deactivation_sound, transform_volume, 1)
w_class = WEIGHT_CLASS_SMALL
RemoveElement(/datum/element/sword_point)
+ total_mass = initial(total_mass)
update_icon()
add_fingerprint(user)
@@ -287,9 +289,6 @@
else
return ..()
-/obj/item/toy/sword/getweight()
- return (active ? total_mass_on : total_mass) || w_class *1.25
-
/obj/item/toy/sword/cx
name = "\improper DX Non-Euplastic LightSword"
desc = "A deluxe toy replica of an energy sword. Realistic visuals and sounds! Ages 8 and up."
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index 3e35c12314..1090bae9f8 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -131,7 +131,7 @@
if(C.get_amount() >= 5)
playsound(loc, 'sound/items/deconstruct.ogg', 50, 1)
to_chat(user, "You start to add cables to the frame...")
- if(do_after(user, 20, target = src) && state == SCREWED_CORE && C.use(5))
+ if(do_after(user, 20, target = src) && state == SCREWED_CORE && C.use_tool(src, user, 0, 5))
to_chat(user, "You add cables to the frame.")
state = CABLED_CORE
update_icon()
diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm
index d2fff9649d..821409c26b 100644
--- a/code/game/objects/structures/barsigns.dm
+++ b/code/game/objects/structures/barsigns.dm
@@ -84,7 +84,6 @@
panel_open = FALSE
else if(istype(I, /obj/item/stack/cable_coil) && panel_open)
- var/obj/item/stack/cable_coil/C = I
if(obj_flags & EMAGGED) //Emagged, not broken by EMP
to_chat(user, "Sign has been damaged beyond repair!")
return
@@ -92,7 +91,7 @@
to_chat(user, "This sign is functioning properly!")
return
- if(C.use(2))
+ if(I.use_tool(src, user, 0, 2))
to_chat(user, "You replace the burnt wiring.")
broken = FALSE
else
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 04c3909696..4544cab3da 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -169,8 +169,7 @@
if(do_after(user, 40, target = src))
if(!src || !anchored || src.state != "01")
return
- var/obj/item/stack/cable_coil/CC = W
- if(!CC.use(1))
+ if(!W.use_tool(src, user, 0, 1))
to_chat(user, "You need more cable to do this!")
return
to_chat(user, "You wire the windoor.")
diff --git a/code/modules/antagonists/abductor/equipment/glands/trauma.dm b/code/modules/antagonists/abductor/equipment/glands/trauma.dm
index b6280ec017..103d09d444 100644
--- a/code/modules/antagonists/abductor/equipment/glands/trauma.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/trauma.dm
@@ -10,9 +10,9 @@
/obj/item/organ/heart/gland/trauma/activate()
to_chat(owner, "You feel a spike of pain in your head.")
if(prob(33))
- owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
+ owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_SURGERY))
else
if(prob(20))
- owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
+ owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_SURGERY))
else
- owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
\ No newline at end of file
+ owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_SURGERY))
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm
similarity index 100%
rename from modular_citadel/code/modules/arousal/arousal.dm
rename to code/modules/arousal/arousal.dm
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm
similarity index 100%
rename from modular_citadel/code/modules/arousal/genitals.dm
rename to code/modules/arousal/genitals.dm
diff --git a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm b/code/modules/arousal/genitals_sprite_accessories.dm
similarity index 85%
rename from modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm
rename to code/modules/arousal/genitals_sprite_accessories.dm
index 1cea2dd916..1140a1d3ec 100644
--- a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm
+++ b/code/modules/arousal/genitals_sprite_accessories.dm
@@ -9,7 +9,7 @@
//DICKS,COCKS,PENISES,WHATEVER YOU WANT TO CALL THEM
/datum/sprite_accessory/penis
- icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi'
+ icon = 'icons/obj/genitals/penis_onmob.dmi'
name = "penis" //the preview name of the accessory
color_src = "cock_color"
alt_aroused = TRUE
@@ -22,13 +22,13 @@
/datum/sprite_accessory/penis/knotted
icon_state = "knotted"
name = "Knotted"
- taur_icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi'
+ taur_icon = 'icons/obj/genitals/taur_penis_onmob.dmi'
taur_dimension_x = 64
/datum/sprite_accessory/penis/flared
icon_state = "flared"
name = "Flared"
- taur_icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi'
+ taur_icon = 'icons/obj/genitals/taur_penis_onmob.dmi'
taur_dimension_x = 64
/datum/sprite_accessory/penis/barbknot
@@ -38,7 +38,7 @@
/datum/sprite_accessory/penis/tapered
icon_state = "tapered"
name = "Tapered"
- taur_icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi'
+ taur_icon = 'icons/obj/genitals/taur_penis_onmob.dmi'
taur_dimension_x = 64
/datum/sprite_accessory/penis/tentacle
@@ -55,7 +55,7 @@
//Testicles
/datum/sprite_accessory/testicles
- icon = 'modular_citadel/icons/obj/genitals/testicles_onmob.dmi'
+ icon = 'icons/obj/genitals/testicles_onmob.dmi'
icon_state = "testicle"
name = "testicle" //the preview name of the accessory
color_src = "balls_color"
@@ -66,7 +66,7 @@
//Vaginas
/datum/sprite_accessory/vagina
- icon = 'modular_citadel/icons/obj/genitals/vagina_onmob.dmi'
+ icon = 'icons/obj/genitals/vagina_onmob.dmi'
name = "vagina"
color_src = "vag_color"
alt_aroused = TRUE
@@ -104,7 +104,7 @@
//BREASTS BE HERE
/datum/sprite_accessory/breasts
- icon = 'modular_citadel/icons/obj/genitals/breasts_onmob.dmi'
+ icon = 'icons/obj/genitals/breasts_onmob.dmi'
name = "breasts"
color_src = "breasts_color"
diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/code/modules/arousal/organs/breasts.dm
similarity index 98%
rename from modular_citadel/code/modules/arousal/organs/breasts.dm
rename to code/modules/arousal/organs/breasts.dm
index 213ebb049a..0989966638 100644
--- a/modular_citadel/code/modules/arousal/organs/breasts.dm
+++ b/code/modules/arousal/organs/breasts.dm
@@ -5,7 +5,7 @@
name = "breasts"
desc = "Female milk producing organs."
icon_state = "breasts"
- icon = 'modular_citadel/icons/obj/genitals/breasts.dmi'
+ icon = 'icons/obj/genitals/breasts.dmi'
zone = BODY_ZONE_CHEST
slot = ORGAN_SLOT_BREASTS
size = BREASTS_SIZE_DEF // "c". Refer to the breast_values static list below for the cups associated number values
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/code/modules/arousal/organs/penis.dm
similarity index 97%
rename from modular_citadel/code/modules/arousal/organs/penis.dm
rename to code/modules/arousal/organs/penis.dm
index e1b8dc0dba..7b20c0e7ce 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/code/modules/arousal/organs/penis.dm
@@ -2,7 +2,7 @@
name = "penis"
desc = "A male reproductive organ."
icon_state = "penis"
- icon = 'modular_citadel/icons/obj/genitals/penis.dmi'
+ icon = 'icons/obj/genitals/penis.dmi'
zone = BODY_ZONE_PRECISE_GROIN
slot = ORGAN_SLOT_PENIS
masturbation_verb = "stroke"
diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/code/modules/arousal/organs/testicles.dm
similarity index 97%
rename from modular_citadel/code/modules/arousal/organs/testicles.dm
rename to code/modules/arousal/organs/testicles.dm
index 5fb1c75ad0..bfb5c99a55 100644
--- a/modular_citadel/code/modules/arousal/organs/testicles.dm
+++ b/code/modules/arousal/organs/testicles.dm
@@ -2,7 +2,7 @@
name = "testicles"
desc = "A male reproductive organ."
icon_state = "testicles"
- icon = 'modular_citadel/icons/obj/genitals/testicles.dmi'
+ icon = 'icons/obj/genitals/testicles.dmi'
zone = BODY_ZONE_PRECISE_GROIN
slot = ORGAN_SLOT_TESTICLES
size = BALLS_SIZE_MIN
diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/code/modules/arousal/organs/vagina.dm
similarity index 97%
rename from modular_citadel/code/modules/arousal/organs/vagina.dm
rename to code/modules/arousal/organs/vagina.dm
index cdc7dc4927..5c8bbeea98 100644
--- a/modular_citadel/code/modules/arousal/organs/vagina.dm
+++ b/code/modules/arousal/organs/vagina.dm
@@ -1,7 +1,7 @@
/obj/item/organ/genital/vagina
name = "vagina"
desc = "A female reproductive organ."
- icon = 'modular_citadel/icons/obj/genitals/vagina.dmi'
+ icon = 'icons/obj/genitals/vagina.dmi'
icon_state = ORGAN_SLOT_VAGINA
zone = BODY_ZONE_PRECISE_GROIN
slot = "vagina"
diff --git a/modular_citadel/code/modules/arousal/organs/womb.dm b/code/modules/arousal/organs/womb.dm
similarity index 84%
rename from modular_citadel/code/modules/arousal/organs/womb.dm
rename to code/modules/arousal/organs/womb.dm
index 7f91310e3e..386f407a26 100644
--- a/modular_citadel/code/modules/arousal/organs/womb.dm
+++ b/code/modules/arousal/organs/womb.dm
@@ -1,7 +1,7 @@
/obj/item/organ/genital/womb
name = "womb"
desc = "A female reproductive organ."
- icon = 'modular_citadel/icons/obj/genitals/vagina.dmi'
+ icon = 'icons/obj/genitals/vagina.dmi'
icon_state = "womb"
zone = BODY_ZONE_PRECISE_GROIN
slot = ORGAN_SLOT_WOMB
diff --git a/modular_citadel/code/modules/arousal/toys/dildos.dm b/code/modules/arousal/toys/dildos.dm
similarity index 98%
rename from modular_citadel/code/modules/arousal/toys/dildos.dm
rename to code/modules/arousal/toys/dildos.dm
index 58245c0c5f..5cb6d47118 100644
--- a/modular_citadel/code/modules/arousal/toys/dildos.dm
+++ b/code/modules/arousal/toys/dildos.dm
@@ -4,7 +4,7 @@
/obj/item/dildo
name = "dildo"
desc = "Floppy!"
- icon = 'modular_citadel/icons/obj/genitals/dildo.dmi'
+ icon = 'icons/obj/genitals/dildo.dmi'
force = 0
hitsound = 'sound/weapons/tap.ogg'
throwforce = 0
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index a4617462fe..0838c7b091 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -786,9 +786,8 @@
return
user.visible_message("[user.name] wires the air alarm.", \
"You start wiring the air alarm...")
- if (do_after(user, 20, target = src))
- if (cable.get_amount() >= 5 && buildstage == 1)
- cable.use(5)
+ if (W.use_tool(src, user, 20, 5))
+ if (buildstage == 1)
to_chat(user, "You wire the air alarm.")
wires.repair()
aidisabled = 0
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 9c96223a6f..764b50de8c 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -42,6 +42,7 @@
desc = "You put the cake on your head. Brilliant."
icon_state = "hardhat0_cakehat"
item_state = "hardhat0_cakehat"
+ hat_type = "cakehat"
hitsound = 'sound/weapons/tap.ogg'
flags_inv = HIDEEARS|HIDEHAIR
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index 24235bcbdf..e0ecf24204 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -32,7 +32,7 @@
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
if((has_sensor == BROKEN_SENSORS) && istype(I, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = I
- C.use(1)
+ I.use_tool(src, user, 0, 1)
has_sensor = HAS_SENSORS
to_chat(user,"You repair the suit sensors on [src] with [C].")
return 1
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index c7c74fb560..a612bfaa54 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -57,7 +57,6 @@
/obj/item/reagent_containers/food/snacks/sushi_basic
name = "funa hosomaki"
desc = "A small cylindrical kudzu skin, filled with rice and fish."
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "sushie_basic"
bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 4)
@@ -69,7 +68,6 @@
/obj/item/reagent_containers/food/snacks/sushi_adv
name = "funa nigiri"
desc = "A peace of carp lightly placed on some rice."
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "sushie_adv"
bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 6)
@@ -81,7 +79,6 @@
/obj/item/reagent_containers/food/snacks/sushi_pro
name = "funa nigiri"
desc = "A well prepared peace of the best of the carp fillet placed on rice. Looks fancy and fresh!"
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "sushie_pro"
bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2)
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index 6feb2df524..2463ed3ced 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -215,7 +215,6 @@
/obj/item/reagent_containers/food/snacks/tobiko
name = "tobiko"
desc = "Spider eggs wrapped in a thin salted Kudzu pod"
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "sushie_egg"
list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2)
filling_color = "#FF3333" // R225 G051 B051
@@ -558,7 +557,6 @@
/obj/item/reagent_containers/food/snacks/riceball
name = "onigiri"
desc = "A ball of rice with some light salt and a wrap of Kudzu skin."
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "riceball"
list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/sodiumchloride = 2)
tastes = list("rice" = 3, "salt" = 1)
diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
index 3cc4cfe63f..9096429228 100644
--- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
+++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
@@ -136,7 +136,6 @@
/obj/item/reagent_containers/food/snacks/tuna_sandwich
name = "tuna sandwich"
desc = "Both a salad and a sandwich in one."
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "tunasandwich"
trash = /obj/item/trash/plate
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
diff --git a/code/modules/food_and_drinks/food/snacks_sushi.dm b/code/modules/food_and_drinks/food/snacks_sushi.dm
index d16ca79001..3757759daf 100644
--- a/code/modules/food_and_drinks/food/snacks_sushi.dm
+++ b/code/modules/food_and_drinks/food/snacks_sushi.dm
@@ -3,7 +3,6 @@
/obj/item/reagent_containers/food/snacks/sushi_rice
name = "Sushi Rice"
desc = "A bowl of sticky rice for making sushi."
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "sushi_rice"
list_reagents = list(/datum/reagent/consumable/sodiumchloride = 5)
tastes = list("rice" = 5, "salt" = 1)
@@ -12,7 +11,6 @@
/obj/item/reagent_containers/food/snacks/sea_weed
name = "Sea Weed Sheet"
desc = "A thin, light salt sheet of plant mater. This is commenly used in sushi recipes,"
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "sea_weed"
list_reagents = list(/datum/reagent/consumable/sodiumchloride = 2)
tastes = list("plants" = 2, "salt" = 1)
@@ -21,7 +19,6 @@
/obj/item/reagent_containers/food/snacks/tuna
name = "Canned Tuna"
desc = "A small can of tuna fish beloved by felines."
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "tuna_can"
//trash = /obj/item/trash/tuna_used //I dont know if I like this idea - A Masked Cat
list_reagents = list(/datum/reagent/consumable/sodiumchloride = 5, /datum/reagent/mercury = 2)
@@ -32,7 +29,6 @@
/obj/item/reagent_containers/food/snacks/sushie_basic
name = "Funa Hosomaki"
desc = "A small cylindrical filled with rice and fish."
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "sushie_basic"
bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 1)
@@ -44,7 +40,6 @@
/obj/item/reagent_containers/food/snacks/sushie_adv
name = "Funa Nigiri"
desc = "A pice of carp lightly placed on some rice."
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "sushie_adv"
bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 2)
@@ -56,7 +51,6 @@
/obj/item/reagent_containers/food/snacks/sushie_pro
name = "Funa Nigiri"
desc = "A well prepared pice of the best of the carp fillet placed on rice. Looks fancy and fresh!"
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "sushie_pro"
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1)
@@ -68,7 +62,6 @@
/obj/item/reagent_containers/food/snacks/tobiko
name = "Tobiko"
desc = "Spider eggs wrapped in a thin salted Kudzu pod"
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "sushie_egg"
list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2)
filling_color = "#FF3333" // R225 G051 B051
@@ -78,7 +71,6 @@
/obj/item/reagent_containers/food/snacks/riceball
name = "Onigiri"
desc = "A ball of rice with some light salt and a wrap of Kudzu skin."
- icon = 'modular_citadel/icons/obj/food/food.dmi'
icon_state = "riceball"
list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sodiumchloride = 2)
tastes = list("rice" = 4, "salt" = 1)
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index ef2eff707f..b18f4396d6 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -392,8 +392,7 @@
/datum/plant_gene/trait/battery/on_attackby(obj/item/reagent_containers/food/snacks/grown/G, obj/item/I, mob/user)
if(istype(I, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = I
- if(C.use(5))
+ if(I.use_tool(src, user, 0, 5, max_level = JOB_SKILL_EXPERT))
to_chat(user, "You add some cable to [G] and slide it inside the battery encasing.")
var/obj/item/stock_parts/cell/potato/pocell = new /obj/item/stock_parts/cell/potato(user.loc)
pocell.icon_state = G.icon_state
diff --git a/code/modules/instruments/instruments/item.dm b/code/modules/instruments/instruments/item.dm
index fa3e75e431..dde35a9f75 100644
--- a/code/modules/instruments/instruments/item.dm
+++ b/code/modules/instruments/instruments/item.dm
@@ -66,6 +66,11 @@
/obj/item/instrument/proc/is_tuned()
return tune_time_left > 0
+/obj/item/instrument/dropped(mob/user)
+ . = ..()
+ if((loc != user) && (user.machine == src))
+ user.set_machine(null)
+
/obj/item/instrument/interact(mob/user)
ui_interact(user)
diff --git a/code/modules/instruments/songs/_song.dm b/code/modules/instruments/songs/_song.dm
index 30d8b7b3a7..0fb4418a30 100644
--- a/code/modules/instruments/songs/_song.dm
+++ b/code/modules/instruments/songs/_song.dm
@@ -222,7 +222,9 @@
tempo = sanitize_tempo(600 / bpm)
/// Updates the window for our user. Override in subtypes.
-/datum/song/proc/updateDialog(mob/user)
+/datum/song/proc/updateDialog(mob/user = usr)
+ if(user.machine != src)
+ return
ui_interact(user)
/datum/song/process(wait)
@@ -277,8 +279,10 @@
// subtype for handheld instruments, like violin
/datum/song/handheld
-/datum/song/handheld/updateDialog(mob/user)
- parent.ui_interact(user || usr)
+/datum/song/handheld/updateDialog(mob/user = usr)
+ if(user.machine != src)
+ return
+ parent.ui_interact(user)
/datum/song/handheld/should_stop_playing(mob/user)
. = ..()
@@ -290,8 +294,10 @@
// subtype for stationary structures, like pianos
/datum/song/stationary
-/datum/song/stationary/updateDialog(mob/user)
- parent.ui_interact(user || usr)
+/datum/song/stationary/updateDialog(mob/user = usr)
+ if(user.machine != src)
+ return
+ parent.ui_interact(user)
/datum/song/stationary/should_stop_playing(mob/user)
. = ..()
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index e40c278e92..e10f009cec 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -174,7 +174,7 @@
if(!starting_skills)
return
for(var/skill in starting_skills)
- M.skill_holder.boost_skill_value_to(skill, starting_skills[skill])
+ M.skill_holder.boost_skill_value_to(skill, starting_skills[skill], TRUE) //silent
// do wipe affinities though
M.skill_holder.skill_affinities = list()
for(var/skill in skill_affinities)
diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm
index efe574ab66..1395b90b39 100644
--- a/code/modules/jobs/job_types/ai.dm
+++ b/code/modules/jobs/job_types/ai.dm
@@ -17,6 +17,8 @@
var/do_special_check = TRUE
threat = 5
+ starting_skills = list(/datum/skill/level/job/wiring = GET_STANDARD_LVL(JOB_SKILL_BASIC))
+
/datum/job/ai/equip(mob/living/carbon/human/H, visualsOnly, announce, latejoin, datum/outfit/outfit_override, client/preference_source = null)
if(visualsOnly)
CRASH("dynamic preview is unsupported")
diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm
index 66861033fd..42c6afaed8 100644
--- a/code/modules/jobs/job_types/atmospheric_technician.dm
+++ b/code/modules/jobs/job_types/atmospheric_technician.dm
@@ -17,6 +17,10 @@
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ENGINE,
ACCESS_ENGINE_EQUIP, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM)
+
+ starting_skills = list(/datum/skill/level/job/wiring = GET_STANDARD_LVL(JOB_SKILL_BASIC))
+ skill_affinities = list(/datum/skill/level/job/wiring = STARTING_SKILL_AFFINITY_WIRING_ENGI_ROBO)
+
display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN
threat = 0.5
diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm
index 0d70e872ac..bd4732f3c3 100644
--- a/code/modules/jobs/job_types/chief_engineer.dm
+++ b/code/modules/jobs/job_types/chief_engineer.dm
@@ -27,6 +27,9 @@
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT,
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
+ starting_skills = list(/datum/skill/level/job/wiring = GET_STANDARD_LVL(JOB_SKILL_TRAINED))
+ skill_affinities = list(/datum/skill/level/job/wiring = STARTING_SKILL_AFFINITY_WIRING_ENGI_ROBO)
+
display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity)
threat = 2
diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm
index f84bd0d8d6..d88d888aec 100644
--- a/code/modules/jobs/job_types/cyborg.dm
+++ b/code/modules/jobs/job_types/cyborg.dm
@@ -12,6 +12,8 @@
exp_requirements = 120
exp_type = EXP_TYPE_CREW
+ starting_skills = list(/datum/skill/level/job/wiring = GET_STANDARD_LVL(JOB_SKILL_BASIC))
+
display_order = JOB_DISPLAY_ORDER_CYBORG
/datum/job/cyborg/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, datum/outfit/outfit_override = null, client/preference_source = null)
diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm
index f9f1d20d3b..d9e891f057 100644
--- a/code/modules/jobs/job_types/roboticist.dm
+++ b/code/modules/jobs/job_types/roboticist.dm
@@ -16,6 +16,10 @@
access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS)
minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
+ starting_skills = list(/datum/skill/level/job/wiring = GET_STANDARD_LVL(JOB_SKILL_TRAINED))
+ skill_affinities = list(/datum/skill/level/job/wiring = STARTING_SKILL_AFFINITY_WIRING_ENGI_ROBO)
+
+
display_order = JOB_DISPLAY_ORDER_ROBOTICIST
threat = 1
diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm
index 66ddc90e9b..c5280d72db 100644
--- a/code/modules/jobs/job_types/station_engineer.dm
+++ b/code/modules/jobs/job_types/station_engineer.dm
@@ -18,6 +18,9 @@
minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
+ starting_skills = list(/datum/skill/level/job/wiring = GET_STANDARD_LVL(JOB_SKILL_TRAINED))
+ skill_affinities = list(/datum/skill/level/job/wiring = STARTING_SKILL_AFFINITY_WIRING_ENGI_ROBO)
+
display_order = JOB_DISPLAY_ORDER_STATION_ENGINEER
threat = 1
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 183b4812f2..e85d4a2e75 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -363,12 +363,11 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
/obj/item/coin/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/CC = W
if(string_attached)
to_chat(user, "There already is a string attached to this coin!")
return
- if (CC.use(1))
+ if (W.use_tool(src, user, 0, 1, max_level = JOB_SKILL_BASIC))
add_overlay("coin_string_overlay")
string_attached = 1
to_chat(user, "You attach a string to the coin.")
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 69c81229a7..821b432ea5 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -199,7 +199,7 @@
to_chat(src, "You set [I] down gently on the ground.")
return
- adjustStaminaLossBuffered(I.getweight()*2)//CIT CHANGE - throwing items shall be more tiring than swinging em. Doubly so.
+ adjustStaminaLossBuffered(I.getweight(src, STAM_COST_THROW_MULT, SKILL_THROW_STAM_COST))
if(thrown_thing)
visible_message("[src] has thrown [thrown_thing].")
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 9c4f0316b7..03bfd87376 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -9,7 +9,7 @@
if(istype(src.glasses, /obj/item/clothing/glasses)) //glasses
var/obj/item/clothing/glasses/GFP = src.glasses
number += GFP.flash_protect
-
+
if(istype(src.wear_mask, /obj/item/clothing/mask)) //mask
var/obj/item/clothing/mask/MFP = src.wear_mask
number += MFP.flash_protect
@@ -77,15 +77,13 @@
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded)
/mob/living/carbon/attacked_by(obj/item/I, mob/living/user)
- //CIT CHANGES START HERE - combatmode and resting checks
- var/totitemdamage = I.force
+ var/totitemdamage = pre_attacked_by(I, user)
if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
totitemdamage *= 0.5
if(!CHECK_MOBILITY(user, MOBILITY_STAND))
totitemdamage *= 0.5
if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
totitemdamage *= 1.5
- //CIT CHANGES END HERE
var/impacting_zone = (user == src)? check_zone(user.zone_selected) : ran_zone(user.zone_selected)
if((user != src) && (run_block(I, totitemdamage, "the [I]", ATTACK_TYPE_MELEE, I.armour_penetration, user, impacting_zone) & BLOCK_SUCCESS))
return FALSE
@@ -94,7 +92,7 @@
affecting = bodyparts[1]
SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting)
send_item_attack_message(I, user, affecting.name)
- I.do_stagger_action(src, user)
+ I.do_stagger_action(src, user, totitemdamage)
if(I.force)
apply_damage(totitemdamage, I.damtype, affecting) //CIT CHANGE - replaces I.force with totitemdamage
if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC)
diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm
index 7918e303e8..24eb5d7234 100644
--- a/code/modules/mob/living/carbon/human/dummy.dm
+++ b/code/modules/mob/living/carbon/human/dummy.dm
@@ -43,5 +43,6 @@ GLOBAL_LIST_EMPTY(dummy_mob_list)
return
var/mob/living/carbon/human/dummy/D = GLOB.human_dummy_list[slotnumber]
if(istype(D))
+ D.set_species(/datum/species/human,icon_update = TRUE, pref_load = TRUE) //for some fucking reason, if you don't change the species every time, some species will dafault certain things when it's their own species on the mannequin two times in a row, like lizards losing spines and tails setting to smooth. If you can find a fix for this that isn't this, good on you
D.wipe_state()
D.in_use = FALSE
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index aeab0042ac..42a1c8cb66 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1668,9 +1668,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
disarm(M, H, attacker_style)
/datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
+ var/totitemdamage = H.pre_attacked_by(I, user)
// Allows you to put in item-specific reactions based on species
if(user != H)
- if(H.run_block(I, I.force, "the [I.name]", ATTACK_TYPE_MELEE, I.armour_penetration, user, affecting.body_zone) & BLOCK_SUCCESS)
+ if(H.run_block(I, totitemdamage, "the [I.name]", ATTACK_TYPE_MELEE, I.armour_penetration, user, affecting.body_zone) & BLOCK_SUCCESS)
return 0
if(H.check_martial_melee_block())
H.visible_message("[H] blocks [I]!")
@@ -1686,24 +1687,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/armor_block = H.run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].",I.armour_penetration)
armor_block = min(90,armor_block) //cap damage reduction at 90%
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
- //CIT CHANGES START HERE - combatmode and resting checks
- var/totitemdamage = I.force
- if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
- totitemdamage *= 0.5
- if(!CHECK_MOBILITY(user, MOBILITY_STAND))
- totitemdamage *= 0.5
- if(istype(H))
- if(!(H.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
- totitemdamage *= 1.5
- //CIT CHANGES END HERE
var/weakness = H.check_weakness(I, user)
apply_damage(totitemdamage * weakness, I.damtype, def_zone, armor_block, H) //CIT CHANGE - replaces I.force with totitemdamage
H.send_item_attack_message(I, user, hit_area)
- I.do_stagger_action(H, user)
+ I.do_stagger_action(H, user, totitemdamage)
- if(!I.force)
+ if(!totitemdamage)
return 0 //item force is zero
//dismemberment
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index b389e386d4..508dc67dd7 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -427,24 +427,23 @@
else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed)
user.changeNext_move(CLICK_CD_MELEE)
- var/obj/item/stack/cable_coil/coil = W
if (getFireLoss() > 0 || getToxLoss() > 0)
- if(src == user && coil.use(1))
+ if(src == user)
to_chat(user, "You start fixing yourself...")
- if(!do_after(user, 50, target = src))
+ if(!W.use_tool(src, user, 50, 1, max_level = JOB_SKILL_TRAINED))
+ to_chat(user, "You need more cable to repair [src]!")
return
adjustFireLoss(-10)
adjustToxLoss(-10)
- if (coil.use(1))
+ else
to_chat(user, "You start fixing [src]...")
- if(!do_after(user, 30, target = src))
+ if(!W.use_tool(src, user, 30, 1))
+ to_chat(user, "You need more cable to repair [src]!")
return
adjustFireLoss(-30)
adjustToxLoss(-30)
updatehealth()
user.visible_message("[user] has fixed some of the burnt wires on [src].", "You fix some of the burnt wires on [src].")
- else
- to_chat(user, "You need more cable to repair [src]!")
else
to_chat(user, "The wires seem fine, there's no need to fix them.")
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 6c4680a477..08fffc2cf8 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -147,9 +147,8 @@
to_chat(user, "You need one length of cable to wire the ED-209!")
return
to_chat(user, "You start to wire [src]...")
- if(do_after(user, 40, target = src))
- if(coil.get_amount() >= 1 && build_step == 6)
- coil.use(1)
+ if(coil.use_tool(src, user, 40, 1))
+ if(build_step == 6)
to_chat(user, "You wire [src].")
name = "wired ED-209 assembly"
build_step++
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 1297fddb69..7d41068020 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -87,7 +87,6 @@
pass_flags = PASSMOB
mob_size = MOB_SIZE_SMALL
collar_type = "kitten"
- held_icon = "cat"
//RUNTIME IS ALIVE! SQUEEEEEEEE~
/mob/living/simple_animal/pet/cat/Runtime
@@ -99,6 +98,7 @@
gender = FEMALE
gold_core_spawnable = NO_SPAWN
unique_pet = TRUE
+ held_icon = "cat"
var/list/family = list()//var restored from savefile, has count of each child type
var/list/children = list()//Actual mob instances of children
var/cats_deployed = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm
index e00ec9fe25..7b9abd2b13 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm
@@ -9,7 +9,7 @@
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
speak_emote = list("telepathically cries")
- speed = 2
+ speed = 1
move_to_delay = 2
projectiletype = /obj/item/projectile/temp/basilisk/ice
projectilesound = 'sound/weapons/pierce.ogg'
@@ -25,8 +25,8 @@
melee_damage_upper = 15
attacktext = "slices"
attack_sound = 'sound/weapons/bladeslice.ogg'
- vision_range = 9
- aggro_vision_range = 9
+ vision_range = 7
+ aggro_vision_range = 7
move_force = MOVE_FORCE_VERY_STRONG
move_resist = MOVE_FORCE_VERY_STRONG
pull_force = MOVE_FORCE_VERY_STRONG
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index b5dc25e4dc..ce3b8bf3d2 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -593,7 +593,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
stat("Failsafe Controller:", "ERROR")
if(Master)
stat(null)
- for(var/datum/controller/subsystem/SS in Master.subsystems)
+ for(var/datum/controller/subsystem/SS in Master.statworthy_subsystems)
SS.stat_entry()
GLOB.cameranet.stat_entry()
if(statpanel("Tickets"))
diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm
index 744db1572f..37f3fc434e 100644
--- a/code/modules/modular_computers/hardware/_hardware.dm
+++ b/code/modules/modular_computers/hardware/_hardware.dm
@@ -41,11 +41,10 @@
// Cable coil. Works as repair method, but will probably require multiple applications and more cable.
if(istype(I, /obj/item/stack/cable_coil))
- var/obj/item/stack/S = I
if(obj_integrity == max_integrity)
to_chat(user, "\The [src] doesn't seem to require repairs.")
return 1
- if(S.use(1))
+ if(I.use_tool(src, user, 0, 1))
to_chat(user, "You patch up \the [src] with a bit of \the [I].")
obj_integrity = min(obj_integrity + 10, max_integrity)
return 1
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index c2cdf1da8b..93fa7149bd 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -597,19 +597,15 @@
user.visible_message("[user.name] adds cables to the APC frame.", \
"You start adding cables to the APC frame...")
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src))
- if (C.get_amount() < 10 || !C)
+ if(C.use_tool(src, user, 20, 10) && !terminal && opened && has_electronics)
+ var/turf/T = get_turf(src)
+ var/obj/structure/cable/N = T.get_cable_node()
+ if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE))
+ do_sparks(5, TRUE, src)
return
- if (C.get_amount() >= 10 && !terminal && opened && has_electronics)
- var/turf/T = get_turf(src)
- var/obj/structure/cable/N = T.get_cable_node()
- if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE))
- do_sparks(5, TRUE, src)
- return
- C.use(10)
- to_chat(user, "You add cables to the APC frame.")
- make_terminal()
- terminal.connect_to_network()
+ to_chat(user, "You add cables to the APC frame.")
+ make_terminal()
+ terminal.connect_to_network()
else if (istype(W, /obj/item/electronics/apc) && opened)
if (has_electronics)
to_chat(user, "There is already a board inside the [src]!")
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 239b38460c..3d8e35935f 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -510,6 +510,7 @@ By design, d1 is the smallest direction and d2 is the highest
full_w_class = WEIGHT_CLASS_SMALL
grind_results = list(/datum/reagent/copper = 2) //2 copper per cable in the coil
usesound = 'sound/items/deconstruct.ogg'
+ used_skills = list(/datum/skill/level/job/wiring)
/obj/item/stack/cable_coil/cyborg
is_cyborg = 1
@@ -591,8 +592,6 @@ By design, d1 is the smallest direction and d2 is the highest
amount += extra
update_icon()
-
-
///////////////////////////////////////////////
// Cable laying procedures
//////////////////////////////////////////////
diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm
index 9fb1a1ce7d..e0b3f5f316 100644
--- a/code/modules/power/floodlight.dm
+++ b/code/modules/power/floodlight.dm
@@ -15,8 +15,7 @@
state = FLOODLIGHT_NEEDS_WIRES
desc = "A bare metal frame looking vaguely like a floodlight. Requires wiring."
else if(istype(O, /obj/item/stack/cable_coil) && (state == FLOODLIGHT_NEEDS_WIRES))
- var/obj/item/stack/S = O
- if(S.use(5))
+ if(O.use_tool(src, user, 0, 5))
to_chat(user, "You wire [src].")
name = "wired [name]"
desc = "A bare metal frame looking vaguely like a floodlight. Requires securing with a screwdriver."
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 7ad9f3a6ce..181df7b07c 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -118,8 +118,7 @@
return
if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/coil = W
- if(coil.use(1))
+ if(W.use_tool(src, user, 0, 1, max_level = JOB_SKILL_TRAINED))
icon_state = "[fixture_type]-construct-stage2"
stage = 2
user.visible_message("[user.name] adds wires to [src].", \
@@ -193,7 +192,7 @@
var/on = FALSE // 1 if on, 0 if off
var/on_gs = FALSE
var/static_power_used = 0
- var/brightness = 11 // luminosity when on, also used in power calculation
+ var/brightness = 9 // luminosity when on, also used in power calculation
var/bulb_power = 0.75 // basically the alpha of the emitted light source
var/bulb_colour = "#FFF6ED" // befault colour of the light.
var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN
@@ -232,7 +231,8 @@
icon_state = "bulb"
base_state = "bulb"
fitting = "bulb"
- brightness = 6
+ brightness = 5
+ nightshift_brightness = 4
bulb_colour = "#FFDDBB"
desc = "A small lighting fixture."
light_type = /obj/item/light/bulb
@@ -274,11 +274,11 @@
spawn(2)
switch(fitting)
if("tube")
- brightness = 11
+ brightness = 9
if(prob(2))
break_light_tube(1)
if("bulb")
- brightness = 6
+ brightness = 5
if(prob(5))
break_light_tube(1)
spawn(1)
@@ -361,11 +361,11 @@
set_light(0)
update_icon()
- active_power_usage = (brightness * 7.2)
+ active_power_usage = (brightness * 10)
if(on != on_gs)
on_gs = on
if(on)
- static_power_used = brightness * 14.4 * (hijacked ? 2 : 1) //20W per unit luminosity
+ static_power_used = brightness * 20 * (hijacked ? 2 : 1) //20W per unit luminosity
addStaticPower(static_power_used, STATIC_LIGHT)
else
removeStaticPower(static_power_used, STATIC_LIGHT)
@@ -748,7 +748,7 @@
icon_state = "ltube"
base_state = "ltube"
item_state = "c_tube"
- brightness = 11
+ brightness = 9
/obj/item/light/tube/broken
status = LIGHT_BROKEN
@@ -761,7 +761,7 @@
item_state = "contvapour"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
- brightness = 6
+ brightness = 5
/obj/item/light/bulb/broken
status = LIGHT_BROKEN
@@ -830,7 +830,8 @@
icon = 'icons/obj/lighting.dmi'
base_state = "floor" // base description and icon_state
icon_state = "floor"
- brightness = 6
+ brightness = 5
+ nightshift_brightness = 4
layer = 2.5
light_type = /obj/item/light/bulb
fitting = "bulb"
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index 59792b6539..e33116b02c 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -79,8 +79,7 @@
construction_state = PA_CONSTRUCTION_UNSECURED
did_something = TRUE
else if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/CC = W
- if(CC.use(1))
+ if(W.use_tool(src, user, 0, 1))
user.visible_message("[user.name] adds wires to the [name].", \
"You add some wires.")
construction_state = PA_CONSTRUCTION_PANEL_OPEN
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index af83f7ebca..957ceb986f 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -288,8 +288,7 @@
construction_state = PA_CONSTRUCTION_UNSECURED
did_something = TRUE
else if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/CC = W
- if(CC.use(1))
+ if(W.use_tool(src, user, 0, 1))
user.visible_message("[user.name] adds wires to the [name].", \
"You add some wires.")
construction_state = PA_CONSTRUCTION_PANEL_OPEN
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 41ed28f0a5..85999707a2 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -125,15 +125,12 @@
to_chat(user, "You start building the power terminal...")
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src) && C.get_amount() >= 10)
- if(C.get_amount() < 10 || !C)
- return
+ if(C.use_tool(src, user, 20, 10))
var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one
if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) //animate the electrocution if uncautious and unlucky
do_sparks(5, TRUE, src)
return
- C.use(10)
user.visible_message(\
"[user.name] has built a power terminal.",\
"You build the power terminal.")
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index 594734c86a..8ebddaa24f 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -113,7 +113,7 @@
/obj/item/ammo_box/update_icon()
. = ..()
- desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!"
+ desc = "[initial(desc)] There [stored_ammo.len == 1 ? "is" : "are"] [stored_ammo.len] shell\s left!"
for (var/material in bullet_cost)
var/material_amount = bullet_cost[material]
material_amount = (material_amount*stored_ammo.len) + base_cost[material]
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 81ae026138..597c7203b4 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -121,3 +121,51 @@
icon_state = "foambox_riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
custom_materials = list(/datum/material/iron = 50000)
+
+//Shotgun clips
+/obj/item/ammo_box/shotgun
+ name = "stripper clip (shotgun shells)"
+ desc = "A stripper clip, designed to help with loading a shotgun slightly faster."
+ icon = 'icons/obj/ammo.dmi'
+ icon_state = "shotgunclip"
+ caliber = "shotgun" // slapped in to allow shell mix n match
+ ammo_type = /obj/item/ammo_casing/shotgun
+ max_ammo = 4
+ var/pixeloffsetx = 4
+ start_empty = TRUE
+
+/obj/item/ammo_box/shotgun/update_overlays()
+ . = ..()
+ if(stored_ammo.len)
+ var/offset = -4
+ for(var/A in stored_ammo)
+ var/obj/item/ammo_casing/shotgun/C = A
+ offset += pixeloffsetx
+ var/mutable_appearance/shell_overlay = mutable_appearance(icon, "[initial(C.icon_state)]-clip")
+ shell_overlay.pixel_x += offset
+ shell_overlay.appearance_flags = RESET_COLOR
+ . += shell_overlay
+
+/obj/item/ammo_box/shotgun/loaded
+ start_empty = FALSE
+
+/obj/item/ammo_box/shotgun/loaded/rubbershot
+ ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
+
+/obj/item/ammo_box/shotgun/loaded/buckshot
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+
+/obj/item/ammo_box/shotgun/loaded/beanbag
+ ammo_type = /obj/item/ammo_casing/shotgun/beanbag
+
+/obj/item/ammo_box/shotgun/loaded/stunslug
+ ammo_type = /obj/item/ammo_casing/shotgun/stunslug
+
+/obj/item/ammo_box/shotgun/loaded/techshell
+ ammo_type = /obj/item/ammo_casing/shotgun/techshell
+
+/obj/item/ammo_box/shotgun/loaded/incendiary
+ ammo_type = /obj/item/ammo_casing/shotgun/incendiary
+
+/obj/item/ammo_box/shotgun/loaded/dart
+ ammo_type = /obj/item/ammo_casing/shotgun/dart
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index b43ac3057a..afe2b9ca3e 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -331,8 +331,7 @@
/obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params)
..()
if(istype(A, /obj/item/stack/cable_coil) && !sawn_off)
- var/obj/item/stack/cable_coil/C = A
- if(C.use(10))
+ if(A.use_tool(src, user, 0, 10, max_level = JOB_SKILL_BASIC))
slot_flags = ITEM_SLOT_BACK
to_chat(user, "You tie the lengths of cable to the shotgun, making a sling.")
slung = TRUE
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 1e687816ff..54ec327fdb 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -211,7 +211,6 @@
/obj/structure/reagent_dispensers/keg
name = "keg"
desc = "A keg."
- icon = 'modular_citadel/icons/obj/objects.dmi'
icon_state = "keg"
/obj/structure/reagent_dispensers/keg/mead
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_construction.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_construction.dm
index ee9ee14e4a..f8cf5c1d84 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_construction.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_construction.dm
@@ -112,8 +112,8 @@
/datum/design/rcd_ammo_large
name = "Large Compressed Matter Cartridge"
id = "rcd_ammo_large"
- build_type = AUTOLATHE | PROTOLATHE
+ build_type = AUTOLATHE | PROTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 48000, /datum/material/glass = 32000)
build_path = /obj/item/rcd_ammo/large
- category = list("Tool Designs")
+ category = list("hacked", "Construction", "Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm
index b62f30e041..76ec6224b8 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm
@@ -8,7 +8,7 @@
/datum/design/kitchen_knife
name = "Kitchen Knife"
id = "kitchen_knife"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 12000)
build_path = /obj/item/kitchen/knife
category = list("initial","Dinnerware")
@@ -140,7 +140,7 @@
/datum/design/healthanalyzer
name = "Health Analyzer"
id = "healthanalyzer"
- build_type = AUTOLATHE | PROTOLATHE
+ build_type = AUTOLATHE | PROTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 500, /datum/material/glass = 50)
build_path = /obj/item/healthanalyzer
category = list("initial", "Medical")
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm
index 173240e196..20a5370793 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm
@@ -36,7 +36,7 @@
/datum/design/large_welding_tool
name = "Industrial Welding Tool"
id = "large_welding_tool"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 70, /datum/material/glass = 60)
build_path = /obj/item/weldingtool/largetank
category = list("hacked", "Tools")
@@ -44,7 +44,7 @@
/datum/design/flamethrower
name = "Flamethrower"
id = "flamethrower"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 500)
build_path = /obj/item/flamethrower/full
category = list("hacked", "Security")
@@ -52,7 +52,7 @@
/datum/design/rcd
name = "Rapid Construction Device (RCD)"
id = "rcd"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 30000)
build_path = /obj/item/construction/rcd
category = list("hacked", "Construction")
@@ -60,7 +60,7 @@
/datum/design/rpd
name = "Rapid Pipe Dispenser (RPD)"
id = "rpd"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 75000, /datum/material/glass = 37500)
build_path = /obj/item/pipe_dispenser
category = list("hacked", "Construction")
@@ -68,7 +68,7 @@
/datum/design/handcuffs
name = "Handcuffs"
id = "handcuffs"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 500)
build_path = /obj/item/restraints/handcuffs
category = list("hacked", "Security")
@@ -76,7 +76,7 @@
/datum/design/receiver
name = "Modular Receiver"
id = "receiver"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 15000)
build_path = /obj/item/weaponcrafting/receiver
category = list("hacked", "Security")
@@ -84,7 +84,7 @@
/datum/design/shotgun_slug
name = "Shotgun Slug"
id = "shotgun_slug"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 4000)
build_path = /obj/item/ammo_casing/shotgun
category = list("hacked", "Security")
@@ -92,7 +92,7 @@
/datum/design/buckshot_shell
name = "Buckshot Shell"
id = "buckshot_shell"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 4000)
build_path = /obj/item/ammo_casing/shotgun/buckshot
category = list("hacked", "Security")
@@ -100,7 +100,7 @@
/datum/design/shotgun_dart
name = "Shotgun Dart"
id = "shotgun_dart"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 4000)
build_path = /obj/item/ammo_casing/shotgun/dart
category = list("hacked", "Security")
@@ -108,7 +108,7 @@
/datum/design/incendiary_slug
name = "Incendiary Slug"
id = "incendiary_slug"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 4000)
build_path = /obj/item/ammo_casing/shotgun/incendiary
category = list("hacked", "Security")
@@ -116,7 +116,7 @@
/datum/design/riot_dart
name = "Foam Riot Dart"
id = "riot_dart"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 1125) //Discount for making individually - no box = less metal!
build_path = /obj/item/ammo_casing/caseless/foam_dart/riot
category = list("hacked", "Security")
@@ -124,7 +124,7 @@
/datum/design/riot_darts
name = "Foam Riot Dart Box"
id = "riot_darts"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 50000) //Comes with 40 darts
build_path = /obj/item/ammo_box/foambox/riot
category = list("hacked", "Security")
@@ -132,7 +132,7 @@
/datum/design/a357
name = "Revolver Bullet (.357)"
id = "a357"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 4000)
build_path = /obj/item/ammo_casing/a357
category = list("hacked", "Security")
@@ -140,7 +140,7 @@
/datum/design/a762
name = "Rifle Bullet (7.62mm)"
id = "a762"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 5000) //need seclathe for clips
build_path = /obj/item/ammo_casing/a762
category = list("hacked", "Security")
@@ -148,7 +148,7 @@
/datum/design/c10mm
name = "Ammo Box (10mm)"
id = "c10mm"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 30000)
build_path = /obj/item/ammo_box/c10mm
category = list("hacked", "Security")
@@ -156,7 +156,7 @@
/datum/design/c45
name = "Ammo Box (.45)"
id = "c45"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 30000)
build_path = /obj/item/ammo_box/c45
category = list("hacked", "Security")
@@ -164,7 +164,7 @@
/datum/design/c9mm
name = "Ammo Box (9mm)"
id = "c9mm"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 30000)
build_path = /obj/item/ammo_box/c9mm
category = list("hacked", "Security")
@@ -172,7 +172,7 @@
/datum/design/electropack
name = "Electropack"
id = "electropack"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 10000, /datum/material/glass = 2500)
build_path = /obj/item/electropack
category = list("hacked", "Security")
@@ -180,7 +180,7 @@
/datum/design/cleaver
name = "Butcher's Cleaver"
id = "cleaver"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 18000)
build_path = /obj/item/kitchen/knife/butcher
category = list("hacked", "Dinnerware")
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
index 8288ceff23..f6c31a9808 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
@@ -49,7 +49,7 @@
/datum/design/multitool
name = "Multitool"
id = "multitool"
- build_type = AUTOLATHE | PROTOLATHE
+ build_type = AUTOLATHE | PROTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 50, /datum/material/glass = 20)
build_path = /obj/item/multitool
category = list("initial","Tools","Tool Designs")
@@ -75,7 +75,7 @@
/datum/design/weldingtool
name = "Welding Tool"
id = "welding_tool"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
materials = list(/datum/material/iron = 70, /datum/material/glass = 20)
build_path = /obj/item/weldingtool
category = list("initial","Tools","Tool Designs")
@@ -97,6 +97,7 @@
build_path = /obj/item/screwdriver
category = list("initial","Tools","Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
+
/datum/design/wirecutters
name = "Wirecutters"
id = "wirecutters"
diff --git a/code/modules/research/designs/autoylathe_designs.dm b/code/modules/research/designs/autoylathe_designs.dm
index 0e572fee7a..c2076db121 100644
--- a/code/modules/research/designs/autoylathe_designs.dm
+++ b/code/modules/research/designs/autoylathe_designs.dm
@@ -562,6 +562,7 @@
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500)
build_path = /obj/item/gun/ballistic/automatic/x9/toy
category = list("initial", "Rifles")
+ build_type = TOYLATHE | NO_PUBLIC_LATHE
/datum/design/foam_dart
name = "Box of Foam Darts"
@@ -586,6 +587,7 @@
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500)
build_path = /obj/item/gun/ballistic/automatic/toy/magrifle
category = list("initial", "Rifles")
+ build_type = TOYLATHE | NO_PUBLIC_LATHE
/datum/design/foam_hyperburst
name = "MagTag Hyper Rifle"
@@ -618,6 +620,7 @@
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500)
build_path = /obj/item/gun/ballistic/automatic/AM4C
category = list("initial", "Rifles")
+ build_type = TOYLATHE | NO_PUBLIC_LATHE
/datum/design/foam_f3
name = "Replica F3 Justicar"
@@ -650,6 +653,7 @@
materials = list(/datum/material/plastic = 2000, /datum/material/iron = 250)
build_path = /obj/item/gun/ballistic/automatic/toy/unrestricted
category = list("initial", "Pistols")
+ build_type = TOYLATHE | NO_PUBLIC_LATHE
/datum/design/foam_pistol
name = "Foam Force Pistol"
@@ -698,6 +702,7 @@
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500)
build_path = /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted
category = list("hacked", "Rifles")
+ build_type = TOYLATHE | NO_PUBLIC_LATHE
/datum/design/foam_l6
name = "Donksoft LMG"
@@ -706,3 +711,4 @@
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500)
build_path = /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted
category = list("hacked", "Rifles")
+ build_type = TOYLATHE | NO_PUBLIC_LATHE
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 44b71a025f..93168e17c7 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -135,6 +135,15 @@
//Ammo Shells/
//////////////
+/datum/design/shell_clip
+ name = "stripper clip (shotgun shells)"
+ id = "sec_shellclip"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 5000)
+ build_path = /obj/item/ammo_box/shotgun
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
/datum/design/beanbag_slug/sec
id = "sec_beanbag"
build_type = PROTOLATHE
@@ -166,7 +175,7 @@
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/incendiary_slug/sec
- id = "sec_Islug"
+ id = "sec_islug"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm
index 70a1412b11..18307ce2c5 100644
--- a/code/modules/research/nanites/nanite_programs/healing.dm
+++ b/code/modules/research/nanites/nanite_programs/healing.dm
@@ -76,7 +76,8 @@
var/problems = FALSE
if(iscarbon(host_mob))
var/mob/living/carbon/C = host_mob
- if(length(C.get_traumas()))
+ var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN)
+ if(length(B?.get_traumas_type(TRAUMA_RESILIENCE_BASIC)))
problems = TRUE
if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN) > 0)
problems = TRUE
@@ -198,7 +199,8 @@
var/problems = FALSE
if(iscarbon(host_mob))
var/mob/living/carbon/C = host_mob
- if(length(C.get_traumas()))
+ var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN)
+ if(length(B?.get_traumas_type(TRAUMA_RESILIENCE_SURGERY)))
problems = TRUE
if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN) > 0)
problems = TRUE
@@ -208,7 +210,7 @@
host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2)
if(iscarbon(host_mob) && prob(10))
var/mob/living/carbon/C = host_mob
- C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_LOBOTOMY)
+ C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_SURGERY)
/datum/nanite_program/defib
name = "Defibrillation"
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 002bb3d64b..12e4557121 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -10,7 +10,7 @@
// Default research tech, prevents bricking
design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "desttagger", "handlabel", "packagewrap",
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
- "space_heater", "beaker", "large_beaker", "bucket", "xlarge_beaker", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
+ "space_heater", "beaker", "large_beaker", "bucket", "xlarge_beaker", "sec_shellclip", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_islug", "sec_dart", "sec_38", "sec_38lethal",
"rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass")
/datum/techweb_node/mmi
diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm
index a41e72b76d..2b2d11e54f 100644
--- a/code/modules/surgery/advanced/lobotomy.dm
+++ b/code/modules/surgery/advanced/lobotomy.dm
@@ -41,7 +41,7 @@
target.cure_all_traumas(TRAUMA_RESILIENCE_LOBOTOMY)
if(target.mind && target.mind.has_antag_datum(/datum/antagonist/brainwashed))
target.mind.remove_antag_datum(/datum/antagonist/brainwashed)
- switch(rand(1,4))//Now let's see what hopefully-not-important part of the brain we cut off
+ switch(rand(1,6))//Now let's see what hopefully-not-important part of the brain we cut off
if(1)
target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC)
if(2)
diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm
index a3f8b883b4..39e660203e 100644
--- a/code/modules/surgery/bodyparts/robot_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm
@@ -19,7 +19,7 @@
flags_1 = CONDUCT_1
icon_state = "borg_l_arm"
status = BODYPART_ROBOTIC
-
+
brute_reduction = 2
burn_reduction = 1
@@ -40,7 +40,7 @@
flags_1 = CONDUCT_1
icon_state = "borg_r_arm"
status = BODYPART_ROBOTIC
-
+
brute_reduction = 2
burn_reduction = 1
@@ -61,7 +61,7 @@
flags_1 = CONDUCT_1
icon_state = "borg_l_leg"
status = BODYPART_ROBOTIC
-
+
brute_reduction = 2
burn_reduction = 1
@@ -82,7 +82,7 @@
flags_1 = CONDUCT_1
icon_state = "borg_r_leg"
status = BODYPART_ROBOTIC
-
+
brute_reduction = 2
burn_reduction = 1
@@ -102,7 +102,7 @@
flags_1 = CONDUCT_1
icon_state = "borg_chest"
status = BODYPART_ROBOTIC
-
+
brute_reduction = 2
burn_reduction = 1
@@ -131,8 +131,7 @@
if(src.wired)
to_chat(user, "You have already inserted wire!")
return
- var/obj/item/stack/cable_coil/coil = W
- if (coil.use(1))
+ if (W.use_tool(src, user, 0, 1))
src.wired = 1
to_chat(user, "You insert the wire.")
else
@@ -164,7 +163,7 @@
flags_1 = CONDUCT_1
icon_state = "borg_head"
status = BODYPART_ROBOTIC
-
+
brute_reduction = 5
burn_reduction = 4
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index 7127b41ee3..f574b0aea3 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -58,10 +58,9 @@
return FALSE
if(tool)
speed_mod = tool.toolspeed
- var/skill_mod = 1
- if(user?.mind?.skill_holder)
- skill_mod = SURGERY_SKILL_SPEEDUP_NUMERICAL_SCALE(user.mind.skill_holder.get_skill_value(/datum/skill/numerical/surgery))
- if(do_after(user, time * speed_mod * skill_mod, target = target))
+ if(user.mind)
+ speed_mod = user.mind.skill_holder.action_skills_mod(/datum/skill/numerical/surgery, speed_mod, THRESHOLD_COMPETENT, FALSE)
+ if(do_after(user, time * speed_mod, target = target))
var/prob_chance = 100
if(implement_type) //this means it isn't a require hand or any item step.
prob_chance = implements[implement_type]
@@ -69,7 +68,7 @@
if((prob(prob_chance) || (iscyborg(user) && !silicons_obey_prob)) && chem_check(target) && !try_to_fail)
if(success(user, target, target_zone, tool, surgery))
- user?.mind?.skill_holder?.auto_gain_experience(/datum/skill/numerical/surgery, SKILL_GAIN_SURGERY_PER_STEP)
+ user.mind?.skill_holder.auto_gain_experience(/datum/skill/numerical/surgery, SKILL_GAIN_SURGERY_PER_STEP)
advance = TRUE
else
if(failure(user, target, target_zone, tool, surgery))
diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm
index cda83cf684..c5d95fdc4f 100644
--- a/code/modules/uplink/uplink_items/uplink_devices.dm
+++ b/code/modules/uplink/uplink_items/uplink_devices.dm
@@ -201,10 +201,9 @@
/datum/uplink_item/device_tools/stimpack
name = "Stimpack"
desc = "Stimpacks, the tool of many great heroes, make you nearly immune to stuns and knockdowns for about \
- 5 minutes after fully injecting yourself. Can inject yourself, or others, 5 times and through hardsuits. \
- Each injection will gives around a minute of stimulants."
- item = /obj/item/reagent_containers/hypospray/medipen/stimulants
- cost = 5
+ 5 minutes after injection."
+ item = /obj/item/reagent_containers/syringe/stimulants
+ cost = 3
surplus = 90
/datum/uplink_item/device_tools/medkit
diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi
index 66a47d21f2..d307b5b6c9 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi
index a0dfe6e482..2b28d06976 100644
Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ
diff --git a/icons/mob/clothing/feet_digi.dmi b/icons/mob/clothing/feet_digi.dmi
index 626c67a71c..7815f3d0a4 100644
Binary files a/icons/mob/clothing/feet_digi.dmi and b/icons/mob/clothing/feet_digi.dmi differ
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index 3c5dfe5012..85cb1e0c0a 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/inhands/equipment/security_lefthand.dmi b/icons/mob/inhands/equipment/security_lefthand.dmi
index 01f8e2ca27..d5b32d7c37 100644
Binary files a/icons/mob/inhands/equipment/security_lefthand.dmi and b/icons/mob/inhands/equipment/security_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/security_righthand.dmi b/icons/mob/inhands/equipment/security_righthand.dmi
index d2126fe22f..1c8c9b0dfb 100644
Binary files a/icons/mob/inhands/equipment/security_righthand.dmi and b/icons/mob/inhands/equipment/security_righthand.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index a26b01883e..e0b02d2adc 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi
index 5ee3db49e9..414930ac25 100644
Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index f5e2dc5692..9affc07f88 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/modular_citadel/icons/obj/genitals/breasts.dmi b/icons/obj/genitals/breasts.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/breasts.dmi
rename to icons/obj/genitals/breasts.dmi
diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/icons/obj/genitals/breasts_onmob.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/breasts_onmob.dmi
rename to icons/obj/genitals/breasts_onmob.dmi
diff --git a/modular_citadel/icons/obj/genitals/dildo.dmi b/icons/obj/genitals/dildo.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/dildo.dmi
rename to icons/obj/genitals/dildo.dmi
diff --git a/modular_citadel/icons/obj/genitals/effects.dmi b/icons/obj/genitals/effects.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/effects.dmi
rename to icons/obj/genitals/effects.dmi
diff --git a/modular_citadel/icons/obj/genitals/hud.dmi b/icons/obj/genitals/hud.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/hud.dmi
rename to icons/obj/genitals/hud.dmi
diff --git a/modular_citadel/icons/obj/genitals/onahole.dmi b/icons/obj/genitals/onahole.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/onahole.dmi
rename to icons/obj/genitals/onahole.dmi
diff --git a/modular_citadel/icons/obj/genitals/penis.dmi b/icons/obj/genitals/penis.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/penis.dmi
rename to icons/obj/genitals/penis.dmi
diff --git a/modular_citadel/icons/obj/genitals/penis_onmob.dmi b/icons/obj/genitals/penis_onmob.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/penis_onmob.dmi
rename to icons/obj/genitals/penis_onmob.dmi
diff --git a/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi b/icons/obj/genitals/taur_penis_onmob.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi
rename to icons/obj/genitals/taur_penis_onmob.dmi
diff --git a/modular_citadel/icons/obj/genitals/testicles.dmi b/icons/obj/genitals/testicles.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/testicles.dmi
rename to icons/obj/genitals/testicles.dmi
diff --git a/modular_citadel/icons/obj/genitals/testicles_onmob.dmi b/icons/obj/genitals/testicles_onmob.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/testicles_onmob.dmi
rename to icons/obj/genitals/testicles_onmob.dmi
diff --git a/modular_citadel/icons/obj/genitals/vagina.dmi b/icons/obj/genitals/vagina.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/vagina.dmi
rename to icons/obj/genitals/vagina.dmi
diff --git a/modular_citadel/icons/obj/genitals/vagina_onmob.dmi b/icons/obj/genitals/vagina_onmob.dmi
similarity index 100%
rename from modular_citadel/icons/obj/genitals/vagina_onmob.dmi
rename to icons/obj/genitals/vagina_onmob.dmi
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index eee164cead..c843afca5f 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index c8927edde4..5ad6c1cb3b 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
index d2a063fd4e..280a5eebfa 100644
--- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
+++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
@@ -28,7 +28,7 @@
gender = PLURAL
density = 0
layer = ABOVE_NORMAL_TURF_LAYER
- icon = 'modular_citadel/icons/obj/genitals/effects.dmi'
+ icon = 'icons/obj/genitals/effects.dmi'
icon_state = "semen1"
random_icon_states = list("semen1", "semen2", "semen3", "semen4")
@@ -59,7 +59,7 @@
gender = PLURAL
density = 0
layer = ABOVE_NORMAL_TURF_LAYER
- icon = 'modular_citadel/icons/obj/genitals/effects.dmi'
+ icon = 'icons/obj/genitals/effects.dmi'
icon_state = "fem1"
random_icon_states = list("fem1", "fem2", "fem3", "fem4")
blood_state = null
diff --git a/modular_citadel/icons/mob/inhands/stunsword_left.dmi b/modular_citadel/icons/mob/inhands/stunsword_left.dmi
index 0ecc02d31a..02dfe2b915 100644
Binary files a/modular_citadel/icons/mob/inhands/stunsword_left.dmi and b/modular_citadel/icons/mob/inhands/stunsword_left.dmi differ
diff --git a/modular_citadel/icons/mob/inhands/stunsword_right.dmi b/modular_citadel/icons/mob/inhands/stunsword_right.dmi
index 76fa4d57c9..50e76d660b 100644
Binary files a/modular_citadel/icons/mob/inhands/stunsword_right.dmi and b/modular_citadel/icons/mob/inhands/stunsword_right.dmi differ
diff --git a/modular_citadel/icons/obj/food/food.dmi b/modular_citadel/icons/obj/food/food.dmi
deleted file mode 100644
index da9a6c365f..0000000000
Binary files a/modular_citadel/icons/obj/food/food.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/items_and_weapons.dmi b/modular_citadel/icons/obj/items_and_weapons.dmi
deleted file mode 100644
index 3b1d894d96..0000000000
Binary files a/modular_citadel/icons/obj/items_and_weapons.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/objects.dmi b/modular_citadel/icons/obj/objects.dmi
deleted file mode 100644
index 55a6867303..0000000000
Binary files a/modular_citadel/icons/obj/objects.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/stunsword.dmi b/modular_citadel/icons/obj/stunsword.dmi
deleted file mode 100644
index bfe4b45cd9..0000000000
Binary files a/modular_citadel/icons/obj/stunsword.dmi and /dev/null differ
diff --git a/tgstation.dme b/tgstation.dme
index d61a1c4ef9..dc02385b48 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -129,7 +129,8 @@
#include "code\__DEFINES\misc\return_values.dm"
#include "code\__DEFINES\mobs\slowdowns.dm"
#include "code\__DEFINES\research\stock_parts.dm"
-#include "code\__DEFINES\skills\skills.dm"
+#include "code\__DEFINES\skills\defines.dm"
+#include "code\__DEFINES\skills\helpers.dm"
#include "code\__HELPERS\_cit_helpers.dm"
#include "code\__HELPERS\_lists.dm"
#include "code\__HELPERS\_logging.dm"
@@ -582,6 +583,7 @@
#include "code\datums\skills\_check_skills.dm"
#include "code\datums\skills\_skill.dm"
#include "code\datums\skills\_skill_holder.dm"
+#include "code\datums\skills\engineering.dm"
#include "code\datums\skills\medical.dm"
#include "code\datums\status_effects\buffs.dm"
#include "code\datums\status_effects\debuffs.dm"
@@ -1561,6 +1563,15 @@
#include "code\modules\antagonists\wizard\equipment\soulstone.dm"
#include "code\modules\antagonists\wizard\equipment\spellbook.dm"
#include "code\modules\antagonists\xeno\xeno.dm"
+#include "code\modules\arousal\arousal.dm"
+#include "code\modules\arousal\genitals.dm"
+#include "code\modules\arousal\genitals_sprite_accessories.dm"
+#include "code\modules\arousal\organs\breasts.dm"
+#include "code\modules\arousal\organs\penis.dm"
+#include "code\modules\arousal\organs\testicles.dm"
+#include "code\modules\arousal\organs\vagina.dm"
+#include "code\modules\arousal\organs\womb.dm"
+#include "code\modules\arousal\toys\dildos.dm"
#include "code\modules\assembly\assembly.dm"
#include "code\modules\assembly\bomb.dm"
#include "code\modules\assembly\doorcontrol.dm"
@@ -3304,15 +3315,6 @@
#include "modular_citadel\code\modules\admin\chat_commands.dm"
#include "modular_citadel\code\modules\admin\holder2.dm"
#include "modular_citadel\code\modules\admin\secrets.dm"
-#include "modular_citadel\code\modules\arousal\arousal.dm"
-#include "modular_citadel\code\modules\arousal\genitals.dm"
-#include "modular_citadel\code\modules\arousal\genitals_sprite_accessories.dm"
-#include "modular_citadel\code\modules\arousal\organs\breasts.dm"
-#include "modular_citadel\code\modules\arousal\organs\penis.dm"
-#include "modular_citadel\code\modules\arousal\organs\testicles.dm"
-#include "modular_citadel\code\modules\arousal\organs\vagina.dm"
-#include "modular_citadel\code\modules\arousal\organs\womb.dm"
-#include "modular_citadel\code\modules\arousal\toys\dildos.dm"
#include "modular_citadel\code\modules\client\client_defines.dm"
#include "modular_citadel\code\modules\client\client_procs.dm"
#include "modular_citadel\code\modules\client\preferences.dm"