diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/reagents/syringe_gun.dm index eaa372bd45d..2bb818c3737 100644 --- a/code/modules/reagents/syringe_gun.dm +++ b/code/modules/reagents/syringe_gun.dm @@ -128,4 +128,279 @@ New() var/datum/reagents/R = new/datum/reagents(15) reagents = R - R.my_atom = src \ No newline at end of file + R.my_atom = src + +/obj/item/weapon/dart_cartridge + name = "dart cartridge" + desc = "A rack of hollow darts." + icon = 'icons/obj/ammo.dmi' + icon_state = "darts-5" + item_state = "rcdammo" + opacity = 0 + density = 0 + anchored = 0.0 + origin_tech = "materials=2" + var/darts = 5 + +/obj/item/weapon/dart_cartridge/update_icon() + if(!darts) + icon_state = "darts-0" + else if(darts > 5) + icon_state = "darts-5" + else + icon_state = "darts-[darts]" + return 1 + +/obj/item/weapon/gun/dartgun + name = "dart gun" + desc = "A small gas-powered dartgun, capable of delivering chemical cocktails swiftly across short distances." + icon_state = "dartgun-empty" + + var/list/beakers = list() //All containers inside the gun. + var/list/mixing = list() //Containers being used for mixing. + var/obj/item/weapon/dart_cartridge/cartridge = null //Container of darts. + var/max_beakers = 3 + +/obj/item/weapon/gun/dartgun/update_icon() + + if(!cartridge) + icon_state = "dartgun-empty" + return 1 + + if(!cartridge.darts) + icon_state = "dartgun-0" + else if(cartridge.darts > 5) + icon_state = "dartgun-5" + else + icon_state = "dartgun-[cartridge.darts]" + return 1 + +/obj/item/weapon/gun/dartgun/New() + + if(beakers.len) + return + + // The dartgun has one beaker by default. + var/obj/item/weapon/reagent_containers/glass/beaker/B = new(src) + beakers += B + + ..() + +/obj/item/weapon/gun/dartgun/examine() + set src in view() + update_icon() + ..() + if (!(usr in view(2)) && usr!=src.loc) + return + if (beakers.len) + usr << "\blue [src] contains:" + for(var/obj/item/weapon/reagent_containers/glass/beaker/B in beakers) + if(B.reagents && B.reagents.reagent_list.len) + for(var/datum/reagent/R in B.reagents.reagent_list) + usr << "\blue [R.volume] units of [R.name]" + +/obj/item/weapon/gun/dartgun/attackby(obj/item/I as obj, mob/user as mob) + if(istype(I, /obj/item/weapon/dart_cartridge)) + + var/obj/item/weapon/dart_cartridge/D = I + + if(!D.darts) + user << "\blue [D] is empty." + return 0 + + if(cartridge) + if(cartridge.darts <= 0) + src.remove_cartridge() + else + user << "\blue There's already a cartridge in [src]." + return 0 + + user.drop_item() + cartridge = D + D.loc = src + user << "\blue You slot [D] into [src]." + update_icon() + return + if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker)) + if(beakers.len >= max_beakers) + user << "\blue [src] already has [max_beakers] beakers in it - another one isn't going to fit!" + return + var/obj/item/weapon/reagent_containers/glass/beaker/B = I + user.drop_item() + B.loc = src + beakers += B + user << "\blue You slot [B] into [src]." + src.updateUsrDialog() + +/obj/item/weapon/gun/dartgun/can_fire() + if(!cartridge) + return 0 + else + return cartridge.darts + +/obj/item/weapon/gun/dartgun/proc/has_selected_beaker_reagents() + return 0 + +/obj/item/weapon/gun/dartgun/proc/remove_cartridge() + if(cartridge) + usr << "\blue You pop the cartridge out of [src]." + var/obj/item/weapon/dart_cartridge/C = cartridge + C.loc = get_turf(src) + C.update_icon() + cartridge = null + src.update_icon() + +/obj/item/weapon/gun/dartgun/proc/get_mixed_syringe() + if (!cartridge) + return 0 + if(!cartridge.darts) + return 0 + + var/obj/item/weapon/reagent_containers/syringe/dart = new(src) + + if(mixing.len) + var/mix_amount = 10/mixing.len + for(var/obj/item/weapon/reagent_containers/glass/beaker/B in mixing) + B.reagents.trans_to(dart,mix_amount) + + return dart + +/obj/item/weapon/gun/dartgun/proc/fire_dart(atom/target, mob/user) + if (locate (/obj/structure/table, src.loc)) + return + else + var/turf/trg = get_turf(target) + var/obj/effect/syringe_gun_dummy/D = new/obj/effect/syringe_gun_dummy(get_turf(src)) + var/obj/item/weapon/reagent_containers/syringe/S = get_mixed_syringe() + if(!S) + user << "\red There are no darts in [src]!" + return + if(!S.reagents) + user << "\red There are no reagents available!" + return + cartridge.darts-- + src.update_icon() + S.reagents.trans_to(D, S.reagents.total_volume) + del(S) + D.icon_state = "syringeproj" + D.name = "syringe" + playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1) + + for(var/i=0, i<6, i++) + if(!D) break + if(D.loc == trg) break + step_towards(D,trg) + + if(D) + for(var/mob/living/carbon/M in D.loc) + if(!istype(M,/mob/living/carbon)) continue + if(M == user) continue + //Syringe gun attack logging by Yvarov + var/R + if(D.reagents) + for(var/datum/reagent/A in D.reagents.reagent_list) + R += A.id + " (" + R += num2text(A.volume) + ")," + if (istype(M, /mob)) + M.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])" + user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])" + log_attack("[user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R])") + + else + M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a syringegun ([R])" + log_attack("UNKNOWN shot [M] ([M.ckey]) with a syringegun ([R])") + + if(D.reagents) + D.reagents.trans_to(M, 15) + M << "You feel a slight prick." + + del(D) + break + if(D) + for(var/atom/A in D.loc) + if(A == user) continue + if(A.density) del(D) + + sleep(1) + + if (D) spawn(10) del(D) + + return + +/obj/item/weapon/gun/dartgun/afterattack(obj/target, mob/user , flag) + if(!isturf(target.loc) || target == user) return + ..() + +/obj/item/weapon/gun/dartgun/can_hit(var/mob/living/target as mob, var/mob/living/user as mob) + return 1 + +/obj/item/weapon/gun/dartgun/attack_self(user as mob) + var/dat = "[src] mixing control:

