From 4d7b68ae2395c32c2a56f334a00915fe5f4c1b24 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sat, 23 Jul 2016 20:30:05 -0400 Subject: [PATCH 1/2] Ports TG IV Drips --- code/game/machinery/iv_drip.dm | 253 +++++++++++++++++++++------------ icons/obj/iv_drip.dmi | Bin 785 -> 1438 bytes 2 files changed, 160 insertions(+), 93 deletions(-) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 9c6b0fc548d..9c074a76c42 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -1,101 +1,128 @@ /obj/machinery/iv_drip name = "\improper IV drip" icon = 'icons/obj/iv_drip.dmi' + icon_state = "iv_drip" anchored = 0 density = 1 + var/mob/living/carbon/human/attached = null + var/mode = 1 // 1 is injecting, 0 is taking blood. + var/obj/item/weapon/reagent_containers/beaker = null +/obj/machinery/iv_drip/New() + ..() + update_icon() -/obj/machinery/iv_drip/var/mob/living/carbon/human/attached = null -/obj/machinery/iv_drip/var/mode = 1 // 1 is injecting, 0 is taking blood. -/obj/machinery/iv_drip/var/obj/item/weapon/reagent_containers/beaker = null +/obj/machinery/iv_drip/Destroy() + attached = null + if(beaker) + qdel(beaker) + beaker = null + return ..() /obj/machinery/iv_drip/update_icon() - if(src.attached) - icon_state = "hooked" + if(attached) + if(mode) + icon_state = "injecting" + else + icon_state = "donating" else - icon_state = "" + if(mode) + icon_state = "injectidle" + else + icon_state = "donateidle" - overlays = null + overlays.Cut() if(beaker) - var/datum/reagents/reagents = beaker.reagents - if(reagents.total_volume) + if(attached) + overlays += "beakeractive" + else + overlays += "beakeridle" + if(beaker.reagents.total_volume) var/image/filling = image('icons/obj/iv_drip.dmi', src, "reagent") - var/percent = round((reagents.total_volume / beaker.volume) * 100) + var/percent = round((beaker.reagents.total_volume / beaker.volume) * 100) switch(percent) - if(0 to 9) filling.icon_state = "reagent0" - if(10 to 24) filling.icon_state = "reagent10" - if(25 to 49) filling.icon_state = "reagent25" - if(50 to 74) filling.icon_state = "reagent50" - if(75 to 79) filling.icon_state = "reagent75" - if(80 to 90) filling.icon_state = "reagent80" - if(91 to INFINITY) filling.icon_state = "reagent100" + if(0 to 9) + filling.icon_state = "reagent0" + if(10 to 24) + filling.icon_state = "reagent10" + if(25 to 49) + filling.icon_state = "reagent25" + if(50 to 74) + filling.icon_state = "reagent50" + if(75 to 79) + filling.icon_state = "reagent75" + if(80 to 90) + filling.icon_state = "reagent80" + if(91 to INFINITY) + filling.icon_state = "reagent100" - filling.icon += mix_color_from_reagents(reagents.reagent_list) + filling.icon += mix_color_from_reagents(beaker.reagents.reagent_list) overlays += filling -/obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location) - ..() - - if(!ishuman(usr) && !isrobot(usr)) - return - - var/turf/T = get_turf(src) - if(!usr in range(1, T)) +/obj/machinery/iv_drip/MouseDrop(mob/living/target) + if(!ishuman(usr)) return if(attached) - visible_message("[src.attached] is detached from \the [src]") - src.attached = null - src.update_icon() + visible_message("[attached] is detached from [src].") + attached = null + update_icon() return - if(in_range(src, usr) && ishuman(over_object) && get_dist(over_object, src) <= 1) - visible_message("[usr] attaches \the [src] to \the [over_object].") - src.attached = over_object - src.update_icon() + if(!target.dna) + to_chat(usr, "The drip beeps: Warning, incompatible creature!") + return - -/obj/machinery/iv_drip/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/reagent_containers)) - if(!isnull(src.beaker)) - to_chat(user, "There is already a reagent container loaded!") - return - - if(user.drop_item()) - W.forceMove(src) - src.beaker = W - to_chat(user, "You attach \the [W] to \the [src].") - src.update_icon() - return + if(Adjacent(target) && usr.Adjacent(target)) + if(beaker) + usr.visible_message("[usr] attaches [src] to [target].", "You attach [src] to [target].") + attached = target + addAtProcessing() + update_icon() else - to_chat(user, "\The [W] is stuck to you!") + to_chat(usr, "There's nothing attached to the IV drip!") + +/obj/machinery/iv_drip/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/weapon/reagent_containers)) + if(beaker) + to_chat(user, "There is already a reagent container loaded!") + return + if(!user.drop_item()) + return + + W.forceMove(src) + beaker = W + to_chat(user, "You attach [W] to [src].") + update_icon() + return else return ..() /obj/machinery/iv_drip/process() - //set background = 1 + if(!attached) + return PROCESS_KILL - if(src.attached) + if(!(get_dist(src, attached) <= 1 && isturf(attached.loc))) + to_chat(attached, "The IV drip needle is ripped out of you!") + attached.apply_damage(3, BRUTE, pick("r_arm", "l_arm")) + attached = null + update_icon() + return PROCESS_KILL - if(!(get_dist(src, src.attached) <= 1 && isturf(src.attached.loc))) - visible_message("The needle is ripped out of [src.attached], doesn't that hurt?") - src.attached:apply_damage(3, BRUTE, pick("r_arm", "l_arm")) - src.attached = null - src.update_icon() - return - - if(src.attached && src.beaker) + if(beaker) // Give blood if(mode) - if(src.beaker.volume > 0) - var/transfer_amount = REAGENTS_METABOLISM - if(istype(src.beaker, /obj/item/weapon/reagent_containers/blood)) + if(beaker.volume > 0) + var/transfer_amount = 5 + if(istype(beaker, /obj/item/weapon/reagent_containers/blood)) // speed up transfer on blood packs - transfer_amount = 4 - src.beaker.reagents.trans_to(src.attached, transfer_amount) + transfer_amount = 10 + var/fraction = min(transfer_amount/beaker.volume, 1) //the fraction that is transfered of the total volume + beaker.reagents.reaction(attached, INGEST, fraction) //make reagents reacts, but don't spam messages + beaker.reagents.trans_to(attached, transfer_amount) update_icon() // Take blood @@ -104,71 +131,111 @@ amount = min(amount, 4) // If the beaker is full, ping if(amount == 0) - if(prob(5)) visible_message("\The [src] pings.") + if(prob(5)) + visible_message("[src] pings.") return var/mob/living/carbon/human/T = attached - if(!istype(T)) return + if(!ishuman(T)) + return + if(!T.dna) return + if(NOCLONE in T.mutations) return - if(T.species && T.species.flags & NO_BLOOD) + if(T.species.flags & NO_BLOOD) return - // If the human is losing too much blood, beep. - if(T.vessel.get_reagent_amount("blood") < BLOOD_VOLUME_SAFE) if(prob(5)) - visible_message("\The [src] beeps loudly.") - - var/datum/reagent/B = T.take_blood(beaker,amount) - - if(B) - beaker.reagents.reagent_list |= B - beaker.reagents.update_total() - beaker.on_reagent_change() - beaker.reagents.handle_reactions() + if(T.species.exotic_blood) + T.vessel.trans_to(beaker, amount) update_icon() + else + var/datum/reagent/B = T.take_blood(beaker, amount) -/obj/machinery/iv_drip/attack_hand(mob/living/carbon/user) - if(!istype(user)) + if(B) + beaker.reagents.reagent_list |= B + beaker.reagents.update_total() + beaker.on_reagent_change() + beaker.reagents.handle_reactions() + update_icon() + + // If attached is losing too much blood, beep. + var/blood_type = attached.get_blood_name() + if(T.vessel.get_reagent_amount(blood_type) < BLOOD_VOLUME_SAFE && prob(5)) + visible_message("[src] beeps loudly.") + playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) + +/obj/machinery/iv_drip/attack_hand(mob/user) + if(!ishuman(user)) return - if(src.beaker) - src.beaker.loc = get_turf(src) - src.beaker = null + if(attached) + visible_message("[attached] is detached from [src]") + attached = null update_icon() + return + else if(beaker) + eject_beaker(user) else - return ..() + toggle_mode() +/obj/machinery/iv_drip/AltClick(mob/user) + ..() + if(user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!Adjacent(user)) + return + toggle_mode() -/obj/machinery/iv_drip/verb/toggle_mode() - set name = "Toggle Mode" +/obj/machinery/iv_drip/verb/eject_beaker(mob/user) set category = "Object" + set name = "Remove IV Container" set src in view(1) - if(!istype(usr, /mob/living)) - to_chat(usr, "\red You can't do that.") + if(!iscarbon(usr)) + usr << "You can't do that!" return - if(usr.stat) + if(usr.incapacitated()) + return + + if(beaker) + beaker.forceMove(get_turf(src)) + beaker = null + update_icon() + +/obj/machinery/iv_drip/verb/toggle_mode() + set category = "Object" + set name = "Toggle Mode" + set src in view(1) + + if(!iscarbon(usr)) + to_chat(usr, "You can't do that!") + return + + if(usr.incapacitated()) return mode = !mode to_chat(usr, "The IV drip is now [mode ? "injecting" : "taking blood"].") + update_icon() /obj/machinery/iv_drip/examine(mob/user) ..(user) - if(!(user in view(2)) && usr != src.loc) return + if(!(user in view(2)) && user != loc) + return - to_chat(usr, "The IV drip is [mode ? "injecting" : "taking blood"].") + to_chat(user, "The IV drip is [mode ? "injecting" : "taking blood"].") if(beaker) if(beaker.reagents && beaker.reagents.reagent_list.len) - to_chat(user, "\blue Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") + to_chat(user, "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") else - to_chat(user, "\blue Attached is an empty [beaker].") + to_chat(user, "Attached is an empty [beaker].") else - to_chat(user, "\blue No chemicals are attached.") + to_chat(user, "No chemicals are attached.") - to_chat(user, "\blue [attached ? attached : "No one"] is attached.") + to_chat(user, "[attached ? attached : "No one"] is attached.") diff --git a/icons/obj/iv_drip.dmi b/icons/obj/iv_drip.dmi index 40068f216e77a3a4e3e5f81b28d2ae6a51cc6082..016513245e1e53da3ade22cb4ec545d230474989 100644 GIT binary patch literal 1438 zcmeAS@N?(olHy`uVBq!ia0vp^3xK$RgAGXbBqvD&sZ&)U5hX6E#mPmP1tppJc?=8{ zbEcl#$k${b!1iEgZ5Q{NV*yiMTsrE&!@Q@-@@3?z2%k)YeS4YJtTJ?N$A0?zKbB{A zQv9_E;i~c{d6#WhNZjjVv0M6S^n?vwmf0s?T=PHu;G(cc$C-+Nb9a=^O(|sd5STMp zCN6W<{d4nHemwT-z0p&jz;^x#3S#nxSEJ|5uaXUx{rlJZtC%h8MdgRBcX+yb&673W zUC0#j{50L#$@kj%1-BD+o^(nTyEBumyz9Za`37x^&MB_<`p5EP!#V4g@aG*23@rVg zE{-7;bKc%H%$6>fIrj0nS6js->y(#5{pKqen->&s6JX&rmG!zN@r#K?w)9xAqQ1fe zo=B(mW3x4CxtF$G_;tW&$pgKu2b*_z$}wGE%C#!lvwZpP>Lr)IGdD#{{2KFN@%_6m zpVT)!{u0q}I{h8*fwbMhPiCL%KX>`%diTW>%jUmjdzvHkbM}<|1x$X2K;kEJ)AQ9k z9!E?PIld7jeYsxW^L^Z2@8>qTX-~|p>mRb*xp|vYZDF^Z`QD4EdzI3k%HRJR^mlLm zmtVCD)@lA-9-__la_zzhWo-iuL|y>-kvqv+>&|@u~SYkBe9CJNLD-uP>-{ zU9#tQ-JfsyS0)Aj3ln*Hy(~KVzps+}zfjJft$mE)2hVaoIWd3UfzsWUjWRzk3-4I5 zRrkRj&XDkbYdB-tD}`6A`x7Z_(Z5x9K{eA(^@2#@jG2Fo)IQu2yI|XRM|j5?&MiK5 zlEM|a+%M)iyyHA$xL_toox$;jw0E3O<{gk>p0!hbLN$~5Q;7-u$_Kib4&gzoK5Tu^ z-OW9B-aM~KyV_2Fd}6M={{lOX&K*6}X(VM_O$ z^knkyD*LZqzt8G?nmv1dHq*QPH~1&11Wr=9RliZ*C$G}ETWNpg&zXIU=g*zHlC@RE zbNck@^8alNYwuUs?E5OZkq4wLQ=BKHb$eohD`O%M9sSj?A*t3OBGrm}UvBM=7svNs zK7W{9iuZrWm&1P(ED8TnUYJ#C)G{-l3Nv%Sr^yb?0D;Kxw)Br|DpWDJbY}K zyYGg{954EleD~*OAou_5J*D}xt?kzzl6Q+}oys^Td-0ji{@edgRjDn98`LjmM zfzSxa13S&QP90=v5fv5)YxQ?}Hkb8!;=RZXx1YEiC}nzZ?)>5pQzrl;cHh4b?N-;- zQ}g`Oq63$#-k!fz)OFgQ$~*QI<#lp0%!j&?5464dw)>#f9>u-exI@-$3jKM|->c&D zzD4K1o77Z^wk>Qs{P524y^{NOPXB7DnQ-{(S0|3c8!mhgbeNKKF=S5bdFHSO+hXG{ zwRhaYa-+Y!uIeoYjbg+q19eoH>z)V^Us%wT7Q1m=ZU_mtT|hwuB{eq_vZ^P zuX~@^FYdrLRm8w^lE2>ctC^QSU(e(Zx#|At?)Bu8-=998`7Z`&XZpbniyFvBw|@NB zTq#^~XZD7RGjJHQDyK8mdKI;Vst0CYaNJOBUy literal 785 zcmeAS@N?(olHy`uVBq!ia0vp^4M3d0!3HF+R#kZdsd-f)5hX6E#mPmP1tppJc?=8{ zbArPPib}tK2`>2f^@*0ZuGYCT=Yuzd8eBAf@JQ#pkLF2+qMqIz7REuwmyNv?<~*8o zWKxJiuxDqtvFhd(5+_WaJo3@@I^)~A;UU+gAmPoy-99 z_78ZnP`gMQsy|NoY!&t~g)YAdFP2@5>%x4COCTYRp%wmw(MEMm)_ z|En16TfKRUf7R^1C#T#$%j4(mb#AU#1m$h(ZXT=|)N`u?}Xf6qVt z)RWEM{<>ev{ojmF+hg0qziI#AyzsN|Q~5To6`h7p&QIO)S=ur4(&pIpt7kCqS=O&x zl3U*^@H@_7%AY*e?>dezQWZXF9}IAnn99(<`S|*qIc7KCf8RfE`_25kHkC%M0@g_q z5)&A%oBa<8ZQyD+!L)*5Do4S(#i0#eEEe0j0vJOW_DaS!D6W0a$-vaWpuph7{o%4( zNAYZBrG1(rw)J7GCpf3=PEPA_IaeRpa5Twq=a(esU)5InN*6!RW}d Date: Mon, 25 Jul 2016 03:47:30 -0400 Subject: [PATCH 2/2] tweaks --- code/game/machinery/iv_drip.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 9c074a76c42..fb55eee1200 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -96,7 +96,6 @@ beaker = W to_chat(user, "You attach [W] to [src].") update_icon() - return else return ..() @@ -105,7 +104,7 @@ if(!attached) return PROCESS_KILL - if(!(get_dist(src, attached) <= 1 && isturf(attached.loc))) + if(get_dist(src, attached) > 1 && isturf(attached.loc)) to_chat(attached, "The IV drip needle is ripped out of you!") attached.apply_damage(3, BRUTE, pick("r_arm", "l_arm")) attached = null @@ -196,7 +195,7 @@ set src in view(1) if(!iscarbon(usr)) - usr << "You can't do that!" + to_chat(usr, "You can't do that!") return if(usr.incapacitated())