diff --git a/code/modules/integrated_electronics/_defines.dm b/code/modules/integrated_electronics/_defines.dm index 017e7a1bf1..b6ce8472b7 100644 --- a/code/modules/integrated_electronics/_defines.dm +++ b/code/modules/integrated_electronics/_defines.dm @@ -42,10 +42,10 @@ ..() /obj/item/integrated_circuit/proc/setup_io(var/list/io_list, var/io_type) - var/list/names = io_list.Copy() + var/list/io_list_copy = io_list.Copy() io_list.Cut() - for(var/name in names) - io_list.Add(new io_type(src, name)) + for(var/io_entry in io_list_copy) + io_list.Add(new io_type(src, io_entry, io_list_copy[io_entry])) /obj/item/integrated_circuit/proc/on_data_written() //Override this for special behaviour when new data gets pushed to the circuit. return @@ -238,13 +238,14 @@ /datum/integrated_io var/name = "input/output" var/obj/item/integrated_circuit/holder = null - var/data = null + var/weakref/data = null // This is a weakref, to reduce typecasts. Note that oftentimes numbers and text may also occupy this. var/list/linked = list() var/io_type = DATA_CHANNEL -/datum/integrated_io/New(var/newloc, var/name) +/datum/integrated_io/New(var/newloc, var/name, var/data) ..() src.name = name + src.data = data holder = newloc if(!istype(holder)) message_admins("ERROR: An integrated_io ([src.name]) spawned without a valid holder! This is a bug.") diff --git a/code/modules/integrated_electronics/input_output.dm b/code/modules/integrated_electronics/input_output.dm index 5196617a83..6568662dc9 100644 --- a/code/modules/integrated_electronics/input_output.dm +++ b/code/modules/integrated_electronics/input_output.dm @@ -168,8 +168,9 @@ if(!isweakref(I.data)) return - var/weakref/w = I.data - var/atom/A = w.resolve() + var/atom/A = I.data.resolve() + if(!A) + return var/desired_type = A.type var/list/nearby_things = range(1, get_turf(src)) @@ -216,7 +217,7 @@ /obj/item/integrated_circuit/input/signaler/on_data_written() var/datum/integrated_io/new_freq = inputs[1] var/datum/integrated_io/new_code = inputs[2] - if(isnum(new_freq.data)) + if(isnum(new_freq.data) && new_freq.data > 0) set_frequency(new_freq.data) if(isnum(new_code.data)) code = new_code.data diff --git a/code/modules/integrated_electronics/manipulation.dm b/code/modules/integrated_electronics/manipulation.dm index 1fac6ba19c..bad3944e8e 100644 --- a/code/modules/integrated_electronics/manipulation.dm +++ b/code/modules/integrated_electronics/manipulation.dm @@ -120,53 +120,42 @@ flags = OPENCONTAINER complexity = 20 cooldown_per_use = 6 SECONDS - inputs = list("target ref", "injection amount") + inputs = list("target ref", "injection amount" = 5) outputs = list() activators = list("inject") - var/inject_amount = 5 /obj/item/integrated_circuit/manipulation/injector/New() ..() create_reagents(30) - var/datum/integrated_io/amount = inputs[2] - amount.data = inject_amount -/obj/item/integrated_circuit/manipulation/injector/on_data_written() +/obj/item/integrated_circuit/manipulation/injector/proc/inject_amount() var/datum/integrated_io/amount = inputs[2] if(isnum(amount.data)) - amount.data = Clamp(amount.data, 0, 30) - inject_amount = amount.data + return Clamp(amount.data, 0, 30) /obj/item/integrated_circuit/manipulation/injector/do_work() + set waitfor = 0 // Don't sleep in a proc that is called by a processor without this set, otherwise it'll delay the entire thing + var/datum/integrated_io/target = inputs[1] var/atom/movable/AM = target.data_as_type(/atom/movable) if(!istype(AM)) //Invalid input return if(!reagents.total_volume) // Empty return - if(AM.Adjacent(get_turf(src))) - if(!AM.reagents) - return - if(!AM.is_open_container() && !ismob(AM) ) - return - if(!AM.reagents.get_free_space()) - return - + if(AM.can_be_injected_by(src)) if(isliving(AM)) - var/mob/living/L = AM - if(!L.can_inject(null, 0, BP_TORSO)) - return - loc.visible_message("[src] is trying to inject [AM]!") + var/turf/T = get_turf(AM) + T.visible_message("[src] is trying to inject [AM]!") sleep(3 SECONDS) - if(!AM.Adjacent(get_turf(src))) + if(!AM.can_be_injected_by(src)) return var/contained = reagents.get_reagents() - var/trans = reagents.trans_to_mob(target, inject_amount, CHEM_BLOOD) - message_admins("[src] injected \the [AM] with [trans]u of [english_list(contained)].") + var/trans = reagents.trans_to_mob(target, inject_amount(), CHEM_BLOOD) + message_admins("[src] injected \the [AM] with [trans]u of [contained].") to_chat(AM, "You feel a tiny prick!") visible_message("[src] injects [AM]!") else - reagents.trans_to(AM, inject_amount) + reagents.trans_to(AM, inject_amount()) /obj/item/integrated_circuit/manipulation/reagent_pump name = "reagent pump" @@ -177,16 +166,11 @@ outside the machine if it is next to the machine. Note that this cannot be used on entities." flags = OPENCONTAINER complexity = 8 - inputs = list("source ref", "target ref", "injection amount") + inputs = list("source ref", "target ref", "injection amount" = 10) outputs = list() activators = list("transfer reagents") var/transfer_amount = 10 -/obj/item/integrated_circuit/manipulation/reagent_pump/New() - ..() - var/datum/integrated_io/amount = inputs[3] - amount.data = transfer_amount - /obj/item/integrated_circuit/manipulation/reagent_pump/on_data_written() var/datum/integrated_io/amount = inputs[3] if(isnum(amount.data)) @@ -269,11 +253,11 @@ /obj/item/integrated_circuit/manipulation/locomotion/do_work() ..() var/turf/T = get_turf(src) - if(istype(loc, /obj/item/device/electronic_assembly)) + if(T && istype(loc, /obj/item/device/electronic_assembly)) var/obj/item/device/electronic_assembly/machine = loc if(machine.anchored || machine.w_class >= ITEMSIZE_LARGE) return - if(machine.loc && machine.loc == T) // Check if we're held by someone. If the loc is the floor, we're not held. + if(machine.loc == T) // Check if we're held by someone. If the loc is the floor, we're not held. var/datum/integrated_io/wanted_dir = inputs[1] if(isnum(wanted_dir.data)) step(machine, wanted_dir.data) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents-Helpers.dm b/code/modules/reagents/Chemistry-Reagents-Helpers.dm new file mode 100644 index 0000000000..a072e4402b --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents-Helpers.dm @@ -0,0 +1,14 @@ +/atom/movable/proc/can_be_injected_by(var/atom/injector) + if(!Adjacent(get_turf(injector))) + return FALSE + if(!reagents) + return FALSE + if(!reagents.get_free_space()) + return FALSE + return TRUE + +/obj/can_be_injected_by(var/atom/injector) + return is_open_container() && ..() + +/mob/living/can_be_injected_by(var/atom/injector) + return ..() && (can_inject(null, 0, BP_TORSO) || can_inject(null, 0, BP_GROIN)) \ No newline at end of file diff --git a/polaris.dme b/polaris.dme index 16fd036728..0642f66bf0 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1844,6 +1844,7 @@ #include "code\modules\reagents\Chemistry-Machinery.dm" #include "code\modules\reagents\Chemistry-Metabolism.dm" #include "code\modules\reagents\Chemistry-Readme.dm" +#include "code\modules\reagents\Chemistry-Reagents-Helpers.dm" #include "code\modules\reagents\Chemistry-Reagents.dm" #include "code\modules\reagents\Chemistry-Recipes.dm" #include "code\modules\reagents\reagent_containers.dm"