From 1fb7d6ff902d59862de102d1d77ecb9f464fc3cc Mon Sep 17 00:00:00 2001 From: Lin Date: Thu, 19 Dec 2019 23:39:17 +0000 Subject: [PATCH] bloodbankfix --- code/game/machinery/bloodbankgen.dm | 159 ++++++++---------- .../living/carbon/human/species_types/ipc.dm | 2 +- 2 files changed, 68 insertions(+), 93 deletions(-) diff --git a/code/game/machinery/bloodbankgen.dm b/code/game/machinery/bloodbankgen.dm index c489f6c9..c92e5508 100644 --- a/code/game/machinery/bloodbankgen.dm +++ b/code/game/machinery/bloodbankgen.dm @@ -12,7 +12,6 @@ var/filling = FALSE var/obj/item/reagent_containers/blood/bag = null var/obj/item/reagent_containers/blood/outbag = null - var/bloodstored = 0 var/maxbloodstored = 1000 var/menustat = "menu" var/efficiency = 0 @@ -20,7 +19,7 @@ /obj/machinery/bloodbankgen/Initialize() . = ..() - create_reagents(1000) + create_reagents(maxbloodstored, AMOUNT_VISIBLE) update_icon() /obj/machinery/bloodbankgen/Destroy() @@ -28,12 +27,13 @@ QDEL_NULL(outbag) return ..() -/obj/machinery/bloodbankgen/contents_explosion(severity, target) - ..() +/obj/machinery/bloodbankgen/examine(mob/user) + . = ..() if(bag) - bag.ex_act(severity, target) + . += "It has \a [bag.name] hooked to its input slot. The counter reads: \"Current Capacity: [bag.reagents.total_volume] of [bag.reagents.maximum_volume]\"" if(outbag) - outbag.ex_act(severity, target) + . += "It has \a [bag.name] hooked to its output slot. The counter reads: \"Current Capacity: [outbag.reagents.total_volume] of [outbag.reagents.maximum_volume]\"" + /obj/machinery/bloodbankgen/handle_atom_del(atom/A) ..() @@ -115,80 +115,48 @@ /obj/machinery/bloodbankgen/process() if(!is_operational()) - return PROCESS_KILL - - bloodstored = reagents.total_volume + return var/transfer_amount = 20 if(draining) - if(reagents.total_volume >= reagents.maximum_volume) - draining = FALSE + if(reagents.total_volume >= reagents.maximum_volume || !bag || !bag.reagents.total_volume) + beep_stop_pumping() return - - if(bag) - if(bag.reagents.total_volume) - var/datum/reagent/blood/B = bag.reagents.has_reagent("blood") - if(B) - var/amount = reagents.maximum_volume - reagents.total_volume //monitor the machine's internal storage - amount = min(amount, transfer_amount) - if(!amount) - draining = FALSE - updateUsrDialog() - visible_message("[src] beeps loudly.") - playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) - return - - if(bag.blood_type == "SY") //no infinite loops using synthetics. - reagents.add_reagent("syntheticblood", amount) - else - reagents.add_reagent("syntheticblood", (amount+(5*efficiency))) - - if(bag.reagents.total_volume >= amount) - bag.reagents.remove_reagent("blood", amount) - else - visible_message("[src] beeps loudly.") - playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) - draining = FALSE - - bag.update_icon() - update_icon() - updateUsrDialog() - else - draining = FALSE - updateUsrDialog() + var/blood_amount = bag.reagents.get_reagent_amount("blood") + //monitor the machine and blood bag's reagents storage. + var/amount = min(blood_amount, min(transfer_amount, reagents.maximum_volume - reagents.total_volume)) + if(!amount) + beep_stop_pumping() return + var/bonus = bag.blood_type == "SY" ? 0 : 5 * efficiency //no infinite loops using synthetics. + reagents.add_reagent("syntheticblood", amount + bonus) + bag.reagents.remove_reagent("blood", amount) + update_icon() if(filling) - if(!reagents || !reagents.total_volume) - filling = FALSE //there ain't anything in the machine yo. + if(!reagents.total_volume || !outbag || outbag.reagents.total_volume >= outbag.reagents.maximum_volume) + beep_stop_pumping("[src] pings.", TRUE) return - if(outbag && outbag.reagents.total_volume < outbag.reagents.maximum_volume) - var/amount = outbag.reagents.maximum_volume - outbag.reagents.total_volume //monitor the output bag's internal storage - amount = min(amount, transfer_amount) - if(!amount) - filling = FALSE - visible_message("[src] pings.") - playsound(loc, 'sound/machines/beep.ogg', 50, 1) - updateUsrDialog() - return + //monitor the output bag's reagents storage. + var/amount = min(transfer_amount, outbag.reagents.maximum_volume - outbag.reagents.total_volume) + reagents.trans_to(outbag, amount) + update_icon() - reagents.trans_to(outbag, amount) - outbag.update_icon() - update_icon() - updateUsrDialog() - else - visible_message("[src] pings.") - playsound(loc, 'sound/machines/beep.ogg', 50, 1) - filling = FALSE - updateUsrDialog() - return +/obj/machinery/bloodbankgen/proc/beep_stop_pumping(msg = "[src] beeps loudly.", out_instead_of_in = FALSE) + if(out_instead_of_in) + filling = FALSE + else + draining = FALSE + updateUsrDialog() + audible_message(msg) + playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) /obj/machinery/bloodbankgen/attackby(obj/item/O, mob/user, params) if(user.a_intent == INTENT_HARM) return ..() - if(default_deconstruction_screwdriver(user, "bloodbank-off", "bloodbank-off", O)) + if(default_deconstruction_screwdriver(user, "bloodbank-off", "bloodbank-off", O) || default_unfasten_wrench(user, O, 20) == SUCCESSFUL_UNFASTEN) if(bag) var/obj/item/reagent_containers/blood/B = bag B.forceMove(drop_location()) @@ -204,31 +172,37 @@ return if(istype(O, /obj/item/reagent_containers/blood)) - . = 1 //no afterattack - if(!panel_open) - if(bag && outbag) - to_chat(user, "This machine already has bags attached.") - - if(!bag && !outbag) - var/choice = alert(user, "Choose where to place [O]", "", "Input", "Cancel", "Output") - switch(choice) - if("Cancel") - return FALSE - if("Input") - attachinput(O, user) - if("Output") - attachoutput(O, user) - else if(!bag) - attachinput(O, user) - else if(!outbag) - attachoutput(O, user) - else - to_chat(user, "Close the maintenance panel first.") - return + . = TRUE //no afterattack + var/msg + if(panel_open) + . += "Close the maintenance panel" + if(!anchored) + . += "[msg ? " and a" : "A"]nchor its bolts" + if(length(msg)) + to_chat(user, "[msg] first.") + return + if(bag && outbag) + to_chat(user, "This machine already has bags attached.") + if(!bag && !outbag) + var/choice = alert(user, "Choose where to place [O]", "", "Input", "Cancel", "Output") + switch(choice) + if("Cancel") + return FALSE + if("Input") + attachinput(O, user) + if("Output") + attachoutput(O, user) + else if(!bag) + attachinput(O, user) + else if(!outbag) + attachoutput(O, user) else to_chat(user, "You cannot put this in [src]!") +/obj/machinery/bloodbankgen/is_operational() + return ..() && anchored + /obj/machinery/bloodbankgen/ui_interact(mob/user) . = ..() @@ -268,7 +242,7 @@ if(!bag && !outbag) dat += "
No containers inside, please insert container.
" - var/datum/browser/popup = new(user, "bloodbankgen", name, 350, 520) + var/datum/browser/popup = new(user, "bloodbankgen", name, 350, 420) popup.set_content(dat) popup.open() @@ -306,6 +280,7 @@ if(usr && Adjacent(usr) && !issiliconoradminghost(usr)) usr.put_in_hands(bag) bag = null + draining = null update_icon() /obj/machinery/bloodbankgen/proc/detachoutput() @@ -314,6 +289,7 @@ if(usr && Adjacent(usr) && !issiliconoradminghost(usr)) usr.put_in_hands(outbag) outbag = null + filling = null update_icon() /obj/machinery/bloodbankgen/proc/attachinput(obj/item/O, mob/user) @@ -339,23 +315,22 @@ to_chat(user, "There is already something in this slot!") /obj/machinery/bloodbankgen/Topic(href, href_list) - if(..() || panel_open) + . = ..() + if(. | !is_operational()) return usr.set_machine(src) if(href_list["activateinput"]) activateinput() - updateUsrDialog() else if(href_list["detachinput"]) detachinput() - updateUsrDialog() else if(href_list["activateoutput"]) activateoutput() - updateUsrDialog() else if(href_list["detachoutput"]) detachoutput() - updateUsrDialog() + + updateUsrDialog() diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm index 2b53fa46..7cfba7aa 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -1,5 +1,5 @@ /datum/species/ipc - name = "I.P.C" + name = "I.P.C." id = "ipc" say_mod = "beeps" default_color = "00FF00"