diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index a96ba006c9..14245e3232 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -196,3 +196,317 @@ volume = 250 list_reagents = list("holywater" = 150, "tiresolution" = 50, "dizzysolution" = 50) amount_per_transfer_from_this = 50 + +#define HYPO_SPRAY 0 +#define HYPO_INJECT 1 + +#define WAIT_SPRAY 25 +#define WAIT_INJECT 25 +#define SELF_SPRAY 15 +#define SELF_INJECT 15 + +#define DELUXE_WAIT_SPRAY 20 +#define DELUXE_WAIT_INJECT 20 +#define DELUXE_SELF_SPRAY 10 +#define DELUXE_SELF_INJECT 10 + +#define COMBAT_WAIT_SPRAY 0 +#define COMBAT_WAIT_INJECT 0 +#define COMBAT_SELF_SPRAY 0 +#define COMBAT_SELF_INJECT 0 + +//A vial-loaded hypospray. Cartridge-based! +/obj/item/hypospray/mkii + name = "hypospray mk.II" + icon_state = "hypo2" + desc = "A new development from DeForest Medical, this hypospray takes 30-unit vials as the drug supply for easy swapping." + w_class = WEIGHT_CLASS_TINY + var/list/allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small) + var/mode = HYPO_INJECT + var/obj/item/reagent_containers/glass/bottle/vial/vial + var/start_vial = /obj/item/reagent_containers/glass/bottle/vial/small + var/spawnwithvial = TRUE + var/inject_wait = WAIT_INJECT + var/spray_wait = WAIT_SPRAY + var/spray_self = SELF_SPRAY + var/inject_self = SELF_INJECT + var/quickload = FALSE + var/penetrates = FALSE + +/obj/item/hypospray/mkii/brute + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine + +/obj/item/hypospray/mkii/toxin + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin + +/obj/item/hypospray/mkii/oxygen + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin + +/obj/item/hypospray/mkii/burn + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane + +/obj/item/hypospray/mkii/tricord + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord + +/obj/item/hypospray/mkii/enlarge + spawnwithvial = FALSE + +/obj/item/hypospray/mkii/CMO + name = "hypospray mk.II deluxe" + allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large) + icon_state = "cmo2" + desc = "The Deluxe Hypospray can take larger-size vials. It also acts faster and delivers more reagents per spray." + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + start_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO + inject_wait = DELUXE_WAIT_INJECT + spray_wait = DELUXE_WAIT_SPRAY + spray_self = DELUXE_SELF_SPRAY + inject_self = DELUXE_SELF_INJECT + +/obj/item/hypospray/mkii/CMO/combat + name = "combat hypospray mk.II" + desc = "A combat-ready deluxe hypospray that acts almost instantly. It can be tactically reloaded by using a vial on it." + icon_state = "combat2" + start_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/combat + inject_wait = COMBAT_WAIT_INJECT + spray_wait = COMBAT_WAIT_SPRAY + spray_self = COMBAT_SELF_SPRAY + inject_self = COMBAT_SELF_INJECT + quickload = TRUE + penetrates = TRUE + +/obj/item/hypospray/mkii/Initialize() + . = ..() + if(!spawnwithvial) + update_icon() + return + if(start_vial) + vial = new start_vial + update_icon() + +/obj/item/hypospray/mkii/update_icon() + ..() + icon_state = "[initial(icon_state)][vial ? "" : "-e"]" + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands() + return + +/obj/item/hypospray/mkii/examine(mob/user) + . = ..() + if(vial) + to_chat(user, "[vial] has [vial.reagents.total_volume]u remaining.") + else + to_chat(user, "It has no vial loaded in.") + to_chat(user, "[src] is set to [mode ? "Inject" : "Spray"] contents on application.") + +/obj/item/hypospray/mkii/proc/unload_hypo(obj/item/I, mob/user) + if((istype(I, /obj/item/reagent_containers/glass/bottle/vial))) + var/obj/item/reagent_containers/glass/bottle/vial/V = I + V.forceMove(user.loc) + user.put_in_hands(V) + to_chat(user, "You remove [vial] from [src].") + vial = null + update_icon() + playsound(loc, 'sound/weapons/empty.ogg', 50, 1) + else + to_chat(user, "This hypo isn't loaded!") + return + +/obj/item/hypospray/mkii/attackby(obj/item/I, mob/living/user) + if((istype(I, /obj/item/reagent_containers/glass/bottle/vial) && vial != null)) + if(!quickload) + to_chat(user, "[src] can not hold more than one vial!") + return FALSE + unload_hypo(vial, user) + if((istype(I, /obj/item/reagent_containers/glass/bottle/vial))) + var/obj/item/reagent_containers/glass/bottle/vial/V = I + if(!is_type_in_list(V, allowed_containers)) + to_chat(user, "[src] doesn't accept this type of vial.") + return FALSE + if(!user.transferItemToLoc(V,src)) + return FALSE + vial = V + user.visible_message("[user] has loaded a vial into [src].","You have loaded [vial] into [src].") + update_icon() + playsound(loc, 'sound/weapons/autoguninsert.ogg', 35, 1) + return TRUE + else + to_chat(user, "This doesn't fit in [src].") + return FALSE + return FALSE + +/obj/item/hypospray/mkii/AltClick(mob/user) + if(vial) + vial.attack_self(user) + +// Gunna allow this for now, still really don't approve - Pooj +/obj/item/hypospray/mkii/emag_act(mob/user) + . = ..() + if(obj_flags & EMAGGED) + to_chat(user, "[src] happens to be already overcharged.") + return + inject_wait = COMBAT_WAIT_INJECT + spray_wait = COMBAT_WAIT_SPRAY + spray_self = COMBAT_SELF_INJECT + inject_self = COMBAT_SELF_SPRAY + penetrates = TRUE + to_chat(user, "You overcharge [src]'s control circuit.") + obj_flags |= EMAGGED + return TRUE + +/obj/item/hypospray/mkii/attack_hand(mob/user) + . = ..() //Don't bother changing this or removing it from containers will break. + +/obj/item/hypospray/mkii/attack(obj/item/I, mob/user, params) + return + +/obj/item/hypospray/mkii/afterattack(atom/target, mob/user, proximity) + if(!vial) + return + + if(!proximity) + return + + if(!ismob(target)) + return + + var/mob/living/L + if(isliving(target)) + L = target + if(!penetrates && !L.can_inject(user, 1)) //This check appears another four times, since otherwise the penetrating sprays will break in do_mob. + return + + if(!L && !target.is_injectable()) //only checks on non-living mobs, due to how can_inject() handles + to_chat(user, "You cannot directly fill [target]!") + return + + if(target.reagents.total_volume >= target.reagents.maximum_volume) + to_chat(user, "[target] is full.") + return + + if(ishuman(L)) + var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected)) + if(!affecting) + to_chat(user, "The limb is missing!") + return + if(affecting.status != BODYPART_ORGANIC) + to_chat(user, "Medicine won't work on a robotic limb!") + return + + var/contained = vial.reagents.log_list() + log_combat(user, L, "attemped to inject", src, addition="which had [contained]") +//Always log attemped injections for admins + if(vial != null) + switch(mode) + if(HYPO_INJECT) + if(L) //living mob + if(L != user) + L.visible_message("[user] is trying to inject [L] with [src]!", \ + "[user] is trying to inject [L] with [src]!") + if(!do_mob(user, L, inject_wait)) + return + if(!penetrates && !L.can_inject(user, 1)) + return + if(!vial.reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + L.visible_message("[user] uses the [src] on [L]!", \ + "[user] uses the [src] on [L]!") + else + if(!do_mob(user, L, inject_self)) + return + if(!penetrates && !L.can_inject(user, 1)) + return + if(!vial.reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])") + L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG) + + var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1) + vial.reagents.reaction(L, INJECT, fraction) + vial.reagents.trans_to(target, vial.amount_per_transfer_from_this) + if(vial.amount_per_transfer_from_this >= 15) + playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1) + if(vial.amount_per_transfer_from_this < 15) + playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) + to_chat(user, "You inject [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.") + + if(HYPO_SPRAY) + if(L) //living mob + if(L != user) + L.visible_message("[user] is trying to spray [L] with [src]!", \ + "[user] is trying to spray [L] with [src]!") + if(!do_mob(user, L, spray_wait)) + return + if(!penetrates && !L.can_inject(user, 1)) + return + if(!vial.reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + L.visible_message("[user] uses the [src] on [L]!", \ + "[user] uses the [src] on [L]!") + else + if(!do_mob(user, L, spray_self)) + return + if(!penetrates && !L.can_inject(user, 1)) + return + if(!vial.reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])") + L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG) + var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1) + vial.reagents.reaction(L, PATCH, fraction) + vial.reagents.trans_to(target, vial.amount_per_transfer_from_this) + if(vial.amount_per_transfer_from_this >= 15) + playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1) + if(vial.amount_per_transfer_from_this < 15) + playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) + to_chat(user, "You spray [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.") + else + to_chat(user, "[src] doesn't work here!") + return + +/obj/item/hypospray/mkii/attack_self(mob/living/user) + if(user) + if(user.incapacitated()) + return + else if(!vial) + to_chat(user, "This Hypo needs to be loaded first!") + return + else + unload_hypo(vial,user) + +/obj/item/hypospray/mkii/verb/modes() + set name = "Toggle Application Mode" + set category = "Object" + set src in usr + var/mob/M = usr + switch(mode) + if(HYPO_SPRAY) + mode = HYPO_INJECT + to_chat(M, "[src] is now set to inject contents on application.") + if(HYPO_INJECT) + mode = HYPO_SPRAY + to_chat(M, "[src] is now set to spray contents on application.") + +#undef HYPO_SPRAY +#undef HYPO_INJECT +#undef WAIT_SPRAY +#undef WAIT_INJECT +#undef SELF_SPRAY +#undef SELF_INJECT +#undef DELUXE_WAIT_SPRAY +#undef DELUXE_WAIT_INJECT +#undef DELUXE_SELF_SPRAY +#undef DELUXE_SELF_INJECT +#undef COMBAT_WAIT_SPRAY +#undef COMBAT_WAIT_INJECT +#undef COMBAT_SELF_SPRAY +#undef COMBAT_SELF_INJECT diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/code/modules/reagents/reagent_containers/hypovial.dm old mode 100755 new mode 100644 similarity index 96% rename from modular_citadel/code/modules/reagents/reagent container/hypovial.dm rename to code/modules/reagents/reagent_containers/hypovial.dm index c1e0d6ff01..ba5ce48a4a --- a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm +++ b/code/modules/reagents/reagent_containers/hypovial.dm @@ -1,7 +1,8 @@ +//hypovials used with the MkII hypospray. See hypospray.dm. + /obj/item/reagent_containers/glass/bottle/vial name = "broken hypovial" desc = "A hypovial compatible with most hyposprays." - icon = 'modular_citadel/icons/obj/vial.dmi' icon_state = "hypovial" spillable = FALSE var/comes_with = list() //Easy way of doing this. @@ -34,7 +35,7 @@ /obj/item/reagent_containers/glass/bottle/vial/update_icon() cut_overlays() if(reagents.total_volume) - var/mutable_appearance/filling = mutable_appearance('modular_citadel/icons/obj/vial.dmi', "hypovial10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "hypovial10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) @@ -86,7 +87,7 @@ /obj/item/reagent_containers/glass/bottle/vial/large/update_icon() cut_overlays() if(reagents.total_volume) - var/mutable_appearance/filling = mutable_appearance('modular_citadel/icons/obj/vial.dmi', "hypoviallarge10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "hypoviallarge10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 38880f669f..d4880aa085 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -186,7 +186,6 @@ /obj/item/reagent_containers/pill/antirad_plus name = "prussian blue pill" desc = "Used to treat heavy radition poisoning." - icon = 'modular_citadel/icons/obj/modularpills.dmi' icon_state = "prussian_blue" list_reagents = list("prussian_blue" = 25, "water" = 10) roundstart = 1 @@ -194,7 +193,6 @@ /obj/item/reagent_containers/pill/mutarad name = "radiation treatment deluxe pill" desc = "Used to treat heavy radition poisoning and genetic defects." - icon = 'modular_citadel/icons/obj/modularpills.dmi' icon_state = "anit_rad_fixgene" list_reagents = list("prussian_blue" = 15, "potass_iodide" = 15, "mutadone" = 15, "water" = 5) roundstart = 1 diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 5b9e13ed52..89acf0645e 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index 1b8dacf36d..eb3ca4b2f7 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi index 59bc7a8e7c..b474dc68ba 100644 Binary files a/icons/obj/syringe.dmi and b/icons/obj/syringe.dmi differ diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 02f2db7c1e..6221bdde18 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -1,12 +1,12 @@ /obj/item/fermichem/pHbooklet - name = "pH indicator booklet" - desc = "A booklet containing paper soaked in universal indicator." - icon_state = "pHbooklet" - icon = 'modular_citadel/icons/obj/FermiChem.dmi' - item_flags = NOBLUDGEON - var/numberOfPages = 50 - resistance_flags = FLAMMABLE - w_class = WEIGHT_CLASS_TINY + name = "pH indicator booklet" + desc = "A booklet containing paper soaked in universal indicator." + icon_state = "pHbooklet" + icon = 'icons/obj/chemical.dmi' + item_flags = NOBLUDGEON + var/numberOfPages = 50 + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_TINY //A little janky with pockets /obj/item/fermichem/pHbooklet/attack_hand(mob/user) @@ -29,7 +29,7 @@ to_chat(user, "[src] is empty!") add_fingerprint(user) return - . = ..() + . = ..() if(. & COMPONENT_NO_INTERACT) return var/I = user.get_active_held_item() @@ -37,86 +37,86 @@ user.put_in_active_hand(src) /obj/item/fermichem/pHbooklet/MouseDrop() - var/mob/living/user = usr - if(numberOfPages >= 1) - var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper - P.add_fingerprint(user) - P.forceMove(user) - user.put_in_active_hand(P) - to_chat(user, "You take [P] out of \the [src].") - numberOfPages-- - playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1) - add_fingerprint(user) - if(numberOfPages == 0) - icon_state = "pHbookletEmpty" - return - else - to_chat(user, "[src] is empty!") - add_fingerprint(user) - return - ..() + var/mob/living/user = usr + if(numberOfPages >= 1) + var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper + P.add_fingerprint(user) + P.forceMove(user) + user.put_in_active_hand(P) + to_chat(user, "You take [P] out of \the [src].") + numberOfPages-- + playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1) + add_fingerprint(user) + if(numberOfPages == 0) + icon_state = "pHbookletEmpty" + return + else + to_chat(user, "[src] is empty!") + add_fingerprint(user) + return + ..() /obj/item/fermichem/pHpaper - name = "pH indicator strip" - desc = "A piece of paper that will change colour depending on the pH of a solution." - icon_state = "pHpaper" - icon = 'modular_citadel/icons/obj/FermiChem.dmi' - item_flags = NOBLUDGEON - color = "#f5c352" - var/used = FALSE - resistance_flags = FLAMMABLE - w_class = WEIGHT_CLASS_TINY + name = "pH indicator strip" + desc = "A piece of paper that will change colour depending on the pH of a solution." + icon_state = "pHpaper" + icon = 'icons/obj/chemical.dmi' + item_flags = NOBLUDGEON + color = "#f5c352" + var/used = FALSE + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_TINY /obj/item/fermichem/pHpaper/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) - if(!istype(cont)) - return - if(used == TRUE) - to_chat(user, "[user] has already been used!") - return - if(!LAZYLEN(cont.reagents.reagent_list)) - return - switch(round(cont.reagents.pH, 1)) - if(14 to INFINITY) - color = "#462c83" - if(13 to 14) - color = "#63459b" - if(12 to 13) - color = "#5a51a2" - if(11 to 12) - color = "#3853a4" - if(10 to 11) - color = "#3f93cf" - if(9 to 10) - color = "#0bb9b7" - if(8 to 9) - color = "#23b36e" - if(7 to 8) - color = "#3aa651" - if(6 to 7) - color = "#4cb849" - if(5 to 6) - color = "#b5d335" - if(4 to 5) - color = "#f7ec1e" - if(3 to 4) - color = "#fbc314" - if(2 to 3) - color = "#f26724" - if(1 to 2) - color = "#ef1d26" - if(-INFINITY to 1) - color = "#c6040c" - desc += " The paper looks to be around a pH of [round(cont.reagents.pH, 1)]" - used = TRUE + if(!istype(cont)) + return + if(used == TRUE) + to_chat(user, "[user] has already been used!") + return + if(!LAZYLEN(cont.reagents.reagent_list)) + return + switch(round(cont.reagents.pH, 1)) + if(14 to INFINITY) + color = "#462c83" + if(13 to 14) + color = "#63459b" + if(12 to 13) + color = "#5a51a2" + if(11 to 12) + color = "#3853a4" + if(10 to 11) + color = "#3f93cf" + if(9 to 10) + color = "#0bb9b7" + if(8 to 9) + color = "#23b36e" + if(7 to 8) + color = "#3aa651" + if(6 to 7) + color = "#4cb849" + if(5 to 6) + color = "#b5d335" + if(4 to 5) + color = "#f7ec1e" + if(3 to 4) + color = "#fbc314" + if(2 to 3) + color = "#f26724" + if(1 to 2) + color = "#ef1d26" + if(-INFINITY to 1) + color = "#c6040c" + desc += " The paper looks to be around a pH of [round(cont.reagents.pH, 1)]" + used = TRUE /obj/item/fermichem/pHmeter - name = "Chemistry Analyser" - desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays nothing." - icon_state = "pHmeter" - icon = 'modular_citadel/icons/obj/FermiChem.dmi' - resistance_flags = FLAMMABLE - w_class = WEIGHT_CLASS_TINY - var/scanmode = 1 + name = "Chemistry Analyser" + desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays nothing." + icon_state = "pHmeter" + icon = 'icons/obj/chemical.dmi' + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_TINY + var/scanmode = 1 /obj/item/fermichem/pHmeter/attack_self(mob/user) if(!scanmode) @@ -127,21 +127,21 @@ scanmode = 0 /obj/item/fermichem/pHmeter/afterattack(atom/A, mob/user, proximity) - . = ..() - if(!istype(A, /obj/item/reagent_containers)) - return - var/obj/item/reagent_containers/cont = A - if(LAZYLEN(cont.reagents.reagent_list) == null) - return - var/out_message - to_chat(user, "The chemistry meter beeps and displays:") - out_message += "Total volume: [round(cont.volume, 0.01)] Total pH: [round(cont.reagents.pH, 0.1)]\n" - if(cont.reagents.fermiIsReacting) - out_message += "A reaction appears to be occuring currently.\n" - out_message += "Chemicals found in the beaker:\n" - for(var/datum/reagent/R in cont.reagents.reagent_list) - out_message += "[R.volume]u of [R.name], Purity: [R.purity], [(scanmode?"[(R.overdose_threshold?"Overdose: [R.overdose_threshold]u, ":"")][(R.addiction_threshold?"Addiction: [R.addiction_threshold]u, ":"")]Base pH: [R.pH].":".")]\n" - if(scanmode) - out_message += "Analysis: [R.description]\n" - to_chat(user, "[out_message]") - desc = "An electrode attached to a small circuit box that will analyse a beaker. It can be toggled to give a reduced or extended report. The screen currently displays [round(cont.reagents.pH, 0.1)]." + . = ..() + if(!istype(A, /obj/item/reagent_containers)) + return + var/obj/item/reagent_containers/cont = A + if(LAZYLEN(cont.reagents.reagent_list) == null) + return + var/out_message + to_chat(user, "The chemistry meter beeps and displays:") + out_message += "Total volume: [round(cont.volume, 0.01)] Total pH: [round(cont.reagents.pH, 0.1)]\n" + if(cont.reagents.fermiIsReacting) + out_message += "A reaction appears to be occuring currently.\n" + out_message += "Chemicals found in the beaker:\n" + for(var/datum/reagent/R in cont.reagents.reagent_list) + out_message += "[R.volume]u of [R.name], Purity: [R.purity], [(scanmode?"[(R.overdose_threshold?"Overdose: [R.overdose_threshold]u, ":"")][(R.addiction_threshold?"Addiction: [R.addiction_threshold]u, ":"")]Base pH: [R.pH].":".")]\n" + if(scanmode) + out_message += "Analysis: [R.description]\n" + to_chat(user, "[out_message]") + desc = "An electrode attached to a small circuit box that will analyse a beaker. It can be toggled to give a reduced or extended report. The screen currently displays [round(cont.reagents.pH, 0.1)]." diff --git a/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm b/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm deleted file mode 100644 index d40dba8a3f..0000000000 --- a/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm +++ /dev/null @@ -1,41 +0,0 @@ -/obj/structure/reagent_dispensers/keg - name = "keg" - desc = "A keg." - icon = 'modular_citadel/icons/obj/objects.dmi' - icon_state = "keg" - reagent_id = "water" - -/obj/structure/reagent_dispensers/keg/mead - name = "keg of mead" - desc = "A keg of mead." - icon_state = "orangekeg" - reagent_id = "mead" - -/obj/structure/reagent_dispensers/keg/aphro - name = "keg of aphrodisiac" - desc = "A keg of aphrodisiac." - icon_state = "pinkkeg" - reagent_id = "aphro" - -/obj/structure/reagent_dispensers/keg/aphro/strong - name = "keg of strong aphrodisiac" - desc = "A keg of strong and addictive aphrodisiac." - reagent_id = "aphro+" - -/obj/structure/reagent_dispensers/keg/milk - name = "keg of milk" - desc = "It's not quite what you were hoping for." - icon_state = "whitekeg" - reagent_id = "milk" - -/obj/structure/reagent_dispensers/keg/semen - name = "keg of semen" - desc = "Dear lord, where did this even come from?" - icon_state = "whitekeg" - reagent_id = "semen" - -/obj/structure/reagent_dispensers/keg/gargle - name = "keg of pan galactic gargleblaster" - desc = "A keg of... wow that's a long name." - icon_state = "bluekeg" - reagent_id = "gargleblaster" \ No newline at end of file diff --git a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm deleted file mode 100755 index 4aa634a488..0000000000 --- a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm +++ /dev/null @@ -1,299 +0,0 @@ -#define HYPO_SPRAY 0 -#define HYPO_INJECT 1 - -#define WAIT_SPRAY 25 -#define WAIT_INJECT 25 -#define SELF_SPRAY 15 -#define SELF_INJECT 15 - -#define DELUXE_WAIT_SPRAY 20 -#define DELUXE_WAIT_INJECT 20 -#define DELUXE_SELF_SPRAY 10 -#define DELUXE_SELF_INJECT 10 - -#define COMBAT_WAIT_SPRAY 0 -#define COMBAT_WAIT_INJECT 0 -#define COMBAT_SELF_SPRAY 0 -#define COMBAT_SELF_INJECT 0 - -//A vial-loaded hypospray. Cartridge-based! -/obj/item/hypospray/mkii - name = "hypospray mk.II" - icon = 'modular_citadel/icons/obj/hypospraymkii.dmi' - icon_state = "hypo2" - desc = "A new development from DeForest Medical, this hypospray takes 30-unit vials as the drug supply for easy swapping." - w_class = WEIGHT_CLASS_TINY - var/list/allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small) - var/mode = HYPO_INJECT - var/obj/item/reagent_containers/glass/bottle/vial/vial - var/start_vial = /obj/item/reagent_containers/glass/bottle/vial/small - var/spawnwithvial = TRUE - var/inject_wait = WAIT_INJECT - var/spray_wait = WAIT_SPRAY - var/spray_self = SELF_SPRAY - var/inject_self = SELF_INJECT - var/quickload = FALSE - var/penetrates = FALSE - -/obj/item/hypospray/mkii/brute - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine - -/obj/item/hypospray/mkii/toxin - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin - -/obj/item/hypospray/mkii/oxygen - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin - -/obj/item/hypospray/mkii/burn - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane - -/obj/item/hypospray/mkii/tricord - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord - -/obj/item/hypospray/mkii/enlarge - spawnwithvial = FALSE - -/obj/item/hypospray/mkii/CMO - name = "hypospray mk.II deluxe" - allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large) - icon_state = "cmo2" - desc = "The Deluxe Hypospray can take larger-size vials. It also acts faster and delivers more reagents per spray." - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - start_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO - inject_wait = DELUXE_WAIT_INJECT - spray_wait = DELUXE_WAIT_SPRAY - spray_self = DELUXE_SELF_SPRAY - inject_self = DELUXE_SELF_INJECT - -/obj/item/hypospray/mkii/CMO/combat - name = "combat hypospray mk.II" - desc = "A combat-ready deluxe hypospray that acts almost instantly. It can be tactically reloaded by using a vial on it." - icon_state = "combat2" - start_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/combat - inject_wait = COMBAT_WAIT_INJECT - spray_wait = COMBAT_WAIT_SPRAY - spray_self = COMBAT_SELF_SPRAY - inject_self = COMBAT_SELF_INJECT - quickload = TRUE - penetrates = TRUE - -/obj/item/hypospray/mkii/Initialize() - . = ..() - if(!spawnwithvial) - update_icon() - return - if(start_vial) - vial = new start_vial - update_icon() - -/obj/item/hypospray/mkii/update_icon() - ..() - icon_state = "[initial(icon_state)][vial ? "" : "-e"]" - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() - return - -/obj/item/hypospray/mkii/examine(mob/user) - . = ..() - if(vial) - to_chat(user, "[vial] has [vial.reagents.total_volume]u remaining.") - else - to_chat(user, "It has no vial loaded in.") - to_chat(user, "[src] is set to [mode ? "Inject" : "Spray"] contents on application.") - -/obj/item/hypospray/mkii/proc/unload_hypo(obj/item/I, mob/user) - if((istype(I, /obj/item/reagent_containers/glass/bottle/vial))) - var/obj/item/reagent_containers/glass/bottle/vial/V = I - V.forceMove(user.loc) - user.put_in_hands(V) - to_chat(user, "You remove [vial] from [src].") - vial = null - update_icon() - playsound(loc, 'sound/weapons/empty.ogg', 50, 1) - else - to_chat(user, "This hypo isn't loaded!") - return - -/obj/item/hypospray/mkii/attackby(obj/item/I, mob/living/user) - if((istype(I, /obj/item/reagent_containers/glass/bottle/vial) && vial != null)) - if(!quickload) - to_chat(user, "[src] can not hold more than one vial!") - return FALSE - unload_hypo(vial, user) - if((istype(I, /obj/item/reagent_containers/glass/bottle/vial))) - var/obj/item/reagent_containers/glass/bottle/vial/V = I - if(!is_type_in_list(V, allowed_containers)) - to_chat(user, "[src] doesn't accept this type of vial.") - return FALSE - if(!user.transferItemToLoc(V,src)) - return FALSE - vial = V - user.visible_message("[user] has loaded a vial into [src].","You have loaded [vial] into [src].") - update_icon() - playsound(loc, 'sound/weapons/autoguninsert.ogg', 35, 1) - return TRUE - else - to_chat(user, "This doesn't fit in [src].") - return FALSE - return FALSE - -/obj/item/hypospray/mkii/AltClick(mob/user) - if(vial) - vial.attack_self(user) - -// Gunna allow this for now, still really don't approve - Pooj -/obj/item/hypospray/mkii/emag_act(mob/user) - . = ..() - if(obj_flags & EMAGGED) - to_chat(user, "[src] happens to be already overcharged.") - return - inject_wait = COMBAT_WAIT_INJECT - spray_wait = COMBAT_WAIT_SPRAY - spray_self = COMBAT_SELF_INJECT - inject_self = COMBAT_SELF_SPRAY - penetrates = TRUE - to_chat(user, "You overcharge [src]'s control circuit.") - obj_flags |= EMAGGED - return TRUE - -/obj/item/hypospray/mkii/attack_hand(mob/user) - . = ..() //Don't bother changing this or removing it from containers will break. - -/obj/item/hypospray/mkii/attack(obj/item/I, mob/user, params) - return - -/obj/item/hypospray/mkii/afterattack(atom/target, mob/user, proximity) - if(!vial) - return - - if(!proximity) - return - - if(!ismob(target)) - return - - var/mob/living/L - if(isliving(target)) - L = target - if(!penetrates && !L.can_inject(user, 1)) //This check appears another four times, since otherwise the penetrating sprays will break in do_mob. - return - - if(!L && !target.is_injectable()) //only checks on non-living mobs, due to how can_inject() handles - to_chat(user, "You cannot directly fill [target]!") - return - - if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, "[target] is full.") - return - - if(ishuman(L)) - var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected)) - if(!affecting) - to_chat(user, "The limb is missing!") - return - if(affecting.status != BODYPART_ORGANIC) - to_chat(user, "Medicine won't work on a robotic limb!") - return - - var/contained = vial.reagents.log_list() - log_combat(user, L, "attemped to inject", src, addition="which had [contained]") -//Always log attemped injections for admins - if(vial != null) - switch(mode) - if(HYPO_INJECT) - if(L) //living mob - if(L != user) - L.visible_message("[user] is trying to inject [L] with [src]!", \ - "[user] is trying to inject [L] with [src]!") - if(!do_mob(user, L, inject_wait)) - return - if(!penetrates && !L.can_inject(user, 1)) - return - if(!vial.reagents.total_volume) - return - if(L.reagents.total_volume >= L.reagents.maximum_volume) - return - L.visible_message("[user] uses the [src] on [L]!", \ - "[user] uses the [src] on [L]!") - else - if(!do_mob(user, L, inject_self)) - return - if(!penetrates && !L.can_inject(user, 1)) - return - if(!vial.reagents.total_volume) - return - if(L.reagents.total_volume >= L.reagents.maximum_volume) - return - log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])") - L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG) - - var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1) - vial.reagents.reaction(L, INJECT, fraction) - vial.reagents.trans_to(target, vial.amount_per_transfer_from_this) - if(vial.amount_per_transfer_from_this >= 15) - playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1) - if(vial.amount_per_transfer_from_this < 15) - playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) - to_chat(user, "You inject [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.") - - if(HYPO_SPRAY) - if(L) //living mob - if(L != user) - L.visible_message("[user] is trying to spray [L] with [src]!", \ - "[user] is trying to spray [L] with [src]!") - if(!do_mob(user, L, spray_wait)) - return - if(!penetrates && !L.can_inject(user, 1)) - return - if(!vial.reagents.total_volume) - return - if(L.reagents.total_volume >= L.reagents.maximum_volume) - return - L.visible_message("[user] uses the [src] on [L]!", \ - "[user] uses the [src] on [L]!") - else - if(!do_mob(user, L, spray_self)) - return - if(!penetrates && !L.can_inject(user, 1)) - return - if(!vial.reagents.total_volume) - return - if(L.reagents.total_volume >= L.reagents.maximum_volume) - return - log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])") - L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG) - var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1) - vial.reagents.reaction(L, PATCH, fraction) - vial.reagents.trans_to(target, vial.amount_per_transfer_from_this) - if(vial.amount_per_transfer_from_this >= 15) - playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1) - if(vial.amount_per_transfer_from_this < 15) - playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) - to_chat(user, "You spray [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.") - else - to_chat(user, "[src] doesn't work here!") - return - -/obj/item/hypospray/mkii/attack_self(mob/living/user) - if(user) - if(user.incapacitated()) - return - else if(!vial) - to_chat(user, "This Hypo needs to be loaded first!") - return - else - unload_hypo(vial,user) - -/obj/item/hypospray/mkii/verb/modes() - set name = "Toggle Application Mode" - set category = "Object" - set src in usr - var/mob/M = usr - switch(mode) - if(HYPO_SPRAY) - mode = HYPO_INJECT - to_chat(M, "[src] is now set to inject contents on application.") - if(HYPO_INJECT) - mode = HYPO_SPRAY - to_chat(M, "[src] is now set to spray contents on application.") diff --git a/modular_citadel/icons/obj/FermiChem.dmi b/modular_citadel/icons/obj/FermiChem.dmi deleted file mode 100644 index de7a86d574..0000000000 Binary files a/modular_citadel/icons/obj/FermiChem.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/hypospraymkii.dmi b/modular_citadel/icons/obj/hypospraymkii.dmi deleted file mode 100755 index 3f32219d84..0000000000 Binary files a/modular_citadel/icons/obj/hypospraymkii.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/modularpills.dmi b/modular_citadel/icons/obj/modularpills.dmi deleted file mode 100644 index 78095d82c0..0000000000 Binary files a/modular_citadel/icons/obj/modularpills.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/vial.dmi b/modular_citadel/icons/obj/vial.dmi deleted file mode 100755 index 8d1fefe470..0000000000 Binary files a/modular_citadel/icons/obj/vial.dmi and /dev/null differ diff --git a/tgstation.dme b/tgstation.dme index 3daee9d346..31db79ce1f 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2585,6 +2585,7 @@ #include "code\modules\reagents\reagent_containers\dropper.dm" #include "code\modules\reagents\reagent_containers\glass.dm" #include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\hypovial.dm" #include "code\modules\reagents\reagent_containers\medspray.dm" #include "code\modules\reagents\reagent_containers\patch.dm" #include "code\modules\reagents\reagent_containers\pill.dm" @@ -3120,8 +3121,6 @@ #include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm" #include "modular_citadel\code\modules\reagents\objects\clothes.dm" #include "modular_citadel\code\modules\reagents\objects\items.dm" -#include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm" -#include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm" #include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm" #include "modular_citadel\code\modules\recycling\disposal\bin.dm" #include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm"