diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 878c7a5808d..86bcf6e9ab6 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -14,16 +14,25 @@ var/global/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't look things over 1000. var/icon_on = "smartfridge" var/icon_off = "smartfridge-off" + var/icon_panel = "smartfridge-panel" var/item_quants = list() var/ispowered = 1 //starts powered var/isbroken = 0 + var/seconds_electrified = 0; + var/shoot_inventory = 0 + var/locked = 0 + var/panel_open = 0 //Hacking a smartfridge + var/wires = 7 + var/const/WIRE_SHOCK = 1 + var/const/WIRE_SHOOTINV = 2 + var/const/WIRE_SCANID = 3 //Only used by the secure smartfridge, but required by the cut, mend and pulse procs. + /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!" @@ -50,9 +59,9 @@ /obj/machinery/smartfridge/secure/medbay name = "\improper Refrigerated Medicine Storage" desc = "A refrigerated storage unit for storing medicine and chemicals." - icon_state = "smartfridge" + icon_state = "smartfridge" //To fix the icon in the map editor. icon_on = "smartfridge_chem" - req_access_txt = "5;33" + req_one_access_txt = "5;33" /obj/machinery/smartfridge/secure/medbay/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/reagent_containers/glass/)) @@ -100,6 +109,13 @@ 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/process() + if(!src.ispowered) + return + if(src.seconds_electrified > 0) + src.seconds_electrified-- + if(src.shoot_inventory && prob(2)) + src.throw_item() /obj/machinery/smartfridge/power_change() if( powered() ) @@ -171,7 +187,20 @@ src.emagged = 1 user << "You short out the product lock on [src]" return + else if(istype(O, /obj/item/weapon/screwdriver)) + src.panel_open = !src.panel_open + user << "You [src.panel_open ? "open" : "close"] the maintenance panel." + src.overlays.Cut() + if(src.panel_open) + src.overlays += image(src.icon, src.icon_panel) + src.updateUsrDialog() + return + else if(istype(O, /obj/item/device/multitool)||istype(O, /obj/item/weapon/wirecutters)) + if(src.panel_open) + attack_hand(user) + return ..() + return /obj/machinery/smartfridge/attack_paw(mob/user as mob) return src.attack_hand(user) @@ -181,6 +210,9 @@ /obj/machinery/smartfridge/attack_hand(mob/user as mob) user.set_machine(src) + if(src.seconds_electrified != 0) + if(src.shock(user, 100)) + return interact(user) /******************* @@ -213,8 +245,28 @@ dat += "
" dat += "" + if(panel_open) + //One of the wires does absolutely nothing. + var/list/vendwires = list( + "Blue" = 1, + "Red" = 2, + "Black" = 3 + ) + dat += "


