Merge pull request #7344 from Rykka-Stormheart/shep-dev-aurora-cooking
Aurora Cooking Port
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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 .
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
..()
|
||||
@@ -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()
|
||||
. = ..()
|
||||
@@ -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.
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
|
||||
|
||||
@@ -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."
|
||||
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 131 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 21 KiB |
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||