diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index f06cf40da2..d33570cd9c 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -404,245 +404,295 @@
origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3)
required_type = /obj/mecha/medical
- New()
- ..()
- flags |= NOREACT
- syringes = new
- known_reagents = list("inaprovaline"="Inaprovaline","anti_toxin"="Dylovene")
- processed_reagents = new
- create_reagents(max_volume)
- synth = new (list(src),0)
+ //This is a list of datums so as to allow id changes, and force compile errors if removed.
+ var/static/list/allowed_reagents = list(
+ //Med Reagents,
+ /datum/reagent/inaprovaline,
+ /datum/reagent/bicaridine,
+ /datum/reagent/kelotane,
+ /datum/reagent/dermaline,
+ /datum/reagent/dylovene,
+ /datum/reagent/dexalin,
+ /datum/reagent/tricordrazine,
+ /datum/reagent/paracetamol,
+ /datum/reagent/tramadol,
+ /datum/reagent/spaceacillin,
+ //Dispenser Reagents,
+ /datum/reagent/water,
+ /datum/reagent/aluminum,
+ /datum/reagent/carbon,
+ /datum/reagent/chlorine,
+ /datum/reagent/copper,
+ /datum/reagent/ethanol,
+ /datum/reagent/fluorine,
+ /datum/reagent/hydrogen,
+ /datum/reagent/iron,
+ /datum/reagent/lithium,
+ /datum/reagent/mercury,
+ /datum/reagent/nitrogen,
+ /datum/reagent/oxygen,
+ /datum/reagent/phosphorus,
+ /datum/reagent/potassium,
+ /datum/reagent/radium,
+ /datum/reagent/acid,
+ /datum/reagent/silicon,
+ /datum/reagent/sodium,
+ /datum/reagent/sugar,
+ /datum/reagent/sulfur,
+ /datum/reagent/tungsten
+ )
- detach()
- synth.stop()
- return ..()
+/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/New()
+ ..()
+ flags |= NOREACT
+ syringes = new
+ known_reagents = list("inaprovaline"="Inaprovaline","anti_toxin"="Dylovene")
+ processed_reagents = new
+ create_reagents(max_volume)
+ synth = new (list(src),0)
- critfail()
- ..()
- flags &= ~NOREACT
+/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/initialize()
+ . = ..()
+ //Wow nice, firsties
+ if(LAZYLEN(allowed_reagents) && !istext(allowed_reagents[1]))
+ for(var/index = 1 to allowed_reagents.len)
+ var/datum/reagent/path = allowed_reagents[index]
+ allowed_reagents[index] = initial(path.id)
+
+/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/detach()
+ synth.stop()
+ return ..()
+
+/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/critfail()
+ ..()
+ flags &= ~NOREACT
+ return
+
+/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/get_equip_info()
+ var/output = ..()
+ if(output)
+ return "[output] \[[mode? "Analyze" : "Launch"]\]
\[Syringes: [syringes.len]/[max_syringes] | Reagents: [reagents.total_volume]/[reagents.maximum_volume]\]
Reagents list"
+ return
+
+/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/action(atom/movable/target)
+ if(!action_checks(target))
return
-
- get_equip_info()
- var/output = ..()
- if(output)
- return "[output] \[[mode? "Analyze" : "Launch"]\]
\[Syringes: [syringes.len]/[max_syringes] | Reagents: [reagents.total_volume]/[reagents.maximum_volume]\]
Reagents list"
+ if(istype(target,/obj/item/weapon/reagent_containers/syringe))
+ return load_syringe(target)
+ if(istype(target,/obj/item/weapon/storage))//Loads syringes from boxes
+ for(var/obj/item/weapon/reagent_containers/syringe/S in target.contents)
+ load_syringe(S)
return
-
- action(atom/movable/target)
- if(!action_checks(target))
- return
- if(istype(target,/obj/item/weapon/reagent_containers/syringe))
- return load_syringe(target)
- if(istype(target,/obj/item/weapon/storage))//Loads syringes from boxes
- for(var/obj/item/weapon/reagent_containers/syringe/S in target.contents)
- load_syringe(S)
- return
- if(mode)
- return analyze_reagents(target)
- if(!syringes.len)
- occupant_message("No syringes loaded.")
- return
- if(reagents.total_volume<=0)
- occupant_message("No available reagents to load syringe with.")
- return
- set_ready_state(0)
- chassis.use_power(energy_drain)
- var/turf/trg = get_turf(target)
- var/obj/item/weapon/reagent_containers/syringe/S = syringes[1]
- S.forceMove(get_turf(chassis))
- reagents.trans_to_obj(S, min(S.volume, reagents.total_volume))
- syringes -= S
- S.icon = 'icons/obj/chemical.dmi'
- S.icon_state = "syringeproj"
- playsound(chassis, 'sound/items/syringeproj.ogg', 50, 1)
- log_message("Launched [S] from [src], targeting [target].")
- spawn(-1)
- src = null //if src is deleted, still process the syringe
- for(var/i=0, i<6, i++)
- if(!S)
+ if(mode)
+ return analyze_reagents(target)
+ if(!syringes.len)
+ occupant_message("No syringes loaded.")
+ return
+ if(reagents.total_volume<=0)
+ occupant_message("No available reagents to load syringe with.")
+ return
+ set_ready_state(0)
+ chassis.use_power(energy_drain)
+ var/turf/trg = get_turf(target)
+ var/obj/item/weapon/reagent_containers/syringe/S = syringes[1]
+ S.forceMove(get_turf(chassis))
+ reagents.trans_to_obj(S, min(S.volume, reagents.total_volume))
+ syringes -= S
+ S.icon = 'icons/obj/chemical.dmi'
+ S.icon_state = "syringeproj"
+ playsound(chassis, 'sound/items/syringeproj.ogg', 50, 1)
+ log_message("Launched [S] from [src], targeting [target].")
+ spawn(-1)
+ src = null //if src is deleted, still process the syringe
+ for(var/i=0, i<6, i++)
+ if(!S)
+ break
+ if(step_towards(S,trg))
+ var/list/mobs = new
+ for(var/mob/living/carbon/M in S.loc)
+ mobs += M
+ var/mob/living/carbon/M = safepick(mobs)
+ if(M)
+ S.icon_state = initial(S.icon_state)
+ S.icon = initial(S.icon)
+ S.reagents.trans_to_mob(M, S.reagents.total_volume, CHEM_BLOOD)
+ M.take_organ_damage(2)
+ S.visible_message(" [M] was hit by the syringe!")
break
- if(step_towards(S,trg))
- var/list/mobs = new
- for(var/mob/living/carbon/M in S.loc)
- mobs += M
- var/mob/living/carbon/M = safepick(mobs)
- if(M)
- S.icon_state = initial(S.icon_state)
- S.icon = initial(S.icon)
- S.reagents.trans_to_mob(M, S.reagents.total_volume, CHEM_BLOOD)
- M.take_organ_damage(2)
- S.visible_message(" [M] was hit by the syringe!")
- break
- else if(S.loc == trg)
- S.icon_state = initial(S.icon_state)
- S.icon = initial(S.icon)
- S.update_icon()
- break
- else
+ else if(S.loc == trg)
S.icon_state = initial(S.icon_state)
S.icon = initial(S.icon)
S.update_icon()
break
- sleep(1)
- do_after_cooldown()
- return 1
+ else
+ S.icon_state = initial(S.icon_state)
+ S.icon = initial(S.icon)
+ S.update_icon()
+ break
+ sleep(1)
+ do_after_cooldown()
+ return 1
- Topic(href,href_list)
- ..()
- var/datum/topic_input/top_filter = new (href,href_list)
- if(top_filter.get("toggle_mode"))
- mode = !mode
- update_equip_info()
- return
- if(top_filter.get("select_reagents"))
- processed_reagents.len = 0
- var/m = 0
- var/message
- for(var/i=1 to known_reagents.len)
- if(m>=synth_speed)
- break
- var/reagent = top_filter.get("reagent_[i]")
- if(reagent && (reagent in known_reagents))
- message = "[m ? ", " : null][known_reagents[reagent]]"
- processed_reagents += reagent
- m++
- if(processed_reagents.len)
- message += " added to production"
- synth.start()
- occupant_message(message)
- occupant_message("Reagent processing started.")
- log_message("Reagent processing started.")
- return
- if(top_filter.get("show_reagents"))
- chassis.occupant << browse(get_reagents_page(),"window=msyringegun")
- if(top_filter.get("purge_reagent"))
- var/reagent = top_filter.get("purge_reagent")
- if(reagent)
- reagents.del_reagent(reagent)
- return
- if(top_filter.get("purge_all"))
- reagents.clear_reagents()
- return
- return
-
- proc/get_reagents_page()
- var/output = {"
-