Merge pull request #2562 from Neerti/9/29/2016_circuits

More Circuit Ports by Psi
This commit is contained in:
Anewbe
2016-09-29 23:49:20 -05:00
committed by GitHub
5 changed files with 40 additions and 39 deletions

View File

@@ -42,10 +42,10 @@
..() ..()
/obj/item/integrated_circuit/proc/setup_io(var/list/io_list, var/io_type) /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() io_list.Cut()
for(var/name in names) for(var/io_entry in io_list_copy)
io_list.Add(new io_type(src, name)) 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. /obj/item/integrated_circuit/proc/on_data_written() //Override this for special behaviour when new data gets pushed to the circuit.
return return
@@ -238,13 +238,14 @@
/datum/integrated_io /datum/integrated_io
var/name = "input/output" var/name = "input/output"
var/obj/item/integrated_circuit/holder = null 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/list/linked = list()
var/io_type = DATA_CHANNEL 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.name = name
src.data = data
holder = newloc holder = newloc
if(!istype(holder)) if(!istype(holder))
message_admins("ERROR: An integrated_io ([src.name]) spawned without a valid holder! This is a bug.") message_admins("ERROR: An integrated_io ([src.name]) spawned without a valid holder! This is a bug.")

View File

@@ -168,8 +168,9 @@
if(!isweakref(I.data)) if(!isweakref(I.data))
return return
var/weakref/w = I.data var/atom/A = I.data.resolve()
var/atom/A = w.resolve() if(!A)
return
var/desired_type = A.type var/desired_type = A.type
var/list/nearby_things = range(1, get_turf(src)) var/list/nearby_things = range(1, get_turf(src))
@@ -216,7 +217,7 @@
/obj/item/integrated_circuit/input/signaler/on_data_written() /obj/item/integrated_circuit/input/signaler/on_data_written()
var/datum/integrated_io/new_freq = inputs[1] var/datum/integrated_io/new_freq = inputs[1]
var/datum/integrated_io/new_code = inputs[2] 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) set_frequency(new_freq.data)
if(isnum(new_code.data)) if(isnum(new_code.data))
code = new_code.data code = new_code.data

View File

@@ -120,53 +120,42 @@
flags = OPENCONTAINER flags = OPENCONTAINER
complexity = 20 complexity = 20
cooldown_per_use = 6 SECONDS cooldown_per_use = 6 SECONDS
inputs = list("target ref", "injection amount") inputs = list("target ref", "injection amount" = 5)
outputs = list() outputs = list()
activators = list("inject") activators = list("inject")
var/inject_amount = 5
/obj/item/integrated_circuit/manipulation/injector/New() /obj/item/integrated_circuit/manipulation/injector/New()
..() ..()
create_reagents(30) 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] var/datum/integrated_io/amount = inputs[2]
if(isnum(amount.data)) if(isnum(amount.data))
amount.data = Clamp(amount.data, 0, 30) return Clamp(amount.data, 0, 30)
inject_amount = amount.data
/obj/item/integrated_circuit/manipulation/injector/do_work() /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/datum/integrated_io/target = inputs[1]
var/atom/movable/AM = target.data_as_type(/atom/movable) var/atom/movable/AM = target.data_as_type(/atom/movable)
if(!istype(AM)) //Invalid input if(!istype(AM)) //Invalid input
return return
if(!reagents.total_volume) // Empty if(!reagents.total_volume) // Empty
return return
if(AM.Adjacent(get_turf(src))) if(AM.can_be_injected_by(src))
if(!AM.reagents)
return
if(!AM.is_open_container() && !ismob(AM) )
return
if(!AM.reagents.get_free_space())
return
if(isliving(AM)) if(isliving(AM))
var/mob/living/L = AM var/turf/T = get_turf(AM)
if(!L.can_inject(null, 0, BP_TORSO)) T.visible_message("<span class='warning'>[src] is trying to inject [AM]!</span>")
return
loc.visible_message("<span class='warning'>[src] is trying to inject [AM]!</span>")
sleep(3 SECONDS) sleep(3 SECONDS)
if(!AM.Adjacent(get_turf(src))) if(!AM.can_be_injected_by(src))
return return
var/contained = reagents.get_reagents() var/contained = reagents.get_reagents()
var/trans = reagents.trans_to_mob(target, inject_amount, CHEM_BLOOD) var/trans = reagents.trans_to_mob(target, inject_amount(), CHEM_BLOOD)
message_admins("[src] injected \the [AM] with [trans]u of [english_list(contained)].") message_admins("[src] injected \the [AM] with [trans]u of [contained].")
to_chat(AM, "<span class='notice'>You feel a tiny prick!</span>") to_chat(AM, "<span class='notice'>You feel a tiny prick!</span>")
visible_message("<span class='warning'>[src] injects [AM]!</span>") visible_message("<span class='warning'>[src] injects [AM]!</span>")
else else
reagents.trans_to(AM, inject_amount) reagents.trans_to(AM, inject_amount())
/obj/item/integrated_circuit/manipulation/reagent_pump /obj/item/integrated_circuit/manipulation/reagent_pump
name = "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." outside the machine if it is next to the machine. Note that this cannot be used on entities."
flags = OPENCONTAINER flags = OPENCONTAINER
complexity = 8 complexity = 8
inputs = list("source ref", "target ref", "injection amount") inputs = list("source ref", "target ref", "injection amount" = 10)
outputs = list() outputs = list()
activators = list("transfer reagents") activators = list("transfer reagents")
var/transfer_amount = 10 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() /obj/item/integrated_circuit/manipulation/reagent_pump/on_data_written()
var/datum/integrated_io/amount = inputs[3] var/datum/integrated_io/amount = inputs[3]
if(isnum(amount.data)) if(isnum(amount.data))
@@ -269,11 +253,11 @@
/obj/item/integrated_circuit/manipulation/locomotion/do_work() /obj/item/integrated_circuit/manipulation/locomotion/do_work()
..() ..()
var/turf/T = get_turf(src) 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 var/obj/item/device/electronic_assembly/machine = loc
if(machine.anchored || machine.w_class >= ITEMSIZE_LARGE) if(machine.anchored || machine.w_class >= ITEMSIZE_LARGE)
return 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] var/datum/integrated_io/wanted_dir = inputs[1]
if(isnum(wanted_dir.data)) if(isnum(wanted_dir.data))
step(machine, wanted_dir.data) step(machine, wanted_dir.data)

View File

@@ -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))

View File

@@ -1844,6 +1844,7 @@
#include "code\modules\reagents\Chemistry-Machinery.dm" #include "code\modules\reagents\Chemistry-Machinery.dm"
#include "code\modules\reagents\Chemistry-Metabolism.dm" #include "code\modules\reagents\Chemistry-Metabolism.dm"
#include "code\modules\reagents\Chemistry-Readme.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-Reagents.dm"
#include "code\modules\reagents\Chemistry-Recipes.dm" #include "code\modules\reagents\Chemistry-Recipes.dm"
#include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_containers.dm"