" + + if (beakers.len) + var/i = 1 + for(var/obj/item/weapon/reagent_containers/glass/beaker/B in beakers) + dat += "Beaker [i] contains: " + if(B.reagents && B.reagents.reagent_list.len) + for(var/datum/reagent/R in B.reagents.reagent_list) + dat += "
[R.volume] units of [R.name], " + if (check_beaker_mixing(B)) + dat += text("Mixing ") + else + dat += text("Not mixing ") + else + dat += "nothing." + dat += " \[Eject\]
" + i++ + else + dat += "There are no beakers inserted!

" + + if(cartridge) + if(cartridge.darts) + dat += "The dart cartridge has [cartridge.darts] shots remaining." + else + dat += "The dart cartridge is empty!" + dat += " \[Eject\]" + + user << browse("[dat]", "window=dartgun_mixing_window") + +/obj/item/weapon/gun/dartgun/proc/check_beaker_mixing(var/obj/item/B) + if(!mixing || !beakers) + return 0 + for(var/obj/item/M in mixing) + if(M == B) + return 1 + return 0 + +/obj/item/weapon/gun/dartgun/Topic(href, href_list) + src.add_fingerprint(usr) + if(href_list["stop_mix"]) + var/index = text2num(href_list["stop_mix"]) + if(index <= beakers.len) + for(var/obj/item/M in mixing) + if(M == beakers[index]) + mixing -= M + break + else if (href_list["mix"]) + var/index = text2num(href_list["mix"]) + if(index <= beakers.len) + mixing += beakers[index] + else if (href_list["eject"]) + var/index = text2num(href_list["eject"]) + if(index <= beakers.len) + if(beakers[index]) + var/obj/item/weapon/reagent_containers/glass/beaker/B = beakers[index] + usr << "You remove [B] from [src]." + mixing -= B + beakers -= B + B.loc = get_turf(src) + else if (href_list["eject_cart"]) + remove_cartridge() + src.updateUsrDialog() + return + +/obj/item/weapon/gun/dartgun/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0) + if(cartridge) + spawn(0) fire_dart(target,user) + else + usr << "\red [src] is empty." \ No newline at end of file diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 8ca8da77f74..86d6829d138 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 5a0eab2d2a6..2ad4316d4a0 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