diff --git a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm
index 1fb4e60aff..d440e2d15b 100644
--- a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm
+++ b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm
@@ -69,7 +69,7 @@
/turf/open/floor/plasteel/white,
/area/ruin/space/has_grav/powered/ancient_shuttle)
"j" = (
-/obj/machinery/computer/prototype_cloning,
+/obj/machinery/computer/cloning/prototype,
/obj/machinery/light{
dir = 1
},
diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm
index 8c558e000e..2f27c3f747 100644
--- a/_maps/map_files/CogStation/CogStation.dmm
+++ b/_maps/map_files/CogStation/CogStation.dmm
@@ -5534,11 +5534,10 @@
/turf/open/floor/plating,
/area/maintenance/disposal)
"ann" = (
-/obj/effect/turf_decal/plaque{
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/goonplaque{
desc = "It reads 'In honor of spacemen past, whose work allowed this station to find its new home. The fact that you stand on a station originally built light years away is a definitive representation of the ingenuity of the human spirit.' Beneath this is the image of a spaceman rocketing upwards by means of what appears to be a match and flatulence."
},
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"ano" = (
/obj/structure/disposalpipe/segment,
@@ -23461,6 +23460,17 @@
},
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
+"aYG" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/light,
+/obj/structure/disposalpipe/junction/flip{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"aYH" = (
/obj/effect/turf_decal/tile/yellow{
dir = 8
@@ -24359,6 +24369,17 @@
},
/turf/open/floor/carpet,
/area/crew_quarters/bar)
+"bau" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/camera{
+ c_tag = "Aft Maintenance - Port";
+ pixel_x = 22
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/aft)
"bav" = (
/obj/structure/chair/sofa/right,
/obj/machinery/firealarm{
@@ -26737,6 +26758,25 @@
/obj/effect/landmark/start/cargo_technician,
/turf/open/floor/plasteel,
/area/quartermaster/sorting)
+"bga" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/power/apc/highcap/five_k{
+ areastring = "/area/hallway/primary/aft";
+ dir = 1;
+ name = "Aft Primary Hallway APC";
+ pixel_x = 1;
+ pixel_y = 24
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/maintenance/aft)
"bgb" = (
/obj/structure/disposalpipe/sorting/mail{
sortType = 30
@@ -28064,6 +28104,13 @@
/obj/machinery/pipedispenser,
/turf/open/floor/plasteel,
/area/science/mixing)
+"biU" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plating,
+/area/maintenance/aft)
"biV" = (
/turf/closed/wall,
/area/storage/primary)
@@ -29556,6 +29603,13 @@
},
/turf/closed/wall/r_wall,
/area/science/mixing)
+"blU" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/closet/cardboard,
+/turf/open/floor/plating,
+/area/maintenance/aft)
"blV" = (
/obj/machinery/computer/cargo{
dir = 8
@@ -31652,6 +31706,15 @@
dir = 1
},
/area/hallway/secondary/exit)
+"bqq" = (
+/obj/machinery/chem_master,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/camera{
+ c_tag = "Medbay - Chemistry Lab";
+ network = list("ss13","rd")
+ },
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
"bqr" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -31663,8 +31726,13 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bqs" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/turf/open/floor/plating,
/area/maintenance/aft)
"bqt" = (
@@ -31744,16 +31812,8 @@
/turf/open/floor/plasteel,
/area/quartermaster/miningoffice)
"bqz" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/machinery/light,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
+/turf/closed/wall,
+/area/medical/chemistry)
"bqA" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -32318,6 +32378,15 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/civilian)
+"brF" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "chem1";
+ name = "chem lab shutters"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plating,
+/area/medical/chemistry)
"brG" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -32332,20 +32401,8 @@
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/heads/hos)
"brH" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/closet/wardrobe/chemistry_white{
- anchored = 1
- },
-/obj/effect/turf_decal/trimline/yellow/filled/line,
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/showroomfloor,
+/obj/structure/disposalpipe/segment,
+/turf/closed/wall,
/area/medical/chemistry)
"brI" = (
/obj/effect/turf_decal/tile/neutral{
@@ -32364,20 +32421,25 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"brJ" = (
+/obj/machinery/door/firedoor,
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 10
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/door/airlock/maintenance{
+ name = "Chemistry Maintenance";
+ req_access_txt = "5; 33"
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating,
/area/medical/chemistry)
"brK" = (
-/obj/machinery/chem_heater,
-/obj/effect/turf_decal/trimline/yellow/filled/end{
- dir = 1
+/obj/structure/window/reinforced/spawner/east,
+/obj/machinery/chem_dispenser,
+/obj/machinery/airalarm{
+ pixel_y = 24
},
-/turf/open/floor/plasteel/showroomfloor,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
/area/medical/chemistry)
"brL" = (
/obj/structure/disposalpipe/segment,
@@ -32857,11 +32919,14 @@
/turf/open/floor/grass,
/area/hydroponics)
"bsG" = (
-/obj/item/kirbyplants{
- icon_state = "plant-03"
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/table,
+/obj/effect/decal/cleanable/cobweb,
+/obj/structure/sign/poster/contraband/borg_fancy_2{
+ pixel_y = 32
},
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/lobby)
+/turf/open/floor/plasteel,
+/area/maintenance/aft)
"bsH" = (
/obj/structure/table/glass,
/obj/item/storage/box/syringes{
@@ -32899,26 +32964,40 @@
/turf/open/floor/grass,
/area/hydroponics)
"bsL" = (
-/obj/effect/turf_decal/trimline/yellow/filled/end,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 5
+/obj/structure/table,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
},
-/turf/open/floor/plasteel/showroomfloor,
+/obj/machinery/reagentgrinder{
+ pixel_y = 8
+ },
+/obj/item/storage/box/syringes,
+/obj/item/storage/box/beakers{
+ pixel_x = -2;
+ pixel_y = -2
+ },
+/turf/open/floor/plasteel,
/area/medical/chemistry)
"bsM" = (
/turf/closed/wall,
/area/science/robotics/lab)
"bsN" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/eastright{
- base_state = "left";
- dir = 2;
- icon_state = "left";
- name = "Chemistry Desk";
- req_access_txt = "33"
+/obj/structure/table,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/light{
+ dir = 1
},
-/obj/machinery/door/firedoor,
-/turf/open/floor/plating,
+/obj/item/stack/sheet/mineral/plasma,
+/obj/item/stack/cable_coil/random,
+/obj/item/grenade/chem_grenade,
+/obj/item/grenade/chem_grenade,
+/obj/item/grenade/chem_grenade,
+/obj/item/screwdriver{
+ pixel_x = -2;
+ pixel_y = 6
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel,
/area/medical/chemistry)
"bsO" = (
/obj/structure/disposalpipe/segment{
@@ -32926,9 +33005,22 @@
},
/turf/closed/wall/r_wall,
/area/hallway/secondary/civilian)
+"bsP" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/obj/machinery/disposal/bin,
+/obj/effect/turf_decal/stripes/white/full,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
"bsQ" = (
-/obj/machinery/smartfridge/chemistry/preloaded,
-/turf/closed/wall/r_wall,
+/obj/machinery/disposal/bin,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/structure/disposalpipe/trunk,
+/turf/open/floor/plasteel,
/area/medical/chemistry)
"bsR" = (
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
@@ -33130,6 +33222,14 @@
},
/turf/open/floor/plating,
/area/maintenance/department/chapel)
+"bts" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/light_construct/small{
+ icon_state = "bulb-construct-stage1";
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/aft)
"btt" = (
/obj/structure/chair{
dir = 8
@@ -33159,11 +33259,12 @@
/turf/closed/wall,
/area/hallway/secondary/civilian)
"btv" = (
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 8
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/closed/wall/r_wall,
-/area/router/medsci)
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/plating,
+/area/maintenance/aft)
"btw" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -33444,6 +33545,10 @@
"bui" = (
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
+"buj" = (
+/obj/structure/closet/crate,
+/turf/open/floor/plating,
+/area/maintenance/aft)
"buk" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -33458,13 +33563,9 @@
/turf/open/floor/plating,
/area/router)
"bul" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "chem1";
- name = "chem lab shutters"
- },
+/obj/structure/girder,
/turf/open/floor/plating,
-/area/medical/chemistry)
+/area/maintenance/aft)
"bum" = (
/obj/structure/closet/crate,
/obj/effect/spawner/lootdrop/maintenance,
@@ -34093,24 +34194,10 @@
/area/crew_quarters/heads/hop)
"bvK" = (
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "1-4"
},
-/obj/structure/table/glass,
-/obj/item/stack/sheet/mineral/plasma,
-/obj/item/stack/cable_coil/random,
-/obj/item/grenade/chem_grenade,
-/obj/item/grenade/chem_grenade,
-/obj/item/grenade/chem_grenade,
-/obj/item/screwdriver{
- pixel_x = -2;
- pixel_y = 6
- },
-/obj/effect/turf_decal/trimline/yellow/filled/line,
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 1
- },
-/turf/open/floor/plasteel/showroomfloor,
-/area/medical/chemistry)
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"bvL" = (
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
@@ -34291,23 +34378,8 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/structure/table/glass,
-/obj/item/book/manual/wiki/chemistry,
-/obj/item/book/manual/wiki/chemistry{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/glasses/science,
-/obj/item/clothing/glasses/science{
- pixel_x = 2;
- pixel_y = 4
- },
-/obj/effect/turf_decal/trimline/yellow/filled/line,
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 1
- },
-/turf/open/floor/plasteel/showroomfloor,
-/area/medical/chemistry)
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"bwg" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -35438,11 +35510,17 @@
/turf/open/floor/plating,
/area/maintenance/starboard/central)
"byw" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27
+/obj/machinery/airalarm{
+ pixel_y = 24
},
-/turf/open/floor/plasteel/dark,
-/area/medical/chemistry)
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"byx" = (
/obj/machinery/telecomms/processor/preset_three,
/turf/open/floor/circuit/telecomms/mainframe,
@@ -35472,11 +35550,25 @@
/turf/open/floor/plasteel/dark/telecomms,
/area/tcommsat/server)
"byD" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/machinery/camera{
+ c_tag = "Medbay - Lobby";
+ network = list("ss13","rd")
+ },
+/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/medical/chemistry)
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"byE" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -35861,6 +35953,24 @@
},
/turf/open/floor/plasteel/white,
/area/gateway)
+"bzA" = (
+/obj/machinery/power/apc{
+ areastring = "/area/medical/chemistry";
+ dir = 1;
+ name = "Chemistry APC";
+ pixel_y = 24
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"bzB" = (
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 6
@@ -35903,14 +36013,13 @@
/turf/open/floor/plating,
/area/router)
"bzG" = (
-/obj/machinery/chem_dispenser,
-/obj/item/radio/intercom{
- pixel_x = -25
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
},
-/obj/effect/turf_decal/trimline/yellow/filled/end{
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/turf/open/floor/plasteel/showroomfloor,
+/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bzH" = (
/obj/structure/disposalpipe/segment,
@@ -35926,9 +36035,21 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bzJ" = (
-/obj/structure/sign/warning/biohazard,
-/turf/closed/wall/r_wall,
-/area/medical/chemistry)
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"bzK" = (
/obj/machinery/disposal/bin{
name = "Chapel Corpse Delivery"
@@ -36332,27 +36453,60 @@
/turf/open/floor/plasteel,
/area/quartermaster/sorting)
"bAC" = (
-/obj/machinery/chem_master,
-/obj/machinery/requests_console{
- department = "Chemistry";
- departmentType = 2;
- pixel_x = -30;
- receive_ore_updates = 1
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
},
-/obj/effect/turf_decal/trimline/yellow/filled/end,
-/turf/open/floor/plasteel/showroomfloor,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
+"bAD" = (
+/obj/machinery/door/firedoor,
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/delivery,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/window/eastleft{
+ name = "Chemistry Desk";
+ req_access_txt = "33"
+ },
+/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bAE" = (
-/obj/structure/table/glass,
-/obj/item/reagent_containers/glass/beaker/large{
- pixel_x = -3;
- pixel_y = 3
+/obj/structure/disposalpipe/segment,
+/obj/structure/chair/office/light{
+ dir = 8
},
-/obj/item/reagent_containers/glass/beaker/large,
-/obj/item/reagent_containers/dropper,
-/obj/item/reagent_containers/dropper,
-/obj/effect/turf_decal/trimline/yellow/filled/end,
-/turf/open/floor/plasteel/showroomfloor,
+/obj/machinery/button/door{
+ id = "chem1";
+ name = "Shutters Control Button";
+ pixel_x = -8;
+ pixel_y = 24;
+ req_access_txt = "29"
+ },
+/obj/effect/landmark/start/chemist,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 5;
+ pixel_y = 32
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bAF" = (
/obj/machinery/gateway/centerstation,
@@ -36703,10 +36857,23 @@
/turf/open/floor/plating,
/area/maintenance/disposal)
"bBs" = (
-/obj/structure/sign/warning/nosmoking{
- pixel_y = -32
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/dark,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bBt" = (
/obj/structure/cable{
@@ -36890,16 +37057,25 @@
name = "Power Monitoring"
})
"bBP" = (
-/obj/structure/disposalpipe/segment,
-/turf/closed/wall,
-/area/science/robotics/lab)
-"bBQ" = (
-/obj/machinery/door/airlock/research{
- name = "Mech Bay";
- req_access_txt = "29"
+/obj/machinery/door/firedoor,
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
+/obj/machinery/door/window/eastright{
+ name = "Chemistry Desk";
+ req_access_txt = "33"
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
+"bBQ" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/obj/machinery/light_switch{
+ pixel_x = -24
+ },
+/turf/open/floor/plasteel/showroomfloor,
+/area/medical/medbay/central)
"bBR" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -37049,6 +37225,29 @@
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hop)
+"bCf" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/landmark/start/chemist,
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
+"bCg" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/landmark/start/chemist,
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"bCh" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -37370,6 +37569,22 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
+"bCY" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/structure/sign/warning/nosmoking{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"bCZ" = (
/obj/machinery/conveyor{
dir = 8;
@@ -38634,6 +38849,20 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/sorting)
+"bFE" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/structure/table/glass,
+/obj/item/reagent_containers/glass/beaker/large{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/reagent_containers/glass/beaker/large,
+/obj/item/reagent_containers/dropper,
+/obj/item/reagent_containers/dropper,
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"bFF" = (
/obj/machinery/light_switch{
pixel_y = 24
@@ -38643,6 +38872,10 @@
},
/turf/open/floor/plating,
/area/storage/tech)
+"bFG" = (
+/obj/effect/turf_decal/tile/blue,
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"bFH" = (
/obj/machinery/power/apc{
name = "Customs APC";
@@ -38907,20 +39140,9 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bFZ" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{
- dir = 1
- },
-/obj/machinery/airalarm{
- pixel_y = 24
- },
+/obj/machinery/chem_heater,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/chemistry)
"bGa" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel/dark,
@@ -39633,48 +39855,26 @@
/turf/open/floor/plating,
/area/crew_quarters/locker)
"bHC" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/machinery/firealarm{
- pixel_y = 26
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
},
+/obj/effect/turf_decal/tile/blue,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/chemistry)
+"bHD" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/maintenance/aft)
"bHE" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
+/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{
- dir = 1
- },
-/obj/machinery/camera{
- c_tag = "Medbay - Starboard";
- network = list("ss13","rd")
- },
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
},
+/obj/effect/turf_decal/tile/blue,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/chemistry)
"bHF" = (
/obj/structure/table/reinforced,
/obj/item/assembly/timer{
@@ -39696,23 +39896,11 @@
/turf/open/floor/plasteel/white,
/area/science/mixing)
"bHG" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/plasteel,
+/area/maintenance/aft)
"bHH" = (
/obj/structure/table,
/obj/machinery/recharger,
@@ -39727,33 +39915,15 @@
},
/area/gateway)
"bHI" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bHJ" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 10
+/obj/item/kirbyplants{
+ icon_state = "plant-03"
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bHK" = (
/obj/structure/sign/warning/biohazard,
/turf/closed/wall,
@@ -39926,6 +40096,10 @@
/obj/structure/window/reinforced,
/turf/open/floor/plasteel/dark,
/area/science/robotics/lab)
+"bIi" = (
+/obj/machinery/smartfridge/chemistry/preloaded,
+/turf/closed/wall,
+/area/medical/chemistry)
"bIj" = (
/obj/machinery/door/window/southright,
/turf/open/floor/plasteel/dark,
@@ -40011,15 +40185,15 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bIt" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 5
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/chemistry)
"bIu" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/medical{
@@ -40152,6 +40326,26 @@
/obj/item/extinguisher,
/turf/open/floor/plasteel,
/area/science/xenobiology)
+"bIL" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/orange/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
+"bIM" = (
+/obj/machinery/shower{
+ desc = "The HS-451. Standard Nanotrasen Hygiene Division design, although it looks like this one was installed more recently.";
+ dir = 8;
+ name = "emergency shower";
+ pixel_y = -4
+ },
+/obj/structure/window/reinforced/spawner/north,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
"bIN" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -40328,6 +40522,10 @@
/obj/structure/window/reinforced/spawner,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
+"bJd" = (
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"bJe" = (
/obj/structure/closet/secure_closet/personal/patient,
/obj/effect/turf_decal/tile/blue,
@@ -40342,20 +40540,14 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bJf" = (
-/obj/structure/closet/secure_closet/personal/patient,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
+/obj/machinery/door/airlock/maintenance{
+ name = "Chemistry Maintenance";
+ req_access_txt = "5; 33"
},
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/window/reinforced/spawner,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
"bJg" = (
/obj/structure/table,
/obj/effect/turf_decal/tile/red{
@@ -43904,33 +44096,11 @@
/turf/open/floor/plasteel/showroomfloor,
/area/medical/morgue)
"bQp" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/obj/machinery/power/apc{
- areastring = "/area/medical/chemistry";
- dir = 1;
- name = "Chemistry APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/table/glass,
-/obj/machinery/reagentgrinder{
- pixel_y = 8
- },
-/obj/item/storage/box/syringes,
-/obj/item/storage/box/beakers{
- pixel_x = -2;
- pixel_y = -2
- },
-/obj/effect/turf_decal/trimline/yellow/filled/end{
- dir = 8
- },
-/turf/open/floor/plasteel/showroomfloor,
-/area/medical/chemistry)
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/reagent_dispensers/fueltank,
+/obj/machinery/light/small,
+/turf/open/floor/plasteel,
+/area/maintenance/aft)
"bQq" = (
/obj/effect/turf_decal/tile/yellow{
dir = 1
@@ -47830,11 +48000,11 @@
name = "Research Sector"
})
"bXL" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/lobby)
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/rack,
+/obj/item/storage/belt/utility,
+/turf/open/floor/plasteel,
+/area/maintenance/aft)
"bXM" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/conveyor{
@@ -48328,6 +48498,12 @@
},
/turf/open/floor/plasteel/dark,
/area/science/robotics/lab)
+"bYK" = (
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 5
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"bYL" = (
/obj/effect/turf_decal/tile/purple{
dir = 4
@@ -48958,6 +49134,18 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos)
+"caj" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"cak" = (
/obj/structure/sign/warning/fire,
/turf/closed/wall/r_wall,
@@ -49056,9 +49244,12 @@
/turf/open/floor/engine/n2,
/area/engine/atmos)
"caz" = (
-/obj/structure/disposalpipe/segment,
-/turf/closed/wall,
-/area/science/explab)
+/obj/machinery/door/airlock/research{
+ name = "Mech Bay";
+ req_access_txt = "29"
+ },
+/turf/open/floor/plasteel/dark,
+/area/science/robotics/mechbay)
"caA" = (
/obj/structure/closet/radiation,
/turf/open/floor/plasteel,
@@ -49111,6 +49302,19 @@
},
/turf/open/floor/plasteel/dark,
/area/science/explab)
+"caH" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 6
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"caI" = (
/obj/structure/table/reinforced,
/obj/item/integrated_electronics/analyzer,
@@ -49359,6 +49563,17 @@
/obj/item/healthanalyzer,
/turf/open/floor/engine,
/area/science/explab)
+"cbm" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
+ },
+/obj/machinery/door/airlock/maintenance{
+ name = "Medbay Maintenance";
+ req_access_txt = "5"
+ },
+/turf/open/floor/plating,
+/area/medical/medbay/central)
"cbn" = (
/obj/structure/window/reinforced{
dir = 4;
@@ -49399,6 +49614,28 @@
/obj/item/pen,
/turf/open/floor/engine,
/area/science/explab)
+"cbr" = (
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
+"cbs" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"cbt" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/engine,
@@ -49536,6 +49773,26 @@
/area/engine/supermatter{
name = "Thermo-Electric Generator"
})
+"cbK" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/sign/departments/chemistry{
+ pixel_x = 32;
+ pixel_y = -32
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"cbL" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -49799,13 +50056,11 @@
/turf/open/floor/plasteel/stairs,
/area/maintenance/department/chapel)
"ccm" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "robotics2";
- name = "robotics lab shutters"
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
},
-/turf/open/floor/plating,
-/area/router/medsci)
+/turf/closed/wall/r_wall,
+/area/science/robotics/lab)
"ccn" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/conveyor/auto{
@@ -50647,14 +50902,52 @@
/turf/closed/wall/r_wall,
/area/engine/teg_hot)
"cdW" = (
-/obj/machinery/airalarm{
- pixel_y = 24
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 10
},
-/obj/machinery/light{
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "robotics2";
+ name = "robotics lab shutters"
+ },
+/turf/open/floor/plating,
+/area/science/robotics/lab)
+"cdX" = (
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/obj/structure/chair/office/light{
+ dir = 8
+ },
+/obj/effect/landmark/start/chemist,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/item/radio/intercom{
+ broadcasting = 1;
+ frequency = 1485;
+ listening = 0;
+ name = "Station Intercom (Medical)";
+ pixel_y = -30
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
+"cdY" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/lobby)
+/area/medical/medbay/central)
"cdZ" = (
/turf/closed/wall/r_wall,
/area/medical/medbay/lobby)
@@ -52596,6 +52889,18 @@
},
/turf/open/floor/wood,
/area/library)
+"chV" = (
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 26
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"chW" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -53003,21 +53308,20 @@
/turf/open/floor/plasteel,
/area/quartermaster/warehouse)
"ciQ" = (
-/obj/structure/cable{
- icon_state = "0-4"
+/obj/structure/disposalpipe/segment{
+ dir = 10
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "1-2"
},
-/obj/machinery/power/apc/highcap/five_k{
- areastring = "/area/hallway/primary/aft";
- dir = 1;
- name = "Aft Primary Hallway APC";
- pixel_x = 1;
- pixel_y = 24
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
},
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/obj/machinery/atmospherics/pipe/manifold/orange/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"ciR" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/tile/red,
@@ -53752,6 +54056,14 @@
/area/engine/engineering{
name = "Engine Room"
})
+"ckp" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/landmark/start/chemist,
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"ckq" = (
/obj/structure/closet/crate/hydroponics,
/obj/machinery/light_switch{
@@ -53886,9 +54198,15 @@
/turf/open/floor/plasteel,
/area/engine/teg_cold)
"ckD" = (
-/obj/machinery/chem_master,
-/obj/effect/turf_decal/trimline/yellow/filled/end,
-/turf/open/floor/plasteel/showroomfloor,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/sign/warning/fire{
+ pixel_x = 32;
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"ckE" = (
/obj/effect/decal/cleanable/dirt,
@@ -54134,6 +54452,17 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"clc" = (
+/obj/machinery/vending/wardrobe/chem_wardrobe,
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"cld" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -54760,6 +55089,14 @@
},
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/bar)
+"cmB" = (
+/obj/structure/window/reinforced/spawner/west,
+/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/northright{
+ name = "Emergency Shower"
+ },
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
"cmC" = (
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 4
@@ -54856,6 +55193,23 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/miningoffice)
+"cmK" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"cmL" = (
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
@@ -54980,12 +55334,20 @@
/turf/open/floor/plasteel,
/area/security/checkpoint/supply)
"cmU" = (
-/obj/machinery/camera{
- c_tag = "Medbay - Lobby";
- network = list("ss13","rd")
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/lobby)
+/area/medical/chemistry)
"cmV" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -55152,10 +55514,16 @@
name = "Research Observatory"
})
"cnk" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/light,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue,
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"cnl" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 4
@@ -55291,6 +55659,21 @@
/area/science/server{
name = "Computer Core"
})
+"cnz" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{
+ dir = 1
+ },
+/obj/structure/sign/departments/chemistry{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"cnA" = (
/obj/effect/turf_decal/tile/brown{
dir = 4
@@ -55646,6 +56029,21 @@
},
/turf/open/floor/plasteel,
/area/engine/teg_hot)
+"col" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
+"com" = (
+/obj/machinery/chem_master,
+/obj/effect/turf_decal/stripes/end{
+ dir = 8
+ },
+/obj/structure/window/reinforced/spawner,
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
"con" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -55731,6 +56129,12 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/heads/chief)
+"cov" = (
+/obj/structure/sign/warning/nosmoking{
+ pixel_y = -32
+ },
+/turf/closed/wall,
+/area/medical/medbay/central)
"cow" = (
/obj/machinery/door/airlock/external/glass{
name = "Asteroid Mining Access";
@@ -55750,6 +56154,16 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/miningoffice)
+"cox" = (
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"coy" = (
/obj/structure/sign/poster/official/safety_internals{
pixel_x = -32
@@ -55855,16 +56269,25 @@
/turf/open/floor/engine,
/area/science/explab)
"coH" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 10
+/obj/machinery/door/firedoor,
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "robotics2";
- name = "robotics lab shutters"
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/open/floor/plating,
-/area/router/medsci)
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/research{
+ name = "Robotics Lab";
+ req_access_txt = "29"
+ },
+/turf/open/floor/plasteel/dark,
+/area/science/robotics/lab)
"coI" = (
/obj/structure/closet/secure_closet/medical1,
/obj/effect/turf_decal/tile/yellow{
@@ -56391,6 +56814,14 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
+"cpI" = (
+/obj/machinery/chem_dispenser,
+/obj/effect/turf_decal/stripes/end{
+ dir = 4
+ },
+/obj/structure/window/reinforced/spawner,
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
"cpJ" = (
/turf/closed/wall/r_wall/rust,
/area/quartermaster/office)
@@ -57178,6 +57609,29 @@
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel/dark,
/area/science/robotics/mechbay)
+"crg" = (
+/obj/machinery/door/firedoor,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/machinery/door/airlock/medical/glass{
+ name = "Chemistry Lab";
+ req_access_txt = "5; 33"
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"crh" = (
/obj/machinery/mass_driver{
dir = 1;
@@ -57231,6 +57685,15 @@
},
/turf/open/floor/plating,
/area/engine/teg_cold)
+"crn" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "chem1";
+ name = "chem lab shutters"
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/turf/open/floor/plating,
+/area/medical/chemistry)
"cro" = (
/turf/closed/wall/r_wall/rust,
/area/maintenance/starboard/aft)
@@ -57989,8 +58452,22 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"csK" = (
-/turf/closed/wall/r_wall,
-/area/medical/chemistry)
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/machinery/door/window/northright{
+ name = "Medbay Desk";
+ req_access_txt = "5"
+ },
+/obj/item/clipboard,
+/obj/item/clothing/glasses/hud/health,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/item/pen,
+/obj/item/clothing/glasses/hud/health,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"csL" = (
/obj/effect/landmark/xmastree/rdrod,
/turf/open/floor/carpet{
@@ -58817,16 +59294,14 @@
/turf/open/floor/plating,
/area/hallway/primary/aft)
"cup" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/closet/secure_closet/chemical,
-/obj/effect/turf_decal/trimline/yellow/filled/line,
-/obj/effect/turf_decal/trimline/yellow/filled/line{
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/turf/open/floor/plasteel/showroomfloor,
-/area/medical/chemistry)
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"cuq" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -59360,19 +59835,12 @@
/turf/open/floor/plasteel/dark/side,
/area/science/robotics/lab)
"cvu" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
},
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/obj/machinery/disposal/bin,
-/obj/effect/turf_decal/trimline/yellow/filled/line,
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 1
- },
-/turf/open/floor/plasteel/showroomfloor,
-/area/medical/chemistry)
+/obj/effect/turf_decal/tile/blue,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"cvv" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -59687,19 +60155,24 @@
/turf/open/floor/plasteel/dark/side,
/area/science/robotics/lab)
"cvR" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 26
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
},
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 8
+/obj/structure/disposalpipe/sorting/mail/flip{
+ sortType = 23
},
-/obj/effect/turf_decal/trimline/yellow/filled/line{
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/floor/plasteel/showroomfloor,
-/area/medical/chemistry)
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"cvS" = (
/obj/machinery/vending/wardrobe/robo_wardrobe,
/turf/open/floor/plasteel/dark,
@@ -60024,18 +60497,21 @@
/turf/open/floor/plasteel,
/area/engine/workshop)
"cws" = (
+/obj/structure/disposalpipe/segment,
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "1-2"
},
-/obj/machinery/vending/wardrobe/chem_wardrobe,
-/obj/effect/turf_decal/trimline/yellow/filled/line,
-/obj/effect/turf_decal/trimline/yellow/filled/line{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 6
+/obj/machinery/light_switch{
+ pixel_x = -24
},
-/turf/open/floor/plasteel/showroomfloor,
+/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"cwt" = (
/obj/structure/disposalpipe/segment,
@@ -60327,26 +60803,40 @@
/turf/open/floor/plasteel,
/area/quartermaster/warehouse)
"cxf" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/medical/chemistry)
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/cyan/hidden,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"cxg" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/medical/chemistry)
-"cxh" = (
-/obj/machinery/chem_dispenser,
-/obj/effect/turf_decal/trimline/yellow/filled/end{
- dir = 1
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
},
-/turf/open/floor/plasteel/showroomfloor,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
+"cxh" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/landmark/start/chemist,
+/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"cxi" = (
/obj/structure/rack,
@@ -60983,19 +61473,11 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"cyu" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/structure/closet/wardrobe/chemistry_white{
+ anchored = 1
},
-/obj/machinery/camera{
- c_tag = "Aft Maintenance - Port";
- pixel_x = 22
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"cyv" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -61059,13 +61541,38 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/lobby)
"cyB" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/medical_green_cross{
+ pixel_y = 32
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
+"cyC" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"cyD" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -61080,50 +61587,32 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/lobby)
"cyF" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
+/obj/structure/closet/secure_closet/chemical,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/lobby)
+/area/medical/chemistry)
"cyG" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/lobby)
+/obj/machinery/chem_master,
+/turf/open/floor/plasteel/showroomfloor,
+/area/medical/medbay/central)
"cyH" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/maintenance{
- name = "Aft Maintenance";
- req_access_txt = "12"
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/medical/medbay/lobby)
-"cyI" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/orange/hidden{
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
+"cyI" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"cyJ" = (
/obj/effect/turf_decal/tile/green{
dir = 8
@@ -61140,41 +61629,37 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/lobby)
"cyL" = (
-/obj/structure/closet/cardboard,
-/obj/structure/disposalpipe/segment{
+/obj/effect/turf_decal/tile/blue,
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 5
},
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"cyM" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cyN" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+/obj/structure/closet/secure_closet/personal/patient,
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/purple{
dir = 8
},
-/obj/machinery/door/airlock/maintenance{
- name = "Chemistry Maintenance";
- req_access_txt = "5; 33"
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/turf/open/floor/plating,
-/area/medical/chemistry)
+/obj/structure/window/reinforced/spawner,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
+"cyN" = (
+/obj/machinery/chem_dispenser/apothecary,
+/obj/machinery/airalarm{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel/showroomfloor,
+/area/medical/medbay/central)
"cyO" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -61539,15 +62024,22 @@
/turf/open/floor/plasteel/white,
/area/crew_quarters/heads/cmo)
"czv" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/effect/turf_decal/tile/yellow{
dir = 8
},
-/obj/machinery/door/airlock/medical/glass{
- name = "Chemistry Lab";
- req_access_txt = "5; 33"
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
},
-/turf/open/floor/plasteel/dark,
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = -28
+ },
+/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"czw" = (
/obj/machinery/atmospherics/pipe/simple/orange/hidden{
@@ -61595,18 +62087,12 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hor)
"czB" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/maintenance{
- name = "Medbay Maintenance";
- req_access_txt = "5"
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
},
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/obj/effect/turf_decal/tile/blue,
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"czC" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -61640,27 +62126,9 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"czF" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/structure/disposalpipe/sorting/mail/flip{
- sortType = 23
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/obj/structure/cable{
- icon_state = "1-4"
- },
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/chemistry)
"czG" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel/showroomfloor,
@@ -61710,7 +62178,15 @@
/turf/open/floor/plasteel/white,
/area/medical/genetics)
"czM" = (
-/turf/open/floor/plasteel/dark,
+/obj/machinery/requests_console{
+ department = "Chemistry";
+ departmentType = 2;
+ name = "Chemistry RC";
+ pixel_x = 30;
+ pixel_y = 0;
+ receive_ore_updates = 1
+ },
+/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"czN" = (
/obj/structure/closet/crate/trashcart,
@@ -61736,12 +62212,12 @@
/turf/open/floor/plating,
/area/maintenance/disposal)
"czP" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/machinery/light/small{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
-/turf/open/floor/plasteel/dark,
-/area/medical/chemistry)
+/turf/open/floor/plasteel/showroomfloor,
+/area/medical/medbay/central)
"czQ" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/disposalpipe/segment,
@@ -61818,28 +62294,14 @@
/turf/open/floor/plasteel,
/area/maintenance/disposal)
"czW" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
},
-/obj/effect/turf_decal/tile/purple{
+/obj/structure/chair/office/light{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
-/obj/machinery/door/airlock/medical/glass{
- name = "Chemistry Lab";
- req_access_txt = "5; 33"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
+/turf/open/floor/plasteel/showroomfloor,
+/area/medical/medbay/central)
"czX" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/orange/hidden,
@@ -61898,17 +62360,11 @@
/turf/open/floor/plasteel,
/area/maintenance/disposal)
"cAc" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
},
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/hidden,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel/white,
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
/area/medical/medbay/central)
"cAd" = (
/obj/structure/disposalpipe/segment,
@@ -62033,23 +62489,17 @@
/turf/open/floor/plating,
/area/maintenance/disposal)
"cAo" = (
-/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/obj/effect/turf_decal/tile/blue,
-/obj/machinery/door/window/northright{
- name = "Medbay Desk";
- req_access_txt = "5"
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
},
-/obj/item/clipboard,
-/obj/item/clothing/glasses/hud/health,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/obj/item/paper/fluff/cogstation/sleepers,
-/obj/item/pen,
-/obj/item/clothing/glasses/hud/health,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/lobby)
+/area/medical/medbay/central)
"cAp" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
@@ -64080,6 +64530,40 @@
},
/turf/open/floor/engine,
/area/gateway)
+"cDL" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/machinery/atmospherics/pipe/manifold/orange/hidden{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Medbay - Apothecary";
+ dir = 8;
+ network = list("ss13","medbay");
+ pixel_y = -22
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
+"cDM" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/obj/structure/table/glass,
+/obj/item/book/manual/wiki/chemistry,
+/obj/item/book/manual/wiki/chemistry{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/clothing/glasses/science,
+/obj/item/clothing/glasses/science{
+ pixel_x = 2;
+ pixel_y = 4
+ },
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
"cDN" = (
/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 8
@@ -65499,25 +65983,13 @@
/turf/open/floor/plasteel/dark,
/area/science/robotics/lab)
"cFX" = (
-/obj/machinery/door/firedoor,
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/chem_heater,
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 26
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
- },
-/obj/machinery/door/airlock/research{
- name = "Robotics Lab";
- req_access_txt = "29"
- },
-/turf/open/floor/plasteel/dark,
-/area/router/medsci)
+/turf/open/floor/plasteel/showroomfloor,
+/area/medical/medbay/central)
"cFY" = (
/turf/open/floor/plasteel,
/area/router/air)
@@ -65985,6 +66457,14 @@
/obj/machinery/portable_atmospherics/pump,
/turf/open/floor/engine,
/area/science/storage)
+"cGI" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/chair/office/light,
+/obj/effect/landmark/start/chemist,
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
"cGJ" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/obj/effect/turf_decal/stripes/line{
@@ -66054,6 +66534,17 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"cGU" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
+ },
+/obj/machinery/door/airlock/medical{
+ name = "Morgue";
+ req_access_txt = "5;6"
+ },
+/turf/open/floor/plasteel/showroomfloor,
+/area/medical/morgue)
"cGV" = (
/obj/machinery/portable_atmospherics/canister/toxins,
/obj/effect/turf_decal/delivery,
@@ -66572,6 +67063,19 @@
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/turf/open/floor/plasteel,
/area/security/checkpoint/supply)
+"cHW" = (
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/delivery,
+/obj/structure/table/reinforced,
+/obj/machinery/door/window/eastright{
+ base_state = "left";
+ dir = 2;
+ icon_state = "left";
+ name = "Chemistry Desk";
+ req_access_txt = "33"
+ },
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
"cHX" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -67895,24 +68399,14 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/lobby)
"cKi" = (
-/obj/machinery/button/door{
- id = "chem1";
- name = "Shutters Control Button";
- pixel_x = -8;
- pixel_y = 24;
- req_access_txt = "29"
- },
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 5
- },
-/obj/effect/turf_decal/trimline/yellow/filled/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/orange/hidden{
- dir = 1
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/obj/machinery/door/airlock/medical{
+ name = "Apothecary";
+ req_access_txt = "5"
},
/turf/open/floor/plasteel/showroomfloor,
-/area/medical/chemistry)
+/area/medical/medbay/central)
"cKj" = (
/obj/structure/closet/secure_closet/CMO,
/obj/effect/turf_decal/tile/blue,
@@ -68143,6 +68637,24 @@
/obj/structure/closet/wardrobe/yellow,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"cKH" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/machinery/airalarm{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"cKI" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -69407,17 +69919,24 @@
/turf/open/floor/plating/airless,
/area/router/aux)
"cNJ" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
},
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{
+ dir = 1
+ },
+/obj/machinery/camera{
+ c_tag = "Medbay - Starboard";
+ network = list("ss13","rd")
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"cNK" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/on{
dir = 4
@@ -69499,6 +70018,19 @@
/obj/item/stack/sheet/plasteel/fifty,
/turf/open/floor/plating,
/area/quartermaster/miningdock/airless)
+"cNV" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/cyan/hidden,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"cNW" = (
/obj/structure/lattice/catwalk,
/obj/machinery/camera{
@@ -70192,30 +70724,6 @@
"cPw" = (
/turf/open/floor/plasteel/dark,
/area/science/robotics/mechbay)
-"cPx" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
- },
-/obj/structure/sign/poster/official/medical_green_cross{
- pixel_y = 32
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
"cPy" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -70412,16 +70920,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"cPP" = (
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/floor/plasteel/showroomfloor,
-/area/medical/chemistry)
"cPQ" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -94786,7 +95284,7 @@ bYv
bYv
cio
cct
-caz
+cct
bOO
cHq
cHs
@@ -95043,7 +95541,7 @@ cct
bYo
ckk
bYF
-bBP
+cct
bFu
bIc
btn
@@ -95300,7 +95798,7 @@ bYv
bYp
bYx
cPw
-bBQ
+caz
ccd
bId
cpw
@@ -95557,7 +96055,7 @@ bYv
bYq
cPv
bYH
-bsM
+bYv
bDT
bIe
bYB
@@ -95814,7 +96312,7 @@ bYv
cgr
bYy
crf
-bsM
+bYv
bFx
bIf
bto
@@ -96071,7 +96569,7 @@ bYv
bYv
cwb
bYv
-bsM
+bYv
csV
bIe
bYB
@@ -97104,10 +97602,10 @@ bFC
bIj
ccd
bJD
-btv
-cFX
ccm
-cOI
+coH
+bJH
+bIk
cOI
cOI
cOI
@@ -97361,7 +97859,7 @@ clv
bsU
ccd
bJE
-btv
+ccm
cOx
cOA
cOE
@@ -97618,7 +98116,7 @@ bZT
bsU
ccd
ckb
-coH
+cdW
cOy
cOB
cOF
@@ -97875,7 +98373,7 @@ cum
bIj
ccd
cvS
-cOI
+bIk
cOz
cOC
cOG
@@ -98132,7 +98630,7 @@ bIk
bIk
ccB
bJH
-cOI
+bIk
cGb
bRI
cOH
@@ -99152,7 +99650,7 @@ bRJ
bth
bTB
cek
-cAo
+csK
cKk
cKl
cKm
@@ -100690,9 +101188,9 @@ bXi
bXq
caQ
bXC
-bXL
-cyF
-bst
+bvK
+bHI
+bYK
buK
bst
bst
@@ -100947,9 +101445,9 @@ buF
bDm
bqe
ceY
-bst
-cyG
-bst
+bwf
+bHJ
+cbr
cDE
cDG
cEa
@@ -101204,9 +101702,9 @@ bbh
bbh
bqm
bqm
-cdW
-cyG
+byw
bst
+cbr
cDF
cDJ
cKC
@@ -101461,9 +101959,9 @@ bbh
bpA
bXz
bqm
-cmU
-cyG
-bst
+byD
+bHJ
+cbs
buS
cDZ
czg
@@ -101716,11 +102214,11 @@ ccp
cJe
bbh
bpB
-bPw
+btv
bqm
-bsG
-cyG
-bsG
+bzJ
+bst
+cbK
buS
bAJ
czh
@@ -101973,11 +102471,11 @@ ccw
csM
cyo
cyt
-bPw
-bqm
-bqm
-cyH
-bqm
+blU
+bqz
+bAD
+bIi
+bBP
buS
caR
czi
@@ -102229,18 +102727,18 @@ cIH
cgv
coE
bxM
-cyu
-cNJ
-cyB
-cyB
-cyI
-cyL
+bau
+bXt
+brH
+bAE
+bIt
+cdX
buS
buS
buS
buS
buS
-bFZ
+cnz
cEZ
bJa
aKZ
@@ -102486,18 +102984,18 @@ cIF
cgB
bqr
bbh
+bga
+bqs
+brJ
+bBs
+bIL
ciQ
-bpD
-bpD
-bpD
-bpD
-cyM
-cyB
-cyB
-cyB
-cyB
-czB
-czF
+cmK
+cws
+czv
+cmU
+crg
+cvR
cFd
bEl
aMm
@@ -102744,17 +103242,17 @@ cgB
bqx
bbh
bPw
-bsZ
-bsZ
-bsZ
-bsZ
-csK
-csK
-csK
-csK
-csK
-csK
-bHC
+bqz
+bqz
+bzA
+bFE
+bFG
+col
+cxh
+czB
+cnk
+bqz
+cKH
cFe
cFk
cFm
@@ -103001,17 +103499,17 @@ cgB
bqr
bbh
bPw
-bsZ
-bim
-bim
-bim
-csK
-bQp
-byw
+bqz
+bqq
bzG
-bAC
-csK
-bHG
+bFZ
+ckp
+com
+cyu
+czF
+cDM
+crn
+cxf
cFf
bEl
aOF
@@ -103258,17 +103756,17 @@ cgB
bqr
bbh
bPw
-bsZ
-bim
-bim
-bim
-bul
-bvK
+bqz
+brK
+bCf
+bJd
+ckD
+cpI
+cyF
czM
-czM
-czM
-bsN
-bHG
+cGI
+cHW
+cxg
cFf
bJb
bJJ
@@ -103515,17 +104013,17 @@ cgB
bqr
bcT
bPw
-bsZ
-bim
-bim
-bim
-bul
-bwf
-byD
-brK
-bAE
-bsQ
-bHE
+bqz
+bsL
+bzG
+bFG
+clc
+bqz
+bqz
+bqz
+bqz
+bqz
+cNJ
cAm
cAt
cAv
@@ -103769,20 +104267,20 @@ bbh
bdF
cIL
ciF
-bqz
-bcT
-bPw
-bsZ
-bim
-bim
-bim
-bul
-cup
-cxf
-czM
-czM
+aYG
+bdu
+biU
+brF
bsN
-bHG
+bCg
+bHC
+cmB
+bqz
+cyG
+czP
+bBQ
+cKi
+cNV
cFf
bJc
bJL
@@ -104029,17 +104527,17 @@ ciW
bqC
bdu
bXt
-bqs
-cnk
-cnk
-cnk
csi
-cvu
-cxf
-cxh
-ckD
-csK
-cPx
+bsP
+bAC
+bHC
+bIM
+bqz
+cyN
+czW
+cFX
+bRI
+cyB
cFh
bJe
cRb
@@ -104286,17 +104784,17 @@ cjV
bdu
bdu
bXu
-bsZ
-bim
-bim
-bim
-bul
-cws
-cxg
-czM
-bBs
-csK
-bHI
+bqz
+bsQ
+bCY
+bHE
+bqz
+bqz
+bMj
+cAc
+cov
+bMj
+cyC
cFf
btp
bJN
@@ -104543,17 +105041,17 @@ cgB
bTv
bcT
bQE
-bsZ
-bim
-bim
-bim
-bul
-brH
-brJ
-czP
-czP
-czW
-cAc
+bqz
+bqz
+bqz
+bJf
+bqz
+caj
+cdY
+cAo
+cdY
+cup
+cyH
cFi
bMF
bNF
@@ -104800,19 +105298,19 @@ cgB
bYW
bcT
bQE
-bsZ
-bim
-bim
-bim
-csK
-cKi
-cvR
-cPP
-bsL
-bul
-bHJ
-bIt
-bJf
+bsV
+bsG
+bHD
+bHD
+bMj
+caH
+chV
+cDL
+cox
+cvu
+cyI
+cyL
+cyM
bJO
cKp
cHS
@@ -105057,16 +105555,16 @@ cgB
bbh
bbh
bQE
-bsZ
-bim
-bim
-bim
-csK
-cyN
-csK
-bzJ
-czv
-csK
+bsV
+bts
+bHG
+bQp
+bMj
+cbm
+byQ
+bHK
+cGU
+byQ
bHK
bIu
bJh
@@ -105314,11 +105812,11 @@ cgB
bbh
bpm
bQE
-bsZ
-bim
-bim
-bim
-bsZ
+bsV
+buj
+bpD
+bXL
+bsV
cyO
byN
bzK
@@ -105571,11 +106069,11 @@ cmn
bWZ
bXj
bXv
-bsZ
-bsZ
-bsZ
-bsZ
-bsZ
+bsV
+bul
+bpD
+bsV
+bsV
cyP
byQ
bzS
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index eda78e4206..588b55679c 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -263,15 +263,484 @@
},
/turf/open/floor/plasteel,
/area/maintenance/department/engine)
+"aaD" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/structure/closet/crate{
+ icon_state = "crateopen"
+ },
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
+ },
+/obj/item/clothing/mask/balaclava,
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"aaE" = (
+/obj/machinery/light/small,
+/obj/machinery/space_heater,
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"aaF" = (
+/turf/closed/wall,
+/area/crew_quarters/fitness/pool)
+"aaG" = (
+/obj/structure/closet,
+/obj/item/weldingtool,
+/obj/item/crowbar,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"aaH" = (
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"aaI" = (
+/obj/structure/closet/secure_closet/personal,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/fitness/pool)
+"aaJ" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
+"aaK" = (
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#706891"
+ },
+/obj/structure/closet/secure_closet/personal,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/fitness/pool)
+"aaL" = (
+/turf/open/floor/plasteel/yellowsiding,
+/area/crew_quarters/fitness/pool)
+"aaM" = (
+/turf/open/floor/plasteel/yellowsiding/corner{
+ icon_state = "yellowcornersiding";
+ dir = 8
+ },
+/area/crew_quarters/fitness/pool)
+"aaN" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaO" = (
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
+"aaP" = (
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 8
+ },
+/area/crew_quarters/fitness/pool)
+"aaQ" = (
+/obj/structure/table,
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/item/storage/box/lights/mixed,
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"aaR" = (
+/obj/machinery/airalarm{
+ pixel_y = 22
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaS" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaT" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Pool"
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaU" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/walk{
+ pixel_y = 32
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaV" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaW" = (
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaX" = (
+/obj/structure/bed,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/fitness/pool)
+"aaY" = (
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
+"aaZ" = (
+/obj/structure/bed,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/crew_quarters/fitness/pool)
+"aba" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/recreation)
+"abb" = (
+/obj/machinery/camera{
+ c_tag = "Fitness Room"
+ },
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_y = 32
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/recreation)
+"abc" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/yellowsiding/corner,
+/area/crew_quarters/fitness/pool)
+"abd" = (
+/obj/structure/closet/lasertag/red,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abe" = (
+/obj/machinery/vending/kink,
+/obj/machinery/status_display/evac{
+ pixel_x = 32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
"abf" = (
/obj/structure/bed,
/turf/open/floor/plating,
/area/maintenance/department/science)
+"abg" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abh" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/closet/lasertag/blue,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abi" = (
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abj" = (
+/obj/machinery/pool/controller,
+/turf/open/floor/plasteel/yellowsiding,
+/area/crew_quarters/fitness/pool)
+"abk" = (
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#e8eaff"
+ },
+/obj/structure/bed,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/crew_quarters/fitness/pool)
+"abl" = (
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -23
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/recreation)
+"abm" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 4
+ },
+/area/crew_quarters/fitness/pool)
+"abn" = (
+/obj/machinery/pool/filter{
+ pixel_y = 24
+ },
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
+"abo" = (
+/obj/structure/pool/ladder{
+ dir = 2;
+ pixel_y = 24
+ },
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
+"abp" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/crew_quarters/fitness/pool)
+"abq" = (
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 4
+ },
+/area/crew_quarters/fitness/pool)
+"abr" = (
+/obj/machinery/pool/drain,
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
+"abs" = (
+/obj/structure/pool/Lboard,
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
+"abt" = (
+/obj/structure/pool/Rboard,
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 8
+ },
+/area/crew_quarters/fitness/pool)
+"abu" = (
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_x = 28
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/crew_quarters/fitness/pool)
+"abv" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/item/cigbutt,
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"abw" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/structure/table/glass,
+/obj/item/storage/firstaid/regular,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/pool)
+"abx" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/structure/closet/athletic_mixed,
+/obj/item/toy/poolnoodle/blue,
+/obj/item/toy/poolnoodle/red,
+/obj/item/toy/poolnoodle/yellow,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/crew_quarters/fitness/pool)
"aby" = (
/obj/structure/lattice,
/obj/structure/grille,
/turf/open/space,
/area/space/nearstation)
+"abz" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -24
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/fitness/pool)
+"abA" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/yellowsiding/corner{
+ icon_state = "yellowcornersiding";
+ dir = 4
+ },
+/area/crew_quarters/fitness/pool)
+"abB" = (
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_x = -2;
+ pixel_y = -27
+ },
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"abC" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"abD" = (
+/turf/open/floor/plasteel/yellowsiding/corner{
+ icon_state = "yellowcornersiding";
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"abE" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/crew_quarters/fitness/pool";
+ name = "Pool APC";
+ pixel_y = -24
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/crew_quarters/fitness/pool)
+"abF" = (
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
+"abG" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"abH" = (
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/door/airlock/public/glass{
+ name = "Pool"
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/fitness/pool)
"abI" = (
/obj/structure/lattice,
/turf/open/space,
@@ -285,6 +754,26 @@
},
/turf/open/space,
/area/space/nearstation)
+"abK" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/recreation)
+"abL" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abM" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
"abN" = (
/obj/effect/landmark/carpspawn,
/turf/open/space,
@@ -292,6 +781,42 @@
"abO" = (
/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai)
+"abP" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abQ" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abR" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abS" = (
+/obj/structure/weightmachine/stacklifter,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abT" = (
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/airlock/public/glass{
+ name = "Pool"
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/fitness/pool)
"abV" = (
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plasteel/white,
@@ -3820,18 +4345,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
-"akq" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"akr" = (
/obj/machinery/washing_machine,
/obj/item/radio/intercom{
@@ -5230,16 +5743,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
-"anp" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/decal/cleanable/robot_debris{
- icon_state = "gib6"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"anq" = (
/obj/structure/grille/broken,
/turf/open/floor/plating,
@@ -6932,10 +7435,6 @@
},
/turf/open/space/basic,
/area/space)
-"aqZ" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"ara" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -7525,35 +8024,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/crew_quarters/dorms)
-"asl" = (
-/obj/structure/grille/broken,
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
-"asm" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/item/cigbutt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
-"asn" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/obj/effect/decal/cleanable/cobweb{
- icon_state = "cobweb2"
- },
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"aso" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -8021,26 +8491,9 @@
/obj/structure/closet/emcloset/anchored,
/turf/open/floor/plating,
/area/crew_quarters/dorms)
-"atm" = (
-/obj/structure/closet,
-/obj/item/weldingtool,
-/obj/item/crowbar,
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"atn" = (
/turf/closed/wall,
/area/crew_quarters/fitness/recreation)
-"ato" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/obj/item/clothing/mask/balaclava,
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"atp" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -8506,41 +8959,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/dorms)
-"aun" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/item/storage/box/lights/mixed,
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
-"auo" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
-"aup" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/grille/broken,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
-"auq" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"aur" = (
/turf/open/floor/engine{
name = "Holodeck Projector Floor"
@@ -9564,57 +9982,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/fitness/recreation)
-"awy" = (
-/obj/structure/closet/lasertag/blue,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/airalarm{
- pixel_y = 22
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/crew_quarters/fitness/recreation)
-"awz" = (
-/obj/structure/closet/lasertag/red,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/status_display/evac{
- pixel_y = 32
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/crew_quarters/fitness/recreation)
-"awA" = (
-/obj/machinery/disposal/bin,
-/obj/machinery/light{
- dir = 1
- },
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Fitness Room"
- },
-/obj/machinery/computer/security/telescreen/entertainment{
- pixel_y = 32
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/crew_quarters/fitness/recreation)
"awB" = (
/obj/machinery/vending/clothing,
/obj/effect/turf_decal/tile/blue{
@@ -10025,10 +10392,6 @@
"axw" = (
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
-"axx" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/recreation)
"axy" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -10406,13 +10769,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
-"ayv" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/obj/structure/weightmachine/stacklifter,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/recreation)
"ayw" = (
/obj/machinery/computer/holodeck{
dir = 4
@@ -54124,15 +54480,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
-"gcj" = (
-/obj/machinery/vending/kink,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/crew_quarters/fitness/recreation)
"gdJ" = (
/obj/structure/table/glass,
/obj/item/folder/blue,
@@ -102547,11 +102894,11 @@ aaa
aaa
aaa
aaa
-apX
-apX
-apX
-apX
-apX
+aaF
+aaF
+aaF
+aaF
+atn
atn
aww
axv
@@ -102798,19 +103145,19 @@ aaa
aiS
cBy
aiS
-aiS
-aiS
-aiT
-aiT
-aiT
-aiS
-aiS
-aiS
-aiS
-atm
-aun
-atn
-awz
+aaF
+aaF
+aaJ
+aaJ
+aaJ
+aaF
+aaF
+abw
+abz
+abH
+abl
+axw
+abg
axw
ayu
azC
@@ -103053,23 +103400,23 @@ aaa
aaa
aaa
aiT
-akq
-ale
-ale
-ale
-anp
-ale
-ale
-ale
-ale
-ale
-ale
-ale
-auo
-atn
-awy
-axw
-ayu
+akn
+ajv
+aaH
+aaN
+abc
+abm
+abm
+abq
+abm
+abm
+abA
+abT
+abK
+abL
+abM
+abP
+abR
azC
axw
aBU
@@ -103310,23 +103657,23 @@ aaa
aaa
aaa
aiS
-aiS
-aiS
-aiS
-aiS
-aiT
-aiT
-aiT
-aiS
-aiS
-aiS
-asl
-aiS
-aup
-atn
-awA
-axx
-ayv
+akn
+aaE
+aaF
+aaR
+aaL
+aaO
+aaO
+aaO
+aaO
+aaO
+aaW
+aaF
+abb
+abd
+abh
+abQ
+abS
azD
aAS
aat
@@ -103566,22 +103913,22 @@ rmC
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aiS
-apu
-ale
-auq
-atn
-awB
+akn
+aaG
+aaF
+aaS
+aaL
+abn
+aaO
+aaO
+aaO
+aaO
+aaW
+aaY
+aba
+axw
+abg
axw
axw
axw
@@ -103823,22 +104170,22 @@ rmC
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aiS
akn
-ajv
-aqZ
-atn
-gcj
+aaF
+aaF
+aaS
+abj
+aaO
+aaO
+aaO
+aaO
+aaO
+aaW
+aaY
+awB
+abe
+abi
axw
axw
axw
@@ -104080,18 +104427,18 @@ rmC
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aiS
akn
+aaF
+aaI
+aaS
+aaL
+abo
+aaO
+abr
+aaO
+aaO
+abB
atn
atn
avm
@@ -104337,18 +104684,18 @@ rmC
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aiT
+aiS
akn
+aaF
+aaK
+aaS
+aaL
+aaO
+aaO
+aaO
+aaO
+aaO
+abC
atn
aur
aur
@@ -104591,22 +104938,22 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
aaa
aaa
aaa
-aaa
-aiT
+aiS
akn
-atn
+aaF
+aaI
+aaS
+aaL
+aaO
+aaO
+aaO
+aaO
+aaO
+aaW
+avm
aur
aur
aur
@@ -104848,22 +105195,22 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiS
-asm
-atn
+akn
+aaF
+aaF
+aaT
+aaL
+aaO
+aaO
+aaO
+aaO
+aaO
+aaW
+avm
aur
aur
aur
@@ -105105,22 +105452,22 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiT
akn
-atn
+ajv
+aaF
+aaU
+aaL
+aaO
+aaO
+abs
+aaO
+aaO
+aaW
+avm
aur
aur
aur
@@ -105362,21 +105709,21 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiT
akn
+aaQ
+aaF
+aaV
+aaM
+aaP
+aaP
+abt
+aaP
+aaP
+abD
atn
aur
aur
@@ -105619,21 +105966,21 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiS
akn
+sbk
+aaF
+aaX
+aaZ
+aaZ
+abk
+abp
+abu
+abx
+abE
atn
atn
avm
@@ -105876,22 +106223,22 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiS
akn
-ato
+ajv
+aaF
+aaF
+aaF
+aaF
+aaF
+aaF
+aaF
+aaF
+abF
+aaF
aiS
atn
awC
@@ -106133,21 +106480,21 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiS
-asn
+aaD
+ale
+ale
+ale
+ale
+ale
+ale
+ale
+abv
+ale
+abG
ale
ale
avn
@@ -106390,20 +106737,20 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiS
+aiS
+aiS
+aiS
+aiS
+aiT
+aiS
+aiS
+aiS
+aiS
+aiS
aiT
aiS
aiS
@@ -106647,15 +106994,15 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -106904,15 +107251,15 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -107161,15 +107508,15 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -107418,15 +107765,15 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -107675,15 +108022,15 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
diff --git a/byond-extools.dll b/byond-extools.dll
index a83ea1e543..4910fad01b 100644
Binary files a/byond-extools.dll and b/byond-extools.dll differ
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index 2b19b557b2..621af2c811 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -136,7 +136,7 @@
#define TANK_FRAGMENT_SCALE (6.*ONE_ATMOSPHERE) //+1 for each SCALE kPa aboe threshold
#define TANK_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE*3)
#define TANK_MIN_RELEASE_PRESSURE 0
-#define TANK_DEFAULT_RELEASE_PRESSURE 16
+#define TANK_DEFAULT_RELEASE_PRESSURE 17
//CANATMOSPASS
#define ATMOS_PASS_YES 1
@@ -270,16 +270,9 @@
T.pixel_x = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X;\
T.pixel_y = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y;
-#define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity())
#define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that
once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */
-//prefer this to gas_mixture/total_moles in performance critical areas
-#define TOTAL_MOLES(cached_gases, out_var)\
- out_var = 0;\
- for(var/total_moles_id in cached_gases){\
- out_var += cached_gases[total_moles_id];\
- }
#ifdef TESTING
GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0))
@@ -288,6 +281,19 @@ GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0))
#define CALCULATE_ADJACENT_TURFS(T) SSadjacent_air.queue[T] = 1
#endif
+#define EXTOOLS (world.system_type == MS_WINDOWS ? "byond-extools.dll" : "libbyond-extools.so")
+
+GLOBAL_VAR(atmos_extools_initialized) // this must be an uninitialized (null) one or init_monstermos will be called twice because reasons
+#define ATMOS_EXTOOLS_CHECK if(!GLOB.atmos_extools_initialized){\
+ GLOB.atmos_extools_initialized=TRUE;\
+ if(fexists(EXTOOLS)){\
+ var/result = call(EXTOOLS,"init_monstermos")();\
+ if(result != "ok") {CRASH(result);}\
+ } else {\
+ CRASH("[EXTOOLS] does not exist!");\
+ }\
+}
+
//Unomos - So for whatever reason, garbage collection actually drastically decreases the cost of atmos later in the round. Turning this into a define yields massively improved performance.
#define GAS_GARBAGE_COLLECT(GASGASGAS)\
var/list/CACHE_GAS = GASGASGAS;\
@@ -296,10 +302,6 @@ GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0))
CACHE_GAS -= id;\
}
-#define ARCHIVE_TEMPERATURE(gas) gas.temperature_archived = gas.temperature
-
-#define ARCHIVE(gas) gas.temperature_archived = gas.temperature; gas.gas_archive = gas.gases.Copy();
-
GLOBAL_LIST_INIT(pipe_paint_colors, list(
"amethyst" = rgb(130,43,255), //supplymain
"blue" = rgb(0,0,255),
diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm
new file mode 100644
index 0000000000..29c7a25dad
--- /dev/null
+++ b/code/__DEFINES/cooldowns.dm
@@ -0,0 +1,71 @@
+//// COOLDOWN SYSTEMS
+/*
+ * We have 2 cooldown systems: timer cooldowns (divided between stoppable and regular) and world.time cooldowns.
+ *
+ * When to use each?
+ *
+ * * Adding a commonly-checked cooldown, like on a subsystem to check for processing
+ * * * Use the world.time ones, as they are cheaper.
+ *
+ * * Adding a rarely-used one for special situations, such as giving an uncommon item a cooldown on a target.
+ * * * Timer cooldown, as adding a new variable on each mob to track the cooldown of said uncommon item is going too far.
+ *
+ * * Triggering events at the end of a cooldown.
+ * * * Timer cooldown, registering to its signal.
+ *
+ * * Being able to check how long left for the cooldown to end.
+ * * * Either world.time or stoppable timer cooldowns, depending on the other factors. Regular timer cooldowns do not support this.
+ *
+ * * Being able to stop the timer before it ends.
+ * * * Either world.time or stoppable timer cooldowns, depending on the other factors. Regular timer cooldowns do not support this.
+*/
+
+
+/*
+ * Cooldown system based on an datum-level associative lazylist using timers.
+*/
+
+//INDEXES
+#define COOLDOWN_EMPLOYMENT_CABINET "employment cabinet"
+
+
+//TIMER COOLDOWN MACROS
+
+#define COMSIG_CD_STOP(cd_index) "cooldown_[cd_index]"
+#define COMSIG_CD_RESET(cd_index) "cd_reset_[cd_index]"
+
+#define TIMER_COOLDOWN_START(cd_source, cd_index, cd_time) LAZYSET(cd_source.cooldowns, cd_index, addtimer(CALLBACK(GLOBAL_PROC, /proc/end_cooldown, cd_source, cd_index), cd_time))
+
+#define TIMER_COOLDOWN_CHECK(cd_source, cd_index) LAZYACCESS(cd_source.cooldowns, cd_index)
+
+#define TIMER_COOLDOWN_END(cd_source, cd_index) LAZYREMOVE(cd_source.cooldowns, cd_index)
+
+/*
+ * Stoppable timer cooldowns.
+ * Use indexes the same as the regular tiemr cooldowns.
+ * They make use of the TIMER_COOLDOWN_CHECK() and TIMER_COOLDOWN_END() macros the same, just not the TIMER_COOLDOWN_START() one.
+ * A bit more expensive than the regular timers, but can be reset before they end and the time left can be checked.
+*/
+
+#define S_TIMER_COOLDOWN_START(cd_source, cd_index, cd_time) LAZYSET(cd_source.cooldowns, cd_index, addtimer(CALLBACK(GLOBAL_PROC, /proc/end_cooldown, cd_source, cd_index), cd_time, TIMER_STOPPABLE))
+
+#define S_TIMER_COOLDOWN_RESET(cd_source, cd_index) reset_cooldown(cd_source, cd_index)
+
+#define S_TIMER_COOLDOWN_TIMELEFT(cd_source, cd_index) (timeleft(TIMER_COOLDOWN_CHECK(cd_source, cd_index)))
+
+
+/*
+ * Cooldown system based on storing world.time on a variable, plus the cooldown time.
+ * Better performance over timer cooldowns, lower control. Same functionality.
+*/
+
+#define COOLDOWN_DECLARE(cd_index) var/##cd_index = 0
+
+#define COOLDOWN_START(cd_source, cd_index, cd_time) (cd_source.cd_index = world.time + cd_time)
+
+//Returns true if the cooldown has run its course, false otherwise
+#define COOLDOWN_FINISHED(cd_source, cd_index) (cd_source.cd_index < world.time)
+
+#define COOLDOWN_RESET(cd_source, cd_index) cd_source.cd_index = 0
+
+#define COOLDOWN_TIMELEFT(cd_source, cd_index) (max(0, cd_source.cd_index - world.time))
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 86b518234b..d9a6452f38 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -224,6 +224,11 @@
#define COMSIG_LIVING_RUN_BLOCK "living_do_run_block" //from base of mob/living/do_run_block(): (real_attack, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone)
#define COMSIG_LIVING_GET_BLOCKING_ITEMS "get_blocking_items" //from base of mob/living/get_blocking_items(): (list/items)
+#define COMSIG_LIVING_ACTIVE_BLOCK_START "active_block_start" //from base of mob/living/keybind_start_active_blocking(): (obj/item/blocking_item, list/backup_items)
+ #define COMPONENT_PREVENT_BLOCK_START 1
+#define COMSIG_LIVING_ACTIVE_PARRY_START "active_parry_start" //from base of mob/living/initiate_parry_sequence(): (parrying_method, datum/parrying_item_mob_or_art, list/backup_items)
+ #define COMPONENT_PREVENT_PARRY_START 1
+
//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS!
#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //from base of mob/living/Knockdown() (amount, update, ignore)
diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index 5a26feb624..0e8e34d20e 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -115,3 +115,7 @@
//these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified.
#define PLANT_GENE_REMOVABLE (1<<0)
#define PLANT_GENE_EXTRACTABLE (1<<1)
+
+#define CLONEPOD_GET_MIND 1
+#define CLONEPOD_POLL_MIND 2
+#define CLONEPOD_NO_MIND 3
\ No newline at end of file
diff --git a/code/__DEFINES/skills/defines.dm b/code/__DEFINES/skills/defines.dm
index 60d2321927..47aaeeb1dc 100644
--- a/code/__DEFINES/skills/defines.dm
+++ b/code/__DEFINES/skills/defines.dm
@@ -8,12 +8,6 @@
/// Levels
#define SKILL_PROGRESSION_LEVEL 4
-
-/// Max value of skill for numerical skills
-#define SKILL_NUMERICAL_MAX 100
-/// Min value of skill for numerical skills
-#define SKILL_NUMERICAL_MIN 0
-
// Standard values for job starting skills
#define STARTING_SKILL_SURGERY_MEDICAL 35 //out of SKILL_NUMERICAL_MAX
@@ -26,6 +20,13 @@
#define DEF_SKILL_GAIN 1
#define SKILL_GAIN_SURGERY_PER_STEP 0.25
+#define STD_USE_TOOL_MULT 1
+#define EASY_USE_TOOL_MULT 0.75
+#define TRIVIAL_USE_TOOL_MULT 0.5
+#define BARE_USE_TOOL_MULT 0.25
+
+//multiplier of the difference of max_value and min_value. Mostly for balance purposes between numerical and level-based skills.
+#define STD_NUM_SKILL_ITEM_GAIN_MULTI 0.002
//An extra point for each few seconds of delay when using a tool. Before the multiplier.
#define SKILL_GAIN_DELAY_DIVISOR 3 SECONDS
diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm
index 3d4207c5c9..e21f3dc1c1 100644
--- a/code/__DEFINES/spaceman_dmm.dm
+++ b/code/__DEFINES/spaceman_dmm.dm
@@ -29,6 +29,5 @@
#endif
/world/proc/enable_debugger()
- var/dll = world.GetConfig("env", "EXTOOLS_DLL")
- if (dll)
- call(dll, "debug_initialize")()
+ if (fexists(EXTOOLS))
+ call(EXTOOLS, "debug_initialize")()
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 8c423ad09c..bf76f8a523 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -137,12 +137,13 @@
// SSair run section
#define SSAIR_PIPENETS 1
#define SSAIR_ATMOSMACHINERY 2
-#define SSAIR_REACTQUEUE 3
-#define SSAIR_EXCITEDGROUPS 4
-#define SSAIR_HIGHPRESSURE 5
-#define SSAIR_HOTSPOTS 6
-#define SSAIR_SUPERCONDUCTIVITY 7
-#define SSAIR_REBUILD_PIPENETS 8
+#define SSAIR_EXCITEDGROUPS 3
+#define SSAIR_HIGHPRESSURE 4
+#define SSAIR_HOTSPOTS 5
+#define SSAIR_SUPERCONDUCTIVITY 6
+#define SSAIR_REBUILD_PIPENETS 7
+#define SSAIR_EQUALIZE 8
+#define SSAIR_ACTIVETURFS 9
#define COMPILE_OVERLAYS(A)\
if (TRUE) {\
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 106db7f40a..bef06a69e9 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -123,7 +123,7 @@
if(totitemdamage)
totitemdamage = user.mind.item_action_skills_mod(I, totitemdamage, I.skill_difficulty, SKILL_ATTACK_OBJ, bad_trait)
for(var/skill in I.used_skills)
- if(!(I.used_skills[skill] & SKILL_TRAIN_ATTACK_OBJ))
+ if(!(SKILL_TRAIN_ATTACK_OBJ in I.used_skills[skill]))
continue
user.mind.auto_gain_experience(skill, I.skill_gain)
@@ -192,9 +192,10 @@
if(.)
. = user.mind.item_action_skills_mod(I, ., I.skill_difficulty, SKILL_ATTACK_MOB, bad_trait)
for(var/skill in I.used_skills)
- if(!(I.used_skills[skill] & SKILL_TRAIN_ATTACK_MOB))
+ if(!(SKILL_TRAIN_ATTACK_MOB in I.used_skills[skill]))
continue
- user.mind.auto_gain_experience(skill, I.skill_gain)
+ var/datum/skill/S = GLOB.skill_datums[skill]
+ user.mind.auto_gain_experience(skill, I.skill_gain*S.item_skill_gain_multi)
// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person.
// Click parameters is the params string from byond Click() code, see that documentation.
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index 6cf01ec8ff..f95ebf82b5 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -102,9 +102,8 @@
//stops TK grabs being equipped anywhere but into hands
/obj/item/tk_grab/equipped(mob/user, slot)
if(slot == SLOT_HANDS)
- return
+ return ..()
qdel(src)
- return
/obj/item/tk_grab/examine(user)
if (focus)
diff --git a/code/controllers/configuration/entries/comms.dm b/code/controllers/configuration/entries/comms.dm
index 012c3ec9fe..e56ff3f0d1 100644
--- a/code/controllers/configuration/entries/comms.dm
+++ b/code/controllers/configuration/entries/comms.dm
@@ -25,4 +25,23 @@
/datum/config_entry/string/medal_hub_address
/datum/config_entry/string/medal_hub_password
- protection = CONFIG_ENTRY_HIDDEN
\ No newline at end of file
+ protection = CONFIG_ENTRY_HIDDEN
+
+/datum/config_entry/keyed_list/cross_server_bunker_override
+ key_mode = KEY_MODE_TEXT
+ value_mode = VALUE_MODE_TEXT
+ protection = CONFIG_ENTRY_LOCKED
+
+/datum/config_entry/keyed_list/cross_server_bunker_override/ValidateAndSet(str_val)
+ . = ..()
+ if(.)
+ var/list/newv = list()
+ for(var/I in config_entry_value)
+ newv[replacetext(I, "+", " ")] = config_entry_value[I]
+ config_entry_value = newv
+
+/datum/config_entry/keyed_list/cross_server_bunker_override/ValidateListEntry(key_name, key_value)
+ return key_value != "byond:\\address:port" && ..()
+
+/datum/config_entry/flag/allow_cross_server_bunker_override
+ protection = CONFIG_ENTRY_LOCKED
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 4d8bc3b1f6..baceb4d055 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -6,7 +6,7 @@ SUBSYSTEM_DEF(air)
flags = SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
- var/cost_turf_reactions = 0
+ var/cost_turfs = 0
var/cost_groups = 0
var/cost_highpressure = 0
var/cost_hotspots = 0
@@ -14,10 +14,9 @@ SUBSYSTEM_DEF(air)
var/cost_pipenets = 0
var/cost_rebuilds = 0
var/cost_atmos_machinery = 0
+ var/cost_equalize = 0
- var/list/excited_groups = list()
var/list/active_turfs = list()
- var/list/turf_react_queue = list()
var/list/hotspots = list()
var/list/networks = list()
var/list/pipenets_needing_rebuilt = list()
@@ -38,20 +37,25 @@ SUBSYSTEM_DEF(air)
var/map_loading = TRUE
var/list/queued_for_activation
+ var/log_explosive_decompression = TRUE // If things get spammy, admemes can turn this off.
+
+ var/monstermos_turf_limit = 10
+ var/monstermos_hard_turf_limit = 2000
+ var/monstermos_enabled = TRUE
+
/datum/controller/subsystem/air/stat_entry(msg)
msg += "C:{"
- msg += "RQ:[round(cost_turf_reactions,1)]|"
+ msg += "EQ:[round(cost_equalize,1)]|"
+ msg += "AT:[round(cost_turfs,1)]|"
msg += "EG:[round(cost_groups,1)]|"
msg += "HP:[round(cost_highpressure,1)]|"
msg += "HS:[round(cost_hotspots,1)]|"
msg += "SC:[round(cost_superconductivity,1)]|"
msg += "PN:[round(cost_pipenets,1)]|"
- msg += "RB:[round(cost_rebuilds,1)]|"
msg += "AM:[round(cost_atmos_machinery,1)]"
msg += "} "
msg += "AT:[active_turfs.len]|"
- msg += "RQ:[turf_react_queue.len]|"
- msg += "EG:[excited_groups.len]|"
+ msg += "EG:[get_amt_excited_groups()]|"
msg += "HS:[hotspots.len]|"
msg += "PN:[networks.len]|"
msg += "HP:[high_pressure_delta.len]|"
@@ -59,8 +63,8 @@ SUBSYSTEM_DEF(air)
msg += "AT/MS:[round((cost ? active_turfs.len/cost : 0),0.1)]"
..(msg)
-
/datum/controller/subsystem/air/Initialize(timeofday)
+ extools_update_ssair()
map_loading = FALSE
setup_allturfs()
setup_atmos_machinery()
@@ -68,6 +72,7 @@ SUBSYSTEM_DEF(air)
gas_reactions = init_gas_reactions()
return ..()
+/datum/controller/subsystem/air/proc/extools_update_ssair()
/datum/controller/subsystem/air/fire(resumed = 0)
var/timer = TICK_USAGE_REAL
@@ -101,12 +106,21 @@ SUBSYSTEM_DEF(air)
if(state != SS_RUNNING)
return
resumed = 0
- currentpart = SSAIR_REACTQUEUE
+ currentpart = monstermos_enabled ? SSAIR_EQUALIZE : SSAIR_ACTIVETURFS
- if(currentpart == SSAIR_REACTQUEUE)
+ if(currentpart == SSAIR_EQUALIZE)
timer = TICK_USAGE_REAL
- process_react_queue(resumed)
- cost_turf_reactions = MC_AVERAGE(cost_turf_reactions, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
+ process_turf_equalize(resumed)
+ cost_equalize = MC_AVERAGE(cost_equalize, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
+ if(state != SS_RUNNING)
+ return
+ resumed = 0
+ currentpart = SSAIR_ACTIVETURFS
+
+ if(currentpart == SSAIR_ACTIVETURFS)
+ timer = TICK_USAGE_REAL
+ process_active_turfs(resumed)
+ cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
if(state != SS_RUNNING)
return
resumed = 0
@@ -148,6 +162,8 @@ SUBSYSTEM_DEF(air)
resumed = 0
currentpart = SSAIR_REBUILD_PIPENETS
+
+
/datum/controller/subsystem/air/proc/process_pipenets(resumed = 0)
if (!resumed)
src.currentrun = networks.Copy()
@@ -182,19 +198,6 @@ SUBSYSTEM_DEF(air)
return
-/datum/controller/subsystem/air/proc/process_react_queue(resumed = 0)
- if(!resumed)
- src.currentrun = turf_react_queue.Copy()
- var/list/currentrun = src.currentrun
- while(currentrun.len)
- var/turf/open/T = currentrun[currentrun.len]
- currentrun.len--
- if(T)
- T.process_cell_reaction()
- if(MC_TICK_CHECK)
- return
-
-
/datum/controller/subsystem/air/proc/process_super_conductivity(resumed = 0)
if (!resumed)
src.currentrun = active_super_conductivity.Copy()
@@ -229,10 +232,45 @@ SUBSYSTEM_DEF(air)
high_pressure_delta.len--
T.high_pressure_movements()
T.pressure_difference = 0
+ T.pressure_specific_target = null
if(MC_TICK_CHECK)
return
+/datum/controller/subsystem/air/proc/process_turf_equalize(resumed = 0)
+ //cache for sanic speed
+ var/fire_count = times_fired
+ if (!resumed)
+ src.currentrun = active_turfs.Copy()
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+ while(currentrun.len)
+ var/turf/open/T = currentrun[currentrun.len]
+ currentrun.len--
+ if (T)
+ T.equalize_pressure_in_zone(fire_count)
+ //equalize_pressure_in_zone(T, fire_count)
+ if (MC_TICK_CHECK)
+ return
+
+/datum/controller/subsystem/air/proc/process_active_turfs(resumed = 0)
+ //cache for sanic speed
+ var/fire_count = times_fired
+ if (!resumed)
+ src.currentrun = active_turfs.Copy()
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+ while(currentrun.len)
+ var/turf/open/T = currentrun[currentrun.len]
+ currentrun.len--
+ if (T)
+ T.process_cell(fire_count)
+ if (MC_TICK_CHECK)
+ return
+
/datum/controller/subsystem/air/proc/process_excited_groups(resumed = 0)
+ if(process_excited_groups_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag))
+ sleep()
+ /*
if (!resumed)
src.currentrun = excited_groups.Copy()
//cache for sanic speed (lists are references anyways)
@@ -248,29 +286,33 @@ SUBSYSTEM_DEF(air)
EG.dismantle()
if (MC_TICK_CHECK)
return
+ */
+
+/datum/controller/subsystem/air/proc/process_excited_groups_extools()
+/datum/controller/subsystem/air/proc/get_amt_excited_groups()
/datum/controller/subsystem/air/proc/remove_from_active(turf/open/T)
active_turfs -= T
- SSair_turfs.currentrun -= T
+ if(currentpart == SSAIR_ACTIVETURFS)
+ currentrun -= T
#ifdef VISUALIZE_ACTIVE_TURFS
T.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#00ff00")
#endif
if(istype(T))
- T.excited = 0
- if(T.excited_group)
- T.excited_group.garbage_collect()
- remove_from_react_queue(T)
+ T.set_excited(FALSE)
+ T.eg_garbage_collect()
/datum/controller/subsystem/air/proc/add_to_active(turf/open/T, blockchanges = 1)
if(istype(T) && T.air)
#ifdef VISUALIZE_ACTIVE_TURFS
T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY)
#endif
- T.excited = TRUE
- active_turfs[T] = SSair_turfs.currentrun[T] = TRUE
- if(blockchanges && T.excited_group)
- T.excited_group.garbage_collect()
- add_to_react_queue(T)
+ T.set_excited(TRUE)
+ active_turfs |= T
+ if(currentpart == SSAIR_ACTIVETURFS)
+ currentrun |= T
+ if(blockchanges)
+ T.eg_garbage_collect()
else if(T.flags_1 & INITIALIZED_1)
for(var/turf/S in T.atmos_adjacent_turfs)
add_to_active(S)
@@ -281,17 +323,6 @@ SUBSYSTEM_DEF(air)
else
T.requires_activation = TRUE
-/datum/controller/subsystem/air/proc/add_to_react_queue(turf/open/T)
- if(istype(T) && T.air)
- turf_react_queue[T] = TRUE
- if(currentpart == SSAIR_REACTQUEUE)
- currentrun[T] = TRUE
-
-/datum/controller/subsystem/air/proc/remove_from_react_queue(turf/open/T)
- turf_react_queue -= T
- if(currentpart == SSAIR_REACTQUEUE)
- currentrun -= T
-
/datum/controller/subsystem/air/StartLoadingMap()
LAZYINITLIST(queued_for_activation)
map_loading = TRUE
@@ -339,11 +370,11 @@ SUBSYSTEM_DEF(air)
while (turfs_to_check.len)
var/ending_ats = active_turfs.len
- for(var/thing in excited_groups)
+ /*for(var/thing in excited_groups)
var/datum/excited_group/EG = thing
- EG.self_breakdown(space_is_all_consuming = 1)
- EG.dismantle()
- CHECK_TICK
+ //EG.self_breakdown(space_is_all_consuming = 1)
+ //EG.dismantle()
+ CHECK_TICK*/
var/msg = "HEY! LISTEN! [DisplayTimeText(world.timeofday - timer)] were wasted processing [starting_ats] turf(s) (connected to [ending_ats] other turfs) with atmos differences at round start."
to_chat(world, "[msg]")
@@ -351,6 +382,7 @@ SUBSYSTEM_DEF(air)
/turf/open/proc/resolve_active_graph()
. = list()
+ /*
var/datum/excited_group/EG = excited_group
if (blocks_air || !air)
return
@@ -371,7 +403,8 @@ SUBSYSTEM_DEF(air)
EG.add_turf(ET)
if (!ET.excited)
ET.excited = 1
- . += ET
+ . += ET*/
+
/turf/open/space/resolve_active_graph()
return list()
@@ -389,9 +422,8 @@ SUBSYSTEM_DEF(air)
CHECK_TICK
/datum/controller/subsystem/air/proc/setup_template_machinery(list/atmos_machines)
- if(!initialized)
- return
-
+ if(!initialized) // yogs - fixes randomized bars
+ return // yogs
for(var/A in atmos_machines)
var/obj/machinery/atmospherics/AM = A
AM.atmosinit()
@@ -415,6 +447,7 @@ SUBSYSTEM_DEF(air)
#undef SSAIR_PIPENETS
#undef SSAIR_ATMOSMACHINERY
+#undef SSAIR_ACTIVETURFS
#undef SSAIR_EXCITEDGROUPS
#undef SSAIR_HIGHPRESSURE
#undef SSAIR_HOTSPOTS
diff --git a/code/controllers/subsystem/air_turfs.dm b/code/controllers/subsystem/air_turfs.dm
index 9dd41aede5..7320defcae 100644
--- a/code/controllers/subsystem/air_turfs.dm
+++ b/code/controllers/subsystem/air_turfs.dm
@@ -1,5 +1,5 @@
//WHAT IF WE TAKE THE ACTIVE TURF PROCESSING AND PUSH IT SOMEWHERE ELSE!!!
-
+/*
SUBSYSTEM_DEF(air_turfs)
name = "Atmospherics - Turfs"
init_order = INIT_ORDER_AIR_TURFS
@@ -24,3 +24,4 @@ SUBSYSTEM_DEF(air_turfs)
return
resumed = 0
return
+*/
diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm
index 4626ef69d1..deab5e9b69 100644
--- a/code/datums/components/crafting/guncrafting.dm
+++ b/code/datums/components/crafting/guncrafting.dm
@@ -1,4 +1,4 @@
-k// PARTS //
+// PARTS //
/obj/item/weaponcrafting
icon = 'icons/obj/improvised.dmi'
@@ -8,61 +8,33 @@ k// PARTS //
custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 6)
icon_state = "riflestock"
-/obj/item/weaponcrafting/durathread_string
- name = "durathread string"
- desc = "A long piece of durathread with some resemblance to cable coil."
+/obj/item/weaponcrafting/string
+ name = "wound thread"
+ desc = "A long piece of thread with some resemblance to cable coil."
icon_state = "durastring"
////////////////////////////////
-// KAT IMPROVISED WEAPON PARTS//
+// IMPROVISED WEAPON PARTS//
////////////////////////////////
/obj/item/weaponcrafting/improvised_parts
- name = "Eerie bunch of coloured dots."
- desc = "You feel the urge to report to Central that the parent type of guncrafting, which should never appear in this reality, has appeared. Whatever that means."
+ name = "Debug Improvised Gun Part"
+ desc = "A badly coded gun part. You should report coders if you see this."
icon = 'icons/obj/guns/gun_parts.dmi'
icon_state = "palette"
-// BARRELS
-
-/obj/item/weaponcrafting/improvised_parts/barrel_rifle
- name = "rifle barrel"
- desc = "A pipe with a diameter just the right size to fire 7.62 rounds out of."
- icon_state = "barrel_rifle"
-
-/obj/item/weaponcrafting/improvised_parts/barrel_shotgun
- name = "shotgun barrel"
- desc = "A twenty bore shotgun barrel."
- icon_state = "barrel_shotgun"
-
-/obj/item/weaponcrafting/improvised_parts/barrel_pistol
- name = "pistol barrel"
- desc = "A pipe with a small diameter and some holes finely cut into it. It fits .32 ACP bullets. Probably."
- icon_state = "barrel_pistol"
- w_class = WEIGHT_CLASS_SMALL
-
// RECEIVERS
/obj/item/weaponcrafting/improvised_parts/rifle_receiver
- name = "bolt action receiver"
- desc = "A crudely constructed receiver to create an improvised bolt-action breechloaded rifle. It's generic enough to modify to create other rifles, potentially."
+ name = "rifle receiver"
+ desc = "A crudely constructed receiver to create an improvised bolt-action breechloaded rifle." // removed some text implying that the item had more uses than it does
icon_state = "receiver_rifle"
w_class = WEIGHT_CLASS_SMALL
-/obj/item/weaponcrafting/improvised_parts/pistol_receiver
- name = "pistol receiver"
- desc = "A receiver to connect house and connects all the parts to make an improvised pistol."
- icon_state = "receiver_pistol"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weaponcrafting/improvised_parts/laser_receiver
- name = "energy emitter assembly"
- desc = "A mixture of components haphazardly wired together to form an energy emitter."
- icon_state = "laser_assembly"
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver
- name = "break-action assembly"
- desc = "An improvised receiver to create a break-action breechloaded shotgun. Parts of this are still useful if you want to make another type of shotgun, however."
+ name = "shotgun reciever"
+ desc = "An improvised receiver to create a break-action breechloaded shotgun." // removed some text implying that the item had more uses than it does
icon_state = "receiver_shotgun"
w_class = WEIGHT_CLASS_SMALL
@@ -78,15 +50,3 @@ k// PARTS //
name = "wooden firearm body"
desc = "A crudely fashioned wooden body to help keep higher calibre improvised weapons from blowing themselves apart."
icon_state = "wooden_body"
-
-/obj/item/weaponcrafting/improvised_parts/wooden_grip
- name = "wooden pistol grip"
- desc = "A nice wooden grip hollowed out for pistol magazines."
- icon_state = "wooden_pistolgrip"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weaponcrafting/improvised_parts/makeshift_lens
- name = "makeshift focusing lens"
- desc = "A properly made lens made with actual glassworking tools would perform much better, but this will have to do."
- icon_state = "focusing_lens"
- w_class = WEIGHT_CLASS_TINY
diff --git a/code/datums/components/crafting/recipes/recipes_primal.dm b/code/datums/components/crafting/recipes/recipes_primal.dm
index e646d24018..aaae94df1d 100644
--- a/code/datums/components/crafting/recipes/recipes_primal.dm
+++ b/code/datums/components/crafting/recipes/recipes_primal.dm
@@ -103,7 +103,7 @@
/datum/crafting_recipe/bone_bow
name = "Bone Bow"
result = /obj/item/gun/ballistic/bow/ashen
- time = 200
+ time = 120 // 80+120 = 200
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 8,
/obj/item/stack/sheet/sinew = 4)
@@ -112,7 +112,7 @@
/datum/crafting_recipe/bow_tablet
name = "Sandstone Bow Making Manual"
result = /obj/item/book/granter/crafting_recipe/bone_bow
- time = 600 //Scribing
+ time = 200 //Scribing // don't care
always_availible = FALSE
reqs = list(/obj/item/stack/rods = 1,
/obj/item/stack/sheet/mineral/sandstone = 4)
diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
index 177f6fb2b6..ec8ea86d24 100644
--- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
+++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
@@ -192,8 +192,8 @@
result = /obj/item/gun/ballistic/bow/pipe
reqs = list(/obj/item/pipe = 5,
/obj/item/stack/sheet/plastic = 15,
- /obj/item/weaponcrafting/durathread_string = 5)
- time = 450
+ /obj/item/weaponcrafting/string = 5)
+ time = 150
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
@@ -248,10 +248,10 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
-/datum/crafting_recipe/ishotgun
+/datum/crafting_recipe/ishotgun // smaller and more versatile gun requires some better materials
name = "Improvised Shotgun"
result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised
- reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_shotgun = 1,
+ reqs = list(/obj/item/pipe = 2, // putting a large amount of meaningless timegates by forcing people to turn base resources into upgraded resources kinda sucks
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
/obj/item/weaponcrafting/improvised_parts/wooden_body = 1,
@@ -262,10 +262,10 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
-/datum/crafting_recipe/irifle
+/datum/crafting_recipe/irifle // larger and less versatile gun, but a bit easier to make
name = "Improvised Rifle (7.62mm)"
result = /obj/item/gun/ballistic/shotgun/boltaction/improvised
- reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_rifle = 1,
+ reqs = list(/obj/item/pipe = 2, // above
/obj/item/weaponcrafting/improvised_parts/rifle_receiver = 1,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
/obj/item/weaponcrafting/improvised_parts/wooden_body = 1,
@@ -276,49 +276,6 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
-/datum/crafting_recipe/ipistol
- name = "Improvised Pistol (.32)"
- result = /obj/item/gun/ballistic/automatic/pistol/improvised/nomag
- reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_pistol = 1,
- /obj/item/weaponcrafting/improvised_parts/pistol_receiver = 1,
- /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
- /obj/item/weaponcrafting/improvised_parts/wooden_grip = 1,
- /obj/item/stack/sheet/plastic = 15,
- /obj/item/stack/sheet/plasteel = 1)
- tools = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_WIRECUTTER)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/ilaser
- name = "Improvised Energy Gun"
- result = /obj/item/gun/energy/e_gun/old/improvised
- reqs = list(/obj/item/weaponcrafting/improvised_parts/laser_receiver = 1,
- /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
- /obj/item/weaponcrafting/improvised_parts/makeshift_lens = 1,
- /obj/item/stock_parts/cell = 1,
- /obj/item/stack/sheet/metal = 10,
- /obj/item/stack/sheet/plasteel = 5,
- /obj/item/stack/cable_coil = 10)
- tools = list(TOOL_SCREWDRIVER)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/ilaser/upgraded
- name = "Improvised Energy Gun Upgrade"
- result = /obj/item/gun/energy/e_gun/old/improvised/upgraded
- reqs = list(/obj/item/gun/energy/e_gun/old/improvised = 1,
- /obj/item/glasswork/glass_base/lens = 1,
- /obj/item/stock_parts/capacitor/quadratic = 2,
- /obj/item/stock_parts/micro_laser/ultra = 1,
- /obj/item/stock_parts/cell/bluespace = 1,
- /obj/item/stack/cable_coil = 5)
- tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
//////////////////
///AMMO CRAFTING//
//////////////////
@@ -326,9 +283,9 @@
/datum/crafting_recipe/arrow
name = "Arrow"
result = /obj/item/ammo_casing/caseless/arrow/wood
- time = 30
+ time = 5 // these only do 15 damage
reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
- /obj/item/stack/sheet/durathread = 1,
+ /obj/item/stack/sheet/cloth = 1,
/obj/item/stack/rods = 1) // 1 metal sheet = 2 rods = 2 arrows
category = CAT_WEAPONRY
subcategory = CAT_AMMO
@@ -336,7 +293,7 @@
/datum/crafting_recipe/bone_arrow
name = "Bone Arrow"
result = /obj/item/ammo_casing/caseless/arrow/bone
- time = 30
+ time = 5
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 1,
/obj/item/stack/sheet/sinew = 1,
@@ -348,7 +305,7 @@
name = "Ashen Arrow"
result = /obj/item/ammo_casing/caseless/arrow/ash
tools = list(TOOL_WELDER)
- time = 30
+ time = 10 // 1.5 seconds minimum per actually worthwhile arrow excluding interface lag
always_availible = FALSE
reqs = list(/obj/item/ammo_casing/caseless/arrow/wood = 1)
category = CAT_WEAPONRY
@@ -442,92 +399,28 @@
category = CAT_WEAPONRY
subcategory = CAT_AMMO
-/datum/crafting_recipe/m32acp
- name = ".32ACP Empty Magazine"
- result = /obj/item/ammo_box/magazine/m32acp/empty
- reqs = list(/obj/item/stack/sheet/metal = 3,
- /obj/item/stack/sheet/plasteel = 1,
- /obj/item/stack/packageWrap = 1)
- tools = list(TOOL_WELDER,TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
////////////////////
// PARTS CRAFTING //
////////////////////
-// BARRELS
-
-/datum/crafting_recipe/rifle_barrel
- name = "Improvised Rifle Barrel"
- result = /obj/item/weaponcrafting/improvised_parts/barrel_rifle
- reqs = list(/obj/item/pipe = 2)
- tools = list(TOOL_WELDER,TOOL_SAW)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/shotgun_barrel
- name = "Improvised Shotgun Barrel"
- result = /obj/item/weaponcrafting/improvised_parts/barrel_shotgun
- reqs = list(/obj/item/pipe = 2)
- tools = list(TOOL_WELDER,TOOL_SAW)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/pistol_barrel
- name = "Improvised Pistol Barrel"
- result = /obj/item/weaponcrafting/improvised_parts/barrel_pistol
- reqs = list(/obj/item/pipe = 1,
- /obj/item/stack/sheet/plasteel = 1)
- tools = list(TOOL_WELDER,TOOL_SAW)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
// RECEIVERS
/datum/crafting_recipe/rifle_receiver
name = "Improvised Rifle Receiver"
result = /obj/item/weaponcrafting/improvised_parts/rifle_receiver
- reqs = list(/obj/item/stack/sheet/metal = 10,
- /obj/item/stack/sheet/plasteel = 1)
+ reqs = list(/obj/item/stack/sheet/metal = 15) // you can carry multiple shotguns
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
- time = 50
+ time = 25
category = CAT_WEAPONRY
subcategory = CAT_PARTS
/datum/crafting_recipe/shotgun_receiver
name = "Improvised Shotgun Receiver"
result = /obj/item/weaponcrafting/improvised_parts/shotgun_receiver
- reqs = list(/obj/item/stack/sheet/metal = 10,
- /obj/item/stack/sheet/plasteel = 1)
- tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) // Dual wielding has been removed, plasteel is a soft timesink to obtain for most to make mass production harder.
- time = 50
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/pistol_receiver
- name = "Improvised Pistol Receiver"
- result = /obj/item/weaponcrafting/improvised_parts/pistol_receiver
- reqs = list(/obj/item/stack/sheet/metal = 5,
- /obj/item/stack/sheet/plasteel = 1)
- tools = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_SAW)
- time = 50
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/laser_receiver
- name = "Energy Weapon Assembly"
- result = /obj/item/weaponcrafting/improvised_parts/laser_receiver
- reqs = list(/obj/item/stack/sheet/metal = 10,
- /obj/item/stock_parts/capacitor = 2,
- /obj/item/stock_parts/micro_laser = 1,
- /obj/item/assembly/prox_sensor = 1)
- tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WELDER) // Prox sensor and multitool for the circuit board, welder for extremely ghetto soldering.
- time = 150
+ reqs = list(/obj/item/stack/sheet/metal = 15,
+ /obj/item/stack/sheet/plasteel = 1) // requires access or hacking since shotgun is better
+ tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
+ time = 25
category = CAT_WEAPONRY
subcategory = CAT_PARTS
@@ -539,16 +432,6 @@
reqs = list(/obj/item/stack/sheet/metal = 3,
/obj/item/assembly/igniter = 1)
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/makeshift_lens
- name = "Makeshift Lens"
- result = /obj/item/weaponcrafting/improvised_parts/makeshift_lens
- reqs = list(/obj/item/stack/sheet/metal = 1,
- /obj/item/stack/sheet/glass = 2)
- tools = list(TOOL_WELDER) // Glassmaking lets you make non-makeshift lenses.
- time = 50
+ time = 25
category = CAT_WEAPONRY
subcategory = CAT_PARTS
diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm
index 0fbbcd59b0..e2c3cbff86 100644
--- a/code/datums/components/wet_floor.dm
+++ b/code/datums/components/wet_floor.dm
@@ -121,7 +121,7 @@
if(-INFINITY to T0C)
add_wet(TURF_WET_ICE, max_time_left()) //Water freezes into ice!
if(T0C to T0C + 100)
- decrease = ((T.air.temperature - T0C) / SSwet_floors.temperature_coeff) * (diff / SSwet_floors.time_ratio)
+ decrease = ((T.air.return_temperature() - T0C) / SSwet_floors.temperature_coeff) * (diff / SSwet_floors.time_ratio)
if(T0C + 100 to INFINITY)
decrease = INFINITY
decrease = max(0, decrease)
diff --git a/code/datums/datum.dm b/code/datums/datum.dm
index 6202ac444e..7756cfd906 100644
--- a/code/datums/datum.dm
+++ b/code/datums/datum.dm
@@ -39,6 +39,9 @@
/// A weak reference to another datum
var/datum/weakref/weak_reference
+ ///Lazy associative list of currently active cooldowns.
+ var/list/cooldowns
+
#ifdef TESTING
var/running_find_references
var/last_find_references = 0
@@ -201,3 +204,34 @@
qdel(D)
else
return returned
+
+/**
+ * Callback called by a timer to end an associative-list-indexed cooldown.
+ *
+ * Arguments:
+ * * source - datum storing the cooldown
+ * * index - string index storing the cooldown on the cooldowns associative list
+ *
+ * This sends a signal reporting the cooldown end.
+ */
+/proc/end_cooldown(datum/source, index)
+ if(QDELETED(source))
+ return
+ SEND_SIGNAL(source, COMSIG_CD_STOP(index))
+ TIMER_COOLDOWN_END(source, index)
+
+
+/**
+ * Proc used by stoppable timers to end a cooldown before the time has ran out.
+ *
+ * Arguments:
+ * * source - datum storing the cooldown
+ * * index - string index storing the cooldown on the cooldowns associative list
+ *
+ * This sends a signal reporting the cooldown end, passing the time left as an argument.
+ */
+/proc/reset_cooldown(datum/source, index)
+ if(QDELETED(source))
+ return
+ SEND_SIGNAL(source, COMSIG_CD_RESET(index), S_TIMER_COOLDOWN_TIMELEFT(source, index))
+ TIMER_COOLDOWN_END(source, index)
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 787704e848..2fc853500d 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -404,7 +404,7 @@
if(M.loc)
environment = M.loc.return_air()
if(environment)
- plasmamount = environment.gases[/datum/gas/plasma]
+ plasmamount = environment.get_moles(/datum/gas/plasma)
if(plasmamount && plasmamount > GLOB.meta_gas_visibility[/datum/gas/plasma]) //if there's enough plasma in the air to see
. += power * 0.5
if(M.reagents.has_reagent(/datum/reagent/toxin/plasma))
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index ed5104e296..80059bece7 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -678,7 +678,7 @@
holder.update_transform()
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)
+ var/slowdown = (1 - round(features["body_size"] / danger, 0.1)) * CONFIG_GET(number/body_size_slowdown_multiplier)
holder.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/small_stride, TRUE, slowdown)
else if(old_size < danger)
holder.remove_movespeed_modifier(/datum/movespeed_modifier/small_stride)
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index c46a03a986..5e9371f754 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -117,9 +117,8 @@
continue
var/datum/gas_mixture/A = F.air
- var/list/A_gases = A.gases
var/trace_gases
- for(var/id in A_gases)
+ for(var/id in A.get_gases())
if(id in GLOB.hardcoded_gases)
continue
trace_gases = TRUE
@@ -128,15 +127,15 @@
// Can most things breathe?
if(trace_gases)
continue
- if(A_gases[/datum/gas/oxygen] <= 16)
+ if(A.get_moles(/datum/gas/oxygen) < 16)
continue
- if(A_gases[/datum/gas/plasma])
+ if(A.get_moles(/datum/gas/plasma))
continue
- if(A_gases[/datum/gas/carbon_dioxide] >= 10)
+ if(A.get_moles(/datum/gas/carbon_dioxide) >= 10)
continue
// Aim for goldilocks temperatures and pressure
- if((A.temperature <= 270) || (A.temperature >= 360))
+ if((A.return_temperature() <= 270) || (A.return_temperature() >= 360))
continue
var/pressure = A.return_pressure()
if((pressure <= 20) || (pressure >= 550))
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index e3c7726d61..4682595aec 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -58,12 +58,10 @@
var/datum/martial_art/boxing/style = new
/obj/item/clothing/gloves/boxing/equipped(mob/user, slot)
- if(!ishuman(user))
- return
- if(slot == SLOT_GLOVES)
+ . = ..()
+ if(ishuman(user) && slot == SLOT_GLOVES)
var/mob/living/carbon/human/H = user
style.teach(H,TRUE)
- return
/obj/item/clothing/gloves/boxing/dropped(mob/user)
. = ..()
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 50438d9d8d..c2fe24a20d 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -196,9 +196,8 @@
var/datum/martial_art/krav_maga/style = new
/obj/item/clothing/gloves/krav_maga/equipped(mob/user, slot)
- if(!ishuman(user))
- return
- if(slot == SLOT_GLOVES)
+ . = ..()
+ if(ishuman(user) && slot == SLOT_GLOVES)
var/mob/living/carbon/human/H = user
style.teach(H,1)
diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm
index 87fcf78964..18fd8e7b18 100644
--- a/code/datums/martial/wrestling.dm
+++ b/code/datums/martial/wrestling.dm
@@ -377,7 +377,7 @@
var/turf/ST = null
var/falling = 0
var/damage = damage_roll(A,D)
-
+
for (var/obj/O in oview(1, A))
if (O.density == 1)
if (O == A)
@@ -472,12 +472,10 @@
var/datum/martial_art/wrestling/style = new
/obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot)
- if(!ishuman(user))
- return
- if(slot == SLOT_BELT)
+ . = ..()
+ if(ishuman(user) && slot == SLOT_BELT)
var/mob/living/carbon/human/H = user
style.teach(H,1)
- return
/obj/item/storage/belt/champion/wrestling/dropped(mob/user)
. = ..()
diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm
index 335ecf889f..7e6d567cfa 100644
--- a/code/datums/mutations/actions.dm
+++ b/code/datums/mutations/actions.dm
@@ -226,9 +226,8 @@
/obj/effect/proc_holder/spell/targeted/olfaction/cast(list/targets, mob/living/user = usr)
//can we sniff? is there miasma in the air?
var/datum/gas_mixture/air = user.loc.return_air()
- var/list/cached_gases = air.gases
- if(cached_gases[/datum/gas/miasma])
+ if(air.get_moles(/datum/gas/miasma))
user.adjust_disgust(sensitivity * 45)
to_chat(user, "With your overly sensitive nose, you get a whiff of stench and feel sick! Try moving to a cleaner area!")
return
diff --git a/code/datums/skills/_check_skills.dm b/code/datums/skills/_check_skills.dm
index 2421bd36ff..d02a716b8a 100644
--- a/code/datums/skills/_check_skills.dm
+++ b/code/datums/skills/_check_skills.dm
@@ -40,7 +40,7 @@
. = list()
.["playername"] = owner.name
.["see_skill_mods"] = see_skill_mods
- .["admin"] = check_rights(R_DEBUG)
+ .["admin"] = check_rights(R_DEBUG, FALSE)
/datum/skill_holder/ui_act(action, params)
. = ..()
diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm
index e3f1d00ae6..eecf416b1b 100644
--- a/code/datums/skills/_skill.dm
+++ b/code/datums/skills/_skill.dm
@@ -33,6 +33,10 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
var/base_multiplier = 1
/// Value added to the base multiplier depending on overall competency compared to maximum value/level.
var/competency_multiplier = 1
+ /// Experience gain multiplier gained from using items.
+ var/item_skill_gain_multi = 1
+ /// Skill gain quantisation
+ var/skill_gain_quantisation = 0.1
/// A list of ways this skill can affect or be affected through actions and skill modifiers.
var/list/skill_traits = list(SKILL_SANITY, SKILL_INTELLIGENCE)
/// Index of this skill in the UI
@@ -108,6 +112,10 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
/// Min value of this skill
var/min_value = 0
+/datum/skill/numerical/New()
+ ..()
+ skill_gain_quantisation = item_skill_gain_multi = item_skill_gain_multi * (max_value - min_value) * STD_NUM_SKILL_ITEM_GAIN_MULTI
+
/datum/skill/numerical/sanitize_value(new_value)
return clamp(new_value, min_value, max_value)
diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm
index 8357211463..73748417c3 100644
--- a/code/datums/skills/_skill_holder.dm
+++ b/code/datums/skills/_skill_holder.dm
@@ -91,10 +91,10 @@
CRASH("Invalid set_skill_value call. Use skill typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this.
var/datum/skill/S = GLOB.skill_datums[skill]
value = S.sanitize_value(value)
- skill_holder.need_static_data_update = TRUE
if(!isnull(value))
LAZYINITLIST(skill_holder.skills)
S.set_skill_value(skill_holder, value, src, silent)
+ skill_holder.need_static_data_update = TRUE
return TRUE
return FALSE
@@ -120,11 +120,9 @@
CRASH("You cannot auto increment a non numerical(experience skill!")
var/current = get_skill_value(skill, FALSE)
var/affinity = get_skill_affinity(skill)
- var/target_value = current + (value * affinity)
- if(maximum)
- target_value = min(target_value, maximum)
- if(target_value == maximum) //no more experience to gain, early return.
- return
+ var/target_value = round(current + (value * affinity), S.skill_gain_quantisation)
+ if(maximum && target_value >= maximum) //no more experience to gain, early return.
+ return
boost_skill_value_to(skill, target_value, silent, current)
/**
diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm
index 30699d36f4..261e423640 100644
--- a/code/datums/world_topic.dm
+++ b/code/datums/world_topic.dm
@@ -74,6 +74,25 @@
for(var/client/C in GLOB.clients)
C.AnnouncePR(final_composed)
+/datum/world_topic/auto_bunker_passthrough
+ keyword = "auto_bunker_override"
+ require_comms_key = TRUE
+
+/datum/world_topic/auto_bunker_passthrough/Run(list/input)
+ if(!CONFIG_GET(flag/allow_cross_server_bunker_override))
+ return "Function Disabled"
+ var/ckeytobypass = input["ckey"]
+ var/is_new_ckey = !(ckey(ckeytobypass) in GLOB.bunker_passthrough)
+ var/sender = input["source"] || "UNKNOWN"
+ GLOB.bunker_passthrough |= ckey(ckeytobypass)
+ GLOB.bunker_passthrough[ckey(ckeytobypass)] = world.realtime
+ SSpersistence.SavePanicBunker() //we can do this every time, it's okay
+ if(!is_new_ckey)
+ log_admin("AUTO BUNKER: [ckeytobypass] given access (incoming comms from [sender]).")
+ message_admins("AUTO BUNKER: [ckeytobypass] given access (incoming comms from [sender]).")
+ send2irc("Panic Bunker", "AUTO BUNKER: [ckeytobypass] given access (incoming comms from [sender]).")
+ return "Success"
+
/datum/world_topic/ahelp_relay
keyword = "Ahelp"
require_comms_key = TRUE
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 3b95b1281f..6312dc08a4 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -201,10 +201,13 @@ GLOBAL_LIST_EMPTY(objectives)
return won || ..()
/datum/objective/assassinate/once/process()
- won = check_completion()
+ won = check_midround_completion()
if(won)
STOP_PROCESSING(SSprocessing,src)
+/datum/objective/assassinate/once/proc/check_midround_completion()
+ return won || !considered_alive(target) //The target afking / logging off for a bit during the round doesn't complete it, but them being afk at roundend does.
+
/datum/objective/assassinate/internal
var/stolen = 0 //Have we already eliminated this target?
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index 2280bd45d6..f6b0c8e24b 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -125,7 +125,7 @@
/datum/objective_item/steal/plasma/check_special_completion(obj/item/tank/T)
var/target_amount = text2num(name)
var/found_amount = 0
- found_amount += T.air_contents.gases[/datum/gas/plasma]
+ found_amount += T.air_contents.get_moles(/datum/gas/plasma)
return found_amount>=target_amount
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 9afe4808fd..6f798a41ef 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -26,6 +26,7 @@
var/efficiency
var/datum/mind/clonemind
+ var/get_clone_mind = CLONEPOD_GET_MIND
var/grab_ghost_when = CLONER_MATURE_CLONE
var/internal_radio = TRUE
@@ -134,43 +135,44 @@
return examine(user)
//Start growing a human clone in the pod!
-/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance, list/traumas)
+/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, blood_type, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance, list/traumas)
if(panel_open)
return FALSE
if(mess || attempting)
return FALSE
- clonemind = locate(mindref) in SSticker.minds
- if(!istype(clonemind)) //not a mind
- return FALSE
- if(!QDELETED(clonemind.current))
- if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body
+ if(get_clone_mind == CLONEPOD_GET_MIND)
+ clonemind = locate(mindref) in SSticker.minds
+ if(!istype(clonemind)) //not a mind
return FALSE
- if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding.
+ if(!QDELETED(clonemind.current))
+ if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body
+ return FALSE
+ if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding.
+ return FALSE
+ if(AmBloodsucker(clonemind.current)) //If the mind is a bloodsucker
+ return FALSE
+ if(clonemind.active) //somebody is using that mind
+ if( ckey(clonemind.key)!=ckey )
+ return FALSE
+ else
+ // get_ghost() will fail if they're unable to reenter their body
+ var/mob/dead/observer/G = clonemind.get_ghost()
+ if(!G)
+ return FALSE
+ if(G.suiciding) // The ghost came from a body that is suiciding.
+ return FALSE
+ if(clonemind.damnation_type) //Can't clone the damned.
+ INVOKE_ASYNC(src, .proc/horrifyingsound)
+ mess = TRUE
+ update_icon()
return FALSE
- if(AmBloodsucker(clonemind.current)) //If the mind is a bloodsucker
- return FALSE
- if(clonemind.active) //somebody is using that mind
- if( ckey(clonemind.key)!=ckey )
- return FALSE
- else
- // get_ghost() will fail if they're unable to reenter their body
- var/mob/dead/observer/G = clonemind.get_ghost()
- if(!G)
- return FALSE
- if(G.suiciding) // The ghost came from a body that is suiciding.
- return FALSE
- if(clonemind.damnation_type) //Can't clone the damned.
- INVOKE_ASYNC(src, .proc/horrifyingsound)
- mess = TRUE
- update_icon()
- return FALSE
current_insurance = insurance
attempting = TRUE //One at a time!!
countdown.start()
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
- H.hardset_dna(ui, mutation_index, H.real_name, null, mrace, features)
+ H.hardset_dna(ui, mutation_index, H.real_name, blood_type, mrace, features)
H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) //100% bad mutation. Can be cured with mutadone.
@@ -192,7 +194,14 @@
ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT)
H.Unconscious(80)
- clonemind.transfer_to(H)
+ if(clonemind)
+ clonemind.transfer_to(H)
+
+ else if(get_clone_mind == CLONEPOD_POLL_MIND)
+ var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone? (Don't ERP without permission from the original)", null, null, null, 100, H, POLL_IGNORE_CLONE)
+ if(LAZYLEN(candidates))
+ var/mob/C = pick(candidates)
+ H.key = C.key
if(grab_ghost_when == CLONER_FRESH_CLONE)
H.grab_ghost()
@@ -549,6 +558,17 @@
. += "cover-on"
. += "panel"
+//Experimental cloner; clones a body regardless of the owner's status, letting a ghost control it instead
+/obj/machinery/clonepod/experimental
+ name = "experimental cloning pod"
+ desc = "An ancient cloning pod. It seems to be an early prototype of the experimental cloners used in Nanotrasen Stations."
+ icon = 'icons/obj/machines/cloning.dmi'
+ icon_state = "pod_0"
+ req_access = null
+ circuit = /obj/item/circuitboard/machine/clonepod/experimental
+ internal_radio = FALSE
+ get_clone_mind = CLONEPOD_POLL_MIND
+
/*
* Manual -- A big ol' manual.
*/
diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm
index 79ea51eca4..2faf76ca94 100644
--- a/code/game/machinery/computer/atmos_control.dm
+++ b/code/game/machinery/computer/atmos_control.dm
@@ -53,14 +53,14 @@
"id_tag" = id_tag,
"timestamp" = world.time,
"pressure" = air_sample.return_pressure(),
- "temperature" = air_sample.temperature,
+ "temperature" = air_sample.return_temperature(),
"gases" = list()
))
var/total_moles = air_sample.total_moles()
if(total_moles)
- for(var/gas_id in air_sample.gases)
+ for(var/gas_id in air_sample.get_gases())
var/gas_name = GLOB.meta_gas_names[gas_id]
- signal.data["gases"][gas_name] = air_sample.gases[gas_id] / total_moles * 100
+ signal.data["gases"][gas_name] = air_sample.get_moles(gas_id) / total_moles * 100
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 7834d6f2a2..400ce041c7 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -8,6 +8,7 @@
circuit = /obj/item/circuitboard/computer/cloning
req_access = list(ACCESS_HEADS) //ONLY USED FOR RECORD DELETION RIGHT NOW.
var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
+ var/clonepod_type = /obj/machinery/clonepod
var/list/pods //Linked cloning pods
var/temp = "Inactive"
var/scantemp_ckey
@@ -17,6 +18,7 @@
var/obj/item/disk/data/diskette = null //Mostly so the geneticist can steal everything.
var/loading = 0 // Nice loading text
var/autoprocess = 0
+ var/use_records = TRUE // Old experimental cloner.
var/list/records = list()
light_color = LIGHT_COLOR_BLUE
@@ -36,29 +38,32 @@
return ..()
/obj/machinery/computer/cloning/proc/GetAvailablePod(mind = null)
- if(pods)
- for(var/P in pods)
- var/obj/machinery/clonepod/pod = P
- if(pod.occupant && pod.clonemind == mind)
- return null
- if(pod.is_operational() && !(pod.occupant || pod.mess))
- return pod
+ if(!pods)
+ return
+ for(var/P in pods)
+ var/obj/machinery/clonepod/pod = P
+ if(pod.occupant && pod.get_clone_mind == CLONEPOD_GET_MIND && pod.clonemind == mind)
+ return null
+ if(pod.is_operational() && !(pod.occupant || pod.mess))
+ return pod
/obj/machinery/computer/cloning/proc/HasEfficientPod()
- if(pods)
- for(var/P in pods)
- var/obj/machinery/clonepod/pod = P
- if(pod.is_operational() && pod.efficiency > 5)
- return TRUE
+ if(!pods)
+ return
+ for(var/P in pods)
+ var/obj/machinery/clonepod/pod = P
+ if(pod.is_operational() && pod.efficiency > 5)
+ return TRUE
/obj/machinery/computer/cloning/proc/GetAvailableEfficientPod(mind = null)
- if(pods)
- for(var/P in pods)
- var/obj/machinery/clonepod/pod = P
- if(pod.occupant && pod.clonemind == mind)
- return pod
- else if(!. && pod.is_operational() && !(pod.occupant || pod.mess) && pod.efficiency > 5)
- . = pod
+ if(!pods)
+ return
+ for(var/P in pods)
+ var/obj/machinery/clonepod/pod = P
+ if(pod.occupant && pod.clonemind == mind)
+ return pod
+ else if(!. && pod.is_operational() && !(pod.occupant || pod.mess) && pod.efficiency > 5)
+ . = pod
/obj/machinery/computer/cloning/process()
if(!(scanner && LAZYLEN(pods) && autoprocess))
@@ -73,7 +78,7 @@
if(pod.occupant)
continue //how though?
- if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"], R.fields["traumas"]))
+ if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["blood_type"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"], R.fields["traumas"]))
temp = "[R.fields["name"]] => Cloning cycle in progress..."
records -= R
@@ -103,12 +108,10 @@
return null
/obj/machinery/computer/cloning/proc/findcloner()
- var/obj/machinery/clonepod/podf = null
-
+ var/obj/machinery/clonepod/podf
for(var/direction in GLOB.cardinals)
-
- podf = locate(/obj/machinery/clonepod, get_step(src, direction))
- if (!isnull(podf) && podf.is_operational())
+ podf = locate(clonepod_type, get_step(src, direction))
+ if(podf?.is_operational())
AttachCloner(podf)
/obj/machinery/computer/cloning/proc/AttachCloner(obj/machinery/clonepod/pod)
@@ -132,7 +135,7 @@
else if(istype(W, /obj/item/multitool))
var/obj/item/multitool/P = W
- if(istype(P.buffer, /obj/machinery/clonepod))
+ if(istype(P.buffer, clonepod_type))
if(get_area(P.buffer) != get_area(src))
to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-")
P.buffer = null
@@ -157,13 +160,14 @@
var/dat = ""
dat += "Refresh"
- if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL)
- if(!autoprocess)
- dat += "Autoclone"
+ if(use_records)
+ if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL)
+ if(!autoprocess)
+ dat += "Autoclone"
+ else
+ dat += "Stop autoclone"
else
- dat += "Stop autoclone"
- else
- dat += "Autoclone"
+ dat += "Autoclone"
dat += "
Cloning Pod Status
"
dat += "[temp]
"
@@ -190,26 +194,29 @@
else if(loading)
dat += "[scanner_occupant] => Scanning..."
else
- if(scanner_occupant.ckey != scantemp_ckey)
- scantemp = "Ready to Scan"
- scantemp_ckey = scanner_occupant.ckey
+ if(use_records)
+ if(scanner_occupant.ckey != scantemp_ckey)
+ scantemp = "Ready to Scan"
+ scantemp_ckey = scanner_occupant.ckey
+ else
+ scantemp = "Ready to Clone"
dat += "[scanner_occupant] => [scantemp]"
dat += ""
if(scanner_occupant)
- dat += "Start Scan"
- dat += "
[src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]"
+ dat += "[use_records ? "Start Scan" : "Clone"]"
+ dat += "
[scanner.locked ? "Unlock Scanner" : "Lock Scanner"]"
else
- dat += "Start Scan"
-
- // Database
- dat += "Database Functions
"
- if (src.records.len && src.records.len > 0)
- dat += "View Records ([src.records.len])
"
- else
- dat += "View Records (0)
"
- if (src.diskette)
- dat += "Eject Disk
"
+ dat += "[use_records ? "Start Scan" : "Clone"]"
+ if(use_records)
+ // Database
+ dat += "Database Functions
"
+ if (src.records.len && src.records.len > 0)
+ dat += "View Records ([src.records.len])
"
+ else
+ dat += "View Records (0)
"
+ if (src.diskette)
+ dat += "Eject Disk
"
@@ -290,24 +297,19 @@
autoprocess = FALSE
STOP_PROCESSING(SSmachines, src)
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ . = TRUE
else if ((href_list["scan"]) && !isnull(scanner) && scanner.is_operational())
scantemp = ""
- loading = 1
+ loading = TRUE
src.updateUsrDialog()
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
say("Initiating scan...")
var/prev_locked = scanner.locked
scanner.locked = TRUE
- spawn(20)
- src.scan_occupant(scanner.occupant)
-
- loading = 0
- src.updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
- scanner.locked = prev_locked
-
+ addtimer(CALLBACK(src, .proc/finish_scan, scanner.occupant, prev_locked), 2 SECONDS)
+ . = TRUE
//No locking an open scanner.
else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational())
@@ -317,8 +319,17 @@
else
scanner.locked = FALSE
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ . = TRUE
- else if(href_list["view_rec"])
+
+ else if (href_list["refresh"])
+ src.updateUsrDialog()
+ playsound(src, "terminal_type", 25, 0)
+ . = TRUE
+
+ if(. || !use_records)
+ return
+ if(href_list["view_rec"])
playsound(src, "terminal_type", 25, 0)
src.active_record = find_record("id", href_list["view_rec"], records)
if(active_record)
@@ -330,6 +341,7 @@
src.menu = 3
else
src.temp = "Record missing."
+ . = TRUE
else if (href_list["del_rec"])
if ((!src.active_record) || (src.menu < 3))
@@ -353,8 +365,9 @@
else
src.temp = "Access Denied."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ . = TRUE
- else if (href_list["disk"]) //Load or eject.
+ else if (href_list["disk"] && use_records) //Load or eject.
switch(href_list["disk"])
if("load")
if (!diskette || !istype(diskette.fields) || !diskette.fields["name"] || !diskette.fields)
@@ -392,10 +405,7 @@
diskette.name = "data disk - '[src.diskette.fields["name"]]'"
src.temp = "Save successful."
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
-
- else if (href_list["refresh"])
- src.updateUsrDialog()
- playsound(src, "terminal_type", 25, 0)
+ . = TRUE
else if (href_list["clone"])
var/datum/data/record/C = find_record("id", href_list["clone"], records)
@@ -415,7 +425,7 @@
else if(pod.occupant)
temp = "Cloning cycle already in progress."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"], C.fields["bank_account"]))
+ else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["blood_type"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"], C.fields["bank_account"], C.fields["traumas"]))
temp = "[C.fields["name"]] => Cloning cycle in progress..."
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
records.Remove(C)
@@ -429,14 +439,28 @@
else
temp = "Data corruption."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ . = TRUE
- else if (href_list["menu"])
- src.menu = text2num(href_list["menu"])
+ else if (href_list["menu"] && use_records)
+ menu = text2num(href_list["menu"])
playsound(src, "terminal_type", 25, 0)
+ . = TRUE
+/obj/machinery/computer/cloning/proc/finish_scan(mob/living/L, prev_locked)
+ if(!scanner || !L)
+ return
src.add_fingerprint(usr)
src.updateUsrDialog()
- return
+
+ if(use_records)
+ scan_occupant(L)
+ else
+ clone_occupant(L)
+
+ loading = FALSE
+ src.updateUsrDialog()
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ scanner.locked = prev_locked
/obj/machinery/computer/cloning/proc/scan_occupant(occupant)
var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
@@ -455,30 +479,9 @@
if(isbrain(mob_occupant))
dna = B.stored_dna
- if(!istype(dna))
- scantemp = "Unable to locate valid genetic data."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
- if(mob_occupant.suiciding || mob_occupant.hellbound)
- scantemp = "Subject's brain is not responding to scanning stimuli."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
- if((HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && (src.scanner.scan_level < 2))
- scantemp = "Subject no longer contains the fundamental materials required to create a living clone."
- playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
- return
- if ((!mob_occupant.ckey) || (!mob_occupant.client))
- scantemp = "Mental interface failure."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
- if (find_record("ckey", mob_occupant.ckey, records))
- scantemp = "Subject already in database."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
- if(SSeconomy.full_ancap && !has_bank_account)
- scantemp = "Subject is either missing an ID card with a bank account on it, or does not have an account to begin with. Please ensure the ID card is on the body before attempting to scan."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ if(!can_scan(dna, mob_occupant, FALSE, has_bank_account))
return
+
var/datum/data/record/R = new()
if(dna.species)
// We store the instance rather than the path, because some
@@ -529,3 +532,78 @@
board.records = records
scantemp = "Subject successfully scanned."
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+
+//Used by the experimental cloning computer.
+/obj/machinery/computer/cloning/proc/clone_occupant(occupant)
+ var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
+ var/datum/dna/dna
+ if(ishuman(mob_occupant))
+ var/mob/living/carbon/C = mob_occupant
+ dna = C.has_dna()
+ if(isbrain(mob_occupant))
+ var/mob/living/brain/B = mob_occupant
+ dna = B.stored_dna
+
+ if(!can_scan(dna, mob_occupant, TRUE))
+ return
+
+ var/clone_species
+ if(dna.species)
+ clone_species = dna.species
+ else
+ var/datum/species/rando_race = pick(GLOB.roundstart_races)
+ clone_species = rando_race.type
+
+ var/obj/machinery/clonepod/pod = GetAvailablePod()
+ //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
+ if(!LAZYLEN(pods))
+ temp = "No Clonepods detected."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else if(!pod)
+ temp = "No Clonepods available."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else if(pod.occupant)
+ temp = "Cloning cycle already in progress."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else
+ pod.growclone(null, mob_occupant.real_name, dna.uni_identity, dna.mutation_index, null, dna.blood_type, clone_species, dna.features, mob_occupant.faction)
+ temp = "[mob_occupant.real_name] => Cloning data sent to pod."
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+
+/obj/machinery/computer/cloning/proc/can_scan(datum/dna/dna, mob/living/mob_occupant, experimental = FALSE, datum/bank_account/account)
+ if(!istype(dna))
+ scantemp = "Unable to locate valid genetic data."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ if(!experimental)
+ if(mob_occupant.suiciding || mob_occupant.hellbound)
+ scantemp = "Subject's brain is not responding to scanning stimuli."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ if((HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && (src.scanner.scan_level < 2))
+ scantemp = "Subject no longer contains the fundamental materials required to create a living clone."
+ playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
+ return
+ if (!experimental)
+ if(!mob_occupant.ckey || !mob_occupant.client)
+ scantemp = "Mental interface failure."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ if (find_record("ckey", mob_occupant.ckey, records))
+ scantemp = "Subject already in database."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ if(SSeconomy.full_ancap && !account)
+ scantemp = "Subject is either missing an ID card with a bank account on it, or does not have an account to begin with. Please ensure the ID card is on the body before attempting to scan."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ return TRUE
+
+//Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks.
+/obj/machinery/computer/cloning/prototype
+ name = "prototype cloning console"
+ desc = "Used to operate an experimental cloner."
+ icon_screen = "dna"
+ icon_keyboard = "med_key"
+ circuit = /obj/item/circuitboard/computer/cloning/prototype
+ clonepod_type = /obj/machinery/clonepod/experimental
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index b883c2d31f..8959cd8cc9 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -93,7 +93,7 @@
var/shuttledocked = 0
var/delayed_close_requested = FALSE // TRUE means the door will automatically close the next time it's opened.
- var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close
+ air_tight = FALSE
var/prying_so_hard = FALSE
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 8b2eb9d1d7..b73e6a57ff 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -17,6 +17,7 @@
interaction_flags_atom = INTERACT_ATOM_UI_INTERACT
var/secondsElectrified = 0
+ var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close
var/shockedby
var/visible = TRUE // To explain: Whether the door can block line of sight when closed or not.
var/operating = FALSE
@@ -161,7 +162,7 @@
open()
else
close()
- return
+ return TRUE
if(density)
do_animate("deny")
@@ -181,11 +182,36 @@
/obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user)
return
+/obj/machinery/door/proc/is_holding_pressure()
+ var/turf/open/T = loc
+ if(!T)
+ return FALSE
+ if(!density)
+ return FALSE
+ // alrighty now we check for how much pressure we're holding back
+ var/min_moles = T.air.total_moles()
+ var/max_moles = min_moles
+ // okay this is a bit hacky. First, we set density to 0 and recalculate our adjacent turfs
+ density = FALSE
+ T.ImmediateCalculateAdjacentTurfs()
+ // then we use those adjacent turfs to figure out what the difference between the lowest and highest pressures we'd be holding is
+ for(var/turf/open/T2 in T.atmos_adjacent_turfs)
+ if((flags_1 & ON_BORDER_1) && get_dir(src, T2) != dir)
+ continue
+ var/moles = T2.air.total_moles()
+ if(moles < min_moles)
+ min_moles = moles
+ if(moles > max_moles)
+ max_moles = moles
+ density = TRUE
+ T.ImmediateCalculateAdjacentTurfs() // alright lets put it back
+ return max_moles - min_moles > 20
+
/obj/machinery/door/attackby(obj/item/I, mob/user, params)
- if(user.a_intent != INTENT_HARM && (istype(I, /obj/item/crowbar) || istype(I, /obj/item/fireaxe)))
+ if(user.a_intent != INTENT_HARM && (I.tool_behaviour == TOOL_CROWBAR || istype(I, /obj/item/fireaxe)))
try_to_crowbar(I, user)
return 1
- else if(istype(I, /obj/item/weldingtool))
+ else if(I.tool_behaviour == TOOL_WELDER)
try_to_weld(I, user)
return 1
else if(!(I.item_flags & NOBLUDGEON) && user.a_intent != INTENT_HARM)
@@ -223,13 +249,13 @@
if(prob(20/severity) && (istype(src, /obj/machinery/door/airlock) || istype(src, /obj/machinery/door/window)) )
INVOKE_ASYNC(src, .proc/open)
if(prob(severity*10 - 20))
- if(secondsElectrified == 0)
- secondsElectrified = -1
+ if(secondsElectrified == MACHINE_NOT_ELECTRIFIED)
+ secondsElectrified = MACHINE_ELECTRIFIED_PERMANENT
LAZYADD(shockedby, "\[[TIME_STAMP("hh:mm:ss", FALSE)]\]EM Pulse")
addtimer(CALLBACK(src, .proc/unelectrify), 300)
/obj/machinery/door/proc/unelectrify()
- secondsElectrified = 0
+ secondsElectrified = MACHINE_NOT_ELECTRIFIED
/obj/machinery/door/update_icon_state()
if(density)
@@ -289,8 +315,11 @@
return
operating = TRUE
+
do_animate("closing")
layer = closingLayer
+ if(air_tight)
+ density = TRUE
sleep(5)
density = TRUE
sleep(5)
@@ -302,7 +331,7 @@
update_freelook_sight()
if(safe)
CheckForMobs()
- else
+ else if(!(flags_1 & ON_BORDER_1))
crush()
return 1
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index b52cf1a891..e359c6331f 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -23,6 +23,8 @@
assemblytype = /obj/structure/firelock_frame
armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 70)
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN
+ air_tight = TRUE
+ var/emergency_close_timer = 0
var/nextstate = null
var/boltslocked = TRUE
var/list/affecting_areas
@@ -68,10 +70,14 @@
return ..()
/obj/machinery/door/firedoor/Bumped(atom/movable/AM)
- if(panel_open || operating)
+ if(panel_open || operating || welded)
return
- if(!density)
- return ..()
+ if(ismob(AM))
+ var/mob/user = AM
+ if(density && !welded && !operating && !(stat & NOPOWER) && (!density || allow_hand_open(user)))
+ add_fingerprint(user)
+ open()
+ return TRUE
return FALSE
@@ -86,6 +92,15 @@
. = ..()
if(.)
return
+
+ if(!welded && !operating && !(stat & NOPOWER) && (!density || allow_hand_open(user)))
+ add_fingerprint(user)
+ if(density)
+ emergency_close_timer = world.time + 30 // prevent it from instaclosing again if in space
+ open()
+ else
+ close()
+ return TRUE
if(operating || !density)
return
user.changeNext_move(CLICK_CD_MELEE)
@@ -100,7 +115,7 @@
return
if(welded)
- if(istype(C, /obj/item/wrench))
+ if(C.tool_behaviour == TOOL_WRENCH)
if(boltslocked)
to_chat(user, "There are screws locking the bolts in place!")
return
@@ -114,7 +129,7 @@
"You undo [src]'s floor bolts.")
deconstruct(TRUE)
return
- if(istype(C, /obj/item/screwdriver))
+ if(C.tool_behaviour == TOOL_SCREWDRIVER)
user.visible_message("[user] [boltslocked ? "unlocks" : "locks"] [src]'s bolts.", \
"You [boltslocked ? "unlock" : "lock"] [src]'s floor bolts.")
C.play_tool_sound(src)
@@ -140,10 +155,27 @@
return
if(density)
+ if(is_holding_pressure())
+ // tell the user that this is a bad idea, and have a do_after as well
+ to_chat(user, "As you begin crowbarring \the [src] a gush of air blows in your face... maybe you should reconsider?")
+ if(!do_after(user, 15, TRUE, src)) // give them a few seconds to reconsider their decision.
+ return
+ log_game("[key_name_admin(user)] has opened a firelock with a pressure difference at [AREACOORD(loc)]") // there bibby I made it logged just for you. Enjoy.
+ // since we have high-pressure-ness, close all other firedoors on the tile
+ whack_a_mole()
+ if(welded || operating || !density)
+ return // in case things changed during our do_after
+ emergency_close_timer = world.time + 60 // prevent it from instaclosing again if in space
open()
else
close()
+/obj/machinery/door/firedoor/proc/allow_hand_open(mob/user)
+ var/area/A = get_area(src)
+ if(A && A.fire)
+ return FALSE
+ return !is_holding_pressure()
+
/obj/machinery/door/firedoor/attack_ai(mob/user)
add_fingerprint(user)
if(welded || operating || stat & NOPOWER)
@@ -171,20 +203,16 @@
if("closing")
flick("door_closing", src)
-/obj/machinery/door/firedoor/update_icon_state()
+/obj/machinery/door/firedoor/update_icon()
+ cut_overlays()
if(density)
icon_state = "door_closed"
+ if(welded)
+ add_overlay("welded")
else
icon_state = "door_open"
-
-/obj/machinery/door/firedoor/update_overlays()
- . = ..()
- if(!welded)
- return
- if(density)
- . += "welded"
- else
- . += "welded_open"
+ if(welded)
+ add_overlay("welded_open")
/obj/machinery/door/firedoor/open()
. = ..()
@@ -194,6 +222,61 @@
. = ..()
latetoggle()
+/obj/machinery/door/firedoor/proc/whack_a_mole(reconsider_immediately = FALSE)
+ set waitfor = 0
+ for(var/cdir in GLOB.cardinals)
+ if((flags_1 & ON_BORDER_1) && cdir != dir)
+ continue
+ whack_a_mole_part(get_step(src, cdir), reconsider_immediately)
+ if(flags_1 & ON_BORDER_1)
+ whack_a_mole_part(get_turf(src), reconsider_immediately)
+
+/obj/machinery/door/firedoor/proc/whack_a_mole_part(turf/start_point, reconsider_immediately)
+ set waitfor = 0
+ var/list/doors_to_close = list()
+ var/list/turfs = list()
+ turfs[start_point] = 1
+ for(var/i = 1; (i <= turfs.len && i <= 11); i++) // check up to 11 turfs.
+ var/turf/open/T = turfs[i]
+ if(istype(T, /turf/open/space))
+ return -1
+ for(var/T2 in T.atmos_adjacent_turfs)
+ if(turfs[T2])
+ continue
+ var/is_cut_by_unopen_door = FALSE
+ for(var/obj/machinery/door/firedoor/FD in T2)
+ if((FD.flags_1 & ON_BORDER_1) && get_dir(T2, T) != FD.dir)
+ continue
+ if(FD.operating || FD == src || FD.welded || FD.density)
+ continue
+ doors_to_close += FD
+ is_cut_by_unopen_door = TRUE
+
+ for(var/obj/machinery/door/firedoor/FD in T)
+ if((FD.flags_1 & ON_BORDER_1) && get_dir(T, T2) != FD.dir)
+ continue
+ if(FD.operating || FD == src || FD.welded || FD.density)
+ continue
+ doors_to_close += FD
+ is_cut_by_unopen_door= TRUE
+ if(!is_cut_by_unopen_door)
+ turfs[T2] = 1
+ if(turfs.len > 10)
+ return // too big, don't bother
+ for(var/obj/machinery/door/firedoor/FD in doors_to_close)
+ FD.emergency_pressure_stop(FALSE)
+ if(reconsider_immediately)
+ var/turf/open/T = FD.loc
+ if(istype(T))
+ T.ImmediateCalculateAdjacentTurfs()
+
+/obj/machinery/door/firedoor/proc/emergency_pressure_stop(consider_timer = TRUE)
+ set waitfor = 0
+ if(density || operating || welded)
+ return
+ if(world.time >= emergency_close_timer || !consider_timer)
+ close()
+
/obj/machinery/door/firedoor/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
var/obj/structure/firelock_frame/F = new assemblytype(get_turf(src))
@@ -227,6 +310,59 @@
opacity = TRUE
density = TRUE
+/obj/machinery/door/firedoor/border_only/close()
+ if(density)
+ return TRUE
+ if(operating || welded)
+ return
+ var/turf/T1 = get_turf(src)
+ var/turf/T2 = get_step(T1, dir)
+ for(var/mob/living/M in T1)
+ if(M.stat == CONSCIOUS && M.pulling && M.pulling.loc == T2 && !M.pulling.anchored && M.pulling.move_resist <= M.move_force)
+ var/mob/living/M2 = M.pulling
+ if(!istype(M2) || !M2.buckled || !M2.buckled.buckle_prevents_pull)
+ to_chat(M, "You pull [M.pulling] through [src] right as it closes")
+ M.pulling.forceMove(T1)
+ M.start_pulling(M2)
+
+ for(var/mob/living/M in T2)
+ if(M.stat == CONSCIOUS && M.pulling && M.pulling.loc == T1 && !M.pulling.anchored && M.pulling.move_resist <= M.move_force)
+ var/mob/living/M2 = M.pulling
+ if(!istype(M2) || !M2.buckled || !M2.buckled.buckle_prevents_pull)
+ to_chat(M, "You pull [M.pulling] through [src] right as it closes")
+ M.pulling.forceMove(T2)
+ M.start_pulling(M2)
+ . = ..()
+
+/obj/machinery/door/firedoor/border_only/allow_hand_open(mob/user)
+ var/area/A = get_area(src)
+ if((!A || !A.fire) && !is_holding_pressure())
+ return TRUE
+ whack_a_mole(TRUE) // WOOP WOOP SIDE EFFECTS
+ var/turf/T = loc
+ var/turf/T2 = get_step(T, dir)
+ if(!T || !T2)
+ return
+ var/status1 = check_door_side(T)
+ var/status2 = check_door_side(T2)
+ if((status1 == 1 && status2 == -1) || (status1 == -1 && status2 == 1))
+ to_chat(user, "Access denied. Try closing another firedoor to minimize decompression, or using a crowbar.")
+ return FALSE
+ return TRUE
+
+/obj/machinery/door/firedoor/border_only/proc/check_door_side(turf/open/start_point)
+ var/list/turfs = list()
+ turfs[start_point] = 1
+ for(var/i = 1; (i <= turfs.len && i <= 11); i++) // check up to 11 turfs.
+ var/turf/open/T = turfs[i]
+ if(istype(T, /turf/open/space))
+ return -1
+ for(var/T2 in T.atmos_adjacent_turfs)
+ turfs[T2] = 1
+ if(turfs.len <= 10)
+ return 0 // not big enough to matter
+ return start_point.air.return_pressure() < 20 ? -1 : 1
+
/obj/machinery/door/firedoor/border_only/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && (mover.pass_flags & PASSGLASS))
return TRUE
@@ -257,6 +393,18 @@
assemblytype = /obj/structure/firelock_frame/heavy
max_integrity = 550
+/obj/machinery/door/firedoor/window
+ name = "window shutter"
+ icon = 'icons/obj/doors/doorfirewindow.dmi'
+ desc = "A second window that slides in when the original window is broken, designed to protect against hull breaches. Truly a work of genius by NT engineers."
+ glass = TRUE
+ explosion_block = 0
+ max_integrity = 50
+ resistance_flags = 0 // not fireproof
+ heat_proof = FALSE
+
+/obj/machinery/door/firedoor/window/allow_hand_open()
+ return TRUE
/obj/item/electronics/firelock
name = "firelock circuitry"
@@ -294,7 +442,7 @@
/obj/structure/firelock_frame/attackby(obj/item/C, mob/user)
switch(constructionStep)
if(CONSTRUCTION_PANEL_OPEN)
- if(istype(C, /obj/item/crowbar))
+ if(C.tool_behaviour == TOOL_CROWBAR)
C.play_tool_sound(src)
user.visible_message("[user] starts prying something out from [src]...", \
"You begin prying out the wire cover...")
@@ -308,7 +456,7 @@
constructionStep = CONSTRUCTION_WIRES_EXPOSED
update_icon()
return
- if(istype(C, /obj/item/wrench))
+ if(C.tool_behaviour == TOOL_WRENCH)
if(locate(/obj/machinery/door/firedoor) in get_turf(src))
to_chat(user, "There's already a firelock there.")
return
@@ -350,7 +498,7 @@
return
if(CONSTRUCTION_WIRES_EXPOSED)
- if(istype(C, /obj/item/wirecutters))
+ if(C.tool_behaviour == TOOL_WIRECUTTER)
C.play_tool_sound(src)
user.visible_message("[user] starts cutting the wires from [src]...", \
"You begin removing [src]'s wires...")
@@ -364,7 +512,7 @@
constructionStep = CONSTRUCTION_GUTTED
update_icon()
return
- if(istype(C, /obj/item/crowbar))
+ if(C.tool_behaviour == TOOL_CROWBAR)
C.play_tool_sound(src)
user.visible_message("[user] starts prying a metal plate into [src]...", \
"You begin prying the cover plate back onto [src]...")
@@ -379,7 +527,7 @@
update_icon()
return
if(CONSTRUCTION_GUTTED)
- if(istype(C, /obj/item/crowbar))
+ if(C.tool_behaviour == TOOL_CROWBAR)
user.visible_message("[user] begins removing the circuit board from [src]...", \
"You begin prying out the circuit board from [src]...")
if(!C.use_tool(src, user, 50, volume=50))
@@ -401,7 +549,7 @@
"You begin adding wires to [src]...")
playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1)
if(do_after(user, 60, target = src))
- if(constructionStep != CONSTRUCTION_GUTTED || !B.use_tool(src, user, 0, 5))
+ if(constructionStep != CONSTRUCTION_GUTTED || B.get_amount() < 5 || !B)
return
user.visible_message("[user] adds wires to [src].", \
"You wire [src].")
@@ -410,7 +558,7 @@
update_icon()
return
if(CONSTRUCTION_NOCIRCUIT)
- if(istype(C, /obj/item/weldingtool))
+ if(C.tool_behaviour == TOOL_WELDER)
if(!C.tool_start_check(user, amount=1))
return
user.visible_message("[user] begins cutting apart [src]'s frame...", \
diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm
deleted file mode 100644
index 2c669aac80..0000000000
--- a/code/game/machinery/exp_cloner.dm
+++ /dev/null
@@ -1,298 +0,0 @@
-//Experimental cloner; clones a body regardless of the owner's status, letting a ghost control it instead
-/obj/machinery/clonepod/experimental
- name = "experimental cloning pod"
- desc = "An ancient cloning pod. It seems to be an early prototype of the experimental cloners used in Nanotrasen Stations."
- icon = 'icons/obj/machines/cloning.dmi'
- icon_state = "pod_0"
- req_access = null
- circuit = /obj/item/circuitboard/machine/clonepod/experimental
- internal_radio = FALSE
-
-//Start growing a human clone in the pod!
-/obj/machinery/clonepod/experimental/growclone(clonename, ui, mutation_index, mindref, last_death, blood_type, datum/species/mrace, list/features, factions, list/quirks)
- if(panel_open)
- return FALSE
- if(mess || attempting)
- return FALSE
-
- attempting = TRUE //One at a time!!
- countdown.start()
-
- var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
-
- H.hardset_dna(ui, mutation_index, H.real_name, blood_type, mrace, features)
-
- if(efficiency > 2)
- var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations)
- H.dna.remove_mutation_group(unclean_mutations)
- if(efficiency > 5 && prob(20))
- H.easy_randmut(POSITIVE)
- if(efficiency < 3 && prob(50))
- var/mob/M = H.easy_randmut(NEGATIVE+MINOR_NEGATIVE)
- if(ismob(M))
- H = M
-
- H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment.
- occupant = H
-
- if(!clonename) //to prevent null names
- clonename = "clone ([rand(1,999)])"
- H.real_name = clonename
-
- icon_state = "pod_1"
- //Get the clone body ready
- maim_clone(H)
- ADD_TRAIT(H, TRAIT_STABLEHEART, "cloning")
- ADD_TRAIT(H, TRAIT_EMOTEMUTE, "cloning")
- ADD_TRAIT(H, TRAIT_MUTE, "cloning")
- ADD_TRAIT(H, TRAIT_NOBREATH, "cloning")
- ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, "cloning")
- H.Unconscious(80)
-
- var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H)
- if(LAZYLEN(candidates))
- var/mob/C = pick(candidates)
- H.key = C.key
-
- if(grab_ghost_when == CLONER_FRESH_CLONE)
- H.grab_ghost()
- to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?")
-
- if(grab_ghost_when == CLONER_MATURE_CLONE)
- H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost
- to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.")
-
- if(H)
- H.faction |= factions
-
- H.set_cloned_appearance()
-
- H.suiciding = FALSE
- attempting = FALSE
- return TRUE
-
-
-//Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks.
-/obj/machinery/computer/prototype_cloning
- name = "prototype cloning console"
- desc = "Used to operate an experimental cloner."
- icon_screen = "dna"
- icon_keyboard = "med_key"
- circuit = /obj/item/circuitboard/computer/prototype_cloning
- var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
- var/list/pods //Linked experimental cloning pods
- var/temp = "Inactive"
- var/scantemp = "Ready to Scan"
- var/loading = FALSE // Nice loading text
-
- light_color = LIGHT_COLOR_BLUE
-
-/obj/machinery/computer/prototype_cloning/Initialize()
- . = ..()
- updatemodules(TRUE)
-
-/obj/machinery/computer/prototype_cloning/Destroy()
- if(pods)
- for(var/P in pods)
- DetachCloner(P)
- pods = null
- return ..()
-
-/obj/machinery/computer/prototype_cloning/proc/GetAvailablePod(mind = null)
- if(pods)
- for(var/P in pods)
- var/obj/machinery/clonepod/experimental/pod = P
- if(pod.is_operational() && !(pod.occupant || pod.mess))
- return pod
-
-/obj/machinery/computer/prototype_cloning/proc/updatemodules(findfirstcloner)
- scanner = findscanner()
- if(findfirstcloner && !LAZYLEN(pods))
- findcloner()
-
-/obj/machinery/computer/prototype_cloning/proc/findscanner()
- var/obj/machinery/dna_scannernew/scannerf = null
-
- // Loop through every direction
- for(var/direction in GLOB.cardinals)
- // Try to find a scanner in that direction
- scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, direction))
- // If found and operational, return the scanner
- if (!isnull(scannerf) && scannerf.is_operational())
- return scannerf
-
- // If no scanner was found, it will return null
- return null
-
-/obj/machinery/computer/prototype_cloning/proc/findcloner()
- var/obj/machinery/clonepod/experimental/podf = null
- for(var/direction in GLOB.cardinals)
- podf = locate(/obj/machinery/clonepod/experimental, get_step(src, direction))
- if (!isnull(podf) && podf.is_operational())
- AttachCloner(podf)
-
-/obj/machinery/computer/prototype_cloning/proc/AttachCloner(obj/machinery/clonepod/experimental/pod)
- if(!pod.connected)
- pod.connected = src
- LAZYADD(pods, pod)
-
-/obj/machinery/computer/prototype_cloning/proc/DetachCloner(obj/machinery/clonepod/experimental/pod)
- pod.connected = null
- LAZYREMOVE(pods, pod)
-
-/obj/machinery/computer/prototype_cloning/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/multitool))
- var/obj/item/multitool/P = W
-
- if(istype(P.buffer, /obj/machinery/clonepod/experimental))
- if(get_area(P.buffer) != get_area(src))
- to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-")
- P.buffer = null
- return
- to_chat(user, "-% Successfully linked [P.buffer] with [src] %-")
- var/obj/machinery/clonepod/experimental/pod = P.buffer
- if(pod.connected)
- pod.connected.DetachCloner(pod)
- AttachCloner(pod)
- else
- P.buffer = src
- to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-")
- return
- else
- return ..()
-
-/obj/machinery/computer/prototype_cloning/attack_hand(mob/user)
- if(..())
- return
- interact(user)
-
-/obj/machinery/computer/prototype_cloning/interact(mob/user)
- user.set_machine(src)
- add_fingerprint(user)
-
- if(..())
- return
-
- updatemodules(TRUE)
-
- var/dat = ""
- dat += "Refresh"
-
- dat += "Cloning Pod Status
"
- dat += "[temp]
"
-
- if (isnull(src.scanner) || !LAZYLEN(pods))
- dat += "Modules
"
- //dat += "Reload Modules"
- if (isnull(src.scanner))
- dat += "ERROR: No Scanner detected!
"
- if (!LAZYLEN(pods))
- dat += "ERROR: No Pod detected
"
-
- // Scan-n-Clone
- if (!isnull(src.scanner))
- var/mob/living/scanner_occupant = get_mob_or_brainmob(scanner.occupant)
-
- dat += "Cloning
"
-
- dat += ""
- if(!scanner_occupant)
- dat += "Scanner Unoccupied"
- else if(loading)
- dat += "[scanner_occupant] => Scanning..."
- else
- scantemp = "Ready to Clone"
- dat += "[scanner_occupant] => [scantemp]"
- dat += "
"
-
- if(scanner_occupant)
- dat += "Clone"
- dat += "
[src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]"
- else
- dat += "Clone"
-
- var/datum/browser/popup = new(user, "cloning", "Prototype Cloning System Control")
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
-
-/obj/machinery/computer/prototype_cloning/Topic(href, href_list)
- if(..())
- return
-
- if(loading)
- return
-
- else if ((href_list["clone"]) && !isnull(scanner) && scanner.is_operational())
- scantemp = ""
-
- loading = TRUE
- updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
- say("Initiating scan...")
-
- spawn(20)
- clone_occupant(scanner.occupant)
- loading = FALSE
- updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
-
- //No locking an open scanner.
- else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational())
- if ((!scanner.locked) && (scanner.occupant))
- scanner.locked = TRUE
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else
- scanner.locked = FALSE
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
-
- else if (href_list["refresh"])
- updateUsrDialog()
- playsound(src, "terminal_type", 25, 0)
-
- add_fingerprint(usr)
- updateUsrDialog()
- return
-
-/obj/machinery/computer/prototype_cloning/proc/clone_occupant(occupant)
- var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
- var/datum/dna/dna
- if(ishuman(mob_occupant))
- var/mob/living/carbon/C = mob_occupant
- dna = C.has_dna()
- if(isbrain(mob_occupant))
- var/mob/living/brain/B = mob_occupant
- dna = B.stored_dna
-
- if(!istype(dna))
- scantemp = "Unable to locate valid genetic data."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
- if((HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && (src.scanner.scan_level < 2))
- scantemp = "Subject no longer contains the fundamental materials required to create a living clone."
- playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
- return
-
- var/clone_species
- if(dna.species)
- clone_species = dna.species
- else
- var/datum/species/rando_race = pick(GLOB.roundstart_races)
- clone_species = rando_race.type
-
- var/obj/machinery/clonepod/pod = GetAvailablePod()
- //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
- if(!LAZYLEN(pods))
- temp = "No Clonepods detected."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else if(!pod)
- temp = "No Clonepods available."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else if(pod.occupant)
- temp = "Cloning cycle already in progress."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else
- pod.growclone(mob_occupant.real_name, dna.uni_identity, dna.mutation_index, null, null, dna.blood_type, clone_species, dna.features, mob_occupant.faction)
- temp = "[mob_occupant.real_name] => Cloning data sent to pod."
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
-
diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm
index 1b2ce686d2..c3de384c58 100644
--- a/code/game/machinery/shuttle/shuttle_engine.dm
+++ b/code/game/machinery/shuttle/shuttle_engine.dm
@@ -130,7 +130,7 @@
var/deltaTemperature = req_power / heat_cap
if(deltaTemperature < 0)
return
- env.temperature += deltaTemperature
+ env.set_temperature(env.return_temperature(),deltaTemperature)
air_update_turf()
/obj/machinery/shuttle/engine/default_change_direction_wrench(mob/user, obj/item/I)
diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm
index 3c36e53b5a..56854d2d71 100644
--- a/code/game/machinery/shuttle/shuttle_heater.dm
+++ b/code/game/machinery/shuttle/shuttle_heater.dm
@@ -89,8 +89,8 @@
var/datum/gas_mixture/air_contents = airs[1]
if(!air_contents)
return
- air_contents.volume = gas_capacity
- air_contents.temperature = T20C
+ air_contents.set_volume(gas_capacity)
+ air_contents.set_temperature(T20C)
/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/hasFuel(var/required)
var/datum/gas_mixture/air_contents = airs[1]
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 1730569e10..ffabee1606 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -83,9 +83,9 @@
var/datum/gas_mixture/env = L.return_air()
var/newMode = HEATER_MODE_STANDBY
- if(setMode != HEATER_MODE_COOL && env.temperature < targetTemperature - temperatureTolerance)
+ if(setMode != HEATER_MODE_COOL && env.return_temperature() < targetTemperature - temperatureTolerance)
newMode = HEATER_MODE_HEAT
- else if(setMode != HEATER_MODE_HEAT && env.temperature > targetTemperature + temperatureTolerance)
+ else if(setMode != HEATER_MODE_HEAT && env.return_temperature() > targetTemperature + temperatureTolerance)
newMode = HEATER_MODE_COOL
if(mode != newMode)
@@ -96,7 +96,7 @@
return
var/heat_capacity = env.heat_capacity()
- var/requiredPower = abs(env.temperature - targetTemperature) * heat_capacity
+ var/requiredPower = abs(env.return_temperature() - targetTemperature) * heat_capacity
requiredPower = min(requiredPower, heatingPower)
if(requiredPower < 1)
@@ -106,7 +106,7 @@
if(mode == HEATER_MODE_COOL)
deltaTemperature *= -1
if(deltaTemperature)
- env.temperature += deltaTemperature
+ env.set_temperature(env.return_temperature() + deltaTemperature)
air_update_turf()
cell.use(requiredPower / efficiency)
else
@@ -194,9 +194,9 @@
var/curTemp
if(istype(L))
var/datum/gas_mixture/env = L.return_air()
- curTemp = env.temperature
+ curTemp = env.return_temperature()
else if(isturf(L))
- curTemp = L.temperature
+ curTemp = L.return_temperature()
if(isnull(curTemp))
data["currentTemp"] = "N/A"
else
diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm
index 717884e9a4..89b641ccc6 100644
--- a/code/game/mecha/combat/honker.dm
+++ b/code/game/mecha/combat/honker.dm
@@ -21,7 +21,7 @@
var/cell_charge = get_charge()
var/datum/gas_mixture/int_tank_air = internal_tank.return_air()
var/tank_pressure = internal_tank ? round(int_tank_air.return_pressure(),0.01) : "None"
- var/tank_temperature = internal_tank ? int_tank_air.temperature : "Unknown"
+ var/tank_temperature = internal_tank ? int_tank_air.return_temperature() : "Unknown"
var/cabin_pressure = round(return_pressure(),0.01)
var/output = {"[report_internal_damage()]
[integrity<30?"DAMAGE LEVEL CRITICAL
":null]
@@ -155,4 +155,4 @@
var/color=""
for (var/i=0;i<6;i++)
color = color+pick(colors)
- return color
\ No newline at end of file
+ return color
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index c13cb1d1c6..8039aabd1f 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -422,13 +422,13 @@
return
var/datum/gas_mixture/GM = new
if(prob(10))
- GM.gases[/datum/gas/plasma] += 100
- GM.temperature = 1500+T0C //should be enough to start a fire
+ GM.adjust_moles(/datum/gas/plasma,100)
+ GM.set_temperature(1500+T0C) //should be enough to start a fire
T.visible_message("[src] suddenly disgorges a cloud of heated plasma.")
qdel(src)
else
- GM.gases[/datum/gas/plasma] += 5
- GM.temperature = istype(T) ? T.air.return_temperature() : T20C
+ GM.adjust_moles(/datum/gas/plasma,5)
+ GM.set_temperature(istype(T) ? T.air.return_temperature() : T20C)
T.visible_message("[src] suddenly disgorges a cloud of plasma.")
T.assume_air(GM)
return
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 32be825489..d2340a15ea 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -247,10 +247,10 @@
/obj/mecha/proc/add_cabin()
cabin_air = new
- cabin_air.temperature = T20C
- cabin_air.volume = 200
- cabin_air.gases[/datum/gas/oxygen] = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
- cabin_air.gases[/datum/gas/nitrogen] = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
+ cabin_air.set_temperature(T20C)
+ cabin_air.set_volume(200)
+ cabin_air.set_moles(/datum/gas/oxygen,O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature()))
+ cabin_air.set_moles(/datum/gas/nitrogen,N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature()))
return cabin_air
/obj/mecha/proc/add_radio()
@@ -302,9 +302,9 @@
if(int_tank_air.return_pressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH))
setInternalDamage(MECHA_INT_TANK_BREACH)
if(int_tank_air && int_tank_air.return_volume() > 0) //heat the air_contents
- int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15))
+ int_tank_air.set_temperature(min(6000+T0C, int_tank_air.return_temperature()+rand(10,15)))
if(cabin_air && cabin_air.return_volume()>0)
- cabin_air.temperature = min(6000+T0C, cabin_air.return_temperature()+rand(10,15))
+ cabin_air.set_temperature(min(6000+T0C, cabin_air.return_temperature()+rand(10,15)))
if(cabin_air.return_temperature() > max_temperature/2)
take_damage(4/round(max_temperature/cabin_air.return_temperature(),0.1), BURN, 0, 0)
@@ -329,8 +329,8 @@
if(internal_temp_regulation)
if(cabin_air && cabin_air.return_volume() > 0)
- var/delta = cabin_air.temperature - T20C
- cabin_air.temperature -= max(-10, min(10, round(delta/4,0.1)))
+ var/delta = cabin_air.return_temperature() - T20C
+ cabin_air.set_temperature(cabin_air.return_temperature() - max(-10, min(10, round(delta/4,0.1))))
if(internal_tank)
var/datum/gas_mixture/tank_air = internal_tank.return_air()
diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm
index 8b6146dee7..067cffd319 100644
--- a/code/game/mecha/mecha_topic.dm
+++ b/code/game/mecha/mecha_topic.dm
@@ -75,7 +75,7 @@
var/cell_charge = get_charge()
var/datum/gas_mixture/int_tank_air = internal_tank.return_air()
var/tank_pressure = internal_tank ? round(int_tank_air.return_pressure(),0.01) : "None"
- var/tank_temperature = internal_tank ? int_tank_air.temperature : "Unknown"
+ var/tank_temperature = internal_tank ? int_tank_air.return_temperature() : "Unknown"
var/cabin_pressure = round(return_pressure(),0.01)
. = {"[report_internal_damage()]
[integrity<30?"DAMAGE LEVEL CRITICAL
":null]
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index c56731b3d3..faab0df6e9 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -212,6 +212,11 @@
desc = "A heretical poster depicting the titular star of an equally heretical book."
icon_state = "poster4"
+/obj/structure/sign/poster/contraband/post_ratvar
+ name = "Post This Ratvar"
+ desc = "Oh what in the hell? Those cultists have animated paper technology and they use it for a meme?"
+ icon_state = "postvar"
+
/obj/structure/sign/poster/contraband/syndicate_recruitment
name = "Syndicate Recruitment"
desc = "See the galaxy! Shatter corrupt megacorporations! Join today!"
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index f98b4937ef..23c5822727 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -40,12 +40,11 @@
if(hotspot && istype(T) && T.air)
qdel(hotspot)
var/datum/gas_mixture/G = T.air
- var/plas_amt = min(30,G.gases[/datum/gas/plasma]) //Absorb some plasma
- G.gases[/datum/gas/plasma] -= plas_amt
+ var/plas_amt = min(30,G.get_moles(/datum/gas/plasma)) //Absorb some plasma
+ G.adjust_moles(/datum/gas/plasma,-plas_amt)
absorbed_plasma += plas_amt
- if(G.temperature > T20C)
- G.temperature = max(G.temperature/2,T20C)
- GAS_GARBAGE_COLLECT(G.gases)
+ if(G.return_temperature() > T20C)
+ G.set_temperature(max(G.return_temperature()/2,T20C))
T.air_update_turf()
/obj/effect/particle_effect/foam/firefighting/kill_foam()
@@ -317,15 +316,13 @@
O.ClearWet()
if(O.air)
var/datum/gas_mixture/G = O.air
- G.temperature = 293.15
+ G.set_temperature(293.15)
for(var/obj/effect/hotspot/H in O)
qdel(H)
- var/list/G_gases = G.gases
- for(var/I in G_gases)
+ for(var/I in G.get_gases())
if(I == /datum/gas/oxygen || I == /datum/gas/nitrogen)
continue
- G_gases[I] = 0
- GAS_GARBAGE_COLLECT(G.gases)
+ G.set_moles(I, 0)
O.air_update_turf()
for(var/obj/machinery/atmospherics/components/unary/U in O)
if(!U.welded)
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index 80c0db2b7d..9a11f0e1d7 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -166,15 +166,13 @@
if(T.air)
var/datum/gas_mixture/G = T.air
if(!distcheck || get_dist(T, location) < blast) // Otherwise we'll get silliness like people using Nanofrost to kill people through walls with cold air
- G.temperature = temperature
+ G.set_temperature(temperature)
T.air_update_turf()
for(var/obj/effect/hotspot/H in T)
qdel(H)
- var/list/G_gases = G.gases
- if(G_gases[/datum/gas/plasma])
- G_gases[/datum/gas/nitrogen] += (G_gases[/datum/gas/plasma])
- G_gases[/datum/gas/plasma] = 0
- GAS_GARBAGE_COLLECT(G.gases)
+ if(G.get_moles(/datum/gas/plasma))
+ G.adjust_moles(/datum/gas/nitrogen, G.get_moles(/datum/gas/plasma))
+ G.set_moles(/datum/gas/plasma, 0)
if (weldvents)
for(var/obj/machinery/atmospherics/components/unary/U in T)
if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber.
diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm
index a0ae300c79..b5aaff5746 100644
--- a/code/game/objects/effects/spawners/bombspawner.dm
+++ b/code/game/objects/effects/spawners/bombspawner.dm
@@ -19,11 +19,11 @@
var/obj/item/tank/internals/plasma/PT = new(V)
var/obj/item/tank/internals/oxygen/OT = new(V)
- PT.air_contents.gases[/datum/gas/plasma] = pressure_p*PT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p))
- PT.air_contents.temperature = CELSIUS_TO_KELVIN(temp_p)
+ PT.air_contents.set_moles(/datum/gas/plasma, pressure_p*PT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p)))
+ PT.air_contents.set_temperature(CELSIUS_TO_KELVIN(temp_p))
- OT.air_contents.gases[/datum/gas/oxygen] = pressure_o*OT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o))
- OT.air_contents.temperature = CELSIUS_TO_KELVIN(temp_o)
+ OT.air_contents.set_moles(/datum/gas/oxygen, pressure_o*OT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o)))
+ OT.air_contents.set_temperature(CELSIUS_TO_KELVIN(temp_o))
V.tank_one = PT
V.tank_two = OT
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 2c7f701a6e..44164ed86c 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -666,28 +666,18 @@
lootcount = 1
spawn_on_turf = FALSE
loot = list("" = 50,
- /obj/item/weaponcrafting/improvised_parts/barrel_rifle = 10,
- /obj/item/weaponcrafting/improvised_parts/barrel_shotgun = 5,
- /obj/item/weaponcrafting/improvised_parts/barrel_pistol = 5,
- /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 10,
- /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 3,
- /obj/item/weaponcrafting/improvised_parts/pistol_receiver = 3,
- /obj/item/weaponcrafting/improvised_parts/laser_receiver = 1,
- /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 10,
- /obj/item/weaponcrafting/improvised_parts/makeshift_lens = 3,
+ /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 13,
+ /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 13,
+ /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 12,
)
/obj/effect/spawner/lootdrop/weapon_parts
- name = "random weapon parts spawner 25%"
+ name = "random weapon parts spawner 20%"
lootcount = 1
spawn_on_turf = FALSE
- loot = list("" = 75,
- /obj/item/weaponcrafting/improvised_parts/barrel_rifle = 5,
- /obj/item/weaponcrafting/improvised_parts/barrel_pistol = 5,
+ loot = list("" = 80,
/obj/item/weaponcrafting/improvised_parts/rifle_receiver = 5,
- /obj/item/weaponcrafting/improvised_parts/pistol_receiver = 2,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 5,
- /obj/item/weaponcrafting/improvised_parts/makeshift_lens = 3,
)
/obj/effect/spawner/lootdrop/ammo
@@ -695,8 +685,6 @@
lootcount = 1
spawn_on_turf = FALSE
loot = list("" = 25,
- /obj/item/ammo_box/c32mm = 15,
- /obj/item/ammo_box/r32mm = 15,
/obj/item/ammo_box/magazine/wt550m9 = 1,
/obj/item/ammo_casing/shotgun/buckshot = 7,
/obj/item/ammo_casing/shotgun/rubbershot = 7,
@@ -709,8 +697,6 @@
lootcount = 1
spawn_on_turf = FALSE
loot = list("" = 50,
- /obj/item/ammo_box/c32mm = 7,
- /obj/item/ammo_box/r32mm = 7,
/obj/item/ammo_box/magazine/wt550m9 = 2,
/obj/item/ammo_casing/shotgun/buckshot = 10,
/obj/item/ammo_casing/shotgun/rubbershot = 10,
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 53adc46239..396f463136 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -486,4 +486,15 @@
addtimer(CALLBACK(src, .proc/end), 15)
/obj/effect/constructing_effect/proc/end()
- qdel(src)
\ No newline at end of file
+ qdel(src)
+
+/obj/effect/temp_visual/dir_setting/space_wind
+ icon = 'icons/effects/atmospherics.dmi'
+ icon_state = "space_wind"
+ layer = FLY_LAYER
+ duration = 20
+ mouse_opacity = 0
+
+/obj/effect/temp_visual/dir_setting/space_wind/Initialize(mapload, set_dir, set_alpha = 255)
+ . = ..()
+ alpha = set_alpha
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 9f1b830cf0..90e232938c 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -68,6 +68,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
var/click_delay = CLICK_CD_MELEE
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
+ var/current_equipped_slot
pass_flags = PASSTABLE
pressure_resistance = 4
var/obj/item/master = null
@@ -179,6 +180,11 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(damtype == "brute")
hitsound = "swing_hit"
+ if(used_skills)
+ for(var/path in used_skills)
+ var/datum/skill/S = GLOB.skill_datums[path]
+ LAZYADD(used_skills[path], S.skill_traits)
+
/obj/item/Destroy()
item_flags &= ~DROPDEL //prevent reqdels
if(ismob(loc))
@@ -315,6 +321,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
return
if(anchored)
return
+ if(loc == user && current_equipped_slot && current_equipped_slot != SLOT_HANDS)
+ if(current_equipped_slot in user.check_obscured_slots())
+ to_chat(src, "You are unable to unequip that while wearing other garments over it!")
+ return FALSE
if(resistance_flags & ON_FIRE)
var/mob/living/carbon/C = user
@@ -336,7 +346,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
C.update_damage_overlays()
return
- if(acid_level > 20 && !ismob(loc))// so we can still remove the clothes on us that have acid.
+ if(acid_level > 20 && ismob(loc))// so we can still remove the clothes on us that have acid.
var/mob/living/carbon/C = user
if(istype(C))
if(!C.gloves || (!(C.gloves.resistance_flags & (UNACIDABLE|ACID_PROOF))))
@@ -379,6 +389,11 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
return
if(anchored)
return
+ if(loc == user && current_equipped_slot && current_equipped_slot != SLOT_HANDS)
+ if(current_equipped_slot in user.check_obscured_slots())
+ to_chat(src, "You are unable to unequip that while wearing other garments over it!")
+ return FALSE
+
SEND_SIGNAL(loc, COMSIG_TRY_STORAGE_TAKE, src, user.loc, TRUE)
@@ -423,6 +438,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/proc/dropped(mob/user)
SHOULD_CALL_PARENT(TRUE)
+ current_equipped_slot = null
for(var/X in actions)
var/datum/action/A = X
A.Remove(user)
@@ -470,7 +486,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
// for items that can be placed in multiple slots
// note this isn't called during the initial dressing of a player
/obj/item/proc/equipped(mob/user, slot)
+ SHOULD_CALL_PARENT(TRUE)
. = SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot)
+ current_equipped_slot = slot
if(!(. & COMPONENT_NO_GRANT_ACTIONS))
for(var/X in actions)
var/datum/action/A = X
@@ -835,7 +853,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
// Called when a mob tries to use the item as a tool.
// Handles most checks.
-/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks, skill_gain_mult = 1, max_level = INFINITY)
+/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks, skill_gain_mult = STD_USE_TOOL_MULT)
// No delay means there is no start message, and no reason to call tool_start_check before use_tool.
// Run the start check here so we wouldn't have to call it manually.
if(!delay && !tool_start_check(user, amount))
@@ -880,7 +898,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
for(var/skill in used_skills)
if(!(SKILL_TRAINING_TOOL in used_skills[skill]))
continue
- user.mind.auto_gain_experience(skill, gain*skill_gain_mult, GET_STANDARD_LVL(max_level))
+ var/datum/skill/S = GLOB.skill_datums[skill]
+ user.mind.auto_gain_experience(skill, gain*skill_gain_mult*S.item_skill_gain_multi)
return TRUE
diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm
index 766c3d8636..16bc6897c8 100644
--- a/code/game/objects/items/chrono_eraser.dm
+++ b/code/game/objects/items/chrono_eraser.dm
@@ -246,9 +246,9 @@
/obj/effect/chrono_field/return_air() //we always have nominal air and temperature
var/datum/gas_mixture/GM = new
- GM.gases[/datum/gas/oxygen] = MOLES_O2STANDARD
- GM.gases[/datum/gas/nitrogen] = MOLES_N2STANDARD
- GM.temperature = T20C
+ GM.set_moles(/datum/gas/oxygen, MOLES_O2STANDARD)
+ GM.set_moles(/datum/gas/nitrogen, MOLES_N2STANDARD)
+ GM.set_temperature(T20C)
return GM
/obj/effect/chrono_field/Move()
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index bfbacb1a34..de32375642 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -794,6 +794,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
reagents.clear_reagents()
/obj/item/clothing/mask/vape/equipped(mob/user, slot)
+ . = ..()
if(slot == SLOT_WEAR_MASK)
if(!screw)
to_chat(user, "You start puffing on the vape.")
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index f94c8f3513..2fa48582f7 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -116,9 +116,9 @@
build_path = /obj/machinery/computer/cloning
var/list/records = list()
-/obj/item/circuitboard/computer/prototype_cloning
+/obj/item/circuitboard/computer/cloning/prototype
name = "Prototype Cloning (Computer Board)"
- build_path = /obj/machinery/computer/prototype_cloning
+ build_path = /obj/machinery/computer/cloning/prototype
/obj/item/circuitboard/computer/arcade/battle
name = "Arcade Battle (Computer Board)"
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 2dabcca29f..d706f5468a 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -437,7 +437,6 @@ GLOBAL_LIST_EMPTY(PDAs)
dat += "Unable to obtain a reading.
"
else
var/datum/gas_mixture/environment = T.return_air()
- var/list/env_gases = environment.gases
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles()
@@ -445,12 +444,12 @@ GLOBAL_LIST_EMPTY(PDAs)
dat += "Air Pressure: [round(pressure,0.1)] kPa
"
if (total_moles)
- for(var/id in env_gases)
- var/gas_level = env_gases[id]/total_moles
+ for(var/id in environment.get_gases())
+ var/gas_level = environment.get_moles(id)/total_moles
if(gas_level > 0)
dat += "[GLOB.meta_gas_names[id]]: [round(gas_level*100, 0.01)]%
"
- dat += "Temperature: [round(environment.temperature-T0C)]°C
"
+ dat += "Temperature: [round(environment.return_temperature()-T0C)]°C
"
dat += "
"
else//Else it links to the cart menu proc. Although, it really uses menu hub 4--menu 4 doesn't really exist as it simply redirects to hub.
dat += cartridge.generate_menu()
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 28e1e1294f..bc6a721d13 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -556,41 +556,38 @@ GENETICS SCANNER
else
to_chat(user, "Pressure: [round(pressure, 0.01)] kPa")
if(total_moles)
- var/list/env_gases = environment.gases
- var/o2_concentration = env_gases[/datum/gas/oxygen]/total_moles
- var/n2_concentration = env_gases[/datum/gas/nitrogen]/total_moles
- var/co2_concentration = env_gases[/datum/gas/carbon_dioxide]/total_moles
- var/plasma_concentration = env_gases[/datum/gas/plasma]/total_moles
+ var/o2_concentration = environment.get_moles(/datum/gas/oxygen)/total_moles
+ var/n2_concentration = environment.get_moles(/datum/gas/nitrogen)/total_moles
+ var/co2_concentration = environment.get_moles(/datum/gas/carbon_dioxide)/total_moles
+ var/plasma_concentration = environment.get_moles(/datum/gas/plasma)/total_moles
if(abs(n2_concentration - N2STANDARD) < 20)
- to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/nitrogen], 0.01)] mol)")
+ to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)")
else
- to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/nitrogen], 0.01)] mol)")
+ to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)")
if(abs(o2_concentration - O2STANDARD) < 2)
- to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/oxygen], 0.01)] mol)")
+ to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)")
else
- to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/oxygen], 0.01)] mol)")
+ to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)")
if(co2_concentration > 0.01)
- to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/carbon_dioxide], 0.01)] mol)")
+ to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)")
else
- to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/carbon_dioxide], 0.01)] mol)")
+ to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)")
if(plasma_concentration > 0.005)
- to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/plasma], 0.01)] mol)")
+ to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)")
else
- to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/plasma], 0.01)] mol)")
+ to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)")
- GAS_GARBAGE_COLLECT(environment.gases)
-
- for(var/id in env_gases)
+ for(var/id in environment.get_gases())
if(id in GLOB.hardcoded_gases)
continue
- var/gas_concentration = env_gases[id]/total_moles
- to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(env_gases[id], 0.01)] mol)")
- to_chat(user, "Temperature: [round(environment.temperature-T0C, 0.01)] °C ([round(environment.temperature, 0.01)] K)")
+ var/gas_concentration = environment.get_moles(id)/total_moles
+ to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)")
+ to_chat(user, "Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)")
/obj/item/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens
. = ..()
@@ -669,8 +666,8 @@ GENETICS SCANNER
var/total_moles = air_contents.total_moles()
var/pressure = air_contents.return_pressure()
- var/volume = air_contents.return_volume() //could just do mixture.volume... but safety, I guess?
- var/temperature = air_contents.temperature
+ var/volume = air_contents.return_volume()
+ var/temperature = air_contents.return_temperature()
var/cached_scan_results = air_contents.analyzer_results
if(total_moles > 0)
@@ -678,10 +675,9 @@ GENETICS SCANNER
to_chat(user, "Volume: [volume] L")
to_chat(user, "Pressure: [round(pressure,0.01)] kPa")
- var/list/cached_gases = air_contents.gases
- for(var/id in cached_gases)
- var/gas_concentration = cached_gases[id]/total_moles
- to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(cached_gases[id], 0.01)] mol)")
+ for(var/id in air_contents.get_gases())
+ var/gas_concentration = air_contents.get_moles(id)/total_moles
+ to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(air_contents.get_moles(id), 0.01)] mol)")
to_chat(user, "Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)")
else
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index b929642f33..9d5b6d5b6c 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -168,8 +168,8 @@
target_self = TRUE
if(change_volume)
if(!target_self)
- target.volume += tank_two.volume
- target.volume += tank_one.air_contents.volume
+ target.set_volume(target.return_volume() + tank_two.volume)
+ target.set_volume(target.return_volume() + tank_one.air_contents.return_volume())
var/datum/gas_mixture/temp
temp = tank_one.air_contents.remove_ratio(1)
target.merge(temp)
@@ -180,11 +180,11 @@
/obj/item/transfer_valve/proc/split_gases()
if (!valve_open || !tank_one || !tank_two)
return
- var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume
+ var/ratio1 = tank_one.air_contents.return_volume()/tank_two.air_contents.return_volume()
var/datum/gas_mixture/temp
temp = tank_two.air_contents.remove_ratio(ratio1)
tank_one.air_contents.merge(temp)
- tank_two.air_contents.volume -= tank_one.air_contents.volume
+ tank_two.air_contents.set_volume(tank_two.air_contents.return_volume() - tank_one.air_contents.return_volume())
/*
Exadv1: I know this isn't how it's going to work, but this was just to check
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index c785c22813..f293e6579a 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -204,11 +204,10 @@
//TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this...
//Transfer 5% of current tank air contents to turf
var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount)
- if(air_transfer.gases[/datum/gas/plasma])
- air_transfer.gases[/datum/gas/plasma] *= 5
+ air_transfer.set_moles(/datum/gas/plasma, air_transfer.get_moles(/datum/gas/plasma) * 5)
target.assume_air(air_transfer)
//Burn it based on transfered gas
- target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500)
+ target.hotspot_expose((ptank.air_contents.return_temperature()*2) + 380,500)
//location.hotspot_expose(1000,500,1)
SSair.add_to_active(target, 0)
diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm
index 4ce0e811c3..f06dd634c6 100644
--- a/code/game/objects/items/grenades/chem_grenade.dm
+++ b/code/game/objects/items/grenades/chem_grenade.dm
@@ -97,7 +97,7 @@
to_chat(user, "You add [A] to the [initial(name)] assembly.")
else if(stage == EMPTY && istype(I, /obj/item/stack/cable_coil))
- if (I.use_tool(src, user, 0, 1, max_level = JOB_SKILL_BASIC))
+ if (I.use_tool(src, user, 0, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
det_time = 50 // In case the cable_coil was removed and readded.
stage_change(WIRED)
to_chat(user, "You rig the [initial(name)] assembly.")
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index 9d9409acf0..8b322d20cb 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -22,6 +22,11 @@
var/occupant_weight = 0
var/max_occupants = 3 //Hard-cap so you can't have infinite mice or something in one carrier
var/max_occupant_weight = MOB_SIZE_SMALL //This is calculated from the mob sizes of occupants
+ var/entrance_name = "door" //name of the entrance to the item
+ var/escape_time = 200 //how long it takes for mobs above small sizes to escape (for small sizes, its randomly 1.5 to 2x this)
+ var/load_time = 30 //how long it takes for mobs to be loaded into the pet carrier
+ var/has_lock_sprites = TRUE //whether to load the lock overlays or not
+ var/allows_hostiles = FALSE //does the pet carrier allow hostile entities to be held within it?
/obj/item/pet_carrier/Destroy()
if(occupants.len)
@@ -51,20 +56,20 @@
else
. += "It has nothing inside."
if(user.canUseTopic(src))
- . += "Activate it in your hand to [open ? "close" : "open"] its door."
+ . += "Activate it in your hand to [open ? "close" : "open"] its [entrance_name]."
if(!open)
- . += "Alt-click to [locked ? "unlock" : "lock"] its door."
+ . += "Alt-click to [locked ? "unlock" : "lock"] its [entrance_name]."
/obj/item/pet_carrier/attack_self(mob/living/user)
if(open)
- to_chat(user, "You close [src]'s door.")
+ to_chat(user, "You close [src]'s [entrance_name].")
playsound(user, 'sound/effects/bin_close.ogg', 50, TRUE)
open = FALSE
else
if(locked)
to_chat(user, "[src] is locked!")
return
- to_chat(user, "You open [src]'s door.")
+ to_chat(user, "You open [src]'s [entrance_name].")
playsound(user, 'sound/effects/bin_open.ogg', 50, TRUE)
open = TRUE
update_icon()
@@ -86,7 +91,7 @@
if(user.a_intent == INTENT_HARM)
return ..()
if(!open)
- to_chat(user, "You need to open [src]'s door!")
+ to_chat(user, "You need to open [src]'s [entrance_name]!")
return
if(target.mob_size > max_occupant_weight)
if(ishuman(target))
@@ -94,13 +99,15 @@
if(iscatperson(H))
to_chat(user, "You'd need a lot of catnip and treats, plus maybe a laser pointer, for that to work.")
else
- to_chat(user, "Humans, generally, do not fit into pet carriers.")
+ to_chat(user, "Humans, generally, do not fit into [name]s.")
else
to_chat(user, "You get the feeling [target] isn't meant for a [name].")
return
if(user == target)
to_chat(user, "Why would you ever do that?")
return
+ if(ishostile(target) && !allows_hostiles && target.move_resist < MOVE_FORCE_VERY_STRONG) //don't allow goliaths into pet carriers
+ to_chat(user, "You have a feeling you shouldn't keep this as a pet.")
load_occupant(user, target)
/obj/item/pet_carrier/relaymove(mob/living/user, direction)
@@ -110,8 +117,8 @@
remove_occupant(user)
return
else if(!locked)
- loc.visible_message("[user] pushes open the door to [src]!", \
- "[user] pushes open the door of [src]!")
+ loc.visible_message("[user] pushes open the [entrance_name] to [src]!", \
+ "[user] pushes open the [entrance_name] of [src]!")
open = TRUE
update_icon()
return
@@ -119,12 +126,19 @@
container_resist(user)
/obj/item/pet_carrier/container_resist(mob/living/user)
+ //don't do the whole resist timer thing if it's open!
+ if(open)
+ loc.visible_message("[user] climbs out of [src]!", \
+ "[user] jumps out of [src]!")
+ remove_occupant(user)
+ return
+
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
if(user.mob_size <= MOB_SIZE_SMALL)
- to_chat(user, "You poke a limb through [src]'s bars and start fumbling for the lock switch... (This will take some time.)")
- to_chat(loc, "You see [user] reach through the bars and fumble for the lock switch!")
- if(!do_after(user, rand(300, 400), target = user) || open || !locked || !(user in occupants))
+ to_chat(user, "You begin to try escaping the [src] and start fumbling for the lock switch... (This will take some time.)")
+ to_chat(loc, "You see [user] attempting to unlock the [src]!")
+ if(!do_after(user, rand(escape_time * 1.5, escape_time * 2), target = user) || open || !locked || !(user in occupants))
return
loc.visible_message("[user] flips the lock switch on [src] by reaching through!", null, null, null, user)
to_chat(user, "Bingo! The lock pops open!")
@@ -132,12 +146,12 @@
playsound(src, 'sound/machines/boltsup.ogg', 30, TRUE)
update_icon()
else
- loc.visible_message("[src] starts rattling as something pushes against the door!", null, null, null, user)
+ loc.visible_message("[src] starts rattling as something pushes against the [entrance_name]!", null, null, null, user)
to_chat(user, "You start pushing out of [src]... (This will take about 20 seconds.)")
- if(!do_after(user, 200, target = user) || open || !locked || !(user in occupants))
+ if(!do_after(user, escape_time, target = user) || open || !locked || !(user in occupants))
return
loc.visible_message("[user] shoves out of [src]!", null, null, null, user)
- to_chat(user, "You shove open [src]'s door against the lock's resistance and fall out!")
+ to_chat(user, "You shove open [src]'s [entrance_name] against the lock's resistance and fall out!")
locked = FALSE
open = TRUE
update_icon()
@@ -151,7 +165,7 @@
/obj/item/pet_carrier/update_overlays()
. = ..()
- if(!open)
+ if(!open && has_lock_sprites)
. += "[locked ? "" : "un"]locked"
/obj/item/pet_carrier/MouseDrop(atom/over_atom)
@@ -170,7 +184,7 @@
user.visible_message("[user] starts loading [target] into [src].", \
"You start loading [target] into [src]...", null, null, target)
to_chat(target, "[user] starts loading you into [user.p_their()] [name]!")
- if(!do_mob(user, target, 30))
+ if(!do_mob(user, target, load_time))
return
if(target in occupants)
return
@@ -192,9 +206,74 @@
/obj/item/pet_carrier/proc/remove_occupant(mob/living/occupant, turf/new_turf)
if(!(occupant in occupants) || !istype(occupant))
return
- occupant.forceMove(new_turf ? new_turf : drop_location())
+ occupant.forceMove(new_turf ? new_turf : get_turf(src))
occupants -= occupant
occupant_weight -= occupant.mob_size
occupant.setDir(SOUTH)
+//bluespace jar, a reskin of the pet carrier that can fit people and smashes when thrown
+/obj/item/pet_carrier/bluespace
+ name = "bluespace jar"
+ desc = "A jar, that seems to be bigger on the inside, somehow allowing lifeforms to fit through its narrow entrance."
+ open = FALSE //starts closed so it looks better on menus
+ icon_state = "bluespace_jar"
+ item_state = "bluespace_jar"
+ lefthand_file = ""
+ righthand_file = ""
+ max_occupant_weight = MOB_SIZE_HUMAN //can fit people, like a bluespace bodybag!
+ load_time = 40 //loading things into a jar takes longer than a regular pet carrier
+ entrance_name = "lid"
+ w_class = WEIGHT_CLASS_SMALL //it's a jar
+ throw_speed = 3
+ throw_range = 7
+ max_occupants = 1 //far less than a regular carrier or bluespace bodybag, because it can be thrown to release the contents
+ allows_hostiles = TRUE //can fit hostile creatures, with the move resist restrictions in place, this means they still cannot take things like legions/goliaths/etc regardless
+ has_lock_sprites = FALSE //jar doesn't show the regular lock overlay
+ custom_materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 600)
+ escape_time = 10 //half the time of a bluespace bodybag
+ var/datum/gas_mixture/occupant_gas_supply
+
+/obj/item/pet_carrier/bluespace/update_icon_state()
+ if(open)
+ icon_state = "bluespace_jar_open"
+ else
+ icon_state = "bluespace_jar"
+
+/obj/item/pet_carrier/bluespace/throw_impact()
+ . = ..()
+ //delete the item upon impact, releasing the creature inside (this is handled by its deletion)
+ if(occupants.len)
+ loc.visible_message("The bluespace jar smashes, releasing [occupants[1]]!")
+ playsound(src, "shatter", 70, 1)
+ qdel(src)
+
+/obj/item/pet_carrier/bluespace/add_occupant(mob/living/occupant) //update the gas supply as required, this acts like magical internals
+ . = ..()
+ if(!occupant_gas_supply)
+ occupant_gas_supply = new
+ if(isanimal(occupant))
+ var/mob/living/simple_animal/animal = occupant
+ occupant_gas_supply.set_temperature(animal.minbodytemp) //simple animals only care about temperature when their turf isnt a location
+ else
+ if(ishuman(occupant)) //humans require resistance to cold/heat and living in no air while inside, and lose this when outside
+ ADD_TRAIT(occupant, TRAIT_RESISTCOLD, "bluespace_container_cold_resist")
+ ADD_TRAIT(occupant, TRAIT_RESISTHEAT, "bluespace_container_heat_resist")
+ ADD_TRAIT(occupant, TRAIT_NOBREATH, "bluespace_container_no_breath")
+ ADD_TRAIT(occupant, TRAIT_RESISTHIGHPRESSURE, "bluespace_container_resist_high_pressure")
+ ADD_TRAIT(occupant, TRAIT_RESISTLOWPRESSURE, "bluespace_container_resist_low_pressure")
+
+/obj/item/pet_carrier/bluespace/remove_occupant(mob/living/occupant)
+ . = ..()
+ if(ishuman(occupant))
+ REMOVE_TRAIT(occupant, TRAIT_RESISTCOLD, "bluespace_container_cold_resist")
+ REMOVE_TRAIT(occupant, TRAIT_RESISTHEAT, "bluespace_container_heat_resist")
+ REMOVE_TRAIT(occupant, TRAIT_NOBREATH, "bluespace_container_no_breath")
+ REMOVE_TRAIT(occupant, TRAIT_RESISTHIGHPRESSURE, "bluespace_container_resist_high_pressure")
+ REMOVE_TRAIT(occupant, TRAIT_RESISTLOWPRESSURE, "bluespace_container_resist_low_pressure")
+
+/obj/item/pet_carrier/bluespace/return_air()
+ if(!occupant_gas_supply)
+ occupant_gas_supply = new
+ return occupant_gas_supply
+
#undef pet_carrier_full
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 4b8728e426..1f69cdae2e 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -355,6 +355,7 @@
emaggedhitdamage = 0
/obj/item/borg/lollipop/equipped()
+ . = ..()
check_amount()
/obj/item/borg/lollipop/dropped(mob/user)
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index aefa5d3cc8..154714b13f 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -26,7 +26,7 @@
/datum/block_parry_data/shield
block_damage_multiplier = 0.25
block_stamina_efficiency = 2.5
- block_stamina_cost_per_second = 3.5
+ block_stamina_cost_per_second = 2.5
block_slowdown = 0
block_lock_attacking = FALSE
block_lock_sprinting = TRUE
@@ -386,7 +386,7 @@ obj/item/shield/riot/bullet_proof
max_integrity = 100
obj_integrity = 100
can_shatter = FALSE
- item_flags = SLOWS_WHILE_IN_HAND
+ item_flags = SLOWS_WHILE_IN_HAND | ITEM_CAN_BLOCK
var/recharge_timerid
var/recharge_delay = 15 SECONDS
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 57af862b69..d4baea2487 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -69,7 +69,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
if (get_amount() < 1 || CC.get_amount() < 5)
to_chat(user, "You attach wire to the [name].")
var/obj/item/stack/light_w/new_tile = new(user.loc)
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index f0a57fddb2..3ca7137548 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -240,9 +240,8 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, one_per_turf = TRUE, on_floor = TRUE),\
)),
null, \
- new/datum/stack_recipe("wooden firearm body", /obj/item/weaponcrafting/improvised_parts/wooden_body, 10, time = 40), \
- new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), \
- new/datum/stack_recipe("pistol grip", /obj/item/weaponcrafting/improvised_parts/wooden_grip, 5, time = 40), \
+ new/datum/stack_recipe("wooden firearm body", /obj/item/weaponcrafting/improvised_parts/wooden_body, 10, time = 20), \
+ new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 20), \
new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \
new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wood, 2, time = 30), \
new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
@@ -382,6 +381,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("chemistry bag", /obj/item/storage/bag/chemistry, 4), \
new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4), \
null, \
+ new/datum/stack_recipe("string", /obj/item/weaponcrafting/string, 1, time = 10), \
new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \
new/datum/stack_recipe("rag", /obj/item/reagent_containers/rag, 1), \
new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \
@@ -429,7 +429,6 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 40), \
new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 40), \
new/datum/stack_recipe("durathread bandana", /obj/item/clothing/mask/bandana/durathread, 1, time = 25), \
- new/datum/stack_recipe("durathread string", /obj/item/weaponcrafting/durathread_string, 1, time = 40), \
))
/obj/item/stack/sheet/durathread
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm
index aac642a05e..2831311eff 100644
--- a/code/game/objects/items/storage/bags.dm
+++ b/code/game/objects/items/storage/bags.dm
@@ -326,6 +326,7 @@
w_class = WEIGHT_CLASS_BULKY
flags_1 = CONDUCT_1
custom_materials = list(/datum/material/iron=3000)
+ var/max_items = 7
/obj/item/storage/bag/tray/ComponentInitialize()
. = ..()
@@ -333,6 +334,7 @@
STR.max_w_class = WEIGHT_CLASS_NORMAL
STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food, /obj/item/reagent_containers/glass, /datum/reagent/consumable, /obj/item/kitchen/knife, /obj/item/kitchen/rollingpin, /obj/item/kitchen/fork, /obj/item/storage/box)) //Should cover: Bottles, Beakers, Bowls, Booze, Glasses, Food, Kitchen Tools, and ingredient boxes.
STR.insert_preposition = "on"
+ STR.max_items = max_items
/obj/item/storage/bag/tray/attack(mob/living/M, mob/living/user)
. = ..()
@@ -373,6 +375,14 @@
. = ..()
update_icon()
+//bluespace tray, holds more items
+/obj/item/storage/bag/tray/bluespace
+ name = "bluespace tray"
+ icon_state = "bluespace_tray"
+ desc = "A tray created using bluespace technology to fit more food on it."
+ max_items = 30 // far more items
+ custom_materials = list(/datum/material/iron = 2000, /datum/material/bluespace = 500)
+
/*
* Chemistry bag
*/
@@ -462,4 +472,4 @@
STR.max_combined_w_class = INFINITY
STR.max_items = 2
STR.display_numerical_stacking = TRUE
- STR.can_hold = typecacheof(list(/obj/item/rcd_ammo, /obj/item/stack/sheet))
\ No newline at end of file
+ STR.can_hold = typecacheof(list(/obj/item/rcd_ammo, /obj/item/stack/sheet))
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index 821fd52bd1..927a29407c 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -207,18 +207,18 @@
cig_position++
/obj/item/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!ismob(M))
- return
+ if(M != user || !istype(M))
+ return ..()
var/obj/item/clothing/mask/cigarette/cig = locate(/obj/item/clothing/mask/cigarette) in contents
if(cig)
- if(M == user && contents.len > 0 && !user.wear_mask)
+ if(!user.wear_mask && !(SLOT_WEAR_MASK in M.check_obscured_slots()))
var/obj/item/clothing/mask/cigarette/W = cig
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, M)
M.equip_to_slot_if_possible(W, SLOT_WEAR_MASK)
contents -= W
to_chat(user, "You take \a [W] out of the pack.")
else
- ..()
+ return ..()
else
to_chat(user, "There are no [icon_type]s left in the pack.")
diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm
index 817258d1c7..7cf25098e1 100644
--- a/code/game/objects/items/tanks/jetpack.dm
+++ b/code/game/objects/items/tanks/jetpack.dm
@@ -21,7 +21,7 @@
/obj/item/tank/jetpack/populate_gas()
if(gas_type)
- air_contents.gases[gas_type] = ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C))
+ air_contents.set_moles(gas_type, ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)))
/obj/item/tank/jetpack/ui_action_click(mob/user, action)
diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm
index b4c8d8adf0..1c90a83c0a 100644
--- a/code/game/objects/items/tanks/tank_types.dm
+++ b/code/game/objects/items/tanks/tank_types.dm
@@ -18,8 +18,9 @@
force = 10
dog_fashion = /datum/dog_fashion/back
+
/obj/item/tank/internals/oxygen/populate_gas()
- air_contents.gases[/datum/gas/oxygen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/oxygen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
@@ -47,8 +48,9 @@
force = 10
/obj/item/tank/internals/anesthetic/populate_gas()
- air_contents.gases[/datum/gas/oxygen] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
- air_contents.gases[/datum/gas/nitrous_oxide] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
+ air_contents.set_moles(/datum/gas/oxygen, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD)
+ air_contents.set_moles(/datum/gas/nitrous_oxide, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD)
+ return
/*
* Air
@@ -62,8 +64,9 @@
dog_fashion = /datum/dog_fashion/back
/obj/item/tank/internals/air/populate_gas()
- air_contents.gases[/datum/gas/oxygen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
- air_contents.gases[/datum/gas/nitrogen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
+ air_contents.set_moles(/datum/gas/oxygen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD)
+ air_contents.set_moles(/datum/gas/nitrogen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD)
+ return
/*
@@ -79,7 +82,8 @@
/obj/item/tank/internals/plasma/populate_gas()
- air_contents.gases[/datum/gas/plasma] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
+ return
/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/flamethrower))
@@ -93,12 +97,16 @@
F.update_icon()
else
return ..()
+
+/obj/item/tank/internals/plasma/full/populate_gas()
+ air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
+
//Makes empty oxygen tanks spawn without gas
/obj/item/tank/internals/plasma/empty/populate_gas()
return
/obj/item/tank/internals/plasma/full/populate_gas()
- air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
/*
* Plasmaman Plasma Tank
@@ -113,10 +121,11 @@
distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
/obj/item/tank/internals/plasmaman/populate_gas()
- air_contents.gases[/datum/gas/plasma] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
+ return
/obj/item/tank/internals/plasmaman/full/populate_gas()
- air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
@@ -129,7 +138,7 @@
w_class = WEIGHT_CLASS_SMALL //thanks i forgot this
/obj/item/tank/internals/plasmaman/belt/full/populate_gas()
- air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
//makes empty plasma tanks spawn without gas.
@@ -152,7 +161,7 @@
/obj/item/tank/internals/emergency_oxygen/populate_gas()
- air_contents.gases[/datum/gas/oxygen] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/oxygen, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
/obj/item/tank/internals/emergency_oxygen/empty/populate_gas()
@@ -172,4 +181,4 @@
volume = 10
/obj/item/tank/internals/emergency_oxygen/double/empty/populate_gas()
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index 00fbc41516..e69b2b6272 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -64,7 +64,7 @@
. = ..()
air_contents = new(volume) //liters
- air_contents.temperature = T20C
+ air_contents.set_temperature(T20C)
populate_gas()
@@ -92,7 +92,7 @@
. += "The pressure gauge reads [round(src.air_contents.return_pressure(),0.01)] kPa."
- var/celsius_temperature = src.air_contents.temperature-T0C
+ var/celsius_temperature = src.air_contents.return_temperature()-T0C
var/descriptive
if (celsius_temperature < 20)
@@ -235,7 +235,7 @@
if(tank_pressure < distribute_pressure)
distribute_pressure = tank_pressure
- var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
+ var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.return_temperature())
return remove_air(moles_needed)
diff --git a/code/game/objects/items/tools/saw.dm b/code/game/objects/items/tools/saw.dm
deleted file mode 100644
index aab59c00be..0000000000
--- a/code/game/objects/items/tools/saw.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-/obj/item/hatchet/saw
- name = "handsaw"
- desc = "A very sharp handsaw, it's compact."
- icon = 'icons/obj/tools.dmi'
- icon_state = "saw"
- item_state = "sawhandle_greyscale"
- lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
- tool_behaviour = TOOL_SAW
- force = 10
- throwforce = 8
- throw_speed = 3
- throw_range = 5
- custom_materials = list(/datum/material/iron = 5000)
- attack_verb = list("sawed", "sliced", "cut")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = IS_SHARP
- var/random_color = TRUE //code taken from screwdrivers.dm; cool handles are cool.
- var/static/list/saw_colors = list(
- "blue" = rgb(24, 97, 213),
- "red" = rgb(255, 0, 0),
- "pink" = rgb(213, 24, 141),
- "brown" = rgb(160, 82, 18),
- "green" = rgb(14, 127, 27),
- "cyan" = rgb(24, 162, 213),
- "yellow" = rgb(255, 165, 0)
- )
-
-/obj/item/hatchet/saw/Initialize()
- . = ..()
- if(random_color)
- icon_state = "sawhandle_greyscale"
- var/our_color = pick(saw_colors)
- add_atom_colour(saw_colors[our_color], FIXED_COLOUR_PRIORITY)
- update_icon()
- if(prob(75))
- pixel_y = rand(-8, 8)
-
-/obj/item/hatchet/saw/update_overlays()
- . = ..()
- if(!random_color) //icon override
- return
- var/mutable_appearance/base_overlay = mutable_appearance(icon, "sawblade")
- base_overlay.appearance_flags = RESET_COLOR
- . += base_overlay
-
-// END
\ No newline at end of file
diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm
index 7ac3aba246..c49159a992 100644
--- a/code/game/objects/structures/holosign.dm
+++ b/code/game/objects/structures/holosign.dm
@@ -94,7 +94,7 @@
alpha = 150
resistance_flags = FIRE_PROOF
-/obj/structure/holosign/barrier/firelock/blocksTemperature()
+/obj/structure/holosign/barrier/firelock/BlockSuperconductivity()
return TRUE
/obj/structure/holosign/barrier/combifan
@@ -110,7 +110,7 @@
CanAtmosPass = ATMOS_PASS_NO
resistance_flags = FIRE_PROOF
-/obj/structure/holosign/barrier/combifan/blocksTemperature()
+/obj/structure/holosign/barrier/combifan/BlockSuperconductivity()
return TRUE
/obj/structure/holosign/barrier/combifan/Initialize()
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm
index c3b388fc29..ba23878168 100644
--- a/code/game/objects/structures/transit_tubes/station.dm
+++ b/code/game/objects/structures/transit_tubes/station.dm
@@ -152,8 +152,8 @@
pod_moving = 0
if(!QDELETED(pod))
var/datum/gas_mixture/floor_mixture = loc.return_air()
- ARCHIVE(floor_mixture)
- ARCHIVE(pod.air_contents)
+ floor_mixture.archive()
+ pod.air_contents.archive()
pod.air_contents.share(floor_mixture, 1) //mix the pod's gas mixture with the tile it's on
air_update_turf()
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
index 04f113a0c8..36539ae1e4 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
@@ -10,9 +10,9 @@
/obj/structure/transit_tube_pod/Initialize()
. = ..()
- air_contents.gases[/datum/gas/oxygen] = MOLES_O2STANDARD
- air_contents.gases[/datum/gas/nitrogen] = MOLES_N2STANDARD
- air_contents.temperature = T20C
+ air_contents.set_moles(/datum/gas/oxygen, MOLES_O2STANDARD)
+ air_contents.set_moles(/datum/gas/nitrogen, MOLES_N2STANDARD)
+ air_contents.set_temperature(T20C)
/obj/structure/transit_tube_pod/Destroy()
@@ -181,4 +181,4 @@
return
/obj/structure/transit_tube_pod/return_temperature()
- return air_contents.temperature
+ return air_contents.return_temperature()
diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm
index 38e0839617..66e7ebd424 100644
--- a/code/game/turfs/change_turf.dm
+++ b/code/game/turfs/change_turf.dm
@@ -148,6 +148,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list(
. = ..()
if (!.) // changeturf failed or didn't do anything
QDEL_NULL(stashed_air)
+ update_air_ref()
return
var/turf/open/newTurf = .
newTurf.air.copy_from(stashed_air)
@@ -308,24 +309,14 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list(
return
var/datum/gas_mixture/total = new//Holders to assimilate air from nearby turfs
- var/list/total_gases = total.gases
for(var/T in atmos_adjacent_turfs)
var/turf/open/S = T
if(!S.air)
continue
- var/list/S_gases = S.air.gases
- for(var/id in S_gases)
- total_gases[id] += S_gases[id]
- total.temperature += S.air.temperature
+ total.merge(S.air)
- air.copy_from(total)
-
- var/list/air_gases = air.gases
- for(var/id in air_gases)
- air_gases[id] /= turf_count //Averages contents of the turfs, ignoring walls and the like
-
- air.temperature /= turf_count
+ air.copy_from(total.remove_ratio(1/turf_count))
SSair.add_to_active(src)
/turf/proc/ReplaceWithLattice()
diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm
index 9fe23d78d7..65b487bd05 100644
--- a/code/game/turfs/closed.dm
+++ b/code/game/turfs/closed.dm
@@ -7,9 +7,14 @@
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
rad_insulation = RAD_MEDIUM_INSULATION
+/turf/closed/Initialize()
+ . = ..()
+ update_air_ref()
+
/turf/closed/AfterChange()
. = ..()
SSair.high_pressure_delta -= src
+ update_air_ref()
/turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
return FALSE
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index b81c5be44c..6552e29246 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -199,7 +199,7 @@
flash_color(L, flash_color = "#C80000", flash_time = 10)
/turf/open/Initalize_Atmos(times_fired)
- excited = 0
+ set_excited(FALSE)
update_visuals()
current_cycle = times_fired
@@ -207,19 +207,19 @@
for(var/i in atmos_adjacent_turfs)
var/turf/open/enemy_tile = i
var/datum/gas_mixture/enemy_air = enemy_tile.return_air()
- if(!excited && air.compare(enemy_air))
+ if(!get_excited() && air.compare(enemy_air))
//testing("Active turf found. Return value of compare(): [is_active]")
- excited = TRUE
+ set_excited(TRUE)
SSair.active_turfs |= src
/turf/open/proc/GetHeatCapacity()
. = air.heat_capacity()
/turf/open/proc/GetTemperature()
- . = air.temperature
+ . = air.return_temperature()
/turf/open/proc/TakeTemperature(temp)
- air.temperature += temp
+ air.set_temperature(air.return_temperature() + temp)
air_update_turf()
/turf/open/proc/freon_gas_act()
@@ -304,9 +304,8 @@
/turf/open/rad_act(pulse_strength)
. = ..()
- if (air.gases[/datum/gas/carbon_dioxide] && air.gases[/datum/gas/oxygen])
- pulse_strength = min(pulse_strength,air.gases[/datum/gas/carbon_dioxide]*1000,air.gases[/datum/gas/oxygen]*2000) //Ensures matter is conserved properly
- air.gases[/datum/gas/carbon_dioxide]=max(air.gases[/datum/gas/carbon_dioxide]-(pulse_strength/1000),0)
- air.gases[/datum/gas/oxygen]=max(air.gases[/datum/gas/oxygen]-(pulse_strength/2000),0)
- air.gases[/datum/gas/pluoxium]+=(pulse_strength/4000)
- GAS_GARBAGE_COLLECT(air.gases)
+ if (air.get_moles(/datum/gas/carbon_dioxide) && air.get_moles(/datum/gas/oxygen))
+ pulse_strength = min(pulse_strength,air.get_moles(/datum/gas/carbon_dioxide)*1000,air.get_moles(/datum/gas/oxygen)*2000) //Ensures matter is conserved properly
+ air.set_moles(/datum/gas/carbon_dioxide, max(air.get_moles(/datum/gas/carbon_dioxide)-(pulse_strength/1000),0))
+ air.set_moles(/datum/gas/oxygen, max(air.get_moles(/datum/gas/oxygen)-(pulse_strength/2000),0))
+ air.adjust_moles(/datum/gas/pluoxium, pulse_strength/4000)
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 26daa32107..b131a1ed70 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -27,6 +27,7 @@
/turf/open/space/Initialize()
icon_state = SPACE_ICON_STATE
air = space_gas
+ update_air_ref()
vis_contents.Cut() //removes inherited overlays
visibilityChanged()
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index d8a7ae45f4..b1a10c72ce 100755
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -277,7 +277,7 @@
/turf/open/Entered(atom/movable/AM)
..()
//melting
- if(isobj(AM) && air && air.temperature > T0C)
+ if(isobj(AM) && air && air.return_temperature() > T0C)
var/obj/O = AM
if(O.obj_flags & FROZEN)
O.make_unfrozen()
diff --git a/code/game/world.dm b/code/game/world.dm
index 83e82403e0..db193f31b0 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -9,9 +9,8 @@ GLOBAL_LIST(topic_status_cache)
//This happens after the Master subsystem new(s) (it's a global datum)
//So subsystems globals exist, but are not initialised
/world/New()
- var/extools = world.GetConfig("env", "EXTOOLS_DLL") || "./byond-extools.dll"
- if (fexists(extools))
- call(extools, "maptick_initialize")()
+ if (fexists(EXTOOLS))
+ call(EXTOOLS, "maptick_initialize")()
enable_debugger()
world.Profile(PROFILE_START)
@@ -276,6 +275,15 @@ GLOBAL_LIST(topic_status_cache)
shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss.
..()
+/world/Del()
+ // memory leaks bad
+ var/num_deleted = 0
+ for(var/datum/gas_mixture/GM)
+ GM.__gasmixture_unregister()
+ num_deleted++
+ log_world("Deallocated [num_deleted] gas mixtures")
+ ..()
+
/world/proc/update_status()
var/list/features = list()
@@ -344,3 +352,6 @@ GLOBAL_LIST(topic_status_cache)
maxz++
SSmobs.MaxZChanged()
SSidlenpcpool.MaxZChanged()
+ world.refresh_atmos_grid()
+
+/world/proc/refresh_atmos_grid()
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index bff431a6c7..044016698c 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -909,10 +909,9 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null
assoc = SDQL_expression(object, expressions_list[expression_list])
if(assoc != null)
// Need to insert the key like this to prevent duplicate keys fucking up.
- var/list/dummy = list()
- dummy[result] = assoc
- result = dummy
- val += result
+ val[result] = assoc
+ else
+ val += list(result)
else
val = world.SDQL_var(object, expression, i, object, superuser, src)
i = expression.len
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 8406248164..f068f05a4a 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -573,7 +573,7 @@
if(Rad.anchored)
if(!Rad.loaded_tank)
var/obj/item/tank/internals/plasma/Plasma = new/obj/item/tank/internals/plasma(Rad)
- Plasma.air_contents.gases[/datum/gas/plasma] = 70
+ Plasma.air_contents.set_moles(/datum/gas/plasma,70)
Rad.drainratio = 0
Rad.loaded_tank = Plasma
Plasma.forceMove(Rad)
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index 072fbaa123..b3bea2201c 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -1,15 +1,14 @@
/proc/show_air_status_to(turf/target, mob/user)
var/datum/gas_mixture/env = target.return_air()
- var/list/env_gases = env.gases
var/burning = FALSE
if(isopenturf(target))
var/turf/open/T = target
if(T.active_hotspot)
burning = TRUE
- var/list/lines = list("[AREACOORD(target)]: [env.temperature] K ([env.temperature - T0C] C), [env.return_pressure()] kPa[(burning)?(", burning"):(null)]")
- for(var/id in env_gases)
- var/moles = env_gases[id]
+ var/list/lines = list("[AREACOORD(target)]: [env.return_temperature()] K ([env.return_temperature() - T0C] C), [env.return_pressure()] kPa[(burning)?(", burning"):(null)]")
+ for(var/id in env.get_gases())
+ var/moles = env.get_moles(id)
if (moles >= 0.00001)
lines += "[GLOB.meta_gas_names[id]]: [moles] mol"
to_chat(usr, lines.Join("\n"))
diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm
index 3ddb4e67ee..d0ef5a83ce 100644
--- a/code/modules/antagonists/revenant/revenant.dm
+++ b/code/modules/antagonists/revenant/revenant.dm
@@ -107,9 +107,8 @@
mind.add_antag_datum(/datum/antagonist/revenant)
//Life, Stat, Hud Updates, and Say
-/mob/living/simple_animal/revenant/BiologicalLife(seconds, times_fired)
- if(!(. = ..()))
- return
+/mob/living/simple_animal/revenant/Life(seconds, times_fired)
+ . = ..()
if(stasis)
return
if(revealed && essence <= 0)
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index a40a4c1a42..36c444f02d 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -53,8 +53,8 @@
return
if(I.use_tool(src, user, 0, volume=40))
status = TRUE
- GLOB.bombers += "[key_name(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]"
- message_admins("[ADMIN_LOOKUPFLW(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]")
+ GLOB.bombers += "[key_name(user)] welded a single tank bomb. Temp: [bombtank.air_contents.return_temperature()-T0C]"
+ message_admins("[ADMIN_LOOKUPFLW(user)] welded a single tank bomb. Temp: [bombtank.air_contents.return_temperature()-T0C]")
to_chat(user, "A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.")
add_fingerprint(user)
return TRUE
@@ -145,8 +145,7 @@
return
/obj/item/tank/proc/ignite() //This happens when a bomb is told to explode
- var/fuel_moles = air_contents.gases[/datum/gas/plasma] + air_contents.gases[/datum/gas/oxygen]/6
- GAS_GARBAGE_COLLECT(air_contents.gases)
+ var/fuel_moles = air_contents.get_moles(/datum/gas/plasma) + air_contents.get_moles(/datum/gas/oxygen)/6
var/datum/gas_mixture/bomb_mixture = air_contents.copy()
var/strength = 1
@@ -156,7 +155,7 @@
qdel(master)
qdel(src)
- if(bomb_mixture.temperature > (T0C + 400))
+ if(bomb_mixture.return_temperature() > (T0C + 400))
strength = (fuel_moles/15)
if(strength >=1)
@@ -169,7 +168,7 @@
ground_zero.assume_air(bomb_mixture)
ground_zero.hotspot_expose(1000, 125)
- else if(bomb_mixture.temperature > (T0C + 250))
+ else if(bomb_mixture.return_temperature() > (T0C + 250))
strength = (fuel_moles/20)
if(strength >=1)
@@ -180,7 +179,7 @@
ground_zero.assume_air(bomb_mixture)
ground_zero.hotspot_expose(1000, 125)
- else if(bomb_mixture.temperature > (T0C + 100))
+ else if(bomb_mixture.return_temperature() > (T0C + 100))
strength = (fuel_moles/25)
if (strength >=1)
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index 06d73867f8..81e103fba2 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -9,46 +9,31 @@
return
-/turf/open/hotspot_expose(exposed_temperature, exposed_volume, soh = FALSE, holo = FALSE)
- var/datum/gas_mixture/air_contents = return_air()
- if(!air_contents)
- return 0
+/turf/open/hotspot_expose(exposed_temperature, exposed_volume, soh)
+ if(!air)
+ return
- var/oxy = air_contents.gases[/datum/gas/oxygen]
- var/tox = air_contents.gases[/datum/gas/plasma]
- var/trit = air_contents.gases[/datum/gas/tritium]
+ var/oxy = air.get_moles(/datum/gas/oxygen)
+ if (oxy < 0.5)
+ return
+ var/tox = air.get_moles(/datum/gas/plasma)
+ var/trit = air.get_moles(/datum/gas/tritium)
if(active_hotspot)
if(soh)
- if((tox > 0.5 || trit > 0.5) && oxy > 0.5)
- if(active_hotspot.temperature < exposed_temperature*50)
- active_hotspot.temperature = exposed_temperature*50
+ if(tox > 0.5 || trit > 0.5)
+ if(active_hotspot.temperature < exposed_temperature)
+ active_hotspot.temperature = exposed_temperature
if(active_hotspot.volume < exposed_volume)
active_hotspot.volume = exposed_volume
- return 1
-
- var/igniting = 0
+ return
if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && (tox > 0.5 || trit > 0.5))
- igniting = 1
- if(igniting)
- if(oxy < 0.5)
- return 0
-
- active_hotspot = new /obj/effect/hotspot(src, holo)
- active_hotspot.temperature = exposed_temperature*50
- active_hotspot.volume = exposed_volume*25
+ active_hotspot = new /obj/effect/hotspot(src, exposed_volume*25, exposed_temperature)
active_hotspot.just_spawned = (current_cycle < SSair.times_fired)
//remove just_spawned protection if no longer processing this cell
SSair.add_to_active(src, 0)
- else
- var/datum/gas_mixture/heating = air_contents.remove_ratio(exposed_volume/air_contents.volume)
- heating.temperature = exposed_temperature
- heating.react()
- assume_air(heating)
- air_update_turf()
- return igniting
//This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile
/obj/effect/hotspot
@@ -67,11 +52,13 @@
var/bypassing = FALSE
var/visual_update_tick = 0
-/obj/effect/hotspot/Initialize(mapload, holo = FALSE)
+/obj/effect/hotspot/Initialize(mapload, starting_volume, starting_temperature)
. = ..()
- if(holo)
- flags_1 |= HOLOGRAM_1
SSair.hotspots += src
+ if(!isnull(starting_volume))
+ volume = starting_volume
+ if(!isnull(starting_temperature))
+ temperature = starting_temperature
perform_exposure()
setDir(pick(GLOB.cardinals))
air_update_turf()
@@ -83,22 +70,19 @@
location.active_hotspot = src
- if(volume > CELL_VOLUME*0.95)
- bypassing = TRUE
- else
- bypassing = FALSE
+ bypassing = !just_spawned && (volume > CELL_VOLUME*0.95)
if(bypassing)
- if(!just_spawned)
- volume = location.air.reaction_results["fire"]*FIRE_GROWTH_RATE
- temperature = location.air.temperature
+ volume = location.air.reaction_results["fire"]*FIRE_GROWTH_RATE
+ temperature = location.air.return_temperature()
else
- var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume)
- affected.temperature = temperature
- affected.react(src)
- temperature = affected.temperature
- volume = affected.reaction_results["fire"]*FIRE_GROWTH_RATE
- location.assume_air(affected)
+ var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.return_volume())
+ if(affected) //in case volume is 0
+ affected.set_temperature(temperature)
+ affected.react(src)
+ temperature = affected.return_temperature()
+ volume = affected.reaction_results["fire"]*FIRE_GROWTH_RATE
+ location.assume_air(affected)
for(var/A in location)
var/atom/AT = A
@@ -164,7 +148,7 @@
color = list(LERP(0.3, 1, 1-greyscale_fire) * heat_r,0.3 * heat_g * greyscale_fire,0.3 * heat_b * greyscale_fire, 0.59 * heat_r * greyscale_fire,LERP(0.59, 1, 1-greyscale_fire) * heat_g,0.59 * heat_b * greyscale_fire, 0.11 * heat_r * greyscale_fire,0.11 * heat_g * greyscale_fire,LERP(0.11, 1, 1-greyscale_fire) * heat_b, 0,0,0)
alpha = heat_a
-#define INSUFFICIENT(path) (location.air.gases[path] < 0.5)
+#define INSUFFICIENT(path) (location.air.get_moles(path) < 0.5)
/obj/effect/hotspot/process()
if(just_spawned)
just_spawned = FALSE
@@ -175,8 +159,7 @@
qdel(src)
return
- if(location.excited_group)
- location.excited_group.reset_cooldowns()
+ location.eg_reset_cooldowns()
if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1))
qdel(src)
@@ -186,7 +169,8 @@
return
//Not enough to burn
- if((location.air.gases[/datum/gas/plasma] < 0.5 && location.air.gases[/datum/gas/tritium] < 0.5) || location.air.gases[/datum/gas/oxygen] < 0.5)
+ // god damn it previous coder you made the INSUFFICIENT macro for a fucking reason why didn't you use it here smh
+ if((INSUFFICIENT(/datum/gas/plasma) && INSUFFICIENT(/datum/gas/tritium)) || INSUFFICIENT(/datum/gas/oxygen))
qdel(src)
return
@@ -194,16 +178,15 @@
if(bypassing)
icon_state = "3"
- if(!(flags_1 & HOLOGRAM_1))
- location.burn_tile()
+ location.burn_tile()
//Possible spread due to radiated heat
- if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD)
- var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE
+ if(location.air.return_temperature() > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD)
+ var/radiated_temperature = location.air.return_temperature()*FIRE_SPREAD_RADIOSITY_SCALE
for(var/t in location.atmos_adjacent_turfs)
var/turf/open/T = t
if(!T.active_hotspot)
- T.hotspot_expose(radiated_temperature, CELL_VOLUME/4, flags_1 & HOLOGRAM_1)
+ T.hotspot_expose(radiated_temperature, CELL_VOLUME/4)
else
if(volume > CELL_VOLUME*0.4)
@@ -227,14 +210,13 @@
var/turf/open/T = loc
if(istype(T) && T.active_hotspot == src)
T.active_hotspot = null
- if(!(flags_1 & HOLOGRAM_1))
- DestroyTurf()
+ DestroyTurf()
return ..()
/obj/effect/hotspot/proc/DestroyTurf()
if(isturf(loc))
var/turf/T = loc
- if(T.to_be_destroyed)
+ if(T.to_be_destroyed && !T.changing_turf)
var/chance_of_deletion
if (T.heat_capacity) //beware of division by zero
chance_of_deletion = T.max_fire_temperature_sustained / T.heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0
diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm
index 760e4e22da..4f057ca9be 100644
--- a/code/modules/atmospherics/environmental/LINDA_system.dm
+++ b/code/modules/atmospherics/environmental/LINDA_system.dm
@@ -18,7 +18,7 @@
/turf/open/CanAtmosPass(turf/T, vertical = FALSE)
var/dir = vertical? get_dir_multiz(src, T) : get_dir(src, T)
- var/opp = dir_inverse_multiz(dir)
+ var/opp = REVERSE_DIR(dir)
var/R = FALSE
if(vertical && !(zAirOut(dir, T) && T.zAirIn(dir, src)))
R = TRUE
@@ -44,25 +44,32 @@
return FALSE
/turf/proc/ImmediateCalculateAdjacentTurfs()
- var/canpass = CANATMOSPASS(src, src)
+ var/canpass = CANATMOSPASS(src, src)
var/canvpass = CANVERTICALATMOSPASS(src, src)
for(var/direction in GLOB.cardinals_multiz)
var/turf/T = get_step_multiz(src, direction)
+ var/opp_dir = REVERSE_DIR(direction)
if(!isopenturf(T))
continue
if(!(blocks_air || T.blocks_air) && ((direction & (UP|DOWN))? (canvpass && CANVERTICALATMOSPASS(T, src)) : (canpass && CANATMOSPASS(T, src))) )
LAZYINITLIST(atmos_adjacent_turfs)
LAZYINITLIST(T.atmos_adjacent_turfs)
- atmos_adjacent_turfs[T] = TRUE
- T.atmos_adjacent_turfs[src] = TRUE
+ atmos_adjacent_turfs[T] = direction
+ T.atmos_adjacent_turfs[src] = opp_dir
+ T.__update_extools_adjacent_turfs()
else
if (atmos_adjacent_turfs)
atmos_adjacent_turfs -= T
if (T.atmos_adjacent_turfs)
T.atmos_adjacent_turfs -= src
+ T.__update_extools_adjacent_turfs()
UNSETEMPTY(T.atmos_adjacent_turfs)
UNSETEMPTY(atmos_adjacent_turfs)
src.atmos_adjacent_turfs = atmos_adjacent_turfs
+ __update_extools_adjacent_turfs()
+
+/turf/proc/__update_extools_adjacent_turfs()
+
//returns a list of adjacent turfs that can share air with this one.
//alldir includes adjacent diagonal tiles that can share
@@ -111,9 +118,9 @@
SSair.add_to_active(src,command)
/atom/movable/proc/move_update_air(turf/T)
- if(isturf(T))
- T.air_update_turf(1)
- air_update_turf(1)
+ if(isturf(T))
+ T.air_update_turf(1)
+ air_update_turf(1)
/atom/proc/atmos_spawn_air(text) //because a lot of people loves to copy paste awful code lets just make an easy proc to spawn your plasma fires
var/turf/open/T = get_turf(src)
diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
index 081f0b1d28..d506e5fe02 100644
--- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
+++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
@@ -8,6 +8,7 @@
var/list/atmos_adjacent_turfs
//bitfield of dirs in which we are superconducitng
var/atmos_supeconductivity = NONE
+ var/is_openturf = FALSE // used by extools shizz.
//used to determine whether we should archive
var/archived_cycle = 0
@@ -23,21 +24,21 @@
//used for spacewind
var/pressure_difference = 0
var/pressure_direction = 0
+ var/turf/pressure_specific_target
- var/datum/excited_group/excited_group
- var/excited = FALSE
var/datum/gas_mixture/turf/air
var/obj/effect/hotspot/active_hotspot
- var/atmos_cooldown = 0
var/planetary_atmos = FALSE //air will revert to initial_gas_mix over time
var/list/atmos_overlay_types //gas IDs of current active gas overlays
+ is_openturf = TRUE
/turf/open/Initialize()
if(!blocks_air)
air = new
air.copy_from_turf(src)
+ update_air_ref()
. = ..()
/turf/open/Destroy()
@@ -48,6 +49,8 @@
SSair.add_to_active(T)
return ..()
+/turf/proc/update_air_ref()
+
/////////////////GAS MIXTURE PROCS///////////////////
/turf/open/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air
@@ -89,15 +92,37 @@
temperature_archived = temperature
/turf/open/archive()
- ARCHIVE(air)
+ air.archive()
archived_cycle = SSair.times_fired
temperature_archived = temperature
+/turf/open/proc/eg_reset_cooldowns()
+/turf/open/proc/eg_garbage_collect()
+/turf/open/proc/get_excited()
+/turf/open/proc/set_excited()
+
/////////////////////////GAS OVERLAYS//////////////////////////////
+
/turf/open/proc/update_visuals()
- var/list/new_overlay_types = tile_graphic()
+
var/list/atmos_overlay_types = src.atmos_overlay_types // Cache for free performance
+ var/list/new_overlay_types = list()
+ var/static/list/nonoverlaying_gases = typecache_of_gases_with_no_overlays()
+
+ if(!air) // 2019-05-14: was not able to get this path to fire in testing. Consider removing/looking at callers -Naksu
+ if (atmos_overlay_types)
+ for(var/overlay in atmos_overlay_types)
+ vis_contents -= overlay
+ src.atmos_overlay_types = null
+ return
+
+ for(var/id in air.get_gases())
+ if (nonoverlaying_gases[id])
+ continue
+ var/gas_overlay = GLOB.meta_gas_overlays[id]
+ if(gas_overlay && air.get_moles(id) > GLOB.meta_gas_visibility[META_GAS_MOLES_VISIBLE])
+ new_overlay_types += gas_overlay[min(FACTOR_GAS_VISIBLE_MAX, CEILING(air.get_moles(id) / MOLES_GAS_VISIBLE_STEP, 1))]
if (atmos_overlay_types)
for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added
@@ -112,19 +137,18 @@
UNSETEMPTY(new_overlay_types)
src.atmos_overlay_types = new_overlay_types
-/turf/open/proc/tile_graphic()
- var/static/list/nonoverlaying_gases = typecache_of_gases_with_no_overlays()
- if(!air)
- return
- . = new /list
- var/list/gases = air.gases
- for(var/id in gases)
- if (nonoverlaying_gases[id])
- continue
- var/gas = gases[id]
- var/gas_overlay = GLOB.meta_gas_overlays[id]
- if(gas_overlay && gas > GLOB.meta_gas_visibility[id])
- . += gas_overlay[min(FACTOR_GAS_VISIBLE_MAX, CEILING(gas / MOLES_GAS_VISIBLE_STEP, 1))]
+/turf/open/proc/set_visuals(list/new_overlay_types)
+ if (atmos_overlay_types)
+ for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added
+ vis_contents -= overlay
+
+ if (length(new_overlay_types))
+ if (atmos_overlay_types)
+ vis_contents += new_overlay_types - atmos_overlay_types //don't add overlays that already exist
+ else
+ vis_contents += new_overlay_types
+ UNSETEMPTY(new_overlay_types)
+ src.atmos_overlay_types = new_overlay_types
/proc/typecache_of_gases_with_no_overlays()
. = list()
@@ -135,8 +159,8 @@
/////////////////////////////SIMULATION///////////////////////////////////
-#define LAST_SHARE_CHECK \
- var/last_share = our_air.last_share;\
+/*#define LAST_SHARE_CHECK \
+ var/last_share = our_air.get_last_share();\
if(last_share > MINIMUM_AIR_TO_SUSPEND){\
our_excited_group.reset_cooldowns();\
cached_atmos_cooldown = 0;\
@@ -144,107 +168,32 @@
our_excited_group.dismantle_cooldown = 0;\
cached_atmos_cooldown = 0;\
}
-
+*/
/turf/proc/process_cell(fire_count)
SSair.remove_from_active(src)
-/turf/open/process_cell(fire_count)
- if(archived_cycle < fire_count) //archive self if not already done
- archive()
-
- current_cycle = fire_count
-
- //cache for sanic speed
- var/list/adjacent_turfs = atmos_adjacent_turfs
- var/datum/excited_group/our_excited_group = excited_group
- var/adjacent_turfs_length = LAZYLEN(adjacent_turfs)
- var/cached_atmos_cooldown = atmos_cooldown + 1
-
- var/planet_atmos = planetary_atmos
- if (planet_atmos)
- adjacent_turfs_length++
-
- var/datum/gas_mixture/our_air = air
-
- for(var/t in adjacent_turfs)
- var/turf/open/enemy_tile = t
-
- if(fire_count <= enemy_tile.current_cycle)
+/turf/open/proc/equalize_pressure_in_zone(cyclenum)
+/turf/open/proc/consider_firelocks(turf/T2)
+ var/reconsider_adj = FALSE
+ for(var/obj/machinery/door/firedoor/FD in T2)
+ if((FD.flags_1 & ON_BORDER_1) && get_dir(T2, src) != FD.dir)
continue
- enemy_tile.archive()
+ FD.emergency_pressure_stop()
+ reconsider_adj = TRUE
+ for(var/obj/machinery/door/firedoor/FD in src)
+ if((FD.flags_1 & ON_BORDER_1) && get_dir(src, T2) != FD.dir)
+ continue
+ FD.emergency_pressure_stop()
+ reconsider_adj = TRUE
+ if(reconsider_adj)
+ T2.ImmediateCalculateAdjacentTurfs() // We want those firelocks closed yesterday.
- /******************* GROUP HANDLING START *****************************************************************/
+/turf/proc/handle_decompression_floor_rip()
+/turf/open/floor/handle_decompression_floor_rip(sum)
+ if(sum > 20 && prob(clamp(sum / 10, 0, 30)))
+ remove_tile()
- var/should_share_air = FALSE
- var/datum/gas_mixture/enemy_air = enemy_tile.air
-
- //cache for sanic speed
- var/datum/excited_group/enemy_excited_group = enemy_tile.excited_group
-
- if(our_excited_group && enemy_excited_group)
- if(our_excited_group != enemy_excited_group)
- //combine groups (this also handles updating the excited_group var of all involved turfs)
- our_excited_group.merge_groups(enemy_excited_group)
- our_excited_group = excited_group //update our cache
- should_share_air = TRUE
-
- else if(our_air.compare(enemy_air))
- if(!enemy_tile.excited)
- SSair.add_to_active(enemy_tile)
- var/datum/excited_group/EG = our_excited_group || enemy_excited_group || new
- if(!our_excited_group)
- EG.add_turf(src)
- if(!enemy_excited_group)
- EG.add_turf(enemy_tile)
- our_excited_group = excited_group
- should_share_air = TRUE
-
- //air sharing
- if(should_share_air)
- var/difference = our_air.share(enemy_air, adjacent_turfs_length)
- if(difference)
- if(difference > 0)
- consider_pressure_difference(enemy_tile, difference)
- else
- enemy_tile.consider_pressure_difference(src, -difference)
- LAST_SHARE_CHECK
-
-
- /******************* GROUP HANDLING FINISH *********************************************************************/
-
- if (planet_atmos) //share our air with the "atmosphere" "above" the turf
- var/datum/gas_mixture/G = new
- G.copy_from_turf(src)
- ARCHIVE(G)
- if(our_air.compare(G))
- if(!our_excited_group)
- var/datum/excited_group/EG = new
- EG.add_turf(src)
- our_excited_group = excited_group
- our_air.share(G, adjacent_turfs_length)
- LAST_SHARE_CHECK
-
- SSair.add_to_react_queue(src)
-
- if((!our_excited_group && !(our_air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION && consider_superconductivity(starting = TRUE))) \
- || (cached_atmos_cooldown > (EXCITED_GROUP_DISMANTLE_CYCLES * 2)))
- SSair.remove_from_active(src)
-
- atmos_cooldown = cached_atmos_cooldown
-
-/turf/open/space/process_cell(fire_count) //dumb hack to prevent space pollution
- . = ..()
- var/datum/gas_mixture/immutable/I = space_gas
- I.after_process_cell()
-
-/turf/proc/process_cell_reaction()
- SSair.remove_from_react_queue(src)
-
-/turf/open/process_cell_reaction()
- air.react(src)
- update_visuals()
- SSair.remove_from_react_queue(src)
- return
+/turf/open/process_cell(fire_count)
//////////////////////////SPACEWIND/////////////////////////////
@@ -256,15 +205,22 @@
/turf/open/proc/high_pressure_movements()
var/atom/movable/M
+ var/multiplier = 1
+ if(locate(/obj/structure/rack) in src)
+ multiplier *= 0.1
+ else if(locate(/obj/structure/table) in src)
+ multiplier *= 0.2
for(var/thing in src)
M = thing
if (!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired)
- M.experience_pressure_difference(pressure_difference, pressure_direction)
+ M.experience_pressure_difference(pressure_difference * multiplier, pressure_direction, 0, pressure_specific_target)
+ if(pressure_difference > 100)
+ new /obj/effect/temp_visual/dir_setting/space_wind(src, pressure_direction, clamp(round(sqrt(pressure_difference) * 2), 10, 255))
/atom/movable/var/pressure_resistance = 10
/atom/movable/var/last_high_pressure_movement_air_cycle = 0
-/atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0)
+/atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0, throw_target)
var/const/PROBABILITY_OFFSET = 25
var/const/PROBABILITY_BASE_PRECENT = 75
var/max_force = sqrt(pressure_difference)*(MOVE_FORCE_DEFAULT / 5)
@@ -275,93 +231,8 @@
move_prob += pressure_resistance_prob_delta
if (move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO))))
step(src, direction)
- last_high_pressure_movement_air_cycle = SSair.times_fired
-
-///////////////////////////EXCITED GROUPS/////////////////////////////
-
-/datum/excited_group
- var/list/turf_list = list()
- var/breakdown_cooldown = 0
- var/dismantle_cooldown = 0
-
-/datum/excited_group/New()
- SSair.excited_groups += src
-
-/datum/excited_group/proc/add_turf(turf/open/T)
- turf_list += T
- T.excited_group = src
- reset_cooldowns()
-
-/datum/excited_group/proc/merge_groups(datum/excited_group/E)
- if(turf_list.len > E.turf_list.len)
- SSair.excited_groups -= E
- for(var/t in E.turf_list)
- var/turf/open/T = t
- T.excited_group = src
- turf_list += T
- reset_cooldowns()
- else
- SSair.excited_groups -= src
- for(var/t in turf_list)
- var/turf/open/T = t
- T.excited_group = E
- E.turf_list += T
- E.reset_cooldowns()
-
-/datum/excited_group/proc/reset_cooldowns()
- breakdown_cooldown = 0
- dismantle_cooldown = 0
-
-//argument is so world start can clear out any turf differences quickly.
-/datum/excited_group/proc/self_breakdown(space_is_all_consuming = FALSE)
- var/datum/gas_mixture/A = new
-
- //make local for sanic speed
- var/list/A_gases = A.gases
- var/list/turf_list = src.turf_list
- var/turflen = turf_list.len
- var/space_in_group = FALSE
-
- for(var/t in turf_list)
- var/turf/open/T = t
- if (space_is_all_consuming && !space_in_group && istype(T.air, /datum/gas_mixture/immutable/space))
- space_in_group = TRUE
- qdel(A)
- A = new /datum/gas_mixture/immutable/space()
- A_gases = A.gases //update the cache
- break
- A.merge(T.air)
-
- for(var/id in A_gases)
- A_gases[id] /= turflen
-
- for(var/t in turf_list)
- var/turf/open/T = t
- T.air.copy_from(A)
- T.atmos_cooldown = 0
- T.update_visuals()
-
- breakdown_cooldown = 0
-
-/datum/excited_group/proc/dismantle()
- for(var/t in turf_list)
- var/turf/open/T = t
- T.excited = FALSE
- T.excited_group = null
- SSair.active_turfs -= T
- garbage_collect()
-
-/datum/excited_group/proc/garbage_collect()
- for(var/t in turf_list)
- var/turf/open/T = t
- T.excited_group = null
- turf_list.Cut()
- SSair.excited_groups -= src
////////////////////////SUPERCONDUCTIVITY/////////////////////////////
-/atom/movable/proc/blocksTemperature()
- return FALSE
-
/turf/proc/conductivity_directions()
if(archived_cycle < SSair.times_fired)
archive()
@@ -376,9 +247,6 @@
. |= direction
/turf/proc/neighbor_conduct_with_src(turf/open/other)
- for (var/atom/movable/G in src)
- if (G.blocksTemperature())
- return
if(!other.blocks_air) //Open but neighbor is solid
other.temperature_share_open_to_solid(src)
else //Both tiles are solid
@@ -389,9 +257,7 @@
if(blocks_air)
..()
return
- for (var/atom/movable/G in src)
- if (G.blocksTemperature())
- return
+
if(!other.blocks_air) //Both tiles are open
var/turf/open/T = other
T.air.temperature_share(air, WINDOW_HEAT_TRANSFER_COEFFICIENT)
@@ -410,8 +276,10 @@
if(!neighbor.thermal_conductivity)
continue
+
if(neighbor.archived_cycle < SSair.times_fired)
neighbor.archive()
+
neighbor.neighbor_conduct_with_src(src)
neighbor.consider_superconductivity()
@@ -430,7 +298,7 @@
//Conduct with air on my tile if I have it
if(!blocks_air)
temperature = air.temperature_share(null, thermal_conductivity, temperature, heat_capacity)
- ..((blocks_air ? temperature : air.temperature))
+ ..((blocks_air ? temperature : air.return_temperature()))
/turf/proc/consider_superconductivity()
if(!thermal_conductivity)
@@ -440,7 +308,7 @@
return TRUE
/turf/open/consider_superconductivity(starting)
- if(air.temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION))
+ if(air.return_temperature() < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION))
return FALSE
if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant.
return FALSE
diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
index 58e826b36d..43e54dc2c7 100644
--- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
@@ -16,90 +16,80 @@ GLOBAL_LIST_INIT(meta_gas_dangers, meta_gas_danger_list())
GLOBAL_LIST_INIT(meta_gas_ids, meta_gas_id_list())
GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
/datum/gas_mixture
- var/list/gases = list()
- var/list/gas_archive = list()
- var/temperature = 0 //kelvins
- var/tmp/temperature_archived = 0
- var/volume = CELL_VOLUME //liters
- var/last_share = 0
- var/list/reaction_results = list()
+ var/initial_volume = CELL_VOLUME //liters
+ var/list/reaction_results
var/list/analyzer_results //used for analyzer feedback - not initialized until its used
- var/gc_share = FALSE // Whether to call garbage_collect() on the sharer during shares, used for immutable mixtures
+ var/_extools_pointer_gasmixture = 0 // Contains the memory address of the shared_ptr object for this gas mixture in c++ land. Don't. Touch. This. Var.
/datum/gas_mixture/New(volume)
if (!isnull(volume))
- src.volume = volume
+ initial_volume = volume
+ ATMOS_EXTOOLS_CHECK
+ __gasmixture_register()
+ reaction_results = new
- //PV = nRT
+/datum/gas_mixture/vv_edit_var(var_name, var_value)
+ if(var_name == "_extools_pointer_gasmixture")
+ return FALSE // please no. segfaults bad.
+ return ..()
+/*
+/datum/gas_mixture/Del()
+ __gasmixture_unregister()
+ . = ..()*/
-/datum/gas_mixture/proc/heat_capacity()
+/datum/gas_mixture/proc/__gasmixture_unregister()
+/datum/gas_mixture/proc/__gasmixture_register()
-/datum/gas_mixture/proc/archived_heat_capacity()
+/proc/gas_types()
+ var/list/L = subtypesof(/datum/gas)
+ for(var/gt in L)
+ var/datum/gas/G = gt
+ L[gt] = initial(G.specific_heat)
+ return L
-/datum/gas_mixture/heat_capacity() //joules per kelvin
- var/list/cached_gases = gases
- var/list/cached_gasheats = GLOB.meta_gas_specific_heats
- . = 0
- for(var/id in cached_gases)
- . += cached_gases[id] * cached_gasheats[id]
-
-/datum/gas_mixture/archived_heat_capacity()
- // lots of copypasta but heat_capacity is the single proc called the most in a regular round, bar none, so performance loss adds up
- var/list/cached_gases = gas_archive
- var/list/cached_gasheats = GLOB.meta_gas_specific_heats
- . = 0
- for(var/id in cached_gases)
- . += cached_gases[id] * cached_gasheats[id]
-
-/datum/gas_mixture/turf/heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM
- var/list/cached_gases = gases
- var/list/cached_gasheats = GLOB.meta_gas_specific_heats
- for(var/id in cached_gases)
- . += cached_gases[id] * cached_gasheats[id]
- if(!.)
- . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space
-
-/datum/gas_mixture/turf/archived_heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM
- var/list/cached_gases = gas_archive
- var/list/cached_gasheats = GLOB.meta_gas_specific_heats
- for(var/id in cached_gases)
- . += cached_gases[id] * cached_gasheats[id]
- if(!.)
- . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space
+/datum/gas_mixture/proc/heat_capacity() //joules per kelvin
/datum/gas_mixture/proc/total_moles()
- var/cached_gases = gases
- TOTAL_MOLES(cached_gases, .)
/datum/gas_mixture/proc/return_pressure() //kilopascals
- if(volume > 0) // to prevent division by zero
- var/cached_gases = gases
- TOTAL_MOLES(cached_gases, .)
- . *= R_IDEAL_GAS_EQUATION * temperature / volume
- return
- return 0
/datum/gas_mixture/proc/return_temperature() //kelvins
- return temperature
+
+/datum/gas_mixture/proc/set_min_heat_capacity(n)
+/datum/gas_mixture/proc/set_temperature(new_temp)
+/datum/gas_mixture/proc/set_volume(new_volume)
+/datum/gas_mixture/proc/get_moles(gas_type)
+/datum/gas_mixture/proc/set_moles(gas_type, moles)
+/datum/gas_mixture/proc/scrub_into(datum/gas_mixture/target, list/gases)
+/datum/gas_mixture/proc/mark_immutable()
+/datum/gas_mixture/proc/get_gases()
+/datum/gas_mixture/proc/multiply(factor)
+/datum/gas_mixture/proc/get_last_share()
+/datum/gas_mixture/proc/clear()
+
+/datum/gas_mixture/proc/adjust_moles(gas_type, amt = 0)
+ set_moles(gas_type, get_moles(gas_type) + amt)
/datum/gas_mixture/proc/return_volume() //liters
- return max(0, volume)
/datum/gas_mixture/proc/thermal_energy() //joules
- return THERMAL_ENERGY(src) //see code/__DEFINES/atmospherics.dm; use the define in performance critical areas
/datum/gas_mixture/proc/archive()
//Update archived versions of variables
//Returns: 1 in all cases
/datum/gas_mixture/proc/merge(datum/gas_mixture/giver)
- //Merges all air from giver into self. Deletes giver.
+ //Merges all air from giver into self. giver is untouched.
//Returns: 1 if we are mutable, 0 otherwise
/datum/gas_mixture/proc/remove(amount)
- //Proportionally removes amount of gas from the gas_mixture
+ //Removes amount of gas from the gas_mixture
//Returns: gas_mixture with the gases removed
+/datum/gas_mixture/proc/transfer_to(datum/gas_mixture/target, amount)
+ //Transfers amount of gas to target. Equivalent to target.merge(remove(amount)) but faster.
+ //Removes amount of gas from the gas_mixture
+
/datum/gas_mixture/proc/remove_ratio(ratio)
//Proportionally removes amount of gas from the gas_mixture
//Returns: gas_mixture with the gases removed
@@ -136,245 +126,63 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
//Performs various reactions such as combustion or fusion (LOL)
//Returns: 1 if any reaction took place; 0 otherwise
-/datum/gas_mixture/archive()
- temperature_archived = temperature
- gas_archive = gases.Copy()
- return 1
-
-/datum/gas_mixture/merge(datum/gas_mixture/giver)
- if(!giver)
- return 0
-
- //heat transfer
- if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
- var/self_heat_capacity = heat_capacity()
- var/giver_heat_capacity = giver.heat_capacity()
- var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity
- if(combined_heat_capacity)
- temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity
-
- var/list/cached_gases = gases //accessing datum vars is slower than proc vars
- var/list/giver_gases = giver.gases
- //gas transfer
- for(var/giver_id in giver_gases)
- cached_gases[giver_id] += giver_gases[giver_id]
-
- return 1
-
+/datum/gas_mixture/proc/__remove()
/datum/gas_mixture/remove(amount)
- var/sum
- var/list/cached_gases = gases
- TOTAL_MOLES(cached_gases, sum)
- amount = min(amount, sum) //Can not take more air than tile has!
- if(amount <= 0)
- return null
var/datum/gas_mixture/removed = new type
- var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars
-
- removed.temperature = temperature
- for(var/id in cached_gases)
- removed_gases[id] = QUANTIZE((cached_gases[id] / sum) * amount)
- cached_gases[id] -= removed_gases[id]
- GAS_GARBAGE_COLLECT(gases)
+ __remove(removed, amount)
return removed
+/datum/gas_mixture/proc/__remove_ratio()
/datum/gas_mixture/remove_ratio(ratio)
- if(ratio <= 0)
- return null
- ratio = min(ratio, 1)
-
- var/list/cached_gases = gases
var/datum/gas_mixture/removed = new type
- var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars
-
- removed.temperature = temperature
- for(var/id in cached_gases)
- removed_gases[id] = QUANTIZE(cached_gases[id] * ratio)
- cached_gases[id] -= removed_gases[id]
-
- GAS_GARBAGE_COLLECT(gases)
+ __remove_ratio(removed, ratio)
return removed
/datum/gas_mixture/copy()
- var/list/cached_gases = gases
var/datum/gas_mixture/copy = new type
- var/list/copy_gases = copy.gases
-
- copy.temperature = temperature
- for(var/id in cached_gases)
- copy_gases[id] = cached_gases[id]
+ copy.copy_from(src)
return copy
-
-/datum/gas_mixture/copy_from(datum/gas_mixture/sample)
- var/list/cached_gases = gases //accessing datum vars is slower than proc vars
- var/list/sample_gases = sample.gases
-
- temperature = sample.temperature
- for(var/id in sample_gases)
- cached_gases[id] = sample_gases[id]
-
- //remove all gases not in the sample
- cached_gases &= sample_gases
-
- return 1
-
/datum/gas_mixture/copy_from_turf(turf/model)
parse_gas_string(model.initial_gas_mix)
//acounts for changes in temperature
var/turf/model_parent = model.parent_type
if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature))
- temperature = model.temperature
+ set_temperature(model.temperature)
return 1
/datum/gas_mixture/parse_gas_string(gas_string)
- var/list/gases = src.gases
var/list/gas = params2list(gas_string)
if(gas["TEMP"])
- temperature = text2num(gas["TEMP"])
+ set_temperature(text2num(gas["TEMP"]))
gas -= "TEMP"
- gases.Cut()
+ clear()
for(var/id in gas)
var/path = id
if(!ispath(path))
path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around
- gases[path] = text2num(gas[id])
+ set_moles(path, text2num(gas[id]))
archive()
return 1
-
-/datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
-
- var/list/cached_gases = gases
- var/list/sharer_gases = sharer.gases
-
- var/temperature_delta = temperature_archived - sharer.temperature_archived
- var/abs_temperature_delta = abs(temperature_delta)
-
- var/old_self_heat_capacity = 0
- var/old_sharer_heat_capacity = 0
- if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
- old_self_heat_capacity = heat_capacity()
- old_sharer_heat_capacity = sharer.heat_capacity()
-
- var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer
- var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us
-
- var/moved_moles = 0
- var/abs_moved_moles = 0
-
- //we're gonna define these vars outside of this for loop because as it turns out, var declaration is pricy
- var/delta
- var/gas_heat_capacity
- //and also cache this shit rq because that results in sanic speed for reasons byond explanation
- var/list/cached_gasheats = GLOB.meta_gas_specific_heats
- //GAS TRANSFER
- for(var/id in cached_gases | sharer_gases) // transfer gases
-
- delta = QUANTIZE(gas_archive[id] - sharer.gas_archive[id])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures
-
- if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
- gas_heat_capacity = delta * cached_gasheats[id]
- if(delta > 0)
- heat_capacity_self_to_sharer += gas_heat_capacity
- else
- heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative.
-
- cached_gases[id] -= delta
- sharer_gases[id] += delta
- moved_moles += delta
- abs_moved_moles += abs(delta)
-
- last_share = abs_moved_moles
-
- //THERMAL ENERGY TRANSFER
- if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
- var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer
- var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self
-
- //transfer of thermal energy (via changed heat capacity) between self and sharer
- if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY)
- temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity
-
- if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY)
- sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity
- //thermal energy of the system (self and sharer) is unchanged
-
- if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY)
- if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.1) // <10% change in sharer heat capacity
- temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT)
-
- if (initial(sharer.gc_share))
- GAS_GARBAGE_COLLECT(sharer.gases)
- if(temperature_delta > MINIMUM_TEMPERATURE_TO_MOVE || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE)
- var/our_moles
- TOTAL_MOLES(cached_gases,our_moles)
- var/their_moles
- TOTAL_MOLES(sharer_gases,their_moles)
- return (temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles)) * R_IDEAL_GAS_EQUATION / volume
-
-/datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity)
- //transfer of thermal energy (via conduction) between self and sharer
- if(sharer)
- sharer_temperature = sharer.temperature_archived
- var/temperature_delta = temperature_archived - sharer_temperature
- if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
- var/self_heat_capacity = archived_heat_capacity()
- sharer_heat_capacity = sharer_heat_capacity || sharer.archived_heat_capacity()
-
- if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY))
- var/heat = conduction_coefficient*temperature_delta* \
- (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity))
-
- temperature = max(temperature - heat/self_heat_capacity, TCMB)
- sharer_temperature = max(sharer_temperature + heat/sharer_heat_capacity, TCMB)
- if(sharer)
- sharer.temperature = sharer_temperature
- return sharer_temperature
- //thermal energy of the system (self and sharer) is unchanged
-
-/datum/gas_mixture/compare(datum/gas_mixture/sample)
- var/list/sample_gases = sample.gases //accessing datum vars is slower than proc vars
- var/list/cached_gases = gases
-
- for(var/id in cached_gases | sample_gases) // compare gases from either mixture
- var/gas_moles = cached_gases[id]
- var/sample_moles = sample_gases[id]
- var/delta = abs(gas_moles - sample_moles)
- if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && \
- delta > gas_moles * MINIMUM_AIR_RATIO_TO_MOVE)
- return id
-
- var/our_moles
- TOTAL_MOLES(cached_gases, our_moles)
- if(our_moles > MINIMUM_MOLES_DELTA_TO_MOVE)
- var/temp = temperature
- var/sample_temp = sample.temperature
-
- var/temperature_delta = abs(temp - sample_temp)
- if(temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND)
- return "temp"
-
- return ""
-
+
/datum/gas_mixture/react(datum/holder)
. = NO_REACTION
- var/list/cached_gases = gases
- if(!length(cached_gases))
+ if(!total_moles())
return
var/list/reactions = list()
for(var/datum/gas_reaction/G in SSair.gas_reactions)
- if(cached_gases[G.major_gas])
+ if(get_moles(G.major_gas))
reactions += G
if(!length(reactions))
return
reaction_results = new
- var/temp = temperature
- var/ener = THERMAL_ENERGY(src)
+ var/temp = return_temperature()
+ var/ener = thermal_energy()
reaction_loop:
for(var/r in reactions)
@@ -388,14 +196,13 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
for(var/id in min_reqs)
if (id == "TEMP" || id == "ENER")
continue
- if(cached_gases[id] < min_reqs[id])
+ if(get_moles(id) < min_reqs[id])
continue reaction_loop
//at this point, all minimum requirements for the reaction are satisfied.
/* currently no reactions have maximum requirements, so we can leave the checks commented out for a slight performance boost
PLEASE DO NOT REMOVE THIS CODE. the commenting is here only for a performance increase.
enabling these checks should be as easy as possible and the fact that they are disabled should be as clear as possible
-
var/list/max_reqs = reaction.max_requirements
if((max_reqs["TEMP"] && temp > max_reqs["TEMP"]) \
|| (max_reqs["ENER"] && ener > max_reqs["ENER"]))
@@ -410,8 +217,6 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
. |= reaction.react(src, holder)
if (. & STOP_REACTIONS)
break
- if(.)
- GAS_GARBAGE_COLLECT(gases)
//Takes the amount of the gas you want to PP as an argument
//So I don't have to do some hacky switches/defines/magic strings
@@ -420,16 +225,50 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
//O2_PP = get_partial_pressure(gas_mixture.oxygen)
/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure)
- return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME
+ return (gas_pressure * R_IDEAL_GAS_EQUATION * return_temperature()) / BREATH_VOLUME
//inverse
/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure)
- return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature)
+ return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * return_temperature())
//Mathematical proofs:
/*
get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp
get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles()
-
10/20*5 = 2.5
10 = 2.5/5*20
*/
+
+/datum/gas_mixture/turf
+
+/*
+/mob/verb/profile_atmos()
+ /world{loop_checks = 0;}
+ var/datum/gas_mixture/A = new
+ var/datum/gas_mixture/B = new
+ A.parse_gas_string("o2=200;n2=800;TEMP=50")
+ B.parse_gas_string("co2=500;plasma=500;TEMP=5000")
+ var/pa
+ var/pb
+ pa = world.tick_usage
+ for(var/I in 1 to 100000)
+ B.transfer_to(A, 1)
+ A.transfer_to(B, 1)
+ pb = world.tick_usage
+ var/total_time = (pb-pa) * world.tick_lag
+ to_chat(src, "Total time (gas transfer): [total_time]ms")
+ to_chat(src, "Operations per second: [100000 / (total_time/1000)]")
+ pa = world.tick_usage
+ for(var/I in 1 to 100000)
+ B.total_moles();
+ pb = world.tick_usage
+ total_time = (pb-pa) * world.tick_lag
+ to_chat(src, "Total time (total_moles): [total_time]ms")
+ to_chat(src, "Operations per second: [100000 / (total_time/1000)]")
+ pa = world.tick_usage
+ for(var/I in 1 to 100000)
+ new /datum/gas_mixture
+ pb = world.tick_usage
+ total_time = (pb-pa) * world.tick_lag
+ to_chat(src, "Total time (new gas mixture): [total_time]ms")
+ to_chat(src, "Operations per second: [100000 / (total_time/1000)]")
+*/
diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm
index 5527ba3fef..eefad7c970 100644
--- a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm
+++ b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm
@@ -2,73 +2,29 @@
//it can be changed, but any changes will ultimately be undone before they can have any effect
/datum/gas_mixture/immutable
- var/initial_temperature
- gc_share = TRUE
+ var/initial_temperature = 0
/datum/gas_mixture/immutable/New()
..()
- temperature = initial_temperature
- temperature_archived = initial_temperature
- gases.Cut()
+ set_temperature(initial_temperature)
+ populate()
+ mark_immutable()
-/datum/gas_mixture/immutable/merge()
- return 0 //we're immutable.
+/datum/gas_mixture/immutable/proc/populate()
+ return
-/datum/gas_mixture/immutable/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
- . = ..(sharer, 0)
- temperature = initial_temperature
- temperature_archived = initial_temperature
- gases.Cut()
-
-/datum/gas_mixture/immutable/react()
- return 0 //we're immutable.
-
-/datum/gas_mixture/immutable/copy()
- return new type //we're immutable, so we can just return a new instance.
-
-/datum/gas_mixture/immutable/copy_from()
- return 0 //we're immutable.
-
-/datum/gas_mixture/immutable/copy_from_turf()
- return 0 //we're immutable.
-
-/datum/gas_mixture/immutable/parse_gas_string()
- return 0 //we're immutable.
-
-/datum/gas_mixture/immutable/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity)
- . = ..()
- temperature = initial_temperature
-
-/datum/gas_mixture/immutable/proc/after_process_cell()
- temperature = initial_temperature
- temperature_archived = initial_temperature
- gases.Cut()
//used by space tiles
/datum/gas_mixture/immutable/space
initial_temperature = TCMB
-/datum/gas_mixture/immutable/space/heat_capacity()
- return HEAT_CAPACITY_VACUUM
-
-/datum/gas_mixture/immutable/space/remove()
- return copy() //we're always empty, so we can just return a copy.
-
-/datum/gas_mixture/immutable/space/remove_ratio()
- return copy() //we're always empty, so we can just return a copy.
-
+/datum/gas_mixture/immutable/space/populate()
+ set_min_heat_capacity(HEAT_CAPACITY_VACUUM)
//used by cloners
/datum/gas_mixture/immutable/cloner
initial_temperature = T20C
-/datum/gas_mixture/immutable/cloner/New()
+/datum/gas_mixture/immutable/cloner/populate()
..()
- gases[/datum/gas/nitrogen] = MOLES_O2STANDARD + MOLES_N2STANDARD
-
-/datum/gas_mixture/immutable/cloner/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
- . = ..(sharer, 0)
- gases[/datum/gas/nitrogen] = MOLES_O2STANDARD + MOLES_N2STANDARD
-
-/datum/gas_mixture/immutable/cloner/heat_capacity()
- return (MOLES_O2STANDARD + MOLES_N2STANDARD)*20 //specific heat of nitrogen is 20
+ set_moles(/datum/gas/nitrogen, MOLES_O2STANDARD + MOLES_N2STANDARD)
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index 59ef15b4cf..c0f66be7de 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -63,11 +63,11 @@
/datum/gas_reaction/water_vapor/react(datum/gas_mixture/air, datum/holder)
var/turf/open/location = isturf(holder) ? holder : null
. = NO_REACTION
- if (air.temperature <= WATER_VAPOR_FREEZE)
+ if (air.return_temperature() <= WATER_VAPOR_FREEZE)
if(location && location.freon_gas_act())
. = REACTING
else if(location && location.water_vapor_gas_act())
- air.gases[/datum/gas/water_vapor] -= MOLES_GAS_VISIBLE
+ air.adjust_moles(/datum/gas/water_vapor,-MOLES_GAS_VISIBLE)
. = REACTING
//tritium combustion: combustion of oxygen and tritium (treated as hydrocarbons). creates hotspots. exothermic
@@ -86,38 +86,37 @@
/datum/gas_reaction/tritfire/react(datum/gas_mixture/air, datum/holder)
var/energy_released = 0
var/old_heat_capacity = air.heat_capacity()
- var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow
- var/temperature = air.temperature
+ var/temperature = air.return_temperature()
var/list/cached_results = air.reaction_results
cached_results["fire"] = 0
var/turf/open/location = isturf(holder) ? holder : null
var/burned_fuel = 0
- if(cached_gases[/datum/gas/oxygen] < cached_gases[/datum/gas/tritium])
- burned_fuel = cached_gases[/datum/gas/oxygen]/TRITIUM_BURN_OXY_FACTOR
- cached_gases[/datum/gas/tritium] -= burned_fuel
+ if(air.get_moles(/datum/gas/oxygen) < air.get_moles(/datum/gas/tritium))
+ burned_fuel = air.get_moles(/datum/gas/oxygen)/TRITIUM_BURN_OXY_FACTOR
+ air.adjust_moles(/datum/gas/tritium, -burned_fuel)
else
- burned_fuel = cached_gases[/datum/gas/tritium]*TRITIUM_BURN_TRIT_FACTOR
- cached_gases[/datum/gas/tritium] -= cached_gases[/datum/gas/tritium]/TRITIUM_BURN_TRIT_FACTOR
- cached_gases[/datum/gas/oxygen] -= cached_gases[/datum/gas/tritium]
+ burned_fuel = air.get_moles(/datum/gas/tritium)*TRITIUM_BURN_TRIT_FACTOR
+ air.adjust_moles(/datum/gas/tritium, -air.get_moles(/datum/gas/tritium)/TRITIUM_BURN_TRIT_FACTOR)
+ air.adjust_moles(/datum/gas/oxygen,-air.get_moles(/datum/gas/tritium))
if(burned_fuel)
energy_released += (FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel)
if(location && prob(10) && burned_fuel > TRITIUM_MINIMUM_RADIATION_ENERGY) //woah there let's not crash the server
radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR)
- cached_gases[/datum/gas/water_vapor] += burned_fuel/TRITIUM_BURN_OXY_FACTOR
+ air.adjust_moles(/datum/gas/water_vapor, burned_fuel/TRITIUM_BURN_OXY_FACTOR)
cached_results["fire"] += burned_fuel
if(energy_released > 0)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = (temperature*old_heat_capacity + energy_released)/new_heat_capacity
+ air.set_temperature((temperature*old_heat_capacity + energy_released)/new_heat_capacity)
//let the floor know a fire is happening
if(istype(location))
- temperature = air.temperature
+ temperature = air.return_temperature()
if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
location.hotspot_expose(temperature, CELL_VOLUME)
for(var/I in location)
@@ -143,8 +142,7 @@
/datum/gas_reaction/plasmafire/react(datum/gas_mixture/air, datum/holder)
var/energy_released = 0
var/old_heat_capacity = air.heat_capacity()
- var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow
- var/temperature = air.temperature
+ var/temperature = air.return_temperature()
var/list/cached_results = air.reaction_results
cached_results["fire"] = 0
var/turf/open/location = isturf(holder) ? holder : null
@@ -163,21 +161,21 @@
temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE)
if(temperature_scale > 0)
oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale
- if(cached_gases[/datum/gas/oxygen] / cached_gases[/datum/gas/plasma] > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium.
+ if(air.get_moles(/datum/gas/oxygen) / air.get_moles(/datum/gas/plasma) > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium.
super_saturation = TRUE
- if(cached_gases[/datum/gas/oxygen] > cached_gases[/datum/gas/plasma]*PLASMA_OXYGEN_FULLBURN)
- plasma_burn_rate = (cached_gases[/datum/gas/plasma]*temperature_scale)/PLASMA_BURN_RATE_DELTA
+ if(air.get_moles(/datum/gas/oxygen) > air.get_moles(/datum/gas/plasma)*PLASMA_OXYGEN_FULLBURN)
+ plasma_burn_rate = (air.get_moles(/datum/gas/plasma)*temperature_scale)/PLASMA_BURN_RATE_DELTA
else
- plasma_burn_rate = (temperature_scale*(cached_gases[/datum/gas/oxygen]/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA
+ plasma_burn_rate = (temperature_scale*(air.get_moles(/datum/gas/oxygen)/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA
if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY)
- plasma_burn_rate = min(plasma_burn_rate,cached_gases[/datum/gas/plasma],cached_gases[/datum/gas/oxygen]/oxygen_burn_rate) //Ensures matter is conserved properly
- cached_gases[/datum/gas/plasma] = QUANTIZE(cached_gases[/datum/gas/plasma] - plasma_burn_rate)
- cached_gases[/datum/gas/oxygen] = QUANTIZE(cached_gases[/datum/gas/oxygen] - (plasma_burn_rate * oxygen_burn_rate))
+ plasma_burn_rate = min(plasma_burn_rate,air.get_moles(/datum/gas/plasma),air.get_moles(/datum/gas/oxygen)/oxygen_burn_rate) //Ensures matter is conserved properly
+ air.set_moles(/datum/gas/plasma, QUANTIZE(air.get_moles(/datum/gas/plasma) - plasma_burn_rate))
+ air.set_moles(/datum/gas/oxygen, QUANTIZE(air.get_moles(/datum/gas/oxygen) - (plasma_burn_rate * oxygen_burn_rate)))
if (super_saturation)
- cached_gases[/datum/gas/tritium] += plasma_burn_rate
+ air.adjust_moles(/datum/gas/tritium, plasma_burn_rate)
else
- cached_gases[/datum/gas/carbon_dioxide] += plasma_burn_rate
+ air.adjust_moles(/datum/gas/carbon_dioxide, plasma_burn_rate)
energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate)
@@ -186,11 +184,11 @@
if(energy_released > 0)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = (temperature*old_heat_capacity + energy_released)/new_heat_capacity
+ air.set_temperature((temperature*old_heat_capacity + energy_released)/new_heat_capacity)
//let the floor know a fire is happening
if(istype(location))
- temperature = air.temperature
+ temperature = air.return_temperature()
if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
location.hotspot_expose(temperature, CELL_VOLUME)
for(var/I in location)
@@ -218,7 +216,6 @@
/datum/gas/carbon_dioxide = FUSION_MOLE_THRESHOLD)
/datum/gas_reaction/fusion/react(datum/gas_mixture/air, datum/holder)
- var/list/cached_gases = air.gases
var/turf/open/location
if (istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet.
var/datum/pipeline/fusion_pipenet = holder
@@ -230,14 +227,14 @@
var/list/cached_scan_results = air.analyzer_results
var/old_heat_capacity = air.heat_capacity()
var/reaction_energy = 0 //Reaction energy can be negative or positive, for both exothermic and endothermic reactions.
- var/initial_plasma = cached_gases[/datum/gas/plasma]
- var/initial_carbon = cached_gases[/datum/gas/carbon_dioxide]
- var/scale_factor = (air.volume)/(PI) //We scale it down by volume/Pi because for fusion conditions, moles roughly = 2*volume, but we want it to be based off something constant between reactions.
- var/toroidal_size = (2*PI)+TORADIANS(arctan((air.volume-TOROID_VOLUME_BREAKEVEN)/TOROID_VOLUME_BREAKEVEN)) //The size of the phase space hypertorus
+ var/initial_plasma = air.get_moles(/datum/gas/plasma)
+ var/initial_carbon = air.get_moles(/datum/gas/carbon_dioxide)
+ var/scale_factor = (air.return_volume())/(PI) //We scale it down by volume/Pi because for fusion conditions, moles roughly = 2*volume, but we want it to be based off something constant between reactions.
+ var/toroidal_size = (2*PI)+TORADIANS(arctan((air.return_volume()-TOROID_VOLUME_BREAKEVEN)/TOROID_VOLUME_BREAKEVEN)) //The size of the phase space hypertorus
var/gas_power = 0
var/list/gas_fusion_powers = GLOB.meta_gas_fusions
- for (var/gas_id in cached_gases)
- gas_power += (gas_fusion_powers[gas_id]*cached_gases[gas_id])
+ for (var/gas_id in air.get_gases())
+ gas_power += (gas_fusion_powers[gas_id]*air.get_moles(gas_id))
var/instability = MODULUS((gas_power*INSTABILITY_GAS_POWER_FACTOR)**2,toroidal_size) //Instability effects how chaotic the behavior of the reaction is
cached_scan_results[id] = instability//used for analyzer feedback
@@ -249,9 +246,9 @@
carbon = MODULUS(carbon - plasma, toroidal_size)
- cached_gases[/datum/gas/plasma] = plasma*scale_factor + FUSION_MOLE_THRESHOLD //Scales the gases back up
- cached_gases[/datum/gas/carbon_dioxide] = carbon*scale_factor + FUSION_MOLE_THRESHOLD
- var/delta_plasma = initial_plasma - cached_gases[/datum/gas/plasma]
+ air.set_moles(/datum/gas/plasma, plasma*scale_factor + FUSION_MOLE_THRESHOLD) //Scales the gases back up
+ air.set_moles(/datum/gas/carbon_dioxide , carbon*scale_factor + FUSION_MOLE_THRESHOLD)
+ var/delta_plasma = initial_plasma - air.get_moles(/datum/gas/plasma)
reaction_energy += delta_plasma*PLASMA_BINDING_ENERGY //Energy is gained or lost corresponding to the creation or destruction of mass.
if(instability < FUSION_INSTABILITY_ENDOTHERMALITY)
@@ -260,17 +257,17 @@
reaction_energy *= (instability-FUSION_INSTABILITY_ENDOTHERMALITY)**0.5
if(air.thermal_energy() + reaction_energy < 0) //No using energy that doesn't exist.
- cached_gases[/datum/gas/plasma] = initial_plasma
- cached_gases[/datum/gas/carbon_dioxide] = initial_carbon
+ air.set_moles(/datum/gas/plasma,initial_plasma)
+ air.set_moles(/datum/gas/carbon_dioxide, initial_carbon)
return NO_REACTION
- cached_gases[/datum/gas/tritium] -= FUSION_TRITIUM_MOLES_USED
+ air.adjust_moles(/datum/gas/tritium, -FUSION_TRITIUM_MOLES_USED)
//The decay of the tritium and the reaction's energy produces waste gases, different ones depending on whether the reaction is endo or exothermic
if(reaction_energy > 0)
- cached_gases[/datum/gas/oxygen] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)
- cached_gases[/datum/gas/nitrous_oxide] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)
+ air.adjust_moles(/datum/gas/oxygen, FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT))
+ air.adjust_moles(/datum/gas/nitrous_oxide, FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT))
else
- cached_gases[/datum/gas/bz] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)
- cached_gases[/datum/gas/nitryl] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)
+ air.adjust_moles(/datum/gas/bz, FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT))
+ air.adjust_moles(/datum/gas/nitryl, FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT))
if(reaction_energy)
if(location)
@@ -282,7 +279,7 @@
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = clamp(((air.temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY)
+ air.set_temperature(clamp(((air.return_temperature()*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY))
return REACTING
/datum/gas_reaction/nitrylformation //The formation of nitryl. Endothermic. Requires N2O as a catalyst.
@@ -299,22 +296,21 @@
)
/datum/gas_reaction/nitrylformation/react(datum/gas_mixture/air)
- var/list/cached_gases = air.gases
- var/temperature = air.temperature
+ var/temperature = air.return_temperature()
var/old_heat_capacity = air.heat_capacity()
- var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*100),cached_gases[/datum/gas/oxygen],cached_gases[/datum/gas/nitrogen])
+ var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*100),air.get_moles(/datum/gas/oxygen),air.get_moles(/datum/gas/nitrogen))
var/energy_used = heat_efficency*NITRYL_FORMATION_ENERGY
- if ((cached_gases[/datum/gas/oxygen] - heat_efficency < 0 )|| (cached_gases[/datum/gas/nitrogen] - heat_efficency < 0)) //Shouldn't produce gas from nothing.
+ if ((air.get_moles(/datum/gas/oxygen) - heat_efficency < 0 )|| (air.get_moles(/datum/gas/nitrogen) - heat_efficency < 0)) //Shouldn't produce gas from nothing.
return NO_REACTION
- cached_gases[/datum/gas/oxygen] -= heat_efficency
- cached_gases[/datum/gas/nitrogen] -= heat_efficency
- cached_gases[/datum/gas/nitryl] += heat_efficency*2
+ air.adjust_moles(/datum/gas/oxygen, heat_efficency)
+ air.adjust_moles(/datum/gas/nitrogen, heat_efficency)
+ air.adjust_moles(/datum/gas/nitryl, heat_efficency*2)
if(energy_used > 0)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = max(((temperature*old_heat_capacity - energy_used)/new_heat_capacity),TCMB)
+ air.set_temperature(max(((temperature*old_heat_capacity - energy_used)/new_heat_capacity),TCMB))
return REACTING
/datum/gas_reaction/bzformation //Formation of BZ by combining plasma and tritium at low pressures. Exothermic.
@@ -330,27 +326,26 @@
/datum/gas_reaction/bzformation/react(datum/gas_mixture/air)
- var/list/cached_gases = air.gases
- var/temperature = air.temperature
+ var/temperature = air.return_temperature()
var/pressure = air.return_pressure()
var/old_heat_capacity = air.heat_capacity()
- var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma]/cached_gases[/datum/gas/nitrous_oxide],1))),cached_gases[/datum/gas/nitrous_oxide],cached_gases[/datum/gas/plasma]/2)
+ var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(air.get_moles(/datum/gas/plasma)/air.get_moles(/datum/gas/nitrous_oxide),1))),air.get_moles(/datum/gas/nitrous_oxide),air.get_moles(/datum/gas/plasma)/2)
var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED
- if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing.
+ if ((air.get_moles(/datum/gas/nitrous_oxide) - reaction_efficency < 0 )|| (air.get_moles(/datum/gas/plasma) - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing.
return NO_REACTION
- cached_gases[/datum/gas/bz] += reaction_efficency
- if(reaction_efficency == cached_gases[/datum/gas/nitrous_oxide])
- cached_gases[/datum/gas/bz] -= min(pressure,1)
- cached_gases[/datum/gas/oxygen] += min(pressure,1)
- cached_gases[/datum/gas/nitrous_oxide] -= reaction_efficency
- cached_gases[/datum/gas/plasma] -= 2*reaction_efficency
+ air.adjust_moles(/datum/gas/bz, reaction_efficency)
+ if(reaction_efficency == air.get_moles(/datum/gas/nitrous_oxide))
+ air.adjust_moles(/datum/gas/bz, -min(pressure,1))
+ air.adjust_moles(/datum/gas/oxygen, min(pressure,1))
+ air.adjust_moles(/datum/gas/nitrous_oxide, -reaction_efficency)
+ air.adjust_moles(/datum/gas/plasma, -2*reaction_efficency)
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min((reaction_efficency**2)*BZ_RESEARCH_SCALE),BZ_RESEARCH_MAX_AMOUNT)
if(energy_released > 0)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = max(((temperature*old_heat_capacity + energy_released)/new_heat_capacity),TCMB)
+ air.set_temperature(max(((temperature*old_heat_capacity + energy_released)/new_heat_capacity),TCMB))
return REACTING
/datum/gas_reaction/stimformation //Stimulum formation follows a strange pattern of how effective it will be at a given temperature, having some multiple peaks and some large dropoffs. Exo and endo thermic.
@@ -367,24 +362,22 @@
"TEMP" = STIMULUM_HEAT_SCALE/2)
/datum/gas_reaction/stimformation/react(datum/gas_mixture/air)
- var/list/cached_gases = air.gases
-
var/old_heat_capacity = air.heat_capacity()
- var/heat_scale = min(air.temperature/STIMULUM_HEAT_SCALE,cached_gases[/datum/gas/tritium],cached_gases[/datum/gas/plasma],cached_gases[/datum/gas/nitryl])
+ var/heat_scale = min(air.return_temperature()/STIMULUM_HEAT_SCALE,air.get_moles(/datum/gas/tritium),air.get_moles(/datum/gas/plasma),air.get_moles(/datum/gas/nitryl))
var/stim_energy_change = heat_scale + STIMULUM_FIRST_RISE*(heat_scale**2) - STIMULUM_FIRST_DROP*(heat_scale**3) + STIMULUM_SECOND_RISE*(heat_scale**4) - STIMULUM_ABSOLUTE_DROP*(heat_scale**5)
- if ((cached_gases[/datum/gas/tritium] - heat_scale < 0 )|| (cached_gases[/datum/gas/plasma] - heat_scale < 0) || (cached_gases[/datum/gas/nitryl] - heat_scale < 0)) //Shouldn't produce gas from nothing.
+ if ((air.get_moles(/datum/gas/tritium) - heat_scale < 0 )|| (air.get_moles(/datum/gas/plasma) - heat_scale < 0) || (air.get_moles(/datum/gas/nitryl) - heat_scale < 0)) //Shouldn't produce gas from nothing.
return NO_REACTION
- cached_gases[/datum/gas/stimulum]+= heat_scale/10
- cached_gases[/datum/gas/tritium] -= heat_scale
- cached_gases[/datum/gas/plasma] -= heat_scale
- cached_gases[/datum/gas/nitryl] -= heat_scale
+ air.adjust_moles(/datum/gas/stimulum, heat_scale/10)
+ air.adjust_moles(/datum/gas/tritium, -heat_scale)
+ air.adjust_moles(/datum/gas/plasma, -heat_scale)
+ air.adjust_moles(/datum/gas/nitryl, -heat_scale)
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, STIMULUM_RESEARCH_AMOUNT*max(stim_energy_change,0))
if(stim_energy_change)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = max(((air.temperature*old_heat_capacity + stim_energy_change)/new_heat_capacity),TCMB)
+ air.set_temperature(max(((air.return_temperature()*old_heat_capacity + stim_energy_change)/new_heat_capacity),TCMB))
return REACTING
/datum/gas_reaction/nobliumformation //Hyper-Noblium formation is extrememly endothermic, but requires high temperatures to start. Due to its high mass, hyper-nobelium uses large amounts of nitrogen and tritium. BZ can be used as a catalyst to make it less endothermic.
@@ -399,22 +392,21 @@
"TEMP" = 5000000)
/datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air)
- var/list/cached_gases = air.gases
var/old_heat_capacity = air.heat_capacity()
- var/nob_formed = min((cached_gases[/datum/gas/nitrogen]+cached_gases[/datum/gas/tritium])/100,cached_gases[/datum/gas/tritium]/10,cached_gases[/datum/gas/nitrogen]/20)
- var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(cached_gases[/datum/gas/bz],1)))
- if ((cached_gases[/datum/gas/tritium] - 10*nob_formed < 0) || (cached_gases[/datum/gas/nitrogen] - 20*nob_formed < 0))
+ var/nob_formed = min((air.get_moles(/datum/gas/nitrogen)+air.get_moles(/datum/gas/tritium))/100,air.get_moles(/datum/gas/tritium)/10,air.get_moles(/datum/gas/nitrogen)/20)
+ var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(air.get_moles(/datum/gas/bz),1)))
+ if ((air.get_moles(/datum/gas/tritium) - 10*nob_formed < 0) || (air.get_moles(/datum/gas/nitrogen) - 20*nob_formed < 0))
return NO_REACTION
- cached_gases[/datum/gas/tritium] -= 10*nob_formed
- cached_gases[/datum/gas/nitrogen] -= 20*nob_formed
- cached_gases[/datum/gas/hypernoblium]+= nob_formed
+ air.adjust_moles(/datum/gas/tritium, -10*nob_formed)
+ air.adjust_moles(/datum/gas/nitrogen, -20*nob_formed)
+ air.adjust_moles(/datum/gas/hypernoblium,nob_formed)
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, nob_formed*NOBLIUM_RESEARCH_AMOUNT)
if (nob_formed)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = max(((air.temperature*old_heat_capacity - energy_taken)/new_heat_capacity),TCMB)
+ air.set_temperature(max(((air.return_temperature()*old_heat_capacity - energy_taken)/new_heat_capacity),TCMB))
/datum/gas_reaction/miaster //dry heat sterilization: clears out pathogens in the air
@@ -429,16 +421,15 @@
)
/datum/gas_reaction/miaster/react(datum/gas_mixture/air, datum/holder)
- var/list/cached_gases = air.gases
// As the name says it, it needs to be dry
- if(cached_gases[/datum/gas/water_vapor] && cached_gases[/datum/gas/water_vapor]/air.total_moles() > 0.1)
+ if(air.get_moles(/datum/gas/water_vapor) && air.get_moles(/datum/gas/water_vapor)/air.total_moles() > 0.1)
return
//Replace miasma with oxygen
- var/cleaned_air = min(cached_gases[/datum/gas/miasma], 20 + (air.temperature - FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 70) / 20)
- cached_gases[/datum/gas/miasma] -= cleaned_air
- cached_gases[/datum/gas/oxygen] += cleaned_air
+ var/cleaned_air = min(air.get_moles(/datum/gas/miasma), 20 + (air.return_temperature() - FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 70) / 20)
+ air.adjust_moles(/datum/gas/miasma, -cleaned_air)
+ air.adjust_moles(/datum/gas/oxygen, cleaned_air)
//Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable
- air.temperature += cleaned_air * 0.002
+ air.set_temperature(air.return_temperature() + cleaned_air * 0.002)
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, cleaned_air*MIASMA_RESEARCH_AMOUNT)//Turns out the burning of miasma is kinda interesting to scientists
diff --git a/code/modules/atmospherics/gasmixtures/zextools_broke.dm b/code/modules/atmospherics/gasmixtures/zextools_broke.dm
new file mode 100644
index 0000000000..eef6933edb
--- /dev/null
+++ b/code/modules/atmospherics/gasmixtures/zextools_broke.dm
@@ -0,0 +1,304 @@
+#ifdef EXTOOLS_BROKE
+
+/datum/gas_mixture
+ var/list/gases = list()
+ var/temperature = 0 //kelvins
+ var/tmp/temperature_archived = 0
+ var/volume = CELL_VOLUME //liters
+ var/last_share = 0
+
+/datum/gas_mixture/heat_capacity() //joules per kelvin
+ var/list/cached_gases = gases
+ var/list/cached_gasheats = GLOB.meta_gas_specific_heats
+ . = 0
+ for(var/id in cached_gases)
+ . += cached_gases[id] * cached_gasheats[id]
+
+/datum/gas_mixture/turf/heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM
+ var/list/cached_gases = gases
+ var/list/cached_gasheats = GLOB.meta_gas_specific_heats
+ for(var/id in cached_gases)
+ . += cached_gases[id] * cached_gasheats[id]
+ if(!.)
+ . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space
+
+//prefer this to gas_mixture/total_moles in performance critical areas
+#define TOTAL_MOLES(cached_gases, out_var)\
+ out_var = 0;\
+ for(var/total_moles_id in cached_gases){\
+ out_var += cached_gases[total_moles_id];\
+ }
+
+#define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity())
+
+/datum/gas_mixture/total_moles()
+ var/cached_gases = gases
+ TOTAL_MOLES(cached_gases, .)
+
+/datum/gas_mixture/return_pressure() //kilopascals
+ if(volume > 0) // to prevent division by zero
+ var/cached_gases = gases
+ TOTAL_MOLES(cached_gases, .)
+ . *= R_IDEAL_GAS_EQUATION * temperature / volume
+ return
+ return 0
+
+/datum/gas_mixture/return_temperature() //kelvins
+ return temperature
+
+/datum/gas_mixture/set_min_heat_capacity(n)
+ return
+/datum/gas_mixture/set_temperature(new_temp)
+ temperature = new_temp
+/datum/gas_mixture/set_volume(new_volume)
+ volume = new_volume
+/datum/gas_mixture/get_moles(gas_type)
+ return gases[gas_type]
+/datum/gas_mixture/set_moles(gas_type, moles)
+ gases[gas_type] = moles
+/datum/gas_mixture/scrub_into(datum/gas_mixture/target, list/gases)
+ if(isnull(target))
+ return FALSE
+
+ var/list/removed_gases = target.gases
+
+ //Filter it
+ var/datum/gas_mixture/filtered_out = new
+ var/list/filtered_gases = filtered_out.gases
+ filtered_out.temperature = removed.temperature
+ for(var/gas in filter_types & removed_gases)
+ filtered_gases[gas] = removed_gases[gas]
+ removed_gases[gas] = 0
+ merge(filtered_out)
+/datum/gas_mixture/mark_immutable()
+ return
+/datum/gas_mixture/get_gases()
+ return gases
+/datum/gas_mixture/multiply(factor)
+ for(var/id in gases)
+ gases[id] *= factor
+/datum/gas_mixture/get_last_share()
+ return last_share
+/datum/gas_mixture/clear()
+ gases.Cut()
+
+/datum/gas_mixture/return_volume()
+ return volume // wow!
+
+/datum/gas_mixture/thermal_energy()
+ return THERMAL_ENERGY(src)
+
+/datum/gas_mixture/archive()
+ temperature_archived = temperature
+ gas_archive = gases.Copy()
+ return 1
+
+/datum/gas_mixture/merge(datum/gas_mixture/giver)
+ if(!giver)
+ return 0
+
+ //heat transfer
+ if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
+ var/self_heat_capacity = heat_capacity()
+ var/giver_heat_capacity = giver.heat_capacity()
+ var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity
+ if(combined_heat_capacity)
+ temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity
+
+ var/list/cached_gases = gases //accessing datum vars is slower than proc vars
+ var/list/giver_gases = giver.gases
+ //gas transfer
+ for(var/giver_id in giver_gases)
+ cached_gases[giver_id] += giver_gases[giver_id]
+
+ return 1
+
+/datum/gas_mixture/remove(amount)
+ var/sum
+ var/list/cached_gases = gases
+ TOTAL_MOLES(cached_gases, sum)
+ amount = min(amount, sum) //Can not take more air than tile has!
+ if(amount <= 0)
+ return null
+ var/datum/gas_mixture/removed = new type
+ var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars
+
+ removed.temperature = temperature
+ for(var/id in cached_gases)
+ removed_gases[id] = QUANTIZE((cached_gases[id] / sum) * amount)
+ cached_gases[id] -= removed_gases[id]
+ GAS_GARBAGE_COLLECT(gases)
+
+ return removed
+
+/datum/gas_mixture/remove_ratio(ratio)
+ if(ratio <= 0)
+ return null
+ ratio = min(ratio, 1)
+
+ var/list/cached_gases = gases
+ var/datum/gas_mixture/removed = new type
+ var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars
+
+ removed.temperature = temperature
+ for(var/id in cached_gases)
+ removed_gases[id] = QUANTIZE(cached_gases[id] * ratio)
+ cached_gases[id] -= removed_gases[id]
+
+ GAS_GARBAGE_COLLECT(gases)
+
+ return removed
+
+/datum/gas_mixture/copy()
+ var/list/cached_gases = gases
+ var/datum/gas_mixture/copy = new type
+ var/list/copy_gases = copy.gases
+
+ copy.temperature = temperature
+ for(var/id in cached_gases)
+ copy_gases[id] = cached_gases[id]
+
+ return copy
+
+
+/datum/gas_mixture/copy_from(datum/gas_mixture/sample)
+ var/list/cached_gases = gases //accessing datum vars is slower than proc vars
+ var/list/sample_gases = sample.gases
+
+ temperature = sample.temperature
+ for(var/id in sample_gases)
+ cached_gases[id] = sample_gases[id]
+
+ //remove all gases not in the sample
+ cached_gases &= sample_gases
+
+ return 1
+
+/datum/gas_mixture/copy_from_turf(turf/model)
+ parse_gas_string(model.initial_gas_mix)
+
+ //acounts for changes in temperature
+ var/turf/model_parent = model.parent_type
+ if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature))
+ temperature = model.temperature
+
+ return 1
+
+/datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
+
+ var/list/cached_gases = gases
+ var/list/sharer_gases = sharer.gases
+
+ var/temperature_delta = temperature_archived - sharer.temperature_archived
+ var/abs_temperature_delta = abs(temperature_delta)
+
+ var/old_self_heat_capacity = 0
+ var/old_sharer_heat_capacity = 0
+ if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
+ old_self_heat_capacity = heat_capacity()
+ old_sharer_heat_capacity = sharer.heat_capacity()
+
+ var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer
+ var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us
+
+ var/moved_moles = 0
+ var/abs_moved_moles = 0
+
+ //we're gonna define these vars outside of this for loop because as it turns out, var declaration is pricy
+ var/delta
+ var/gas_heat_capacity
+ //and also cache this shit rq because that results in sanic speed for reasons byond explanation
+ var/list/cached_gasheats = GLOB.meta_gas_specific_heats
+ //GAS TRANSFER
+ for(var/id in cached_gases | sharer_gases) // transfer gases
+
+ delta = QUANTIZE(gas_archive[id] - sharer.gas_archive[id])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures
+
+ if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
+ gas_heat_capacity = delta * cached_gasheats[id]
+ if(delta > 0)
+ heat_capacity_self_to_sharer += gas_heat_capacity
+ else
+ heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative.
+
+ cached_gases[id] -= delta
+ sharer_gases[id] += delta
+ moved_moles += delta
+ abs_moved_moles += abs(delta)
+
+ last_share = abs_moved_moles
+
+ //THERMAL ENERGY TRANSFER
+ if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
+ var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer
+ var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self
+
+ //transfer of thermal energy (via changed heat capacity) between self and sharer
+ if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY)
+ temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity
+
+ if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY)
+ sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity
+ //thermal energy of the system (self and sharer) is unchanged
+
+ if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY)
+ if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.1) // <10% change in sharer heat capacity
+ temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT)
+
+ if (initial(sharer.gc_share))
+ GAS_GARBAGE_COLLECT(sharer.gases)
+ if(temperature_delta > MINIMUM_TEMPERATURE_TO_MOVE || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE)
+ var/our_moles
+ TOTAL_MOLES(cached_gases,our_moles)
+ var/their_moles
+ TOTAL_MOLES(sharer_gases,their_moles)
+ return (temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles)) * R_IDEAL_GAS_EQUATION / volume
+
+/datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity)
+ //transfer of thermal energy (via conduction) between self and sharer
+ if(sharer)
+ sharer_temperature = sharer.temperature_archived
+ var/temperature_delta = temperature_archived - sharer_temperature
+ if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
+ var/self_heat_capacity = archived_heat_capacity()
+ sharer_heat_capacity = sharer_heat_capacity || sharer.archived_heat_capacity()
+
+ if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY))
+ var/heat = conduction_coefficient*temperature_delta* \
+ (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity))
+
+ temperature = max(temperature - heat/self_heat_capacity, TCMB)
+ sharer_temperature = max(sharer_temperature + heat/sharer_heat_capacity, TCMB)
+ if(sharer)
+ sharer.temperature = sharer_temperature
+ return sharer_temperature
+ //thermal energy of the system (self and sharer) is unchanged
+
+/datum/gas_mixture/compare(datum/gas_mixture/sample)
+ var/list/sample_gases = sample.gases //accessing datum vars is slower than proc vars
+ var/list/cached_gases = gases
+
+ for(var/id in cached_gases | sample_gases) // compare gases from either mixture
+ var/gas_moles = cached_gases[id]
+ var/sample_moles = sample_gases[id]
+ var/delta = abs(gas_moles - sample_moles)
+ if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && \
+ delta > gas_moles * MINIMUM_AIR_RATIO_TO_MOVE)
+ return id
+
+ var/our_moles
+ TOTAL_MOLES(cached_gases, our_moles)
+ if(our_moles > MINIMUM_MOLES_DELTA_TO_MOVE)
+ var/temp = temperature
+ var/sample_temp = sample.temperature
+
+ var/temperature_delta = abs(temp - sample_temp)
+ if(temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND)
+ return "temp"
+
+ return ""
+
+/datum/gas_mixture/transfer_to(datum/gas_mixture/target, amount)
+ return merge(target.remove(amount))
+
+#endif
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index b47f45b42d..20a2638dcf 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -269,7 +269,7 @@
"unit" = "kPa",
"danger_level" = cur_tlv.get_danger_level(pressure)
))
- var/temperature = environment.temperature
+ var/temperature = environment.return_temperature()
cur_tlv = TLV["temperature"]
data["environment_data"] += list(list(
"name" = "Temperature",
@@ -278,16 +278,16 @@
"danger_level" = cur_tlv.get_danger_level(temperature)
))
var/total_moles = environment.total_moles()
- var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume
- for(var/gas_id in environment.gases)
+ var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.return_temperature() / environment.return_volume()
+ for(var/gas_id in environment.get_gases())
if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
continue
cur_tlv = TLV[gas_id]
data["environment_data"] += list(list(
"name" = GLOB.meta_gas_names[gas_id],
- "value" = environment.gases[gas_id] / total_moles * 100,
+ "value" = environment.get_moles(gas_id) / total_moles * 100,
"unit" = "%",
- "danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id] * partial_pressure)
+ "danger_level" = cur_tlv.get_danger_level(environment.get_moles(gas_id) * partial_pressure)
))
if(!locked || hasSiliconAccessInArea(user, PRIVILEDGES_SILICON|PRIVILEDGES_DRONE))
@@ -684,24 +684,21 @@
var/datum/tlv/cur_tlv
var/datum/gas_mixture/environment = location.return_air()
- var/list/env_gases = environment.gases
- var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume
+ var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.return_temperature() / environment.return_volume()
cur_tlv = TLV["pressure"]
var/environment_pressure = environment.return_pressure()
var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure)
cur_tlv = TLV["temperature"]
- var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.temperature)
+ var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.return_temperature())
var/gas_dangerlevel = 0
- for(var/gas_id in env_gases)
+ for(var/gas_id in environment.get_gases())
if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
continue
cur_tlv = TLV[gas_id]
- gas_dangerlevel = max(gas_dangerlevel, cur_tlv.get_danger_level(env_gases[gas_id] * partial_pressure))
-
- GAS_GARBAGE_COLLECT(environment.gases)
+ gas_dangerlevel = max(gas_dangerlevel, cur_tlv.get_danger_level(environment.get_moles(gas_id) * partial_pressure))
var/old_danger_level = danger_level
danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
index 6b685d4bc1..39a99148c2 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
@@ -52,10 +52,10 @@
return null
//Calculate necessary moles to transfer using PV = nRT
- if(air2.temperature>0)
+ if(air2.return_temperature()>0)
var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2
- var/transfer_moles = pressure_delta*air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION)
+ var/transfer_moles = pressure_delta*air1.return_volume()/(air2.return_temperature() * R_IDEAL_GAS_EQUATION)
last_pressure_delta = pressure_delta
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
index 2dc0afac26..d1bb58b99a 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
@@ -66,8 +66,8 @@
pressure_delta = min(pressure_delta, (air1.return_pressure() - input_pressure_min))
if(pressure_delta > 0)
- if(air1.temperature > 0)
- var/transfer_moles = pressure_delta*environment.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
+ if(air1.return_temperature() > 0)
+ var/transfer_moles = pressure_delta*environment.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
//Removed can be null if there is no atmosphere in air1
@@ -81,20 +81,17 @@
parent1.update = 1
else //external -> output
- var/pressure_delta = 10000
+ if(environment.return_pressure() > 0)
+ var/our_multiplier = air2.return_volume() / (environment.return_temperature() * R_IDEAL_GAS_EQUATION)
+ var/moles_delta = 10000 * our_multiplier
+ if(pressure_checks&EXT_BOUND)
+ moles_delta = min(moles_delta, (environment_pressure - output_pressure_max) * environment.return_volume() / (environment.return_temperature() * R_IDEAL_GAS_EQUATION))
+ if(pressure_checks&INPUT_MIN)
+ moles_delta = min(moles_delta, (input_pressure_min - air2.return_pressure()) * our_multiplier)
- if(pressure_checks&EXT_BOUND)
- pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound))
- if(pressure_checks&INPUT_MIN)
- pressure_delta = min(pressure_delta, (output_pressure_max - air2.return_pressure()))
-
- if(pressure_delta > 0)
- if(environment.temperature > 0)
- var/transfer_moles = pressure_delta*air2.volume/(environment.temperature * R_IDEAL_GAS_EQUATION)
-
- var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
- //removed can be null if there is no air in the location
- if(!removed)
+ if(moles_delta > 0)
+ var/datum/gas_mixture/removed = loc.remove_air(moles_delta)
+ if (isnull(removed)) // in space
return
air2.merge(removed)
@@ -182,8 +179,8 @@
..()
var/datum/gas_mixture/air1 = airs[1]
var/datum/gas_mixture/air2 = airs[2]
- air1.volume = 1000
- air2.volume = 1000
+ air1.set_volume(1000)
+ air2.set_volume(1000)
// Mapping
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
index 051dc965ad..fc967608b3 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
@@ -53,11 +53,11 @@ Passive gate is similar to the regular pump except:
return
//Calculate necessary moles to transfer using PV = nRT
- if((air1.total_moles() > 0) && (air1.temperature>0))
+ if((air1.total_moles() > 0) && (air1.return_temperature()>0))
var/pressure_delta = min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2)
//Can not have a pressure delta that would cause output_pressure > input_pressure
- var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
+ var/transfer_moles = pressure_delta*air2.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION)
//Actually transfer the gas
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
@@ -172,4 +172,4 @@ Passive gate is similar to the regular pump except:
/obj/machinery/atmospherics/components/binary/passive_gate/layer3
piping_layer = 3
- icon_state = "passgate_map-3"
\ No newline at end of file
+ icon_state = "passgate_map-3"
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
index 0e41f78e20..ab6d02fe61 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
@@ -77,9 +77,9 @@
return
//Calculate necessary moles to transfer using PV=nRT
- if((air1.total_moles() > 0) && (air1.temperature>0))
+ if((air1.total_moles() > 0) && (air1.return_temperature()>0))
var/pressure_delta = target_pressure - output_starting_pressure
- var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
+ var/transfer_moles = pressure_delta*air2.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION)
//Actually transfer the gas
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
@@ -212,4 +212,4 @@
/obj/machinery/atmospherics/components/binary/pump/on/layer3
piping_layer = 3
- icon_state= "pump_on_map-3"
\ No newline at end of file
+ icon_state= "pump_on_map-3"
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
index 1005f72afe..87cbeb6edf 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
@@ -65,7 +65,7 @@
if((input_starting_pressure < 0.01) || (output_starting_pressure > 9000))
return
- var/transfer_ratio = transfer_rate/air1.volume
+ var/transfer_ratio = transfer_rate/air1.return_volume()
var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio)
@@ -153,7 +153,7 @@
if("set_transfer_rate" in signal.data)
var/datum/gas_mixture/air1 = airs[1]
- transfer_rate = clamp(text2num(signal.data["set_transfer_rate"]),0,air1.volume)
+ transfer_rate = clamp(text2num(signal.data["set_transfer_rate"]),0,air1.return_volume())
if(on != old_on)
investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS)
@@ -200,4 +200,4 @@
/obj/machinery/atmospherics/components/binary/volume_pump/on/layer3
piping_layer = 3
- icon_state = "volpump_map-3"
\ No newline at end of file
+ icon_state = "volpump_map-3"
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index 33fd160b1a..dc7c106035 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -15,8 +15,7 @@
..()
for(var/i in 1 to device_type)
- var/datum/gas_mixture/A = new
- A.volume = 200
+ var/datum/gas_mixture/A = new(200)
airs[i] = A
// Iconnery
@@ -117,7 +116,7 @@
var/times_lost = 0
for(var/i in 1 to device_type)
var/datum/gas_mixture/air = airs[i]
- lost += pressures*environment.volume/(air.temperature * R_IDEAL_GAS_EQUATION)
+ lost += pressures*environment.return_volume()/(air.return_temperature() * R_IDEAL_GAS_EQUATION)
times_lost++
var/shared_loss = lost/times_lost
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index 78258dd10a..f49dee124e 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -94,7 +94,7 @@
//Calculate necessary moles to transfer using PV=nRT
- var/transfer_ratio = transfer_rate/air1.volume
+ var/transfer_ratio = transfer_rate/air1.return_volume()
//Actually transfer the gas
@@ -111,14 +111,13 @@
else
filtering = FALSE
- if(filtering && removed.gases[filter_type])
+ if(filtering && removed.get_moles(filter_type))
var/datum/gas_mixture/filtered_out = new
- filtered_out.temperature = removed.temperature
- filtered_out.gases[filter_type] = removed.gases[filter_type]
+ filtered_out.set_temperature(removed.return_temperature())
+ filtered_out.set_moles(filter_type, removed.get_moles(filter_type))
- removed.gases[filter_type] = 0
- GAS_GARBAGE_COLLECT(removed.gases)
+ removed.set_moles(filter_type, 0)
var/datum/gas_mixture/target = (air2.return_pressure() < 9000 ? air2 : air1)
target.merge(filtered_out)
@@ -280,4 +279,4 @@
critical_machine = TRUE
/obj/machinery/atmospherics/components/trinary/filter/flipped/critical
- critical_machine = TRUE
\ No newline at end of file
+ critical_machine = TRUE
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
index dcf0d09bee..a96a6efa4b 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
@@ -57,7 +57,7 @@
/obj/machinery/atmospherics/components/trinary/mixer/New()
..()
var/datum/gas_mixture/air3 = airs[3]
- air3.volume = 300
+ air3.set_volume(300)
airs[3] = air3
/obj/machinery/atmospherics/components/trinary/mixer/process_atmos()
@@ -81,26 +81,26 @@
return
//Calculate necessary moles to transfer using PV=nRT
- var/general_transfer = (target_pressure - output_starting_pressure) * air3.volume / R_IDEAL_GAS_EQUATION
+ var/general_transfer = (target_pressure - output_starting_pressure) * air3.return_volume() / R_IDEAL_GAS_EQUATION
- var/transfer_moles1 = air1.temperature ? node1_concentration * general_transfer / air1.temperature : 0
- var/transfer_moles2 = air2.temperature ? node2_concentration * general_transfer / air2.temperature : 0
+ var/transfer_moles1 = air1.return_temperature() ? node1_concentration * general_transfer / air1.return_temperature() : 0
+ var/transfer_moles2 = air2.return_temperature() ? node2_concentration * general_transfer / air2.return_temperature() : 0
var/air1_moles = air1.total_moles()
var/air2_moles = air2.total_moles()
if(!node2_concentration)
- if(air1.temperature <= 0)
+ if(air1.return_temperature() <= 0)
return
transfer_moles1 = min(transfer_moles1, air1_moles)
transfer_moles2 = 0
else if(!node1_concentration)
- if(air2.temperature <= 0)
+ if(air2.return_temperature() <= 0)
return
transfer_moles2 = min(transfer_moles2, air2_moles)
transfer_moles1 = 0
else
- if(air1.temperature <= 0 || air2.temperature <= 0)
+ if(air1.return_temperature() <= 0 || air2.return_temperature() <= 0)
return
if((transfer_moles2 <= 0) || (transfer_moles1 <= 0))
return
@@ -248,4 +248,4 @@
/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/inverse
node1_concentration = O2STANDARD
- node2_concentration = N2STANDARD
\ No newline at end of file
+ node2_concentration = N2STANDARD
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 4f26a2f772..1f9e4ccac3 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -186,7 +186,7 @@
var/datum/gas_mixture/air1 = airs[1]
- if(air1.gases.len)
+ if(air1.total_moles())
if(mob_occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic.
// temperature factor goes from 1 to about 2.5
var/amount = max(1, (4 * log(T0C - mob_occupant.bodytemperature)) - 20) * knockout_factor * base_knockout
@@ -196,8 +196,7 @@
if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic.
beaker.reagents.trans_to(occupant, 1, efficiency * 0.25) // Transfer reagents.
beaker.reagents.reaction(occupant, VAPOR)
- air1.gases[/datum/gas/oxygen] -= max(0,air1.gases[/datum/gas/oxygen] - 2 / efficiency) //Let's use gas for this
- GAS_GARBAGE_COLLECT(air1.gases)
+ air1.adjust_moles(/datum/gas/oxygen, -max(0,air1.get_moles(/datum/gas/oxygen) - 2 / efficiency)) //Let's use gas for this
if(++reagent_transfer >= 10 * efficiency) // Throttle reagent transfer (higher efficiency will transfer the same amount but consume less from the beaker).
reagent_transfer = 0
@@ -211,7 +210,7 @@
var/datum/gas_mixture/air1 = airs[1]
- if(!nodes[1] || !airs[1] || !air1.gases.len || air1.gases[/datum/gas/oxygen] < 5) // Turn off if the machine won't work.
+ if(!nodes[1] || !airs[1] || air1.get_moles(/datum/gas/oxygen) < 5) // Turn off if the machine won't work.
on = FALSE
update_icon()
return
@@ -219,22 +218,21 @@
if(occupant)
var/mob/living/mob_occupant = occupant
var/cold_protection = 0
- var/temperature_delta = air1.temperature - mob_occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant.
+ var/temperature_delta = air1.return_temperature() - mob_occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant.
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
- cold_protection = H.get_thermal_protection(air1.temperature, TRUE)
+ cold_protection = H.get_thermal_protection(air1.return_temperature(), TRUE)
if(abs(temperature_delta) > 1)
var/air_heat_capacity = air1.heat_capacity()
var/heat = ((1 - cold_protection) * 0.1 + conduction_coefficient) * temperature_delta * (air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity))
- air1.temperature = max(air1.temperature - heat / air_heat_capacity, TCMB)
+ air1.set_temperature(max(air1.return_temperature() - heat / air_heat_capacity, TCMB))
mob_occupant.adjust_bodytemperature(heat / heat_capacity, TCMB)
- air1.gases[/datum/gas/oxygen] = max(0,air1.gases[/datum/gas/oxygen] - 0.5 / efficiency) // Magically consume gas? Why not, we run on cryo magic.
- GAS_GARBAGE_COLLECT(air1.gases)
+ air1.set_temperature(max(air1.return_temperature() - 0.5 / efficiency)) // Magically consume gas? Why not, we run on cryo magic.
/obj/machinery/atmospherics/components/unary/cryo_cell/power_change()
..()
@@ -369,7 +367,7 @@
data["occupant"]["temperaturestatus"] = "bad"
var/datum/gas_mixture/air1 = airs[1]
- data["cellTemperature"] = round(air1.temperature, 1)
+ data["cellTemperature"] = round(air1.return_temperature(), 1)
data["isBeakerLoaded"] = beaker ? TRUE : FALSE
var/beakerContents = list()
@@ -439,7 +437,7 @@
var/datum/gas_mixture/G = airs[1]
if(G.total_moles() > 10)
- return G.temperature
+ return G.return_temperature()
return ..()
/obj/machinery/atmospherics/components/unary/cryo_cell/default_change_direction_wrench(mob/user, obj/item/wrench/W)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
index a856ea1f3f..c0dfc5633e 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
@@ -59,18 +59,18 @@
var/other_air_heat_capacity = partner_air_contents.heat_capacity()
var/combined_heat_capacity = other_air_heat_capacity + air_heat_capacity
- var/old_temperature = air_contents.temperature
- var/other_old_temperature = partner_air_contents.temperature
+ var/old_temperature = air_contents.return_temperature()
+ var/other_old_temperature = partner_air_contents.return_temperature()
if(combined_heat_capacity > 0)
- var/combined_energy = partner_air_contents.temperature*other_air_heat_capacity + air_heat_capacity*air_contents.temperature
+ var/combined_energy = partner_air_contents.return_temperature()*other_air_heat_capacity + air_heat_capacity*air_contents.return_temperature()
var/new_temperature = combined_energy/combined_heat_capacity
- air_contents.temperature = new_temperature
- partner_air_contents.temperature = new_temperature
+ air_contents.set_temperature(new_temperature)
+ partner_air_contents.set_temperature(new_temperature)
- if(abs(old_temperature-air_contents.temperature) > 1)
+ if(abs(old_temperature-air_contents.return_temperature()) > 1)
update_parents()
- if(abs(other_old_temperature-partner_air_contents.temperature) > 1)
+ if(abs(other_old_temperature-partner_air_contents.return_temperature()) > 1)
partner.update_parents()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
index 05720583f9..5b87c518b1 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
@@ -52,8 +52,8 @@
var/datum/gas_mixture/air_contents = airs[1]
- if(air_contents.temperature > 0)
- var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
+ if(air_contents.return_temperature() > 0)
+ var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
@@ -71,8 +71,8 @@
injecting = 1
- if(air_contents.temperature > 0)
- var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
+ if(air_contents.return_temperature() > 0)
+ var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
loc.assume_air(removed)
update_parents()
@@ -123,7 +123,7 @@
if("set_volume_rate" in signal.data)
var/number = text2num(signal.data["set_volume_rate"])
var/datum/gas_mixture/air_contents = airs[1]
- volume_rate = clamp(number, 0, air_contents.volume)
+ volume_rate = clamp(number, 0, air_contents.return_volume())
if("status" in signal.data)
spawn(2)
@@ -241,4 +241,4 @@
id = ATMOS_GAS_MONITOR_INPUT_INCINERATOR
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input
name = "toxins mixing input injector"
- id = ATMOS_GAS_MONITOR_INPUT_TOXINS_LAB
\ No newline at end of file
+ id = ATMOS_GAS_MONITOR_INPUT_TOXINS_LAB
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm
index a113484d20..3f5bb818ce 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm
@@ -30,14 +30,14 @@
if(pressure_delta > 0.5)
if(external_pressure < internal_pressure)
- var/air_temperature = (external.temperature > 0) ? external.temperature : internal.temperature
- var/transfer_moles = (pressure_delta * external.volume) / (air_temperature * R_IDEAL_GAS_EQUATION)
+ var/air_temperature = (external.return_temperature() > 0) ? external.return_temperature() : internal.return_temperature()
+ var/transfer_moles = (pressure_delta * external.return_volume()) / (air_temperature * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = internal.remove(transfer_moles)
external.merge(removed)
else
- var/air_temperature = (internal.temperature > 0) ? internal.temperature : external.temperature
- var/transfer_moles = (pressure_delta * internal.volume) / (air_temperature * R_IDEAL_GAS_EQUATION)
- transfer_moles = min(transfer_moles, external.total_moles() * internal.volume / external.volume)
+ var/air_temperature = (internal.return_temperature() > 0) ? internal.return_temperature() : external.return_temperature()
+ var/transfer_moles = (pressure_delta * internal.return_volume()) / (air_temperature * R_IDEAL_GAS_EQUATION)
+ transfer_moles = min(transfer_moles, external.total_moles() * internal.return_volume() / external.return_volume())
var/datum/gas_mixture/removed = external.remove(transfer_moles)
if(isnull(removed))
return
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
index 81ca14a828..6188c919ac 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
@@ -16,7 +16,7 @@
..()
var/datum/gas_mixture/air_contents = airs[1]
- air_contents.volume = 0
+ air_contents.set_volume(0)
/obj/machinery/atmospherics/components/unary/portables_connector/Destroy()
if(connected_device)
@@ -64,4 +64,4 @@
/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer3
piping_layer = 3
- icon_state = "connector_map-3"
\ No newline at end of file
+ icon_state = "connector_map-3"
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm
index 1d8b875528..0893d2b9e6 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm
@@ -49,10 +49,10 @@
else if(!opened && our_pressure >= open_pressure)
opened = TRUE
update_icon_nopipes()
- if(opened && air_contents.temperature > 0)
+ if(opened && air_contents.return_temperature() > 0)
var/datum/gas_mixture/environment = loc.return_air()
var/pressure_delta = our_pressure - environment.return_pressure()
- var/transfer_moles = pressure_delta*200/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
+ var/transfer_moles = pressure_delta*200/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION)
if(transfer_moles > 0)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
index 79ff24e8b7..2f3372462d 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
@@ -1,4 +1,4 @@
-#define AIR_CONTENTS ((25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature))
+#define AIR_CONTENTS ((25*ONE_ATMOSPHERE)*(air_contents.return_volume())/(R_IDEAL_GAS_EQUATION*air_contents.return_temperature()))
/obj/machinery/atmospherics/components/unary/tank
icon = 'icons/obj/atmospherics/pipes/pressure_tank.dmi'
icon_state = "generic"
@@ -15,10 +15,10 @@
/obj/machinery/atmospherics/components/unary/tank/New()
..()
var/datum/gas_mixture/air_contents = airs[1]
- air_contents.volume = volume
- air_contents.temperature = T20C
+ air_contents.set_volume(volume)
+ air_contents.set_temperature(T20C)
if(gas_type)
- air_contents.gases[gas_type] = AIR_CONTENTS
+ air_contents.set_moles(AIR_CONTENTS)
name = "[name] ([GLOB.meta_gas_names[gas_type]])"
/obj/machinery/atmospherics/components/unary/tank/air
@@ -28,8 +28,8 @@
/obj/machinery/atmospherics/components/unary/tank/air/New()
..()
var/datum/gas_mixture/air_contents = airs[1]
- air_contents.gases[/datum/gas/oxygen] = AIR_CONTENTS * 0.2
- air_contents.gases[/datum/gas/nitrogen] = AIR_CONTENTS * 0.8
+ air_contents.set_moles(/datum/gas/oxygen, AIR_CONTENTS * 0.2)
+ air_contents.set_moles(/datum/gas/nitrogen, AIR_CONTENTS * 0.8)
/obj/machinery/atmospherics/components/unary/tank/carbon_dioxide
gas_type = /datum/gas/carbon_dioxide
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index 7af3e57bc7..c57dcc6507 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -74,13 +74,13 @@
var/air_heat_capacity = air_contents.heat_capacity()
var/combined_heat_capacity = heat_capacity + air_heat_capacity
- var/old_temperature = air_contents.temperature
+ var/old_temperature = air_contents.return_temperature()
if(combined_heat_capacity > 0)
- var/combined_energy = heat_capacity * target_temperature + air_heat_capacity * air_contents.temperature
- air_contents.temperature = combined_energy/combined_heat_capacity
+ var/combined_energy = heat_capacity * target_temperature + air_heat_capacity * air_contents.return_temperature()
+ air_contents.set_temperature(combined_energy/combined_heat_capacity)
- var/temperature_delta= abs(old_temperature - air_contents.temperature)
+ var/temperature_delta= abs(old_temperature - air_contents.return_temperature())
if(temperature_delta > 1)
active_power_usage = (heat_capacity * temperature_delta) / 10 + idle_power_usage
update_parents()
@@ -142,7 +142,7 @@
data["initial"] = initial(target_temperature)
var/datum/gas_mixture/air1 = airs[1]
- data["temperature"] = air1.temperature
+ data["temperature"] = air1.return_temperature()
data["pressure"] = air1.return_pressure()
return data
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
index 9788bcb4ee..1a86898f1f 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -104,8 +104,8 @@
pressure_delta = min(pressure_delta, (air_contents.return_pressure() - internal_pressure_bound))
if(pressure_delta > 0)
- if(air_contents.temperature > 0)
- var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
+ if(air_contents.return_temperature() > 0)
+ var/transfer_moles = pressure_delta*environment.return_volume()/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
@@ -113,21 +113,21 @@
air_update_turf()
else // external -> internal
- var/pressure_delta = 10000
- if(pressure_checks&EXT_BOUND)
- pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound))
- if(pressure_checks&INT_BOUND)
- pressure_delta = min(pressure_delta, (internal_pressure_bound - air_contents.return_pressure()))
+ if(environment.return_pressure() > 0)
+ var/our_multiplier = air_contents.return_volume() / (environment.return_temperature() * R_IDEAL_GAS_EQUATION)
+ var/moles_delta = 10000 * our_multiplier
+ if(pressure_checks&EXT_BOUND)
+ moles_delta = min(moles_delta, (environment_pressure - external_pressure_bound) * environment.return_volume() / (environment.return_temperature() * R_IDEAL_GAS_EQUATION))
+ if(pressure_checks&INT_BOUND)
+ moles_delta = min(moles_delta, (internal_pressure_bound - air_contents.return_pressure()) * our_multiplier)
- if(pressure_delta > 0 && environment.temperature > 0)
- var/transfer_moles = pressure_delta * air_contents.volume / (environment.temperature * R_IDEAL_GAS_EQUATION)
+ if(moles_delta > 0)
+ var/datum/gas_mixture/removed = loc.remove_air(moles_delta)
+ if (isnull(removed)) // in space
+ return
- var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
- if (isnull(removed)) // in space
- return
-
- air_contents.merge(removed)
- air_update_turf()
+ air_contents.merge(removed)
+ air_update_turf()
update_parents()
//Radio remote control
@@ -295,7 +295,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/New()
..()
var/datum/gas_mixture/air_contents = airs[1]
- air_contents.volume = 1000
+ air_contents.set_volume(1000)
// mapping
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
index 10eac9c717..025c9734ca 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
@@ -149,43 +149,29 @@
return FALSE
var/datum/gas_mixture/environment = tile.return_air()
var/datum/gas_mixture/air_contents = airs[1]
- var/list/env_gases = environment.gases
if(air_contents.return_pressure() >= 50*ONE_ATMOSPHERE)
return FALSE
if(scrubbing & SCRUBBING)
- if(length(env_gases & filter_types))
- var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles()
+ var/transfer_moles = min(1, volume_rate/environment.return_volume())*environment.total_moles()
- //Take a gas sample
- var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)
+ //Take a gas sample
+ var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)
- //Nothing left to remove from the tile
- if(isnull(removed))
- return FALSE
+ //Nothing left to remove from the tile
+ if(isnull(removed))
+ return FALSE
- var/list/removed_gases = removed.gases
+ removed.scrub_into(air_contents, filter_types)
- //Filter it
- var/datum/gas_mixture/filtered_out = new
- var/list/filtered_gases = filtered_out.gases
- filtered_out.temperature = removed.temperature
-
- for(var/gas in filter_types & removed_gases)
- filtered_gases[gas] = removed_gases[gas]
- removed_gases[gas] = 0
-
- GAS_GARBAGE_COLLECT(removed.gases)
-
- //Remix the resulting gases
- air_contents.merge(filtered_out)
- tile.assume_air(removed)
- tile.air_update_turf()
+ //Remix the resulting gases
+ tile.assume_air(removed)
+ tile.air_update_turf()
else //Just siphoning all air
- var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume)
+ var/transfer_moles = environment.total_moles()*(volume_rate/environment.return_volume())
var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)
diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm
index 565bbb7b3c..098df67321 100644
--- a/code/modules/atmospherics/machinery/datum_pipeline.dm
+++ b/code/modules/atmospherics/machinery/datum_pipeline.dm
@@ -15,7 +15,7 @@
/datum/pipeline/Destroy()
SSair.networks -= src
- if(air && air.volume)
+ if(air && air.return_volume())
temporarily_store_air()
for(var/obj/machinery/atmospherics/pipe/P in members)
P.parent = null
@@ -76,7 +76,7 @@
possible_expansions -= borderline
- air.volume = volume
+ air.set_volume(volume)
/datum/pipeline/proc/addMachineryMember(obj/machinery/atmospherics/components/C)
other_atmosmch |= C
@@ -99,7 +99,7 @@
merge(E)
if(!members.Find(P))
members += P
- air.volume += P.volume
+ air.set_volume(air.return_volume() + P.volume)
else
A.setPipenet(src, N)
addMachineryMember(A)
@@ -107,7 +107,7 @@
/datum/pipeline/proc/merge(datum/pipeline/E)
if(E == src)
return
- air.volume += E.air.volume
+ air.set_volume(air.return_volume() + E.air.return_volume())
members.Add(E.members)
for(var/obj/machinery/atmospherics/pipe/S in E.members)
S.parent = src
@@ -139,18 +139,16 @@
for(var/obj/machinery/atmospherics/pipe/member in members)
member.air_temporary = new
- member.air_temporary.volume = member.volume
+ member.air_temporary.set_volume(member.volume)
member.air_temporary.copy_from(air)
- var/member_gases = member.air_temporary.gases
- for(var/id in member_gases)
- member_gases[id] *= member.volume/air.volume
+ member.air_temporary.multiply(member.volume/air.return_volume())
- member.air_temporary.temperature = air.temperature
+ member.air_temporary.set_temperature(air.return_temperature())
/datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity)
var/total_heat_capacity = air.heat_capacity()
- var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume)
+ var/partial_heat_capacity = total_heat_capacity*(share_volume/air.return_volume())
var/target_temperature
var/target_heat_capacity
@@ -163,19 +161,19 @@
if(modeled_location.blocks_air)
if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0))
- var/delta_temperature = air.temperature - target_temperature
+ var/delta_temperature = air.return_temperature() - target_temperature
var/heat = thermal_conductivity*delta_temperature* \
(partial_heat_capacity*target_heat_capacity/(partial_heat_capacity+target_heat_capacity))
- air.temperature -= heat/total_heat_capacity
+ air.set_temperature(air.return_temperature() - heat/total_heat_capacity)
modeled_location.TakeTemperature(heat/target_heat_capacity)
else
var/delta_temperature = 0
var/sharer_heat_capacity = 0
- delta_temperature = (air.temperature - target_temperature)
+ delta_temperature = (air.return_temperature() - target_temperature)
sharer_heat_capacity = target_heat_capacity
var/self_temperature_delta = 0
@@ -190,18 +188,18 @@
else
return 1
- air.temperature += self_temperature_delta
+ air.set_temperature(air.return_temperature() + self_temperature_delta)
modeled_location.TakeTemperature(sharer_temperature_delta)
else
if((target.heat_capacity>0) && (partial_heat_capacity>0))
- var/delta_temperature = air.temperature - target.temperature
+ var/delta_temperature = air.return_temperature() - target.return_temperature()
var/heat = thermal_conductivity*delta_temperature* \
(partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity))
- air.temperature -= heat/total_heat_capacity
+ air.set_temperature(air.return_temperature() - heat/total_heat_capacity)
update = TRUE
/datum/pipeline/proc/return_air()
@@ -242,20 +240,18 @@
for(var/i in GL)
var/datum/gas_mixture/G = i
- total_gas_mixture.volume += G.volume
+ total_gas_mixture.set_volume(total_gas_mixture.return_volume() + G.return_volume())
total_gas_mixture.merge(G)
- total_thermal_energy += THERMAL_ENERGY(G)
+ total_thermal_energy += G.thermal_energy()
total_heat_capacity += G.heat_capacity()
- total_gas_mixture.temperature = total_heat_capacity ? total_thermal_energy/total_heat_capacity : 0
+ total_gas_mixture.set_temperature(total_heat_capacity ? total_thermal_energy/total_heat_capacity : 0)
- if(total_gas_mixture.volume > 0)
+ if(total_gas_mixture.return_volume() > 0)
//Update individual gas_mixtures by volume ratio
for(var/i in GL)
var/datum/gas_mixture/G = i
G.copy_from(total_gas_mixture)
- var/list/G_gases = G.gases
- for(var/id in G_gases)
- G_gases[id] *= G.volume/total_gas_mixture.volume
+ G.multiply(G.return_volume()/total_gas_mixture.return_volume())
diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm
index fab70cc168..c17c93ab95 100644
--- a/code/modules/atmospherics/machinery/other/meter.dm
+++ b/code/modules/atmospherics/machinery/other/meter.dm
@@ -103,7 +103,7 @@
if (target)
var/datum/gas_mixture/environment = target.return_air()
if(environment)
- . = "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)] K ([round(environment.temperature-T0C,0.01)]°C)."
+ . = "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.return_temperature(),0.01)] K ([round(environment.return_temperature()-T0C,0.01)]°C)."
else
. = "The sensor error light is blinking."
else
diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm
index c90d388a1d..1842211fd2 100644
--- a/code/modules/atmospherics/machinery/other/miner.dm
+++ b/code/modules/atmospherics/machinery/other/miner.dm
@@ -131,8 +131,8 @@
if(!isopenturf(O))
return FALSE
var/datum/gas_mixture/merger = new
- merger.gases[spawn_id] = (spawn_mol)
- merger.temperature = spawn_temp
+ merger.set_moles(spawn_id, spawn_mol)
+ merger.set_temperature(spawn_temp)
O.assume_air(merger)
O.air_update_turf(TRUE)
diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
index 4da053d3c8..7c170f8afc 100644
--- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
@@ -28,14 +28,14 @@
if(islava(T))
environment_temperature = 5000
else if(T.blocks_air)
- environment_temperature = T.temperature
+ environment_temperature = T.return_temperature()
else
var/turf/open/OT = T
environment_temperature = OT.GetTemperature()
else
- environment_temperature = T.temperature
+ environment_temperature = T.return_temperature()
- if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference)
+ if(abs(environment_temperature-pipe_air.return_temperature()) > minimum_temperature_difference)
parent.temperature_interact(T, volume, thermal_conductivity)
@@ -44,11 +44,11 @@
var/hc = pipe_air.heat_capacity()
var/mob/living/heat_source = buckled_mobs[1]
//Best guess-estimate of the total bodytemperature of all the mobs, since they share the same environment it's ~ok~ to guess like this
- var/avg_temp = (pipe_air.temperature * hc + (heat_source.bodytemperature * buckled_mobs.len) * 3500) / (hc + (buckled_mobs ? buckled_mobs.len * 3500 : 0))
+ var/avg_temp = (pipe_air.return_temperature() * hc + (heat_source.bodytemperature * buckled_mobs.len) * 3500) / (hc + (buckled_mobs ? buckled_mobs.len * 3500 : 0))
for(var/m in buckled_mobs)
var/mob/living/L = m
L.bodytemperature = avg_temp
- pipe_air.temperature = avg_temp
+ pipe_air.set_temperature(avg_temp)
/obj/machinery/atmospherics/pipe/heat_exchanging/process()
if(!parent)
@@ -57,9 +57,9 @@
var/datum/gas_mixture/pipe_air = return_air()
//Heat causes pipe to glow
- if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //glow starts at 500K
- if(abs(pipe_air.temperature - icon_temperature) > 10)
- icon_temperature = pipe_air.temperature
+ if(pipe_air.return_temperature() && (icon_temperature > 500 || pipe_air.return_temperature() > 500)) //glow starts at 500K
+ if(abs(pipe_air.return_temperature() - icon_temperature) > 10)
+ icon_temperature = pipe_air.return_temperature()
var/h_r = heat2colour_r(icon_temperature)
var/h_g = heat2colour_g(icon_temperature)
@@ -76,7 +76,7 @@
//burn any mobs buckled based on temperature
if(has_buckled_mobs())
var/heat_limit = 1000
- if(pipe_air.temperature > heat_limit + 1)
+ if(pipe_air.return_temperature() > heat_limit + 1)
for(var/m in buckled_mobs)
var/mob/living/buckled_mob = m
- buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, BODY_ZONE_CHEST)
+ buckled_mob.apply_damage(4 * log(pipe_air.return_temperature() - heat_limit), BURN, BODY_ZONE_CHEST)
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index 03463ff0f7..d8430864a2 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -200,14 +200,14 @@
/obj/machinery/portable_atmospherics/canister/proc/create_gas()
if(gas_type)
if(starter_temp)
- air_contents.temperature = starter_temp
- air_contents.gases[gas_type] = (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
+ air_contents.set_temperature(starter_temp)
+ air_contents.set_moles(gas_type,(maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
if(starter_temp)
- air_contents.temperature = starter_temp
+ air_contents.set_temperature(starter_temp)
/obj/machinery/portable_atmospherics/canister/air/create_gas()
- air_contents.gases[/datum/gas/oxygen] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
- air_contents.gases[/datum/gas/nitrogen] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
+ air_contents.set_moles(/datum/gas/oxygen, (O2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
+ air_contents.set_moles(/datum/gas/nitrogen, (N2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
/obj/machinery/portable_atmospherics/canister/update_icon_state()
if(stat & BROKEN)
@@ -263,6 +263,7 @@
/obj/machinery/portable_atmospherics/canister/obj_break(damage_flag)
if((stat & BROKEN) || (flags_1 & NODECONSTRUCT_1))
return
+ stat |= BROKEN
canister_break()
/obj/machinery/portable_atmospherics/canister/proc/canister_break()
@@ -396,8 +397,8 @@
logmsg = "Valve was opened by [key_name(usr)], starting a transfer into \the [holding || "air"].
"
if(!holding)
var/list/danger = list()
- for(var/id in air_contents.gases)
- var/gas = air_contents.gases[id]
+ for(var/id in air_contents.get_gases())
+ var/gas = air_contents.get_moles(id)
if(!GLOB.meta_gas_dangers[id])
continue
if(gas > (GLOB.meta_gas_visibility[id] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index 952db8315a..445cc686f3 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -18,9 +18,8 @@
..()
SSair.atmos_machinery += src
- air_contents = new
- air_contents.volume = volume
- air_contents.temperature = T20C
+ air_contents = new(volume)
+ air_contents.set_temperature(T20C)
return 1
diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm
index 377e9285e3..4ab934a1c8 100644
--- a/code/modules/atmospherics/machinery/portable/pump.dm
+++ b/code/modules/atmospherics/machinery/portable/pump.dm
@@ -115,8 +115,8 @@
if("power")
on = !on
if(on && !holding)
- var/plasma = air_contents.gases[/datum/gas/plasma]
- var/n2o = air_contents.gases[/datum/gas/nitrous_oxide]
+ var/plasma = air_contents.get_moles(/datum/gas/plasma)
+ var/n2o = air_contents.get_moles(/datum/gas/nitrous_oxide)
if(n2o || plasma)
message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [ADMIN_VERBOSEJMP(src)]")
log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [AREACOORD(src)]")
diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm
index 3dfce7c1bf..6589e601a2 100644
--- a/code/modules/atmospherics/machinery/portable/scrubber.dm
+++ b/code/modules/atmospherics/machinery/portable/scrubber.dm
@@ -40,20 +40,13 @@
scrub(T.return_air())
/obj/machinery/portable_atmospherics/scrubber/proc/scrub(var/datum/gas_mixture/mixture)
- var/transfer_moles = min(1, volume_rate / mixture.volume) * mixture.total_moles()
+ var/transfer_moles = min(1, volume_rate / mixture.return_volume()) * mixture.total_moles()
var/datum/gas_mixture/filtering = mixture.remove(transfer_moles) // Remove part of the mixture to filter.
- var/datum/gas_mixture/filtered = new
if(!filtering)
return
- filtered.temperature = filtering.temperature
- for(var/gas in filtering.gases & scrubbing)
- filtered.gases[gas] = filtering.gases[gas] // Shuffle the "bad" gasses to the filtered mixture.
- filtering.gases[gas] = 0
- GAS_GARBAGE_COLLECT(filtering.gases)
-
- air_contents.merge(filtered) // Store filtered out gasses.
+ filtering.scrub_into(air_contents,scrubbing)
mixture.merge(filtering) // Returned the cleaned gas.
if(!holding)
air_update_turf()
diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm
index f714a86f22..129e6d7a2b 100644
--- a/code/modules/awaymissions/mission_code/Academy.dm
+++ b/code/modules/awaymissions/mission_code/Academy.dm
@@ -189,6 +189,8 @@
if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards))
to_chat(user, "You feel the magic of the dice is restricted to ordinary humans! You should leave it alone.")
user.dropItemToGround(src)
+ return
+ return ..()
/obj/item/dice/d20/fate/proc/effect(var/mob/living/carbon/human/user,roll)
diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm
index 99e6aa2bdc..b84fd2ca2c 100644
--- a/code/modules/cargo/bounties/engineering.dm
+++ b/code/modules/cargo/bounties/engineering.dm
@@ -10,9 +10,7 @@
if(!..())
return FALSE
var/obj/item/tank/T = O
- if(!T.air_contents.gases[gas_type])
- return FALSE
- return T.air_contents.gases[gas_type] >= moles_required
+ return T.air_contents.get_moles(gas_type) >= moles_required
//datum/bounty/item/engineering/gas/nitryl_tank
// name = "Full Tank of Nitryl"
diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm
index 695dab8133..2943130a19 100644
--- a/code/modules/cargo/exports/large_objects.dm
+++ b/code/modules/cargo/exports/large_objects.dm
@@ -169,15 +169,13 @@
/datum/export/large/gas_canister/get_cost(obj/O)
var/obj/machinery/portable_atmospherics/canister/C = O
var/worth = 10
- var/gases = C.air_contents.gases
-
- worth += gases[/datum/gas/bz]*3
- worth += gases[/datum/gas/stimulum]*25
- worth += gases[/datum/gas/hypernoblium]*1000
- worth += gases[/datum/gas/miasma]*2
- worth += gases[/datum/gas/tritium]*7
- worth += gases[/datum/gas/pluoxium]*6
- worth += gases[/datum/gas/nitryl]*30
+ worth += C.air_contents.get_moles(/datum/gas/bz)*3
+ worth += C.air_contents.get_moles(/datum/gas/stimulum)*25
+ worth += C.air_contents.get_moles(/datum/gas/hypernoblium)*1000
+ worth += C.air_contents.get_moles(/datum/gas/miasma)*2
+ worth += C.air_contents.get_moles(/datum/gas/tritium)*7
+ worth += C.air_contents.get_moles(/datum/gas/pluoxium)*6
+ worth += C.air_contents.get_moles(/datum/gas/nitryl)*30
return worth
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 12536b4382..7f670e756f 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -19,6 +19,8 @@
///Next tick to reset the total message counter
var/total_count_reset = 0
var/ircreplyamount = 0
+ /// last time they tried to do an autobunker auth
+ var/autobunker_last_try = 0
/////////
//OTHER//
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 2efc7f8cd3..aaee5c85f6 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -2322,14 +2322,16 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/min = CONFIG_GET(number/body_size_min)
var/max = CONFIG_GET(number/body_size_max)
var/danger = CONFIG_GET(number/threshold_body_size_slowdown)
- var/new_body_size = input(user, "Choose your desired sprite size:\n([min*100]%-[max*100]%), Warning: May make your character look distorted[danger > min ? ", and an exponential slowdown will occur for those smaller than [danger*100]%!" : "!"]", "Character Preference", features["body_size"]*100) as num|null
+ var/new_body_size = input(user, "Choose your desired sprite size: ([min*100]%-[max*100]%)\nWarning: This may make your character look distorted[danger > min ? "! Additionally, a proportional movement speed penalty will be applied to characters smaller than [danger*100]%." : "!"]", "Character Preference", features["body_size"]*100) as num|null
if (new_body_size)
new_body_size = clamp(new_body_size * 0.01, min, max)
var/dorfy
- if(danger > new_body_size)
- dorfy = alert(user, "The chosen size appears to be smaller than the threshold of [danger*100]%, which will lead to an added exponential slowdown. Are you sure about that?", "Dwarfism Alert", "Yes", "Move it to the threshold", "No")
- if(!dorfy || dorfy == "Move it above the threshold")
+ if((new_body_size + 0.01) < danger) // Adding 0.01 as a dumb fix to prevent the warning message from appearing when exactly at threshold... Not sure why that happens in the first place.
+ dorfy = alert(user, "You have chosen a size below the slowdown threshold of [danger*100]%. For balancing purposes, the further you go below this percentage, the slower your character will be. Do you wish to keep this size?", "Speed Penalty Alert", "Yes", "Move it to the threshold", "No")
+ if(dorfy == "Move it to the threshold")
new_body_size = danger
+ if(!dorfy) //Aborts if this var is somehow empty
+ return
if(dorfy != "No")
features["body_size"] = new_body_size
if("tongue")
diff --git a/code/modules/client/verbs/autobunker.dm b/code/modules/client/verbs/autobunker.dm
new file mode 100644
index 0000000000..03200c5f0b
--- /dev/null
+++ b/code/modules/client/verbs/autobunker.dm
@@ -0,0 +1,37 @@
+/client/verb/bunker_auto_authorize()
+ set name = "Auto Authorize Panic Bunker"
+ set desc = "Authorizes your account in the panic bunker of any servers connected to this function."
+ set category = "OOC"
+
+ if(autobunker_last_try + 5 SECONDS > world.time)
+ to_chat(src, "Function on cooldown, try again in 5 seconds.")
+ return
+ autobunker_last_try = world.time
+
+ world.send_cross_server_bunker_overrides(key, src)
+
+/world/proc/send_cross_server_bunker_overrides(key, client/C)
+ var/comms_key = CONFIG_GET(string/comms_key)
+ if(!comms_key)
+ return
+ var/list/message = list()
+ message["ckey"] = key
+ message["source"] = "[CONFIG_GET(string/cross_comms_name)]"
+ message["key"] = comms_key
+ message["auto_bunker_override"] = TRUE
+ var/list/servers = CONFIG_GET(keyed_list/cross_server_bunker_override)
+ if(!length(servers))
+ to_chat(C, "AUTOBUNKER: No servers are configured to receive from this one.")
+ return
+ log_admin("[key] ([key_name(C)]) has initiated an autobunker authentication with linked servers.")
+ for(var/name in servers)
+ var/returned = world.Export("[servers[name]]?[list2params(message)]")
+ switch(returned)
+ if("Bad Key")
+ to_chat(C, "AUTOBuNKER: [name] failed to authenticate with this server.")
+ if("Function Disabled")
+ to_chat(C, "AUTOBUNKER: [name] has autobunker receive disabled.")
+ if("Success")
+ to_chat(C, "AUTOBUNKER: Successfully authenticated with [name]. Panic bunker bypass granted to [key]..")
+ else
+ to_chat(C, "AUTOBUNKER: Unknown error ([name]).")
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 1b5cd6c7d2..56d6e7d38f 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -23,14 +23,15 @@
if(iscarbon(target) && proximity)
var/mob/living/carbon/C = target
var/mob/living/carbon/U = user
- var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE)
+ var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE, clothing_check = TRUE)
if(success)
if(C == user)
C.visible_message("[U] sprays their hands with glittery rubber!")
else
C.visible_message("[U] sprays glittery rubber on the hands of [C]!")
else
- C.visible_message("The rubber fails to stick to [C]'s hands!")
+ user.visible_message("The rubber fails to stick to [C]'s hands!",
+ "The rubber fails to stick to [C]'s [(SLOT_GLOVES in C.check_obscured_slots()) ? "unexposed" : ""] hands!")
qdel(src)
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index 639f2d3bfb..632d59187f 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -76,6 +76,7 @@
/obj/item/clothing/head/hooded
var/obj/item/clothing/suit/hooded/suit
+ dynamic_hair_suffix = ""
/obj/item/clothing/head/hooded/Destroy()
suit = null
@@ -164,7 +165,7 @@
RemoveHelmet()
..()
-/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet()
+/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet(message = TRUE)
if(!helmet)
return
suittoggled = FALSE
@@ -174,16 +175,18 @@
helmet.attack_self(H)
H.transferItemToLoc(helmet, src, TRUE)
H.update_inv_wear_suit()
- to_chat(H, "The helmet on the hardsuit disengages.")
+ if(message)
+ to_chat(H, "The helmet on the hardsuit disengages.")
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
else
helmet.forceMove(src)
+ return TRUE
/obj/item/clothing/suit/space/hardsuit/dropped(mob/user)
..()
RemoveHelmet()
-/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet()
+/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet(message = TRUE)
var/mob/living/carbon/human/H = loc
if(!helmettype)
return
@@ -192,15 +195,19 @@
if(!suittoggled)
if(ishuman(src.loc))
if(H.wear_suit != src)
- to_chat(H, "You must be wearing [src] to engage the helmet!")
+ if(message)
+ to_chat(H, "You must be wearing [src] to engage the helmet!")
return
if(H.head)
- to_chat(H, "You're already wearing something on your head!")
+ if(message)
+ to_chat(H, "You're already wearing something on your head!")
return
else if(H.equip_to_slot_if_possible(helmet,SLOT_HEAD,0,0,1))
- to_chat(H, "You engage the helmet on the hardsuit.")
+ if(message)
+ to_chat(H, "You engage the helmet on the hardsuit.")
suittoggled = TRUE
H.update_inv_wear_suit()
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
+ return TRUE
else
- RemoveHelmet()
+ return RemoveHelmet(message)
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index c592e06e0e..a17df4db9a 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -171,10 +171,7 @@
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
- if(!GM.gases[/datum/gas/oxygen])
- return
- GM.gases[/datum/gas/oxygen] = max(GM.gases[/datum/gas/oxygen] - severity * holder.energy, 0)
- GAS_GARBAGE_COLLECT(GM.gases)
+ GM.set_moles(/datum/gas/oxygen, max(GM.get_moles(/datum/gas/oxygen) - severity * holder.energy, 0))
/datum/spacevine_mutation/nitro_eater
name = "nitrogen consuming"
@@ -186,10 +183,7 @@
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
- if(!GM.gases[/datum/gas/nitrogen])
- return
- GM.gases[/datum/gas/nitrogen] = max(GM.gases[/datum/gas/nitrogen] - severity * holder.energy, 0)
- GAS_GARBAGE_COLLECT(GM.gases)
+ GM.set_moles(/datum/gas/nitrogen, max(GM.get_moles(/datum/gas/nitrogen) - severity * holder.energy, 0))
/datum/spacevine_mutation/carbondioxide_eater
name = "CO2 consuming"
@@ -201,10 +195,7 @@
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
- if(!GM.gases[/datum/gas/carbon_dioxide])
- return
- GM.gases[/datum/gas/carbon_dioxide] = max(GM.gases[/datum/gas/carbon_dioxide] - severity * holder.energy, 0)
- GAS_GARBAGE_COLLECT(GM.gases)
+ GM.set_moles(/datum/gas/carbon_dioxide, max(GM.get_moles(/datum/gas/carbon_dioxide) - severity * holder.energy, 0))
/datum/spacevine_mutation/plasma_eater
name = "toxins consuming"
@@ -216,10 +207,7 @@
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
- if(!GM.gases[/datum/gas/plasma])
- return
- GM.gases[/datum/gas/plasma] = max(GM.gases[/datum/gas/plasma] - severity * holder.energy, 0)
- GAS_GARBAGE_COLLECT(GM.gases)
+ GM.set_moles(/datum/gas/plasma, max(GM.get_moles(/datum/gas/plasma) - severity * holder.energy, 0))
/datum/spacevine_mutation/thorns
name = "thorny"
diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
index a35dcc1dc4..fe70739ab5 100644
--- a/code/modules/food_and_drinks/food/snacks/meat.dm
+++ b/code/modules/food_and_drinks/food/snacks/meat.dm
@@ -83,6 +83,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/chicken
name = "chicken meat"
desc = "A slab of raw chicken. Remember to wash your hands!"
+ icon_state = "chickenbreast"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/chicken
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/chicken
tastes = list("chicken" = 1)
@@ -341,8 +342,14 @@
/obj/item/reagent_containers/food/snacks/meat/steak/chicken
name = "chicken steak" //Can you have chicken steaks? Maybe this should be renamed once it gets new sprites.
+ icon_state = "chickenbreast_cooked"
tastes = list("chicken" = 1)
+/obj/item/reagent_containers/food/snacks/meat/steak/fish
+ name = "fish fillet"
+ icon_state = "grilled_carp_slice"
+ tastes = list("charred sushi" = 1)
+
/obj/item/reagent_containers/food/snacks/meat/steak/plain
foodtype = MEAT
@@ -361,6 +368,7 @@
/obj/item/reagent_containers/food/snacks/meat/steak/bear
name = "bear steak"
+ icon_state = "bearcook"
tastes = list("meat" = 1, "salmon" = 1)
/obj/item/reagent_containers/food/snacks/meat/steak/xeno
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index c2a58b0821..e25f99c69e 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -22,6 +22,7 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/toxin/carpotoxin = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
bitesize = 6
filling_color = "#FA8072"
+ cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/fish
tastes = list("fish" = 1)
foodtype = MEAT
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index bc80ffe621..7b0ffe2a19 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -136,6 +136,17 @@
tastes = list("fries" = 3, "cheese" = 1)
foodtype = VEGETABLES | GRAIN
+/obj/item/reagent_containers/food/snacks/chilicheesefries
+ name = "chili cheese fries"
+ desc = "Fries smothered in cheese -and- chilli."
+ icon_state = "chilicheesefries"
+ trash = /obj/item/trash/plate
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 1)
+ filling_color = "#FFD700"
+ tastes = list("fries" = 3, "cheese" = 1)
+ foodtype = VEGETABLES | GRAIN
+
/obj/item/reagent_containers/food/snacks/badrecipe
name = "burned mess"
desc = "Someone should be demoted from cook for this."
@@ -537,6 +548,15 @@
tastes = list("butter" = 1)
foodtype = DAIRY
+/obj/item/reagent_containers/food/snacks/butter/margarine
+ name = "stick of margarine"
+ desc = "A stick of lightly salted vegetable oil."
+ icon_state = "marge"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/cornoil = 2, /datum/reagent/consumable/sodiumchloride = 1)
+ filling_color = "#FFD700"
+ tastes = list("butter" = 1)
+ foodtype = JUNKFOOD
+
/obj/item/reagent_containers/food/snacks/onionrings
name = "onion rings"
desc = "Onion slices coated in batter."
diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
index 9096429228..d812655b91 100644
--- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
+++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
@@ -21,6 +21,17 @@
tastes = list("toast" = 1)
foodtype = GRAIN
+/obj/item/reagent_containers/food/snacks/baconlettucetomato
+ name = "blt sandwich"
+ desc = "The classic bacon, lettuce tomato sandwich."
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "blt"
+ trash = /obj/item/trash/plate
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("bacon" = 1, "lettuce" = 1, "tomato" = 1, "mayo" = 1)
+ foodtype = GRAIN | MEAT | VEGETABLES
+
/obj/item/reagent_containers/food/snacks/grilledcheese
name = "grilled cheese sandwich"
desc = "Goes great with Tomato soup!"
@@ -136,8 +147,9 @@
/obj/item/reagent_containers/food/snacks/tuna_sandwich
name = "tuna sandwich"
desc = "Both a salad and a sandwich in one."
+ icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "tunasandwich"
- trash = /obj/item/trash/plate
+ list_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/nutriment/vitamin = 4)
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
tastes = list("tuna" = 4, "mayonnaise" = 2, "bread" = 2)
foodtype = GRAIN | MEAT
diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm
index ec96a4537c..541c972490 100644
--- a/code/modules/food_and_drinks/recipes/food_mixtures.dm
+++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm
@@ -179,3 +179,14 @@
id = /datum/reagent/consumable/bbqsauce
results = list(/datum/reagent/consumable/bbqsauce = 5)
required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/medicine/salglu_solution = 3, /datum/reagent/consumable/blackpepper = 1)
+
+/datum/chemical_reaction/margarine
+ name = "Margarine"
+ id = "margarine"
+ required_reagents = list(/datum/reagent/consumable/cornoil = 5, /datum/reagent/consumable/soymilk = 5, /datum/reagent/consumable/sodiumchloride = 1)
+ mix_message = "The ingredients solidify into a stick of margarine."
+
+/datum/chemical_reaction/margarine/on_reaction(datum/reagents/holder, multiplier)
+ var/location = get_turf(holder.my_atom)
+ for(var/i = 1, i <= multiplier, i++)
+ new /obj/item/reagent_containers/food/snacks/butter/margarine(location)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
index e8640886c2..53c3682e2c 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
@@ -22,6 +22,15 @@
result = /obj/item/reagent_containers/food/snacks/baconegg
subcategory = CAT_EGG
+/datum/crafting_recipe/food/wrap
+ name = "Egg Wrap"
+ reqs = list(/datum/reagent/consumable/soysauce = 10,
+ /obj/item/reagent_containers/food/snacks/friedegg = 1,
+ /obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/eggwrap
+ subcategory = CAT_EGG
+
/datum/crafting_recipe/food/omelette
name = "Omelette"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index 359fadfb70..bbaa49a1eb 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -14,15 +14,6 @@
result = /obj/item/reagent_containers/food/snacks/chawanmushi
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/wrap
- name = "Egg Wrap"
- reqs = list(/datum/reagent/consumable/soysauce = 10,
- /obj/item/reagent_containers/food/snacks/friedegg = 1,
- /obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
- )
- result = /obj/item/reagent_containers/food/snacks/eggwrap
- subcategory = CAT_MISCFOOD
-
/datum/crafting_recipe/food/khachapuri
name = "Khachapuri"
reqs = list(
@@ -93,6 +84,16 @@
result = /obj/item/reagent_containers/food/snacks/cheesyfries
subcategory = CAT_MISCFOOD
+/datum/crafting_recipe/food/chilicheesefries
+ name = "Chilli cheese fries"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/fries = 1,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/grown/chili = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/chilicheesefries
+ subcategory = CAT_MISCFOOD
+
/datum/crafting_recipe/food/eggplantparm
name ="Eggplant parmigiana"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
index d2ea1da50a..60bcd65a80 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -25,6 +25,17 @@
result = /obj/item/reagent_containers/food/snacks/grilledcheese
subcategory = CAT_SANDWICH
+/datum/crafting_recipe/food/baconlettucetomato
+ name = "BLT sandwich"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/bacon = 2,
+ /obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
+ /obj/item/reagent_containers/food/snacks/grown/tomato = 1,
+ /datum/reagent/consumable/mayonnaise = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/baconlettucetomato
+ subcategory = CAT_SANDWICH
+
/datum/crafting_recipe/food/slimesandwich
name = "Jelly sandwich"
reqs = list(
@@ -99,7 +110,7 @@
/obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
/obj/item/reagent_containers/food/snacks/tuna = 1,
/obj/item/reagent_containers/food/snacks/grown/onion = 1,
- /obj/item/reagent_containers/food/condiment/mayonnaise = 5
+ /datum/reagent/consumable/mayonnaise = 5
)
result = /obj/item/reagent_containers/food/snacks/tuna_sandwich
subcategory = CAT_SANDWICH
diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm
index 8b0dcdaae1..abd06775af 100644
--- a/code/modules/hydroponics/grown/flowers.dm
+++ b/code/modules/hydroponics/grown/flowers.dm
@@ -277,7 +277,7 @@
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
icon_grow = "bee_balm-grow"
icon_dead = "bee_balm-dead"
- mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/bee_balm/honey) //Lower odds of becoming honey
+ mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/bee_balm/honey_balm) //Lower odds of becoming honey
reagents_add = list(/datum/reagent/medicine/spaceacillin = 0.1, /datum/reagent/space_cleaner/sterilizine = 0.05)
/obj/item/reagent_containers/food/snacks/grown/bee_balm
@@ -291,11 +291,11 @@
foodtype = GROSS
// Beebalm
-/obj/item/seeds/bee_balm/honey
+/obj/item/seeds/bee_balm/honey_balm
name = "pack of Honey Balm seeds"
desc = "These seeds grow into Honey Balms."
- icon_state = "seed-bee_balmalt"
- species = "seed-bee_balm_alt"
+ icon_state = "seed-honey_balm"
+ species = "honey_balm"
plantname = "Honey Balm Pods"
product = /obj/item/reagent_containers/food/snacks/grown/bee_balm/honey
endurance = 1
@@ -304,16 +304,16 @@
potency = 1
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
- icon_grow = "bee_balmalt-grow"
- icon_dead = "bee_balmalt-dead"
+ icon_grow = "honey_balm-grow"
+ icon_dead = "honey_balm-dead"
reagents_add = list(/datum/reagent/consumable/honey = 0.1, /datum/reagent/lye = 0.3) //To make wax
rarity = 30
/obj/item/reagent_containers/food/snacks/grown/bee_balm/honey
- seed = /obj/item/seeds/bee_balm/honey
+ seed = /obj/item/seeds/bee_balm/honey_balm
name = "honey balm"
desc = "A large honey filled pod of a flower."
- icon_state = "bee_balmalt"
+ icon_state = "honey_balm"
filling_color = "#FF6347"
bitesize_mod = 8
tastes = list("wax" = 1)
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index e5c8f72dfe..01044cda25 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -57,8 +57,8 @@
return
var/datum/gas_mixture/stank = new
- stank.gases[/datum/gas/miasma] = (yield + 6)*7*0.02 // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses
- stank.temperature = T20C // without this the room would eventually freeze and miasma mining would be easier
+ stank.adjust_moles(/datum/gas/miasma,(yield + 6)*7*0.02) // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses
+ stank.set_temperature(T20C) // without this the room would eventually freeze and miasma mining would be easier
T.assume_air(stank)
T.air_update_turf()
diff --git a/code/modules/hydroponics/grown/peas.dm b/code/modules/hydroponics/grown/peas.dm
index 6229d98b2c..79d506cf56 100644
--- a/code/modules/hydroponics/grown/peas.dm
+++ b/code/modules/hydroponics/grown/peas.dm
@@ -61,6 +61,7 @@
filling_color = "#ee7bee"
bitesize_mod = 2
foodtype = VEGETABLES
+ juice_results = list (/datum/reagent/consumable/laughsyrup = 0)
tastes = list ("a prancing rabbit" = 1) //Vib Ribbon sends her regards.. wherever she is.
wine_power = 90
wine_flavor = "a vector-graphic rabbit dancing on your tongue"
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index a18dbe165d..28ae5f4b69 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -226,8 +226,8 @@
if(isopenturf(loc))
var/turf/open/O = loc
if(O.air)
- var/loc_gases = O.air.gases
- if(loc_gases[/datum/gas/oxygen] > 13)
+ var/datum/gas_mixture/loc_air = O.air
+ if(loc_air.get_moles(/datum/gas/oxygen) > 13)
return TRUE
return FALSE
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index b18f4396d6..a666a36099 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -392,7 +392,7 @@
/datum/plant_gene/trait/battery/on_attackby(obj/item/reagent_containers/food/snacks/grown/G, obj/item/I, mob/user)
if(istype(I, /obj/item/stack/cable_coil))
- if(I.use_tool(src, user, 0, 5, max_level = JOB_SKILL_EXPERT))
+ if(I.use_tool(src, user, 0, 5, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
to_chat(user, "You add some cable to [G] and slide it inside the battery encasing.")
var/obj/item/stock_parts/cell/potato/pocell = new /obj/item/stock_parts/cell/potato(user.loc)
pocell.icon_state = G.icon_state
diff --git a/code/modules/integrated_electronics/subtypes/atmospherics.dm b/code/modules/integrated_electronics/subtypes/atmospherics.dm
index 219e30c57f..d9a18bc509 100644
--- a/code/modules/integrated_electronics/subtypes/atmospherics.dm
+++ b/code/modules/integrated_electronics/subtypes/atmospherics.dm
@@ -125,12 +125,12 @@
return
// Negative Kelvin temperatures should never happen and if they do, normalize them
- if(source_air.temperature < TCMB)
- source_air.temperature = TCMB
+ if(source_air.return_temperature() < TCMB)
+ source_air.set_temperature(TCMB)
var/pressure_delta = target_pressure - target_air.return_pressure()
if(pressure_delta > 0.1)
- var/transfer_moles = (pressure_delta*target_air.volume/(source_air.temperature * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY
+ var/transfer_moles = (pressure_delta*target_air.return_volume()/(source_air.return_temperature() * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY
var/datum/gas_mixture/removed = source_air.remove(transfer_moles)
target_air.merge(removed)
@@ -171,14 +171,14 @@
return
// Negative Kelvin temperatures should never happen and if they do, normalize them
- if(source_air.temperature < TCMB)
- source_air.temperature = TCMB
+ if(source_air.return_temperature() < TCMB)
+ source_air.set_temperature(TCMB)
if((source_air.return_pressure() < 0.01) || (target_air.return_pressure() >= PUMP_MAX_PRESSURE))
return
//The second part of the min caps the pressure built by the volume pumps to the max pump pressure
- var/transfer_ratio = min(transfer_rate,target_air.volume*PUMP_MAX_PRESSURE/source_air.return_pressure())/source_air.volume
+ var/transfer_ratio = min(transfer_rate,target_air.return_volume()*PUMP_MAX_PRESSURE/source_air.return_pressure())/source_air.return_volume()
var/datum/gas_mixture/removed = source_air.remove_ratio(transfer_ratio * PUMP_EFFICIENCY)
@@ -351,10 +351,10 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
var/transfer_moles
//Negative Kelvins are an anomaly and should be normalized if encountered
- if(source_air.temperature < TCMB)
- source_air.temperature = TCMB
+ if(source_air.return_temperature(TCMB))
+ source_air.set_temperature(TCMB)
- transfer_moles = (pressure_delta*contaminated_air.volume/(source_air.temperature * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY
+ transfer_moles = (pressure_delta*contaminated_air.return_volume()/(source_air.return_temperature() * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY
//If there is nothing to transfer, just return
if(transfer_moles <= 0)
@@ -368,16 +368,15 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
//This is the gas that will be moved from source to filtered
var/datum/gas_mixture/filtered_out = new
- for(var/filtered_gas in removed.gases)
+ for(var/filtered_gas in removed.get_gases())
//Get the name of the gas and see if it is in the list
if(GLOB.meta_gas_names[filtered_gas] in wanted)
//The gas that is put in all the filtered out gases
- filtered_out.temperature = removed.temperature
- filtered_out.gases[filtered_gas] = removed.gases[filtered_gas]
+ filtered_out.set_temperature(removed.return_temperature())
+ filtered_out.set_moles(filtered_gas, removed.get_moles(filtered_gas))
//The filtered out gas is entirely removed from the currently filtered gases
- removed.gases[filtered_gas] = 0
- GAS_GARBAGE_COLLECT(removed.gases)
+ removed.set_moles(filtered_gas, 0)
//Check if the pressure is high enough to put stuff in filtered, or else just put it back in the source
var/datum/gas_mixture/target = (filtered_air.return_pressure() < target_pressure ? filtered_air : source_air)
@@ -444,7 +443,7 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
var/gas_percentage = round(max(min(get_pin_data(IC_INPUT, 4),100),0) / 100)
//Basically: number of moles = percentage of pressure filled up * efficiency coefficient * (pressure from both gases * volume of output) / (R * Temperature)
- var/transfer_moles = (get_pin_data(IC_INPUT, 5) / max(1,output_gases.return_pressure())) * PUMP_EFFICIENCY * (source_1_gases.return_pressure() * gas_percentage + source_2_gases.return_pressure() * (1 - gas_percentage)) * output_gases.volume/ (R_IDEAL_GAS_EQUATION * max(output_gases.temperature,TCMB))
+ var/transfer_moles = (get_pin_data(IC_INPUT, 5) / max(1,output_gases.return_pressure())) * PUMP_EFFICIENCY * (source_1_gases.return_pressure() * gas_percentage + source_2_gases.return_pressure() * (1 - gas_percentage)) * output_gases.return_volume()/ (R_IDEAL_GAS_EQUATION * max(output_gases.return_temperature(),TCMB))
if(transfer_moles <= 0)
@@ -544,10 +543,10 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
push_data()
//Cool the tank if the power is on and the temp is above
- if(!power_draw_idle || air_contents.temperature < temperature)
+ if(!power_draw_idle || air_contents.return_temperature() < temperature)
return
- air_contents.temperature = max(73.15,air_contents.temperature - (air_contents.temperature - temperature) * heater_coefficient)
+ air_contents.set_temperature(max(73.15,air_contents.return_temperature() - (air_contents.return_temperature() - temperature) * heater_coefficient))
// - heater tank - // **works**
@@ -574,10 +573,10 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
push_data()
//Heat the tank if the power is on or its temperature is below what is set
- if(!power_draw_idle || air_contents.temperature > temperature)
+ if(!power_draw_idle || air_contents.return_temperature() > temperature)
return
- air_contents.temperature = min(573.15,air_contents.temperature + (temperature - air_contents.temperature) * heater_coefficient)
+ air_contents.set_temperature(min(573.15,air_contents.return_temperature() + (temperature - air_contents.return_temperature()) * heater_coefficient))
// - atmospheric cooler - // **works**
@@ -621,11 +620,11 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
return
var/datum/gas_mixture/turf_air = current_turf.return_air()
- if(!power_draw_idle || turf_air.temperature < temperature)
+ if(!power_draw_idle || turf_air.return_temperature() < temperature)
return
//Cool the gas
- turf_air.temperature = max(243.15,turf_air.temperature - (turf_air.temperature - temperature) * heater_coefficient)
+ turf_air.set_temperature(max(243.15,turf_air.return_temperature() - (turf_air.return_temperature() - temperature) * heater_coefficient))
// - atmospheric heater - // **works**
@@ -650,11 +649,11 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
return
var/datum/gas_mixture/turf_air = current_turf.return_air()
- if(!power_draw_idle || turf_air.temperature > temperature)
+ if(!power_draw_idle || turf_air.return_temperature() > temperature)
return
//Heat the gas
- turf_air.temperature = min(323.15,turf_air.temperature + (temperature - turf_air.temperature) * heater_coefficient)
+ turf_air.set_temperature(min(323.15,turf_air.return_temperature() + (temperature - turf_air.return_temperature()) * heater_coefficient))
// - tank slot - // **works**
diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index a0608bb5ed..e8981ed685 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -1162,12 +1162,11 @@
activate_pin(3)
return
- var/list/gases = air_contents.gases
var/list/gas_names = list()
var/list/gas_amounts = list()
- for(var/id in gases)
+ for(var/id in air_contents.get_gases())
var/name = GLOB.meta_gas_names[id]
- var/amt = round(gases[id], 0.001)
+ var/amt = round(air_contents.get_moles(id), 0.001)
gas_names.Add(name)
gas_amounts.Add(amt)
@@ -1175,7 +1174,7 @@
set_pin_data(IC_OUTPUT, 2, gas_amounts)
set_pin_data(IC_OUTPUT, 3, round(air_contents.total_moles(), 0.001))
set_pin_data(IC_OUTPUT, 4, round(air_contents.return_pressure(), 0.001))
- set_pin_data(IC_OUTPUT, 5, round(air_contents.temperature, 0.001))
+ set_pin_data(IC_OUTPUT, 5, round(air_contents.return_temperature(), 0.001))
set_pin_data(IC_OUTPUT, 6, round(air_contents.return_volume(), 0.001))
push_data()
activate_pin(2)
diff --git a/code/modules/keybindings/keybind/combat.dm b/code/modules/keybindings/keybind/combat.dm
index 457fbb0cb2..8a0e713d8f 100644
--- a/code/modules/keybindings/keybind/combat.dm
+++ b/code/modules/keybindings/keybind/combat.dm
@@ -25,6 +25,17 @@
var/mob/living/L = user.mob
L.keybind_stop_active_blocking()
+/datum/keybinding/living/active_block_toggle
+ name = "active_block_toggle"
+ full_name = "Block (Toggle)"
+ category = CATEGORY_COMBAT
+ description = "Toggles active blocking system using currenet in hand object, or any found object if applicable."
+
+/datum/keybinding/living/active_block_toggle/down(client/user)
+ var/mob/living/L = user.mob
+ L.keybind_toggle_active_blocking()
+ return TRUE
+
/datum/keybinding/living/active_parry
hotkey_keys = list("Insert", "G")
name = "active_parry"
diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm
index a792ee280f..11bcc0ffcf 100644
--- a/code/modules/mapping/reader.dm
+++ b/code/modules/mapping/reader.dm
@@ -213,6 +213,7 @@
var/list/modelCache = build_cache(no_changeturf)
var/space_key = modelCache[SPACE_KEY]
var/list/bounds
+ var/did_expand = FALSE
src.bounds = bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF)
var/datum/map_orientation_pattern/mode = forced_pattern || GLOB.map_orientation_patterns["[orientation]"] || GLOB.map_orientation_patterns["[SOUTH]"]
var/invert_y = mode.invert_y
@@ -235,6 +236,7 @@
else
while(parsed_z > world.maxz)
world.incrementMaxZ()
+ did_expand = TRUE
if(!no_changeturf)
WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems when /turf/AfterChange is called")
//these values are the same until a new gridset is reached.
@@ -256,11 +258,13 @@
continue
else
world.maxx = placement_x
+ did_expand = TRUE
if(placement_y > world.maxy)
if(cropMap)
break
else
world.maxy = placement_y
+ did_expand = TRUE
if(placement_x < 1)
actual_x += xi
continue
@@ -301,6 +305,9 @@
testing("Skipped loading [turfsSkipped] default turfs")
#endif
+ if(did_expand)
+ world.refresh_atmos_grid()
+
return TRUE
/datum/parsed_map/proc/build_cache(no_changeturf, bad_paths=null)
diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm
index f6db12420a..81c78cec8c 100644
--- a/code/modules/mapping/space_management/multiz_helpers.dm
+++ b/code/modules/mapping/space_management/multiz_helpers.dm
@@ -7,6 +7,20 @@
return get_step(SSmapping.get_turf_below(get_turf(ref)), dir)
return get_step(ref, dir)
+/proc/get_multiz_accessible_levels(center_z)
+ . = list(center_z)
+ var/other_z = center_z
+ var/offset
+ while((offset = SSmapping.level_trait(other_z, ZTRAIT_DOWN)))
+ other_z += offset
+ . += other_z
+ other_z = center_z
+ while((offset = SSmapping.level_trait(other_z, ZTRAIT_UP)))
+ other_z += offset
+ . += other_z
+ return .
+
+
/proc/get_dir_multiz(turf/us, turf/them)
us = get_turf(us)
them = get_turf(them)
@@ -32,16 +46,4 @@
/turf/proc/below()
return get_step_multiz(src, DOWN)
-
-/proc/dir_inverse_multiz(dir)
- var/holder = dir & (UP|DOWN)
- if((holder == NONE) || (holder == (UP|DOWN)))
- return turn(dir, 180)
- dir &= ~(UP|DOWN)
- dir = turn(dir, 180)
- if(holder == UP)
- holder = DOWN
- else
- holder = UP
- dir |= holder
- return dir
\ No newline at end of file
+
\ No newline at end of file
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index b3462773d8..8bc9cc4512 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -390,7 +390,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
to_chat(user, "There already is a string attached to this coin!")
return
- if (W.use_tool(src, user, 0, 1, max_level = JOB_SKILL_BASIC))
+ if (W.use_tool(src, user, 0, 1, skill_gain_mult = BARE_USE_TOOL_MULT))
add_overlay("coin_string_overlay")
string_attached = 1
to_chat(user, "You attach a string to the coin.")
diff --git a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
deleted file mode 100644
index e2537f0f4f..0000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/mob/living/carbon/alien/humanoid/doUnEquip(obj/item/I)
- . = ..()
- if(!. || !I)
- return
-
diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm
index 70c59d4943..d63686691d 100644
--- a/code/modules/mob/living/carbon/alien/life.dm
+++ b/code/modules/mob/living/carbon/alien/life.dm
@@ -13,26 +13,23 @@
var/toxins_used = 0
var/tox_detect_threshold = 0.02
- var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
- var/list/breath_gases = breath.gases
+ var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.return_temperature())/BREATH_VOLUME
//Partial pressure of the toxins in our breath
- var/Toxins_pp = (breath_gases[/datum/gas/plasma]/breath.total_moles())*breath_pressure
+ var/Toxins_pp = (breath.get_moles(/datum/gas/plasma)/breath.total_moles())*breath_pressure
if(Toxins_pp > tox_detect_threshold) // Detect toxins in air
- adjustPlasma(breath_gases[/datum/gas/plasma]*250)
+ adjustPlasma(breath.get_moles(/datum/gas/plasma)*250)
throw_alert("alien_tox", /obj/screen/alert/alien_tox)
- toxins_used = breath_gases[/datum/gas/plasma]
+ toxins_used = breath.get_moles(/datum/gas/plasma)
else
clear_alert("alien_tox")
//Breathe in toxins and out oxygen
- breath_gases[/datum/gas/plasma] -= toxins_used
- breath_gases[/datum/gas/oxygen] += toxins_used
-
- GAS_GARBAGE_COLLECT(breath.gases)
+ breath.adjust_moles(/datum/gas/plasma, -toxins_used)
+ breath.adjust_moles(/datum/gas/oxygen, toxins_used)
//BREATH TEMPERATURE
handle_breath_temperature(breath)
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index eb1b38b9ff..e35c905539 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -88,6 +88,7 @@
Die()
/obj/item/clothing/mask/facehugger/equipped(mob/M)
+ . = ..()
Attach(M)
/obj/item/clothing/mask/facehugger/Crossed(atom/target)
@@ -254,7 +255,7 @@
return FALSE
if(AmBloodsucker(M))
return FALSE
-
+
if(ismonkey(M))
return 1
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 8451dc4060..a2d53f6f0a 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -227,25 +227,27 @@
SEND_SIGNAL(src, COMSIG_CARBON_EMBED_RIP, I, L)
return
if(href_list["toggle_helmet"])
- var/hardsuit_head = head && istype(head, /obj/item/clothing/head/helmet/space/hardsuit)
+ if(!istype(head, /obj/item/clothing/head/helmet/space/hardsuit))
+ return
+ var/obj/item/clothing/head/helmet/space/hardsuit/hardsuit_head = head
visible_message("[usr] tries to [hardsuit_head ? "retract" : "extend"] [src]'s helmet.", \
"[usr] tries to [hardsuit_head ? "retract" : "extend"] [src]'s helmet.", \
target = usr, target_message = "You try to [hardsuit_head ? "retract" : "extend"] [src]'s helmet.")
- if(!do_mob(usr, src, POCKET_STRIP_DELAY))
+ if(!do_mob(usr, src, hardsuit_head ? head.strip_delay : POCKET_STRIP_DELAY))
return
- visible_message("[usr] [hardsuit_head ? "retract" : "extend"] [src]'s helmet", \
- "[usr] [hardsuit_head ? "retract" : "extend"] [src]'s helmet", \
- target = usr, target_message = "You [hardsuit_head ? "retract" : "extend"] [src]'s helmet.")
- if(!istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
+ if(!istype(wear_suit, /obj/item/clothing/suit/space/hardsuit) || (hardsuit_head ? (!head || head != hardsuit_head) : head))
return
var/obj/item/clothing/suit/space/hardsuit/hardsuit = wear_suit //This should be an hardsuit given all our checks
- hardsuit.ToggleHelmet()
+ if(hardsuit.ToggleHelmet(FALSE))
+ visible_message("[usr] [hardsuit_head ? "retract" : "extend"] [src]'s helmet", \
+ "[usr] [hardsuit_head ? "retract" : "extend"] [src]'s helmet", \
+ target = usr, target_message = "You [hardsuit_head ? "retract" : "extend"] [src]'s helmet.")
return
if(href_list["item"])
var/slot = text2num(href_list["item"])
if(slot in check_obscured_slots())
to_chat(usr, "You can't reach that! Something is covering it.")
- return
+ return
if(href_list["pockets"])
var/strip_mod = 1
var/strip_silence = FALSE
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 8eca716a6a..a500bea54a 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -23,6 +23,13 @@
heatmod = 0.5 // = 1/4x heat damage
burnmod = 0.5 // = 1/2x generic burn damage
species_language_holder = /datum/language_holder/jelly
+ mutant_brain = /obj/item/organ/brain/jelly
+
+/obj/item/organ/brain/jelly
+ name = "slime nucleus"
+ desc = "A slimey membranous mass from a slime person"
+ icon_state = "brain-slime"
+
/datum/species/jelly/on_species_loss(mob/living/carbon/C)
if(regenerate_limbs)
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index 0383a19764..91d3135ae1 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -33,7 +33,7 @@
if((!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman)) && !atmos_sealed)
if(environment)
if(environment.total_moles())
- if(environment.gases[/datum/gas/oxygen] && (environment.gases[/datum/gas/oxygen]) >= 1) //Same threshhold that extinguishes fire
+ if(environment.get_moles(/datum/gas/oxygen) >= 1) //Same threshhold that extinguishes fire
H.adjust_fire_stacks(0.5)
if(!H.on_fire && H.fire_stacks > 0)
H.visible_message("[H]'s body reacts with the atmosphere and bursts into flames!","Your body reacts with the atmosphere and bursts into flame!")
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 889ec6d257..b109598973 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -162,12 +162,11 @@
var/SA_para_min = 1
var/SA_sleep_min = 5
var/oxygen_used = 0
- var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
+ var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.return_temperature())/BREATH_VOLUME
- var/list/breath_gases = breath.gases
- var/O2_partialpressure = (breath_gases[/datum/gas/oxygen]/breath.total_moles())*breath_pressure
- var/Toxins_partialpressure = (breath_gases[/datum/gas/plasma]/breath.total_moles())*breath_pressure
- var/CO2_partialpressure = (breath_gases[/datum/gas/carbon_dioxide]/breath.total_moles())*breath_pressure
+ var/O2_partialpressure = (breath.get_moles(/datum/gas/oxygen)/breath.total_moles())*breath_pressure
+ var/Toxins_partialpressure = (breath.get_moles(/datum/gas/plasma)/breath.total_moles())*breath_pressure
+ var/CO2_partialpressure = (breath.get_moles(/datum/gas/carbon_dioxide)/breath.total_moles())*breath_pressure
//OXYGEN
@@ -191,7 +190,7 @@
var/ratio = 1 - O2_partialpressure/safe_oxy_min
adjustOxyLoss(min(5*ratio, 3))
failed_last_breath = 1
- oxygen_used = breath_gases[/datum/gas/oxygen]*ratio
+ oxygen_used = breath.get_moles(/datum/gas/oxygen)*ratio
else
adjustOxyLoss(3)
failed_last_breath = 1
@@ -203,12 +202,12 @@
o2overloadtime = 0 //reset our counter for this too
if(health >= crit_threshold)
adjustOxyLoss(-5)
- oxygen_used = breath_gases[/datum/gas/oxygen]
+ oxygen_used = breath.get_moles(/datum/gas/oxygen)
clear_alert("not_enough_oxy")
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "suffocation")
- breath_gases[/datum/gas/oxygen] -= oxygen_used
- breath_gases[/datum/gas/carbon_dioxide] += oxygen_used
+ breath.adjust_moles(/datum/gas/oxygen, -oxygen_used)
+ breath.adjust_moles(/datum/gas/carbon_dioxide, oxygen_used)
//CARBON DIOXIDE
if(CO2_partialpressure > safe_co2_max)
@@ -227,15 +226,15 @@
//TOXINS/PLASMA
if(Toxins_partialpressure > safe_tox_max)
- var/ratio = (breath_gases[/datum/gas/plasma]/safe_tox_max) * 10
+ var/ratio = (breath.get_moles(/datum/gas/plasma)/safe_tox_max) * 10
adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE))
throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
clear_alert("too_much_tox")
//NITROUS OXIDE
- if(breath_gases[/datum/gas/nitrous_oxide])
- var/SA_partialpressure = (breath_gases[/datum/gas/nitrous_oxide]/breath.total_moles())*breath_pressure
+ if(breath.get_moles(/datum/gas/nitrous_oxide))
+ var/SA_partialpressure = (breath.get_moles(/datum/gas/nitrous_oxide)/breath.total_moles())*breath_pressure
if(SA_partialpressure > SA_para_min)
Unconscious(60)
if(SA_partialpressure > SA_sleep_min)
@@ -248,26 +247,26 @@
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria")
//BZ (Facepunch port of their Agent B)
- if(breath_gases[/datum/gas/bz])
- var/bz_partialpressure = (breath_gases[/datum/gas/bz]/breath.total_moles())*breath_pressure
+ if(breath.get_moles(/datum/gas/bz))
+ var/bz_partialpressure = (breath.get_moles(/datum/gas/bz)/breath.total_moles())*breath_pressure
if(bz_partialpressure > 1)
hallucination += 10
else if(bz_partialpressure > 0.01)
hallucination += 5
//TRITIUM
- if(breath_gases[/datum/gas/tritium])
- var/tritium_partialpressure = (breath_gases[/datum/gas/tritium]/breath.total_moles())*breath_pressure
+ if(breath.get_moles(/datum/gas/tritium))
+ var/tritium_partialpressure = (breath.get_moles(/datum/gas/tritium)/breath.total_moles())*breath_pressure
radiation += tritium_partialpressure/10
//NITRYL
- if(breath_gases[/datum/gas/nitryl])
- var/nitryl_partialpressure = (breath_gases[/datum/gas/nitryl]/breath.total_moles())*breath_pressure
+ if(breath.get_moles(/datum/gas/nitryl))
+ var/nitryl_partialpressure = (breath.get_moles(/datum/gas/nitryl)/breath.total_moles())*breath_pressure
adjustFireLoss(nitryl_partialpressure/4)
//MIASMA
- if(breath_gases[/datum/gas/miasma])
- var/miasma_partialpressure = (breath_gases[/datum/gas/miasma]/breath.total_moles())*breath_pressure
+ if(breath.get_moles(/datum/gas/miasma))
+ var/miasma_partialpressure = (breath.get_moles(/datum/gas/miasma)/breath.total_moles())*breath_pressure
if(miasma_partialpressure > MINIMUM_MOLES_DELTA_TO_MOVE)
if(prob(0.05 * miasma_partialpressure))
@@ -307,11 +306,6 @@
else
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell")
-
-
-
- GAS_GARBAGE_COLLECT(breath.gases)
-
//BREATH TEMPERATURE
handle_breath_temperature(breath)
@@ -370,9 +364,9 @@
var/datum/gas_mixture/stank = new
- stank.gases[/datum/gas/miasma] = 0.1
+ stank.set_moles(/datum/gas/miasma,0.1)
- stank.temperature = BODYTEMP_NORMAL
+ stank.set_temperature(BODYTEMP_NORMAL)
miasma_turf.assume_air(stank)
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index 7ba29dbf30..9e6431985c 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -46,8 +46,8 @@
return ..()
/mob/living/carbon/monkey/handle_breath_temperature(datum/gas_mixture/breath)
- if(abs(BODYTEMP_NORMAL - breath.temperature) > 50)
- switch(breath.temperature)
+ if(abs(BODYTEMP_NORMAL - breath.return_temperature()) > 50)
+ switch(breath.return_temperature())
if(-INFINITY to 120)
adjustFireLoss(3)
if(120 to 200)
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 7c99c452a1..1993d86b74 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -134,7 +134,7 @@
ExtinguishMob()
return
var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
- if(G.gases[/datum/gas/oxygen] < 1)
+ if(G.get_moles(/datum/gas/oxygen, 1))
ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire
return
var/turf/location = get_turf(src)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 5b21abfb84..c7ed6e743d 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -914,7 +914,7 @@
floating_need_update = TRUE
/mob/living/proc/get_temperature(datum/gas_mixture/environment)
- var/loc_temp = environment ? environment.temperature : T0C
+ var/loc_temp = environment ? environment.return_temperature() : T0C
if(isobj(loc))
var/obj/oloc = loc
var/obj_temp = oloc.return_temperature()
diff --git a/code/modules/mob/living/living_active_block.dm b/code/modules/mob/living/living_active_block.dm
index e1b90716b6..4211b2cfd9 100644
--- a/code/modules/mob/living/living_active_block.dm
+++ b/code/modules/mob/living/living_active_block.dm
@@ -14,14 +14,14 @@
changeNext_move(data.block_end_click_cd_add)
return TRUE
-/mob/living/proc/start_active_blocking(obj/item/I)
+/mob/living/proc/ACTIVE_BLOCK_START(obj/item/I)
if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING))
return FALSE
if(!(I in held_items))
return FALSE
var/datum/block_parry_data/data = I.get_block_parry_data()
if(!istype(data)) //Typecheck because if an admin/coder screws up varediting or something we do not want someone being broken forever, the CRASH logs feedback so we know what happened.
- CRASH("start_active_blocking called with an item with no valid data: [I] --> [I.block_parry_data]!")
+ CRASH("ACTIVE_BLOCK_START called with an item with no valid data: [I] --> [I.block_parry_data]!")
combat_flags |= COMBAT_FLAG_ACTIVE_BLOCKING
active_block_item = I
if(data.block_lock_attacking)
@@ -83,9 +83,15 @@
return FALSE
// QOL: Instead of trying to just block with held item, grab first available item.
var/obj/item/I = find_active_block_item()
- if(!I)
- to_chat(src, "You can't block with your bare hands!")
+ var/list/other_items = list()
+ if(SEND_SIGNAL(src, COMSIG_LIVING_ACTIVE_BLOCK_START, I, other_items) & COMPONENT_PREVENT_BLOCK_START)
+ to_chat(src, "Something is preventing you from blocking!")
return
+ if(!I)
+ if(!length(other_items))
+ to_chat(src, "You can't block with your bare hands!")
+ return
+ I = other_items[1]
if(!I.can_active_block())
to_chat(src, "[I] is either not capable of being used to actively block, or is not currently in a state that can! (Try wielding it if it's twohanded, for example.)")
return
@@ -104,7 +110,7 @@
animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, FALSE, SINE_EASING | EASE_IN, ANIMATION_END_NOW)
return
combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCK_STARTING)
- start_active_blocking(I)
+ ACTIVE_BLOCK_START(I)
/**
* Gets the first item we can that can block, but if that fails, default to active held item.COMSIG_ENABLE_COMBAT_MODE
@@ -115,7 +121,8 @@
for(var/obj/item/I in held_items - held)
if(I.can_active_block())
return I
- return held
+ else
+ return held
/**
* Proc called by keybindings to stop active blocking.
diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm
index 50b51d4d95..0dab70b045 100644
--- a/code/modules/mob/living/living_active_parry.dm
+++ b/code/modules/mob/living/living_active_parry.dm
@@ -24,25 +24,39 @@
// yanderedev else if time
var/obj/item/using_item = get_active_held_item()
var/datum/block_parry_data/data
+ var/datum/tool
var/method
if(using_item?.can_active_parry())
data = using_item.block_parry_data
method = ITEM_PARRY
+ tool = using_item
else if(mind?.martial_art?.can_martial_parry)
data = mind.martial_art.block_parry_data
method = MARTIAL_PARRY
+ tool = mind.martial_art
else if(combat_flags & COMBAT_FLAG_UNARMED_PARRY)
data = block_parry_data
method = UNARMED_PARRY
+ tool = src
else
// QOL: If none of the above work, try to find another item.
var/obj/item/backup = find_backup_parry_item()
- if(!backup)
- to_chat(src, "You have nothing to parry with!")
- return FALSE
- data = backup.block_parry_data
- using_item = backup
+ if(backup)
+ tool = backup
+ data = backup.block_parry_data
+ using_item = backup
+ method = ITEM_PARRY
+ var/list/other_items = list()
+ if(SEND_SIGNAL(src, COMSIG_LIVING_ACTIVE_PARRY_START, method, tool, other_items) & COMPONENT_PREVENT_PARRY_START)
+ to_chat(src, "Something is preventing you from parrying!")
+ return
+ if(!using_item && !method && length(other_items))
+ using_item = other_items[1]
method = ITEM_PARRY
+ data = using_item.block_parry_data
+ if(!method)
+ to_chat(src, "You have nothing to parry with!")
+ return FALSE
//QOL: Try to enable combat mode if it isn't already
SEND_SIGNAL(src, COMSIG_ENABLE_COMBAT_MODE)
if(!SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE))
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index 76ced767e8..92f46e24bc 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -565,7 +565,6 @@
dat += "Unable to obtain a reading.
"
else
var/datum/gas_mixture/environment = T.return_air()
- var/list/env_gases = environment.gases
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles()
@@ -573,11 +572,11 @@
dat += "Air Pressure: [round(pressure,0.1)] kPa
"
if (total_moles)
- for(var/id in env_gases)
- var/gas_level = env_gases[id]/total_moles
+ for(var/id in environment.get_gases())
+ var/gas_level = environment.get_moles(id)/total_moles
if(gas_level > 0.01)
dat += "[GLOB.meta_gas_names[id]]: [round(gas_level*100)]%
"
- dat += "Temperature: [round(environment.temperature-T0C)]°C
"
+ dat += "Temperature: [round(environment.return_temperature()-T0C)]°C
"
dat += "Refresh Reading
"
dat += "
"
return dat
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 633135b3d2..51cff93ceb 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -315,7 +315,7 @@
if (getFireLoss() > 0 || getToxLoss() > 0)
if(src == user)
to_chat(user, "You start fixing yourself...")
- if(!W.use_tool(src, user, 50, 1, max_level = JOB_SKILL_TRAINED))
+ if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
to_chat(user, "You need more cable to repair [src]!")
return
adjustFireLoss(-10)
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index f65f1613c9..2b9f4eea35 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -49,12 +49,12 @@
return
if(isopenturf(loc))
var/turf/open/T = src.loc
- if(T.air && T.air.gases[/datum/gas/carbon_dioxide])
- var/co2 = T.air.gases[/datum/gas/carbon_dioxide]
+ if(T.air)
+ var/co2 = T.air.get_moles(/datum/gas/carbon_dioxide)
if(co2 > 0)
if(prob(25))
var/amt = min(co2, 9)
- T.air.gases[/datum/gas/carbon_dioxide] -= amt
+ T.air.adjust_moles(/datum/gas/carbon_dioxide, -amt)
T.atmos_spawn_air("o2=[amt]")
/mob/living/simple_animal/hostile/tree/AttackingTarget()
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 261778b28f..1a646ea73e 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -252,14 +252,11 @@
if(isturf(src.loc) && isopenturf(src.loc))
var/turf/open/ST = src.loc
if(ST.air)
- var/ST_gases = ST.air.gases
- var/tox = ST_gases[/datum/gas/plasma]
- var/oxy = ST_gases[/datum/gas/oxygen]
- var/n2 = ST_gases[/datum/gas/nitrogen]
- var/co2 = ST_gases[/datum/gas/carbon_dioxide]
-
- GAS_GARBAGE_COLLECT(ST.air.gases)
+ var/tox = ST.air.get_moles(/datum/gas/plasma)
+ var/oxy = ST.air.get_moles(/datum/gas/oxygen)
+ var/n2 = ST.air.get_moles(/datum/gas/nitrogen)
+ var/co2 = ST.air.get_moles(/datum/gas/carbon_dioxide)
if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"])
. = FALSE
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index 9cc385fc77..3513a916f9 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -128,9 +128,7 @@
Tempstun = 0
if(stat != DEAD)
- var/bz_percentage =0
- if(environment.gases[/datum/gas/bz])
- bz_percentage = environment.gases[/datum/gas/bz] / environment.total_moles()
+ var/bz_percentage = environment.total_moles() ? (environment.get_moles(/datum/gas/bz) / environment.total_moles()) : 0
var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis
if(stat == CONSCIOUS && stasis)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 0124249baf..f3d06f451d 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -66,11 +66,10 @@
var/datum/gas_mixture/environment = loc.return_air()
var/t = "Coordinates: [x],[y] \n"
- t += "Temperature: [environment.temperature] \n"
- for(var/id in environment.gases)
- var/gas = environment.gases[id]
- if(gas)
- t+="[GLOB.meta_gas_names[id]]: [gas] \n"
+ t += "Temperature: [environment.return_temperature()] \n"
+ for(var/id in environment.get_gases())
+ if(environment.get_moles(id))
+ t+="[GLOB.meta_gas_names[id]]: [environment.get_moles(id)] \n"
to_chat(usr, t)
@@ -227,7 +226,7 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
var/obj/item/W = get_active_held_item()
if(istype(W))
- if(equip_to_slot_if_possible(W, slot, FALSE, FALSE, FALSE, TRUE))
+ if(equip_to_slot_if_possible(W, slot, FALSE, FALSE, FALSE, FALSE, TRUE))
return TRUE
if(!W)
diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm
index dbee59bb3e..101f533e8f 100644
--- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm
+++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm
@@ -73,20 +73,22 @@
data["active"] = TRUE
data["SM_integrity"] = active.get_integrity()
data["SM_power"] = active.power
- data["SM_ambienttemp"] = air.temperature
+ data["SM_ambienttemp"] = air.return_temperature()
data["SM_ambientpressure"] = air.return_pressure()
//data["SM_EPR"] = round((air.total_moles / air.group_multiplier) / 23.1, 0.01)
var/list/gasdata = list()
if(air.total_moles())
- for(var/gasid in air.gases)
- gasdata.Add(list(list(
- "name"= GLOB.meta_gas_names[gasid],
- "amount" = round(100*air.gases[gasid]/air.total_moles(),0.01))))
+ for(var/gasid in air.get_gases())
+ var/amount = air.get_moles(gasid)
+ if(amount)
+ gasdata.Add(list(list(
+ "name"= GLOB.meta_gas_names[gasid],
+ "amount" = round(100*amount/air.total_moles(),0.01))))
else
- for(var/gasid in air.gases)
+ for(var/gasid in air.get_gases())
gasdata.Add(list(list(
"name"= GLOB.meta_gas_names[gasid],
"amount" = 0)))
@@ -124,4 +126,4 @@
for(var/obj/machinery/power/supermatter_crystal/S in supermatters)
if(S.uid == newuid)
active = S
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 5e882eb8d0..b368589bc3 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -186,9 +186,8 @@
GLOBAL_LIST_EMPTY(employmentCabinets)
/obj/structure/filingcabinet/employment
- var/cooldown = 0
icon_state = "employmentcabinet"
- var/virgin = 1
+ var/virgin = TRUE
/obj/structure/filingcabinet/employment/Initialize()
. = ..()
@@ -213,13 +212,12 @@ GLOBAL_LIST_EMPTY(employmentCabinets)
new /obj/item/paper/contract/employment(src, employee)
/obj/structure/filingcabinet/employment/interact(mob/user)
- if(!cooldown)
- if(virgin)
- fillCurrent()
- virgin = 0
- cooldown = 1
- sleep(100) // prevents the devil from just instantly emptying the cabinet, ensuring an easy win.
- cooldown = 0
- else
+ if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_EMPLOYMENT_CABINET))
to_chat(user, "[src] is jammed, give it a few seconds.")
- ..()
+ return ..()
+
+ TIMER_COOLDOWN_START(src, COOLDOWN_EMPLOYMENT_CABINET, 10 SECONDS) // prevents the devil from just instantly emptying the cabinet, ensuring an easy win.
+ if(virgin)
+ fillCurrent()
+ virgin = FALSE
+ return ..()
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 6d63a57c88..78a20e5b62 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -57,7 +57,7 @@
var/cold_air_heat_capacity = cold_air.heat_capacity()
var/hot_air_heat_capacity = hot_air.heat_capacity()
- var/delta_temperature = hot_air.temperature - cold_air.temperature
+ var/delta_temperature = hot_air.return_temperature() - cold_air.return_temperature()
if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0)
@@ -68,8 +68,8 @@
var/heat = energy_transfer*(1-efficiency)
lastgen += energy_transfer*efficiency
- hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
- cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
+ hot_air.set_temperature(hot_air.return_temperature() - energy_transfer/hot_air_heat_capacity)
+ cold_air.set_temperature(cold_air.return_temperature() + heat/cold_air_heat_capacity)
//add_avail(lastgen) This is done in process now
// update icon overlays only if displayed level has changed
@@ -116,11 +116,11 @@
t += "
"
t += "Cold loop
"
- t += "Temperature Inlet: [round(cold_circ_air2.temperature, 0.1)] K / Outlet: [round(cold_circ_air1.temperature, 0.1)] K
"
+ t += "Temperature Inlet: [round(cold_circ_air2.return_temperature(), 0.1)] K / Outlet: [round(cold_circ_air1.return_temperature(), 0.1)] K
"
t += "Pressure Inlet: [round(cold_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(cold_circ_air1.return_pressure(), 0.1)] kPa
"
t += "Hot loop
"
- t += "Temperature Inlet: [round(hot_circ_air2.temperature, 0.1)] K / Outlet: [round(hot_circ_air1.temperature, 0.1)] K
"
+ t += "Temperature Inlet: [round(hot_circ_air2.return_temperature(), 0.1)] K / Outlet: [round(hot_circ_air1.return_temperature(), 0.1)] K
"
t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa
"
t += ""
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index c18eebbb55..f911a6a4e4 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -118,7 +118,7 @@
return
if(istype(W, /obj/item/stack/cable_coil))
- if(W.use_tool(src, user, 0, 1, max_level = JOB_SKILL_TRAINED))
+ if(W.use_tool(src, user, 0, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
icon_state = "[fixture_type]-construct-stage2"
stage = 2
user.visible_message("[user.name] adds wires to [src].", \
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 651892e5b1..4cc9cbe34f 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -47,31 +47,29 @@
if(!loaded_tank)
return
if(!bitcoinmining)
- if(!loaded_tank.air_contents.gases[/datum/gas/plasma])
+ if(loaded_tank.air_contents.get_moles(/datum/gas/plasma) < 0.0001)
investigate_log("out of fuel.", INVESTIGATE_SINGULO)
playsound(src, 'sound/machines/ding.ogg', 50, 1)
Radio.talk_into(src, "Insufficient plasma in [get_area(src)] [src], ejecting \the [loaded_tank].", FREQ_ENGINEERING)
eject()
else
- var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.gases[/datum/gas/plasma])
- loaded_tank.air_contents.gases[/datum/gas/plasma] -= 2.7 * gasdrained
- loaded_tank.air_contents.gases[/datum/gas/tritium] += 2.7 * gasdrained
- GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases)
+ var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.get_moles(/datum/gas/plasma))
+ loaded_tank.air_contents.adjust_moles(/datum/gas/plasma, -gasdrained)
+ loaded_tank.air_contents.adjust_moles(/datum/gas/tritium, gasdrained)
var/power_produced = RAD_COLLECTOR_OUTPUT
add_avail(power_produced)
stored_power-=power_produced
else if(is_station_level(z) && SSresearch.science_tech)
- if(!loaded_tank.air_contents.gases[/datum/gas/tritium] || !loaded_tank.air_contents.gases[/datum/gas/oxygen])
+ if(!loaded_tank.air_contents.get_moles(/datum/gas/tritium) || !loaded_tank.air_contents.get_moles(/datum/gas/oxygen))
playsound(src, 'sound/machines/ding.ogg', 50, 1)
Radio.talk_into(src, "Insufficient oxygen and tritium in [get_area(src)] [src] to produce research points, ejecting \the [loaded_tank].", FREQ_ENGINEERING)
eject()
else
var/gasdrained = bitcoinproduction_drain*drainratio
- loaded_tank.air_contents.gases[/datum/gas/tritium] -= gasdrained
- loaded_tank.air_contents.gases[/datum/gas/oxygen] -= gasdrained
- loaded_tank.air_contents.gases[/datum/gas/carbon_dioxide] += gasdrained*2
- GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases)
+ loaded_tank.air_contents.adjust_moles(/datum/gas/tritium, -gasdrained)
+ loaded_tank.air_contents.adjust_moles(/datum/gas/oxygen, -gasdrained)
+ loaded_tank.air_contents.adjust_moles(/datum/gas/carbon_dioxide, gasdrained*2)
var/bitcoins_mined = stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG)
if(D)
@@ -86,9 +84,7 @@
toggle_power()
user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \
"You turn the [src.name] [active? "on":"off"].")
- var/fuel
- if(loaded_tank)
- fuel = loaded_tank.air_contents.gases[/datum/gas/plasma]
+ var/fuel = loaded_tank.air_contents.get_moles(/datum/gas/plasma)
investigate_log("turned [active?"on":"off"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_SINGULO)
return
else
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 1350c36348..87bdfe99e2 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -211,10 +211,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
if(get_integrity() < SUPERMATTER_DANGER_PERCENT)
return SUPERMATTER_DANGER
- if((get_integrity() < SUPERMATTER_WARNING_PERCENT) || (air.temperature > CRITICAL_TEMPERATURE))
+ if((get_integrity() < SUPERMATTER_WARNING_PERCENT) || (air.return_temperature() > CRITICAL_TEMPERATURE))
return SUPERMATTER_WARNING
- if(air.temperature > (CRITICAL_TEMPERATURE * 0.8))
+ if(air.return_temperature() > (CRITICAL_TEMPERATURE * 0.8))
return SUPERMATTER_NOTIFY
if(power > 5)
@@ -342,13 +342,13 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
else
if(takes_damage)
//causing damage
- damage = max(damage + (max(clamp(removed.total_moles() / 200, 0.5, 1) * removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0)
+ damage = max(damage + (max(clamp(removed.total_moles() / 200, 0.5, 1) * removed.return_temperature() - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0)
damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500) * DAMAGE_INCREASE_MULTIPLIER, 0)
damage = max(damage + (max(combined_gas - MOLE_PENALTY_THRESHOLD, 0)/80) * DAMAGE_INCREASE_MULTIPLIER, 0)
//healing damage
if(combined_gas < MOLE_PENALTY_THRESHOLD)
- damage = max(damage + (min(removed.temperature - (T0C + HEAT_PENALTY_THRESHOLD), 0) / 150 ), 0)
+ damage = max(damage + (min(removed.return_temperature() - (T0C + HEAT_PENALTY_THRESHOLD), 0) / 150 ), 0)
//capping damage
damage = min(damage_archived + (DAMAGE_HARDCAP * explosion_point),damage)
@@ -358,15 +358,15 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
//calculating gas related values
combined_gas = max(removed.total_moles(), 0)
- plasmacomp = max(removed.gases[/datum/gas/plasma]/combined_gas, 0)
- o2comp = max(removed.gases[/datum/gas/oxygen]/combined_gas, 0)
- co2comp = max(removed.gases[/datum/gas/carbon_dioxide]/combined_gas, 0)
- pluoxiumcomp = max(removed.gases[/datum/gas/pluoxium]/combined_gas, 0)
- tritiumcomp = max(removed.gases[/datum/gas/tritium]/combined_gas, 0)
- bzcomp = max(removed.gases[/datum/gas/bz]/combined_gas, 0)
+ plasmacomp = max(removed.get_moles(/datum/gas/plasma)/combined_gas, 0)
+ o2comp = max(removed.get_moles(/datum/gas/oxygen)/combined_gas, 0)
+ co2comp = max(removed.get_moles(/datum/gas/carbon_dioxide)/combined_gas, 0)
+ tritiumcomp = max(removed.get_moles(/datum/gas/tritium)/combined_gas, 0)
+ bzcomp = max(removed.get_moles(/datum/gas/bz)/combined_gas, 0)
- n2ocomp = max(removed.gases[/datum/gas/nitrous_oxide]/combined_gas, 0)
- n2comp = max(removed.gases[/datum/gas/nitrogen]/combined_gas, 0)
+ pluoxiumcomp = max(removed.get_moles(/datum/gas/pluoxium)/combined_gas, 0)
+ n2ocomp = max(removed.get_moles(/datum/gas/nitrous_oxide)/combined_gas, 0)
+ n2comp = max(removed.get_moles(/datum/gas/nitrogen)/combined_gas, 0)
if(pluoxiumcomp >= 0.15)
pluoxiumbonus = 1 //makes pluoxium only work at 15%+
@@ -404,7 +404,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
temp_factor = 30
icon_state = base_icon_state
- power = max( (removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0) //Total laser power plus an overload
+ power = max( (removed.return_temperature() * temp_factor / T0C) * gasmix_power_ratio + power, 0) //Total laser power plus an overload
if(prob(50))
radiation_pulse(src, power * (1 + (tritiumcomp * TRITIUM_RADIOACTIVITY_MODIFIER) + ((pluoxiumcomp * PLUOXIUM_RADIOACTIVITY_MODIFIER) * pluoxiumbonus) * (power_transmission_bonus/(10-(bzcomp * BZ_RADIOACTIVITY_MODIFIER))))) // Rad Modifiers BZ(500%), Tritium(300%), and Pluoxium(-200%)
@@ -420,14 +420,14 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
//Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock
//is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall.
- removed.temperature += ((device_energy * dynamic_heat_modifier) / THERMAL_RELEASE_MODIFIER)
+ removed.set_temperature(removed.return_temperature() + ((device_energy * dynamic_heat_modifier) / THERMAL_RELEASE_MODIFIER))
- removed.temperature = max(0, min(removed.temperature, 2500 * dynamic_heat_modifier))
+ removed.set_temperature(max(0, min(removed.return_temperature(), 2500 * dynamic_heat_modifier)))
//Calculate how much gas to release
- removed.gases[/datum/gas/plasma] += max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0)
+ removed.adjust_moles(/datum/gas/plasma, max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0))
- removed.gases[/datum/gas/oxygen] += max(((device_energy + removed.temperature * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
+ removed.adjust_moles(/datum/gas/oxygen, max(((device_energy + removed.return_temperature() * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0))
if(produces_gas)
env.merge(removed)
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index b40e5c6c41..6fd1b27a47 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -205,7 +205,7 @@
// Weird function but it works. Should be something else...
- var/newrpm = ((compressor.gas_contained.temperature) * compressor.gas_contained.total_moles())/4
+ var/newrpm = ((compressor.gas_contained.return_temperature()) * compressor.gas_contained.total_moles())/4
newrpm = max(0, newrpm)
@@ -333,7 +333,7 @@
data["power"] = DisplayPower(compressor?.turbine?.lastgen)
data["rpm"] = compressor?.rpm
- data["temp"] = compressor?.gas_contained.temperature
+ data["temp"] = compressor?.gas_contained.return_temperature()
return data
diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
index 3083e7a096..4bd9177373 100644
--- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
+++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
@@ -16,7 +16,7 @@
if(T.air)
if(T.initial_gas_mix)
T.air.parse_gas_string(T.initial_gas_mix)
- T.temperature = T.air.temperature
+ T.temperature = T.air.return_temperature()
else
T.air.copy_from_turf(T)
SSair.add_to_active(T)
diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm
index 2077b108d7..07f3b4c997 100644
--- a/code/modules/projectiles/ammunition/ballistic/pistol.dm
+++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm
@@ -51,17 +51,3 @@
desc = "A .50AE bullet casing."
caliber = ".50"
projectile_type = /obj/item/projectile/bullet/a50AE
-
-// .32 ACP (Improvised Pistol)
-
-/obj/item/ammo_casing/c32acp
- name = ".32 bullet casing"
- desc = "A .32 bullet casing."
- caliber = "c32acp"
- projectile_type = /obj/item/projectile/bullet/c32acp
-
-/obj/item/ammo_casing/r32acp
- name = ".32 rubber bullet casing"
- desc = "A .32 rubber bullet casing."
- caliber = "c32acp"
- projectile_type = /obj/item/projectile/bullet/r32acp
diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm
index 492b91ec2d..174645dd11 100644
--- a/code/modules/projectiles/ammunition/energy/laser.dm
+++ b/code/modules/projectiles/ammunition/energy/laser.dm
@@ -12,15 +12,6 @@
e_cost = 200
select_name = "kill"
-/obj/item/ammo_casing/energy/lasergun/improvised
- projectile_type = /obj/item/projectile/beam/weak/improvised
- e_cost = 200
- select_name = "kill"
-
-/obj/item/ammo_casing/energy/lasergun/improvised/upgraded
- projectile_type = /obj/item/projectile/beam/weak
- e_cost = 100
-
/obj/item/ammo_casing/energy/laser/hos
e_cost = 100
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 86d66ec354..e4674f4f4c 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -55,18 +55,6 @@
desc = "Designed to quickly reload revolvers. These rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with."
ammo_type = /obj/item/ammo_casing/c38/match
-/obj/item/ammo_box/c32mm
- name = "ammo box (.32 acp)"
- desc = "Lethal .32 acp bullets, there's forty in the box."
- ammo_type = /obj/item/ammo_casing/c32acp
- max_ammo = 40
-
-/obj/item/ammo_box/r32mm
- name = "ammo box (rubber .32 acp)"
- desc = "Non-lethal .32 acp bullets, there's forty in the box."
- ammo_type = /obj/item/ammo_casing/r32acp
- max_ammo = 40
-
/obj/item/ammo_box/c9mm
name = "ammo box (9mm)"
icon_state = "9mmbox"
diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm
index 1852b839f4..63b0483875 100644
--- a/code/modules/projectiles/boxes_magazines/external/pistol.dm
+++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm
@@ -66,15 +66,3 @@
caliber = ".50"
max_ammo = 7
multiple_sprites = 1
-
-/obj/item/ammo_box/magazine/m32acp
- name = "pistol magazine (.32)"
- desc = "A crudely construction pistol magazine that holds .32 ACP rounds. It looks like it can only fit eight bullets."
- icon_state = "32acp"
- ammo_type = /obj/item/ammo_casing/c32acp
- caliber = "c32acp"
- max_ammo = 8
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/m32acp/empty
- start_empty = 1
diff --git a/code/modules/projectiles/guns/ballistic/bow.dm b/code/modules/projectiles/guns/ballistic/bow.dm
index 4bd7d34fe2..dbf249b3f8 100644
--- a/code/modules/projectiles/guns/ballistic/bow.dm
+++ b/code/modules/projectiles/guns/ballistic/bow.dm
@@ -59,7 +59,7 @@
/obj/item/gun/ballistic/bow/pipe
name = "pipe bow"
- desc = "Some sort of pipe made projectile weapon made of a durathread string and lots of bending. Used to fire arrows."
+ desc = "Some sort of pipe-based projectile weapon made of string and lots of bending. Used to fire arrows."
icon_state = "pipebow"
item_state = "pipebow"
- force = 0
+ force = 2
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index 319ec16345..cdaadb5c3b 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -156,19 +156,3 @@
name = "Syndicate Anti Tank Pistol"
desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing."
pin = /obj/item/firing_pin/implant/pindicate
-
-////////////Improvised Pistol////////////
-
-/obj/item/gun/ballistic/automatic/pistol/improvised
- name = "Improvised Pistol"
- desc = "An improvised pocket-sized pistol that fires .32 calibre rounds. It looks incredibly flimsy."
- icon_state = "ipistol"
- item_state = "pistol"
- mag_type = /obj/item/ammo_box/magazine/m32acp
- fire_delay = 7.5
- can_suppress = FALSE
- w_class = WEIGHT_CLASS_SMALL
- spread = 15 // Keep the spread between 15 and 20. This hardlocks it into being a mid-range pistol, the magazine size means you're allowed to miss. Fills the mid-range niche that slugs/rifle and buckshot doesn't fill.
-
-/obj/item/gun/ballistic/automatic/pistol/improvised/nomag
- spawnwithmagazine = FALSE // For crafting as you shouldn't get eight bullets for free otherwise people will reaper reload.
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index f34dbc6abc..289b43a669 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -319,11 +319,11 @@
/obj/item/gun/ballistic/revolver/doublebarrel/improvised
name = "improvised shotgun"
- desc = "A shoddy break-action breechloaded shotgun. Its lacklustre construction will probably result in it hurting people less than a normal shotgun."
+ desc = "A shoddy break-action breechloaded shotgun. Its lacklustre construction shows in its lesser effectiveness."
icon_state = "ishotgun"
item_state = "shotgun"
w_class = WEIGHT_CLASS_BULKY
- weapon_weight = WEAPON_MEDIUM
+ weapon_weight = WEAPON_MEDIUM // prevents shooting 2 at once, but doesn't require 2 hands
force = 10
slot_flags = null
mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised
@@ -331,12 +331,11 @@
unique_reskin = null
projectile_damage_multiplier = 0.9
var/slung = FALSE
- weapon_weight = WEAPON_HEAVY
/obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params)
..()
if(istype(A, /obj/item/stack/cable_coil) && !sawn_off)
- if(A.use_tool(src, user, 0, 10, max_level = JOB_SKILL_BASIC))
+ if(A.use_tool(src, user, 0, 10, skill_gain_mult = EASY_USE_TOOL_MULT))
slot_flags = ITEM_SLOT_BACK
to_chat(user, "You tie the lengths of cable to the shotgun, making a sling.")
slung = TRUE
@@ -358,7 +357,7 @@
/obj/item/gun/ballistic/revolver/doublebarrel/improvised/sawn
name = "sawn-off improvised shotgun"
- desc = "The barrel and stock have been sawn and filed down; it can fit in backpacks. You still need two hands to fire this, if you value unbroken wrists."
+ desc = "The barrel and stock have been sawn and filed down; it can fit in backpacks. You wont want to shoot two of these at once if you value your wrists."
icon_state = "ishotgun"
item_state = "gun"
w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index a4a4065959..873b129c8f 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -156,7 +156,7 @@
/obj/item/gun/ballistic/shotgun/boltaction/improvised/attackby(obj/item/A, mob/user, params)
..()
if(istype(A, /obj/item/stack/cable_coil) && !sawn_off)
- if(A.use_tool(src, user, 0, 10, max_level = JOB_SKILL_BASIC))
+ if(A.use_tool(src, user, 0, 10, skill_gain_mult = EASY_USE_TOOL_MULT))
slot_flags = ITEM_SLOT_BACK
to_chat(user, "You tie the lengths of cable to the rifle, making a sling.")
slung = TRUE
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index e64da116f3..72ac9620b5 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -240,20 +240,3 @@
chambered.BB.damage *= 5
process_fire(target, user, TRUE, params)
-
-////////////////
-// IMPROVISED //
-////////////////
-
-/obj/item/gun/energy/e_gun/old/improvised
- name = "improvised energy rifle"
- desc = "A crude imitation of an energy gun. It works, however the beams are poorly focused and most of the energy is wasted before it reaches the target. Welp, it still burns things."
- icon_state = "improvised"
- ammo_x_offset = 1
- shaded_charge = 1
- ammo_type = list(/obj/item/ammo_casing/energy/lasergun/improvised)
-
-/obj/item/gun/energy/e_gun/old/improvised/upgraded
- name = "makeshift energy rifle"
- desc = "The new lens and upgraded parts gives this a higher capacity and more energy output, however, the shoddy construction still leaves it inferior to Nanotrasen's own energy weapons."
- ammo_type = list(/obj/item/ammo_casing/energy/lasergun/improvised/upgraded)
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index d95c3b5028..2f12f0f69b 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -39,9 +39,6 @@
/obj/item/projectile/beam/weak
damage = 15
-/obj/item/projectile/beam/weak/improvised
- damage = 10
-
/obj/item/projectile/beam/weak/penetrator
armour_penetration = 50
diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm
index 62ff4adb11..38c9c9f7d9 100644
--- a/code/modules/projectiles/projectile/bullets/pistol.dm
+++ b/code/modules/projectiles/projectile/bullets/pistol.dm
@@ -48,15 +48,3 @@
L.Sleeping(300)
else
L.adjustStaminaLoss(25)
-
-// .32 ACP (Improvised Pistol)
-
-/obj/item/projectile/bullet/c32acp
- name = ".32 bullet"
- damage = 13
-
-/obj/item/projectile/bullet/r32acp
- name = ".32 rubber bullet"
- damage = 3
- eyeblur = 1
- stamina = 20
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 4df842d044..24c5200a54 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -258,9 +258,9 @@
var/amount = text2num(params["amount"])
if(amount == null)
amount = text2num(input(usr,
- "Max 10. Buffer content will be split evenly.",
+ "Max 20. Buffer content will be split evenly.",
"How many to make?", 1))
- amount = clamp(round(amount), 0, 10)
+ amount = clamp(round(amount), 0, 20)
if (amount <= 0)
return FALSE
// Get units per item
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 52fd89e37c..f80cd10792 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -132,8 +132,8 @@
"You're covered in boiling oil!")
M.emote("scream")
playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE)
- var/oil_damage = (holder.chem_temp / fry_temperature) * 0.33 //Damage taken per unit
- M.adjustFireLoss(min(35, oil_damage * reac_volume)) //Damage caps at 35
+ var/oil_damage = max((holder.chem_temp / fry_temperature) * 0.33,1) //Damage taken per unit
+ M.adjustFireLoss(oil_damage * max(reac_volume,20)) //Damage caps at 20
else
..()
return TRUE
@@ -271,7 +271,7 @@
if(isopenturf(T))
var/turf/open/OT = T
OT.MakeSlippery(wet_setting=TURF_WET_ICE, min_wet_time=100, wet_time_to_add=reac_volume SECONDS) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure.
- OT.air.temperature -= MOLES_CELLSTANDARD*100*reac_volume/OT.air.heat_capacity() // reduces environment temperature by 5K per unit.
+ OT.air.set_temperature(OT.air.return_temperature() - MOLES_CELLSTANDARD*100*reac_volume/OT.air.heat_capacity()) // reduces environment temperature by 5K per unit.
/datum/reagent/consumable/condensedcapsaicin
name = "Condensed Capsaicin"
@@ -506,7 +506,7 @@
var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot)
var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles())
- lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
+ lowertemp.set_temperature(max( min(lowertemp.return_temperature()-2000,lowertemp.return_temperature() / 2) ,0))
lowertemp.react(src)
T.assume_air(lowertemp)
qdel(hotspot)
@@ -866,4 +866,4 @@
taste_mult = 2
taste_description = "fizzy sweetness"
value = REAGENT_VALUE_COMMON
-
\ No newline at end of file
+
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index f3cba53727..96ce50895e 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -263,7 +263,7 @@
if(hotspot && !isspaceturf(T))
if(T.air)
var/datum/gas_mixture/G = T.air
- G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),TCMB)
+ G.set_temperature(max(min(G.return_temperature()-(CT*1000),G.return_temperature()/CT),TCMB))
G.react(src)
qdel(hotspot)
var/obj/effect/acid/A = (locate(/obj/effect/acid) in T)
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
index 50d94a637e..3f0ebcb3e3 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
@@ -281,8 +281,8 @@
if(hotspot && !isspaceturf(T))
if(T.air)
var/datum/gas_mixture/G = T.air
- if(G.temperature > T20C)
- G.temperature = max(G.temperature/2,T20C)
+ if(G.return_temperature() > T20C)
+ G.set_temperature(max(G.return_temperature()/2,T20C))
G.react(src)
qdel(hotspot)
diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm
index 65bfa1d98f..fb615563df 100644
--- a/code/modules/recycling/disposal/bin.dm
+++ b/code/modules/recycling/disposal/bin.dm
@@ -40,7 +40,7 @@
trunk_check()
air_contents = new /datum/gas_mixture()
- //gas.volume = 1.05 * CELLSTANDARD
+ //air_contents.set_volume(1.05 * CELLSTANDARD)
update_icon()
return INITIALIZE_HINT_LATELOAD //we need turfs to have air
@@ -443,8 +443,8 @@
var/datum/gas_mixture/env = L.return_air()
var/pressure_delta = (SEND_PRESSURE*1.01) - air_contents.return_pressure()
- if(env.temperature > 0)
- var/transfer_moles = 0.1 * pressure_delta*air_contents.volume/(env.temperature * R_IDEAL_GAS_EQUATION)
+ if(env.return_temperature() > 0)
+ var/transfer_moles = 0.1 * pressure_delta*air_contents.return_volume()/(env.return_temperature() * R_IDEAL_GAS_EQUATION)
//Actually transfer the gas
var/datum/gas_mixture/removed = env.remove(transfer_moles)
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm
index 9768d80a59..61d0594d3b 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm
@@ -30,14 +30,6 @@
build_path = /obj/item/ammo_box/c38
category = list("initial", "Security")
-/datum/design/r32acp
- name = "Rubber Pistol Bullet (.32)"
- id = "r32acp"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 250)
- build_path = /obj/item/ammo_casing/r32acp
- category = list("initial", "Security")
-
/////////////////
///Hacked Gear //
/////////////////
@@ -206,22 +198,3 @@
build_path = /obj/item/clothing/head/foilhat
category = list("hacked", "Misc")
-/datum/design/c32acp
- name = "Pistol Bullet (.32)"
- id = "c32acp"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 500)
- build_path = /obj/item/ammo_casing/c32acp
- category = list("hacked", "Security")
-
-/////////////////
-// Magazines //
-/////////////////
-
-/datum/design/m32acp
- name = "Empty .32 Magazine"
- id = "m32acp"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 10000)
- build_path = /obj/item/ammo_box/magazine/m32acp/empty
- category = list("hacked", "Security")
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm
index 3c9c8f9aca..539232bbcd 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm
@@ -289,11 +289,3 @@
materials = list(/datum/material/iron = 6500, /datum/material/glass = 50)
build_path = /obj/item/weaponcrafting/improvised_parts/trigger_assembly
category = list("initial", "Misc")
-
-/datum/design/focusing_lens
- name = "Makeshift Lens"
- id = "makeshift_lens"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 2000, /datum/material/glass = 4000)
- build_path = /obj/item/weaponcrafting/improvised_parts/makeshift_lens
- category = list("initial", "Misc")
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
index 1bb18482f3..bebf836ce0 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
@@ -158,11 +158,3 @@
materials = list(/datum/material/iron = 150, /datum/material/glass = 150)
build_path = /obj/item/geiger_counter
category = list("initial", "Tools")
-
-/datum/design/saw
- name = "Hand Saw"
- id = "handsaw"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 500)
- build_path = /obj/item/hatchet/saw
- category = list("initial", "Tools")
diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm
index 0d11b8e887..336dc4ec8e 100644
--- a/code/modules/research/designs/bluespace_designs.dm
+++ b/code/modules/research/designs/bluespace_designs.dm
@@ -95,3 +95,23 @@
build_path = /obj/item/storage/bag/ore/holding
category = list("Bluespace Designs")
departmental_flags = DEPARTMENTAL_FLAG_CARGO
+
+/datum/design/bluespace_tray
+ name = "Bluespace Tray"
+ desc = "A tray created using bluespace technology to fit more food on it."
+ id = "bluespace_tray"
+ build_type = PROTOLATHE
+ build_path = /obj/item/storage/bag/tray/bluespace
+ materials = list(/datum/material/iron = 2000, /datum/material/bluespace = 500)
+ category = list("Bluespace Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/bluespace_carrier
+ name = "Bluespace Jar"
+ desc = "A jar used to contain creatures, using the power of bluespace."
+ id = "bluespace_carrier"
+ build_type = PROTOLATHE
+ build_path = /obj/item/pet_carrier/bluespace
+ materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 600)
+ category = list("Bluespace Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
\ No newline at end of file
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 3d4bf2b4c9..9667830dbc 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -368,7 +368,7 @@
var/heat_capacity = removed.heat_capacity()
if(heat_capacity == 0 || heat_capacity == null)
heat_capacity = 1
- removed.temperature = min((removed.temperature*heat_capacity + 100000)/heat_capacity, 1000)
+ removed.set_temperature(min((removed.return_temperature()*heat_capacity + 100000)/heat_capacity, 1000))
env.merge(removed)
air_update_turf()
investigate_log("Experimentor has released hot air.", INVESTIGATE_EXPERIMENTOR)
@@ -414,7 +414,7 @@
var/heat_capacity = removed.heat_capacity()
if(heat_capacity == 0 || heat_capacity == null)
heat_capacity = 1
- removed.temperature = (removed.temperature*heat_capacity - 75000)/heat_capacity
+ removed.set_temperature((removed.return_temperature()*heat_capacity - 75000)/heat_capacity)
env.merge(removed)
air_update_turf()
investigate_log("Experimentor has released cold air.", INVESTIGATE_EXPERIMENTOR)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index b3e114d2ad..d3b4bb6bac 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -59,14 +59,14 @@
/obj/machinery/rnd/server/proc/get_env_temp()
var/datum/gas_mixture/environment = loc.return_air()
- return environment.temperature
+ return environment.return_temperature()
/obj/machinery/rnd/server/proc/produce_heat(heat_amt)
if(!(stat & (NOPOWER|BROKEN))) //Blatently stolen from space heater.
var/turf/L = loc
if(istype(L))
var/datum/gas_mixture/env = L.return_air()
- if(env.temperature < (heat_amt+T0C))
+ if(env.return_temperature() < (heat_amt+T0C))
var/transfer_moles = 0.25 * env.total_moles()
@@ -77,7 +77,7 @@
var/heat_capacity = removed.heat_capacity()
if(heat_capacity == 0 || heat_capacity == null)
heat_capacity = 1
- removed.temperature = min((removed.temperature*heat_capacity + heating_power)/heat_capacity, 1000)
+ removed.set_temperature(min((removed.return_temperature()*heat_capacity + heating_power)/heat_capacity, 1000))
env.merge(removed)
air_update_turf()
diff --git a/code/modules/research/techweb/nodes/bluespace_nodes.dm b/code/modules/research/techweb/nodes/bluespace_nodes.dm
index 3aacc9fec5..b0705a0b76 100644
--- a/code/modules/research/techweb/nodes/bluespace_nodes.dm
+++ b/code/modules/research/techweb/nodes/bluespace_nodes.dm
@@ -13,7 +13,7 @@
display_name = "Applied Bluespace Research"
description = "Using bluespace to make things faster and better."
prereq_ids = list("bluespace_basic", "engineering")
- design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart", "xenobio_slimebasic")
+ design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart", "xenobio_slimebasic", "bluespace_tray", "bluespace_carrier")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
/datum/techweb_node/adv_bluespace
diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm
index 1405bbad51..5325680588 100644
--- a/code/modules/research/xenobiology/crossbreeding/chilling.dm
+++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm
@@ -100,9 +100,8 @@ Chilling extracts:
for(var/turf/open/T in A)
var/datum/gas_mixture/G = T.air
if(istype(G))
- G.gases[/datum/gas/plasma] = 0
+ G.set_moles(/datum/gas/plasma, 0)
filtered = TRUE
- GAS_GARBAGE_COLLECT(G.gases)
T.air_update_turf()
if(filtered)
user.visible_message("Cracks spread throughout [src], and some air is sucked in!")
@@ -308,4 +307,4 @@ Chilling extracts:
user.visible_message("[src] reflects an array of dazzling colors and light, energy rushing to nearby doors!")
for(var/obj/machinery/door/airlock/door in area)
new /obj/effect/forcefield/slimewall/rainbow(door.loc)
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index b7dfa3eb88..b42770723b 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -132,6 +132,7 @@
"You extend [holder] from your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.",
"You hear a short mechanical noise.")
playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
+ return TRUE
/obj/item/organ/cyberimp/arm/ui_action_click()
if(crit_fail || (organ_flags & ORGAN_FAILING) || (!holder && !contents.len))
@@ -273,12 +274,29 @@
desc = "A deployable riot shield to help deal with civil unrest."
contents = newlist(/obj/item/shield/riot/implant)
-/obj/item/organ/cyberimp/arm/shield/Extend(obj/item/I)
+/obj/item/organ/cyberimp/arm/shield/Extend(obj/item/I, silent = FALSE)
if(I.obj_integrity == 0) //that's how the shield recharge works
- to_chat(owner, "[I] is still too unstable to extend. Give it some time!")
+ if(!silent)
+ to_chat(owner, "[I] is still too unstable to extend. Give it some time!")
return FALSE
return ..()
+/obj/item/organ/cyberimp/arm/shield/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
+ . = ..()
+ if(.)
+ RegisterSignal(M, COMSIG_LIVING_ACTIVE_BLOCK_START, .proc/on_signal)
+
+/obj/item/organ/cyberimp/arm/shield/Remove(special = FALSE)
+ UnregisterSignal(owner, COMSIG_LIVING_ACTIVE_BLOCK_START)
+ return ..()
+
+/obj/item/organ/cyberimp/arm/shield/proc/on_signal(datum/source, obj/item/blocking_item, list/other_items)
+ if(!blocking_item) //if they don't have something
+ var/obj/item/shield/S = locate() in contents
+ if(!Extend(S, TRUE))
+ return
+ other_items += S
+
/obj/item/organ/cyberimp/arm/shield/emag_act()
. = ..()
if(obj_flags & EMAGGED)
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index 949eef62d0..e34fd8e8a9 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -133,13 +133,11 @@
var/gas_breathed = 0
- var/list/breath_gases = breath.gases
-
//Partial pressures in our breath
- var/O2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen])+(8*breath.get_breath_partial_pressure(breath_gases[/datum/gas/pluoxium]))
- var/N2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrogen])
- var/Toxins_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/plasma])
- var/CO2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/carbon_dioxide])
+ var/O2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/oxygen))+(8*breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/pluoxium)))
+ var/N2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitrogen))
+ var/Toxins_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/plasma))
+ var/CO2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/carbon_dioxide))
//-- OXY --//
@@ -147,7 +145,7 @@
//Too much oxygen! //Yes, some species may not like it.
if(safe_oxygen_max)
if((O2_pp > safe_oxygen_max) && safe_oxygen_max == 0) //I guess plasma men technically need to have a check.
- var/ratio = (breath_gases[/datum/gas/oxygen]/safe_oxygen_max) * 10
+ var/ratio = (breath.get_moles(/datum/gas/oxygen)/safe_oxygen_max) * 10
H.apply_damage_type(clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type)
H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy)
@@ -170,18 +168,18 @@
//Too little oxygen!
if(safe_oxygen_min)
if(O2_pp < safe_oxygen_min)
- gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath_gases[/datum/gas/oxygen])
+ gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath.get_moles(/datum/gas/oxygen))
H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
else
H.failed_last_breath = FALSE
if(H.health >= H.crit_threshold)
H.adjustOxyLoss(-breathModifier) //More damaged lungs = slower oxy rate up to a factor of half
- gas_breathed = breath_gases[/datum/gas/oxygen]
+ gas_breathed = breath.get_moles(/datum/gas/oxygen)
H.clear_alert("not_enough_oxy")
//Exhale
- breath_gases[/datum/gas/oxygen] -= gas_breathed
- breath_gases[/datum/gas/carbon_dioxide] += gas_breathed
+ breath.adjust_moles(/datum/gas/oxygen, -gas_breathed)
+ breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed)
gas_breathed = 0
//-- Nitrogen --//
@@ -189,7 +187,7 @@
//Too much nitrogen!
if(safe_nitro_max)
if(N2_pp > safe_nitro_max)
- var/ratio = (breath_gases[/datum/gas/nitrogen]/safe_nitro_max) * 10
+ var/ratio = (breath.get_moles(/datum/gas/nitrogen)/safe_nitro_max) * 10
H.apply_damage_type(clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type)
H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro)
H.losebreath += 2
@@ -199,18 +197,18 @@
//Too little nitrogen!
if(safe_nitro_min)
if(N2_pp < safe_nitro_min)
- gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath_gases[/datum/gas/nitrogen])
+ gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath.get_moles(/datum/gas/nitrogen))
H.throw_alert("nitro", /obj/screen/alert/not_enough_nitro)
else
H.failed_last_breath = FALSE
if(H.health >= H.crit_threshold)
H.adjustOxyLoss(-breathModifier)
- gas_breathed = breath_gases[/datum/gas/nitrogen]
+ gas_breathed = breath.get_moles(/datum/gas/nitrogen)
H.clear_alert("nitro")
//Exhale
- breath_gases[/datum/gas/nitrogen] -= gas_breathed
- breath_gases[/datum/gas/carbon_dioxide] += gas_breathed
+ breath.adjust_moles(/datum/gas/nitrogen, -gas_breathed)
+ breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed)
gas_breathed = 0
//-- CO2 --//
@@ -236,18 +234,18 @@
//Too little CO2!
if(safe_co2_min)
if(CO2_pp < safe_co2_min)
- gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath_gases[/datum/gas/carbon_dioxide])
+ gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath.get_moles(/datum/gas/carbon_dioxide))
H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
else
H.failed_last_breath = FALSE
if(H.health >= H.crit_threshold)
H.adjustOxyLoss(-breathModifier)
- gas_breathed = breath_gases[/datum/gas/carbon_dioxide]
+ gas_breathed = breath.get_moles(/datum/gas/carbon_dioxide)
H.clear_alert("not_enough_co2")
//Exhale
- breath_gases[/datum/gas/carbon_dioxide] -= gas_breathed
- breath_gases[/datum/gas/oxygen] += gas_breathed
+ breath.adjust_moles(/datum/gas/carbon_dioxide, -gas_breathed)
+ breath.adjust_moles(/datum/gas/oxygen, gas_breathed)
gas_breathed = 0
@@ -256,7 +254,7 @@
//Too much toxins!
if(safe_toxins_max)
if(Toxins_pp > safe_toxins_max)
- var/ratio = (breath_gases[/datum/gas/plasma]/safe_toxins_max) * 10
+ var/ratio = (breath.get_moles(/datum/gas/plasma)/safe_toxins_max) * 10
H.apply_damage_type(clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type)
H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
@@ -266,18 +264,18 @@
//Too little toxins!
if(safe_toxins_min)
if(Toxins_pp < safe_toxins_min)
- gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath_gases[/datum/gas/plasma])
+ gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath.get_moles(/datum/gas/plasma))
H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
else
H.failed_last_breath = FALSE
if(H.health >= H.crit_threshold)
H.adjustOxyLoss(-breathModifier)
- gas_breathed = breath_gases[/datum/gas/plasma]
+ gas_breathed = breath.get_moles(/datum/gas/plasma)
H.clear_alert("not_enough_tox")
//Exhale
- breath_gases[/datum/gas/plasma] -= gas_breathed
- breath_gases[/datum/gas/carbon_dioxide] += gas_breathed
+ breath.adjust_moles(/datum/gas/plasma, -gas_breathed)
+ breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed)
gas_breathed = 0
@@ -287,7 +285,7 @@
// N2O
- var/SA_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrous_oxide])
+ var/SA_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitrous_oxide))
if(SA_pp > SA_para_min) // Enough to make us stunned for a bit
H.Unconscious(60) // 60 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
@@ -301,7 +299,7 @@
// BZ
- var/bz_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/bz])
+ var/bz_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/bz))
if(bz_pp > BZ_trip_balls_min)
H.hallucination += 10
H.reagents.add_reagent(/datum/reagent/bz_metabolites,5)
@@ -314,14 +312,14 @@
// Tritium
- var/trit_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/tritium])
+ var/trit_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/tritium))
if (trit_pp > 50)
H.radiation += trit_pp/2 //If you're breathing in half an atmosphere of radioactive gas, you fucked up.
else
H.radiation += trit_pp/10
// Nitryl
- var/nitryl_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitryl])
+ var/nitryl_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitryl))
if (prob(nitryl_pp))
to_chat(H, "Your mouth feels like it's burning!")
if (nitryl_pp >40)
@@ -332,22 +330,22 @@
H.silent = max(H.silent, 3)
else
H.adjustFireLoss(nitryl_pp/4)
- gas_breathed = breath_gases[/datum/gas/nitryl]
+ gas_breathed = breath.get_moles(/datum/gas/nitryl)
if (gas_breathed > gas_stimulation_min)
H.reagents.add_reagent(/datum/reagent/nitryl,1)
- breath_gases[/datum/gas/nitryl]-=gas_breathed
+ breath.adjust_moles(/datum/gas/nitryl, -gas_breathed)
// Stimulum
- gas_breathed = breath_gases[/datum/gas/stimulum]
+ gas_breathed = breath.get_moles(/datum/gas/stimulum)
if (gas_breathed > gas_stimulation_min)
var/existing = H.reagents.get_reagent_amount(/datum/reagent/stimulum)
H.reagents.add_reagent(/datum/reagent/stimulum, max(0, 5 - existing))
- breath_gases[/datum/gas/stimulum]-=gas_breathed
+ breath.adjust_moles(/datum/gas/stimulum, -gas_breathed)
// Miasma
- if (breath_gases[/datum/gas/miasma])
- var/miasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/miasma])
+ if (breath.get_moles(/datum/gas/miasma))
+ var/miasma_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/miasma))
if(miasma_pp > MINIMUM_MOLES_DELTA_TO_MOVE)
//Miasma sickness
@@ -387,14 +385,13 @@
// Then again, this is a purely hypothetical scenario and hardly reachable
owner.adjust_disgust(0.1 * miasma_pp)
- breath_gases[/datum/gas/miasma]-=gas_breathed
+ breath.adjust_moles(/datum/gas/miasma, -gas_breathed)
// Clear out moods when no miasma at all
else
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell")
handle_breath_temperature(breath, H)
- GAS_GARBAGE_COLLECT(breath.gases)
return TRUE
@@ -416,7 +413,7 @@
/obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/H) // called by human/life, handles temperatures
- var/breath_temperature = breath.temperature
+ var/breath_temperature = breath.return_temperature()
if(!HAS_TRAIT(H, TRAIT_RESISTCOLD)) // COLD DAMAGE
var/cold_modifier = H.dna.species.coldmod
@@ -533,8 +530,8 @@
/obj/item/organ/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
. = ..()
- if (breath && breath.gases[/datum/gas/plasma])
- var/plasma_pp = breath.get_breath_partial_pressure(breath.gases[/datum/gas/plasma])
+ if (breath)
+ var/plasma_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/plasma))
owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you.
/obj/item/organ/lungs/yamerol
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 0378340117..cb4de69fbd 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -122,7 +122,7 @@
if(istype(loc, /turf/))//Only concern is adding an organ to a freezer when the area around it is cold.
var/turf/T = loc
var/datum/gas_mixture/enviro = T.return_air()
- local_temp = enviro.temperature
+ local_temp = enviro.return_temperature()
else if(!owner && ismob(loc))
var/mob/M = loc
@@ -132,7 +132,7 @@
return TRUE
var/turf/T = M.loc
var/datum/gas_mixture/enviro = T.return_air()
- local_temp = enviro.temperature
+ local_temp = enviro.return_temperature()
if(owner)
//Don't interfere with bodies frozen by structures.
diff --git a/html/changelog.html b/html/changelog.html
index 1f5cda6fc7..ce7a197acd 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,109 @@
-->
+
11 July 2020
+
Putnam3145 updated:
+
+ - Gas mixtures now live entirely in a DLL.
+
+
+
10 July 2020
+
Chiirno updated:
+
+ - Gave jellypeople a unique brain object /obj/item/organ/brain/jelly
+ - added an icon for jellypeople brains.
+
+
EmeraldSundisk updated:
+
+ - Adds a pool to PubbyStation
+ - Slight adjustments to the surrounding area as to fit said pool
+
+
Sneakyrat6 updated:
+
+ - Fixes hair falling out of hoodies.
+
+
TheObserver-sys updated:
+
+ - Actually adds the juice reagent to make laugh peas donuts.
+
+
+
09 July 2020
+
timothyteakettle updated:
+
+ - bluespace tray added, allowing twice as many items as the regular tray, printable at the service lathe, researched through science
+ - bluespace jar added, a kind of pet carrier that allows human sized mobs inside, and smashes when thrown, researched and printed through science
+
+
+
08 July 2020
+
DeltaFire15 updated:
+
+ - The kill-once objective now works properly.
+
+
EmeraldSundisk updated:
+
+ - CogStation now has an apothecary
+ - Removes an outdated note on sleepers
+ - Readjusts CogStation's chemistry lab
+ - Slight area designation adjustments for Robotics
+ - The arrivals plaque should be readable now
+
+
Owai-Seek updated:
+
+ - Margarine, Chili Cheese Fries.
+ - Egg Wraps are now categorized under egg foods.
+ - Tuna Sandwich crafting/sprite is now visible.
+ - Icons for chicken, cooked chicken, steak, grilled carp, corndogs
+ - Icons for chili cheese fries, margarine, BLT sandwich
+ - (Unused) icons for raw meatballs, and lard
+
+
+
07 July 2020
+
KasparoVy updated:
+
+ - Fixes misaligned south-facing silver legwraps sprite.
+
+
Owai-Seek updated:
+
+ - Bee Balm is now visible.
+
+
Weblure updated:
+
+ - Fixed the slowdown formula for small character sprites; you guys don't use custom sprite sizes so just ignore these changes.
+ - Fixed the "Move it to the threshold" button; it now does what it says.
+ - Reworded some text to be clearer.
+
+
+
05 July 2020
+
Ghommie updated:
+
+ - You can now actually gain wiring experience from using cable coils.
+ - Opening the View Skill Panel shouldn't trigger messages about insufficient admin priviledges anymore.
+
+
Yakumo Chen, kappa-sama updated:
+
+ - Removes improvised handguns
+ - removed handsaws, improvised gun barrels (you can use atmos pipes again)
+ - Guncrafting is less time and resource intensive
+ - Item names in guncrafting are user-friendly.
+
+
kappa-sama updated:
+
+ - cloth string to replace durathread string
+ - durathread string
+ - All bows and arrows have had crafting times significantly reduced, coming out at up to 6 times faster crafting speeds. Improvised bows no longer require durathread; instead, they use cloth materials.
+
+
silicons updated:
+
+ - active blocking now has a toggle keybind
+ - auto bunker override verb has been added
+ - shields take 2.5 stam instead of 3.5 stam per second to maintain block
+ - Cybernetic implant shields will auto-extend and be used to block if the user has no item to block with
+
+
timothyteakettle updated:
+
+ - cooking oil is now far less lethal, requiring a higher volume of the reagent to deal more damage
+
+
04 July 2020
Sonic121x updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 631dec2720..587689e43c 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -26239,3 +26239,74 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
female formal outfit.
silicons:
- refactor: blood_DNA["color"] is now a single variable instead of a list
+2020-07-05:
+ Ghommie:
+ - bugfix: You can now actually gain wiring experience from using cable coils.
+ - bugfix: Opening the View Skill Panel shouldn't trigger messages about insufficient
+ admin priviledges anymore.
+ Yakumo Chen, kappa-sama:
+ - rscdel: Removes improvised handguns
+ - rscdel: removed handsaws, improvised gun barrels (you can use atmos pipes again)
+ - balance: Guncrafting is less time and resource intensive
+ - tweak: Item names in guncrafting are user-friendly.
+ kappa-sama:
+ - rscadd: cloth string to replace durathread string
+ - rscdel: durathread string
+ - balance: All bows and arrows have had crafting times significantly reduced, coming
+ out at up to 6 times faster crafting speeds. Improvised bows no longer require
+ durathread; instead, they use cloth materials.
+ silicons:
+ - tweak: active blocking now has a toggle keybind
+ - rscadd: auto bunker override verb has been added
+ - balance: shields take 2.5 stam instead of 3.5 stam per second to maintain block
+ - rscadd: Cybernetic implant shields will auto-extend and be used to block if the
+ user has no item to block with
+ timothyteakettle:
+ - tweak: cooking oil is now far less lethal, requiring a higher volume of the reagent
+ to deal more damage
+2020-07-07:
+ KasparoVy:
+ - tweak: Fixes misaligned south-facing silver legwraps sprite.
+ Owai-Seek:
+ - bugfix: Bee Balm is now visible.
+ Weblure:
+ - bugfix: Fixed the slowdown formula for small character sprites; you guys don't
+ use custom sprite sizes so just ignore these changes.
+ - bugfix: Fixed the "Move it to the threshold" button; it now does what it says.
+ - tweak: Reworded some text to be clearer.
+2020-07-08:
+ DeltaFire15:
+ - bugfix: The kill-once objective now works properly.
+ EmeraldSundisk:
+ - rscadd: CogStation now has an apothecary
+ - rscdel: Removes an outdated note on sleepers
+ - tweak: Readjusts CogStation's chemistry lab
+ - tweak: Slight area designation adjustments for Robotics
+ - bugfix: The arrivals plaque should be readable now
+ Owai-Seek:
+ - rscadd: Margarine, Chili Cheese Fries.
+ - tweak: Egg Wraps are now categorized under egg foods.
+ - bugfix: Tuna Sandwich crafting/sprite is now visible.
+ - imageadd: Icons for chicken, cooked chicken, steak, grilled carp, corndogs
+ - imageadd: Icons for chili cheese fries, margarine, BLT sandwich
+ - imageadd: (Unused) icons for raw meatballs, and lard
+2020-07-09:
+ timothyteakettle:
+ - rscadd: bluespace tray added, allowing twice as many items as the regular tray,
+ printable at the service lathe, researched through science
+ - rscadd: bluespace jar added, a kind of pet carrier that allows human sized mobs
+ inside, and smashes when thrown, researched and printed through science
+2020-07-10:
+ Chiirno:
+ - code_imp: Gave jellypeople a unique brain object /obj/item/organ/brain/jelly
+ - imageadd: added an icon for jellypeople brains.
+ EmeraldSundisk:
+ - rscadd: Adds a pool to PubbyStation
+ - tweak: Slight adjustments to the surrounding area as to fit said pool
+ Sneakyrat6:
+ - bugfix: Fixes hair falling out of hoodies.
+ TheObserver-sys:
+ - bugfix: Actually adds the juice reagent to make laugh peas donuts.
+2020-07-11:
+ Putnam3145:
+ - refactor: Gas mixtures now live entirely in a DLL.
diff --git a/icons/mob/clothing/feet_digi.dmi b/icons/mob/clothing/feet_digi.dmi
index 7815f3d0a4..f798850ee7 100644
Binary files a/icons/mob/clothing/feet_digi.dmi and b/icons/mob/clothing/feet_digi.dmi differ
diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi
index a1d5bc5900..a6c554f7da 100644
Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ
diff --git a/icons/obj/doors/doorfirewindow.dmi b/icons/obj/doors/doorfirewindow.dmi
new file mode 100644
index 0000000000..76f8a7e98e
Binary files /dev/null and b/icons/obj/doors/doorfirewindow.dmi differ
diff --git a/icons/obj/doors/edge_Doorfire.dmi b/icons/obj/doors/edge_Doorfire.dmi
index 3aad0114d4..51777624db 100644
Binary files a/icons/obj/doors/edge_Doorfire.dmi and b/icons/obj/doors/edge_Doorfire.dmi differ
diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi
index 414930ac25..7ef3a7d418 100644
Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ
diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi
index 641715fd87..ceda2fc9eb 100644
Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index e7196190cf..e87a37d069 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/hydroponics/growing_flowers.dmi b/icons/obj/hydroponics/growing_flowers.dmi
index 98d9af2ce6..b48051cc56 100644
Binary files a/icons/obj/hydroponics/growing_flowers.dmi and b/icons/obj/hydroponics/growing_flowers.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index 2ea5554741..d7800fc0a5 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
index 15b7e2b96c..a9d0845be3 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/icons/obj/pet_carrier.dmi b/icons/obj/pet_carrier.dmi
index 340636056c..b3c11be98f 100644
Binary files a/icons/obj/pet_carrier.dmi and b/icons/obj/pet_carrier.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index e998ce442d..3996f0ead2 100755
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/libbyond-extools.so b/libbyond-extools.so
new file mode 100644
index 0000000000..8e17f952f2
Binary files /dev/null and b/libbyond-extools.so differ
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
index 37ec1ee69f..8ef302e904 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
@@ -63,7 +63,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
startHunger = M.nutrition
if(pollStarted == FALSE)
pollStarted = TRUE
- candies = pollGhostCandidates("Do you want and agree to play as a clone of [M], respect their character and not engage in ERP without permission from the original?", ignore_category = POLL_IGNORE_CLONE)
+ candies = pollGhostCandidates("Do you want to play as [M]'s defective clone? (Don't ERP without permission from the original)", ignore_category = POLL_IGNORE_CLONE)
log_reagent("FERMICHEM: [M] ckey: [M.key] has taken SDGF, and ghosts have been polled.")
if(20 to INFINITY)
if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there!
diff --git a/tgstation.dme b/tgstation.dme
index c43a6de0e4..8be5ae2a46 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -38,6 +38,7 @@
#include "code\__DEFINES\configuration.dm"
#include "code\__DEFINES\construction.dm"
#include "code\__DEFINES\contracts.dm"
+#include "code\__DEFINES\cooldowns.dm"
#include "code\__DEFINES\cult.dm"
#include "code\__DEFINES\diseases.dm"
#include "code\__DEFINES\DNA.dm"
@@ -743,7 +744,6 @@
#include "code\game\machinery\dna_scanner.dm"
#include "code\game\machinery\doppler_array.dm"
#include "code\game\machinery\droneDispenser.dm"
-#include "code\game\machinery\exp_cloner.dm"
#include "code\game\machinery\firealarm.dm"
#include "code\game\machinery\flasher.dm"
#include "code\game\machinery\gulag_item_reclaimer.dm"
@@ -1150,7 +1150,6 @@
#include "code\game\objects\items\tanks\tanks.dm"
#include "code\game\objects\items\tanks\watertank.dm"
#include "code\game\objects\items\tools\crowbar.dm"
-#include "code\game\objects\items\tools\saw.dm"
#include "code\game\objects\items\tools\screwdriver.dm"
#include "code\game\objects\items\tools\weldingtool.dm"
#include "code\game\objects\items\tools\wirecutters.dm"
@@ -1805,6 +1804,7 @@
#include "code\modules\client\preferences_toggles.dm"
#include "code\modules\client\preferences_vr.dm"
#include "code\modules\client\verbs\aooc.dm"
+#include "code\modules\client\verbs\autobunker.dm"
#include "code\modules\client\verbs\etips.dm"
#include "code\modules\client\verbs\looc.dm"
#include "code\modules\client\verbs\minimap.dm"
@@ -2415,7 +2415,6 @@
#include "code\modules\mob\living\carbon\alien\humanoid\death.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\life.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm"
diff --git a/tools/deploy.sh b/tools/deploy.sh
index a4795ea06a..8a4c4d4c79 100755
--- a/tools/deploy.sh
+++ b/tools/deploy.sh
@@ -29,6 +29,7 @@ cp -r sound/chatter/* $1/sound/chatter/
cp -r sound/voice/complionator/* $1/sound/voice/complionator/
cp -r sound/instruments/* $1/sound/instruments/
cp -r strings/* $1/strings/
+cp *byond-extools.* $1/ || true
#remove .dm files from _maps