/obj/machinery/kitchen_machine
name = "Base Kitchen Machine"
desc = "If you are seeing this, a coder/mapper messed up. Please report it."
layer = 2.9
density = 1
anchored = 1
use_power = 1
idle_power_usage = 5
active_power_usage = 100
flags = OPENCONTAINER | NOREACT
var/operating = 0 // Is it on?
var/dirty = 0 // = {0..100} Does it need cleaning?
var/broken = 0 // ={0,1,2} How broken is it???
var/efficiency = 0
var/list/cook_verbs = list("Cooking")
//Recipe & Item vars
var/recipe_type //Make sure to set this on the machine definition, or else you're gonna runtime on New()
var/list/datum/recipe/available_recipes // List of the recipes you can use
var/list/acceptable_items // List of the items you can put in
var/list/acceptable_reagents // List of the reagents you can put in
var/max_n_of_items = 0
//Icon states
var/off_icon
var/on_icon
var/broken_icon
var/dirty_icon
var/open_icon
/*******************
* Initialising
********************/
/obj/machinery/kitchen_machine/New()
reagents = new/datum/reagents(100)
reagents.my_atom = src
if (!available_recipes)
available_recipes = new
acceptable_items = new
acceptable_reagents = new
for (var/type in (typesof(recipe_type)-recipe_type))
var/datum/recipe/recipe = new type
if(recipe.result) // Ignore recipe subtypes that lack a result
available_recipes += recipe
for (var/item in recipe.items)
acceptable_items |= item
for (var/reagent in recipe.reagents)
acceptable_reagents |= reagent
if (recipe.items || recipe.fruit)
max_n_of_items = max(max_n_of_items,recipe.count_n_items())
else
qdel(recipe)
acceptable_items |= /obj/item/weapon/reagent_containers/food/snacks/grown
/*******************
* Item Adding
********************/
/obj/machinery/kitchen_machine/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(operating)
return
if(!broken && dirty < 100)
if(default_deconstruction_screwdriver(user, open_icon, off_icon, O))
return
if(exchange_parts(user, O))
return
if(!broken && istype(O, /obj/item/weapon/wrench))
playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
if(anchored)
anchored = 0
user << "\The [src] can now be moved."
return
else if(!anchored)
anchored = 1
user << "\The [src] is now secured."
return
default_deconstruction_crowbar(O)
if(src.broken > 0)
if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver
user.visible_message( \
"[user] starts to fix part of \the [src].", \
"You start to fix part of \the [src]." \
)
if (do_after(user,20))
user.visible_message( \
"[user] fixes part of \the [src].", \
"You have fixed part of \the [src]." \
)
src.broken = 1 // Fix it a bit
else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench
user.visible_message( \
"[user] starts to fix part of \the [src].", \
"You start to fix part of \the [src]." \
)
if (do_after(user,20))
user.visible_message( \
"[user] fixes \the [src].", \
"You have fixed \the [src]." \
)
src.icon_state = off_icon
src.broken = 0 // Fix it!
src.dirty = 0 // just to be sure
src.flags = OPENCONTAINER
else
user << "It's broken!"
return 1
else if(src.dirty==100) // The machine is all dirty so can't be used!
if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them
user.visible_message( \
"[user] starts to clean \the [src].", \
"You start to clean \the [src]." \
)
if (do_after(user,20))
user.visible_message( \
"[user] has cleaned \the [src].", \
"You have cleaned \the [src]." \
)
src.dirty = 0 // It's clean!
src.broken = 0 // just to be sure
src.icon_state = off_icon
src.flags = OPENCONTAINER
else //Otherwise bad luck!!
user << "It's dirty!"
return 1
else if(is_type_in_list(O,acceptable_items))
if (contents.len>=max_n_of_items)
user << "This [src] is full of ingredients, you cannot put more."
return 1
if (istype(O,/obj/item/stack) && O:amount>1)
new O.type (src)
O:use(1)
user.visible_message( \
"[user] has added one of [O] to \the [src].", \
"You add one of [O] to \the [src].")
else
// user.unEquip(O) //This just causes problems so far as I can tell. -Pete
if(!user.drop_item())
user << "\The [O] is stuck to your hand, you cannot put it in \the [src]"
return 0
O.loc = src
user.visible_message( \
"[user] has added \the [O] to \the [src].", \
"You add \the [O] to \the [src].")
else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \
istype(O,/obj/item/weapon/reagent_containers/food/condiment) \
)
if (!O.reagents)
return 1
for (var/datum/reagent/R in O.reagents.reagent_list)
if (!(R.id in acceptable_reagents))
user << "Your [O] contains components unsuitable for cookery."
return 1
//G.reagents.trans_to(src,G.amount_per_transfer_from_this)
else if(istype(O,/obj/item/weapon/grab))
var/obj/item/weapon/grab/G = O
user << "This is ridiculous. You can not fit \the [G.affecting] in this [src]."
return 1
else
user << "You have no idea what you can cook with this [O]."
return 1
src.updateUsrDialog()
/obj/machinery/kitchen_machine/attack_ai(mob/user as mob)
return 0
/obj/machinery/kitchen_machine/attack_hand(mob/user as mob)
user.set_machine(src)
interact(user)
/********************
* Machine Menu *
********************/
/obj/machinery/kitchen_machine/interact(mob/user as mob) // The microwave Menu
if(panel_open || !anchored)
return
var/dat = ""
if(src.broken > 0)
dat = {"Bzzzzttttt"}
else if(src.operating)
dat = {"[pick(src.cook_verbs)] in progress!
Please wait...!"}
else if(src.dirty==100)
dat = {"This [src] is dirty!
Please clean it before use!"}
else
var/list/items_counts = new
var/list/items_measures = new
var/list/items_measures_p = new
for (var/obj/O in contents)
var/display_name = O.name
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
items_measures[display_name] = "egg"
items_measures_p[display_name] = "eggs"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
items_measures[display_name] = "tofu chunk"
items_measures_p[display_name] = "tofu chunks"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
items_measures[display_name] = "slab of meat"
items_measures_p[display_name] = "slabs of meat"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
display_name = "Turnovers"
items_measures[display_name] = "turnover"
items_measures_p[display_name] = "turnovers"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
items_measures[display_name] = "fillet of meat"
items_measures_p[display_name] = "fillets of meat"
items_counts[display_name]++
for (var/O in items_counts)
var/N = items_counts[O]
if (!(O in items_measures))
dat += {"[capitalize(O)]: [N] [lowertext(O)]\s
"}
else
if (N==1)
dat += {"[capitalize(O)]: [N] [items_measures[O]]
"}
else
dat += {"[capitalize(O)]: [N] [items_measures_p[O]]
"}
for (var/datum/reagent/R in reagents.reagent_list)
var/display_name = R.name
if (R.id == "capsaicin")
display_name = "Hotsauce"
if (R.id == "frostoil")
display_name = "Coldsauce"
dat += {"[display_name]: [R.volume] unit\s
"}
if (items_counts.len==0 && reagents.reagent_list.len==0)
dat = {"The [src] is empty
"}
else
dat = {"Ingredients:
[dat]"}
dat += {"