diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm
index bedbf0239c7..bac17c5a2ad 100644
--- a/_maps/map_files/Delta/delta.dmm
+++ b/_maps/map_files/Delta/delta.dmm
@@ -21229,10 +21229,8 @@
tag = ""
},
/obj/machinery/igniter{
- icon_state = "igniter0";
id = "Incinerator";
- luminosity = 2;
- on = 0
+ luminosity = 2
},
/turf/simulated/floor/engine,
/area/maintenance/incinerator)
diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 937d3acfa47..63c912e11d7 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -73649,10 +73649,8 @@
/area/medical/reception)
"cuQ" = (
/obj/machinery/igniter{
- icon_state = "igniter0";
id = "Turbine_igniter";
- luminosity = 2;
- on = 0
+ luminosity = 2
},
/obj/structure/cable{
d1 = 1;
diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm
index 199577ece74..bed554f54f2 100644
--- a/_maps/map_files/MetaStation/z2.dmm
+++ b/_maps/map_files/MetaStation/z2.dmm
@@ -1498,7 +1498,7 @@
/turf/unsimulated/wall,
/area/tdome/arena_source)
"eb" = (
-/obj/machinery/igniter,
+/obj/machinery/igniter/on,
/turf/simulated/floor/plasteel,
/area/tdome/arena_source)
"ec" = (
@@ -5805,7 +5805,7 @@
/turf/unsimulated/wall,
/area/tdome/arena)
"qu" = (
-/obj/machinery/igniter,
+/obj/machinery/igniter/on,
/turf/simulated/floor/plasteel,
/area/tdome/arena)
"qv" = (
@@ -6351,6 +6351,10 @@
/obj/structure/bed/abductor,
/turf/unsimulated/floor/abductor,
/area/abductor_ship)
+"Ur" = (
+/obj/machinery/poolcontroller/invisible,
+/turf/unsimulated/beach/water,
+/area/centcom/holding)
(1,1,1) = {"
aa
@@ -35864,7 +35868,7 @@ tv
tu
tu
tQ
-tU
+Ur
th
ab
ab
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
index 454b5e4fb6b..e6fda6f503a 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
@@ -24,9 +24,6 @@
"af" = (
/obj/structure/table,
/obj/item/clothing/mask/gas,
-/obj/machinery/light/small{
- dir = 1
- },
/obj/item/clothing/glasses/sunglasses/big,
/obj/item/clothing/glasses/sunglasses/big,
/obj/item/clothing/glasses/sunglasses/big,
@@ -34,6 +31,9 @@
/area/ruin/powered/beach)
"ag" = (
/obj/structure/reagent_dispensers/fueltank,
+/obj/machinery/light/small{
+ dir = 1
+ },
/turf/simulated/floor/plating,
/area/ruin/powered/beach)
"ah" = (
@@ -198,8 +198,8 @@
/turf/simulated/floor/beach/sand,
/area/ruin/powered/beach)
"aL" = (
-/obj/machinery/vending/cigarette,
/obj/effect/turf_decal/sand,
+/obj/machinery/vending/cigarette/beach,
/turf/simulated/floor/plasteel,
/area/ruin/powered/beach)
"aM" = (
@@ -438,6 +438,10 @@
/obj/item/storage/backpack/duffel,
/turf/simulated/floor/beach/sand,
/area/ruin/powered/beach)
+"bL" = (
+/obj/machinery/poolcontroller/invisible,
+/turf/simulated/floor/beach/water,
+/area/ruin/powered/beach)
"bM" = (
/turf/simulated/floor/plasteel/stairs/old,
/area/ruin/powered/beach)
@@ -477,12 +481,6 @@
"bW" = (
/turf/simulated/wall/r_wall,
/area/ruin/powered/beach)
-"cd" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/simulated/wall/mineral/sandstone,
-/area/ruin/powered/beach)
"cs" = (
/obj/effect/overlay/palmtree_l,
/obj/machinery/light{
@@ -567,6 +565,14 @@
},
/turf/simulated/floor/pod,
/area/ruin/powered/beach)
+"Ei" = (
+/obj/effect/turf_decal/sand,
+/obj/machinery/light/small{
+ light_power = 3;
+ dir = 8
+ },
+/turf/simulated/floor/plating,
+/area/ruin/powered/beach)
"Gc" = (
/turf/simulated/floor/pod/light,
/area/ruin/powered/beach)
@@ -1054,7 +1060,7 @@ aa
(15,1,1) = {"
aa
bW
-cd
+aj
aj
aj
aF
@@ -1087,7 +1093,7 @@ aa
aa
bW
ak
-ar
+Ei
aj
aE
aC
@@ -1335,7 +1341,7 @@ bU
bU
bU
bU
-bU
+bL
bW
aa
"}
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
index 451e6b84aa0..5822d05aa8a 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
@@ -120,10 +120,10 @@
/area/ruin/powered/animal_hospital)
"aq" = (
/obj/structure/table,
-/obj/item/cautery{
- pixel_x = 4
- },
/obj/item/surgicaldrill,
+/obj/item/bonegel,
+/obj/item/bonesetter,
+/obj/item/FixOVein,
/turf/simulated/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
"ar" = (
@@ -243,6 +243,9 @@
/obj/structure/table,
/obj/item/retractor,
/obj/item/hemostat,
+/obj/item/cautery{
+ pixel_x = 4
+ },
/turf/simulated/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
"aE" = (
@@ -480,15 +483,13 @@
/turf/simulated/floor/plasteel,
/area/ruin/powered/animal_hospital)
"bm" = (
-/obj/structure/chair/comfy/teal{
- dir = 8
- },
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue{
dir = 4
},
+/obj/machinery/vending/crittercare,
/turf/simulated/floor/plasteel,
/area/ruin/powered/animal_hospital)
"bn" = (
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index f102bf55c8f..66d5f5fce80 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -280,7 +280,7 @@
dir = 8
},
/obj/machinery/iv_drip,
-/obj/item/reagent_containers/food/drinks/waterbottle/large,
+/obj/item/reagent_containers/glass/beaker/waterbottle/large,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"aR" = (
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
index 0128135c6b0..74aa1875f96 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
@@ -179,6 +179,10 @@
/obj/effect/baseturf_helper,
/turf/simulated/floor/plating,
/area/ruin/powered)
+"X" = (
+/obj/item/flashlight/lantern,
+/turf/simulated/floor/plating/asteroid/basalt,
+/area/ruin/powered)
(1,1,1) = {"
a
@@ -383,7 +387,7 @@ b
b
f
k
-f
+X
b
b
b
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
index be387f22047..b097156d39a 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
@@ -11,6 +11,7 @@
id_tag = "seed_vault_inner";
locked = 1
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
"d" = (
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
index 2358e040146..13850af5db7 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
@@ -682,15 +682,8 @@
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bf" = (
/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/igniter{
- id = "syndicate_base_incinerator"
- },
-/turf/simulated/floor/engine/vacuum,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
-"bg" = (
-/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
icon_state = "1-2"
},
/obj/machinery/door/airlock/glass{
@@ -708,31 +701,35 @@
pixel_y = 0;
req_access_txt = "150"
},
-/turf/simulated/floor/engine,
+/turf/simulated/floor/engine/insulated,
/area/ruin/unpowered/syndicate_lava_base/engineering)
-"bh" = (
+"bg" = (
/obj/machinery/light/small{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
+/turf/simulated/floor/engine/insulated,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
+"bh" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
},
-/turf/simulated/floor/engine,
+/turf/simulated/floor/engine/insulated,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bi" = (
/obj/machinery/light/small{
dir = 4
},
-/obj/machinery/atmospherics/binary/pump/on{
- target_pressure = 4500
+/obj/machinery/atmospherics/binary/pump{
+ name = "Incinerator Input"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 8
- },
-/turf/simulated/floor/engine,
+/turf/simulated/floor/engine/insulated,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bj" = (
/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
icon_state = "1-2"
},
/obj/machinery/door/airlock/glass{
@@ -750,7 +747,7 @@
pixel_y = 0;
req_access_txt = "150"
},
-/turf/simulated/floor/engine,
+/turf/simulated/floor/engine/insulated,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bk" = (
/obj/structure/rack,
@@ -766,7 +763,7 @@
/obj/effect/turf_decal/tile/brown{
dir = 4
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 8;
pixel_x = -26
},
@@ -1006,7 +1003,7 @@
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bG" = (
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold4w/visible/supply,
+/obj/machinery/atmospherics/pipe/manifold/visible/supply,
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bH" = (
@@ -1051,27 +1048,25 @@
"bM" = (
/obj/effect/turf_decal/stripes/corner,
/obj/machinery/light/small,
-/obj/structure/reagent_dispensers/fueltank,
/obj/effect/decal/cleanable/dirt,
-/obj/item/clothing/head/welding,
-/obj/item/weldingtool/largetank,
-/obj/machinery/atmospherics/pipe/simple/visible/supply,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/visible/yellow{
- dir = 4;
- level = 2
+/obj/machinery/atmospherics/binary/pump{
+ dir = 8;
+ name = "Plasma to Incinerator"
},
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bN" = (
/obj/effect/turf_decal/stripes/line,
-/obj/structure/reagent_dispensers/watertank,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/visible/yellow{
dir = 10;
level = 2
},
+/obj/structure/reagent_dispensers/fueltank,
+/obj/item/clothing/head/welding,
+/obj/item/weldingtool/largetank,
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bO" = (
@@ -1090,8 +1085,8 @@
pixel_x = -6;
pixel_y = -25;
req_access_txt = "150";
- tag_exterior_door = "syndicate_incinerator_exterior";
- tag_interior_door = "syndicate_incinerator_interior"
+ tag_exterior_door = "syndicate_base_incinerator_exterior";
+ tag_interior_door = "syndicate_base_incinerator_interior"
},
/obj/machinery/atmospherics/pipe/simple/visible/yellow,
/turf/simulated/floor/plasteel,
@@ -1103,8 +1098,7 @@
/turf/simulated/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bQ" = (
-/obj/machinery/atmospherics/pipe/simple/visible/yellow,
-/turf/simulated/wall/mineral/plastitanium/nodiagonal,
+/turf/simulated/floor/engine/insulated,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bR" = (
/obj/machinery/optable,
@@ -1273,7 +1267,7 @@
"ch" = (
/obj/machinery/air_sensor{
frequency = 1442;
- id_tag = "Syndicate_Construction_o2_sensor"
+ id_tag = "syndie_lavaland_o2_sensor"
},
/turf/simulated/floor/engine{
name = "o2 floor";
@@ -1360,6 +1354,60 @@
toxins = 70000
},
/area/ruin/unpowered/syndicate_lava_base/engineering)
+"cp" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/igniter{
+ id = "syndicate_base_incinerator"
+ },
+/turf/simulated/floor/engine/insulated,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
+"cq" = (
+/obj/machinery/atmospherics/unary/outlet_injector/on{
+ dir = 1;
+ id = "syndie_lavaland_inc_in"
+ },
+/obj/structure/sign/vacuum/external{
+ pixel_y = -32
+ },
+/turf/simulated/floor/engine/insulated,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
+"cr" = (
+/obj/machinery/door/poddoor{
+ id_tag = "lavalandsyndi_incineratorinput"
+ },
+/turf/simulated/floor/engine/insulated,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
+"cs" = (
+/obj/structure/cable,
+/obj/structure/cable{
+ d2 = 2;
+ icon_state = "0-2"
+ },
+/obj/machinery/power/compressor{
+ comp_id = "syndie_lavaland_incineratorturbine";
+ dir = 1;
+ luminosity = 2
+ },
+/turf/simulated/floor/engine/insulated,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
+"ct" = (
+/obj/structure/cable,
+/obj/machinery/power/turbine{
+ dir = 2;
+ luminosity = 2
+ },
+/turf/simulated/floor/engine/insulated,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
+"cu" = (
+/obj/machinery/door/poddoor{
+ id_tag = "lavalandsyndi_incineratoroutput"
+ },
+/turf/simulated/floor/engine/insulated,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
"cA" = (
/obj/structure/table/reinforced,
/obj/item/clothing/glasses/science,
@@ -1635,7 +1683,7 @@
/turf/simulated/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/testlab)
"dT" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 8;
pixel_x = -26
},
@@ -1948,7 +1996,7 @@
/obj/machinery/light/small{
dir = 8
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 8;
pixel_x = -26
},
@@ -2153,7 +2201,7 @@
/turf/simulated/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/testlab)
"eM" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 1;
pixel_y = -24
},
@@ -2465,7 +2513,7 @@
/obj/item/clothing/glasses/hud/health,
/obj/structure/disposalpipe/segment,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 4;
pixel_x = 26
},
@@ -2619,21 +2667,21 @@
"ft" = (
/obj/effect/turf_decal/box/white/corners,
/obj/structure/closet/crate,
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
+/obj/item/reagent_containers/glass/beaker/waterbottle/large{
pixel_x = -3;
pixel_y = 3
},
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
+/obj/item/reagent_containers/glass/beaker/waterbottle/large{
pixel_x = -3;
pixel_y = 3
},
-/obj/item/reagent_containers/food/drinks/waterbottle/large,
-/obj/item/reagent_containers/food/drinks/waterbottle/large,
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
+/obj/item/reagent_containers/glass/beaker/waterbottle/large,
+/obj/item/reagent_containers/glass/beaker/waterbottle/large,
+/obj/item/reagent_containers/glass/beaker/waterbottle/large{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
+/obj/item/reagent_containers/glass/beaker/waterbottle/large{
pixel_x = 3;
pixel_y = -3
},
@@ -2870,12 +2918,6 @@
"gj" = (
/turf/simulated/wall/mineral/plastitanium/explosive,
/area/ruin/unpowered/syndicate_lava_base/virology)
-"gn" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 6
- },
-/turf/simulated/wall/mineral/plastitanium/nodiagonal,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
"gp" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 5
@@ -3556,12 +3598,12 @@
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/cargo)
"hV" = (
-/obj/structure/filingcabinet/chestdrawer,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
dir = 8
},
+/obj/machinery/autolathe,
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/cargo)
"hW" = (
@@ -3571,7 +3613,7 @@
/turf/simulated/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/main)
"hZ" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 8;
pixel_x = -26
},
@@ -3879,7 +3921,7 @@
/obj/machinery/light/small{
dir = 1
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 2;
pixel_y = 24
},
@@ -3916,7 +3958,7 @@
/turf/simulated/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"iG" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 8;
pixel_x = -26
},
@@ -3941,7 +3983,8 @@
"iI" = (
/obj/machinery/door/airlock/vault{
id_tag = "syndie_lavaland_vault";
- req_access_txt = "150"
+ req_access_txt = "150";
+ locked = 1
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -4392,6 +4435,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/structure/reagent_dispensers/watertank,
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/main)
"ju" = (
@@ -4574,7 +4618,8 @@
"jK" = (
/obj/machinery/atmospherics/unary/outlet_injector/on{
dir = 8;
- volume_rate = 200
+ volume_rate = 200;
+ id = "syndie_lavaland_waste"
},
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/syndicate_lava_base/engineering)
@@ -4939,7 +4984,6 @@
dir = 8;
pixel_x = 24
},
-/obj/machinery/vending/coffee,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -4951,6 +4995,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/vending/coffee/free,
/turf/simulated/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/bar)
"kr" = (
@@ -5016,9 +5061,6 @@
icon_state = "2-4"
},
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
/turf/simulated/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"ky" = (
@@ -5036,9 +5078,6 @@
icon_state = "4-8"
},
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
/turf/simulated/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"kz" = (
@@ -5053,8 +5092,10 @@
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/visible/supply,
-/obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{
+ dir = 8
+ },
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"kB" = (
@@ -5153,13 +5194,13 @@
/turf/simulated/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/bar)
"kM" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 4;
pixel_x = 26
},
-/obj/machinery/vending/cigarette,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/vending/cigarette/syndicate/free,
/turf/simulated/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/bar)
"kN" = (
@@ -5211,12 +5252,6 @@
/obj/structure/sign/redcross,
/turf/simulated/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/medbay)
-"kU" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 1
- },
-/turf/simulated/wall/mineral/plastitanium/explosive,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
"kV" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -5246,7 +5281,7 @@
/obj/structure/chair{
dir = 1
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 8;
pixel_x = -26
},
@@ -5344,9 +5379,16 @@
dir = 1
},
/obj/structure/table,
-/obj/item/storage/firstaid/fire,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
+/obj/item/storage/box/masks{
+ pixel_x = -2;
+ pixel_y = -2
+ },
+/obj/item/storage/box/gloves{
+ pixel_x = 5;
+ pixel_y = 5
+ },
/turf/simulated/floor/plasteel/white/side{
dir = 5
},
@@ -5359,6 +5401,7 @@
dir = 1
},
/obj/structure/cable{
+ d2 = 4;
icon_state = "0-4"
},
/obj/effect/decal/cleanable/dirt,
@@ -5372,9 +5415,12 @@
dir = 1
},
/obj/structure/cable{
+ d2 = 2;
icon_state = "0-2"
},
/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
icon_state = "2-8"
},
/turf/simulated/floor/plating,
@@ -5486,8 +5532,15 @@
/area/ruin/unpowered/syndicate_lava_base/medbay)
"lK" = (
/obj/structure/table,
-/obj/item/storage/firstaid/regular,
+/obj/item/storage/firstaid/regular{
+ pixel_x = -4;
+ pixel_y = -4
+ },
/obj/effect/decal/cleanable/dirt,
+/obj/item/storage/firstaid/fire{
+ pixel_x = 4;
+ pixel_y = 4
+ },
/turf/simulated/floor/plasteel/white/side{
dir = 4
},
@@ -5518,6 +5571,8 @@
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lM" = (
/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
icon_state = "1-2"
},
/obj/machinery/atmospherics/unary/vent_scrubber/on{
@@ -5708,7 +5763,7 @@
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/medbay)
"mg" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 8;
pixel_x = -26
},
@@ -5716,26 +5771,26 @@
/obj/machinery/cell_charger,
/obj/item/stock_parts/cell/high/plus,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/pipedispenser{
- pixel_y = 12
- },
/obj/effect/decal/cleanable/dirt,
+/obj/item/rpd{
+ pixel_y = 3
+ },
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"mh" = (
/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
icon_state = "1-2"
},
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"mj" = (
-/obj/machinery/atmospherics/binary/pump/on{
- dir = 8;
- name = "O2 to Incinerator";
- target_pressure = 4500
- },
-/obj/machinery/atmospherics/pipe/simple/visible/supply,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/binary/pump{
+ dir = 8;
+ name = "O2 to Incinerator"
+ },
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"mn" = (
@@ -5816,7 +5871,7 @@
/obj/structure/bed/roller,
/obj/machinery/iv_drip,
/obj/item/reagent_containers/iv_bag/blood/OMinus,
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 8;
pixel_x = -26
},
@@ -5870,6 +5925,8 @@
/area/ruin/unpowered/syndicate_lava_base/engineering)
"mG" = (
/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
icon_state = "1-2"
},
/obj/effect/decal/cleanable/dirt,
@@ -5975,12 +6032,18 @@
id = "syndie_lavaland_incineratorturbine"
},
/obj/machinery/door_control{
- pixel_x = 6;
- pixel_y = -24
+ id = "lavalandsyndi_incineratoroutput";
+ name = "Incinerator Output Blast Door Control";
+ pixel_x = -6;
+ pixel_y = -24;
+ req_access_txt = "150"
},
/obj/machinery/door_control{
- pixel_x = -6;
- pixel_y = -24
+ id = "lavalandsyndi_incineratorinput";
+ name = "Incinerator Input Blast Door Control";
+ pixel_x = 6;
+ pixel_y = -24;
+ req_access_txt = "150"
},
/obj/effect/turf_decal/stripes/line,
/obj/effect/decal/cleanable/dirt,
@@ -5989,6 +6052,8 @@
/area/ruin/unpowered/syndicate_lava_base/engineering)
"nd" = (
/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
icon_state = "1-2"
},
/obj/effect/turf_decal/stripes/line,
@@ -5997,7 +6062,7 @@
/area/ruin/unpowered/syndicate_lava_base/engineering)
"nf" = (
/obj/structure/sign/fire,
-/turf/simulated/wall/mineral/plastitanium/nodiagonal,
+/turf/simulated/wall/mineral/plastitanium/coated,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"nh" = (
/obj/machinery/telecomms/relay/preset/ruskie{
@@ -6309,8 +6374,10 @@
"nB" = (
/obj/structure/table/reinforced,
/obj/item/surgicaldrill,
-/obj/item/cautery,
/obj/effect/decal/cleanable/dirt,
+/obj/item/bonegel,
+/obj/item/bonesetter,
+/obj/item/FixOVein,
/turf/simulated/floor/plasteel/white/side,
/area/ruin/unpowered/syndicate_lava_base/medbay)
"nC" = (
@@ -6318,6 +6385,7 @@
/obj/item/retractor,
/obj/item/hemostat,
/obj/effect/decal/cleanable/dirt,
+/obj/item/cautery,
/turf/simulated/floor/plasteel/white/side{
dir = 6
},
@@ -6478,7 +6546,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 2;
pixel_y = 24
},
@@ -6580,17 +6648,8 @@
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel/white/side,
/area/ruin/unpowered/syndicate_lava_base/medbay)
-"oe" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume{
- dir = 8
- },
-/turf/simulated/floor/engine,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
"oh" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/syndicate{
dir = 8;
pixel_x = -26
},
@@ -6730,47 +6789,10 @@
},
/turf/simulated/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/arrivals)
-"oz" = (
-/turf/simulated/floor/engine/vacuum,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
-"oB" = (
-/obj/machinery/atmospherics/unary/outlet_injector{
- dir = 1;
- id = "syndie_lavaland_inc_in"
- },
-/obj/structure/sign/vacuum/external{
- pixel_y = -32
- },
-/turf/simulated/floor/engine/vacuum,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
-"oE" = (
-/obj/structure/cable,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/power/compressor{
- comp_id = "syndie_lavaland_incineratorturbine";
- dir = 1;
- luminosity = 2
- },
-/turf/simulated/floor/engine/vacuum,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
"oF" = (
/obj/structure/sign/securearea,
/turf/simulated/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/arrivals)
-"oG" = (
-/obj/structure/cable,
-/obj/machinery/power/turbine{
- dir = 2;
- luminosity = 2
- },
-/turf/simulated/floor/engine/vacuum,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
-"oH" = (
-/obj/machinery/door/poddoor,
-/turf/simulated/floor/engine/vacuum,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
"oP" = (
/obj/structure/sign/chemistry,
/turf/simulated/wall/mineral/plastitanium/nodiagonal,
@@ -6787,21 +6809,21 @@
},
/turf/simulated/floor/engine,
/area/ruin/unpowered/syndicate_lava_base/testlab)
-"tW" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/wall/mineral/plastitanium/nodiagonal,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
-"uB" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 5
- },
-/turf/simulated/wall/mineral/plastitanium/nodiagonal,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
"vu" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/engine,
/area/ruin/unpowered/syndicate_lava_base/testlab)
+"yd" = (
+/obj/machinery/atmospherics/pipe/simple/visible/yellow,
+/turf/simulated/wall/mineral/plastitanium/coated,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
+"yU" = (
+/turf/simulated/wall/mineral/plastitanium/explosive,
+/area/ruin/unpowered/syndicate_lava_base/chemistry)
+"Au" = (
+/turf/simulated/wall/mineral/plastitanium/explosive,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
"BF" = (
/obj/structure/grille,
/obj/structure/window/plastitanium,
@@ -6838,12 +6860,6 @@
},
/turf/simulated/floor/engine,
/area/ruin/unpowered/syndicate_lava_base/testlab)
-"IJ" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 1
- },
-/turf/simulated/wall/mineral/plastitanium/nodiagonal,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
"Lg" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 4
@@ -6855,15 +6871,11 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/engine,
/area/ruin/unpowered/syndicate_lava_base/testlab)
-"RE" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 9
- },
-/turf/simulated/wall/mineral/plastitanium/nodiagonal,
+"RI" = (
+/turf/simulated/wall/mineral/plastitanium/coated,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"RV" = (
/obj/structure/sign/fire,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"Tp" = (
@@ -7120,7 +7132,7 @@ ab
ab
ab
mn
-mn
+mo
mM
nh
mM
@@ -7199,7 +7211,7 @@ ab
ab
ab
eh
-eh
+gj
eh
eh
eh
@@ -7499,7 +7511,7 @@ ab
ab
ab
eh
-eh
+gj
eI
eI
gt
@@ -7671,7 +7683,7 @@ lf
bw
jy
jy
-jy
+jP
np
aH
mT
@@ -7741,7 +7753,7 @@ ab
ab
ab
ae
-ae
+aL
aq
aq
qG
@@ -8255,7 +8267,7 @@ fH
gG
he
hA
-hz
+hO
id
im
bX
@@ -8350,7 +8362,7 @@ dI
dZ
ew
as
-as
+yU
as
gJ
hh
@@ -8615,18 +8627,18 @@ jt
jF
jT
ju
-gn
-IJ
-IJ
-IJ
-kU
-IJ
-IJ
-IJ
-uB
ju
ju
ju
+ju
+Au
+ju
+ju
+RI
+RI
+RI
+RI
+RI
ab
ab
ab
@@ -8672,12 +8684,12 @@ lL
mg
mF
nc
-ju
-bh
-ju
-oz
-ju
-ju
+RI
+bg
+RI
+bQ
+RI
+RI
nf
ab
ab
@@ -8722,13 +8734,13 @@ lM
mh
mG
nd
-bg
-oe
-bj
bf
-oE
-oG
-oH
+bh
+bj
+cp
+cs
+ct
+cu
ab
ab
ab
@@ -8772,12 +8784,12 @@ bF
ca
bL
bO
-bQ
+yd
bi
-bQ
-oB
-ju
-ju
+yd
+cq
+RI
+RI
nf
ab
ab
@@ -8822,10 +8834,10 @@ bG
mj
bM
RV
-tW
-RE
-ju
-oH
+RI
+RI
+RI
+cr
nf
ab
ab
@@ -8847,7 +8859,7 @@ ab
ab
ab
dy
-dy
+dP
eE
fe
dy
@@ -8874,7 +8886,7 @@ bN
bP
cl
cn
-ju
+RI
ab
ab
ab
@@ -8924,7 +8936,7 @@ mK
kD
cm
co
-ju
+RI
ab
ab
ab
@@ -8967,14 +8979,14 @@ ab
ju
kD
bB
-ju
+Au
kD
bB
ju
ju
ju
ju
-ju
+RI
ab
ab
ab
diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm
index 5dd4050d567..24f93b0a6ce 100644
--- a/_maps/map_files/RandomZLevels/academy.dmm
+++ b/_maps/map_files/RandomZLevels/academy.dmm
@@ -1365,7 +1365,7 @@
/turf/simulated/floor/plasteel,
/area/awaymission/academy/classrooms)
"dZ" = (
-/obj/machinery/igniter,
+/obj/machinery/igniter/on,
/turf/simulated/floor/plating,
/area/awaymission/academy/classrooms)
"ea" = (
@@ -3718,7 +3718,7 @@
/turf/space,
/area/space/nearstation)
"jz" = (
-/obj/machinery/igniter,
+/obj/machinery/igniter/on,
/turf/simulated/floor/plating,
/area/awaymission/academy/academyaft)
"jA" = (
diff --git a/_maps/map_files/RandomZLevels/beach.dmm b/_maps/map_files/RandomZLevels/beach.dmm
index 76a7da40fb1..4544e3830d8 100644
--- a/_maps/map_files/RandomZLevels/beach.dmm
+++ b/_maps/map_files/RandomZLevels/beach.dmm
@@ -6,7 +6,7 @@
/turf/unsimulated/beach/water/deep,
/area/awaymission/undersea)
"ac" = (
-/obj/machinery/poolcontroller/seacontroller,
+/obj/machinery/poolcontroller/invisible/sea,
/turf/unsimulated/beach/water/deep,
/area/awaymission/undersea)
"ad" = (
@@ -1494,6 +1494,10 @@
/obj/structure/closet/crate,
/turf/unsimulated/beach/sand,
/area/awaymission/beach)
+"LZ" = (
+/obj/machinery/poolcontroller/invisible,
+/turf/unsimulated/beach/water/deep,
+/area/awaymission/beach)
(1,1,1) = {"
aa
@@ -15371,7 +15375,7 @@ du
du
du
du
-du
+LZ
"}
(55,1,1) = {"
aa
diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm
index 8ef264193c7..98288fe54da 100644
--- a/_maps/map_files/RandomZLevels/centcomAway.dmm
+++ b/_maps/map_files/RandomZLevels/centcomAway.dmm
@@ -5193,7 +5193,7 @@
},
/area/awaymission/centcomAway/general)
"mE" = (
-/obj/machinery/igniter,
+/obj/machinery/igniter/on,
/turf/simulated/floor/plasteel{
icon_state = "floor"
},
diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm
index 3c62113aa0b..3d8d1868c2c 100644
--- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm
@@ -3608,7 +3608,7 @@
name = "MO19 Research"
})
"fj" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 2;
pixel_y = 24
},
@@ -5104,7 +5104,7 @@
pixel_y = 0;
tag = ""
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 4;
pixel_x = 28
},
@@ -5267,7 +5267,7 @@
pixel_x = -4;
pixel_y = 2
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 2;
pixel_y = 24
},
@@ -5413,7 +5413,7 @@
pixel_x = 0;
pixel_y = 0
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 4;
pixel_x = 28
},
@@ -6594,7 +6594,7 @@
name = "MO19 Arrivals"
})
"jp" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 4;
pixel_x = 24
},
@@ -7560,7 +7560,7 @@
name = "MO19 Arrivals"
})
"kK" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 1;
pixel_y = -24
},
@@ -8028,7 +8028,7 @@
name = "MO19 Arrivals"
})
"lt" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 4;
pixel_x = 24
},
@@ -8649,7 +8649,7 @@
name = "MO19 Arrivals"
})
"mw" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 4;
pixel_x = 24
},
@@ -8898,7 +8898,7 @@
name = "MO19 Arrivals"
})
"mS" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 4;
pixel_x = 24
},
diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm
index b9232daea52..541156ddc57 100644
--- a/_maps/map_files/RandomZLevels/spacehotel.dmm
+++ b/_maps/map_files/RandomZLevels/spacehotel.dmm
@@ -859,9 +859,6 @@
},
/turf/unsimulated/beach/sand,
/area/awaymission/beach)
-"bD" = (
-/turf/simulated/floor/plating/lava/smooth,
-/area/awaymission)
"bE" = (
/obj/effect/decal{
name = "rock";
@@ -1619,7 +1616,7 @@
requires_power = 0
})
"cR" = (
-/obj/machinery/poolcontroller/seacontroller,
+/obj/machinery/poolcontroller/invisible/sea,
/turf/unsimulated/wall/metal,
/area/awaymission/undersea{
requires_power = 0
@@ -2062,12 +2059,6 @@
},
/turf/unsimulated/beach/water/drop/dense,
/area/awaymission/beach)
-"dH" = (
-/turf/simulated/floor/plating/lava/smooth,
-/area/awaymission{
- name = "Snowland";
- requires_power = 0
- })
"dI" = (
/obj/machinery/light,
/turf/unsimulated/beach/water/deep/wood_floor{
@@ -4814,6 +4805,15 @@
icon_state = "cult"
},
/area/awaymission/spacehotel)
+"VG" = (
+/obj/effect/decal{
+ name = "rock";
+ icon = 'icons/turf/mining.dmi';
+ icon_state = "rock_side_w"
+ },
+/obj/machinery/poolcontroller/invisible,
+/turf/unsimulated/beach/water/deep/dense,
+/area/awaymission/beach)
(1,1,1) = {"
aa
@@ -4842,15 +4842,15 @@ aa
dw
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -4972,15 +4972,15 @@ aa
dw
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -5102,15 +5102,15 @@ aa
dw
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -5232,15 +5232,15 @@ aa
dx
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -5363,14 +5363,14 @@ aa
dw
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -5493,14 +5493,14 @@ aa
dw
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -5623,14 +5623,14 @@ aa
dw
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -5753,14 +5753,14 @@ dy
dk
dk
dF
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -5883,14 +5883,14 @@ dw
dk
dk
dF
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -6013,14 +6013,14 @@ dk
dk
dF
dF
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -6143,14 +6143,14 @@ dk
dF
dF
dF
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -6273,14 +6273,14 @@ dk
dF
dF
dF
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -6403,14 +6403,14 @@ dk
dk
dF
dF
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -6533,14 +6533,14 @@ dw
dk
dk
dF
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -6663,14 +6663,14 @@ dw
dk
dk
dF
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -6793,14 +6793,14 @@ dw
dk
dk
dF
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -6923,14 +6923,14 @@ dx
dk
dk
dF
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -7053,14 +7053,14 @@ aa
dw
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -7183,14 +7183,14 @@ aa
dw
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -7313,14 +7313,14 @@ aa
dw
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -7443,14 +7443,14 @@ aa
dw
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -7573,14 +7573,14 @@ aa
dw
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -7703,14 +7703,14 @@ aa
dw
dk
dk
-dH
-dH
-dH
-dH
-dH
-dH
-dH
-dH
+dF
+dF
+dF
+dF
+dF
+dF
+dF
+dF
ah
ah
ah
@@ -10564,7 +10564,7 @@ dC
dG
dB
dB
-dB
+VG
ah
ah
ah
@@ -13274,24 +13274,24 @@ ad
ad
ad
ad
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
ad
ad
ad
@@ -13404,24 +13404,24 @@ ad
ad
ad
ad
-bD
-bD
-bD
+ad
+ad
+ad
bL
cq
cq
cE
cO
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
ad
ad
ad
@@ -13534,8 +13534,8 @@ ad
ad
ad
ad
-bD
-bD
+ad
+ad
bL
bV
bV
@@ -13544,14 +13544,14 @@ bV
cq
cE
cO
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
ad
ad
ad
@@ -13664,7 +13664,7 @@ ad
ad
ad
ad
-bD
+ad
bL
bV
bV
@@ -13674,14 +13674,14 @@ bV
bV
cV
cO
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
ad
ad
ad
@@ -13794,7 +13794,7 @@ ad
ad
ad
ad
-bD
+ad
bM
bV
cf
@@ -13805,15 +13805,15 @@ cf
bV
cE
cO
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
ad
ad
ad
@@ -13924,7 +13924,7 @@ ad
ad
ad
ad
-bD
+ad
bM
bV
bV
@@ -13935,15 +13935,15 @@ bV
bV
cV
cO
-bD
+ad
bL
dd
dd
cE
cO
-bD
-bD
-bD
+ad
+ad
+ad
dJ
dL
cO
@@ -14054,7 +14054,7 @@ ad
ad
ad
ad
-bD
+ad
bN
bV
bV
@@ -14068,7 +14068,7 @@ dd
dd
cP
cO
-bD
+ad
dE
cO
bL
@@ -14184,8 +14184,8 @@ ad
ad
ad
ad
-bD
-bD
+ad
+ad
bM
bV
bV
@@ -14195,15 +14195,15 @@ bV
bV
cV
cO
-bD
-bD
-bD
-bD
+ad
+ad
+ad
+ad
bN
dd
cP
cO
-bD
+ad
dJ
dN
cO
@@ -14314,8 +14314,8 @@ ad
ad
ad
ad
-bD
-bD
+ad
+ad
bM
cf
bV
@@ -14325,15 +14325,15 @@ cf
bV
cP
cO
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
ad
ad
ad
@@ -14444,8 +14444,8 @@ ad
ad
ad
ad
-bD
-bD
+ad
+ad
bM
bV
bV
@@ -14454,16 +14454,16 @@ bV
bV
cV
cO
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
ad
ad
ad
@@ -14574,8 +14574,8 @@ ad
ad
ad
ad
-bD
-bD
+ad
+ad
bN
cg
cg
@@ -14584,16 +14584,16 @@ bV
bV
cP
cO
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
ad
ad
ad
@@ -14704,26 +14704,26 @@ ad
ad
ad
ad
-bD
-bD
-bD
-bD
-bD
+ad
+ad
+ad
+ad
+ad
bN
cg
cP
cO
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
ad
ad
ad
@@ -14834,26 +14834,26 @@ ad
ad
ad
ad
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
-bD
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
ad
ad
ad
diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
index 8f9f3746ea8..c5741039f2b 100644
--- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
+++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
@@ -812,7 +812,7 @@
name = "UO45 Central Hall"
})
"by" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 4;
pixel_x = 24
},
@@ -1841,7 +1841,7 @@
name = "UO45 Central Hall"
})
"do" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 2;
pixel_x = 0;
pixel_y = 24
@@ -2133,7 +2133,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 2;
pixel_x = 0;
pixel_y = 24
@@ -3590,7 +3590,7 @@
name = "UO45 Central Hall"
})
"fW" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 1;
pixel_x = 0;
pixel_y = -24
@@ -4205,7 +4205,7 @@
name = "UO45 Research"
})
"gZ" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 2;
pixel_x = 0;
pixel_y = 24
@@ -4314,7 +4314,7 @@
/obj/machinery/light/small{
dir = 8
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 8;
pixel_x = -24
},
@@ -5061,7 +5061,7 @@
name = "UO45 Crew Quarters"
})
"iq" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 8;
pixel_x = -24
},
@@ -5827,7 +5827,7 @@
name = "UO45 Crew Quarters"
})
"jw" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 8;
pixel_x = -24
},
@@ -6511,7 +6511,7 @@
initialize_directions = 11;
tag = "icon-manifold-r-f (EAST)"
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 4;
pixel_x = 24
},
@@ -7046,7 +7046,7 @@
name = "UO45 Crew Quarters"
})
"lg" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 1;
pixel_x = 0;
pixel_y = -24
@@ -7409,7 +7409,7 @@
pixel_x = 0;
tag = ""
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 1;
pixel_x = 0;
pixel_y = -24
@@ -7594,7 +7594,7 @@
icon_state = "pipe-j1";
tag = "icon-pipe-j1 (EAST)"
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 1;
pixel_x = 0;
pixel_y = -24
@@ -7668,7 +7668,7 @@
name = "UO45 Research"
})
"lN" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 1;
pixel_x = 0;
pixel_y = -24
@@ -8181,7 +8181,7 @@
})
"mz" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 8;
pixel_x = -24
},
@@ -8241,7 +8241,7 @@
name = "UO45 Gateway"
})
"mE" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 1;
pixel_x = 0;
pixel_y = -24
@@ -9938,7 +9938,7 @@
scrub_N2O = 0;
scrub_Toxins = 0
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 1;
pixel_x = 0;
pixel_y = -24
@@ -10347,7 +10347,7 @@
/obj/machinery/light/small{
dir = 8
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 8;
pixel_x = -24
},
@@ -10384,7 +10384,7 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 4;
pixel_x = 24
},
@@ -11386,7 +11386,7 @@
/obj/item/storage/toolbox/mechanical{
pixel_y = 5
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 2;
pixel_x = 0;
pixel_y = 24
@@ -11735,7 +11735,7 @@
name = "UO45 Engineering"
})
"rj" = (
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 2;
pixel_x = 0;
pixel_y = 24
@@ -12914,7 +12914,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 1;
pixel_x = 0;
pixel_y = -24
@@ -15179,7 +15179,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 1;
pixel_x = 0;
pixel_y = -24
@@ -16281,7 +16281,7 @@
})
"xp" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/firealarm{
+/obj/machinery/firealarm/no_alarm{
dir = 4;
pixel_x = 24
},
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 5ebe99b8b3f..2107bdd7500 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -17671,7 +17671,7 @@
/obj/item/reagent_containers/food/drinks/drinkingglass{
pixel_x = -5
},
-/obj/item/reagent_containers/food/drinks/waterbottle,
+/obj/item/reagent_containers/glass/beaker/waterbottle,
/turf/simulated/floor/plating,
/area/maintenance/fpmaint2)
"aDE" = (
@@ -18969,7 +18969,7 @@
/area/crew_quarters/courtroom)
"aGr" = (
/obj/structure/table/reinforced,
-/obj/item/reagent_containers/food/drinks/waterbottle,
+/obj/item/reagent_containers/glass/beaker/waterbottle,
/turf/simulated/floor/plasteel{
icon_state = "red";
dir = 4
@@ -20138,7 +20138,7 @@
/area/crew_quarters/courtroom)
"aIX" = (
/obj/structure/table/wood,
-/obj/item/reagent_containers/food/drinks/waterbottle{
+/obj/item/reagent_containers/glass/beaker/waterbottle{
pixel_x = 5
},
/obj/item/reagent_containers/food/drinks/drinkingglass{
@@ -22042,7 +22042,7 @@
/obj/item/reagent_containers/food/drinks/drinkingglass{
pixel_x = -5
},
-/obj/item/reagent_containers/food/drinks/waterbottle{
+/obj/item/reagent_containers/glass/beaker/waterbottle{
pixel_x = 5
},
/turf/simulated/floor/carpet,
@@ -22758,7 +22758,7 @@
/area/maintenance/fpmaint)
"aOw" = (
/obj/structure/table/wood,
-/obj/item/reagent_containers/food/drinks/waterbottle{
+/obj/item/reagent_containers/glass/beaker/waterbottle{
pixel_x = 5
},
/obj/item/reagent_containers/food/drinks/drinkingglass{
@@ -74238,9 +74238,7 @@
/area/toxins/test_area)
"cCw" = (
/obj/machinery/igniter{
- icon_state = "igniter0";
- id = "Incinerator";
- on = 0
+ id = "Incinerator"
},
/turf/simulated/floor/engine/insulated,
/area/maintenance/incinerator)
@@ -93941,9 +93939,7 @@
tag = ""
},
/obj/machinery/igniter{
- icon_state = "igniter0";
- id = "gasturbine";
- on = 0
+ id = "gasturbine"
},
/turf/simulated/floor/engine/insulated,
/area/maintenance/turbine)
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index dda71eb7e09..7a43bfc098b 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -3499,7 +3499,7 @@
/turf/unsimulated/wall,
/area/tdome/arena)
"jb" = (
-/obj/machinery/igniter,
+/obj/machinery/igniter/on,
/turf/simulated/floor/plasteel,
/area/tdome/arena)
"jc" = (
@@ -4426,7 +4426,7 @@
/turf/unsimulated/wall,
/area/tdome/arena_source)
"lD" = (
-/obj/machinery/igniter,
+/obj/machinery/igniter/on,
/turf/simulated/floor/plasteel,
/area/tdome/arena_source)
"lE" = (
@@ -12566,6 +12566,10 @@
/obj/effect/landmark/ai_multicam_room,
/turf/unsimulated/ai_visible,
/area/ai_multicam_room)
+"Qt" = (
+/obj/machinery/poolcontroller/invisible,
+/turf/unsimulated/beach/water,
+/area/ninja/holding)
"QE" = (
/obj/structure/chair/sofa/right,
/turf/simulated/shuttle/floor{
@@ -54450,7 +54454,7 @@ fI
fH
fH
he
-hv
+Qt
fg
aN
aN
diff --git a/_maps/map_files/generic/Lavaland.dmm b/_maps/map_files/generic/Lavaland.dmm
index 6f8f4195dfb..3bfdb1d12b2 100644
--- a/_maps/map_files/generic/Lavaland.dmm
+++ b/_maps/map_files/generic/Lavaland.dmm
@@ -112,8 +112,8 @@
"au" = (
/obj/structure/rack,
/obj/item/storage/bag/ore,
-/obj/item/pickaxe,
-/obj/item/flashlight,
+/obj/item/pickaxe/safety,
+/obj/item/flashlight/lantern,
/obj/item/clothing/glasses/meson,
/obj/item/mining_scanner,
/turf/simulated/floor/plasteel,
@@ -121,8 +121,8 @@
"av" = (
/obj/structure/rack,
/obj/item/storage/bag/ore,
-/obj/item/flashlight,
-/obj/item/pickaxe,
+/obj/item/flashlight/lantern,
+/obj/item/pickaxe/safety,
/obj/item/clothing/glasses/meson,
/obj/item/mining_scanner,
/turf/simulated/floor/plasteel,
@@ -628,6 +628,7 @@
/obj/effect/turf_decal/tile/brown{
dir = 4
},
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/simulated/floor/plasteel,
/area/mine/eva)
"bH" = (
@@ -898,6 +899,7 @@
opacity = 0;
req_access_txt = "54"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/eva)
"ck" = (
@@ -1376,14 +1378,14 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/simple/visible/cyan{
dir = 6
},
-/obj/machinery/meter,
/turf/simulated/floor/plating,
/area/mine/living_quarters)
"dq" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+/obj/machinery/atmospherics/pipe/manifold/visible/cyan{
dir = 1
},
/turf/simulated/floor/plating,
@@ -1581,7 +1583,7 @@
/turf/simulated/floor/plating,
/area/mine/living_quarters)
"dI" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+/obj/machinery/atmospherics/pipe/simple/visible/cyan{
dir = 5
},
/turf/simulated/floor/plating,
@@ -1657,10 +1659,7 @@
name = "Mining Station Maintenance";
req_access_txt = "48"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/visible/universal,
/turf/simulated/floor/plating,
/area/mine/living_quarters)
"dT" = (
@@ -1709,6 +1708,7 @@
opacity = 0;
req_access_txt = "54"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/eva)
"dZ" = (
@@ -2923,6 +2923,7 @@
name = "Labor Camp Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/laborcamp)
"gv" = (
@@ -2933,6 +2934,7 @@
opacity = 0;
req_one_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/production)
"gw" = (
@@ -2943,6 +2945,7 @@
opacity = 0;
req_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/production)
"gx" = (
@@ -2952,6 +2955,7 @@
locked = 1;
name = "Labor Camp External Access"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/laborcamp)
"gy" = (
@@ -3012,6 +3016,7 @@
locked = 1;
name = "Labor Camp External Access"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/laborcamp)
"gF" = (
diff --git a/_maps/map_files/generic/z5.dmm b/_maps/map_files/generic/z5.dmm
index 465bf0bdaa0..99e23f4c9d4 100644
--- a/_maps/map_files/generic/z5.dmm
+++ b/_maps/map_files/generic/z5.dmm
@@ -1612,21 +1612,11 @@
/obj/item/clothing/glasses/meson,
/obj/item/flashlight,
/obj/item/storage/bag/ore,
-/obj/item/shovel{
- attack_verb = list("ineffectively hit");
- desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon.";
- force = 1;
- name = "safety shovel";
- pixel_x = -5;
- throwforce = 1
+/obj/item/shovel/safety{
+ pixel_x = -5
},
-/obj/item/pickaxe{
- attack_verb = list("ineffectively hit");
- desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon.";
- force = 1;
- name = "safety pickaxe";
- pixel_x = 5;
- throwforce = 1
+/obj/item/pickaxe/safety{
+ pixel_x = 5
},
/obj/item/radio/intercom/locked/prison{
pixel_y = 25
@@ -1642,21 +1632,11 @@
/obj/item/clothing/glasses/meson,
/obj/item/flashlight,
/obj/item/storage/bag/ore,
-/obj/item/shovel{
- attack_verb = list("ineffectively hit");
- desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon.";
- force = 1;
- name = "safety shovel";
- pixel_x = -5;
- throwforce = 1
+/obj/item/shovel/safety{
+ pixel_x = -5
},
-/obj/item/pickaxe{
- attack_verb = list("ineffectively hit");
- desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon.";
- force = 1;
- name = "safety pickaxe";
- pixel_x = 5;
- throwforce = 1
+/obj/item/pickaxe/safety{
+ pixel_x = 5
},
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
@@ -1669,21 +1649,11 @@
/obj/item/clothing/glasses/meson,
/obj/item/flashlight,
/obj/item/storage/bag/ore,
-/obj/item/shovel{
- attack_verb = list("ineffectively hit");
- desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon.";
- force = 1;
- name = "safety shovel";
- pixel_x = -5;
- throwforce = 1
+/obj/item/shovel/safety{
+ pixel_x = -5
},
-/obj/item/pickaxe{
- attack_verb = list("ineffectively hit");
- desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon.";
- force = 1;
- name = "safety pickaxe";
- pixel_x = 5;
- throwforce = 1
+/obj/item/pickaxe/safety{
+ pixel_x = 5
},
/obj/machinery/status_display{
density = 0;
@@ -1702,21 +1672,11 @@
/obj/item/clothing/glasses/meson,
/obj/item/flashlight,
/obj/item/storage/bag/ore,
-/obj/item/shovel{
- attack_verb = list("ineffectively hit");
- desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon.";
- force = 1;
- name = "safety shovel";
- pixel_x = -5;
- throwforce = 1
+/obj/item/shovel/safety{
+ pixel_x = -5
},
-/obj/item/pickaxe{
- attack_verb = list("ineffectively hit");
- desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon.";
- force = 1;
- name = "safety pickaxe";
- pixel_x = 5;
- throwforce = 1
+/obj/item/pickaxe/safety{
+ pixel_x = 5
},
/obj/machinery/camera{
c_tag = "Labor Camp Storage";
diff --git a/_maps/map_files/templates/shelter_1.dmm b/_maps/map_files/templates/shelter_1.dmm
index 0cebbd66b5f..0123bf7329c 100644
--- a/_maps/map_files/templates/shelter_1.dmm
+++ b/_maps/map_files/templates/shelter_1.dmm
@@ -15,7 +15,7 @@
/turf/simulated/floor/pod,
/area/survivalpod)
"d" = (
-/obj/machinery/smartfridge/survival_pod/loaded,
+/obj/machinery/smartfridge/survival_pod,
/turf/simulated/floor/pod,
/area/survivalpod)
"e" = (
@@ -30,6 +30,9 @@
/area/survivalpod)
"g" = (
/obj/machinery/sleeper/survival_pod,
+/obj/machinery/vending/wallmed1/survival_pod{
+ pixel_x = -24
+ },
/turf/simulated/floor/pod,
/area/survivalpod)
"h" = (
diff --git a/_maps/map_files/templates/shelter_2.dmm b/_maps/map_files/templates/shelter_2.dmm
index 4a6b445ab4c..1c2e99a0c4d 100644
--- a/_maps/map_files/templates/shelter_2.dmm
+++ b/_maps/map_files/templates/shelter_2.dmm
@@ -9,7 +9,7 @@
/turf/simulated/wall/mineral/titanium/survival,
/area/survivalpod)
"c" = (
-/obj/machinery/smartfridge/survival_pod/loaded,
+/obj/machinery/smartfridge/survival_pod,
/turf/simulated/floor/pod,
/area/survivalpod)
"d" = (
@@ -39,6 +39,9 @@
/area/survivalpod)
"i" = (
/obj/machinery/sleeper/survival_pod,
+/obj/machinery/vending/wallmed1/survival_pod{
+ pixel_x = -24
+ },
/turf/simulated/floor/pod,
/area/survivalpod)
"j" = (
@@ -161,7 +164,7 @@
icon_state = "cutout_lusty";
name = "lusty xenomorph maid"
},
- /turf/simulated/floor/carpet/black,
+/turf/simulated/floor/carpet/black,
/area/survivalpod)
"A" = (
/obj/structure/table/wood/fancy/black,
diff --git a/_maps/map_files/templates/spacehotel/s_01.dmm b/_maps/map_files/templates/spacehotel/s_01.dmm
index f7c6ba629c6..f97f6613f07 100644
--- a/_maps/map_files/templates/spacehotel/s_01.dmm
+++ b/_maps/map_files/templates/spacehotel/s_01.dmm
@@ -141,6 +141,10 @@
icon_state = "freezerfloor"
},
/area/template_noop)
+"K" = (
+/obj/machinery/poolcontroller/invisible,
+/turf/unsimulated/beach/water,
+/area/template_noop)
(1,1,1) = {"
a
@@ -153,7 +157,7 @@ a
"}
(2,1,1) = {"
a
-b
+K
b
l
o
diff --git a/_maps/map_files/templates/spacehotel/s_02.dmm b/_maps/map_files/templates/spacehotel/s_02.dmm
index 5aa78f57470..c3ee3c4a727 100644
--- a/_maps/map_files/templates/spacehotel/s_02.dmm
+++ b/_maps/map_files/templates/spacehotel/s_02.dmm
@@ -142,6 +142,10 @@
icon_state = "freezerfloor"
},
/area/template_noop)
+"O" = (
+/obj/machinery/poolcontroller/invisible,
+/turf/unsimulated/beach/water,
+/area/template_noop)
(1,1,1) = {"
a
@@ -154,7 +158,7 @@ a
"}
(2,1,1) = {"
a
-b
+O
b
l
o
diff --git a/_maps/map_files/templates/spacehotel/s_04.dmm b/_maps/map_files/templates/spacehotel/s_04.dmm
index 564246a2854..81c1306da96 100644
--- a/_maps/map_files/templates/spacehotel/s_04.dmm
+++ b/_maps/map_files/templates/spacehotel/s_04.dmm
@@ -190,6 +190,10 @@
icon_state = "floor4"
},
/area/template_noop)
+"X" = (
+/obj/machinery/poolcontroller/invisible,
+/turf/unsimulated/beach/water,
+/area/template_noop)
(1,1,1) = {"
a
@@ -202,7 +206,7 @@ a
"}
(2,1,1) = {"
a
-b
+X
b
l
o
diff --git a/_maps/map_files/templates/spacehotel/s_05.dmm b/_maps/map_files/templates/spacehotel/s_05.dmm
index 62c82037700..1ff9546e265 100644
--- a/_maps/map_files/templates/spacehotel/s_05.dmm
+++ b/_maps/map_files/templates/spacehotel/s_05.dmm
@@ -129,6 +129,10 @@
icon_state = "freezerfloor"
},
/area/template_noop)
+"Z" = (
+/obj/machinery/poolcontroller/invisible,
+/turf/unsimulated/beach/water,
+/area/template_noop)
(1,1,1) = {"
a
@@ -141,7 +145,7 @@ a
"}
(2,1,1) = {"
a
-b
+Z
b
k
n
diff --git a/_maps/map_files/templates/spacehotel/s_06.dmm b/_maps/map_files/templates/spacehotel/s_06.dmm
index fa839217019..03a1e7e9e99 100644
--- a/_maps/map_files/templates/spacehotel/s_06.dmm
+++ b/_maps/map_files/templates/spacehotel/s_06.dmm
@@ -131,6 +131,10 @@
icon_state = "freezerfloor"
},
/area/template_noop)
+"X" = (
+/obj/machinery/poolcontroller/invisible,
+/turf/unsimulated/beach/water,
+/area/template_noop)
(1,1,1) = {"
a
@@ -143,7 +147,7 @@ a
"}
(2,1,1) = {"
a
-b
+X
b
m
p
diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
index 62b4f55470e..b9902dbb066 100644
--- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
@@ -56,6 +56,9 @@
/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume
name = "large dual port air vent"
+/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume/on
+ on = TRUE
+
/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume/New()
..()
air1.volume = 1000
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 4ff62ea4c89..c4478f62837 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -17,6 +17,8 @@
#define ismecha(A) (istype(A, /obj/mecha))
+#define iseffect(A) (istype(A, /obj/effect))
+
#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable
#define is_pen(W) (istype(W, /obj/item/pen))
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 65372fed1c8..34ad4d69e54 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -43,6 +43,7 @@
#define ROLE_DRONE "drone"
#define ROLE_DEATHSQUAD "deathsquad"
#define ROLE_EVENTMISC "eventmisc"
+#define ROLE_GHOST "ghost role"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
diff --git a/code/__DEFINES/rolebans.dm b/code/__DEFINES/rolebans.dm
index b2eb79e26be..d6e54abf14a 100644
--- a/code/__DEFINES/rolebans.dm
+++ b/code/__DEFINES/rolebans.dm
@@ -25,6 +25,7 @@ var/global/list/other_roles = list(
ROLE_SENTIENT,
ROLE_NYMPH,
ROLE_ERT,
+ ROLE_GHOST,
"AntagHUD",
"Records"
)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 7b9d207e172..f7c5b670dc8 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1718,8 +1718,8 @@ var/mob/dview/dview_mob = new
/proc/turf_clear(turf/T)
for(var/atom/A in T)
if(A.simulated)
- return 0
- return 1
+ return FALSE
+ return TRUE
/proc/screen_loc2turf(scr_loc, turf/origin)
var/tX = splittext(scr_loc, ",")
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index b8e6ee4bc14..b45ef833b9f 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -30,7 +30,7 @@ SUBSYSTEM_DEF(mapping)
var/mining_type = MINETYPE
if (mining_type == "lavaland")
// Spawn Lavaland ruins and rivers.
- seedRuins(list(level_name_to_num(MINING)), config.lavaland_budget, /area/lavaland/surface/outdoors, lava_ruins_templates)
+ seedRuins(list(level_name_to_num(MINING)), config.lavaland_budget, /area/lavaland/surface/outdoors/unexplored, lava_ruins_templates)
spawn_rivers()
else
// Populate mining Z-level hidden rooms
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index fafc244af14..bbe2db385a0 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -523,3 +523,5 @@ SUBSYSTEM_DEF(ticker)
/datum/controller/subsystem/ticker/proc/HasRoundStarted()
return current_state >= GAME_STATE_PLAYING
+/datum/controller/subsystem/ticker/proc/IsRoundInProgress()
+ return current_state == GAME_STATE_PLAYING
\ No newline at end of file
diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm
index a4d012df464..662b0958d5c 100644
--- a/code/datums/cache/air_alarm.dm
+++ b/code/datums/cache/air_alarm.dm
@@ -13,15 +13,16 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new()
if(SSticker && SSticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time
alarms = cache_entry.data // Don't deleate the list
- if(is_station_contact(passed_alarm.z)) // Still need sanity checks
+ if(is_station_contact(passed_alarm.z) && passed_alarm.remote_control) // Still need sanity checks
alarms[++alarms.len] = passed_alarm.get_nano_data_console()
else
for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : GLOB.air_alarms)) // Generating the whole list again is a bad habit but I can't be bothered to fix it right now
if(!monitored_alarms && !is_station_contact(alarm.z))
continue
+ if(!alarm.remote_control)
+ continue
alarms[++alarms.len] = alarm.get_nano_data_console()
-
cache_entry.timestamp = world.time //+ 10 SECONDS
cache_entry.data = alarms
return alarms
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 05f430136f0..b7d687d090b 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -624,7 +624,7 @@ var/record_id_num = 1001
clothes_s = new /icon('icons/mob/uniform.dmi', "syndicate_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "swat_gl"), ICON_UNDERLAY)
- else if(H.mind.assigned_role in get_all_centcom_jobs())
+ else if(H.mind && H.mind.assigned_role in get_all_centcom_jobs())
clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
else
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 82fe75b3cf7..91af56437cf 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -1964,7 +1964,7 @@ var/list/ghostteleportlocs = list()
/area/traitor
name = "\improper Syndicate Base"
icon_state = "syndie_hall"
- report_alerts = 0
+ report_alerts = FALSE
/area/traitor/rnd
name = "\improper Syndicate Research and Development"
@@ -2134,7 +2134,7 @@ var/list/ghostteleportlocs = list()
/area/awaymission
name = "\improper Strange Location"
icon_state = "away"
- report_alerts = 0
+ report_alerts = FALSE
/area/awaymission/example
name = "\improper Strange Station"
@@ -2160,7 +2160,7 @@ var/list/ghostteleportlocs = list()
/area/awaycontent
name = "space"
- report_alerts = 0
+ report_alerts = FALSE
/area/awaycontent/a1
icon_state = "awaycontent1"
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 8e9505095f2..638fe29ab6d 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -19,9 +19,9 @@
var/eject = null
- var/debug = 0
+ var/debug = FALSE
var/requires_power = TRUE
- var/always_unpowered = 0 //this gets overriden to 1 for space in area/New()
+ var/always_unpowered = FALSE //this gets overriden to 1 for space in area/New()
var/power_equip = TRUE
var/power_light = TRUE
@@ -33,7 +33,7 @@
var/static_equip
var/static_light = FALSE
var/static_environ
-
+
var/has_gravity = TRUE
var/list/apc = list()
var/no_air = null
@@ -128,10 +128,11 @@
/area/proc/atmosalert(danger_level, var/alarm_source, var/force = FALSE)
- if(danger_level == ATMOS_ALARM_NONE)
- SSalarms.atmosphere_alarm.clearAlarm(src, alarm_source)
- else
- SSalarms.atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level)
+ if(report_alerts)
+ if(danger_level == ATMOS_ALARM_NONE)
+ SSalarms.atmosphere_alarm.clearAlarm(src, alarm_source)
+ else
+ SSalarms.atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level)
//Check all the alarms before lowering atmosalm. Raising is perfectly fine. If force = 1 we don't care.
for(var/obj/machinery/alarm/AA in src)
diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm
index 7c85299f4d2..6b1930e1a41 100644
--- a/code/game/area/areas/ruins/lavaland.dm
+++ b/code/game/area/areas/ruins/lavaland.dm
@@ -36,6 +36,7 @@
name = "Secret Base"
icon_state = "dk_yellow"
ambientsounds = list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg')
+ report_alerts = FALSE
/area/ruin/unpowered/syndicate_lava_base/engineering
name = "Syndicate Lavaland Engineering"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 32e6487ca57..c52df8c7912 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -12,7 +12,7 @@
var/last_bumped = 0
var/pass_flags = 0
var/germ_level = GERM_LEVEL_AMBIENT // The higher the germ level, the more germ on the atom.
- var/simulated = 1 //filter for actions - used by lighting overlays
+ var/simulated = TRUE //filter for actions - used by lighting overlays
var/atom_say_verb = "says"
var/dont_save = 0 // For atoms that are temporary by necessity - like lighting overlays
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index ed89a75cd5d..bcaf21d5cde 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -380,26 +380,23 @@
//Overlays
/atom/movable/overlay
var/atom/master = null
- anchored = 1
+ anchored = TRUE
+ simulated = FALSE
/atom/movable/overlay/New()
verbs.Cut()
return
/atom/movable/overlay/attackby(a, b, c)
- if(src.master)
- return src.master.attackby(a, b, c)
- return
-
+ if(master)
+ return master.attackby(a, b, c)
/atom/movable/overlay/attack_hand(a, b, c)
- if(src.master)
- return src.master.attack_hand(a, b, c)
- return
+ if(master)
+ return master.attack_hand(a, b, c)
-
-/atom/movable/proc/water_act(var/volume, var/temperature, var/source) //amount of water acting : temperature of water in kelvin : object that called it (for shennagins)
- return 1
+/atom/movable/proc/water_act(volume, temperature, source, method = TOUCH) //amount of water acting : temperature of water in kelvin : object that called it (for shennagins)
+ return TRUE
/atom/movable/proc/handle_buckled_mob_movement(newloc,direct)
if(!buckled_mob.Move(newloc, direct))
diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm
index 63f9d5fbaff..2137888d0b8 100644
--- a/code/game/gamemodes/autotraitor/autotraitor.dm
+++ b/code/game/gamemodes/autotraitor/autotraitor.dm
@@ -96,7 +96,7 @@
for(var/obj/item/implant/mindshield/I in H.contents)
if(I && I.implanted)
possible_traitors -= player
- if(!H.job) //Golems, special events stuff, etc.
+ if(!H.job || H.mind.offstation_role) //Golems, special events stuff, etc.
possible_traitors -= player
//message_admins("Live Players: [playercount]")
//message_admins("Live Traitors: [traitorcount]")
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 8689c6fb1d9..e73474bad7d 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -175,136 +175,188 @@
/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
+ return TRUE
/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.Integrate(src)
+ return FALSE
+
+/atom/movable/swarmer_act()
+ if(!simulated)
+ return FALSE
+ return ..()
+
+/obj/effect/swarmer_act()
+ return FALSE
+
+/obj/effect/decal/cleanable/robot_debris/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S.DisIntegrate(src)
+ qdel(src)
+ return TRUE
/obj/item/gun/swarmer_act()//Stops you from eating the entire armory
- return
+ return FALSE
/turf/simulated/floor/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor
- return
+ return FALSE
/obj/machinery/atmospherics/swarmer_act()
- return
+ return FALSE
/obj/structure/disposalpipe/swarmer_act()
- return
+ return FALSE
/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DismantleMachine(src)
+ return TRUE
/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
+ return TRUE
/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
+ return TRUE
/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
toggle_cam(S, 0)
+ return TRUE
/obj/structure/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
+ return FALSE
/obj/machinery/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) // Since the console is still parented to this
to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
+ return FALSE
/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
if(!active)
S.DisIntegrate(src)
- return
+ return TRUE
to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.")
+ return FALSE
/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
+ return TRUE
/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//It's more visually interesting than dismantling the machine
S.DisIntegrate(src)
+ return TRUE
/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
+ return TRUE
/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "The volatile chemicals in this machine would destroy us. Aborting.")
+ return FALSE
/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This device's destruction would result in the extermination of everything in the area. Aborting.")
+ return FALSE
/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Searching... sensor malfunction! Target lost. Aborting.")
+ return FALSE
/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Destroying this object would cause a chain reaction. Aborting.")
+ return FALSE
/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
+ return FALSE
/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.")
+ return FALSE
/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.")
+ return FALSE
/obj/machinery/message_server/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.")
+ return FALSE
/obj/machinery/blackbox_recorder/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This machine has recorded large amounts of data on this structure and its inhabitants, it will be a useful resource to our masters in the future. Aborting. ")
+ return FALSE
/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
+ return FALSE
/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This bluespace source will be important to us later. Aborting.")
+ return FALSE
/obj/machinery/cryopod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This cryogenic sleeper should be preserved, it will be a useful resource to our masters in the future. Aborting.")
+ return FALSE
/obj/structure/cryofeed/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This cryogenic feed should be preserved, it will be a useful resource to our masters in the future. Aborting.")
+ return FALSE
/obj/machinery/computer/cryopod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This cryopod control computer should be preserved, it contains useful items and information about the inhabitants. Aborting.")
+ return FALSE
/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
for(var/turf/T in range(1, src))
if(istype(T, /turf/space) || istype(T.loc, /area/space) || istype(T, /turf/simulated/floor/plating/airless))
to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.")
- return
- ..()
+ return FALSE
+ return ..()
/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
for(var/turf/T in range(1, src))
if(istype(T, /turf/space) || istype(T.loc, /area/space))
to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.")
- return
- ..()
+ return FALSE
+ return ..()
/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource
to_chat(S, "This object does not contain enough materials to work with.")
+ return FALSE
/obj/item/circuitboard/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This object does not contain enough materials to work with.")
+ return FALSE
/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Attempting to dismantle this machine would result in an immediate counterattack. Aborting.")
+ return FALSE
/obj/spacepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Destroying this vehicle would destroy us. Aborting.")
+ return FALSE
/obj/machinery/clonepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
if(occupant)
to_chat(S, "Destroying this machine while it is occupied would result in biological and sentient resources to be harmed. Aborting.")
- return
- ..()
+ return FALSE
+ return ..()
/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisperseTarget(src)
+ return TRUE
/mob/living/carbon/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This biological resource is somehow resisting our bluespace transceiver. Aborting.")
+ return FALSE
+/obj/structure/lattice/catwalk/swarmer_catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ to_chat(S, "We have created these for our own benefit. Aborting.")
+ return FALSE
+
+/obj/structure/shuttle/engine/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ to_chat(S, "This shuttle may be important to us later. Aborting.")
+ return FALSE
////END CTRL CLICK FOR SWARMERS////
diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm
index bcaecfb0eea..81e052a85d8 100644
--- a/code/game/gamemodes/miniantags/morph/morph.dm
+++ b/code/game/gamemodes/miniantags/morph/morph.dm
@@ -45,6 +45,16 @@
You can restore yourself to your original form while morphed by shift-clicking yourself.
\
Finally, you can attack any item or dead creature to consume it - creatures will restore 1/3 of your max health."
+/mob/living/simple_animal/hostile/morph/wizard
+ name = "magical morph"
+ real_name = "magical morph"
+ desc = "A revolting, pulsating pile of flesh. This one looks somewhat.. magical."
+
+/mob/living/simple_animal/hostile/morph/wizard/New()
+ . = ..()
+ AddSpell(new /obj/effect/proc_holder/spell/targeted/smoke)
+ AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall)
+
/mob/living/simple_animal/hostile/morph/examine(mob/user)
if(morphed)
if(form)
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index f732e251a0a..09d5fecb8a2 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -290,6 +290,10 @@
emote_hear = list("gaffaws", "laughs")
response_help = "hugs"
attacktext = "wildly tickles"
+ maxHealth = 150
+ health = 150
+ melee_damage_lower = 20
+ melee_damage_upper = 20
attack_sound = 'sound/items/bikehorn.ogg'
feast_sound = 'sound/spookoween/scary_horn2.ogg'
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 5b06e09f5ba..ef68117e1c4 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -532,7 +532,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
var/list/priority_targets = list()
for(var/datum/mind/possible_target in SSticker.minds)
- if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && (possible_target.assigned_role != possible_target.special_role))
+ if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && (possible_target.assigned_role != possible_target.special_role) && !possible_target.offstation_role)
possible_targets += possible_target
for(var/role in roles)
if(possible_target.assigned_role == role)
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index 2515de135fa..276f8d2eb1f 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -24,8 +24,35 @@
panel = "Shadowling Abilities"
charge_max = 300
clothes_req = 0
+ range = 10 //has no effect beyond this range, so setting this makes invalid/useless targets not show up in popup
action_icon_state = "glare"
- humans_only = 1
+ humans_only = 1 //useless since we override chose_targets, but might be used for other code later??? Might remove, idk
+
+/obj/effect/proc_holder/spell/targeted/glare/choose_targets(mob/user)
+ var/list/possible_targets = list()
+ for(var/mob/living/carbon/human/target in view_or_range(range, user, "view"))
+ if(target.stat)
+ continue
+ if(is_shadow_or_thrall(target))
+ continue
+ possible_targets += target
+ var/mob/living/carbon/human/M
+ var/list/targets = list()
+ if(possible_targets.len == 1)//no choice involved
+ targets = possible_targets
+ else
+ M = input("Choose the target for the spell.", "Targeting") as mob in possible_targets
+ if(M in view_or_range(range, user, "view"))
+ targets += M
+
+
+ if(!targets.len) //doesn't waste the spell
+ revert_cast(user)
+ return
+
+ perform(targets, user = user)
+ return
+
/obj/effect/proc_holder/spell/targeted/glare/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/human/target in targets)
diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm
index bb62b7bebea..57a4f4e17de 100644
--- a/code/game/gamemodes/wizard/raginmages.dm
+++ b/code/game/gamemodes/wizard/raginmages.dm
@@ -3,36 +3,35 @@
config_tag = "raginmages"
required_players = 20
use_huds = 1
+ but_wait_theres_more = 1
var/max_mages = 0
- var/making_mage = 0
+ var/making_mage = FALSE
var/mages_made = 1
var/time_checked = 0
- var/players_per_mage = 6 // If the admin wants to tweak things or something
- but_wait_theres_more = 1
+ var/players_per_mage = 10 // If the admin wants to tweak things or something
var/delay_per_mage = 4200 // Every 7 minutes by default
var/time_till_chaos = 18000 // Half-hour in
/datum/game_mode/wizard/raginmages/announce()
to_chat(world, "The current game mode is - Ragin' Mages!")
- to_chat(world, "The Space Wizard Federation is pissed, help defeat all the space wizards!")
-
+ to_chat(world, "The Space Wizard Federation is pissed, crew must help defeat all the Space Wizards invading the station!")
/datum/game_mode/wizard/raginmages/greet_wizard(var/datum/mind/wizard, var/you_are=1)
if(you_are)
to_chat(wizard.current, "You are the Space Wizard!")
- to_chat(wizard.current, "The Space Wizards Federation has given you the following tasks:")
+ to_chat(wizard.current, "The Space Wizard Federation has given you the following tasks:")
var/obj_count = 1
+ to_chat(wizard.current, "Supreme Objective: Make sure the station pays for its actions against our diplomats. We might send more Wizards to the station if the situation is not developing in our favour.")
for(var/datum/objective/objective in wizard.objectives)
to_chat(wizard.current, "Objective #[obj_count]: [objective.explanation_text]")
obj_count++
- to_chat(wizard.current, "Objective Alpha: Make sure the station pays for its actions against our diplomats")
return
/datum/game_mode/wizard/raginmages/check_finished()
var/wizards_alive = 0
- // Accidental pun!
- var/wizard_cap = (max_mages || (num_players_started() / players_per_mage))
+ var/wizard_cap = CEILING((num_players_started() / players_per_mage), 1)
+ max_mages = wizard_cap
for(var/datum/mind/wizard in wizards)
if(isnull(wizard.current))
continue
@@ -115,71 +114,44 @@
qdel(B)
/datum/game_mode/wizard/raginmages/proc/make_more_mages()
-
if(making_mage || SSshuttle.emergency.mode >= SHUTTLE_ESCAPE)
- return 0
- making_mage = 1
- var/list/candidates = list()
+ return FALSE
+ making_mage = TRUE
+
+ var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as a raging Space Wizard?", ROLE_WIZARD, TRUE, poll_time = 20 SECONDS)
var/mob/dead/observer/harry = null
- spawn(rand(200, 600))
- message_admins("SWF is still pissed, sending another wizard - [max_mages - mages_made] left.")
- //Protip: This returns clients, not ghosts
- candidates = get_candidate_ghosts(ROLE_WIZARD)
- if(!candidates.len)
- message_admins("No applicable clients for the next ragin' mage, asking ghosts instead.")
- var/time_passed = world.time
- for(var/mob/dead/observer/G in GLOB.player_list)
- if(!jobban_isbanned(G, "wizard") && !jobban_isbanned(G, "Syndicate"))
- spawn(0)
- switch(alert(G, "Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","Yes","No"))
- if("Yes")
- if((world.time-time_passed)>300)//If more than 30 game seconds passed.
- continue
- candidates += G
- if("No")
- continue
- sleep(300)
- if(!candidates.len)
- message_admins("This is awkward, sleeping until another mage check...")
- making_mage = 0
- return
+ message_admins("SWF is still pissed, sending another wizard - [max_mages - mages_made] left.")
+
+ if(!candidates.len)
+ message_admins("This is awkward, sleeping until another mage check..")
+ making_mage = FALSE
+ sleep(300)
+ return
+ else
+ harry = pick(candidates)
+ making_mage = FALSE
+ if(harry)
+ var/mob/living/carbon/human/new_character= makeBody(harry)
+ new_character.mind.make_Wizard() // This puts them at the wizard spawn, worry not
+ mages_made++
+ return TRUE
else
- candidates = shuffle(candidates)
- for(var/mob/dead/observer/i in candidates)
- if(!i) continue //Dont bother removing them from the list since we only grab one wizard
-
- // YER A WIZZERD HARRY
- harry = i
- break
-
- making_mage = 0
- if(harry)
- var/mob/living/carbon/human/new_character= makeBody(harry)
-
-
- new_character.mind.make_Wizard() // This puts them at the wizard spawn, worry not
- mages_made++
- return 1
- else
- log_runtime(EXCEPTION("The candidates list for ragin' mages contained non-observer entries!"), src)
- return 0
+ log_runtime(EXCEPTION("The candidates list for ragin' mages contained non-observer entries!"), src)
+ return FALSE
// ripped from -tg-'s wizcode, because whee lets make a very general proc for a very specific gamemode
// This probably wouldn't do half bad as a proc in __HELPERS
// Lemme know if this causes species to mess up spectacularly or anything
/datum/game_mode/wizard/raginmages/proc/makeBody(var/mob/dead/observer/G)
- if(!G || !G.key) return // Let's not steal someone's soul here
-
+ if(!G || !G.key)
+ return // Let's not steal someone's soul here
var/mob/living/carbon/human/new_character = new(pick(latejoin))
-
G.client.prefs.copy_to(new_character)
-
new_character.key = G.key
-
return new_character
/datum/game_mode/wizard/raginmages/declare_completion()
if(finished)
- feedback_set_details("round_end_result","raging wizard loss - wizard killed")
- to_chat(world, " The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget!")
+ feedback_set_details("round_end_result", "raging wizard loss - wizard killed")
+ to_chat(world, " The crew has managed to hold off the Wizard attack! The Space Wizard Federation has been taught a lesson they will not soon forget!")
..(1)
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 5592f5f41fc..7d941a41bde 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -229,6 +229,12 @@
log_name = "LD"
category = "Defensive"
+/datum/spellbook_entry/lichdom/IsAvailible()
+ if(SSticker.mode.name == "ragin' mages")
+ return FALSE
+ else
+ return TRUE
+
/datum/spellbook_entry/lightningbolt
name = "Lightning Bolt"
spell_type = /obj/effect/proc_holder/spell/targeted/lightning
@@ -398,8 +404,8 @@
name = "Bottle of Tickles"
desc = "A bottle of magically infused fun, the smell of which will \
attract adorable extradimensional beings when broken. These beings \
- are similar to slaughter demons, but they do not permamently kill \
- their victims, instead putting them in an extradimensional hugspace, \
+ are similar to slaughter demons, but are a little weaker and they do not permamently \
+ kill their victims, instead putting them in an extradimensional hugspace, \
to be released on the demon's death. Chaotic, but not ultimately \
damaging. The crew's reaction to the other hand could be very \
destructive."
@@ -411,7 +417,7 @@
/datum/spellbook_entry/item/oozebottle
name = "Bottle of Ooze"
- desc = "A bottle of magically infused ooze, which will awake an all-consuming Morph, capable of cunningly disguising itself as any object it comes in contact with. Be careful though, as Morph diet includes Wizards."
+ desc = "A bottle of magically infused ooze, which will awake an all-consuming Morph, capable of cunningly disguising itself as any object it comes in contact with and even casting some very basic spells. Be careful though, as Morph diet includes Wizards."
item_path = /obj/item/antag_spawner/morph
cost = 1
log_name = "BO"
@@ -419,7 +425,7 @@
category = "Assistance"
/datum/spellbook_entry/item/tarotdeck
- name = "Tarot Deck"
+ name = "Guardian Deck"
desc = "A deck of guardian tarot cards, capable of binding a personal guardian to your body. There are multiple types of guardian available, but all of them will transfer some amount of damage to you. \
It would be wise to avoid buying these with anything capable of causing you to swap bodies with others."
item_path = /obj/item/guardiancreator
@@ -439,14 +445,6 @@
item_path = /obj/item/twohanded/singularityhammer
log_name = "SI"
-/datum/spellbook_entry/item/cursed_heart
- name = "Cursed Heart"
- desc = "A heart that has been revived by dark magicks. The user must ensure the heart is manually beaten or their blood circulation will suffer, but every beat heals their injuries. It must beat every 6 seconds."
- item_path = /obj/item/organ/internal/heart/cursed/wizard
- log_name = "CH"
- cost = 1
- category = "Defensive"
-
/datum/spellbook_entry/summon
name = "Summon Stuff"
category = "Rituals"
@@ -473,9 +471,12 @@
name = "Summon Ghosts"
desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilities to frustrate you."
cost = 0
+ log_name = "SGH"
/datum/spellbook_entry/summon/ghosts/IsAvailible()
- if(!SSticker.mode)
+ if(!SSticker.mode) // In case spellbook is placed on map
+ return FALSE
+ if(SSticker.mode.name == "ragin' mages")
return FALSE
else
return TRUE
@@ -489,18 +490,17 @@
/datum/spellbook_entry/summon/guns
name = "Summon Guns"
- category = "Rituals"
- desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!"
+ desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long! You will also receive 1 extra point to use in your spellbook."
cost = 0
log_name = "SG"
/datum/spellbook_entry/summon/guns/IsAvailible()
if(!SSticker.mode) // In case spellbook is placed on map
- return 0
+ return FALSE
if(SSticker.mode.name == "ragin' mages")
- return 0
+ return FALSE
else
- return 1
+ return TRUE
/datum/spellbook_entry/summon/guns/Buy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book)
feedback_add_details("wizard_spell_learned",log_name)
@@ -512,18 +512,17 @@
/datum/spellbook_entry/summon/magic
name = "Summon Magic"
- category = "Challenges"
- desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time."
+ desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time. You will also receive 1 extra point to use in your spellbook."
cost = 0
log_name = "SU"
/datum/spellbook_entry/summon/magic/IsAvailible()
if(!SSticker.mode) // In case spellbook is placed on map
- return 0
+ return FALSE
if(SSticker.mode.name == "ragin' mages")
- return 0
+ return FALSE
else
- return 1
+ return TRUE
/datum/spellbook_entry/summon/magic/Buy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book)
feedback_add_details("wizard_spell_learned",log_name)
@@ -611,9 +610,6 @@
dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
"
dat += "For spells: the number after the spell name is the cooldown time.
"
dat += "You can reduce this number by spending more points on the spell.
"
- if("Challenges")
- dat += "The Wizard Federation typically has hard limits on the potency and number of spells brought to the station based on risk.
"
- dat += "Arming the station against you will increases the risk, but will grant you one more charge for your spellbook.
"
if("Rituals")
dat += "These powerful spells change the very fabric of reality. Not always in your favour.
"
return dat
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index 1e9bf6ce4c0..5ac62401d23 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -7,7 +7,6 @@
required_players = 20
required_enemies = 1
recommended_enemies = 1
-
var/use_huds = 0
var/finished = 0
var/but_wait_theres_more = 0
@@ -16,7 +15,6 @@
to_chat(world, "The current game mode is - Wizard!")
to_chat(world, "There is a SPACE WIZARD on the station. You can't let him achieve his objective!")
-
/datum/game_mode/wizard/can_start()//This could be better, will likely have to recode it later
if(!..())
return 0
@@ -41,7 +39,6 @@
..()
return 1
-
/datum/game_mode/wizard/post_setup()
for(var/datum/mind/wizard in wizards)
log_game("[key_name(wizard)] has been selected as a Wizard")
@@ -73,7 +70,6 @@
wizhud.join_hud(wiz_mind.current)
set_antag_hud(wiz_mind.current, ((wiz_mind in wizards) ? "hudwizard" : "apprentice"))
-
/datum/game_mode/proc/update_wiz_icons_removed(datum/mind/wiz_mind)
var/datum/atom_hud/antag/wizhud = huds[ANTAG_HUD_WIZ]
wizhud.leave_hud(wiz_mind.current)
@@ -85,7 +81,6 @@
wizard.objectives += wiz_objective
return
-
/datum/game_mode/proc/name_wizard(mob/living/carbon/human/wizard_mob)
//Allows the wizard to choose a custom name or go with a random one. Spawn 0 so it does not lag the round starting.
var/wizard_name_first = pick(GLOB.wizard_first)
@@ -103,7 +98,6 @@
wizard_mob.mind.name = newname
return
-
/datum/game_mode/proc/greet_wizard(var/datum/mind/wizard, var/you_are=1)
addtimer(CALLBACK(wizard.current, /mob/.proc/playsound_local, null, 'sound/ambience/antag/ragesmages.ogg', 100, 0), 30)
if(you_are)
@@ -116,7 +110,6 @@
obj_count++
return
-
/*/datum/game_mode/proc/learn_basic_spells(mob/living/carbon/human/wizard_mob)
if(!istype(wizard_mob))
return
@@ -164,7 +157,6 @@
wizard_mob.gene_stability += DEFAULT_GENE_STABILITY //magic
return 1
-
/datum/game_mode/wizard/check_finished()
var/wizards_alive = 0
var/traitors_alive = 0
@@ -189,8 +181,6 @@
finished = 1
return 1
-
-
/datum/game_mode/wizard/declare_completion(var/ragin = 0)
if(finished && !ragin)
feedback_set_details("round_end_result","wizard loss - wizard killed")
@@ -198,7 +188,6 @@
..()
return 1
-
/datum/game_mode/proc/auto_declare_completion_wizard()
if(wizards.len)
var/text = "
the wizards/witches were:"
diff --git a/code/game/jobs/job_objective.dm b/code/game/jobs/job_objective.dm
index 4456bb571e5..48fa911bcf5 100644
--- a/code/game/jobs/job_objective.dm
+++ b/code/game/jobs/job_objective.dm
@@ -49,7 +49,7 @@
if(!employee.job_objectives.len)//If the employee had no objectives, don't need to process this.
continue
- if(employee.assigned_role == employee.special_role) //If the character is an offstation character, skip them.
+ if(employee.assigned_role == employee.special_role || employee.offstation_role) //If the character is an offstation character, skip them.
continue
var/tasks_completed=0
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 9a062d31de4..52cd5bdfee8 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -86,8 +86,8 @@
var/frequency = ATMOS_VENTSCRUB
//var/skipprocess = 0 //Experimenting
var/alarm_frequency = ATMOS_FIRE_FREQ
- var/remote_control = 0
- var/rcon_setting = 2
+ var/remote_control = TRUE
+ var/rcon_setting = RCON_AUTO
var/rcon_time = 0
var/locked = 1
var/datum/wires/alarm/wires = null
@@ -98,7 +98,7 @@
// Waiting on a device to respond.
// Specifies an id_tag. NULL means we aren't waiting.
- var/waiting_on_device=null
+ var/waiting_on_device = null
var/mode = AALARM_MODE_SCRUBBING
var/preset = AALARM_PRESET_HUMAN
@@ -117,16 +117,18 @@
var/list/TLV = list()
- var/report_danger_level = 1
+ var/report_danger_level = TRUE
- var/automatic_emergency = 1 //Does the alarm automaticly respond to an emergency condition
+ var/automatic_emergency = TRUE //Does the alarm automaticly respond to an emergency condition
/obj/machinery/alarm/monitor
- report_danger_level = 0
+ report_danger_level = FALSE
/obj/machinery/alarm/syndicate //general syndicate access
- report_danger_level = 0
+ report_danger_level = FALSE
+ remote_control = FALSE
req_access = list(access_syndicate)
+ req_one_access = list()
/obj/machinery/alarm/monitor/server
preset = AALARM_PRESET_SERVER
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 5028db8f0c6..d59aca72145 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -295,10 +295,12 @@
to_chat(O, "The screen bursts into static.")
/obj/machinery/camera/proc/triggerCameraAlarm()
- SSalarms.camera_alarm.triggerAlarm(loc, src)
+ if(is_station_contact(z))
+ SSalarms.camera_alarm.triggerAlarm(loc, src)
/obj/machinery/camera/proc/cancelCameraAlarm()
- SSalarms.camera_alarm.clearAlarm(loc, src)
+ if(is_station_contact(z))
+ SSalarms.camera_alarm.clearAlarm(loc, src)
/obj/machinery/camera/proc/can_use()
if(!status)
diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm
index 17f64c07cb8..312e4cf577e 100644
--- a/code/game/machinery/camera/motion.dm
+++ b/code/game/machinery/camera/motion.dm
@@ -43,19 +43,20 @@
/obj/machinery/camera/proc/cancelAlarm()
if(!status || (stat & NOPOWER))
- return 0
- if(detectTime == -1)
+ return FALSE
+ if(detectTime == -1 && is_station_contact(z))
SSalarms.motion_alarm.clearAlarm(loc, src)
detectTime = 0
- return 1
+ return TRUE
/obj/machinery/camera/proc/triggerAlarm()
if(!status || (stat & NOPOWER))
- return 0
- if(!detectTime) return 0
+ return FALSE
+ if(!detectTime || !is_station_contact(z))
+ return FALSE
SSalarms.motion_alarm.triggerAlarm(loc, src)
detectTime = -1
- return 1
+ return TRUE
/obj/machinery/camera/HasProximity(atom/movable/AM as mob|obj)
// Motion cameras outside of an "ai monitored" area will use this to detect stuff.
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 835b0264229..e9504157063 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -21,6 +21,16 @@ FIRE ALARM
var/wiresexposed = 0
var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
+ var/report_fire_alarms = TRUE // Should triggered fire alarms also trigger an actual alarm?
+ var/show_alert_level = TRUE // Should fire alarms display the current alert level?
+
+/obj/machinery/firealarm/no_alarm
+ report_fire_alarms = FALSE
+
+/obj/machinery/firealarm/syndicate
+ report_fire_alarms = FALSE
+ show_alert_level = FALSE
+
/obj/machinery/firealarm/update_icon()
if(wiresexposed)
@@ -215,40 +225,38 @@ FIRE ALARM
time = min(max(round(time), 0), 120)
/obj/machinery/firealarm/proc/reset()
- if(!( working ))
+ if(!working)
return
var/area/A = get_area(src)
A.fire_reset()
+
for(var/obj/machinery/firealarm/FA in A)
- SSalarms.fire_alarm.clearAlarm(loc, FA)
- return
+ if(is_station_contact(z) && FA.report_fire_alarms)
+ SSalarms.fire_alarm.clearAlarm(loc, FA)
/obj/machinery/firealarm/proc/alarm(var/duration = 0)
- if(!( working))
+ if(!working)
return
+
var/area/A = get_area(src)
for(var/obj/machinery/firealarm/FA in A)
- SSalarms.fire_alarm.triggerAlarm(loc, FA, duration)
+ if(is_station_contact(z) && FA.report_fire_alarms)
+ SSalarms.fire_alarm.triggerAlarm(loc, FA, duration)
+ else
+ A.fire_alert() // Manually trigger alarms if the alarm isn't reported
+
update_icon()
- //playsound(loc, 'sound/ambience/signal.ogg', 75, 0)
- return
/obj/machinery/firealarm/New(location, direction, building)
..()
- if(location)
- loc = location
-
- if(direction)
- dir = direction
-
if(building)
buildstage = 0
- wiresexposed = 1
+ wiresexposed = TRUE
pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
- if(is_station_contact(z))
+ if(is_station_contact(z) && show_alert_level)
if(security_level)
overlays += image('icons/obj/monitors.dmi', "overlay_[get_security_level()]")
else
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 20d15a29e1f..22cf6d56ecd 100755
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -6,12 +6,15 @@
plane = FLOOR_PLANE
armor = list(melee = 50, bullet = 30, laser = 70, energy = 50, bomb = 20, bio = 0, rad = 0)
var/id = null
- var/on = 1.0
- anchored = 1.0
+ var/on = FALSE
+ anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 2
active_power_usage = 4
+/obj/machinery/igniter/on
+ on = TRUE
+
/obj/machinery/igniter/attack_ai(mob/user as mob)
return src.attack_hand(user)
@@ -51,8 +54,8 @@
icon = 'icons/obj/stationobjs.dmi'
icon_state = "migniter"
var/id = null
- var/disable = 0
- var/last_spark = 0
+ var/disable = FALSE
+ var/last_spark = FALSE
var/base_state = "migniter"
anchored = 1
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 072281cb188..2bc9196740e 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -148,8 +148,8 @@ Class Procs:
if(!speed_process)
return
speed_process = FALSE
- START_PROCESSING(SSmachines, src)
STOP_PROCESSING(SSfastprocess, src)
+ START_PROCESSING(SSmachines, src)
/obj/machinery/Destroy()
if(myArea)
@@ -348,28 +348,28 @@ Class Procs:
return attack_hand(user)
/obj/machinery/attack_hand(mob/user as mob)
- if(user.lying || user.stat)
- return 1
+ if(user.incapacitated())
+ return TRUE
if(!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
- return 1
+ return TRUE
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.getBrainLoss() >= 60)
visible_message("[H] stares cluelessly at [src] and drools.")
- return 1
+ return TRUE
else if(prob(H.getBrainLoss()))
to_chat(user, "You momentarily forget how to use [src].")
- return 1
+ return TRUE
if(panel_open)
add_fingerprint(user)
- return 0
+ return FALSE
if(!interact_offline && stat & (NOPOWER|BROKEN|MAINT))
- return 1
+ return TRUE
add_fingerprint(user)
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index 17fae9df6f6..0d6f76aad38 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -20,13 +20,36 @@
var/list/linkedmist = list() //Used to keep track of created mist
var/deep_water = FALSE //set to 1 to drown even standing people
+/obj/machinery/poolcontroller/invisible
+ invisibility = INVISIBILITY_MAXIMUM
+ name = "Water Controller"
+ desc = "An invisible water controller. Players shouldn't see this."
-/obj/machinery/poolcontroller/New() //This proc automatically happens on world start
+/obj/machinery/poolcontroller/invisible/sea
+ name = "Sea Controller"
+ desc = "A controller for the underwater portion of the sea. Players shouldn't see this."
+ deep_water = TRUE
+
+/obj/machinery/poolcontroller/Initialize(mapload)
+ var/contents_loop = linked_area
if(!linked_area)
- for(var/turf/simulated/floor/beach/water/W in range(srange,src)) //Search for /turf/simulated/floor/beach/water in the range of var/srange
- linkedturfs += W //Add found pool turfs to the central list.
- W.linkedcontroller = src // And add the linked controller to itself.
- ..() //Changed to call parent as per MarkvA's recommendation
+ contents_loop = range(srange, src)
+
+ for(var/turf/T in contents_loop)
+ if(istype(T, /turf/simulated/floor/beach/water))
+ var/turf/simulated/floor/beach/water/W = T
+ W.linkedcontroller = src
+ linkedturfs += T
+ else if(istype(T, /turf/unsimulated/beach/water))
+ var/turf/unsimulated/beach/water/W = T
+ W.linkedcontroller = src
+ linkedturfs += T
+
+ . = ..()
+
+/obj/machinery/poolcontroller/invisible/Initialize(mapload)
+ linked_area = get_area(src)
+ . = ..()
/obj/machinery/poolcontroller/emag_act(user as mob) //Emag_act, this is called when it is hit with a cryptographic sequencer.
if(!emagged) //If it is not already emagged, emag it.
@@ -190,20 +213,6 @@
return 1
-/obj/machinery/poolcontroller/seacontroller
- invisibility = 101
- unacidable = 1
- name = "Sea Controller"
- desc = "A controller for the underwater portion of the sea. Players shouldn't see this."
- deep_water = TRUE //deep sea is deep water
-
-/obj/machinery/poolcontroller/seacontroller/Initialize()
- linked_area = get_area(src)
- for(var/turf/unsimulated/beach/water/W in linked_area)
- linkedturfs += W //Add found pool turfs to the central list.
- W.linkedcontroller = src // And add the linked controller to itself.
- ..()
-
#undef FRIGID
#undef COOL
#undef NORMAL
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 46138139ce8..bc2af073fc6 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -284,6 +284,7 @@
var/turf/simulated/wall/mineral/plastitanium/explosive/E = wall
if(E.explosive_wall_group == explosive_wall_group)
E.self_destruct()
+ sleep(5)
///Bomb Cores///
@@ -301,6 +302,7 @@
var/range_medium = 9
var/range_light = 17
var/range_flame = 17
+ var/admin_log = TRUE
/obj/item/bombcore/ex_act(severity) //Little boom can chain a big boom
detonate()
@@ -314,7 +316,7 @@
if(adminlog)
message_admins(adminlog)
log_game(adminlog)
- explosion(get_turf(src), range_heavy, range_medium, range_light, flame_range = range_flame)
+ explosion(get_turf(src), range_heavy, range_medium, range_light, flame_range = range_flame, adminlog = admin_log)
if(loc && istype(loc, /obj/machinery/syndicatebomb))
qdel(loc)
qdel(src)
@@ -405,6 +407,9 @@
range_light = 20
range_flame = 20
+/obj/item/bombcore/large/explosive_wall
+ admin_log = FALSE
+
/obj/item/bombcore/large/underwall
layer = ABOVE_OPEN_TURF_LAYER
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 3688b4abe9b..a96a1c0d518 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1031,6 +1031,7 @@
contraband = list(/obj/item/gun/projectile/shotgun/toy/crossbow= 10, //Congrats, you unlocked the +18 setting!
/obj/item/gun/projectile/automatic/c20r/toy/riot = 10,
/obj/item/gun/projectile/automatic/l6_saw/toy/riot = 10,
+ /obj/item/gun/projectile/automatic/sniper_rifle/toy = 10,
/obj/item/ammo_box/foambox/riot = 20,
/obj/item/toy/katana = 10,
/obj/item/twohanded/dualsaber/toy = 5,
@@ -1053,6 +1054,36 @@
/obj/machinery/vending/cigarette/free
prices = list()
+/obj/machinery/vending/cigarette/syndicate
+ products = list(/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 7,
+ /obj/item/storage/fancy/cigarettes/cigpack_uplift = 3,
+ /obj/item/storage/fancy/cigarettes/cigpack_robust = 2,
+ /obj/item/storage/fancy/cigarettes/cigpack_carp = 3,
+ /obj/item/storage/fancy/cigarettes/cigpack_midori = 1,
+ /obj/item/storage/box/matches = 10,
+ /obj/item/lighter/zippo = 4,
+ /obj/item/storage/fancy/rollingpapers = 5)
+
+/obj/machinery/vending/cigarette/syndicate/free
+ prices = list()
+
+/obj/machinery/vending/cigarette/beach //Used in the lavaland_biodome_beach.dmm ruin
+ name = "\improper ShadyCigs Ultra"
+ desc = "Now with extra premium products!"
+ product_ads = "Probably not bad for you!;Dope will get you through times of no money better than money will get you through times of no dope!;It's good for you!"
+ product_slogans = "Turn on, tune in, drop out!;Better living through chemistry!;Toke!;Don't forget to keep a smile on your lips and a song in your heart!"
+ products = list(/obj/item/storage/fancy/cigarettes = 5,
+ /obj/item/storage/fancy/cigarettes/cigpack_uplift = 3,
+ /obj/item/storage/fancy/cigarettes/cigpack_robust = 3,
+ /obj/item/storage/fancy/cigarettes/cigpack_carp = 3,
+ /obj/item/storage/fancy/cigarettes/cigpack_midori = 3,
+ /obj/item/storage/box/matches = 10,
+ /obj/item/lighter/random = 4,
+ /obj/item/storage/fancy/rollingpapers = 5)
+ premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2,
+ /obj/item/storage/fancy/cigarettes/cigpack_robustgold = 1,
+ /obj/item/lighter/zippo = 3)
+
/obj/machinery/vending/cigarette/New()
..()
component_parts = list()
@@ -1100,10 +1131,10 @@
product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?"
icon_state = "wallmed"
icon_deny = "wallmed-deny"
- req_access_txt = "5"
- density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
+ req_access = list(access_medical)
+ density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude
products = list(/obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/ointment = 2, /obj/item/reagent_containers/hypospray/autoinjector = 4, /obj/item/healthanalyzer = 1)
- contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4,/obj/item/reagent_containers/syringe/antiviral = 4,/obj/item/reagent_containers/food/pill/tox = 1)
+ contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4, /obj/item/reagent_containers/syringe/antiviral = 4, /obj/item/reagent_containers/food/pill/tox = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/wallmed2
@@ -1111,10 +1142,10 @@
desc = "Wall-mounted Medical Equipment dispenser."
icon_state = "wallmed"
icon_deny = "wallmed-deny"
- req_access_txt = "5"
- density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
- products = list(/obj/item/reagent_containers/hypospray/autoinjector = 5,/obj/item/reagent_containers/syringe/charcoal = 3,/obj/item/stack/medical/bruise_pack = 3,
- /obj/item/stack/medical/ointment =3,/obj/item/healthanalyzer = 3)
+ req_access = list(access_medical)
+ density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude
+ products = list(/obj/item/reagent_containers/hypospray/autoinjector = 5, /obj/item/reagent_containers/syringe/charcoal = 3, /obj/item/stack/medical/bruise_pack = 3,
+ /obj/item/stack/medical/ointment = 3, /obj/item/healthanalyzer = 3)
contraband = list(/obj/item/reagent_containers/food/pill/tox = 3)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index faaf623fa50..691ed994875 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -3,68 +3,126 @@
desc = "Looks unstable. Best to test it with the clown."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "portal"
- density = 1
- unacidable = 1//Can't destroy energy portals.
- var/failchance = 5
+ density = TRUE
+ unacidable = TRUE
+ anchored = TRUE
+
var/obj/item/target = null
var/creator = null
- anchored = 1
- var/precision = 1 // how close to the portal you will teleport. 0 = on the portal, 1 = adjacent
- var/can_multitool_to_remove = 0
+
+ var/failchance = 5
+ var/fail_icon = "portal1"
+
+ var/precision = TRUE // how close to the portal you will teleport. FALSE = on the portal, TRUE = adjacent
+ var/can_multitool_to_remove = FALSE
var/ignore_tele_proof_area_setting = FALSE
/obj/effect/portal/Bumped(mob/M as mob|obj)
teleport(M)
-/obj/effect/portal/New(loc, turf/target, creator=null, lifespan=300)
+/obj/effect/portal/New(loc, turf/target, creator = null, lifespan = 300)
+ ..()
+
GLOB.portals += src
- src.loc = loc
+
src.target = target
src.creator = creator
+
if(lifespan > 0)
spawn(lifespan)
qdel(src)
/obj/effect/portal/Destroy()
GLOB.portals -= src
- if(istype(creator, /obj))
+
+ if(isobj(creator))
var/obj/O = creator
O.portal_destroyed(src)
+
creator = null
target = null
return ..()
-/obj/effect/portal/proc/teleport(atom/movable/M as mob|obj)
- if(istype(M, /obj/effect)) //sparks don't teleport
+/obj/effect/portal/singularity_pull()
+ return
+
+/obj/effect/portal/singularity_act()
+ return
+
+/obj/effect/portal/Crossed(atom/movable/AM)
+ if(isobserver(AM))
+ return ..()
+
+ if(!teleport(AM))
+ return ..()
+
+/obj/effect/portal/attack_tk(mob/user)
+ return
+
+/obj/effect/portal/attack_hand(mob/user)
+ . = ..()
+ if(.)
return
- if(M.anchored&&istype(M, /obj/mecha))
- return
- if(!( target ))
- qdel(src)
- return
- if(istype(M, /atom/movable))
- if(prob(failchance))
- src.icon_state = "portal1"
- if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space.
- invalid_teleport()
- else
- if(!do_teleport(M, target, precision, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to a turf adjacent to target.
- invalid_teleport()
+ if(get_turf(user) == get_turf(src))
+ teleport(user)
+ if(Adjacent(user))
+ user.forceMove(get_turf(src))
+
+/obj/effect/portal/attack_ghost(mob/dead/observer/O)
+ if(target)
+ O.forceMove(target)
/obj/effect/portal/attackby(obj/item/A, mob/user)
- if(istype(A, /obj/item/multitool) && can_multitool_to_remove)
+ if(ismultitool(A) && can_multitool_to_remove)
qdel(src)
+ else if(user && Adjacent(user))
+ user.forceMove(get_turf(src))
+ return TRUE
+
+/obj/effect/portal/proc/can_teleport(atom/movable/M)
+ . = TRUE
+
+ if(!istype(M))
+ . = FALSE
+
+ if(!M.simulated || iseffect(M))
+ . = FALSE
+
+ if(M.anchored && ismecha(M))
+ . = FALSE
+
+/obj/effect/portal/proc/teleport(atom/movable/M)
+ if(!can_teleport(M))
+ return FALSE
+
+ if(!target)
+ qdel(src)
+ return FALSE
+
+ if(ismegafauna(M))
+ message_admins("[M] has used a portal at [ADMIN_VERBOSEJMP(src)] made by [key_name_admin(usr)].")
+
+ if(prob(failchance))
+ icon_state = fail_icon
+ if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space.
+ invalid_teleport()
+ return FALSE
+ else
+ if(!do_teleport(M, target, precision, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to a turf adjacent to target.
+ invalid_teleport()
+ return FALSE
+
+ return TRUE
/obj/effect/portal/proc/invalid_teleport()
visible_message("[src] flickers and fails due to bluespace interference!")
do_sparks(5, 0, loc)
qdel(src)
-
/obj/effect/portal/redspace
name = "redspace portal"
desc = "A portal capable of bypassing bluespace interference."
icon_state = "portal1"
failchance = 0
precision = 0
- ignore_tele_proof_area_setting = TRUE
\ No newline at end of file
+ ignore_tele_proof_area_setting = TRUE
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index b7311519f7a..4dcd2cbdd32 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -242,7 +242,8 @@
/obj/item/gun/projectile/automatic/toy/pistol/enforcer = 50,
/obj/item/gun/projectile/shotgun/toy = 50,
/obj/item/gun/projectile/shotgun/toy/crossbow = 50,
- /obj/item/gun/projectile/shotgun/toy/tommygun = 50
+ /obj/item/gun/projectile/shotgun/toy/tommygun = 50,
+ /obj/item/gun/projectile/automatic/sniper_rifle/toy = 50
)
diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm
index bb6cca92644..23b1aaa0d2e 100644
--- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm
+++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm
@@ -1,16 +1,23 @@
//temporary visual effects
/obj/effect/temp_visual
- anchored = 1
+ icon_state = "nothing"
+ anchored = TRUE
layer = ABOVE_MOB_LAYER
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- var/duration = 10
+ var/duration = 10 //in deciseconds
var/randomdir = TRUE
+ var/timerid
-/obj/effect/temp_visual/New()
+/obj/effect/temp_visual/Initialize(mapload)
+ . = ..()
if(randomdir)
setDir(pick(cardinal))
- QDEL_IN(src, duration)
+ timerid = QDEL_IN(src, duration)
+
+/obj/effect/temp_visual/Destroy()
+ . = ..()
+ deltimer(timerid)
/obj/effect/temp_visual/singularity_act()
return
@@ -24,7 +31,7 @@
/obj/effect/temp_visual/dir_setting
randomdir = FALSE
-/obj/effect/temp_visual/dir_setting/New(loc, set_dir)
+/obj/effect/temp_visual/dir_setting/Initialize(mapload, set_dir)
if(set_dir)
setDir(set_dir)
- ..()
\ No newline at end of file
+ . = ..()
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index f21bbb69c02..87f489513d2 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -1,6 +1,6 @@
//TODO: Flash range does nothing currently
-/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1, cause = null, breach = TRUE)
+/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0, silent = 0, smoke = 1, cause = null, breach = TRUE)
src = null //so we don't abort once src is deleted
epicenter = get_turf(epicenter)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index a8803ffb6ed..073cd0df669 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -149,6 +149,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
/obj/item/blob_act()
qdel(src)
+/obj/item/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
+ extinguish()
+
/obj/item/verb/move_to_top()
set name = "Move To Top"
set category = null
diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm
index a975a0b4d06..fb59b24aeda 100644
--- a/code/game/objects/items/dehy_carp.dm
+++ b/code/game/objects/items/dehy_carp.dm
@@ -22,6 +22,10 @@
owned = 0
return ..()
+/obj/item/toy/carpplushie/dehy_carp/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
+ if(volume >= 1)
+ Swell()
/obj/item/toy/carpplushie/dehy_carp/afterattack(obj/O, mob/user,proximity)
if(!proximity) return
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 50cab97ee48..db7c08b1863 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -136,7 +136,9 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \
/obj/item/clothing/suit/space/eva/plasmaman/miner,
/obj/item/clothing/head/helmet/space/eva/plasmaman/miner,
/obj/item/clothing/suit/hooded/explorer,
- /obj/item/clothing/head/hooded/explorer
+ /obj/item/clothing/head/hooded/explorer,
+ /obj/item/clothing/suit/space/eva/plasmaman/explorer,
+ /obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
))
/obj/item/stack/sheet/animalhide/goliath_hide/afterattack(atom/target, mob/user, proximity_flag)
@@ -203,7 +205,12 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \
else
..()
-//Step two - washing..... it's actually in washing machine code.
+//Step two - washing (also handled by water reagent code and washing machine code)
+/obj/item/stack/sheet/hairlesshide/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
+ if(volume >= 10)
+ new /obj/item/stack/sheet/wetleather(get_turf(src), amount)
+ qdel(src)
//Step three - drying
/obj/item/stack/sheet/wetleather/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 2c1222154b0..94f195e9c20 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -385,8 +385,8 @@ var/global/list/datum/stack_recipe/brass_recipes = list (\
GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = 1, on_floor = 1, time = 40), \
new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2), \
- new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/food/drinks/waterbottle/empty), \
- new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/food/drinks/waterbottle/large/empty,3), \
+ new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \
+ new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
new /datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("plastic ashtray", /obj/item/ashtray/plastic, 2, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("plastic fork", /obj/item/kitchen/utensil/pfork, 1, on_floor = 1), \
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index b0a1286d3b2..75decb95413 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -111,16 +111,11 @@
if(istype(E, /datum/stack_recipe))
var/datum/stack_recipe/R = E
- var/max_multiplier = round(src.amount / R.req_amount)
+ var/max_multiplier = round(amount / R.req_amount)
var/title
var/can_build = 1
can_build = can_build && (max_multiplier > 0)
- /*
- if(R.one_per_turf)
- can_build = can_build && !(locate(R.result_type) in usr.loc)
- if(R.on_floor)
- can_build = can_build && istype(usr.loc, /turf/simulated/floor)
- */
+
if(R.res_amount > 1)
title += "[R.res_amount]x [R.title]\s"
else
@@ -131,12 +126,13 @@
else
t1 += "[title]"
continue
- if(R.max_res_amount>1 && max_multiplier>1)
+ if(R.max_res_amount > 1 && max_multiplier > 1)
max_multiplier = min(max_multiplier, round(R.max_res_amount / R.res_amount))
t1 += " |"
- var/list/multipliers = list(5,10,25)
+
+ var/list/multipliers = list(5, 10, 25)
for(var/n in multipliers)
- if(max_multiplier>=n)
+ if(max_multiplier >= n)
t1 += " [n * R.res_amount]x"
if(!(max_multiplier in multipliers))
t1 += " [max_multiplier * R.res_amount]x"
@@ -165,7 +161,7 @@
var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])]
var/multiplier = text2num(href_list["multiplier"])
- if(!multiplier)
+ if(!multiplier || multiplier <= 0 || multiplier > 50) // Href exploit checks
multiplier = 1
if(amount < R.req_amount * multiplier)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 6b54f61537e..c03b9694cfa 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -93,14 +93,14 @@ GLOBAL_LIST_INIT(captain_display_cases, list())
icon = 'icons/obj/stationobjs.dmi'
icon_state = "glassbox20"
desc = "A display case for prized possessions. It taunts you to kick it."
- density = 1
- anchored = 1
- unacidable = 1 //Dissolving the case would also delete the contents.
+ density = TRUE
+ anchored = TRUE
+ unacidable = TRUE //Dissolving the case would also delete the contents.
var/health = 30
var/obj/item/occupant = null
- var/destroyed = 0
- var/locked = 0
- var/burglar_alarm = 0
+ var/destroyed = FALSE
+ var/locked = FALSE
+ var/burglar_alarm = FALSE
var/ue = null
var/image/occupant_overlay = null
var/obj/item/airlock_electronics/circuit
@@ -116,8 +116,8 @@ GLOBAL_LIST_INIT(captain_display_cases, list())
/obj/structure/displaycase/captains_laser
name = "captain's display case"
desc = "A display case for the captain's antique laser gun. Hooked up with an anti-theft system."
- burglar_alarm = 1
- locked = 1
+ burglar_alarm = TRUE
+ locked = TRUE
req_access = list(access_captain)
start_showpiece_type = /obj/item/gun/energy/laser/captain
@@ -205,7 +205,7 @@ GLOBAL_LIST_INIT(captain_display_cases, list())
return
/obj/structure/displaycase/proc/burglar_alarm()
- if(burglar_alarm)
+ if(burglar_alarm && is_station_contact(z))
var/area/alarmed = get_area(src)
alarmed.burglaralert(src)
visible_message("The burglar alarm goes off!")
@@ -215,10 +215,10 @@ GLOBAL_LIST_INIT(captain_display_cases, list())
sleep(74) // 7.4 seconds long
/obj/structure/displaycase/update_icon()
- if(src.destroyed)
- src.icon_state = "glassbox2b"
+ if(destroyed)
+ icon_state = "glassbox2b"
else
- src.icon_state = "glassbox2[locked]"
+ icon_state = "glassbox2[locked]"
overlays = 0
if(occupant)
var/icon/occupant_icon=getFlatIcon(occupant)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index b48774eb046..726d9a88a7f 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -600,7 +600,7 @@
wateract = (W.wash(user, src))
busy = 0
if(wateract)
- W.water_act(20,310.15,src)
+ W.water_act(20, 310.15, src)
if("Disconnect")
user.visible_message("[user] starts disconnecting [src].", "You begin disconnecting [src]...")
if(do_after(user, 40 * O.toolspeed, target = src))
@@ -633,7 +633,7 @@
wateract = (O.wash(user, src))
busy = 0
if(wateract)
- O.water_act(20,310.15,src)
+ O.water_act(20, 310.15, src)
/obj/structure/sink/update_icon()
..()
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index a80bab94055..541240beb9f 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -18,8 +18,25 @@
visibilityChanged()
/turf/simulated/proc/break_tile()
+ return
/turf/simulated/proc/burn_tile()
+ return
+
+/turf/simulated/proc/water_act(volume, temperature, source)
+ if(volume >= 3)
+ MakeSlippery()
+
+ for(var/mob/living/carbon/slime/M in src)
+ M.apply_water()
+
+ var/hotspot = (locate(/obj/effect/hotspot) in src)
+ if(hotspot)
+ var/datum/gas_mixture/lowertemp = remove_air(air.total_moles())
+ lowertemp.temperature = max(min(lowertemp.temperature-2000,lowertemp.temperature / 2), 0)
+ lowertemp.react()
+ assume_air(lowertemp)
+ qdel(hotspot)
/turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost
if(wet >= wet_setting)
@@ -99,7 +116,7 @@
if(TURF_WET_PERMAFROST) // Permafrost
M.slip("the frosted floor", 0, 5, tilesSlipped = 1, walkSafely = 0, slipAny = 1)
-/turf/simulated/ChangeTurf(var/path)
+/turf/simulated/ChangeTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE)
. = ..()
queue_smooth_neighbors(src)
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 2877f9f01d5..7166a7fbfc0 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -120,30 +120,40 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
/turf/simulated/floor/proc/make_plating()
return ChangeTurf(/turf/simulated/floor/plating)
-/turf/simulated/floor/ChangeTurf(turf/simulated/floor/T, defer_change = FALSE, keep_icon = TRUE)
- if(!istype(src,/turf/simulated/floor)) return ..() //fucking turfs switch the fucking src of the fucking running procs
- if(!ispath(T,/turf/simulated/floor)) return ..()
+/turf/simulated/floor/ChangeTurf(turf/simulated/floor/T, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE)
+ if(!istype(src, /turf/simulated/floor))
+ return ..() //fucking turfs switch the fucking src of the fucking running procs
+ if(!ispath(T, /turf/simulated/floor))
+ return ..()
+
var/old_icon = icon_regular_floor
var/old_plating = icon_plating
var/old_dir = dir
+
var/turf/simulated/floor/W = ..()
+
if(keep_icon)
W.icon_regular_floor = old_icon
W.icon_plating = old_plating
W.dir = old_dir
+
W.update_icon()
return W
/turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob, params)
if(!C || !user)
- return 1
+ return TRUE
+
if(..())
- return 1
+ return TRUE
+
if(intact && iscrowbar(C))
pry_tile(C, user)
- return 1
+ return TRUE
+
if(intact && istype(C, /obj/item/stack/tile))
try_replace_tile(C, user, params)
+
if(istype(C, /obj/item/pipe))
var/obj/item/pipe/P = C
if(P.pipe_type != -1) // ANY PIPE
@@ -152,6 +162,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
"You slide [P] along \the [src].", \
"You hear the scrape of metal against something.")
user.drop_item()
+
if(P.is_bent_pipe()) // bent pipe rotation fix see construction.dm
P.dir = 5
if(user.dir == 1)
@@ -161,13 +172,14 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
else if(user.dir == 4)
P.dir = 10
else
- P.dir = user.dir
+ P.setDir(user.dir)
+
P.x = src.x
P.y = src.y
P.z = src.z
- P.loc = src
- return 1
- return 0
+ P.forceMove(src)
+ return TRUE
+ return FALSE
/turf/simulated/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
if(T.turf_type == type)
diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm
index 1a8522ba9be..43d77bd39be 100644
--- a/code/game/turfs/simulated/floor/asteroid.dm
+++ b/code/game/turfs/simulated/floor/asteroid.dm
@@ -58,18 +58,21 @@
gets_dug()
return
- if(istype(W,/obj/item/storage/bag/ore))
+ else if(istype(W,/obj/item/storage/bag/ore))
var/obj/item/storage/bag/ore/S = W
if(S.collection_mode == 1)
for(var/obj/item/stack/ore/O in src.contents)
O.attackby(W,user)
return
- if(istype(W, /obj/item/stack/tile))
+ else if(istype(W, /obj/item/stack/tile))
var/obj/item/stack/tile/Z = W
if(!Z.use(1))
return
- ChangeTurf(Z.turf_type)
+ if(istype(Z, /obj/item/stack/tile/plasteel)) // Turn asteroid floors into plating by default
+ ChangeTurf(/turf/simulated/floor/plating, keep_icon = FALSE)
+ else
+ ChangeTurf(Z.turf_type, keep_icon = FALSE)
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
/turf/simulated/floor/plating/asteroid/gets_drilled()
@@ -89,12 +92,6 @@
slowdown = 0
return
-/turf/simulated/floor/plating/asteroid/singularity_act()
- return
-
-/turf/simulated/floor/plating/asteroid/singularity_pull(S, current_size)
- return
-
/turf/simulated/floor/plating/asteroid/basalt
name = "volcanic floor"
baseturf = /turf/simulated/floor/plating/asteroid/basalt
@@ -164,7 +161,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
has_data = TRUE
/turf/simulated/floor/plating/asteroid/airless/cave/volcanic
- mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast = 50, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, \
+ mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, \
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 40, /mob/living/simple_animal/hostile/spawner/lavaland = 2, \
/mob/living/simple_animal/hostile/asteroid/hivelord/legion = 30, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, \
SPAWN_MEGAFAUNA = 6, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10)
diff --git a/code/game/turfs/simulated/floor/chasm.dm b/code/game/turfs/simulated/floor/chasm.dm
index f3273c7786a..6a213400d04 100644
--- a/code/game/turfs/simulated/floor/chasm.dm
+++ b/code/game/turfs/simulated/floor/chasm.dm
@@ -8,7 +8,7 @@
canSmoothWith = list(/turf/simulated/floor/chasm)
density = TRUE //This will prevent hostile mobs from pathing into chasms, while the canpass override will still let it function like an open turf
var/static/list/falling_atoms = list() //Atoms currently falling into the chasm
- var/static/list/forbidden_types = typecacheof(list(/obj/effect/portal, /obj/singularity, /obj/structure/stone_tile, /obj/item/projectile, /obj/effect/temp_visual, /obj/effect/collapse, /obj/effect/collapse, /atom/movable/lighting_object))
+ var/static/list/forbidden_types = typecacheof(list(/obj/effect/portal, /obj/singularity, /obj/structure/stone_tile, /obj/item/projectile, /obj/effect/temp_visual, /obj/effect/collapse, /obj/effect/collapse))
var/drop_x = 1
var/drop_y = 1
var/drop_z = 1
@@ -75,7 +75,7 @@
return FALSE
if(!isliving(AM) && !isobj(AM))
return FALSE
- if(is_type_in_typecache(AM, forbidden_types) || AM.throwing)
+ if(!AM.simulated || is_type_in_typecache(AM, forbidden_types) || AM.throwing)
return FALSE
//Flies right over the chasm
if(isliving(AM))
diff --git a/code/game/turfs/simulated/floor/lava.dm b/code/game/turfs/simulated/floor/lava.dm
index c1a8bfd6fea..d1ee346b302 100644
--- a/code/game/turfs/simulated/floor/lava.dm
+++ b/code/game/turfs/simulated/floor/lava.dm
@@ -53,13 +53,13 @@
return FALSE
var/thing_to_check = src
- if (AM)
+ if(AM)
thing_to_check = list(AM)
for(var/thing in thing_to_check)
- if(istype(thing, /atom/movable/lighting_object) || istype(thing, /atom/movable/overlay))
- continue
if(isobj(thing))
var/obj/O = thing
+ if(!O.simulated)
+ continue
if((O.resistance_flags & (LAVA_PROOF|INDESTRUCTIBLE)) || O.throwing)
continue
. = 1
@@ -71,7 +71,7 @@
O.resistance_flags &= ~FIRE_PROOF
O.fire_act(10000, 1000)
- else if (isliving(thing))
+ else if(isliving(thing))
. = 1
var/mob/living/L = thing
if(L.flying)
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index de1e61039e7..ddf71b96798 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -43,6 +43,9 @@
name = "beach"
icon = 'icons/misc/beach.dmi'
+/turf/simulated/floor/beach/pry_tile(obj/item/C, mob/user, silent = FALSE)
+ return
+
/turf/simulated/floor/beach/sand
name = "sand"
icon_state = "sand"
@@ -67,10 +70,6 @@
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/obj/machinery/poolcontroller/linkedcontroller = null
-/turf/simulated/floor/beach/water/pry_tile(obj/item/C, mob/user, silent = FALSE)
- return //cannot pry off tiles of water
-
-
/turf/simulated/floor/beach/water/New()
..()
var/image/overlay_image = image('icons/misc/beach.dmi', icon_state = "water5", layer = ABOVE_MOB_LAYER)
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 6218b2a702d..ee53cd0ca35 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -2,7 +2,7 @@
name = "plating"
icon_state = "plating"
icon = 'icons/turf/floors/plating.dmi'
- intact = 0
+ intact = FALSE
floor_tile = null
broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
burnt_states = list("floorscorched1", "floorscorched2")
@@ -25,16 +25,16 @@
/turf/simulated/floor/plating/attackby(obj/item/C, mob/user, params)
if(..())
- return 1
+ return TRUE
if(istype(C, /obj/item/stack/rods))
if(broken || burnt)
to_chat(user, "Repair the plating first!")
- return 1
+ return TRUE
var/obj/item/stack/rods/R = C
if(R.get_amount() < 2)
to_chat(user, "You need two rods to make a reinforced floor!")
- return 1
+ return TRUE
else
to_chat(user, "You begin reinforcing the floor...")
if(do_after(user, 30 * C.toolspeed, target = src))
@@ -43,7 +43,7 @@
playsound(src, C.usesound, 80, 1)
R.use(2)
to_chat(user, "You reinforce the floor.")
- return 1
+ return TRUE
else if(istype(C, /obj/item/stack/tile))
if(!broken && !burnt)
@@ -54,20 +54,20 @@
playsound(src, 'sound/weapons/genhit.ogg', 50, 1)
else
to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.")
- return 1
+ return TRUE
else if(istype(C, /obj/item/weldingtool))
var/obj/item/weldingtool/welder = C
- if( welder.isOn() && (broken || burnt) )
- if(welder.remove_fuel(0,user))
+ if(welder.isOn() && (broken || burnt))
+ if(welder.remove_fuel(0, user))
to_chat(user, "You fix some dents on the broken plating.")
playsound(src, welder.usesound, 80, 1)
overlays -= current_overlay
current_overlay = null
- burnt = 0
- broken = 0
+ burnt = FALSE
+ broken = FALSE
update_icon()
- return 1
+ return TRUE
/turf/simulated/floor/plating/airless
icon_state = "plating"
@@ -103,6 +103,9 @@
/turf/simulated/floor/engine/attack_hand(mob/user as mob)
user.Move_Pulled(src)
+/turf/simulated/floor/engine/pry_tile(obj/item/C, mob/user, silent = FALSE)
+ return
+
/turf/simulated/floor/engine/attackby(obj/item/C as obj, mob/user as mob, params)
if(!C || !user)
return
@@ -115,6 +118,7 @@
new /obj/item/stack/rods(src, 2)
ChangeTurf(/turf/simulated/floor/plating)
return
+
if(istype(C, /obj/item/stack/sheet/plasteel) && !insulated) //Insulating the floor
to_chat(user, "You begin insulating [src]...")
if(do_after(user, 40, target = src) && !insulated) //You finish insulating the insulated insulated insulated insulated insulated insulated insulated insulated vacuum floor
@@ -220,6 +224,9 @@
/turf/simulated/floor/snow/ex_act(severity)
return
+/turf/simulated/floor/snow/pry_tile(obj/item/C, mob/user, silent = FALSE)
+ return
+
/turf/simulated/floor/plating/metalfoam
name = "foamed metal plating"
icon_state = "metalfoam"
@@ -238,7 +245,8 @@
/turf/simulated/floor/plating/metalfoam/attackby(var/obj/item/C, mob/user, params)
if(..())
- return 1
+ return TRUE
+
if(istype(C) && C.force)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index ad3e981154d..119f0b000d9 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -22,7 +22,7 @@
var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles
var/last_act = 0
var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner
- var/defer_change = 0
+ var/defer_change = FALSE
/turf/simulated/mineral/New()
if (!canSmoothWith)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 23038b21be5..8163bc75acc 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -136,7 +136,7 @@
var/obj/structure/sign/poster/P = O
P.roll_and_drop(src)
else
- O.loc = src
+ O.forceMove(src)
ChangeTurf(/turf/simulated/floor/plating)
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index 02c183353d8..74d0e216614 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -275,8 +275,20 @@
icon_state = "map-overspace"
fixed_underlay = list("space"=1)
+/turf/simulated/wall/mineral/plastitanium/coated
+ name = "coated wall"
+ max_temperature = INFINITY
+ icon_state = "map-shuttle_nd"
+ smooth = SMOOTH_MORE
+
+/turf/simulated/wall/mineral/plastitanium/coated/Initialize(mapload)
+ . = ..()
+ desc += " It seems to have additional plating to protect against heat."
+
/turf/simulated/wall/mineral/plastitanium/explosive
var/explosive_wall_group = EXPLOSIVE_WALL_GROUP_SYNDICATE_BASE
+ icon_state = "map-shuttle_nd"
+ smooth = SMOOTH_MORE
/turf/simulated/wall/mineral/plastitanium/explosive/Initialize(mapload)
. = ..()
@@ -287,9 +299,12 @@
return ..()
/turf/simulated/wall/mineral/plastitanium/explosive/proc/self_destruct()
- var/obj/item/bombcore/large/bombcore = new(get_turf(src))
+ var/obj/item/bombcore/large/explosive_wall/bombcore = new(get_turf(src))
bombcore.detonate()
+/turf/simulated/wall/mineral/plastitanium/explosive/ex_act(severity)
+ return
+
//have to copypaste this code
/turf/simulated/wall/mineral/plastitanium/interior/copyTurf(turf/T)
if(T.type != type)
diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm
index c08189e4d93..79bf171ce1f 100644
--- a/code/game/turfs/space/transit.dm
+++ b/code/game/turfs/space/transit.dm
@@ -88,7 +88,7 @@
/turf/space/transit/Entered(atom/movable/AM, atom/OldLoc, ignoreRest = 0)
if(!AM)
return
- if(istype(AM, /obj/docking_port) || !AM.simulated)
+ if(!AM.simulated || istype(AM, /obj/docking_port))
return //this was fucking hilarious, the docking ports were getting thrown to random Z-levels
var/max = world.maxx-TRANSITIONEDGE
var/min = 1+TRANSITIONEDGE
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 9ca42122410..53cf1917404 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -180,8 +180,8 @@
if(L)
qdel(L)
-/turf/proc/TerraformTurf(path)
- return ChangeTurf(path)
+/turf/proc/TerraformTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE)
+ return ChangeTurf(path, defer_change, keep_icon, ignore_air)
//Creates a new turf
/turf/proc/ChangeTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE)
@@ -209,7 +209,6 @@
if(!defer_change)
W.AfterChange(ignore_air)
-
W.blueprint_data = old_blueprint_data
recalc_atom_opacity()
@@ -492,16 +491,14 @@
var/turf/T0 = src
for(var/X in T0.GetAllContents())
var/atom/A = X
+ if(!A.simulated)
+ continue
if(istype(A, /mob/dead))
continue
if(istype(A, /obj/effect/landmark))
continue
if(istype(A, /obj/docking_port))
continue
- if(istype(A, /atom/movable/lighting_object))
- continue
- if(!A.simulated)
- continue
qdel(A, force=TRUE)
T0.ChangeTurf(turf_type)
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 2d076b4e90f..a2a95db957a 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -29,7 +29,7 @@ client/proc/one_click_antag()
// You pass in ROLE define (optional), the applicant, and the gamemode, and it will return true / false depending on whether the applicant qualify for the candidacy in question
if(jobban_isbanned(M, "Syndicate"))
return FALSE
- if(M.stat || !M.mind || M.mind.special_role)
+ if(M.stat || !M.mind || M.mind.special_role || M.mind.offstation_role)
return FALSE
if(temp)
if((M.mind.assigned_role in temp.restricted_jobs) || (M.client.prefs.species in temp.protected_species))
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index f8d008c0c2c..d52507bee1d 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -167,7 +167,7 @@
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user)
- if(level_blocks_magic(user.z))//this is to make sure the wizard does NOT summon a demon from the Den..
+ if(level_blocks_magic(user.z)) //this is to make sure the wizard does NOT summon a demon from the Den..
to_chat(user, "You should probably wait until you reach the station.")
return
@@ -177,7 +177,10 @@
used = TRUE
to_chat(user, "You break the seal on the bottle, calling upon the dire spirits of the underworld...")
- var/list/candidates = pollCandidates("Do you want to play as a slaughter demon summoned by [user.real_name]?", ROLE_DEMON, 1, 100)
+ var/type = "slaughter"
+ if(demon_type == /mob/living/simple_animal/slaughter/laughter)
+ type = "laughter"
+ var/list/candidates = pollCandidates("Do you want to play as a [type] demon summoned by [user.real_name]?", ROLE_DEMON, 1, 100)
if(candidates.len > 0)
var/mob/C = pick(candidates)
@@ -208,7 +211,6 @@
KillDaCrew.owner = S.mind
KillDaCrew.explanation_text = "[objective_verb] everyone else while you're at it."
S.mind.objectives += KillDaCrew
- S.mind.objectives += KillDaCrew
to_chat(S, "Objective #[1]: [KillDaWiz.explanation_text]")
to_chat(S, "Objective #[2]: [KillDaCrew.explanation_text]")
@@ -220,7 +222,7 @@
color = "#FF69B4" // HOT PINK
veil_msg = "You sense an adorable presence \
lurking just beyond the veil..."
- objective_verb = "Hug and Tickle"
+ objective_verb = "Hug and tickle"
demon_type = /mob/living/simple_animal/slaughter/laughter
///////////MORPH
@@ -248,7 +250,7 @@
used = TRUE
to_chat(user, "You break the seal on the bottle, calling upon the dire sludge to awaken...")
- var/list/candidates = pollCandidates("Do you want to play as a morph awakened by [user.real_name]?", ROLE_MORPH, 1, 100)
+ var/list/candidates = pollCandidates("Do you want to play as a magical morph awakened by [user.real_name]?", ROLE_MORPH, 1, 100)
if(candidates.len > 0)
var/mob/C = pick(candidates)
@@ -262,7 +264,7 @@
to_chat(user, "The sludge does not respond to your attempt to awake it. Perhaps you should try again later.")
/obj/item/antag_spawner/morph/spawn_antag(client/C, turf/T, type = "", mob/user)
- var/mob/living/simple_animal/hostile/morph/M = new /mob/living/simple_animal/hostile/morph(pick(xeno_spawn))
+ var/mob/living/simple_animal/hostile/morph/wizard/M = new /mob/living/simple_animal/hostile/morph/wizard(pick(xeno_spawn))
M.key = C.key
M.mind.assigned_role = SPECIAL_ROLE_MORPH
M.mind.special_role = SPECIAL_ROLE_MORPH
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 37a29d8e79e..9a74edfdc62 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -28,9 +28,9 @@
var/datum/disease/disease = null //Do they start with a pre-spawned disease?
var/mob_color //Change the mob's color
var/assignedrole
- var/banType = "lavaland"
+ var/banType = ROLE_GHOST
var/ghost_usable = TRUE
-
+ var/offstation_role = TRUE // If set to true, the role of the user's mind will be set to offstation
/obj/effect/mob_spawn/attack_ghost(mob/user)
var/mob/dead/observer/O = user
@@ -111,6 +111,7 @@
MM.objectives += new/datum/objective(objective)
if(assignedrole)
M.mind.assigned_role = assignedrole
+ M.mind.offstation_role = offstation_role
special(M, name)
MM.name = M.real_name
if(uses > 0)
diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm
index 816007d4ff8..4d5d464e136 100644
--- a/code/modules/awaymissions/maploader/reader.dm
+++ b/code/modules/awaymissions/maploader/reader.dm
@@ -176,7 +176,7 @@ var/global/dmm_suite/preloader/_preloader = new
for(var/t in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])))
var/turf/T = t
//we do this after we load everything in. if we don't; we'll have weird atmos bugs regarding atmos adjacent turfs
- T.AfterChange(1,keep_cabling = TRUE)
+ T.AfterChange(1, keep_cabling = TRUE)
return bounds
/**
@@ -321,7 +321,7 @@ var/global/dmm_suite/preloader/_preloader = new
var/turf/T = locate(x,y,z)
if(T)
if(ispath(path, /turf))
- T.ChangeTurf(path, 1, 0)
+ T.ChangeTurf(path, defer_change = TRUE, keep_icon = FALSE)
instance = T
else if(ispath(path, /area))
diff --git a/code/modules/awaymissions/mission_code/academy.dm b/code/modules/awaymissions/mission_code/academy.dm
index 9ae1cdb223e..2c764443e72 100644
--- a/code/modules/awaymissions/mission_code/academy.dm
+++ b/code/modules/awaymissions/mission_code/academy.dm
@@ -3,7 +3,7 @@
/area/awaymission/academy
name = "\improper Academy Asteroids"
icon_state = "away"
- report_alerts = 0
+ report_alerts = FALSE
/area/awaymission/academy/headmaster
name = "\improper Academy Fore Block"
diff --git a/code/modules/awaymissions/mission_code/centcomAway.dm b/code/modules/awaymissions/mission_code/centcomAway.dm
index 447c53b0fb6..1dc26f932e0 100644
--- a/code/modules/awaymissions/mission_code/centcomAway.dm
+++ b/code/modules/awaymissions/mission_code/centcomAway.dm
@@ -3,7 +3,7 @@
/area/awaymission/centcomAway
name = "XCC-P5831"
icon_state = "away"
- report_alerts = 0
+ report_alerts = FALSE
/area/awaymission/centcomAway/general
name = "XCC-P5831"
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index e84df256f6b..ed888d65465 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -161,7 +161,7 @@ var/sc_safecode5 = "[rand(0,9)]"
desc = "Your body becomes weak and your feel your mind slipping away as you try to comprehend what you know can't be possible."
move_self = 0 //Contianed narsie does not move!
grav_pull = 0 //Contained narsie does not pull stuff in!
- var/uneatable = list(/turf/space, /obj/effect/overlay, /atom/movable/lighting_object, /mob/living/simple_animal/hostile/construct)
+ var/uneatable = list(/turf/space, /obj/effect/overlay, /mob/living/simple_animal/hostile/construct)
//Override this to prevent no adminlog runtimes and admin warnings about a singularity without containment
/obj/singularity/narsie/sc_Narsie/admin_investigate_setup()
@@ -173,14 +173,16 @@ var/sc_safecode5 = "[rand(0,9)]"
mezzer()
/obj/singularity/narsie/sc_Narsie/consume(var/atom/A)
+ if(!A.simulated)
+ return FALSE
if(is_type_in_list(A, uneatable))
- return 0
+ return FALSE
if(istype(A,/mob/living))
var/mob/living/L = A
L.gib()
else if(istype(A,/obj/))
var/obj/O = A
- O.ex_act(1.0)
+ O.ex_act(1)
if(O) qdel(O)
else if(isturf(A))
var/turf/T = A
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 2675d778366..35f346402f9 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -258,8 +258,8 @@
item_state = "head_mirror"
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/head.dmi',
- "Drask" = 'icons/mob/species/drask/head.dmi',
- "Grey" = 'icons/mob/species/grey/head.dmi'
+ "Vox" = 'icons/mob/species/vox/head.dmi',
+ "Drask" = 'icons/mob/species/drask/head.dmi',
+ "Grey" = 'icons/mob/species/grey/head.dmi'
)
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 6a33cdc5a1a..289250befac 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -70,6 +70,15 @@
armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 0, "bio" = 50, "rad" = 0)
resistance_flags = FIRE_PROOF
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/mask.dmi',
+ "Unathi" = 'icons/mob/species/unathi/mask.dmi',
+ "Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
+ "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
+ "Drask" = 'icons/mob/species/drask/mask.dmi',
+ "Grey" = 'icons/mob/species/grey/mask.dmi'
+ )
+
/obj/item/clothing/mask/gas/explorer/attack_self(mob/user)
adjustmask(user)
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 57588f29d62..e355aead650 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -235,6 +235,16 @@
base_state = "plasmamanMiner_helmet"
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+/obj/item/clothing/suit/space/eva/plasmaman/explorer
+ name = "plasmaman explorer suit"
+ icon_state = "plasmamanExplorer_suit"
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
+ name = "plasmaman explorer helmet"
+ icon_state = "plasmamanExplorer_helmet0"
+ base_state = "plasmamanExplorer_helmet"
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
// MEDSCI
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index bf9d9a4569b..6bfd40ad0ad 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -224,6 +224,8 @@
item_state = "explorer"
item_color = "explorer"
+ sprite_sheets = list()
+
/obj/item/clothing/under/barber
desc = "It's a barber's uniform."
name = "barber's uniform"
diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm
index be145752671..811eed6b9de 100644
--- a/code/modules/events/wormholes.dm
+++ b/code/modules/events/wormholes.dm
@@ -34,7 +34,6 @@
qdel(O)
wormholes.Cut()
-
/obj/effect/portal/wormhole
name = "wormhole"
desc = "It looks highly unstable; It could close at any moment."
@@ -42,23 +41,26 @@
icon_state = "anom"
failchance = 0
-/obj/effect/portal/wormhole/attack_hand(mob/user)
- teleport(user)
+/obj/effect/portal/wormhole/can_teleport(atom/movable/M)
+ . = ..()
-/obj/effect/portal/wormhole/attackby(obj/item/I, mob/user, params)
- teleport(user)
+ if(istype(M, /obj/singularity))
+ . = FALSE
/obj/effect/portal/wormhole/teleport(atom/movable/M)
- if(istype(M, /obj/effect)) //sparks don't teleport
- return
- if(M.anchored && istype(M, /obj/mecha))
- return
+ if(!can_teleport(M))
+ return FALSE
- if(istype(M, /atom/movable))
- var/turf/target
- if(GLOB.portals.len)
- var/obj/effect/portal/P = pick(GLOB.portals)
- if(P && isturf(P.loc))
- target = P.loc
- if(!target) return
- do_teleport(M, target, 1, 1, 0, 0) ///You will appear adjacent to the beacon
+ var/turf/target
+ if(GLOB.portals.len)
+ var/obj/effect/portal/P = pick(GLOB.portals)
+ if(P && isturf(P.loc))
+ target = P.loc
+
+ if(!target)
+ return FALSE
+
+ if(!do_teleport(M, target, 1, TRUE)) ///You will appear adjacent to the beacon
+ return FALSE
+
+ return TRUE
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 785231a588d..41c5ff0bdf3 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -354,31 +354,6 @@
icon_state = "goonbag"
list_reagents = list("wine" = 70)
-/obj/item/reagent_containers/food/drinks/waterbottle
- name = "bottle of water"
- desc = "A bottle of water filled at an old Earth bottling facility."
- icon = 'icons/obj/drinks.dmi'
- icon_state = "smallbottle"
- item_state = "bottle"
- list_reagents = list("water" = 49.5, "fluorine" = 0.5) //see desc, don't think about it too hard
- materials = list(MAT_GLASS = 0)
- volume = 50
- amount_per_transfer_from_this = 10
-
-/obj/item/reagent_containers/food/drinks/waterbottle/empty
- list_reagents = list()
-
-/obj/item/reagent_containers/food/drinks/waterbottle/large
- desc = "A fresh commercial-sized bottle of water."
- icon_state = "largebottle"
- materials = list(MAT_GLASS = 0)
- list_reagents = list("water" = 100)
- volume = 100
- amount_per_transfer_from_this = 20
-
-/obj/item/reagent_containers/food/drinks/waterbottle/large/empty
- list_reagents = list()
-
/obj/item/reagent_containers/food/drinks/oilcan
name = "oil can"
desc = "Contains oil intended for use on cyborgs, robots, and other synthetics."
diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm
index 7d557561e49..eb9569ad356 100644
--- a/code/modules/food_and_drinks/food/foods/meat.dm
+++ b/code/modules/food_and_drinks/food/foods/meat.dm
@@ -129,7 +129,7 @@
name = "goliath meat"
desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava."
icon_state = "goliathmeat"
- list_reagents = list("nutriment" = 3, "toxin" = 5)
+ list_reagents = list("protein" = 3, "toxin" = 5)
/obj/item/reagent_containers/food/snacks/goliath/burn()
visible_message("[src] finishes cooking!")
@@ -222,6 +222,7 @@
resistance_flags = LAVA_PROOF | FIRE_PROOF
icon_state = "goliathsteak"
trash = null
+ list_reagents = list("protein" = 6, "vitamin" = 2)
//////////////////////
// Cubes //
@@ -237,8 +238,9 @@
var/datum/species/monkey_type = /datum/species/monkey
list_reagents = list("nutriment" = 2)
-/obj/item/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature)
- if(volume >= 5)
+/obj/item/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
+ if(volume >= 1)
return Expand()
/obj/item/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 132b2257bfd..48b4453f6d4 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -11,17 +11,15 @@
idle_power_usage = 5
active_power_usage = 100
var/max_n_of_items = 1500
- var/icon_on = "smartfridge"
- var/icon_off = "smartfridge-off"
- var/icon_panel = "smartfridge-panel"
var/item_quants = list()
- var/seconds_electrified = 0;
- var/shoot_inventory = 0
- var/locked = 0
- var/scan_id = 1
- var/is_secure = 0
+ var/seconds_electrified = 0
+ var/shoot_inventory = FALSE
+ var/locked = FALSE
+ var/scan_id = TRUE
+ var/is_secure = FALSE
var/can_dry = FALSE
var/drying = FALSE
+ var/visible_contents = TRUE
var/datum/wires/smartfridge/wires = null
/obj/machinery/smartfridge/New()
@@ -65,8 +63,6 @@
desc = "When you need seeds fast!"
icon = 'icons/obj/vending.dmi'
icon_state = "seeds"
- icon_on = "seeds"
- icon_off = "seeds-off"
/obj/machinery/smartfridge/seeds/accept_check(obj/item/O)
if(istype(O,/obj/item/seeds/))
@@ -77,7 +73,6 @@
name = "\improper Refrigerated Medicine Storage"
desc = "A refrigerated storage unit for storing medicine and chemicals."
icon_state = "smartfridge" //To fix the icon in the map editor.
- icon_on = "smartfridge"
/obj/machinery/smartfridge/medbay/accept_check(obj/item/O)
if(istype(O,/obj/item/reagent_containers/glass))
@@ -104,7 +99,6 @@
name = "\improper Secure Refrigerated Medicine Storage"
desc = "A refrigerated storage unit for storing medicine and chemicals."
icon_state = "smartfridge" //To fix the icon in the map editor.
- icon_on = "smartfridge"
req_one_access_txt = "5;33"
/obj/machinery/smartfridge/secure/medbay/accept_check(obj/item/O)
@@ -122,7 +116,6 @@
name = "\improper Smart Chemical Storage"
desc = "A refrigerated storage unit for medicine and chemical storage."
icon_state = "smartfridge" //To fix the icon in the map editor.
- icon_on = "smartfridge"
req_access_txt = "33"
var/list/spawn_meds = list()
@@ -162,12 +155,10 @@
desc = "A machine capable of storing a variety of disks. Denoted by most as the DSU (disk storage unit)."
icon_state = "disktoaster"
pass_flags = PASSTABLE
+ visible_contents = FALSE
/obj/machinery/smartfridge/disks/accept_check(obj/item/O)
- if(istype(O, /obj/item/disk/))
- return TRUE
- else
- return FALSE
+ return istype(O, /obj/item/disk)
// ----------------------------
// Virology Medical Smartfridge
@@ -227,7 +218,7 @@
/obj/machinery/smartfridge/update_icon()
if(stat & (BROKEN|NOPOWER))
icon_state = "[initial(icon_state)]-off"
- else
+ else if(visible_contents)
switch(contents.len)
if(0)
icon_state = "[initial(icon_state)]"
@@ -237,6 +228,8 @@
icon_state = "[initial(icon_state)]2"
if(76 to INFINITY)
icon_state = "[initial(icon_state)]3"
+ else
+ icon_state = "[initial(icon_state)]"
/*******************
* Item Adding
@@ -460,13 +453,12 @@
name = "drying rack"
desc = "A wooden contraption, used to dry plant products, food and leather."
icon = 'icons/obj/hydroponics/equipment.dmi'
- icon_state = "drying_rack_on"
+ icon_state = "drying_rack"
use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 200
- icon_on = "drying_rack_on"
- icon_off = "drying_rack"
can_dry = TRUE
+ visible_contents = FALSE
/obj/machinery/smartfridge/drying_rack/New()
..()
@@ -524,6 +516,7 @@
/obj/machinery/smartfridge/drying_rack/update_icon()
..()
+
overlays.Cut()
if(drying)
overlays += "drying_rack_drying"
diff --git a/code/modules/library/random_books.dm b/code/modules/library/random_books.dm
index 9fc396f5eff..f36e493ce3f 100644
--- a/code/modules/library/random_books.dm
+++ b/code/modules/library/random_books.dm
@@ -49,7 +49,7 @@
if(prob(25))
category = null
var/c = category? " AND category='[sanitizeSQL(category)]'" :""
- var/DBQuery/query_get_random_books = dbcon.NewQuery("SELECT * FROM [format_table_name("library")] WHERE isnull(flagged)[c] GROUP BY title ORDER BY rand() LIMIT [amount];")
+ var/DBQuery/query_get_random_books = dbcon.NewQuery("SELECT * FROM [format_table_name("library")] WHERE (isnull(flagged) OR flagged = 0)[c] GROUP BY title ORDER BY rand() LIMIT [amount];")
query_get_random_books.Execute()
while(query_get_random_books.NextRow())
var/obj/item/book/B = new(location)
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
new file mode 100644
index 00000000000..d846e065761
--- /dev/null
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -0,0 +1,357 @@
+/area/survivalpod
+ name = "\improper Emergency Shelter"
+ icon_state = "away"
+ requires_power = FALSE
+ has_gravity = TRUE
+ dynamic_lighting = DYNAMIC_LIGHTING_FORCED
+
+/obj/item/survivalcapsule
+ name = "bluespace shelter capsule"
+ desc = "An emergency shelter stored within a pocket of bluespace."
+ icon_state = "capsule"
+ icon = 'icons/obj/mining.dmi'
+ w_class = WEIGHT_CLASS_TINY
+ origin_tech = "engineering=3;bluespace=3"
+ var/template_id = "shelter_alpha"
+ var/datum/map_template/shelter/template
+ var/used = FALSE
+
+/obj/item/survivalcapsule/proc/get_template()
+ if(template)
+ return
+ template = shelter_templates[template_id]
+ if(!template)
+ log_runtime("Shelter template ([template_id]) not found!", src)
+ qdel(src)
+
+/obj/item/survivalcapsule/examine(mob/user)
+ . = ..()
+ get_template()
+ to_chat(user, "This capsule has the [template.name] stored.")
+ to_chat(user, template.description)
+
+/obj/item/survivalcapsule/attack_self()
+ // Can't grab when capsule is New() because templates aren't loaded then
+ get_template()
+ if(used == FALSE)
+ loc.visible_message("[src] begins to shake. Stand back!")
+ used = TRUE
+ sleep(50)
+ var/turf/deploy_location = get_turf(src)
+ var/status = template.check_deploy(deploy_location)
+ switch(status)
+ if(SHELTER_DEPLOY_BAD_AREA)
+ loc.visible_message("[src] will not function in this area.")
+ if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS)
+ var/width = template.width
+ var/height = template.height
+ loc.visible_message("[src] doesn't have room to deploy! You need to clear a [width]x[height] area!")
+
+ if(status != SHELTER_DEPLOY_ALLOWED)
+ used = FALSE
+ return
+
+ playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1)
+
+ var/turf/T = deploy_location
+ if(!is_mining_level(T.z))//only report capsules away from the mining/lavaland level
+ message_admins("[key_name_admin(usr)] ([ADMIN_QUE(usr,"?")]) ([ADMIN_FLW(usr,"FLW")]) activated a bluespace capsule away from the mining level! (JMP)")
+ log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
+ template.load(deploy_location, centered = TRUE)
+ new /obj/effect/particle_effect/smoke(get_turf(src))
+ qdel(src)
+
+/obj/item/survivalcapsule/luxury
+ name = "luxury bluespace shelter capsule"
+ desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace."
+ origin_tech = "engineering=3;bluespace=4"
+ template_id = "shelter_beta"
+
+//Pod turfs and objects
+
+//Window
+/obj/structure/window/shuttle/survival_pod
+ name = "pod window"
+ icon = 'icons/obj/smooth_structures/pod_window.dmi'
+ icon_state = "smooth"
+ dir = FULLTILE_WINDOW_DIR
+ max_integrity = 100
+ fulltile = TRUE
+ reinf = TRUE
+ heat_resistance = 1600
+ armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100)
+ smooth = SMOOTH_MORE
+ canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod)
+ explosion_block = 3
+ level = 3
+ glass_type = /obj/item/stack/sheet/titaniumglass
+ glass_amount = 2
+
+/obj/structure/window/reinforced/survival_pod
+ name = "pod window"
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "pwindow"
+
+//Floors
+/turf/simulated/floor/pod
+ name = "pod floor"
+ icon_state = "podfloor"
+ icon_regular_floor = "podfloor"
+ floor_tile = /obj/item/stack/tile/pod
+
+/turf/simulated/floor/pod/light
+ icon_state = "podfloor_light"
+ icon_regular_floor = "podfloor_light"
+ floor_tile = /obj/item/stack/tile/pod/light
+
+/turf/simulated/floor/pod/dark
+ icon_state = "podfloor_dark"
+ icon_regular_floor = "podfloor_dark"
+ floor_tile = /obj/item/stack/tile/pod/dark
+
+//Door
+/obj/machinery/door/airlock/survival_pod
+ icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_pod
+
+/obj/machinery/door/airlock/survival_pod/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/structure/door_assembly/door_assembly_pod
+ name = "pod airlock assembly"
+ icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
+ base_name = "pod airlock"
+ overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
+ airlock_type = /obj/machinery/door/airlock/survival_pod
+ glass_type = /obj/machinery/door/airlock/survival_pod/glass
+
+//Windoor
+/obj/machinery/door/window/survival_pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "windoor"
+ base_state = "windoor"
+
+//Table
+/obj/structure/table/survival_pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "table"
+ smooth = SMOOTH_FALSE
+
+//Sleeper
+/obj/machinery/sleeper/survival_pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "sleeper-open"
+ density = FALSE
+
+/obj/machinery/sleeper/survival_pod/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/circuitboard/sleeper/survival(null)
+ var/obj/item/stock_parts/matter_bin/B = new(null)
+ B.rating = initial_bin_rating
+ component_parts += B
+ component_parts += new /obj/item/stock_parts/manipulator(null)
+ component_parts += new /obj/item/stock_parts/console_screen(null)
+ component_parts += new /obj/item/stock_parts/console_screen(null)
+ component_parts += new /obj/item/stack/cable_coil(null, 1)
+ RefreshParts()
+
+//NanoMed
+/obj/machinery/vending/wallmed1/survival_pod
+ name = "survival pod medical supply"
+ desc = "Wall-mounted Medical Equipment dispenser. This one seems just a tiny bit smaller."
+ req_access = list()
+ refill_canister = null
+
+ products = list(/obj/item/reagent_containers/food/pill/patch/styptic = 5,
+ /obj/item/reagent_containers/food/pill/patch/silver_sulf = 5,
+ /obj/item/reagent_containers/food/pill/charcoal = 2,
+ /obj/item/stack/medical/bruise_pack/advanced = 1,
+ /obj/item/stack/medical/ointment/advanced = 1,
+ /obj/item/reagent_containers/hypospray/autoinjector = 2,
+ /obj/item/stack/medical/splint = 1)
+ contraband = list(/obj/item/reagent_containers/food/pill/tox = 2,
+ /obj/item/reagent_containers/food/pill/morphine = 2)
+
+//Computer
+/obj/item/gps/computer
+ name = "pod computer"
+ icon_state = "pod_computer"
+ icon = 'icons/obj/lavaland/pod_computer.dmi'
+ anchored = 1
+ density = 1
+ pixel_y = -32
+
+/obj/item/gps/computer/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/wrench))
+ playsound(loc, W.usesound, 50, 1)
+ user.visible_message("[user] disassembles the gps.", \
+ "You start to disassemble the gps...", "You hear clanking and banging noises.")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ new /obj/item/gps(loc)
+ qdel(src)
+ return ..()
+
+/obj/item/gps/computer/attack_hand(mob/user)
+ attack_self(user)
+
+//Bed
+/obj/structure/bed/pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "bed"
+
+//Survival Storage Unit
+/obj/machinery/smartfridge/survival_pod
+ name = "survival pod storage"
+ desc = "A heated storage unit."
+ icon_state = "donkvendor"
+ icon = 'icons/obj/lavaland/donkvendor.dmi'
+ light_range = 8
+ light_power = 1.2
+ light_color = "#DDFFD3"
+ max_n_of_items = 10
+ pixel_y = -4
+ can_deconstruct = FALSE
+ var/empty = FALSE
+
+/obj/machinery/smartfridge/survival_pod/Initialize(mapload)
+ . = ..()
+
+ if(empty)
+ return
+
+ for(var/i in 1 to 5)
+ var/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak/W = new(src)
+ load(W)
+ if(prob(50))
+ var/obj/item/storage/pill_bottle/dice/D = new(src)
+ load(D)
+ else
+ var/obj/item/instrument/guitar/G = new(src)
+ load(G)
+
+/obj/machinery/smartfridge/survival_pod/update_icon()
+ return
+
+/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O)
+ return isitem(O)
+
+/obj/machinery/smartfridge/survival_pod/empty
+ name = "dusty survival pod storage"
+ desc = "A heated storage unit. This one's seen better days."
+ empty = TRUE
+
+//Fans
+/obj/structure/fans
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "fans"
+ name = "environmental regulation system"
+ desc = "A large machine releasing a constant gust of air."
+ anchored = 1
+ density = 1
+ var/arbitraryatmosblockingvar = 1
+ var/buildstacktype = /obj/item/stack/sheet/metal
+ var/buildstackamount = 5
+
+/obj/structure/fans/Initialize(loc)
+ ..()
+ air_update_turf(1)
+
+/obj/structure/fans/Destroy()
+ arbitraryatmosblockingvar = 0
+ air_update_turf(1)
+ return ..()
+
+/obj/structure/fans/CanAtmosPass(turf/T)
+ return !arbitraryatmosblockingvar
+
+/obj/structure/fans/deconstruct()
+ if(buildstacktype)
+ new buildstacktype(loc, buildstackamount)
+ qdel(src)
+
+/obj/structure/fans/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/wrench))
+ playsound(loc, W.usesound, 50, 1)
+ user.visible_message("[user] disassembles the fan.", \
+ "You start to disassemble the fan...", "You hear clanking and banging noises.")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ deconstruct()
+ return ..()
+
+/obj/structure/fans/tiny
+ name = "tiny fan"
+ desc = "A tiny fan, releasing a thin gust of air."
+ layer = TURF_LAYER+0.1
+ density = 0
+ icon_state = "fan_tiny"
+ buildstackamount = 2
+
+/obj/structure/fans/tiny/invisible
+ name = "air flow blocker"
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF
+ unacidable = TRUE
+ invisibility = INVISIBILITY_ABSTRACT
+
+//Signs
+/obj/structure/sign/mining
+ name = "nanotrasen mining corps sign"
+ desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims."
+ icon = 'icons/turf/walls/survival_pod_walls.dmi'
+ icon_state = "ntpod"
+
+/obj/structure/sign/mining/survival
+ name = "shelter sign"
+ desc = "A high visibility sign designating a safe shelter."
+ icon = 'icons/turf/walls/survival_pod_walls.dmi'
+ icon_state = "survival"
+
+//Fluff
+/obj/structure/tubes
+ icon_state = "tubes"
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ name = "tubes"
+ anchored = 1
+ layer = MOB_LAYER - 0.2
+ density = 0
+
+/obj/structure/tubes/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/wrench))
+ playsound(loc, W.usesound, 50, 1)
+ user.visible_message("[user] disassembles [src].", \
+ "You start to disassemble [src]...", "You hear clanking and banging noises.")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ new /obj/item/stack/rods(loc)
+ qdel(src)
+ return ..()
+
+/obj/item/fakeartefact
+ name = "expensive forgery"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x2"
+ var/possible = list(/obj/item/ship_in_a_bottle,
+ /obj/item/gun/energy/pulse,
+ /obj/item/sleeping_carp_scroll,
+ /obj/item/shield/changeling,
+ /obj/item/lava_staff,
+ /obj/item/katana/energy,
+ /obj/item/hierophant_staff,
+ /obj/item/storage/toolbox/green/memetic,
+ /obj/item/gun/projectile/automatic/l6_saw,
+ /obj/item/gun/magic/staff/chaos,
+ /obj/item/gun/magic/staff/spellblade,
+ /obj/item/gun/magic/wand/death,
+ /obj/item/gun/magic/wand/fireball,
+ /obj/item/stack/telecrystal/twenty,
+ /obj/item/banhammer)
+
+/obj/item/fakeartefact/New()
+ . = ..()
+ var/obj/item/I = pick(possible)
+ name = initial(I.name)
+ icon = initial(I.icon)
+ desc = initial(I.desc)
+ icon_state = initial(I.icon_state)
+ item_state = initial(I.item_state)
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 787d60797d4..ade3c1ffd5c 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -487,7 +487,7 @@
/datum/data/mining_equipment/New(name, path, equipment_cost)
equipment_name = name
equipment_path = path
- equipment_cost = cost
+ cost = equipment_cost
/obj/machinery/mineral/equipment_vendor/New()
..()
@@ -701,7 +701,7 @@
/obj/item/wormhole_jaunter
name = "wormhole jaunter"
- desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to blue space for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least."
+ desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to bluespace for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least.\nThanks to modifications provided by the Free Golems, this jaunter can be worn on the belt to provide protection from chasms."
icon = 'icons/obj/items.dmi'
icon_state = "Jaunter"
item_state = "electronic"
@@ -710,15 +710,16 @@
throw_speed = 3
throw_range = 5
origin_tech = "bluespace=2"
+ slot_flags = SLOT_BELT
/obj/item/wormhole_jaunter/attack_self(mob/user)
- user.visible_message("[user.name] activates the [src.name]!")
+ user.visible_message("[user.name] activates the [name]!")
activate(user, TRUE)
/obj/item/wormhole_jaunter/proc/turf_check(mob/user)
var/turf/device_turf = get_turf(user)
if(!device_turf || !is_teleport_allowed(device_turf.z))
- to_chat(user, "You're having difficulties getting the [src.name] to work.")
+ to_chat(user, "You're having difficulties getting the [name] to work.")
return FALSE
return TRUE
@@ -738,49 +739,42 @@
var/list/L = get_destinations(user)
if(!L.len)
- to_chat(user, "The [src.name] found no beacons in the world to anchor a wormhole to.")
+ to_chat(user, "The [name] found no beacons in the world to anchor a wormhole to.")
return
var/chosen_beacon = pick(L)
- var/obj/effect/portal/wormhole/jaunt_tunnel/J = new (get_turf(src), src, 100, null, FALSE, get_turf(chosen_beacon))
+ var/obj/effect/portal/jaunt_tunnel/J = new(get_turf(src), get_turf(chosen_beacon), src, 100)
if(adjacent)
try_move_adjacent(J)
+ else
+ J.teleport(user)
playsound(src,'sound/effects/sparks4.ogg',50,1)
qdel(src)
/obj/item/wormhole_jaunter/proc/chasm_react(mob/user)
- if(user.get_item_by_slot(SLOT_BELT) == src)
+ if(user.get_item_by_slot(slot_belt) == src)
to_chat(user, "Your [name] activates, saving you from the chasm!")
activate(user, FALSE)
else
to_chat(user, "[src] is not attached to your belt, preventing it from saving you from the chasm. RIP.")
-/obj/effect/portal/wormhole/jaunt_tunnel
+/obj/effect/portal/jaunt_tunnel
name = "jaunt tunnel"
icon = 'icons/effects/effects.dmi'
icon_state = "bhole3"
desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
+ failchance = 0
-/obj/effect/portal/wormhole/jaunt_tunnel/teleport(atom/movable/M)
- if(istype(M, /obj/effect))
- return
- if(istype(M, /atom/movable))
- if(do_teleport(M, target, 6))
- if(isliving(M))
- var/mob/living/L = M
- L.Weaken(3)
- if(ishuman(L))
- shake_camera(L, 20, 1)
- var/mob/living/carbon/human/H = L
- spawn(20)
- if(H && H.check_has_mouth())
- H.visible_message("[L.name] vomits from travelling through the [src.name]!", "You throw up from travelling through the [src.name]!")
- H.nutrition -= 20
- H.adjustToxLoss(-3)
- var/turf/T = get_turf(H)
- T.add_vomit_floor()
- else
- visible_message("[src] flickers and fails, due to bluespace interference!")
- qdel(src)
+/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M)
+ . = ..()
+ if(.)
+ // KERPLUNK
+ playsound(M,'sound/weapons/resonator_blast.ogg', 50, 1)
+ if(iscarbon(M))
+ var/mob/living/carbon/L = M
+ L.Weaken(6)
+ if(ishuman(L))
+ shake_camera(L, 20, 1)
+ addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
/**********************Resonator**********************/
diff --git a/code/modules/mining/explorer_gear.dm b/code/modules/mining/explorer_gear.dm
index 9cae3f42f19..6453f54c979 100644
--- a/code/modules/mining/explorer_gear.dm
+++ b/code/modules/mining/explorer_gear.dm
@@ -14,15 +14,30 @@
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
resistance_flags = FIRE_PROOF
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi',
+ "Drask" = 'icons/mob/species/drask/suit.dmi',
+ "Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
+ "Unathi" = 'icons/mob/species/unathi/suit.dmi',
+ "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi'
+ )
+
/obj/item/clothing/head/hooded/explorer
name = "explorer hood"
desc = "An armoured hood for exploring harsh environments."
icon_state = "explorer"
item_state = "explorer"
body_parts_covered = HEAD
- flags = BLOCKHAIR
+ flags = BLOCKHAIR | NODROP
flags_cover = HEADCOVERSEYES
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
- resistance_flags = FIRE_PROOF
\ No newline at end of file
+ resistance_flags = FIRE_PROOF
+
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/head.dmi',
+ "Drask" = 'icons/mob/species/drask/head.dmi',
+ "Grey" = 'icons/mob/species/grey/head.dmi',
+ "Skrell" = 'icons/mob/species/skrell/head.dmi'
+ )
\ No newline at end of file
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index 0e0d248d8b7..ab714c6f1a6 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -4,6 +4,7 @@
icon_state = "l_mushroom"
name = "large mushrooms"
desc = "A number of large mushrooms, covered in a faint layer of ash and what can only be spores."
+ anchored = TRUE
var/harvested_name = "shortened mushrooms"
var/harvested_desc = "Some quickly regrowing mushrooms, formerly known to be quite large."
var/needs_sharp_harvest = TRUE
diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
index a213a7cfe17..4f8f01498d0 100644
--- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm
+++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
@@ -72,7 +72,7 @@
var/mob/dead/observer/current_spirits = list()
for(var/mob/dead/observer/O in GLOB.player_list)
- if(is_type_in_list(O.following, contents))
+ if((O.following in contents))
ghost_counter++
O.invisibility = 0
current_spirits |= O
@@ -198,7 +198,7 @@
user.visible_message("[user] turns \the [T] into [transform_string]!")
message_admins("[key_name_admin(user)] fired the lava staff at [get_area(target)] (JMP).")
log_game("[key_name(user)] fired the lava staff at [get_area(target)] ([T.x], [T.y], [T.z]).")
- T.ChangeTurf(turf_type)
+ T.TerraformTurf(turf_type, keep_icon = FALSE)
timer = world.time + create_cooldown
qdel(L)
else
@@ -207,7 +207,7 @@
return
else
user.visible_message("[user] turns \the [T] into [reset_string]!")
- T.ChangeTurf(reset_turf_type)
+ T.TerraformTurf(reset_turf_type, keep_icon = FALSE)
timer = world.time + reset_cooldown
playsound(T,'sound/magic/fireball.ogg', 200, 1)
diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm
index 33e4a9297c9..2490f6f48db 100644
--- a/code/modules/mining/lavaland/loot/colossus_loot.dm
+++ b/code/modules/mining/lavaland/loot/colossus_loot.dm
@@ -5,8 +5,6 @@
desc = "A completely indestructible chunk of crystal, rumoured to predate the start of this universe. It looks like you could store things inside it."
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "blackbox"
- icon_on = "blackbox"
- icon_off = "blackbox"
luminosity = 8
max_n_of_items = INFINITY
unacidable = 1
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 573ff630350..d8286bc8698 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -30,7 +30,6 @@
if(6)
new /obj/item/pickaxe/diamond(src)
if(7)
- new /obj/item/clothing/head/culthood(src)
new /obj/item/clothing/suit/hooded/cultrobes(src)
new /obj/item/bedsheet/cult(src)
if(8)
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 860692673a5..03b8404b1f0 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -20,18 +20,27 @@
anchored = TRUE
var/obj/machinery/mineral/processing_unit/machine = null
var/machinedir = EAST
+ speed_process = TRUE
-/obj/machinery/mineral/processing_unit_console/New()
- ..()
+/obj/machinery/mineral/processing_unit_console/Initialize(mapload)
+ . = ..()
machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
if(machine)
machine.CONSOLE = src
else
- qdel(src)
+ return INITIALIZE_HINT_QDEL
+
+/obj/machinery/mineral/processing_unit_console/attack_ghost(mob/user)
+ return ui_interact(user)
/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user)
if(..())
- return
+ return TRUE
+
+ return ui_interact(user)
+
+/obj/machinery/mineral/processing_unit_console/ui_interact(mob/user)
+ . = ..()
if(!machine)
return
@@ -43,7 +52,8 @@
/obj/machinery/mineral/processing_unit_console/Topic(href, href_list)
if(..())
- return
+ return TRUE
+
usr.set_machine(src)
add_fingerprint(usr)
@@ -59,15 +69,14 @@
machine.on = (href_list["set_on"] == "on")
updateUsrDialog()
+ return TRUE
/obj/machinery/mineral/processing_unit_console/Destroy()
machine = null
return ..()
-
/**********************Mineral processing unit**************************/
-
/obj/machinery/mineral/processing_unit
name = "furnace"
icon = 'icons/obj/machines/mining_machines.dmi'
@@ -81,8 +90,8 @@
var/datum/research/files
speed_process = TRUE
-/obj/machinery/mineral/processing_unit/New()
- ..()
+/obj/machinery/mineral/processing_unit/Initialize(mapload)
+ . = ..()
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, TRUE, /obj/item/stack)
files = new /datum/research/smelter(src)
@@ -99,6 +108,7 @@
for(var/obj/item/stack/ore/O in T)
process_ore(O)
CHECK_TICK
+
if(on)
if(selected_material)
smelt_ore()
@@ -106,11 +116,9 @@
else if(selected_alloy)
smelt_alloy()
-
if(CONSOLE)
CONSOLE.updateUsrDialog()
-
/obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/stack/ore/O)
GET_COMPONENT(materials, /datum/component/material_container)
var/material_amount = materials.get_item_material_amount(O)
@@ -167,7 +175,6 @@
var/out = get_step(src, output_dir)
materials.retrieve_sheets(sheets_to_remove, selected_material, out)
-
/obj/machinery/mineral/processing_unit/proc/smelt_alloy()
var/datum/design/alloy = files.FindDesignByID(selected_alloy) //check if it's a valid design
if(!alloy)
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 72b36bd38a5..8ba8b13c09c 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -93,8 +93,8 @@
icon_state = "pickaxe"
flags = CONDUCT
slot_flags = SLOT_BELT
- force = 15.0
- throwforce = 10.0
+ force = 15
+ throwforce = 10
item_state = "pickaxe"
w_class = WEIGHT_CLASS_BULKY
materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
@@ -114,6 +114,13 @@
name = "emergency disembarkation tool"
desc = "For extracting yourself from rough landings."
+/obj/item/pickaxe/safety
+ name = "safety pickaxe"
+ desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."
+ force = 1
+ throwforce = 1
+ attack_verb = list("ineffectively hit")
+
/obj/item/pickaxe/silver
name = "silver-plated pickaxe"
icon_state = "spickaxe"
@@ -193,8 +200,8 @@
icon_state = "shovel"
flags = CONDUCT
slot_flags = SLOT_BELT
- force = 8.0
- throwforce = 4.0
+ force = 8
+ throwforce = 4
item_state = "shovel"
w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=50)
@@ -208,11 +215,17 @@
desc = "A small tool for digging and moving dirt."
icon_state = "spade"
item_state = "spade"
- force = 5.0
- throwforce = 7.0
+ force = 5
+ throwforce = 7
w_class = WEIGHT_CLASS_SMALL
toolspeed = 2
+/obj/item/shovel/safety
+ name = "safety shovel"
+ desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."
+ force = 1
+ throwforce = 1
+ attack_verb = list("ineffectively hit")
/**********************Mining car (Crate like thing, not the rail car)**************************/
@@ -279,351 +292,3 @@
colorindex = 0
icon_state = "mobcap[colorindex]"
update_icon()
-
-/*****************************Survival Pod********************************/
-
-
-/area/survivalpod
- name = "\improper Emergency Shelter"
- icon_state = "away"
- requires_power = FALSE
- has_gravity = TRUE
- dynamic_lighting = DYNAMIC_LIGHTING_FORCED
-
-/obj/item/survivalcapsule
- name = "bluespace shelter capsule"
- desc = "An emergency shelter stored within a pocket of bluespace."
- icon_state = "capsule"
- icon = 'icons/obj/mining.dmi'
- w_class = WEIGHT_CLASS_TINY
- origin_tech = "engineering=3;bluespace=3"
- var/template_id = "shelter_alpha"
- var/datum/map_template/shelter/template
- var/used = FALSE
-
-/obj/item/survivalcapsule/proc/get_template()
- if(template)
- return
- template = shelter_templates[template_id]
- if(!template)
- log_runtime("Shelter template ([template_id]) not found!", src)
- qdel(src)
-
-/obj/item/survivalcapsule/examine(mob/user)
- . = ..()
- get_template()
- to_chat(user, "This capsule has the [template.name] stored.")
- to_chat(user, template.description)
-
-/obj/item/survivalcapsule/attack_self()
- // Can't grab when capsule is New() because templates aren't loaded then
- get_template()
- if(used == FALSE)
- loc.visible_message("[src] begins to shake. Stand back!")
- used = TRUE
- sleep(50)
- var/turf/deploy_location = get_turf(src)
- var/status = template.check_deploy(deploy_location)
- switch(status)
- if(SHELTER_DEPLOY_BAD_AREA)
- loc.visible_message("[src] will not function in this area.")
- if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS)
- var/width = template.width
- var/height = template.height
- loc.visible_message("[src] doesn't have room to deploy! You need to clear a [width]x[height] area!")
-
- if(status != SHELTER_DEPLOY_ALLOWED)
- used = FALSE
- return
-
- playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1)
-
- var/turf/T = deploy_location
- if(!is_mining_level(T.z))//only report capsules away from the mining/lavaland level
- message_admins("[key_name_admin(usr)] ([ADMIN_QUE(usr,"?")]) ([ADMIN_FLW(usr,"FLW")]) activated a bluespace capsule away from the mining level! (JMP)")
- log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
- template.load(deploy_location, centered = TRUE)
- new /obj/effect/particle_effect/smoke(get_turf(src))
- qdel(src)
-
-/obj/item/survivalcapsule/luxury
- name = "luxury bluespace shelter capsule"
- desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace."
- origin_tech = "engineering=3;bluespace=4"
- template_id = "shelter_beta"
-
-//Pod turfs and objects
-
-//Window
-/obj/structure/window/shuttle/survival_pod
- name = "pod window"
- icon = 'icons/obj/smooth_structures/pod_window.dmi'
- icon_state = "smooth"
- dir = FULLTILE_WINDOW_DIR
- max_integrity = 100
- fulltile = TRUE
- reinf = TRUE
- heat_resistance = 1600
- armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100)
- smooth = SMOOTH_MORE
- canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod)
- explosion_block = 3
- level = 3
- glass_type = /obj/item/stack/sheet/titaniumglass
- glass_amount = 2
-
-/obj/structure/window/reinforced/survival_pod
- name = "pod window"
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "pwindow"
-
-//Floors
-/turf/simulated/floor/pod
- name = "pod floor"
- icon_state = "podfloor"
- icon_regular_floor = "podfloor"
- floor_tile = /obj/item/stack/tile/pod
-
-/turf/simulated/floor/pod/light
- icon_state = "podfloor_light"
- icon_regular_floor = "podfloor_light"
- floor_tile = /obj/item/stack/tile/pod/light
-
-/turf/simulated/floor/pod/dark
- icon_state = "podfloor_dark"
- icon_regular_floor = "podfloor_dark"
- floor_tile = /obj/item/stack/tile/pod/dark
-
-//Door
-/obj/machinery/door/airlock/survival_pod
- icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
- overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_pod
-
-/obj/machinery/door/airlock/survival_pod/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/structure/door_assembly/door_assembly_pod
- name = "pod airlock assembly"
- icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
- base_name = "pod airlock"
- overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
- airlock_type = /obj/machinery/door/airlock/survival_pod
- glass_type = /obj/machinery/door/airlock/survival_pod/glass
-
-//Windoor
-/obj/machinery/door/window/survival_pod
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "windoor"
- base_state = "windoor"
-
-//Table
-/obj/structure/table/survival_pod
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "table"
- smooth = SMOOTH_FALSE
-
-//Sleeper
-/obj/machinery/sleeper/survival_pod
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "sleeper-open"
- density = 0
-
-/obj/machinery/sleeper/survival_pod/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/circuitboard/sleeper/survival(null)
- var/obj/item/stock_parts/matter_bin/B = new(null)
- B.rating = initial_bin_rating
- component_parts += B
- component_parts += new /obj/item/stock_parts/manipulator(null)
- component_parts += new /obj/item/stock_parts/console_screen(null)
- component_parts += new /obj/item/stock_parts/console_screen(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
-
-//Computer
-/obj/item/gps/computer
- name = "pod computer"
- icon_state = "pod_computer"
- icon = 'icons/obj/lavaland/pod_computer.dmi'
- anchored = 1
- density = 1
- pixel_y = -32
-
-/obj/item/gps/computer/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/wrench))
- playsound(loc, W.usesound, 50, 1)
- user.visible_message("[user] disassembles the gps.", \
- "You start to disassemble the gps...", "You hear clanking and banging noises.")
- if(do_after(user, 20 * W.toolspeed, target = src))
- new /obj/item/gps(loc)
- qdel(src)
- return ..()
-
-/obj/item/gps/computer/attack_hand(mob/user)
- attack_self(user)
-
-//Bed
-/obj/structure/bed/pod
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "bed"
-
-//Survival Storage Unit
-/obj/machinery/smartfridge/survival_pod
- name = "survival pod storage"
- desc = "A heated storage unit."
- icon_state = "donkvendor"
- icon = 'icons/obj/lavaland/donkvendor.dmi'
- icon_on = "donkvendor"
- icon_off = "donkvendor"
- light_range = 8
- max_n_of_items = 10
- pixel_y = -4
-
-/obj/machinery/smartfridge/survival_pod/update_icon()
- return
-
-/obj/item/circuitboard/smartfridge/survival
- name = "circuit board (Smartfridge Survival)"
- build_path = /obj/machinery/smartfridge/survival_pod
-
-/obj/item/circuitboard/smartfridge/attackby(obj/item/I, mob/user, params)
- return
-
-/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O)
- if(istype(O, /obj/item))
- return 1
- return 0
-
-/obj/machinery/smartfridge/survival_pod/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/circuitboard/smartfridge/survival(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- RefreshParts()
-
-/obj/machinery/smartfridge/survival_pod/loaded/New()
- ..()
- for(var/i in 1 to 5)
- var/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak/W = new(src)
- load(W)
- if(prob(50))
- var/obj/item/storage/pill_bottle/dice/D = new(src)
- load(D)
- else
- var/obj/item/instrument/guitar/G = new(src)
- load(G)
-
-//Fans
-/obj/structure/fans
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "fans"
- name = "environmental regulation system"
- desc = "A large machine releasing a constant gust of air."
- anchored = 1
- density = 1
- var/arbitraryatmosblockingvar = 1
- var/buildstacktype = /obj/item/stack/sheet/metal
- var/buildstackamount = 5
-
-/obj/structure/fans/Initialize(loc)
- ..()
- air_update_turf(1)
-
-/obj/structure/fans/Destroy()
- arbitraryatmosblockingvar = 0
- air_update_turf(1)
- return ..()
-
-/obj/structure/fans/CanAtmosPass(turf/T)
- return !arbitraryatmosblockingvar
-
-/obj/structure/fans/deconstruct()
- if(buildstacktype)
- new buildstacktype(loc, buildstackamount)
- qdel(src)
-
-/obj/structure/fans/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/wrench))
- playsound(loc, W.usesound, 50, 1)
- user.visible_message("[user] disassembles the fan.", \
- "You start to disassemble the fan...", "You hear clanking and banging noises.")
- if(do_after(user, 20 * W.toolspeed, target = src))
- deconstruct()
- return ..()
-
-/obj/structure/fans/tiny
- name = "tiny fan"
- desc = "A tiny fan, releasing a thin gust of air."
- layer = TURF_LAYER+0.1
- density = 0
- icon_state = "fan_tiny"
- buildstackamount = 2
-
-/obj/structure/fans/tiny/invisible
- name = "air flow blocker"
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF
- unacidable = TRUE
- invisibility = INVISIBILITY_ABSTRACT
-
-//Signs
-/obj/structure/sign/mining
- name = "nanotrasen mining corps sign"
- desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims."
- icon = 'icons/turf/walls/survival_pod_walls.dmi'
- icon_state = "ntpod"
-
-/obj/structure/sign/mining/survival
- name = "shelter sign"
- desc = "A high visibility sign designating a safe shelter."
- icon = 'icons/turf/walls/survival_pod_walls.dmi'
- icon_state = "survival"
-
-//Fluff
-/obj/structure/tubes
- icon_state = "tubes"
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- name = "tubes"
- anchored = 1
- layer = MOB_LAYER - 0.2
- density = 0
-
-/obj/structure/tubes/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/wrench))
- playsound(loc, W.usesound, 50, 1)
- user.visible_message("[user] disassembles [src].", \
- "You start to disassemble [src]...", "You hear clanking and banging noises.")
- if(do_after(user, 20 * W.toolspeed, target = src))
- new /obj/item/stack/rods(loc)
- qdel(src)
- return ..()
-
-/obj/item/fakeartefact
- name = "expensive forgery"
- icon = 'icons/mob/screen_gen.dmi'
- icon_state = "x2"
- var/possible = list(/obj/item/ship_in_a_bottle,
- /obj/item/gun/energy/pulse,
- /obj/item/sleeping_carp_scroll,
- /obj/item/shield/changeling,
- /obj/item/lava_staff,
- /obj/item/katana/energy,
- /obj/item/storage/toolbox/green/memetic,
- /obj/item/gun/projectile/automatic/l6_saw,
- /obj/item/gun/magic/staff/chaos,
- /obj/item/gun/magic/staff/spellblade,
- /obj/item/gun/magic/wand/death,
- /obj/item/gun/magic/wand/fireball,
- /obj/item/stack/telecrystal,
- /obj/item/banhammer)
-
-/obj/item/fakeartefact/New()
- . = ..()
- var/obj/item/I = pick(possible)
- name = initial(I.name)
- icon = initial(I.icon)
- desc = initial(I.desc)
- icon_state = initial(I.icon_state)
- item_state = initial(I.item_state)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 14ead863f53..c8c7d5c32e3 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -95,6 +95,11 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
updateallghostimages()
return ..()
+/mob/dead/observer/examine(mob/user)
+ ..()
+ if(!invisibility)
+ to_chat(user, "It seems extremely obvious.")
+
// This seems stupid, but it's the easiest way to avoid absolutely ridiculous shit from happening
// Copying an appearance directly from a mob includes it's verb list, it's invisibility, it's alpha, and it's density
// You might recognize these things as "fucking ridiculous to put in an appearance"
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index d412d604ec2..bb7bcfc94e1 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -245,6 +245,10 @@
/mob/proc/get_item_by_slot(slot_id)
switch(slot_id)
+ if(slot_wear_mask)
+ return wear_mask
+ if(slot_back)
+ return back
if(slot_l_hand)
return l_hand
if(slot_r_hand)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 31788ecc8cf..2c7a2d67c55 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -712,17 +712,18 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
return back
if(slot_wear_mask)
return wear_mask
- if(slot_handcuffed)
- return handcuffed
- if(slot_legcuffed)
- return legcuffed
+ if(slot_wear_suit)
+ return wear_suit
if(slot_l_hand)
return l_hand
if(slot_r_hand)
return r_hand
+ if(slot_handcuffed)
+ return handcuffed
+ if(slot_legcuffed)
+ return legcuffed
return null
-
//generates realistic-ish pulse output based on preset levels
/mob/living/carbon/proc/get_pulse(var/method) //method 0 is for hands, 1 is for machines, more accurate
var/temp = 0 //see setup.dm:694
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index d4cafa847fd..7b8790076ce 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -14,11 +14,10 @@
return TRUE
..()
-/mob/living/carbon/water_act(volume, temperature, source)
+/mob/living/carbon/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
if(volume > 10) //anything over 10 volume will make the mob wetter.
wetlevel = min(wetlevel + 1,5)
- ..()
-
/mob/living/carbon/attackby(obj/item/I, mob/user, params)
if(lying && surgeries.len)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 2cd524f8a15..bc0c33c233d 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1711,8 +1711,8 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
/mob/living/carbon/human/IsAdvancedToolUser()
if(dna.species.has_fine_manipulation)
- return 1
- return 0
+ return TRUE
+ return FALSE
/mob/living/carbon/human/get_permeability_protection()
var/list/prot = list("hands"=0, "chest"=0, "groin"=0, "legs"=0, "feet"=0, "arms"=0, "head"=0)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 873282ca1d4..b95920e688b 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -506,9 +506,9 @@ emp_act
return 0
..()
-/mob/living/carbon/human/water_act(volume, temperature, source)
- ..()
- dna.species.water_act(src,volume,temperature,source)
+/mob/living/carbon/human/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
+ dna.species.water_act(src, volume, temperature, source, method)
/mob/living/carbon/human/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE)
if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES))
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
index 7dc6c042e0c..85f491f71f0 100644
--- a/code/modules/mob/living/carbon/human/species/_species.dm
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -718,7 +718,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u
H.sync_lighting_plane_alpha()
-/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source)
+/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source, method = TOUCH)
if(abs(temperature - M.bodytemperature) > 10) //If our water and mob temperature varies by more than 10K, cool or/ heat them appropriately
M.bodytemperature = (temperature + M.bodytemperature) * 0.5 //Approximation for gradual heating or cooling
diff --git a/code/modules/mob/living/carbon/human/species/grey.dm b/code/modules/mob/living/carbon/human/species/grey.dm
index 29ab2a0ee8d..3b8bbe34ffb 100644
--- a/code/modules/mob/living/carbon/human/species/grey.dm
+++ b/code/modules/mob/living/carbon/human/species/grey.dm
@@ -36,10 +36,38 @@
genemutcheck(H, REMOTETALKBLOCK, null, MUTCHK_FORCED)
H.dna.default_blocks.Add(REMOTETALKBLOCK)
-/datum/species/grey/water_act(mob/living/carbon/human/H, volume, temperature, source)
- ..()
- H.take_organ_damage(5, min(volume, 20))
- H.emote("scream")
+/datum/species/grey/water_act(mob/living/carbon/human/H, volume, temperature, source, method = TOUCH)
+ . = ..()
+
+ if(method == TOUCH)
+ if(volume > 25)
+ if(H.wear_mask)
+ to_chat(H, "Your [H.wear_mask] protects you from the acid!")
+ return
+
+ if(H.head)
+ to_chat(H, "Your [H.wear_mask] protects you from the acid!")
+ return
+
+ if(prob(75))
+ H.take_organ_damage(5, 10)
+ H.emote("scream")
+ var/obj/item/organ/external/affecting = H.get_organ("head")
+ if(affecting)
+ affecting.disfigure()
+ else
+ H.take_organ_damage(5, 10)
+ else
+ H.take_organ_damage(5, 10)
+ else
+ to_chat(H, "The water stings[volume < 10 ? " you, but isn't concentrated enough to harm you" : null]!")
+ if(volume >= 10)
+ H.adjustFireLoss(min(max(4, (volume - 10) * 2), 20))
+ H.emote("scream")
+ to_chat(H, "The water stings[volume < 10 ? " you, but isn't concentrated enough to harm you" : null]!")
+ if(volume >= 10)
+ H.adjustFireLoss(min(max(4, (volume - 10) * 2), 20))
+ H.emote("scream")
/datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H)
var/translator_pref = H.client.prefs.speciesprefs
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index bb900cdb5b6..785d737aec2 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -130,8 +130,8 @@
suit=/obj/item/clothing/suit/space/eva/plasmaman/cargo
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/cargo
if("Shaft Miner")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/miner
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/miner
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/explorer
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
if("Botanist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/botanist
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/botanist
diff --git a/code/modules/mob/living/carbon/human/species/unathi.dm b/code/modules/mob/living/carbon/human/species/unathi.dm
index 72ee0f99cc2..6146f00fa6f 100644
--- a/code/modules/mob/living/carbon/human/species/unathi.dm
+++ b/code/modules/mob/living/carbon/human/species/unathi.dm
@@ -116,4 +116,4 @@
default_language = "Sinta'unathi"
slowdown = -0.80
- species_traits = list(NO_BREATHE, NOGUNS)
\ No newline at end of file
+ species_traits = list(NO_BREATHE, NOGUNS)
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index e0c58c484d8..276ee7b246e 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -3,9 +3,9 @@
set background = BACKGROUND_ENABLED
if(notransform)
- return 0
+ return FALSE
if(!loc)
- return 0
+ return FALSE
var/datum/gas_mixture/environment = loc.return_air()
if(client || registered_z) // This is a temporary error tracker to make sure we've caught everything
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index e9df2f0edad..f0c3b85ece1 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -216,13 +216,9 @@
fire_stacks += L.fire_stacks
IgniteMob()
-//Mobs on Fire end
-
-/mob/living/water_act(volume, temperature)
- if(volume >= 20) fire_stacks -= 0.5
- if(volume >= 50) fire_stacks -= 1
-
-
+/mob/living/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
+ adjust_fire_stacks(-(volume * 0.2))
//This is called when the mob is thrown into a dense turf
/mob/living/proc/turf_collision(var/turf/T, var/speed)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 1c82e9e8779..4a8d8c48f5b 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -98,7 +98,7 @@
return 0
/mob/living/silicon/IsAdvancedToolUser()
- return 1
+ return TRUE
/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 77eb74e5696..5feebb53059 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -594,7 +594,7 @@ var/robot_arm = /obj/item/robot_parts/l_arm
qdel(src)
/obj/item/honkbot_arm_assembly
- name = "incomplete honkbot assembly."
+ name = "incomplete honkbot assembly"
desc = "A clown box with a robot arm permanently grafted to it."
icon = 'icons/obj/aibots.dmi'
icon_state = "honkbot_arm"
@@ -625,8 +625,8 @@ var/robot_arm = /obj/item/robot_parts/l_arm
if(istype(W, /obj/item/instrument/trombone))
if(!user.unEquip(W))
return
- to_chat(user, "You add the trombone to [src]! Heeeenk! ")
+ to_chat(user, "You add the trombone to [src]! Heeeenk!")
qdel(W)
- var/mob/living/simple_animal/bot/honkbot/A = new /mob/living/simple_animal/bot/honkbot(T)
+ var/mob/living/simple_animal/bot/honkbot/A = new /mob/living/simple_animal/bot/honkbot(get_turf(src))
A.robot_arm = robot_arm
qdel(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index 958f493e309..45b10950669 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -37,7 +37,7 @@
. = ..()
update_icon()
auto_patrol = TRUE
- var/datum/job/clown/J = new/datum/job/clown
+ var/datum/job/clown/J = new /datum/job/clown()
access_card.access += J.get_access()
prev_access = access_card.access
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 62784a793f9..4dea368ad5e 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -16,8 +16,8 @@
turns_per_move = 5
see_in_dark = 6
mob_size = MOB_SIZE_SMALL
- simplespecies = /mob/living/simple_animal/pet/cat
- childtype = /mob/living/simple_animal/pet/cat/kitten
+ animal_species = /mob/living/simple_animal/pet/cat
+ childtype = list(/mob/living/simple_animal/pet/cat/kitten)
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 3)
response_help = "pets"
response_disarm = "gently pushes aside"
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 970ac596482..90ed82ff395 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -22,8 +22,8 @@
response_disarm = "bops"
response_harm = "kicks"
see_in_dark = 5
- childtype = /mob/living/simple_animal/pet/corgi/puppy
- simplespecies = /mob/living/simple_animal/pet/corgi
+ childtype = list(/mob/living/simple_animal/pet/corgi)
+ animal_species = /mob/living/simple_animal/pet/corgi
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
var/shaved = 0
var/obj/item/inventory_head
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 0f4fd774dc5..9c787639ba4 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -67,7 +67,7 @@
. = ..()
if(!.)
walk(src, 0)
- return 0
+ return FALSE
/mob/living/simple_animal/hostile/handle_automated_action()
if(AIStatus == AI_OFF)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 9486f1b11bb..68db8cb1274 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -130,7 +130,7 @@ Difficulty: Medium
playsound(T,'sound/magic/fireball.ogg', 200, 1)
new /obj/effect/temp_visual/fireball(T)
sleep(12)
- explosion(T, 0, 0, 1, 0, 0, 0, 1)
+ explosion(T, 0, 0, 1, 0, 0, 0, 1, 1)
/mob/living/simple_animal/hostile/megafauna/dragon/OpenFire()
anger_modifier = Clamp(((maxHealth - health)/50),0,20)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm
index a947cace8e2..28aacd37a73 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm
@@ -77,7 +77,6 @@
stat_attack = 1
flying = TRUE
robust_searching = 1
- var/fromtendril = FALSE
loot = list()
butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
index 391bc4ce67d..a1c488b4068 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
@@ -10,7 +10,7 @@
attack_sound = 'sound/weapons/punch4.ogg'
mouse_opacity = MOUSE_OPACITY_OPAQUE
move_to_delay = 40
- ranged = 1
+ ranged = TRUE
ranged_cooldown = 2 //By default, start the Goliath with his cooldown off so that people can run away quickly on first sight
ranged_cooldown_time = 120
friendly = "wails at"
@@ -31,12 +31,12 @@
move_force = MOVE_FORCE_VERY_STRONG
move_resist = MOVE_FORCE_VERY_STRONG
pull_force = MOVE_FORCE_VERY_STRONG
- var/pre_attack = 0
+ var/pre_attack = FALSE
var/pre_attack_icon = "Goliath_preattack"
- loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = 4.1})
+ loot = list(/obj/item/stack/sheet/animalhide/goliath_hide)
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
- ..()
+ . = ..()
handle_preattack()
/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack()
@@ -56,11 +56,10 @@
var/tturf = get_turf(target)
if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
visible_message("The [src.name] digs its tentacles under [target.name]!")
- new /obj/effect/goliath_tentacle/original(tturf, src)
+ new /obj/effect/temp_visual/goliath_tentacle/original(tturf, src)
ranged_cooldown = world.time + ranged_cooldown_time
icon_state = icon_aggro
- pre_attack = 0
- return
+ pre_attack = FALSE
/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(damage)
ranged_cooldown--
@@ -72,46 +71,105 @@
handle_preattack()
if(icon_state != icon_aggro)
icon_state = icon_aggro
- return
-/obj/effect/goliath_tentacle
- name = "Goliath tentacle"
+// Lavaland Goliath
+/mob/living/simple_animal/hostile/asteroid/goliath/beast
+ name = "goliath"
+ desc = "A hulking, armor-plated beast with long tendrils arching from its back."
+ icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
+ icon_state = "goliath"
+ icon_living = "goliath"
+ icon_aggro = "goliath"
+ icon_dead = "goliath_dead"
+ throw_message = "does nothing to the tough hide of the"
+ pre_attack_icon = "goliath2"
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
+ loot = list()
+ stat_attack = TRUE
+ robust_searching = TRUE
+
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/random/Initialize()
+ . = ..()
+ if(prob(1))
+ new /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient(loc)
+ return INITIALIZE_HINT_QDEL
+
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient
+ name = "ancient goliath"
+ desc = "Goliaths are biologically immortal, and rare specimens have survived for centuries. This one is clearly ancient, and its tentacles constantly churn the earth around it."
+ icon_state = "Goliath"
+ icon_living = "Goliath"
+ icon_aggro = "Goliath_alert"
+ icon_dead = "Goliath_dead"
+ maxHealth = 400
+ health = 400
+ speed = 4
+ pre_attack_icon = "Goliath_preattack"
+ throw_message = "does nothing to the rocky hide of the"
+ loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) //A throwback to the asteroid days
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/bone = 2)
+ wander = FALSE
+ var/list/cached_tentacle_turfs
+ var/turf/last_location
+ var/tentacle_recheck_cooldown = 100
+
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/Life()
+ . = ..()
+ if(!.) // dead
+ return
+ if(isturf(loc))
+ if(!LAZYLEN(cached_tentacle_turfs) || loc != last_location || tentacle_recheck_cooldown <= world.time)
+ LAZYCLEARLIST(cached_tentacle_turfs)
+ last_location = loc
+ tentacle_recheck_cooldown = world.time + initial(tentacle_recheck_cooldown)
+ for(var/turf/simulated/floor/T in orange(4, loc))
+ LAZYADD(cached_tentacle_turfs, T)
+ for(var/t in cached_tentacle_turfs)
+ if(isfloorturf(t))
+ if(prob(10))
+ new /obj/effect/temp_visual/goliath_tentacle(t, src)
+ else
+ cached_tentacle_turfs -= t
+
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril
+ fromtendril = TRUE
+
+// Tentacles
+/obj/effect/temp_visual/goliath_tentacle
+ name = "goliath tentacle"
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
icon_state = "Goliath_tentacle_spawn"
layer = BELOW_MOB_LAYER
var/mob/living/spawner
- var/timerid
-/obj/effect/goliath_tentacle/New(var/loc, mob/living/new_spawner)
+/obj/effect/temp_visual/goliath_tentacle/Initialize(mapload, mob/living/new_spawner)
. = ..()
- for(var/obj/effect/goliath_tentacle/T in loc)
+ for(var/obj/effect/temp_visual/goliath_tentacle/T in loc)
if(T != src)
return INITIALIZE_HINT_QDEL
-
if(!QDELETED(new_spawner))
spawner = new_spawner
-
if(ismineralturf(loc))
var/turf/simulated/mineral/M = loc
M.gets_drilled()
deltimer(timerid)
timerid = addtimer(CALLBACK(src, .proc/tripanim), 7, TIMER_STOPPABLE)
-/obj/effect/goliath_tentacle/original/New(var/loc, mob/living/new_spawner)
+/obj/effect/temp_visual/goliath_tentacle/original/Initialize(mapload, new_spawner)
. = ..()
var/list/directions = cardinal.Copy()
for(var/i in 1 to 3)
var/spawndir = pick_n_take(directions)
var/turf/T = get_step(src, spawndir)
if(T)
- new /obj/effect/goliath_tentacle(T, spawner)
+ new /obj/effect/temp_visual/goliath_tentacle(T, spawner)
-/obj/effect/goliath_tentacle/proc/tripanim()
+/obj/effect/temp_visual/goliath_tentacle/proc/tripanim()
icon_state = "Goliath_tentacle_wiggle"
deltimer(timerid)
timerid = addtimer(CALLBACK(src, .proc/trip), 3, TIMER_STOPPABLE)
-/obj/effect/goliath_tentacle/proc/trip()
+/obj/effect/temp_visual/goliath_tentacle/proc/trip()
var/latched = FALSE
for(var/mob/living/L in loc)
if((!QDELETED(spawner) && spawner.faction_check_mob(L)) || L.stat == DEAD)
@@ -126,22 +184,7 @@
deltimer(timerid)
timerid = addtimer(CALLBACK(src, .proc/retract), 10, TIMER_STOPPABLE)
-/obj/effect/goliath_tentacle/proc/retract()
+/obj/effect/temp_visual/goliath_tentacle/proc/retract()
icon_state = "Goliath_tentacle_retract"
deltimer(timerid)
- timerid = QDEL_IN(src, 7)
-
-/mob/living/simple_animal/hostile/asteroid/goliath/beast
- name = "goliath"
- desc = "A hulking, armor-plated beast with long tendrils arching from its back."
- icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
- icon_state = "goliath"
- icon_living = "goliath"
- icon_aggro = "goliath"
- icon_dead = "goliath_dead"
- throw_message = "does nothing to the tough hide of the"
- pre_attack_icon = "goliath2"
- butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
- loot = list()
- stat_attack = 1
- robust_searching = 1
\ No newline at end of file
+ timerid = QDEL_IN(src, 5)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm
index 4e924a5424c..6e5c840a401 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm
@@ -35,7 +35,7 @@
loot = list(/obj/effect/decal/cleanable/blood/gibs)
deathmessage = "is pulped into bugmash."
- simplespecies = /mob/living/simple_animal/hostile/asteroid/gutlunch
+ animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch
childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55)
wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs)
@@ -64,7 +64,7 @@
..()
/mob/living/simple_animal/hostile/asteroid/gutlunch/AttackingTarget()
- if(is_type_in_list(target, wanted_objects)) //we eats
+ if(is_type_in_typecache(target, wanted_objects)) //we eats
udder.generateMilk()
regenerate_icons()
visible_message("[src] slurps up [target].")
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
index 51b8e0c9842..60c1f5e08e7 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
@@ -236,7 +236,6 @@
del_on_death = 1
stat_attack = 1
robust_searching = 1
- var/fromtendril = FALSE
var/dwarf_mob = FALSE
var/mob/living/carbon/human/stored_mob
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/mining.dm b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm
index 2fd5e6ef0f2..e23624a5a9d 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/mining.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm
@@ -15,6 +15,7 @@
a_intent = INTENT_HARM
var/throw_message = "bounces off of"
var/icon_aggro = null // for swapping to when we get aggressive
+ var/fromtendril = FALSE
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
mob_size = MOB_SIZE_LARGE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm b/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm
index e8dfa093918..2ee9c387140 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm
@@ -73,7 +73,7 @@
qdel(src)
/mob/living/simple_animal/hostile/spawner/lavaland/goliath
- mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast
+ mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril
/mob/living/simple_animal/hostile/spawner/lavaland/legion
mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 67fb7722198..efc18895141 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -140,7 +140,7 @@
move_resist = MOVE_FORCE_VERY_STRONG
pull_force = MOVE_FORCE_VERY_STRONG
var/pre_attack = 0
- loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1})
+ loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = ABOVE_MOB_LAYER})
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
..()
@@ -223,46 +223,3 @@
else
spawn(50)
qdel(src)
-
-/obj/item/asteroid/goliath_hide
- name = "goliath hide plates"
- desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna."
- icon = 'icons/obj/items.dmi'
- icon_state = "goliath_hide"
- flags = NOBLUDGEON
- w_class = WEIGHT_CLASS_NORMAL
- layer = 4
-
-/obj/item/asteroid/goliath_hide/afterattack(atom/target, mob/user, proximity_flag)
- if(proximity_flag)
- if(istype(target, /obj/item/clothing/suit/space/hardsuit/mining) || istype(target, /obj/item/clothing/head/helmet/space/hardsuit/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner))
- var/obj/item/clothing/C = target
- var/current_armor = C.armor
- if(current_armor["melee"] < 60)
- current_armor["melee"] = min(current_armor["melee"] + 10, 60)
- to_chat(user, "You strengthen [target], improving its resistance against melee attacks.")
- qdel(src)
- else
- to_chat(user, "You can't improve [C] any further.")
- return
- if(istype(target, /obj/mecha/working/ripley))
- var/obj/mecha/D = target
- if(D.icon_state != "ripley-open")
- to_chat(user, "You can't add armour onto the mech while someone is inside!")
- return
- var/list/damage_absorption = D.damage_absorption
- if(damage_absorption["brute"] > 0.3)
- damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3)
- damage_absorption["bullet"] = damage_absorption["bullet"] - 0.05
- damage_absorption["fire"] = damage_absorption["fire"] - 0.05
- damage_absorption["laser"] = damage_absorption["laser"] - 0.025
- to_chat(user, "You strengthen [target], improving its resistance against melee attacks.")
- qdel(src)
- D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open")
- D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
- if(damage_absorption["brute"] == 0.3)
- D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open")
- D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter."
- else
- to_chat(user, "You can't improve [D] any further!")
- return
diff --git a/code/modules/mob/living/simple_animal/posessed_object.dm b/code/modules/mob/living/simple_animal/posessed_object.dm
index 7afb3b01cbc..f290dd7f2ef 100644
--- a/code/modules/mob/living/simple_animal/posessed_object.dm
+++ b/code/modules/mob/living/simple_animal/posessed_object.dm
@@ -108,7 +108,7 @@
/mob/living/simple_animal/possessed_object/IsAdvancedToolUser() // So we can shoot guns (Mostly ourselves), among other things.
- return 1
+ return TRUE
/mob/living/simple_animal/possessed_object/get_access() // If we've possessed an ID card we've got access to lots of fun things!
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 3799daacb63..6955633efce 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -62,10 +62,9 @@
var/can_collar = 0 // can add collar to mob or not
//Hot simple_animal baby making vars
-
- var/childtype = null
- var/scan_ready = 1
- var/simplespecies //Sorry, no spider+corgi buttbabies.
+ var/list/childtype = null
+ var/next_scan_time = 0
+ var/animal_species //Sorry, no spider+corgi buttbabies.
var/gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //if CHEM_MOB_SPAWN_HOSTILE can be spawned by plasma with gold core, CHEM_MOB_SPAWN_FRIENDLY are 'friendlies' spawned with blood
@@ -446,27 +445,32 @@
/mob/living/simple_animal/proc/make_babies() // <3 <3 <3
- if(gender != FEMALE || stat || !scan_ready || !childtype || !simplespecies)
- return
- scan_ready = 0
- spawn(400)
- scan_ready = 1
- var/alone = 1
+ if(gender != FEMALE || stat || next_scan_time > world.time || !childtype || !animal_species || !SSticker.IsRoundInProgress())
+ return FALSE
+ next_scan_time = world.time + 400
+
+ var/alone = TRUE
var/mob/living/simple_animal/partner
var/children = 0
+
for(var/mob/M in oview(7, src))
- if(istype(M, childtype)) //Check for children FIRST.
+ if(M.stat != CONSCIOUS) //Check if it's conscious FIRST.
+ continue
+ else if(istype(M, childtype)) //Check for children SECOND.
children++
- else if(istype(M, simplespecies))
- if(M.client)
+ else if(istype(M, animal_species))
+ if(M.ckey)
continue
else if(!istype(M, childtype) && M.gender == MALE) //Better safe than sorry ;_;
partner = M
- else if(istype(M, /mob/))
- alone = 0
- continue
+ else if(isliving(M) && !faction_check_mob(M)) //shyness check. we're not shy in front of things that share a faction with us.
+ return //we never mate when not alone, so just abort early
+
if(alone && partner && children < 3)
- return new childtype(loc)
+ var/childspawn = pickweight(childtype)
+ var/turf/target = get_turf(loc)
+ if(target)
+ return new childspawn(target)
/mob/living/simple_animal/say_quote(var/message)
var/verb = "says"
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index fb11e2ef277..c74d7545473 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1010,7 +1010,7 @@ var/list/slot_equipment_priority = list( \
var/atom/A = foo
if(A.invisibility > see_invisible)
continue
- if(is_type_in_list(A, shouldnt_see))
+ if(is_type_in_list(A, shouldnt_see) || !A.simulated)
continue
statpanel_things += A
statpanel(listed_turf.name, null, statpanel_things)
@@ -1068,7 +1068,7 @@ var/list/slot_equipment_priority = list( \
/mob/proc/IsAdvancedToolUser()//This might need a rename but it should replace the can this mob use things check
- return 0
+ return FALSE
/mob/proc/swap_hand()
return
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 60a3637166a..b378705becb 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -176,7 +176,7 @@
var/player_ghosted = 0
var/turf/listed_turf = null //the current turf being examined in the stat panel
- var/list/shouldnt_see = list(/atom/movable/lighting_object) //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes
+ var/list/shouldnt_see = list() //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes
var/kills = 0
diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm
index 9936895e473..3b61ea0f557 100644
--- a/code/modules/nano/modules/atmos_control.dm
+++ b/code/modules/nano/modules/atmos_control.dm
@@ -42,6 +42,7 @@
/datum/nano_module/atmos_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["alarms"] = air_alarm_repository.air_alarm_data(monitored_alarms)
+
return data
/datum/nano_module/atmos_control/proc/generate_state(air_alarm)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index b868945f065..a69ff2a793b 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -99,7 +99,7 @@
var/indestructible = 0 // If set, prevents aliens from destroying it
var/keep_preset_name = 0
- var/report_power_alarm = 1
+ var/report_power_alarm = TRUE
var/shock_proof = 0 //if set to 1, this APC will not arc bolts of electricity if it's overloaded.
@@ -117,11 +117,11 @@
operating = 0
/obj/machinery/power/apc/noalarm
- report_power_alarm = 0
+ report_power_alarm = FALSE
/obj/machinery/power/apc/syndicate //general syndicate access
req_access = list(access_syndicate)
- report_power_alarm = 0
+ report_power_alarm = FALSE
/obj/item/apc_electronics
name = "power control module"
@@ -1171,14 +1171,14 @@
lighting = autoset(lighting, 1)
environ = autoset(environ, 1)
autoflag = 3
- if(report_power_alarm)
+ if(report_power_alarm && is_station_contact(z))
SSalarms.power_alarm.clearAlarm(loc, src)
else if(cell.charge < 1250 && cell.charge > 750 && longtermpower < 0) // <30%, turn off equipment
if(autoflag != 2)
equipment = autoset(equipment, 2)
lighting = autoset(lighting, 1)
environ = autoset(environ, 1)
- if(report_power_alarm)
+ if(report_power_alarm && is_station_contact(z))
SSalarms.power_alarm.triggerAlarm(loc, src)
autoflag = 2
else if(cell.charge < 750 && cell.charge > 10) // <15%, turn off lighting & equipment
@@ -1186,7 +1186,7 @@
equipment = autoset(equipment, 2)
lighting = autoset(lighting, 2)
environ = autoset(environ, 1)
- if(report_power_alarm)
+ if(report_power_alarm && is_station_contact(z))
SSalarms.power_alarm.triggerAlarm(loc, src)
autoflag = 1
else if(cell.charge <= 0) // zero charge, turn all off
@@ -1194,7 +1194,7 @@
equipment = autoset(equipment, 0)
lighting = autoset(lighting, 0)
environ = autoset(environ, 0)
- if(report_power_alarm)
+ if(report_power_alarm && is_station_contact(z))
SSalarms.power_alarm.triggerAlarm(loc, src)
autoflag = 0
@@ -1250,7 +1250,7 @@
equipment = autoset(equipment, 0)
lighting = autoset(lighting, 0)
environ = autoset(environ, 0)
- if(report_power_alarm)
+ if(report_power_alarm && is_station_contact(z))
SSalarms.power_alarm.triggerAlarm(loc, src)
autoflag = 0
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index 57f8b96b787..fc79d0b336b 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -19,68 +19,16 @@
drink_name = "Glass of Water"
drink_desc = "The father of all refreshments."
taste_message = null
+ var/water_temperature = 283.15 // As reagents don't have a temperature value, we'll just use 10 celsius.
-/datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == TOUCH)
- // Put out fire
- M.adjust_fire_stacks(-(volume * 0.2))
-
- if(isgrey(M)) // You gosh darn snowflakes
- var/mob/living/carbon/human/G = M
- if(method == TOUCH)
- if(volume > 25)
- if(G.wear_mask)
- to_chat(G, "Your [G.wear_mask] protects you from the acid!")
- return
-
- if(G.head)
- to_chat(G, "Your [G.wear_mask] protects you from the acid!")
- return
-
- if(prob(75))
- G.take_organ_damage(5, 10)
- G.emote("scream")
- var/obj/item/organ/external/affecting = G.get_organ("head")
- if(affecting)
- affecting.disfigure()
- else
- G.take_organ_damage(5, 10)
- else
- G.take_organ_damage(5, 10)
- else
- to_chat(G, "The water stings[volume < 10 ? " you, but isn't concentrated enough to harm you" : null]!")
- if(volume >= 10)
- G.adjustFireLoss(min(max(4, (volume - 10) * 2), 20))
- G.emote("scream")
+/datum/reagent/water/reaction_mob(mob/living/M, method = TOUCH, volume)
+ M.water_act(volume, water_temperature, src, method)
/datum/reagent/water/reaction_turf(turf/simulated/T, volume)
- if(!istype(T))
- return
- if(volume >= 3)
- T.MakeSlippery()
-
- for(var/mob/living/carbon/slime/M in T)
- M.apply_water()
-
- var/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.react()
- T.assume_air(lowertemp)
- qdel(hotspot)
+ T.water_act(volume, water_temperature, src)
/datum/reagent/water/reaction_obj(obj/O, volume)
- O.extinguish()
-
- if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube))
- var/obj/item/reagent_containers/food/snacks/monkeycube/cube = O
- cube.Expand()
- // Dehydrated carp
- if(istype(O, /obj/item/toy/carpplushie/dehy_carp))
- var/obj/item/toy/carpplushie/dehy_carp/dehy = O
- dehy.Swell() // Makes a carp
-
+ O.water_act(volume, water_temperature, src)
/datum/reagent/lube
name = "Space Lube"
@@ -109,7 +57,7 @@
if(!(istype(B) && B.off_floor))
qdel(O)
else
- if(!istype(O, /atom/movable/lighting_object))
+ if(O.simulated)
O.color = initial(O.color)
O.clean_blood()
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index a350d75a4b4..829d8fd2226 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -55,13 +55,6 @@
update_icon()
return
-// this prevented pills, food, and other things from being picked up by bags.
-// possibly intentional, but removing it allows us to not duplicate functionality.
-// -Sayu (storage conslidation)
-/*
-/obj/item/reagent_containers/attackby(obj/item/I as obj, mob/user as mob, params)
- return
-*/
/obj/item/reagent_containers/afterattack(obj/target, mob/user , flag)
return
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index d67d888a75b..17d68f7e607 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -56,9 +56,54 @@
if(!is_open_container())
to_chat(user, "Airtight lid seals it completely.")
+/obj/item/reagent_containers/glass/attack(mob/M, mob/user, def_zone)
+ if(!is_open_container())
+ return ..()
+
+ if(!reagents || !reagents.total_volume)
+ to_chat(user, "[src] is empty!")
+ return
+
+ if(istype(M))
+ var/list/transferred = list()
+ for(var/datum/reagent/R in reagents.reagent_list)
+ transferred += R.name
+ var/contained = english_list(transferred)
+
+ if(user.a_intent == INTENT_HARM)
+ M.visible_message("[user] splashes the contents of [src] onto [M]!", \
+ "[user] splashes the contents of [src] onto [M]!")
+ add_attack_logs(M, user, "Splashed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL)
+ if(!iscarbon(user))
+ M.LAssailant = null
+ else
+ M.LAssailant = user
+
+ reagents.reaction(M, TOUCH)
+ reagents.clear_reagents()
+ else
+ if(M != user)
+ M.visible_message("[user] attempts to feed something to [M].", \
+ "[user] attempts to feed something to you.")
+ if(!do_mob(user, M))
+ return
+ if(!reagents || !reagents.total_volume)
+ return // The drink might be empty after the delay, such as by spam-feeding
+ M.visible_message("[user] feeds something to [M].", "[user] feeds something to you.")
+ add_attack_logs(M, user, "Fed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL)
+ else
+ to_chat(user, "You swallow a gulp of [src].")
+
+ reagents.reaction(M, INGEST)
+ addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5)
+ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
+ else
+ return ..()
+
/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
if(!proximity)
return
+
if(!is_open_container())
return
@@ -66,26 +111,7 @@
if(istype(target, type))
return
- if(user.a_intent != INTENT_HELP && ismob(target) && target.reagents && reagents.total_volume)
- to_chat(user, "You splash the solution onto [target].")
-
- var/mob/living/M = target
- var/list/injected = list()
- for(var/datum/reagent/R in reagents.reagent_list)
- injected += R.name
- var/contained = english_list(injected)
- add_attack_logs(M, user, "Splashed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL)
- if(!iscarbon(user))
- M.LAssailant = null
- else
- M.LAssailant = user
-
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("[] has been splashed with something by []!", target, user), 1)
- reagents.reaction(target, TOUCH)
- spawn(5) reagents.clear_reagents()
- return
- else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
+ if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
if(target.reagents && !target.reagents.total_volume)
to_chat(user, "[target] is empty and can't be refilled!")
return
@@ -116,12 +142,11 @@
else if(istype(target, /obj/effect/decal)) //stops splashing while scooping up fluids
return
- else if(reagents.total_volume)
- to_chat(user, "You splash the solution onto [target].")
+ else if(reagents.total_volume && user.a_intent == INTENT_HARM)
+ user.visible_message("[user] splashes the contents of [src] onto [target]!", \
+ "You splash the contents of [src] onto [target].")
reagents.reaction(target, TOUCH)
- spawn(5) reagents.clear_reagents()
- return
-
+ reagents.clear_reagents()
/obj/item/reagent_containers/glass/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/pen) || istype(I, /obj/item/flashlight/pen))
@@ -338,3 +363,28 @@
qdel(src)
else
..()
+
+/obj/item/reagent_containers/glass/beaker/waterbottle
+ name = "bottle of water"
+ desc = "A bottle of water filled at an old Earth bottling facility."
+ icon = 'icons/obj/drinks.dmi'
+ icon_state = "smallbottle"
+ item_state = "bottle"
+ list_reagents = list("water" = 49.5, "fluorine" = 0.5) //see desc, don't think about it too hard
+ materials = list(MAT_GLASS = 0)
+ volume = 50
+ amount_per_transfer_from_this = 10
+
+/obj/item/reagent_containers/glass/beaker/waterbottle/empty
+ list_reagents = list()
+
+/obj/item/reagent_containers/glass/beaker/waterbottle/large
+ desc = "A fresh commercial-sized bottle of water."
+ icon_state = "largebottle"
+ materials = list(MAT_GLASS = 0)
+ list_reagents = list("water" = 100)
+ volume = 100
+ amount_per_transfer_from_this = 20
+
+/obj/item/reagent_containers/glass/beaker/waterbottle/large/empty
+ list_reagents = list()
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index ec89b8a463a..cffc2f0ef06 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -76,6 +76,12 @@
icon_state = "pill16"
list_reagents = list("adminordrazine" = 50)
+/obj/item/reagent_containers/food/pill/morphine
+ name = "Morphine pill"
+ desc = "Commonly used to treat insomnia."
+ icon_state = "pill8"
+ list_reagents = list("morphine" = 30)
+
/obj/item/reagent_containers/food/pill/methamphetamine
name = "Methamphetamine pill"
desc = "Helps improve the ability to concentrate."
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 6413765c99c..4c9ca937409 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -246,7 +246,7 @@
return
// Clumsy folks can only flush it.
- if(user.IsAdvancedToolUser(1))
+ if(user.IsAdvancedToolUser())
ui_interact(user)
else
flush = !flush
diff --git a/code/modules/ruins/lavalandruin_code/ash_walker_den.dm b/code/modules/ruins/lavalandruin_code/ash_walker_den.dm
index 686bc77ceaa..7800b3eb9ab 100644
--- a/code/modules/ruins/lavalandruin_code/ash_walker_den.dm
+++ b/code/modules/ruins/lavalandruin_code/ash_walker_den.dm
@@ -67,7 +67,8 @@
move_resist = MOVE_FORCE_NORMAL
density = FALSE
flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. \
- You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest."
+ You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest. \
+
You are free to attack miners and other outsiders. DO NOT leave Lavaland without admin permission! DO NOT attack the mining outpost without being provoked."
assignedrole = "Ash Walker"
/obj/effect/mob_spawn/human/ash_walker/special(mob/living/carbon/human/new_spawn)
diff --git a/code/modules/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/ruins/lavalandruin_code/syndicate_base.dm
index 0f092ab4509..bbfa4ef688a 100644
--- a/code/modules/ruins/lavalandruin_code/syndicate_base.dm
+++ b/code/modules/ruins/lavalandruin_code/syndicate_base.dm
@@ -28,12 +28,14 @@
death = FALSE
icon = 'icons/obj/cryogenic2.dmi'
icon_state = "sleeper_s"
- flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. The base is rigged with explosives, DO NOT abandon it or let it fall into enemy hands!"
+ flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. The base is rigged with explosives, do not abandon it or let it fall into enemy hands! \
+
You are free to attack anyone not aligned with the Syndicate in the vicinity of your base. DO NOT work against Syndicate personnel (such as traitors or nuclear operatives). You may work with or against non-Syndicate antagonists on a case-by-case basis. DO NOT leave your base without admin permission."
outfit = /datum/outfit/lavaland_syndicate
assignedrole = "Lavaland Syndicate"
/obj/effect/mob_spawn/human/lavaland_syndicate/Destroy()
- new/obj/structure/fluff/empty_sleeper/syndicate(get_turf(src))
+ var/obj/structure/fluff/empty_sleeper/syndicate/S = new /obj/structure/fluff/empty_sleeper/syndicate(get_turf(src))
+ S.setDir(dir)
return ..()
/datum/outfit/lavaland_syndicate
@@ -55,11 +57,13 @@
/obj/effect/mob_spawn/human/lavaland_syndicate/comms
name = "Syndicate Comms Agent sleeper"
mob_name = "Syndicate Comms Agent"
- flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. DO NOT abandon the base. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!"
+ flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands! \
+
You are free to attack anyone not aligned with the Syndicate in the vicinity of your base. DO NOT work against Syndicate personnel (such as traitors or nuclear operatives). You may work with or against non-Syndicate antagonists on a case-by-case basis. DO NOT leave your base without admin permission."
outfit = /datum/outfit/lavaland_syndicate/comms
/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space
- flavour_text = "You are a syndicate agent, assigned to a small listening post station situated near your hated enemy's top secret research facility: Space Station 13. Monitor enemy activity as best you can, and try to keep a low profile. DO NOT abandon the base. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!"
+ flavour_text = "You are a syndicate agent, assigned to a small listening post station situated near your hated enemy's top secret research facility: Space Station 13. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands! \
+
You are free to attack anyone not aligned with the Syndicate in the vicinity of your base. DO NOT work against Syndicate personnel (such as traitors or nuclear operatives). You may work with or against non-Syndicate antagonists on a case-by-case basis. DO NOT leave your base without admin permission."
/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space/Initialize(mapload)
. = ..()
@@ -70,10 +74,10 @@
/datum/outfit/lavaland_syndicate/comms
name = "Lavaland Syndicate Comms Agent"
r_hand = /obj/item/melee/energy/sword/saber
- mask = /obj/item/clothing/mask/gas/voice
+ mask = /obj/item/clothing/mask/chameleon/gps
suit = /obj/item/clothing/suit/armor/vest
-/obj/item/clothing/mask/gas/voice/gps/New()
+/obj/item/clothing/mask/chameleon/gps/New()
. = ..()
new /obj/item/gps/internal/lavaland_syndicate_base(src)
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 28cb96b128b..b6a7e7bb28f 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -58,12 +58,10 @@
var/contcount
for(var/atom/A in T.contents)
- if(istype(A,/atom/movable/lighting_object))
- continue
- if(istype(A,/obj/machinery/light))
- continue //hacky but whatever, shuttles need three spots each for this shit
if(!A.simulated)
continue
+ if(istype(A, /obj/machinery/light))
+ continue //hacky but whatever, shuttles need three spots each for this shit
contcount++
if(contcount)
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 512de9de9e9..987315ac13b 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -82,11 +82,10 @@
var/heal_burn = 0
var/heal_oxy = 0
-
/obj/item/organ/internal/heart/cursed/attack(mob/living/carbon/human/H, mob/living/carbon/human/user, obj/target)
if(H == user && istype(H))
if(NO_BLOOD in H.dna.species.species_traits)
- to_chat(H, "\The [src] is not compatible with your form!")
+ to_chat(H, "[src] is not compatible with your form!")
return
playsound(user,'sound/effects/singlebeat.ogg', 40, 1)
user.drop_item()
@@ -111,17 +110,16 @@
if(owner)
to_chat(owner, "Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!")
-
/datum/action/item_action/organ_action/cursed_heart
name = "pump your blood"
//You are now brea- pumping blood manually
/datum/action/item_action/organ_action/cursed_heart/Trigger()
. = ..()
- if(. && istype(target,/obj/item/organ/internal/heart/cursed))
+ if(. && istype(target, /obj/item/organ/internal/heart/cursed))
var/obj/item/organ/internal/heart/cursed/cursed_heart = target
- if(world.time < (cursed_heart.last_pump + (cursed_heart.pump_delay-10))) //no spam
+ if(world.time < (cursed_heart.last_pump + (cursed_heart.pump_delay - 10))) //no spam
to_chat(owner, "Too soon!")
return
@@ -132,7 +130,7 @@
var/mob/living/carbon/human/H = owner
if(istype(H))
if(!(NO_BLOOD in H.dna.species.species_traits))
- H.blood_volume = min(H.blood_volume + cursed_heart.blood_loss*0.5, BLOOD_VOLUME_NORMAL)
+ H.blood_volume = min(H.blood_volume + cursed_heart.blood_loss * 0.5, BLOOD_VOLUME_NORMAL)
if(owner.client)
owner.client.color = ""
diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm
index ca22fb5cb0e..29a4509ae7a 100644
--- a/code/modules/telesci/gps.dm
+++ b/code/modules/telesci/gps.dm
@@ -80,19 +80,18 @@ var/list/GPS_list = list()
popup.open()
/obj/item/gps/Topic(href, href_list)
- if(..(state = inventory_state))
+ if(..())
return 1
if(href_list["tag"] )
- var/a = input("Please enter desired tag.", name, gpstag) as text|null
- if(!a || ..(state = inventory_state))
- return 1
+ var/tag = input("Please enter desired tag.", name, gpstag) as text|null
+ if(!tag || ..())
+ return TRUE
- a = uppertext(sanitize(copytext(a, 1, 5)))
- if(src.loc == usr)
- gpstag = a
- name = "global positioning system ([gpstag])"
- attack_self(usr)
+ tag = uppertext(sanitize(copytext(tag, 1, 5)))
+ gpstag = tag
+ name = "global positioning system ([gpstag])"
+ attack_self(usr)
/obj/item/gps/science
icon_state = "gps-s"
diff --git a/code/modules/tram/tram.dm b/code/modules/tram/tram.dm
index fed50355dde..0f80c99405e 100644
--- a/code/modules/tram/tram.dm
+++ b/code/modules/tram/tram.dm
@@ -22,7 +22,7 @@
var/delay_timer = null
- var/list/blacklist = list(/obj/tram/rail,/atom/movable/lighting_object)
+ var/list/blacklist = list(/obj/tram/rail)
var/list/ancwhitelist = list(/obj/tram, /obj/vehicle, /obj/structure/chair, /obj/structure/grille, /obj/structure/window)
/obj/tram/tram_controller/New()
@@ -135,14 +135,20 @@
tram += src
/obj/tram/tram_controller/proc/check_validity(var/atom/movable/AM)
- if(!AM) return 0
- if(is_type_in_list(AM, blacklist)) return 0
- if(!AM.simulated) return 0
+ if(!AM)
+ return FALSE
+
+ if(!AM.simulated)
+ return FALSE
+
+ if(is_type_in_list(AM, blacklist))
+ return FALSE
+
if(AM.anchored)
if(is_type_in_list(AM, ancwhitelist))
- return 1
- return 0
- return 1
+ return TRUE
+ return FALSE
+ return TRUE
/obj/tram/tram_controller/proc/init_controllers()
for(var/obj/tram/controlpad/CCP in tram)
diff --git a/html/changelogs/AutoChangeLog-pr-11421.yml b/html/changelogs/AutoChangeLog-pr-11421.yml
new file mode 100644
index 00000000000..83e285205c3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11421.yml
@@ -0,0 +1,16 @@
+author: "Arkatos"
+delete-after: True
+changes:
+ - bugfix: "Ragin' Mages gamemode should now be playable without any major issue"
+ - bugfix: "Slaughter and Laughter Demons no longer have duplicit objective shown at the Round End"
+ - bugfix: "Laughter Demon is now properly called Laughter Demon instead of Slaughter Demon in the role polls"
+ - spellcheck: "Improved wording and fixed mistakes in Wizard and Ragin' Mages gamemodes"
+ - tweak: "Wizards are now properly polled in the Ragin' Mages gamemode"
+ - tweak: "You can no longer buy Summon Ghosts spell in the Ragin' Mages gamemode"
+ - tweak: "You can no longer buy Bind Soul spell in the Ragin' Mages gamemode"
+ - tweak: "Deck of tarot cards renamed to Guardian Deck in the Wizard spellbook"
+ - tweak: "Rituals and Challenges categories merged into one in the Wizard spellbook"
+ - tweak: "Laughter Demon is now slightly weaker compared to the Slaughter Demon"
+ - tweak: "Bottle of Ooze now creates a magical morph instead of a normal one. Magical morph is capable of casting smoke and forcewall spells."
+ - tweak: "Visible ghosts will now get a special description about their visibility"
+ - rscdel: "Removed Cursed Heart from the Wizard spellbook"
diff --git a/html/changelogs/AutoChangeLog-pr-11482.yml b/html/changelogs/AutoChangeLog-pr-11482.yml
new file mode 100644
index 00000000000..65cc53a7f97
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11482.yml
@@ -0,0 +1,4 @@
+author: "TDSSS"
+delete-after: True
+changes:
+ - tweak: "Sling glare popup no longer lists invalid targets for glaring"
diff --git a/html/changelogs/AutoChangeLog-pr-11620.yml b/html/changelogs/AutoChangeLog-pr-11620.yml
new file mode 100644
index 00000000000..6511722a427
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11620.yml
@@ -0,0 +1,4 @@
+author: "Citinited"
+delete-after: True
+changes:
+ - bugfix: "Fixes conveyor belts not moving items spawned via an autolathe. (And other possible behaviours when machines switch between speed and normal processes)"
diff --git a/html/changelogs/AutoChangeLog-pr-11628.yml b/html/changelogs/AutoChangeLog-pr-11628.yml
new file mode 100644
index 00000000000..165e24173b7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11628.yml
@@ -0,0 +1,14 @@
+author: "Markolie"
+delete-after: True
+changes:
+ - rscadd: "Added custom explorer gas mask sprites for Grey/Drask."
+ - rscadd: "Added a lantern to the Hermit cave."
+ - rscadd: "Added a bone setter, bone gel, FixOVein, sterile masks and sterile gloves to the Lavaland Syndicate base."
+ - rscadd: "The pickaxes on the Lavaland labor camp have been replaced with safety variants. The flashlights have been replaced with lanterns."
+ - bugfix: "Fixed many species missing sprites for explorer gas masks and jumpsuits. They now use the humans icons until we have custom sprites."
+ - bugfix: "Resolved an issue with piping not working on the Lavaland mining bases."
+ - bugfix: "Fixed all items being free in the mining vendor."
+ - bugfix: "Fixed improper wiring to the turbine in the Lavaland Syndicate base."
+ - bugfix: "Fixed the Lavaland Syndicate base oxygen sensor not working."
+ - bugfix: "Moved the pipe dispenser in the Lavaland Syndicate base so it doesn't clip with tables."
+ - bugfix: "Fixed the Lavaland Syndicate base incinerator doors not working."
diff --git a/html/changelogs/AutoChangeLog-pr-11630.yml b/html/changelogs/AutoChangeLog-pr-11630.yml
new file mode 100644
index 00000000000..043b23d37ac
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11630.yml
@@ -0,0 +1,21 @@
+author: "Markolie and Ionward"
+delete-after: True
+changes:
+ - rscadd: "Added Tajaran, Vulpkanin, Unathi and Vox sprites for the explorer gas mask (thanks to Ionward!)"
+ - rscadd: "Added custom species sprites for the explorer suits and hoods (thanks to Ionward!)"
+ - rscadd: "Added missing surgical tools and a pet vendor to the animal hospital."
+ - rscadd: "Added a custom cigarette vendor to the beach biodome ruin."
+ - rscadd: "Added an autolathe and RPD to the Lavaland Syndicate base. Also added a custom cigarette vendor and made the vendors not charge money."
+ - rscadd: "Added tiny fans to the mining base and labor camp exist."
+ - rscadd: "A separate jobban for ghost roles has been added."
+ - bugfix: "The alternative sink now has directional sprites. This resolves an issue with shelters having sinks facing the wrong way."
+ - bugfix: "Fixed the Syndicate sleepers on the Lavaland Syndicate base pointing the wrong way when a ghost role spawns in."
+ - bugfix: "Fixed Lava being removed by the staff of lava not working. Also added a missing warning effect when the staff is turning regular turf into lava."
+ - bugfix: "Fixed random bookcases not spawning books (hopefully)."
+ - bugfix: "Fixed surgical drapes not having a sprite."
+ - bugfix: "Fixed being unable to modify the GPS tag of shelters."
+ - bugfix: "Fixed the Lavaland swarmers not eating anything."
+ - bugfix: "The ash drake swoop attack is no longer incredibly loud."
+ - tweak: "The Syndicate base self-destruct is now much more powerful and capable of destroying the entire base."
+ - tweak: "The flavor text of Ash Walkers and Syndicate operatives now clarifies what they can('t) do."
+ - tweak: "Ash walkers can no longer use machinery."
diff --git a/html/changelogs/AutoChangeLog-pr-11641.yml b/html/changelogs/AutoChangeLog-pr-11641.yml
new file mode 100644
index 00000000000..8a74e6e0461
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11641.yml
@@ -0,0 +1,8 @@
+author: "Markolie"
+delete-after: True
+changes:
+ - tweak: "Ash Walkers now once more have fine manipulation. Their lack of fine manipulation caused unintended side effects (such as them being unable to mine)."
+ - bugfix: "Ash Walkers (and other ghost spawner roles) can no longer be antagonist targets or become antagonists through the antagonist creation."
+ - bugfix: "Fixed the Lavaland Syndicate base incinerator buttons not working."
+ - bugfix: "Fixed the Syndicate communication agent spawning with a broken voice changer mask."
+ - bugfix: "Fixed the Disk Compartmentalizer not having a sprite."
diff --git a/html/changelogs/AutoChangeLog-pr-11643.yml b/html/changelogs/AutoChangeLog-pr-11643.yml
new file mode 100644
index 00000000000..74fa2f18b4e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11643.yml
@@ -0,0 +1,18 @@
+author: "Markolie"
+delete-after: True
+changes:
+ - rscadd: "The Ancient Goliath now has a small chance of spawning instead of regular goliaths."
+ - rscadd: "Survival capsules now have a NanoMed."
+ - tweak: "Water bottles now behave as glass containers."
+ - tweak: "The behaviour of glass reagent containers has changed. When used on non-mobs, contents will now only be spilled on harm intent. When used on mobs, on any intent aside from harm the contents will be fed to the mob like regular drinks. On harm intent it will still be spilled."
+ - tweak: "Hairless hide can now be made wet using most sources of water (minimum volume of 10), instead of just washing machines."
+ - bugfix: "Added some additional offstation role checks to ensure ghost spawner roles don't become antagonists, are kidnap targets or are counted towards station goals."
+ - bugfix: "Fixed some piping in the Lavaland Syndicate base incinerator and made sure the vault door starts locked."
+ - bugfix: "Fixed the Lavaland swarmers getting stuck on propulsion."
+ - bugfix: "Fix goliath tentacles sometimes being left behind."
+ - bugfix: "The walls around the Lavaland Syndicate base turbine have been coated, to prevent them from starting a plasma fire in the base."
+ - bugfix: "Syndicate agents can now access the air alarms on the Lavaland Syndicate base."
+ - bugfix: "Air alarm control computers can no longer access the air alarms on the Lavaland Syndicate base."
+ - bugfix: "Fixed the disk compartmentalizer/drying rack missing a sprite under certain circumstances."
+ - bugfix: "Fixed the Lavaland Syndicate base triggering atmospherics alerts."
+ - bugfix: "You can now properly place tiles on basalt."
diff --git a/html/changelogs/AutoChangeLog-pr-11656.yml b/html/changelogs/AutoChangeLog-pr-11656.yml
new file mode 100644
index 00000000000..5b0a8408162
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11656.yml
@@ -0,0 +1,4 @@
+author: "Markolie"
+delete-after: True
+changes:
+ - bugfix: "An exploit with the sheet multiplier has been fixed."
diff --git a/html/changelogs/AutoChangeLog-pr-11664.yml b/html/changelogs/AutoChangeLog-pr-11664.yml
new file mode 100644
index 00000000000..8acfb84a4f9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11664.yml
@@ -0,0 +1,21 @@
+author: "Markolie"
+delete-after: True
+changes:
+ - rscadd: "Portals can now be activated by clicking on them with or without an object. Ghosts can now also click on them to be taken to their destination."
+ - rscadd: "Portals now warn admins when they are used to teleport megafauna."
+ - tweak: "The singularity can now eat basalt and chasms on Lavaland. They get turned into lava."
+ - bugfix: "AI swarmers will no longer get stuck on effects (such as blood)."
+ - bugfix: "Fixed the spectral blade turning all ghosts visible."
+ - bugfix: "Fixed a runtime with assigning outfits to mindless mobs."
+ - bugfix: "Fixed certain alarms triggering despite being outside of station contact and the Syndicate base still triggering fire alarms."
+ - bugfix: "Fixed being unable to put the wormhole jaunter in the belt slot."
+ - bugfix: "Fixed the disk compartmentalizer not accepting disks."
+ - bugfix: "Gutlunches and Gubbucks will now reproduce properly."
+ - bugfix: "The necropolis chest cult clothing drop no longer spawns with a cult hood as well, as that's part of the suit itself."
+ - bugfix: "Goliath steaks can now be eaten properly."
+ - bugfix: "Fixed a stray light on the beach ruin."
+ - bugfix: "Lavaland ruins should no longer spawn on the Labor Camp."
+ - bugfix: "Ancient goliaths will now properly randomly spawn tentacles."
+ - bugfix: "The labor camp will now spawn properly with a processing console."
+ - bugfix: "Water turfs in the beach ruin (and other water turfs that previously didn't do so) will now properly apply water to you."
+ - bugfix: "Ash flora is now anchored."
diff --git a/html/changelogs/AutoChangeLog-pr-11676.yml b/html/changelogs/AutoChangeLog-pr-11676.yml
new file mode 100644
index 00000000000..cf6f4267e66
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11676.yml
@@ -0,0 +1,4 @@
+author: "Terilia"
+delete-after: True
+changes:
+ - rscadd: "Added the Donksoft sniper into the Trader spawnpool."
diff --git a/html/changelogs/AutoChangeLog-pr-11688.yml b/html/changelogs/AutoChangeLog-pr-11688.yml
new file mode 100644
index 00000000000..638a332682c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11688.yml
@@ -0,0 +1,6 @@
+author: "Markolie"
+delete-after: True
+changes:
+ - bugfix: "Gutlunches will now eat properly."
+ - bugfix: "The tesla can no longer travel through wormholes."
+ - bugfix: "Fixed an issue with honkbot construction."
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 35694b3719e..26526f68951 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/species/drask/head.dmi b/icons/mob/species/drask/head.dmi
index 41bf78cc8c6..fadfc1ed68d 100644
Binary files a/icons/mob/species/drask/head.dmi and b/icons/mob/species/drask/head.dmi differ
diff --git a/icons/mob/species/drask/mask.dmi b/icons/mob/species/drask/mask.dmi
index c1357c43144..dffedfb1c78 100644
Binary files a/icons/mob/species/drask/mask.dmi and b/icons/mob/species/drask/mask.dmi differ
diff --git a/icons/mob/species/drask/suit.dmi b/icons/mob/species/drask/suit.dmi
index 697c3888f77..a5fa1e95a3c 100644
Binary files a/icons/mob/species/drask/suit.dmi and b/icons/mob/species/drask/suit.dmi differ
diff --git a/icons/mob/species/grey/head.dmi b/icons/mob/species/grey/head.dmi
index e24367a10e2..201e1032562 100644
Binary files a/icons/mob/species/grey/head.dmi and b/icons/mob/species/grey/head.dmi differ
diff --git a/icons/mob/species/grey/mask.dmi b/icons/mob/species/grey/mask.dmi
index 1225b1e68ad..112895a6009 100644
Binary files a/icons/mob/species/grey/mask.dmi and b/icons/mob/species/grey/mask.dmi differ
diff --git a/icons/mob/species/plasmaman/helmet.dmi b/icons/mob/species/plasmaman/helmet.dmi
index 188db97e788..bd5465857d8 100644
Binary files a/icons/mob/species/plasmaman/helmet.dmi and b/icons/mob/species/plasmaman/helmet.dmi differ
diff --git a/icons/mob/species/plasmaman/suit.dmi b/icons/mob/species/plasmaman/suit.dmi
index 42832013f85..c4d1a7a2b3c 100644
Binary files a/icons/mob/species/plasmaman/suit.dmi and b/icons/mob/species/plasmaman/suit.dmi differ
diff --git a/icons/mob/species/skrell/head.dmi b/icons/mob/species/skrell/head.dmi
new file mode 100644
index 00000000000..ec5e8dd62e4
Binary files /dev/null and b/icons/mob/species/skrell/head.dmi differ
diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi
index 8cb76c80b75..3b2c1891c07 100644
Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ
diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi
index 1b7299cc8fb..bcc02304de0 100644
Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ
diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi
index a4218e5af40..5274697cdc1 100644
Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ
diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi
index 6e2c3d9836d..3c372768f16 100644
Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ
diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi
index fb0c9962a07..7d9f2999e27 100644
Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ
diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi
index 971978ccff4..b836b78538f 100644
Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index 3af770d719a..0716073b931 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi
index 8f7f7f103c2..43b527266b8 100644
Binary files a/icons/mob/species/vulpkanin/mask.dmi and b/icons/mob/species/vulpkanin/mask.dmi differ
diff --git a/icons/mob/species/vulpkanin/suit.dmi b/icons/mob/species/vulpkanin/suit.dmi
index 61d5e4b3b67..751ecf7626d 100644
Binary files a/icons/mob/species/vulpkanin/suit.dmi and b/icons/mob/species/vulpkanin/suit.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/hats.dmi b/icons/obj/clothing/species/plasmaman/hats.dmi
index 1d85d184ad1..fc76e521d55 100644
Binary files a/icons/obj/clothing/species/plasmaman/hats.dmi and b/icons/obj/clothing/species/plasmaman/hats.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/suits.dmi b/icons/obj/clothing/species/plasmaman/suits.dmi
index 43d69f5fa82..78ddd94dedb 100644
Binary files a/icons/obj/clothing/species/plasmaman/suits.dmi and b/icons/obj/clothing/species/plasmaman/suits.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 3b1c4c07cfa..f9e4f6bfbfc 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index e212d9c5882..5a976767f11 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index b7aaa3f83f3..5be90269399 100755
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi
index e30d7888844..baa04328498 100644
Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 1bf74ad556c..c49361b8e20 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1636,6 +1636,7 @@
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\shelters.dm"
#include "code\modules\mining\equipment\marker_beacons.dm"
+#include "code\modules\mining\equipment\survival_pod.dm"
#include "code\modules\mining\laborcamp\laborshuttle.dm"
#include "code\modules\mining\laborcamp\laborstacker.dm"
#include "code\modules\mining\lavaland\ash_flora.dm"