diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
index e820b06f61..89e2c553b9 100644
--- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
@@ -1651,7 +1651,7 @@
/turf/open/floor/plasteel/white,
/area/ruin/space/has_grav/ancientstation/rnd)
"eD" = (
-/obj/machinery/mecha_part_fabricator,
+/obj/machinery/mecha_part_fabricator/offstation,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/white,
/area/ruin/space/has_grav/ancientstation/rnd)
@@ -2010,12 +2010,12 @@
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/ancientstation/deltacorridor)
"fu" = (
-/obj/machinery/rnd/production/protolathe,
+/obj/machinery/rnd/production/protolathe/offstation,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/white,
/area/ruin/space/has_grav/ancientstation/rnd)
"fv" = (
-/obj/machinery/rnd/production/circuit_imprinter,
+/obj/machinery/rnd/production/circuit_imprinter/offstation,
/obj/effect/decal/cleanable/dirt,
/obj/item/reagent_containers/dropper,
/turf/open/floor/plasteel/white,
diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm
index 37bc2a7dde..a9c5eab318 100644
--- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm
+++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm
@@ -103,10 +103,6 @@
/obj/structure/window/reinforced,
/turf/open/floor/plasteel,
/area/engine/engineering)
-"dw" = (
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
"dZ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -1170,7 +1166,8 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{
dir = 1
},
-/turf/open/floor/plating/airless,
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
/area/engine/engineering)
"Hp" = (
/obj/machinery/atmospherics/components/binary/pump{
@@ -1332,7 +1329,8 @@
/area/engine/engineering)
"LS" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plating/airless,
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
/area/engine/engineering)
"Mf" = (
/obj/structure/closet/secure_closet/engineering_personal,
@@ -2629,7 +2627,7 @@ EN
fq
LS
Hn
-dw
+tw
yf
Rh
yf
@@ -2655,9 +2653,9 @@ XW
ST
Ok
MP
-dw
-dw
-dw
+tw
+tw
+tw
Rh
Rh
Rh
diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/away_mission/Academy.dmm
similarity index 100%
rename from _maps/RandomZLevels/Academy.dmm
rename to _maps/RandomZLevels/away_mission/Academy.dmm
diff --git a/_maps/RandomZLevels/Cabin.dmm b/_maps/RandomZLevels/away_mission/Cabin.dmm
similarity index 100%
rename from _maps/RandomZLevels/Cabin.dmm
rename to _maps/RandomZLevels/away_mission/Cabin.dmm
diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/away_mission/TheBeach.dmm
similarity index 100%
rename from _maps/RandomZLevels/TheBeach.dmm
rename to _maps/RandomZLevels/away_mission/TheBeach.dmm
diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/away_mission/caves.dmm
similarity index 100%
rename from _maps/RandomZLevels/caves.dmm
rename to _maps/RandomZLevels/away_mission/caves.dmm
diff --git a/_maps/RandomZLevels/challenge.dmm b/_maps/RandomZLevels/away_mission/challenge.dmm
similarity index 100%
rename from _maps/RandomZLevels/challenge.dmm
rename to _maps/RandomZLevels/away_mission/challenge.dmm
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/away_mission/moonoutpost19.dmm
similarity index 100%
rename from _maps/RandomZLevels/moonoutpost19.dmm
rename to _maps/RandomZLevels/away_mission/moonoutpost19.dmm
diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/away_mission/research.dmm
similarity index 100%
rename from _maps/RandomZLevels/research.dmm
rename to _maps/RandomZLevels/away_mission/research.dmm
diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/away_mission/snowdin.dmm
similarity index 100%
rename from _maps/RandomZLevels/snowdin.dmm
rename to _maps/RandomZLevels/away_mission/snowdin.dmm
diff --git a/_maps/RandomZLevels/spacebattle.dmm b/_maps/RandomZLevels/away_mission/spacebattle.dmm
similarity index 100%
rename from _maps/RandomZLevels/spacebattle.dmm
rename to _maps/RandomZLevels/away_mission/spacebattle.dmm
diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm
similarity index 100%
rename from _maps/RandomZLevels/undergroundoutpost45.dmm
rename to _maps/RandomZLevels/away_mission/undergroundoutpost45.dmm
diff --git a/_maps/RandomZLevels/wildwest.dmm b/_maps/RandomZLevels/away_mission/wildwest.dmm
similarity index 100%
rename from _maps/RandomZLevels/wildwest.dmm
rename to _maps/RandomZLevels/away_mission/wildwest.dmm
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index e0dfa2ab74..9a28e2d1f4 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -3098,7 +3098,10 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"agd" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_x = -30
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"age" = (
@@ -6032,7 +6035,7 @@
/turf/open/floor/plasteel,
/area/security/brig)
"alk" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
+/obj/structure/chair/office/dark{
dir = 1
},
/turf/open/floor/plasteel,
@@ -6346,10 +6349,13 @@
/turf/closed/wall,
/area/maintenance/port/fore)
"alX" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
+/obj/machinery/button/door{
+ id = "atmos";
+ name = "Atmospherics Lockdown";
+ pixel_x = 24;
+ pixel_y = 4;
+ req_access_txt = "24"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"alY" = (
@@ -7469,10 +7475,10 @@
/turf/open/floor/plating,
/area/security/warden)
"apa" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
"apc" = (
@@ -7700,7 +7706,9 @@
/area/maintenance/starboard/fore)
"apF" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 5
+ },
/turf/open/floor/plating,
/area/engine/atmos)
"apG" = (
@@ -7730,12 +7738,11 @@
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"apI" = (
-/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{
- dir = 1
+/obj/structure/disposalpipe/segment{
+ dir = 5
},
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/engine/atmos)
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"apJ" = (
/turf/closed/wall,
/area/construction/mining/aux_base)
@@ -37755,33 +37762,32 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/turf/open/floor/plasteel/checker,
+/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bLI" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bLJ" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/obj/effect/turf_decal/bot,
+/obj/machinery/computer/atmos_control,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bLK" = (
/turf/closed/wall/r_wall,
/area/engine/atmos)
"bLL" = (
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/obj/effect/turf_decal/bot,
+/obj/machinery/computer/station_alert,
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bLM" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/effect/turf_decal/bot,
+/obj/machinery/computer/atmos_alert,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bLN" = (
-/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
-/obj/effect/turf_decal/bot,
+/obj/machinery/vending/wardrobe/atmos_wardrobe,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bLO" = (
@@ -38146,25 +38152,30 @@
/turf/closed/wall,
/area/engine/atmos)
"bML" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/portable_atmospherics/canister/air,
+/obj/structure/plasticflaps/opaque,
+/obj/machinery/navbeacon{
+ codes_txt = "delivery;dir=4";
+ dir = 4;
+ freq = 1400;
+ location = "Atmospherics"
+ },
+/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/northleft{
+ dir = 4;
+ name = "Atmospherics Desk";
+ req_access_txt = "24"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bMM" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/machinery/airalarm{
- pixel_y = 23
- },
+/obj/machinery/atmospherics/components/unary/thermomachine/heater,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bMN" = (
-/obj/machinery/atmospherics/components/trinary/filter{
- dir = 4
- },
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bMO" = (
@@ -38522,18 +38533,20 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/obj/effect/turf_decal/tile/yellow{
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/loading_area{
dir = 8
},
-/turf/open/floor/plasteel/dark/corner,
+/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bNP" = (
/obj/structure/disposalpipe/segment{
- dir = 6
+ dir = 4
},
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = -30
+/obj/effect/turf_decal/loading_area{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -38548,9 +38561,6 @@
/obj/structure/disposalpipe/trunk{
dir = 8
},
-/obj/machinery/airalarm{
- pixel_y = 23
- },
/obj/machinery/camera{
c_tag = "Atmospherics Monitoring"
},
@@ -38616,17 +38626,11 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel,
/area/science/misc_lab)
-"bOa" = (
+"bOb" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOb" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOc" = (
@@ -38634,16 +38638,17 @@
dir = 1;
name = "Mix to Distro"
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOd" = (
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOe" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/manifold4w/cyan/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOf" = (
@@ -38965,55 +38970,38 @@
/turf/open/floor/plasteel/white,
/area/medical/virology)
"bOQ" = (
-/obj/structure/disposalpipe/segment{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/loading_area{
- dir = 8
- },
+/obj/item/beacon,
/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
+/area/engine/atmos)
"bOR" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
+/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
+ dir = 1
},
+/obj/machinery/meter,
/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
+/area/engine/atmos)
"bOS" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
-/obj/effect/turf_decal/loading_area{
- dir = 4
- },
+/obj/structure/tank_dispenser,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOT" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
},
-/obj/structure/plasticflaps/opaque,
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=4";
- dir = 4;
- freq = 1400;
- location = "Atmospherics"
- },
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/northleft{
- dir = 4;
- name = "Atmospherics Desk";
- req_access_txt = "24"
- },
-/turf/open/floor/plasteel,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/engine/atmos)
"bOU" = (
/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -39024,9 +39012,6 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bOW" = (
-/obj/machinery/computer/atmos_control{
- dir = 8
- },
/obj/machinery/requests_console{
department = "Atmospherics";
departmentType = 4;
@@ -39036,8 +39021,8 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
+/obj/machinery/computer/atmos_control{
+ dir = 8
},
/turf/open/floor/plasteel/dark/corner,
/area/engine/atmos)
@@ -39086,17 +39071,19 @@
/turf/open/floor/plasteel/white,
/area/science/circuit)
"bPc" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Mix to Waste"
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPd" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- name = "Waste In"
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -39105,18 +39092,15 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPf" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Air to Mix"
- },
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPg" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Mix Outlet Pump"
+/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
+ dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -39559,25 +39543,33 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/turf/open/floor/plasteel/checker,
+/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bQg" = (
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bQh" = (
-/obj/structure/tank_dispenser{
- pixel_x = -1
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/effect/landmark/start/atmospheric_technician,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQi" = (
+/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 Blast Door"
},
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
/area/engine/atmos)
"bQj" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -39592,15 +39584,15 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQl" = (
-/obj/machinery/computer/atmos_control{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/computer/atmos_alert{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
/turf/open/floor/plasteel/dark/corner,
/area/engine/atmos)
"bQm" = (
@@ -39617,10 +39609,14 @@
/turf/open/floor/plating,
/area/engine/atmos)
"bQo" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/portable_atmospherics/canister/air,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQp" = (
@@ -39657,39 +39653,58 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQs" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
- name = "Mix to Filter"
+ name = "Air to Waste"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQt" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
+/obj/item/crowbar,
+/obj/item/wrench,
+/obj/structure/window/reinforced,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/engine/atmos)
+/turf/open/floor/plasteel/dark/corner,
+/area/hallway/primary/aft)
"bQu" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 6
- },
+/obj/structure/rack,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/gloves/color/black,
+/obj/item/clothing/gloves/color/black,
+/obj/item/clothing/gloves/color/black,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/mask/gas,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQv" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQw" = (
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 9
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQx" = (
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "Mix to Distro"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -39991,46 +40006,34 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
-"bRq" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/dark/corner,
-/area/hallway/primary/aft)
"bRr" = (
-/obj/structure/chair{
- dir = 8
- },
-/obj/effect/landmark/start/atmospheric_technician,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRs" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/window/northleft{
- dir = 4;
- name = "Atmospherics Desk";
- req_access_txt = "24"
- },
+/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
id = "atmos";
name = "Atmospherics Blast Door"
},
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/atmos)
"bRt" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -24
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRu" = (
-/obj/machinery/computer/atmos_alert{
- dir = 8
- },
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/computer/atmos_alert{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark/corner,
/area/engine/atmos)
"bRv" = (
@@ -40044,9 +40047,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRw" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
+/obj/effect/turf_decal/bot,
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -40055,14 +40056,8 @@
/turf/open/floor/plating,
/area/engine/atmos)
"bRy" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRz" = (
-/obj/machinery/atmospherics/components/trinary/mixer{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 6
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -40073,12 +40068,12 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRC" = (
@@ -40093,37 +40088,26 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9
- },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRE" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Pure to Mix"
+/obj/machinery/atmospherics/pipe/manifold/green/visible{
+ dir = 1
},
+/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bRF" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRG" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "Unfiltered to Mix"
- },
/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bRH" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 5
+"bRG" = (
+/obj/machinery/atmospherics/pipe/manifold/green/visible{
+ dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -40136,15 +40120,9 @@
/turf/open/floor/plating,
/area/engine/atmos)
"bRJ" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 4;
+ name = "Unfiltered & Air to Mix"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -40449,143 +40427,67 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bSB" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/structure/table,
-/obj/item/tank/internals/emergency_oxygen{
- pixel_x = -8
- },
-/obj/item/tank/internals/emergency_oxygen{
- pixel_x = -8
- },
-/obj/item/clothing/mask/breath{
- pixel_x = 4
- },
-/obj/item/clothing/mask/breath{
- pixel_x = 4
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Atmospherics Monitoring";
+ req_access_txt = "24"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSC" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 10
},
-/turf/open/floor/plating,
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bSD" = (
-/obj/structure/sign/plaques/atmos{
- pixel_y = -32
- },
-/obj/structure/table,
-/obj/item/storage/box,
-/obj/item/storage/box,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
+/turf/closed/wall,
/area/engine/atmos)
"bSE" = (
-/obj/machinery/computer/station_alert{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
},
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/button/door{
- id = "atmos";
- name = "Atmospherics Lockdown";
- pixel_x = 24;
- pixel_y = 4;
- req_access_txt = "24"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner,
+/turf/closed/wall,
/area/engine/atmos)
"bSF" = (
-/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/machinery/light{
- dir = 8
- },
-/obj/item/multitool,
-/obj/item/clothing/glasses/welding,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bSG" = (
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty{
- pixel_x = 2;
- pixel_y = 2
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bSH" = (
-/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/bot,
+/obj/machinery/portable_atmospherics/canister/nitrogen,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSI" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 6
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSJ" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 9
+ },
/turf/open/floor/plating,
/area/engine/atmos)
"bSK" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/engine/atmos)
"bSM" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/turf/open/floor/plating,
/area/engine/atmos)
"bSN" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bSP" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 5
},
-/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/engine/atmos)
"bSQ" = (
@@ -40972,39 +40874,44 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bTK" = (
-/obj/item/crowbar,
-/obj/item/wrench,
-/obj/structure/window/reinforced,
-/obj/effect/turf_decal/tile/yellow{
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 4
},
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
-/turf/open/floor/plasteel/dark/corner,
-/area/hallway/primary/aft)
+/turf/open/floor/plasteel/dark/corner{
+ dir = 1
+ },
+/area/engine/atmos)
"bTL" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/engine/atmos)
-"bTM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/engine/atmos)
-"bTN" = (
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/airlock/atmos/glass{
- name = "Atmospherics Monitoring";
- req_access_txt = "24"
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bTO" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
+"bTM" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
+"bTN" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bTO" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"bTP" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
@@ -41012,34 +40919,28 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bTQ" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/machinery/meter,
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Waste to Filter"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bTR" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 4
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Filter to Waste"
},
-/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bTS" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 6
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTT" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bTU" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 5
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -41051,6 +40952,7 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel/cafeteria,
/area/engine/atmos)
"bTW" = (
@@ -41383,6 +41285,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/effect/decal/cleanable/oil{
+ icon_state = "floor5"
+ },
/turf/open/floor/plasteel/dark/corner,
/area/engine/atmos)
"bUJ" = (
@@ -41397,56 +41302,60 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bUK" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Air to External"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUL" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUM" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bUN" = (
-/obj/item/beacon,
+"bUL" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/turf/open/floor/plating,
+/area/engine/atmos)
+"bUM" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 9
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
+"bUN" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/engine/atmos)
"bUO" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Mix to Port"
- },
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/manifold/orange/visible,
+/obj/machinery/meter,
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bUP" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Air to Port"
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
},
-/turf/open/floor/plasteel,
+/turf/closed/wall,
/area/engine/atmos)
"bUQ" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Pure to Port"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bUR" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bUS" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Mix to External"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bUT" = (
@@ -41456,6 +41365,7 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel/white/corner,
/area/engine/atmos)
"bUU" = (
@@ -41805,12 +41715,11 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 6
},
+/obj/effect/spawner/structure/window,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bVQ" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bVR" = (
@@ -41820,6 +41729,10 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/machinery/suit_storage_unit/atmos,
/turf/open/floor/plasteel/dark/corner,
/area/engine/atmos)
"bVS" = (
@@ -41830,75 +41743,74 @@
/turf/closed/wall,
/area/engine/atmos)
"bVT" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bVU" = (
+/obj/machinery/portable_atmospherics/pump,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/engine/atmos)
+"bVV" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bVW" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Air to External"
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bVX" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/machinery/suit_storage_unit/atmos,
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bVY" = (
/obj/machinery/atmospherics/components/binary/pump/on{
dir = 4;
name = "External to Filter"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bVU" = (
-/obj/structure/reagent_dispensers/watertank/high,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVV" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVW" = (
-/obj/structure/rack,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/mask/gas,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVX" = (
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVY" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bVZ" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bWa" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bWb" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bWc" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
+"bWa" = (
+/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
dir = 8
},
+/obj/machinery/meter,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bWc" = (
+/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{
+ dir = 1
+ },
/turf/open/floor/plasteel/white/corner,
/area/engine/atmos)
"bWd" = (
@@ -42175,33 +42087,21 @@
},
/area/engine/atmos)
"bWN" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -22
},
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bWO" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 10
},
-/obj/machinery/meter,
/turf/closed/wall/r_wall,
/area/engine/atmos)
"bWP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9
- },
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/turf/closed/wall,
/area/engine/atmos)
"bWQ" = (
/turf/closed/wall/r_wall,
@@ -42211,44 +42111,31 @@
name = "Station Intercom (General)";
pixel_x = -30
},
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bWS" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
-/obj/machinery/camera{
- c_tag = "Atmospherics West";
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/light{
+/obj/machinery/camera{
+ c_tag = "Atmospherics Central";
dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bWT" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Air to Port"
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/atmos)
"bWU" = (
/obj/machinery/light{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 4;
+ name = "Mix to Engine"
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bWV" = (
@@ -42598,20 +42485,24 @@
},
/area/engine/atmos)
"bXK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9
- },
+/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
/turf/closed/wall/r_wall,
/area/engine/atmos)
"bXL" = (
-/obj/structure/sign/warning/securearea,
-/turf/closed/wall/r_wall,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 9
+ },
+/turf/closed/wall,
/area/engine/atmos)
"bXM" = (
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/airlock/atmos{
- name = "Atmospherics";
- req_access_txt = "24"
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -42654,35 +42545,34 @@
/obj/structure/fireaxecabinet{
pixel_x = -32
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXR" = (
-/obj/structure/closet/secure_closet/atmospherics,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/obj/machinery/power/floodlight,
+/obj/structure/cable{
+ icon_state = "0-8"
},
-/obj/item/cartridge/atmos,
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/atmos)
"bXS" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/machinery/portable_atmospherics/canister,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/atmos)
"bXT" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/machinery/light{
dir = 8
},
-/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXU" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
- dir = 8
- },
+/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXV" = (
@@ -42697,6 +42587,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 5
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXW" = (
@@ -43002,27 +42893,28 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/obj/effect/turf_decal/tile/yellow{
+/obj/machinery/door/airlock/atmos{
+ name = "Atmospherics";
+ req_access_txt = "24"
+ },
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plasteel/dark/corner{
+ dir = 1
+ },
+/area/engine/atmos)
+"bYK" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -27
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bYL" = (
+/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
dir = 8
},
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
-/area/engine/break_room)
-"bYK" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/checker,
-/area/engine/break_room)
-"bYL" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
-/area/engine/break_room)
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"bYM" = (
/obj/machinery/airalarm{
dir = 1;
@@ -43041,8 +42933,12 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bYN" = (
-/turf/closed/wall,
-/area/security/checkpoint/engineering)
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/atmos)
"bYO" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -43053,24 +42949,6 @@
/obj/effect/landmark/event_spawn,
/turf/closed/wall,
/area/crew_quarters/bar)
-"bYQ" = (
-/obj/machinery/suit_storage_unit/atmos,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bYR" = (
-/obj/structure/sign/warning/nosmoking,
-/turf/closed/wall,
-/area/engine/atmos)
-"bYS" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bYT" = (
/obj/machinery/computer/atmos_control/tank/toxin_tank{
dir = 8
@@ -43078,6 +42956,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bYU" = (
@@ -43376,41 +43255,26 @@
/obj/structure/cable{
icon_state = "0-4"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bZG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/structure/cable{
icon_state = "1-8"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bZH" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/obj/item/wrench,
+/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bZI" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bZJ" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{
- dir = 1
- },
+/obj/machinery/portable_atmospherics/scrubber,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bZK" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
+/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{
+ dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -43795,42 +43659,32 @@
/turf/closed/wall/r_wall,
/area/security/checkpoint/engineering)
"caE" = (
-/obj/machinery/requests_console{
- department = "Atmospherics";
- departmentType = 4;
- name = "Atmos RC";
- pixel_x = 30
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/light{
- dir = 4
- },
+/obj/structure/reagent_dispensers/watertank/high,
/turf/open/floor/plasteel,
/area/engine/atmos)
"caF" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Atmospherics Central";
- dir = 4
- },
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Port to Filter"
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 6
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"caG" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/heater{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/machinery/requests_console{
+ department = "Atmospherics";
+ departmentType = 4;
+ name = "Atmos RC";
+ pixel_x = -30
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"caH" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/oil{
+ icon_state = "floor6"
},
-/obj/structure/chair/stool,
/turf/open/floor/plasteel,
/area/engine/atmos)
"caI" = (
@@ -44276,44 +44130,43 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"cbz" = (
-/obj/machinery/vending/wardrobe/atmos_wardrobe,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"cbA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/machinery/portable_atmospherics/pump,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbB" = (
-/obj/machinery/space_heater,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Air Outlet Pump"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbC" = (
-/obj/machinery/space_heater,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+ dir = 1
},
+/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbD" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Port to Filter"
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+ dir = 8
},
+/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbE" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 10
},
+/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbF" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/obj/item/cigbutt,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbG" = (
@@ -44328,6 +44181,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbH" = (
@@ -44696,29 +44550,21 @@
dir = 4;
pixel_x = -24
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"ccw" = (
/turf/closed/wall/r_wall,
/area/engine/engineering)
-"ccx" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 1
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"ccy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 5
- },
+/obj/machinery/space_heater,
/turf/open/floor/plasteel,
/area/engine/atmos)
"ccz" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "N2 to Pure"
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"ccA" = (
@@ -44729,6 +44575,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"ccB" = (
@@ -45054,51 +44901,26 @@
dir = 4;
pixel_x = -22
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cdx" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cdy" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
+/obj/structure/lattice,
+/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{
+ dir = 1
},
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cdz" = (
-/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)
-"cdA" = (
-/obj/machinery/atmospherics/components/trinary/mixer/airmix{
- dir = 4
- },
-/turf/open/floor/plasteel,
+/obj/structure/lattice/catwalk,
+/turf/open/space,
/area/engine/atmos)
"cdB" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 9
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"cdC" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
+/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{
+ dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -45441,6 +45263,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cey" = (
@@ -45455,17 +45278,15 @@
/area/engine/atmos)
"ceA" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
- },
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plating,
/area/engine/atmos)
"ceB" = (
/obj/machinery/light{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 9
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -45693,7 +45514,7 @@
/turf/open/floor/plasteel,
/area/engine/break_room)
"cfi" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/n2,
+/obj/machinery/portable_atmospherics/scrubber/huge,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cfj" = (
@@ -45923,37 +45744,23 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cfN" = (
-/obj/machinery/portable_atmospherics/scrubber,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cfO" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/portable_atmospherics/pump,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cfP" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
+/obj/machinery/atmospherics/components/trinary/mixer/airmix/inverse{
dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"cfQ" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cfR" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 6
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"cfT" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 9
- },
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cfU" = (
@@ -46335,11 +46142,12 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"cgW" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/portable_atmospherics/pump,
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -46347,11 +46155,17 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"cgX" = (
/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cgY" = (
@@ -46366,6 +46180,9 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"cgZ" = (
@@ -46376,16 +46193,14 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"cha" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
+/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -46401,6 +46216,9 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"chc" = (
@@ -46410,6 +46228,9 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 9
+ },
/turf/open/floor/plasteel/white/corner,
/area/engine/atmos)
"chd" = (
@@ -46417,6 +46238,9 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel/cafeteria,
/area/engine/atmos)
"che" = (
@@ -46926,6 +46750,9 @@
"civ" = (
/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/engine/atmos)
"cix" = (
@@ -52454,10 +52281,8 @@
/turf/open/floor/engine/vacuum,
/area/science/mixing)
"cBF" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 8
- },
/obj/effect/landmark/event_spawn,
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cBG" = (
@@ -52483,9 +52308,6 @@
/turf/open/floor/plasteel,
/area/security/checkpoint/engineering)
"cBJ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9
- },
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -52659,28 +52481,8 @@
/obj/item/poster/random_official,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"cCB" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cCC" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cCD" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Mix to Engine"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"cCE" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 4
},
@@ -52829,6 +52631,13 @@
/obj/item/instrument/violin,
/turf/open/floor/wood,
/area/crew_quarters/theatre)
+"cGG" = (
+/obj/effect/spawner/structure/window,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"cHf" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -53870,18 +53679,12 @@
/turf/open/floor/plasteel,
/area/security/brig)
"daI" = (
-/obj/structure/reagent_dispensers/foamtank,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
+/obj/structure/window/reinforced,
+/obj/effect/turf_decal/bot,
+/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 4
},
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/box,
/turf/open/floor/plasteel,
/area/engine/atmos)
"dbU" = (
@@ -54158,6 +53961,16 @@
dir = 4
},
/area/crew_quarters/fitness/pool)
+"ecE" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "Mix to Waste"
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"edA" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -54893,6 +54706,16 @@
},
/turf/open/floor/carpet,
/area/crew_quarters/cryopod)
+"gfJ" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
+/obj/machinery/door/airlock/atmos{
+ name = "Atmospherics";
+ req_access_txt = "24"
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"ghq" = (
/obj/structure/lattice/catwalk,
/obj/item/stack/marker_beacon{
@@ -54913,6 +54736,17 @@
"gjl" = (
/turf/closed/wall,
/area/quartermaster/warehouse)
+"glY" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
+/obj/structure/closet/secure_closet/atmospherics,
+/obj/item/cartridge/atmos,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"gnf" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -55636,6 +55470,11 @@
/obj/item/coin/silver,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"iYC" = (
+/obj/effect/spawner/structure/window,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"iYE" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -57589,21 +57428,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/pool)
-"plm" = (
-/obj/structure/reagent_dispensers/watertank/high,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/box,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"plC" = (
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
@@ -58067,6 +57891,17 @@
/obj/structure/chair/sofa/left,
/turf/open/floor/plasteel,
/area/security/prison)
+"rca" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
+/obj/structure/closet/secure_closet/atmospherics,
+/obj/item/cartridge/atmos,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"rcD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -60045,6 +59880,14 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
+"wzX" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/turf/open/floor/plating,
+/area/engine/atmos)
"wBd" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
@@ -89880,8 +89723,8 @@ bGO
bHl
bHS
bLI
-bLI
-bOR
+apI
+bQg
bQg
bQg
bQg
@@ -90136,19 +89979,19 @@ bCv
bJq
bKw
bLH
-bRq
-bNO
-bOQ
bQf
-bRq
-bRq
+bNO
+bQg
+bQf
+bQt
bTK
-bUE
+bTK
+bVU
bUE
bWM
bXJ
-bYH
-bYH
+bMK
+bMK
bYH
bYH
bVg
@@ -90394,17 +90237,17 @@ bJs
bKy
bLK
bLK
-bLK
+bML
bOT
bQi
bRs
bSC
-bLK
+bUO
bUG
bVO
bWO
bXK
-bYH
+bLK
bZz
caw
bYH
@@ -90650,7 +90493,7 @@ bCv
bJs
bKy
bLJ
-bLJ
+agd
bNP
bOS
bQh
@@ -90660,7 +90503,7 @@ bTL
bUF
bVN
bWN
-bLK
+bXM
bYJ
bRi
bZy
@@ -90907,7 +90750,7 @@ bCv
bJs
bKy
bLM
-bLM
+alk
bNQ
bOV
bQk
@@ -90916,9 +90759,9 @@ bSD
bTM
bUH
bVQ
-bWN
+bVZ
bXM
-bYL
+bLK
cew
bTh
cdt
@@ -91164,18 +91007,18 @@ bCv
bJs
bKy
bLL
-bLL
+bOd
bNQ
bOU
-bQj
-bOd
-bOd
-bRx
-bTP
+bTO
+bRr
+bSE
+bTN
+gfJ
bVP
bWP
bXL
-bYK
+bLK
bRj
bTg
bUm
@@ -91421,18 +91264,18 @@ bCy
bGP
bHn
bLN
-bLN
+alX
bNS
bOX
bQm
bRv
-bOd
-bTN
+cGG
+glY
bTP
-bRA
+bVX
+bWQ
bWQ
bWQ
-bYN
bRm
bTj
caA
@@ -91683,8 +91526,8 @@ bNR
bOW
bQl
bRu
-bSE
-bRx
+iYC
+rca
bUI
bVR
bWQ
@@ -91941,7 +91784,7 @@ bOY
bQn
bRx
bMK
-bMK
+bUP
bUJ
bVS
bWQ
@@ -92192,10 +92035,10 @@ bCv
bJs
bKz
bLK
-bML
+bQr
bNT
bOV
-bQj
+bQo
bRw
bSF
daI
@@ -92453,11 +92296,11 @@ bMN
bNV
bOV
bQo
-bRz
-bSH
-plm
-bTP
-bRA
+bRw
+bSF
+daI
+bVW
+bVY
bWQ
bWQ
bWQ
@@ -92707,28 +92550,28 @@ bJv
bKB
bLK
bMM
-bOd
-bOV
+bNV
+bOQ
bQj
bRy
-bSG
-daI
+cfN
+bUQ
bUK
bVT
bWR
bXQ
-bOd
+cfN
bZF
-bPc
-bOd
+bXT
+bYK
ccv
cdw
cex
-bOd
+caG
cfN
-cfN
-bLK
-aaf
+cbF
+bLQ
+cdx
bOh
bOh
bOh
@@ -92969,20 +92812,20 @@ bJB
bKV
bRB
bSI
-bSI
+bUS
bUM
bVV
-bWS
-bSI
-bSI
+bVV
+bVV
+bWT
bZG
caE
cbA
ccy
-bOd
-bOd
+bZH
+bZI
bQu
-cfO
+bOd
cgW
cit
cph
@@ -93225,21 +93068,21 @@ bIF
bOZ
bQp
bRA
+bTP
bOd
-bTO
-bUL
-bVU
-bMK
-bXR
-bYQ
-bXR
-bMK
-cbz
-ccx
-cbA
+bOd
+bOd
+bOd
+bOd
+bXS
+bOd
+bXU
cbA
+ccy
+bZH
+bZI
cfi
-bRH
+bOd
cgV
bMQ
aaf
@@ -93480,22 +93323,22 @@ bLK
bMR
bIH
bJF
-bQr
-bRA
+bRy
+bTQ
+ecE
+bOd
+bOd
+bOd
+bOd
+bOd
+bXS
+bOd
+bOd
+bOd
+bOd
+bOd
bOd
-bTP
bOd
-bVX
-bMK
-bMK
-bYR
-bMK
-bMK
-cbC
-bRA
-bTO
-cez
-cez
cfQ
cgY
ciu
@@ -93737,26 +93580,26 @@ bLK
bMQ
bNY
bPa
-bMQ
+bYN
bRC
-bMQ
-bTP
-bUN
-bVW
-bMK
+bSK
+bOd
+bOd
+bOd
+bOd
+bOd
bXS
-bXS
-bXS
-bMK
-cbB
-alk
-alX
-cbA
-bQt
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
apa
cgX
apF
-apI
+aaf
bOh
bOh
bOh
@@ -93997,20 +93840,20 @@ bPd
cBF
bRD
bSK
-bTR
-bUP
-bVZ
-bWT
-bWa
-bYS
-bZH
-caF
-bQt
-cBJ
-cdy
bOd
-bRy
-cfR
+bOd
+bOd
+bOd
+bOd
+bXS
+bOd
+bOd
+bOd
+cBJ
+bOd
+bOd
+bOd
+bOd
cha
civ
cph
@@ -94249,27 +94092,27 @@ bvd
bKH
bLK
bMS
-bOa
+cfQ
bPc
bQs
-bMZ
+bTR
bSJ
-bTQ
-bUO
-bVY
bOd
bOd
bOd
bOd
bOd
-cbD
-bTO
-cdx
+bXR
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
bOd
bOd
-cfP
cgZ
-bMQ
+bSK
aaf
bQA
ckX
@@ -94506,27 +94349,27 @@ bvd
bKJ
bLR
bMV
-bOd
-bMZ
+bTP
+bOR
bQv
bRF
bSM
bTS
-bUQ
-agd
-bUO
-bVZ
-bVZ
-bZI
-caH
-cbF
-ccz
-cdA
-cez
-bOe
-cfQ
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+cbD
chb
-ciu
+wzX
bVu
ckb
ckZ
@@ -94765,25 +94608,25 @@ bLK
bMU
bOc
bPe
-bQu
+bTP
bRE
-bSJ
-bPe
-bOd
-cCB
-cCC
-bXT
-bXT
-bXT
-caG
-cbE
-bTU
-cdz
-cez
bUL
-cfP
+cfT
bOd
-bMQ
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+cfP
+ccz
+bSJ
aaf
bOh
bOh
@@ -95020,25 +94863,25 @@ bvd
bKH
bLK
bMX
-bOd
+bTP
bPg
bQx
-bRH
+bRF
bSM
bTU
-bUS
-bUS
-cCD
-bXU
-bUS
-bUS
-bUS
-bXU
-bRF
-bMW
-cez
-cez
-cfQ
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bOd
+bMZ
+bTS
+caH
+cbE
chd
bQy
cpP
@@ -95282,19 +95125,19 @@ bPf
bQw
bRG
bSN
-bTT
-bUR
-bWb
+bPg
+bTS
+bTS
cCE
-bTT
-bUR
-bZJ
-bUR
-bTT
-bUR
+bWa
+bTS
+bTS
+bTS
+bYL
+bTS
cdB
-bUR
-bUR
+caF
+cbB
cfT
chc
bMQ
@@ -95538,7 +95381,7 @@ bOg
bPi
bQz
bRJ
-bSM
+bUN
bTV
bUT
bWc
@@ -95546,12 +95389,12 @@ bWU
bXV
bYT
bZK
-bOd
+cfT
cbG
ccA
cdC
ceB
-cez
+cbC
cez
chf
cix
@@ -95795,7 +95638,7 @@ bOf
bPh
bQy
bRI
-bSP
+ceA
bPh
bQy
bRI
@@ -95808,7 +95651,7 @@ bPh
bQy
bRI
ceA
-bLK
+bVO
bLK
che
bLK
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index e3fbe30b1d..7de162207d 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -111,9 +111,6 @@
#define GRAB_NECK 2
#define GRAB_KILL 3
-//slowdown when in softcrit
-#define SOFTCRIT_ADD_SLOWDOWN 6
-
/// Attack types for check_block()/run_block(). Flags, combinable.
/// Attack was melee, whether or not armed.
#define ATTACK_TYPE_MELEE (1<<0)
diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm
index 73e900226e..844fe2cb90 100644
--- a/code/__DEFINES/maps.dm
+++ b/code/__DEFINES/maps.dm
@@ -35,6 +35,7 @@ require only minor tweaks.
#define ZTRAIT_REEBE "Reebe"
#define ZTRAIT_RESERVED "Transit/Reserved"
#define ZTRAIT_AWAY "Away Mission"
+#define ZTRAIT_VR "Virtual Reality"
#define ZTRAIT_SPACE_RUINS "Space Ruins"
#define ZTRAIT_LAVA_RUINS "Lava Ruins"
#define ZTRAIT_ISOLATED_RUINS "Isolated Ruins" //Placing ruins on z levels with this trait will use turf reservation instead of usual placement.
@@ -101,4 +102,8 @@ require only minor tweaks.
#define PLACE_BELOW "below" //On z levl below - centered on same tile
#define PLACE_ISOLATED "isolated" //On isolated ruin z level
//Map type stuff.
-#define MAP_TYPE_STATION "station"
\ No newline at end of file
+#define MAP_TYPE_STATION "station"
+
+//Random z-levels name defines.
+#define AWAY_MISSION_NAME "Away Mission"
+#define VIRT_REALITY_NAME "Virtual Reality"
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 3fb149d071..37633ae52f 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -71,14 +71,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define ABOVE_SHOES_LAYER (SHOES_LAYER-1)
#define ABOVE_BODY_FRONT_LAYER (BODY_FRONT_LAYER-1)
-
-//Security levels
-#define SEC_LEVEL_GREEN 0
-#define SEC_LEVEL_BLUE 1
-#define SEC_LEVEL_AMBER 2
-#define SEC_LEVEL_RED 3
-#define SEC_LEVEL_DELTA 4
-
//some arbitrary defines to be used by self-pruning global lists. (see master_controller)
#define PROCESS_KILL 26 //Used to trigger removal from a processing list
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index e5f817614b..c89bd4843e 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -291,3 +291,7 @@
#define PULL_PRONE_SLOWDOWN 0.6
#define FIREMAN_CARRY_SLOWDOWN 0
#define PIGGYBACK_CARRY_SLOWDOWN 1
+//slowdown when in softcrit. Note that crawling slowdown will also apply at the same time!
+#define SOFTCRIT_ADD_SLOWDOWN 2
+//slowdown when crawling
+#define CRAWLING_ADD_SLOWDOWN 4
diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm
index 4d40474a3c..1f3ae63940 100644
--- a/code/__DEFINES/movespeed_modification.dm
+++ b/code/__DEFINES/movespeed_modification.dm
@@ -1,12 +1,3 @@
-#define MOVESPEED_DATA_INDEX_PRIORITY 1
-#define MOVESPEED_DATA_INDEX_FLAGS 2
-#define MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN 3
-#define MOVESPEED_DATA_INDEX_MOVETYPE 4
-#define MOVESPEED_DATA_INDEX_BL_MOVETYPE 5
-#define MOVESPEED_DATA_INDEX_CONFLICT 6
-
-#define MOVESPEED_DATA_INDEX_MAX 6
-
//flags
#define IGNORE_NOSLOW (1 << 0)
@@ -15,70 +6,7 @@
#define MOVE_CONFLICT_JETPACK "JETPACK"
//ids
+#define MOVESPEED_ID_SANITY "mood_sanity"
-#define MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED "MOB_WALK_RUN"
-#define MOVESPEED_ID_MOB_GRAB_STATE "MOB_GRAB_STATE"
-#define MOVESPEED_ID_MOB_EQUIPMENT "MOB_EQUIPMENT"
-#define MOVESPEED_ID_MOB_GRAVITY "MOB_GRAVITY"
-#define MOVESPEED_ID_CONFIG_SPEEDMOD "MOB_CONFIG_MODIFIER"
-
-#define MOVESPEED_ID_SLIME_REAGENTMOD "SLIME_REAGENT_MODIFIER"
-#define MOVESPEED_ID_SLIME_HEALTHMOD "SLIME_HEALTH_MODIFIER"
-#define MOVESPEED_ID_SLIME_TEMPMOD "SLIME_TEMPERATURE_MODIFIER"
-
-#define MOVESPEED_ID_SLIME_STATUS "SLIME_STATUS"
-
-#define MOVESPEED_ID_TARANTULA_WEB "TARANTULA_WEB"
-
-#define MOVESPEED_ID_LIVING_TURF_SPEEDMOD "LIVING_TURF_SPEEDMOD"
-#define MOVESPEED_ID_LIVING_LIMBLESS "LIVING_LIMBLESS"
-
-#define MOVESPEED_ID_CARBON_SOFTCRIT "CARBON_SOFTCRIT"
-#define MOVESPEED_ID_CARBON_OLDSPEED "CARBON_DEPRECATED_SPEED"
-
-#define MOVESPEED_ID_DNA_VAULT "DNA_VAULT"
-
-#define MOVESPEED_ID_YELLOW_ORB "YELLOW_ORB"
-
-#define MOVESPEED_ID_TARFOOT "TARFOOT"
-
-#define MOVESPEED_ID_SEPIA "SEPIA"
-
-#define MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD "MONKEY_REAGENT_SPEEDMOD"
-#define MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD "MONKEY_TEMPERATURE_SPEEDMOD"
-#define MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD "MONKEY_HEALTH_SPEEDMOD"
-
-#define MOVESPEED_ID_CHANGELING_MUSCLES "CHANGELING_MUSCLES"
-
-#define MOVESPEED_ID_SIMPLEMOB_VARSPEED "SIMPLEMOB_VARSPEED_MODIFIER"
-#define MOVESPEED_ID_ADMIN_VAREDIT "ADMIN_VAREDIT_MODIFIER"
-
-#define MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD "PAI_SPACEWALK_MODIFIER"
-
-#define MOVESPEED_ID_SANITY "MOOD_SANITY"
-
-#define MOVESPEED_ID_SPECIES "SPECIES_SPEED_MOD"
-
-#define MOVESPEED_ID_SMALL_STRIDE "SMALL_STRIDE"
-#define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG"
-#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
-#define MOVESPEED_ID_SHRINK_RAY "SHRUNKEN_SPEED_MODIFIER"
-
-#define MOVESPEED_ID_SLAUGHTER "SLAUGHTER"
-
-#define MOVESPEED_ID_CYBER_THRUSTER "CYBER_IMPLANT_THRUSTER"
-#define MOVESPEED_ID_JETPACK "JETPACK"
-
-#define MOVESPEED_ID_MKULTRA "MKULTRA"
-
-#define MOVESPEED_ID_TASED_STATUS "TASED"
-#define MOVESPEED_ID_ELECTROSTAFF "ELECTROSTAFF"
-
-#define MOVESPEED_ID_SHOVE "SHOVE"
-#define MOVESPEED_ID_FAT "FAT"
-#define MOVESPEED_ID_COLD "COLD"
-#define MOVESPEED_ID_HUNGRY "HUNGRY"
-#define MOVESPEED_ID_DAMAGE_SLOWDOWN "DAMAGE"
-#define MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING "FLYING"
-
-#define MOVESPEED_ID_CIRRHOSIS "CIRRHOSIS"
\ No newline at end of file
+#define MOVESPEED_ID_MOB_GRAB_STATE "mob_grab_state"
+#define MOVESPEED_ID_MOB_WALK_RUN "mob_walk_run"
diff --git a/code/__DEFINES/nanites.dm b/code/__DEFINES/nanites.dm
index ed15e972ab..05c3501609 100644
--- a/code/__DEFINES/nanites.dm
+++ b/code/__DEFINES/nanites.dm
@@ -12,6 +12,10 @@
#define NANITE_CLOUD_DISABLE 2
#define NANITE_CLOUD_ENABLE 3
+///Nanite Protocol types
+#define NANITE_PROTOCOL_REPLICATION "nanite_replication"
+#define NANITE_PROTOCOL_STORAGE "nanite_storage"
+
///Nanite extra settings types: used to help uis know what type an extra setting is
#define NESTYPE_TEXT "text"
#define NESTYPE_NUMBER "number"
diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm
index 97ae7b8e95..f4beef7ee8 100644
--- a/code/__DEFINES/reagents.dm
+++ b/code/__DEFINES/reagents.dm
@@ -22,11 +22,23 @@
// Is an open container for all intents and purposes.
#define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT)
-//reagents_value defines, for cargo stuff.
+//reagents_value defines, basically a multiplier used in reagent containers cargo selling.
#define DEFAULT_REAGENTS_VALUE 1
#define NO_REAGENTS_VALUE 0
#define HARVEST_REAGENTS_VALUE 0.3
+/// Standard reagents value defines.
+/// Take a grain of salt, only "rare" reagents should have a decent value here, for balance reasons.
+/// TL;DR Think of it also like general market request price more than rarity.
+#define REAGENT_VALUE_NONE 0 //all the stuff pretty much available in potentially unlimited quantities.
+#define REAGENT_VALUE_VERY_COMMON 0.1 //same as above, just not so unlimited.
+#define REAGENT_VALUE_COMMON 0.5
+#define REAGENT_VALUE_UNCOMMON 1
+#define REAGENT_VALUE_RARE 2.5
+#define REAGENT_VALUE_VERY_RARE 5
+#define REAGENT_VALUE_EXCEPTIONAL 10 //extremely rare or tedious to craft, possibly unsynthetizable, reagents.
+#define REAGENT_VALUE_AMAZING 30 //reserved ONLY for non-mass produceable, unsynthetizable reagents.
+#define REAGENT_VALUE_GLORIOUS 300 //reagents that shouldn't be possible to get or farm under normal conditions. e.g. Romerol, fungal TB, adminordrazine...
#define TOUCH 1 // splashing
#define INGEST 2 // ingestion
diff --git a/code/__DEFINES/security_levels.dm b/code/__DEFINES/security_levels.dm
new file mode 100644
index 0000000000..19c66d9125
--- /dev/null
+++ b/code/__DEFINES/security_levels.dm
@@ -0,0 +1,10 @@
+//Security levels
+#define SEC_LEVEL_GREEN 1
+#define SEC_LEVEL_BLUE 2
+#define SEC_LEVEL_AMBER 3
+#define SEC_LEVEL_RED 4
+#define SEC_LEVEL_DELTA 5
+
+//Macro helpers.
+#define SECLEVEL2NUM(text) (GLOB.all_security_levels.Find(text))
+#define NUM2SECLEVEL(num) (ISINRANGE(num, 1, length(GLOB.all_security_levels)) ? GLOB.all_security_levels[num] : null)
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index e1fc8fa001..4d18e60b71 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -152,6 +152,42 @@
#define TRAIT_PASSTABLE "passtable"
#define TRAIT_GIANT "giant"
#define TRAIT_DWARF "dwarf"
+#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
+#define TRAIT_AGEUSIA "ageusia"
+#define TRAIT_HEAVY_SLEEPER "heavy_sleeper"
+#define TRAIT_NIGHT_VISION "night_vision"
+#define TRAIT_LIGHT_STEP "light_step"
+#define TRAIT_SILENT_STEP "silent_step"
+#define TRAIT_SPEEDY_STEP "speedy_step"
+#define TRAIT_SPIRITUAL "spiritual"
+#define TRAIT_VORACIOUS "voracious"
+#define TRAIT_SELF_AWARE "self_aware"
+#define TRAIT_FREERUNNING "freerunning"
+#define TRAIT_SKITTISH "skittish"
+#define TRAIT_POOR_AIM "poor_aim"
+#define TRAIT_PROSOPAGNOSIA "prosopagnosia"
+#define TRAIT_DRUNK_HEALING "drunk_healing"
+#define TRAIT_TAGGER "tagger"
+#define TRAIT_PHOTOGRAPHER "photographer"
+#define TRAIT_MUSICIAN "musician"
+#define TRAIT_PERMABONER "permanent_arousal"
+#define TRAIT_NEVERBONER "never_aroused"
+#define TRAIT_MASO "masochism"
+#define TRAIT_HIGH_BLOOD "high_blood"
+#define TRAIT_PARA "paraplegic"
+#define TRAIT_EMPATH "empath"
+#define TRAIT_FRIENDLY "friendly"
+#define TRAIT_CULT_EYES "cult_eyes"
+#define TRAIT_AUTO_CATCH_ITEM "auto_catch_item"
+#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman.
+#define TRAIT_FREESPRINT "free_sprinting"
+#define TRAIT_XRAY_VISION "xray_vision"
+#define TRAIT_THERMAL_VISION "thermal_vision"
+#define TRAIT_NO_TELEPORT "no-teleport" //you just can't
+#define TRAIT_NO_INTERNALS "no-internals"
+#define TRAIT_NO_ALCOHOL "alcohol_intolerance"
+#define TRAIT_MUTATION_STASIS "mutation_stasis" //Prevents processed genetics mutations from processing.
+#define TRAIT_FAST_PUMP "fast_pump"
// mobility flag traits
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
@@ -185,43 +221,6 @@
// item traits
#define TRAIT_NODROP "nodrop"
-#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
-#define TRAIT_AGEUSIA "ageusia"
-#define TRAIT_HEAVY_SLEEPER "heavy_sleeper"
-#define TRAIT_NIGHT_VISION "night_vision"
-#define TRAIT_LIGHT_STEP "light_step"
-#define TRAIT_SILENT_STEP "silent_step"
-#define TRAIT_SPEEDY_STEP "speedy_step"
-#define TRAIT_SPIRITUAL "spiritual"
-#define TRAIT_VORACIOUS "voracious"
-#define TRAIT_SELF_AWARE "self_aware"
-#define TRAIT_FREERUNNING "freerunning"
-#define TRAIT_SKITTISH "skittish"
-#define TRAIT_POOR_AIM "poor_aim"
-#define TRAIT_PROSOPAGNOSIA "prosopagnosia"
-#define TRAIT_DRUNK_HEALING "drunk_healing"
-#define TRAIT_TAGGER "tagger"
-#define TRAIT_PHOTOGRAPHER "photographer"
-#define TRAIT_MUSICIAN "musician"
-#define TRAIT_PERMABONER "permanent_arousal"
-#define TRAIT_NEVERBONER "never_aroused"
-#define TRAIT_NYMPHO "nymphomania"
-#define TRAIT_MASO "masochism"
-#define TRAIT_HIGH_BLOOD "high_blood"
-#define TRAIT_PARA "paraplegic"
-#define TRAIT_EMPATH "empath"
-#define TRAIT_FRIENDLY "friendly"
-#define TRAIT_CULT_EYES "cult_eyes"
-#define TRAIT_AUTO_CATCH_ITEM "auto_catch_item"
-#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman.
-#define TRAIT_FREESPRINT "free_sprinting"
-#define TRAIT_XRAY_VISION "xray_vision"
-#define TRAIT_THERMAL_VISION "thermal_vision"
-#define TRAIT_NO_TELEPORT "no-teleport" //you just can't
-#define TRAIT_NO_INTERNALS "no-internals"
-#define TRAIT_NO_ALCOHOL "alcohol_intolerance"
-#define TRAIT_MUTATION_STASIS "mutation_stasis" //Prevents processed genetics mutations from processing.
-
// common trait sources
#define TRAIT_GENERIC "generic"
#define EYE_DAMAGE "eye_damage"
@@ -246,6 +245,7 @@
#define BLOODSUCKER_TRAIT "bloodsucker"
#define SHOES_TRAIT "shoes" //inherited from your sweet kicks
#define GLOVE_TRAIT "glove" //inherited by your cool gloves
+#define BOOK_TRAIT "granter (book)" // knowledge is power
// unique trait sources, still defines
#define STATUE_MUTE "statue"
diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm
index ec7a11085c..a364e0b93c 100644
--- a/code/__DEFINES/vv.dm
+++ b/code/__DEFINES/vv.dm
@@ -73,6 +73,7 @@
#define VV_HK_EXPOSE "expose"
#define VV_HK_CALLPROC "proc_call"
#define VV_HK_MARK "mark"
+#define VV_HK_ADDCOMPONENT "addcomponent"
#define VV_HK_MODIFY_TRAITS "modtraits"
// /atom
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index a34b3ce67c..ad977ec493 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -11,6 +11,7 @@
#define LAZYINITLIST(L) if (!L) L = list()
#define UNSETEMPTY(L) if (L && !length(L)) L = null
+#define LAZYCOPY(L) (L ? L.Copy() : list() )
#define LAZYREMOVE(L, I) if(L) { L -= I; if(!length(L)) { L = null; } }
#define LAZYADD(L, I) if(!L) { L = list(); } L += I;
#define LAZYOR(L, I) if(!L) { L = list(); } L |= I;
@@ -21,34 +22,47 @@
#define LAZYCLEARLIST(L) if(L) L.Cut()
#define SANITIZE_LIST(L) ( islist(L) ? L : list() )
#define reverseList(L) reverseRange(L.Copy())
+#define LAZYADDASSOC(L, K, V) if(!L) { L = list(); } L[K] += list(V);
+#define LAZYREMOVEASSOC(L, K, V) if(L) { if(L[K]) { L[K] -= V; if(!length(L[K])) L -= K; } if(!length(L)) L = null; }
-// binary search sorted insert
-// IN: Object to be inserted
-// LIST: List to insert object into
-// TYPECONT: The typepath of the contents of the list
-// COMPARE: The variable on the objects to compare
-#define BINARY_INSERT(IN, LIST, TYPECONT, COMPARE) \
- var/__BIN_CTTL = length(LIST);\
- if(!__BIN_CTTL) {\
- LIST += IN;\
- } else {\
- var/__BIN_LEFT = 1;\
- var/__BIN_RIGHT = __BIN_CTTL;\
- var/__BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\
- var/##TYPECONT/__BIN_ITEM;\
- while(__BIN_LEFT < __BIN_RIGHT) {\
- __BIN_ITEM = LIST[__BIN_MID];\
- if(__BIN_ITEM.##COMPARE <= IN.##COMPARE) {\
- __BIN_LEFT = __BIN_MID + 1;\
- } else {\
- __BIN_RIGHT = __BIN_MID;\
+/// Passed into BINARY_INSERT to compare keys
+#define COMPARE_KEY __BIN_LIST[__BIN_MID]
+/// Passed into BINARY_INSERT to compare values
+#define COMPARE_VALUE __BIN_LIST[__BIN_LIST[__BIN_MID]]
+
+/****
+ * Binary search sorted insert
+ * INPUT: Object to be inserted
+ * LIST: List to insert object into
+ * TYPECONT: The typepath of the contents of the list
+ * COMPARE: The object to compare against, usualy the same as INPUT
+ * COMPARISON: The variable on the objects to compare
+ */
+#define BINARY_INSERT(INPUT, LIST, TYPECONT, COMPARE, COMPARISON, COMPTYPE) \
+ do {\
+ var/list/__BIN_LIST = LIST;\
+ var/__BIN_CTTL = length(__BIN_LIST);\
+ if(!__BIN_CTTL) {\
+ __BIN_LIST += INPUT;\
+ } else {\
+ var/__BIN_LEFT = 1;\
+ var/__BIN_RIGHT = __BIN_CTTL;\
+ var/__BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\
+ var/##TYPECONT/__BIN_ITEM;\
+ while(__BIN_LEFT < __BIN_RIGHT) {\
+ __BIN_ITEM = COMPTYPE;\
+ if(__BIN_ITEM.##COMPARISON <= COMPARE.##COMPARISON) {\
+ __BIN_LEFT = __BIN_MID + 1;\
+ } else {\
+ __BIN_RIGHT = __BIN_MID;\
+ };\
+ __BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\
};\
- __BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\
+ __BIN_ITEM = COMPTYPE;\
+ __BIN_MID = __BIN_ITEM.##COMPARISON > COMPARE.##COMPARISON ? __BIN_MID : __BIN_MID + 1;\
+ __BIN_LIST.Insert(__BIN_MID, INPUT);\
};\
- __BIN_ITEM = LIST[__BIN_MID];\
- __BIN_MID = __BIN_ITEM.##COMPARE > IN.##COMPARE ? __BIN_MID : __BIN_MID + 1;\
- LIST.Insert(__BIN_MID, IN);\
- }
+ } while(FALSE)
//Returns a list in plain english as a string
/proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
@@ -231,40 +245,77 @@
//Picks a random element from a list based on a weighting system:
//1. Adds up the total of weights for each element
-//2. Gets a number between 1 and that total
+//2. Gets the total from 0% to 100% of previous total value.
//3. For each element in the list, subtracts its weighting from that number
//4. If that makes the number 0 or less, return that element.
-/proc/pickweight(list/L)
+/proc/pickweight(list/L, base_weight = 1)
var/total = 0
var/item
for (item in L)
if (!L[item])
- L[item] = 1
+ L[item] = base_weight
total += L[item]
- total = rand(1, total)
+ total = rand() * total
for (item in L)
- total -=L [item]
+ total -= L[item]
if (total <= 0)
return item
- return null
-
-/proc/pickweightAllowZero(list/L) //The original pickweight proc will sometimes pick entries with zero weight. I'm not sure if changing the original will break anything, so I left it be.
+//Picks a number of elements from a list based on weight.
+//This is highly optimised and good for things like grabbing 200 items from a list of 40,000
+//Much more efficient than many pickweight calls
+/proc/pickweight_mult(list/L, quantity, base_weight = 1)
+ //First we total the list as normal
var/total = 0
var/item
for (item in L)
if (!L[item])
- L[item] = 0
+ L[item] = base_weight
total += L[item]
- total = rand(0, total)
- for (item in L)
- total -=L [item]
- if (total <= 0 && L[item])
- return item
+ //Next we will make a list of randomly generated numbers, called Requests
+ //It is critical that this list be sorted in ascending order, so we will build it in that order
+ //First one is free, so we start counting at 2
+ var/list/requests = list(rand(1, total))
+ for (var/i in 2 to quantity)
+ //Each time we generate the next request
+ var/newreq = rand()* total
+ //We will loop through all existing requests
+ for (var/j in 1 to requests.len)
+ //We keep going through the list until we find an element which is bigger than the one we want to add
+ if (requests[j] > newreq)
+ //And then we insert the newqreq at that point, pushing everything else forward
+ requests.Insert(j, newreq)
+ break
- return null
+
+
+ //Now when we get here, we have a list of random numbers sorted in ascending order.
+ //The length of that list is equal to Quantity passed into this function
+ //Next we make a list to store results
+ var/list/results = list()
+
+ //Zero the total, we'll reuse it
+ total = 0
+
+ //Now we will iterate forward through the items list, adding each weight to the total
+ for (item in L)
+ total += L[item]
+
+ //After each item we do a while loop
+ while (requests.len && total >= requests[1])
+ //If the total is higher than the value of the first request
+ results += item //We add this item to the results list
+ requests.Cut(1,2) //And we cut off the top of the requests list
+
+ //This while loop will repeat until the next request is higher than the total.
+ //The current item might be added to the results list many times, in this process
+
+ //By the time we get here:
+ //Requests will be empty
+ //Results will have a length of quality
+ return results
//Pick a random element from the list and remove it from the list.
/proc/pick_n_take(list/L)
@@ -274,6 +325,13 @@
. = L[picked]
L.Cut(picked,picked+1) //Cut is far more efficient that Remove()
+//Pick a random element from the list by weight and remove it from the list.
+//Result is returned as a list in the format list(key, value)
+/proc/pickweight_n_take(list/L, base_weight = 1)
+ if (L.len)
+ . = pickweight(L, base_weight)
+ L.Remove(.)
+
//Returns the top(last) element from the list and removes it from the list (typical stack function)
/proc/pop(list/L)
if(L.len)
diff --git a/code/__HELPERS/level_traits.dm b/code/__HELPERS/level_traits.dm
index 3e6e88c8fa..030a324614 100644
--- a/code/__HELPERS/level_traits.dm
+++ b/code/__HELPERS/level_traits.dm
@@ -12,3 +12,5 @@
#define is_reserved_level(z) SSmapping.level_trait(z, ZTRAIT_RESERVED)
#define is_away_level(z) SSmapping.level_trait(z, ZTRAIT_AWAY)
+
+#define is_vr_level(z) SSmapping.level_trait(z, ZTRAIT_VR)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 2827e40120..d93a89a179 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -47,7 +47,7 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list)
return pick(GLOB.socks_list)
-/proc/random_features(intendedspecies)
+/proc/random_features(intendedspecies, intended_gender)
if(!GLOB.tails_list_human.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human)
if(!GLOB.tails_list_lizard.len)
@@ -149,7 +149,13 @@
var/color2 = random_short_color()
var/color3 = random_short_color()
- //CIT CHANGE - changes this entire return to support cit's snowflake parts
+ var/body_model = MALE
+ switch(intended_gender)
+ if(MALE, FEMALE)
+ body_model = intended_gender
+ if(PLURAL)
+ body_model = pick(MALE,FEMALE)
+
return(list(
"mcolor" = color1,
"mcolor2" = color2,
@@ -209,7 +215,7 @@
"ipc_antenna" = "None",
"flavor_text" = "",
"meat_type" = "Mammalian",
- "body_model" = MALE,
+ "body_model" = body_model,
"body_size" = RESIZE_DEFAULT_SIZE
))
diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm
index fb8863ebe7..d214ec94ef 100644
--- a/code/_globalvars/lists/mapping.dm
+++ b/code/_globalvars/lists/mapping.dm
@@ -50,3 +50,8 @@ GLOBAL_LIST_EMPTY_TYPED(areas_by_type, /area)
GLOBAL_LIST_EMPTY(all_abstract_markers)
GLOBAL_LIST_EMPTY(stationroom_landmarks) //List of all spawns for stationrooms
+
+///Away missions, VR, random z levels stuff.
+GLOBAL_LIST_EMPTY(random_zlevels_generated)
+GLOBAL_LIST_INIT(potential_away_levels, generateMapList(filename = "[global.config.directory]/awaymissionconfig.txt"))
+GLOBAL_LIST_INIT(potential_vr_levels, generateMapList(filename = "[global.config.directory]/vr_config.txt"))
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
new file mode 100644
index 0000000000..dd8b9f0d94
--- /dev/null
+++ b/code/_globalvars/traits.dm
@@ -0,0 +1,138 @@
+/*
+ FUN ZONE OF ADMIN LISTINGS
+ Try to keep this in sync with __DEFINES/traits.dm
+ quirks have it's own panel so we don't need them here.
+*/
+
+GLOBAL_LIST_INIT(traits_by_type, list(
+ /mob = list(
+ "TRAIT_BLIND" = TRAIT_BLIND,
+ "TRAIT_MUTE" = TRAIT_MUTE,
+ "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE,
+ "TRAIT_DEAF" = TRAIT_DEAF,
+ "TRAIT_NEARSIGHT" = TRAIT_NEARSIGHT,
+ "TRAIT_FAT" = TRAIT_FAT,
+ "TRAIT_HUSK" = TRAIT_HUSK,
+ "TRAIT_NOCLONE" = TRAIT_NOCLONE,
+ "TRAIT_CLUMSY" = TRAIT_CLUMSY,
+ "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS,
+ "TRAIT_DUMB" = TRAIT_DUMB,
+ "TRAIT_MONKEYLIKE" = TRAIT_MONKEYLIKE,
+ "TRAIT_PACIFISM" = TRAIT_PACIFISM,
+ "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN,
+ "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA,
+ "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH,
+ "TRAIT_DISFIGURED" = TRAIT_DISFIGURED,
+ "TRAIT_XENO_HOST" = TRAIT_XENO_HOST,
+ "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE,
+ "TRAIT_TASED_RESISTANCE" = TRAIT_TASED_RESISTANCE,
+ "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE,
+ "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE,
+ "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE,
+ "TRAIT_STABLEHEART" = TRAIT_STABLEHEART,
+ "TRAIT_STABLELIVER" = TRAIT_STABLELIVER,
+ "TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT,
+ "TRAIT_RESISTHEATHANDS" = TRAIT_RESISTHEATHANDS,
+ "TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD,
+ "TRAIT_RESISTHIGHPRESSURE" = TRAIT_RESISTHIGHPRESSURE,
+ "TRAIT_RESISTLOWPRESSURE" = TRAIT_RESISTLOWPRESSURE,
+ "TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE,
+ "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE,
+ "TRAIT_PIERCEIMMUNE" = TRAIT_PIERCEIMMUNE,
+ "TRAIT_NODISMEMBER" = TRAIT_NODISMEMBER,
+ "TRAIT_NOFIRE" = TRAIT_NOFIRE,
+ "TRAIT_NOGUNS" = TRAIT_NOGUNS,
+ "TRAIT_NOHUNGER" = TRAIT_NOHUNGER,
+ "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER,
+ "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT,
+ "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE,
+ "TRAIT_EASYLIMBDISABLE" = TRAIT_EASYLIMBDISABLE,
+ "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER,
+ "TRAIT_NOBREATH" = TRAIT_NOBREATH,
+ "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC,
+ "TRAIT_HOLY" = TRAIT_HOLY,
+ "TRAIT_DEPRESSION" = TRAIT_DEPRESSION,
+ "TRAIT_JOLLY" = TRAIT_JOLLY,
+ "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE,
+ "TRAIT_NOSLIPWATER" = TRAIT_NOSLIPWATER,
+ "TRAIT_NOSLIPALL" = TRAIT_NOSLIPALL,
+ "TRAIT_NODEATH" = TRAIT_NODEATH,
+ "TRAIT_NOHARDCRIT" = TRAIT_NOHARDCRIT,
+ "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT,
+ "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD,
+ "TRAIT_HIJACKER" = TRAIT_HIJACKER,
+ "TRAIT_DISSECTED" = TRAIT_DISSECTED,
+ "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE,
+ "TRAIT_FEARLESS" = TRAIT_FEARLESS,
+ "TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM,
+ "TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM,
+ "TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG,
+ "TRAIT_PARALYSIS_R_LEG" = TRAIT_PARALYSIS_R_LEG,
+ "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER,
+ "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION,
+ "TRAIT_THERMAL_VISION" = TRAIT_THERMAL_VISION,
+ "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING,
+ "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING,
+ "TRAIT_SURGEON" = TRAIT_SURGEON,
+ "TRAIT_STRONG_GRABBER" = TRAIT_STRONG_GRABBER,
+ "TRAIT_MAGIC_CHOKE" = TRAIT_MAGIC_CHOKE,
+ "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT,
+ "TRAIT_LAW_ENFORCEMENT_METABOLISM" = TRAIT_LAW_ENFORCEMENT_METABOLISM,
+ "TRAIT_UNINTELLIGIBLE_SPEECH" = TRAIT_UNINTELLIGIBLE_SPEECH,
+ "TRAIT_UNSTABLE" = TRAIT_UNSTABLE,
+ "TRAIT_COLDBLOODED" = TRAIT_COLDBLOODED,
+ "TRAIT_NONATURALHEAL" = TRAIT_NONATURALHEAL,
+ "TRAIT_NORUNNING" = TRAIT_NORUNNING,
+ "TRAIT_NOMARROW" = TRAIT_NOMARROW,
+ "TRAIT_NOPULSE" = TRAIT_NOPULSE,
+ "TRAIT_EXEMPT_HEALTH_EVENTS" = TRAIT_EXEMPT_HEALTH_EVENTS,
+ "TRAIT_NO_MIDROUND_ANTAG" = TRAIT_NO_MIDROUND_ANTAG,
+ "TRAIT_PUGILIST" = TRAIT_PUGILIST,
+ "TRAIT_KI_VAMPIRE" = TRAIT_KI_VAMPIRE,
+ "TRAIT_PASSTABLE" = TRAIT_PASSTABLE,
+ "TRAIT_GIANT" = TRAIT_GIANT,
+ "TRAIT_DWARF" = TRAIT_DWARF,
+ "TRAIT_COMBAT_MODE_LOCKED" = TRAIT_COMBAT_MODE_LOCKED,
+ "TRAIT_SPRINT_LOCKED" = TRAIT_SPRINT_LOCKED,
+ "TRAIT_AUTO_CATCH_ITEM" = TRAIT_AUTO_CATCH_ITEM,
+ "TRAIT_FREESPRINT" = TRAIT_FREESPRINT,
+ "TRAIT_NO_INTERNALS" = TRAIT_NO_INTERNALS,
+ "TRAIT_NO_ALCOHOL" = TRAIT_NO_ALCOHOL,
+ "TRAIT_MUTATION_STASIS" = TRAIT_MUTATION_STASIS,
+ "TRAIT_HEAVY_SLEEPER" = TRAIT_HEAVY_SLEEPER,
+ "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP,
+ "TRAIT_SILENT_STEP" = TRAIT_SILENT_STEP,
+ "TRAIT_VORACIOUS" = TRAIT_VORACIOUS,
+ "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE,
+ "TRAIT_FREERUNNING" = TRAIT_FREERUNNING,
+ "TRAIT_SKITTISH" = TRAIT_SKITTISH,
+ "TRAIT_POOR_AIM" = TRAIT_POOR_AIM,
+ "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA,
+ "TRAIT_DRUNK_HEALING" = TRAIT_DRUNK_HEALING,
+ "TRAIT_TAGGER" = TRAIT_TAGGER,
+ "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER,
+ "TRAIT_MUSICIAN" = TRAIT_MUSICIAN,
+ "TRAIT_MASO" = TRAIT_MASO,
+ "TRAIT_HIGH_BLOOD" = TRAIT_HIGH_BLOOD,
+ "TRAIT_EMPATH" = TRAIT_EMPATH,
+ "TRAIT_FRIENDLY" = TRAIT_FRIENDLY
+ ),
+ /obj/item/bodypart = list(
+ "TRAIT_PARALYSIS" = TRAIT_PARALYSIS
+ ),
+ /obj/item = list(
+ "TRAIT_NODROP" = TRAIT_NODROP,
+ "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT
+ )
+ ))
+
+
+/// value -> trait name, generated on use from trait_by_type global
+GLOBAL_LIST(trait_name_map)
+
+/proc/generate_trait_name_map()
+ . = list()
+ for(var/key in GLOB.traits_by_type)
+ for(var/tname in GLOB.traits_by_type[key])
+ var/val = GLOB.traits_by_type[key][tname]
+ .[val] = tname
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index 1312183750..3c6660b3ab 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -248,8 +248,18 @@
/datum/config_entry/number/movedelay/run_delay
+/datum/config_entry/number/movedelay/run_delay/ValidateAndSet()
+ . = ..()
+ var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/run)
+ M.sync()
+
/datum/config_entry/number/movedelay/walk_delay
+/datum/config_entry/number/movedelay/walk_delay/ValidateAndSet()
+ . = ..()
+ var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/walk)
+ M.sync()
+
/datum/config_entry/number/movedelay/sprint_speed_increase
config_entry_value = 1
@@ -288,6 +298,8 @@
/datum/config_entry/flag/roundstart_away //Will random away mission be loaded.
+/datum/config_entry/flag/roundstart_vr //Will virtual reality missions be loaded?
+
/datum/config_entry/number/gateway_delay //How long the gateway takes before it activates. Default is half an hour. Only matters if roundstart_away is enabled.
config_entry_value = 18000
min_val = 0
diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm
index 12b467b624..c6e6a84bcf 100644
--- a/code/controllers/subsystem/lighting.dm
+++ b/code/controllers/subsystem/lighting.dm
@@ -6,7 +6,6 @@ SUBSYSTEM_DEF(lighting)
name = "Lighting"
wait = 2
init_order = INIT_ORDER_LIGHTING
- flags = SS_TICKER
/datum/controller/subsystem/lighting/stat_entry()
..("L:[GLOB.lighting_update_lights.len]|C:[GLOB.lighting_update_corners.len]|O:[GLOB.lighting_update_objects.len]")
@@ -85,4 +84,4 @@ SUBSYSTEM_DEF(lighting)
/datum/controller/subsystem/lighting/Recover()
initialized = SSlighting.initialized
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index f13d5a2779..89155cefb3 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -1,3 +1,5 @@
+#define INIT_ANNOUNCE(X) to_chat(world, "[X]"); log_world(X)
+
SUBSYSTEM_DEF(mapping)
name = "Mapping"
init_order = INIT_ORDER_MAPPING
@@ -81,7 +83,9 @@ SUBSYSTEM_DEF(mapping)
// Pick a random away mission.
if(CONFIG_GET(flag/roundstart_away))
createRandomZlevel()
-
+ // Pick a random VR level.
+ if(CONFIG_GET(flag/roundstart_vr))
+ createRandomZlevel(VIRT_REALITY_NAME, list(ZTRAIT_AWAY = TRUE, ZTRAIT_VR = TRUE), GLOB.potential_vr_levels)
// Generate mining ruins
loading_ruins = TRUE
@@ -181,7 +185,6 @@ SUBSYSTEM_DEF(mapping)
z_list = SSmapping.z_list
-#define INIT_ANNOUNCE(X) to_chat(world, "[X]"); log_world(X)
/datum/controller/subsystem/mapping/proc/LoadGroup(list/errorList, name, path, files, list/traits, list/default_traits, silent = FALSE)
. = list()
var/start_time = REALTIMEOFDAY
@@ -265,7 +268,6 @@ SUBSYSTEM_DEF(mapping)
msg += ", [FailedZs[I]]"
msg += ". Yell at your server host!"
INIT_ANNOUNCE(msg)
-#undef INIT_ANNOUNCE
GLOBAL_LIST_EMPTY(the_station_areas)
@@ -410,52 +412,63 @@ GLOBAL_LIST_EMPTY(the_station_areas)
//Manual loading of away missions.
/client/proc/admin_away()
- set name = "Load Away Mission"
+ set name = "Load Away Mission / Virtual Reality"
set category = "Fun"
if(!holder ||!check_rights(R_FUN))
return
+ var/choice = alert(src, "What kind of level would you like to load?", "Load Away/VR", AWAY_MISSION_NAME, VIRT_REALITY_NAME, "Cancel")
- if(!GLOB.the_gateway)
- if(alert("There's no home gateway on the station. You sure you want to continue ?", "Uh oh", "Yes", "No") != "Yes")
+ var/list/possible_options
+ var/list/ztraits
+ switch(choice)
+ if(VIRT_REALITY_NAME)
+ possible_options = GLOB.potential_vr_levels
+ ztraits = list(ZTRAIT_AWAY = TRUE, ZTRAIT_VR = TRUE)
+ if(AWAY_MISSION_NAME)
+ if(!GLOB.the_gateway)
+ if(alert("There's no home gateway on the station. You sure you want to continue ?", "Uh oh", "Yes", "No") != "Yes")
+ return
+ possible_options = GLOB.potential_away_levels
+ ztraits = list(ZTRAIT_AWAY = TRUE)
+ else
return
- var/list/possible_options = GLOB.potentialRandomZlevels + "Custom"
- var/away_name
- var/datum/space_level/away_level
+ possible_options += "Custom"
+ var/lvl_name
+ var/datum/space_level/level
- var/answer = input("What kind ? ","Away") as null|anything in possible_options
+ var/answer = input("What kind ? ","Away/VR") as null|anything in possible_options
switch(answer)
+ if(null)
+ return
if("Custom")
var/mapfile = input("Pick file:", "File") as null|file
if(!mapfile)
return
- away_name = "[mapfile] custom"
- to_chat(usr,"Loading [away_name]...")
- var/datum/map_template/template = new(mapfile, "Away Mission")
- away_level = template.load_new_z()
+ lvl_name = "[mapfile] custom"
+ to_chat(usr,"Loading [lvl_name]...")
+ var/datum/map_template/template = new(mapfile, choice, ztraits)
+ level = template.load_new_z(ztraits)
else
- if(answer in GLOB.potentialRandomZlevels)
- away_name = answer
- to_chat(usr,"Loading [away_name]...")
- var/datum/map_template/template = new(away_name, "Away Mission")
- away_level = template.load_new_z()
- else
- return
+ lvl_name = answer
+ to_chat(usr,"Loading [lvl_name]...")
+ var/datum/map_template/template = new(lvl_name, choice)
+ level = template.load_new_z(ztraits)
- message_admins("Admin [key_name_admin(usr)] has loaded [away_name] away mission.")
- log_admin("Admin [key_name(usr)] has loaded [away_name] away mission.")
- if(!away_level)
- message_admins("Loading [away_name] failed!")
+ message_admins("Admin [key_name_admin(usr)] has loaded [lvl_name] [choice].")
+ log_admin("Admin [key_name(usr)] has loaded [lvl_name] [choice].")
+ if(!level)
+ message_admins("Loading [lvl_name] failed!")
return
- if(GLOB.the_gateway)
+ if(choice == AWAY_MISSION_NAME && GLOB.the_gateway)
//Link any found away gate with station gate
var/obj/machinery/gateway/centeraway/new_gate
for(var/obj/machinery/gateway/centeraway/G in GLOB.machines)
- if(G.z == away_level.z_value) //I'll have to refactor gateway shitcode before multi-away support.
+ if(G.z == level.z_value) //I'll have to refactor gateway shitcode before multi-away support.
new_gate = G
break
//Link station gate with away gate and remove wait time.
diff --git a/code/controllers/subsystem/processing/flightpacks.dm b/code/controllers/subsystem/processing/flightpacks.dm
deleted file mode 100644
index a462e2b645..0000000000
--- a/code/controllers/subsystem/processing/flightpacks.dm
+++ /dev/null
@@ -1,25 +0,0 @@
-PROCESSING_SUBSYSTEM_DEF(flightpacks)
- name = "Flightpack Movement"
- priority = FIRE_PRIORITY_FLIGHTPACKS
- wait = 2
- stat_tag = "FM"
- flags = SS_NO_INIT|SS_TICKER|SS_KEEP_TIMING
-
- var/flightsuit_processing = FLIGHTSUIT_PROCESSING_FULL
-
-/datum/controller/subsystem/processing/flightpacks/Initialize()
- sync_flightsuit_processing()
-
-/datum/controller/subsystem/processing/flightpacks/vv_edit_var(var_name, var_value)
- ..()
- switch(var_name)
- if("flightsuit_processing")
- sync_flightsuit_processing()
-
-/datum/controller/subsystem/processing/flightpacks/proc/sync_flightsuit_processing()
- for(var/obj/item/flightpack/FP in processing)
- FP.sync_processing(src)
- if(flightsuit_processing == FLIGHTSUIT_PROCESSING_NONE) //Don't even bother firing.
- can_fire = FALSE
- else
- can_fire = TRUE
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index e4a3ff1f9a..a3e804d541 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -217,13 +217,13 @@ SUBSYSTEM_DEF(shuttle)
call_reason = trim(html_encode(call_reason))
- if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH && seclevel2num(get_security_level()) > SEC_LEVEL_GREEN)
+ if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH && GLOB.security_level > SEC_LEVEL_GREEN)
to_chat(user, "You must provide a reason.")
return
var/area/signal_origin = get_area(user)
var/emergency_reason = "\nNature of emergency:\n\n[call_reason]"
- var/security_num = seclevel2num(get_security_level())
+ var/security_num = GLOB.security_level
switch(security_num)
if(SEC_LEVEL_RED,SEC_LEVEL_DELTA)
emergency.request(null, signal_origin, html_decode(emergency_reason), 1) //There is a serious threat we gotta move no time to give them five minutes.
@@ -285,7 +285,7 @@ SUBSYSTEM_DEF(shuttle)
/datum/controller/subsystem/shuttle/proc/canRecall()
if(!emergency || emergency.mode != SHUTTLE_CALL || emergencyNoRecall || SSticker.mode.name == "meteor")
return
- var/security_num = seclevel2num(get_security_level())
+ var/security_num = GLOB.security_level
switch(security_num)
if(SEC_LEVEL_GREEN)
if(emergency.timeLeft(1) < emergencyCallTime)
@@ -642,7 +642,7 @@ SUBSYSTEM_DEF(shuttle)
/datum/controller/subsystem/shuttle/proc/autoEnd() //CIT CHANGE - allows shift to end without being a proper shuttle call?
if(EMERGENCY_IDLE_OR_RECALLED)
SSshuttle.emergency.request(silent = TRUE)
- priority_announce("The shift has come to an end and the shuttle called. [seclevel2num(get_security_level()) == SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [emergency.timeLeft(600)] minutes.", null, "shuttlecalled", "Priority")
+ priority_announce("The shift has come to an end and the shuttle called. [GLOB.security_level == SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [emergency.timeLeft(600)] minutes.", null, "shuttlecalled", "Priority")
log_game("Round end vote passed. Shuttle has been auto-called.")
message_admins("Round end vote passed. Shuttle has been auto-called.")
emergencyNoRecall = TRUE
diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm
index bd2fb854af..36bf992cfb 100644
--- a/code/controllers/subsystem/timer.dm
+++ b/code/controllers/subsystem/timer.dm
@@ -94,7 +94,7 @@ SUBSYSTEM_DEF(timer)
if(ctime_timer.flags & TIMER_LOOP)
ctime_timer.spent = 0
ctime_timer.timeToRun = REALTIMEOFDAY + ctime_timer.wait
- BINARY_INSERT(ctime_timer, clienttime_timers, datum/timedevent, timeToRun)
+ BINARY_INSERT(ctime_timer, clienttime_timers, datum/timedevent, ctime_timer, timeToRun, COMPARE_KEY)
else
qdel(ctime_timer)
@@ -423,7 +423,7 @@ SUBSYSTEM_DEF(timer)
L = SStimer.second_queue
if(L)
- BINARY_INSERT(src, L, datum/timedevent, timeToRun)
+ BINARY_INSERT(src, L, datum/timedevent, src, timeToRun, COMPARE_KEY)
return
//get the list of buckets
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index a202afd905..df3f24f0dc 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -361,7 +361,7 @@ SUBSYSTEM_DEF(vote)
picked = S
runnable_storytellers[S] *= round(stored_gamemode_votes[initial(S.name)]*100000,1)
if(!picked)
- picked = pickweightAllowZero(runnable_storytellers)
+ picked = pickweight(runnable_storytellers, 0)
GLOB.dynamic_storyteller_type = picked
if("map")
var/datum/map_config/VM = config.maplist[.]
diff --git a/code/datums/action.dm b/code/datums/action.dm
index f2f93ac40d..8862482dc2 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -171,7 +171,7 @@
if(!..())
return 0
var/mob/M = target
- M.ghostize(1)
+ M.ghostize(can_reenter_corpse = TRUE, voluntary = TRUE)
/datum/action/proc/OnUpdatedIcon()
UpdateButtonIcon()
diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm
index ebddc187ae..9c6bb2ebfd 100644
--- a/code/datums/ai_laws.dm
+++ b/code/datums/ai_laws.dm
@@ -253,7 +253,7 @@
var/datum/ai_laws/lawtype
var/list/law_weights = CONFIG_GET(keyed_list/law_weight)
while(!lawtype && law_weights.len)
- var/possible_id = pickweightAllowZero(law_weights)
+ var/possible_id = pickweight(law_weights, 0)
lawtype = lawid_to_type(possible_id)
if(!lawtype)
law_weights -= possible_id
diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm
index 5e9382f88e..6938046e11 100644
--- a/code/datums/components/mood.dm
+++ b/code/datums/components/mood.dm
@@ -175,27 +175,27 @@
switch(sanity)
if(-INFINITY to SANITY_CRAZY)
setInsanityEffect(MAJOR_INSANITY_PEN)
- master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1.5) //Did we change something ? movetypes is runtiming, movetypes=(~FLYING))
+ master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/insane)
sanity_level = 6
if(SANITY_CRAZY to SANITY_UNSTABLE)
setInsanityEffect(MINOR_INSANITY_PEN)
- master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1)//, movetypes=(~FLYING))
+ master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/crazy)
sanity_level = 5
if(SANITY_UNSTABLE to SANITY_DISTURBED)
setInsanityEffect(0)
- master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=0.5)//, movetypes=(~FLYING))
+ master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/disturbed)
sanity_level = 4
if(SANITY_DISTURBED to SANITY_NEUTRAL)
setInsanityEffect(0)
- master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE)
+ master.remove_movespeed_modifier(MOVESPEED_ID_SANITY)
sanity_level = 3
if(SANITY_NEUTRAL+1 to SANITY_GREAT+1) //shitty hack but +1 to prevent it from responding to super small differences
setInsanityEffect(0)
- master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE)
+ master.remove_movespeed_modifier(MOVESPEED_ID_SANITY)
sanity_level = 2
if(SANITY_GREAT+1 to INFINITY)
setInsanityEffect(0)
- master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE)
+ master.remove_movespeed_modifier(MOVESPEED_ID_SANITY)
sanity_level = 1
//update_mood_icon()
diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm
index 8ba748dac7..29add286be 100644
--- a/code/datums/components/nanites.dm
+++ b/code/datums/components/nanites.dm
@@ -12,7 +12,7 @@
var/list/datum/nanite_program/programs = list()
var/max_programs = NANITE_PROGRAM_LIMIT
- var/list/datum/nanite_program/protocol/protocols = list() ///Separate list of protocol programs, to avoid looping through the whole programs list when cheking for conflicts
+ var/list/datum/nanite_program/protocol/protocols = list() ///Separate list of protocol programs, to avoid looping through the whole programs list when checking for conflicts
var/start_time = 0 ///Timestamp to when the nanites were first inserted in the host
var/stealth = FALSE //if TRUE, does not appear on HUDs and health scans
var/diagnostics = TRUE //if TRUE, displays program list when scanned by nanite scanners
diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm
index d185221163..9ea723b5bc 100644
--- a/code/datums/components/riding.dm
+++ b/code/datums/components/riding.dm
@@ -204,7 +204,7 @@
. = ..()
var/mob/living/carbon/human/H = parent
if(!length(H.buckled_mobs))
- H.remove_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING)
+ H.remove_movespeed_modifier(/datum/movespeed_modifier/human_carry)
if(!fireman_carrying)
M.Daze(25)
REMOVE_TRAIT(M, TRAIT_MOBILITY_NOUSE, src)
@@ -213,7 +213,7 @@
. = ..()
var/mob/living/carbon/human/H = parent
if(length(H.buckled_mobs))
- H.add_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING, multiplicative_slowdown = fireman_carrying? FIREMAN_CARRY_SLOWDOWN : PIGGYBACK_CARRY_SLOWDOWN)
+ H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/human_carry, TRUE, fireman_carrying? FIREMAN_CARRY_SLOWDOWN : PIGGYBACK_CARRY_SLOWDOWN)
if(fireman_carrying)
ADD_TRAIT(M, TRAIT_MOBILITY_NOUSE, src)
diff --git a/code/datums/components/shrink.dm b/code/datums/components/shrink.dm
index f070d9b22f..96807fe313 100644
--- a/code/datums/components/shrink.dm
+++ b/code/datums/components/shrink.dm
@@ -14,7 +14,7 @@
parent_atom.opacity = 0
if(isliving(parent_atom))
var/mob/living/L = parent_atom
- L.add_movespeed_modifier(MOVESPEED_ID_SHRINK_RAY, update=TRUE, priority=100, multiplicative_slowdown=4)
+ L.add_movespeed_modifier(/datum/movespeed_modifier/shrink_ray)
if(iscarbon(L))
var/mob/living/carbon/C = L
C.unequip_everything()
@@ -35,7 +35,7 @@
parent_atom.opacity = oldopac
if(isliving(parent_atom))
var/mob/living/L = parent_atom
- L.remove_movespeed_modifier(MOVESPEED_ID_SHRINK_RAY)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/shrink_ray)
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.physiology.damage_resistance += 100
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index f97fde6f7e..348f9e6778 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -29,7 +29,8 @@
VV_DROPDOWN_OPTION(VV_HK_MARK, "Mark Object")
VV_DROPDOWN_OPTION(VV_HK_DELETE, "Delete")
VV_DROPDOWN_OPTION(VV_HK_EXPOSE, "Show VV To Player")
-// VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits")
+ VV_DROPDOWN_OPTION(VV_HK_ADDCOMPONENT, "Add Component/Element")
+ VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits")
//This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks!
//href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables!
@@ -37,8 +38,8 @@
/datum/proc/vv_do_topic(list/href_list)
if(!usr || !usr.client || !usr.client.holder || !check_rights(NONE))
return FALSE //This is VV, not to be called by anything else.
-// if(href_list[VV_HK_MODIFY_TRAITS])
-// usr.client.holder.modify_traits(src)
+ if(href_list[VV_HK_MODIFY_TRAITS])
+ usr.client.holder.modify_traits(src)
return TRUE
/datum/proc/vv_get_header()
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index e08d5c509c..e0df2a8f1b 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -309,7 +309,7 @@
unique_enzymes = generate_unique_enzymes()
uni_identity = generate_uni_identity()
generate_dna_blocks()
- features = random_features(species?.id)
+ features = random_features(species?.id, holder?.gender)
/datum/dna/stored //subtype used by brain mob's stored_dna
@@ -662,6 +662,6 @@
var/danger = CONFIG_GET(number/threshold_body_size_slowdown)
if(features["body_size"] < danger)
var/slowdown = 1 + round(danger/features["body_size"], 0.1) * CONFIG_GET(number/body_size_slowdown_multiplier)
- holder.add_movespeed_modifier(MOVESPEED_ID_SMALL_STRIDE, TRUE, 100, NONE, TRUE, slowdown, ALL, FLOATING|CRAWLING)
+ holder.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/small_stride, TRUE, slowdown)
else if(old_size < danger)
- holder.remove_movespeed_modifier(MOVESPEED_ID_SMALL_STRIDE)
+ holder.remove_movespeed_modifier(/datum/movespeed_modifier/small_stride)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index e22b33d90a..680c0a89c4 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -120,12 +120,12 @@
/datum/status_effect/mesmerize/on_creation(mob/living/new_owner, set_duration)
. = ..()
ADD_TRAIT(owner, TRAIT_MUTE, "mesmerize")
- owner.add_movespeed_modifier("[STATUS_EFFECT_MESMERIZE]_[id]", TRUE, priority = 64, override = TRUE, multiplicative_slowdown = 5, blacklisted_movetypes = FALSE? NONE : CRAWLING)
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/mesmerize)
/datum/status_effect/mesmerize/on_remove()
. = ..()
REMOVE_TRAIT(owner, TRAIT_MUTE, "mesmerize")
- owner.remove_movespeed_modifier("[STATUS_EFFECT_MESMERIZE]_[id]")
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/mesmerize)
/datum/status_effect/mesmerize/on_creation(mob/living/new_owner, set_duration)
if(isnum(set_duration))
@@ -141,9 +141,7 @@
/datum/status_effect/electrode
id = "tased"
alert_type = null
- var/slowdown = 1.5
- var/slowdown_priority = 50 //to make sure the stronger effect overrides
- var/affect_crawl = FALSE
+ var/movespeed_mod = /datum/movespeed_modifier/status_effect/tased
var/nextmove_modifier = 1
var/stamdmg_per_ds = 0 //a 20 duration would do 20 stamdmg, disablers do 24 or something
var/last_tick = 0 //fastprocess processing speed is a goddamn sham, don't trust it.
@@ -155,12 +153,12 @@
last_tick = world.time
if(iscarbon(owner))
var/mob/living/carbon/C = owner
- C.add_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]", TRUE, priority = slowdown_priority, override = TRUE, multiplicative_slowdown = slowdown, blacklisted_movetypes = affect_crawl? NONE : CRAWLING)
+ C.add_movespeed_modifier(movespeed_mod)
/datum/status_effect/electrode/on_remove()
if(iscarbon(owner))
var/mob/living/carbon/C = owner
- C.remove_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]")
+ C.remove_movespeed_modifier(movespeed_mod)
. = ..()
/datum/status_effect/electrode/tick()
@@ -178,8 +176,7 @@
/datum/status_effect/electrode/no_combat_mode
id = "tased_strong"
- slowdown = 8
- slowdown_priority = 100
+ movespeed_mod = /datum/movespeed_modifier/status_effect/tased/no_combat_mode
nextmove_modifier = 2
blocks_combatmode = TRUE
stamdmg_per_ds = 1
@@ -650,11 +647,11 @@
if(isnum(set_duration))
duration = set_duration
. = ..()
- owner.add_movespeed_modifier(MOVESPEED_ID_ELECTROSTAFF, multiplicative_slowdown = 1, movetypes = GROUND)
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/electrostaff)
/datum/status_effect/electrostaff/on_remove()
. = ..()
- owner.remove_movespeed_modifier(MOVESPEED_ID_ELECTROSTAFF)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/electrostaff)
//GOLEM GANG
diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm
index c2855250f4..30699d36f4 100644
--- a/code/datums/world_topic.dm
+++ b/code/datums/world_topic.dm
@@ -169,7 +169,7 @@
.["real_mode"] = SSticker.mode.name
// Key-authed callers may know the truth behind the "secret"
- .["security_level"] = get_security_level()
+ .["security_level"] = NUM2SECLEVEL(GLOB.security_level)
.["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0
// Amount of world's ticks in seconds, useful for calculating round duration
diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm
index d548f373db..32fb4498dd 100644
--- a/code/game/gamemodes/dynamic/dynamic.dm
+++ b/code/game/gamemodes/dynamic/dynamic.dm
@@ -164,7 +164,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic)
dat += "Current threat: [threat] \[Adjust\] \[View Log\]
"
dat += "
"
- dat += "Storyteller: [storyteller.name]
"
+ dat += "Storyteller: [storyteller.name]
"
dat += "Parameters: centre = [GLOB.dynamic_curve_centre] ; width = [GLOB.dynamic_curve_width].
"
dat += "On average, [peaceful_percentage]% of the rounds are more peaceful.
"
dat += "Forced extended: [GLOB.dynamic_forced_extended ? "On" : "Off"]
"
@@ -222,6 +222,15 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic)
show_threatlog(usr)
else if (href_list["stacking_limit"])
GLOB.dynamic_stacking_limit = input(usr,"Change the threat limit at which round-endings rulesets will start to stack.", "Change stacking limit", null) as num
+ else if (href_list["change_storyteller"])
+ var/list/choices = list()
+ for(var/T in config.storyteller_cache)
+ var/datum/dynamic_storyteller/S = T
+ choices[initial(S.name)] = T
+ var/selected_storyteller = choices[input("Select storyteller:", "Storyteller", storyteller.name) as null|anything in choices]
+ storyteller = new selected_storyteller
+ storyteller.on_start()
+ message_admins("[key_name(usr)] changed the storyteller to [storyteller].", 1)
admin_panel() // Refreshes the window
@@ -441,6 +450,8 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic)
if(!drafted_rules.len)
message_admins("Not enough threat level for roundstart antags!")
log_game("DYNAMIC: Not enough threat level for roundstart antags!")
+ midround_injection_cooldown = round((midround_injection_cooldown + world.time) / 2, 1)
+ latejoin_injection_cooldown = round((latejoin_injection_cooldown + world.time) / 2, 1)
var/indice_pop = min(10,round(roundstart_pop_ready/pop_per_requirement)+1)
extra_rulesets_amount = 0
if (GLOB.dynamic_classic_secret)
@@ -721,7 +732,8 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic)
if (O.started_as_observer) // Observers
current_players[CURRENT_OBSERVERS].Add(M)
continue
- current_players[CURRENT_DEAD_PLAYERS].Add(M) // Players who actually died (and admins who ghosted, would be nice to avoid counting them somehow)
+ if(!M.voluntary_ghosted)
+ current_players[CURRENT_DEAD_PLAYERS].Add(M) // Players who actually died (and admins who ghosted, would be nice to avoid counting them somehow)
threat = storyteller.calculate_threat() + added_threat
if(threat_average_weight)
var/cur_sample_weight = world.time - last_threat_sample_time
diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm
index 3639ada166..561b38fde1 100644
--- a/code/game/gamemodes/dynamic/dynamic_storytellers.dm
+++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm
@@ -115,7 +115,7 @@ Property weights are:
return 100
var/threat_perc = mode.threat/mode.threat_level
- return round(max(0,100*(1-(threat_perc*threat_perc*threat_perc))))
+ return clamp(round(100*(1-(threat_perc*threat_perc))**2,1),0,100)
/datum/dynamic_storyteller/proc/roundstart_draft()
var/list/drafted_rules = list()
@@ -152,7 +152,7 @@ Property weights are:
is 2.26 times as likely to be picked, all other things considered.
Of course, we don't want it to GUARANTEE the closest, that's no fun, so it's just a weight.
*/
- threat_weight = 1-abs(1-LOGISTIC_FUNCTION(2,0.05,cost_difference,0))
+ threat_weight = abs(1-abs(1-LOGISTIC_FUNCTION(2,0.05,cost_difference,0)))
if (rule.ready())
var/property_weight = 0
for(var/property in property_weights)
@@ -209,8 +209,8 @@ Property weights are:
weight = 1
event_frequency_lower = 2 MINUTES
event_frequency_upper = 10 MINUTES
- flags = WAROPS_ALWAYS_ALLOWED
- min_players = 40
+ flags = WAROPS_ALWAYS_ALLOWED | FORCE_IF_WON
+ min_players = 30
var/refund_cooldown = 0
/datum/dynamic_storyteller/chaotic/do_process()
@@ -232,7 +232,7 @@ Property weights are:
curve_centre = 2
curve_width = 1.5
weight = 2
- min_players = 30
+ min_players = 20
flags = WAROPS_ALWAYS_ALLOWED | USE_PREV_ROUND_WEIGHTS
property_weights = list("valid" = 3, "trust" = 5)
@@ -331,7 +331,7 @@ Property weights are:
/datum/dynamic_storyteller/story/calculate_threat()
var/current_time = (world.time / SSautotransfer.targettime)*180
mode.threat_level = round(mode.initial_threat_level*(sin(current_time)+0.25),0.1)
- ..()
+ return ..()
/datum/dynamic_storyteller/classic
name = "Classic"
@@ -358,7 +358,7 @@ Property weights are:
flags = NO_ASSASSIN | FORCE_IF_WON
weight = 1
dead_player_weight = 5
- property_weights = list("extended" = 2, "chaos" = -1, "valid" = -1, "story_potential" = 1, "conversion" = -10)
+ property_weights = list("extended" = 2, "chaos" = -1, "valid" = -1, "conversion" = -10)
/datum/dynamic_storyteller/no_antag
name = "Extended"
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 5affeba6d6..57919863f2 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -272,7 +272,7 @@
reports += config.mode_reports[config_tag]
Count++
for(var/i in Count to rand(3,5)) //Between three and five wrong entries on the list.
- var/false_report_type = pickweightAllowZero(report_weights)
+ var/false_report_type = pickweight(report_weights, 0)
report_weights[false_report_type] = 0 //Make it so the same false report won't be selected twice
reports += config.mode_reports[false_report_type]
diff --git a/code/game/gamemodes/gangs/dominator.dm b/code/game/gamemodes/gangs/dominator.dm
index 858c10c46c..dca50be5b9 100644
--- a/code/game/gamemodes/gangs/dominator.dm
+++ b/code/game/gamemodes/gangs/dominator.dm
@@ -229,7 +229,7 @@
if(!was_stranded)
priority_announce("All hostile activity within station systems has ceased.","Network Alert")
- if(get_security_level() == "delta")
+ if(NUM2SECLEVEL(GLOB.security_level) == "delta")
set_security_level("red")
SSshuttle.clearHostileEnvironment(src)
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 8b3958e606..64704d4771 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -439,8 +439,3 @@
desc = "An autolathe reprogrammed with security protocols to prevent hacking."
hackable = FALSE
circuit = /obj/item/circuitboard/machine/autolathe/secure
-
-//Called when the object is constructed by an autolathe
-//Has a reference to the autolathe so you can do !!FUN!! things with hacked lathes
-/obj/item/proc/autolathe_crafted(obj/machinery/autolathe/A)
- return
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 4c3d85a162..6eb06e3be4 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -111,7 +111,7 @@
to_chat(usr, "Authorization confirmed. Modifying security level.")
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
//Only notify people if an actual change happened
- var/security_level = get_security_level()
+ var/security_level = NUM2SECLEVEL(GLOB.security_level)
log_game("[key_name(usr)] has changed the security level to [security_level] with [src] at [AREACOORD(usr)].")
message_admins("[ADMIN_LOOKUPFLW(usr)] has changed the security level to [security_level] with [src] at [AREACOORD(usr)].")
deadchat_broadcast("[usr.real_name] has changed the security level to [security_level] with [src] at [get_area_name(usr, TRUE)].", usr)
@@ -404,7 +404,7 @@
security_level_cd = world.time + 15 SECONDS
if(GLOB.security_level != old_level)
//Only notify people if an actual change happened
- var/security_level = get_security_level()
+ var/security_level = NUM2SECLEVEL(GLOB.security_level)
log_game("[key_name(usr)] has changed the security level to [security_level] from [src] at [AREACOORD(usr)].")
message_admins("[ADMIN_LOOKUPFLW(usr)] has changed the security level to [security_level] from [src] at [AREACOORD(usr)].")
deadchat_broadcast("[usr.real_name] has changed the security level to [security_level] from [src] at [get_area_name(usr, TRUE)].", usr)
@@ -555,7 +555,7 @@
dat += " Biohazard \]
"
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
if(STATE_ALERT_LEVEL)
- dat += "Current alert level: [get_security_level()]
"
+ dat += "Current alert level: [NUM2SECLEVEL(GLOB.security_level)]
"
if(GLOB.security_level == SEC_LEVEL_DELTA)
dat += "The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate."
else
@@ -563,8 +563,8 @@
dat += "Blue
"
dat += "Green"
if(STATE_CONFIRM_LEVEL)
- dat += "Current alert level: [get_security_level()]
"
- dat += "Confirm the change to: [num2seclevel(tmp_alertlevel)]
"
+ dat += "Current alert level: [NUM2SECLEVEL(GLOB.security_level)]
"
+ dat += "Confirm the change to: [NUM2SECLEVEL(tmp_alertlevel)]
"
dat += "Swipe ID to confirm change.
"
if(STATE_TOGGLE_EMERGENCY)
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
@@ -696,7 +696,7 @@
dat += " Biohazard \]
"
if(STATE_ALERT_LEVEL)
- dat += "Current alert level: [get_security_level()]
"
+ dat += "Current alert level: [NUM2SECLEVEL(GLOB.security_level)]
"
if(GLOB.security_level == SEC_LEVEL_DELTA)
dat += "The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate."
else
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 118145ed88..07f95c17ff 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -405,7 +405,7 @@
// Ghost and delete the mob.
if(!mob_occupant.get_ghost(1))
- mob_occupant.ghostize(FALSE, penalize = TRUE)
+ mob_occupant.ghostize(FALSE, penalize = TRUE, voluntary = TRUE)
QDEL_NULL(occupant)
for(var/I in cryo_items) //only "CRYO_DESTROY_LATER" atoms are left)
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 9acc8921b9..fb321665bc 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -19,6 +19,7 @@
var/processing_queue = 0
var/screen = "main"
var/temp
+ var/offstation_security_levels = TRUE
var/list/part_sets = list(
"Cyborg",
"Ripley",
@@ -72,6 +73,8 @@
for(var/obj/item/stock_parts/manipulator/Ml in component_parts)
T += Ml.rating
time_coeff = round(initial(time_coeff) - (initial(time_coeff)*(T))/5,0.01)
+ var/obj/item/circuitboard/machine/mechfab/C = circuit
+ offstation_security_levels = C.offstation_security_levels
/obj/machinery/mecha_part_fabricator/examine(mob/user)
. = ..()
@@ -106,13 +109,27 @@
if(!(set_name in D.category))
continue
output += "[output_part_info(D)]
\["
- if(check_resources(D))
+ if(check_clearance(D) && check_resources(D))
output += "
Build | "
output += "
Add to queue\]\[
?\]
"
return output
+/obj/machinery/mecha_part_fabricator/proc/check_clearance(datum/design/D)
+ if(!(obj_flags & EMAGGED) && (offstation_security_levels || is_station_level(z)) && !ISINRANGE(GLOB.security_level, D.min_security_level, D.max_security_level))
+ return FALSE
+ return TRUE
+
/obj/machinery/mecha_part_fabricator/proc/output_part_info(datum/design/D)
- var/output = "[initial(D.name)] (Cost: [output_part_cost(D)]) [get_construction_time_w_coeff(D)/10]sec"
+ var/clearance = !(obj_flags & EMAGGED) && (offstation_security_levels || is_station_level(z))
+ var/sec_text = ""
+ if(clearance && (D.min_security_level > SEC_LEVEL_GREEN || D.max_security_level < SEC_LEVEL_DELTA))
+ sec_text = " (Allowed security levels: "
+ for(var/n in D.min_security_level to D.max_security_level)
+ sec_text += NUM2SECLEVEL(n)
+ if(n + 1 <= D.max_security_level)
+ sec_text += ", "
+ sec_text += ") "
+ var/output = "[initial(D.name)] (Cost: [output_part_cost(D)]) [sec_text][get_construction_time_w_coeff(D)/10]sec"
return output
/obj/machinery/mecha_part_fabricator/proc/output_part_cost(datum/design/D)
@@ -216,6 +233,11 @@
while(D)
if(stat&(NOPOWER|BROKEN))
return FALSE
+ if(!check_clearance(D))
+ say("Security level not met. Queue processing stopped.")
+ temp = {"Security level not met to build next part.
+ Try again | Return"}
+ return FALSE
if(!check_resources(D))
say("Not enough resources. Queue processing stopped.")
temp = {"Not enough resources to build next part.
@@ -236,7 +258,7 @@
for(var/datum/design/D in queue)
i++
var/obj/part = D.build_path
- output += ""
+ output += ""
output += initial(part.name) + " - "
output += "[i>1?"↑":null] "
output += "[i↓":null] "
@@ -440,3 +462,7 @@
return FALSE
return TRUE
+
+/obj/machinery/mecha_part_fabricator/offstation
+ offstation_security_levels = FALSE
+ circuit = /obj/item/circuitboard/machine/mechfab/offstation
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index 04f14692e3..851a041aab 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -483,7 +483,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
if(!SSmapping.station_room_templates[t])
log_world("Station room spawner placed at ([T.x], [T.y], [T.z]) has invalid ruin name of \"[t]\" in its list")
templates -= t
- template_name = pickweightAllowZero(templates)
+ template_name = pickweight(templates, 0)
if(!template_name)
GLOB.stationroom_landmarks -= src
qdel(src)
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 2fb068a29b..1fe5e46e25 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -170,7 +170,7 @@
if(!victim.client || !istype(victim))
return
to_chat(victim, "You feel fast!")
- victim.add_movespeed_modifier(MOVESPEED_ID_YELLOW_ORB, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING))
+ victim.add_movespeed_modifier(/datum/movespeed_modifier/yellow_orb)
sleep(duration)
- victim.remove_movespeed_modifier(MOVESPEED_ID_YELLOW_ORB)
+ victim.remove_movespeed_modifier(/datum/movespeed_modifier/yellow_orb)
to_chat(victim, "You slow down.")
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 9455a610c5..686018e06d 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -897,3 +897,11 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
. = ..()
if(var_name == NAMEOF(src, slowdown))
set_slowdown(var_value) //don't care if it's a duplicate edit as slowdown'll be set, do it anyways to force normal behavior.
+
+//Called when the object is constructed by an autolathe
+//Has a reference to the autolathe so you can do !!FUN!! things with hacked lathes
+/obj/item/proc/autolathe_crafted(obj/machinery/autolathe/A)
+ return
+
+/obj/item/proc/rnd_crafted(obj/machinery/rnd/production/P)
+ return
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index ef0380fce0..57638060f3 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -308,6 +308,13 @@
/obj/item/stock_parts/manipulator = 1,
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stack/sheet/glass = 1)
+ var/offstation_security_levels = TRUE
+
+/obj/item/circuitboard/machine/mechfab/offstation
+ offstation_security_levels = FALSE
+
+/obj/item/circuitboard/machine/mechfab/rnd_crafted(obj/machinery/rnd/production/P)
+ offstation_security_levels = P.offstation_security_levels
/obj/item/circuitboard/machine/cryo_tube
name = "Cryotube (Machine Board)"
@@ -759,6 +766,13 @@
/obj/item/stock_parts/matter_bin = 1,
/obj/item/stock_parts/manipulator = 1,
/obj/item/reagent_containers/glass/beaker = 2)
+ var/offstation_security_levels = TRUE
+
+/obj/item/circuitboard/machine/circuit_imprinter/offstation
+ offstation_security_levels = FALSE
+
+/obj/item/circuitboard/machine/mechfab/rnd_crafted(obj/machinery/rnd/production/P)
+ offstation_security_levels = P.offstation_security_levels
/obj/item/circuitboard/machine/circuit_imprinter/department
name = "Departmental Circuit Imprinter (Machine Board)"
@@ -832,6 +846,13 @@
/obj/item/stock_parts/matter_bin = 2,
/obj/item/stock_parts/manipulator = 2,
/obj/item/reagent_containers/glass/beaker = 2)
+ var/offstation_security_levels = TRUE
+
+/obj/item/circuitboard/machine/protolathe/offstation
+ offstation_security_levels = FALSE
+
+/obj/item/circuitboard/machine/protolathe/rnd_crafted(obj/machinery/rnd/production/P)
+ offstation_security_levels = P.offstation_security_levels
/obj/item/circuitboard/machine/protolathe/department
name = "Departmental Protolathe (Machine Board)"
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 9749bae313..0a705df91c 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -57,6 +57,35 @@
on_reading_finished(user)
reading = FALSE
return TRUE
+///TRAITS///
+
+/obj/item/book/granter/trait
+ var/granted_trait
+ var/traitname = "being cool"
+
+/obj/item/book/granter/trait/already_known(mob/user)
+ if(!granted_trait)
+ return TRUE
+ if(HAS_TRAIT(user, granted_trait))
+ to_chat(user, "You already have all the insight you need about [traitname].")
+ return TRUE
+ return FALSE
+
+/obj/item/book/granter/trait/on_reading_start(mob/user)
+ to_chat(user, "You start reading about [traitname]...")
+
+/obj/item/book/granter/trait/on_reading_finished(mob/user)
+ to_chat(user, "You feel like you've got a good handle on [traitname]!")
+ ADD_TRAIT(user, granted_trait, BOOK_TRAIT)
+
+/obj/item/book/granter/trait/rifleman
+ name = "\proper the Neo-Russian Rifleman\'s Primer"
+ desc = "A book with stains of vodka and...blood? The back is hard to read, but says something about bolt-actions. Or pump-actions. Both, maybe."
+ oneuse = FALSE
+ granted_trait = TRAIT_FAST_PUMP
+ traitname = "riflery"
+ icon_state = "book1"
+ remarks = list("One smooth motion...", "Palm the bolt...", "Push up, rotate back, push forward, down...", "Don't slap yourself with the bolt...", "Wait, what's this about pumping?", "Who just scribbled \"Z\" and \"LMB\" on this page?")
///ACTION BUTTONS///
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index d8e507050b..ec443d4e48 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -1117,9 +1117,9 @@
desc = "A box containing a gift for worthy golems."
/obj/item/storage/box/rndboards/PopulateContents()
- new /obj/item/circuitboard/machine/protolathe(src)
+ new /obj/item/circuitboard/machine/protolathe/offstation(src)
new /obj/item/circuitboard/machine/destructive_analyzer(src)
- new /obj/item/circuitboard/machine/circuit_imprinter(src)
+ new /obj/item/circuitboard/machine/circuit_imprinter/offstation(src)
new /obj/item/circuitboard/computer/rdconsole(src)
/obj/item/storage/box/silver_sulf
diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm
index f592055338..e81294ceea 100644
--- a/code/game/objects/items/tanks/jetpack.dm
+++ b/code/game/objects/items/tanks/jetpack.dm
@@ -52,7 +52,7 @@
ion_trail.start()
RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/move_react)
if(full_speed)
- user.add_movespeed_modifier(MOVESPEED_ID_JETPACK, priority=100, multiplicative_slowdown=-2, movetypes=FLOATING, conflict=MOVE_CONFLICT_JETPACK)
+ user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed)
/obj/item/tank/jetpack/proc/turn_off(mob/user)
on = FALSE
@@ -60,7 +60,7 @@
icon_state = initial(icon_state)
ion_trail.stop()
UnregisterSignal(user, COMSIG_MOVABLE_MOVED)
- user.remove_movespeed_modifier(MOVESPEED_ID_JETPACK)
+ user.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed)
/obj/item/tank/jetpack/proc/move_react(mob/user)
allow_thrust(0.01, user)
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 8496a8a216..2d132e4eef 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -303,7 +303,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
custom_materials = list(/datum/material/iron=500, /datum/material/glass=500)
resistance_flags = FIRE_PROOF
-
/obj/item/switchblade
name = "switchblade"
icon_state = "switchblade"
@@ -639,6 +638,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
w_class = WEIGHT_CLASS_SMALL
//Things in this list will be instantly splatted. Flyman weakness is handled in the flyman species weakness proc.
var/list/strong_against
+ var/list/spider_panic
/obj/item/melee/flyswatter/Initialize()
. = ..()
@@ -648,7 +648,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/mob/living/simple_animal/cockroach,
/obj/item/queen_bee
))
-
+ spider_panic = typecacheof(list(
+ /mob/living/simple_animal/banana_spider,
+ /mob/living/simple_animal/hostile/poison/giant_spider,
+ ))
/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, proximity_flag)
. = ..()
@@ -659,6 +662,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
if(istype(target, /mob/living/))
var/mob/living/bug = target
bug.death(1)
+ if(is_type_in_typecache(target, spider_panic))
+ to_chat(user, "You easily land a critical blow on the [target].")
+ if(istype(target, /mob/living/))
+ var/mob/living/bug = target
+ bug.adjustBruteLoss(-35) //What kinda mad man would go into melee with a spider?!
else
qdel(target)
diff --git a/code/game/world.dm b/code/game/world.dm
index bee595047f..1d719ee138 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -298,8 +298,8 @@ GLOBAL_LIST(topic_status_cache)
if(SSmapping.config) // this just stops the runtime, honk.
features += "[SSmapping.config.map_name]" //CIT CHANGE - makes the hub entry display the current map
- if(get_security_level())//CIT CHANGE - makes the hub entry show the security level
- features += "[get_security_level()] alert"
+ if(NUM2SECLEVEL(GLOB.security_level))//CIT CHANGE - makes the hub entry show the security level
+ features += "[NUM2SECLEVEL(GLOB.security_level)] alert"
if (n > 1)
features += "~[n] players"
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index cbd429af5c..b040c88a49 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -364,7 +364,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
log_admin("[key_name(usr)] admin ghosted.")
message_admins("[key_name_admin(usr)] admin ghosted.")
var/mob/body = mob
- body.ghostize(1)
+ body.ghostize(1, voluntary = TRUE)
if(body && !body.key)
body.key = "@[key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus
SSblackbox.record_feedback("tally", "admin_verb", 1, "Admin Ghost") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index ef8a63a728..5530225130 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -1379,3 +1379,47 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
else
message_admins("[key_name_admin(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name_admin(C)]")
log_admin("[key_name(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name(C)]")
+
+/// Allow admin to add or remove traits of datum
+/datum/admins/proc/modify_traits(datum/D)
+ if(!D)
+ return
+
+ var/add_or_remove = input("Remove/Add?", "Trait Remove/Add") as null|anything in list("Add","Remove")
+ if(!add_or_remove)
+ return
+ var/list/availible_traits = list()
+
+ switch(add_or_remove)
+ if("Add")
+ for(var/key in GLOB.traits_by_type)
+ if(istype(D,key))
+ availible_traits += GLOB.traits_by_type[key]
+ if("Remove")
+ if(!GLOB.trait_name_map)
+ GLOB.trait_name_map = generate_trait_name_map()
+ for(var/trait in D.status_traits)
+ var/name = GLOB.trait_name_map[trait] || trait
+ availible_traits[name] = trait
+
+ var/chosen_trait = input("Select trait to modify", "Trait") as null|anything in sortList(availible_traits)
+ if(!chosen_trait)
+ return
+ chosen_trait = availible_traits[chosen_trait]
+
+ var/source = "adminabuse"
+ switch(add_or_remove)
+ if("Add") //Not doing source choosing here intentionally to make this bit faster to use, you can always vv it.
+ ADD_TRAIT(D,chosen_trait,source)
+ if("Remove")
+ var/specific = input("All or specific source ?", "Trait Remove/Add") as null|anything in list("All","Specific")
+ if(!specific)
+ return
+ switch(specific)
+ if("All")
+ source = null
+ if("Specific")
+ source = input("Source to be removed","Trait Remove/Add") as null|anything in sortList(D.status_traits[chosen_trait])
+ if(!source)
+ return
+ REMOVE_TRAIT(D,chosen_trait,source)
diff --git a/code/modules/admin/view_variables/modify_variables.dm b/code/modules/admin/view_variables/modify_variables.dm
index a4ed4d45bd..5f80b3a5e4 100644
--- a/code/modules/admin/view_variables/modify_variables.dm
+++ b/code/modules/admin/view_variables/modify_variables.dm
@@ -194,9 +194,10 @@ GLOBAL_PROTECT(VVpixelmovement)
else
variable = L[index]
//EXPERIMENTAL - Keep old associated value while modifying key, if any
- var/found = L[variable]
- if(!isnull(found))
- old_assoc_value = found
+ if(IS_VALID_ASSOC_KEY(variable))
+ var/found = L[variable]
+ if(!isnull(found))
+ old_assoc_value = found
//
default = vv_get_class(objectvar, variable)
diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm
index 2a0f3d7302..d6e4c2b944 100644
--- a/code/modules/admin/view_variables/topic_basic.dm
+++ b/code/modules/admin/view_variables/topic_basic.dm
@@ -47,5 +47,33 @@
usr.client.debug_variables(src)
if(href_list[VV_HK_MARK])
usr.client.mark_datum(target)
+ if(href_list[VV_HK_ADDCOMPONENT])
+ if(!check_rights(NONE))
+ return
+ var/list/names = list()
+ var/list/componentsubtypes = subtypesof(/datum/component)
+ names += "---Components---"
+ names += componentsubtypes
+ names += "---Elements---"
+ names += subtypesof(/datum/element)
+ var/result = input(usr, "Choose a component/element to add","better know what ur fuckin doin pal") as null|anything in names
+ if(!usr || !result || result == "---Components---" || result == "---Elements---")
+ return
+ if(QDELETED(src))
+ to_chat(usr, "That thing doesn't exist anymore!")
+ return
+ var/list/lst = get_callproc_args()
+ if(!lst)
+ return
+ var/datumname = "error"
+ lst.Insert(1, result)
+ if(result in componentsubtypes)
+ datumname = "component"
+ target._AddComponent(lst)
+ else
+ datumname = "element"
+ target._AddElement(lst)
+ log_admin("[key_name(usr)] has added [result] [datumname] to [key_name(src)].")
+ message_admins("[key_name_admin(usr)] has added [result] [datumname] to [key_name_admin(src)].")
if(href_list[VV_HK_CALLPROC])
usr.client.callproc_datum(target)
diff --git a/code/modules/antagonists/bloodsucker/powers/veil.dm b/code/modules/antagonists/bloodsucker/powers/veil.dm
index 671f88f2c1..422d645ad2 100644
--- a/code/modules/antagonists/bloodsucker/powers/veil.dm
+++ b/code/modules/antagonists/bloodsucker/powers/veil.dm
@@ -93,7 +93,7 @@
H.socks = random_socks(H.gender)
//H.eye_color = random_eye_color()
REMOVE_TRAIT(H, TRAIT_DISFIGURED, null) //
- H.dna.features = random_features(H.dna.species?.id)
+ H.dna.features = random_features(H.dna.species?.id, H.gender)
// Apply Appearance
H.update_body(TRUE) // Outfit and underwear, also body and privates.
diff --git a/code/modules/antagonists/changeling/powers/strained_muscles.dm b/code/modules/antagonists/changeling/powers/strained_muscles.dm
index a98700683e..d8572f04cc 100644
--- a/code/modules/antagonists/changeling/powers/strained_muscles.dm
+++ b/code/modules/antagonists/changeling/powers/strained_muscles.dm
@@ -21,7 +21,7 @@
to_chat(user, "Our muscles tense and strengthen.")
changeling.chem_recharge_slowdown += 0.5
else
- user.remove_movespeed_modifier(MOVESPEED_ID_CHANGELING_MUSCLES)
+ user.remove_movespeed_modifier(/datum/movespeed_modifier/strained_muscles)
to_chat(user, "Our muscles relax.")
changeling.chem_recharge_slowdown -= 0.5
if(stacks >= 20)
@@ -36,12 +36,12 @@
/obj/effect/proc_holder/changeling/strained_muscles/proc/muscle_loop(mob/living/carbon/user)
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
while(active)
- user.add_movespeed_modifier(MOVESPEED_ID_CHANGELING_MUSCLES, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
+ user.add_movespeed_modifier(/datum/movespeed_modifier/strained_muscles)
if(user.stat != CONSCIOUS || user.staminaloss >= 90)
active = !active
to_chat(user, "Our muscles relax without the energy to strengthen them.")
user.DefaultCombatKnockdown(40)
- user.remove_movespeed_modifier(MOVESPEED_ID_CHANGELING_MUSCLES)
+ user.remove_movespeed_modifier(/datum/movespeed_modifier/strained_muscles)
changeling.chem_recharge_slowdown -= 0.5
break
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index fcb57a5a2e..ffab8174e5 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -539,7 +539,7 @@
if(SSshuttle.emergency.mode == SHUTTLE_CALL)
var/cursetime = 1800
var/timer = SSshuttle.emergency.timeLeft(1) + cursetime
- var/security_num = seclevel2num(get_security_level())
+ var/security_num = SECLEVEL2NUM(NUM2SECLEVEL(GLOB.security_level))
var/set_coefficient = 1
switch(security_num)
if(SEC_LEVEL_GREEN)
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index 5552efef1f..dc44a3b2d8 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -41,7 +41,7 @@
STOP_PROCESSING(SSobj, core)
update_icon()
GLOB.poi_list |= src
- previous_level = get_security_level()
+ previous_level = NUM2SECLEVEL(GLOB.security_level)
/obj/machinery/nuclearbomb/Destroy()
safety = FALSE
@@ -419,7 +419,7 @@
return
timing = !timing
if(timing)
- previous_level = get_security_level()
+ previous_level = NUM2SECLEVEL(GLOB.security_level)
detonation_timer = world.time + (timer_set * 10)
for(var/obj/item/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list)
S.switch_mode_to(TRACK_INFILTRATOR)
diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm
index 475438ba52..5d409a7fb9 100644
--- a/code/modules/antagonists/slaughter/slaughter.dm
+++ b/code/modules/antagonists/slaughter/slaughter.dm
@@ -64,8 +64,8 @@
/mob/living/simple_animal/slaughter/phasein()
. = ..()
- add_movespeed_modifier(MOVESPEED_ID_SLAUGHTER, update=TRUE, priority=100, multiplicative_slowdown=-1)
- addtimer(CALLBACK(src, .proc/remove_movespeed_modifier, MOVESPEED_ID_SLAUGHTER, TRUE), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
+ add_movespeed_modifier(/datum/movespeed_modifier/slaughter)
+ addtimer(CALLBACK(src, .proc/remove_movespeed_modifier, /datum/movespeed_modifier/slaughter), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index cf10f87bf8..df5e6004ba 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -48,7 +48,7 @@
var/datum/traitor_class/class = GLOB.traitor_classes[C]
var/weight = LOGISTIC_FUNCTION(1.5*class.weight,chaos_weight,class.chaos,0)
weights[C] = weight * 1000
- var/choice = pickweightAllowZero(weights)
+ var/choice = pickweight(weights, 0)
if(!choice)
choice = TRAITOR_HUMAN // it's an "easter egg"
var/datum/traitor_class/actual_class = GLOB.traitor_classes[choice]
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index 7c63266255..ff3d95598d 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -159,7 +159,7 @@
/obj/item/scrying/attack_self(mob/user)
to_chat(user, "You can see...everything!")
visible_message("[user] stares into [src], their eyes glazing over.")
- user.ghostize(1)
+ user.ghostize(1, voluntary = TRUE)
/////////////////////////////////////////Necromantic Stone///////////////////
diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm
index 2bcda1d400..f33a9a2d42 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook.dm
@@ -294,7 +294,7 @@
name = "Staff of Change"
desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself."
item_path = /obj/item/gun/magic/staff/change
- dynamic_requirement = 60
+ dynamic_requirement = 200
/datum/spellbook_entry/item/staffanimation
name = "Staff of Animation"
@@ -361,7 +361,7 @@
desc = "A collection of wands that allow for a wide variety of utility. Wands have a limited number of charges, so be conservative in use. Comes in a handy belt."
item_path = /obj/item/storage/belt/wands/full
category = "Defensive"
- dynamic_requirement = 60
+ dynamic_requirement = 200
/datum/spellbook_entry/item/armor
name = "Mastercrafted Armor Set"
diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm
index d4c9fdbee7..6c8d8287d8 100644
--- a/code/modules/awaymissions/zlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -1,15 +1,19 @@
-// How much "space" we give the edge of the map
-GLOBAL_LIST_INIT(potentialRandomZlevels, generateMapList(filename = "[global.config.directory]/awaymissionconfig.txt"))
-/proc/createRandomZlevel()
- if(GLOB.awaydestinations.len) //crude, but it saves another var!
+/proc/createRandomZlevel(name = AWAY_MISSION_NAME, list/traits = list(ZTRAIT_AWAY = TRUE), list/potential_levels = GLOB.potential_away_levels)
+ if(GLOB.random_zlevels_generated[name])
+ stack_trace("[name] level already generated.")
+ return
+ if(!length(potential_levels))
+ stack_trace("No potential [name] level to load has been found.")
return
- if(GLOB.potentialRandomZlevels && GLOB.potentialRandomZlevels.len)
- to_chat(world, "Loading away mission...")
- var/map = pick(GLOB.potentialRandomZlevels)
- load_new_z_level(map, "Away Mission")
- to_chat(world, "Away mission loaded.")
+ var/start_time = REALTIMEOFDAY
+ var/map = pick(potential_levels)
+ if(!load_new_z_level(map, name, traits))
+ INIT_ANNOUNCE("Failed to load [name]! map filepath: [map]!")
+ return
+ INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!")
+ GLOB.random_zlevels_generated[name] = TRUE
/proc/reset_gateway_spawns(reset = FALSE)
for(var/obj/machinery/gateway/G in world)
diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm
index a7e842282c..e1212cf337 100644
--- a/code/modules/clothing/under/skirt_dress.dm
+++ b/code/modules/clothing/under/skirt_dress.dm
@@ -1,4 +1,4 @@
-/obj/item/clothing/under/dress/skirt
+/obj/item/clothing/under/dress
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
/obj/item/clothing/under/dress/skirt
@@ -182,7 +182,6 @@
icon_state = "bride_white"
item_state = "bride_white"
can_adjust = FALSE
- mutantrace_variation = NONE
/obj/item/clothing/under/dress/wedding/orange
name = "orange wedding dress"
@@ -213,7 +212,6 @@
desc = "A fancy skirt made with polychromic threads."
icon_state = "polyskirt"
item_state = "rainbow"
- mutantrace_variation = NONE
var/list/poly_colors = list("#FFFFFF", "#F08080", "#808080")
/obj/item/clothing/under/dress/skirt/polychromic/ComponentInitialize()
@@ -226,5 +224,4 @@
icon_state = "polypleat"
item_state = "rainbow"
body_parts_covered = CHEST|GROIN|ARMS
- mutantrace_variation = NONE
poly_colors = list("#8CC6FF", "#808080", "#FF3535")
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 4fc62893b5..3f61c4b45f 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -57,8 +57,7 @@
icon_state = "tactifool"
item_state = "bl_suit"
has_sensor = TRUE
- mutantrace_variation = NONE
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
/obj/item/clothing/under/syndicate/sniper
name = "Tactical turtleneck suit"
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 3b8f8de359..60f2aef629 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -22,7 +22,7 @@
if(turfs.len) //Pick a turf to spawn at if we can
var/turf/T = pick(turfs)
- new /datum/spacevine_controller(T) //spawn a controller at turf
+ new /datum/spacevine_controller(T, pick(subtypesof(/datum/spacevine_mutation)), rand(30,100), rand(5,10), src) //spawn a controller at turf with randomized stats and a single random mutation
/datum/spacevine_mutation
@@ -227,13 +227,13 @@
quality = NEGATIVE
/datum/spacevine_mutation/thorns/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
- if(prob(severity) && istype(crosser) && !isvineimmune(holder))
+ if(prob(severity) && istype(crosser) && !isvineimmune(crosser))
var/mob/living/M = crosser
M.adjustBruteLoss(5)
to_chat(M, "You cut yourself on the thorny vines.")
/datum/spacevine_mutation/thorns/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
- if(prob(severity) && istype(hitter) && !isvineimmune(holder))
+ if(prob(severity) && istype(hitter) && !isvineimmune(hitter))
var/mob/living/M = hitter
M.adjustBruteLoss(5)
to_chat(M, "You cut yourself on the thorny vines.")
@@ -251,7 +251,7 @@
holder.obj_integrity = holder.max_integrity
/datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
- if(I.get_sharpness())
+ if(I?.get_sharpness())
. = expected_damage * 0.5
else
. = expected_damage
@@ -344,16 +344,17 @@
switch(damage_type)
if(BRUTE)
if(damage_amount)
- playsound(src, 'sound/weapons/slash.ogg', 50, 1)
+ playsound(src, 'sound/weapons/slash.ogg', 50, TRUE)
else
- playsound(src, 'sound/weapons/tap.ogg', 50, 1)
+ playsound(src, 'sound/weapons/tap.ogg', 50, TRUE)
if(BURN)
- playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
+ playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE)
-/obj/structure/spacevine/Crossed(mob/crosser)
- if(isliving(crosser))
- for(var/datum/spacevine_mutation/SM in mutations)
- SM.on_cross(src, crosser)
+/obj/structure/spacevine/Crossed(atom/movable/AM)
+ if(!isliving(AM))
+ return
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_cross(src, AM)
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/structure/spacevine/attack_hand(mob/user)
@@ -378,10 +379,9 @@
var/list/vine_mutations_list
var/mutativeness = 1
-/datum/spacevine_controller/New(turf/location, list/muts, potency, production)
+/datum/spacevine_controller/New(turf/location, list/muts, potency, production, datum/round_event/event = null)
vines = list()
growth_queue = list()
- spawn_spacevine_piece(location, null, muts)
START_PROCESSING(SSobj, src)
vine_mutations_list = list()
init_subtypes(/datum/spacevine_mutation/, vine_mutations_list)
@@ -428,6 +428,7 @@
for(var/datum/spacevine_mutation/SM in SV.mutations)
SM.on_birth(SV)
location.Entered(SV)
+ return SV
/datum/spacevine_controller/proc/VineDestroyed(obj/structure/spacevine/S)
S.master = null
@@ -531,14 +532,13 @@
qdel(src)
/obj/structure/spacevine/CanPass(atom/movable/mover, turf/target)
+ . = ..()
if(isvineimmune(mover))
- . = TRUE
- else
- . = ..()
+ return TRUE
/proc/isvineimmune(atom/A)
- . = FALSE
if(isliving(A))
var/mob/living/M = A
if(("vines" in M.faction) || ("plants" in M.faction))
- . = TRUE
+ return TRUE
+ return FALSE
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index 95b9f92873..ccce186304 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -396,6 +396,16 @@
list_reagents = list(/datum/reagent/consumable/orangejuice = 100)
foodtype = FRUIT| BREAKFAST
+/obj/item/reagent_containers/food/drinks/bottle/bio_carton
+ name = "small carton box"
+ desc = "A small biodegradable carton box made from plant biomatter."
+ icon_state = "eco_box"
+ item_state = "carton"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+ volume = 50
+ isGlass = FALSE
+
/obj/item/reagent_containers/food/drinks/bottle/cream
name = "milk cream"
desc = "It's cream. Made from milk. What else did you think you'd find in there?"
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 7fac7ef9b6..28f3387097 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -40,14 +40,14 @@
updateUsrDialog()
/obj/machinery/biogenerator/RefreshParts()
- var/E = 0
- var/P = 0
- var/max_storage = 40
+ var/E = 0.5
+ var/P = 0.5
+ var/max_storage = 20
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
- P += B.rating
- max_storage = 40 * B.rating
+ P += B.rating * 0.5
+ max_storage = max(20 * B.rating, max_storage)
for(var/obj/item/stock_parts/manipulator/M in component_parts)
- E += M.rating
+ E += M.rating * 0.5
efficiency = E
productivity = P
max_items = max_storage
@@ -196,7 +196,7 @@
dat += "x5"
if(ispath(D.build_path, /obj/item/stack))
dat += "x10"
- dat += "([D.materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]/efficiency])
"
+ dat += "([CEILING(D.materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]/efficiency, 1)])
"
dat += ""
else
dat += "No container inside, please insert container.
"
@@ -214,12 +214,16 @@
to_chat(usr, "The biogenerator is in the process of working.")
return
var/S = 0
+ var/total = 0
for(var/obj/item/reagent_containers/food/snacks/grown/I in contents)
S += 5
- if(I.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) < 0.1)
- points += 1*productivity
- else points += I.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment)*10*productivity
+ var/nutri_amount = I.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment)
+ if(nutri_amount < 0.1)
+ total += 1*productivity
+ else
+ total += nutri_amount*10*productivity
qdel(I)
+ points += round(total)
if(S)
processing = TRUE
update_icon()
@@ -235,12 +239,13 @@
/obj/machinery/biogenerator/proc/check_cost(list/materials, multiplier = 1, remove_points = TRUE)
if(materials.len != 1 || materials[1] != SSmaterials.GetMaterialRef(/datum/material/biomass))
return FALSE
- if (materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]*multiplier/efficiency > points)
+ var/cost = CEILING(materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]*multiplier/efficiency, 1)
+ if (cost > points)
menustat = "nopoints"
return FALSE
else
if(remove_points)
- points -= materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]*multiplier/efficiency
+ points -= cost
update_icon()
updateUsrDialog()
return TRUE
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index e144e4dbe6..ef63ba97f8 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -79,7 +79,9 @@
for(var/I in assembly_components)
var/obj/item/integrated_circuit/IC = I
- . += IC.external_examine(user)
+ var/text = IC.external_examine(user)
+ if(text)
+ . += text
if(opened)
interact(user)
diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm
index 0709b179d2..f90b584d76 100644
--- a/code/modules/integrated_electronics/core/integrated_circuit.dm
+++ b/code/modules/integrated_electronics/core/integrated_circuit.dm
@@ -36,7 +36,9 @@ a creative player the means to solve many problems. Circuits are held inside an
/obj/item/integrated_circuit/examine(mob/user)
interact(user)
. = ..()
- . += external_examine(user)
+ var/text = external_examine(user)
+ if(text)
+ . += text
// Can be called via electronic_assembly/attackby()
/obj/item/integrated_circuit/proc/additem(var/obj/item/I, var/mob/living/user)
@@ -57,7 +59,7 @@ a creative player the means to solve many problems. Circuits are held inside an
var/datum/integrated_io/activate/A = activators[k]
if(A.linked.len)
to_chat(user, "The '[A]' is connected to [A.get_linked_to_desc()].")
- any_examine(user)
+ to_chat(user, any_examine(user))
interact(user)
// This should be used when someone is examining from an 'outside' perspective, e.g. reading a screen or LED.
diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm
index 3e361179de..873c10fc02 100644
--- a/code/modules/mapping/map_template.dm
+++ b/code/modules/mapping/map_template.dm
@@ -55,11 +55,11 @@
SSmachines.setup_template_powernets(cables)
SSair.setup_template_machinery(atmos_machines)
-/datum/map_template/proc/load_new_z()
+/datum/map_template/proc/load_new_z(list/traits = list(ZTRAIT_AWAY = TRUE))
var/x = round((world.maxx - width)/2)
var/y = round((world.maxy - height)/2)
- var/datum/space_level/level = SSmapping.add_new_zlevel(name, list(ZTRAIT_AWAY = TRUE))
+ var/datum/space_level/level = SSmapping.add_new_zlevel(name, traits)
var/datum/parsed_map/parsed = load_map(file(mappath), x, y, level.z_value, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=TRUE)
var/list/bounds = parsed.bounds
if(!bounds)
@@ -121,6 +121,6 @@
//for your ever biggening badminnery kevinz000
//❤ - Cyberboss
-/proc/load_new_z_level(var/file, var/name)
+/proc/load_new_z_level(file, name, list/traits)
var/datum/map_template/template = new(file, name)
- template.load_new_z()
+ return template.load_new_z(traits)
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index b669e30a06..317efc2c1f 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -23,11 +23,7 @@
if(!pref_species)
var/rando_race = pick(GLOB.roundstart_races)
pref_species = new rando_race()
- features = random_features(pref_species?.id)
- if(gender == MALE || gender != FEMALE)
- features["body_model"] = gender
- else if(gender == PLURAL)
- features["body_model"] = pick(MALE,FEMALE)
+ features = random_features(pref_species?.id, gender)
age = rand(AGE_MIN,AGE_MAX)
/datum/preferences/proc/update_preview_icon(equip_job = TRUE)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 377540233f..cef445113b 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -7,6 +7,7 @@
update_body_parts() //to update the carbon's new bodyparts appearance
GLOB.carbon_list += src
blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio)
+ add_movespeed_modifier(/datum/movespeed_modifier/carbon_crawling)
/mob/living/carbon/Destroy()
//This must be done first, so the mob ghosts correctly before DNA etc is nulled
@@ -574,9 +575,9 @@
become_husk("burn")
med_hud_set_health()
if(stat == SOFT_CRIT)
- add_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE, multiplicative_slowdown = SOFTCRIT_ADD_SLOWDOWN)
+ add_movespeed_modifier(/datum/movespeed_modifier/carbon_softcrit)
else
- remove_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/carbon_softcrit)
/mob/living/carbon/update_stamina()
var/stam = getStaminaLoss()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 29c7321660..7f5f912ff6 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1041,7 +1041,7 @@
return FALSE
/mob/living/carbon/human/proc/clear_shove_slowdown()
- remove_movespeed_modifier(MOVESPEED_ID_SHOVE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/shove)
var/active_item = get_active_held_item()
if(is_type_in_typecache(active_item, GLOB.shove_disarming_types))
visible_message("[src.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE)
@@ -1050,17 +1050,17 @@
. = ..()
if(HAS_TRAIT(src, TRAIT_IGNORESLOWDOWN))
- remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN)
- remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING)
+ remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown)
+ remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying)
return
var/stambufferinfluence = (bufferedstam*(100/stambuffer))*0.2 //CIT CHANGE - makes stamina buffer influence movedelay
var/health_deficiency = ((100 + stambufferinfluence) - health + (getStaminaLoss()*0.75))//CIT CHANGE - reduces the impact of staminaloss and makes stamina buffer influence it
if(health_deficiency >= 40)
- add_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN, override = TRUE, multiplicative_slowdown = ((health_deficiency-39) / 75), blacklisted_movetypes = FLOATING|FLYING)
- add_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING, override = TRUE, multiplicative_slowdown = ((health_deficiency-39) / 25), movetypes = FLYING, blacklisted_movetypes = FLOATING)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown, TRUE, (health_deficiency-39) / 75)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying, TRUE, (health_deficiency-39) / 25)
else
- remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN)
- remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING)
+ remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown)
+ remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying)
/mob/living/carbon/human/do_after_coefficent()
. = ..()
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index a26bdd99cd..09dfa602e1 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -1,11 +1,13 @@
/mob/living/carbon/human/get_movespeed_modifiers()
var/list/considering = ..()
- . = considering
if(HAS_TRAIT(src, TRAIT_IGNORESLOWDOWN))
- for(var/id in .)
- var/list/data = .[id]
- if(data[MOVESPEED_DATA_INDEX_FLAGS] & IGNORE_NOSLOW)
- .[id] = data
+ . = list()
+ for(var/id in considering)
+ var/datum/movespeed_modifier/M = considering[id]
+ if(M.flags & IGNORE_NOSLOW || M.multiplicative_slowdown < 0)
+ .[id] = M
+ return
+ return considering
/mob/living/carbon/human/movement_delay()
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 32e492f5fa..683c3e18fd 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -331,7 +331,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(mutant_bodyparts["meat_type"]) //I can't believe it's come to the meat
H.type_of_meat = GLOB.meat_types[H.dna.features["meat_type"]]
- C.add_movespeed_modifier(MOVESPEED_ID_SPECIES, TRUE, 100, override=TRUE, multiplicative_slowdown=speedmod, movetypes=(~FLYING))
+ C.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/species, TRUE, multiplicative_slowdown = speedmod)
SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species)
@@ -349,7 +349,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
for(var/X in inherent_traits)
REMOVE_TRAIT(C, X, SPECIES_TRAIT)
- C.remove_movespeed_modifier(MOVESPEED_ID_SPECIES)
+ C.remove_movespeed_modifier(/datum/movespeed_modifier/species)
if(mutant_bodyparts["meat_type"])
C.type_of_meat = GLOB.meat_types[C.dna.features["meat_type"]]
@@ -1299,14 +1299,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(H.overeatduration < 100)
to_chat(H, "You feel fit again!")
REMOVE_TRAIT(H, TRAIT_FAT, OBESITY)
- H.remove_movespeed_modifier(MOVESPEED_ID_FAT)
+ H.remove_movespeed_modifier(/datum/movespeed_modifier/obesity)
H.update_inv_w_uniform()
H.update_inv_wear_suit()
else
if(H.overeatduration >= 100)
to_chat(H, "You suddenly feel blubbery!")
ADD_TRAIT(H, TRAIT_FAT, OBESITY)
- H.add_movespeed_modifier(MOVESPEED_ID_FAT, multiplicative_slowdown = 1.5)
+ H.add_movespeed_modifier(/datum/movespeed_modifier/obesity)
H.update_inv_w_uniform()
H.update_inv_wear_suit()
@@ -1362,9 +1362,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(!HAS_TRAIT(H, TRAIT_NOHUNGER))
var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80
if(hungry >= 70)
- H.add_movespeed_modifier(MOVESPEED_ID_HUNGRY, override = TRUE, multiplicative_slowdown = (hungry / 50))
+ H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 50))
else
- H.remove_movespeed_modifier(MOVESPEED_ID_HUNGRY)
+ H.remove_movespeed_modifier(/datum/movespeed_modifier/hunger)
switch(H.nutrition)
if(NUTRITION_LEVEL_FULL to INFINITY)
@@ -1615,7 +1615,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
"You hear a slap."
)
return FALSE
-
+
else
user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
@@ -1623,10 +1623,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
user.adjustStaminaLossBuffered(1)
else
user.adjustStaminaLossBuffered(3)
-
+
if(attacker_style && attacker_style.disarm_act(user,target))
return TRUE
-
+
if(target.w_uniform)
target.w_uniform.add_fingerprint(user)
//var/randomized_zone = ran_zone(user.zone_selected) CIT CHANGE - comments out to prevent compiling errors
@@ -1659,7 +1659,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
randn -= 25 //if you are a pugilist, you're slapping that item from them pretty reliably
if(HAS_TRAIT(target, TRAIT_PUGILIST))
randn += 25 //meanwhile, pugilists are less likely to get disarmed
-
+
if(randn <= 35)//CIT CHANGE - changes this back to a 35% chance to accomodate for the above being commented out in favor of right-click pushing
var/obj/item/I = null
if(target.pulling)
@@ -1932,8 +1932,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/obj/item/target_held_item = target.get_active_held_item()
if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types))
target_held_item = null
- if(!target.has_movespeed_modifier(MOVESPEED_ID_SHOVE))
- target.add_movespeed_modifier(MOVESPEED_ID_SHOVE, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH)
+ if(!target.has_movespeed_modifier(/datum/movespeed_modifier/shove))
+ target.add_movespeed_modifier(/datum/movespeed_modifier/shove)
if(target_held_item)
if(!HAS_TRAIT(target_held_item, TRAIT_NODROP))
target.visible_message("[target.name]'s grip on \the [target_held_item] loosens!",
@@ -2084,7 +2084,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold")
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "hot", /datum/mood_event/hot)
- H.remove_movespeed_modifier(MOVESPEED_ID_COLD)
+ H.remove_movespeed_modifier(/datum/movespeed_modifier/cold)
var/burn_damage
var/firemodifier = H.fire_stacks / 50
@@ -2101,8 +2101,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTCOLD))
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot")
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold)
- //Sorry for the nasty oneline but I don't want to assign a variable on something run pretty frequently
- H.add_movespeed_modifier(MOVESPEED_ID_COLD, override = TRUE, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR), blacklisted_movetypes = FLOATING)
+ //Apply cold slowdown
+ H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/cold, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR))
switch(H.bodytemperature)
if(200 to BODYTEMP_COLD_DAMAGE_LIMIT)
H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod*H.physiology.cold_mod, BURN)
@@ -2112,7 +2112,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod*H.physiology.cold_mod, BURN)
else
- H.remove_movespeed_modifier(MOVESPEED_ID_COLD)
+ H.remove_movespeed_modifier(/datum/movespeed_modifier/cold)
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold")
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot")
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index d3e5941e4e..6242fa56be 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -65,12 +65,11 @@
/mob/living/carbon/monkey/on_reagent_change()
. = ..()
- remove_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE)
var/amount
if(reagents.has_reagent(/datum/reagent/medicine/morphine))
amount = -1
if(amount)
- add_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_reagent_speedmod, TRUE, amount)
/mob/living/carbon/monkey/updatehealth()
. = ..()
@@ -78,7 +77,7 @@
var/health_deficiency = (100 - health)
if(health_deficiency >= 45)
slow += (health_deficiency / 25)
- add_movespeed_modifier(MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = slow)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_health_speedmod, TRUE, slow)
/mob/living/carbon/monkey/adjust_bodytemperature(amount)
. = ..()
@@ -87,7 +86,7 @@
slow += (283.222 - bodytemperature) / 10 * 1.75
if(slow <= 0)
return
- add_movespeed_modifier(MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_temperature_speedmod, TRUE, slow)
/mob/living/carbon/monkey/Stat()
..()
@@ -99,7 +98,6 @@
if(changeling)
stat("Chemical Storage", "[changeling.chem_charges]/[changeling.chem_storage]")
stat("Absorbed DNA", changeling.absorbedcount)
- return
/mob/living/carbon/monkey/verb/removeinternal()
diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm
index 49d4a20887..32038a6102 100644
--- a/code/modules/mob/living/living_mobility.dm
+++ b/code/modules/mob/living/living_mobility.dm
@@ -94,11 +94,13 @@
if(should_be_lying)
mobility_flags &= ~MOBILITY_STAND
+ setMovetype(movement_type | CRAWLING)
if(!lying) //force them on the ground
lying = pick(90, 270)
if(has_gravity() && !buckled)
playsound(src, "bodyfall", 20, 1)
else
+ setMovetype(movement_type & ~CRAWLING)
mobility_flags |= MOBILITY_STAND
lying = 0
@@ -161,8 +163,8 @@
if(!has_legs && has_arms < 2)
limbless_slowdown += 6 - (has_arms * 3)
if(limbless_slowdown)
- add_movespeed_modifier(MOVESPEED_ID_LIVING_LIMBLESS, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=limbless_slowdown, blacklisted_movetypes = FLYING|FLOATING)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/limbless, multiplicative_slowdown = limbless_slowdown)
else
- remove_movespeed_modifier(MOVESPEED_ID_LIVING_LIMBLESS, update=TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/limbless)
return mobility_flags
diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm
index ec291094fe..ddcf3e6292 100644
--- a/code/modules/mob/living/living_movement.dm
+++ b/code/modules/mob/living/living_movement.dm
@@ -36,38 +36,26 @@
sprint_stamina_cost = CONFIG_GET(number/movedelay/sprint_stamina_cost)
return ..()
-/mob/living/movement_delay(ignorewalk = 0)
- . = ..()
- if(!CHECK_MOBILITY(src, MOBILITY_STAND))
- . += 6
-
/// whether or not we can slide under another living mob. defaults to if we're not dense. CanPass should check "overriding circumstances" like buckled mobs/having PASSMOB flag, etc.
/mob/living/proc/can_move_under_living(mob/living/other)
return !density
/mob/living/proc/update_move_intent_slowdown()
- var/mod = 0
- if(m_intent == MOVE_INTENT_WALK)
- mod = CONFIG_GET(number/movedelay/walk_delay)
- else
- mod = CONFIG_GET(number/movedelay/run_delay)
- if(!isnum(mod))
- mod = 1
- add_movespeed_modifier(MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED, TRUE, 100, override = TRUE, multiplicative_slowdown = mod)
+ add_movespeed_modifier((m_intent == MOVE_INTENT_WALK)? /datum/movespeed_modifier/config_walk_run/walk : /datum/movespeed_modifier/config_walk_run/run)
/mob/living/proc/update_turf_movespeed(turf/open/T)
- if(isopenturf(T) && !is_flying())
- add_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = T.slowdown)
+ if(isopenturf(T))
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown, multiplicative_slowdown = T.slowdown)
else
- remove_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD)
+ remove_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown)
/mob/living/proc/update_pull_movespeed()
if(pulling && isliving(pulling))
var/mob/living/L = pulling
if(drag_slowdown && L.lying && !L.buckled && grab_state < GRAB_AGGRESSIVE)
- add_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING, multiplicative_slowdown = PULL_PRONE_SLOWDOWN)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/bulky_drag, multiplicative_slowdown = PULL_PRONE_SLOWDOWN)
return
- remove_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING)
+ remove_movespeed_modifier(/datum/movespeed_modifier/bulky_drag)
/mob/living/canZMove(dir, turf/target)
return can_zTravel(target, dir) && (movement_type & FLYING)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 9eb1bbc9e4..4b1b108b0e 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -273,9 +273,9 @@
/mob/living/silicon/pai/Process_Spacemove(movement_dir = 0)
. = ..()
if(!.)
- add_movespeed_modifier(MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD, TRUE, 100, multiplicative_slowdown = 2)
+ add_movespeed_modifier(/datum/movespeed_modifier/pai_spacewalk)
return TRUE
- remove_movespeed_modifier(MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD, TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/pai_spacewalk)
return TRUE
/mob/living/silicon/pai/examine(mob/user)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 4ef5993d2d..b389e386d4 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -237,7 +237,7 @@
return
if(!CONFIG_GET(flag/disable_secborg) && GLOB.security_level < CONFIG_GET(number/minimum_secborg_alert))
- to_chat(src, "NOTICE: Due to local station regulations, the security cyborg module and its variants are only available during [num2seclevel(CONFIG_GET(number/minimum_secborg_alert))] alert and greater.")
+ to_chat(src, "NOTICE: Due to local station regulations, the security cyborg module and its variants are only available during [NUM2SECLEVEL(CONFIG_GET(number/minimum_secborg_alert))] alert and greater.")
var/list/modulelist = list("Standard" = /obj/item/robot_module/standard, \
"Engineering" = /obj/item/robot_module/engineering, \
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 9c89ff4a4f..ced56f0705 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -7,7 +7,7 @@
icon_living = "carp"
icon_dead = "carp_dead"
icon_gib = "carp_gib"
- threat = 0.2
+ threat = 0.1
mob_biotypes = MOB_ORGANIC|MOB_BEAST
speak_chance = 0
turns_per_move = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 439bedf3cc..f19aa0a2a7 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -186,10 +186,10 @@
. = ..()
if(slowed_by_webs)
if(!(locate(/obj/structure/spider/stickyweb) in loc))
- remove_movespeed_modifier(MOVESPEED_ID_TARANTULA_WEB)
+ remove_movespeed_modifier(/datum/movespeed_modifier/tarantula_web)
slowed_by_webs = FALSE
else if(locate(/obj/structure/spider/stickyweb) in loc)
- add_movespeed_modifier(MOVESPEED_ID_TARANTULA_WEB, priority=100, multiplicative_slowdown=3)
+ add_movespeed_modifier(/datum/movespeed_modifier/tarantula_web)
slowed_by_webs = TRUE
//midwives are the queen of the spiders, can send messages to all them and web faster. That rare round where you get a queen spider and turn your 'for honor' players into 'r6siege' players will be a fun one.
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
index 13a4d1793e..5111b0b180 100644
--- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -1,5 +1,13 @@
-
-
+/**
+ * Kudzu Flower Bud
+ *
+ * A flower created by flowering kudzu which spawns a venus human trap after a certain amount of time has passed.
+ *
+ * A flower created by kudzu with the flowering mutation. Spawns a venus human trap after 2 minutes under normal circumstances.
+ * Also spawns 4 vines going out in diagonal directions from the bud. Any living creature not aligned with plants is damaged by these vines.
+ * Once it grows a venus human trap, the bud itself will destroy itself.
+ *
+ */
/obj/structure/alien/resin/flower_bud_enemy //inheriting basic attack/damage stuff from alien structures
name = "flower bud"
desc = "A large pulsating plant..."
@@ -9,9 +17,9 @@
opacity = 0
canSmoothWith = list()
smooth = SMOOTH_FALSE
+ /// The amount of time it takes to create a venus human trap, in deciseconds
var/growth_time = 1200
-
/obj/structure/alien/resin/flower_bud_enemy/Initialize()
. = ..()
var/list/anchors = list()
@@ -25,36 +33,49 @@
B.sleep_time = 10 //these shouldn't move, so let's slow down updates to 1 second (any slower and the deletion of the vines would be too slow)
addtimer(CALLBACK(src, .proc/bear_fruit), growth_time)
+/**
+ * Spawns a venus human trap, then qdels itself.
+ *
+ * Displays a message, spawns a human venus trap, then qdels itself.
+ */
/obj/structure/alien/resin/flower_bud_enemy/proc/bear_fruit()
- visible_message("the plant has borne fruit!")
+ visible_message("The plant has borne fruit!")
new /mob/living/simple_animal/hostile/venus_human_trap(get_turf(src))
qdel(src)
-
/obj/effect/ebeam/vine
name = "thick vine"
mouse_opacity = MOUSE_OPACITY_ICON
desc = "A thick vine, painful to the touch."
-
/obj/effect/ebeam/vine/Crossed(atom/movable/AM)
+ . = ..()
if(isliving(AM))
var/mob/living/L = AM
- if(!("vines" in L.faction))
+ if(!isvineimmune(L))
L.adjustBruteLoss(5)
to_chat(L, "You cut yourself on the thorny vines.")
-
-
+/**
+ * Venus Human Trap
+ *
+ * The result of a kudzu flower bud, these enemies use vines to drag prey close to them for attack.
+ *
+ * A carnivorious plant which uses vines to catch and ensnare prey. Spawns from kudzu flower buds.
+ * Each one has a maximum of four vines, which can be attached to a variety of things. Carbons are stunned when a vine is attached to them, and movable entities are pulled closer over time.
+ * Attempting to attach a vine to something with a vine already attached to it will pull all movable targets closer on command.
+ * Once the prey is in melee range, melee attacks from the venus human trap heals itself for 10% of its max health, assuming the target is alive.
+ * Akin to certain spiders, venus human traps can also be possessed and controlled by ghosts.
+ *
+ */
/mob/living/simple_animal/hostile/venus_human_trap
name = "venus human trap"
desc = "Now you know how the fly feels."
icon_state = "venus_human_trap"
- threat = 1
layer = SPACEVINE_MOB_LAYER
health = 50
maxHealth = 50
- ranged = 1
+ ranged = TRUE
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 25
@@ -63,65 +84,110 @@
attack_sound = 'sound/weapons/bladeslice.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 0
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
faction = list("hostile","vines","plants")
- var/list/grasping = list()
- var/max_grasps = 4
- var/grasp_chance = 20
- var/grasp_pull_chance = 85
- var/grasp_range = 4
- del_on_death = 1
+ initial_language_holder = /datum/language_holder/venus
+ del_on_death = TRUE
+ /// A list of all the plant's vines
+ var/list/vines = list()
+ /// The maximum amount of vines a plant can have at one time
+ var/max_vines = 4
+ /// How far away a plant can attach a vine to something
+ var/vine_grab_distance = 5
+ /// Whether or not this plant is ghost possessable
+ var/playable_plant = FALSE //Normal plants can **not** have players.
-/mob/living/simple_animal/hostile/venus_human_trap/Destroy()
- for(var/L in grasping)
- var/datum/beam/B = grasping[L]
- if(B)
- qdel(B)
- grasping = null
- return ..()
+/mob/living/simple_animal/hostile/venus_human_trap/ghost_playable
+ playable_plant = TRUE //For admins that want to buss some harmless plants
-/mob/living/simple_animal/hostile/venus_human_trap/handle_automated_action()
- if(..())
- for(var/mob/living/L in grasping)
- if(L.stat == DEAD)
- var/datum/beam/B = grasping[L]
- if(B)
- B.End()
- grasping -= L
-
- //Can attack+pull multiple times per cycle
- if(L.Adjacent(src))
- L.attack_animal(src)
- else
- if(prob(grasp_pull_chance))
- setDir(get_dir(src,L) )//staaaare
- step(L,get_dir(L,src)) //reel them in
- L.DefaultCombatKnockdown(60) //you can't get away now~
-
- if(grasping.len < max_grasps)
- grasping:
- for(var/mob/living/L in view(grasp_range, src))
- if(L == src || faction_check_mob(L) || (L in grasping) || L == target)
- continue
- for(var/t in getline(src,L))
- for(var/a in t)
- var/atom/A = a
- if(A.density && A != L)
- continue grasping
- if(prob(grasp_chance))
- to_chat(L, "\The [src] has you entangled!")
- grasping[L] = Beam(L, "vine", time=INFINITY, maxdistance=5, beam_type=/obj/effect/ebeam/vine)
-
- break //only take 1 new victim per cycle
+/mob/living/simple_animal/hostile/venus_human_trap/Life()
+ . = ..()
+ pull_vines()
+/mob/living/simple_animal/hostile/venus_human_trap/AttackingTarget()
+ . = ..()
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.stat != DEAD)
+ adjustHealth(-maxHealth * 0.1)
/mob/living/simple_animal/hostile/venus_human_trap/OpenFire(atom/the_target)
- var/dist = get_dist(src,the_target)
- Beam(the_target, "vine", time=dist*2, maxdistance=dist+2, beam_type=/obj/effect/ebeam/vine)
- the_target.attack_animal(src)
+ for(var/datum/beam/B in vines)
+ if(B.target == the_target)
+ pull_vines()
+ ranged_cooldown = world.time + (ranged_cooldown_time * 0.5)
+ return
+ if(get_dist(src,the_target) > vine_grab_distance || vines.len == max_vines)
+ return
+ for(var/turf/T in getline(src,target))
+ if (T.density)
+ return
+ for(var/obj/O in T)
+ if(O.density)
+ return
+ var/datum/beam/newVine = Beam(the_target, "vine", time=INFINITY, maxdistance = vine_grab_distance, beam_type=/obj/effect/ebeam/vine)
+ RegisterSignal(newVine, COMSIG_PARENT_QDELETING, .proc/remove_vine, newVine)
+ vines += newVine
+ if(isliving(the_target))
+ var/mob/living/L = the_target
+ L.Paralyze(20)
+ ranged_cooldown = world.time + ranged_cooldown_time
-/mob/living/simple_animal/hostile/venus_human_trap/CanAttack(atom/the_target)
+/mob/living/simple_animal/hostile/venus_human_trap/Login()
+ . = ..()
+ to_chat(src, "You a venus human trap! Protect the kudzu at all costs, and feast on those who oppose you!")
+
+/mob/living/simple_animal/hostile/venus_human_trap/attack_ghost(mob/user)
. = ..()
if(.)
- if(the_target in grasping)
- return 0
+ return
+ humanize_plant(user)
+
+/**
+ * Sets a ghost to control the plant if the plant is eligible
+ *
+ * Asks the interacting ghost if they would like to control the plant.
+ * If they answer yes, and another ghost hasn't taken control, sets the ghost to control the plant.
+ * Arguments:
+ * * mob/user - The ghost to possibly control the plant
+ */
+
+/mob/living/simple_animal/hostile/venus_human_trap/proc/humanize_plant(mob/user)
+ if(key || !playable_plant || stat)
+ return
+ var/plant_ask = alert("Become a venus human trap?", "Are you reverse vegan?", "Yes", "No")
+ if(plant_ask == "No" || QDELETED(src))
+ return
+ if(key)
+ to_chat(user, "Someone else already took this plant!")
+ return
+ key = user.key
+ log_game("[key_name(src)] took control of [name].")
+
+/**
+ * Manages how the vines should affect the things they're attached to.
+ *
+ * Pulls all movable targets of the vines closer to the plant
+ * If the target is on the same tile as the plant, destroy the vine
+ * Removes any QDELETED vines from the vines list.
+ */
+/mob/living/simple_animal/hostile/venus_human_trap/proc/pull_vines()
+ for(var/datum/beam/B in vines)
+ if(istype(B.target, /atom/movable))
+ var/atom/movable/AM = B.target
+ if(!AM.anchored)
+ step(AM,get_dir(AM,src))
+ if(get_dist(src,B.target) == 0)
+ B.End()
+
+/**
+ * Removes a vine from the list.
+ *
+ * Removes the vine from our list.
+ * Called specifically when the vine is about to be destroyed, so we don't have any null references.
+ * Arguments:
+ * * datum/beam/vine - The vine to be removed from the list.
+ */
+mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine, force)
+ vines -= vine
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 230bb9ecb7..def6327461 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -292,8 +292,8 @@
/mob/living/simple_animal/proc/update_simplemob_varspeed()
if(speed == 0)
- remove_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE)
- add_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE, 100, multiplicative_slowdown = speed, override = TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed, multiplicative_slowdown = speed)
/mob/living/simple_animal/Stat()
..()
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 8594d53bd1..dd454c4243 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -147,25 +147,25 @@
/mob/living/simple_animal/slime/on_reagent_change()
. = ..()
- remove_movespeed_modifier(MOVESPEED_ID_SLIME_REAGENTMOD, TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/slime_reagentmod)
var/amount = 0
if(reagents.has_reagent(/datum/reagent/medicine/morphine)) // morphine slows slimes down
amount = 2
if(reagents.has_reagent(/datum/reagent/consumable/frostoil)) // Frostoil also makes them move VEEERRYYYYY slow
amount = 5
if(amount)
- add_movespeed_modifier(MOVESPEED_ID_SLIME_REAGENTMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_reagentmod, multiplicative_slowdown = amount)
/mob/living/simple_animal/slime/updatehealth()
. = ..()
- remove_movespeed_modifier(MOVESPEED_ID_SLIME_HEALTHMOD, FALSE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/slime_healthmod)
var/health_deficiency = (100 - health)
var/mod = 0
if(health_deficiency >= 45)
mod += (health_deficiency / 25)
if(health <= 0)
mod += 2
- add_movespeed_modifier(MOVESPEED_ID_SLIME_HEALTHMOD, TRUE, 100, multiplicative_slowdown = mod)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_healthmod, multiplicative_slowdown = mod)
/mob/living/simple_animal/slime/adjust_bodytemperature()
. = ..()
@@ -173,9 +173,8 @@
if(bodytemperature >= 330.23) // 135 F or 57.08 C
mod = -1 // slimes become supercharged at high temperatures
else if(bodytemperature < 183.222)
- mod = (283.222 - bodytemperature) / 10 * 1.75
- if(mod)
- add_movespeed_modifier(MOVESPEED_ID_SLIME_TEMPMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = mod)
+ mod = min(15, (283.222 - bodytemperature) / 10 * 1.75)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_tempmod, multiplicative_slowdown = mod)
/mob/living/simple_animal/slime/ObjBump(obj/O)
if(!client && powerlevel > 0)
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index 1375d88948..0d41347179 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -622,10 +622,40 @@
tod = STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)
update_stat()
+///Unignores all slowdowns that lack the IGNORE_NOSLOW flag.
/mob/living/proc/unignore_slowdown(source)
REMOVE_TRAIT(src, TRAIT_IGNORESLOWDOWN, source)
- update_movespeed(FALSE)
+ update_movespeed()
+///Ignores all slowdowns that lack the IGNORE_NOSLOW flag.
/mob/living/proc/ignore_slowdown(source)
ADD_TRAIT(src, TRAIT_IGNORESLOWDOWN, source)
- update_movespeed(FALSE)
+ update_movespeed()
+
+///Ignores specific slowdowns. Accepts a list of slowdowns.
+/mob/living/proc/add_movespeed_mod_immunities(source, slowdown_type, update = TRUE)
+ if(islist(slowdown_type))
+ for(var/listed_type in slowdown_type)
+ if(ispath(listed_type))
+ listed_type = "[listed_type]" //Path2String
+ LAZYADDASSOC(movespeed_mod_immunities, listed_type, source)
+ else
+ if(ispath(slowdown_type))
+ slowdown_type = "[slowdown_type]" //Path2String
+ LAZYADDASSOC(movespeed_mod_immunities, slowdown_type, source)
+ if(update)
+ update_movespeed()
+
+///Unignores specific slowdowns. Accepts a list of slowdowns.
+/mob/living/proc/remove_movespeed_mod_immunities(source, slowdown_type, update = TRUE)
+ if(islist(slowdown_type))
+ for(var/listed_type in slowdown_type)
+ if(ispath(listed_type))
+ listed_type = "[listed_type]" //Path2String
+ LAZYREMOVEASSOC(movespeed_mod_immunities, listed_type, source)
+ else
+ if(ispath(slowdown_type))
+ slowdown_type = "[slowdown_type]" //Path2String
+ LAZYREMOVEASSOC(movespeed_mod_immunities, slowdown_type, source)
+ if(update)
+ update_movespeed()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 8fa1367aad..b5dc25e4dc 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1033,17 +1033,22 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
/// Updates the grab state of the mob and updates movespeed
/mob/setGrabState(newstate)
. = ..()
- if(grab_state == GRAB_PASSIVE)
- remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE, update=TRUE)
- else
- add_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=grab_state*3, blacklisted_movetypes=FLOATING)
+ switch(grab_state)
+ if(GRAB_PASSIVE)
+ remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE)
+ if(GRAB_AGGRESSIVE)
+ add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/aggressive)
+ if(GRAB_NECK)
+ add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/neck)
+ if(GRAB_KILL)
+ add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/kill)
/mob/proc/update_equipment_speed_mods()
var/speedies = equipped_speed_mods()
if(!speedies)
- remove_movespeed_modifier(MOVESPEED_ID_MOB_EQUIPMENT, update=TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod, update=TRUE)
else
- add_movespeed_modifier(MOVESPEED_ID_MOB_EQUIPMENT, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=speedies, blacklisted_movetypes=FLOATING)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod, multiplicative_slowdown = speedies)
/// Gets the combined speed modification of all worn items
/// Except base mob type doesnt really wear items
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index bf9dad1bc7..7d177e7ac2 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -42,8 +42,11 @@
var/lying_prev = 0
var/is_shifted = FALSE
- //MOVEMENT SPEED
+ /// List of movement speed modifiers applying to this mob
var/list/movespeed_modification //Lazy list, see mob_movespeed.dm
+ /// List of movement speed modifiers ignored by this mob. List -> List (id) -> List (sources)
+ var/list/movespeed_mod_immunities //Lazy list, see mob_movespeed.dm
+ /// The calculated mob speed slowdown based on the modifiers list
var/cached_multiplicative_slowdown
/////////////////
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index ffc0970bdf..ddcebe9c0a 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -251,9 +251,9 @@
/mob/proc/update_gravity(has_gravity, override=FALSE)
var/speed_change = max(0, has_gravity - STANDARD_GRAVITY)
if(!speed_change)
- remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAVITY, update=TRUE)
+ remove_movespeed_modifier(/datum/movespeed_modifier/gravity)
else
- add_movespeed_modifier(MOVESPEED_ID_MOB_GRAVITY, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=speed_change, blacklisted_movetypes=FLOATING)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gravity, multiplicative_slowdown = speed_change)
//bodypart selection - Cyberboss
//8 toggles through head - eyes - mouth
diff --git a/code/modules/mob/mob_movespeed.dm b/code/modules/mob/mob_movespeed.dm
deleted file mode 100644
index a0be8ff7cb..0000000000
--- a/code/modules/mob/mob_movespeed.dm
+++ /dev/null
@@ -1,126 +0,0 @@
-
-/*Current movespeed modification list format: list(id = list(
- priority,
- flags,
- legacy slowdown/speedup amount,
- movetype_flags,
- blacklisted_movetypes,
- conflict
- ))
-*/
-
-//ANY ADD/REMOVE DONE IN UPDATE_MOVESPEED MUST HAVE THE UPDATE ARGUMENT SET AS FALSE!
-/mob/proc/add_movespeed_modifier(id, update=TRUE, priority=0, flags=NONE, override=FALSE, multiplicative_slowdown=0, movetypes=ALL, blacklisted_movetypes=NONE, conflict=FALSE)
- var/list/temp = list(priority, flags, multiplicative_slowdown, movetypes, blacklisted_movetypes, conflict) //build the modification list
- var/resort = TRUE
- if(LAZYACCESS(movespeed_modification, id))
- var/list/existing_data = movespeed_modification[id]
- if(movespeed_modifier_identical_check(existing_data, temp))
- return FALSE
- if(!override)
- return FALSE
- if(priority == existing_data[MOVESPEED_DATA_INDEX_PRIORITY])
- resort = FALSE // We don't need to re-sort if we're replacing something already there and it's the same priority
- LAZYSET(movespeed_modification, id, temp)
- if(update)
- update_movespeed(resort)
- return TRUE
-
-/mob/proc/remove_movespeed_modifier(id, update = TRUE)
- if(!LAZYACCESS(movespeed_modification, id))
- return FALSE
- LAZYREMOVE(movespeed_modification, id)
- UNSETEMPTY(movespeed_modification)
- if(update)
- update_movespeed(FALSE)
- return TRUE
-
-/mob/vv_edit_var(var_name, var_value)
- var/slowdown_edit = (var_name == NAMEOF(src, cached_multiplicative_slowdown))
- var/diff
- if(slowdown_edit && isnum(cached_multiplicative_slowdown) && isnum(var_value))
- remove_movespeed_modifier(MOVESPEED_ID_ADMIN_VAREDIT)
- diff = var_value - cached_multiplicative_slowdown
- . = ..()
- if(. && slowdown_edit && isnum(diff))
- add_movespeed_modifier(MOVESPEED_ID_ADMIN_VAREDIT, TRUE, 100, override = TRUE, multiplicative_slowdown = diff)
-
-/mob/proc/has_movespeed_modifier(id)
- return LAZYACCESS(movespeed_modification, id)
-
-/mob/proc/update_config_movespeed()
- add_movespeed_modifier(MOVESPEED_ID_CONFIG_SPEEDMOD, FALSE, 100, override = TRUE, multiplicative_slowdown = get_config_multiplicative_speed())
-
-/mob/proc/get_config_multiplicative_speed()
- if(!islist(GLOB.mob_config_movespeed_type_lookup) || !GLOB.mob_config_movespeed_type_lookup[type])
- return 0
- else
- return GLOB.mob_config_movespeed_type_lookup[type]
-
-/mob/proc/update_movespeed(resort = TRUE)
- if(resort)
- sort_movespeed_modlist()
- . = 0
- var/list/conflict_tracker = list()
- for(var/id in get_movespeed_modifiers())
- var/list/data = movespeed_modification[id]
- if(!(data[MOVESPEED_DATA_INDEX_MOVETYPE] & movement_type)) // We don't affect any of these move types, skip
- continue
- if(data[MOVESPEED_DATA_INDEX_BL_MOVETYPE] & movement_type) // There's a movetype here that disables this modifier, skip
- continue
- var/conflict = data[MOVESPEED_DATA_INDEX_CONFLICT]
- var/amt = data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN]
- if(conflict)
- // Conflicting modifiers prioritize the larger slowdown or the larger speedup
- // We purposefuly don't handle mixing speedups and slowdowns on the same id
- if(abs(conflict_tracker[conflict]) < abs(amt))
- conflict_tracker[conflict] = amt
- else
- continue
- . += amt
- cached_multiplicative_slowdown = .
-
-/mob/proc/get_movespeed_modifiers()
- return movespeed_modification
-
-/mob/proc/movespeed_modifier_identical_check(list/mod1, list/mod2)
- if(!islist(mod1) || !islist(mod2) || mod1.len < MOVESPEED_DATA_INDEX_MAX || mod2.len < MOVESPEED_DATA_INDEX_MAX)
- return FALSE
- for(var/i in 1 to MOVESPEED_DATA_INDEX_MAX)
- if(mod1[i] != mod2[i])
- return FALSE
- return TRUE
-
-/mob/proc/total_multiplicative_slowdown()
- . = 0
- for(var/id in get_movespeed_modifiers())
- var/list/data = movespeed_modification[id]
- . += data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN]
-
-/proc/movespeed_data_null_check(list/data) //Determines if a data list is not meaningful and should be discarded.
- . = TRUE
- if(data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN])
- . = FALSE
-
-/mob/proc/sort_movespeed_modlist() //Verifies it too. Sorts highest priority (first applied) to lowest priority (last applied)
- if(!movespeed_modification)
- return
- var/list/assembled = list()
- for(var/our_id in movespeed_modification)
- var/list/our_data = movespeed_modification[our_id]
- if(!islist(our_data) || (our_data.len < MOVESPEED_DATA_INDEX_PRIORITY) || movespeed_data_null_check(our_data))
- movespeed_modification -= our_id
- continue
- var/our_priority = our_data[MOVESPEED_DATA_INDEX_PRIORITY]
- var/resolved = FALSE
- for(var/their_id in assembled)
- var/list/their_data = assembled[their_id]
- if(their_data[MOVESPEED_DATA_INDEX_PRIORITY] < our_priority)
- assembled.Insert(assembled.Find(their_id), our_id)
- assembled[our_id] = our_data
- resolved = TRUE
- break
- if(!resolved)
- assembled[our_id] = our_data
- movespeed_modification = assembled
- UNSETEMPTY(movespeed_modification)
\ No newline at end of file
diff --git a/code/modules/movespeed/_movespeed_modifier.dm b/code/modules/movespeed/_movespeed_modifier.dm
new file mode 100644
index 0000000000..0976f4d067
--- /dev/null
+++ b/code/modules/movespeed/_movespeed_modifier.dm
@@ -0,0 +1,217 @@
+/*! Movespeed modification datums.
+
+ How move speed for mobs works
+
+Move speed is now calculated by using modifier datums which are added to mobs. Some of them (nonvariable ones) are globally cached, the variable ones are instanced and changed based on need.
+
+This gives us the ability to have multiple sources of movespeed, reliabily keep them applied and remove them when they should be
+
+THey can have unique sources and a bunch of extra fancy flags that control behaviour
+
+Previously trying to update move speed was a shot in the dark that usually meant mobs got stuck going faster or slower
+
+Movespeed modification list is a simple key = datum system. Key will be the datum's ID if it is overridden to not be null, or type if it is not.
+
+DO NOT override datum IDs unless you are going to have multiple types that must overwrite each other. It's more efficient to use types, ID functionality is only kept for cases where dynamic creation of modifiers need to be done.
+
+When update movespeed is called, the list of items is iterated, according to flags priority and a bunch of conditions
+this spits out a final calculated value which is used as a modifer to last_move + modifier for calculating when a mob
+can next move
+
+Key procs
+* [add_movespeed_modifier](mob.html#proc/add_movespeed_modifier)
+* [remove_movespeed_modifier](mob.html#proc/remove_movespeed_modifier)
+* [has_movespeed_modifier](mob.html#proc/has_movespeed_modifier)
+* [update_movespeed](mob.html#proc/update_movespeed)
+*/
+
+/datum/movespeed_modifier
+ /// Whether or not this is a variable modifier. Variable modifiers can NOT be ever auto-cached. ONLY CHECKED VIA INITIAL(), EFFECTIVELY READ ONLY (and for very good reason)
+ var/variable = FALSE
+
+ /// Unique ID. You can never have different modifications with the same ID. By default, this SHOULD NOT be set. Only set it for cases where you're dynamically making modifiers/need to have two types overwrite each other. If unset, uses path (converted to text) as ID.
+ var/id
+
+ /// Higher ones override lower priorities. This is NOT used for ID, ID must be unique, if it isn't unique the newer one overwrites automatically if overriding.
+ var/priority = 0
+ var/flags = NONE
+
+ /// Multiplicative slowdown
+ var/multiplicative_slowdown = 0
+
+ /// Movetypes this applies to
+ var/movetypes = ALL
+
+ /// Movetypes this never applies to
+ var/blacklisted_movetypes = NONE
+
+ /// Other modification datums this conflicts with.
+ var/conflicts_with
+
+/datum/movespeed_modifier/New()
+ . = ..()
+ if(!id)
+ id = "[type]" //We turn the path into a string.
+
+GLOBAL_LIST_EMPTY(movespeed_modification_cache)
+
+/// Grabs a STATIC MODIFIER datum from cache. YOU MUST NEVER EDIT THESE DATUMS, OR IT WILL AFFECT ANYTHING ELSE USING IT TOO!
+/proc/get_cached_movespeed_modifier(modtype)
+ if(!ispath(modtype, /datum/movespeed_modifier))
+ CRASH("[modtype] is not a movespeed modification typepath.")
+ var/datum/movespeed_modifier/M = modtype
+ if(initial(M.variable))
+ CRASH("[modtype] is a variable modifier, and can never be cached.")
+ M = GLOB.movespeed_modification_cache[modtype]
+ if(!M)
+ M = GLOB.movespeed_modification_cache[modtype] = new modtype
+ return M
+
+///Add a move speed modifier to a mob. If a variable subtype is passed in as the first argument, it will make a new datum. If ID conflicts, it will overwrite the old ID.
+/mob/proc/add_movespeed_modifier(datum/movespeed_modifier/type_or_datum, update = TRUE)
+ if(ispath(type_or_datum))
+ if(!initial(type_or_datum.variable))
+ type_or_datum = get_cached_movespeed_modifier(type_or_datum)
+ else
+ type_or_datum = new type_or_datum
+ var/datum/movespeed_modifier/existing = LAZYACCESS(movespeed_modification, type_or_datum.id)
+ if(existing)
+ if(existing == type_or_datum) //same thing don't need to touch
+ return TRUE
+ remove_movespeed_modifier(existing, FALSE)
+ if(length(movespeed_modification))
+ BINARY_INSERT(type_or_datum.id, movespeed_modification, datum/movespeed_modifier, type_or_datum, priority, COMPARE_VALUE)
+ LAZYSET(movespeed_modification, type_or_datum.id, type_or_datum)
+ if(update)
+ update_movespeed()
+ return TRUE
+
+/// Remove a move speed modifier from a mob, whether static or variable.
+/mob/proc/remove_movespeed_modifier(datum/movespeed_modifier/type_id_datum, update = TRUE)
+ var/key
+ if(ispath(type_id_datum))
+ key = initial(type_id_datum.id) || "[type_id_datum]" //id if set, path set to string if not.
+ else if(!istext(type_id_datum)) //if it isn't text it has to be a datum, as it isn't a type.
+ key = type_id_datum.id
+ else //assume it's an id
+ key = type_id_datum
+ if(!LAZYACCESS(movespeed_modification, key))
+ return FALSE
+ LAZYREMOVE(movespeed_modification, key)
+ if(update)
+ update_movespeed(FALSE)
+ return TRUE
+
+/*! Used for variable slowdowns like hunger/health loss/etc, works somewhat like the old list-based modification adds. Returns the modifier datum if successful
+ How this SHOULD work is:
+ 1. Ensures type_id_datum one way or another refers to a /variable datum. This makes sure it can't be cached. This includes if it's already in the modification list.
+ 2. Instantiate a new datum if type_id_datum isn't already instantiated + in the list, using the type. Obviously, wouldn't work for ID only.
+ 3. Add the datum if necessary using the regular add proc
+ 4. If any of the rest of the args are not null (see: multiplicative slowdown), modify the datum
+ 5. Update if necessary
+*/
+/mob/proc/add_or_update_variable_movespeed_modifier(datum/movespeed_modifier/type_id_datum, update = TRUE, multiplicative_slowdown)
+ var/modified = FALSE
+ var/inject = FALSE
+ var/datum/movespeed_modifier/final
+ if(istext(type_id_datum))
+ final = LAZYACCESS(movespeed_modification, type_id_datum)
+ if(!final)
+ CRASH("Couldn't find existing modification when provided a text ID.")
+ else if(ispath(type_id_datum))
+ if(!initial(type_id_datum.variable))
+ CRASH("Not a variable modifier")
+ final = LAZYACCESS(movespeed_modification, initial(type_id_datum.id) || "[type_id_datum]")
+ if(!final)
+ final = new type_id_datum
+ inject = TRUE
+ modified = TRUE
+ else
+ if(!initial(type_id_datum.variable))
+ CRASH("Not a variable modifier")
+ final = type_id_datum
+ if(!LAZYACCESS(movespeed_modification, final.id))
+ inject = TRUE
+ modified = TRUE
+ if(!isnull(multiplicative_slowdown))
+ final.multiplicative_slowdown = multiplicative_slowdown
+ modified = TRUE
+ if(inject)
+ add_movespeed_modifier(final, FALSE)
+ if(update && modified)
+ update_movespeed(TRUE)
+ return final
+
+/// Handles the special case of editing the movement var
+/mob/vv_edit_var(var_name, var_value)
+ var/slowdown_edit = (var_name == NAMEOF(src, cached_multiplicative_slowdown))
+ var/diff
+ if(slowdown_edit && isnum(cached_multiplicative_slowdown) && isnum(var_value))
+ remove_movespeed_modifier(/datum/movespeed_modifier/admin_varedit)
+ diff = var_value - cached_multiplicative_slowdown
+ . = ..()
+ if(. && slowdown_edit && isnum(diff))
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/admin_varedit, multiplicative_slowdown = diff)
+
+///Is there a movespeed modifier for this mob
+/mob/proc/has_movespeed_modifier(datum/movespeed_modifier/datum_type_id)
+ var/key
+ if(ispath(datum_type_id))
+ key = initial(datum_type_id.id) || "[datum_type_id]"
+ else if(istext(datum_type_id))
+ key = datum_type_id
+ else
+ key = datum_type_id.id
+ return LAZYACCESS(movespeed_modification, key)
+
+/// Set or update the global movespeed config on a mob
+/mob/proc/update_config_movespeed()
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/mob_config_speedmod, multiplicative_slowdown = get_config_multiplicative_speed())
+
+/// Get the global config movespeed of a mob by type
+/mob/proc/get_config_multiplicative_speed()
+ if(!islist(GLOB.mob_config_movespeed_type_lookup) || !GLOB.mob_config_movespeed_type_lookup[type])
+ return 0
+ else
+ return GLOB.mob_config_movespeed_type_lookup[type]
+
+/// Go through the list of movespeed modifiers and calculate a final movespeed. ANY ADD/REMOVE DONE IN UPDATE_MOVESPEED MUST HAVE THE UPDATE ARGUMENT SET AS FALSE!
+/mob/proc/update_movespeed()
+ . = 0
+ var/list/conflict_tracker = list()
+ for(var/key in get_movespeed_modifiers())
+ var/datum/movespeed_modifier/M = movespeed_modification[key]
+ if(!(M.movetypes & movement_type)) // We don't affect any of these move types, skip
+ continue
+ if(M.blacklisted_movetypes & movement_type) // There's a movetype here that disables this modifier, skip
+ continue
+ var/conflict = M.conflicts_with
+ var/amt = M.multiplicative_slowdown
+ if(conflict)
+ // Conflicting modifiers prioritize the larger slowdown or the larger speedup
+ // We purposefuly don't handle mixing speedups and slowdowns on the same id
+ if(abs(conflict_tracker[conflict]) < abs(amt))
+ conflict_tracker[conflict] = amt
+ else
+ continue
+ . += amt
+ cached_multiplicative_slowdown = .
+
+/// Get the move speed modifiers list of the mob
+/mob/proc/get_movespeed_modifiers()
+ . = LAZYCOPY(movespeed_modification)
+ for(var/id in movespeed_mod_immunities)
+ . -= id
+
+/// Calculate the total slowdown of all movespeed modifiers
+/mob/proc/total_multiplicative_slowdown()
+ . = 0
+ for(var/id in get_movespeed_modifiers())
+ var/datum/movespeed_modifier/M = movespeed_modification[id]
+ . += M.multiplicative_slowdown
+
+/// Checks if a move speed modifier is valid and not missing any data
+/proc/movespeed_data_null_check(datum/movespeed_modifier/M) //Determines if a data list is not meaningful and should be discarded.
+ . = TRUE
+ if(M.multiplicative_slowdown)
+ . = FALSE
diff --git a/code/modules/movespeed/modifiers/components.dm b/code/modules/movespeed/modifiers/components.dm
new file mode 100644
index 0000000000..436b85e2e1
--- /dev/null
+++ b/code/modules/movespeed/modifiers/components.dm
@@ -0,0 +1,21 @@
+/datum/movespeed_modifier/shrink_ray
+ movetypes = GROUND
+ multiplicative_slowdown = 4
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/snail_crawl
+ multiplicative_slowdown = -7
+ movetypes = GROUND
+
+/datum/movespeed_modifier/sanity
+ id = MOVESPEED_ID_SANITY
+ blacklisted_movetypes = FLYING
+
+/datum/movespeed_modifier/sanity/insane
+ multiplicative_slowdown = 1.5
+
+/datum/movespeed_modifier/sanity/crazy
+ multiplicative_slowdown = 1
+
+/datum/movespeed_modifier/sanity/disturbed
+ multiplicative_slowdown = 0.5
diff --git a/code/modules/movespeed/modifiers/innate.dm b/code/modules/movespeed/modifiers/innate.dm
new file mode 100644
index 0000000000..a0357ddf0f
--- /dev/null
+++ b/code/modules/movespeed/modifiers/innate.dm
@@ -0,0 +1,20 @@
+/datum/movespeed_modifier/strained_muscles
+ multiplicative_slowdown = -1
+ blacklisted_movetypes = (FLYING|FLOATING)
+
+/datum/movespeed_modifier/pai_spacewalk
+ multiplicative_slowdown = 2
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/species
+ movetypes = ~FLYING
+ variable = TRUE
+
+/datum/movespeed_modifier/dna_vault_speedup
+ blacklisted_movetypes = (FLYING|FLOATING)
+ multiplicative_slowdown = -1
+
+/datum/movespeed_modifier/small_stride
+ blacklisted_movetypes = (FLOATING|CRAWLING)
+ variable = TRUE
+ flags = IGNORE_NOSLOW
diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm
new file mode 100644
index 0000000000..94dc2a1553
--- /dev/null
+++ b/code/modules/movespeed/modifiers/items.dm
@@ -0,0 +1,12 @@
+/datum/movespeed_modifier/jetpack
+ conflicts_with = MOVE_CONFLICT_JETPACK
+ movetypes = FLOATING
+
+/datum/movespeed_modifier/jetpack/cybernetic
+ multiplicative_slowdown = -0.5
+
+/datum/movespeed_modifier/jetpack/fullspeed
+ multiplicative_slowdown = -2
+
+/datum/movespeed_modifier/die_of_fate
+ multiplicative_slowdown = 1
diff --git a/code/modules/movespeed/modifiers/misc.dm b/code/modules/movespeed/modifiers/misc.dm
new file mode 100644
index 0000000000..55c1aef527
--- /dev/null
+++ b/code/modules/movespeed/modifiers/misc.dm
@@ -0,0 +1,6 @@
+/datum/movespeed_modifier/admin_varedit
+ variable = TRUE
+
+/datum/movespeed_modifier/yellow_orb
+ multiplicative_slowdown = -2
+ blacklisted_movetypes = (FLYING|FLOATING)
diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm
new file mode 100644
index 0000000000..aa60966591
--- /dev/null
+++ b/code/modules/movespeed/modifiers/mobs.dm
@@ -0,0 +1,120 @@
+/datum/movespeed_modifier/obesity
+ multiplicative_slowdown = 1.5
+
+/datum/movespeed_modifier/monkey_reagent_speedmod
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+
+/datum/movespeed_modifier/monkey_health_speedmod
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+
+/datum/movespeed_modifier/monkey_temperature_speedmod
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+
+/datum/movespeed_modifier/hunger
+ variable = TRUE
+
+/datum/movespeed_modifier/slaughter
+ multiplicative_slowdown = -1
+
+/datum/movespeed_modifier/damage_slowdown
+ blacklisted_movetypes = FLOATING|FLYING
+ variable = TRUE
+
+/datum/movespeed_modifier/damage_slowdown_flying
+ movetypes = FLOATING
+ variable = TRUE
+
+/datum/movespeed_modifier/equipment_speedmod
+ variable = TRUE
+ blacklisted_movetypes = FLOATING
+
+/datum/movespeed_modifier/grab_slowdown
+ id = MOVESPEED_ID_MOB_GRAB_STATE
+ blacklisted_movetypes = FLOATING
+
+/datum/movespeed_modifier/grab_slowdown/aggressive
+ multiplicative_slowdown = 3
+
+/datum/movespeed_modifier/grab_slowdown/neck
+ multiplicative_slowdown = 6
+
+/datum/movespeed_modifier/grab_slowdown/kill
+ multiplicative_slowdown = 9
+
+/datum/movespeed_modifier/slime_reagentmod
+ variable = TRUE
+
+/datum/movespeed_modifier/slime_healthmod
+ variable = TRUE
+
+/datum/movespeed_modifier/config_walk_run
+ multiplicative_slowdown = 1
+ id = MOVESPEED_ID_MOB_WALK_RUN
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/config_walk_run/proc/sync()
+
+/datum/movespeed_modifier/config_walk_run/walk/sync()
+ var/mod = CONFIG_GET(number/movedelay/walk_delay)
+ multiplicative_slowdown = isnum(mod)? mod : initial(multiplicative_slowdown)
+
+/datum/movespeed_modifier/config_walk_run/run/sync()
+ var/mod = CONFIG_GET(number/movedelay/run_delay)
+ multiplicative_slowdown = isnum(mod)? mod : initial(multiplicative_slowdown)
+
+/datum/movespeed_modifier/turf_slowdown
+ movetypes = GROUND
+ blacklisted_movetypes = (FLYING|FLOATING)
+ variable = TRUE
+
+/datum/movespeed_modifier/bulky_drag
+ variable = TRUE
+
+/datum/movespeed_modifier/cold
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+
+/datum/movespeed_modifier/shove
+ multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH
+
+/datum/movespeed_modifier/human_carry
+ variable = TRUE
+
+/datum/movespeed_modifier/limbless
+ variable = TRUE
+ movetypes = GROUND
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/simplemob_varspeed
+ variable = TRUE
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/tarantula_web
+ multiplicative_slowdown = 3
+
+/datum/movespeed_modifier/gravity
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/carbon_softcrit
+ multiplicative_slowdown = SOFTCRIT_ADD_SLOWDOWN
+
+/datum/movespeed_modifier/slime_tempmod
+ variable = TRUE
+
+/datum/movespeed_modifier/carbon_crawling
+ multiplicative_slowdown = CRAWLING_ADD_SLOWDOWN
+ movetypes = CRAWLING
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/mob_config_speedmod
+ variable = TRUE
+ flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/liver_cirrhosis
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
diff --git a/code/modules/movespeed/modifiers/reagents.dm b/code/modules/movespeed/modifiers/reagents.dm
new file mode 100644
index 0000000000..b6c2458670
--- /dev/null
+++ b/code/modules/movespeed/modifiers/reagents.dm
@@ -0,0 +1,14 @@
+/datum/movespeed_modifier/reagent
+ blacklisted_movetypes = (FLYING|FLOATING)
+
+/datum/movespeed_modifier/reagent/stimulants
+ multiplicative_slowdown = -0.5
+
+/datum/movespeed_modifier/reagent/changelinghaste
+ multiplicative_slowdown = -2
+
+/datum/movespeed_modifier/reagent/skooma
+ multiplicative_slowdown = -1
+
+/datum/movespeed_modifier/reagent/nitryl
+ multiplicative_slowdown = -1
diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm
new file mode 100644
index 0000000000..4c710cb483
--- /dev/null
+++ b/code/modules/movespeed/modifiers/status_effects.dm
@@ -0,0 +1,44 @@
+/datum/movespeed_modifier/status_effect/bloodchill
+ multiplicative_slowdown = 3
+
+/datum/movespeed_modifier/status_effect/bonechill
+ multiplicative_slowdown = 3
+
+/datum/movespeed_modifier/status_effect/tarfoot
+ multiplicative_slowdown = 0.5
+ blacklisted_movetypes = (FLYING|FLOATING)
+
+/datum/movespeed_modifier/status_effect/sepia
+ variable = TRUE
+ blacklisted_movetypes = (FLYING|FLOATING)
+
+/datum/movespeed_modifier/status_effect/mesmerize
+ blacklisted_movetypes = CRAWLING
+ multiplicative_slowdown = 5
+ priority = 64
+
+/datum/movespeed_modifier/status_effect/tased
+ multiplicative_slowdown = 1.5
+ priority = 50
+
+/datum/movespeed_modifier/status_effect/tased/no_combat_mode
+ multiplicative_slowdown = 8
+ priority = 100
+
+/datum/movespeed_modifier/status_effect/electrostaff
+ multiplicative_slowdown = 1
+ movetypes = GROUND
+
+//no comment.
+/datum/movespeed_modifier/status_effect/breast_hypertrophy
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+
+//this shouldn't even exist.
+/datum/movespeed_modifier/status_effect/penis_hypertrophy
+ blacklisted_movetypes = FLOATING
+ variable = TRUE
+
+/datum/movespeed_modifier/status_effect/mkultra
+ multiplicative_slowdown = -2
+ blacklisted_movetypes= FLYING|FLOATING
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index aab38c8754..eecc1394de 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -533,7 +533,7 @@ By design, d1 is the smallest direction and d2 is the highest
if(affecting && affecting.status == BODYPART_ROBOTIC)
if(user == H)
user.visible_message("[user] starts to fix some of the wires in [H]'s [affecting.name].", "You start fixing some of the wires in [H]'s [affecting.name].")
- if(!do_after(user, H, 50))
+ if(!do_mob(user, H, 50))
return
if(item_heal_robotic(H, user, 0, 15))
use(1)
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 7fb17ced57..4894a8d8eb 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -41,9 +41,12 @@
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return//CIT CHANGE - ditto
pump(user, TRUE)
- recentpump = world.time + 10
- if(istype(user))//CIT CHANGE - makes pumping shotguns cost a lil bit of stamina.
- user.adjustStaminaLossBuffered(2) //CIT CHANGE - DITTO. make this scale inversely to the strength stat when stats/skills are added
+ if(HAS_TRAIT(user, TRAIT_FAST_PUMP))
+ recentpump = world.time + 2
+ else
+ recentpump = world.time + 10
+ if(istype(user))//CIT CHANGE - makes pumping shotguns cost a lil bit of stamina.
+ user.adjustStaminaLossBuffered(2) //CIT CHANGE - DITTO. make this scale inversely to the strength stat when stats/skills are added
return
/obj/item/gun/ballistic/shotgun/blow_up(mob/user)
@@ -90,7 +93,7 @@
fire_delay = 7
mag_type = /obj/item/ammo_box/magazine/internal/shot/riot
sawn_desc = "Come with me if you want to live."
- unique_reskin = list("Tatical" = "riotshotgun",
+ unique_reskin = list("Tactical" = "riotshotgun",
"Wood Stock" = "wood_riotshotgun"
)
@@ -212,7 +215,7 @@
fire_delay = 5
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = WEIGHT_CLASS_HUGE
- unique_reskin = list("Tatical" = "cshotgun",
+ unique_reskin = list("Tactical" = "cshotgun",
"Slick" = "cshotgun_slick"
)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index e754a9c070..8a1db49762 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -241,3 +241,87 @@
to_chat(user, "The pin beeps, refusing to fire.")
return FALSE
return TRUE
+
+/obj/item/firing_pin/security_level
+ name = "security level firing pin"
+ desc = "A sophisticated firing pin that authorizes operation based on its settings and current security level."
+ icon_state = "firing_pin_sec_level"
+ var/min_sec_level = SEC_LEVEL_GREEN
+ var/max_sec_level = SEC_LEVEL_DELTA
+ var/only_lethals = FALSE
+ var/can_toggle = TRUE
+
+/obj/item/firing_pin/security_level/Initialize()
+ . = ..()
+ fail_message = "INVALID SECURITY LEVEL. CURRENT: [uppertext(NUM2SECLEVEL(GLOB.security_level))]. \
+ MIN: [uppertext(NUM2SECLEVEL(min_sec_level))]. MAX: [uppertext(NUM2SECLEVEL(max_sec_level))]. \
+ ONLY LETHALS: [only_lethals ? "YES" : "NO"]."
+ update_icon()
+
+/obj/item/firing_pin/security_level/examine(mob/user)
+ . = ..()
+ var/lethal = only_lethals ? "only lethal " : ""
+ if(min_sec_level != max_sec_level)
+ . += "It's currently set to disallow [lethal]operation when the security level isn't between [NUM2SECLEVEL(min_sec_level)] and [NUM2SECLEVEL(max_sec_level)]."
+ else
+ . += "It's currently set to disallow [lethal]operation when the security level isn't [NUM2SECLEVEL(min_sec_level)]."
+ if(can_toggle)
+ . += "You can use a multitool to modify its settings."
+
+/obj/item/firing_pin/security_level/multitool_act(mob/living/user, obj/item/I)
+ . = TRUE
+ if(!can_toggle || !user.canUseTopic(src, BE_CLOSE))
+ return
+ var/selection = alert(user, "Which setting would you want to modify?", "Firing Pin Settings", "Minimum Level Setting", "Maximum Level Setting", "Lethals Only Toggle")
+ if(QDELETED(src) || QDELETED(user) || !user.canUseTopic(src, BE_CLOSE))
+ return
+ var/static/list/till_designs_pr_isnt_merged = list("green", "blue", "amber", "red", "delta")
+ switch(selection)
+ if("Minimum Level Setting")
+ var/input = input(user, "Input the new minimum level setting.", "Firing Pin Settings", NUM2SECLEVEL(min_sec_level)) as null|anything in till_designs_pr_isnt_merged
+ if(!input)
+ return
+ min_sec_level = till_designs_pr_isnt_merged.Find(input) - 1
+ if(min_sec_level > max_sec_level)
+ max_sec_level = SEC_LEVEL_DELTA
+ if("Maximum Level Setting")
+ var/input = input(user, "Input the new maximum level setting.", "Firing Pin Settings", NUM2SECLEVEL(max_sec_level)) as null|anything in till_designs_pr_isnt_merged
+ if(!input)
+ return
+ max_sec_level = till_designs_pr_isnt_merged.Find(input) - 1
+ if(max_sec_level < max_sec_level)
+ min_sec_level = SEC_LEVEL_GREEN
+ if("Lethals Only Toggle")
+ only_lethals = !only_lethals
+
+ fail_message = "INVALID SECURITY LEVEL. CURRENT: [uppertext(NUM2SECLEVEL(GLOB.security_level))]. \
+ MIN: [uppertext(NUM2SECLEVEL(min_sec_level))]. MAX: [uppertext(NUM2SECLEVEL(max_sec_level))]. \
+ ONLY LETHALS: [only_lethals ? "YES" : "NO"]."
+ update_icon()
+
+/obj/item/firing_pin/security_level/update_overlays()
+ . = ..()
+ var/offset = 0
+ for(var/level in list(min_sec_level, max_sec_level))
+ var/mutable_appearance/overlay = mutable_appearance(icon, "pin_sec_level_overlay")
+ overlay.pixel_x += offset
+ offset += 4
+ switch(level)
+ if(SEC_LEVEL_GREEN)
+ overlay.color = "#b2ff59" //light green
+ if(SEC_LEVEL_BLUE)
+ overlay.color = "#99ccff" //light blue
+ if(SEC_LEVEL_AMBER)
+ overlay.color = "#ffae42" //light yellow/orange
+ if(SEC_LEVEL_RED)
+ overlay.color = "#ff3f34" //light red
+ else
+ overlay.color = "#fe59c2" //neon fuchsia
+ . += overlay
+ var/mutable_appearance/overlay = mutable_appearance(icon, "pin_sec_level_overlay")
+ overlay.pixel_x += offset
+ overlay.color = only_lethals ? "#b2ff59" : "#ff3f34"
+ . += overlay
+
+/obj/item/firing_pin/security_level/pin_auth(mob/living/user)
+ return (only_lethals && !(gun.chambered?.harmful)) || ISINRANGE(GLOB.security_level, min_sec_level, max_sec_level)
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 725b967a63..a85ac8b085 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
var/inverse_chem // What chem is metabolised when purity is below inverse_chem_val, this shouldn't be made, but if it does, well, I guess I'll know about it.
var/metabolizing = FALSE
var/chemical_flags // See fermi/readme.dm REAGENT_DEAD_PROCESS, REAGENT_DONOTSPLIT, REAGENT_ONLYINVERSE, REAGENT_ONMOBMERGE, REAGENT_INVISIBLE, REAGENT_FORCEONNEW, REAGENT_SNEAKYNAME
- var/value = 0 //How much does it sell for in cargo?
+ var/value = REAGENT_VALUE_NONE //How much does it sell for in cargo?
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
. = ..()
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 8194392871..464557f617 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -14,6 +14,7 @@
taste_description = "alcohol"
var/boozepwr = 65 //Higher numbers equal higher hardness, higher hardness equals more intense alcohol poisoning
pH = 7.33
+ value = REAGENT_VALUE_VERY_COMMON //don't bother tweaking all drinks values, way too many can easily be done roundstart or with an upgraded dispenser.
/*
Boozepwr Chart
@@ -88,7 +89,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of beer"
glass_desc = "A freezing pint of beer."
pH = 4
- value = 0.1
/datum/reagent/consumable/ethanol/beer/light
name = "Light Beer"
@@ -98,7 +98,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of light beer"
glass_desc = "A freezing pint of watery light beer."
pH = 5
- value = 0.3
/datum/reagent/consumable/ethanol/beer/green
name = "Green Beer"
@@ -109,7 +108,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of green beer"
glass_desc = "A freezing pint of green beer. Festive."
pH = 6
- value = 0.3
/datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/M)
if(M.color != color)
@@ -129,7 +127,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "DAMN, THIS THING LOOKS ROBUST!"
shot_glass_icon_state = "shotglasscream"
pH = 6
- value = 0.1
/datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/M)
@@ -152,7 +149,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy."
shot_glass_icon_state = "shotglassbrown"
pH = 4.5
- value = 0.1
/datum/reagent/consumable/ethanol/thirteenloko
name = "Thirteen Loko"
@@ -167,7 +163,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "thirteen_loko_glass"
glass_name = "glass of Thirteen Loko"
glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass."
- value = 0.3
/datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(0,M.drowsyness-7)
@@ -229,7 +224,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "The glass contain wodka. Xynta."
shot_glass_icon_state = "shotglassclear"
pH = 8.1
- value = 0.1
/datum/reagent/consumable/ethanol/vodka/on_mob_life(mob/living/carbon/M)
M.radiation = max(M.radiation-2,0)
@@ -245,7 +239,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_brown"
glass_name = "glass of bilk"
glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis."
- value = 0.5
/datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(10))
@@ -264,7 +257,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Three Mile Island Ice Tea"
glass_desc = "A glass of this is sure to prevent a meltdown."
pH = 3.5
- value = 1
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/M)
M.set_drugginess(50)
@@ -280,7 +273,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of gin"
glass_desc = "A crystal clear glass of Griffeater gin."
pH = 6.9
- value = 0.1
/datum/reagent/consumable/ethanol/rum
name = "Rum"
@@ -293,7 +285,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "Now you want to Pray for a pirate suit, don't you?"
shot_glass_icon_state = "shotglassbrown"
pH = 6.5
- value = 0.1
/datum/reagent/consumable/ethanol/tequila
name = "Tequila"
@@ -306,7 +297,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "Now all that's missing is the weird colored shades!"
shot_glass_icon_state = "shotglassgold"
pH = 4
- value = 0.1
/datum/reagent/consumable/ethanol/vermouth
name = "Vermouth"
@@ -319,7 +309,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "You wonder why you're even drinking this straight."
shot_glass_icon_state = "shotglassclear"
pH = 3.25
- value = 0.1
/datum/reagent/consumable/ethanol/wine
name = "Wine"
@@ -332,7 +321,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "A very classy looking drink."
shot_glass_icon_state = "shotglassred"
pH = 3.45
- value = 0.1
/datum/reagent/consumable/ethanol/lizardwine
name = "Lizard wine"
@@ -342,7 +330,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
quality = DRINK_FANTASTIC
taste_description = "scaley sweetness"
pH = 3
- value = 2
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/consumable/ethanol/grappa
name = "Grappa"
@@ -354,7 +342,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of grappa"
glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking."
pH = 3.5
- value = 0.1
/datum/reagent/consumable/ethanol/cognac
name = "Cognac"
@@ -367,7 +354,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this."
shot_glass_icon_state = "shotglassbrown"
pH = 3.5
- value = 0.1
/datum/reagent/consumable/ethanol/absinthe
name = "Absinthe"
@@ -379,7 +365,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of absinthe"
glass_desc = "It's as strong as it smells."
shot_glass_icon_state = "shotglassgreen"
- value = 0.1
/datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/carbon/M)
if(prob(10) && !HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE))
@@ -395,6 +380,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_brown2"
glass_name = "Hooch"
glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/hooch/on_mob_life(mob/living/carbon/M)
if(M.mind && M.mind.assigned_role == "Assistant")
@@ -412,7 +398,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of ale"
glass_desc = "A freezing pint of delicious Ale."
pH = 4.5
- value = 0.1
/datum/reagent/consumable/ethanol/goldschlager
name = "Goldschlager"
@@ -425,7 +410,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of goldschlager"
glass_desc = "100% proof that teen girls will drink anything with gold in it."
shot_glass_icon_state = "shotglassgold"
- value = 0.5
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/patron
name = "Patron"
@@ -439,7 +424,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "Drinking patron in the bar, with all the subpar ladies."
shot_glass_icon_state = "shotglassclear"
pH = 4.5
- value = 0.1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/gintonic
name = "Gin and Tonic"
@@ -452,7 +437,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Gin and Tonic"
glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman."
pH = 3
- value = 0.5
/datum/reagent/consumable/ethanol/rum_coke
name = "Rum and Coke"
@@ -465,7 +449,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Rum and Coke"
glass_desc = "The classic go-to of space-fratboys."
pH = 4
- value = 1
/datum/reagent/consumable/ethanol/cuba_libre
name = "Cuba Libre"
@@ -477,8 +460,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "cubalibreglass"
glass_name = "Cuba Libre"
glass_desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!"
- value = 0.5
-
/datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/carbon/M)
if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev)) //Cuba Libre, the traditional drink of revolutions! Heals revolutionaries.
@@ -499,7 +480,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "whiskeycolaglass"
glass_name = "whiskey cola"
glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious."
- value = 0.5
/datum/reagent/consumable/ethanol/martini
name = "Classic Martini"
@@ -511,7 +491,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "martiniglass"
glass_name = "Classic Martini"
glass_desc = "Damn, the bartender even stirred it, not shook it."
- value = 1
/datum/reagent/consumable/ethanol/vodkamartini
name = "Vodka Martini"
@@ -523,7 +502,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "martiniglass"
glass_name = "Vodka martini"
glass_desc ="A bastardisation of the classic martini. Still great."
- value = 1
/datum/reagent/consumable/ethanol/white_russian
@@ -536,7 +514,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "whiterussianglass"
glass_name = "White Russian"
glass_desc = "A very nice looking drink. But that's just, like, your opinion, man."
- value = 1
/datum/reagent/consumable/ethanol/screwdrivercocktail
name = "Screwdriver"
@@ -548,7 +525,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "screwdriverglass"
glass_name = "Screwdriver"
glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer."
- value = 1
/datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/M)
if(M.mind && (M.mind.assigned_role in list("Station Engineer", "Atmospheric Technician", "Chief Engineer"))) //Engineers lose radiation poisoning at a massive rate.
@@ -564,7 +540,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "booger"
glass_name = "Booger"
glass_desc = "Ewww..."
- value = 0.3
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/bloody_mary
name = "Bloody Mary"
@@ -576,7 +552,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "bloodymaryglass"
glass_name = "Bloody Mary"
glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder."
- value = 1.3
/datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C)
if(AmBloodsucker(C))
@@ -595,7 +570,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "bravebullglass"
glass_name = "Brave Bull"
glass_desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up."
- value = 2
var/tough_text
/datum/reagent/consumable/ethanol/brave_bull/on_mob_metabolize(mob/living/M)
@@ -619,7 +593,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "tequilasunriseglass"
glass_name = "tequila Sunrise"
glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..."
- value = 2
var/obj/effect/light_holder
/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_metabolize(mob/living/M)
@@ -649,7 +622,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Toxins Special"
glass_desc = "Whoah, this thing is on FIRE!"
shot_glass_icon_state = "toxinsspecialglass"
- value = 2
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/toxins_special/on_mob_life(var/mob/living/M)
M.adjust_bodytemperature(15 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 20) //310.15 is the normal bodytemp.
@@ -668,7 +641,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW."
pH = 2
overdose_threshold = 40
- value = 3
var/datum/brain_trauma/special/beepsky/B
/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/M)
@@ -709,7 +681,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "irishcreamglass"
glass_name = "Irish Cream"
glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?"
- value = 1
/datum/reagent/consumable/ethanol/manly_dorf
name = "The Manly Dorf"
@@ -721,7 +692,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "manlydorfglass"
glass_name = "The Manly Dorf"
glass_desc = "A manly concoction made from Ale and Beer. Intended for true men only."
- value = 2
var/dorf_mode
/datum/reagent/consumable/ethanol/manly_dorf/on_mob_metabolize(mob/living/M)
@@ -752,7 +722,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "longislandicedteaglass"
glass_name = "Long Island Iced Tea"
glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
- value = 1
/datum/reagent/consumable/ethanol/moonshine
name = "Moonshine"
@@ -763,7 +732,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_clear"
glass_name = "Moonshine"
glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
- value = 2
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/b52
name = "B-52"
@@ -776,7 +745,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "B-52"
glass_desc = "Kahlua, Irish Cream, and cognac. You will get bombed."
shot_glass_icon_state = "b52glass"
- value = 5.2
/datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/M)
playsound(M, 'sound/effects/explosion_distant.ogg', 100, FALSE)
@@ -791,7 +759,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "irishcoffeeglass"
glass_name = "Irish Coffee"
glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning."
- value = 2
/datum/reagent/consumable/ethanol/margarita
name = "Margarita"
@@ -803,7 +770,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "margaritaglass"
glass_name = "Margarita"
glass_desc = "On the rocks with salt on the rim. Arriba~!"
- value = 2
/datum/reagent/consumable/ethanol/black_russian
name = "Black Russian"
@@ -815,7 +781,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "blackrussianglass"
glass_name = "Black Russian"
glass_desc = "For the lactose-intolerant. Still as classy as a White Russian."
- value = 3
/datum/reagent/consumable/ethanol/manhattan
@@ -828,7 +793,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "manhattanglass"
glass_name = "Manhattan"
glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..."
- value = 3
/datum/reagent/consumable/ethanol/manhattan_proj
@@ -841,7 +805,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "proj_manhattanglass"
glass_name = "Manhattan Project"
glass_desc = "A scientist's drink of choice, for thinking how to blow up the station."
- value = 6
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/manhattan_proj/on_mob_life(mob/living/carbon/M)
@@ -858,7 +822,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "whiskeysodaglass2"
glass_name = "whiskey soda"
glass_desc = "Ultimate refreshment."
- value = 1
/datum/reagent/consumable/ethanol/antifreeze
name = "Anti-freeze"
@@ -870,7 +833,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "antifreeze"
glass_name = "Anti-freeze"
glass_desc = "The ultimate refreshment."
- value = 3
/datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 20) //310.15 is the normal bodytemp.
@@ -886,7 +848,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "b&p"
glass_name = "Barefoot"
glass_desc = "Barefoot and pregnant."
- value = 4
/datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/M)
if(ishuman(M)) //Barefoot causes the imbiber to quickly regenerate brute trauma if they're not wearing shoes.
@@ -906,7 +867,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "snowwhite"
glass_name = "Snow White"
glass_desc = "A cold refreshment."
- value = 1
/datum/reagent/consumable/ethanol/demonsblood //Prevents the imbiber from being dragged into a pool of blood by a slaughter demon.
name = "Demon's Blood"
@@ -918,7 +878,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "demonsblood"
glass_name = "Demons Blood"
glass_desc = "Just looking at this thing makes the hair at the back of your neck stand up."
- value = 2
/datum/reagent/consumable/ethanol/devilskiss //If eaten by a slaughter demon, the demon will regret it.
name = "Devil's Kiss"
@@ -930,7 +889,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "devilskiss"
glass_name = "Devils Kiss"
glass_desc = "Creepy time!"
- value = 2
/datum/reagent/consumable/ethanol/vodkatonic
name = "Vodka and Tonic"
@@ -942,7 +900,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "vodkatonicglass"
glass_name = "vodka and tonic"
glass_desc = "For when a gin and tonic isn't Russian enough."
- value = 1
/datum/reagent/consumable/ethanol/ginfizz
name = "Gin Fizz"
@@ -954,7 +911,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "ginfizzglass"
glass_name = "gin fizz"
glass_desc = "Refreshingly lemony, deliciously dry."
- value = 1
/datum/reagent/consumable/ethanol/bahama_mama
name = "Bahama Mama"
@@ -966,7 +922,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "bahama_mama"
glass_name = "Bahama Mama"
glass_desc = "A tropical cocktail with a complex blend of flavors."
- value = 2
/datum/reagent/consumable/ethanol/singulo
name = "Singulo"
@@ -978,7 +933,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "singulo"
glass_name = "Singulo"
glass_desc = "A blue-space beverage."
- value = 4
/datum/reagent/consumable/ethanol/sbiten
name = "Sbiten"
@@ -990,7 +944,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "sbitenglass"
glass_name = "Sbiten"
glass_desc = "A spicy mix of Vodka and Spice. Very hot."
- value = 2
/datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(50 * TEMPERATURE_DAMAGE_COEFFICIENT, 0 ,BODYTEMP_HEAT_DAMAGE_LIMIT) //310.15 is the normal bodytemp.
@@ -1006,7 +959,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "red_meadglass"
glass_name = "Red Mead"
glass_desc = "A True Viking's Beverage, though its color is strange."
- value = 5
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/mead
name = "Mead"
@@ -1019,7 +972,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "meadglass"
glass_name = "Mead"
glass_desc = "A Viking's Beverage, though a cheap one."
- value = 1
/datum/reagent/consumable/ethanol/iced_beer
name = "Iced Beer"
@@ -1030,7 +982,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "iced_beerglass"
glass_name = "iced beer"
glass_desc = "A beer so frosty, the air around it freezes."
- value = 1
/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) //310.15 is the normal bodytemp.
@@ -1045,7 +996,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "grogglass"
glass_name = "Grog"
glass_desc = "A fine and cepa drink for Space."
- value = 2.1
/datum/reagent/consumable/ethanol/aloe
name = "Aloe"
@@ -1057,7 +1007,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "aloe"
glass_name = "Aloe"
glass_desc = "Very, very, very good."
- value = 1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/andalusia
name = "Andalusia"
@@ -1069,7 +1019,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "andalusia"
glass_name = "Andalusia"
glass_desc = "A nice, strangely named drink."
- value = 1
/datum/reagent/consumable/ethanol/alliescocktail
name = "Allies Cocktail"
@@ -1081,7 +1030,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "alliescocktail"
glass_name = "Allies cocktail"
glass_desc = "A drink made from your allies."
- value = 4
/datum/reagent/consumable/ethanol/acid_spit
name = "Acid Spit"
@@ -1093,7 +1041,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "acidspitglass"
glass_name = "Acid Spit"
glass_desc = "A drink from Nanotrasen. Made from live aliens."
- value = 3
/datum/reagent/consumable/ethanol/amasec
name = "Amasec"
@@ -1105,7 +1052,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "amasecglass"
glass_name = "Amasec"
glass_desc = "Always handy before COMBAT!!!"
- value = 2
/datum/reagent/consumable/ethanol/changelingsting
name = "Changeling Sting"
@@ -1117,7 +1063,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "changelingsting"
glass_name = "Changeling Sting"
glass_desc = "A stingy drink."
- value = 1.5
/datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/M)
if(M.mind) //Changeling Sting assists in the recharging of changeling chemicals.
@@ -1137,7 +1082,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "irishcarbomb"
glass_name = "Irish Car Bomb"
glass_desc = "An Irish car bomb."
- value = 5
/datum/reagent/consumable/ethanol/syndicatebomb
name = "Syndicate Bomb"
@@ -1149,7 +1093,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "syndicatebomb"
glass_name = "Syndicate Bomb"
glass_desc = "A syndicate bomb."
- value = 2
/datum/reagent/consumable/ethanol/syndicatebomb/on_mob_life(mob/living/carbon/M)
if(prob(5))
@@ -1177,7 +1120,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "erikasurprise"
glass_name = "Erika Surprise"
glass_desc = "The surprise is, it's green!"
- value = 4
/datum/reagent/consumable/ethanol/driestmartini
name = "Driest Martini"
@@ -1190,7 +1132,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "driestmartiniglass"
glass_name = "Driest Martini"
glass_desc = "Only for the experienced. You think you see sand floating in the glass."
- value = 5
/datum/reagent/consumable/ethanol/bananahonk
name = "Banana Honk"
@@ -1203,7 +1144,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "bananahonkglass"
glass_name = "Banana Honk"
glass_desc = "A drink from Clown Heaven."
- value = 8
/datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/M)
if((ishuman(M) && M.job == "Clown") || ismonkey(M))
@@ -1222,7 +1162,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "silencerglass"
glass_name = "Silencer"
glass_desc = "A drink from Mime Heaven."
- value = 2
/datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/M)
if(ishuman(M) && M.job == "Mime")
@@ -1240,7 +1179,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "drunkenblumpkin"
glass_name = "Drunken Blumpkin"
glass_desc = "A drink for the drunks."
- value = 3
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/whiskey_sour //Requested since we had whiskey cola and soda but not sour.
name = "Whiskey Sour"
@@ -1252,7 +1191,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "whiskey_sour"
glass_name = "whiskey sour"
glass_desc = "Lemon juice mixed with whiskey and a dash of sugar. Surprisingly satisfying."
- value = 2
/datum/reagent/consumable/ethanol/hcider
name = "Hard Cider"
@@ -1265,7 +1203,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "hard cider"
glass_desc = "Tastes like autumn... no wait, fall!"
shot_glass_icon_state = "shotglassbrown"
- value = 3
/datum/reagent/consumable/ethanol/fetching_fizz //A reference to one of my favorite games of all time. Pulls nearby ores to the imbiber!
name = "Fetching Fizz"
@@ -1278,7 +1215,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "fetching_fizz"
glass_name = "Fetching Fizz"
glass_desc = "Induces magnetism in the imbiber. Started as a barroom prank but evolved to become popular with miners and scrappers. Metallic aftertaste."
- value = 2
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/fetching_fizz/on_mob_life(mob/living/carbon/M)
for(var/obj/item/stack/ore/O in orange(3, M))
@@ -1297,7 +1234,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "hearty_punch"
glass_name = "Hearty Punch"
glass_desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead."
- value = 1
+ value = REAGENT_VALUE_RARE //considering the low recipe yield.
/datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/carbon/M)
if(M.health <= 0)
@@ -1318,8 +1255,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_brown2"
glass_name = "Bacchus' Blessing"
glass_desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?"
- value = 8
-
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/atomicbomb
name = "Atomic Bomb"
@@ -1331,7 +1267,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "atomicbombglass"
glass_name = "Atomic Bomb"
glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing."
- value = 3.56
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/M)
M.set_drugginess(50)
@@ -1360,7 +1296,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "gargleblasterglass"
glass_name = "Pan-Galactic Gargle Blaster"
glass_desc = "Like having your brain smashed out by a slice of lemon wrapped around a large gold brick."
- value = 5
/datum/reagent/consumable/ethanol/gargle_blaster/on_mob_life(mob/living/carbon/M)
M.dizziness +=1.5
@@ -1393,7 +1328,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
impure_chem = /datum/reagent/consumable/ethanol/neuroweak
inverse_chem_val = 0.5 //Clear conversion
inverse_chem = /datum/reagent/consumable/ethanol/neuroweak
- value = 4
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/neurotoxin/proc/pickt()
return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG))
@@ -1434,7 +1369,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
description = "A mostly safe alcoholic drink for the true daredevils. Counteracts Neurotoxins."
boozepwr = 60
pH = 8
- value = 3
/datum/reagent/consumable/ethanol/neuroweak/on_mob_life(mob/living/carbon/M)
if(holder.has_reagent(/datum/reagent/consumable/ethanol/neurotoxin))
@@ -1460,7 +1394,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "hippiesdelightglass"
glass_name = "Hippie's Delight"
glass_desc = "A drink enjoyed by people during the 1960's."
- value = 1.96
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/M)
M.slurring = max(M.slurring,50)
@@ -1504,8 +1438,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "nog3"
glass_name = "eggnog"
glass_desc = "The traditional way to get absolutely hammered at a Christmas party."
- value = 4
-
/datum/reagent/consumable/ethanol/narsour
name = "Nar'Sour"
@@ -1517,7 +1449,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "narsour"
glass_name = "Nar'Sour"
glass_desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!"
- value = 6.66
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/carbon/M)
M.cultslurring = min(M.cultslurring + 3, 3)
@@ -1534,7 +1466,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "cogchamp"
glass_name = "CogChamp"
glass_desc = "Not even Ratvar's Four Generals could withstand this! Qevax Jryy!"
- value = 8.13
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/cogchamp/on_mob_life(mob/living/carbon/M)
M.clockcultslurring = min(M.clockcultslurring + 3, 3)
@@ -1550,7 +1482,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_orange"
glass_name = "Triple Sec"
glass_desc = "A glass of straight Triple Sec."
- value = 1.5
/datum/reagent/consumable/ethanol/creme_de_menthe
name = "Creme de Menthe"
@@ -1561,7 +1492,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_green"
glass_name = "Creme de Menthe"
glass_desc = "You can almost feel the first breath of spring just looking at it."
- value = 2
/datum/reagent/consumable/ethanol/creme_de_cacao
name = "Creme de Cacao"
@@ -1572,7 +1502,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "glass_brown"
glass_name = "Creme de Cacao"
glass_desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient."
- value = 1
/datum/reagent/consumable/ethanol/creme_de_coconut
name = "Creme de Coconut"
@@ -1594,7 +1523,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "quadruple_sec"
glass_name = "Quadruple Sec"
glass_desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though."
- value = 3.04
/datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/M)
if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes.
@@ -1613,7 +1541,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "quintuple_sec"
glass_name = "Quintuple Sec"
glass_desc = "Now you are become law, destroyer of clowns."
- value = 4.01
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/M)
if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes but STRONG..
@@ -1657,7 +1585,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "grasshopper"
glass_name = "Grasshopper"
glass_desc = "You weren't aware edible beverages could be that green."
- value = 1
/datum/reagent/consumable/ethanol/stinger
name = "Stinger"
@@ -1669,7 +1596,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "stinger"
glass_name = "Stinger"
glass_desc = "You wonder what would happen if you pointed this at a heat source..."
- value = 1
/datum/reagent/consumable/ethanol/bastion_bourbon
name = "Bastion Bourbon"
@@ -1684,7 +1610,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "If you're feeling low, count on the buttery flavor of our own bastion bourbon."
shot_glass_icon_state = "shotglassgreen"
pH = 4
- value = 8
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/bastion_bourbon/on_mob_metabolize(mob/living/L)
var/heal_points = 10
@@ -1721,7 +1647,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Squirt Cider"
glass_desc = "Squirt cider will toughen you right up. Too bad about the musty aftertaste."
shot_glass_icon_state = "shotglassgreen"
- value = 1
/datum/reagent/consumable/ethanol/squirt_cider/on_mob_life(mob/living/carbon/M)
M.satiety += 5 //for context, vitamins give 30 satiety per tick
@@ -1738,7 +1663,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "fringe_weaver"
glass_name = "Fringe Weaver"
glass_desc = "It's a wonder it doesn't spill out of the glass."
- value = 1
/datum/reagent/consumable/ethanol/sugar_rush
name = "Sugar Rush"
@@ -1751,7 +1675,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "sugar_rush"
glass_name = "Sugar Rush"
glass_desc = "If you can't mix a Sugar Rush, you can't tend bar."
- value = 1
/datum/reagent/consumable/ethanol/sugar_rush/on_mob_life(mob/living/carbon/M)
M.satiety -= 10 //junky as hell! a whole glass will keep you from being able to eat junk food
@@ -1768,7 +1691,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "crevice_spike"
glass_name = "Crevice Spike"
glass_desc = "It'll either knock the drunkenness out of you or knock you out cold. Both, probably."
- value = 1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/crevice_spike/on_mob_metabolize(mob/living/L) //damage only applies when drink first enters system and won't again until drink metabolizes out
L.adjustBruteLoss(3 * min(5,volume)) //minimum 3 brute damage on ingestion to limit non-drink means of injury - a full 5 unit gulp of the drink trucks you for the full 15
@@ -1782,7 +1705,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "sakecup"
glass_name = "cup of sake"
glass_desc = "A traditional cup of sake."
- value = 0.1
/datum/reagent/consumable/ethanol/peppermint_patty
name = "Peppermint Patty"
@@ -1794,7 +1716,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "peppermint_patty"
glass_name = "Peppermint Patty"
glass_desc = "A boozy minty hot cocoa that warms your belly on a cold night."
- value = 2
/datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/M)
M.apply_status_effect(/datum/status_effect/throat_soothed)
@@ -1812,7 +1733,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Alexander"
glass_desc = "A creamy, indulgent delight that is stronger than it seems."
var/obj/item/shield/mighty_shield
- value = 1
/datum/reagent/consumable/ethanol/alexander/on_mob_metabolize(mob/living/L)
if(ishuman(L))
@@ -1844,7 +1764,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "sidecar"
glass_name = "Sidecar"
glass_desc = "The one ride you'll gladly give up the wheel for."
- value = 1
/datum/reagent/consumable/ethanol/between_the_sheets
name = "Between the Sheets"
@@ -1856,7 +1775,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "between_the_sheets"
glass_name = "Between the Sheets"
glass_desc = "The only drink that comes with a label reminding you of Nanotrasen's zero-tolerance promiscuity policy."
- value = 2
/datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/L)
..()
@@ -1881,7 +1799,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "kamikaze"
glass_name = "Kamikaze"
glass_desc = "Divinely windy."
- value = 1
/datum/reagent/consumable/ethanol/mojito
name = "Mojito"
@@ -1893,7 +1810,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "mojito"
glass_name = "Mojito"
glass_desc = "A drink that looks as refreshing as it tastes."
- value = 1
/datum/reagent/consumable/ethanol/moscow_mule
name = "Moscow Mule"
@@ -1914,7 +1830,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "utter bitterness"
glass_name = "glass of fernet"
glass_desc = "A glass of pure Fernet. Only an absolute madman would drink this alone."
- value = 0.1
/datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/M)
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
@@ -1933,7 +1848,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "godlyblend"
glass_name = "glass of fernet cola"
glass_desc = "A sawed-off cola bottle filled with Fernet Cola. Nothing better after eating like a lardass."
- value = 1
/datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/M)
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
@@ -1943,7 +1857,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/fanciulli
-
name = "Fanciulli"
description = "What if the Manhattan coctail ACTUALLY used a bitter herb liquour? Helps you sobers up." //also causes a bit of stamina damage to symbolize the afterdrink lazyness
color = "#CA933F" // rgb: 202, 147, 63
@@ -1953,7 +1866,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "fanciulli"
glass_name = "glass of fanciulli"
glass_desc = "A glass of Fanciulli. It's just Manhattan with Fernet."
- value = 1
/datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/M)
M.nutrition = max(M.nutrition - 5, 0)
@@ -1966,7 +1878,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
. = TRUE
..()
-
/datum/reagent/consumable/ethanol/branca_menta
name = "Branca Menta"
description = "A refreshing mixture of bitter Fernet with mint creme liquour."
@@ -1977,7 +1888,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state= "minted_fernet"
glass_name = "glass of branca menta"
glass_desc = "A glass of Branca Menta, perfect for those lazy and hot sunday summer afternoons." //Get lazy literally by drinking this
- value = 1
/datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C)
@@ -2000,7 +1910,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "blank_paper"
glass_name = "glass of blank paper"
glass_desc = "A fizzy cocktail for those looking to start fresh."
- value = 1
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/M)
if(ishuman(M) && M.job == "Mime")
@@ -2017,7 +1927,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "champagne_glass"
glass_name = "Champagne"
glass_desc = "The flute clearly displays the slowly rising bubbles."
- value = 1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/wizz_fizz
name = "Wizz Fizz"
@@ -2029,7 +1939,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "wizz_fizz"
glass_name = "Wizz Fizz"
glass_desc = "The glass bubbles and froths with an almost magical intensity."
- value = 1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/M)
//A healing drink similar to Quadruple Sec, Ling Stings, and Screwdrivers for the Wizznerds; the check is consistent with the changeling sting
@@ -2049,7 +1959,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "bug_spray"
glass_name = "Bug Spray"
glass_desc = "Your eyes begin to water as the sting of alcohol reaches them."
- value = 1
/datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/M)
//Bugs should not drink Bug spray.
@@ -2071,7 +1980,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "applejack_glass"
glass_name = "Applejack"
glass_desc = "You feel like you could drink this all neight."
- value = 0.1
/datum/reagent/consumable/ethanol/jack_rose
name = "Jack Rose"
@@ -2083,7 +1991,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "jack_rose"
glass_name = "Jack Rose"
glass_desc = "Enough of these, and you really will start to suppose your toeses are roses."
- value = 1
/datum/reagent/consumable/ethanol/turbo
name = "Turbo"
@@ -2095,7 +2002,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "turbo"
glass_name = "Turbo"
glass_desc = "A turbulent cocktail for outlaw hoverbikers."
- value = 0.3
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/M)
if(prob(4))
@@ -2113,7 +2020,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "old_timer"
glass_name = "Old Timer"
glass_desc = "WARNING! May cause premature aging!"
- value = 2
+ value = REAGENT_VALUE_UNCOMMON //Parsnip juice? Really? lol
/datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/M)
if(prob(20))
@@ -2146,7 +2053,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "rubberneck"
glass_name = "Rubberneck"
glass_desc = "A popular drink amongst those adhering to an all synthetic diet."
- value = 1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/duplex
name = "Duplex"
@@ -2158,7 +2065,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "duplex"
glass_name = "Duplex"
glass_desc = "To imbibe one component separately from the other is consider a great faux pas."
- value = 1
/datum/reagent/consumable/ethanol/trappist
name = "Trappist Beer"
@@ -2170,7 +2076,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "trappistglass"
glass_name = "Trappist Beer"
glass_desc = "boozy Catholicism in a glass."
- value = 1
/datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/M)
if(M.mind.isholy)
@@ -2188,8 +2093,8 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "blazaamglass"
glass_name = "Blazaam"
glass_desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover."
+ value = REAGENT_VALUE_UNCOMMON
var/stored_teleports = 0
- value = 4
/datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/M)
if(M.drunkenness > 40)
@@ -2211,7 +2116,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "planet_cracker"
glass_name = "Planet Cracker"
glass_desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy."
- value = 1
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/consumable/ethanol/mauna_loa
name = "Mauna Loa"
@@ -2223,6 +2128,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "mauna_loa"
glass_name = "Mauna Loa"
glass_desc = "Lavaland in a drink... mug... volcano... thing."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/mauna_loa/on_mob_life(mob/living/carbon/M)
// Heats the user up while the reagent is in the body. Occasionally makes you burst into flames.
@@ -2236,13 +2142,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
name = "Commander and Chief"
description = "A cocktail for the captain on the go."
color = "#ffffc9"
+ can_synth = FALSE
boozepwr = 50
quality = DRINK_FANTASTIC
taste_description = "duty and responsibility"
glass_icon_state = "commander_and_chief"
glass_name = "Commander and Chief"
glass_desc = "The gems of this majestic chalice represent the departments and their Heads."
- value = 10
+ value = REAGENT_VALUE_AMAZING
/datum/reagent/consumable/ethanol/commander_and_chief/on_mob_life(mob/living/carbon/M)
if(M.mind && HAS_TRAIT(M.mind, TRAIT_CAPTAIN_METABOLISM))
@@ -2281,6 +2188,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "hellfire"
glass_name = "Hellfire"
glass_desc = "An amber colored drink that isn't quite as hot as it looks."
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/hellfire/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(30 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 30)
@@ -2296,6 +2204,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "sins_delight"
glass_name = "Sin's Delight"
glass_desc = "You can smell the seven sins rolling off the top of the glass."
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/ethanol/strawberry_daiquiri
name = "Strawberry Daiquiri"
@@ -2328,6 +2237,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "miami_vice"
glass_name = "Miami Vice"
glass_desc = "Strawberries and coconut, like yin and yang."
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/ethanol/malibu_sunset
name = "Malibu Sunset"
@@ -2350,6 +2260,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "hotlime_miami"
glass_name = "Hotlime Miami"
glass_desc = "This looks very aesthetically pleasing."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ethanol/hotlime_miami/on_mob_life(mob/living/carbon/M)
M.set_drugginess(50)
@@ -2580,7 +2491,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit.
var/list/tastes = list("bad coding" = 1) //List of tastes. See above.
pH = 4
- value = 4
/datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data)
names = data["names"]
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 85f474920b..62aea28009 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -165,6 +165,7 @@
metabolization_rate = INFINITY
color = "#FF4DD2"
taste_description = "laughter"
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/laughter/on_mob_life(mob/living/carbon/M)
M.emote("laugh")
@@ -177,6 +178,7 @@
metabolization_rate = 1.5 * REAGENTS_METABOLISM
color = "#FF4DD2"
taste_description = "laughter"
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/superlaughter/on_mob_life(mob/living/carbon/M)
if(prob(30))
@@ -210,6 +212,7 @@
glass_name = "glass of milk"
glass_desc = "White and nutritious goodness!"
pH = 6.5
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M)
if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER))
@@ -231,6 +234,7 @@
glass_icon_state = "glass_white"
glass_name = "glass of soy milk"
glass_desc = "White and nutritious soy goodness!"
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/soymilk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(20))
@@ -324,6 +328,7 @@
glass_icon_state = "lemonpitcher"
glass_name = "pitcher of lemonade"
glass_desc = "This drink leaves you feeling nostalgic for some reason."
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/tea/arnold_palmer
name = "Arnold Palmer"
@@ -334,6 +339,7 @@
glass_icon_state = "arnold_palmer"
glass_name = "Arnold Palmer"
glass_desc = "You feel like taking a few golf swings after a few swigs of this."
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/tea/arnold_palmer/on_mob_life(mob/living/carbon/M)
if(prob(5))
@@ -404,6 +410,7 @@
glass_icon_state = "nuka_colaglass"
glass_name = "glass of Nuka Cola"
glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M)
M.Jitter(20)
@@ -559,6 +566,7 @@
glass_icon_state = "grey_bull_glass"
glass_name = "glass of Grey Bull"
glass_desc = "Surprisingly it isnt grey."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/L)
..()
@@ -633,6 +641,7 @@
glass_icon_state = "soy_latte"
glass_name = "soy latte"
glass_desc = "A nice and refreshing beverage while you're reading."
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -654,6 +663,7 @@
glass_icon_state = "cafe_latte"
glass_name = "cafe latte"
glass_desc = "A nice, strong and refreshing beverage while you're reading."
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -675,6 +685,7 @@
glass_icon_state = "doctorsdelightglass"
glass_name = "Doctor's Delight"
glass_desc = "The space doctor's favorite. Guaranteed to restore bodily injury; side effects include cravings and hunger."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/doctor_delight/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-0.5, 0)
@@ -697,6 +708,7 @@
glass_icon_state = "chocolatepudding"
glass_name = "chocolate pudding"
glass_desc = "Tasty."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/vanillapudding
name = "Vanilla Pudding"
@@ -708,6 +720,7 @@
glass_icon_state = "vanillapudding"
glass_name = "vanilla pudding"
glass_desc = "Tasty."
+ value = REAGENT_VALUE_UNCOMMON //real vanilla.
/datum/reagent/consumable/cherryshake
name = "Cherry Shake"
@@ -719,6 +732,7 @@
glass_icon_state = "cherryshake"
glass_name = "cherry shake"
glass_desc = "A cherry flavored milkshake."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/bluecherryshake
name = "Blue Cherry Shake"
@@ -730,6 +744,7 @@
glass_icon_state = "bluecherryshake"
glass_name = "blue cherry shake"
glass_desc = "An exotic blue milkshake."
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/consumable/pumpkin_latte
name = "Pumpkin Latte"
@@ -741,6 +756,7 @@
glass_icon_state = "pumpkin_latte"
glass_name = "pumpkin latte"
glass_desc = "A mix of coffee and pumpkin juice."
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/gibbfloats
name = "Gibb Floats"
@@ -752,6 +768,7 @@
glass_icon_state = "gibbfloats"
glass_name = "Gibbfloat"
glass_desc = "Dr. Gibb with ice cream on top."
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/pumpkinjuice
name = "Pumpkin Juice"
@@ -764,6 +781,7 @@
description = "Juiced from real blumpkin."
color = "#00BFFF"
taste_description = "a mouthful of pool water"
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/triple_citrus
name = "Triple Citrus"
@@ -793,6 +811,7 @@
color = "#7D4E29"
quality = DRINK_NICE
taste_description = "chocolate milk"
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/menthol
name = "Menthol"
@@ -821,6 +840,7 @@
color = "#FFA500"
taste_description = "parsnip"
glass_name = "glass of parsnip juice"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink
name = "Peach Juice"
@@ -846,6 +866,7 @@
glass_icon_state = "cream_soda"
glass_name = "Cream Soda"
glass_desc = "A classic space-American vanilla flavored soft drink."
+ value = REAGENT_VALUE_VERY_COMMON //just a little vanilla
/datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
@@ -874,6 +895,7 @@
glass_icon_state = "red_queen"
glass_name = "Red Queen"
glass_desc = "DRINK ME."
+ value = REAGENT_VALUE_COMMON //growth serum.
var/current_size = RESIZE_DEFAULT_SIZE
/datum/reagent/consumable/red_queen/on_mob_life(mob/living/carbon/H)
@@ -899,10 +921,11 @@
description = "A drink of a bygone era of milk and artificial sweetener back on a rock."
color = "#f76aeb"//rgb(247, 106, 235)
glass_icon_state = "pinkmilk"
- quality = DRINK_FANTASTIC
+ quality = DRINK_VERYGOOD
taste_description = "sweet strawberry and milk cream"
glass_name = "tall glass of strawberry milk"
glass_desc = "Delicious flavored strawberry syrup mixed with milk."
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/consumable/tea/pinkmilk/on_mob_life(mob/living/carbon/M)
if(prob(15))
@@ -915,7 +938,7 @@
description = "A timeless classic!"
color = "#f76aeb"//rgb(247, 106, 235)
glass_icon_state = "pinktea"
- quality = DRINK_FANTASTIC
+ quality = DRINK_VERYGOOD
taste_description = "sweet tea with a hint of strawberry"
glass_name = "mug of strawberry tea"
glass_desc = "Delicious traditional tea flavored with strawberries."
@@ -958,6 +981,7 @@
glass_icon_state = "monkey_energy_glass"
glass_name = "glass of Monkey Energy"
glass_desc = "You can unleash the ape, but without the pop of the can?"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/monkey_energy/on_mob_life(mob/living/carbon/M)
M.Jitter(20)
@@ -975,3 +999,4 @@
glass_icon_state = "glass_yellow"
glass_name = "glass of bungo juice"
glass_desc = "Exotic! You feel like you are on vacation already."
+ value = REAGENT_VALUE_COMMON
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 086515d9dd..ef4b7f3a53 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -1,6 +1,5 @@
/datum/reagent/drug
name = "Drug"
- value = 12
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "bitterness"
var/trippy = TRUE //Does this drug make you trip?
@@ -11,7 +10,7 @@
/datum/reagent/drug/space_drugs
name = "Space drugs"
- value = 6
+ value = REAGENT_VALUE_VERY_COMMON
description = "An illegal chemical compound used as drug."
color = "#60A584" // rgb: 96, 165, 132
overdose_threshold = 30
@@ -38,7 +37,6 @@
/datum/reagent/drug/nicotine
name = "Nicotine"
- value = 0
description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
@@ -66,6 +64,7 @@
overdose_threshold = 20
addiction_threshold = 10
pH = 10
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/drug/crank/on_mob_life(mob/living/carbon/M)
if(prob(5))
@@ -112,6 +111,7 @@
overdose_threshold = 20
addiction_threshold = 15
pH = 9
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/drug/krokodil/on_mob_life(mob/living/carbon/M)
@@ -167,6 +167,7 @@
var/jitter = TRUE
var/confusion = TRUE
pH = 5
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/L)
..()
@@ -250,6 +251,7 @@
overdose_threshold = 35
jitter = FALSE
brain_damage = FALSE
+ value = REAGENT_VALUE_RARE
/datum/reagent/drug/bath_salts
name = "Bath Salts"
@@ -261,6 +263,7 @@
taste_description = "salt" // because they're bathsalts?
var/datum/brain_trauma/special/psychotic_brawling/bath_salts/rage
pH = 8.2
+ value = REAGENT_VALUE_RARE
/datum/reagent/drug/bath_salts/on_mob_metabolize(mob/living/L)
..()
@@ -357,6 +360,7 @@
reagent_state = LIQUID
color = "#78FFF0"
pH = 9.2
+ value = REAGENT_VALUE_RARE
/datum/reagent/drug/aranesp/on_mob_life(mob/living/carbon/M)
var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.")
@@ -378,6 +382,7 @@
addiction_threshold = 10
overdose_threshold = 20
pH = 10.5
+ value = REAGENT_VALUE_RARE
/datum/reagent/drug/happiness/on_mob_add(mob/living/L)
..()
@@ -457,10 +462,11 @@
addiction_stage3_end = 40
addiction_stage4_end = 240
pH = 12.5
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/drug/skooma/on_mob_metabolize(mob/living/L)
. = ..()
- L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/skooma)
L.next_move_modifier *= 2
if(ishuman(L))
var/mob/living/carbon/human/H = L
@@ -473,7 +479,7 @@
/datum/reagent/drug/skooma/on_mob_end_metabolize(mob/living/L)
. = ..()
- L.remove_movespeed_modifier(type)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/skooma)
L.next_move_modifier *= 0.5
if(ishuman(L))
var/mob/living/carbon/human/H = L
@@ -521,3 +527,35 @@
if(prob(40))
M.emote(pick("twitch","drool","moan"))
..()
+
+/datum/reagent/syndicateadrenals
+ name = "Syndicate Adrenaline"
+ description = "Regenerates your stamina and increases your reaction time."
+ color = "#E62111"
+ overdose_threshold = 6
+ value = REAGENT_VALUE_VERY_RARE
+
+/datum/reagent/syndicateadrenals/on_mob_life(mob/living/M)
+ M.adjustStaminaLoss(-5*REM)
+ . = ..()
+
+/datum/reagent/syndicateadrenals/on_mob_metabolize(mob/living/M)
+ . = ..()
+ if(istype(M))
+ M.next_move_modifier *= 0.5
+ to_chat(M, "You feel an intense surge of energy rushing through your veins.")
+
+/datum/reagent/syndicateadrenals/on_mob_end_metabolize(mob/living/M)
+ . = ..()
+ if(istype(M))
+ M.next_move_modifier *= 2
+ to_chat(M, "You feel as though the world around you is going faster.")
+
+/datum/reagent/syndicateadrenals/overdose_start(mob/living/M)
+ to_chat(M, "You feel an intense pain in your chest...")
+
+/datum/reagent/syndicateadrenals/overdose_process(mob/living/M)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(!C.undergoing_cardiac_arrest())
+ C.set_heartattack(TRUE)
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 24c518b70b..c7ff3f01c9 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -11,7 +11,7 @@
name = "Consumable"
taste_description = "generic food"
taste_mult = 4
- value = 0.1
+ value = REAGENT_VALUE_VERY_COMMON
var/nutriment_factor = 1 * REAGENTS_METABOLISM
var/quality = 0 //affects mood, typically higher for mixed drinks with more complex recipes
@@ -90,7 +90,7 @@
/datum/reagent/consumable/nutriment/vitamin
name = "Vitamin"
description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form."
- value = 0.5
+ value = REAGENT_VALUE_COMMON
nutriment_factor = 15 * REAGENTS_METABOLISM //The are the best food for you!
brute_heal = 1
burn_heal = 1
@@ -105,7 +105,7 @@
description = "A variety of cooking oil derived from fat or plants. Used in food preparation and frying."
color = "#EADD6B" //RGB: 234, 221, 107 (based off of canola oil)
taste_mult = 0.8
- value = 1
+ value = REAGENT_VALUE_COMMON
taste_description = "oil"
nutriment_factor = 5 * REAGENTS_METABOLISM //Not very healthy on its own
metabolization_rate = 10 * REAGENTS_METABOLISM
@@ -155,7 +155,7 @@
metabolization_rate = 2 * REAGENTS_METABOLISM
overdose_threshold = 200 // Hyperglycaemic shock
taste_description = "sweetness"
- value = 1
+ value = REAGENT_VALUE_NONE
/datum/reagent/consumable/sugar/overdose_start(mob/living/M)
to_chat(M, "You go into hyperglycaemic shock! Lay off the twinkies!")
@@ -179,6 +179,7 @@
description = "A salty sauce made from the soy plant."
color = "#792300" // rgb: 121, 35, 0
taste_description = "umami"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/ketchup
name = "Ketchup"
@@ -230,7 +231,7 @@
description = "A special oil that noticably chills the body. Extracted from Icepeppers and slimes."
color = "#8BA6E9" // rgb: 139, 166, 233
taste_description = "mint"
- value = 2
+ value = REAGENT_VALUE_COMMON
pH = 13 //HMM! I wonder
/datum/reagent/consumable/frostoil/on_mob_life(mob/living/carbon/M)
@@ -399,6 +400,7 @@
metabolization_rate = 0.2 * REAGENTS_METABOLISM
taste_description = "mushroom"
pH = 11
+ value = REAGENT_VALUE_COMMON
/datum/reagent/drug/mushroomhallucinogen/on_mob_life(mob/living/carbon/M)
M.slurring = max(M.slurring,50)
@@ -429,6 +431,7 @@
color = "#FEFEFE"
taste_description = "garlic"
metabolization_rate = 0.15 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/garlic/on_mob_life(mob/living/carbon/M)
if(isvampire(M)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit.
@@ -459,7 +462,7 @@
M.emote("scream")
if(prob(min(5, current_cycle)) && iscarbon(M))
var/mob/living/carbon/C
- C.vomit()
+ C.vomit()
if(INJECT)
if(prob(min(20, current_cycle)))
to_chat(M, "You feel like your veins are boiling!")
@@ -468,10 +471,10 @@
..()
/datum/reagent/consumable/sprinkles
name = "Sprinkles"
- value = 3
description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops."
color = "#FF00FF" // rgb: 255, 0, 255
taste_description = "childhood whimsy"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/M)
if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM))
@@ -483,7 +486,7 @@
name = "Peanut Butter"
description = "A popular food paste made from ground dry-roasted peanuts."
color = "#C29261"
- value = 3
+ value = REAGENT_VALUE_UNCOMMON
nutriment_factor = 10 * REAGENTS_METABOLISM
taste_description = "peanuts"
@@ -491,7 +494,7 @@
name = "Corn Oil"
description = "An oil derived from various types of corn."
nutriment_factor = 12 * REAGENTS_METABOLISM
- value = 4
+ value = REAGENT_VALUE_UNCOMMON
color = "#302000" // rgb: 48, 32, 0
taste_description = "slime"
@@ -509,7 +512,7 @@
/datum/reagent/consumable/enzyme
name = "Universal Enzyme"
- value = 1
+ value = REAGENT_VALUE_COMMON
description = "A universal enzyme used in the preperation of certain chemicals and foods."
color = "#365E30" // rgb: 54, 94, 48
taste_description = "sweetness"
@@ -545,7 +548,6 @@
/datum/reagent/consumable/flour
name = "Flour"
- value = 0.5
description = "This is what you rub all over yourself to pretend to be a ghost."
reagent_state = SOLID
color = "#FFFFFF" // rgb: 0, 0, 0
@@ -562,19 +564,18 @@
name = "Cherry Jelly"
description = "Totally the best. Only to be spread on foods with excellent lateral symmetry."
color = "#801E28" // rgb: 128, 30, 40
- value = 1
+ value = REAGENT_VALUE_COMMON
taste_description = "cherry"
/datum/reagent/consumable/bluecherryjelly
name = "Blue Cherry Jelly"
description = "Blue and tastier kind of cherry jelly."
color = "#00F0FF"
- value = 12
+ value = REAGENT_VALUE_UNCOMMON
taste_description = "blue cherry"
/datum/reagent/consumable/rice
name = "Rice"
- value = 0.5
description = "tiny nutritious grains"
reagent_state = SOLID
nutriment_factor = 3 * REAGENTS_METABOLISM
@@ -583,7 +584,7 @@
/datum/reagent/consumable/vanilla
name = "Vanilla Powder"
- value = 1
+ value = REAGENT_VALUE_UNCOMMON
description = "A fatty, bitter paste made from vanilla pods."
reagent_state = SOLID
nutriment_factor = 5 * REAGENTS_METABOLISM
@@ -592,7 +593,6 @@
/datum/reagent/consumable/eggyolk
name = "Egg Yolk"
- value = 1
description = "It's full of protein."
nutriment_factor = 3 * REAGENTS_METABOLISM
color = "#FFB500"
@@ -600,14 +600,13 @@
/datum/reagent/consumable/corn_starch
name = "Corn Starch"
- value = 2
description = "A slippery solution."
color = "#f7f6e4"
taste_description = "slime"
/datum/reagent/consumable/corn_syrup
name = "Corn Syrup"
- value = 1
+ value = REAGENT_VALUE_UNCOMMON
description = "Decays into sugar."
color = "#fff882"
metabolization_rate = 3 * REAGENTS_METABOLISM
@@ -621,7 +620,7 @@
name = "honey"
description = "Sweet sweet honey that decays into sugar. Has antibacterial and natural healing properties."
color = "#d3a308"
- value = 15
+ value = REAGENT_VALUE_COMMON
nutriment_factor = 10 * REAGENTS_METABOLISM
metabolization_rate = 1 * REAGENTS_METABOLISM
taste_description = "sweetness"
@@ -649,6 +648,7 @@
color = "#DFDFDF"
value = 5
taste_description = "mayonnaise"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/tearjuice
name = "Tear Juice"
@@ -656,6 +656,7 @@
color = "#c0c9a0"
taste_description = "bitterness"
pH = 5
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/tearjuice/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(!istype(M))
@@ -694,6 +695,7 @@
reagent_state = SOLID
nutriment_factor = 12 * REAGENTS_METABOLISM
color = "#664330" // rgb: 102, 67, 48
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/nutriment/stabilized/on_mob_life(mob/living/carbon/M)
if(M.nutrition > NUTRITION_LEVEL_FULL - 25)
@@ -709,6 +711,7 @@
color = "#1d043d"
taste_description = "bitter mushroom"
pH = 12
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/entpoly/on_mob_life(mob/living/carbon/M)
if(current_cycle >= 10)
@@ -729,6 +732,7 @@
color = "#b5a213"
taste_description = "tingling mushroom"
pH = 11.2
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/tinlux/reaction_mob(mob/living/M)
M.set_light(2)
@@ -743,6 +747,7 @@
nutriment_factor = 3 * REAGENTS_METABOLISM
taste_description = "fruity mushroom"
pH = 10.4
+ value = REAGENT_VALUE_RARE
/datum/reagent/consumable/vitfro/on_mob_life(mob/living/carbon/M)
if(prob(80))
@@ -808,6 +813,7 @@
taste_mult = 2
taste_description = "caramel"
reagent_state = SOLID
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/secretsauce
name = "secret sauce"
@@ -818,6 +824,7 @@
taste_mult = 100
can_synth = FALSE
pH = 6.1
+ value = REAGENT_VALUE_AMAZING
/datum/reagent/consumable/secretsauce/reaction_obj(obj/O, reac_volume)
//splashing any amount above or equal to 1u of secret sauce onto a piece of food turns its quality to 100
@@ -838,6 +845,7 @@
taste_mult = 6
taste_description = "smoke"
overdose_threshold = 25
+ value = REAGENT_VALUE_COMMON
/datum/reagent/consumable/char/overdose_process(mob/living/carbon/M)
if(prob(10))
@@ -850,3 +858,4 @@
color = "#78280A" // rgb: 120 40, 10
taste_mult = 2.5 //sugar's 1.5, capsacin's 1.5, so a good middle ground.
taste_description = "smokey sweetness"
+ value = REAGENT_VALUE_COMMON
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index ecceb6e8bf..d9eb1f77a7 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -7,8 +7,8 @@
/datum/reagent/medicine
name = "Medicine"
- value = 2
taste_description = "bitterness"
+ value = REAGENT_VALUE_VERY_COMMON //Low prices, spess medical companies are cheapstakes and products are taxed honk...
/datum/reagent/medicine/on_mob_life(mob/living/carbon/M)
current_cycle++
@@ -19,6 +19,7 @@
description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels."
pH = 8.4
color = "#82b8aa"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M)
if(M.bodytemperature > BODYTEMP_NORMAL)
@@ -33,6 +34,7 @@
color = "#ffffff"
can_synth = FALSE
taste_description = "badmins"
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/M)
M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1)
@@ -101,6 +103,7 @@
description = "Reduces drowsiness, hallucinations, and Histamine from body."
color = "#EC536D" // rgb: 236, 83, 109
pH = 5.2
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(M.drowsyness-5, 0)
@@ -131,6 +134,7 @@
color = "#0000C8"
taste_description = "sludge"
pH = 11
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M)
var/power = -0.00003 * (M.bodytemperature ** 2) + 3
@@ -152,6 +156,7 @@
taste_description = "muscle"
metabolization_rate = 1.5 * REAGENTS_METABOLISM
pH = 13
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/clonexadone/on_mob_life(mob/living/carbon/M)
if(M.bodytemperature < T0C)
@@ -167,6 +172,7 @@
color = "#f7832a"
taste_description = "spicy jelly"
pH = 12
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/M)
if(M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT)
@@ -198,7 +204,7 @@
overdose_threshold = 30
taste_description = "fish"
pH = 12.2
- value = 20
+ value = REAGENT_VALUE_RARE
/datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M)
M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that.
@@ -239,7 +245,6 @@
color = "#ffeac9"
metabolization_rate = 5 * REAGENTS_METABOLISM
overdose_threshold = 50
- value = 3
/datum/reagent/medicine/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
if(iscarbon(M) && M.stat != DEAD)
@@ -277,7 +282,7 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
overdose_threshold = 25
pH = 10.7
- value = 4
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M)
if(M.getFireLoss() > 25)
@@ -301,7 +306,6 @@
pH = 6.7
metabolization_rate = 5 * REAGENTS_METABOLISM
overdose_threshold = 50
- value = 3
/datum/reagent/medicine/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
if(iscarbon(M) && M.stat != DEAD)
@@ -343,7 +347,6 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
var/last_added = 0
var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active
pH = 5.5
- value = 1
/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M)
if((HAS_TRAIT(M, TRAIT_NOMARROW)))
@@ -384,6 +387,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = "#6D6374"
metabolization_rate = 0.4 * REAGENTS_METABOLISM
pH = 2.6
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C)
C.hal_screwyhud = SCREWYHUD_HEALTHY
@@ -424,7 +428,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
pH = 11.5
metabolization_rate = 5 * REAGENTS_METABOLISM
overdose_threshold = 40
- value = 6
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
if(iscarbon(M))
@@ -461,7 +465,6 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "ash"
pH = 5
- value = 1
/datum/reagent/medicine/charcoal/on_mob_life(mob/living/carbon/M)
M.adjustToxLoss(-2*REM, 0)
@@ -480,7 +483,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.25 * REAGENTS_METABOLISM
overdose_threshold = 30
pH = 2
- value = 5
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M)
M.adjustToxLoss(-0.5*REM, 0)
@@ -537,6 +540,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = "#003153" // RGB 0, 49, 83
metabolization_rate = 0.5 * REAGENTS_METABOLISM
pH = 8.9
+ value = REAGENT_VALUE_COMMON //uncraftable
/datum/reagent/medicine/prussian_blue/on_mob_life(mob/living/carbon/M)
if(M.radiation > 0)
@@ -550,6 +554,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = "#E6FFF0"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
pH = 1 //One of the best buffers, NEVERMIND!
+ value = REAGENT_VALUE_UNCOMMON
var/healtoxinlover = FALSE
/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/M)
@@ -568,6 +573,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = "#91D865"
healtoxinlover = TRUE
pH = 12//invert
+ value = REAGENT_VALUE_RARE
/datum/reagent/medicine/sal_acid
name = "Salicyclic Acid"
@@ -577,6 +583,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.5 * REAGENTS_METABOLISM
overdose_threshold = 25
pH = 2.1
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M)
@@ -688,6 +695,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = "#64FFE6"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
pH = 11.5
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/carbon/M)
if(prob(10))
@@ -708,10 +716,10 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/L)
..()
- L.ignore_slowdown(type)
+ L.add_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod))
/datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/L)
- L.unignore_slowdown(type)
+ L.remove_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod))
..()
/datum/reagent/medicine/morphine/on_mob_life(mob/living/carbon/M)
@@ -803,6 +811,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.25 * REAGENTS_METABOLISM
overdose_threshold = 35
pH = 12
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M)
if(M.health < 0)
@@ -867,6 +876,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "magnets"
pH = 0
+ value = REAGENT_VALUE_RARE
/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(M.stat == DEAD)
@@ -990,14 +1000,15 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.5 * REAGENTS_METABOLISM
overdose_threshold = 60
pH = 8.7
+ value = REAGENT_VALUE_RARE
/datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L)
..()
- L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-0.5, blacklisted_movetypes=(FLYING|FLOATING))
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants)
ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
/datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L)
- L.remove_movespeed_modifier(type)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants)
REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
..()
@@ -1154,6 +1165,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
reagent_state = LIQUID
color = "#91D865"
taste_description = "jelly"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-1.5*REM, FALSE)
@@ -1169,6 +1181,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
reagent_state = SOLID
color = "#555555"
pH = 11
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-5*REM, FALSE) //A ton of healing - this is a 50 telecrystal investment.
@@ -1189,6 +1202,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
reagent_state = SOLID
color = "#555555"
pH = 11
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/medicine/lesser_syndicate_nanites/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-3*REM, FALSE) // hidden gold shh
@@ -1212,6 +1226,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
overdose_threshold = 30
taste_description = "jelly"
pH = 11.8
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/medicine/neo_jelly/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-1.5*REM, FALSE)
@@ -1234,6 +1249,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = rgb(255, 175, 0)
overdose_threshold = 25
pH = 11
+ value = REAGENT_VALUE_COMMON //not any higher. Ambrosia is a milestone for hydroponics already.
/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-3 * REM, FALSE)
@@ -1261,6 +1277,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
color = "#27870a"
metabolization_rate = 0.4 * REAGENTS_METABOLISM
pH = 4.3
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/M)
for(var/datum/reagent/drug/R in M.reagents.reagent_list)
@@ -1283,6 +1300,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent
can_synth = FALSE
pH = 14
+ value = REAGENT_VALUE_AMAZING
/datum/reagent/medicine/lavaland_extract/on_mob_life(mob/living/carbon/M)
M.heal_bodypart_damage(5,5)
@@ -1302,6 +1320,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed."
color = "#918e53"
overdose_threshold = 30
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L)
..()
@@ -1329,13 +1348,14 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
description = "Drastically increases movement speed, but deals toxin damage."
color = "#669153"
metabolization_rate = 1
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L)
..()
- L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING))
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste)
/datum/reagent/medicine/changelinghaste/on_mob_end_metabolize(mob/living/L)
- L.remove_movespeed_modifier(type)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste)
..()
/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/M)
@@ -1365,14 +1385,15 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/muscle_stimulant
name = "Muscle Stimulant"
description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain."
+ value = REAGENT_VALUE_RARE
/datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/M)
. = ..()
- M.ignore_slowdown(type)
+ M.add_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod))
/datum/reagent/medicine/muscle_stimulant/on_mob_end_metabolize(mob/living/M)
. = ..()
- M.unignore_slowdown(type)
+ M.remove_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod))
/datum/reagent/medicine/modafinil
name = "Modafinil"
@@ -1382,6 +1403,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.1 * REAGENTS_METABOLISM
overdose_threshold = 20 // with the random effects this might be awesome or might kill you at less than 10u (extensively tested)
taste_description = "salt" // it actually does taste salty
+ value = REAGENT_VALUE_RARE
var/overdose_progress = 0 // to track overdose progress
pH = 7.89
@@ -1448,6 +1470,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.25 * REAGENTS_METABOLISM
overdose_threshold = 30
pH = 9.12
+ value = REAGENT_VALUE_COMMON
/datum/reagent/medicine/psicodine/on_mob_add(mob/living/L)
..()
@@ -1480,6 +1503,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
reagent_state = SOLID
color = "#FFFFD0"
metabolization_rate = 1.5 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/M)
M.adjustOrganLoss(ORGAN_SLOT_LIVER, -2)//Add a chance to cure liver trauma once implemented.
@@ -1494,6 +1518,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
metabolization_rate = 0.25 * REAGENTS_METABOLISM
overdose_threshold = 50
taste_description = "numbing bitterness"
+ value = REAGENT_VALUE_RARE
/datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all.
M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 484bea7206..6dc27dcd9e 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1,7 +1,7 @@
/datum/reagent/blood
data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null,"quirks"=null)
name = "Blood"
- value = 1
+ value = REAGENT_VALUE_UNCOMMON // $$$ blood ""donations"" $$$
color = BLOOD_COLOR_HUMAN // rgb: 200, 0, 0
description = "Blood from some creature."
metabolization_rate = 5 //fast rate so it disappears fast.
@@ -140,8 +140,9 @@
data = list("donor"=null,"viruses"=null,"blood_DNA"="REPLICATED", "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
name = "Synthetic Blood"
description = "A synthetically produced imitation of blood."
- taste_description = "oily"
+ taste_description = "oil"
color = BLOOD_COLOR_SYNTHETIC // rgb: 11, 7, 48
+ value = REAGENT_VALUE_NONE
/datum/reagent/blood/jellyblood
data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SLIME, "blood_type"="GEL","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
@@ -158,6 +159,7 @@
description = "This highly resembles blood, but it doesnt actually function like it, resembling more ketchup, with a more blood-like consistency."
taste_description = "sap" //Like tree sap?
pH = 7.45
+ value = REAGENT_VALUE_NONE
/datum/reagent/blood/jellyblood/on_mob_life(mob/living/carbon/M)
if(prob(10))
@@ -387,6 +389,7 @@
description = "Something that shouldn't exist on this plane of existence."
taste_description = "suffering"
pH = 6.5
+ value = REAGENT_VALUE_RARE
/datum/reagent/fuel/unholywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -423,6 +426,7 @@
name = "Hell Water"
description = "YOUR FLESH! IT BURNS!"
taste_description = "burning"
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/hellwater/on_mob_life(mob/living/carbon/M)
M.fire_stacks = min(5,M.fire_stacks + 3)
@@ -437,6 +441,7 @@
name = "Zelus Oil"
description = "Oil blessed by a greater being."
taste_description = "metallic oil"
+ value = REAGENT_VALUE_RARE
/datum/reagent/fuel/holyoil/on_mob_life(mob/living/carbon/M)
if(is_servant_of_ratvar(M))
@@ -475,6 +480,7 @@
name = "Godblood"
description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power."
overdose_threshold = 150
+ value = REAGENT_VALUE_RARE
/datum/reagent/lube
name = "Space Lube"
@@ -591,6 +597,7 @@
color = "#5EFF3B" //RGB: 94, 255, 59
metabolization_rate = INFINITY //So it instantly removes all of itself
taste_description = "slime"
+ value = REAGENT_VALUE_RARE
var/datum/species/race = /datum/species/human
var/mutationtext = "The pain subsides. You feel... human."
@@ -750,6 +757,7 @@
color = "#5EFF3B" //RGB: 94, 255, 59
taste_description = "slime"
metabolization_rate = 0.2
+ value = REAGENT_VALUE_RARE
/datum/reagent/slime_toxin/on_mob_life(mob/living/carbon/human/H)
..()
@@ -786,6 +794,7 @@
color = "#5EFF3B" //RGB: 94, 255, 59
metabolization_rate = INFINITY
taste_description = "slime"
+ value = REAGENT_VALUE_RARE
/datum/reagent/mulligan/on_mob_life(mob/living/carbon/human/H)
..()
@@ -800,6 +809,7 @@
description = "An advanced corruptive toxin produced by slimes."
color = "#13BC5E" // rgb: 19, 188, 94
taste_description = "slime"
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/aslimetoxin/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
if(method != TOUCH)
@@ -811,6 +821,7 @@
color = "#5EFF3B" //RGB: 94, 255, 59
can_synth = FALSE
taste_description = "decay"
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/gluttonytoxin/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
L.ForceContractDisease(new /datum/disease/transformation/morph(), FALSE, TRUE)
@@ -1113,6 +1124,7 @@
color = "#0000CC"
taste_description = "fizzling blue"
pH = 12
+ value = REAGENT_VALUE_RARE
/datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -1239,6 +1251,7 @@
metabolization_rate = 1.5 * REAGENTS_METABOLISM
taste_description = "acid"
pH = 2
+ value = REAGENT_VALUE_RARE
/datum/reagent/space_cleaner/ez_clean/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(3.33)
@@ -1290,6 +1303,7 @@
color = "#535E66" // rgb: 83, 94, 102
can_synth = FALSE
taste_description = "sludge"
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/nanomachines/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
@@ -1301,6 +1315,7 @@
color = "#535E66" // rgb: 83, 94, 102
can_synth = FALSE
taste_description = "sludge"
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/xenomicrobes/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
@@ -1313,6 +1328,7 @@
can_synth = FALSE
taste_description = "slime"
pH = 11
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/fungalspores/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
@@ -1340,6 +1356,7 @@
color = "#664B63" // rgb: 102, 75, 99
taste_description = "metal"
pH = 11.8
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/ammonia
name = "Ammonia"
@@ -1417,6 +1434,7 @@
metabolization_rate = 1.5 * REAGENTS_METABOLISM
color = "E1A116"
taste_description = "sourness"
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/stimulum/on_mob_metabolize(mob/living/L)
..()
@@ -1442,13 +1460,14 @@
color = "90560B"
taste_description = "burning"
pH = 2
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/nitryl/on_mob_metabolize(mob/living/L)
..()
- L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nitryl)
/datum/reagent/nitryl/on_mob_end_metabolize(mob/living/L)
- L.remove_movespeed_modifier(type)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nitryl)
..()
/////////////////////////Coloured Crayon Powder////////////////////////////
@@ -1463,6 +1482,7 @@
color = "#FFFFFF" // rgb: 207, 54, 0
taste_description = "the back of class"
no_mob_color = TRUE
+ value = REAGENT_VALUE_NONE
/datum/reagent/colorful_reagent/crayonpowder/New()
description = "\an [colorname] powder made by grinding down crayons, good for colouring chemical reagents."
@@ -1633,6 +1653,7 @@
color = "#FFFF00"
var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700")
taste_description = "rainbows"
+ value = REAGENT_VALUE_RARE
var/no_mob_color = FALSE
/datum/reagent/colorful_reagent/on_mob_life(mob/living/carbon/M)
@@ -1662,6 +1683,7 @@
color = "#ff00dd"
var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code
taste_description = "sourness"
+ value = REAGENT_VALUE_RARE
/datum/reagent/hair_dye/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -1677,6 +1699,7 @@
reagent_state = LIQUID
color = "#fac34b"
taste_description = "sourness"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/barbers_aid/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -1694,6 +1717,7 @@
reagent_state = LIQUID
color = "#ffaf00"
taste_description = "sourness"
+ value = REAGENT_VALUE_RARE
/datum/reagent/concentrated_barbers_aid/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -1726,6 +1750,7 @@
color = "#A70FFF"
taste_description = "dryness"
pH = 10.7
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/drying_agent/reaction_turf(turf/open/T, reac_volume)
if(istype(T))
@@ -1863,6 +1888,7 @@
color = "#00ff80"
taste_description = "strange honey"
pH = 3
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/M)
if(prob(2))
@@ -1884,6 +1910,7 @@
can_synth = FALSE
taste_description = "brains"
pH = 0.5
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/romerol/reaction_mob(mob/living/carbon/human/H, method=TOUCH, reac_volume)
// Silently add the zombie infection organ to be activated upon death
@@ -1897,6 +1924,7 @@
description = "An experimental serum which causes rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas."
reagent_state = LIQUID
color = "#00f041"
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/magillitis/on_mob_life(mob/living/carbon/M)
..()
@@ -1908,6 +1936,7 @@
description = "A commercial chemical designed to help older men in the bedroom."//not really it just makes you a giant
color = "#ff0000"//strong red. rgb 255, 0, 0
var/current_size = RESIZE_DEFAULT_SIZE
+ value = REAGENT_VALUE_COMMON
taste_description = "bitterness" // apparently what viagra tastes like
/datum/reagent/growthserum/on_mob_life(mob/living/carbon/H)
@@ -1978,6 +2007,7 @@
color = "#AAAAAA55"
taste_description = "water"
metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_RARE
pH = 15
/datum/reagent/pax/on_mob_metabolize(mob/living/L)
@@ -1994,6 +2024,7 @@
color = "#FAFF00"
taste_description = "acrid cinnamon"
metabolization_rate = 0.2 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/bz_metabolites/on_mob_metabolize(mob/living/L)
..()
@@ -2014,12 +2045,14 @@
name = "synth-pax"
description = "A colorless liquid that suppresses violence on the subjects. Cheaper to synthetize, but wears out faster than normal Pax."
metabolization_rate = 1.5 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_COMMON
/datum/reagent/peaceborg_confuse
name = "Dizzying Solution"
description = "Makes the target off balance and dizzy"
metabolization_rate = 1.5 * REAGENTS_METABOLISM
taste_description = "dizziness"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/peaceborg_confuse/on_mob_life(mob/living/carbon/M)
if(M.confused < 6)
@@ -2035,6 +2068,7 @@
description = "An extremely weak stamina-toxin that tires out the target. Completely harmless."
metabolization_rate = 1.5 * REAGENTS_METABOLISM
taste_description = "tiredness"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/peaceborg_tire/on_mob_life(mob/living/carbon/M)
var/healthcomp = (100 - M.health) //DOES NOT ACCOUNT FOR ADMINBUS THINGS THAT MAKE YOU HAVE MORE THAN 200/210 HEALTH, OR SOMETHING OTHER THAN A HUMAN PROCESSING THIS.
@@ -2050,6 +2084,7 @@
color = "#9A6750" //RGB: 154, 103, 80
taste_description = "inner peace"
can_synth = FALSE
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/tranquility/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
@@ -2060,6 +2095,7 @@
description = "The primary precursor for an ancient feline delicacy known as skooma. While it has no notable effects on it's own, mixing it with morphine in a chilled container may yield interesting results."
color = "#FAEAFF"
taste_description = "synthetic catnip"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/moonsugar/on_mob_life(mob/living/carbon/M)
if(prob(20))
@@ -2076,6 +2112,7 @@
var/datum/dna/original_dna
var/reagent_ticks = 0
chemical_flags = REAGENT_INVISIBLE
+ value = REAGENT_VALUE_GLORIOUS
/datum/reagent/changeling_string/on_mob_metabolize(mob/living/carbon/C)
if(ishuman(C) && C.dna && data["desired_dna"])
@@ -2111,6 +2148,7 @@
taste_description = "grass"
description = "A colorless liquid that makes people more peaceful and felines more happy."
metabolization_rate = 1.75 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_COMMON
/datum/reagent/pax/catnip/on_mob_life(mob/living/carbon/M)
if(prob(20))
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
index 939d5c9707..67ff61610d 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
@@ -5,6 +5,7 @@
reagent_state = SOLID
color = "#550000"
taste_description = "sweet tasting metal"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/thermite/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 1)
@@ -21,13 +22,14 @@
description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol."
color = "#808080" // rgb: 128, 128, 128
taste_description = "oil"
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/stabilizing_agent
name = "Stabilizing Agent"
description = "Keeps unstable chemicals stable. This does not work on everything."
reagent_state = LIQUID
color = "#FFFF00"
- value = 3
+ value = REAGENT_VALUE_VERY_COMMON
taste_description = "metal"
/datum/reagent/clf3
@@ -37,6 +39,7 @@
color = "#FFC8C8"
metabolization_rate = 4
taste_description = "burning"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/clf3/on_mob_life(mob/living/carbon/M)
M.adjust_fire_stacks(2)
@@ -79,13 +82,14 @@
reagent_state = LIQUID
color = "#5A64C8"
taste_description = "air and bitterness"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/liquid_dark_matter
name = "Liquid Dark Matter"
description = "Sucks everything into the detonation point."
reagent_state = LIQUID
color = "#210021"
- value = 10
+ value = REAGENT_VALUE_UNCOMMON
taste_description = "compressed bitterness"
/datum/reagent/blackpowder
@@ -93,9 +97,9 @@
description = "Explodes. Violently."
reagent_state = LIQUID
color = "#000000"
- value = 5
metabolization_rate = 0.05
taste_description = "salt"
+ value = REAGENT_VALUE_RARE
/datum/reagent/blackpowder/on_mob_life(mob/living/carbon/M)
..()
@@ -115,6 +119,7 @@
reagent_state = LIQUID
color = "#C8C8C8"
taste_description = "salt"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/smoke_powder
name = "Smoke Powder"
@@ -122,6 +127,7 @@
reagent_state = LIQUID
color = "#C8C8C8"
taste_description = "smoke"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/sonic_powder
name = "Sonic Powder"
@@ -129,6 +135,7 @@
reagent_state = LIQUID
color = "#C8C8C8"
taste_description = "loud noises"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/phlogiston
name = "Phlogiston"
@@ -136,6 +143,7 @@
reagent_state = LIQUID
color = "#FA00AF"
taste_description = "burning"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/phlogiston/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
M.adjust_fire_stacks(1)
@@ -156,8 +164,8 @@
description = "Very flammable."
reagent_state = LIQUID
color = "#FA00AF"
- value = 1
taste_description = "burning"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/napalm/on_mob_life(mob/living/carbon/M)
M.adjust_fire_stacks(1)
@@ -174,7 +182,7 @@
color = "#0000DC"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "bitterness"
-
+ value = REAGENT_VALUE_COMMON
/datum/reagent/cryostylane/on_mob_life(mob/living/carbon/M) //TODO: code freezing into an ice cube
if(M.reagents.has_reagent(/datum/reagent/oxygen))
@@ -193,6 +201,7 @@
color = "#64FAC8"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "bitterness"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/pyrosium/on_mob_life(mob/living/carbon/M)
if(M.reagents.has_reagent(/datum/reagent/oxygen))
@@ -208,6 +217,7 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "charged metal"
var/shock_timer = 0
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/teslium/on_mob_life(mob/living/carbon/M)
shock_timer++
@@ -242,6 +252,7 @@
reagent_state = LIQUID
color = "#A6FAFF55"
taste_description = "the inside of a fire extinguisher"
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/firefighting_foam/reaction_turf(turf/open/T, reac_volume)
if (!istype(T))
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index bd79ed5fb8..3169d2d3aa 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -7,6 +7,7 @@
color = "#CF3600" // rgb: 207, 54, 0
taste_description = "bitterness"
taste_mult = 1.2
+ value = REAGENT_VALUE_COMMON //Encouraging people to mix toxins for reasons beyond harming each other or mixing reagents such as pen acid.
var/toxpwr = 1.5
/datum/reagent/toxin/on_mob_life(mob/living/carbon/M)
@@ -21,6 +22,7 @@
color = "#792300" // rgb: 121, 35, 0
toxpwr = 2.5
taste_description = "mushroom"
+ value = REAGENT_VALUE_UNCOMMON
pH = 13
/datum/reagent/toxin/mutagen
@@ -30,6 +32,7 @@
toxpwr = 0
taste_description = "slime"
taste_mult = 0.9
+ value = REAGENT_VALUE_VERY_COMMON
pH = 2.3
/datum/reagent/toxin/mutagen/reaction_mob(mob/living/carbon/M, method=TOUCH, reac_volume)
@@ -60,6 +63,7 @@
color = "#8228A0"
toxpwr = 3
pH = 4
+ value = REAGENT_VALUE_RARE //sheets are worth more
/datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C)
if(holder.has_reagent(/datum/reagent/medicine/epinephrine))
@@ -92,6 +96,7 @@
toxpwr = 0
taste_description = "acid"
pH = 1.2
+ value = REAGENT_VALUE_RARE
/datum/reagent/toxin/lexorin/on_mob_life(mob/living/carbon/C)
. = TRUE
@@ -114,6 +119,7 @@
taste_description = "slime"
taste_mult = 1.3
pH = 10
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/toxin/slimejelly/on_mob_life(mob/living/carbon/M)
if(prob(10))
@@ -132,6 +138,7 @@
toxpwr = 0
taste_description = "mint"
pH = 8
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/toxin/minttoxin/on_mob_life(mob/living/carbon/M)
if(HAS_TRAIT(M, TRAIT_FAT))
@@ -145,6 +152,7 @@
toxpwr = 2
taste_description = "fish"
pH = 12
+ value = REAGENT_VALUE_RARE
/datum/reagent/toxin/zombiepowder
name = "Zombie Powder"
@@ -155,6 +163,7 @@
taste_description = "death"
var/fakedeath_active = FALSE
pH = 13
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/L)
..()
@@ -193,6 +202,7 @@
toxpwr = 0.8
taste_description = "death"
pH = 14.5
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/toxin/ghoulpowder/on_mob_metabolize(mob/living/L)
..()
@@ -214,6 +224,7 @@
toxpwr = 0
taste_description = "sourness"
pH = 11
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/M)
M.hallucination += 5
@@ -226,6 +237,7 @@
toxpwr = 1
taste_mult = 1
pH = 2.7
+ value = REAGENT_VALUE_NONE
/datum/reagent/toxin/plantbgone/reaction_obj(obj/O, reac_volume)
if(istype(O, /obj/structure/alien/weeds))
@@ -250,6 +262,7 @@
description = "A harmful toxic mixture to kill weeds. Do not ingest!"
color = "#4B004B" // rgb: 75, 0, 75
pH = 3
+ value = REAGENT_VALUE_NONE
/datum/reagent/toxin/pestkiller
name = "Pest Killer"
@@ -257,6 +270,7 @@
color = "#4B004B" // rgb: 75, 0, 75
toxpwr = 1
pH = 3.2
+ value = REAGENT_VALUE_NONE
/datum/reagent/toxin/pestkiller/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
..()
@@ -270,6 +284,7 @@
color = "#9ACD32"
toxpwr = 1
pH = 11
+ value = REAGENT_VALUE_RARE
/datum/reagent/toxin/spore/on_mob_life(mob/living/carbon/C)
C.damageoverlaytemp = 60
@@ -284,6 +299,7 @@
toxpwr = 0.5
taste_description = "burning"
pH = 13
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/spore_burning/on_mob_life(mob/living/carbon/M)
M.adjust_fire_stacks(2)
@@ -323,6 +339,7 @@
glass_name = "glass of beer"
glass_desc = "A freezing pint of beer."
pH = 2
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/fakebeer/on_mob_life(mob/living/carbon/M)
switch(current_cycle)
@@ -340,6 +357,7 @@
color = "#5B2E0D" // rgb: 91, 46, 13
toxpwr = 0.5
pH = 4.2
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/toxin/teapowder
name = "Ground Tea Leaves"
@@ -348,6 +366,7 @@
color = "#7F8400" // rgb: 127, 132, 0
toxpwr = 0.5
pH = 4.9
+ value = REAGENT_VALUE_VERY_COMMON
/datum/reagent/toxin/mutetoxin //the new zombie powder.
name = "Mute Toxin"
@@ -367,6 +386,7 @@
color = "#6E2828"
data = 15
toxpwr = 0
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/M)
M.adjustStaminaLoss(REM * data, 0)
@@ -381,6 +401,7 @@
color = "#787878"
metabolization_rate = 0.125 * REAGENTS_METABOLISM
toxpwr = 0
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/polonium/on_mob_life(mob/living/carbon/M)
M.radiation += 4
@@ -394,6 +415,7 @@
metabolization_rate = 0.25 * REAGENTS_METABOLISM
overdose_threshold = 30
toxpwr = 0
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/toxin/histamine/on_mob_life(mob/living/carbon/M)
if(prob(50))
@@ -441,6 +463,7 @@
color = "#F0FFF0"
metabolization_rate = 0.25 * REAGENTS_METABOLISM
toxpwr = 0
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/venom/on_mob_life(mob/living/carbon/M)
toxpwr = 0.2*volume
@@ -476,6 +499,7 @@
color = "#00B4FF"
metabolization_rate = 0.125 * REAGENTS_METABOLISM
toxpwr = 1.25
+ value = REAGENT_VALUE_UNCOMMON
/datum/reagent/toxin/cyanide/on_mob_life(mob/living/carbon/M)
if(prob(5))
@@ -494,6 +518,7 @@
metabolization_rate = 0.25 * REAGENTS_METABOLISM
toxpwr = 0.5
taste_description = "bad cooking"
+ value = REAGENT_VALUE_NONE
/datum/reagent/toxin/condensed_cooking_oil
name = "Condensed Cooking Oil"
@@ -504,6 +529,7 @@
toxpwr = 0
taste_mult = -2
taste_description = "awful cooking"
+ value = REAGENT_VALUE_NONE
/datum/reagent/toxin/condensed_cooking_oil/on_mob_life(mob/living/carbon/M)
if(prob(5))
@@ -551,6 +577,7 @@
color = "#7F10C0"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
toxpwr = 2.5
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/toxin/initropidril/on_mob_life(mob/living/carbon/C)
if(prob(25))
@@ -582,6 +609,7 @@
metabolization_rate = 0.25 * REAGENTS_METABOLISM
toxpwr = 0
taste_mult = 0 // undetectable, I guess?
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/pancuronium/on_mob_life(mob/living/carbon/M)
if(current_cycle >= 10)
@@ -598,6 +626,7 @@
color = "#6496FA"
metabolization_rate = 0.75 * REAGENTS_METABOLISM
toxpwr = 0
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/sodium_thiopental/on_mob_life(mob/living/carbon/M)
if(current_cycle >= 10)
@@ -626,6 +655,7 @@
color = "#FFFFFF"
toxpwr = 0
metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ value = REAGENT_VALUE_RARE
/datum/reagent/toxin/amanitin/on_mob_end_metabolize(mob/living/M)
var/toxdamage = current_cycle*3*REM
@@ -656,6 +686,7 @@
color = "#7DC3A0"
metabolization_rate = 0.06 * REAGENTS_METABOLISM
toxpwr = 1.75
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/toxin/coniine/on_mob_life(mob/living/carbon/M)
M.losebreath += 5
@@ -670,6 +701,7 @@
overdose_threshold = 29
toxpwr = 0
taste_description = "vomit"
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/spewium/on_mob_life(mob/living/carbon/C)
.=..()
@@ -693,6 +725,7 @@
color = "#191919"
metabolization_rate = 0.125 * REAGENTS_METABOLISM
toxpwr = 1
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/curare/on_mob_life(mob/living/carbon/M)
if(current_cycle >= 11)
@@ -708,6 +741,7 @@
color = "#C8C8C8" //RGB: 200, 200, 200
metabolization_rate = 0.2 * REAGENTS_METABOLISM
toxpwr = 0
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/heparin/on_mob_life(mob/living/carbon/M)
if(ishuman(M))
@@ -726,6 +760,7 @@
metabolization_rate = 0.6 * REAGENTS_METABOLISM
toxpwr = 0.5
taste_description = "spinning"
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/rotatium/on_mob_life(mob/living/carbon/M)
if(M.hud_used)
@@ -752,6 +787,7 @@
metabolization_rate = 0.8 * REAGENTS_METABOLISM
toxpwr = 0.25
taste_description = "skewing"
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/toxin/skewium/on_mob_life(mob/living/carbon/M)
/*
@@ -788,6 +824,7 @@
color = "#3C5133"
metabolization_rate = 0.08 * REAGENTS_METABOLISM
toxpwr = 0.15
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/anacea/on_mob_life(mob/living/carbon/M)
var/remove_amt = 5
@@ -809,6 +846,7 @@
taste_description = "acid"
self_consuming = TRUE
pH = 2.75
+ value = REAGENT_VALUE_NONE
/datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume)
if(!istype(C))
@@ -840,6 +878,7 @@
color = "#5050FF"
toxpwr = 2
acidpwr = 42.0
+ value = REAGENT_VALUE_COMMON
/datum/reagent/toxin/acid/fluacid/on_mob_life(mob/living/carbon/M)
M.adjustFireLoss(current_cycle/10, 0)
@@ -853,6 +892,7 @@
metabolization_rate = 0 //stays in the system until active.
var/actual_metaboliztion_rate = REAGENTS_METABOLISM
toxpwr = 0
+ value = REAGENT_VALUE_VERY_RARE
var/actual_toxpwr = 5
var/delay = 30
@@ -871,6 +911,7 @@
color = "#F0F8FF" // rgb: 240, 248, 255
toxpwr = 0
taste_description = "stillness"
+ value = REAGENT_VALUE_RARE
/datum/reagent/toxin/mimesbane/on_mob_metabolize(mob/living/L)
ADD_TRAIT(L, TRAIT_EMOTEMUTE, type)
@@ -885,6 +926,7 @@
toxpwr = 0
taste_description = "bone hurting"
overdose_threshold = 20
+ value = REAGENT_VALUE_VERY_RARE //because it's very funny.
/datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/M)
M.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice)
@@ -944,6 +986,7 @@
toxpwr = 0
taste_description = "brain hurting"
metabolization_rate = 5
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/toxin/brainhurtingjuice/on_mob_life(mob/living/carbon/M)
if(prob(50))
@@ -962,6 +1005,7 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
toxpwr = 0
taste_description = "tannin"
+ value = REAGENT_VALUE_RARE
/datum/reagent/toxin/bungotoxin/on_mob_life(mob/living/carbon/M)
M.adjustOrganLoss(ORGAN_SLOT_HEART, 3)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index f3ac118134..cfb6d92723 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -36,6 +36,9 @@ other types of metals and chemistry for reagents).
var/dangerous_construction = FALSE //notify and log for admin investigations if this is printed.
var/departmental_flags = ALL //bitflags for deplathes.
var/list/datum/techweb_node/unlocked_by = list()
+ ///minimum and security levels the design can be printed on. Currently only available for rnd production machinery and mechfab.
+ var/min_security_level = SEC_LEVEL_GREEN
+ var/max_security_level = SEC_LEVEL_DELTA
var/research_icon //Replaces the item icon in the research console
var/research_icon_state
var/icon_cache
diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm
index c2bf817ddf..2cf9df6d50 100644
--- a/code/modules/research/designs/biogenerator_designs.dm
+++ b/code/modules/research/designs/biogenerator_designs.dm
@@ -2,6 +2,9 @@
///////Biogenerator Designs ///////
///////////////////////////////////
+//Please be wary to not add inorganic items to the results such as generic glass bottles and metal.
+//as they kind of defeat the design of this feature.
+
/datum/design/milk
name = "10u Milk"
id = "milk"
@@ -18,22 +21,6 @@
make_reagents = list(/datum/reagent/consumable/cream = 10)
category = list("initial","Food")
-/datum/design/milk_carton
- name = "Milk Carton"
- id = "milk_carton"
- build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 100)
- build_path = /obj/item/reagent_containers/food/condiment/milk
- category = list("initial","Food")
-
-/datum/design/cream_carton
- name = "Cream Carton"
- id = "cream_carton"
- build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 300)
- build_path = /obj/item/reagent_containers/food/drinks/bottle/cream
- category = list("initial","Food")
-
/datum/design/black_pepper
name = "10u Black Pepper"
id = "black_pepper"
@@ -42,15 +29,6 @@
make_reagents = list(/datum/reagent/consumable/blackpepper = 10)
category = list("initial","Food")
-/datum/design/pepper_mill
- name = "Pepper Mill"
- id = "pepper_mill"
- build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 50)
- build_path = /obj/item/reagent_containers/food/condiment/peppermill
- make_reagents = list()
- category = list("initial","Food")
-
/datum/design/enzyme
name = "10u Universal Enzyme"
id = "enzyme"
@@ -59,14 +37,6 @@
make_reagents = list(/datum/reagent/consumable/enzyme = 10)
category = list("initial","Food")
-/datum/design/flour_sack
- name = "Flour Sack"
- id = "flour_sack"
- build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 150)
- build_path = /obj/item/reagent_containers/food/condiment/flour
- category = list("initial","Food")
-
/datum/design/monkey_cube
name = "Monkey Cube"
id = "mcube"
@@ -84,43 +54,43 @@
category = list("initial", "Food")
/datum/design/ez_nut
- name = "E-Z Nutrient"
+ name = "10u E-Z Nutrient"
id = "ez_nut"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 10)
- build_path = /obj/item/reagent_containers/glass/bottle/nutrient/ez
+ materials = list(/datum/material/biomass = 2)
+ make_reagents = list(/datum/reagent/plantnutriment/eznutriment = 10)
category = list("initial","Botany Chemicals")
/datum/design/l4z_nut
- name = "Left 4 Zed"
+ name = "10u Left 4 Zed"
id = "l4z_nut"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 20)
- build_path = /obj/item/reagent_containers/glass/bottle/nutrient/l4z
+ materials = list(/datum/material/biomass = 4)
+ make_reagents = list(/datum/reagent/plantnutriment/left4zednutriment = 10)
category = list("initial","Botany Chemicals")
/datum/design/rh_nut
- name = "Robust Harvest"
+ name = "10u Robust Harvest"
id = "rh_nut"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 25)
- build_path = /obj/item/reagent_containers/glass/bottle/nutrient/rh
+ materials = list(/datum/material/biomass = 5)
+ make_reagents = list(/datum/reagent/plantnutriment/robustharvestnutriment = 10)
category = list("initial","Botany Chemicals")
/datum/design/weed_killer
name = "Weed Killer"
id = "weed_killer"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 50)
- build_path = /obj/item/reagent_containers/glass/bottle/killer/weedkiller
+ materials = list(/datum/material/biomass = 10)
+ make_reagents = list(/datum/reagent/toxin/plantbgone/weedkiller = 10)
category = list("initial","Botany Chemicals")
/datum/design/pest_spray
name = "Pest Killer"
id = "pest_spray"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 50)
- build_path = /obj/item/reagent_containers/glass/bottle/killer/pestkiller
+ materials = list(/datum/material/biomass = 10)
+ make_reagents = list(/datum/reagent/toxin/pestkiller = 10)
category = list("initial","Botany Chemicals")
/datum/design/ammonia
@@ -139,13 +109,13 @@
make_reagents = list(/datum/reagent/saltpetre = 10)
category = list("initial","Botany Chemicals")
-/datum/design/botany_bottle
- name = "Empty Bottle"
- id = "botany_bottle"
+/datum/design/empty_carton
+ name = "Small Empty Carton Box"
+ id = "empty_carton"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass = 5)
- build_path = /obj/item/reagent_containers/glass/bottle/nutrient/empty
- category = list("initial", "Botany Chemicals")
+ materials = list(/datum/material/biomass = 15)
+ build_path = /obj/item/reagent_containers/food/drinks/bottle/bio_carton
+ category = list("initial", "Organic Materials")
/datum/design/cloth
name = "Roll of Cloth"
diff --git a/code/modules/research/designs/nanite_designs.dm b/code/modules/research/designs/nanite_designs.dm
index c72ee4fb8c..b157d0c349 100644
--- a/code/modules/research/designs/nanite_designs.dm
+++ b/code/modules/research/designs/nanite_designs.dm
@@ -529,7 +529,6 @@
////////////////////NANITE PROTOCOLS//////////////////////////////////////
//Note about the category name: The UI cuts the last 8 characters from the category name to remove the " Nanites" in the other categories
//Because of this, Protocols was getting cut down to "P", so i had to add some padding
-/*
/datum/design/nanites/kickstart
name = "Kickstart Protocol"
desc = "Replication Protocol: the nanites focus on early growth, heavily boosting replication rate for a few minutes after the initial implantation."
@@ -557,4 +556,10 @@
id = "offline_nanites"
program_type = /datum/nanite_program/protocol/offline
category = list("Protocols_Nanites")
-*/
+
+/datum/design/nanites/synergy
+ name = "Synergy Protocol"
+ desc = "Replication Protocol: the nanites syncronize their tasks and processes within a host, leading to an increase in replication speed proportional to the current nanite volume."
+ id = "synergy_nanites"
+ program_type = /datum/nanite_program/protocol/synergy
+ category = list("Protocols_Nanites")
diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm
index bd571607d2..0550fa9334 100644
--- a/code/modules/research/machinery/_production.dm
+++ b/code/modules/research/machinery/_production.dm
@@ -3,6 +3,7 @@
desc = "Makes researched and prototype items with materials and energy."
layer = BELOW_OBJ_LAYER
var/consoleless_interface = TRUE //Whether it can be used without a console.
+ var/offstation_security_levels = TRUE
var/efficiency_coeff = 1 //Materials needed / coeff = actual.
var/list/categories = list()
var/datum/component/remote_materials/materials
@@ -98,6 +99,7 @@
var/obj/item/I = O
I.material_flags |= MATERIAL_NO_EFFECTS //Find a better way to do this.
I.set_custom_materials(matlist.Copy())
+ I.rnd_crafted(src)
SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]"))
investigate_log("[key_name(user)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH)
@@ -134,6 +136,12 @@
if(D.build_type && !(D.build_type & allowed_buildtypes))
say("This machine does not have the necessary manipulation systems for this design. Please contact Nanotrasen Support!")
return FALSE
+ if(!(obj_flags & EMAGGED) && (offstation_security_levels || is_station_level(z)))
+ if(GLOB.security_level < D.min_security_level)
+ say("Minimum security alert level required to print this design not met, please contact the command staff.")
+ return FALSE
+ if(GLOB.security_level > D.max_security_level)
+ say("Exceeded maximum security alert level required to print this design, please contact the command staff.")
if(!materials.mat_container)
say("No connection to material storage, please contact the quartermaster.")
return FALSE
@@ -275,15 +283,26 @@
temp_material += " [all_materials[M]/coeff] [CallMaterialName(M)]"
c = min(c,t)
- if (c >= 1)
+ var/clearance = !(obj_flags & EMAGGED) && (offstation_security_levels || is_station_level(z))
+ var/sec_text = ""
+ if(clearance && (D.min_security_level > SEC_LEVEL_GREEN || D.max_security_level < SEC_LEVEL_DELTA))
+ sec_text = " (Allowed security levels: "
+ for(var/n in D.min_security_level to D.max_security_level)
+ sec_text += NUM2SECLEVEL(n)
+ if(n + 1 <= D.max_security_level)
+ sec_text += ", "
+ sec_text += ")"
+
+ clearance = !clearance || ISINRANGE(GLOB.security_level, D.min_security_level, D.max_security_level)
+ if (c >= 1 && clearance)
l += "[D.name][RDSCREEN_NOBREAK]"
if(c >= 5)
l += "x5[RDSCREEN_NOBREAK]"
if(c >= 10)
l += "x10[RDSCREEN_NOBREAK]"
- l += "[temp_material][RDSCREEN_NOBREAK]"
+ l += "[temp_material][sec_text][RDSCREEN_NOBREAK]"
else
- l += "[D.name][temp_material][RDSCREEN_NOBREAK]"
+ l += "[D.name][temp_material][sec_text][RDSCREEN_NOBREAK]"
l += ""
return l
diff --git a/code/modules/research/machinery/circuit_imprinter.dm b/code/modules/research/machinery/circuit_imprinter.dm
index 948dad61db..661ebe31c0 100644
--- a/code/modules/research/machinery/circuit_imprinter.dm
+++ b/code/modules/research/machinery/circuit_imprinter.dm
@@ -30,3 +30,9 @@
total_rating += M.rating * 2 //There is only one.
total_rating = max(1, total_rating)
efficiency_coeff = total_rating
+ var/obj/item/circuitboard/machine/circuit_imprinter/C = circuit
+ offstation_security_levels = C.offstation_security_levels
+
+/obj/machinery/rnd/production/circuit_imprinter/offstation
+ offstation_security_levels = FALSE
+ circuit = /obj/item/circuitboard/machine/circuit_imprinter/offstation
diff --git a/code/modules/research/machinery/protolathe.dm b/code/modules/research/machinery/protolathe.dm
index 684f27ccad..b1b31a279c 100644
--- a/code/modules/research/machinery/protolathe.dm
+++ b/code/modules/research/machinery/protolathe.dm
@@ -23,3 +23,12 @@
/obj/machinery/rnd/production/protolathe/disconnect_console()
linked_console.linked_lathe = null
..()
+
+/obj/machinery/rnd/production/protolathe/calculate_efficiency()
+ . = ..()
+ var/obj/item/circuitboard/machine/protolathe/C = circuit
+ offstation_security_levels = C.offstation_security_levels
+
+/obj/machinery/rnd/production/protolathe/offstation
+ offstation_security_levels = FALSE
+ circuit = /obj/item/circuitboard/machine/protolathe/offstation
diff --git a/code/modules/research/nanites/nanite_program_hub.dm b/code/modules/research/nanites/nanite_program_hub.dm
index ea4392f236..47ee2447d2 100644
--- a/code/modules/research/nanites/nanite_program_hub.dm
+++ b/code/modules/research/nanites/nanite_program_hub.dm
@@ -21,7 +21,7 @@
list(name = "Augmentation Nanites"),
list(name = "Suppression Nanites"),
list(name = "Weaponized Nanites"),
- //list(name = "Protocols") B.E.P.I.S Content, which we dont have
+ list(name = "Protocols") //Moved to default techweb from B.E.P.I.S. research, for now
)
/obj/machinery/nanite_program_hub/Initialize()
diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm
index 72f969a77e..faa81be0a5 100644
--- a/code/modules/research/nanites/nanite_programs.dm
+++ b/code/modules/research/nanites/nanite_programs.dm
@@ -290,7 +290,7 @@
qdel(src)
///A nanite program containing a behaviour protocol. Only one protocol of each class can be active at once.
-//Currently unused due to us lacking the B.E.P.I.S
+//Moved to being 'normally' researched due to lack of B.E.P.I.S.
/datum/nanite_program/protocol
name = "Nanite Protocol"
var/protocol_class = NONE
diff --git a/code/modules/research/nanites/nanite_programs/protocols.dm b/code/modules/research/nanites/nanite_programs/protocols.dm
index 73976abe09..3830e7c8ba 100644
--- a/code/modules/research/nanites/nanite_programs/protocols.dm
+++ b/code/modules/research/nanites/nanite_programs/protocols.dm
@@ -105,3 +105,14 @@
/datum/nanite_program/protocol/offline/active_effect()
nanites.adjust_nanites(null, boost)
+
+/datum/nanite_program/protocol/synergy
+ name = "Synergy Protocol"
+ desc = "Replication Protocol: the nanites syncronize their tasks and processes within a host, leading to an increase in replication speed proportional to the current nanite volume."
+ use_rate = 0
+ rogue_types = list(/datum/nanite_program/necrotic)
+ protocol_class = NANITE_PROTOCOL_REPLICATION
+ var/max_boost = 2 //The maximum boost this program applies to the nanite replication, multiplied with the current nanite 'saturation' percentage
+
+/datum/nanite_program/protocol/synergy/active_effect()
+ nanites.adjust_nanites(null, round(max_boost * (nanites.nanite_volume / nanites.max_nanites), 0.1))
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index be1b9460b0..19f6e3ffdb 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -301,15 +301,26 @@ Nothing else in the console has ID requirements.
temp_material += " [all_materials[M]/coeff] [CallMaterialName(M)]"
c = min(c,t)
- if (c >= 1)
+ var/clearance = !(linked_lathe.obj_flags & EMAGGED) && (linked_lathe.offstation_security_levels || is_station_level(linked_lathe.z))
+ var/sec_text = ""
+ if(clearance && (D.min_security_level > SEC_LEVEL_GREEN || D.max_security_level < SEC_LEVEL_DELTA))
+ sec_text = " (Allowed security levels: "
+ for(var/n in D.min_security_level to D.max_security_level)
+ sec_text += NUM2SECLEVEL(n)
+ if(n + 1 <= D.max_security_level)
+ sec_text += ", "
+ sec_text += ")"
+
+ clearance = !clearance || ISINRANGE(GLOB.security_level, D.min_security_level, D.max_security_level)
+ if (c >= 1 && clearance)
l += "[D.name][RDSCREEN_NOBREAK]"
if(c >= 5)
l += "x5[RDSCREEN_NOBREAK]"
if(c >= 10)
l += "x10[RDSCREEN_NOBREAK]"
- l += "[temp_material][RDSCREEN_NOBREAK]"
+ l += "[temp_material][sec_text][RDSCREEN_NOBREAK]"
else
- l += "[D.name][temp_material][RDSCREEN_NOBREAK]"
+ l += "[D.name][temp_material][sec_text][RDSCREEN_NOBREAK]"
l += ""
l += ""
return l
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 24b9ccf81c..002bb3d64b 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -957,6 +957,14 @@
design_ids = list("spreading_nanites","mindcontrol_nanites","mitosis_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
+/datum/techweb_node/nanite_replication_protocols
+ id = "nanite_replication_protocols"
+ display_name = "Nanite Replication Protocols"
+ description = "Advanced behaviours that allow nanites to exploit certain circumstances to replicate faster."
+ prereq_ids = list("nanite_smart")
+ design_ids = list("kickstart_nanites","factory_nanites","tinker_nanites","offline_nanites","synergy_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+
////////////////////////Alien technology////////////////////////
/datum/techweb_node/alientech //AYYYYYYYYLMAOO tech
id = "alientech"
diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
index fd4e508e1b..e153176cbe 100644
--- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
@@ -191,7 +191,7 @@
alert_type = /obj/screen/alert/status_effect/bloodchill
/datum/status_effect/bloodchill/on_apply()
- owner.add_movespeed_modifier("bloodchilled", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = 3)
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill)
return ..()
/datum/status_effect/bloodchill/tick()
@@ -199,7 +199,7 @@
owner.adjustFireLoss(2)
/datum/status_effect/bloodchill/on_remove()
- owner.remove_movespeed_modifier("bloodchilled")
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill)
return ..()
/obj/screen/alert/status_effect/bloodchill
@@ -213,7 +213,7 @@
alert_type = /obj/screen/alert/status_effect/bonechill
/datum/status_effect/bonechill/on_apply()
- owner.add_movespeed_modifier("bonechilled", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = 3)
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill)
return ..()
/datum/status_effect/bonechill/tick()
@@ -223,7 +223,7 @@
owner.adjust_bodytemperature(-10)
/datum/status_effect/bonechill/on_remove()
- owner.remove_movespeed_modifier("bonechilled")
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill)
return ..()
/obj/screen/alert/status_effect/bonechill
@@ -385,11 +385,11 @@ datum/status_effect/rebreathing/tick()
duration = 30
/datum/status_effect/tarfoot/on_apply()
- owner.add_movespeed_modifier(MOVESPEED_ID_TARFOOT, update=TRUE, priority=100, multiplicative_slowdown=0.5, blacklisted_movetypes=(FLYING|FLOATING))
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/tarfoot)
return ..()
/datum/status_effect/tarfoot/on_remove()
- owner.remove_movespeed_modifier(MOVESPEED_ID_TARFOOT)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/tarfoot)
return ..()
/datum/status_effect/spookcookie
@@ -707,15 +707,15 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/sepia/tick()
if(prob(50) && mod > -1)
mod--
- owner.add_movespeed_modifier(MOVESPEED_ID_SEPIA, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
+ owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 1)
else if(mod < 1)
mod++
// yeah a value of 0 does nothing but replacing the trait in place is cheaper than removing and adding repeatedly
- owner.add_movespeed_modifier(MOVESPEED_ID_SEPIA, update=TRUE, priority=100, multiplicative_slowdown=0, blacklisted_movetypes=(FLYING|FLOATING))
+ owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 0)
return ..()
/datum/status_effect/stabilized/sepia/on_remove()
- owner.remove_movespeed_modifier(MOVESPEED_ID_SEPIA)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia)
return ..()
/datum/status_effect/stabilized/cerulean
@@ -777,11 +777,11 @@ datum/status_effect/stabilized/blue/on_remove()
colour = "red"
/datum/status_effect/stabilized/red/on_apply()
- owner.ignore_slowdown("slimestatus")
- return ..()
+ . = ..()
+ owner.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/equipment_speedmod)
/datum/status_effect/stabilized/red/on_remove()
- owner.unignore_slowdown("slimestatus")
+ owner.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/equipment_speedmod)
return ..()
/datum/status_effect/stabilized/green
diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm
index 8a58563407..b9dc9b92d3 100644
--- a/code/modules/security_levels/keycard_authentication.dm
+++ b/code/modules/security_levels/keycard_authentication.dm
@@ -41,7 +41,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new)
var/list/data = list()
data["waiting"] = waiting
data["auth_required"] = event_source ? event_source.event : 0
- data["red_alert"] = (seclevel2num(get_security_level()) >= SEC_LEVEL_RED) ? 1 : 0
+ data["red_alert"] = (SECLEVEL2NUM(NUM2SECLEVEL(GLOB.security_level)) >= SEC_LEVEL_RED) ? 1 : 0
data["emergency_maint"] = GLOB.emergency_access
data["bsa_unlock"] = GLOB.bsa_unlock
return data
diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm
index 887891ca16..52fafb81be 100644
--- a/code/modules/security_levels/security_levels.dm
+++ b/code/modules/security_levels/security_levels.dm
@@ -5,20 +5,17 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN)
//SEC_LEVEL_RED = code red
//SEC_LEVEL_DELTA = code delta
+ /*
+ * All security levels, per ascending alert. Nothing too fancy, really.
+ * Their positions should also match their numerical values.
+ */
+GLOBAL_LIST_INIT(all_security_levels, list("green", "blue", "amber", "red", "delta"))
+
//config.alert_desc_blue_downto
/proc/set_security_level(level)
- switch(level)
- if("green")
- level = SEC_LEVEL_GREEN
- if("blue")
- level = SEC_LEVEL_BLUE
- if("amber")
- level = SEC_LEVEL_AMBER
- if("red")
- level = SEC_LEVEL_RED
- if("delta")
- level = SEC_LEVEL_DELTA
+ if(!isnum(level))
+ level = GLOB.all_security_levels.Find(level)
//Will not be announced if you try to set to the same level as it already is
if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != GLOB.security_level)
@@ -111,46 +108,7 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN)
if(D.red_alert_access)
D.visible_message("[D] whirrs as it automatically lifts access requirements!")
playsound(D, 'sound/machines/boltsup.ogg', 50, TRUE)
- SSblackbox.record_feedback("tally", "security_level_changes", 1, get_security_level())
+ SSblackbox.record_feedback("tally", "security_level_changes", 1, NUM2SECLEVEL(GLOB.security_level))
SSnightshift.check_nightshift()
else
return
-
-/proc/get_security_level()
- switch(GLOB.security_level)
- if(SEC_LEVEL_GREEN)
- return "green"
- if(SEC_LEVEL_BLUE)
- return "blue"
- if(SEC_LEVEL_AMBER)
- return "amber"
- if(SEC_LEVEL_RED)
- return "red"
- if(SEC_LEVEL_DELTA)
- return "delta"
-
-/proc/num2seclevel(num)
- switch(num)
- if(SEC_LEVEL_GREEN)
- return "green"
- if(SEC_LEVEL_BLUE)
- return "blue"
- if(SEC_LEVEL_AMBER)
- return "amber"
- if(SEC_LEVEL_RED)
- return "red"
- if(SEC_LEVEL_DELTA)
- return "delta"
-
-/proc/seclevel2num(seclevel)
- switch( lowertext(seclevel) )
- if("green")
- return SEC_LEVEL_GREEN
- if("blue")
- return SEC_LEVEL_BLUE
- if("amber")
- return SEC_LEVEL_AMBER
- if("red")
- return SEC_LEVEL_RED
- if("delta")
- return SEC_LEVEL_DELTA
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index cd08b7290a..f3b4cbddc9 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -310,7 +310,7 @@
/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null, silent = FALSE)
if(!isnum(set_coefficient))
- var/security_num = seclevel2num(get_security_level())
+ var/security_num = SECLEVEL2NUM(NUM2SECLEVEL(GLOB.security_level))
switch(security_num)
if(SEC_LEVEL_GREEN)
set_coefficient = 2
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index 033187e353..87f9b55aa9 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -122,7 +122,7 @@
/obj/structure/table/abductor/wabbajack/proc/sleeper_dreams(mob/living/sleeper)
if(sleeper in sleepers)
to_chat(sleeper, "While you slumber, you have the strangest dream, like you can see yourself from the outside.")
- sleeper.ghostize(TRUE)
+ sleeper.ghostize(TRUE, voluntary = TRUE)
/obj/structure/table/abductor/wabbajack/left
desc = "You sleep so it may wake."
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index 2aae17b0f3..6c21456e63 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -276,7 +276,7 @@
ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, "dna_vault")
if(VAULT_SPEED)
to_chat(H, "Your legs feel faster.")
- H.add_movespeed_modifier(MOVESPEED_ID_DNA_VAULT, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
+ H.add_movespeed_modifier(/datum/movespeed_modifier/dna_vault_speedup)
if(VAULT_QUICK)
to_chat(H, "Your arms move as fast as lightning.")
H.next_move_modifier = 0.5
diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm
index 47a452cc76..eb42303060 100644
--- a/code/modules/surgery/organs/augments_chest.dm
+++ b/code/modules/surgery/organs/augments_chest.dm
@@ -165,14 +165,14 @@
if(allow_thrust(0.01))
ion_trail.start()
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/move_react)
- owner.add_movespeed_modifier(MOVESPEED_ID_CYBER_THRUSTER, priority=100, multiplicative_slowdown=-2, movetypes=FLOATING, conflict=MOVE_CONFLICT_JETPACK)
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/cybernetic)
if(!silent)
to_chat(owner, "You turn your thrusters set on.")
else
ion_trail.stop()
if(!QDELETED(owner))
UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
- owner.remove_movespeed_modifier(MOVESPEED_ID_CYBER_THRUSTER)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/cybernetic)
if(!silent)
to_chat(owner, "You turn your thrusters set off.")
on = FALSE
diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm
index 6e5ea0e111..f4771de14f 100755
--- a/code/modules/surgery/organs/liver.dm
+++ b/code/modules/surgery/organs/liver.dm
@@ -56,22 +56,22 @@
return
if(damage >= high_threshold)
var/move_calc = 1+((round(damage) - high_threshold)/(high_threshold/3))
- owner.add_movespeed_modifier(MOVESPEED_ID_CIRRHOSIS, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = move_calc)
+ owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/liver_cirrhosis, multiplicative_slowdown = move_calc)
sizeMoveMod(move_calc, owner)
else
- owner.remove_movespeed_modifier(MOVESPEED_ID_CIRRHOSIS)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/liver_cirrhosis)
sizeMoveMod(1, owner)
/obj/item/organ/liver/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
. = ..()
if(. && damage >= high_threshold)
var/move_calc = 1+((round(damage) - high_threshold)/(high_threshold/3))
- M.add_movespeed_modifier(MOVESPEED_ID_CIRRHOSIS, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = move_calc)
+ M.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/liver_cirrhosis, multiplicative_slowdown = move_calc)
sizeMoveMod(move_calc, owner)
/obj/item/organ/liver/Remove(special = FALSE)
if(!QDELETED(owner))
- owner.remove_movespeed_modifier(MOVESPEED_ID_CIRRHOSIS)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/liver_cirrhosis)
sizeMoveMod(1, owner)
return ..()
diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm
index 194281ded6..cda83cf684 100644
--- a/code/modules/uplink/uplink_items/uplink_devices.dm
+++ b/code/modules/uplink/uplink_items/uplink_devices.dm
@@ -188,6 +188,16 @@
item = /obj/item/healthanalyzer/rad_laser
cost = 3
+/datum/uplink_item/device_tools/riflery_primer
+ name = "Riflery Primer"
+ desc = "An old book with blood and vodka stains on it. Freshly pulled from a dusty crate in some old warehouse, \
+ this primer of questionable worth and value is rumored to increase your rifle-bolt-working and/or shotgun \
+ racking fivefold. Then again, the techniques here only work on bolt-actions and pump-actions..."
+ item = /obj/item/book/granter/trait/rifleman
+ cost = 3
+ restricted_roles = list("Operative") // i want it to be surplusable but i also want it to be mostly nukie only, please advise
+ surplus = 90
+
/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 \
diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt
index 545394f3e9..c6a5d9ef8f 100644
--- a/config/awaymissionconfig.txt
+++ b/config/awaymissionconfig.txt
@@ -7,16 +7,16 @@
#Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once.
#DO tick the associated code file for the away mission you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors!
-#_maps/RandomZLevels/blackmarketpackers.dmm
-#_maps/RandomZLevels/spacebattle.dmm
-#_maps/RandomZLevels/TheBeach.dmm
-#_maps/RandomZLevels/Academy.dmm
-#_maps/RandomZLevels/wildwest.dmm
-#_maps/RandomZLevels/challenge.dmm
-#_maps/RandomZLevels/centcomAway.dmm
-#_maps/RandomZLevels/moonoutpost19.dmm
-#_maps/RandomZLevels/undergroundoutpost45.dmm
-#_maps/RandomZLevels/caves.dmm
-#_maps/RandomZLevels/snowdin.dmm
-#_maps/RandomZLevels/research.dmm
-#_maps/RandomZLevels/Cabin.dmm
+#_maps/RandomZLevels/away_mission/blackmarketpackers.dmm
+#_maps/RandomZLevels/away_mission/spacebattle.dmm
+#_maps/RandomZLevels/away_mission/TheBeach.dmm
+#_maps/RandomZLevels/away_mission/Academy.dmm
+#_maps/RandomZLevels/away_mission/wildwest.dmm
+#_maps/RandomZLevels/away_mission/challenge.dmm
+#_maps/RandomZLevels/away_mission/centcomAway.dmm
+#_maps/RandomZLevels/away_mission/moonoutpost19.dmm
+#_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm
+#_maps/RandomZLevels/away_mission/caves.dmm
+#_maps/RandomZLevels/away_mission/snowdin.dmm
+#_maps/RandomZLevels/away_mission/research.dmm
+#_maps/RandomZLevels/away_mission/Cabin.dmm
diff --git a/config/game_options.txt b/config/game_options.txt
index e1294f688a..781be6d5b1 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -288,6 +288,9 @@ MINIMUM_SECBORG_ALERT 3
## Uncomment to load one of the missions from awaymissionconfig.txt at roundstart.
#ROUNDSTART_AWAY
+## Uncomment to load one of the virtual reality levels from vr_config at roundstart.
+#ROUNDSTART_VR
+
## How long the delay is before the Away Mission gate opens. Default is half an hour.
## 600 is one minute.
GATEWAY_DELAY 18000
diff --git a/config/vr_config.txt b/config/vr_config.txt
new file mode 100644
index 0000000000..0c6354f8fe
--- /dev/null
+++ b/config/vr_config.txt
@@ -0,0 +1,13 @@
+#List the potential virtual reality Z-levels here. awaymissionconfig copypasta follows.
+
+#Maps must be the full path to them
+#Maps should be 255x255 or smaller and be bounded. Falling off the edge of the map will result in undefined behavior.
+#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
+
+#!!IMPORTANT NOTES FOR HOSTING VR MAPS!!:
+#Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once.
+#DO tick the associated code file for the virtual reality levels you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors!
+
+#_maps/RandomZLevels/VR/murderdome.dmm
+#_maps/RandomZLevels/VR/snowdin_VR.dmm
+#_maps/RandomZLevels/VR/syndicate_trainer.dmm
\ No newline at end of file
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index c58fb5d940..58c1cd921c 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index c178cdba04..bf1e309b17 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index 369fb377a5..62fe30f2d7 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -76,7 +76,7 @@
to_chat(H, "Your enormous breasts are way too large to fit anything over them!")
if(last_checked_size != B.cached_size)
- H.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
+ H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy, multiplicative_slowdown = moveCalc)
sizeMoveMod(moveCalc)
if (B.size == "huge")
@@ -93,7 +93,7 @@
/datum/status_effect/chem/breast_enlarger/on_remove()
log_game("FERMICHEM: [owner]'s breasts has reduced to an acceptable size. ID: [owner.key]")
to_chat(owner, "Your expansive chest has become a more managable size, liberating your movements.")
- owner.remove_movespeed_modifier(BREAST_MOVEMENT_SPEED)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy)
sizeMoveMod(1)
return ..()
@@ -152,18 +152,18 @@
playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(H, "Your enormous package is way to large to fit anything over!")
- if(P.length < 22 && H.has_movespeed_modifier(DICK_MOVEMENT_SPEED))
+ if(P.length < 22 && H.has_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy))
to_chat(owner, "Your rascally willy has become a more managable size, liberating your movements.")
- H.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
- else if(P.length >= 22 && !H.has_movespeed_modifier(DICK_MOVEMENT_SPEED))
+ H.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy)
+ else if(P.length >= 22 && !H.has_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy))
to_chat(H, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!")
- H.add_movespeed_modifier(DICK_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
+ H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy, multiplicative_slowdown = moveCalc)
H.AdjustBloodVol(bloodCalc)
..()
/datum/status_effect/chem/penis_enlarger/on_remove()
log_game("FERMICHEM: [owner]'s dick has reduced to an acceptable size. ID: [owner.key]")
- owner.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy)
owner.ResetBloodVol()
return ..()
@@ -280,7 +280,7 @@
var/mob/living/carbon/M = owner
//chem calculations
- if(!owner.reagents.has_reagent(/datum/chemical_reaction/fermi/enthrall) && !owner.reagents.has_reagent(/datum/reagent/fermi/enthrall/test))
+ if(!owner.reagents.has_reagent(/datum/chemical_reaction/fermi/enthrall))
if (phase < 3 && phase != 0)
deltaResist += 3//If you've no chem, then you break out quickly
if(prob(5))
@@ -532,7 +532,7 @@
cooldown += 1 //Cooldown doesn't process till status is done
else if(status == "charge")
- owner.add_movespeed_modifier(MOVESPEED_ID_MKULTRA, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING))
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/mkultra)
status = "charged"
if(lewd)
to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!")
@@ -542,7 +542,7 @@
else if (status == "charged")
if (statusStrength < 0)
status = null
- owner.remove_movespeed_modifier(MOVESPEED_ID_MKULTRA)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/mkultra)
owner.DefaultCombatKnockdown(50)
to_chat(owner, "Your body gives out as the adrenaline in your system runs out.")
else
diff --git a/modular_citadel/code/game/machinery/wishgranter.dm b/modular_citadel/code/game/machinery/wishgranter.dm
index 7758c0d613..6cfe07b7a0 100644
--- a/modular_citadel/code/game/machinery/wishgranter.dm
+++ b/modular_citadel/code/game/machinery/wishgranter.dm
@@ -94,9 +94,8 @@
var/mob/living/simple_animal/hostile/venus_human_trap/killwish = new /mob/living/simple_animal/hostile/venus_human_trap(loc)
killwish.maxHealth = 1500
killwish.health = killwish.maxHealth
- killwish.grasp_range = 6
+ killwish.vine_grab_distance = 6
killwish.melee_damage_upper = 30
- killwish.grasp_chance = 50
killwish.loot = list(/obj/item/twohanded/dualsaber/hypereutactic)
charges--
insisting = FALSE
diff --git a/modular_citadel/code/modules/language/sylvan.dm b/modular_citadel/code/modules/language/sylvan.dm
new file mode 100644
index 0000000000..c9458bb4cf
--- /dev/null
+++ b/modular_citadel/code/modules/language/sylvan.dm
@@ -0,0 +1,23 @@
+// The language of the vinebings. Yes, it's a shameless ripoff of elvish.
+/datum/language/sylvan
+ name = "Sylvan"
+ desc = "A complicated, ancient language spoken by vine like beings."
+ speech_verb = "expresses"
+ ask_verb = "inquires"
+ exclaim_verb = "declares"
+ key = "h"
+ space_chance = 20
+ syllables = list(
+ "fii", "sii", "rii", "rel", "maa", "ala", "san", "tol", "tok", "dia", "eres",
+ "fal", "tis", "bis", "qel", "aras", "losk", "rasa", "eob", "hil", "tanl", "aere",
+ "fer", "bal", "pii", "dala", "ban", "foe", "doa", "cii", "uis", "mel", "wex",
+ "incas", "int", "elc", "ent", "aws", "qip", "nas", "vil", "jens", "dila", "fa",
+ "la", "re", "do", "ji", "ae", "so", "qe", "ce", "na", "mo", "ha", "yu"
+ )
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ icon_state = "lily"
+ default_priority = 90
+
+/datum/language_holder/venus
+ languages = list(/datum/language/common, /datum/language/sylvan, /datum/language/machine)
+ only_speaks_language = /datum/language/sylvan
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
index 2364c617f0..89a7f58cee 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
@@ -144,20 +144,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
pH = 10
chemical_flags = REAGENT_ONMOBMERGE | REAGENT_DONOTSPLIT //Procs on_mob_add when merging into a human
can_synth = FALSE
-
-
-/datum/reagent/fermi/enthrall/test
- name = "MKUltraTest"
- description = "A forbidden deep red mixture that makes you like Fermis a little too much. Unobtainable and due to be removed from the wiki."
- data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Fermis Yakumo")
- creatorID = "honkatonkbramblesnatch"//ckey
- creatorGender = "Mistress"
- creatorName = "Fermis Yakumo"
- purity = 1
-
-/datum/reagent/fermi/enthrall/test/on_new()
- ..()
- creator = get_mob_by_key(creatorID)
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/fermi/enthrall/on_new(list/data)
creatorID = data["creatorID"]
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
index 5f9ea5924d..319cad1714 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
@@ -52,6 +52,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
inverse_chem_val = 0.5
inverse_chem = /datum/reagent/impure/SDZF
can_synth = TRUE
+ value = REAGENT_VALUE_RARE
//Main SDGF chemical
@@ -309,6 +310,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
can_synth = TRUE
taste_description = "a weird chemical fleshy flavour"
chemical_flags = REAGENT_SNEAKYNAME
+ value = REAGENT_VALUE_RARE
/datum/reagent/impure/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead.
switch(current_cycle)//Pretends to be normal
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm
index a8ac66ef20..8348569fbb 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm
@@ -30,6 +30,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
inverse_chem_val = 0.25
can_synth = FALSE
var/datum/action/chem/astral/AS = new/datum/action/chem/astral()
+ value = REAGENT_VALUE_AMAZING
/datum/action/chem/astral
name = "Return to body"
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
index e0b7a6fa14..28645cdc7b 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
@@ -29,6 +29,7 @@
var/teleBool = FALSE
pH = 3.7
can_synth = TRUE
+ value = REAGENT_VALUE_EXCEPTIONAL
/datum/reagent/fermi/eigenstate/on_new(list/data)
location_created = data["location_created"]
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
index 97261e07f2..7403de6215 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
@@ -29,6 +29,7 @@
inverse_chem_val = 0.35
inverse_chem = /datum/reagent/fermi/BEsmaller //At really impure vols, it just becomes 100% inverse
can_synth = FALSE
+ value = REAGENT_VALUE_VERY_RARE
var/message_spam = FALSE
/datum/reagent/fermi/breast_enlarger/on_mob_metabolize(mob/living/M)
@@ -126,6 +127,7 @@
taste_description = "a milky ice cream like flavour."
metabolization_rate = 0.25
can_synth = FALSE
+ value = REAGENT_VALUE_RARE
/datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M)
var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS)
@@ -186,6 +188,7 @@
inverse_chem_val = 0.35
inverse_chem = /datum/reagent/fermi/PEsmaller //At really impure vols, it just becomes 100% inverse and shrinks instead.
can_synth = FALSE
+ value = REAGENT_VALUE_VERY_RARE
var/message_spam = FALSE
/datum/reagent/fermi/penis_enlarger/on_mob_metabolize(mob/living/M)
@@ -273,6 +276,7 @@
taste_description = "chinese dragon powder"
metabolization_rate = 0.5
can_synth = FALSE
+ value = REAGENT_VALUE_RARE
/datum/reagent/fermi/PEsmaller/on_mob_life(mob/living/carbon/M)
if(!ishuman(M))
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
index d98ec7059d..48c9ffb7e6 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
@@ -9,6 +9,7 @@
inverse_chem_val = 0.4
inverse_chem = /datum/reagent/impure/yamerol_tox
can_synth = TRUE
+ value = REAGENT_VALUE_VERY_RARE
/datum/reagent/fermi/yamerol/on_mob_life(mob/living/carbon/C)
var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE)
@@ -100,6 +101,7 @@
data = list("grown_volume" = 0, "injected_vol" = 0)
var/borrowed_health
color = "#FFDADA"
+ value = REAGENT_VALUE_COMMON
/datum/reagent/synthtissue/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
if(iscarbon(M))
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm
deleted file mode 100644
index 87f9d71ce2..0000000000
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-/datum/reagent/syndicateadrenals
- name = "Syndicate Adrenaline"
- description = "Regenerates your stamina and increases your reaction time."
- color = "#E62111"
- overdose_threshold = 6
-
-/datum/reagent/syndicateadrenals/on_mob_life(mob/living/M)
- M.adjustStaminaLoss(-5*REM)
- . = ..()
-
-/datum/reagent/syndicateadrenals/on_mob_metabolize(mob/living/M)
- . = ..()
- if(istype(M))
- M.next_move_modifier *= 0.5
- to_chat(M, "You feel an intense surge of energy rushing through your veins.")
-
-/datum/reagent/syndicateadrenals/on_mob_end_metabolize(mob/living/M)
- . = ..()
- if(istype(M))
- M.next_move_modifier *= 2
- to_chat(M, "You feel as though the world around you is going faster.")
-
-/datum/reagent/syndicateadrenals/overdose_start(mob/living/M)
- to_chat(M, "You feel an intense pain in your chest...")
- return
-
-/datum/reagent/syndicateadrenals/overdose_process(mob/living/M)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(!C.undergoing_cardiac_arrest())
- C.set_heartattack(TRUE)
- return
diff --git a/tgstation.dme b/tgstation.dme
index 1434386e79..e1ac9673ff 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -96,6 +96,7 @@
#include "code\__DEFINES\rust_g.config.dm"
#include "code\__DEFINES\rust_g.dm"
#include "code\__DEFINES\say.dm"
+#include "code\__DEFINES\security_levels.dm"
#include "code\__DEFINES\shuttles.dm"
#include "code\__DEFINES\sight.dm"
#include "code\__DEFINES\sound.dm"
@@ -177,6 +178,7 @@
#include "code\_globalvars\logging.dm"
#include "code\_globalvars\misc.dm"
#include "code\_globalvars\regexes.dm"
+#include "code\_globalvars\traits.dm"
#include "code\_globalvars\lists\flavor_misc.dm"
#include "code\_globalvars\lists\maintenance_loot.dm"
#include "code\_globalvars\lists\mapping.dm"
@@ -520,6 +522,7 @@
#include "code\datums\elements\mob_holder.dm"
#include "code\datums\elements\polychromic.dm"
#include "code\datums\elements\spellcasting.dm"
+#include "code\datums\elements\squish.dm"
#include "code\datums\elements\swimming.dm"
#include "code\datums\elements\sword_point.dm"
#include "code\datums\elements\update_icon_blocker.dm"
@@ -2204,7 +2207,6 @@
#include "code\modules\mob\mob_defines.dm"
#include "code\modules\mob\mob_helpers.dm"
#include "code\modules\mob\mob_movement.dm"
-#include "code\modules\mob\mob_movespeed.dm"
#include "code\modules\mob\mob_transformation_simple.dm"
#include "code\modules\mob\say.dm"
#include "code\modules\mob\say_vr.dm"
@@ -2600,6 +2602,14 @@
#include "code\modules\modular_computers\hardware\printer.dm"
#include "code\modules\modular_computers\hardware\recharger.dm"
#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"
+#include "code\modules\movespeed\_movespeed_modifier.dm"
+#include "code\modules\movespeed\modifiers\components.dm"
+#include "code\modules\movespeed\modifiers\innate.dm"
+#include "code\modules\movespeed\modifiers\items.dm"
+#include "code\modules\movespeed\modifiers\misc.dm"
+#include "code\modules\movespeed\modifiers\mobs.dm"
+#include "code\modules\movespeed\modifiers\reagents.dm"
+#include "code\modules\movespeed\modifiers\status_effects.dm"
#include "code\modules\newscaster\_news.dm"
#include "code\modules\newscaster\feed_channel.dm"
#include "code\modules\newscaster\feed_comment.dm"
@@ -2971,6 +2981,7 @@
#include "code\modules\research\nanites\extra_settings\type.dm"
#include "code\modules\research\nanites\nanite_programs\buffing.dm"
#include "code\modules\research\nanites\nanite_programs\healing.dm"
+#include "code\modules\research\nanites\nanite_programs\protocols.dm"
#include "code\modules\research\nanites\nanite_programs\rogue.dm"
#include "code\modules\research\nanites\nanite_programs\sensor.dm"
#include "code\modules\research\nanites\nanite_programs\suppression.dm"
@@ -3309,6 +3320,7 @@
#include "modular_citadel\code\modules\custom_loadout\custom_items.dm"
#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm"
#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm"
+#include "modular_citadel\code\modules\language\sylvan.dm"
#include "modular_citadel\code\modules\mentor\dementor.dm"
#include "modular_citadel\code\modules\mentor\follow.dm"
#include "modular_citadel\code\modules\mentor\mentor.dm"
@@ -3347,7 +3359,6 @@
#include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm"
#include "modular_citadel\code\modules\reagents\chemistry\reagents\healing.dm"
#include "modular_citadel\code\modules\reagents\chemistry\reagents\MKUltra.dm"
-#include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm"
#include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm"
#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm"
#include "modular_citadel\code\modules\reagents\objects\clothes.dm"