diff --git a/code/datums/wires/seedstorage.dm b/code/datums/wires/seedstorage.dm
new file mode 100644
index 0000000000..e21bbb9faf
--- /dev/null
+++ b/code/datums/wires/seedstorage.dm
@@ -0,0 +1,60 @@
+#define SEED_WIRE_SMART 1
+#define SEED_WIRE_CONTRABAND 2
+#define SEED_WIRE_ELECTRIFY 4
+#define SEED_WIRE_LOCKDOWN 8
+
+/datum/wires/seedstorage
+ holder_type = /obj/machinery/seed_storage
+ wire_count = 4
+ random = 1
+
+/datum/wires/seedstorage/CanUse(var/mob/living/L)
+ var/obj/machinery/seed_storage/V = holder
+ if(!istype(L, /mob/living/silicon))
+ if(V.seconds_electrified)
+ if(V.shock(L, 100))
+ return 0
+ if(V.panel_open)
+ return 1
+ return 0
+
+/datum/wires/seedstorage/GetInteractWindow()
+ var/obj/machinery/seed_storage/V = holder
+ . += ..()
+ . += "
The orange light is [V.seconds_electrified ? "off" : "on"].
"
+ . += "The red light is [V.smart ? "off" : "blinking"].
"
+ . += "The green light is [(V.hacked || V.emagged) ? "on" : "off"].
"
+ . += "The keypad lock is [V.lockdown ? "deployed" : "retracted"].
"
+
+/datum/wires/seedstorage/UpdatePulsed(var/index)
+ var/obj/machinery/seed_storage/V = holder
+ switch(index)
+ if(SEED_WIRE_SMART)
+ V.smart = !V.smart
+ if(SEED_WIRE_CONTRABAND)
+ V.hacked = !V.hacked
+ if(SEED_WIRE_ELECTRIFY)
+ V.seconds_electrified = 30
+ if(SEED_WIRE_LOCKDOWN)
+ V.lockdown = !V.lockdown
+
+/datum/wires/seedstorage/UpdateCut(var/index, var/mended)
+ var/obj/machinery/seed_storage/V = holder
+ switch(index)
+ if(SEED_WIRE_SMART)
+ V.smart = 0
+ if(SEED_WIRE_CONTRABAND)
+ V.hacked = !mended
+ if(SEED_WIRE_ELECTRIFY)
+ if(mended)
+ V.seconds_electrified = 0
+ else
+ V.seconds_electrified = -1
+ if(SEED_WIRE_LOCKDOWN)
+ if(mended)
+ V.lockdown = 1
+ V.req_access = list()
+ V.req_one_access = list()
+ else
+ V.req_access = initial(V.req_access)
+ V.req_one_access = initial(V.req_one_access)
diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm
index ea7216dfd3..6b2d1d1695 100644
--- a/code/modules/hydroponics/seed_storage.dm
+++ b/code/modules/hydroponics/seed_storage.dm
@@ -29,12 +29,65 @@
var/seeds_initialized = 0 // Map-placed ones break if seeds are loaded right at the start of the round, so we do it on the first interaction
var/list/datum/seed_pile/piles = list()
+ var/list/datum/seed_pile/piles_contra = list() //Hacked.
var/list/starting_seeds = list()
+ var/list/contraband_seeds = list() //Seeds we only show if we've been hacked.
var/list/scanner = list() // What properties we can view
+ var/seconds_electrified = 0 //Shock users like an airlock.
+ var/smart = 0 //Used for hacking. Overrides the scanner.
+ var/hacked = 0
+ var/lockdown = 0
+ var/datum/wires/seedstorage/wires = null
+
+/obj/machinery/seed_storage/New()
+ ..()
+ wires = new(src)
+ if(!contraband_seeds.len)
+ contraband_seeds = pick(list(
+ list(
+ /obj/item/seeds/ambrosiavulgarisseed = 3,
+ /obj/item/seeds/greengrapeseed = 3,
+ /obj/item/seeds/reishimycelium = 2,
+ /obj/item/seeds/bloodtomatoseed = 1
+ ),
+ list(
+ /obj/item/seeds/ambrosiavulgarisseed = 3,
+ /obj/item/seeds/plastiseed = 3,
+ /obj/item/seeds/kudzuseed = 2,
+ /obj/item/seeds/nettleseed = 1
+ ),
+ list(
+ /obj/item/seeds/ambrosiavulgarisseed = 3,
+ /obj/item/seeds/amanitamycelium = 3,
+ /obj/item/seeds/libertymycelium = 2,
+ /obj/item/seeds/glowshroom = 1
+ ),
+ list(
+ /obj/item/seeds/ambrosiavulgarisseed = 3,
+ /obj/item/seeds/glowberryseed = 3,
+ /obj/item/seeds/icepepperseed = 2,
+ /obj/item/seeds/bluetomatoseed = 1
+ ),
+ list(
+ /obj/item/seeds/ambrosiadeusseed = 1,
+ /obj/item/seeds/killertomatoseed = 1
+ ),
+ list(
+ /obj/item/seeds/ambrosiavulgarisseed = 3,
+ /obj/item/seeds/random = 6
+ )
+ ))
+ return
+
+/obj/machinery/seed_storage/process()
+ ..()
+ if(seconds_electrified > 0)
+ seconds_electrified--
+ return
/obj/machinery/seed_storage/random // This is mostly for testing, but I guess admins could spawn it
name = "Random seed storage"
- scanner = list("stats", "produce", "soil", "temperature", "light")
+ scanner = list("stats", "produce", "soil", "temperature", "light", "pressure")
starting_seeds = list(/obj/item/seeds/random = 50)
/obj/machinery/seed_storage/garden
@@ -81,7 +134,8 @@
/obj/machinery/seed_storage/xenobotany
name = "Xenobotany seed storage"
- scanner = list("stats", "produce", "soil", "temperature", "light")
+ scanner = list("stats", "produce", "soil", "temperature", "light", "pressure")
+ smart = 1
starting_seeds = list(
/obj/item/seeds/ambrosiavulgarisseed = 3,
/obj/item/seeds/appleseed = 3,
@@ -128,6 +182,17 @@
)
/obj/machinery/seed_storage/attack_hand(mob/user as mob)
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+ if(seconds_electrified != 0)
+ if(shock(user, 100))
+ return
+
+ if(panel_open)
+ wires.Interact(user)
+ if(lockdown)
+ return
user.set_machine(src)
interact(user)
@@ -135,6 +200,11 @@
if (..())
return
+ if(smart)
+ scanner = list("stats", "produce", "soil", "temperature", "light", "pressure")
+ else
+ scanner = initial(scanner)
+
if (!seeds_initialized)
for(var/typepath in starting_seeds)
var/amount = starting_seeds[typepath]
@@ -143,6 +213,13 @@
for (var/i = 1 to amount)
var/O = new typepath
add(O)
+ for(var/typepath in contraband_seeds)
+ var/amount = contraband_seeds[typepath]
+ if(isnull(amount)) amount = 1
+
+ for (var/i = 1 to amount)
+ var/O = new typepath
+ add(O, 1)
seeds_initialized = 1
var/dat = "