Merge pull request #7344 from Rykka-Stormheart/shep-dev-aurora-cooking

Aurora Cooking Port
This commit is contained in:
Atermonera
2020-07-30 12:13:07 -07:00
committed by GitHub
58 changed files with 7232 additions and 1560 deletions
+6
View File
@@ -56,3 +56,9 @@
. = B[STAT_ENTRY_TIME] - A[STAT_ENTRY_TIME]
if (!.)
. = B[STAT_ENTRY_COUNT] - A[STAT_ENTRY_COUNT]
// Compares complexity of recipes for use in cooking, etc. This is for telling which recipe to make, not for showing things to the player.
/proc/cmp_recipe_complexity_dsc(datum/recipe/A, datum/recipe/B)
var/a_score = LAZYLEN(A.items) + LAZYLEN(A.reagents) + LAZYLEN(A.fruit)
var/b_score = LAZYLEN(B.items) + LAZYLEN(B.reagents) + LAZYLEN(B.fruit)
return b_score - a_score
+100
View File
@@ -281,3 +281,103 @@
return strtype
return copytext(strtype, delim_pos)
// Concatenates a list of strings into a single string. A seperator may optionally be provided.
/proc/list2text(list/ls, sep)
if (ls.len <= 1) // Early-out code for empty or singleton lists.
return ls.len ? ls[1] : ""
var/l = ls.len // Made local for sanic speed.
var/i = 0 // Incremented every time a list index is accessed.
if (sep != null)
// Macros expand to long argument lists like so: sep, ls[++i], sep, ls[++i], sep, ls[++i], etc...
#define S1 sep, ls[++i]
#define S4 S1, S1, S1, S1
#define S16 S4, S4, S4, S4
#define S64 S16, S16, S16, S16
. = "[ls[++i]]" // Make sure the initial element is converted to text.
// Having the small concatenations come before the large ones boosted speed by an average of at least 5%.
if (l-1 & 0x01) // 'i' will always be 1 here.
. = text("[][][]", ., S1) // Append 1 element if the remaining elements are not a multiple of 2.
if (l-i & 0x02)
. = text("[][][][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4.
if (l-i & 0x04)
. = text("[][][][][][][][][]", ., S4) // And so on....
if (l-i & 0x08)
. = text("[][][][][][][][][][][][][][][][][]", ., S4, S4)
if (l-i & 0x10)
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16)
if (l-i & 0x20)
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16)
if (l-i & 0x40)
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64)
while (l > i) // Chomp through the rest of the list, 128 elements at a time.
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64)
#undef S64
#undef S16
#undef S4
#undef S1
else
// Macros expand to long argument lists like so: ls[++i], ls[++i], ls[++i], etc...
#define S1 ls[++i]
#define S4 S1, S1, S1, S1
#define S16 S4, S4, S4, S4
#define S64 S16, S16, S16, S16
. = "[ls[++i]]" // Make sure the initial element is converted to text.
if (l-1 & 0x01) // 'i' will always be 1 here.
. += S1 // Append 1 element if the remaining elements are not a multiple of 2.
if (l-i & 0x02)
. = text("[][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4.
if (l-i & 0x04)
. = text("[][][][][]", ., S4) // And so on...
if (l-i & 0x08)
. = text("[][][][][][][][][]", ., S4, S4)
if (l-i & 0x10)
. = text("[][][][][][][][][][][][][][][][][]", ., S16)
if (l-i & 0x20)
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16)
if (l-i & 0x40)
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64)
while (l > i) // Chomp through the rest of the list, 128 elements at a time.
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64)
#undef S64
#undef S16
#undef S4
#undef S1
// Converts a string into a list by splitting the string at each delimiter found. (discarding the seperator)
/proc/text2list(text, delimiter="\n")
var/delim_len = length(delimiter)
if (delim_len < 1)
return list(text)
. = list()
var/last_found = 1
var/found
do
found = findtext(text, delimiter, last_found, 0)
. += copytext(text, last_found, found)
last_found = found + delim_len
while (found)
-166
View File
@@ -1,166 +0,0 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * *
* /datum/recipe by rastaf0 13 apr 2011 *
* * * * * * * * * * * * * * * * * * * * * * * * * *
* This is powerful and flexible recipe system.
* It exists not only for food.
* supports both reagents and objects as prerequisites.
* In order to use this system you have to define a deriative from /datum/recipe
* * reagents are reagents. Acid, milc, booze, etc.
* * items are objects. Fruits, tools, circuit boards.
* * result is type to create as new object
* * time is optional parameter, you shall use in in your machine,
default /datum/recipe/ procs does not rely on this parameter.
*
* Functions you need:
* /datum/recipe/proc/make(var/obj/container as obj)
* Creates result inside container,
* deletes prerequisite reagents,
* transfers reagents from prerequisite objects,
* deletes all prerequisite objects (even not needed for recipe at the moment).
*
* /proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj as obj, exact = 1)
* Wonderful function that select suitable recipe for you.
* obj is a machine (or magik hat) with prerequisites,
* exact = 0 forces algorithm to ignore superfluous stuff.
*
*
* Functions you do not need to call directly but could:
* /datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents)
* /datum/recipe/proc/check_items(var/obj/container as obj)
*
* */
/datum/recipe
var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice
var/list/items // example: = list(/obj/item/weapon/tool/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo
var/list/fruit // example: = list("fruit" = 3)
var/result // example: = /obj/item/weapon/reagent_containers/food/snacks/donut/normal
var/time = 100 // 1/10 part of second
/datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents)
. = 1
for (var/r_r in reagents)
var/aval_r_amnt = avail_reagents.get_reagent_amount(r_r)
if (!(abs(aval_r_amnt - reagents[r_r])<0.5)) //if NOT equals
if (aval_r_amnt>reagents[r_r])
. = 0
else
return -1
if ((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len)
return 0
return .
/datum/recipe/proc/check_fruit(var/obj/container)
. = 1
if(fruit && fruit.len)
var/list/checklist = list()
// You should trust Copy().
checklist = fruit.Copy()
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in container)
if(!G.seed || !G.seed.kitchen_tag || isnull(checklist[G.seed.kitchen_tag]))
continue
checklist[G.seed.kitchen_tag]--
for(var/ktag in checklist)
if(!isnull(checklist[ktag]))
if(checklist[ktag] < 0)
. = 0
else if(checklist[ktag] > 0)
. = -1
break
return .
/datum/recipe/proc/check_items(var/obj/container as obj)
. = 1
if (items && items.len)
var/list/checklist = list()
checklist = items.Copy() // You should really trust Copy
if(istype(container, /obj/machinery))
var/obj/machinery/machine = container
for(var/obj/O in ((machine.contents - machine.component_parts) - machine.circuit))
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown))
continue // Fruit is handled in check_fruit().
var/found = 0
for(var/i = 1; i < checklist.len+1; i++)
var/item_type = checklist[i]
if (istype(O,item_type))
checklist.Cut(i, i+1)
found = 1
break
if (!found)
. = 0
else
for(var/obj/O in container.contents)
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown))
continue // Fruit is handled in check_fruit().
var/found = 0
for(var/i = 1; i < checklist.len+1; i++)
var/item_type = checklist[i]
if (istype(O,item_type))
checklist.Cut(i, i+1)
found = 1
break
if (!found)
. = 0
if (checklist.len)
. = -1
return .
//general version
/datum/recipe/proc/make(var/obj/container as obj)
var/obj/result_obj = new result(container)
if(istype(container, /obj/machinery))
var/obj/machinery/machine = container
for (var/obj/O in ((machine.contents-result_obj - machine.component_parts) - machine.circuit))
O.reagents.trans_to_obj(result_obj, O.reagents.total_volume)
qdel(O)
else
for (var/obj/O in (container.contents-result_obj))
O.reagents.trans_to_obj(result_obj, O.reagents.total_volume)
qdel(O)
container.reagents.clear_reagents()
return result_obj
// food-related
/datum/recipe/proc/make_food(var/obj/container as obj)
if(!result)
to_world("<span class='danger'>Recipe [type] is defined without a result, please bug report this.</span>")
return
var/obj/result_obj = new result(container)
if(istype(container, /obj/machinery))
var/obj/machinery/machine = container
for (var/obj/O in ((machine.contents-result_obj - machine.component_parts) - machine.circuit))
if (O.reagents)
O.reagents.del_reagent("nutriment")
O.reagents.update_total()
O.reagents.trans_to_obj(result_obj, O.reagents.total_volume)
qdel(O)
else
for (var/obj/O in (container.contents-result_obj))
if (O.reagents)
O.reagents.del_reagent("nutriment")
O.reagents.update_total()
O.reagents.trans_to_obj(result_obj, O.reagents.total_volume)
qdel(O)
container.reagents.clear_reagents()
return result_obj
/proc/select_recipe(var/list/datum/recipe/avaiable_recipes, var/obj/obj as obj, var/exact)
var/list/datum/recipe/possible_recipes = new
var/target = exact ? 0 : 1
for (var/datum/recipe/recipe in avaiable_recipes)
if((recipe.check_reagents(obj.reagents) < target) || (recipe.check_items(obj) < target) || (recipe.check_fruit(obj) < target))
continue
possible_recipes |= recipe
if (possible_recipes.len==0)
return null
else if (possible_recipes.len==1)
return possible_recipes[1]
else //okay, let's select the most complicated recipe
var/highest_count = 0
. = possible_recipes[1]
for (var/datum/recipe/recipe in possible_recipes)
var/count = ((recipe.items)?(recipe.items.len):0) + ((recipe.reagents)?(recipe.reagents.len):0) + ((recipe.fruit)?(recipe.fruit.len):0)
if (count >= highest_count)
highest_count = count
. = recipe
return .
+7
View File
@@ -45,6 +45,13 @@
cost = 10
containertype = /obj/structure/closet/crate/gilthari
containername = "crate of bar supplies"
/datum/supply_pack/hospitality/cookingoil
name = "Cooking oil tank crate"
contains = list(/obj/structure/reagent_dispensers/cookingoil)
cost = 10
containertype = /obj/structure/largecrate
containername = "cooking oil tank crate"
/datum/supply_pack/randomised/hospitality/
group = "Hospitality"
+1 -1
View File
@@ -50,7 +50,7 @@
src.invisibility = INVISIBILITY_MAXIMUM
density = 0
/obj/machinery/cooker/cultify()
/obj/machinery/appliance/cooker/cultify()
new /obj/structure/cult/talisman(loc)
qdel(src)
+37 -20
View File
@@ -101,29 +101,34 @@
if(beaker)
dat += "<A href='?src=\ref[src];action=activate'>Activate Biogenerator!</A><BR>"
dat += "<A href='?src=\ref[src];action=detach'>Detach Container</A><BR><BR>"
dat += "Food:<BR>"
dat += "Food Items:<BR>"
dat += "<A href='?src=\ref[src];action=create;item=milk;cost=20'>10 milk</A> <FONT COLOR=blue>([round(20/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=milk5;cost=95'>x5</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=cream;cost=30'>10 cream</A> <FONT COLOR=blue>([round(20/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=cream5;cost=120'>x5</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=meat;cost=50'>Slab of meat</A> <FONT COLOR=blue>([round(50/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=meat5;cost=250'>x5</A><BR>"
dat += "Nutrient:<BR>"
dat += "<A href='?src=\ref[src];action=create;item=ez;cost=60'>E-Z-Nutrient</A> <FONT COLOR=blue>([round(60/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=ez5;cost=300'>x5</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=l4z;cost=120'>Left 4 Zed</A> <FONT COLOR=blue>([round(120/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=l4z5;cost=600'>x5</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=rh;cost=150'>Robust Harvest</A> <FONT COLOR=blue>([round(150/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=rh5;cost=750'>x5</A><BR>"
dat += "Leather:<BR>"
dat += "<A href='?src=\ref[src];action=create;item=wallet;cost=100'>Wallet</A> <FONT COLOR=blue>([round(100/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=gloves;cost=250'>Botanical gloves</A> <FONT COLOR=blue>([round(250/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=plantbag;cost=320'>Plant bag</A> <FONT COLOR=blue>([round(250/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=plantbaglarge;cost=640'>Large plant bag</A> <FONT COLOR=blue>([round(250/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=tbelt;cost=300'>Utility belt</A> <FONT COLOR=blue>([round(300/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=satchel;cost=400'>Leather Satchel</A> <FONT COLOR=blue>([round(400/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=cashbag;cost=400'>Cash Bag</A> <FONT COLOR=blue>([round(400/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=chembag;cost=400'>Chemistry Bag</A> <FONT COLOR=blue>([round(400/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=workboots;cost=400'>Workboots</A> <FONT COLOR=blue>([round(400/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=leathershoes;cost=400'>Leather Shoes</A> <FONT COLOR=blue>([round(400/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=leatherchaps;cost=400'>Leather Chaps</A> <FONT COLOR=blue>([round(400/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=leathercoat;cost=500'>Leather Coat</A> <FONT COLOR=blue>([round(500/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=leatherjacket;cost=500'>Leather Jacket</A> <FONT COLOR=blue>([round(500/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=wintercoat;cost=500'>Winter Coat</A> <FONT COLOR=blue>([round(500/build_eff)])</FONT><BR>"
dat += "Cooking Ingredient:<BR>"
dat += "<A href='?src=\ref[src];action=create;item=unizyme;cost=30'>Universal Enzyme</A> <FONT COLOR=yellow>([round(30/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=unizyme50;cost=120'>x5</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=nutrispread;cost=30'>Nutri-Spread</A> <FONT COLOR=yellow>([round(30/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=nutrispread5;cost=120'>x5</A><BR>"
// dat += "<A href='?src=\ref[src];action=create;item=unizyme;cost=50'>Universal Enzyme</A> <FONT COLOR=yellow>([round(30/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=unizyme;cost=180'>x5</A><BR>"
// dat += "<A href='?src=\ref[src];action=create;item=unizyme;cost=50'>Universal Enzyme</A> <FONT COLOR=yellow>([round(30/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=unizyme;cost=180'>x5</A><BR>"
dat += "Gardening Nutrients:<BR>"
dat += "<A href='?src=\ref[src];action=create;item=ez;cost=60'>E-Z-Nutrient</A> <FONT COLOR=green>([round(60/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=ez5;cost=300'>x5</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=l4z;cost=120'>Left 4 Zed</A> <FONT COLOR=green>([round(120/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=l4z5;cost=600'>x5</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=rh;cost=150'>Robust Harvest</A> <FONT COLOR=green>([round(150/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=rh5;cost=750'>x5</A><BR>"
dat += "Leather Products:<BR>"
dat += "<A href='?src=\ref[src];action=create;item=wallet;cost=100'>Wallet</A> <FONT COLOR=brown>([round(100/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=gloves;cost=250'>Botanical gloves</A> <FONT COLOR=green>([round(250/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=plantbag;cost=320'>Plant bag</A> <FONT COLOR=green>([round(250/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=plantbaglarge;cost=640'>Large plant bag</A> <FONT COLOR=green>([round(250/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=tbelt;cost=300'>Utility belt</A> <FONT COLOR=brown>([round(300/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=satchel;cost=400'>Leather Satchel</A> <FONT COLOR=brown>([round(400/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=cashbag;cost=400'>Cash Bag</A> <FONT COLOR=brown>([round(400/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=chembag;cost=400'>Chemistry Bag</A> <FONT COLOR=green>([round(400/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=workboots;cost=400'>Workboots</A> <FONT COLOR=brown>([round(400/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=leathershoes;cost=400'>Leather Shoes</A> <FONT COLOR=brown>([round(400/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=leatherchaps;cost=400'>Leather Chaps</A> <FONT COLOR=brown>([round(400/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=leathercoat;cost=500'>Leather Coat</A> <FONT COLOR=brown>([round(500/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=leatherjacket;cost=500'>Leather Jacket</A> <FONT COLOR=brown>([round(500/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=wintercoat;cost=500'>Winter Coat</A> <FONT COLOR=brown>([round(500/build_eff)])</FONT><BR>"
//dat += "Other<BR>"
//dat += "<A href='?src=\ref[src];action=create;item=monkey;cost=500'>Monkey</A> <FONT COLOR=blue>(500)</FONT><BR>"
else
@@ -200,6 +205,18 @@
new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
if("unizyme")
beaker.reagents.add_reagent("enzyme", 10)
if("unizyme50")
beaker.reagents.add_reagent("enzyme", 50)
if("nutrispread")
new/obj/item/weapon/reagent_containers/food/snacks/spreads(loc)
if("nutrispread5")
new/obj/item/weapon/reagent_containers/food/snacks/spreads(loc)
new/obj/item/weapon/reagent_containers/food/snacks/spreads(loc)
new/obj/item/weapon/reagent_containers/food/snacks/spreads(loc)
new/obj/item/weapon/reagent_containers/food/snacks/spreads(loc)
new/obj/item/weapon/reagent_containers/food/snacks/spreads(loc)
if("ez")
new/obj/item/weapon/reagent_containers/glass/bottle/eznutrient(loc)
if("l4z")
+25
View File
@@ -79,6 +79,31 @@
frame_class = FRAME_CLASS_MACHINE
frame_size = 4
/datum/frame/frame_types/oven
name = "Oven"
frame_class = FRAME_CLASS_MACHINE
frame_size = 4
/datum/frame/frame_types/fryer
name = "Fryer"
frame_class = FRAME_CLASS_MACHINE
frame_size = 4
/datum/frame/frame_types/grill
name = "Grill"
frame_class = FRAME_CLASS_MACHINE
frame_size = 4
/datum/frame/frame_types/cerealmaker
name = "Cereal Maker"
frame_class = FRAME_CLASS_MACHINE
frame_size = 4
/datum/frame/frame_types/candymachine
name = "Candy Machine"
frame_class = FRAME_CLASS_MACHINE
frame_size = 4
/datum/frame/frame_types/fax
name = "Fax"
frame_class = FRAME_CLASS_MACHINE
+4 -2
View File
@@ -384,7 +384,7 @@
/obj/item/weapon/reagent_containers/food/condiment/cornoil = 5,
/obj/item/weapon/tray = 8,
/obj/item/weapon/material/kitchen/utensil/fork = 6,
/obj/item/weapon/material/knife = 6,
/obj/item/weapon/material/knife/plastic = 6,
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
/obj/item/weapon/material/knife = 3,
/obj/item/weapon/material/kitchen/rollingpin = 2,
@@ -401,7 +401,9 @@
/obj/item/weapon/storage/toolbox/lunchbox/mars = 3,
/obj/item/weapon/storage/toolbox/lunchbox/cti = 3,
/obj/item/weapon/storage/toolbox/lunchbox/nymph = 3,
/obj/item/weapon/storage/toolbox/lunchbox/syndicate = 3)
/obj/item/weapon/storage/toolbox/lunchbox/syndicate = 3,
/obj/item/weapon/reagent_containers/cooking_container/oven = 5,
/obj/item/weapon/reagent_containers/cooking_container/fryer = 4)
contraband = list(/obj/item/weapon/material/knife/butch = 2)
/obj/machinery/vending/sovietsoda
@@ -262,6 +262,21 @@ steam.start() -- spawns the effect
projectiles -= proj
*/
// Burnt Food Smoke (Specialty for Cooking Failures)
/obj/effect/effect/smoke/bad/burntfood
color = "#000000"
time_to_live = 600
/obj/effect/effect/smoke/bad/burntfood/process()
for(var/mob/living/L in get_turf(src))
affect(L)
/obj/effect/effect/smoke/bad/burntfood/affect(var/mob/living/L) // This stuff is extra-vile.
if (!..())
return 0
if(L.needs_to_breathe())
L.emote("cough")
/////////////////////////////////////////////
// 'Elemental' smoke
/////////////////////////////////////////////
@@ -376,6 +391,9 @@ steam.start() -- spawns the effect
/datum/effect/effect/system/smoke_spread/bad
smoke_type = /obj/effect/effect/smoke/bad
/datum/effect/effect/system/smoke_spread/bad/burntfood
smoke_type = /obj/effect/effect/smoke/bad/burntfood
/datum/effect/effect/system/smoke_spread/noxious
smoke_type = /obj/effect/effect/smoke/bad/noxious
+17
View File
@@ -105,5 +105,22 @@
name = "bread tube"
icon_state = "tastybread"
// Aurora Food Port
/obj/item/trash/brownies
name = "brownie tray"
icon_state = "brownies"
/obj/item/trash/snacktray
name = "snacktray"
icon_state = "snacktray"
/obj/item/trash/dipbowl
name = "dip bowl"
icon_state = "dipbowl"
/obj/item/trash/chipbasket
name = "empty basket"
icon_state = "chipbasket_empty"
/obj/item/trash/attack(mob/M as mob, mob/living/user as mob)
return
@@ -121,16 +121,6 @@
/obj/item/weapon/stock_parts/motor = 2,
/obj/item/stack/cable_coil = 5)
/obj/item/weapon/circuitboard/microwave
name = T_BOARD("microwave")
build_path = /obj/machinery/microwave
board_type = new /datum/frame/frame_types/microwave
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/weapon/stock_parts/motor = 1,
/obj/item/weapon/stock_parts/capacitor = 1)
/obj/item/weapon/circuitboard/recharger
name = T_BOARD("recharger")
build_path = /obj/machinery/recharger
@@ -250,13 +240,3 @@
/obj/item/weapon/stock_parts/spring = 1,
/obj/item/stack/cable_coil = 5)
/obj/item/weapon/circuitboard/microwave/advanced
name = T_BOARD("deluxe microwave")
build_path = /obj/machinery/microwave/advanced
board_type = new /datum/frame/frame_types/microwave
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/weapon/stock_parts/motor = 1,
/obj/item/weapon/stock_parts/capacitor = 1)
@@ -0,0 +1,74 @@
/obj/item/weapon/circuitboard/microwave
name = T_BOARD("microwave")
desc = "The circuitboard for a microwave."
build_path = /obj/machinery/microwave
board_type = new /datum/frame/frame_types/microwave
contain_parts = 0
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/weapon/stock_parts/capacitor = 3, // Original Capacitor count was 1
/obj/item/weapon/stock_parts/motor = 1,
/obj/item/weapon/stock_parts/scanning_module = 1,
/obj/item/weapon/stock_parts/matter_bin = 2)
/obj/item/weapon/circuitboard/oven
name = T_BOARD("oven")
desc = "The circuitboard for an oven."
build_path = /obj/machinery/appliance/cooker/oven
board_type = new /datum/frame/frame_types/oven
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
/obj/item/weapon/stock_parts/capacitor = 3,
/obj/item/weapon/stock_parts/scanning_module = 1,
/obj/item/weapon/stock_parts/matter_bin = 2)
/obj/item/weapon/circuitboard/fryer
name = T_BOARD("deep fryer")
desc = "The circuitboard for a deep fryer."
build_path = /obj/machinery/appliance/cooker/fryer
board_type = new /datum/frame/frame_types/fryer
req_components = list(
/obj/item/weapon/stock_parts/capacitor = 3,
/obj/item/weapon/stock_parts/scanning_module = 1,
/obj/item/weapon/stock_parts/matter_bin = 2)
/obj/item/weapon/circuitboard/grill
name = T_BOARD("grill")
desc = "The circuitboard for an industrial grill."
build_path = /obj/machinery/appliance/cooker/grill
board_type = new /datum/frame/frame_types/grill
req_components = list(
/obj/item/weapon/stock_parts/capacitor = 3,
/obj/item/weapon/stock_parts/scanning_module = 1,
/obj/item/weapon/stock_parts/matter_bin = 2)
/obj/item/weapon/circuitboard/cerealmaker
name = T_BOARD("cereal maker")
desc = "The circuitboard for a cereal maker."
build_path = /obj/machinery/appliance/mixer/cereal
board_type = new /datum/frame/frame_types/cerealmaker
req_components = list(
/obj/item/weapon/stock_parts/capacitor = 3,
/obj/item/weapon/stock_parts/scanning_module = 1,
/obj/item/weapon/stock_parts/matter_bin = 2)
/obj/item/weapon/circuitboard/candymachine
name = T_BOARD("candy machine")
desc = "The circuitboard for a candy machine."
build_path = /obj/machinery/appliance/mixer/candy
board_type = new /datum/frame/frame_types/candymachine
req_components = list(
/obj/item/weapon/stock_parts/capacitor = 3,
/obj/item/weapon/stock_parts/scanning_module = 1,
/obj/item/weapon/stock_parts/matter_bin = 2)
/obj/item/weapon/circuitboard/microwave/advanced
name = T_BOARD("deluxe microwave")
build_path = /obj/machinery/microwave/advanced
board_type = new /datum/frame/frame_types/microwave
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/weapon/stock_parts/motor = 1,
/obj/item/weapon/stock_parts/capacitor = 1)
@@ -4,7 +4,9 @@
starts_with = list(
/obj/item/weapon/reagent_containers/food/condiment/flour = 7,
/obj/item/weapon/reagent_containers/food/condiment/sugar = 2)
/obj/item/weapon/reagent_containers/food/condiment/sugar = 2,
/obj/item/weapon/reagent_containers/food/condiment/spacespice = 2
)
/obj/structure/closet/secure_closet/freezer/kitchen/mining
req_access = list()
+30 -2
View File
@@ -115,6 +115,17 @@
desc = "This is what you use to make bread fluffy."
icon_state = "yeast"
center_of_mass = list("x"=16, "y"=6)
if("spacespice")
name = "bottle of space spice"
desc = "An exotic blend of spices for cooking. Definitely not worms."
icon = 'icons/obj/food_syn.dmi'
icon_state = "spacespicebottle"
center_of_mass = list("x"=16, "y"=6)
if("barbecue")
name = "barbecue sauce"
desc = "Barbecue sauce, it's labeled 'sweet and spicy'."
icon_state = "barbecue"
center_of_mass = list("x"=16, "y"=6)
else
name = "Misc Condiment Bottle"
if (reagents.reagent_list.len==1)
@@ -408,6 +419,7 @@
desc = "A big bag of flour. Good for baking!"
icon = 'icons/obj/food.dmi'
icon_state = "flour"
volume = 220
center_of_mass = list("x"=16, "y"=8)
/obj/item/weapon/reagent_containers/food/condiment/flour/on_reagent_change()
@@ -415,5 +427,21 @@
/obj/item/weapon/reagent_containers/food/condiment/flour/Initialize()
. = ..()
reagents.add_reagent("flour", 30)
randpixel_xy()
reagents.add_reagent("flour", 200)
randpixel_xy()
/obj/item/weapon/reagent_containers/food/condiment/spacespice
name = "space spices"
desc = "An exotic blend of spices for cooking. Definitely not worms."
icon = 'icons/obj/food_syn.dmi'
icon_state = "spacespicebottle"
possible_transfer_amounts = list(1,40) //for clown turning the lid off
amount_per_transfer_from_this = 1
volume = 40
/obj/item/weapon/reagent_containers/food/condiment/spacespice/on_reagent_change()
return
/obj/item/weapon/reagent_containers/food/condiment/spacespice/Initialize()
. = ..()
reagents.add_reagent("spacespice", 40)
File diff suppressed because it is too large Load Diff
+26 -3
View File
@@ -8,8 +8,19 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/Initialize()
. = ..()
reagents.add_reagent("protein", 9)
src.bitesize = 3
reagents.add_reagent("protein", 6)
reagents.add_reagent("triglyceride", 2)
src.bitesize = 1.5
/obj/item/weapon/reagent_containers/food/snacks/meat/cook()
if (!isnull(cooked_icon))
icon_state = cooked_icon
flat_icon = null //Force regenating the flat icon for coatings, since we've changed the icon of the thing being coated
..()
if (name == initial(name))
name = "cooked [name]"
/obj/item/weapon/reagent_containers/food/snacks/meat/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/material/knife))
@@ -34,4 +45,16 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/corgi
name = "Corgi meat"
desc = "Tastes like... well, you know."
desc = "Tastes like... well, you know."
/obj/item/weapon/reagent_containers/food/snacks/meat/chicken
name = "chicken"
icon = 'icons/obj/food_syn.dmi'
icon_state = "chickenbreast"
cooked_icon = "chickenbreast_cooked"
filling_color = "#BBBBAA"
/obj/item/weapon/reagent_containers/food/snacks/meat/chicken/Initialize()
. = ..()
reagents.remove_reagent("triglyceride", INFINITY)
//Chicken is low fat. Less total calories than other meats
+9 -9
View File
@@ -1,6 +1,6 @@
// Chaos cake
/datum/recipe/microwave/chaoscake_layerone
/datum/recipe/chaoscake_layerone
reagents = list("flour" = 300,"milk" = 200, "sugar" = 100, "egg" = 30)
fruit = list("poisonberries" = 15, "cherries" = 15)
items = list(
@@ -11,7 +11,7 @@
)
result = /obj/structure/chaoscake
/datum/recipe/microwave/chaoscake_layertwo
/datum/recipe/chaoscake_layertwo
reagents = list("flour" = 300, "milk" = 200, "sugar" = 100, "egg" = 30, )
fruit = list("vanilla" = 15, "banana" = 15)
items = list(
@@ -22,7 +22,7 @@
)
result = /obj/item/weapon/chaoscake_layer
/datum/recipe/microwave/chaoscake_layerthree
/datum/recipe/chaoscake_layerthree
reagents = list("flour" = 240, "milk" = 150, "sugar" = 80, "egg" = 24, "deathbell" = 100)
fruit = list("grapes" = 30)
items = list(
@@ -32,7 +32,7 @@
)
result = /obj/item/weapon/chaoscake_layer/three
/datum/recipe/microwave/chaoscake_layerfour
/datum/recipe/chaoscake_layerfour
reagents = list("flour" = 240, "milk" = 150, "sugar" = 80, "egg" = 24, "milkshake" = 300)
fruit = list("rice" = 30)
items = list(
@@ -42,13 +42,13 @@
)
result = /obj/item/weapon/chaoscake_layer/four
/datum/recipe/microwave/chaoscake_layerfive
/datum/recipe/chaoscake_layerfive
reagents = list("flour" = 180, "milk" = 100, "sugar" = 60, "egg" = 18, "blood" = 300)
fruit = list("tomato" = 20)
items = list() //supposed to be made with lobster, still has to be ported.
result = /obj/item/weapon/chaoscake_layer/five
/datum/recipe/microwave/chaoscake_layersix
/datum/recipe/chaoscake_layersix
reagents = list("flour" = 180, "milk" = 100, "sugar" = 60, "egg" = 18, "sprinkles" = 10)
fruit = list("apple" = 30)
items = list(
@@ -61,7 +61,7 @@
)
result = /obj/item/weapon/chaoscake_layer/six
/datum/recipe/microwave/chaoscake_layerseven
/datum/recipe/chaoscake_layerseven
reagents = list("flour" = 120, "milk" = 50, "sugar" = 40, "egg" = 12, "devilskiss" = 200)
fruit = list("potato" = 10)
items = list(
@@ -71,7 +71,7 @@
)
result = /obj/item/weapon/chaoscake_layer/seven
/datum/recipe/microwave/chaoscake_layereight
/datum/recipe/chaoscake_layereight
reagents = list("flour" = 120, "milk" = 50, "sugar" = 40, "egg" = 12, "cream" = 200)
fruit = list("lemon" = 10)
items = list(
@@ -81,7 +81,7 @@
)
result = /obj/item/weapon/chaoscake_layer/eight
/datum/recipe/microwave/chaoscake_layernine
/datum/recipe/chaoscake_layernine
reagents = list("water" = 100, "blood" = 100)
fruit = list("goldapple" = 50)
items = list()
@@ -0,0 +1,727 @@
// This folder contains code that was originally ported from Apollo Station and then refactored/optimized/changed.
// Tracks precooked food to stop deep fried baked grilled grilled grilled diona nymph cereal.
/obj/item/weapon/reagent_containers/food/snacks
var/tmp/list/cooked = list()
// Root type for cooking machines. See following files for specific implementations.
/obj/machinery/appliance
name = "cooker"
desc = "You shouldn't be seeing this!"
icon = 'icons/obj/cooking_machines.dmi'
var/appliancetype = 0
density = 1
anchored = 1
use_power = USE_POWER_IDLE
idle_power_usage = 5 // Power used when turned on, but not processing anything
active_power_usage = 1000 // Power used when turned on and actively cooking something
var/cooking_power = 0 // Effectiveness/speed at cooking
var/cooking_coeff = 0 // Optimal power * proximity to optimal temp; used to calc. cooking power.
var/heating_power = 1000 // Effectiveness at heating up; not used for mixers, should be equal to active_power_usage
var/max_contents = 1 // Maximum number of things this appliance can simultaneously cook
var/on_icon // Icon state used when cooking.
var/off_icon // Icon state used when not cooking.
var/cooking = FALSE // Whether or not the machine is currently operating.
var/cook_type // A string value used to track what kind of food this machine makes.
var/can_cook_mobs // Whether or not this machine accepts grabbed mobs.
var/mobdamagetype = BRUTE // Burn damage for cooking appliances, brute for cereal/candy
var/food_color // Colour of resulting food item.
var/cooked_sound = 'sound/machines/ding.ogg' // Sound played when cooking completes.
var/can_burn_food = FALSE // Can the object burn food that is left inside?
var/burn_chance = 10 // How likely is the food to burn?
var/list/cooking_objs = list() // List of things being cooked
// If the machine has multiple output modes, define them here.
var/selected_option
var/list/output_options = list()
var/list/datum/recipe/available_recipes
var/container_type = null
var/combine_first = FALSE // If TRUE, this appliance will do combination cooking before checking recipes
/obj/machinery/appliance/Initialize()
. = ..()
default_apply_parts()
if(output_options.len)
verbs += /obj/machinery/appliance/proc/choose_output
if (!available_recipes)
available_recipes = new
for(var/type in subtypesof(/datum/recipe))
var/datum/recipe/test = type
if((appliancetype & initial(test.appliance)))
available_recipes += new test
/obj/machinery/appliance/Destroy()
for (var/a in cooking_objs)
var/datum/cooking_item/CI = a
qdel(CI.container)//Food is fragile, it probably doesnt survive the destruction of the machine
cooking_objs -= CI
qdel(CI)
return ..()
/obj/machinery/appliance/examine(var/mob/user)
. = ..()
if(Adjacent(user))
. += list_contents(user)
/obj/machinery/appliance/proc/list_contents(var/mob/user)
if (cooking_objs.len)
var/string = "Contains..."
for (var/a in cooking_objs)
var/datum/cooking_item/CI = a
string += "-\a [CI.container.label(null, CI.combine_target)], [report_progress(CI)]</br>"
return string
else
to_chat(user, "<span class='notice>'It is empty.</span>")
/obj/machinery/appliance/proc/report_progress(var/datum/cooking_item/CI)
if (!CI || !CI.max_cookwork)
return null
if (!CI.cookwork)
return "It is cold."
var/progress = CI.cookwork / CI.max_cookwork
if (progress < 0.25)
return "It's barely started cooking."
if (progress < 0.75)
return "<span class='notice'>It's cooking away nicely.</span>"
if (progress < 1)
return "<span class='notice'><b>It's almost ready!</b></span>"
var/half_overcook = (CI.overcook_mult - 1)*0.5
if (progress < 1+half_overcook)
return "<span class='soghun'><b>It is done !</b></span>"
if (progress < CI.overcook_mult)
return "<span class='warning'>It looks overcooked, get it out!</span>"
else
return "<span class='danger'>It is burning!</span>"
/obj/machinery/appliance/update_icon()
if (!stat && cooking_objs.len)
icon_state = on_icon
else
icon_state = off_icon
/obj/machinery/appliance/verb/toggle_power()
set name = "Toggle Power"
set category = "Object"
set src in view()
attempt_toggle_power(usr)
/obj/machinery/appliance/proc/attempt_toggle_power(mob/user)
if (!isliving(user))
return
if (!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You lack the dexterity to do that!</span>")
return
if (user.stat || user.restrained() || user.incapacitated())
return
if (!Adjacent(user) && !issilicon(user))
to_chat(user, "<span class='warning'>You can't reach [src] from here!</span>")
return
if (stat & POWEROFF)//Its turned off
stat &= ~POWEROFF
use_power = 1
user.visible_message("[user] turns [src] on.", "You turn on [src].")
else //Its on, turn it off
stat |= POWEROFF
use_power = 0
user.visible_message("[user] turns [src] off.", "You turn off [src].")
cooking = FALSE // Stop cooking here, too, just in case.
playsound(src, 'sound/machines/click.ogg', 40, 1)
update_icon()
/obj/machinery/appliance/AICtrlClick(mob/user)
attempt_toggle_power(user)
/obj/machinery/appliance/proc/choose_output()
set src in view()
set name = "Choose output"
set category = "Object"
if (!isliving(usr))
return
if (!usr.IsAdvancedToolUser())
to_chat(usr, "You lack the dexterity to do that!")
return
if (usr.stat || usr.restrained() || usr.incapacitated())
return
if (!Adjacent(usr) && !issilicon(usr))
to_chat(usr, "You can't adjust the [src] from this distance, get closer!")
return
if(output_options.len)
var/choice = input("What specific food do you wish to make with \the [src]?") as null|anything in output_options+"Default"
if(!choice)
return
if(choice == "Default")
selected_option = null
to_chat(usr, "<span class='notice'>You decide not to make anything specific with \the [src].</span>")
else
selected_option = choice
to_chat(usr, "<span class='notice'>You prepare \the [src] to make \a [selected_option] with the next thing you put in. Try putting several ingredients in a container!</span>")
//Handles all validity checking and error messages for inserting things
/obj/machinery/appliance/proc/can_insert(var/obj/item/I, var/mob/user)
if (istype(I.loc, /mob/living/silicon))
return 0
else if (istype(I.loc, /obj/item/rig_module))
return 0
// We are trying to cook a grabbed mob.
var/obj/item/weapon/grab/G = I
if(istype(G))
if(!can_cook_mobs)
to_chat(user, "<span class='warning'>That's not going to fit.</span>")
return 0
if(!isliving(G.affecting))
to_chat(user, "<span class='warning'>You can't cook that.</span>")
return 0
return 2
if (!has_space(I))
to_chat(user, "<span class='warning'>There's no room in [src] for that!</span>")
return 0
if (container_type && istype(I, container_type))
return 1
// We're trying to cook something else. Check if it's valid.
var/obj/item/weapon/reagent_containers/food/snacks/check = I
if(istype(check) && islist(check.cooked) && (cook_type in check.cooked))
to_chat(user, "<span class='warning'>\The [check] has already been [cook_type].</span>")
return 0
else if(istype(check, /obj/item/weapon/reagent_containers/glass))
to_chat(user, "<span class='warning'>That would probably break [src].</span>")
return 0
else if(istype(check, /obj/item/weapon/disk/nuclear))
to_chat(user, "<span class='warning'>You can't cook that.</span>")
return 0
else if(I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/weapon/storage/part_replacer)) // You can't cook tools, dummy.
return 0
else if(!istype(check) && !istype(check, /obj/item/weapon/holder))
to_chat(user, "<span class='warning'>That's not edible.</span>")
return 0
return 1
//This function is overridden by cookers that do stuff with containers
/obj/machinery/appliance/proc/has_space(var/obj/item/I)
if(cooking_objs.len >= max_contents)
return FALSE
return TRUE
/obj/machinery/appliance/attackby(var/obj/item/I, var/mob/user)
if(!cook_type || (stat & (BROKEN)))
to_chat(user, "<span class='warning'>\The [src] is not working.</span>")
return
var/result = can_insert(I, user)
if(!result)
if(!(default_deconstruction_screwdriver(user, I)))
default_part_replacement(user, I)
return
if(result == 2)
var/obj/item/weapon/grab/G = I
if (G && istype(G) && G.affecting)
cook_mob(G.affecting, user)
return
//From here we can start cooking food
add_content(I, user)
update_icon()
//Override for container mechanics
/obj/machinery/appliance/proc/add_content(var/obj/item/I, var/mob/user)
if(!user.unEquip(I))
return
var/datum/cooking_item/CI = has_space(I)
if (istype(I, /obj/item/weapon/reagent_containers/cooking_container) && CI == 1)
var/obj/item/weapon/reagent_containers/cooking_container/CC = I
CI = new /datum/cooking_item/(CC)
I.forceMove(src)
cooking_objs.Add(CI)
user.visible_message("<span class='notice'>\The [user] puts \the [I] into \the [src].</span>")
if (CC.check_contents() == 0)//If we're just putting an empty container in, then dont start any processing.
return
else
if (CI && istype(CI))
I.forceMove(CI.container)
else //Something went wrong
return
if (selected_option)
CI.combine_target = selected_option
// We can actually start cooking now.
user.visible_message("<span class='notice'>\The [user] puts \the [I] into \the [src].</span>")
get_cooking_work(CI)
cooking = TRUE
return CI
/obj/machinery/appliance/proc/get_cooking_work(var/datum/cooking_item/CI)
for (var/obj/item/J in CI.container)
cookwork_by_item(J, CI)
for (var/r in CI.container.reagents.reagent_list)
var/datum/reagent/R = r
if (istype(R, /datum/reagent/nutriment))
CI.max_cookwork += R.volume *2//Added reagents contribute less than those in food items due to granular form
//Nonfat reagents will soak oil
if (!istype(R, /datum/reagent/nutriment/triglyceride))
CI.max_oil += R.volume * 0.25
else
CI.max_cookwork += R.volume
CI.max_oil += R.volume * 0.10
//Rescaling cooking work to avoid insanely long times for large things
var/buffer = CI.max_cookwork
CI.max_cookwork = 0
var/multiplier = 1
var/step = 4
while (buffer > step)
buffer -= step
CI.max_cookwork += step*multiplier
multiplier *= 0.95
CI.max_cookwork += buffer*multiplier
//Just a helper to save code duplication in the above
/obj/machinery/appliance/proc/cookwork_by_item(var/obj/item/I, var/datum/cooking_item/CI)
var/obj/item/weapon/reagent_containers/food/snacks/S = I
var/work = 0
if (istype(S))
if (S.reagents)
for (var/r in S.reagents.reagent_list)
var/datum/reagent/R = r
if (istype(R, /datum/reagent/nutriment))
work += R.volume *3//Core nutrients contribute much more than peripheral chemicals
//Nonfat reagents will soak oil
if (!istype(R, /datum/reagent/nutriment/triglyceride))
CI.max_oil += R.volume * 0.35
else
work += R.volume
CI.max_oil += R.volume * 0.15
else if(istype(I, /obj/item/weapon/holder))
var/obj/item/weapon/holder/H = I
if (H.held_mob)
work += (H.held_mob.mob_size * H.held_mob.mob_size * 2)+2
CI.max_cookwork += work
//Called every tick while we're cooking something
/obj/machinery/appliance/proc/do_cooking_tick(var/datum/cooking_item/CI)
if (!istype(CI) || !CI.max_cookwork)
return FALSE
var/was_done = FALSE
if (CI.cookwork >= CI.max_cookwork)
was_done = TRUE
CI.cookwork += cooking_power
if (!was_done && CI.cookwork >= CI.max_cookwork)
//If cookwork has gone from above to below 0, then this item finished cooking
finish_cooking(CI)
else if (!CI.burned && CI.cookwork > min(CI.max_cookwork * CI.overcook_mult, CI.max_cookwork + 30))
burn_food(CI)
// Gotta hurt.
for(var/obj/item/weapon/holder/H in CI.container.contents)
var/mob/living/M = H.held_mob
if(M)
M.apply_damage(rand(1,3) * (1/M.mob_size), mobdamagetype, pick(BP_ALL)) // Allows special handling for mice/smaller mobs.
return TRUE
/obj/machinery/appliance/process()
if(cooking_power > 0 && cooking)
var/all_done_cooking = TRUE
for(var/datum/cooking_item/CI in cooking_objs)
do_cooking_tick(CI)
if(CI.max_cookwork > 0)
all_done_cooking = FALSE
if(all_done_cooking)
cooking = FALSE
update_icon()
/obj/machinery/appliance/proc/finish_cooking(var/datum/cooking_item/CI)
src.visible_message("<span class='notice'>\The [src] pings!</span>")
if(cooked_sound)
playsound(get_turf(src), cooked_sound, 50, 1)
//Check recipes first, a valid recipe overrides other options
var/datum/recipe/recipe = null
var/atom/C = null
if (CI.container)
C = CI.container
else
C = src
recipe = select_recipe(available_recipes,C)
if (recipe)
CI.result_type = 4//Recipe type, a specific recipe will transform the ingredients into a new food
var/list/results = recipe.make_food(C)
var/obj/temp = new /obj(src) //To prevent infinite loops, all results will be moved into a temporary location so they're not considered as inputs for other recipes
for (var/atom/movable/AM in results)
AM.forceMove(temp)
//making multiple copies of a recipe from one container. For example, tons of fries
while (select_recipe(available_recipes,C) == recipe)
var/list/TR = list()
TR += recipe.make_food(C)
for (var/atom/movable/AM in TR) //Move results to buffer
AM.forceMove(temp)
results += TR
for (var/r in results)
var/obj/item/weapon/reagent_containers/food/snacks/R = r
R.forceMove(C) //Move everything from the buffer back to the container
R.cooked |= cook_type
QDEL_NULL(temp) //delete buffer object
. = 1 //None of the rest of this function is relevant for recipe cooking
else if(CI.combine_target)
CI.result_type = 3//Combination type. We're making something out of our ingredients
. = combination_cook(CI)
else
//Otherwise, we're just doing standard modification cooking. change a color + name
for (var/obj/item/i in CI.container)
modify_cook(i, CI)
//Final step. Cook function just cooks batter for now.
for (var/obj/item/weapon/reagent_containers/food/snacks/S in CI.container)
S.cook()
//Combination cooking involves combining the names and reagents of ingredients into a predefined output object
//The ingredients represent flavours or fillings. EG: donut pizza, cheese bread
/obj/machinery/appliance/proc/combination_cook(var/datum/cooking_item/CI)
var/cook_path = output_options[CI.combine_target]
var/list/words = list()
var/list/cooktypes = list()
var/datum/reagents/buffer = new /datum/reagents(1000)
var/totalcolour
for (var/obj/item/I in CI.container)
var/obj/item/weapon/reagent_containers/food/snacks/S
if (istype(I, /obj/item/weapon/holder))
S = create_mob_food(I, CI)
else if (istype(I, /obj/item/weapon/reagent_containers/food/snacks))
S = I
if (!S)
continue
words |= text2list(S.name," ")
cooktypes |= S.cooked
if (S.reagents && S.reagents.total_volume > 0)
if (S.filling_color)
if (!totalcolour || !buffer.total_volume)
totalcolour = S.filling_color
else
var/t = buffer.total_volume + S.reagents.total_volume
t = buffer.total_volume / y
totalcolour = BlendRGB(totalcolour, S.filling_color, t)
//Blend colours in order to find a good filling color
S.reagents.trans_to_holder(buffer, S.reagents.total_volume)
//Cleanup these empty husk ingredients now
if (I)
qdel(I)
if (S)
qdel(S)
CI.container.reagents.trans_to_holder(buffer, CI.container.reagents.total_volume)
var/obj/item/weapon/reagent_containers/food/snacks/result = new cook_path(CI.container)
buffer.trans_to(result, buffer.total_volume)
//Filling overlay
var/image/I = image(result.icon, "[result.icon_state]_filling")
I.color = totalcolour
result.add_overlay(I)
result.filling_color = totalcolour
//Set the name.
words -= list("and", "the", "in", "is", "bar", "raw", "sticks", "boiled", "fried", "deep", "-o-", "warm", "two", "flavored")
//Remove common connecting words and unsuitable ones from the list. Unsuitable words include those describing
//the shape, cooked-ness/temperature or other state of an ingredient which doesn't apply to the finished product
words.Remove(result.name)
shuffle(words)
var/num = 6 //Maximum number of words
while (num > 0)
num--
if (!words.len)
break
//Add prefixes from the ingredients in a random order until we run out or hit limit
result.name = "[pop(words)] [result.name]"
//This proc sets the size of the output result
result.update_icon()
return result
//Helper proc for standard modification cooking
/obj/machinery/appliance/proc/modify_cook(var/obj/item/input, var/datum/cooking_item/CI)
var/obj/item/weapon/reagent_containers/food/snacks/result
if (istype(input, /obj/item/weapon/holder))
result = create_mob_food(input, CI)
else if (istype(input, /obj/item/weapon/reagent_containers/food/snacks))
result = input
else
//Nonviable item
return
if (!result)
return
result.cooked |= cook_type
// Set icon and appearance.
change_product_appearance(result, CI)
// Update strings.
change_product_strings(result, CI)
/obj/machinery/appliance/proc/burn_food(var/datum/cooking_item/CI)
// You dun goofed.
CI.burned = 1
CI.container.clear()
new /obj/item/weapon/reagent_containers/food/snacks/badrecipe(CI.container)
// Produce nasty smoke.
visible_message("<span class='danger'>\The [src] vomits a gout of rancid smoke!</span>")
var/datum/effect/effect/system/smoke_spread/bad/burntfood/smoke = new /datum/effect/effect/system/smoke_spread/bad/burntfood
playsound(src, 'sound/effects/smoke.ogg', 20, 1)
smoke.attach(src)
smoke.set_up(10, 0, get_turf(src), 300)
smoke.start()
// Set off fire alarms!
var/obj/machinery/firealarm/FA = locate() in get_area(src)
if(FA)
FA.alarm()
/obj/machinery/appliance/attack_hand(var/mob/user)
if (cooking_objs.len)
if (removal_menu(user))
return
else
..()
/obj/machinery/appliance/proc/removal_menu(var/mob/user)
if (can_remove_items(user))
var/list/menuoptions = list()
for (var/a in cooking_objs)
var/datum/cooking_item/CI = a
if (CI.container)
menuoptions[CI.container.label(menuoptions.len)] = CI
var/selection = input(user, "Which item would you like to remove?", "Remove ingredients") as null|anything in menuoptions
if (selection)
var/datum/cooking_item/CI = menuoptions[selection]
eject(CI, user)
update_icon()
return TRUE
return FALSE
/obj/machinery/appliance/proc/can_remove_items(var/mob/user)
if (!Adjacent(user))
return FALSE
if (isanimal(user))
return FALSE
return TRUE
/obj/machinery/appliance/proc/eject(var/datum/cooking_item/CI, var/mob/user = null)
var/obj/item/thing
var/delete = 1
var/status = CI.container.check_contents()
if (status == 1)//If theres only one object in a container then we extract that
thing = locate(/obj/item) in CI.container
delete = 0
else//If the container is empty OR contains more than one thing, then we must extract the container
thing = CI.container
if (!user || !user.put_in_hands(thing))
thing.forceMove(get_turf(src))
if (delete)
cooking_objs -= CI
qdel(CI)
else
CI.reset()//reset instead of deleting if the container is left inside
/obj/machinery/appliance/proc/cook_mob(var/mob/living/victim, var/mob/user)
return
/obj/machinery/appliance/proc/change_product_strings(var/obj/item/weapon/reagent_containers/food/snacks/product, var/datum/cooking_item/CI)
product.name = "[cook_type] [product.name]"
product.desc = "[product.desc]\nIt has been [cook_type]."
/obj/machinery/appliance/proc/change_product_appearance(var/obj/item/weapon/reagent_containers/food/snacks/product, var/datum/cooking_item/CI)
if (!product.coating) //Coatings change colour through a new sprite
product.color = food_color
product.filling_color = food_color
/mob/living/proc/calculate_composition() // moved from devour.dm on aurora's side
if (!composition_reagent)//if no reagent has been set, then we'll set one
if (isSynthetic())
src.composition_reagent = "iron"
else
if(istype(src, /mob/living/carbon/human/diona) || istype(src, /mob/living/carbon/alien/diona))
src.composition_reagent = "nutriment" // diona are plants, not meat
else
src.composition_reagent = "protein"
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
if(istype(H.species, /datum/species/diona))
src.composition_reagent = "nutriment"
//if the mob is a simple animal - MOB NOT ANIMAL - with a defined meat quantity
if (istype(src, /mob/living/simple_mob))
var/mob/living/simple_mob/SA = src
if(SA.meat_amount)
src.composition_reagent_quantity = SA.meat_amount*2*9
//The quantity of protein is based on the meat_amount, but multiplied by 2
var/size_reagent = (src.mob_size * src.mob_size) * 3//The quantity of protein is set to 3x mob size squared
if (size_reagent > src.composition_reagent_quantity)//We take the larger of the two
src.composition_reagent_quantity = size_reagent
//This function creates a food item which represents a dead mob
/obj/machinery/appliance/proc/create_mob_food(var/obj/item/weapon/holder/H, var/datum/cooking_item/CI)
if (!istype(H) || !H.held_mob)
qdel(H)
return null
var/mob/living/victim = H.held_mob
if (victim.stat != DEAD)
return null //Victim somehow survived the cooking, they do not become food
victim.calculate_composition()
var/obj/item/weapon/reagent_containers/food/snacks/variable/mob/result = new /obj/item/weapon/reagent_containers/food/snacks/variable/mob(CI.container)
result.w_class = victim.mob_size
result.reagents.add_reagent(victim.composition_reagent, victim.composition_reagent_quantity)
if (victim.reagents)
victim.reagents.trans_to_holder(result.reagents, victim.reagents.total_volume)
if (isanimal(victim))
var/mob/living/simple_mob/SA = victim
result.kitchen_tag = SA.kitchen_tag
result.appearance = victim
var/matrix/M = matrix()
M.Turn(45)
M.Translate(1,-2)
result.transform = M
// all done, now delete the old objects
H.held_mob = null
qdel(victim)
victim = null
qdel(H)
H = null
return result
/datum/cooking_item
var/max_cookwork
var/cookwork
var/overcook_mult = 3 // How long it takes to overcook. This is max_cookwork x overcook mult. If you're changing this, mind that at 3x, a max_cookwork of 30 becomes 90 ticks for the purpose of burning, and a max_cookwork of 4 only has 12 before burning!
var/result_type = 0
var/obj/item/weapon/reagent_containers/cooking_container/container = null
var/combine_target = null
//Result type is one of the following:
//0 unfinished, no result yet
//1 Standard modification cooking. eg Fried Donk Pocket, Baked wheat, etc
//2 Modification but with a new object that's an inert copy of the old. Generally used for deepfried mice
//3 Combination cooking, EG Donut Bread, Donk pocket pizza, etc
//4:Specific recipe cooking. EG: Turning raw potato sticks into fries
var/burned = 0
var/oil = 0
var/max_oil = 0//Used for fryers.
/datum/cooking_item/New(var/obj/item/I)
container = I
//This is called for containers whose contents are ejected without removing the container
/datum/cooking_item/proc/reset()
max_cookwork = 0
cookwork = 0
result_type = 0
burned = 0
max_oil = 0
oil = 0
combine_target = null
//Container is not reset
/obj/machinery/appliance/RefreshParts()
..()
var/scan_rating = 0
var/cap_rating = 0
for(var/obj/item/weapon/stock_parts/P in src.component_parts)
if(istype(P, /obj/item/weapon/stock_parts/scanning_module))
scan_rating += P.rating - 1 // Default parts shouldn't mess with stats
// to_world("RefreshParts returned scan rating of [scan_rating] during this step.") // Debug lines, uncomment if you need to test.
else if(istype(P, /obj/item/weapon/stock_parts/capacitor))
cap_rating += P.rating - 1 // Default parts shouldn't mess with stats
// to_world("RefreshParts returned cap rating of [cap_rating] during this step.") // Debug lines, uncomment if you need to test.
active_power_usage = initial(active_power_usage) - scan_rating * 25
heating_power = initial(heating_power) + cap_rating * 25
cooking_power = cooking_coeff * (1 + (scan_rating + cap_rating) / 20) // 100% eff. becomes 120%, 140%, 160% w/ better parts, thus rewarding upgrading the appliances during your shift.
// to_world("RefreshParts returned cooking power of [cooking_power] during this step.") // Debug lines, uncomment if you need to test.
@@ -1,261 +1,146 @@
// This folder contains code that was originally ported from Apollo Station and then refactored/optimized/changed.
/obj/machinery/appliance/cooker
var/temperature = T20C
var/min_temp = 80 + T0C //Minimum temperature to do any cooking
var/optimal_temp = 200 + T0C //Temperature at which we have 100% efficiency. efficiency is lowered on either side of this
var/optimal_power = 0.6 //cooking power at 100% - This variable determines the MAXIMUM increase in do_cooking_ticks, once math goes through. If you want ticks of 0.5, set it to 0.5, etc.
// Tracks precooked food to stop deep fried baked grilled grilled grilled diona nymph cereal.
/obj/item/weapon/reagent_containers/food/snacks/var/list/cooked
var/loss = 1 //Temp lost per proc when equalising
var/resistance = 32000 //Resistance to heating. combines with heating power to determine how long heating takes. 32k by default.
// Root type for cooking machines. See following files for specific implementations.
/obj/machinery/cooker
name = "cooker"
desc = "You shouldn't be seeing this!"
icon = 'icons/obj/cooking_machines.dmi'
density = 1
anchored = 1
use_power = USE_POWER_IDLE
idle_power_usage = 5
var/light_x = 0
var/light_y = 0
cooking_coeff = 0
cooking_power = 0
mobdamagetype = BURN
can_burn_food = TRUE
var/on_icon // Icon state used when cooking.
var/off_icon // Icon state used when not cooking.
var/cooking // Whether or not the machine is currently operating.
var/cook_type // A string value used to track what kind of food this machine makes.
var/cook_time = 200 // How many ticks the cooking will take.
var/can_cook_mobs // Whether or not this machine accepts grabbed mobs.
var/food_color // Colour of resulting food item.
var/cooked_sound // Sound played when cooking completes.
var/can_burn_food // Can the object burn food that is left inside?
var/burn_chance = 10 // How likely is the food to burn?
var/obj/item/cooking_obj // Holder for the currently cooking object.
// If the machine has multiple output modes, define them here.
var/selected_option
var/list/output_options = list()
/obj/machinery/cooker/Destroy()
if(cooking_obj)
qdel(cooking_obj)
cooking_obj = null
return ..()
/obj/machinery/cooker/proc/set_cooking(new_setting)
cooking = new_setting
icon_state = new_setting ? on_icon : off_icon
/obj/machinery/cooker/examine(mob/user)
/obj/machinery/appliance/cooker/examine(var/mob/user)
. = ..()
if(cooking_obj && Adjacent(user))
. += "You can see \a [cooking_obj] inside."
/obj/machinery/cooker/attackby(var/obj/item/I, var/mob/user)
if(!cook_type || (stat & (NOPOWER|BROKEN)))
to_chat(user, "<span class='warning'>\The [src] is not working.</span>")
return
if(cooking)
to_chat(user, "<span class='warning'>\The [src] is running!</span>")
return
if(default_unfasten_wrench(user, I, 20))
return
// We are trying to cook a grabbed mob.
var/obj/item/weapon/grab/G = I
if(istype(G))
if(!can_cook_mobs)
to_chat(user, "<span class='warning'>That's not going to fit.</span>")
return
if(!isliving(G.affecting))
to_chat(user, "<span class='warning'>You can't cook that.</span>")
return
cook_mob(G.affecting, user)
return
// We're trying to cook something else. Check if it's valid.
var/obj/item/weapon/reagent_containers/food/snacks/check = I
if(istype(check) && islist(check.cooked) && (cook_type in check.cooked))
to_chat(user, "<span class='warning'>\The [check] has already been [cook_type].</span>")
return 0
else if(istype(check, /obj/item/weapon/reagent_containers/glass))
to_chat(user, "<span class='warning'>That would probably break [src].</span>")
return 0
else if(istype(check, /obj/item/weapon/disk/nuclear))
to_chat(user, "Central Command would kill you if you [cook_type] that.")
return 0
else if(!istype(check) && !istype(check, /obj/item/weapon/holder) && !istype(check, /obj/item/organ)) //Gripper check has to go here, else it still just cuts it off. ~Mechoid
// Is it a borg using a gripper?
if(istype(check, /obj/item/weapon/gripper)) // Grippers. ~Mechoid.
var/obj/item/weapon/gripper/B = check //B, for Borg.
if(!B.wrapped)
to_chat(user, "\The [B] is not holding anything.")
return 0
if(.) //no need to duplicate adjacency check
if(!stat)
if (temperature < min_temp)
. += "<span class='warning'>\The [src] is still heating up and is too cold to cook anything yet.</span>"
else
var/B_held = B.wrapped
to_chat(user, "You use \the [B] to put \the [B_held] into \the [src].")
return 0
. += "<span class='notice'>It is running at [round(get_efficiency(), 0.1)]% efficiency!</span>"
. += "Temperature: [round(temperature - T0C, 0.1)]C / [round(optimal_temp - T0C, 0.1)]C"
else
to_chat(user, "<span class='warning'>That's not edible.</span>")
return 0
if(istype(I, /obj/item/organ))
var/obj/item/organ/O = I
if(O.robotic)
to_chat(user, "<span class='warning'>That would probably break [src].</span>")
return
// Gotta hurt.
if(istype(cooking_obj, /obj/item/weapon/holder))
for(var/mob/living/M in cooking_obj.contents)
M.apply_damage(rand(30,40), BURN, "chest")
// Not sure why a food item that passed the previous checks would fail to drop, but safety first. (Hint: Borg grippers. That is why. ~Mechoid.)
if(!user.unEquip(I) && !istype(user,/mob/living/silicon/robot))
return
// We can actually start cooking now.
user.visible_message("<span class='notice'>\The [user] puts \the [I] into \the [src].</span>")
cooking_obj = I
cooking_obj.forceMove(src)
set_cooking(TRUE)
icon_state = on_icon
// Doop de doo. Jeopardy theme goes here.
sleep(cook_time)
// Sanity checks.
if(!cooking_obj || cooking_obj.loc != src)
cooking_obj = null
icon_state = off_icon
set_cooking(FALSE)
return
// RIP slow-moving held mobs.
if(istype(cooking_obj, /obj/item/weapon/holder))
for(var/mob/living/M in cooking_obj.contents)
M.death()
qdel(M)
// Cook the food.
var/cook_path
if(selected_option && output_options.len)
cook_path = output_options[selected_option]
if(!cook_path)
cook_path = /obj/item/weapon/reagent_containers/food/snacks/variable
var/obj/item/weapon/reagent_containers/food/snacks/result = new cook_path(src) //Holy typepaths, Batman.
// Set icon and appearance.
change_product_appearance(result)
// Update strings.
change_product_strings(result)
// Copy reagents over. trans_to_obj must be used, as trans_to fails for snacks due to is_open_container() failing.
if(cooking_obj.reagents && cooking_obj.reagents.total_volume)
cooking_obj.reagents.trans_to_obj(result, cooking_obj.reagents.total_volume)
// Set cooked data.
var/obj/item/weapon/reagent_containers/food/snacks/food_item = cooking_obj
if(istype(food_item) && islist(food_item.cooked))
result.cooked = food_item.cooked.Copy()
. += "<span class='warning'>It is switched off.</span>"
/obj/machinery/appliance/cooker/list_contents(var/mob/user)
if (cooking_objs.len)
var/string = "Contains...</br>"
var/num = 0
for (var/a in cooking_objs)
num++
var/datum/cooking_item/CI = a
if (CI && CI.container)
string += "- [CI.container.label(num)], [report_progress(CI)]</br>"
to_chat(user, string)
else
result.cooked = list()
result.cooked |= cook_type
to_chat(user, "<span class='notice'>It's empty.</span>")
/obj/machinery/appliance/cooker/proc/get_efficiency()
// to_world("Our cooking_power is [cooking_power] and our efficiency is [(cooking_power / optimal_power) * 100].") // Debug lines, uncomment if you need to test.
return (cooking_power / optimal_power) * 100
// Reset relevant variables.
qdel(cooking_obj)
src.visible_message("<span class='notice'>\The [src] pings!</span>")
if(cooked_sound)
playsound(src, cooked_sound, 50, 1)
/obj/machinery/appliance/cooker/Initialize()
. = ..()
loss = (active_power_usage / resistance)*0.5
cooking_objs = list()
for (var/i = 0, i < max_contents, i++)
cooking_objs.Add(new /datum/cooking_item/(new container_type(src)))
cooking = FALSE
if(!can_burn_food)
icon_state = off_icon
set_cooking(FALSE)
result.forceMove(get_turf(src))
cooking_obj = null
update_icon() // this probably won't cause issues, but Aurora used SSIcons and queue_icon_update() instead
/obj/machinery/appliance/cooker/update_icon()
cut_overlays()
var/image/light
if(use_power == 1 && !stat)
light = image(icon, "light_idle")
else if(use_power == 2 && !stat)
light = image(icon, "light_preheating")
else
var/failed
var/overcook_period = max(FLOOR(cook_time/5, 1),1)
cooking_obj = result
var/count = overcook_period
while(1)
sleep(overcook_period)
count += overcook_period
if(!cooking || !result || result.loc != src)
failed = 1
else if(prob(burn_chance) || count == cook_time) //Fail before it has a chance to cook again.
// You dun goofed.
qdel(cooking_obj)
cooking_obj = new /obj/item/weapon/reagent_containers/food/snacks/badrecipe(src)
// Produce nasty smoke.
visible_message("<span class='danger'>\The [src] vomits a gout of rancid smoke!</span>")
var/datum/effect/effect/system/smoke_spread/bad/smoke = new /datum/effect/effect/system/smoke_spread/bad()
smoke.attach(src)
smoke.set_up(10, 0, usr.loc)
smoke.start()
failed = 1
if(failed)
set_cooking(FALSE)
icon_state = off_icon
break
/obj/machinery/cooker/attack_hand(var/mob/user)
if(cooking_obj && user.Adjacent(src)) //Fixes borgs being able to teleport food in these machines to themselves.
to_chat(user, "<span class='notice'>You grab \the [cooking_obj] from \the [src].</span>")
user.put_in_hands(cooking_obj)
set_cooking(FALSE)
cooking_obj = null
icon_state = off_icon
return
if(output_options.len)
if(cooking)
to_chat(user, "<span class='warning'>\The [src] is in use!</span>")
return
var/choice = input("What specific food do you wish to make with \the [src]?") as null|anything in output_options+"Default"
if(!choice)
return
if(choice == "Default")
selected_option = null
to_chat(user, "<span class='notice'>You decide not to make anything specific with \the [src].</span>")
else
selected_option = choice
to_chat(user, "<span class='notice'>You prepare \the [src] to make \a [selected_option].</span>")
light = image(icon, "light_off")
light.pixel_x = light_x
light.pixel_y = light_y
add_overlay(light)
/obj/machinery/appliance/cooker/process()
if (!stat)
heat_up()
else
var/turf/T = get_turf(src)
if (temperature > T.temperature)
equalize_temperature()
..()
/obj/machinery/cooker/proc/cook_mob(var/mob/living/victim, var/mob/user)
return
/obj/machinery/cooker/proc/change_product_strings(var/obj/item/weapon/reagent_containers/food/snacks/product)
if(product.type == /obj/item/weapon/reagent_containers/food/snacks/variable) // Base type, generic.
product.name = "[cook_type] [cooking_obj.name]"
product.desc = "[cooking_obj.desc] It has been [cook_type]."
/obj/machinery/appliance/cooker/power_change()
. = ..()
update_icon() // this probably won't cause issues, but Aurora used SSIcons and queue_icon_update() instead
/obj/machinery/appliance/cooker/proc/update_cooking_power()
var/temp_scale = 0
if(temperature > min_temp)
if(temperature >= optimal_temp) // If we're at or above optimal temp, then we're going to be at 1 for temp scale. No use penalizing you for the cookers increasing heat constantly (until we implement setting a temp on the oven via a menu.)
temp_scale = 1
else
temp_scale = (temperature - min_temp) / (optimal_temp - min_temp) // If we're between min and optimal this will yield a value in the range 0-1
/* // old code for reference, will be useful if/when we implement ovens with configurable temperatures - TODO recipes with optimal temps for cooking per-recipe??
temp_scale = (temperature - min_temp) / (optimal_temp - min_temp) // If we're between min and optimal this will yield a value in the range 0-1
if(temp_scale > 1) // We're above optimal, efficiency goes down as we pass too much over it
if(temp_scale >= 2)
temp_scale = 0
else
temp_scale = 1 - (temp_scale - 1)
*/
cooking_coeff = optimal_power * temp_scale
// to_world("Our cooking_power is [cooking_power] and our tempscale is [temp_scale], and our cooking_coeff is [cooking_coeff] before RefreshParts.") // Debug lines, uncomment if you need to test.
RefreshParts()
// to_world("Our cooking_power is [cooking_power] after RefreshParts.") // Debug lines, uncomment if you need to test.
/obj/machinery/appliance/cooker/proc/heat_up()
if(temperature < optimal_temp)
if(use_power == 1 && ((optimal_temp - temperature) > 5))
playsound(src, 'sound/machines/click.ogg', 20, 1)
use_power = 2.//If we're heating we use the active power
update_icon()
temperature += heating_power / resistance
update_cooking_power()
return 1
else
product.name = "[cooking_obj.name] [product.name]"
if(use_power == 2)
use_power = 1
playsound(src, 'sound/machines/click.ogg', 20, 1)
update_icon()
//We're holding steady. temperature falls more slowly
if(prob(25))
equalize_temperature()
return -1
/obj/machinery/cooker/proc/change_product_appearance(var/obj/item/weapon/reagent_containers/food/snacks/product)
if(product.type == /obj/item/weapon/reagent_containers/food/snacks/variable) // Base type, generic.
product.appearance = cooking_obj
product.color = food_color
product.filling_color = food_color
/obj/machinery/appliance/cooker/proc/equalize_temperature()
temperature -= loss//Temperature will fall somewhat slowly
update_cooking_power()
// Make 'em into a corpse.
if(istype(cooking_obj, /obj/item/weapon/holder))
var/matrix/M = matrix()
M.Turn(90)
M.Translate(1,-6)
product.transform = M
//Cookers do differently, they use containers
/obj/machinery/appliance/cooker/has_space(var/obj/item/I)
if(istype(I, /obj/item/weapon/reagent_containers/cooking_container))
//Containers can go into an empty slot
if(cooking_objs.len < max_contents)
return 1
else
var/image/I = image(product.icon, "[product.icon_state]_filling")
if(istype(cooking_obj, /obj/item/weapon/reagent_containers/food/snacks))
var/obj/item/weapon/reagent_containers/food/snacks/S = cooking_obj
I.color = S.filling_color
if(!I.color)
I.color = food_color
product.overlays += I
//Any food items directly added need an empty container. A slot without a container cant hold food
for (var/datum/cooking_item/CI in cooking_objs)
if (CI.container.check_contents() == 0)
return CI
return 0
/obj/machinery/appliance/cooker/add_content(var/obj/item/I, var/mob/user)
var/datum/cooking_item/CI = ..()
if (CI && CI.combine_target)
to_chat(user, "\The [I] will be used to make a [selected_option]. Output selection is returned to default for future items.")
selected_option = null
@@ -1,72 +1,160 @@
// Wrapper obj for cooked food. Appearance is set in the cooking code, not on spawn.
/obj/item/weapon/reagent_containers/food/snacks/variable
name = "cooked food"
icon = 'icons/obj/food_custom.dmi'
desc = "If you can see this description then something is wrong. Please report the bug on the tracker."
nutriment_amt = 5
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/variable/pizza
name = "personal pizza"
desc = "A personalized pan pizza meant for only one person."
icon_state = "personal_pizza"
/obj/item/weapon/reagent_containers/food/snacks/variable/bread
name = "bread"
desc = "Tasty bread."
icon_state = "breadcustom"
/obj/item/weapon/reagent_containers/food/snacks/variable/pie
name = "pie"
desc = "Tasty pie."
icon_state = "piecustom"
/obj/item/weapon/reagent_containers/food/snacks/variable/cake
name = "cake"
desc = "A popular band."
icon_state = "cakecustom"
/obj/item/weapon/reagent_containers/food/snacks/variable/pocket
name = "hot pocket"
desc = "You wanna put a bangin- oh, nevermind."
icon_state = "donk"
/obj/item/weapon/reagent_containers/food/snacks/variable/kebab
name = "kebab"
desc = "Remove this!"
icon_state = "kabob"
/obj/item/weapon/reagent_containers/food/snacks/variable/waffles
name = "waffles"
desc = "Made with love."
icon_state = "waffles"
/obj/item/weapon/reagent_containers/food/snacks/variable/cookie
name = "cookie"
desc = "Sugar snap!"
icon_state = "cookie"
/obj/item/weapon/reagent_containers/food/snacks/variable/donut
name = "filled donut"
desc = "Donut eat this!" // kill me
icon_state = "donut"
/obj/item/weapon/reagent_containers/food/snacks/variable/jawbreaker
name = "flavored jawbreaker"
desc = "It's like cracking a molar on a rainbow."
icon_state = "jawbreaker"
/obj/item/weapon/reagent_containers/food/snacks/variable/candybar
name = "flavored chocolate bar"
desc = "Made in a factory downtown."
icon_state = "bar"
/obj/item/weapon/reagent_containers/food/snacks/variable/sucker
name = "flavored sucker"
desc = "Suck, suck, suck."
icon_state = "sucker"
/obj/item/weapon/reagent_containers/food/snacks/variable/jelly
name = "jelly"
desc = "All your friends will be jelly."
icon_state = "jellycustom"
// Wrapper obj for cooked food. Appearance is set in the cooking code, not on spawn.
/obj/item/weapon/reagent_containers/food/snacks/variable
name = "cooked food"
icon = 'icons/obj/food_custom.dmi'
desc = "If you can see this description then something is wrong. Please report the bug on the tracker."
bitesize = 2
var/size = 5 //The quantity of reagents which is considered "normal" for this kind of food
//These objects will change size depending on the ratio of reagents to this value
var/min_scale = 0.5
var/max_scale = 2
var/scale = 1
w_class = 2
var/prefix
/obj/item/weapon/reagent_containers/food/snacks/variable/Initialize()
. = ..()
if (reagents)
reagents.maximum_volume = size*8 + 10
else
create_reagents(size*8 + 10)
/obj/item/weapon/reagent_containers/food/snacks/variable/update_icon()
if (reagents && reagents.total_volume)
var/ratio = reagents.total_volume / size
scale = ratio**(1/3) //Scaling factor is square root of desired area
scale = clamp(scale, min_scale, max_scale)
else
scale = min_scale
var/matrix/M = matrix()
M.Scale(scale)
src.transform = M
w_class *= scale
if (!prefix)
if (scale == min_scale)
prefix = "tiny"
else if (scale <= 0.8)
prefix = "small"
else
if (scale >= 1.2)
prefix = "large"
if (scale >= 1.4)
prefix = "extra large"
if (scale >= 1.6)
prefix = "huge"
if (scale >= max_scale)
prefix = "massive"
name = "[prefix] [name]"
/obj/item/weapon/reagent_containers/food/snacks/variable/pizza
name = "personal pizza"
desc = "A personalized pan pizza meant for only one person."
icon_state = "personal_pizza"
size = 20
w_class = 3
/obj/item/weapon/reagent_containers/food/snacks/variable/bread
name = "bread"
desc = "Tasty bread."
icon_state = "breadcustom"
size = 40
w_class = 3
/obj/item/weapon/reagent_containers/food/snacks/variable/pie
name = "pie"
desc = "Tasty pie."
icon_state = "piecustom"
size = 25
/obj/item/weapon/reagent_containers/food/snacks/variable/cake
name = "cake"
desc = "A popular band."
icon_state = "cakecustom"
size = 40
w_class = 3
/obj/item/weapon/reagent_containers/food/snacks/variable/pocket
name = "hot pocket"
desc = "You wanna put a bangin- oh, nevermind."
icon_state = "donk"
size = 8
w_class = 1
/obj/item/weapon/reagent_containers/food/snacks/variable/kebab
name = "kebab"
desc = "Remove this!"
icon_state = "kabob"
size = 10
/obj/item/weapon/reagent_containers/food/snacks/variable/waffles
name = "waffles"
desc = "Made with love."
icon_state = "waffles"
size = 12
/obj/item/weapon/reagent_containers/food/snacks/variable/cookie
name = "cookie"
desc = "Sugar snap!"
icon_state = "cookie"
size = 6
w_class = 1
/obj/item/weapon/reagent_containers/food/snacks/variable/donut
name = "filled donut"
desc = "Donut eat this!" // kill me
icon_state = "donut"
size = 8
w_class = 1
/obj/item/weapon/reagent_containers/food/snacks/variable/jawbreaker
name = "flavored jawbreaker"
desc = "It's like cracking a molar on a rainbow."
icon_state = "jawbreaker"
size = 4
w_class = 1
/obj/item/weapon/reagent_containers/food/snacks/variable/candybar
name = "flavored chocolate bar"
desc = "Made in a factory downtown."
icon_state = "bar"
size = 6
w_class = 1
/obj/item/weapon/reagent_containers/food/snacks/variable/sucker
name = "flavored sucker"
desc = "Suck, suck, suck."
icon_state = "sucker"
size = 4
w_class = 1
/obj/item/weapon/reagent_containers/food/snacks/variable/jelly
name = "jelly"
desc = "All your friends will be jelly."
icon_state = "jellycustom"
size = 8
/obj/item/weapon/reagent_containers/food/snacks/variable/cereal
name = "cereal"
desc = "Crispy and flaky"
icon_state = "cereal_box"
size = 30
w_class = 3
/obj/item/weapon/reagent_containers/food/snacks/variable/cereal/Initialize()
. =..()
name = pick(list("flakes", "krispies", "crunch", "pops", "O's", "crisp", "loops", "jacks", "clusters"))
/obj/item/weapon/reagent_containers/food/snacks/variable/mob
desc = "Poor little thing."
size = 5
w_class = 1
var/kitchen_tag = "animal"
@@ -0,0 +1,142 @@
/*
The mixer subtype is used for the candymaker and cereal maker. They are similar to cookers but with a few
fundamental differences
1. They have a single container which cant be removed. it will eject multiple contents
2. Items can't be added or removed once the process starts
3. Items are all placed in the same container when added directly
4. They do combining mode only. And will always combine the entire contents of the container into an output
*/
/obj/machinery/appliance/mixer
max_contents = 1
stat = POWEROFF
cooking_coeff = 0.75 // Original value 0.4
active_power_usage = 3000
idle_power_usage = 50
/obj/machinery/appliance/mixer/examine(var/mob/user)
. = ..()
if(Adjacent(user))
. += "<span class='notice'>It is currently set to make a [selected_option]</span>"
/obj/machinery/appliance/mixer/Initialize()
. = ..()
cooking_objs += new /datum/cooking_item(new /obj/item/weapon/reagent_containers/cooking_container(src))
cooking = FALSE
selected_option = pick(output_options)
//Mixers cannot-not do combining mode. So the default option is removed from this. A combine target must be chosen
/obj/machinery/appliance/mixer/choose_output()
set src in view(1)
set name = "Choose output"
set category = "Object"
if (!isliving(usr))
return
if (!usr.IsAdvancedToolUser())
to_chat(usr, "<span class='notice'>You can't operate [src].</span>")
return
if(output_options.len)
var/choice = input("What specific food do you wish to make with \the [src]?") as null|anything in output_options
if(!choice)
return
else
selected_option = choice
to_chat(usr, "<span class='notice'>You prepare \the [src] to make \a [selected_option].</span>")
var/datum/cooking_item/CI = cooking_objs[1]
CI.combine_target = selected_option
/obj/machinery/appliance/mixer/has_space(var/obj/item/I)
var/datum/cooking_item/CI = cooking_objs[1]
if (!CI || !CI.container)
return 0
if (CI.container.can_fit(I))
return CI
return 0
/obj/machinery/appliance/mixer/can_remove_items(var/mob/user)
if (stat)
return 1
else
to_chat(user, "<span class='warning'>You can't remove ingredients while it's turned on! Turn it off first or wait for it to finish.</span>")
//Container is not removable
/obj/machinery/appliance/mixer/removal_menu(var/mob/user)
if (can_remove_items(user))
var/list/menuoptions = list()
for (var/a in cooking_objs)
var/datum/cooking_item/CI = a
if (CI.container)
if (!CI.container.check_contents())
to_chat(user, "There's nothing in [src] you can remove!")
return
for (var/obj/item/I in CI.container)
menuoptions[I.name] = I
var/selection = input(user, "Which item would you like to remove? If you want to remove chemicals, use an empty beaker.", "Remove ingredients") as null|anything in menuoptions
if (selection)
var/obj/item/I = menuoptions[selection]
if (!user || !user.put_in_hands(I))
I.forceMove(get_turf(src))
update_icon()
return 1
return 0
/obj/machinery/appliance/mixer/toggle_power()
set src in view(1)
set name = "Toggle Power"
set category = "Object"
var/datum/cooking_item/CI = cooking_objs[1]
if(!CI.container.check_contents())
to_chat("There's nothing in it! Add ingredients before turning [src] on!")
return
if(stat & POWEROFF)//Its turned off
stat &= ~POWEROFF
if(usr)
usr.visible_message("[usr] turns the [src] on", "You turn on \the [src].")
get_cooking_work(CI)
use_power = 2
else //Its on, turn it off
stat |= POWEROFF
use_power = 0
if(usr)
usr.visible_message("[usr] turns the [src] off", "You turn off \the [src].")
playsound(src, 'sound/machines/click.ogg', 40, 1)
update_icon()
/obj/machinery/appliance/mixer/can_insert(var/obj/item/I, var/mob/user)
if(!stat)
to_chat(user, "<span class='warning'>,You can't add items while \the [src] is running. Wait for it to finish or turn the power off to abort.</span>")
return 0
else
return ..()
/obj/machinery/appliance/mixer/finish_cooking(var/datum/cooking_item/CI)
..()
stat |= POWEROFF
playsound(src, 'sound/machines/click.ogg', 40, 1)
use_power = 0
CI.reset()
update_icon()
/obj/machinery/appliance/mixer/update_icon()
if (!stat)
icon_state = on_icon
else
icon_state = off_icon
/obj/machinery/appliance/mixer/process()
if (!stat)
for (var/i in cooking_objs)
do_cooking_tick(i)
@@ -1,18 +1,21 @@
/obj/machinery/cooker/candy
name = "candy machine"
desc = "Get yer candied cheese wheels here!"
icon_state = "mixer_off"
off_icon = "mixer_off"
on_icon = "mixer_on"
cook_type = "candied"
output_options = list(
"Jawbreaker" = /obj/item/weapon/reagent_containers/food/snacks/variable/jawbreaker,
"Candy Bar" = /obj/item/weapon/reagent_containers/food/snacks/variable/candybar,
"Sucker" = /obj/item/weapon/reagent_containers/food/snacks/variable/sucker,
"Jelly" = /obj/item/weapon/reagent_containers/food/snacks/variable/jelly
)
/obj/machinery/cooker/candy/change_product_appearance(var/obj/item/weapon/reagent_containers/food/snacks/cooked/product)
food_color = get_random_colour(1)
. = ..()
/obj/machinery/appliance/mixer/candy
name = "candy machine"
desc = "Get yer candied cheese wheels here!"
icon_state = "mixer_off"
off_icon = "mixer_off"
on_icon = "mixer_on"
cook_type = "candied"
appliancetype = CANDYMAKER
circuit = /obj/item/weapon/circuitboard/candymachine
cooking_coeff = 1.0 // Original Value 0.6
output_options = list(
"Jawbreaker" = /obj/item/weapon/reagent_containers/food/snacks/variable/jawbreaker,
"Candy Bar" = /obj/item/weapon/reagent_containers/food/snacks/variable/candybar,
"Sucker" = /obj/item/weapon/reagent_containers/food/snacks/variable/sucker,
"Jelly" = /obj/item/weapon/reagent_containers/food/snacks/variable/jelly
)
/obj/machinery/appliance/mixer/candy/change_product_appearance(var/obj/item/weapon/reagent_containers/food/snacks/cooked/product)
food_color = get_random_colour(1)
. = ..()
@@ -1,25 +1,63 @@
/obj/machinery/cooker/cereal
name = "cereal maker"
desc = "Now with Dann O's available!"
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "cereal_off"
cook_type = "cerealized"
on_icon = "cereal_on"
off_icon = "cereal_off"
/obj/machinery/cooker/cereal/change_product_strings(var/obj/item/weapon/reagent_containers/food/snacks/product)
. = ..()
product.name = "box of [cooking_obj.name] cereal"
/obj/machinery/cooker/cereal/change_product_appearance(var/obj/item/weapon/reagent_containers/food/snacks/product)
product.icon = 'icons/obj/food.dmi'
product.icon_state = "cereal_box"
product.filling_color = cooking_obj.color
var/image/food_image = image(cooking_obj.icon, cooking_obj.icon_state)
food_image.color = cooking_obj.color
food_image.overlays += cooking_obj.overlays
food_image.transform *= 0.7
product.overlays += food_image
/obj/machinery/appliance/mixer/cereal
name = "cereal maker"
desc = "Now with Dann O's available!"
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "cereal_off"
cook_type = "cerealized"
on_icon = "cereal_on"
off_icon = "cereal_off"
appliancetype = CEREALMAKER
circuit = /obj/item/weapon/circuitboard/cerealmaker
output_options = list(
"Cereal" = /obj/item/weapon/reagent_containers/food/snacks/variable/cereal
)
/*
/obj/machinery/appliance/mixer/cereal/change_product_strings(var/obj/item/weapon/reagent_containers/food/snacks/product, var/datum/cooking_item/CI)
. = ..()
product.name = "box of [CI.object.name] cereal"
/obj/machinery/appliance/mixer/cereal/change_product_appearance(var/obj/item/weapon/reagent_containers/food/snacks/product)
product.icon = 'icons/obj/food.dmi'
product.icon_state = "cereal_box"
product.filling_color = CI.object.color
var/image/food_image = image(CI.object.icon, CI.object.icon_state)
food_image.color = CI.object.color
food_image.overlays += CI.object.overlays
food_image.transform *= 0.7
product.overlays += food_image
*/
/obj/machinery/appliance/mixer/cereal/combination_cook(var/datum/cooking_item/CI)
var/list/images = list()
var/num = 0
for(var/obj/item/I in CI.container)
if (istype(I, /obj/item/weapon/reagent_containers/food/snacks/variable/cereal))
//Images of cereal boxes on cereal boxes is dumb
continue
var/image/food_image = image(I.icon, I.icon_state)
food_image.color = I.color
food_image.add_overlay(I.overlays)
food_image.transform *= 0.7 - (num * 0.05)
food_image.pixel_x = rand(-2,2)
food_image.pixel_y = rand(-3,5)
if (!images[I.icon_state])
images[I.icon_state] = food_image
num++
if (num > 3)
continue
var/obj/item/weapon/reagent_containers/food/snacks/result = ..()
result.color = result.filling_color
for (var/i in images)
result.overlays += images[i]
@@ -0,0 +1,172 @@
//Cooking containers are used in ovens and fryers, to hold multiple ingredients for a recipe.
//They work fairly similar to the microwave - acting as a container for objects and reagents,
//which can be checked against recipe requirements in order to cook recipes that require several things
/obj/item/weapon/reagent_containers/cooking_container
icon = 'icons/obj/cooking_machines.dmi'
var/shortname
var/max_space = 20//Maximum sum of w-classes of foods in this container at once
var/max_reagents = 80//Maximum units of reagents
flags = OPENCONTAINER | NOREACT
var/list/insertable = list(
/obj/item/weapon/reagent_containers/food/snacks,
/obj/item/weapon/holder,
/obj/item/weapon/paper
)
/obj/item/weapon/reagent_containers/cooking_container/Initialize()
. = ..()
create_reagents(max_reagents)
flags |= OPENCONTAINER | NOREACT
/obj/item/weapon/reagent_containers/cooking_container/examine(var/mob/user)
. = ..()
if (contents.len)
var/string = "It contains....</br>"
for (var/atom/movable/A in contents)
string += "[A.name] </br>"
. += "<span class='notice'>[string]</span>"
if (reagents.total_volume)
. += "<span class='notice'>It contains [reagents.total_volume]u of reagents.</span>"
/obj/item/weapon/reagent_containers/cooking_container/attackby(var/obj/item/I as obj, var/mob/user as mob)
for (var/possible_type in insertable)
if (istype(I, possible_type))
if (!can_fit(I))
to_chat(user, "<span class='warning'>There's no more space in the [src] for that!</span>")
return 0
if(!user.unEquip(I))
return
I.forceMove(src)
to_chat(user, "<span class='notice'>You put the [I] into the [src].</span>")
return
/obj/item/weapon/reagent_containers/cooking_container/verb/empty()
set src in oview(1)
set name = "Empty Container"
set category = "Object"
set desc = "Removes items from the container, excluding reagents."
do_empty(usr)
/obj/item/weapon/reagent_containers/cooking_container/proc/do_empty(mob/user)
if (!isliving(user))
//Here we only check for ghosts. Animals are intentionally allowed to remove things from oven trays so they can eat it
return
if (user.stat || user.restrained())
to_chat(user, "<span class='notice'>You are in no fit state to do this.</span>")
return
if (!Adjacent(user))
to_chat(user, "You can't reach [src] from here.")
return
if (!contents.len)
to_chat(user, "<span class='warning'>There's nothing in the [src] you can remove!</span>")
return
for (var/atom/movable/A in contents)
A.forceMove(get_turf(src))
to_chat(user, "<span class='notice'>You remove all the solid items from the [src].</span>")
/obj/item/weapon/reagent_containers/cooking_container/proc/check_contents()
if (contents.len == 0)
if (!reagents || reagents.total_volume == 0)
return 0//Completely empty
else if (contents.len == 1)
if (!reagents || reagents.total_volume == 0)
return 1//Contains only a single object which can be extracted alone
return 2//Contains multiple objects and/or reagents
/obj/item/weapon/reagent_containers/cooking_container/AltClick(var/mob/user)
do_empty(user)
//Deletes contents of container.
//Used when food is burned, before replacing it with a burned mess
/obj/item/weapon/reagent_containers/cooking_container/proc/clear()
for (var/atom/a in contents)
qdel(a)
if (reagents)
reagents.clear_reagents()
/obj/item/weapon/reagent_containers/cooking_container/proc/label(var/number, var/CT = null)
//This returns something like "Fryer basket 1 - empty"
//The latter part is a brief reminder of contents
//This is used in the removal menu
. = shortname
if (!isnull(number))
.+= " [number]"
.+= " - "
if (CT)
.+=CT
else if (contents.len)
for (var/obj/O in contents)
.+=O.name//Just append the name of the first object
return
else if (reagents && reagents.total_volume > 0)
var/datum/reagent/R = reagents.get_master_reagent()
.+=R.name//Append name of most voluminous reagent
return
else
. += "empty"
/obj/item/weapon/reagent_containers/cooking_container/proc/can_fit(var/obj/item/I)
var/total = 0
for (var/obj/item/J in contents)
total += J.w_class
if((max_space - total) >= I.w_class)
return 1
//Takes a reagent holder as input and distributes its contents among the items in the container
//Distribution is weighted based on the volume already present in each item
/obj/item/weapon/reagent_containers/cooking_container/proc/soak_reagent(var/datum/reagents/holder)
var/total = 0
var/list/weights = list()
for (var/obj/item/I in contents)
if (I.reagents && I.reagents.total_volume)
total += I.reagents.total_volume
weights[I] = I.reagents.total_volume
if (total > 0)
for (var/obj/item/I in contents)
if (weights[I])
holder.trans_to(I, weights[I] / total)
/obj/item/weapon/reagent_containers/cooking_container/oven
name = "oven dish"
shortname = "shelf"
desc = "Put ingredients in this; designed for use with an oven. Warranty void if used incorrectly."
icon_state = "ovendish"
max_space = 30
max_reagents = 120
/obj/item/weapon/reagent_containers/cooking_container/oven/Initialize()
. = ..()
// We add to the insertable list specifically for the oven trays, to allow specialty cakes.
insertable += list(
/obj/item/clothing/head/cakehat, // This is because we want to allow birthday cakes to be makeable.
/obj/item/organ/internal/brain // As before, needed for braincake
)
/obj/item/weapon/reagent_containers/cooking_container/fryer
name = "fryer basket"
shortname = "basket"
desc = "Put ingredients in this; designed for use with a deep fryer. Warranty void if used incorrectly."
icon_state = "basket"
/obj/item/weapon/reagent_containers/cooking_container/grill
name = "grill rack"
shortname = "rack"
desc = "Put ingredients 'in'/on this; designed for use with a grill. Warranty void if used incorrectly."
icon_state = "grillrack"
@@ -1,4 +1,4 @@
/obj/machinery/cooker/fryer
/obj/machinery/appliance/cooker/fryer
name = "deep fryer"
desc = "Deep fried <i>everything</i>."
icon_state = "fryer_off"
@@ -9,77 +9,246 @@
food_color = "#FFAD33"
cooked_sound = 'sound/machines/ding.ogg'
var/datum/looping_sound/deep_fryer/fry_loop
circuit = /obj/item/weapon/circuitboard/fryer
appliancetype = FRYER
active_power_usage = 12 KILOWATTS
heating_power = 12000
min_temp = 140 + T0C // Same as above, increasing this to just under 2x to make the % increase on efficiency not quite so painful as it would be at 80.
optimal_temp = 400 + T0C // Increasing this to be 2x Oven to allow for a much higher/realistic frying temperatures. Doesn't really do anything but make heating the fryer take a bit longer.
optimal_power = 0.95 // .35 higher than the default to give fryers faster cooking speed.
idle_power_usage = 3.6 KILOWATTS
// Power used to maintain temperature once it's heated.
// Going with 25% of the active power. This is a somewhat arbitrary value.
/obj/machinery/cooker/fryer/Initialize()
resistance = 60000 // Approx. 10 minutes to heat up.
max_contents = 2
container_type = /obj/item/weapon/reagent_containers/cooking_container/fryer
stat = POWEROFF // Starts turned off
var/datum/reagents/oil
var/optimal_oil = 9000 //90 litres of cooking oil
/obj/machinery/appliance/cooker/fryer/Initialize()
. = ..()
fry_loop = new(list(src), FALSE)
return ..()
oil = new/datum/reagents(optimal_oil * 1.25, src)
var/variance = rand()*0.15
// Fryer is always a little below full, but its usually negligible
/obj/machinery/cooker/fryer/Destroy()
if(prob(20))
// Sometimes the fryer will start with much less than full oil, significantly impacting efficiency until filled
variance = rand()*0.5
oil.add_reagent("cornoil", optimal_oil*(1 - variance))
/obj/machinery/appliance/cooker/fryer/Destroy()
QDEL_NULL(fry_loop)
QDEL_NULL(oil)
return ..()
/obj/machinery/appliance/cooker/fryer/examine(var/mob/user)
. = ..()
if(Adjacent(user))
to_chat(user, "Oil Level: [oil.total_volume]/[optimal_oil]")
/obj/machinery/appliance/cooker/fryer/heat_up()
if (..())
//Set temperature of oil reagent
var/datum/reagent/nutriment/triglyceride/oil/OL = oil.get_master_reagent()
if (OL && istype(OL))
OL.data["temperature"] = temperature
/obj/machinery/cooker/fryer/set_cooking(new_setting)
..()
if(new_setting)
fry_loop.start()
/obj/machinery/appliance/cooker/fryer/equalize_temperature()
if (..())
//Set temperature of oil reagent
var/datum/reagent/nutriment/triglyceride/oil/OL = oil.get_master_reagent()
if (OL && istype(OL))
OL.data["temperature"] = temperature
/obj/machinery/appliance/cooker/fryer/update_cooking_power()
..()//In addition to parent temperature calculation
//Fryer efficiency also drops when oil levels arent optimal
var/oil_level = 0
var/datum/reagent/nutriment/triglyceride/oil/OL = oil.get_master_reagent()
if(OL && istype(OL))
oil_level = OL.volume
var/oil_efficiency = 0
if(oil_level)
oil_efficiency = oil_level / optimal_oil
if(oil_efficiency > 1)
//We're above optimal, efficiency goes down as we pass too much over it
oil_efficiency = 1 - (oil_efficiency - 1)
cooking_power *= oil_efficiency
/obj/machinery/appliance/cooker/fryer/update_icon()
if(!stat)
..()
if(cooking == TRUE)
icon_state = on_icon
if(fry_loop)
fry_loop.start(src)
else
icon_state = off_icon
if(fry_loop)
fry_loop.stop(src)
else
fry_loop.stop()
icon_state = off_icon
if(fry_loop)
fry_loop.stop(src)
..()
//Fryer gradually infuses any cooked food with oil. Moar calories
//This causes a slow drop in oil levels, encouraging refill after extended use
/obj/machinery/appliance/cooker/fryer/do_cooking_tick(var/datum/cooking_item/CI)
if(..() && (CI.oil < CI.max_oil) && prob(20))
var/datum/reagents/buffer = new /datum/reagents(2)
oil.trans_to_holder(buffer, min(0.5, CI.max_oil - CI.oil))
CI.oil += buffer.total_volume
CI.container.soak_reagent(buffer)
/obj/machinery/cooker/fryer/cook_mob(var/mob/living/victim, var/mob/user)
//To solve any odd logic problems with results having oil as part of their compiletime ingredients.
//Upon finishing a recipe the fryer will analyse any oils in the result, and replace them with our oil
//As well as capping the total to the max oil
/obj/machinery/appliance/cooker/fryer/finish_cooking(var/datum/cooking_item/CI)
..()
var/total_oil = 0
var/total_our_oil = 0
var/total_removed = 0
var/datum/reagent/our_oil = oil.get_master_reagent()
for (var/obj/item/I in CI.container)
if (I.reagents && I.reagents.total_volume)
for (var/datum/reagent/R in I.reagents.reagent_list)
if (istype(R, /datum/reagent/nutriment/triglyceride/oil))
total_oil += R.volume
if (R.id != our_oil.id)
total_removed += R.volume
I.reagents.remove_reagent(R.id, R.volume)
else
total_our_oil += R.volume
if (total_removed > 0 || total_oil != CI.max_oil)
total_oil = min(total_oil, CI.max_oil)
if (total_our_oil < total_oil)
//If we have less than the combined total, then top up from our reservoir
var/datum/reagents/buffer = new /datum/reagents(INFINITY)
oil.trans_to_holder(buffer, total_oil - total_our_oil)
CI.container.soak_reagent(buffer)
else if (total_our_oil > total_oil)
//If we have more than the maximum allowed then we delete some.
//This could only happen if one of the objects spawns with the same type of oil as ours
var/portion = 1 - (total_oil / total_our_oil) //find the percentage to remove
for (var/obj/item/I in CI.container)
if (I.reagents && I.reagents.total_volume)
for (var/datum/reagent/R in I.reagents.reagent_list)
if (R.id == our_oil.id)
I.reagents.remove_reagent(R.id, R.volume*portion)
/obj/machinery/appliance/cooker/fryer/cook_mob(var/mob/living/victim, var/mob/user)
if(!istype(victim))
return
user.visible_message("<span class='danger'>\The [user] starts pushing \the [victim] into \the [src]!</span>")
icon_state = on_icon
cooking = 1
fry_loop.start()
// user.visible_message("<span class='danger'>\The [user] starts pushing \the [victim] into \the [src]!</span>")
//Removed delay on this action in favour of a cooldown after it
//If you can lure someone close to the fryer and grab them then you deserve success.
//And a delay on this kind of niche action just ensures it never happens
//Cooldown ensures it can't be spammed to instakill someone
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN*3)
fry_loop.start(src)
if(!do_mob(user, victim, 20))
cooking = 0
cooking = FALSE
icon_state = off_icon
fry_loop.stop()
fry_loop.stop(src)
return
if(!victim || !victim.Adjacent(user))
to_chat(user, "<span class='danger'>Your victim slipped free!</span>")
cooking = 0
cooking = FALSE
icon_state = off_icon
fry_loop.stop()
fry_loop.stop(src)
return
var/damage = rand(7,13) // Though this damage seems reduced, some hot oil is transferred to the victim and will burn them for a while after
var/datum/reagent/nutriment/triglyceride/oil/OL = oil.get_master_reagent()
damage *= OL.heatdamage(victim)
var/obj/item/organ/external/E
var/nopain
if(ishuman(victim) && user.zone_sel.selecting != "groin" && user.zone_sel.selecting != "chest")
var/mob/living/carbon/human/H = victim
if(H.species.flags & NO_PAIN)
nopain = 2
E = H.get_organ(user.zone_sel.selecting)
if(E.robotic >= ORGAN_ROBOT)
if(!E || E.species.flags & NO_PAIN)
nopain = 2
else if(E.robotic >= ORGAN_ROBOT)
nopain = 1
user.visible_message("<span class='danger'>\The [user] shoves \the [victim][E ? "'s [E.name]" : ""] into \the [src]!</span>")
if (damage > 0)
if(E)
if(E.children && E.children.len)
for(var/obj/item/organ/external/child in E.children)
if(nopain && nopain < 2 && !(child.robotic >= ORGAN_ROBOT))
nopain = 0
child.take_damage(0, damage)
damage -= (damage*0.5)//IF someone's arm is plunged in, the hand should take most of it
E.take_damage(0, damage)
else
victim.apply_damage(damage, BURN, user.zone_sel.selecting)
if(E)
E.take_damage(0, rand(20,30))
if(E.children && E.children.len)
for(var/obj/item/organ/external/child in E.children)
if(nopain && nopain < 2 && !(child.robotic >= ORGAN_ROBOT))
nopain = 0
child.take_damage(0, rand(20,30))
else
victim.apply_damage(rand(30,40), BURN, user.zone_sel.selecting)
if(!nopain)
to_chat(victim, "<span class='danger'>Agony consumes you as searing hot oil scorches your [E ? E.name : "flesh"] horribly!</span>")
victim.emote("scream")
else
to_chat(victim, "<span class='danger'>Searing hot oil scorches your [E ? E.name : "flesh"]!</span>")
if(!nopain)
to_chat(victim, "<span class='danger'>Agony consumes you as searing hot oil scorches your [E ? E.name : "flesh"] horribly!</span>")
victim.emote("scream")
else
to_chat(victim, "<span class='danger'>Searing hot oil scorches your [E ? E.name : "flesh"]!</span>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Has [cook_type] \the [victim] ([victim.ckey]) in \a [src]</font>")
victim.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [cook_type] in \a [src] by [user.name] ([user.ckey])</font>")
msg_admin_attack("[key_name_admin(user)] [cook_type] \the [victim] ([victim.ckey]) in \a [src]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(victim.client)
add_attack_logs(user,victim,"[cook_type] in [src]")
icon_state = off_icon
cooking = 0
//Coat the victim in some oil
oil.trans_to(victim, 40)
fry_loop.stop()
return
/obj/machinery/appliance/cooker/fryer/attackby(var/obj/item/I, var/mob/user)
if(istype(I, /obj/item/weapon/reagent_containers/glass) && I.reagents)
if (I.reagents.total_volume <= 0 && oil)
//Its empty, handle scooping some hot oil out of the fryer
oil.trans_to(I, I.reagents.maximum_volume)
user.visible_message("[user] scoops some oil out of \the [src].", span("notice","You scoop some oil out of \the [src]."))
return 1
else
//It contains stuff, handle pouring any oil into the fryer
//Possibly in future allow pouring non-oil reagents in, in order to sabotage it and poison food.
//That would really require coding some sort of filter or better replacement mechanism first
//So for now, restrict to oil only
var/amount = 0
for (var/datum/reagent/R in I.reagents.reagent_list)
if (istype(R, /datum/reagent/nutriment/triglyceride/oil))
var/delta = oil.get_free_space()
delta = min(delta, R.volume)
oil.add_reagent(R.id, delta)
I.reagents.remove_reagent(R.id, delta)
amount += delta
if (amount > 0)
user.visible_message("[user] pours some oil into \the [src].", span("notice","You pour [amount]u of oil into \the [src]."), "<span class='notice'>You hear something viscous being poured into a metal container.</span>")
return 1
//If neither of the above returned, then call parent as normal
..()
@@ -1,10 +1,102 @@
/obj/machinery/cooker/grill
name = "grill"
desc = "Backyard grilling, IN SPACE."
icon_state = "grill_off"
cook_type = "grilled"
cook_time = 100
food_color = "#A34719"
on_icon = "grill_on"
off_icon = "grill_off"
can_burn_food = 1
/obj/machinery/appliance/cooker/grill
name = "grill"
desc = "Backyard grilling, IN SPACE."
icon_state = "grill_off"
cook_type = "grilled"
appliancetype = GRILL
food_color = "#A34719"
on_icon = "grill_on"
off_icon = "grill_off"
can_burn_food = TRUE
circuit = /obj/item/weapon/circuitboard/grill
active_power_usage = 4 KILOWATTS
heating_power = 4000
idle_power_usage = 2 KILOWATTS
optimal_power = 1.2 // Things on the grill cook .6 faster - this is now the fastest appliance to heat and to cook on. BURGERS GO SIZZLE.
stat = POWEROFF // Starts turned off.
// Grill is faster to heat and setup than the rest.
optimal_temp = 120 + T0C
min_temp = 60 + T0C
resistance = 8 KILOWATTS // Very fast to heat up.
max_contents = 3 // Arbitrary number, 3 grill 'racks'
container_type = /obj/item/weapon/reagent_containers/cooking_container/grill
/* // Test Comment this out too, /cooker does this for us, and this path '/obj/machinery/appliance/grill' is invalid anyways, meaning it does jack shit. - Updated the paths, but I'm basically commenting all this shit out and if the grill works as-normal, none of this stuff is needed.
/obj/machinery/appliance/grill/toggle_power()
set src in view()
set name = "Toggle Power"
set category = "Object"
var/datum/cooking_item/CI = cooking_objs[1]
if (stat & POWEROFF)//Its turned off
stat &= ~POWEROFF
if (usr)
usr.visible_message("[usr] turns \the [src] on", "You turn on \the [src].")
get_cooking_work(CI)
use_power = 2
else //It's on, turn it off
stat |= POWEROFF
use_power = 0
if (usr)
usr.visible_message("[usr] turns \the [src] off", "You turn off \the [src].")
playsound(src, 'sound/machines/click.ogg', 40, 1)
update_icon()
/obj/machinery/appliance/cooker/grill/Initialize()
. = ..()
// cooking_objs += new /datum/cooking_item(new /obj/item/weapon/reagent_containers/cooking_container(src))
cooking = FALSE
/obj/machinery/appliance/cooker/grill/has_space(var/obj/item/I)
var/datum/cooking_item/CI = cooking_objs[1]
if (!CI || !CI.container)
return 0
if (CI.container.can_fit(I))
return CI
return 0
*/
/* // Test comment this out, I don't think this is doing shit anyways.
//Container is not removable
/obj/machinery/appliance/grill/removal_menu(var/mob/user)
if (can_remove_items(user))
var/list/menuoptions = list()
for (var/a in cooking_objs)
var/datum/cooking_item/CI = a
if (CI.container)
if (!CI.container.check_contents())
to_chat(user, "There's nothing in the [src] you can remove!")
return
for (var/obj/item/I in CI.container)
menuoptions[I.name] = I
var/selection = input(user, "Which item would you like to remove? If you want to remove chemicals, use an empty beaker.", "Remove ingredients") as null|anything in menuoptions
if (selection)
var/obj/item/I = menuoptions[selection]
if (!user || !user.put_in_hands(I))
I.forceMove(get_turf(src))
update_icon()
return 1
return 0
*/
/obj/machinery/appliance/grill/update_icon() // TODO: Cooking icon
if(!stat)
icon_state = on_icon
else
icon_state = off_icon
/* // Test remove this too.
/obj/machinery/appliance/grill/process()
if (!stat)
for (var/i in cooking_objs)
do_cooking_tick(i)
*/
@@ -1,23 +1,134 @@
/obj/machinery/cooker/oven
name = "oven"
desc = "Cookies are ready, dear."
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "oven_off"
on_icon = "oven_on"
off_icon = "oven_off"
cook_type = "baked"
cook_time = 300
food_color = "#A34719"
can_burn_food = 1
output_options = list(
"Personal Pizza" = /obj/item/weapon/reagent_containers/food/snacks/variable/pizza,
"Bread" = /obj/item/weapon/reagent_containers/food/snacks/variable/bread,
"Pie" = /obj/item/weapon/reagent_containers/food/snacks/variable/pie,
"Small Cake" = /obj/item/weapon/reagent_containers/food/snacks/variable/cake,
"Hot Pocket" = /obj/item/weapon/reagent_containers/food/snacks/variable/pocket,
"Kebab" = /obj/item/weapon/reagent_containers/food/snacks/variable/kebab,
"Waffles" = /obj/item/weapon/reagent_containers/food/snacks/variable/waffles,
"Cookie" = /obj/item/weapon/reagent_containers/food/snacks/variable/cookie,
"Donut" = /obj/item/weapon/reagent_containers/food/snacks/variable/donut,
)
/obj/machinery/appliance/cooker/oven
name = "oven"
desc = "Cookies are ready, dear."
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "ovenopen"
cook_type = "baked"
appliancetype = OVEN
food_color = "#A34719"
can_burn_food = TRUE
circuit = /obj/item/weapon/circuitboard/oven
active_power_usage = 6 KILOWATTS
heating_power = 6000
//Based on a double deck electric convection oven
resistance = 30000 // Approx. 12 minutes to heat up.
idle_power_usage = 2 KILOWATTS
//uses ~30% power to stay warm
optimal_power = 0.8 // Oven cooks .2 faster than the default speed.
light_x = 2
max_contents = 5
container_type = /obj/item/weapon/reagent_containers/cooking_container/oven
stat = POWEROFF //Starts turned off
var/open = FALSE // Start closed just so people don't try to preheat with it open, lol.
output_options = list(
"Pizza" = /obj/item/weapon/reagent_containers/food/snacks/variable/pizza,
"Bread" = /obj/item/weapon/reagent_containers/food/snacks/variable/bread,
"Pie" = /obj/item/weapon/reagent_containers/food/snacks/variable/pie,
"Cake" = /obj/item/weapon/reagent_containers/food/snacks/variable/cake,
"Hot Pocket" = /obj/item/weapon/reagent_containers/food/snacks/variable/pocket,
"Kebab" = /obj/item/weapon/reagent_containers/food/snacks/variable/kebab,
"Waffles" = /obj/item/weapon/reagent_containers/food/snacks/variable/waffles,
"Cookie" = /obj/item/weapon/reagent_containers/food/snacks/variable/cookie,
"Donut" = /obj/item/weapon/reagent_containers/food/snacks/variable/donut,
)
/obj/machinery/appliance/cooker/oven/update_icon()
if(!open)
if(!stat)
icon_state = "ovenclosed_on"
if(cooking == TRUE)
icon_state = "ovenclosed_cooking"
else
icon_state = "ovenclosed_on"
else
icon_state = "ovenclosed_off"
else
icon_state = "ovenopen"
..()
/obj/machinery/appliance/cooker/oven/AltClick(var/mob/user)
try_toggle_door(user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
/obj/machinery/appliance/cooker/oven/verb/toggle_door()
set src in oview(1)
set category = "Object"
set name = "Open/close oven door"
try_toggle_door(usr)
/obj/machinery/appliance/cooker/oven/proc/try_toggle_door(mob/user)
if(!isliving(usr) || isAI(user))
return
if(!usr.IsAdvancedToolUser())
to_chat(user, "<span class='notice'>You lack the dexterity to do that.</span>")
return
if(!Adjacent(usr))
to_chat(user, "<span class='notice'>You can't reach the [src] from there, get closer!</span>")
return
if(open)
open = FALSE
loss = (heating_power / resistance) * 0.5
cooking = TRUE
else
open = TRUE
loss = (heating_power / resistance) * 4
//When the oven door is opened, heat is lost MUCH faster and you stop cooking (because the door is open)
cooking = FALSE
playsound(src, 'sound/machines/hatch_open.ogg', 20, 1)
update_icon()
/obj/machinery/appliance/cooker/oven/proc/manip(var/obj/item/I)
// check if someone's trying to manipulate the machine
if(I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/weapon/storage/part_replacer))
return TRUE
else
return FALSE
/obj/machinery/appliance/cooker/oven/can_insert(var/obj/item/I, var/mob/user)
if(!open && !manip(I))
to_chat(user, "<span class='warning'>You can't put anything in while the door is closed!</span>")
return 0
else
return ..()
//If an oven's door is open it will lose heat every proc, even if it also gained it
//But dont call equalize twice in one stack. A return value of -1 from the parent indicates equalize was already called
/obj/machinery/appliance/cooker/oven/heat_up()
.=..()
if(open && . != -1)
var/turf/T = get_turf(src)
if(temperature > T.temperature)
equalize_temperature()
/obj/machinery/appliance/cooker/oven/can_remove_items(var/mob/user)
if(!open)
to_chat(user, "<span class='warning'>You can't take anything out while the door is closed!</span>")
return 0
else
return ..()
//Oven has lots of recipes and combine options. The chance for interference is high, so
//If a combine target is set the oven will do it instead of checking recipes
/obj/machinery/appliance/cooker/oven/finish_cooking(var/datum/cooking_item/CI)
if(CI.combine_target)
CI.result_type = 3//Combination type. We're making something out of our ingredients
visible_message("<span class='notice'>\The [src] pings!</span>")
combination_cook(CI)
return
else
..()
+187 -61
View File
@@ -1,13 +1,14 @@
/obj/machinery/microwave
name = "microwave"
name = "Microwave"
desc = "Studies are inconclusive on whether pressing your face against the glass is harmful."
icon = 'icons/obj/kitchen.dmi'
icon_state = "mw"
layer = 2.9
density = 1
anchored = 1
use_power = USE_POWER_IDLE
idle_power_usage = 5
active_power_usage = 100
active_power_usage = 2000
clicksound = "button"
clickvol = "30"
flags = OPENCONTAINER | NOREACT
@@ -18,9 +19,11 @@
var/circuit_item_capacity = 1 //how many items does the circuit add to max number of items
var/item_level = 0 // items microwave can handle, 0 foodstuff, 1 materials
var/global/list/acceptable_items // List of the items you can put in
var/global/list/datum/recipe/microwave/available_recipes // List of the recipes you can use
var/global/list/available_recipes // List of the recipes you can use
var/global/list/acceptable_reagents // List of the reagents you can put in
var/global/max_n_of_items = 0
var/global/max_n_of_items = 20
var/appliancetype = MICROWAVE
var/datum/looping_sound/microwave/soundloop
@@ -32,24 +35,26 @@
/obj/machinery/microwave/Initialize()
. = ..()
reagents = new/datum/reagents(100)
reagents.my_atom = src
default_apply_parts()
if (!available_recipes)
if(!available_recipes)
available_recipes = new
for (var/type in (typesof(/datum/recipe/microwave)-/datum/recipe/microwave))
available_recipes+= new type
for(var/T in (typesof(/datum/recipe)-/datum/recipe))
var/datum/recipe/type = T
if((initial(type.appliance) & appliancetype))
available_recipes += new type
acceptable_items = new
acceptable_reagents = new
for (var/datum/recipe/microwave/recipe in available_recipes)
for (var/datum/recipe/recipe in available_recipes)
for (var/item in recipe.items)
acceptable_items |= item
for (var/reagent in recipe.reagents)
acceptable_reagents |= reagent
if (recipe.items)
max_n_of_items = max(max_n_of_items,recipe.items.len)
// This will do until I can think of a fun recipe to use dionaea in -
// will also allow anything using the holder item to be microwaved into
// impure carbon. ~Z
@@ -95,16 +100,10 @@
src.icon_state = "mw"
src.broken = 0 // Fix it!
src.dirty = 0 // just to be sure
src.flags = OPENCONTAINER | NOREACT
src.flags = OPENCONTAINER
else
to_chat(user, "<span class='warning'>It's broken!</span>")
return 1
else if(default_deconstruction_screwdriver(user, O))
return
else if(default_deconstruction_crowbar(user, O))
return
else if(default_unfasten_wrench(user, O, 10))
return
else if(src.dirty==100) // The microwave 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
@@ -120,12 +119,12 @@
src.dirty = 0 // It's clean!
src.broken = 0 // just to be sure
src.icon_state = "mw"
src.flags = OPENCONTAINER | NOREACT
src.flags = OPENCONTAINER
else //Otherwise bad luck!!
to_chat(user, "<span class='warning'>It's dirty!</span>")
return 1
else if(is_type_in_list(O,acceptable_items))
if (contents.len>=(max_n_of_items + component_parts.len + circuit_item_capacity)) //Adds component_parts to the maximum number of items. changed 1 to actually just be the circuit item capacity var.
if(contents.len>=(max_n_of_items + component_parts.len + circuit_item_capacity)) //Adds component_parts to the maximum number of items. changed 1 to actually just be the circuit item capacity var.
to_chat(user, "<span class='warning'>This [src] is full of ingredients, you cannot put more.</span>")
return 1
if(istype(O, /obj/item/stack) && O:get_amount() > 1) // This is bad, but I can't think of how to change it
@@ -137,9 +136,8 @@
"<span class='notice'>You add one of [O] to \the [src].</span>")
return
else
// user.remove_from_mob(O) //This just causes problems so far as I can tell. -Pete
user.drop_item()
O.loc = src
// user.remove_from_mob(O) //This just causes problems so far as I can tell. -Pete - Man whoever you are, it's been years. o7
user.drop_from_inventory(O,src)
user.visible_message( \
"<span class='notice'>\The [user] has added \the [O] to \the [src].</span>", \
"<span class='notice'>You add \the [O] to \the [src].</span>")
@@ -159,6 +157,27 @@
var/obj/item/weapon/grab/G = O
to_chat(user, "<span class='warning'>This is ridiculous. You can not fit \the [G.affecting] in this [src].</span>")
return 1
else if(O.is_screwdriver())
default_deconstruction_screwdriver(user, O)
return
else if(O.is_crowbar())
if(default_deconstruction_crowbar(user, O))
return
else
user.visible_message( \
"<span class='notice'>\The [user] begins [src.anchored ? "unsecuring" : "securing"] the microwave.</span>", \
"<span class='notice'>You attempt to [src.anchored ? "unsecure" : "secure"] the microwave.</span>"
)
if (do_after(user,20/O.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] [src.anchored ? "unsecures" : "secures"] the microwave.</span>", \
"<span class='notice'>You [src.anchored ? "unsecure" : "secure"] the microwave.</span>"
)
src.anchored = !src.anchored
else
to_chat(user, "<span class='notice'>You decide not to do that.</span>")
else if(default_part_replacement(user, O))
return
else
to_chat(user, "<span class='warning'>You have no idea what you can cook with this [O].</span>")
..()
@@ -248,64 +267,98 @@
if(stat & (NOPOWER|BROKEN))
return
start()
if (reagents.total_volume==0 && !(locate(/obj) in ((contents - component_parts) - circuit))) //dry run
if (!wzhzhzh(10))
if(reagents.total_volume==0 && !(locate(/obj) in ((contents - component_parts) - circuit))) //dry run
if(!wzhzhzh(16))
abort()
return
abort()
return
var/datum/recipe/microwave/recipe = select_recipe(available_recipes,src)
var/datum/recipe/recipe = select_recipe(available_recipes,src)
var/obj/cooked
if (!recipe)
if(!recipe)
dirty += 1
if (prob(max(10,dirty*5)))
if (!wzhzhzh(4))
if(prob(max(10,dirty*5)))
if(!wzhzhzh(16))
abort()
return
muck_start()
wzhzhzh(4)
wzhzhzh(2)
muck_finish()
cooked = fail()
cooked.loc = src.loc
return
else if (has_extra_item())
if (!wzhzhzh(4))
cooked.forceMove(src.loc)
else if(has_extra_item())
if(!wzhzhzh(16))
abort()
return
broke()
cooked = fail()
cooked.loc = src.loc
return
cooked.forceMove(src.loc)
else
if (!wzhzhzh(10))
if(!wzhzhzh(40))
abort()
return
abort()
stop()
cooked = fail()
cooked.loc = src.loc
return
else
var/halftime = round(recipe.time/10/2)
if (!wzhzhzh(halftime))
abort()
return
if (!wzhzhzh(halftime))
abort()
cooked = fail()
cooked.loc = src.loc
return
cooked = recipe.make_food(src)
abort()
if(cooked)
cooked.loc = src.loc
cooked.forceMove(src.loc)
return
//Making multiple copies of a recipe
var/halftime = round(recipe.time*4/10/2)
if(!wzhzhzh(halftime))
abort()
return
recipe.before_cook(src)
if(!wzhzhzh(halftime))
abort()
cooked = fail()
cooked.forceMove(loc)
recipe.after_cook(src)
return
var/result = recipe.result
var/valid = 1
var/list/cooked_items = list()
var/obj/temp = new /obj(src) //To prevent infinite loops, all results will be moved into a temporary location so they're not considered as inputs for other recipes
while(valid)
var/list/things = list()
things.Add(recipe.make_food(src))
cooked_items += things
//Move cooked things to the buffer so they're not considered as ingredients
for(var/atom/movable/AM in things)
AM.forceMove(temp)
valid = 0
recipe.after_cook(src)
recipe = select_recipe(available_recipes,src)
if(recipe && recipe.result == result)
valid = 1
sleep(2)
for(var/r in cooked_items)
var/atom/movable/R = r
R.forceMove(src) //Move everything from the buffer back to the container
QDEL_NULL(temp)//Delete buffer object
//Any leftover reagents are divided amongst the foods
var/total = reagents.total_volume
for(var/obj/item/weapon/reagent_containers/food/snacks/S in cooked_items)
reagents.trans_to_holder(S.reagents, total/cooked_items.len)
for(var/obj/item/weapon/reagent_containers/food/snacks/S in contents)
S.cook()
dispose(0) //clear out anything left
stop()
return
/obj/machinery/microwave/proc/wzhzhzh(var/seconds as num) // Whoever named this proc is fucking literally Satan. ~ Z
for (var/i=1 to seconds)
if (stat & (NOPOWER|BROKEN))
return 0
use_power(500)
use_power(active_power_usage)
sleep(10)
return 1
@@ -339,17 +392,27 @@
/obj/machinery/microwave/proc/abort()
operating = FALSE // Turn it off again aferwards
icon_state = "mw"
if(icon_state == "mw1")
icon_state = "mw"
updateUsrDialog()
soundloop.stop()
/obj/machinery/microwave/proc/stop()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
operating = FALSE // Turn it off again aferwards
if(icon_state == "mw1")
icon_state = "mw"
updateUsrDialog()
soundloop.stop()
/obj/machinery/microwave/proc/dispose()
for (var/obj/O in ((contents-component_parts)-circuit))
O.loc = src.loc
/obj/machinery/microwave/proc/dispose(var/message = 1)
for (var/atom/movable/A in ((contents-component_parts)-circuit))
A.forceMove(loc)
if (src.reagents.total_volume)
src.dirty++
src.reagents.clear_reagents()
to_chat(usr, "<span class='notice'>You dispose of the microwave contents.</span>")
if(message)
to_chat(usr, "<span class='notice'>You dispose of the microwave contents.</span>")
src.updateUsrDialog()
/obj/machinery/microwave/proc/muck_start()
@@ -383,10 +446,14 @@
var/amount = 0
for (var/obj/O in (((contents - ffuu) - component_parts) - circuit))
amount++
if (O.reagents)
if(O.reagents)
var/id = O.reagents.get_master_reagent_id()
if (id)
if(id)
amount+=O.reagents.get_reagent_amount(id)
if(istype(O, /obj/item/weapon/holder))
var/obj/item/weapon/holder/H = O
if(H.held_mob)
qdel(H.held_mob)
qdel(O)
src.reagents.clear_reagents()
ffuu.reagents.add_reagent("carbon", amount)
@@ -409,6 +476,36 @@
if ("dispose")
dispose()
return
/obj/machinery/microwave/verb/Eject()
set src in oview(1)
set category = "Object"
set name = "Eject content"
usr.visible_message(
"<span class='notice'>[usr] tries to open [src] and remove its contents.</span>" ,
"<span class='notice'>You try to open [src] and remove its contents.</span>"
)
if(!do_after(usr, 1 SECONDS, target = src))
return
if(operating)
to_chat(usr, "<span class='warning'>You can't do that, [src] door is locked!</span>")
return
usr.visible_message(
"<span class='notice'>[usr] opened [src] and has taken out [english_list(((contents-component_parts)-circuit))].</span>" ,
"<span class='notice'>You have opened [src] and taken out [english_list(((contents-component_parts)-circuit))].</span>"
)
dispose()
/obj/machinery/microwave/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(!mover)
return 1
if(mover.checkpass(PASSTABLE))
//Animals can run under them, lots of empty space
return 1
return ..()
/obj/machinery/microwave/advanced // specifically for complex recipes
name = "deluxe microwave"
@@ -421,3 +518,32 @@
/obj/machinery/microwave/advanced/Initialize()
..()
reagents.maximum_volume = 1000
/datum/recipe/splat // We use this to handle cooking mice or other smaller/similar-size mobs in a microwave. Janky but it works better than snowflake code to handle the same thing.
items = list(
/obj/item/weapon/holder
)
result = /obj/effect/decal/cleanable/blood/gibs
/datum/recipe/splat/before_cook(obj/container)
if(istype(container, /obj/machinery/microwave))
var/obj/machinery/microwave/M = container
M.muck_start()
playsound(container.loc, 'sound/items/drop/flesh.ogg', 100, 1)
. = ..()
/datum/recipe/splat/make_food(obj/container)
for(var/obj/item/weapon/holder/H in container)
if(H.held_mob)
to_chat(H.held_mob, "<span class='danger'>You hear an earsplitting humming and your head aches!</span>")
qdel(H.held_mob)
H.held_mob = null
qdel(H)
. = ..()
/datum/recipe/splat/after_cook(obj/container)
if(istype(container, /obj/machinery/microwave))
var/obj/machinery/microwave/M = container
M.muck_finish()
. = ..()
+327
View File
@@ -0,0 +1,327 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * *
* /datum/recipe by rastaf0 13 apr 2011 *
* * * * * * * * * * * * * * * * * * * * * * * * * *
* This is powerful and flexible recipe system.
* It exists not only for food.
* supports both reagents and objects as prerequisites.
* In order to use this system you have to define a deriative from /datum/recipe
* * reagents are reagents. Acid, milc, booze, etc.
* * items are objects. Fruits, tools, circuit boards.
* * result is type to create as new object
* * time is optional parameter, you shall use in in your machine,
default /datum/recipe/ procs does not rely on this parameter.
*
* Functions you need:
* /datum/recipe/proc/make(var/obj/container as obj)
* Creates result inside container,
* deletes prerequisite reagents,
* transfers reagents from prerequisite objects,
* deletes all prerequisite objects (even not needed for recipe at the moment).
*
* /proc/select_recipe(list/datum/recipe/available_recipes, obj/obj as obj, exact = 1)
* Wonderful function that select suitable recipe for you.
* obj is a machine (or magik hat) with prerequisites,
* exact = 0 forces algorithm to ignore superfluous stuff.
*
*
* Functions you do not need to call directly but could:
* /datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents)
* /datum/recipe/proc/check_items(var/obj/container as obj)
*
* */
// Recipe type defines. Used to determine what machine makes them.
#define MICROWAVE 0x1
#define FRYER 0x2
#define OVEN 0x4
#define GRILL 0x8
#define CANDYMAKER 0x10
#define CEREALMAKER 0x20
/datum/recipe
var/list/reagents // Example: = list("berryjuice" = 5) // do not list same reagent twice
var/list/items // Example: = list(/obj/item/weapon/tool/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo
var/list/fruit // Example: = list("fruit" = 3)
var/coating = null // Required coating on all items in the recipe. The default value of null explitly requires no coating
// A value of -1 is permissive and cares not for any coatings
// Any typepath indicates a specific coating that should be present
// Coatings are used for batter, breadcrumbs, beer-batter, colonel's secret coating, etc
var/result // Example: = /obj/item/weapon/reagent_containers/food/snacks/donut/normal
var/result_quantity = 1 // Number of instances of result that are created.
var/time = 100 // 1/10 part of second
#define RECIPE_REAGENT_REPLACE 0 //Reagents in the ingredients are discarded.
//Only the reagents present in the result at compiletime are used
#define RECIPE_REAGENT_MAX 1 //The result will contain the maximum of each reagent present between the two pools. Compiletime result, and sum of ingredients
#define RECIPE_REAGENT_MIN 2 //As above, but the minimum, ignoring zero values.
#define RECIPE_REAGENT_SUM 3 //The entire quantity of the ingredients are added to the result
var/reagent_mix = RECIPE_REAGENT_MAX //How to handle reagent differences between the ingredients and the results
var/appliance = MICROWAVE // Which apppliances this recipe can be made in. New Recipes will DEFAULT to using the Microwave, as a catch-all (and just in case)
// List of defines is in _defines/misc.dm. But for reference they are:
/*
MICROWAVE
FRYER
OVEN
CANDYMAKER
CEREALMAKER
*/
// This is a bitfield, more than one type can be used
// Grill is presently unused and not listed
/datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents, var/exact = 0)
if(!reagents || !reagents.len)
return TRUE
if(!avail_reagents)
return FALSE
. = TRUE
for(var/r_r in reagents)
var/aval_r_amnt = avail_reagents.get_reagent_amount(r_r)
if(aval_r_amnt - reagents[r_r] >= 0)
if(aval_r_amnt>(reagents[r_r] && exact))
. = FALSE
else
return FALSE
if((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len)
return FALSE
return .
/datum/recipe/proc/check_fruit(var/obj/container, var/exact = 0)
if (!fruit || !fruit.len)
return TRUE
. = TRUE
if(fruit && fruit.len)
var/list/checklist = list()
// You should trust Copy().
checklist = fruit.Copy()
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in container)
if(!G.seed || !G.seed.kitchen_tag || isnull(checklist[G.seed.kitchen_tag]))
continue
if(check_coating(G))
checklist[G.seed.kitchen_tag]--
for(var/ktag in checklist)
if(!isnull(checklist[ktag]))
if(checklist[ktag] < 0 && exact)
. = FALSE
else if(checklist[ktag] > 0)
. = FALSE
break
return .
/datum/recipe/proc/check_items(var/obj/container as obj, var/exact = 0)
if(!items || !items.len)
return TRUE
. = TRUE
if(items && items.len)
var/list/checklist = list()
checklist = items.Copy() // You should really trust Copy
if(istype(container, /obj/machinery))
var/obj/machinery/machine = container
for(var/obj/O in ((machine.contents - machine.component_parts) - machine.circuit))
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown))
continue // Fruit is handled in check_fruit().
var/found = FALSE
for(var/i = 1; i < checklist.len+1; i++)
var/item_type = checklist[i]
if (istype(O,item_type))
checklist.Cut(i, i+1)
found = TRUE
break
if(!found && exact)
return FALSE
else
for(var/obj/O in container.contents)
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown))
continue // Fruit is handled in check_fruit().
var/found = FALSE
for(var/i = 1; i < checklist.len+1; i++)
var/item_type = checklist[i]
if (istype(O,item_type))
if(check_coating(O))
checklist.Cut(i, i+1)
found = TRUE
break
if (!found && exact)
return FALSE
if(checklist.len)
return FALSE
return .
//This is called on individual items within the container.
/datum/recipe/proc/check_coating(var/obj/O, var/exact = FALSE)
if(!istype(O,/obj/item/weapon/reagent_containers/food/snacks))
return TRUE //Only snacks can be battered
if (coating == -1)
return TRUE //-1 value doesnt care
var/obj/item/weapon/reagent_containers/food/snacks/S = O
if (!S.coating)
if (!coating)
return TRUE
return FALSE
else if (S.coating.type == coating)
return TRUE
return FALSE
//general version
/datum/recipe/proc/make(var/obj/container as obj)
var/obj/result_obj = new result(container)
if(istype(container, /obj/machinery))
var/obj/machinery/machine = container
for (var/obj/O in ((machine.contents-result_obj - machine.component_parts) - machine.circuit))
O.reagents.trans_to_obj(result_obj, O.reagents.total_volume)
qdel(O)
else
for (var/obj/O in (container.contents-result_obj))
O.reagents.trans_to_obj(result_obj, O.reagents.total_volume)
qdel(O)
container.reagents.clear_reagents()
return result_obj
// food-related
// This proc is called under the assumption that the container has already been checked and found to contain the necessary ingredients
/datum/recipe/proc/make_food(var/obj/container as obj)
if(!result)
log_runtime(EXCEPTION("<span class='danger'>Recipe [type] is defined without a result, please bug report this.</span>"))
return
//We will subtract all the ingredients from the container, and transfer their reagents into a holder
//We will not touch things which are not required for this recipe. They will be left behind for the caller
//to decide what to do. They may be used again to make another recipe or discarded, or merged into the results,
//thats no longer the concern of this proc
var/datum/reagents/buffer = new /datum/reagents(10000000000, null)//
//Find items we need
if (items && items.len)
for (var/i in items)
var/obj/item/I = locate(i) in container
if (I && I.reagents)
I.reagents.trans_to_holder(buffer,I.reagents.total_volume)
qdel(I)
//Find fruits
if (fruit && fruit.len)
var/list/checklist = list()
checklist = fruit.Copy()
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in container)
if(!G.seed || !G.seed.kitchen_tag || isnull(checklist[G.seed.kitchen_tag]))
continue
if (checklist[G.seed.kitchen_tag] > 0)
//We found a thing we need
checklist[G.seed.kitchen_tag]--
if (G && G.reagents)
G.reagents.trans_to_holder(buffer,G.reagents.total_volume)
qdel(G)
//And lastly deduct necessary quantities of reagents
if (reagents && reagents.len)
for (var/r in reagents)
//Doesnt matter whether or not there's enough, we assume that check is done before
container.reagents.trans_type_to(buffer, r, reagents[r])
/*
Now we've removed all the ingredients that were used and we have the buffer containing the total of
all their reagents.
Next up we create the result, and then handle the merging of reagents depending on the mix setting
*/
var/tally = 0
/*
If we have multiple results, holder will be used as a buffer to hold reagents for the result objects.
If, as in the most common case, there is only a single result, then it will just be a reference to
the single-result's reagents
*/
var/datum/reagents/holder = new/datum/reagents(10000000000)
var/list/results = list()
while (tally < result_quantity)
var/obj/result_obj = new result(container)
results.Add(result_obj)
if (!result_obj.reagents)//This shouldn't happen
//If the result somehow has no reagents defined, then create a new holder
result_obj.reagents = new /datum/reagents(buffer.total_volume*1.5, result_obj)
if (result_quantity == 1)
qdel(holder)
holder = result_obj.reagents
else
result_obj.reagents.trans_to(holder, result_obj.reagents.total_volume)
tally++
switch(reagent_mix)
if (RECIPE_REAGENT_REPLACE)
//We do no transferring
if (RECIPE_REAGENT_SUM)
//Sum is easy, just shove the entire buffer into the result
buffer.trans_to_holder(holder, buffer.total_volume)
if (RECIPE_REAGENT_MAX)
//We want the highest of each.
//Iterate through everything in buffer. If the target has less than the buffer, then top it up
for (var/datum/reagent/R in buffer.reagent_list)
var/rvol = holder.get_reagent_amount(R.id)
if (rvol < R.volume)
//Transfer the difference
buffer.trans_type_to(holder, R.id, R.volume-rvol)
if (RECIPE_REAGENT_MIN)
//Min is slightly more complex. We want the result to have the lowest from each side
//But zero will not count. Where a side has zero its ignored and the side with a nonzero value is used
for (var/datum/reagent/R in buffer.reagent_list)
var/rvol = holder.get_reagent_amount(R.id)
if (rvol == 0) //If the target has zero of this reagent
buffer.trans_type_to(holder, R.id, R.volume)
//Then transfer all of ours
else if (rvol > R.volume)
//if the target has more than ours
//Remove the difference
holder.remove_reagent(R.id, rvol-R.volume)
if (results.len > 1)
//If we're here, then holder is a buffer containing the total reagents for all the results.
//So now we redistribute it among them
var/total = holder.total_volume
for (var/i in results)
var/atom/a = i //optimisation
holder.trans_to(a, total / results.len)
return results
// When exact is false, extraneous ingredients are ignored
// When exact is true, extraneous ingredients will fail the recipe
// In both cases, the full complement of required inredients is still needed
/proc/select_recipe(var/list/datum/recipe/available_recipes, var/obj/obj as obj, var/exact)
var/list/datum/recipe/possible_recipes = list()
for (var/datum/recipe/recipe in available_recipes)
if(!recipe.check_reagents(obj.reagents, exact) || !recipe.check_items(obj, exact) || !recipe.check_fruit(obj, exact))
continue
possible_recipes |= recipe
if (!possible_recipes.len)
return null
else if (possible_recipes.len == 1)
return possible_recipes[1]
else //okay, let's select the most complicated recipe
sortTim(possible_recipes, /proc/cmp_recipe_complexity_dsc)
return possible_recipes[1]
// Both of these are just placeholders to allow special behavior for mob holders, but you can do other things in here later if you feel like it.
/datum/recipe/proc/before_cook(obj/container) // Called Before the Microwave starts delays and cooking stuff
/datum/recipe/proc/after_cook(obj/container) // Called When the Microwave is finished.
+30 -4
View File
@@ -16,7 +16,7 @@
qdel(CR)
//////////////////////// FOOD
var/list/food_recipes = typesof(/datum/recipe/microwave) - /datum/recipe/microwave
var/list/food_recipes = typesof(/datum/recipe) - /datum/recipe
//Build a useful list
for(var/Rp in food_recipes)
//Lists don't work with datum-stealing no-instance initial() so we have to.
@@ -32,6 +32,7 @@
"Reagents" = R.reagents,
"Fruit" = R.fruit,
"Ingredients" = R.items,
"Appliance" = R.appliance,
"Image" = result_icon
)
@@ -69,6 +70,9 @@
for(var/Rp in food_recipes)
for(var/rid in food_recipes[Rp]["Reagents"])
var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid]
if(!Rd) // Leaving this here in the event that if rd is ever invalid or there's a recipe issue, it'll be skipped and recipe dumps can still be ran.
log_runtime(EXCEPTION("Food \"[Rp]\" had an invalid RID: \"[rid]\"! Check your reagents list for a missing or mistyped reagent!"))
continue // This allows the dump to still continue, and it will skip the invalid recipes.
var/R_name = Rd.name
var/amt = food_recipes[Rp]["Reagents"][rid]
food_recipes[Rp]["Reagents"] -= rid
@@ -76,17 +80,36 @@
for(var/Rp in drink_recipes)
for(var/rid in drink_recipes[Rp]["Reagents"])
var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid]
if(!Rd) // Leaving this here in the event that if rd is ever invalid or there's a recipe issue, it'll be skipped and recipe dumps can still be ran.
log_runtime(EXCEPTION("Food \"[Rp]\" had an invalid RID: \"[rid]\"! Check your reagents list for a missing or mistyped reagent!"))
continue // This allows the dump to still continue, and it will skip the invalid recipes.
var/R_name = Rd.name
var/amt = drink_recipes[Rp]["Reagents"][rid]
drink_recipes[Rp]["Reagents"] -= rid
drink_recipes[Rp]["Reagents"][R_name] = amt
//We can also change the appliance to its proper name.
for(var/Rp in food_recipes)
switch(food_recipes[Rp]["Appliance"])
if(1)
food_recipes[Rp]["Appliance"] = "Microwave"
if(2)
food_recipes[Rp]["Appliance"] = "Fryer"
if(4)
food_recipes[Rp]["Appliance"] = "Oven"
if(8)
food_recipes[Rp]["Appliance"] = "Grill"
if(16)
food_recipes[Rp]["Appliance"] = "Candy Maker"
if(32)
food_recipes[Rp]["Appliance"] = "Cereal Maker"
//////////////////////// SORTING
var/list/foods_to_paths = list()
var/list/drinks_to_paths = list()
for(var/Rp in food_recipes)
foods_to_paths["[food_recipes[Rp]["Result"]] [Rp]"] = Rp //Append recipe datum path to keep uniqueness
for(var/Rp in food_recipes) // "Appliance" will sort the list by APPLIANCES first. Items without an appliance will append to the top of the list. The old method was "Result", which sorts the list by the name of the result.
foods_to_paths["[food_recipes[Rp]["Appliance"]] [Rp]"] = Rp //Append recipe datum path to keep uniqueness
for(var/Rp in drink_recipes)
drinks_to_paths["[drink_recipes[Rp]["Result"]] [Rp]"] = Rp
@@ -119,7 +142,7 @@
html += "<html><body><h3>Food Recipes (as of [time2text(world.realtime,"MMM DD, YYYY")])</h3><br>"
html += "<table class='recipes'>"
html += "<tr><th>Icon</th><th>Name</th><th>Ingredients</th></tr>"
html += "<tr><th>Icon</th><th>Name</th><th>Appliance</th><th>Ingredients</th></tr>"
for(var/Rp in food_recipes)
//Open this row
html += "<tr>"
@@ -135,6 +158,9 @@
//Name
html += "<td><b>[food_recipes[Rp]["Result"]]</b></td>"
//Appliance
html += "<td><b>[food_recipes[Rp]["Appliance"]]</b></td>"
//Ingredients
html += "<td><ul>"
+159
View File
@@ -0,0 +1,159 @@
/datum/recipe/fries
appliance = FRYER
items = list(
/obj/item/weapon/reagent_containers/food/snacks/rawsticks
)
result = /obj/item/weapon/reagent_containers/food/snacks/fries
/datum/recipe/cheesyfries
appliance = FRYER
items = list(
/obj/item/weapon/reagent_containers/food/snacks/fries,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
)
result = /obj/item/weapon/reagent_containers/food/snacks/cheesyfries
/datum/recipe/jpoppers
appliance = FRYER
fruit = list("chili" = 1)
coating = /datum/reagent/nutriment/coating/batter
result = /obj/item/weapon/reagent_containers/food/snacks/jalapeno_poppers
/datum/recipe/risottoballs
appliance = FRYER
reagents = list("sodiumchloride" = 1, "blackpepper" = 1)
items = list(/obj/item/weapon/reagent_containers/food/snacks/risotto)
coating = /datum/reagent/nutriment/coating/batter
reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product
result = /obj/item/weapon/reagent_containers/food/snacks/risottoballs
//Meaty Recipes
//====================
/datum/recipe/cubancarp
appliance = FRYER
fruit = list("chili" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/carpmeat
)
result = /obj/item/weapon/reagent_containers/food/snacks/cubancarp
/datum/recipe/batteredsausage
appliance = FRYER
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sausage
)
result = /obj/item/weapon/reagent_containers/food/snacks/sausage/battered
coating = /datum/reagent/nutriment/coating/batter
/datum/recipe/katsu
appliance = FRYER
items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/chicken
)
result = /obj/item/weapon/reagent_containers/food/snacks/chickenkatsu
coating = /datum/reagent/nutriment/coating/beerbatter
/datum/recipe/pizzacrunch_1
appliance = FRYER
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/crunch
coating = /datum/reagent/nutriment/coating/batter
//Alternate pizza crunch recipe for combination pizzas made in oven
/datum/recipe/pizzacrunch_2
appliance = FRYER
items = list(
/obj/item/weapon/reagent_containers/food/snacks/variable/pizza
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/crunch
coating = /datum/reagent/nutriment/coating/batter
/datum/recipe/friedmushroom
appliance = FRYER
fruit = list("plumphelmet" = 1)
coating = /datum/reagent/nutriment/coating/beerbatter
reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product
result = /obj/item/weapon/reagent_containers/food/snacks/friedmushroom
//Sweet Recipes.
//==================
// All donuts were given reagents of 5 to equal old recipes and make for faster cook times.
/datum/recipe/jellydonut
appliance = FRYER
reagents = list("berryjuice" = 5, "sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/doughslice
)
result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly
result_quantity = 2
/datum/recipe/jellydonut/poisonberry
reagents = list("poisonberryjuice" = 5, "sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/reagent_containers/food/snacks/donut/poisonberry
/datum/recipe/jellydonut/slime // Subtypes of jellydonut, appliance inheritance applies.
reagents = list("slimejelly" = 5, "sugar" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly
/datum/recipe/jellydonut/cherry // Subtypes of jellydonut, appliance inheritance applies.
reagents = list("cherryjelly" = 5, "sugar" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly
/datum/recipe/donut
appliance = FRYER
reagents = list("sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/doughslice
)
result = /obj/item/weapon/reagent_containers/food/snacks/donut/normal
result_quantity = 2
/datum/recipe/chaosdonut
appliance = FRYER
reagents = list("frostoil" = 10, "capsaicin" = 10, "sugar" = 10)
reagent_mix = RECIPE_REAGENT_REPLACE //This creates its own reagents
items = list(
/obj/item/weapon/reagent_containers/food/snacks/doughslice
)
result = /obj/item/weapon/reagent_containers/food/snacks/donut/chaos
result_quantity = 2
/datum/recipe/funnelcake
appliance = FRYER
reagents = list("sugar" = 5, "batter" = 10)
result = /obj/item/weapon/reagent_containers/food/snacks/funnelcake
/datum/recipe/pisanggoreng
appliance = FRYER
fruit = list("banana" = 2)
reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product
result = /obj/item/weapon/reagent_containers/food/snacks/pisanggoreng
coating = /datum/reagent/nutriment/coating/batter
/datum/recipe/corn_dog
appliance = FRYER
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sausage
)
fruit = list("corn" = 1)
coating = /datum/reagent/nutriment/coating/batter
result = /obj/item/weapon/reagent_containers/food/snacks/corn_dog
/datum/recipe/sweet_and_sour
appliance = FRYER
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bacon,
/obj/item/weapon/reagent_containers/food/snacks/cutlet
)
reagents = list("soysauce" = 5, "batter" = 10)
result = /obj/item/weapon/reagent_containers/food/snacks/sweet_and_sour
+231
View File
@@ -0,0 +1,231 @@
/datum/recipe/humanburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/human,
/obj/item/weapon/reagent_containers/food/snacks/bun
)
result = /obj/item/weapon/reagent_containers/food/snacks/human/burger
/datum/recipe/plainburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/reagent_containers/food/snacks/meat //do not place this recipe before /datum/recipe/humanburger
)
result = /obj/item/weapon/reagent_containers/food/snacks/monkeyburger
/datum/recipe/syntiburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh
)
result = /obj/item/weapon/reagent_containers/food/snacks/monkeyburger
/datum/recipe/brainburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/organ/internal/brain
)
result = /obj/item/weapon/reagent_containers/food/snacks/brainburger
/datum/recipe/roburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/robot_parts/head
)
result = /obj/item/weapon/reagent_containers/food/snacks/roburger
/datum/recipe/xenoburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat
)
result = /obj/item/weapon/reagent_containers/food/snacks/xenoburger
/datum/recipe/fishburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/reagent_containers/food/snacks/carpmeat
)
result = /obj/item/weapon/reagent_containers/food/snacks/fishburger
/datum/recipe/tofuburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/reagent_containers/food/snacks/tofu
)
result = /obj/item/weapon/reagent_containers/food/snacks/tofuburger
/datum/recipe/ghostburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/ectoplasm //where do you even find this stuff
)
result = /obj/item/weapon/reagent_containers/food/snacks/ghostburger
/datum/recipe/clownburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/clothing/mask/gas/clown_hat
)
result = /obj/item/weapon/reagent_containers/food/snacks/clownburger
/datum/recipe/mimeburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/clothing/head/beret
)
result = /obj/item/weapon/reagent_containers/food/snacks/mimeburger
/datum/recipe/mouseburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/holder/mouse
)
result = /obj/item/weapon/reagent_containers/food/snacks/mouseburger
/datum/recipe/bunbun
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/reagent_containers/food/snacks/bun
)
result = /obj/item/weapon/reagent_containers/food/snacks/bunbun
/datum/recipe/hotdog
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/reagent_containers/food/snacks/sausage
)
result = /obj/item/weapon/reagent_containers/food/snacks/hotdog
/datum/recipe/humankabob
appliance = GRILL
items = list(
/obj/item/stack/rods,
/obj/item/weapon/reagent_containers/food/snacks/meat/human,
/obj/item/weapon/reagent_containers/food/snacks/meat/human,
)
result = /obj/item/weapon/reagent_containers/food/snacks/human/kabob
/datum/recipe/kabob //Do not put before humankabob
appliance = GRILL
items = list(
/obj/item/stack/rods,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
)
result = /obj/item/weapon/reagent_containers/food/snacks/monkeykabob
/datum/recipe/monkeykabob
appliance = GRILL
items = list(
/obj/item/stack/rods,
/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,
/obj/item/weapon/reagent_containers/food/snacks/meat/monkey
)
result = /obj/item/weapon/reagent_containers/food/snacks/monkeykabob
/datum/recipe/syntikabob
appliance = GRILL
items = list(
/obj/item/stack/rods,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh
)
result = /obj/item/weapon/reagent_containers/food/snacks/monkeykabob
/datum/recipe/tofukabob
appliance = GRILL
items = list(
/obj/item/stack/rods,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
)
result = /obj/item/weapon/reagent_containers/food/snacks/tofukabob
/datum/recipe/fakespellburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/monkeyburger,
/obj/item/clothing/head/wizard/fake,
)
result = /obj/item/weapon/reagent_containers/food/snacks/spellburger
/datum/recipe/spellburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/monkeyburger,
/obj/item/clothing/head/wizard,
)
result = /obj/item/weapon/reagent_containers/food/snacks/spellburger
/datum/recipe/bigbiteburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/monkeyburger,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
)
reagents = list("egg" = 3)
reagent_mix = RECIPE_REAGENT_REPLACE
result = /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger
/datum/recipe/superbiteburger
appliance = GRILL
fruit = list("tomato" = 1)
reagents = list("sodiumchloride" = 5, "blackpepper" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/boiledegg,
)
result = /obj/item/weapon/reagent_containers/food/snacks/superbiteburger
/datum/recipe/slimeburger
appliance = GRILL
reagents = list("slimejelly" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun
)
result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime
/datum/recipe/jellyburger
appliance = GRILL
reagents = list("cherryjelly" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun
)
result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry
/datum/recipe/bearburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/reagent_containers/food/snacks/bearmeat
)
result = /obj/item/weapon/reagent_containers/food/snacks/bearburger
/datum/recipe/baconburger
appliance = GRILL
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/bacon,
/obj/item/weapon/reagent_containers/food/snacks/bacon
)
result = /obj/item/weapon/reagent_containers/food/snacks/burger/bacon
File diff suppressed because it is too large Load Diff
+560
View File
@@ -0,0 +1,560 @@
/datum/recipe/ovenchips
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/rawsticks
)
result = /obj/item/weapon/reagent_containers/food/snacks/ovenchips
/datum/recipe/dionaroast
appliance = OVEN
fruit = list("apple" = 1)
reagents = list("pacid" = 5) //It dissolves the carapace. Still poisonous, though.
items = list(/obj/item/weapon/holder/diona)
result = /obj/item/weapon/reagent_containers/food/snacks/dionaroast
reagent_mix = RECIPE_REAGENT_REPLACE //No eating polyacid
/datum/recipe/ribplate //Putting this here for not seeing a roast section.
appliance = OVEN
reagents = list("honey" = 5, "spacespice" = 2, "blackpepper" = 1)
items = list(/obj/item/weapon/reagent_containers/food/snacks/meat)
reagent_mix = RECIPE_REAGENT_REPLACE
result = /obj/item/weapon/reagent_containers/food/snacks/ribplate
//Predesigned breads
//================================
/datum/recipe/bread
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough
)
reagents = list("sodiumchloride" = 1, "yeast" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/bread
/datum/recipe/baguette
appliance = OVEN
reagents = list("sodiumchloride" = 1, "blackpepper" = 1, "yeast" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/reagent_containers/food/snacks/baguette
/datum/recipe/tofubread
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread
/datum/recipe/creamcheesebread
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread
/datum/recipe/flatbread
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough
)
result = /obj/item/weapon/reagent_containers/food/snacks/flatbread
/datum/recipe/tortilla
appliance = OVEN
reagents = list("flour" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough
)
result = /obj/item/weapon/reagent_containers/food/snacks/tortilla
/datum/recipe/meatbread
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread
/datum/recipe/syntibread
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread
/datum/recipe/xenomeatbread
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread
/datum/recipe/bananabread
appliance = OVEN
fruit = list("banana" = 1)
reagents = list("milk" = 5, "sugar" = 15)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread
/datum/recipe/bun
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/reagent_containers/food/snacks/bun
//Predesigned pies
//=======================
/datum/recipe/meatpie
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/meat
)
result = /obj/item/weapon/reagent_containers/food/snacks/meatpie
/datum/recipe/tofupie
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/tofu
)
result = /obj/item/weapon/reagent_containers/food/snacks/tofupie
/datum/recipe/xemeatpie
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat
)
result = /obj/item/weapon/reagent_containers/food/snacks/xemeatpie
/datum/recipe/pie
appliance = OVEN
fruit = list("banana" = 1)
reagents = list("sugar" = 5)
items = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough)
result = /obj/item/weapon/reagent_containers/food/snacks/pie
/datum/recipe/cherrypie
appliance = OVEN
fruit = list("cherries" = 1)
reagents = list("sugar" = 10)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough
)
result = /obj/item/weapon/reagent_containers/food/snacks/cherrypie
/datum/recipe/amanita_pie
appliance = OVEN
reagents = list("amatoxin" = 5)
items = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough)
result = /obj/item/weapon/reagent_containers/food/snacks/amanita_pie
/datum/recipe/plump_pie
appliance = OVEN
fruit = list("plumphelmet" = 1)
items = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough)
result = /obj/item/weapon/reagent_containers/food/snacks/plump_pie
/datum/recipe/pumpkinpie
appliance = OVEN
fruit = list("pumpkin" = 1)
reagents = list("milk" = 5, "sugar" = 5, "egg" = 3, "flour" = 10)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie
reagent_mix = RECIPE_REAGENT_REPLACE //We dont want raw egg in the result
/datum/recipe/appletart
appliance = OVEN
fruit = list("goldapple" = 1)
reagents = list("sugar" = 5, "milk" = 5, "flour" = 10, "egg" = 3)
result = /obj/item/weapon/reagent_containers/food/snacks/appletart
reagent_mix = RECIPE_REAGENT_REPLACE
/datum/recipe/keylimepie
appliance = OVEN
fruit = list("lime" = 2)
reagents = list("milk" = 5, "sugar" = 5, "egg" = 3, "flour" = 10)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/keylimepie
reagent_mix = RECIPE_REAGENT_REPLACE //No raw egg in finished product, protein after cooking causes magic meatballs otherwise
/datum/recipe/quiche
appliance = OVEN
reagents = list("milk" = 5, "egg" = 9, "flour" = 10)
items = list(/obj/item/weapon/reagent_containers/food/snacks/cheesewedge)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/quiche
reagent_mix = RECIPE_REAGENT_REPLACE //No raw egg in finished product, protein after cooking causes magic meatballs otherwise
//Baked sweets:
//---------------
/datum/recipe/cookie
appliance = OVEN
reagents = list("milk" = 10, "sugar" = 10)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar
)
result = /obj/item/weapon/reagent_containers/food/snacks/cookie
result_quantity = 4
reagent_mix = RECIPE_REAGENT_REPLACE
/datum/recipe/ovenfortunecookie
appliance = OVEN
reagents = list("sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/doughslice,
/obj/item/weapon/paper
)
result = /obj/item/weapon/reagent_containers/food/snacks/fortunecookie
/datum/recipe/poppypretzel
appliance = OVEN
fruit = list("poppy" = 1)
items = list(/obj/item/weapon/reagent_containers/food/snacks/dough)
result = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel
result_quantity = 2
/datum/recipe/cracker
appliance = OVEN
reagents = list("sodiumchloride" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/doughslice
)
result = /obj/item/weapon/reagent_containers/food/snacks/cracker
/datum/recipe/brownies
appliance = OVEN
reagents = list("browniemix" = 10, "egg" = 3)
reagent_mix = RECIPE_REAGENT_REPLACE //No egg or mix in final recipe
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/brownies
/datum/recipe/cosmicbrownies
appliance = OVEN
reagents = list("browniemix" = 10, "egg" = 3)
fruit = list("ambrosia" = 1)
reagent_mix = RECIPE_REAGENT_REPLACE //No egg or mix in final recipe
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/cosmicbrownies
//Pizzas
//=========================
/datum/recipe/pizzamargherita
appliance = OVEN
fruit = list("tomato" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita
/datum/recipe/meatpizza
appliance = OVEN
fruit = list("tomato" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza
/datum/recipe/syntipizza
appliance = OVEN
fruit = list("tomato" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza
/datum/recipe/mushroompizza
appliance = OVEN
fruit = list("mushroom" = 5, "tomato" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
reagent_mix = RECIPE_REAGENT_REPLACE //No vomit taste in finished product from chanterelles
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza
/datum/recipe/vegetablepizza
appliance = OVEN
fruit = list("eggplant" = 1, "carrot" = 1, "corn" = 1, "tomato" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza
/datum/recipe/pineapplepizza
appliance = OVEN
fruit = list("tomato" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/pineapple_ring,
/obj/item/weapon/reagent_containers/food/snacks/pineapple_ring
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/pineapple
//Spicy
//================
/datum/recipe/enchiladas
appliance = OVEN
fruit = list("chili" = 2, "corn" = 1)
items = list(/obj/item/weapon/reagent_containers/food/snacks/cutlet)
result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas
/datum/recipe/monkeysdelight
appliance = OVEN
fruit = list("banana" = 1)
reagents = list("sodiumchloride" = 1, "blackpepper" = 1, "flour" = 10)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/monkeycube
)
result = /obj/item/weapon/reagent_containers/food/snacks/monkeysdelight
reagent_mix = RECIPE_REAGENT_REPLACE
// Cakes.
//============
/datum/recipe/cake
appliance = OVEN
reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9, "vanilla" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake
reagent_mix = RECIPE_REAGENT_REPLACE
/datum/recipe/cake/carrot
appliance = OVEN
fruit = list("carrot" = 3)
reagents = list("milk" = 5, "flour" = 15, "egg" = 9,"sugar" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake
/datum/recipe/cake/cheese
appliance = OVEN
reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake
/datum/recipe/cake/peanut
fruit = list("peanut" = 3)
reagents = list("milk" = 5, "flour" = 10, "sugar" = 5, "egg" = 6, "peanutbutter" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/peanutcake
/datum/recipe/cake/orange
appliance = OVEN
fruit = list("orange" = 1)
reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "sugar" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake
/datum/recipe/cake/lime
appliance = OVEN
fruit = list("lime" = 1)
reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "limejuice" = 3, "sugar" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake
/datum/recipe/cake/lemon
appliance = OVEN
fruit = list("lemon" = 1)
reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "lemonjuice" = 3, "sugar" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake
/datum/recipe/cake/chocolate
appliance = OVEN
items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "coco" = 4, "sugar" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake
/datum/recipe/cake/birthday
appliance = OVEN
reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9)
items = list(/obj/item/clothing/head/cakehat)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake
/datum/recipe/cake/apple
appliance = OVEN
fruit = list("apple" = 2)
reagents = list("milk" = 5, "flour" = 15, "egg" = 9,"sugar" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake
/datum/recipe/cake/brain
appliance = OVEN
reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9)
items = list(/obj/item/organ/internal/brain)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake
/datum/recipe/pancakes
appliance = OVEN
fruit = list("blueberries" = 2)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough
)
result = /obj/item/weapon/reagent_containers/food/snacks/pancakes
/datum/recipe/lasagna
appliance = OVEN
fruit = list("tomato" = 2, "eggplant" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/cutlet,
/obj/item/weapon/reagent_containers/food/snacks/cutlet
)
result = /obj/item/weapon/reagent_containers/food/snacks/lasagna
reagent_mix = RECIPE_REAGENT_REPLACE
/datum/recipe/honeybun
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough
)
reagents = list("milk" = 5, "egg" = 3,"honey" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/honeybun
/datum/recipe/enchiladas_new
appliance = OVEN
fruit = list("chili" = 2)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/cutlet,
/obj/item/weapon/reagent_containers/food/snacks/tortilla
)
result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas
//Bacon
/datum/recipe/bacon_oven
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/rawbacon,
/obj/item/weapon/reagent_containers/food/snacks/rawbacon,
/obj/item/weapon/reagent_containers/food/snacks/rawbacon,
/obj/item/weapon/reagent_containers/food/snacks/rawbacon,
/obj/item/weapon/reagent_containers/food/snacks/rawbacon,
/obj/item/weapon/reagent_containers/food/snacks/rawbacon,
/obj/item/weapon/reagent_containers/food/snacks/spreads
)
result = /obj/item/weapon/reagent_containers/food/snacks/bacon/oven
result_quantity = 6
/datum/recipe/meat_pocket
appliance = OVEN
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/meatball,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
result = /obj/item/weapon/reagent_containers/food/snacks/meat_pocket
result_quantity = 2
/datum/recipe/bacon_flatbread
appliance = OVEN
fruit = list("tomato" = 2)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/bacon,
/obj/item/weapon/reagent_containers/food/snacks/bacon,
/obj/item/weapon/reagent_containers/food/snacks/bacon,
/obj/item/weapon/reagent_containers/food/snacks/bacon
)
result = /obj/item/weapon/reagent_containers/food/snacks/bacon_flatbread
/datum/recipe/truffle
appliance = OVEN
reagents = list("sugar" = 5, "cream" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar
)
reagent_mix = RECIPE_REAGENT_REPLACE
result = /obj/item/weapon/reagent_containers/food/snacks/truffle
result_quantity = 4
/datum/recipe/croissant
appliance = OVEN
reagents = list("sodiumchloride" = 1, "water" = 5, "milk" = 5, "yeast" = 5)
reagent_mix = RECIPE_REAGENT_REPLACE
items = list(/obj/item/weapon/reagent_containers/food/snacks/dough)
result = /obj/item/weapon/reagent_containers/food/snacks/croissant
/datum/recipe/macncheese
appliance = OVEN
reagents = list("milk" = 5)
reagent_mix = RECIPE_REAGENT_REPLACE
items = list(
/obj/item/weapon/reagent_containers/food/snacks/spagetti,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
result = /obj/item/weapon/reagent_containers/food/snacks/macncheese
@@ -153,7 +153,9 @@
/obj/item/weapon/reagent_containers/glass,
/obj/item/weapon/reagent_containers/food,
/obj/item/seeds,
/obj/item/weapon/grown
/obj/item/weapon/grown,
/obj/item/trash,
/obj/item/weapon/reagent_containers/cooking_container
)
/obj/item/weapon/gripper/gravekeeper //Used for handling grave things, flowers, etc.
+86
View File
@@ -282,6 +282,34 @@
trans_to(target, amount, multiplier, copy)
/datum/reagents/proc/trans_type_to(var/target, var/rtype, var/amount = 1)
if (!target)
return
var/datum/reagent/transfering_reagent = get_reagent(rtype)
if (istype(target, /atom))
var/atom/A = target
if (!A.reagents || !A.simulated)
return
amount = min(amount, transfering_reagent.volume)
if(!amount)
return
var/datum/reagents/F = new /datum/reagents(amount)
var/tmpdata = get_data(rtype)
F.add_reagent(rtype, amount, tmpdata)
remove_reagent(rtype, amount)
if (istype(target, /atom))
return F.trans_to(target, amount) // Let this proc check the atom's type
else if (istype(target, /datum/reagents))
return F.trans_to_holder(target, amount)
/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1)
if (!target || !target.reagents)
return
@@ -396,3 +424,61 @@
/atom/proc/create_reagents(var/max_vol)
reagents = new/datum/reagents(max_vol, src)
// Aurora Cooking Port
/datum/reagents/proc/get_reagent(var/id) // Returns reference to reagent matching passed ID
for(var/datum/reagent/A in reagent_list)
if (A.id == id)
return A
return null
//Spreads the contents of this reagent holder all over the vicinity of the target turf.
/datum/reagents/proc/splash_area(var/turf/epicentre, var/range = 3, var/portion = 1.0, var/multiplier = 1, var/copy = 0)
var/list/things = dview(range, epicentre, INVISIBILITY_LIGHTING)
var/list/turfs = list()
for (var/turf/T in things)
turfs += T
if (!turfs.len)
return//Nowhere to splash to, somehow
//Create a temporary holder to hold all the amount that will be spread
var/datum/reagents/R = new /datum/reagents(total_volume * portion * multiplier)
trans_to_holder(R, total_volume * portion, multiplier, copy)
//The exact amount that will be given to each turf
var/turfportion = R.total_volume / turfs.len
for (var/turf/T in turfs)
var/datum/reagents/TR = new /datum/reagents(turfportion)
R.trans_to_holder(TR, turfportion, 1, 0)
TR.splash_turf(T)
qdel(R)
//Spreads the contents of this reagent holder all over the target turf, dividing among things in it.
//50% is divided between mobs, 20% between objects, and whatever is left on the turf itself
/datum/reagents/proc/splash_turf(var/turf/T, var/amount = null, var/multiplier = 1, var/copy = 0)
if (isnull(amount))
amount = total_volume
else
amount = min(amount, total_volume)
if (amount <= 0)
return
var/list/mobs = list()
for (var/mob/M in T)
mobs += M
var/list/objs = list()
for (var/obj/O in T)
objs += O
if (objs.len)
var/objportion = (amount * 0.2) / objs.len
for (var/o in objs)
var/obj/O = o
trans_to(O, objportion, multiplier, copy)
amount = min(amount, total_volume)
if (mobs.len)
var/mobportion = (amount * 0.5) / mobs.len
for (var/m in mobs)
var/mob/M = m
trans_to(M, mobportion, multiplier, copy)
trans_to(T, total_volume, multiplier, copy)
if (total_volume <= 0)
qdel(src)
@@ -48,6 +48,192 @@
M.adjust_nutrition(nutriment_factor * removed)
M.add_chemical_effect(CE_BLOODRESTORE, 4 * removed)
// Aurora Cooking Port Insertion Begin
/*
Coatings are used in cooking. Dipping food items in a reagent container with a coating in it
allows it to be covered in that, which will add a masked overlay to the sprite.
Coatings have both a raw and a cooked image. Raw coating is generally unhealthy
Generally coatings are intended for deep frying foods
*/
/datum/reagent/nutriment/coating
nutriment_factor = 6 //Less dense than the food itself, but coatings still add extra calories
var/messaged = 0
var/icon_raw
var/icon_cooked
var/coated_adj = "coated"
var/cooked_name = "coating"
/datum/reagent/nutriment/coating/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
//We'll assume that the batter isnt going to be regurgitated and eaten by someone else. Only show this once
if(data["cooked"] != 1)
if (!messaged)
to_chat(M, "<span class='warning'>Ugh, this raw [name] tastes disgusting.</span>")
nutriment_factor *= 0.5
messaged = 1
//Raw coatings will sometimes cause vomiting. 75% chance of this happening.
if(prob(75))
M.vomit()
..()
/datum/reagent/nutriment/coating/initialize_data(var/newdata) // Called when the reagent is created.
..()
if (!data)
data = list()
else
if (isnull(data["cooked"]))
data["cooked"] = 0
return
data["cooked"] = 0
if (holder && holder.my_atom && istype(holder.my_atom,/obj/item/weapon/reagent_containers/food/snacks))
data["cooked"] = 1
name = cooked_name
//Batter which is part of objects at compiletime spawns in a cooked state
//Handles setting the temperature when oils are mixed
/datum/reagent/nutriment/coating/mix_data(var/newdata, var/newamount)
if (!data)
data = list()
data["cooked"] = newdata["cooked"]
/datum/reagent/nutriment/coating/batter
name = "batter mix"
cooked_name = "batter"
id = "batter"
color = "#f5f4e9"
reagent_state = LIQUID
icon_raw = "batter_raw"
icon_cooked = "batter_cooked"
coated_adj = "battered"
/datum/reagent/nutriment/coating/beerbatter
name = "beer batter mix"
cooked_name = "beer batter"
id = "beerbatter"
color = "#f5f4e9"
reagent_state = LIQUID
icon_raw = "batter_raw"
icon_cooked = "batter_cooked"
coated_adj = "beer-battered"
/datum/reagent/nutriment/coating/beerbatter/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.add_chemical_effect(CE_ALCOHOL, 0.02) //Very slightly alcoholic
//=========================
//Fats
//=========================
/datum/reagent/nutriment/triglyceride
name = "triglyceride"
id = "triglyceride"
description = "More commonly known as fat, the third macronutrient, with over double the energy content of carbs and protein"
reagent_state = SOLID
nutriment_factor = 27//The caloric ratio of carb/protein/fat is 4:4:9
color = "#CCCCCC"
/datum/reagent/nutriment/triglyceride/oil
//Having this base class incase we want to add more variants of oil
name = "Oil"
id = "oil"
description = "Oils are liquid fats."
reagent_state = LIQUID
color = "#c79705"
touch_met = 1.5
var/lastburnmessage = 0
/datum/reagent/nutriment/triglyceride/oil/touch_turf(var/turf/simulated/T)
if(!istype(T))
return
var/hotspot = (locate(/obj/fire) in T)
if(hotspot && !istype(T, /turf/space))
var/datum/gas_mixture/lowertemp = T.remove_air(T:air:total_moles)
lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0)
lowertemp.react()
T.assume_air(lowertemp)
qdel(hotspot)
if(volume >= 3)
T.wet_floor(2)
/datum/reagent/nutriment/triglyceride/oil/initialize_data(var/newdata) // Called when the reagent is created.
..()
if (!data)
data = list("temperature" = T20C)
//Handles setting the temperature when oils are mixed
/datum/reagent/nutriment/triglyceride/oil/mix_data(var/newdata, var/newamount)
if (!data)
data = list()
var/ouramount = volume - newamount
if (ouramount <= 0 || !data["temperature"] || !volume)
//If we get here, then this reagent has just been created, just copy the temperature exactly
data["temperature"] = newdata["temperature"]
else
//Our temperature is set to the mean of the two mixtures, taking volume into account
var/total = (data["temperature"] * ouramount) + (newdata["temperature"] * newamount)
data["temperature"] = total / volume
return ..()
//Calculates a scaling factor for scalding damage, based on the temperature of the oil and creature's heat resistance
/datum/reagent/nutriment/triglyceride/oil/proc/heatdamage(var/mob/living/carbon/M)
var/threshold = 360//Human heatdamage threshold
var/datum/species/S = M.get_species(1)
if (S && istype(S))
threshold = S.heat_level_1
//If temperature is too low to burn, return a factor of 0. no damage
if (data["temperature"] < threshold)
return 0
//Step = degrees above heat level 1 for 1.0 multiplier
var/step = 60
if (S && istype(S))
step = (S.heat_level_2 - S.heat_level_1)*1.5
. = data["temperature"] - threshold
. /= step
. = min(., 2.5)//Cap multiplier at 2.5
/datum/reagent/nutriment/triglyceride/oil/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
var/dfactor = heatdamage(M)
if (dfactor)
M.take_organ_damage(0, removed * 1.5 * dfactor)
data["temperature"] -= (6 * removed) / (1 + volume*0.1)//Cools off as it burns you
if (lastburnmessage+100 < world.time )
to_chat(M, "<span class='danger'>Searing hot oil burns you, wash it off quick!</span>")
lastburnmessage = world.time
/datum/reagent/nutriment/triglyceride/oil/corn
name = "Corn Oil"
id = "cornoil"
description = "An oil derived from various types of corn."
taste_description = "oil"
taste_mult = 0.1
reagent_state = LIQUID
/datum/reagent/nutriment/triglyceride/oil/peanut
name = "Peanut Oil"
id = "peanutoil"
description = "An oil derived from various types of nuts."
taste_description = "nuts"
taste_mult = 0.3
nutriment_factor = 15
color = "#4F3500"
// Aurora Cooking Port Insertion End
/datum/reagent/nutriment/glucose
name = "Glucose"
id = "glucose"
@@ -79,6 +265,24 @@
return
..()
/datum/reagent/nutriment/protein/tofu
name = "tofu protein"
id = "tofu"
color = "#fdffa8"
taste_description = "tofu"
/datum/reagent/nutriment/protein/seafood
name = "seafood protein"
id = "seafood"
color = "#f5f4e9"
taste_description = "fish"
/datum/reagent/nutriment/protein/cheese // Also bad for skrell.
name = "cheese"
id = "cheese"
color = "#EDB91F"
taste_description = "cheese"
/datum/reagent/nutriment/protein/egg // Also bad for skrell.
name = "egg yolk"
id = "egg"
@@ -251,56 +455,6 @@
nutriment_factor = 1
color = "#801E28"
/datum/reagent/nutriment/cornoil
name = "Corn Oil"
id = "cornoil"
description = "An oil derived from various types of corn."
taste_description = "slime"
taste_mult = 0.1
reagent_state = LIQUID
nutriment_factor = 20
color = "#302000"
/datum/reagent/nutriment/cornoil/touch_turf(var/turf/simulated/T)
if(!istype(T))
return
var/hotspot = (locate(/obj/fire) in T)
if(hotspot && !istype(T, /turf/space))
var/datum/gas_mixture/lowertemp = T.remove_air(T:air:total_moles)
lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0)
lowertemp.react()
T.assume_air(lowertemp)
qdel(hotspot)
if(volume >= 3)
T.wet_floor()
/datum/reagent/nutriment/peanutoil
name = "Peanut Oil"
id = "peanutoil"
description = "An oil derived from various types of nuts."
taste_description = "nuts"
taste_mult = 0.3
reagent_state = LIQUID
nutriment_factor = 15
color = "#4F3500"
/datum/reagent/nutriment/peanutoil/touch_turf(var/turf/simulated/T)
if(!istype(T))
return
var/hotspot = (locate(/obj/fire) in T)
if(hotspot && !istype(T, /turf/space))
var/datum/gas_mixture/lowertemp = T.remove_air(T:air:total_moles)
lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0)
lowertemp.react()
T.assume_air(lowertemp)
qdel(hotspot)
if(volume >= 5)
T.wet_floor()
/datum/reagent/nutriment/peanutbutter
name = "Peanut Butter"
id = "peanutbutter"
@@ -424,6 +578,22 @@
reagent_state = LIQUID
color = "#365E30"
overdose = REAGENTS_OVERDOSE
//SYNNONO MEME FOODS EXPANSION - Credit to Synnono
/datum/reagent/spacespice
name = "Space Spice"
id = "spacespice"
description = "An exotic blend of spices for cooking. Definitely not worms."
reagent_state = SOLID
color = "#e08702"
/datum/reagent/browniemix
name = "Brownie Mix"
id = "browniemix"
description = "A dry mix for making delicious brownies."
reagent_state = SOLID
color = "#441a03"
/datum/reagent/frostoil
name = "Frost Oil"
@@ -1314,6 +1314,7 @@
id = "dough"
result = null
required_reagents = list("egg" = 3, "flour" = 10)
inhibitors = list("water" = 1, "beer" = 1) //To prevent it messing with batter recipes
result_amount = 1
/datum/chemical_reaction/food/dough/on_reaction(var/datum/reagents/holder, var/created_volume)
@@ -2602,3 +2603,50 @@
required_reagents = list("radium" = 1, "spidertoxin" = 1, "sifsap" = 1)
catalysts = list("sifsap" = 10)
result_amount = 2
/*
====================
Aurora Food
====================
*/
/datum/chemical_reaction/coating/batter
name = "Batter"
id = "batter"
result = "batter"
required_reagents = list("egg" = 3, "flour" = 10, "water" = 5, "sodiumchloride" = 2)
result_amount = 20
/datum/chemical_reaction/coating/beerbatter
name = "Beer Batter"
id = "beerbatter"
result = "beerbatter"
required_reagents = list("egg" = 3, "flour" = 10, "beer" = 5, "sodiumchloride" = 2)
result_amount = 20
/datum/chemical_reaction/browniemix
name = "Brownie Mix"
id = "browniemix"
result = "browniemix"
required_reagents = list("flour" = 5, "coco" = 5, "sugar" = 5)
result_amount = 15
/datum/chemical_reaction/butter
name = "Butter"
id = "butter"
result = null
required_reagents = list("cream" = 20, "sodiumchloride" = 1)
result_amount = 1
/datum/chemical_reaction/butter/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/reagent_containers/food/snacks/spreads/butter(location)
return
/datum/chemical_reaction/browniemix
name = "Brownie Mix"
id = "browniemix"
result = "browniemix"
required_reagents = list("flour" = 5, "coco" = 5, "sugar" = 5)
result_amount = 15
@@ -390,3 +390,27 @@
/obj/structure/reagent_dispensers/acid/Initialize()
. = ..()
reagents.add_reagent("sacid", 1000)
//Cooking oil refill tank
/obj/structure/reagent_dispensers/cookingoil
name = "cooking oil tank"
desc = "A fifty-litre tank of commercial-grade corn oil, intended for use in large scale deep fryers. Store in a cool, dark place"
icon = 'icons/obj/objects.dmi'
icon_state = "oiltank"
amount_per_transfer_from_this = 120
/obj/structure/reagent_dispensers/cookingoil/New()
..()
reagents.add_reagent("cornoil",5000)
/obj/structure/reagent_dispensers/cookingoil/bullet_act(var/obj/item/projectile/Proj)
if(Proj.get_structure_damage())
explode()
/obj/structure/reagent_dispensers/cookingoil/ex_act()
explode()
/obj/structure/reagent_dispensers/cookingoil/proc/explode()
reagents.splash_area(get_turf(src), 3)
visible_message(span("danger", "The [src] bursts open, spreading oil all over the area."))
qdel(src)
@@ -613,13 +613,48 @@ CIRCUITS BELOW
req_tech = list(TECH_DATA = 4, TECH_BIO = 3)
build_path = /obj/item/weapon/circuitboard/aicore
sort_string = "XAAAA"
// Cooking Appliances
/datum/design/circuit/microwave
name = "microwave board"
id = "microwave_board"
req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
build_path = /obj/item/weapon/circuitboard/microwave
sort_string = "HACAM"
/datum/design/circuit/oven
name = "oven board"
id = "oven_board"
req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
build_path = /obj/item/weapon/circuitboard/oven
sort_string = "HACAN"
/datum/design/circuit/fryer
name = "deep fryer board"
id = "fryer_board"
req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
build_path = /obj/item/weapon/circuitboard/fryer
sort_string = "HACAO"
/datum/design/circuit/cerealmaker
name = "cereal maker board"
id = "cerealmaker_board"
req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
build_path = /obj/item/weapon/circuitboard/cerealmaker
sort_string = "HACAP"
/datum/design/circuit/candymaker
name = "candy machine board"
id = "candymachine_board"
req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
build_path = /obj/item/weapon/circuitboard/candymachine
sort_string = "HACAQ"
/datum/design/circuit/microwave/advanced
name = "deluxe microwave"
id = "deluxe microwave"
req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 4)
build_path = /obj/item/weapon/circuitboard/microwave/advanced
sort_string = "MAAAC"
sort_string = "HACAA"
/* I have no idea how this was even running before, but it doesn't seem to be necessary.
@@ -0,0 +1,43 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Rykka Stormheart
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- rscadd: "Ported over Aurora Cooking from AuroraStation and Citadel-RP!"
- rscadd: "Refactored Recipes to be separated per-appliance, and all appliances have a use!"
- rscadd: "Please take note, Chefs, to pre-heat you appliances at the start of your shift."
- rscadd: "Fryer Recipes require batter before they can be made!"
- rscadd: "Fire alarms will go off if you burn food!"
- rscadd: "The largest change - Cooking takes TIME. Around 6 minutes for the largest recipes in the game."
- rscadd: "Too many other changes to list - refer to PR #7344 https://github.com/PolarisSS13/Polaris/pull/7344"
- rscdel: "Removed fun, and any sense of joy in the game."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 21 KiB

+5 -5
View File
@@ -4612,12 +4612,12 @@
"bKJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hydroponics)
"bKK" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/table/marble,/obj/item/weapon/book/manual/chef_recipes,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/small/peppermill{pixel_x = 3},/obj/machinery/camera/network/civilian{c_tag = "CIV - Kitchen Port"; dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bKL" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bKM" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/fryer,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bKN" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/grill,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bKM" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/appliance/cooker/fryer,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bKN" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/appliance/cooker/grill,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bKO" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/closet/secure_closet/freezer/fridge,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bKP" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bKQ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bKR" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/oven,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bKR" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/appliance/cooker/oven,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bKS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"bKT" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bKU" = (/turf/simulated/wall/r_wall,/area/medical/chemistry)
@@ -4716,7 +4716,7 @@
"bMJ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark/start{name = "Chef"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bMK" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bML" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bMM" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/candy,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bMM" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/appliance/mixer/candy,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bMN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"bMO" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bMP" = (/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
@@ -4817,7 +4817,7 @@
"bOG" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/table/marble,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bOH" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bOI" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/weapon/material/knife/butch,/obj/item/weapon/material/kitchen/rollingpin,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bOJ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/cereal,/obj/machinery/camera/network/civilian{c_tag = "CIV - Kitchen Starboard"; dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bOJ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/appliance/mixer/cereal,/obj/machinery/camera/network/civilian{c_tag = "CIV - Kitchen Starboard"; dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bOK" = (/obj/item/stack/material/phoron,/obj/item/stack/material/phoron,/obj/item/stack/material/phoron,/obj/item/stack/material/phoron,/obj/item/stack/material/phoron,/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "chemcounter"; name = "Pharmacy Counter Lockdown Control"; pixel_y = 14},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/floor_decal/corner/beige{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"bOL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"bOM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
+5 -5
View File
@@ -8095,7 +8095,7 @@
"cZI" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled/steel_grid,/area/crew_quarters/locker)
"cZJ" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/green/bordercorner2{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/locker)
"cZK" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"cZL" = (/obj/machinery/cooker/fryer,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"cZL" = (/obj/machinery/appliance/cooker/fryer,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"cZM" = (/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/green/bordercorner{dir = 1},/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled,/area/crew_quarters/locker)
"cZN" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/locker)
"cZO" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/crew_quarters/locker)
@@ -8130,7 +8130,7 @@
"dar" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_access = null; req_one_access = list(5,12,25,27,28,35)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/locker)
"das" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker)
"dat" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/locker)
"dau" = (/obj/machinery/cooker/candy,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"dau" = (/obj/machinery/appliance/mixer/candy,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"dav" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"daw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/closet,/obj/random/maintenance,/obj/random/maintenance,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/bar)
"dax" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/crew_quarters/kitchen)
@@ -8186,7 +8186,7 @@
"dbv" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/green/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/locker)
"dbw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/bar)
"dbx" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/bar)
"dby" = (/obj/machinery/cooker/cereal,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"dby" = (/obj/machinery/appliance/mixer/cereal,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"dbz" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 10; icon_state = "intact"},/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/maintenance/bar)
"dbA" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/effect/landmark/start{name = "Chef"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"dbB" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
@@ -8346,10 +8346,10 @@
"dez" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/crew_quarters/locker)
"deA" = (/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/green/bordercorner{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/locker)
"deB" = (/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/crate,/turf/simulated/floor/plating,/area/maintenance/bar)
"deC" = (/obj/machinery/cooker/grill,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"deC" = (/obj/machinery/appliance/cooker/grill,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"deD" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"deE" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"deF" = (/obj/machinery/cooker/oven,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"deF" = (/obj/machinery/appliance/cooker/oven,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"deG" = (/obj/structure/closet/lasertag/red,/obj/item/stack/flag/red,/obj/structure/window/reinforced,/turf/simulated/floor/tiled/dark,/area/crew_quarters/locker)
"deH" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/wood,/area/crew_quarters/cafeteria)
"deI" = (/obj/structure/flora/pottedplant,/obj/machinery/computer/guestpass{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/wood,/area/crew_quarters/cafeteria)
+5 -5
View File
@@ -644,7 +644,7 @@
"mt" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mu" = (/obj/machinery/biogenerator,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mv" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mw" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/fryer,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mw" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/appliance/cooker/fryer,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mx" = (/obj/machinery/computer/card/centcom{dir = 4},/obj/item/weapon/card/id/centcom,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed)
"my" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command)
"mz" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/response_ship/start)
@@ -660,7 +660,7 @@
"mJ" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve)
"mK" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall)
"mL" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mM" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/grill,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mM" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/appliance/cooker/grill,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mN" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mO" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command)
"mP" = (/obj/machinery/button/remote/blast_door{id = "crescent_thunderdome"; name = "Thunderdome Access"; pixel_x = 6; pixel_y = -24; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_vip_shuttle"; name = "VIP Shuttle Access"; pixel_x = 6; pixel_y = -34; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_checkpoint_access"; name = "Crescent Checkpoint Access"; pixel_x = -6; pixel_y = -24; req_access = list(101)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command)
@@ -668,7 +668,7 @@
"mR" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/response_ship/start)
"mS" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/response_ship/start)
"mT" = (/obj/machinery/computer/pod{id = "thunderdomegen"; name = "Thunderdome General Supply"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
"mU" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/oven,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mU" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/appliance/cooker/oven,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mV" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/weapon/material/knife/machete/hatchet,/obj/item/weapon/material/knife/machete/hatchet,/obj/item/weapon/material/minihoe,/obj/item/weapon/material/minihoe,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mW" = (/obj/machinery/smartfridge/drying_rack,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mX" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/reagent_containers/glass/bucket,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
@@ -704,7 +704,7 @@
"nB" = (/obj/machinery/flasher{id = "flash"; name = "Thunderdome Flash"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"nC" = (/obj/machinery/seed_extractor,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"nD" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"nE" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/candy,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"nE" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/appliance/mixer/candy,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"nF" = (/obj/machinery/door/blast/regular{id = "CentComPort"; name = "Security Doors"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall)
"nG" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall)
"nH" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command)
@@ -730,7 +730,7 @@
"ob" = (/obj/structure/table/marble,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/material/kitchen/rollingpin,/obj/effect/floor_decal/corner/white/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"oc" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"od" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"oe" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/cereal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"oe" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/appliance/mixer/cereal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"of" = (/obj/structure/table/reinforced,/obj/item/weapon/card/id/gold/captain/spare,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command)
"og" = (/obj/structure/table/reinforced,/obj/item/device/pda/captain,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command)
"oh" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_bay_door"; locked = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command)
+456 -78
View File
@@ -1,81 +1,459 @@
"aa" = (/turf/template_noop,/area/template_noop)
"ab" = (/turf/template_noop,/area/submap/Diner)
"ac" = (/turf/simulated/floor/outdoors/dirt,/area/submap/Diner)
"ad" = (/turf/simulated/wall,/area/submap/Diner)
"ae" = (/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"af" = (/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"ag" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"ah" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"ai" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/obj/item/weapon/reagent_containers/glass/beaker,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aj" = (/obj/structure/table/standard,/obj/machinery/light{dir = 1},/obj/item/weapon/material/knife/butch,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"ak" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"al" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"am" = (/obj/structure/sink/kitchen,/turf/simulated/wall,/area/submap/Diner)
"an" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/Diner)
"ao" = (/obj/structure/bed/chair/wood{dir = 1},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"ap" = (/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aq" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/Diner)
"ar" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,/obj/item/weapon/material/kitchen/utensil/fork,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"as" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/white,/area/submap/Diner)
"at" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/submap/Diner)
"au" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/chef_recipes,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"av" = (/obj/structure/table/standard,/obj/item/weapon/material/kitchen/rollingpin,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aw" = (/obj/machinery/cooker/cereal,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/white,/area/submap/Diner)
"ax" = (/obj/structure/bed/chair/wood,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"ay" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/item/weapon/storage/fancy/egg_box,/obj/item/weapon/storage/fancy/egg_box,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/obj/item/weapon/reagent_containers/food/condiment/sugar,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"az" = (/obj/structure/simple_door/wood,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aA" = (/obj/structure/simple_door/wood,/turf/simulated/floor/tiled,/area/submap/Diner)
"aB" = (/obj/structure/simple_door/wood,/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
"aC" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,/obj/effect/floor_decal/corner/red/diagonal,/obj/item/weapon/material/kitchen/utensil/fork,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aD" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aE" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aF" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aG" = (/turf/simulated/floor/tiled,/area/submap/Diner)
"aH" = (/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
"aI" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
"aJ" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/red/diagonal,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aK" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aL" = (/obj/machinery/light/small{brightness_color = "#DA0205"; brightness_power = 1; brightness_range = 5; dir = 8},/turf/simulated/floor/tiled,/area/submap/Diner)
"aM" = (/obj/machinery/light/small{brightness_color = "#DA0205"; brightness_power = 1; brightness_range = 5; dir = 8},/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
"aN" = (/obj/structure/closet/crate/freezer,/obj/machinery/light/small{dir = 4},/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
"aO" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/red/diagonal,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aP" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aQ" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
"aR" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/coatrack,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aS" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aT" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
"aU" = (/obj/machinery/gibber,/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
"aV" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aW" = (/obj/machinery/cooker/fryer,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aX" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/outdoors/dirt,/area/submap/Diner)
"aY" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/submap/Diner)
"aZ" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/cooker/grill,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"ba" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Diner)
"bb" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/submap/Diner)
"bc" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/white,/area/submap/Diner)
"bd" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/closet/secure_closet/freezer/fridge,/obj/item/weapon/storage/fancy/egg_box,/obj/item/weapon/storage/fancy/egg_box,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"be" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_coffee,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"bf" = (/obj/item/frame/apc,/turf/simulated/floor/lino,/area/submap/Diner)
"bg" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/lino,/area/submap/Diner)
"bh" = (/obj/structure/bed/chair/office/light,/turf/simulated/floor/lino,/area/submap/Diner)
"bi" = (/turf/simulated/floor/lino,/area/submap/Diner)
"bk" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/lino,/area/submap/Diner)
"bl" = (/obj/structure/table/woodentable,/obj/item/weapon/cell/high,/turf/simulated/floor/lino,/area/submap/Diner)
"bm" = (/obj/structure/table/woodentable,/turf/simulated/floor/lino,/area/submap/Diner)
"bn" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/lino,/area/submap/Diner)
"bo" = (/obj/structure/simple_door/wood,/turf/simulated/floor/lino,/area/submap/Diner)
"bp" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/windoor_assembly{icon_state = "l_windoor_assembly01"; dir = 2},/turf/simulated/floor/tiled/white,/area/submap/Diner)
"bq" = (/obj/structure/bookcase,/turf/simulated/floor/lino,/area/submap/Diner)
"br" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/space_heater,/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"bs" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
"bt" = (/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
"bu" = (/obj/structure/toilet,/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
"bv" = (/obj/structure/bed/chair/wood{dir = 4},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"bw" = (/obj/structure/bed/chair/wood{dir = 8},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"bx" = (/obj/structure/simple_door/wood,/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
"by" = (/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
"bz" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
"bA" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"aa" = (
/turf/template_noop,
/area/template_noop)
"ab" = (
/turf/template_noop,
/area/submap/Diner)
"ac" = (
/turf/simulated/floor/outdoors/dirt,
/area/submap/Diner)
"ad" = (
/turf/simulated/wall,
/area/submap/Diner)
"ae" = (
/obj/structure/window/reinforced/full,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"af" = (
/obj/effect/floor_decal/corner/red/diagonal,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"ag" = (
/obj/structure/table/standard,
/obj/machinery/microwave,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"ah" = (
/obj/structure/table/standard,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"ai" = (
/obj/structure/table/standard,
/obj/item/weapon/reagent_containers/food/condiment/enzyme,
/obj/item/weapon/reagent_containers/glass/beaker,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aj" = (
/obj/structure/table/standard,
/obj/machinery/light{
dir = 1
},
/obj/item/weapon/material/knife/butch,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"ak" = (
/obj/machinery/vending/cola,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"al" = (
/obj/machinery/vending/dinnerware,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"am" = (
/obj/structure/sink/kitchen,
/turf/simulated/wall,
/area/submap/Diner)
"an" = (
/obj/structure/flora/tree/sif,
/turf/template_noop,
/area/submap/Diner)
"ao" = (
/obj/structure/bed/chair/wood{
dir = 1
},
/obj/effect/floor_decal/corner/red/diagonal,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"ap" = (
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aq" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/machinery/light{
dir = 1
},
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"ar" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/structure/table/standard,
/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,
/obj/item/weapon/material/kitchen/utensil/fork,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"as" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/structure/table/standard,
/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,
/obj/machinery/light{
icon_state = "tube1";
dir = 4
},
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"at" = (
/obj/machinery/light{
dir = 8;
icon_state = "tube1";
pixel_y = 0
},
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"au" = (
/obj/structure/table/standard,
/obj/item/weapon/book/manual/chef_recipes,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"av" = (
/obj/structure/table/standard,
/obj/item/weapon/material/kitchen/rollingpin,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aw" = (
/obj/machinery/appliance/mixer/cereal,
/obj/machinery/light{
icon_state = "tube1";
dir = 4
},
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"ax" = (
/obj/structure/bed/chair/wood,
/obj/effect/floor_decal/corner/red/diagonal,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"ay" = (
/obj/structure/closet/secure_closet/freezer/fridge,
/obj/item/weapon/storage/fancy/egg_box,
/obj/item/weapon/storage/fancy/egg_box,
/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,
/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,
/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,
/obj/item/weapon/reagent_containers/food/condiment/sugar,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"az" = (
/obj/structure/simple_door/wood,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aA" = (
/obj/structure/simple_door/wood,
/turf/simulated/floor/tiled,
/area/submap/Diner)
"aB" = (
/obj/structure/simple_door/wood,
/turf/simulated/floor/tiled/freezer,
/area/submap/Diner)
"aC" = (
/obj/structure/table/standard,
/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,
/obj/effect/floor_decal/corner/red/diagonal,
/obj/item/weapon/material/kitchen/utensil/fork,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aD" = (
/obj/structure/table/standard,
/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,
/obj/effect/floor_decal/corner/red/diagonal,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aE" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/item/weapon/stool/padded,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aF" = (
/obj/structure/table/standard,
/obj/effect/floor_decal/corner/red/diagonal,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aG" = (
/turf/simulated/floor/tiled,
/area/submap/Diner)
"aH" = (
/turf/simulated/floor/tiled/freezer,
/area/submap/Diner)
"aI" = (
/obj/structure/closet/crate/freezer,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/turf/simulated/floor/tiled/freezer,
/area/submap/Diner)
"aJ" = (
/obj/structure/table/standard,
/obj/effect/floor_decal/corner/red/diagonal,
/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aK" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/machinery/light{
icon_state = "tube1";
dir = 4
},
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aL" = (
/obj/machinery/light/small{
brightness_color = "#DA0205";
brightness_power = 1;
brightness_range = 5;
dir = 8
},
/turf/simulated/floor/tiled,
/area/submap/Diner)
"aM" = (
/obj/machinery/light/small{
brightness_color = "#DA0205";
brightness_power = 1;
brightness_range = 5;
dir = 8
},
/turf/simulated/floor/tiled/freezer,
/area/submap/Diner)
"aN" = (
/obj/structure/closet/crate/freezer,
/obj/machinery/light/small{
dir = 4
},
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/turf/simulated/floor/tiled/freezer,
/area/submap/Diner)
"aO" = (
/obj/structure/table/standard,
/obj/effect/floor_decal/corner/red/diagonal,
/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aP" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/structure/table/standard,
/obj/machinery/microwave,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aQ" = (
/obj/structure/closet/crate/freezer,
/obj/item/weapon/reagent_containers/food/condiment/flour,
/obj/item/weapon/reagent_containers/food/condiment/flour,
/obj/item/weapon/reagent_containers/food/condiment/flour,
/obj/item/weapon/reagent_containers/food/condiment/flour,
/obj/item/weapon/reagent_containers/food/condiment/flour,
/obj/item/weapon/reagent_containers/food/condiment/flour,
/obj/item/weapon/reagent_containers/food/condiment/flour,
/turf/simulated/floor/tiled/freezer,
/area/submap/Diner)
"aR" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/structure/coatrack,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aS" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/structure/table/standard,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aT" = (
/obj/structure/closet/crate/freezer,
/turf/simulated/floor/tiled/freezer,
/area/submap/Diner)
"aU" = (
/obj/machinery/gibber,
/turf/simulated/floor/tiled/freezer,
/area/submap/Diner)
"aV" = (
/obj/machinery/light/small,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aW" = (
/obj/machinery/appliance/cooker/fryer,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aX" = (
/obj/machinery/light/small{
dir = 4
},
/turf/simulated/floor/outdoors/dirt,
/area/submap/Diner)
"aY" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/machinery/light{
dir = 8;
icon_state = "tube1";
pixel_y = 0
},
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"aZ" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/machinery/appliance/cooker/grill,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"ba" = (
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/tiled,
/area/submap/Diner)
"bb" = (
/obj/machinery/light/small{
dir = 1
},
/turf/simulated/floor/tiled,
/area/submap/Diner)
"bc" = (
/obj/machinery/light{
icon_state = "tube1";
dir = 4
},
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"bd" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/structure/closet/secure_closet/freezer/fridge,
/obj/item/weapon/storage/fancy/egg_box,
/obj/item/weapon/storage/fancy/egg_box,
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,
/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,
/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,
/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,
/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"be" = (
/obj/structure/table/standard,
/obj/machinery/chemical_dispenser/bar_coffee,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"bf" = (
/obj/item/frame/apc,
/turf/simulated/floor/lino,
/area/submap/Diner)
"bg" = (
/obj/structure/table/woodentable,
/obj/item/device/flashlight/lamp,
/turf/simulated/floor/lino,
/area/submap/Diner)
"bh" = (
/obj/structure/bed/chair/office/light,
/turf/simulated/floor/lino,
/area/submap/Diner)
"bi" = (
/turf/simulated/floor/lino,
/area/submap/Diner)
"bk" = (
/obj/machinery/light/small{
dir = 8
},
/turf/simulated/floor/lino,
/area/submap/Diner)
"bl" = (
/obj/structure/table/woodentable,
/obj/item/weapon/cell/high,
/turf/simulated/floor/lino,
/area/submap/Diner)
"bm" = (
/obj/structure/table/woodentable,
/turf/simulated/floor/lino,
/area/submap/Diner)
"bn" = (
/obj/machinery/light/small{
dir = 4
},
/turf/simulated/floor/lino,
/area/submap/Diner)
"bo" = (
/obj/structure/simple_door/wood,
/turf/simulated/floor/lino,
/area/submap/Diner)
"bp" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/structure/windoor_assembly{
icon_state = "l_windoor_assembly01";
dir = 2
},
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"bq" = (
/obj/structure/bookcase,
/turf/simulated/floor/lino,
/area/submap/Diner)
"br" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/machinery/space_heater,
/obj/machinery/light,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"bs" = (
/obj/structure/sink{
icon_state = "sink";
dir = 8;
pixel_x = -12;
pixel_y = 2
},
/turf/simulated/floor/tiled/hydro,
/area/submap/Diner)
"bt" = (
/turf/simulated/floor/tiled/hydro,
/area/submap/Diner)
"bu" = (
/obj/structure/toilet,
/turf/simulated/floor/tiled/hydro,
/area/submap/Diner)
"bv" = (
/obj/structure/bed/chair/wood{
dir = 4
},
/obj/effect/floor_decal/corner/red/diagonal,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"bw" = (
/obj/structure/bed/chair/wood{
dir = 8
},
/obj/effect/floor_decal/corner/red/diagonal,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"bx" = (
/obj/structure/simple_door/wood,
/turf/simulated/floor/tiled/hydro,
/area/submap/Diner)
"by" = (
/obj/structure/mirror{
dir = 4;
pixel_x = -32;
pixel_y = 0
},
/turf/simulated/floor/tiled/hydro,
/area/submap/Diner)
"bz" = (
/obj/machinery/light/small,
/turf/simulated/floor/tiled/hydro,
/area/submap/Diner)
"bA" = (
/obj/structure/table/standard,
/turf/simulated/floor/tiled/hydro,
/area/submap/Diner)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -48,9 +48,9 @@
"aV" = (/obj/structure/table/woodentable,/obj/item/weapon/material/kitchen/utensil/fork,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"aW" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"aX" = (/obj/structure/table/standard,/obj/item/weapon/material/knife,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"aY" = (/obj/machinery/cooker/oven,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"aY" = (/obj/machinery/appliance/cooker/oven,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"aZ" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"ba" = (/obj/machinery/cooker/grill,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"ba" = (/obj/machinery/appliance/cooker/grill,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"bb" = (/obj/structure/table/standard,/obj/item/weapon/tray,/obj/item/weapon/tray,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"bc" = (/obj/structure/table/standard,/obj/item/weapon/material/knife/butch,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"bd" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+231 -2
View File
@@ -7,8 +7,237 @@ NanoUI uses doT (https://olado.github.io/doT/index.html) as its templating engin
Markup tags are used to add dynamic content to the template.
TODO - This documentation is incomplete.
### Print Tag
- The print tag outputs variable as text to the UI.
### Credit goes to Neersighted of /tg/station for the styling and large chunks of content of this README.
NanoUI is one of the three primary user interface libraries currently in use
on Polaris (browse(), /datum/browser, NanoUI). It is the most complex of the three,
but offers quite a few advantages, most notably in default features.
NanoUI adds a `ui_interact()` proc to all atoms, which, ideally, should be called
via `interact()`; However, the current standardized layout is `ui_interact()` being
directly called from anywhere in the atom, generally `attack_hand()` or `attack_self()`.
The `ui_interact()` proc should not contain anything but NanoUI data and code.
Here is a simple example from
[poolcontroller.dm @ ParadiseSS13/Paradise](https://github.com/ParadiseSS13/Paradise/blob/master/code/game/machinery/poolcontroller.dm).
```
/obj/machinery/poolcontroller/attack_hand(mob/user)
ui_interact(user)
/obj/machinery/poolcontroller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
data["currentTemp"] = temperature
data["emagged"] = emagged
data["TempColor"] = temperaturecolor
ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "poolcontroller.tmpl", "Pool Controller Interface", 520, 410)
ui.set_initial_data(data)
ui.open()
```
## Components
### `ui_interact()`
The `ui_interact()` proc is used to open a NanoUI (or update it if already open).
As NanoUI will call this proc to update your UI, you should include the data list
within it. On /tg/station, this is handled via `get_ui_data()`, however, as it would
take quite a long time to convert every single one of the 100~ UI's to using such a method,
it is instead just directly created within `ui_interact()`.
The parameters for `try_update_ui` and `/datum/nanoui/New()` are documented in
the code [here](https://github.com/PolarisSS13/Polaris/tree/master/code/modules/nano).
For:
`/datum/nanoui/New(nuser, nsrc_object, nui_key, ntemplate_filename, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null, var/datum/nanoui/master_ui = null, var/datum/topic_state/state = default_state)`
Most of the parameters are fairly self explanatory.
- `nuser` is the person who gets to see the UI window
- `nsrc_obj` is the thing you want to call Topic() on
- `nui_key` should almost always be `main`
- `ntemplate_filename` is the filename with `.tmpl` extension in /nano/templates/
- `ntitle` is what you want to show at the top of the UI window
- `nwidth` is the width of the new window
- `nheight` is the height of the new window
- `nref` is used for onclose()
- `master_ui` is used for UIs that have multiple children, see code for examples
- And finally, `state`.
The most interesting parameter here is `state`, which allows the object to choose the
checks that allow the UI to be interacted with.
The default state (`default_state`) checks that the user is alive, conscious,
and within a few tiles. It allows universal access to silicons. Other states
exist, and may be more appropriate for different interfaces. For example,
`physical_state` requires the user to be nearby, even if they are a silicon.
`inventory_state` checks that the user has the object in their first-level
(not container) inventory, this is suitable for devices such as radios;
`admin_state` checks that the user is an admin (good for admin tools).
```
/obj/item/the/thing/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, force_open = 0)
var/data[0]
ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open = force_open)
if(!ui)
ui = new(user, src, ui_key, "template_name_here.tmpl", title, width, height)
ui.set_initial_data(data)
ui.open()
```
### `Topic()`
`Topic()` handles input from the UI. Typically you will recieve some data from
a button press, or pop up a input dialog to take a numerical value from the
user. Sanity checking is useful here, as `Topic()` is trivial to spoof with
arbitrary data.
The `Topic()` interface is just the same as with more conventional,
stringbuilder-based UIs, and this needs little explanation.
```
/obj/item/weapon/tank/Topic(href, href_list)
if(..())
return 1
if(href_list["dist_p"])
if(href_list["dist_p"] == "custom")
var/custom = input(usr, "What rate do you set the regulator to? The dial reads from 0 to [TANK_MAX_RELEASE_PRESSURE].") as null|num
if(isnum(custom))
href_list["dist_p"] = custom
.()
else if(href_list["dist_p"] == "reset")
distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
else if(href_list["dist_p"] == "min")
distribute_pressure = TANK_MIN_RELEASE_PRESSURE
else if(href_list["dist_p"] == "max")
distribute_pressure = TANK_MAX_RELEASE_PRESSURE
else
distribute_pressure = text2num(href_list["dist_p"])
distribute_pressure = min(max(round(distribute_pressure), TANK_MIN_RELEASE_PRESSURE), TANK_MAX_RELEASE_PRESSURE)
if(href_list["stat"])
if(istype(loc,/mob/living/carbon))
var/mob/living/carbon/location = loc
if(location.internal == src)
location.internal = null
location.internals.icon_state = "internal0"
to_chat(usr, "<span class='notice'>You close the tank release valve.</span>")
if(location.internals)
location.internals.icon_state = "internal0"
else
if(location.wear_mask && (location.wear_mask.flags & MASKINTERNALS))
location.internal = src
to_chat(usr, "<span class='notice'>You open \the [src] valve.</span>")
if(location.internals)
location.internals.icon_state = "internal1"
else
to_chat(usr, "<span class='warning'>You need something to connect to \the [src]!</span>")
```
### Template (doT)
NanoUI templates are written in a customized version of
[doT](https://olado.github.io/doT/index.html),
a Javascript template engine. Data is accessed from the `data` object,
configuration (not used in pratice) from the `config` object, and template
helpers are accessed from the `helper` object.
It is worth explaining that Polaris's version of doT uses custom syntax
for the templates. The `?` operator is split into `if`, `else if parameter`, and `else`,
instead of `?`, `?? paramater`, `??`, and the `=` operator is replaced with `:`. Refer
to the chart below for a full comparison.
#### Helpers
##### Link
`{{:helpers.link(text, icon, {'parameter': true}, status, class, id)}}`
Used to create a link (button), which will pass its parameters to `Topic()`.
* Text: The text content of the link/button
* Icon: The icon shown to the left of the link (http://fontawesome.io/)
* Parameters: The values to be passed to `Topic()`'s `href_list`.
* Status: `null` for clickable, a class for selected/unclickable.
* Class: Styling to apply to the link.
* ID: Sets the element ID.
Status and Class have almost the same effect. However, changing a link's status
from `null` to something else makes it unclickable, while setting a custom Class
does not.
Ternary operators are often used to avoid writing many `if` statements.
For example, depending on if a value in `data` is true or false we can set a
button to clickable or selected:
`{{:helper.link('Close', 'lock', {'stat': 1}, data.valveOpen ? null : 'selected')}}`
Available classes/statuses are:
* null (normal)
* selected
* disabled
* yellowButton
* redButton
* linkDanger
##### displayBar
`{{:helpers.displayBar(value, min, max, class, text)}}`
Used to create a bar, to display a numerical value visually. Min and Max default
to 0 and 100, but you can change them to avoid doing your own percent calculations.
* Value: Defaults to a percentage but can be a straight number if Min/Max are set
* Min: The minimum value (left hand side) of the bar
* Max: The maximum value (right hand side) of the bar
* Class: The color of the bar (null/normal, good, average, bad)
* Text: The text label for the data contained in the bar (often just number form)
As with buttons, ternary operators are quite useful:
`{{:helper.bar(data.tankPressure, 0, 1013, (data.tankPressure > 200) ? 'good' : ((data.tankPressure > 100) ? 'average' : 'bad'))}}`
#### doT
doT is a simple template language, with control statements mixed in with
regular HTML and interpolation expressions.
However, Polaris uses a custom version with a different syntax. Refer
to the chart below for the differences.
Operator | doT | equiv |
|-----------|------------|-------------------|
|Conditional| ? | if |
| | ?? | else |
| | ?? (param) | else if(param) |
|Interpolate| = | : |
|^ + Encode | ! | > |
|Evaluation | # | # |
|Defines | ## # | ## # |
|Iteration | ~ (param) | for (param) |
Here is a simple example from tanks, checking if a variable is true:
```
{{if data.maskConnected}}
<span>The regulator is connected to a mask.</span>
{{else if}}
<span>The regulator is not connected to a mask.</span>
{{/if}}
```
The doT tutorial is [here](https://olado.github.io/doT/tutorial.html).
__Print Tag__
- The print tag outputs the given expression as text to the UI.
`{{:data.variable}}`
### If Tag
+8 -1
View File
@@ -262,7 +262,6 @@
#include "code\datums\organs.dm"
#include "code\datums\position_point_vector.dm"
#include "code\datums\progressbar.dm"
#include "code\datums\recipe.dm"
#include "code\datums\riding.dm"
#include "code\datums\soul_link.dm"
#include "code\datums\sun.dm"
@@ -1075,6 +1074,7 @@
#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\engineering.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\jukebox.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\kitchen_appliances.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm"
@@ -1755,8 +1755,12 @@
#include "code\modules\flufftext\look_up.dm"
#include "code\modules\flufftext\TextFilters.dm"
#include "code\modules\food\food.dm"
#include "code\modules\food\recipe.dm"
#include "code\modules\food\recipe_dump.dm"
#include "code\modules\food\recipes_fryer.dm"
#include "code\modules\food\recipes_grill.dm"
#include "code\modules\food\recipes_microwave.dm"
#include "code\modules\food\recipes_oven.dm"
#include "code\modules\food\drinkingglass\drinkingglass.dm"
#include "code\modules\food\drinkingglass\extras.dm"
#include "code\modules\food\drinkingglass\glass_boxes.dm"
@@ -1782,10 +1786,13 @@
#include "code\modules\food\kitchen\icecream.dm"
#include "code\modules\food\kitchen\microwave.dm"
#include "code\modules\food\kitchen\smartfridge.dm"
#include "code\modules\food\kitchen\cooking_machines\_appliance.dm"
#include "code\modules\food\kitchen\cooking_machines\_cooker.dm"
#include "code\modules\food\kitchen\cooking_machines\_cooker_output.dm"
#include "code\modules\food\kitchen\cooking_machines\_mixer.dm"
#include "code\modules\food\kitchen\cooking_machines\candy.dm"
#include "code\modules\food\kitchen\cooking_machines\cereal.dm"
#include "code\modules\food\kitchen\cooking_machines\container.dm"
#include "code\modules\food\kitchen\cooking_machines\fryer.dm"
#include "code\modules\food\kitchen\cooking_machines\grill.dm"
#include "code\modules\food\kitchen\cooking_machines\oven.dm"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.