diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 3f9a6d35579..1a0fdb0478d 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -49,7 +49,7 @@
"aaW" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/space)
"aaX" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless,/area/solar/auxstarboard)
"aaY" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxport)
-"aaZ" = (/obj/machinery/hydroponics/constructable,/obj/item/weapon/minihoe,/obj/item/seeds/carrotseed,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
+"aaZ" = (/obj/machinery/hydroponics/constructable,/obj/item/weapon/cultivator,/obj/item/seeds/carrotseed,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"aba" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"abb" = (/turf/simulated/floor/plasteel,/area/security/prison)
"abc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
@@ -1965,7 +1965,7 @@
"aLO" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock{name = "Dormitories"; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
"aLP" = (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/reagent_containers/spray/pestspray{pixel_x = 3; pixel_y = 4},/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh{pixel_x = 2; pixel_y = 1},/obj/structure/table,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aLQ" = (/obj/machinery/biogenerator,/obj/machinery/firealarm{pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
-"aLR" = (/obj/structure/table,/obj/item/weapon/minihoe,/obj/item/weapon/hatchet,/obj/item/weapon/crowbar,/obj/machinery/light{dir = 1},/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aLR" = (/obj/structure/table,/obj/item/weapon/cultivator,/obj/item/weapon/hatchet,/obj/item/weapon/crowbar,/obj/machinery/light{dir = 1},/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aLS" = (/obj/machinery/seed_extractor,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aLT" = (/obj/item/seeds/appleseed,/obj/item/seeds/bananaseed,/obj/item/seeds/cocoapodseed,/obj/item/seeds/grapeseed,/obj/item/seeds/orangeseed,/obj/item/seeds/sugarcaneseed,/obj/item/seeds/wheatseed,/obj/item/seeds/watermelonseed,/obj/structure/table,/obj/item/seeds/towermycelium,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aLU" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/fancy/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
@@ -2390,8 +2390,8 @@
"aTX" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"aTY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/crew_quarters/locker)
"aTZ" = (/obj/structure/rack,/obj/item/weapon/storage/briefcase,/obj/item/weapon/storage/briefcase{pixel_x = 4; pixel_y = -2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/locker)
-"aUa" = (/obj/structure/table,/obj/item/weapon/minihoe,/obj/item/weapon/hatchet,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/paper/hydroponics,/obj/item/weapon/coin/silver,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
-"aUb" = (/obj/structure/table,/obj/item/weapon/hatchet,/obj/item/weapon/minihoe,/obj/item/weapon/crowbar,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aUa" = (/obj/structure/table,/obj/item/weapon/cultivator,/obj/item/weapon/hatchet,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/paper/hydroponics,/obj/item/weapon/coin/silver,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aUb" = (/obj/structure/table,/obj/item/weapon/hatchet,/obj/item/weapon/cultivator,/obj/item/weapon/crowbar,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aUc" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/grown/wheat,/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon,/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange,/obj/item/weapon/reagent_containers/food/snacks/grown/grapes,/obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod,/obj/item/weapon/reagent_containers/food/snacks/grown/apple,/obj/item/weapon/reagent_containers/food/snacks/grown/chili,/obj/item/weapon/reagent_containers/food/snacks/grown/cherries,/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans,/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aUd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aUe" = (/obj/item/weapon/storage/bag/plants/portaseeder,/obj/structure/table,/obj/machinery/light,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
@@ -4101,7 +4101,7 @@
"bAS" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/medical/medbay{name = "Medbay Central"})
"bAT" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"bAU" = (/obj/item/weapon/reagent_containers/food/snacks/grown/wheat,/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon,/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange,/obj/item/weapon/reagent_containers/food/snacks/grown/grapes,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
-"bAV" = (/obj/item/weapon/minihoe,/obj/item/weapon/crowbar,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
+"bAV" = (/obj/item/weapon/cultivator,/obj/item/weapon/crowbar,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
"bAW" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bAX" = (/obj/structure/table/wood/poker,/obj/item/toy/cards/deck{pixel_y = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bAY" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/wood,/area/crew_quarters/bar)
@@ -5280,7 +5280,7 @@
"bXB" = (/obj/machinery/chem_master/condimaster{name = "BrewMaster 4000"; pixel_x = -4},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
"bXC" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/window/reinforced{dir = 8},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
"bXD" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
-"bXE" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/minihoe,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
+"bXE" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/cultivator,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
"bXF" = (/obj/structure/closet{name = "spare parts locker"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/item/weapon/rack_parts,/obj/item/weapon/rack_parts,/obj/item/weapon/wrench,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/kitchen)
"bXG" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/window/eastright{dir = 1; name = "Kitchen Delivery"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/kitchen)
"bXH" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 8; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
@@ -7577,7 +7577,7 @@
"cPK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/machinery/chem_heater{pixel_x = -4; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cPL" = (/obj/machinery/biogenerator,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cPM" = (/obj/item/weapon/reagent_containers/food/snacks/grown/banana,/obj/item/weapon/reagent_containers/food/snacks/grown/banana,/obj/item/weapon/reagent_containers/food/snacks/grown/wheat,/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon,/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon,/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon,/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange,/obj/item/weapon/reagent_containers/food/snacks/grown/grapes,/obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod,/obj/structure/rack{layer = 2.8},/obj/item/seeds/wheatseed,/obj/item/seeds/watermelonseed,/obj/item/seeds/watermelonseed,/obj/item/seeds/grapeseed,/obj/item/seeds/glowshroom,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
-"cPN" = (/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/minihoe,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/rack{layer = 2.8},/obj/item/seeds/cornseed,/obj/item/seeds/cabbageseed,/obj/item/seeds/ambrosiavulgarisseed,/obj/item/seeds/grassseed,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cPN" = (/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/cultivator,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/rack{layer = 2.8},/obj/item/seeds/cornseed,/obj/item/seeds/cabbageseed,/obj/item/seeds/ambrosiavulgarisseed,/obj/item/seeds/grassseed,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cPO" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/carrotseed,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cPP" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/glowshroom,/obj/item/seeds/cornseed,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cPQ" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
@@ -7682,7 +7682,7 @@
"cRL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cRM" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cRN" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/glowshroom,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
-"cRO" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/weapon/minihoe,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
+"cRO" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/weapon/cultivator,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"cRP" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/ambrosiavulgarisseed,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"cRQ" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/watermelonseed,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"cRR" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/berryseed,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index e7b4f4c8121..2e79fed7dde 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -1065,7 +1065,7 @@
"uy" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/bar)
"uz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/crew_quarters/bar)
"uA" = (/obj/machinery/requests_console{department = "Bar"; departmentType = 2; pixel_x = 30; pixel_y = 0},/mob/living/carbon/monkey{name = "Pun Pun"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/crew_quarters/bar)
-"uB" = (/obj/machinery/hydroponics/soil,/obj/item/weapon/minihoe,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 1},/area/hallway/primary/central)
+"uB" = (/obj/machinery/hydroponics/soil,/obj/item/weapon/cultivator,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 1},/area/hallway/primary/central)
"uC" = (/obj/machinery/hydroponics/soil,/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 1},/area/hallway/primary/central)
"uD" = (/obj/machinery/hydroponics/soil,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 1},/area/hallway/primary/central)
"uE" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
diff --git a/bot/NanoTrasenBot.py b/bot/NanoTrasenBot.py
index af97829d22d..40ea8325772 100644
--- a/bot/NanoTrasenBot.py
+++ b/bot/NanoTrasenBot.py
@@ -281,7 +281,7 @@ if nudgeable:
client.close() #Throw the bum out!
truedata = pickle.loads(data)
if truedata["ip"][0] == "#":
- conn.privmsg(truedata["ip"],"PRIVATE ANNOUNCEMENT : "+str(" ".join(truedata["data"])))
+ conn.privmsg(truedata["ip"],"AUTOMATIC ANNOUNCEMENT : "+str(" ".join(truedata["data"])))
else:
conn.privmsg(channel,"AUTOMATIC ANNOUNCEMENT : "+str(truedata["ip"])+" | "+str(" ".join(truedata["data"])))
thread.start_new_thread(nudgereceiver,())
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 9c2e1ccb84a..bc0dd8fc2b4 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -34,7 +34,7 @@
#define BE_MALF 16
#define BE_REV 32
#define BE_ALIEN 64
-#define BE_PAI 128 //Includes Positronic brains, but the flag is already maxed.
+#define BE_PAI 128
#define BE_CULTIST 256
#define BE_BLOB 512
#define BE_NINJA 1024
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index 243c176cb8d..461ec2c4601 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -191,12 +191,10 @@
return L
//Return a list with no duplicate entries
-/proc/uniquelist(var/list/L)
- var/list/K = list()
- for(var/item in L)
- if(!(item in K))
- K += item
- return K
+/proc/uniqueList(var/list/L)
+ . = list()
+ for(var/i in L)
+ . |= i
//for sorting clients or mobs by ckey
/proc/sortKey(list/L, order=1)
diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm
index d42d812db7a..2a4cfb7fb1b 100644
--- a/code/_globalvars/configuration.dm
+++ b/code/_globalvars/configuration.dm
@@ -41,12 +41,13 @@ var/list/be_special_flags = list(
"Malf AI" = BE_MALF,
"Revolutionary" = BE_REV,
"Alien Lifeform" = BE_ALIEN,
- "pAI/Positronic Brain" = BE_PAI,
+ "pAI" = BE_PAI,
"Cultist" = BE_CULTIST,
"Blob" = BE_BLOB,
"Ninja" = BE_NINJA,
"Monkey" = BE_MONKEY,
"Gang" = BE_GANG,
"Abductor" = BE_ABDUCTOR,
- "Revenant" = BE_REVENANT
+ "Revenant" = BE_REVENANT,
+ "Shadowling" = BE_SHADOWLING
)
diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm
index 565d2f0e7aa..579660008be 100644
--- a/code/controllers/subsystem/jobs.dm
+++ b/code/controllers/subsystem/jobs.dm
@@ -463,6 +463,8 @@ var/datum/subsystem/job/SSjob
return 0
/datum/subsystem/job/proc/RejectPlayer(var/mob/new_player/player)
+ if(player.mind && player.mind.special_role)
+ return
Debug("Popcap overflow Check observer located, Player: [player]")
player << "You have failed to qualify for any job you desired."
unassigned -= player
diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm
index 76e38207551..a5d4d432ea3 100644
--- a/code/controllers/subsystem/machines.dm
+++ b/code/controllers/subsystem/machines.dm
@@ -5,27 +5,42 @@ var/datum/subsystem/machines/SSmachine
priority = 9
var/list/processing = list()
+ var/list/powernets = list()
/datum/subsystem/machines/Initialize()
+ makepowernets()
fire()
..()
+/datum/subsystem/machines/proc/makepowernets(zlevel)
+ for(var/datum/powernet/PN in powernets)
+ qdel(PN)
+ powernets.Cut()
+
+ for(var/obj/structure/cable/PC in cable_list)
+ if(!PC.powernet)
+ var/datum/powernet/NewPN = new()
+ NewPN.add_cable(PC)
+ propagate_network(PC,PC.powernet)
/datum/subsystem/machines/New()
NEW_SS_GLOBAL(SSmachine)
/datum/subsystem/machines/stat_entry()
- ..("P:[processing.len]")
+ ..("M:[processing.len]|PN:[powernets.len]")
/datum/subsystem/machines/fire()
+ for(var/datum/powernet/Powernet in powernets)
+ Powernet.reset() //reset the power state.
+
var/seconds = wait * 0.1
for(var/thing in processing)
if(thing && (thing:process(seconds) != PROCESS_KILL))
if(thing:use_power)
- thing:auto_use_power()
+ thing:auto_use_power() //add back the power state
continue
processing.Remove(thing)
diff --git a/code/controllers/subsystem/power.dm b/code/controllers/subsystem/power.dm
deleted file mode 100644
index 65f6fc16430..00000000000
--- a/code/controllers/subsystem/power.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-var/datum/subsystem/power/SSpower
-
-/datum/subsystem/power
- name = "Power"
- priority = 10
-
- var/list/powernets = list()
-
-/datum/subsystem/power/New()
- NEW_SS_GLOBAL(SSpower)
-
-/datum/subsystem/power/stat_entry(msg)
- ..("P:[powernets.len]")
-
-/datum/subsystem/power/Initialize(timeofday, zlevel)
- makepowernets(zlevel)
- ..()
-
-// rebuild all power networks from scratch - only called at world creation or by the admin verb
-/datum/subsystem/power/proc/makepowernets(zlevel)
- for(var/datum/powernet/PN in powernets)
- qdel(PN)
- powernets.Cut()
-
- for(var/obj/structure/cable/PC in cable_list)
- if(!PC.powernet)
- var/datum/powernet/NewPN = new()
- NewPN.add_cable(PC)
- propagate_network(PC,PC.powernet)
-
-/datum/subsystem/power/fire()
- for(var/datum/powernet/Powernet in powernets)
- Powernet.reset()
\ No newline at end of file
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 4014d4eb0eb..4b42dbe91c8 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -370,7 +370,7 @@ var/record_id_num = 1001
if("Bartender")
clothes_s = icon('icons/mob/uniform.dmi', "ba_suit_s")
clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
- clothes_s.Blend(icon('icons/mob/suit.dmi', "armoralt"), ICON_OVERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
if("Quartermaster")
clothes_s = icon('icons/mob/uniform.dmi', "qm_s")
clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index a0daad681c2..165be307b4c 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -1387,7 +1387,11 @@
/datum/mind/proc/make_Gang(var/gang)
- special_role = "[(gang=="A") ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"] Boss"
+ special_role = "[gang_name(gang)] Gang ([gang]) Boss"
+ if(gang=="A")
+ ticker.mode.A_bosses += src
+ else if(gang=="B")
+ ticker.mode.B_bosses += src
ticker.mode.update_gang_icons_added(src, gang)
ticker.mode.forge_gang_objectives(src, gang)
ticker.mode.greet_gang(src)
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 69dfe876213..21bf92f6b4d 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -842,7 +842,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/reagent_containers/glass/bottle/ammonia,
/obj/item/weapon/reagent_containers/glass/bottle/ammonia,
/obj/item/weapon/hatchet,
- /obj/item/weapon/minihoe,
+ /obj/item/weapon/cultivator,
/obj/item/device/analyzer/plant_analyzer,
/obj/item/clothing/gloves/botanic_leather,
/obj/item/clothing/suit/apron) // Updated with new things
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 9e7b7328442..c629c157f98 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -137,6 +137,7 @@ var/list/blob_nodes = list()
core.overmind.mind.name = blob.name
infected_crew -= blob
infected_crew += core.overmind.mind
+ core.overmind.mind.special_role = "Blob Overmind"
/datum/game_mode/blob/post_setup()
diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm
index 8259d39a940..a4fc0435523 100644
--- a/code/game/gamemodes/blob/blob_finish.dm
+++ b/code/game/gamemodes/blob/blob_finish.dm
@@ -13,9 +13,7 @@
priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority")
return ..()
return 1
- if(station_was_nuked)//Nuke went off
- return 1
- return 0
+ return ..()
/datum/game_mode/blob/declare_completion()
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index 4988e1cedea..bf8822c40f5 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -106,6 +106,8 @@
B.blob_core = src
src.overmind = B
color = overmind.blob_reagent_datum.color
+ if(B.mind && !B.mind.special_role)
+ B.mind.special_role = "Blob Overmind"
spawn(0)
if(is_offspring)
B.verbs -= /mob/camera/blob/verb/split_consciousness
diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm
index 51e51392e59..9ce3ed0590a 100644
--- a/code/game/gamemodes/changeling/changeling_power.dm
+++ b/code/game/gamemodes/changeling/changeling_power.dm
@@ -61,7 +61,7 @@
if(req_stat < user.stat)
user << "We are incapacitated."
return 0
- if((user.status_flags & FAKEDEATH) && name!="Revive")
+ if((user.status_flags & FAKEDEATH) && name != "Regenerate")
user << "We are incapacitated."
return 0
if(c.geneticdamage > max_genetic_damage)
diff --git a/code/game/gamemodes/changeling/powers/adrenaline.dm b/code/game/gamemodes/changeling/powers/adrenaline.dm
new file mode 100644
index 00000000000..36c6f86dc5f
--- /dev/null
+++ b/code/game/gamemodes/changeling/powers/adrenaline.dm
@@ -0,0 +1,56 @@
+/obj/effect/proc_holder/changeling/adrenaline
+ name = "Adrenaline Sacs"
+ desc = "We evolve additional sacs of adrenaline throughout our body."
+ helptext = "Removes all stuns instantly and adds a short-term reduction in further stuns. Can be used while unconscious. Continued use poisons the body."
+ chemical_cost = 30
+ dna_cost = 2
+ req_human = 1
+ req_stat = UNCONSCIOUS
+
+//Recover from stuns.
+/obj/effect/proc_holder/changeling/adrenaline/sting_action(var/mob/living/user)
+ user << "Energy rushes through us.[user.lying ? " We arise." : ""]"
+ user.stat = 0
+ user.SetParalysis(0)
+ user.SetStunned(0)
+ user.SetWeakened(0)
+ user.lying = 0
+ user.update_canmove()
+ user.reagents.add_reagent("changelingAdrenaline", 10)
+ user.reagents.add_reagent("changelingAdrenaline2", 2) //For a really quick burst of speed
+ user.adjustStaminaLoss(-75)
+ feedback_add_details("changeling_powers","UNS")
+ return 1
+
+datum/reagent/medicine/changelingAdrenaline
+ name = "Adrenaline"
+ id = "changelingAdrenaline"
+ description = "Reduces stun times. Also deals toxin damage at high amounts."
+ color = "#C8A5DC"
+ overdose_threshold = 30
+
+datum/reagent/medicine/changelingAdrenaline/on_mob_life(var/mob/living/M as mob)
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ M.adjustStaminaLoss(-1)
+ ..()
+ return
+
+datum/reagent/medicine/changelingAdrenaline/overdose_process(var/mob/living/M as mob)
+ M.adjustToxLoss(1)
+ ..()
+ return
+
+datum/reagent/medicine/changelingAdrenaline2
+ name = "Adrenaline"
+ id = "changelingAdrenaline2"
+ description = "Drastically increases movement speed."
+ color = "#C8A5DC"
+ metabolization_rate = 1
+
+datum/reagent/medicine/changelingAdrenaline2/on_mob_life(var/mob/living/M as mob)
+ M.status_flags |= GOTTAGOREALLYFAST
+ M.adjustToxLoss(2)
+ ..()
+ return
diff --git a/code/game/gamemodes/changeling/powers/epinephrine.dm b/code/game/gamemodes/changeling/powers/epinephrine.dm
deleted file mode 100644
index 107bf5a96f8..00000000000
--- a/code/game/gamemodes/changeling/powers/epinephrine.dm
+++ /dev/null
@@ -1,27 +0,0 @@
-/obj/effect/proc_holder/changeling/epinephrine
- name = "Epinephrine Overdose"
- desc = "We evolve additional sacs of adrenaline throughout our body."
- helptext = "Removes all stuns instantly and adds a short-term reduction in further stuns. Can be used while unconscious. Continued use poisons the body."
- chemical_cost = 30
- dna_cost = 2
- req_human = 1
- req_stat = UNCONSCIOUS
-
-//Recover from stuns.
-/obj/effect/proc_holder/changeling/epinephrine/sting_action(var/mob/living/user)
-
- if(user.lying)
- user << "We arise."
- else
- user << "Adrenaline rushes through us."
- user.stat = 0
- user.SetParalysis(0)
- user.SetStunned(0)
- user.SetWeakened(0)
- user.lying = 0
- user.update_canmove()
- user.reagents.add_reagent("synaptizine", 20)
- user.adjustStaminaLoss(-75)
-
- feedback_add_details("changeling_powers","UNS")
- return 1
diff --git a/code/game/gamemodes/changeling/powers/fakedeath.dm b/code/game/gamemodes/changeling/powers/fakedeath.dm
index d9a7b33254b..f09eeceb54d 100644
--- a/code/game/gamemodes/changeling/powers/fakedeath.dm
+++ b/code/game/gamemodes/changeling/powers/fakedeath.dm
@@ -1,5 +1,5 @@
/obj/effect/proc_holder/changeling/fakedeath
- name = "Revival Stasis"
+ name = "Regenerative Stasis"
desc = "We fall into a stasis, allowing us to regenerate and trick our enemies."
chemical_cost = 15
dna_cost = 0
@@ -10,27 +10,25 @@
//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay.
/obj/effect/proc_holder/changeling/fakedeath/sting_action(var/mob/living/user)
-
user << "We begin our stasis, preparing energy to arise once more."
-
user.status_flags |= FAKEDEATH //play dead
user.update_canmove()
-
if(user.stat != DEAD)
user.emote("deathgasp")
user.tod = worldtime2text()
-
spawn(800)
if(user && user.mind && user.mind.changeling && user.mind.changeling.purchasedpowers)
user << "We are ready to regenerate."
user.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/revive(null)
-
feedback_add_details("changeling_powers","FD")
return 1
/obj/effect/proc_holder/changeling/fakedeath/can_sting(var/mob/user)
if(user.status_flags & FAKEDEATH)
+ user << "We are already regenerating."
return
- if(!user.stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death
- return
+ if(!user.stat) //Confirmation for living changelings if they want to fake their death
+ switch(alert("Are we sure we wish to fake our own death?",,"Yes", "No"))
+ if("No")
+ return
return ..()
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index 0acb082e057..438e32a3cc7 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -1,11 +1,10 @@
/obj/effect/proc_holder/changeling/revive
- name = "Revive"
+ name = "Regenerate"
desc = "We regenerate, healing all damage from our form."
req_stat = DEAD
//Revive from revival stasis
/obj/effect/proc_holder/changeling/revive/sting_action(var/mob/living/carbon/user)
-
if(user.stat == DEAD)
dead_mob_list -= user
living_mob_list += user
@@ -25,7 +24,6 @@
H.restore_blood()
H.remove_all_embedded_objects()
user << "We have regenerated."
-
user.status_flags &= ~(FAKEDEATH)
user.update_canmove()
user.mind.changeling.purchasedpowers -= src
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index a8844a41d4f..a28e8f45e2f 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -33,8 +33,8 @@
user.whisper(message)
for(var/mob/M in mob_list)
if(iscultist(M) || (M in dead_mob_list))
- if(clear)
- M << "Acolyte [user]: [message]"
+ if(clear || !ishuman(M)) //Cultists always commune successfully
+ M << "[(ishuman(M) ? "Acolyte" : "Construct")] [user]: [message]"
else
M << "Acolyte ???: [message]"
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 2a5b66cbe45..629a4d49034 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -175,7 +175,7 @@
return 1
if(!round_converted && (!config.continuous[config_tag] || (config.continuous[config_tag] && config.midround_antag[config_tag]))) //Non-continuous or continous with replacement antags
if(!continuous_sanity_checked) //make sure we have antags to be checking in the first place
- for(var/mob/living/Player in mob_list)
+ for(var/mob/Player in mob_list)
if(Player.mind)
if(Player.mind.special_role)
continuous_sanity_checked = 1
@@ -190,7 +190,7 @@
if(living_antag_player && living_antag_player.mind && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player))
return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark.
- for(var/mob/living/Player in living_mob_list)
+ for(var/mob/Player in living_mob_list)
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player))
if(Player.mind.special_role) //Someone's still antaging!
living_antag_player = Player
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index bf5d11dcbc5..7bfc21b0ea2 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -201,6 +201,15 @@
return 0
return 1
+/datum/game_mode/nuclear/check_finished() //to be called by ticker
+ if(replacementmode && round_converted == 2)
+ return replacementmode.check_finished()
+ if(SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || station_was_nuked)
+ return 1
+ if(are_operatives_dead())
+ if(bomb_set) //snaaaaaaaaaake! It's not over yet!
+ return 0
+ ..()
/datum/game_mode/nuclear/declare_completion()
var/disk_rescued = 1
@@ -237,7 +246,7 @@
world << "[syndicate_name()] operatives have earned Darwin Award!"
world << "[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't lose the disk!"
- else if ( disk_rescued && are_operatives_dead())
+ else if ((disk_rescued || SSshuttle.emergency.mode < SHUTTLE_ENDGAME) && are_operatives_dead())
feedback_set_details("round_end_result","loss - evacuation - disk secured - syndi team dead")
world << "Crew Major Victory!"
world << "The Research Staff has saved the disc and killed the [syndicate_name()] Operatives"
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 853e56ba38f..7bd0a665f3f 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -167,6 +167,8 @@ Made by Xhuis
world << "The shadowlings have been killed by the crew!"
else if(!check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE)
world << "The crew has escaped the station before the shadowlings could ascend!"
+ else
+ world << "The shadowlings have failed!"
..()
return 1
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 88fa45990a7..13b177762b0 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -118,13 +118,16 @@
return 1
if (src.m_amount + O.m_amt > max_m_amount)
- user << "The autolathe is full. Please remove metal from the autolathe in order to insert more."
+ user << "The autolathe is full. Please remove metal from the autolathe in order to insert more."
return 1
if (src.g_amount + O.g_amt > max_g_amount)
- user << "The autolathe is full. Please remove glass from the autolathe in order to insert more."
+ user << "The autolathe is full. Please remove glass from the autolathe in order to insert more."
return 1
- if (O.m_amt == 0 && O.g_amt == 0)
- user << "This object does not contain significant amounts of metal or glass, or cannot be accepted by the autolathe due to size or hazardous materials."
+ if (!O.m_amt && !O.g_amt)
+ user << "This object does not contain sufficient amounts of metal or glass to be accepted by the autolathe."
+ return 1
+ if(!user.unEquip(O))
+ user << "\The [O] is stuck to you and cannot be placed into the autolathe."
return 1
var/amount = 1
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index bea3f1e054d..35a1b38e85c 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -188,6 +188,8 @@
message_admins(adminlog)
log_game(adminlog)
explosion(get_turf(src),2,5,11, flame_range = 11)
+ if(src.loc && istype(src.loc,/obj/machinery/syndicatebomb/))
+ qdel(src.loc)
qdel(src)
/obj/item/weapon/bombcore/proc/defuse()
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index a65c4cd50cd..0324bba060b 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -76,7 +76,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
//postpone processing for a bit
var/postponeCycles = max(round(devastation_range/8),1)
SSlighting.postpone(postponeCycles)
- SSpower.postpone(postponeCycles)
+ SSmachine.postpone(postponeCycles)
if(heavy_impact_range > 1)
var/datum/effect/system/explosion/E = new/datum/effect/system/explosion()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index e586ab90a8b..a2ad1549732 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -289,7 +289,7 @@
set category = "Object"
set name = "Pick up"
- if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr))
+ if(usr.stat || usr.restrained() || !Adjacent(usr) || usr.stunned || usr.weakened || usr.lying)
return
if(ishuman(usr) || ismonkey(usr))
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index f80ec37a5cf..f64f19ef4cf 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -183,6 +183,8 @@
return 1
/obj/item/stack/proc/zero_amount()
+ if(is_cyborg)
+ return source.energy < cost
if (amount < 1)
if(usr)
usr.unEquip(src, 1)
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 51f02777b21..a8f09123362 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -108,9 +108,7 @@
/obj/item/weapon/wrench)
reqs = list(/obj/item/stack/sheet/metal = 4,
/obj/item/stack/packageWrap = 8,
- /obj/item/pipe = 2,
- /obj/machinery/atmospherics/binary/valve = 1,
- /obj/machinery/atmospherics/pipe/manifold = 1,)
+ /obj/item/pipe = 2)
time = 300
/obj/item/weapon/pneumatic_cannon/proc/updateTank(var/obj/item/weapon/tank/internals/thetank, var/removing = 0, var/mob/living/carbon/human/user)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
index 8dccb1c86e2..0a137e0497e 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
@@ -16,7 +16,7 @@
new /obj/item/device/analyzer/plant_analyzer(src)
new /obj/item/device/radio/headset/headset_srv(src)
new /obj/item/clothing/mask/bandana(src)
- new /obj/item/weapon/minihoe(src)
+ new /obj/item/weapon/cultivator(src)
new /obj/item/weapon/hatchet(src)
new /obj/item/weapon/storage/backpack/botany(src)
new /obj/item/weapon/storage/backpack/botany(src)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 040ce4dcf7e..abbf7e51461 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -11,11 +11,11 @@
var/sound_effect_open = 'sound/machines/click.ogg'
var/sound_effect_close = 'sound/machines/click.ogg'
var/obj/item/weapon/paper/manifest/manifest
-
+
/obj/structure/closet/crate/New()
..()
update_icon()
-
+
/obj/structure/closet/crate/update_icon()
overlays.Cut()
@@ -111,7 +111,7 @@
..()
new /obj/item/weapon/reagent_containers/spray/plantbgone(src)
new /obj/item/weapon/reagent_containers/spray/plantbgone(src)
- new /obj/item/weapon/minihoe(src)
+ new /obj/item/weapon/cultivator(src)
/obj/structure/closet/crate/secure
desc = "A secure crate."
@@ -148,7 +148,7 @@
name = "secure hydroponics crate"
icon_crate = "hydrosecurecrate"
icon_state = "hydrosecurecrate"
-
+
/obj/structure/closet/crate/secure/update_icon()
..()
if(locked)
@@ -202,7 +202,7 @@
user.put_in_hands(manifest)
manifest = null
overlays-="manifest"
-
+
/obj/structure/closet/crate/attack_hand(mob/user as mob)
if(manifest)
tear_manifest(user)
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 985665278de..fd324892490 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -30,7 +30,7 @@
else if(istype(W, /obj/item/weapon/wrench) && state == GIRDER_DISPLACED)
if (!istype(src.loc, /turf/simulated/floor))
- usr << "A floor must be present to secure the girder!"
+ user << "A floor must be present to secure the girder!"
return
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
user << "You start securing the girder..."
@@ -82,8 +82,14 @@
qdel(src)
else if(istype(W, /obj/item/stack/sheet))
+ if (istype(src.loc, /turf/simulated/wall))
+ user << "There is already a wall present!"
+ return
if (!istype(src.loc, /turf/simulated/floor))
- usr << "A floor must be present to build a false wall!"
+ user << "A floor must be present to build a false wall!"
+ return
+ if (locate(/obj/structure/falsewall) in src.loc.contents)
+ user << "There is already a false wall present!"
return
var/obj/item/stack/sheet/S = W
@@ -190,7 +196,7 @@
qdel(src)
return
- add_hiddenprint(usr)
+ add_hiddenprint(user)
else if(istype(W, /obj/item/pipe))
var/obj/item/pipe/P = W
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index d09fd62b222..d92217983db 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -48,12 +48,13 @@
else if(istype(C, /obj/item/stack/tile))
if(!broken && !burnt)
var/obj/item/stack/tile/W = C
+ if(!W.use(1))
+ return
var/turf/simulated/floor/T = ChangeTurf(W.turf_type)
if(istype(W,/obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow
var/obj/item/stack/tile/light/L = W
var/turf/simulated/floor/light/F = T
F.state = L.state
- W.use(1)
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
else
user << "This section is too damaged to support a tile! Use a welder to fix the damage."
diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
index 0b2c5d0fda2..31f01164df4 100644
--- a/code/modules/admin/admin_investigate.dm
+++ b/code/modules/admin/admin_investigate.dm
@@ -22,12 +22,12 @@
F << "[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z]) || [src] [message]
"
//ADMINVERBS
-/client/proc/investigate_show( subject in list("hrefs","notes","ntsl","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor") )
+/client/proc/investigate_show( subject in list("hrefs","notes","ntsl","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "kudzu") )
set name = "Investigate"
set category = "Admin"
if(!holder) return
switch(subject)
- if("singulo", "ntsl", "wires", "telesci", "gravity", "records", "cargo", "supermatter", "atmos") //general one-round-only stuff
+ if("singulo", "ntsl", "wires", "telesci", "gravity", "records", "cargo", "supermatter", "atmos", "kudzu") //general one-round-only stuff
var/F = investigate_subject2file(subject)
if(!F)
src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed."
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 01bf8b06c6f..656097730e6 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -329,6 +329,11 @@
dat += ", [config.midround_antag[ticker.mode.config_tag] ? "creating replacement antagonists" : "not creating new antagonists"]
"
else
dat += "
"
+ if(config.midround_antag[ticker.mode.config_tag])
+ dat += "Time limit: [config.midround_antag_time_check] minutes into round
"
+ dat += "Living crew limit: [config.midround_antag_life_check * 100]% of crew alive
"
+ dat += "If limits past: [ticker.mode.round_ends_with_antag_death ? "End The Round" : "Continue As Extended"]
"
+
dat += "
"
dat += "End Round Now
"
dat += "[ticker.delay_end ? "End Round Normally" : "Delay Round End"]
"
@@ -337,7 +342,7 @@
for(var/datum/mind/N in ticker.mode.syndicates)
var/mob/M = N.current
if(M)
- dat += "
| Target(s) | Location | |
| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | " + dat += "||
| [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] | " dat += "PM | " var/turf/mob_loc = get_turf(M) dat += "[mob_loc.loc] |
| Gang Boss not found! | ||
| [M.real_name] (Boss)[M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | " + dat += "||
| [M.real_name] (Boss)[M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] | " dat += "PM | |
| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | " + dat += "||
| [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] | " dat += "PM |