diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 6aad6f5c4ee..cc1f8b12a86 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -1797,6 +1797,16 @@ /obj/item/stock_parts/water_recycler = 1) category = CAT_STRUCTURE +/datum/crafting_recipe/coffee_cartridge + name = "Bootleg Coffee Cartridge" + result = /obj/item/coffee_cartridge/bootleg + time = 2 SECONDS + reqs = list( + /obj/item/blank_coffee_cartridge = 1, + /datum/reagent/toxin/coffeepowder = 10, + ) + category = CAT_MISC + /datum/crafting_recipe/toiletbong name = "Toiletbong" category = CAT_STRUCTURE diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index d52819bab5a..934e055292f 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -1362,3 +1362,15 @@ /obj/item/stack/sheet/plasteel = 5, /obj/item/stock_parts/scanning_module = 4, ) + +/obj/item/circuitboard/machine/coffeemaker + name = "Coffeemaker (Machine Board)" + greyscale_colors = CIRCUIT_COLOR_SERVICE + build_path = /obj/machinery/coffeemaker + req_components = list( + /obj/item/stack/sheet/glass = 1, + /obj/item/reagent_containers/cup/beaker = 2, + /obj/item/stock_parts/water_recycler = 1, + /obj/item/stock_parts/capacitor = 1, + /obj/item/stock_parts/micro_laser = 1, + ) diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index f87276a66b7..940b1e5a6d4 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -233,3 +233,33 @@ desc = "When the standard variety is not good enough for you." cost = PAYCHECK_CREW contains = list(/obj/item/bait_can/worm/premium) + +/datum/supply_pack/goody/coffee_mug + name = "Coffee Mug" + desc = "A bog standard coffee mug, for drinking coffee." + cost = PAYCHECK_LOWER + contains = list(/obj/item/reagent_containers/cup/glass/mug) + +/datum/supply_pack/goody/nt_mug + name = "Nanotrasen Coffee Mug" + desc = "A blue mug bearing the logo of your corporate masters. Usually given out at inductions or events, we'll send one out special for a nominal fee." + cost = PAYCHECK_LOWER + contains = list(/obj/item/reagent_containers/cup/glass/mug/nanotrasen) + +/datum/supply_pack/goody/coffee_cartridge + name = "Coffee Cartridge" + desc = "A basic cartridge for a coffeemaker. Makes 4 pots." + cost = PAYCHECK_LOWER + contains = list(/obj/item/coffee_cartridge) + +/datum/supply_pack/goody/coffee_cartridge_fancy + name = "Fancy Coffee Cartridge" + desc = "A fancy cartridge for a coffeemaker. Makes 4 pots." + cost = PAYCHECK_CREW + contains = list(/obj/item/coffee_cartridge/fancy) + +/datum/supply_pack/goody/coffeepot + name = "Coffeepot" + desc = "A standard-sized coffeepot, for use with a coffeemaker." + cost = PAYCHECK_CREW + contains = list(/obj/item/reagent_containers/cup/coffeepot) diff --git a/code/modules/reagents/chemistry/machinery/coffeemaker.dm b/code/modules/reagents/chemistry/machinery/coffeemaker.dm new file mode 100644 index 00000000000..b8529400d0b --- /dev/null +++ b/code/modules/reagents/chemistry/machinery/coffeemaker.dm @@ -0,0 +1,401 @@ +/obj/machinery/coffeemaker + name = "coffeemaker" + desc = "A Modello 3 Coffeemaker that brews coffee and holds it at the perfect temperature of 176 fahrenheit. Made by Piccionaia Home Appliances." + icon = 'icons/obj/chemical.dmi' + icon_state = "coffeemaker" + base_icon_state = "coffeemaker" + resistance_flags = FIRE_PROOF | ACID_PROOF + circuit = /obj/item/circuitboard/machine/coffeemaker + pixel_y = 4 //needed to make it sit nicely on tables + var/obj/item/reagent_containers/cup/coffeepot/coffeepot = null + var/brewing = FALSE + var/brew_time = 20 SECONDS + var/speed = 1 + /// The coffee cartridge to make coffee from. In the future, coffee grounds are like printer ink. + var/obj/item/coffee_cartridge/cartridge = null + /// The type path to instantiate for the coffee cartridge the device initially comes with, eg. /obj/item/coffee_cartridge + var/initial_cartridge = /obj/item/coffee_cartridge + /// The number of cups left + var/coffee_cups = 20 + /// The amount of sugar packets left + var/sugar_packs = 20 + /// The amount of sweetener packets left + var/sweetener_packs = 20 + /// The amount of creamer packets left + var/creamer_packs = 20 + + var/static/radial_examine = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_examine") + var/static/radial_brew = image(icon = 'icons/hud/radial_coffee.dmi', icon_state = "radial_brew") + var/static/radial_eject_pot = image(icon = 'icons/hud/radial_coffee.dmi', icon_state = "radial_eject_pot") + var/static/radial_eject_cartridge = image(icon = 'icons/hud/radial_coffee.dmi', icon_state = "radial_eject_cartridge") + var/static/radial_take_cup = image(icon = 'icons/hud/radial_coffee.dmi', icon_state = "radial_take_cup") + var/static/radial_take_sugar = image(icon = 'icons/hud/radial_coffee.dmi', icon_state = "radial_take_sugar") + var/static/radial_take_sweetener = image(icon = 'icons/hud/radial_coffee.dmi', icon_state = "radial_take_sweetener") + var/static/radial_take_creamer = image(icon = 'icons/hud/radial_coffee.dmi', icon_state = "radial_take_creamer") + +/obj/machinery/coffeemaker/Initialize(mapload) + . = ..() + if(mapload) + coffeepot = new /obj/item/reagent_containers/cup/coffeepot(src) + cartridge = new /obj/item/coffee_cartridge(src) + +/obj/machinery/coffeemaker/deconstruct() + coffeepot?.forceMove(drop_location()) + cartridge?.forceMove(drop_location()) + return ..() + +/obj/machinery/coffeemaker/Destroy() + QDEL_NULL(coffeepot) + QDEL_NULL(cartridge) + return ..() + +/obj/machinery/coffeemaker/Exited(atom/movable/gone, direction) + if(gone == coffeepot) + coffeepot = null + if(gone == cartridge) + cartridge = null + return ..() + +/obj/machinery/coffeemaker/RefreshParts() + . = ..() + speed = 0 + for(var/obj/item/stock_parts/micro_laser/laser in component_parts) + speed += laser.rating + +/obj/machinery/coffeemaker/examine(mob/user) + . = ..() + if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) + . += span_warning("You're too far away to examine [src]'s contents and display!") + return + + if(brewing) + . += span_warning("\The [src] is brewing.") + return + + if(panel_open) + . += span_notice("[src]'s maintenance hatch is open!") + return + + if(coffeepot || cartridge) + . += span_notice("\The [src] contains:") + if(coffeepot) + . += span_notice("- \A [coffeepot].") + if(cartridge) + . += span_notice("- \A [cartridge].") + + if(!(machine_stat & (NOPOWER|BROKEN))) + . += "[span_notice("The status display reads:")]\n"+\ + span_notice("- Brewing coffee at [speed*100]%.") + if(coffeepot) + for(var/datum/reagent/consumable/cawfee as anything in coffeepot.reagents.reagent_list) + . += span_notice("- [cawfee.volume] units of coffee in pot.") + if(cartridge) + if(cartridge.charges < 1) + . += span_notice("- grounds cartridge is empty.") + else + . += span_notice("- grounds cartridge has [cartridge.charges] charges remaining.") + + if (coffee_cups >= 1) + . += span_notice("There [coffee_cups == 1 ? "is" : "are"] [coffee_cups] coffee cup[coffee_cups != 1 && "s"] left.") + else + . += span_notice("There are no cups left.") + + if (sugar_packs >= 1) + . += span_notice("There [sugar_packs == 1 ? "is" : "are"] [sugar_packs] packet[sugar_packs != 1 && "s"] of sugar left.") + else + . += span_notice("There is no sugar left.") + + if (sweetener_packs >= 1) + . += span_notice("There [sweetener_packs == 1 ? "is" : "are"] [sweetener_packs] packet[sweetener_packs != 1 && "s"] of sweetener left.") + else + . += span_notice("There is no sweetener left.") + + if (creamer_packs > 1) + . += span_notice("There [creamer_packs == 1 ? "is" : "are"] [creamer_packs] packet[creamer_packs != 1 && "s"] of creamer left.") + else + . += span_notice("There is no creamer left.") + +/obj/machinery/coffeemaker/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(!can_interact(user) || !user.canUseTopic(src, !issilicon(user), FALSE, NO_TK)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(brewing) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + replace_pot(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/coffeemaker/attack_robot_secondary(mob/user, list/modifiers) + return attack_hand_secondary(user, modifiers) + +/obj/machinery/coffeemaker/attack_ai_secondary(mob/user, list/modifiers) + return attack_hand_secondary(user, modifiers) + +/obj/machinery/coffeemaker/handle_atom_del(atom/A) + . = ..() + if(A == coffeepot) + coffeepot = null + if(A == cartridge) + cartridge = null + update_appearance() + +/obj/machinery/coffeemaker/update_icon_state() + icon_state = "[base_icon_state][!!coffeepot][!!cartridge]" + return ..() + +/obj/machinery/coffeemaker/proc/replace_pot(mob/living/user, obj/item/reagent_containers/cup/coffeepot/new_coffeepot) + if(!user) + return FALSE + if(coffeepot) + try_put_in_hand(coffeepot, user) + if(new_coffeepot) + coffeepot = new_coffeepot + update_appearance() + return TRUE + +/obj/machinery/coffeemaker/proc/replace_cartridge(mob/living/user, obj/item/coffee_cartridge/new_cartridge) + if(!user) + return FALSE + if(cartridge) + try_put_in_hand(cartridge, user) + if(new_cartridge) + cartridge = new_cartridge + update_appearance() + return TRUE + +/obj/machinery/coffeemaker/wrench_act(mob/living/user, obj/item/tool) + . = ..() + default_unfasten_wrench(user, tool) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/coffeemaker/attackby(obj/item/attack_item, mob/living/user, params) + //You can only screw open empty grinder + if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item)) + return + + if(default_deconstruction_crowbar(attack_item)) + return + + if(panel_open) //Can't insert objects when its screwed open + return TRUE + + if (istype(attack_item, /obj/item/reagent_containers/cup/coffeepot) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container()) + var/obj/item/reagent_containers/cup/coffeepot/new_pot = attack_item + . = TRUE //no afterattack + if(!user.transferItemToLoc(new_pot, src)) + return TRUE + replace_pot(user, new_pot) + balloon_alert(user, "added pot") + update_appearance() + return TRUE //no afterattack + + if (istype(attack_item, /obj/item/coffee_cartridge) && !(attack_item.item_flags & ABSTRACT)) + var/obj/item/coffee_cartridge/new_cartridge = attack_item + . = TRUE //no afterattack + if(!user.transferItemToLoc(new_cartridge, src)) + return TRUE + replace_cartridge(user, new_cartridge) + balloon_alert(user, "added cartridge") + update_appearance() + return TRUE //no afterattack + +/obj/machinery/coffeemaker/ui_interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave //I am positively certain that this is not a microwave + . = ..() + + if(brewing || !user.canUseTopic(src, !issilicon(user))) + return + + var/list/options = list() + + if(coffeepot) + options["Eject Pot"] = radial_eject_pot + + if(cartridge) + options["Eject Cartridge"] = radial_eject_cartridge + + if(coffeepot && cartridge && cartridge.charges > 0) + options["Brew"] = radial_brew + + if(coffee_cups > 0) + options["Take Cup"] = radial_take_cup + + if(sugar_packs > 0) + options["Take Sugar"] = radial_take_sugar + + if(sweetener_packs > 0) + options["Take Sweetener"] = radial_take_sweetener + + if(creamer_packs > 0) + options["Take Creamer"] = radial_take_creamer + + if(isAI(user)) + if(machine_stat & NOPOWER) + return + options["Examine"] = radial_examine + + var/choice + + if(length(options) < 1) + return + if(length(options) == 1) + choice = options[1] + else + choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) + + // post choice verification + if(brewing || (isAI(user) && machine_stat & NOPOWER) || !user.canUseTopic(src, !issilicon(user))) + return + + switch(choice) + if("Brew") + brew(user) + if("Eject Pot") + eject_pot(user) + if("Eject Cartridge") + eject_cartridge(user) + if("Examine") + examine(user) + if("Take Cup") + take_cup(user) + if("Take Sugar") + take_sugar(user) + if("Take Sweetener") + take_sweetener(user) + if("Take Creamer") + take_creamer(user) + +/obj/machinery/coffeemaker/proc/eject_pot(mob/user) + if(coffeepot) + replace_pot(user) + +/obj/machinery/coffeemaker/proc/eject_cartridge(mob/user) + if(cartridge) + replace_cartridge(user) + +/obj/machinery/coffeemaker/proc/take_cup(mob/user) + if(!coffee_cups) //shouldn't happen, but we all know how stuff manages to break + balloon_alert("no cups left!") + return + balloon_alert_to_viewers("took cup") + var/obj/item/reagent_containers/cup/glass/coffee_cup/new_cup = new(get_turf(src)) + user.put_in_hands(new_cup) + coffee_cups-- + +/obj/machinery/coffeemaker/proc/take_sugar(mob/user) + if(!sugar_packs) + balloon_alert("no sugar left!") + return + balloon_alert_to_viewers("took sugar packet") + var/obj/item/reagent_containers/condiment/pack/sugar/new_pack = new(get_turf(src)) + user.put_in_hands(new_pack) + sugar_packs-- + +/obj/machinery/coffeemaker/proc/take_sweetener(mob/user) + if(!sweetener_packs) + balloon_alert("no sweetener left!") + return + balloon_alert_to_viewers("took sweetener packet") + var/obj/item/reagent_containers/condiment/pack/astrotame/new_pack = new(get_turf(src)) + user.put_in_hands(new_pack) + sweetener_packs-- + +/obj/machinery/coffeemaker/proc/take_creamer(mob/user) + if(!creamer_packs) + balloon_alert("no creamer left!") + return + balloon_alert_to_viewers("took creamer packet") + var/obj/item/reagent_containers/condiment/pack/creamer/new_pack = new(get_turf(src)) + user.put_in_hands(new_pack) + creamer_packs-- + +/obj/machinery/coffeemaker/proc/operate_for(time, silent = FALSE) + brewing = TRUE + if(!silent) + playsound(src, 'sound/machines/coffeemaker_brew.ogg', 20, vary = TRUE) + use_power(active_power_usage * time * 0.1) // .1 needed here to convert time (in deciseconds) to seconds such that watts * seconds = joules + addtimer(CALLBACK(src, .proc/stop_operating), time / speed) + +/obj/machinery/coffeemaker/proc/stop_operating() + brewing = FALSE + +/obj/machinery/coffeemaker/proc/brew() + power_change() + if(!coffeepot || machine_stat & (NOPOWER|BROKEN) || coffeepot.reagents.total_volume >= coffeepot.reagents.maximum_volume) + return + operate_for(brew_time) + coffeepot.reagents.add_reagent_list(cartridge.drink_type) + cartridge.charges-- + +//Coffee Cartridges: like toner, but for your coffee! +/obj/item/coffee_cartridge + name = "coffeemaker cartridge- Caffè Generico" + desc = "A coffee cartridge manufactured by Piccionaia Coffee, for use with the Modello 3 system." + icon = 'icons/obj/food/food.dmi' + icon_state = "cartridge_basic" + var/charges = 4 + var/list/drink_type = list(/datum/reagent/consumable/coffee = 120) + +/obj/item/coffee_cartridge/examine(mob/user) + . = ..() + if(charges) + . += span_warning("The cartridge has [charges] portions of grounds remaining.") + else + . += span_warning("The cartridge has no unspent grounds remaining.") + +/obj/item/coffee_cartridge/fancy + name = "coffeemaker cartridge - Caffè Fantasioso" + desc = "A fancy coffee cartridge manufactured by Piccionaia Coffee, for use with the Modello 3 system." + icon_state = "cartridge_blend" + +//Here's the joke before I get 50 issue reports: they're all the same, and that's intentional +/obj/item/coffee_cartridge/fancy/Initialize(mapload) + . = ..() + var/coffee_type = pick("blend", "blue_mountain", "kilimanjaro", "mocha") + switch(coffee_type) + if("blend") + name = "coffeemaker cartridge - Miscela di Piccione" + icon_state = "cartridge_blend" + if("blue_mountain") + name = "coffeemaker cartridge - Montagna Blu" + icon_state = "cartridge_blue_mtn" + if("kilimanjaro") + name = "coffeemaker cartridge - Kilimangiaro" + icon_state = "cartridge_kilimanjaro" + if("mocha") + name = "coffeemaker cartridge - Moka Arabica" + icon_state = "cartridge_mocha" + +/obj/item/coffee_cartridge/decaf + name = "coffeemaker cartridge - Caffè Decaffeinato" + desc = "A decaf coffee cartridge manufactured by Piccionaia Coffee, for use with the Modello 3 system." + icon_state = "cartridge_decaf" + +// no you can't just squeeze the juice bag into a glass! +/obj/item/coffee_cartridge/bootleg + name = "coffeemaker cartridge - Botany Blend" + desc = "A jury-rigged coffee cartridge. Should work with a Modello 3 system, though it might void the warranty." + icon_state = "cartridge_bootleg" + +// blank cartridge for crafting's sake, can be made at the service lathe +/obj/item/blank_coffee_cartridge + name = "blank coffee cartridge" + desc = "A blank coffee cartridge, ready to be filled with coffee paste." + icon = 'icons/obj/food/food.dmi' + icon_state = "cartridge_blank" + +//now, how do you store coffee carts? well, in a rack, of course! +/obj/item/storage/fancy/coffee_cart_rack + name = "coffeemaker cartridge rack" + desc = "A small rack for storing coffeemaker cartridges." + icon = 'icons/obj/food/containers.dmi' + icon_state = "coffee_cartrack4" + base_icon_state = "coffee_cartrack" + contents_tag = "coffee cartridge" + is_open = TRUE + spawn_type = /obj/item/coffee_cartridge + +/obj/item/storage/fancy/coffee_cart_rack/Initialize() + . = ..() + atom_storage.max_slots = 4 + atom_storage.set_holdable(list(/obj/item/coffee_cartridge)) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 1f57892bfcb..d772dabe577 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -1062,3 +1062,10 @@ color = "#adcf77" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/consumable/creamer + name = "Coffee Creamer" + description = "Powdered milk for cheap coffee. How delightful." + taste_description = "milk" + color = "#efeff0" + nutriment_factor = 1.5 * REAGENTS_METABOLISM + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index 092885b14f7..8af05627adc 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -393,3 +393,13 @@ name = "bbq sauce pack" originalname = "bbq sauce" list_reagents = list(/datum/reagent/consumable/bbqsauce = 10) + +/obj/item/reagent_containers/condiment/pack/creamer + name = "creamer pack" + originalname = "creamer" + list_reagents = list(/datum/reagent/consumable/creamer = 5) + +/obj/item/reagent_containers/condiment/pack/sugar + name = "sugar pack" + originalname = "sugar" + list_reagents = list(/datum/reagent/consumable/sugar = 5) diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index d184f8fcdb9..d189aaebe9d 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -443,3 +443,19 @@ name = "saline canister" volume = 5000 list_reagents = list(/datum/reagent/medicine/salglu_solution = 5000) + +//Coffeepots: for reference, a standard cup is 30u, to allow 20u for sugar/sweetener/milk/creamer +/obj/item/reagent_containers/cup/coffeepot + name = "coffeepot" + desc = "A large pot for dispensing that ambrosia of corporate life known to mortals only as coffee. Contains 4 standard cups." + volume = 120 + icon_state = "coffeepot" + fill_icon_state = "coffeepot" + fill_icon_thresholds = list(0, 1, 40, 80, 120) + +/obj/item/reagent_containers/cup/coffeepot/bluespace + name = "bluespace coffeepot" + desc = "The most advanced coffeepot the eggheads could cook up: sleek design; graduated lines; connection to a pocket dimension for coffee containment; yep, it's got it all. Contains 8 standard cups." + volume = 240 + icon_state = "coffeepot_bluespace" + fill_icon_thresholds = list(0) diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm index 0632e93a413..c77981353ff 100644 --- a/code/modules/reagents/reagent_containers/cups/drinks.dm +++ b/code/modules/reagents/reagent_containers/cups/drinks.dm @@ -140,6 +140,27 @@ resistance_flags = FREEZE_PROOF custom_price = PAYCHECK_CREW * 1.2 +/obj/item/reagent_containers/cup/glass/mug/nanotrasen + name = "\improper Nanotrasen mug" + desc = "A mug to display your corporate pride." + icon_state = "mug_nt_empty" + +/obj/item/reagent_containers/cup/glass/mug/nanotrasen/update_icon_state() + icon_state = reagents.total_volume ? "mug_nt" : "mug_nt_empty" + return ..() + +/obj/item/reagent_containers/cup/glass/coffee_cup + name = "coffee cup" + desc = "A heat-formed plastic coffee cup. Can theoretically be used for other hot drinks, if you're feeling adventurous." + icon_state = "coffee_cup_e" + possible_transfer_amounts = list(10) + volume = 30 + spillable = TRUE + isGlass = FALSE + +/obj/item/reagent_containers/cup/glass/coffee_cup/update_icon_state() + icon_state = reagents.total_volume ? "coffee_cup" : "coffee_cup_e" + return ..() /obj/item/reagent_containers/cup/glass/dry_ramen name = "cup ramen" diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index b88e58002d2..a85d7b33b5e 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -752,3 +752,31 @@ materials = list(/datum/material/uranium = 1000, /datum/material/plastic = 2000) build_path = /obj/item/fishing_rod/tech category = list(RND_CATEGORY_EQUIPMENT) + +///////////////////////////////////////// +/////////Coffeemaker Stuff/////////////// +///////////////////////////////////////// + +/datum/design/coffeepot + name = "Coffeepot" + id = "coffeepot" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/glass = 500, /datum/material/plastic = 500) + build_path = /obj/item/reagent_containers/cup/coffeepot + category = list(RND_CATEGORY_EQUIPMENT) + +/datum/design/coffeepot_bluespace + name = "Bluespace Coffeepot" + id = "bluespace_coffeepot" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = 1000, /datum/material/plastic = 500, /datum/material/bluespace = 500) + build_path = /obj/item/reagent_containers/cup/coffeepot/bluespace + category = list(RND_CATEGORY_EQUIPMENT) + +/datum/design/coffee_cartridge + name = "Blank Coffee Cartridge" + id = "coffee_cartridge" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/plastic = 1000) + build_path = /obj/item/blank_coffee_cartridge + category = list(RND_CATEGORY_EQUIPMENT) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 738c9c6c521..a2e507fa928 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -20,6 +20,8 @@ "c-reader", "circuit_imprinter", "circuit_imprinter_offstation", + "coffeepot", + "coffee_cartridge", "conveyor_belt", "conveyor_switch", "design_disk", @@ -663,6 +665,7 @@ design_ids = list( "bluespacebeaker", "bluespacesyringe", + "bluespace_coffeepot", "bs_rped", "minerbag_holding", "ore_silo", diff --git a/icons/hud/radial_coffee.dmi b/icons/hud/radial_coffee.dmi new file mode 100644 index 00000000000..3dfc35ce571 Binary files /dev/null and b/icons/hud/radial_coffee.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index a9238cf0a52..81960c75025 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index b5d7d8b1e7c..1fcbf013d97 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index a8983e7ddad..45da5f0194d 100644 Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 360866d5c4f..e7bd18e86aa 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index 49b5cd81d67..5627e76a277 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/sound/machines/coffeemaker_brew.ogg b/sound/machines/coffeemaker_brew.ogg new file mode 100644 index 00000000000..a8e25c09867 Binary files /dev/null and b/sound/machines/coffeemaker_brew.ogg differ diff --git a/sound/machines/license.txt b/sound/machines/license.txt index 740d711971d..7f3f99c7ed7 100644 --- a/sound/machines/license.txt +++ b/sound/machines/license.txt @@ -1,3 +1,7 @@ crate_close.ogg and crate_open.ogg are made by lawnjelly (https://freesound.org/people/lawnjelly/sounds/156892/) They have been licensed under CC-BY 3.0, which can be found at http://creativecommons.org/licenses/by/3.0/ + +coffeemaker_brew.ogg originally made by Adriana Lopez (Acekat13X31), edited to reduce length and added fade +(https://freesound.org/people/Acekat13X31/sounds/515685/) +This is licensed under CC-BY 4.0, found at https://creativecommons.org/licenses/by/4.0/ diff --git a/tgstation.dme b/tgstation.dme index 704da3c7c25..d89ad010bd8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4079,6 +4079,7 @@ #include "code\modules\reagents\chemistry\machinery\chem_master.dm" #include "code\modules\reagents\chemistry\machinery\chem_recipe_debug.dm" #include "code\modules\reagents\chemistry\machinery\chem_synthesizer.dm" +#include "code\modules\reagents\chemistry\machinery\coffeemaker.dm" #include "code\modules\reagents\chemistry\machinery\pandemic.dm" #include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" #include "code\modules\reagents\chemistry\machinery\smoke_machine.dm"