diff --git a/code/modules/food/kitchen/smartfridge/smartfridge.dm b/code/modules/food/kitchen/smartfridge/smartfridge.dm
index 5d2c765d92..2475d4caef 100644
--- a/code/modules/food/kitchen/smartfridge/smartfridge.dm
+++ b/code/modules/food/kitchen/smartfridge/smartfridge.dm
@@ -1,9 +1,8 @@
-<<<<<<< HEAD:code/modules/food/kitchen/smartfridge.dm
/* SmartFridge. Much todo
*/
/obj/machinery/smartfridge
name = "\improper SmartFridge"
- desc = "For storing all sorts of perishable foods!"
+ desc = "For storing all sorts of things! This one doesn't accept any of them!"
icon = 'icons/obj/vending.dmi'
icon_state = "fridge_food"
var/icon_base = "fridge_food" //Iconstate to base all the broken/deny/etc on
@@ -14,10 +13,10 @@
idle_power_usage = 5
active_power_usage = 100
flags = NOREACT
- var/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't look things over 1000. //VOREStation Edit - Non-global
- //var/global/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't look things over 1000.
+ var/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't look things over 1000. //VOREStation Edit - Nonglobal so subtypes can override to lower values
var/list/item_records = list()
var/datum/stored_item/currently_vending = null //What we're putting out of the machine.
+ var/stored_datum_type = /datum/stored_item
var/seconds_electrified = 0;
var/shoot_inventory = 0
var/locked = 0
@@ -25,6 +24,7 @@
var/is_secure = 0
var/wrenchable = 0
var/datum/wires/smartfridge/wires = null
+ var/persistent = null // Path of persistence datum used to track contents
/obj/machinery/smartfridge/secure
is_secure = 1
@@ -34,6 +34,8 @@
/obj/machinery/smartfridge/New()
..()
+ if(persistent)
+ SSpersistence.track_value(src, persistent)
if(is_secure)
wires = new/datum/wires/smartfridge/secure(src)
else
@@ -44,160 +46,13 @@
for(var/A in item_records) //Get rid of item records.
qdel(A)
wires = null
+ if(persistent)
+ SSpersistence.forget_value(src, persistent)
return ..()
/obj/machinery/smartfridge/proc/accept_check(var/obj/item/O as obj)
- if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/))
- return 1
- return 0
-
-/obj/machinery/smartfridge/seeds
- name = "\improper MegaSeed Servitor"
- desc = "When you need seeds fast!"
- icon_contents = "chem"
-
-/obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O as obj)
- if(istype(O,/obj/item/seeds/))
- return 1
- return 0
-
-/obj/machinery/smartfridge/secure/extract
- name = "\improper Biological Sample Storage"
- desc = "A refrigerated storage unit for xenobiological samples."
- icon_contents = "slime"
- req_access = list(access_research)
-
-/obj/machinery/smartfridge/secure/extract/accept_check(var/obj/item/O as obj)
- if(istype(O, /obj/item/slime_extract))
- return TRUE
- if(istype(O, /obj/item/slimepotion))
- return TRUE
return FALSE
-/obj/machinery/smartfridge/secure/medbay
- name = "\improper Refrigerated Medicine Storage"
- desc = "A refrigerated storage unit for storing medicine and chemicals."
- req_one_access = list(access_medical,access_chemistry)
-
-/obj/machinery/smartfridge/secure/medbay/accept_check(var/obj/item/O as obj)
- if(istype(O,/obj/item/weapon/reagent_containers/glass/))
- return 1
- if(istype(O,/obj/item/weapon/storage/pill_bottle/))
- return 1
- if(istype(O,/obj/item/weapon/reagent_containers/pill/))
- return 1
- return 0
-
-/obj/machinery/smartfridge/secure/virology
- name = "\improper Refrigerated Virus Storage"
- desc = "A refrigerated storage unit for storing viral material."
- icon_contents = "drink"
- req_access = list(access_virology)
-
-/obj/machinery/smartfridge/secure/virology/accept_check(var/obj/item/O as obj)
- if(istype(O,/obj/item/weapon/reagent_containers/glass/beaker/vial/))
- return 1
- if(istype(O,/obj/item/weapon/virusdish/))
- return 1
- return 0
-
-/obj/machinery/smartfridge/chemistry //Is this used anywhere? It's not secure.
- name = "\improper Smart Chemical Storage"
- desc = "A refrigerated storage unit for medicine and chemical storage."
- icon_contents = "chem"
-
-/obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O as obj)
- if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers))
- return 1
- return 0
-
-/obj/machinery/smartfridge/chemistry/virology //Same
- name = "\improper Smart Virus Storage"
- desc = "A refrigerated storage unit for volatile sample storage."
-
-/obj/machinery/smartfridge/drinks
- name = "\improper Drink Showcase"
- desc = "A refrigerated storage unit for tasty tasty alcohol."
- icon_state = "fridge_drinks"
- icon_base = "fridge_drinks"
- icon_contents = "drink"
-
-/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O as obj)
- if(istype(O,/obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks) || istype(O,/obj/item/weapon/reagent_containers/food/condiment))
- return 1
-
-/obj/machinery/smartfridge/drying_rack
- name = "\improper Drying Rack"
- desc = "A machine for drying plants."
- wrenchable = 1
- icon_state = "drying_rack"
- icon_base = "drying_rack"
-
-/obj/machinery/smartfridge/drying_rack/accept_check(var/obj/item/O as obj)
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/))
- var/obj/item/weapon/reagent_containers/food/snacks/S = O
- if (S.dried_type)
- return 1
-
- if(istype(O, /obj/item/stack/wetleather))
- return 1
-
- return 0
-
-/obj/machinery/smartfridge/drying_rack/process()
- ..()
- if(stat & (BROKEN|NOPOWER))
- return
- if(contents.len)
- dry()
- update_icon()
-
-/obj/machinery/smartfridge/drying_rack/update_icon()
- var/not_working = stat & (BROKEN|NOPOWER)
- var/hasItems
- for(var/datum/stored_item/I in item_records)
- if(I.get_amount())
- hasItems = 1
- break
- if(hasItems)
- if(not_working)
- icon_state = "[icon_base]-plant-off"
- else
- icon_state = "[icon_base]-plant"
- else
- if(not_working)
- icon_state = "[icon_base]-off"
- else
- icon_state = "[icon_base]"
-
-/obj/machinery/smartfridge/drying_rack/proc/dry()
- for(var/datum/stored_item/I in item_records)
- for(var/obj/item/weapon/reagent_containers/food/snacks/S in I.instances)
- if(S.dry) continue
- if(S.dried_type == S.type)
- S.dry = 1
- S.name = "dried [S.name]"
- S.color = "#AAAAAA"
- I.instances -= S
- S.forceMove(get_turf(src))
- else
- var/D = S.dried_type
- new D(get_turf(src))
- qdel(S)
- return
-
- for(var/obj/item/stack/wetleather/WL in I.instances)
- if(!WL.wetness)
- if(WL.amount)
- WL.forceMove(get_turf(src))
- WL.dry()
- I.instances -= WL
- break
-
- WL.wetness = max(0, WL.wetness - rand(1, 3))
-
- return
-
/obj/machinery/smartfridge/process()
if(stat & (BROKEN|NOPOWER))
return
@@ -230,7 +85,7 @@
is_off = "-off"
// Fridge contents
- if(contents) //VOREStation Edit - Some fridges do not have visible contents
+ if(contents)
switch(contents.len)
if(0)
add_overlay("empty[is_off]")
@@ -312,21 +167,28 @@
to_chat(user, "You short out the product lock on [src].")
return 1
-/obj/machinery/smartfridge/proc/stock(obj/item/O)
- var/hasRecord = FALSE //Check to see if this passes or not.
- for(var/datum/stored_item/I in item_records)
+/obj/machinery/smartfridge/proc/find_record(var/obj/item/O)
+ for(var/datum/stored_item/I as anything in item_records)
if((O.type == I.item_path) && (O.name == I.item_name))
- I.add_product(O)
- hasRecord = TRUE
- break
- if(!hasRecord)
- var/datum/stored_item/item = new/datum/stored_item(src, O.type, O.name)
- item.add_product(O)
- item_records.Add(item)
+ return I
+ return null
+
+/obj/machinery/smartfridge/proc/stock(obj/item/O)
+ var/datum/stored_item/I = find_record(O)
+ if(!istype(I))
+ I = new stored_datum_type(src, O.type, O.name)
+ item_records.Add(I)
+ I.add_product(O)
SStgui.update_uis(src)
-/obj/machinery/smartfridge/proc/vend(datum/stored_item/I)
- I.get_product(get_turf(src))
+/obj/machinery/smartfridge/proc/vend(datum/stored_item/I, var/count)
+ var/amount = I.get_amount()
+ // Sanity check, there are probably ways to press the button when it shouldn't be possible.
+ if(amount <= 0)
+ return
+
+ for(var/i = 1 to min(amount, count))
+ I.get_product(get_turf(src))
SStgui.update_uis(src)
/obj/machinery/smartfridge/attack_ai(mob/user as mob)
@@ -377,16 +239,10 @@
return FALSE
var/index = text2num(params["index"])
- var/datum/stored_item/I = item_records[index]
- var/count = I.get_amount()
-
- // Sanity check, there are probably ways to press the button when it shouldn't be possible.
- if(count > 0)
- if((count - amount) < 0)
- amount = count
- for(var/i = 1 to amount)
- vend(I)
-
+ if(index < 1 || index > LAZYLEN(item_records))
+ return TRUE
+
+ vend(item_records[index], amount)
return TRUE
return FALSE
@@ -394,7 +250,7 @@
var/obj/throw_item = null
var/mob/living/target = locate() in view(7,src)
if(!target)
- return 0
+ return FALSE
for(var/datum/stored_item/I in item_records)
throw_item = I.get_product(get_turf(src))
@@ -403,12 +259,12 @@
break
if(!throw_item)
- return 0
+ return FALSE
spawn(0)
throw_item.throw_at(target,16,3,src)
src.visible_message("[src] launches [throw_item.name] at [target.name]!")
SStgui.update_uis(src)
- return 1
+ return TRUE
/************************
* Secure SmartFridges
@@ -422,285 +278,3 @@
to_chat(usr, "Access denied.")
return TRUE
return ..()
-=======
-/* SmartFridge. Much todo
-*/
-/obj/machinery/smartfridge
- name = "\improper SmartFridge"
- desc = "For storing all sorts of things! This one doesn't accept any of them!"
- icon = 'icons/obj/vending.dmi'
- icon_state = "fridge_food"
- var/icon_base = "fridge_food" //Iconstate to base all the broken/deny/etc on
- var/icon_contents = "food" //Overlay to put on glass to show contents
- density = 1
- anchored = 1
- use_power = USE_POWER_IDLE
- idle_power_usage = 5
- active_power_usage = 100
- flags = NOREACT
- var/global/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't look things over 1000.
- var/list/item_records = list()
- var/datum/stored_item/currently_vending = null //What we're putting out of the machine.
- var/stored_datum_type = /datum/stored_item
- var/seconds_electrified = 0;
- var/shoot_inventory = 0
- var/locked = 0
- var/scan_id = 1
- var/is_secure = 0
- var/wrenchable = 0
- var/datum/wires/smartfridge/wires = null
- var/persistent = null // Path of persistence datum used to track contents
-
-/obj/machinery/smartfridge/secure
- is_secure = 1
- icon_state = "fridge_sci"
- icon_base = "fridge_sci"
- icon_contents = "chem"
-
-/obj/machinery/smartfridge/New()
- ..()
- if(persistent)
- SSpersistence.track_value(src, persistent)
- if(is_secure)
- wires = new/datum/wires/smartfridge/secure(src)
- else
- wires = new/datum/wires/smartfridge(src)
-
-/obj/machinery/smartfridge/Destroy()
- qdel(wires)
- for(var/A in item_records) //Get rid of item records.
- qdel(A)
- wires = null
- if(persistent)
- SSpersistence.forget_value(src, persistent)
- return ..()
-
-/obj/machinery/smartfridge/proc/accept_check(var/obj/item/O as obj)
- return FALSE
-
-/obj/machinery/smartfridge/process()
- if(stat & (BROKEN|NOPOWER))
- return
- if(src.seconds_electrified > 0)
- src.seconds_electrified--
- if(src.shoot_inventory && prob(2))
- src.throw_item()
-
-/obj/machinery/smartfridge/power_change()
- var/old_stat = stat
- ..()
- if(old_stat != stat)
- update_icon()
-
-/obj/machinery/smartfridge/update_icon()
- cut_overlays()
- if(stat & (BROKEN|NOPOWER))
- icon_state = "[icon_base]-off"
- else
- icon_state = icon_base
-
- if(is_secure)
- add_overlay("[icon_base]-sidepanel")
-
- if(panel_open)
- add_overlay("[icon_base]-panel")
-
- var/is_off = ""
- if(inoperable())
- is_off = "-off"
-
- // Fridge contents
- if(contents)
- switch(contents.len)
- if(0)
- add_overlay("empty[is_off]")
- if(1 to 2)
- add_overlay("[icon_contents]-1[is_off]")
- if(3 to 5)
- add_overlay("[icon_contents]-2[is_off]")
- if(6 to 8)
- add_overlay("[icon_contents]-3[is_off]")
- else
- add_overlay("[icon_contents]-4[is_off]")
-
- // Fridge top
- var/image/top = image(icon, "[icon_base]-top")
- top.pixel_z = 32
- top.layer = ABOVE_WINDOW_LAYER
- add_overlay(top)
-
-/*******************
-* Item Adding
-********************/
-
-/obj/machinery/smartfridge/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(O.is_screwdriver())
- panel_open = !panel_open
- user.visible_message("[user] [panel_open ? "opens" : "closes"] the maintenance panel of \the [src].", "You [panel_open ? "open" : "close"] the maintenance panel of \the [src].")
- playsound(src, O.usesound, 50, 1)
- update_icon()
- return
-
- if(wrenchable && default_unfasten_wrench(user, O, 20))
- return
-
- if(istype(O, /obj/item/device/multitool) || O.is_wirecutter())
- if(panel_open)
- attack_hand(user)
- return
-
- if(stat & NOPOWER)
- to_chat(user, "\The [src] is unpowered and useless.")
- return
-
- if(accept_check(O))
- user.remove_from_mob(O)
- stock(O)
- user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].")
-
- else if(istype(O, /obj/item/weapon/storage/bag))
- var/obj/item/weapon/storage/bag/P = O
- var/plants_loaded = 0
- for(var/obj/G in P.contents)
- if(accept_check(G))
- P.remove_from_storage(G) //fixes ui bug - Pull Request 5515
- stock(G)
- plants_loaded = 1
- if(plants_loaded)
- user.visible_message("[user] loads \the [src] with \the [P].", "You load \the [src] with \the [P].")
- if(P.contents.len > 0)
- to_chat(user, "Some items are refused.")
-
- else if(istype(O, /obj/item/weapon/gripper)) // Grippers. ~Mechoid.
- var/obj/item/weapon/gripper/B = O //B, for Borg.
- if(!B.wrapped)
- to_chat(user, "\The [B] is not holding anything.")
- return
- else
- var/B_held = B.wrapped
- to_chat(user, "You use \the [B] to put \the [B_held] into \the [src].")
- return
-
- else
- to_chat(user, "\The [src] smartly refuses [O].")
- return 1
-
-/obj/machinery/smartfridge/secure/emag_act(var/remaining_charges, var/mob/user)
- if(!emagged)
- emagged = 1
- locked = -1
- to_chat(user, "You short out the product lock on [src].")
- return 1
-
-/obj/machinery/smartfridge/proc/find_record(var/obj/item/O)
- for(var/datum/stored_item/I as anything in item_records)
- if((O.type == I.item_path) && (O.name == I.item_name))
- return I
- return null
-
-/obj/machinery/smartfridge/proc/stock(obj/item/O)
- var/datum/stored_item/I = find_record(O)
- if(!istype(I))
- I = new stored_datum_type(src, O.type, O.name)
- item_records.Add(I)
- I.add_product(O)
- SStgui.update_uis(src)
-
-/obj/machinery/smartfridge/proc/vend(datum/stored_item/I, var/count)
- var/amount = I.get_amount()
- // Sanity check, there are probably ways to press the button when it shouldn't be possible.
- if(amount <= 0)
- return
-
- for(var/i = 1 to min(amount, count))
- I.get_product(get_turf(src))
- SStgui.update_uis(src)
-
-/obj/machinery/smartfridge/attack_ai(mob/user as mob)
- attack_hand(user)
-
-/obj/machinery/smartfridge/attack_hand(mob/user as mob)
- if(stat & (NOPOWER|BROKEN))
- return
- wires.Interact(user)
- tgui_interact(user)
-
-/obj/machinery/smartfridge/tgui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "SmartVend", name)
- ui.set_autoupdate(FALSE)
- ui.open()
-
-/obj/machinery/smartfridge/tgui_data(mob/user)
- . = list()
-
- var/list/items = list()
- for(var/i=1 to length(item_records))
- var/datum/stored_item/I = item_records[i]
- var/count = I.get_amount()
- if(count > 0)
- items.Add(list(list("name" = html_encode(capitalize(I.item_name)), "index" = i, "amount" = count)))
-
- .["contents"] = items
- .["name"] = name
- .["locked"] = locked
- .["secure"] = is_secure
-
-/obj/machinery/smartfridge/tgui_act(action, params)
- if(..())
- return TRUE
-
- add_fingerprint(usr)
- switch(action)
- if("Release")
- var/amount = 0
- if(params["amount"])
- amount = params["amount"]
- else
- amount = input("How many items?", "How many items would you like to take out?", 1) as num|null
-
- if(QDELETED(src) || QDELETED(usr) || !usr.Adjacent(src))
- return FALSE
-
- var/index = text2num(params["index"])
- if(index < 1 || index > LAZYLEN(item_records))
- return TRUE
-
- vend(item_records[index], amount)
- return TRUE
- return FALSE
-
-/obj/machinery/smartfridge/proc/throw_item()
- var/obj/throw_item = null
- var/mob/living/target = locate() in view(7,src)
- if(!target)
- return FALSE
-
- for(var/datum/stored_item/I in item_records)
- throw_item = I.get_product(get_turf(src))
- if (!throw_item)
- continue
- break
-
- if(!throw_item)
- return FALSE
- spawn(0)
- throw_item.throw_at(target,16,3,src)
- src.visible_message("[src] launches [throw_item.name] at [target.name]!")
- SStgui.update_uis(src)
- return TRUE
-
-/************************
-* Secure SmartFridges
-*************************/
-
-/obj/machinery/smartfridge/secure/tgui_act(action, params)
- if(stat & (NOPOWER|BROKEN))
- return TRUE
- if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf)))
- if(!allowed(usr) && !emagged && locked != -1 && action == "Release")
- to_chat(usr, "Access denied.")
- return TRUE
- return ..()
->>>>>>> b123a47... Adds persistent smartfridges for garden products, material sheets (#8042):code/modules/food/kitchen/smartfridge/smartfridge.dm
diff --git a/code/modules/food/kitchen/smartfridge_vr.dm b/code/modules/food/kitchen/smartfridge/smartfridge_vr.dm
similarity index 100%
rename from code/modules/food/kitchen/smartfridge_vr.dm
rename to code/modules/food/kitchen/smartfridge/smartfridge_vr.dm
diff --git a/code/modules/persistence/storage/smartfridge.dm b/code/modules/persistence/storage/smartfridge.dm
index 5a130c111a..0b2eee0ca1 100644
--- a/code/modules/persistence/storage/smartfridge.dm
+++ b/code/modules/persistence/storage/smartfridge.dm
@@ -52,14 +52,14 @@
if(subtok.len != 2)
return null
- if(!istype(plant_controller)) // No seed controller means the fruit will come out all wonky if at all
+ if(!istype(SSplants)) // No seed controller means the fruit will come out all wonky if at all
return null
subtok[2] = text2num(subtok[2])
// Ensure we've found a token describing the quantity of a path
if(subtok.len != 2 || \
- !istype(plant_controller.seeds[subtok[1]], /datum/seed) || \
+ !istype(SSplants.seeds[subtok[1]], /datum/seed) || \
!isnum(subtok[2]))
return null
diff --git a/vorestation.dme b/vorestation.dme
index 461fc3ca9d..b140827552 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2218,11 +2218,6 @@
#include "code\modules\food\kitchen\gibber.dm"
#include "code\modules\food\kitchen\icecream.dm"
#include "code\modules\food\kitchen\microwave.dm"
-<<<<<<< HEAD:vorestation.dme
-#include "code\modules\food\kitchen\smartfridge.dm"
-#include "code\modules\food\kitchen\smartfridge_vr.dm"
-=======
->>>>>>> b123a47... Adds persistent smartfridges for garden products, material sheets (#8042):polaris.dme
#include "code\modules\food\kitchen\cooking_machines\_appliance.dm"
#include "code\modules\food\kitchen\cooking_machines\_cooker.dm"
#include "code\modules\food\kitchen\cooking_machines\_cooker_output.dm"
@@ -2238,6 +2233,7 @@
#include "code\modules\food\kitchen\smartfridge\hydroponics.dm"
#include "code\modules\food\kitchen\smartfridge\medical.dm"
#include "code\modules\food\kitchen\smartfridge\smartfridge.dm"
+#include "code\modules\food\kitchen\smartfridge\smartfridge_vr.dm"
#include "code\modules\gamemaster\defines.dm"
#include "code\modules\gamemaster\event2\event.dm"
#include "code\modules\gamemaster\event2\meta.dm"
@@ -3290,15 +3286,7 @@
#include "code\modules\persistence\filth.dm"
#include "code\modules\persistence\graffiti.dm"
#include "code\modules\persistence\noticeboard.dm"
-<<<<<<< HEAD:vorestation.dme
#include "code\modules\persistence\persistence.dm"
-#include "code\modules\persistence\datum\datum_filth.dm"
-#include "code\modules\persistence\datum\datum_graffiti.dm"
-#include "code\modules\persistence\datum\datum_paper.dm"
-#include "code\modules\persistence\datum\datum_paper_sticky.dm"
-#include "code\modules\persistence\datum\datum_trash.dm"
-=======
->>>>>>> b123a47... Adds persistent smartfridges for garden products, material sheets (#8042):polaris.dme
#include "code\modules\persistence\datum\persistence_datum.dm"
#include "code\modules\persistence\effects\filth.dm"
#include "code\modules\persistence\effects\graffiti.dm"