diff --git a/code/modules/casino/premium_dispenser.dm b/code/modules/casino/premium_dispenser.dm index b8ab3a62b9..62a07a45e7 100644 --- a/code/modules/casino/premium_dispenser.dm +++ b/code/modules/casino/premium_dispenser.dm @@ -8,8 +8,8 @@ icon = 'icons/obj/casino.dmi' icon_state = "premiumdispenser" ui_title = "Premium Drink Dispensary" - accept_drinking = 1 - var/max_cartridges = 90 + accept_drinking = TRUE + max_cartridges = 90 import_job = null /obj/machinery/chemical_dispenser/premium/full diff --git a/code/modules/reagents/machinery/dispenser/dispenser2.dm b/code/modules/reagents/machinery/dispenser/dispenser2.dm index 6c297c9b20..552984c075 100644 --- a/code/modules/reagents/machinery/dispenser/dispenser2.dm +++ b/code/modules/reagents/machinery/dispenser/dispenser2.dm @@ -12,12 +12,13 @@ var/ui_title = "Chemical Dispenser" - var/accept_drinking = 0 + ///If the dispenser is a drink dispenser. Used for update_icon() to prevent beakers from being displayed. + var/accept_drinking = FALSE var/amount = 30 - var/max_catriges = 30 + var/max_cartridges = 30 use_power = USE_POWER_IDLE - idle_power_usage = 100 + idle_power_usage = 0.1 KILOWATTS anchored = TRUE unacidable = TRUE @@ -31,20 +32,63 @@ . = ..() if(spawn_cartridges) for(var/type in spawn_cartridges) - add_cartridge(new type(src)) + add_cartridge(new type(src), forced = TRUE) AddElement(/datum/element/rotatable) /obj/machinery/chemical_dispenser/examine(mob/user) . = ..() - . += "It has [cartridges.len] cartridges installed, and has space for [max_catriges - cartridges.len] more." + . += "It has [cartridges.len] cartridges installed, and has space for [max_cartridges - cartridges.len] more." + . += "It'll take a prying tool to retrieve installed cartridges." + +/obj/machinery/chemical_dispenser/update_icon() + if(accept_drinking) //drink dispensors don't have fancy sprites, so this is a very handy checker + icon_state = initial(icon_state) //just in case some weirdness happens I guess. + return + + cut_overlays() + icon_state = initial(icon_state) + if(panel_open) + add_overlay("[initial(icon_state)]_panel-o") + if(container) + icon_state = "[initial(icon_state)]_working" + if(istype(container, /obj/item/reagent_containers/glass/beaker/bluespace)) + add_overlay("[initial(icon_state)]_bsbeaker") + if(istype(container, /obj/item/reagent_containers/glass/beaker/noreact)) + add_overlay("[initial(icon_state)]_nrbeaker") + else //the only see-through one gets filling updates, and we can only do glass and subtypes of glass anyway. + var/obj/item/reagent_containers/glass/C = container + if(C.reagents && C.reagents.total_volume) + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[initial(icon_state)]_1") + var/percent = round((C.reagents.total_volume / C.volume) * 100) + switch(percent) + if(0 to 1) filling.icon_state = "nofill" + if(2 to 35) filling.icon_state = "[initial(icon_state)]_1" + if(36 to 74) filling.icon_state = "[initial(icon_state)]_5" + if(75 to INFINITY) filling.icon_state = "[initial(icon_state)]_10" + filling.color = C.reagents.get_color() + //Add our filling, if any. + add_overlay(filling) + //Then overlay the beaker atop of the filling, so it appears behind it. + add_overlay("[initial(icon_state)]_beaker") + + if(stat & NOPOWER) + icon_state = "[initial(icon_state)]_nopower" + + if(stat & BROKEN) + icon_state = "[initial(icon_state)]_broken" + return + +/obj/machinery/chemical_dispenser/proc/add_cartridge(obj/item/reagent_containers/chem_disp_cartridge/C, mob/user, forced = FALSE) + if(!panel_open && !forced) + to_chat(user, span_warning("You need to open the access hatch first!")) + return -/obj/machinery/chemical_dispenser/proc/add_cartridge(obj/item/reagent_containers/chem_disp_cartridge/C, mob/user) if(!istype(C)) if(user) to_chat(user, span_warning("\The [C] will not fit in \the [src]!")) return - if(cartridges.len >= max_catriges) + if(cartridges.len >= max_cartridges) if(user) to_chat(user, span_warning("\The [src] does not have any slots open for \the [C] to fit into!")) return @@ -63,7 +107,7 @@ user.drop_from_inventory(C) to_chat(user, span_notice("You add \the [C] to \the [src].")) - C.loc = src + C.forceMove(src) cartridges[C.label] = C cartridges = sortAssoc(cartridges) SStgui.update_uis(src) @@ -74,31 +118,27 @@ SStgui.update_uis(src) /obj/machinery/chemical_dispenser/attackby(obj/item/W, mob/user) - if(W.has_tool_quality(TOOL_WRENCH)) - playsound(src, W.usesound, 50, 1) - to_chat(user, span_notice("You begin to [anchored ? "un" : ""]fasten \the [src].")) - if (do_after(user, 2 SECONDS * W.toolspeed, target = src)) - user.visible_message( - span_notice("\The [user] [anchored ? "un" : ""]fastens \the [src]."), - span_notice("You have [anchored ? "un" : ""]fastened \the [src]."), - "You hear a ratchet.") - anchored = !anchored - else - to_chat(user, span_notice("You decide not to [anchored ? "un" : ""]fasten \the [src].")) + if(default_unfasten_wrench(user, W, 5 SECONDS)) + return - else if(istype(W, /obj/item/reagent_containers/chem_disp_cartridge)) + if(istype(W, /obj/item/reagent_containers/chem_disp_cartridge)) add_cartridge(W, user) - else if(W.has_tool_quality(TOOL_SCREWDRIVER)) - var/label = tgui_input_list(user, "Which cartridge would you like to remove?", "Chemical Dispenser", cartridges) - if(!label) return - var/obj/item/reagent_containers/chem_disp_cartridge/C = remove_cartridge(label) - if(C) - to_chat(user, span_notice("You remove \the [C] from \the [src].")) - C.loc = loc - playsound(src, W.usesound, 50, 1) + if(default_deconstruction_screwdriver(user, W)) + update_icon() //open the hatch! + return - else if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food)) + if(panel_open) + if(W.has_tool_quality(TOOL_CROWBAR)) //I would make the deconstructable, but the cartridge system makes this... unwise. + var/label = tgui_input_list(user, "Which cartridge would you like to remove?", "Chemical Dispenser", cartridges) + if(!label || !Adjacent(user)) return + var/obj/item/reagent_containers/chem_disp_cartridge/C = remove_cartridge(label) + if(C) + to_chat(user, span_notice("You remove [C] from [src].")) + C.forceMove(get_turf(src)) + playsound(src, W.usesound, 50, 1) + + if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food)) if(container) to_chat(user, span_warning("There is already \a [container] on \the [src]!")) return @@ -117,13 +157,30 @@ to_chat(user, span_warning("You don't see how \the [RC] could fit into \the [src].")) return - container = RC - user.drop_from_inventory(RC) - RC.loc = src + replace_container(user, RC) to_chat(user, span_notice("You set \the [RC] on \the [src].")) + update_icon() else return ..() +/obj/machinery/chemical_dispenser/click_alt(mob/user) + if(container) + replace_container(user, null) + +/obj/machinery/chemical_dispenser/proc/replace_container(mob/living/user, obj/item/reagent_containers/new_container) + if(container) + container.forceMove(drop_location()) + if(user && Adjacent(user)) + user.put_in_hands(container) + if(new_container) + if(user && Adjacent(user)) + user.drop_from_inventory(new_container, src) + container = new_container + else + container = null + update_icon() + return TRUE + /obj/machinery/chemical_dispenser/tgui_interact(mob/user, datum/tgui/ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -181,6 +238,7 @@ var/obj/item/reagent_containers/chem_disp_cartridge/C = cartridges[label] playsound(src, 'sound/machines/reagent_dispense.ogg', 25, 1) C.reagents.trans_to(container, amount) + update_icon() . = TRUE if("remove") @@ -193,15 +251,12 @@ R.remove_reagent(id, amount) else if(amount == -1) // Isolate R.isolate_reagent(id) + update_icon() . = TRUE if("ejectBeaker") - if(container) - container.forceMove(get_turf(src)) - if(Adjacent(ui.user)) // So the AI doesn't get a beaker somehow. - ui.user.put_in_hands(container) - container = null - . = TRUE + replace_container(ui.user) + . = TRUE //no afterattack if("import_config") /* CHOMPRemve Start, skip the import_job check diff --git a/code/modules/reagents/machinery/dispenser/dispenser_presets.dm b/code/modules/reagents/machinery/dispenser/dispenser_presets.dm index e6de7d6b8b..424f6fc510 100644 --- a/code/modules/reagents/machinery/dispenser/dispenser_presets.dm +++ b/code/modules/reagents/machinery/dispenser/dispenser_presets.dm @@ -63,7 +63,7 @@ desc = "A soda machine." icon_state = "soda_dispenser" ui_title = "Soda Dispenser" - accept_drinking = 1 + accept_drinking = TRUE import_job = JOB_BARTENDER /obj/machinery/chemical_dispenser/bar_soft/full @@ -95,7 +95,7 @@ desc = "A beer machine. Like a soda machine, but more fun!" icon_state = "booze_dispenser" ui_title = "Booze Dispenser" - accept_drinking = 1 + accept_drinking = TRUE import_job = JOB_BARTENDER /obj/machinery/chemical_dispenser/bar_alc/full @@ -128,7 +128,7 @@ desc = "Driving crack dealers out of employment since 2280." icon_state = "coffee_dispenser" ui_title = "Coffee Dispenser" - accept_drinking = 1 + accept_drinking = TRUE import_job = JOB_BARTENDER /obj/machinery/chemical_dispenser/bar_coffee/full @@ -161,7 +161,7 @@ desc = "Allow your customers to test your patience to the extremes." icon_state = "syrup_dispenser" ui_title = "Syrup Dispenser" - accept_drinking = 1 + accept_drinking = TRUE /obj/machinery/chemical_dispenser/bar_syrup/full spawn_cartridges = list( diff --git a/code/modules/reagents/machinery/dispenser/dispenser_presets_vr.dm b/code/modules/reagents/machinery/dispenser/dispenser_presets_vr.dm index a4f48c6e8f..2df4a6d6a8 100644 --- a/code/modules/reagents/machinery/dispenser/dispenser_presets_vr.dm +++ b/code/modules/reagents/machinery/dispenser/dispenser_presets_vr.dm @@ -1,5 +1,6 @@ /obj/machinery/chemical_dispenser/xenoflora name = "xenoflora chem dispenser" + icon_state = "minidispenser" ui_title = "Xenoflora Chemical Dispenser" dispense_reagents = list( REAGENT_ID_WATER, REAGENT_ID_SUGAR, REAGENT_ID_ETHANOL, REAGENT_ID_RADIUM, REAGENT_ID_AMMONIA, REAGENT_ID_DIETHYLAMINE, REAGENT_ID_PLANTBGONE, REAGENT_ID_MUTAGEN, REAGENT_ID_CALCIUM @@ -21,6 +22,7 @@ /obj/machinery/chemical_dispenser/biochemistry name = "bioproduct dispenser" + icon_state = "minidispenser" ui_title = "Bioproduct Dispenser" dispense_reagents = list( REAGENT_ID_NUTRIMENT, REAGENT_ID_PROTEIN, REAGENT_ID_MILK diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 4dfec34e06..5355ae6b9d 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 ad545f692f..e9be836619 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/maps/redgate/fantasy_items.dm b/maps/redgate/fantasy_items.dm index 3ec9950431..81ddb2b52c 100644 --- a/maps/redgate/fantasy_items.dm +++ b/maps/redgate/fantasy_items.dm @@ -262,7 +262,7 @@ desc = "A kettle used for making hot drinks." icon_state = "kettle" ui_title = "kettle" - accept_drinking = 1 + accept_drinking = TRUE import_job = null /obj/machinery/chemical_dispenser/kettle/full diff --git a/modular_chomp/code/modules/casino/casino_machines.dm b/modular_chomp/code/modules/casino/casino_machines.dm index 8eafc37c81..bd7da65f4a 100644 --- a/modular_chomp/code/modules/casino/casino_machines.dm +++ b/modular_chomp/code/modules/casino/casino_machines.dm @@ -5,7 +5,7 @@ icon_state = "deluxe_dispenser" ui_title = "Deluxe Drink Dispenser" accept_drinking = 1 - max_catriges = 90 //Because it keeps getting borked by upstream, now gotta do it with variable until we can make more permanent solution - Jack + max_cartridges = 90 //Because it keeps getting borked by upstream, now gotta do it with variable until we can make more permanent solution - Jack /obj/machinery/chemical_dispenser/deluxe