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"