Access Panel
" + for(var/wiredesc in vendwires) + var/is_uncut = src.wires & APCWireColorToFlag[vendwires[wiredesc]] + dat += "[wiredesc] wire: " + if(!is_uncut) + dat += "Mend" + else + dat += "Cut " + dat += "Pulse " + dat += "
" + + dat += "
" + dat += "The orange light is [(src.seconds_electrified == 0) ? "off" : "on"].
" + dat += "The red light is [src.shoot_inventory ? "off" : "blinking"].
" user << browse("[src] Supplies[dat]", "window=smartfridge") - onclose(user, "smartfridge") return /obj/machinery/smartfridge/Topic(href, href_list) @@ -222,32 +274,191 @@ return usr.set_machine(src) - var/N = href_list["vend"] - var/amount = text2num(href_list["amount"]) + if ((href_list["cutwire"]) && (src.panel_open)) + var/twire = text2num(href_list["cutwire"]) + if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) + usr << "You need wirecutters!" + return + if (src.isWireColorCut(twire)) + src.mend(twire) + else + src.cut(twire) + else if ((href_list["pulsewire"]) && (src.panel_open)) + var/twire = text2num(href_list["pulsewire"]) + if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) + usr << "You need a multitool!" + return + if (src.isWireColorCut(twire)) + usr << "You can't pulse a cut wire." + return + else + src.pulse(twire) + else if (href_list["vend"]) + var/N = href_list["vend"] + var/amount = text2num(href_list["amount"]) - if(item_quants[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible. - return + if(item_quants[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible. + return - item_quants[N] = max(item_quants[N] - amount, 0) - - var/i = amount - for(var/obj/O in contents) - if(O.name == N) - O.loc = src.loc - i-- - if(i <= 0) - break + item_quants[N] = max(item_quants[N] - amount, 0) + var/i = amount + for(var/obj/O in contents) + if(O.name == N) + O.loc = src.loc + i-- + if(i <= 0) + break src.add_fingerprint(usr) src.updateUsrDialog() return -//For secure fridges +/************* +* Hacking +**************/ + +/obj/machinery/smartfridge/proc/cut(var/wireColor) + var/wireFlag = APCWireColorToFlag[wireColor] + var/wireIndex = APCWireColorToIndex[wireColor] + src.wires &= ~wireFlag + switch(wireIndex) + if(WIRE_SHOCK) + src.seconds_electrified = -1 + if (WIRE_SHOOTINV) + if(!src.shoot_inventory) + src.shoot_inventory = 1 + if(WIRE_SCANID) + src.locked = 1 + +/obj/machinery/smartfridge/proc/mend(var/wireColor) + var/wireFlag = APCWireColorToFlag[wireColor] + var/wireIndex = APCWireColorToIndex[wireColor] //not used in this function + src.wires |= wireFlag + switch(wireIndex) + if(WIRE_SHOCK) + src.seconds_electrified = 0 + if (WIRE_SHOOTINV) + src.shoot_inventory = 0 + if(WIRE_SCANID) + src.locked = 0 + +/obj/machinery/smartfridge/proc/pulse(var/wireColor) + var/wireIndex = APCWireColorToIndex[wireColor] + switch(wireIndex) + if(WIRE_SHOCK) + src.seconds_electrified = 30 + if (WIRE_SHOOTINV) + src.shoot_inventory = !src.shoot_inventory + if(WIRE_SCANID) + src.locked = -1 + +/obj/machinery/smartfridge/proc/isWireColorCut(var/wireColor) + var/wireFlag = APCWireColorToFlag[wireColor] + return ((src.wires & wireFlag) == 0) + +/obj/machinery/smartfridge/proc/isWireCut(var/wireIndex) + var/wireFlag = APCIndexToFlag[wireIndex] + return ((src.wires & wireFlag) == 0) + +/obj/machinery/smartfridge/proc/throw_item() + var/obj/throw_item = null + var/mob/living/target = locate() in view(7,src) + if(!target) + return 0 + + for (var/O in item_quants) + if(item_quants[O] <= 0) //Try to use a record that actually has something to dump. + continue + + item_quants[O]-- + for(var/obj/T in contents) + if(T.name == O) + T.loc = src.loc + throw_item = T + break + break + if(!throw_item) + return 0 + spawn(0) + throw_item.throw_at(target,16,3) + src.visible_message("\red [src] launches [throw_item.name] at [target.name]!") + return 1 + +/obj/machinery/smartfridge/proc/shock(mob/user, prb) + if(!src.ispowered) // unpowered, no shock + return 0 + if(!prob(prb)) + return 0 + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + if (electrocute_mob(user, get_area(src), src, 0.7)) + return 1 + else + return 0 + +/************************ +* Secure SmartFridges +*************************/ /obj/machinery/smartfridge/secure/Topic(href, href_list) - if ((!src.allowed(usr)) && (!src.emagged)) //For SECURE VENDING MACHINES YEAH - usr << "\red Access denied." //Unless emagged of course - return + usr.set_machine(src) + if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) + if ((!src.allowed(usr)) && (!src.emagged) && (src.locked != -1) && href_list["vend"]) //For SECURE VENDING MACHINES YEAH + usr << "\red Access denied." //Unless emagged of course + return ..() + return + +/obj/machinery/smartfridge/secure/interact(mob/user as mob) + + if(!src.ispowered) + return + + var/dat = "Select an item:
" + + if (contents.len == 0) + dat += "No product loaded!" + else + for (var/O in item_quants) + if(item_quants[O] > 0) + var/N = item_quants[O] + dat += "[capitalize(O)]:" + dat += " [N] " + dat += "Vend " + if(N > 5) + dat += "(x5)" + if(N > 10) + dat += "(x10)" + if(N > 25) + dat += "(x25)" + if(N > 1) + dat += "(All)" + dat += "
" + + dat += "
" + if(panel_open) + var/list/vendwires = list( + "Violet" = 1, + "Orange" = 2, + "Green" = 3 + ) + dat += "


Access Panel
" + for(var/wiredesc in vendwires) + var/is_uncut = src.wires & APCWireColorToFlag[vendwires[wiredesc]] + dat += "[wiredesc] wire: " + if(!is_uncut) + dat += "Mend" + else + dat += "Cut " + dat += "Pulse " + dat += "
" + + dat += "
" + dat += "The orange light is [(src.seconds_electrified == 0) ? "off" : "on"].
" + //dat += "The red light is [src.shoot_inventory ? "off" : "blinking"].
" + dat += "The green light is [src.locked == 1 ? "off" : "[src.locked == -1 ? "blinking" : "on"]"].
" + user << browse("[src] Supplies[dat]", "window=smartfridge") + return //TODO: Make smartfridges hackable. - JoeyJo0