From fff4e9ffc55c9f4f59956dca0aee152da31f2921 Mon Sep 17 00:00:00 2001 From: Runa Dacino Date: Sun, 12 Feb 2023 21:03:07 +0100 Subject: [PATCH 1/6] Implements new machine that creates autoinjectors en masse --- code/game/machinery/frame.dm | 6 + .../items/weapons/circuitboards/frame.dm | 15 +- .../reagents/machinery/injector_maker.dm | 181 ++++++++++++++++++ icons/obj/chemical_vr.dmi | Bin 2107 -> 2850 bytes vorestation.dme | 1 + 5 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 code/modules/reagents/machinery/injector_maker.dm diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index 6c71e63207..c3fa1701fd 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -202,6 +202,12 @@ frame_class = FRAME_CLASS_MACHINE frame_size = 3 +/datum/frame/frame_types/injector_maker + name = "Ready-to-Use Medicine 3000" + frame_class = FRAME_CLASS_MACHINE + circuit = /obj/machinery/atmospheric_field_generator + frame_size = 3 + ////////////////////////////// // Frame Object (Structure) ////////////////////////////// diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm index 7ef7c4bfef..000cd011f6 100644 --- a/code/game/objects/items/weapons/circuitboards/frame.dm +++ b/code/game/objects/items/weapons/circuitboards/frame.dm @@ -264,4 +264,17 @@ /obj/item/weapon/stock_parts/micro_laser/high = 2, //field emitters /obj/item/weapon/stock_parts/scanning_module = 1, //atmosphere sensor /obj/item/weapon/stock_parts/capacitor/adv = 1, //for the JUICE - /obj/item/stack/cable_coil = 10) \ No newline at end of file + /obj/item/stack/cable_coil = 10) + + +/obj/item/weapon/circuitboard/injector_maker + name = T_BOARD("Ready-to-Use Medicine 3000") + build_path = /obj/machinery/injector_maker + board_type = new /datum/frame/frame_types/injector_maker + origin_tech = list(TECH_BIO = 3, TECH_ENGINEERING = 2, TECH_MATERIAL = 2) + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/console_screen = 1 + ) diff --git a/code/modules/reagents/machinery/injector_maker.dm b/code/modules/reagents/machinery/injector_maker.dm new file mode 100644 index 0000000000..0aa79fa88c --- /dev/null +++ b/code/modules/reagents/machinery/injector_maker.dm @@ -0,0 +1,181 @@ +/obj/machinery/injector_maker + name = "Ready-to-Use Medicine 3000" + desc = "Molds plastic into autoinjectors and fills them with chemicals. \n Add a beaker or a bottle filled with chemicals and a sheet of plastic to use!" + icon = 'icons/obj/chemical_vr.dmi' //placeholder for testing + icon_state = "injector" + use_power = USE_POWER_IDLE + anchored = FALSE + density = FALSE + clicksound = "button" + clickvol = 30 + idle_power_usage = 5 + active_power_usage = 100 + circuit = /obj/item/weapon/circuitboard/injector_maker + var/obj/item/weapon/reagent_containers/beaker = null + var/plastic_amount = 0 + var/max_plastic = 10000 + var/stack_value = 2000 + var/material_per_sheet = 2000 + var/plastic_cost_small = 10 + var/plastic_cost_large = 500 + var/list/beaker_reagents_list = list() + + +/obj/machinery/injector_maker/Initialize() + . = ..() + default_apply_parts() + +obj/machinery/injector_maker/update_icon() + if(!plastic_amount && !beaker) + icon_state = "injector" + else if(!plastic_amount && beaker != null) + icon_state = "injector_b" + else if(!beaker && plastic_amount > 0) + icon_state = "injector_p" + else if(beaker != null && plastic_amount > 0) + icon_state = "injector_pb" + + +/obj/machinery/injector_maker/attackby(var/obj/item/O as obj, var/mob/user as mob) + + if (istype(O, /obj/item/device/multitool)) + return ..() + + if(istype(O,/obj/item/weapon/reagent_containers/glass) || \ + istype(O,/obj/item/weapon/reagent_containers/food/drinks/glass2) || \ + istype(O,/obj/item/weapon/reagent_containers/food/drinks/shaker)) + + if (beaker) + return 1 + else + src.beaker = O + user.drop_item() + O.loc = src + update_icon() + src.updateUsrDialog() + return 0 + + if(istype(O,/obj/item/stack/material)) + if(O.get_material_name() == MAT_PLASTIC) + var/obj/item/stack/S = O + var/input_amount = tgui_input_number(user, "How many sheets would you like to add?", "Add plastic", 0, S.get_amount(), 0, 0, TRUE) + if(input_amount == 0) + return + var/plastic_input = input_amount * stack_value + var/free_space = max_plastic - src.plastic_amount + if(plastic_input > free_space) + to_chat(user, SPAN_WARNING("Storage is full! There is only [free_space] units worth of space left!")) + else + S.use(input_amount) + src.plastic_amount = plastic_input + update_icon() + +/obj/machinery/injector_maker/AltClick(mob/user) + . = ..() + if(beaker) + if(!user.incapacitated() && Adjacent(user)) + user.put_in_hands(beaker) + else + beaker.forceMove(drop_location()) + beaker = null + update_icon() + +/obj/machinery/injector_maker/examine(mob/user) + . = ..() + if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) + . += "You're too far away to examine [src]'s contents and display!" + return + + if(beaker) + . += "\The [src] contains:" + if(beaker) + . += "- \A [beaker]." + + . += "\The [src] contains [plastic_amount] units of plastic.\n It can hold up to [max_plastic] units! 1 sheet gives [stack_value] units." + + if(!(stat & (NOPOWER|BROKEN))) + . += "The status display reads:\n" + if(beaker) + for(var/datum/reagent/R in beaker.reagents.reagent_list) + . += "- [R.volume] units of [R.name]." + +/obj/machinery/injector_maker/attack_hand(mob/user as mob) + interact(user) + +/obj/machinery/injector_maker/interact(mob/user as mob) + if(user.incapacitated() || !beaker) + return + + var/choice = tgui_input_list(user, "There is [plastic_amount] units of plastic left", "Choose what to do", list("large injector", "small injector", "eject", "cancel")) + + switch(choice) + if("cancel") + return + if("eject") + if(!user.incapacitated() && Adjacent(user)) + user.put_in_hands(beaker) + else + beaker.forceMove(drop_location()) + beaker = null + update_icon() + if("small injector") + if(!beaker.reagents.total_volume) + to_chat(user, SPAN_WARNING("Chemical storage is empty!")) + return + if(!plastic_amount) + to_chat(user, SPAN_WARNING("No plastic in storage! Add at least 1 sheet of plastic.")) + return + var/injector_amount = tgui_input_number(user, "How many injectors would you like?", "Make small injectors", 0, 100, 0, 0, TRUE) + if(injector_amount > 0) + var/plastic_needed = injector_amount * plastic_cost_small + if(src.plastic_amount < plastic_needed ) + to_chat(user, SPAN_WARNING("Not enough plastic! You only have enough plastic for [src.plastic_amount / plastic_cost_small] small injectors!")) + return + var/name = sanitize(tgui_input_text(user, "Name Injector", "Naming", null, 32, 0, 0, 0, 0),MAX_MESSAGE_LEN,0,0,0) + make_injector("large injector", injector_amount, name) + update_icon() + if("large injector") + if(!beaker.reagents.total_volume) + to_chat(user, SPAN_WARNING("Chemical storage is empty!")) + return + if(!plastic_amount) + to_chat(user, SPAN_WARNING("No plastic in storage! Add at least 1 sheet of plastic.")) + return + var/injector_amount = tgui_input_number(user, "How many injectors would you like?", "Make small injectors", 0, 100, 0, 0, TRUE) + if(injector_amount > 0) + var/plastic_needed = injector_amount * plastic_cost_small + if(src.plastic_amount < plastic_needed) + to_chat(user, SPAN_WARNING("Not enough plastic! You only have enough plastic for [src.plastic_amount / plastic_cost_large] large injectors!")) + return + var/name = sanitize(tgui_input_text(user, "Name Injector", "Naming", null, 32, 0, 0, 0, 0),MAX_MESSAGE_LEN,0,0,0) + make_injector("large injector", injector_amount, name) + update_icon() + +/obj/machinery/injector_maker/proc/make_injector(var/size, var/amount, var/new_name) + if(!beaker) + return + for(var/i, i <= amount, i++) + switch(size) + if("small injector") + to_world("Making [size], checking if we got enough.") + var/amount_per_injector = CLAMP(beaker.reagents.total_volume / amount, 0, 15) + if(!amount_per_injector || (plastic_cost_small > src.plastic_amount)) + return + to_world("Enough") + var/obj/item/weapon/reagent_containers/hypospray/autoinjector/empty/P = new(loc) + beaker.reagents.trans_to_obj(P, amount_per_injector) + P.update_icon() + if(new_name) + P.name = new_name + src.plastic_amount = src.plastic_amount - plastic_cost_small + + if("large injector") + var/amount_per_injector = CLAMP(beaker.reagents.total_volume / amount, 0, 15) + if(!amount_per_injector || (plastic_cost_large > src.plastic_amount)) + return + var/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/empty/P = new(loc) + beaker.reagents.trans_to_obj(P, amount_per_injector) + P.update_icon() + if(new_name) + P.name = new_name + src.plastic_amount = src.plastic_amount - plastic_cost_large diff --git a/icons/obj/chemical_vr.dmi b/icons/obj/chemical_vr.dmi index a08a052c90f5f070b8a79a18bbc5ecb123226093..224dbe18671135f8258f29eaa1f43a547e1eb102 100644 GIT binary patch literal 2850 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 a4~4dCy>s2r_;~847iekdsh8Za4*D0)WnqN? literal 2107 zcmV-B2*me^P)V=-0C=2*%R3H(Fc3x2+Fr#7YNGsFH<3}~0=5uYc!Ed42F;jc`zfdq-Mi9x zH9Xp<>%n$Tf02de3of$c-dFP0h%NxzZ{S z3mCX)^=6-N+k3A=pU}(7_!`#b&<+vPhsvI-q3tc$&gnliNk_+VChUv=00(19L_t(| zob8)^Ok39(#(##Qq|9S!LKI381&E3kC@>kV%GQ`LO=5znY!QvRMMxXblti1Zz&QJA zE7YOTv>U`QFH=IJ;!ZB1Y;F>^!kS8{`Pde+m@JM)TC>fCrNmJRWZ;<)Q@lUmde_*1 zF*dgp9?8-@?>YAKKF>Yp-1lBxE6ipys~Hc?)sd^s^+bZuTw_)QGp@L}I3oN;qtS<7 z5oiYFYI8kgM}i)(ENnt?aj_>YEiEGSy}i9YCiofP6`vRpei&q46GZWGad8o$9~~X_ zF~MgEJSlh=IOCEtzrX{UL{eA?;G z8w;HvKk;qdSC@_7Zw73y%iuR}T?F9F=~J9F9_O)RUjV?~c#|D>q3gY80cdT#Ov7`R zc<)R#058;?C9E3kx= zZ&+Y78Wp|0z01z)vk97O%nJALU0(S9_qcNQRXSSU1mM5d?r|V-ACm(U0OS{(;TP2| zUOfH|0H;iUpxyl$djDacZeJe6x-Fls{xNLMXhudxf=b3{G%h=T)a-y`tAl^wtMm;i94n2~9_Dx^xSFu)>wq-_2W!GBY#J1I&&~`Y$YGLdcKBD_W;~UVE%8h)S$@>*GNb3Mvbt z!t$Q!TxUFx5%ZXEem)Zxy$4jZP7PMHP7T(Trp1e&+R|OFiq@$?6bjUP5?r&*2?e5f zsW9{zf^lmVi!+R|OF-&uwS#E;1`f_hJa3!t;h5gRTO7K2btSd;E~VHNJtQb@{*Dgnwsl8Z#18Z%gM>vEA|Cr#$so|lIj4p`cao!{iw@i8Np<^ zx0IjqLa*1KXlQ8Q?Y6&locvYe=&f6~XlkzYG&P@!OG!zY(+rhLrI~#!ju8amf^=3% zvFOWSWkFP8MXO`*>Fka1zyLr|_9K+l-Hes){+(Tp*ri+za&+Z+IY7yVjET3~u6MMz zx9{DyZ5uDXRO(T%?sI=^>n1ZZQ)9JSbt;ugV=|d)#P9Z8xl)*wm9@8|q@-P?zW542 zPiJ1LAPD7pz5c|K3-|XF{bx`A<%V?qi^$5#@@|IhSM$FPzE>9! zAujR?NLXAgEL-&5@M-`#4;`FHrxHl>KN9 z{q~%$ev1tt{^9E1!?(54F)P{t5%ohu9BQ@t#tJh1#(gw?^eG@!8v9fj0D%Qd@I`?5 zhpQ_-bu-{E|D68Q#FuvN2pC5J@4jD2+~kqpm92#?u168 zA Date: Sun, 12 Feb 2023 21:23:30 +0100 Subject: [PATCH 2/6] Maps in the auto-injector maker machine --- maps/groundbase/gb-z2.dmm | 2 ++ maps/stellar_delight/stellar_delight2.dmm | 1 + maps/tether/tether-03-surface3.dmm | 2 ++ 3 files changed, 5 insertions(+) diff --git a/maps/groundbase/gb-z2.dmm b/maps/groundbase/gb-z2.dmm index 9c8fd0216f..ae7d63e490 100644 --- a/maps/groundbase/gb-z2.dmm +++ b/maps/groundbase/gb-z2.dmm @@ -14967,6 +14967,8 @@ /obj/machinery/camera/network/medbay{ dir = 1 }, +/obj/structure/table/glass, +/obj/machinery/injector_maker, /turf/simulated/floor/tiled/white, /area/groundbase/medical/triage) "QG" = ( diff --git a/maps/stellar_delight/stellar_delight2.dmm b/maps/stellar_delight/stellar_delight2.dmm index 3c45547994..4f0a17dcb5 100644 --- a/maps/stellar_delight/stellar_delight2.dmm +++ b/maps/stellar_delight/stellar_delight2.dmm @@ -4439,6 +4439,7 @@ /obj/machinery/camera/network/medbay{ dir = 4 }, +/obj/machinery/injector_maker, /turf/simulated/floor/tiled/eris/white/bluecorner, /area/stellardelight/deck2/triage) "jL" = ( diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm index 85e772261d..d0b165b892 100644 --- a/maps/tether/tether-03-surface3.dmm +++ b/maps/tether/tether-03-surface3.dmm @@ -407,6 +407,8 @@ dir = 6 }, /obj/machinery/camera/network/medbay, +/obj/structure/table/glass, +/obj/machinery/injector_maker, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "aaJ" = ( From 20105775a75958641562cc0958b3b42a61fe4593 Mon Sep 17 00:00:00 2001 From: Runa Dacino Date: Sun, 12 Feb 2023 21:36:57 +0100 Subject: [PATCH 3/6] Fixels missing HTML closing bracket --- code/modules/reagents/machinery/injector_maker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/machinery/injector_maker.dm b/code/modules/reagents/machinery/injector_maker.dm index 0aa79fa88c..1f353be6a1 100644 --- a/code/modules/reagents/machinery/injector_maker.dm +++ b/code/modules/reagents/machinery/injector_maker.dm @@ -91,7 +91,7 @@ obj/machinery/injector_maker/update_icon() if(beaker) . += "- \A [beaker]." - . += "\The [src] contains [plastic_amount] units of plastic.\n It can hold up to [max_plastic] units! 1 sheet gives [stack_value] units." + . += "\The [src] contains [plastic_amount] units of plastic.\n It can hold up to [max_plastic] units! 1 sheet gives [stack_value] units." if(!(stat & (NOPOWER|BROKEN))) . += "The status display reads:\n" From 33e24017cc38fdf70b515f06a987968d9ae24e1a Mon Sep 17 00:00:00 2001 From: Runa Dacino Date: Sun, 12 Feb 2023 21:41:37 +0100 Subject: [PATCH 4/6] Fixes dreamcheker --- code/modules/reagents/machinery/injector_maker.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/machinery/injector_maker.dm b/code/modules/reagents/machinery/injector_maker.dm index 1f353be6a1..9173dbc257 100644 --- a/code/modules/reagents/machinery/injector_maker.dm +++ b/code/modules/reagents/machinery/injector_maker.dm @@ -25,7 +25,7 @@ . = ..() default_apply_parts() -obj/machinery/injector_maker/update_icon() +/obj/machinery/injector_maker/update_icon() if(!plastic_amount && !beaker) icon_state = "injector" else if(!plastic_amount && beaker != null) @@ -34,6 +34,7 @@ obj/machinery/injector_maker/update_icon() icon_state = "injector_p" else if(beaker != null && plastic_amount > 0) icon_state = "injector_pb" + return /obj/machinery/injector_maker/attackby(var/obj/item/O as obj, var/mob/user as mob) From 7d7e5b429a74a02c25a192f65179c8adb63bf963 Mon Sep 17 00:00:00 2001 From: Runa Dacino Date: Mon, 13 Feb 2023 15:01:18 +0100 Subject: [PATCH 5/6] Makes autoinjector maker use injectors rather than plastic --- .../reagents/machinery/injector_maker.dm | 104 ++++++++++-------- icons/obj/chemical_vr.dmi | Bin 2850 -> 2848 bytes 2 files changed, 56 insertions(+), 48 deletions(-) diff --git a/code/modules/reagents/machinery/injector_maker.dm b/code/modules/reagents/machinery/injector_maker.dm index 9173dbc257..f8f9b67e26 100644 --- a/code/modules/reagents/machinery/injector_maker.dm +++ b/code/modules/reagents/machinery/injector_maker.dm @@ -1,7 +1,7 @@ /obj/machinery/injector_maker name = "Ready-to-Use Medicine 3000" - desc = "Molds plastic into autoinjectors and fills them with chemicals. \n Add a beaker or a bottle filled with chemicals and a sheet of plastic to use!" - icon = 'icons/obj/chemical_vr.dmi' //placeholder for testing + desc = "Fills plastic autoinjectors with chemicals! \n Add a beaker or a bottle filled with chemicals and an autoinjector of appropriate size to use!" + icon = 'icons/obj/chemical_vr.dmi' icon_state = "injector" use_power = USE_POWER_IDLE anchored = FALSE @@ -12,12 +12,10 @@ active_power_usage = 100 circuit = /obj/item/weapon/circuitboard/injector_maker var/obj/item/weapon/reagent_containers/beaker = null - var/plastic_amount = 0 - var/max_plastic = 10000 - var/stack_value = 2000 - var/material_per_sheet = 2000 - var/plastic_cost_small = 10 - var/plastic_cost_large = 500 + var/count_large_injector = 0 + var/count_small_injector = 0 + var/capacity_large_injector = 10 + var/capacity_small_injector = 30 var/list/beaker_reagents_list = list() @@ -26,14 +24,14 @@ default_apply_parts() /obj/machinery/injector_maker/update_icon() - if(!plastic_amount && !beaker) + if(!count_large_injector && !count_small_injector && !beaker) icon_state = "injector" - else if(!plastic_amount && beaker != null) + else if(!count_large_injector && !count_small_injector && beaker != null) icon_state = "injector_b" - else if(!beaker && plastic_amount > 0) - icon_state = "injector_p" - else if(beaker != null && plastic_amount > 0) - icon_state = "injector_pb" + else if(!beaker && (count_large_injector > 0 || count_small_injector > 0)) + icon_state = "injector_i" + else if(beaker != null && count_large_injector > 0 && count_small_injector > 0) + icon_state = "injector_ib" return @@ -56,20 +54,32 @@ src.updateUsrDialog() return 0 - if(istype(O,/obj/item/stack/material)) - if(O.get_material_name() == MAT_PLASTIC) - var/obj/item/stack/S = O - var/input_amount = tgui_input_number(user, "How many sheets would you like to add?", "Add plastic", 0, S.get_amount(), 0, 0, TRUE) - if(input_amount == 0) - return - var/plastic_input = input_amount * stack_value - var/free_space = max_plastic - src.plastic_amount - if(plastic_input > free_space) - to_chat(user, SPAN_WARNING("Storage is full! There is only [free_space] units worth of space left!")) - else - S.use(input_amount) - src.plastic_amount = plastic_input - update_icon() + + + if(istype(O,/obj/item/weapon/reagent_containers/hypospray/autoinjector/empty)) + var/obj/item/weapon/reagent_containers/hypospray/autoinjector/empty/E = O + if(src.count_small_injector >= src.capacity_small_injector) + to_chat(user, SPAN_WARNING("Storage is full! It can only hold [capacity_small_injector]")) + return + if(E.reagents.total_volume > 0) + to_chat(user, SPAN_WARNING("You cannot put a filled injector into the machine!")) + return + src.count_small_injector = src.count_small_injector + 1 + qdel(E) + update_icon() + + if(istype(O,/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/empty)) + var/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/empty/E = O + if(src.count_large_injector >= src.capacity_large_injector) + to_chat(user, SPAN_WARNING("Storage is full! It can only hold [capacity_large_injector]")) + return + if(E.reagents.total_volume > 0) + to_chat(user, SPAN_WARNING("You cannot put a filled injector into the machine!")) + return + src.count_large_injector = src.count_large_injector + 1 + qdel(E) + update_icon() + /obj/machinery/injector_maker/AltClick(mob/user) . = ..() @@ -92,7 +102,8 @@ if(beaker) . += "- \A [beaker]." - . += "\The [src] contains [plastic_amount] units of plastic.\n It can hold up to [max_plastic] units! 1 sheet gives [stack_value] units." + . += "\The [src] contains [count_small_injector] small injectors and [count_large_injector] large injectors.\n " + . += " It can hold [capacity_small_injector] small and [capacity_large_injector] large injectors respectively.\n " if(!(stat & (NOPOWER|BROKEN))) . += "The status display reads:\n" @@ -107,12 +118,12 @@ if(user.incapacitated() || !beaker) return - var/choice = tgui_input_list(user, "There is [plastic_amount] units of plastic left", "Choose what to do", list("large injector", "small injector", "eject", "cancel")) + var/choice = tgui_input_list(user, "There are [src.count_small_injector] small and [src.count_large_injector] large injectors left.", "Choose what to do", list("large injector", "small injector", "eject beaker", "cancel")) switch(choice) if("cancel") return - if("eject") + if("eject beaker") if(!user.incapacitated() && Adjacent(user)) user.put_in_hands(beaker) else @@ -123,14 +134,14 @@ if(!beaker.reagents.total_volume) to_chat(user, SPAN_WARNING("Chemical storage is empty!")) return - if(!plastic_amount) - to_chat(user, SPAN_WARNING("No plastic in storage! Add at least 1 sheet of plastic.")) + if(!src.capacity_small_injector) + to_chat(user, SPAN_WARNING("Small injector rack is empty!!")) return var/injector_amount = tgui_input_number(user, "How many injectors would you like?", "Make small injectors", 0, 100, 0, 0, TRUE) if(injector_amount > 0) - var/plastic_needed = injector_amount * plastic_cost_small - if(src.plastic_amount < plastic_needed ) - to_chat(user, SPAN_WARNING("Not enough plastic! You only have enough plastic for [src.plastic_amount / plastic_cost_small] small injectors!")) + + if(src.count_small_injector < injector_amount ) + to_chat(user, SPAN_WARNING("Not enough autoinjectors! You only have [src.count_small_injector]")) return var/name = sanitize(tgui_input_text(user, "Name Injector", "Naming", null, 32, 0, 0, 0, 0),MAX_MESSAGE_LEN,0,0,0) make_injector("large injector", injector_amount, name) @@ -139,14 +150,13 @@ if(!beaker.reagents.total_volume) to_chat(user, SPAN_WARNING("Chemical storage is empty!")) return - if(!plastic_amount) - to_chat(user, SPAN_WARNING("No plastic in storage! Add at least 1 sheet of plastic.")) + if(!src.capacity_large_injector) + to_chat(user, SPAN_WARNING("Large injector rack is empty!")) return var/injector_amount = tgui_input_number(user, "How many injectors would you like?", "Make small injectors", 0, 100, 0, 0, TRUE) if(injector_amount > 0) - var/plastic_needed = injector_amount * plastic_cost_small - if(src.plastic_amount < plastic_needed) - to_chat(user, SPAN_WARNING("Not enough plastic! You only have enough plastic for [src.plastic_amount / plastic_cost_large] large injectors!")) + if(src.count_large_injector < injector_amount) + to_chat(user, SPAN_WARNING("Not enough autoinjectors! You only have [src.count_large_injector]")) return var/name = sanitize(tgui_input_text(user, "Name Injector", "Naming", null, 32, 0, 0, 0, 0),MAX_MESSAGE_LEN,0,0,0) make_injector("large injector", injector_amount, name) @@ -155,28 +165,26 @@ /obj/machinery/injector_maker/proc/make_injector(var/size, var/amount, var/new_name) if(!beaker) return - for(var/i, i <= amount, i++) + for(var/i, i < amount, i++) switch(size) if("small injector") - to_world("Making [size], checking if we got enough.") var/amount_per_injector = CLAMP(beaker.reagents.total_volume / amount, 0, 15) - if(!amount_per_injector || (plastic_cost_small > src.plastic_amount)) + if(!amount_per_injector || src.count_small_injector < 1) return - to_world("Enough") var/obj/item/weapon/reagent_containers/hypospray/autoinjector/empty/P = new(loc) beaker.reagents.trans_to_obj(P, amount_per_injector) P.update_icon() if(new_name) P.name = new_name - src.plastic_amount = src.plastic_amount - plastic_cost_small + src.count_small_injector = src.count_small_injector - 1 if("large injector") var/amount_per_injector = CLAMP(beaker.reagents.total_volume / amount, 0, 15) - if(!amount_per_injector || (plastic_cost_large > src.plastic_amount)) + if(!amount_per_injector || src.count_large_injector < 1) return var/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/empty/P = new(loc) beaker.reagents.trans_to_obj(P, amount_per_injector) P.update_icon() if(new_name) P.name = new_name - src.plastic_amount = src.plastic_amount - plastic_cost_large + src.count_large_injector = src.count_large_injector - 1 diff --git a/icons/obj/chemical_vr.dmi b/icons/obj/chemical_vr.dmi index 224dbe18671135f8258f29eaa1f43a547e1eb102..60033a8be59c99acdea818bbbb34bfdca0320f2a 100644 GIT binary patch delta 184 zcmV;p07w6#7N8c8B!8oNR9JLGWpiV4X>fFDZ*Bkpc$}5XI}U>|5Jl12Ud0G%qWoGn z5h$X7Eg%ObcoJ;Tj7heif*L`(cct@ExE1%ZhP*2E2U%zgVBmT(ZBkzU{{Xrl5?J7;7sB_4xQvU!D{CaA?NK;L*(ohOC3|2e< delta 186 zcmV;r07d_x7NQoAB!8uPR9JLGWpiV4X>fFDZ*Bkpc$|&RI}U>|5CqWLKE(=ZqWoGn z5h!v2S3nMIuoG<1u1T(+f+7_%-Hh}`lf$jL>juhN%MTK}DS(3O;V8w|_0fWY%UKGG zZm@AJ98E+}koAsd42)E;H{)0ggcvd@dPfWjPEtI{cwF<=Dlh3h8eRz7Zkdy|v*_P0 oCY=i}?BYbbVVnN`)5m_hNpq;063SZ39~OIhc!EV5(Xr4_3XH{6Y5)KL From f03a269d6399fab02e1c831bd0400a20389d5c38 Mon Sep 17 00:00:00 2001 From: Runa Dacino Date: Sat, 18 Feb 2023 17:16:54 +0100 Subject: [PATCH 6/6] Updates Icons, mapping and mechanism per discussions --- .../reagents/machinery/injector_maker.dm | 173 +++++++++++++----- icons/obj/chemical_vr.dmi | Bin 2848 -> 2978 bytes maps/groundbase/gb-z2.dmm | 7 +- maps/stellar_delight/stellar_delight2.dmm | 10 +- maps/tether/tether-03-surface3.dmm | 9 +- 5 files changed, 149 insertions(+), 50 deletions(-) diff --git a/code/modules/reagents/machinery/injector_maker.dm b/code/modules/reagents/machinery/injector_maker.dm index f8f9b67e26..2c561dcc7b 100644 --- a/code/modules/reagents/machinery/injector_maker.dm +++ b/code/modules/reagents/machinery/injector_maker.dm @@ -1,22 +1,33 @@ /obj/machinery/injector_maker name = "Ready-to-Use Medicine 3000" - desc = "Fills plastic autoinjectors with chemicals! \n Add a beaker or a bottle filled with chemicals and an autoinjector of appropriate size to use!" + desc = "Fills plastic autoinjectors with chemicals! Molds new injectors if needed! \n Add a beaker or a bottle filled with chemicals and an autoinjector of appropriate size or sheets of plastic to use!" icon = 'icons/obj/chemical_vr.dmi' icon_state = "injector" use_power = USE_POWER_IDLE - anchored = FALSE + anchored = TRUE density = FALSE + layer = ABOVE_WINDOW_LAYER + vis_flags = VIS_HIDE + unacidable = TRUE clicksound = "button" - clickvol = 30 + clickvol = 60 idle_power_usage = 5 active_power_usage = 100 circuit = /obj/item/weapon/circuitboard/injector_maker var/obj/item/weapon/reagent_containers/beaker = null + var/list/beaker_reagents_list = list() + + var/count_large_injector = 0 var/count_small_injector = 0 - var/capacity_large_injector = 10 - var/capacity_small_injector = 30 - var/list/beaker_reagents_list = list() + var/capacity_large_injector = 40 + var/capacity_small_injector = 40 + + var/count_plastic = 0 //Given in "units", not sheets + var/value_plastic = 2000 //1 sheet translates to 2000 units + var/cost_plastic_small = 30 + var/cost_plastic_large = 1500 + var/capacity_plastic = 60000 // cost_plastic_large * 40 /obj/machinery/injector_maker/Initialize() @@ -24,14 +35,20 @@ default_apply_parts() /obj/machinery/injector_maker/update_icon() - if(!count_large_injector && !count_small_injector && !beaker) + if(!beaker && !count_plastic && !count_small_injector && !count_large_injector) //Empty icon_state = "injector" - else if(!count_large_injector && !count_small_injector && beaker != null) + else if(beaker != null && !count_plastic && !count_small_injector && !count_large_injector ) //Has just beaker icon_state = "injector_b" - else if(!beaker && (count_large_injector > 0 || count_small_injector > 0)) + else if(!beaker && !count_plastic && (count_large_injector > 0 || count_small_injector > 0)) //Has just injectors icon_state = "injector_i" - else if(beaker != null && count_large_injector > 0 && count_small_injector > 0) + else if(!beaker && count_plastic > 0 && !count_large_injector && !count_small_injector) //Has just plastic + icon_state = "injector_p" + else if(beaker != null && !count_plastic && (count_large_injector > 0 || count_small_injector > 0)) //beaker + injectors icon_state = "injector_ib" + else if(beaker != null && count_plastic > 0 && !count_large_injector && !count_small_injector) //beaker + plastic + icon_state = "injector_pb" + else if(beaker != null && count_plastic > 0 && (count_large_injector > 0 || count_small_injector > 0)) //Has everything + icon_state = "injector_ipb" return @@ -67,7 +84,6 @@ src.count_small_injector = src.count_small_injector + 1 qdel(E) update_icon() - if(istype(O,/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/empty)) var/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/empty/E = O if(src.count_large_injector >= src.capacity_large_injector) @@ -81,6 +97,22 @@ update_icon() + if(istype(O,/obj/item/stack/material)) + if(O.get_material_name() == MAT_PLASTIC) + var/obj/item/stack/S = O + var/input_amount = tgui_input_number(user, "How many sheets would you like to add?", "Add plastic", 0, S.get_amount(), 0, 0, TRUE) + if(input_amount == 0) + return + var/plastic_input = input_amount * value_plastic + var/free_space = capacity_plastic - src.count_plastic + if(plastic_input > free_space) + to_chat(user, SPAN_WARNING("Storage is full! There is only [free_space] units worth of space left!")) + else + S.use(input_amount) + src.count_plastic = src.count_plastic + plastic_input + update_icon() + + /obj/machinery/injector_maker/AltClick(mob/user) . = ..() if(beaker) @@ -88,7 +120,7 @@ user.put_in_hands(beaker) else beaker.forceMove(drop_location()) - beaker = null + src.beaker = null update_icon() /obj/machinery/injector_maker/examine(mob/user) @@ -102,11 +134,12 @@ if(beaker) . += "- \A [beaker]." - . += "\The [src] contains [count_small_injector] small injectors and [count_large_injector] large injectors.\n " - . += " It can hold [capacity_small_injector] small and [capacity_large_injector] large injectors respectively.\n " + . += "\The [src] contains [src.count_small_injector] small injectors and [src.count_large_injector] large injectors.\n " + . += " It can hold [capacity_small_injector] small and [capacity_large_injector] large injectors respectively.\n " + . += " \The [src] contains [src.count_plastic] units of plastic. It can hold up to [capacity_plastic] units.\n " if(!(stat & (NOPOWER|BROKEN))) - . += "The status display reads:\n" + . += "The status display reads the following reagents:\n" if(beaker) for(var/datum/reagent/R in beaker.reagents.reagent_list) . += "- [R.volume] units of [R.name]." @@ -128,63 +161,121 @@ user.put_in_hands(beaker) else beaker.forceMove(drop_location()) - beaker = null + src.beaker = null update_icon() + + if("small injector") + var/material = tgui_input_list(user, "Use autoinjector storage, or mold new injectors to fill?", "Choose Material", list("mold plastic", "use injectors")) + switch(material) + if("mold plastic") + if(src.count_plastic < cost_plastic_small) + to_chat(user, SPAN_WARNING("Not enough plastic! Need at least [cost_plastic_small] units.")) + return + if("use injectors") + if(!src.count_small_injector) + to_chat(user, SPAN_WARNING("Small injector rack is empty!")) + return if(!beaker.reagents.total_volume) to_chat(user, SPAN_WARNING("Chemical storage is empty!")) return - if(!src.capacity_small_injector) - to_chat(user, SPAN_WARNING("Small injector rack is empty!!")) - return var/injector_amount = tgui_input_number(user, "How many injectors would you like?", "Make small injectors", 0, 100, 0, 0, TRUE) if(injector_amount > 0) - - if(src.count_small_injector < injector_amount ) - to_chat(user, SPAN_WARNING("Not enough autoinjectors! You only have [src.count_small_injector]")) - return + switch(material) + if("mold plastic") + var/plastic_cost = cost_plastic_small * injector_amount + if(src.count_plastic < plastic_cost) + to_chat(user, SPAN_WARNING("Not enough plastic! Need at least [plastic_cost] units.")) + return + if("use injectors") + if(src.count_small_injector < injector_amount) + to_chat(user, SPAN_WARNING("Not enough autoinjectors! You only have [src.count_small_injector]")) + return var/name = sanitize(tgui_input_text(user, "Name Injector", "Naming", null, 32, 0, 0, 0, 0),MAX_MESSAGE_LEN,0,0,0) - make_injector("large injector", injector_amount, name) + make_injector("large injector", injector_amount, name, material, user) update_icon() + + if("large injector") + var/material = tgui_input_list(user, "Use autoinjector storage, or mold new injectors to fill?", "Choose Material", list("mold plastic", "use injectors")) + switch(material) + if("mold plastic") + if(src.count_plastic < cost_plastic_large) + to_chat(user, SPAN_WARNING("Not enough plastic! Need at least [cost_plastic_large] units.")) + return + if("use injectors") + if(!src.count_large_injector) + to_chat(user, SPAN_WARNING("Large injector rack is empty!")) + return if(!beaker.reagents.total_volume) to_chat(user, SPAN_WARNING("Chemical storage is empty!")) return - if(!src.capacity_large_injector) - to_chat(user, SPAN_WARNING("Large injector rack is empty!")) - return - var/injector_amount = tgui_input_number(user, "How many injectors would you like?", "Make small injectors", 0, 100, 0, 0, TRUE) + var/injector_amount = tgui_input_number(user, "How many injectors would you like?", "Make large injectors", 0, 100, 0, 0, TRUE) if(injector_amount > 0) - if(src.count_large_injector < injector_amount) - to_chat(user, SPAN_WARNING("Not enough autoinjectors! You only have [src.count_large_injector]")) - return + switch(material) + if("mold plastic") + var/plastic_cost = cost_plastic_large * injector_amount + if(src.count_plastic < plastic_cost) + to_chat(user, SPAN_WARNING("Not enough plastic! Need at least [plastic_cost] units.")) + return + if("use injectors") + if(src.count_large_injector < injector_amount) + to_chat(user, SPAN_WARNING("Not enough autoinjectors! You only have [src.count_large_injector]")) + return var/name = sanitize(tgui_input_text(user, "Name Injector", "Naming", null, 32, 0, 0, 0, 0),MAX_MESSAGE_LEN,0,0,0) - make_injector("large injector", injector_amount, name) + make_injector("large injector", injector_amount, name, material,user) update_icon() -/obj/machinery/injector_maker/proc/make_injector(var/size, var/amount, var/new_name) + +/obj/machinery/injector_maker/proc/make_injector(var/size, var/amount, var/new_name, var/material, mob/user as mob) if(!beaker) return + var/amount_per_injector = null + var/proceed = "Yes" //Defaulting to Yes. We only check if the amount/injector gets under max volume + switch(size) + if("small injector") + amount_per_injector = CLAMP(beaker.reagents.total_volume / amount, 0, 5) + if("large injector") + amount_per_injector = CLAMP(beaker.reagents.total_volume / amount, 0, 15) + if((size == "small injector" && amount_per_injector < 5) || size == "large injector" && amount_per_injector < 15) + proceed = tgui_alert(usr, "Heads up! Less than max volume per injector!\n Making [amount] [size](s) filled with [amount_per_injector] total reagent volume each!","Proceed?",list("No","Yes")) + if(proceed == "No" || !amount_per_injector) + return for(var/i, i < amount, i++) switch(size) if("small injector") - var/amount_per_injector = CLAMP(beaker.reagents.total_volume / amount, 0, 15) - if(!amount_per_injector || src.count_small_injector < 1) - return + switch(material) + if("mold plastic") + if(src.count_plastic < cost_plastic_small) + return + else + src.count_plastic = src.count_plastic - cost_plastic_small + if("use injectors") + if(!src.count_small_injector) + return + else + src.count_small_injector = src.count_small_injector - 1 var/obj/item/weapon/reagent_containers/hypospray/autoinjector/empty/P = new(loc) beaker.reagents.trans_to_obj(P, amount_per_injector) P.update_icon() if(new_name) P.name = new_name - src.count_small_injector = src.count_small_injector - 1 + if("large injector") - var/amount_per_injector = CLAMP(beaker.reagents.total_volume / amount, 0, 15) - if(!amount_per_injector || src.count_large_injector < 1) - return + switch(material) + if("mold plastic") + if(src.count_plastic < cost_plastic_large) + return + else + src.count_plastic = src.count_plastic - cost_plastic_large + if("use injectors") + if(!src.count_large_injector) + return + else + src.count_large_injector = src.count_large_injector - 1 var/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/empty/P = new(loc) beaker.reagents.trans_to_obj(P, amount_per_injector) P.update_icon() if(new_name) P.name = new_name - src.count_large_injector = src.count_large_injector - 1 diff --git a/icons/obj/chemical_vr.dmi b/icons/obj/chemical_vr.dmi index 60033a8be59c99acdea818bbbb34bfdca0320f2a..f6669126d83d02554416602de31d15d150bb8416 100644 GIT binary patch literal 2978 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 a`{G-T{$wu~LMrpi3v{#%v?{LHMf@8rk7HK= diff --git a/maps/groundbase/gb-z2.dmm b/maps/groundbase/gb-z2.dmm index ae7d63e490..27353d94d0 100644 --- a/maps/groundbase/gb-z2.dmm +++ b/maps/groundbase/gb-z2.dmm @@ -2739,6 +2739,9 @@ /obj/machinery/light{ dir = 8 }, +/obj/machinery/injector_maker{ + pixel_x = -29 + }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/Chemistry) "hK" = ( @@ -14968,7 +14971,9 @@ dir = 1 }, /obj/structure/table/glass, -/obj/machinery/injector_maker, +/obj/machinery/injector_maker{ + pixel_y = -31 + }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/triage) "QG" = ( diff --git a/maps/stellar_delight/stellar_delight2.dmm b/maps/stellar_delight/stellar_delight2.dmm index 4f0a17dcb5..95df34bba2 100644 --- a/maps/stellar_delight/stellar_delight2.dmm +++ b/maps/stellar_delight/stellar_delight2.dmm @@ -4177,6 +4177,9 @@ /obj/item/weapon/reagent_containers/glass/beaker/large, /obj/item/weapon/reagent_containers/dropper, /obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/injector_maker{ + pixel_y = 21 + }, /turf/simulated/floor/tiled/eris/white/bluecorner, /area/medical/chemistry) "jg" = ( @@ -4436,10 +4439,6 @@ /area/stellardelight/deck2/fore) "jK" = ( /obj/structure/table/glass, -/obj/machinery/camera/network/medbay{ - dir = 4 - }, -/obj/machinery/injector_maker, /turf/simulated/floor/tiled/eris/white/bluecorner, /area/stellardelight/deck2/triage) "jL" = ( @@ -22227,6 +22226,9 @@ /obj/machinery/camera/network/medbay{ dir = 8 }, +/obj/machinery/injector_maker{ + pixel_x = 29 + }, /turf/simulated/floor/tiled/eris/white/bluecorner, /area/stellardelight/deck2/triage) "WZ" = ( diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm index d0b165b892..dc4620fa0a 100644 --- a/maps/tether/tether-03-surface3.dmm +++ b/maps/tether/tether-03-surface3.dmm @@ -407,8 +407,6 @@ dir = 6 }, /obj/machinery/camera/network/medbay, -/obj/structure/table/glass, -/obj/machinery/injector_maker, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "aaJ" = ( @@ -5331,6 +5329,9 @@ pixel_x = -4; pixel_y = 5 }, +/obj/machinery/injector_maker{ + pixel_x = -27 + }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "ahP" = ( @@ -7071,8 +7072,8 @@ /obj/machinery/light{ dir = 4 }, -/obj/structure/sign/poster{ - dir = 4 +/obj/machinery/injector_maker{ + pixel_x = 28 }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/chemistry)