diff --git a/citadel.dme b/citadel.dme index 5c2ea9d1f9f1..d08338d228f0 100644 --- a/citadel.dme +++ b/citadel.dme @@ -14,6 +14,7 @@ // BEGIN_INCLUDE #include "_mapload\_basemap.dm" +#include "_mapload\minitest.dm" #include "code\___compile_options.dm" #include "code\__byond_version_compat.dm" #include "code\__global_init.dm" @@ -41,6 +42,7 @@ #include "code\__DEFINES\chemistry.dm" #include "code\__DEFINES\configuration.dm" #include "code\__DEFINES\construction.dm" +#include "code\__DEFINES\cooking.dm" #include "code\__DEFINES\damage_organs.dm" #include "code\__DEFINES\directional.dm" #include "code\__DEFINES\dna.dm" @@ -2666,6 +2668,7 @@ #include "code\modules\food\recipes_fryer.dm" #include "code\modules\food\recipes_microwave.dm" #include "code\modules\food\recipes_oven.dm" +#include "code\modules\food\recipes_stove.dm" #include "code\modules\food\drinkingglass\extras.dm" #include "code\modules\food\drinkingglass\glass1.dm" #include "code\modules\food\drinkingglass\glass2.dm" @@ -2691,10 +2694,21 @@ #include "code\modules\food\food\drinks.dm" #include "code\modules\food\food\ice_cream.dm" #include "code\modules\food\food\lunch.dm" -#include "code\modules\food\food\sandwich.dm" #include "code\modules\food\food\snacks.dm" #include "code\modules\food\food\z_custom_food_vr.dm" -#include "code\modules\food\food\snacks\meat.dm" +#include "code\modules\food\food_2\_cooker.dm" +#include "code\modules\food\food_2\_foodholder.dm" +#include "code\modules\food\food_2\_ingredient.dm" +#include "code\modules\food\food_2\culinary_construct.dm" +#include "code\modules\food\food_2\foodholders.dm" +#include "code\modules\food\food_2\serving.dm" +#include "code\modules\food\food_2\cookers\fryer.dm" +#include "code\modules\food\food_2\cookers\grill.dm" +#include "code\modules\food\food_2\cookers\oven.dm" +#include "code\modules\food\food_2\ingredients\dough_bread.dm" +#include "code\modules\food\food_2\ingredients\meat.dm" +#include "code\modules\food\food_2\ingredients\misc.dm" +#include "code\modules\food\food_2\ingredients\veggies.dm" #include "code\modules\food\glass\bottle.dm" #include "code\modules\food\glass\bottle_vr.dm" #include "code\modules\food\glass\bottle\robot.dm" @@ -2703,15 +2717,8 @@ #include "code\modules\food\machinery\smartfridge.dm" #include "code\modules\food\machinery\smartfridge_vr.dm" #include "code\modules\food\machinery\appliance\_appliance.dm" -#include "code\modules\food\machinery\appliance\_cooker.dm" #include "code\modules\food\machinery\appliance\_cooker_output.dm" -#include "code\modules\food\machinery\appliance\_mixer.dm" -#include "code\modules\food\machinery\appliance\candy.dm" -#include "code\modules\food\machinery\appliance\cereal.dm" #include "code\modules\food\machinery\appliance\container.dm" -#include "code\modules\food\machinery\appliance\fryer.dm" -#include "code\modules\food\machinery\appliance\grill.dm" -#include "code\modules\food\machinery\appliance\oven.dm" #include "code\modules\food\structures\icecream_cart.dm" #include "code\modules\gamemaster\controller.dm" #include "code\modules\gamemaster\defines.dm" @@ -2783,6 +2790,7 @@ #include "code\modules\guidebook\guidebook.dm" #include "code\modules\guidebook\guidebook_section.dm" #include "code\modules\guidebook\sections\reagents.dm" +#include "code\modules\guidebook\sections\recipes.dm" #include "code\modules\hardsuits\_rig.dm" #include "code\modules\hardsuits\activation.dm" #include "code\modules\hardsuits\rig_attackby.dm" diff --git a/code/__DEFINES/cooking.dm b/code/__DEFINES/cooking.dm new file mode 100644 index 000000000000..1d2d0b353719 --- /dev/null +++ b/code/__DEFINES/cooking.dm @@ -0,0 +1,25 @@ +#define RAW 1 +#define COOKED 2 +#define OVERCOOKED 3 +#define BURNT 4 + +#define COOKINFO_TIME 1 +#define COOKINFO_NUTRIMULT 2 +#define COOKINFO_TASTE 3 + +#define HEAT_LOW 1 +#define HEAT_MID 2 +#define HEAT_HIGH 3 + +#define METHOD_OVEN "oven" +#define METHOD_GRILL "grill" +#define METHOD_STOVE "stove" +#define METHOD_DEEPFRY "deep fryer" +#define METHOD_MICROWAVE "microwave" +#define METHOD_BLOWTORCH "blowtorch" //i know a welder isn't actually one but you actually use blowtorches in cooking +#define METHOD_ENERGETIC_ANOMALY "energetic anomaly" //supermatter, tesla, etc + +#define WEIGHT_TASTE_DIVISOR 100 +#define WEIGHT_TASTE_DIVISION(X) X/WEIGHT_TASTE_DIVISOR + +#define INGREDIENT_COOKTIME_MAX_SEPERATION 5 SECONDS diff --git a/code/__DEFINES/machinery.dm b/code/__DEFINES/machinery.dm index 87eea72002c1..f4ad0c97eaaa 100644 --- a/code/__DEFINES/machinery.dm +++ b/code/__DEFINES/machinery.dm @@ -219,3 +219,7 @@ if (!(DATUM.datum_flags & DF_ISPROCESSING)) {\ #define ORION_GAMER_PAMPHLET -1 //game begins to have a chance to warn sec and med #define ORION_GAMER_REPORT_THRESHOLD 2 + +#define PROCESS_ON_SSMACHINES 0 +#define PROCESS_ON_SSFASTPROCESS 1 +#define PROCESS_ON_SSPROCESSING 2 diff --git a/code/__DEFINES/tools/functionality.dm b/code/__DEFINES/tools/functionality.dm index bdeeefc443d0..df8f9120df8d 100644 --- a/code/__DEFINES/tools/functionality.dm +++ b/code/__DEFINES/tools/functionality.dm @@ -48,6 +48,10 @@ GLOBAL_REAL_VAR(_dyntool_image_states) = list( #define TOOL_USAGE_BUILDING_FRAMEWORK (1<<4) /// making tables, detailed furnishings, etc #define TOOL_USAGE_BUILDING_FURNISHINGS (1<<5) +//doing weird stuff that is possibly dangerous and definitely not regulation +#define TOOL_USAGE_INADVISABLE (1<<6) +//doing cooking +#define TOOL_USAGE_COOKING (1<<7) //? tool_locked var diff --git a/code/__HELPERS/lists/types_typecaches.dm b/code/__HELPERS/lists/types_typecaches.dm index ac9340eaa6a3..06470c04cdc8 100644 --- a/code/__HELPERS/lists/types_typecaches.dm +++ b/code/__HELPERS/lists/types_typecaches.dm @@ -7,6 +7,15 @@ return TRUE return FALSE +/** + * Checks for specific types in a list. + */ +/proc/is_exact_type_in_list(atom/A, list/L) + for(var/type in L) + if(A.type == type) + return TRUE + return FALSE + /** * Checks for specific types in a list. */ diff --git a/code/__HELPERS/sorts/comparators.dm b/code/__HELPERS/sorts/comparators.dm index 0214226acb59..d9775bb29653 100644 --- a/code/__HELPERS/sorts/comparators.dm +++ b/code/__HELPERS/sorts/comparators.dm @@ -166,7 +166,7 @@ GLOBAL_VAR_INIT(cmp_field, "name") * 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) +/proc/cmp_recipe_complexity_dsc(datum/cooking_recipe/A, datum/cooking_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 diff --git a/code/controllers/subsystem/early_init.dm b/code/controllers/subsystem/early_init.dm index 603af16e47fc..3491cf7e0b8e 100644 --- a/code/controllers/subsystem/early_init.dm +++ b/code/controllers/subsystem/early_init.dm @@ -5,5 +5,6 @@ SUBSYSTEM_DEF(early_init) /datum/controller/subsystem/early_init/Initialize() init_inventory_slot_meta() + init_cooking_recipes_glob() init_crayon_decal_meta() return ..() diff --git a/code/datums/recipe/crafting_recipes/recipes_clothing.dm b/code/datums/recipe/crafting_recipes/recipes_clothing.dm index cd35d5b81358..aad6813d90be 100644 --- a/code/datums/recipe/crafting_recipes/recipes_clothing.dm +++ b/code/datums/recipe/crafting_recipes/recipes_clothing.dm @@ -356,7 +356,7 @@ /datum/crafting_recipe/garlic_necklace name = "Garlic Necklace" result = /obj/item/clothing/neck/garlic_necklace - reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 15, + reqs = list(/obj/item/reagent_containers/food/snacks/ingredient/grown/garlic = 15, /obj/item/stack/cable_coil = 10) time = 100 //Takes awhile to put all the garlics on the coil and knot it. category = CAT_CLOTHING diff --git a/code/datums/recipe/crafting_recipes/recipes_misc.dm b/code/datums/recipe/crafting_recipes/recipes_misc.dm index 0c15003d63a3..22f602c24682 100644 --- a/code/datums/recipe/crafting_recipes/recipes_misc.dm +++ b/code/datums/recipe/crafting_recipes/recipes_misc.dm @@ -65,7 +65,7 @@ result =/obj/structure/closet/crate/coffin/meatcoffin tools = list(/obj/item/kitchen/knife, /obj/item/kitchen/rollingpin) - reqs = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5, + reqs = list(/obj/item/reagent_containers/food/snacks/ingredient/meat/slab = 5, /obj/item/restraints/handcuffs/cable = 1) time = 150 subcategory = CAT_FURNITURE @@ -634,7 +634,7 @@ name = "Coconut Bong" result = /obj/item/bong/coconut reqs = list(/obj/item/stack/material/mineral/bamboo = 2, - /obj/item/reagent_containers/food/snacks/grown/coconut = 1) + /obj/item/reagent_containers/food/snacks/ingredient/grown/coconut = 1) time = 70 subcategory = CAT_MISCELLANEOUS category = CAT_MISCELLANEOUS diff --git a/code/datums/recipe/crafting_recipes/recipes_primal.dm b/code/datums/recipe/crafting_recipes/recipes_primal.dm index 9978e7d382e7..2ebf29501199 100644 --- a/code/datums/recipe/crafting_recipes/recipes_primal.dm +++ b/code/datums/recipe/crafting_recipes/recipes_primal.dm @@ -478,17 +478,6 @@ category = CAT_PRIMAL always_available = FALSE -/datum/crafting_recipe/cooking_spit - name = "Cooking Spit" - result = /obj/machinery/appliance/cooker/grill/spit - time = 200 - reqs = list(/obj/item/stack/material/bone = 10, - /obj/item/stack/sinew = 10, - /obj/item/pen/charcoal = 5 - ) - category = CAT_PRIMAL - always_available = FALSE - /datum/crafting_recipe/stone_dropper name = "Stone Dropper" result = /obj/item/reagent_containers/dropper/ashlander diff --git a/code/datums/recipe/recipe.dm b/code/datums/recipe/recipe.dm index 4c5932d478c6..71c5fbfbe654 100644 --- a/code/datums/recipe/recipe.dm +++ b/code/datums/recipe/recipe.dm @@ -1,56 +1,50 @@ -// todo: damn, 2011? sounds like ripe time for refactor / optimizations round 'ere-- [user was banned for this post] - /* * * * * * * * * * * * * * * * * * * * * * * * * * - * /datum/recipe by rastaf0 13 apr 2011 * + * /datum/cooking_recipe by rastaf0 13 apr 2011 * + * refactored lolman360 2023/24 (it took me a year) * * * * * * * * * * * * * * * * * * * * * * * * * * * 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 + * In order to use this system you have to define a deriative from /datum/cooking_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. + default /datum/cooking_recipe/ procs does not rely on this parameter. * * Functions you need: - * /datum/recipe/proc/make(var/obj/container as obj) + * /datum/cooking_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) + * /proc/select_recipe(list/datum/cooking_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) + * /datum/cooking_recipe/proc/check_reagents(var/datum/reagents/avail_reagents) + * /datum/cooking_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 CANDYMAKER 0x8 -#define CEREALMAKER 0x10 - -/datum/recipe - var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice - var/list/items // example: = list(/obj/item/crowbar, /obj/item/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/reagent_containers/food/snacks/donut/normal - var/result_quantity = 1 //number of instances of result that are created. - var/time = 50 // 1/10 part of second // Citadel change, increases recipe speed. +/// global recipe cache +/// initialized by SSearly_init +GLOBAL_LIST_EMPTY(cooking_recipes) +GLOBAL_LIST_EMPTY(cooking_recipes_tgui_guidebook_data) + +/proc/init_cooking_recipes_glob() + GLOB.cooking_recipes = list() + for(var/R in subtypesof(/datum/cooking_recipe)) + GLOB.cooking_recipes += new R + for(var/datum/cooking_recipe/R in GLOB.cooking_recipes) + GLOB.cooking_recipes_tgui_guidebook_data += list(R.tgui_guidebook_data()) + + ///Reagents in the ingredients are discarded. @@ -62,54 +56,108 @@ #define RECIPE_REAGENT_MIN 2 ///The entire quantity of the ingredients are added to the result #define RECIPE_REAGENT_SUM 3 - 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. - //List of defines is in _defines/misc.dm. But for reference they are: +/datum/cooking_recipe + var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice. coating reagents should go here + var/list/items // example: = list(/obj/item/crowbar = 1, /obj/item/welder = 2, /obj/item/reagent_containers/food/snacks/ingredient/shrimp = 100) // place /foo/bar before /foo. will take 100g of shrimp + var/list/fruit // example: = list("apple" = 300) = 300g of apples + + + var/result // example: = /obj/item/reagent_containers/food/snacks/donut/normal + var/result_quantity = 1 //number of instances of result that are created. + var/result_reagents //list of result reagents. example = list("berryjuice" = 5, "carbon" = 18) + var/time = 50 // in ds + + + + var/reagent_mix = RECIPE_REAGENT_REPLACE //How to handle reagent differences between the ingredients and the results + + var/required_method = METHOD_MICROWAVE //Which method this recipe can be made in. + //List of defines are in _DEFINES/cooking.dm, but for reference: /* - MICROWAVE - FRYER - OVEN - CANDYMAKER - CEREALMAKER + #define METHOD_OVEN "oven" + #define METHOD_GRILL "grill" + #define METHOD_STOVE "stove" + #define METHOD_DEEPFRY "deep fryer" + #define METHOD_BLOWTORCH "blowtorch" //i know a welder isn't a blowtorch one but you actually use blowtorches in cooking + #define METHOD_ENERGETIC_ANOMALY "energetic anomaly" //supermatter, tesla, etc */ - //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) - if (!reagents || !reagents.len) + //these are string defines, and hence only 1 can be used. + +/datum/cooking_recipe/proc/tgui_guidebook_data() + var/list/required_reagents = list() + var/list/output_reagents = list() + var/list/req_items = list() + var/list/req_growns = list() + var/out_item_name = "error" + + + for(var/r in reagents) + required_reagents += "[reagents[r]]u of [(SSchemistry.fetch_reagent(r)).name]" + for(var/ar in result_reagents) + output_reagents += "[result_reagents[ar]]u of [(SSchemistry.fetch_reagent(ar)).name]" + + for(var/i in items) + if(ispath(i, /obj/item/reagent_containers/food/snacks/ingredient)) + var/obj/item/reagent_containers/food/snacks/ingredient/ingred = i + req_items += "[items[i]]g of [initial(ingred.name)]" + else if(ispath(i, /obj/item)) + var/obj/item/input_item = i + req_items += "\an [initial(input_item.name)]" + + for(var/g in fruit) + if(ispath(g, /obj/item/reagent_containers/food/snacks/ingredient)) + var/obj/item/reagent_containers/food/snacks/ingredient/ingred = g + req_growns += "[fruit[g]]g of [initial(ingred.name)]" + + if(!isnull(result)) + out_item_name = initial(initial(result).name) + else + out_item_name = (SSchemistry.fetch_reagent(result_reagents[1]).name) + + return list( + "result" = out_item_name, + "result_reagents" = english_list(output_reagents), + "result_amount" = result_quantity, + "req_items" = english_list(req_items, nothing_text = "no ingredients"), + "req_growns" = english_list(req_growns, nothing_text = "no growns"), + "req_reagents" = english_list(required_reagents, nothing_text = "no reagents"), + "req_method" = required_method + ) + +/datum/cooking_recipe/proc/check_reagents(var/datum/reagents/avail_reagents) + if(!reagents || !reagents.len) return 1 - if (!avail_reagents) + if(!avail_reagents) return 0 . = 1 - for (var/r_r in reagents) + 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]) + if(aval_r_amnt - reagents[r_r] >= 0) + if(aval_r_amnt>reagents[r_r]) . = 0 else return -1 - if ((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len) + if((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len) return 0 return . -/datum/recipe/proc/check_fruit(var/obj/container) - if (!fruit || !fruit.len) +/datum/cooking_recipe/proc/check_fruit(var/obj/container) + if(!fruit || !fruit.len) return 1 . = 1 if(fruit && fruit.len) var/list/checklist = list() // You should trust Copy(). checklist = fruit.Copy() - for(var/obj/item/reagent_containers/food/snacks/grown/G in container) + for(var/obj/item/reagent_containers/food/snacks/ingredient/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]-- + checklist[G.seed.kitchen_tag] -= G.food_weight for(var/ktag in checklist) if(!isnull(checklist[ktag])) if(checklist[ktag] < 0) @@ -119,63 +167,44 @@ break return . -/datum/recipe/proc/check_items(var/obj/container as obj) - if (!items || !items.len) +/datum/cooking_recipe/proc/check_items(var/obj/container as obj) + if(!items || !items.len) return 1 . = 1 - if (items && items.len) + if(items && items.len) var/list/checklist = list() checklist = items.Copy() // You should really trust Copy for(var/obj/O in container) - if(istype(O,/obj/item/reagent_containers/food/snacks/grown)) + if(istype(O,/obj/item/reagent_containers/food/snacks/ingredient/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)) - if(check_coating(O)) - checklist.Cut(i, i+1) - found = 1 - break - - if (!found) + if((is_exact_type_in_list(O, checklist))) + if(istype(O, /obj/item/reagent_containers/food/snacks/ingredient)) + var/obj/item/reagent_containers/food/snacks/ingredient/our_ingredient = O + checklist[our_ingredient.type] -= our_ingredient.food_weight + if(checklist[our_ingredient.type] < 1) + checklist -= our_ingredient.type + else + checklist[O.type]-- + if(checklist[O.type] < 1) + checklist -= O.type + else . = 0 - if (!checklist.len && . != 1) - return //No need to iterate through everything if we know theres at least oen extraneous ingredient - if (checklist.len) + + if(checklist.len) . = -1 return . -//This is called on individual items within the container. -/datum/recipe/proc/check_coating(var/obj/O) - if(!istype(O,/obj/item/reagent_containers/food/snacks)) - return 1//Only snacks can be battered - - if (coating == -1) - return 1 //-1 value doesnt care - - var/obj/item/reagent_containers/food/snacks/S = O - if (!S.coating) - if (!coating) - return 1 - return 0 - else if (S.coating.type == coating) - return 1 - - return 0 - - //general version -/datum/recipe/proc/make(var/obj/container as obj) +/datum/cooking_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)) + 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)) + 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() @@ -183,47 +212,57 @@ // 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) - return - +/datum/cooking_recipe/proc/make_food(var/obj/container, var/obj/output) + if(!output) + output = container //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/obj/temp = new /obj(src) + var/obj/temp = new /obj(null) temp.create_reagents(1000000000) - //Find items we need - if (items && items.len) - for (var/i in items) - var/obj/item/I = locate(i) in container - if(!I) - continue - if(I.reagents) - I.reagents.trans_to_holder(temp.reagents,I.reagents.total_volume) - qdel(I) //Find fruits - if (fruit && fruit.len) + if(fruit && fruit.len) var/list/checklist = list() checklist = fruit.Copy() - for(var/obj/item/reagent_containers/food/snacks/grown/G in container) + for(var/obj/item/reagent_containers/food/snacks/ingredient/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) + 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(temp.reagents,G.reagents.total_volume) - qdel(G) + var/amount_to_consume = checklist[G.seed.kitchen_tag] + checklist[G.seed.kitchen_tag] -= G.food_weight + if(G && G.reagents) + G.reagents.trans_to_holder(temp.reagents, G.reagents.total_volume * (amount_to_consume / G.food_weight)) + G.consume_weight(amount_to_consume) + + + //Find items we need + if(items && items.len) + for(var/i in items) + var/obj/item/I = locate(i) in container + if(!I) + continue + if(istype(I, /obj/item/reagent_containers/food/snacks/ingredient)) + var/obj/item/reagent_containers/food/snacks/ingredient/IN = I + var/consume_amount = items[IN.type] + I.reagents.trans_to_holder(temp.reagents, I.reagents.total_volume * (consume_amount / IN.food_weight)) + IN.consume_weight(consume_amount) + continue + if(I.reagents) + I.reagents.trans_to_holder(temp.reagents,I.reagents.total_volume) + qdel(I) + + //And lastly deduct necessary quantities of reagents - if (reagents && reagents.len) - for (var/r in 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_id_to(temp, r, reagents[r]) @@ -240,18 +279,23 @@ 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 */ + if(!result && result_reagents) + if(container.reagents && result_reagents) + for(var/r in result_reagents) + container.reagents.add_reagent(r, result_reagents[r]) + return null var/obj/tempholder = new(src) tempholder.create_reagents(100000000) var/list/results = list() while (tally < result_quantity) - var/obj/result_obj = new result(container) + var/obj/result_obj = new result(output) results.Add(result_obj) - if (!result_obj.reagents)//This shouldn't happen + if(!result_obj.reagents)//This shouldn't happen //If the result somehow has no reagents defined, then create a new holder result_obj.create_reagents(temp.reagents.total_volume*1.5) - if (result_quantity == 1) + if(result_quantity == 1) qdel(tempholder.reagents) tempholder.reagents = result_obj.reagents else @@ -260,56 +304,63 @@ switch(reagent_mix) - if (RECIPE_REAGENT_REPLACE) + if(RECIPE_REAGENT_REPLACE) //We do no transferring - if (RECIPE_REAGENT_SUM) + if(RECIPE_REAGENT_SUM) //Sum is easy, just shove the entire buffer into the result temp.reagents.trans_to_holder(tempholder.reagents, temp.reagents.total_volume) - if (RECIPE_REAGENT_MAX) + 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 temp.reagents.reagent_list) + for(var/datum/reagent/R in temp.reagents.reagent_list) var/rvol = tempholder.reagents.get_reagent_amount(R.id) - if (rvol < R.volume) + if(rvol < R.volume) //Transfer the difference temp.reagents.trans_id_to(tempholder, R.id, R.volume-rvol) - if (RECIPE_REAGENT_MIN) + 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 temp.reagents.reagent_list) + for(var/datum/reagent/R in temp.reagents.reagent_list) var/rvol = tempholder.reagents.get_reagent_amount(R.id) - if (rvol == 0) //If the target has zero of this reagent + if(rvol == 0) //If the target has zero of this reagent temp.reagents.trans_id_to(tempholder, R.id, R.volume) //Then transfer all of ours - else if (rvol > R.volume) + else if(rvol > R.volume) //if the target has more than ours //Remove the difference tempholder.reagents.remove_reagent(R.id, rvol-R.volume) - if (results.len > 1) + 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 = tempholder.reagents.total_volume - for (var/i in results) + for(var/i in results) var/atom/a = i //optimisation tempholder.reagents.trans_to(a, total / results.len) + + if(container.reagents && result_reagents) + for(var/r in result_reagents) + container.reagents.add_reagent(r, result_reagents[r]) + 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 = 0) - var/list/datum/recipe/possible_recipes = list() - for (var/datum/recipe/recipe in available_recipes) +/proc/select_recipe(var/list/datum/cooking_recipe/available_recipes, var/obj/obj as obj, var/exact = 0, var/available_method = METHOD_MICROWAVE) + var/list/datum/cooking_recipe/possible_recipes = list() + for(var/datum/cooking_recipe/recipe in available_recipes) if((recipe.check_reagents(obj.reagents) < exact) || (recipe.check_items(obj) < exact) || (recipe.check_fruit(obj) < exact)) continue + if(recipe.required_method != available_method) + continue possible_recipes |= recipe - if (!possible_recipes.len) + if(!possible_recipes.len) return null - else if (possible_recipes.len == 1) + else if(possible_recipes.len == 1) return possible_recipes[1] else //okay, let's select the most complicated recipe tim_sort(possible_recipes, GLOBAL_PROC_REF(cmp_recipe_complexity_dsc)) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index a40b745449c3..7af61c7f835f 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -442,7 +442,7 @@ var/global/list/all_objectives = list() "a nasa voidsuit" = /obj/item/clothing/suit/space/void, "28 moles of phoron (full tank)" = /obj/item/tank, "a sample of slime extract" = /obj/item/slime_extract, - "a piece of corgi meat" = /obj/item/reagent_containers/food/snacks/meat/corgi, + "a piece of corgi meat" = /obj/item/reagent_containers/food/snacks/ingredient/meat/corgi, "a research director's jumpsuit" = /obj/item/clothing/under/rank/research_director, "a chief engineer's jumpsuit" = /obj/item/clothing/under/rank/chief_engineer, "a chief medical officer's jumpsuit" = /obj/item/clothing/under/rank/chief_medical_officer, diff --git a/code/game/landmarks/landmarks.dm b/code/game/landmarks/landmarks.dm index d00ae3343d8f..91d360de51e2 100644 --- a/code/game/landmarks/landmarks.dm +++ b/code/game/landmarks/landmarks.dm @@ -148,7 +148,7 @@ INITIALIZE_IMMEDIATE(/obj/landmark) . = ..() new /obj/item/clothing/suit/chickensuit(src.loc) new /obj/item/clothing/head/chicken(src.loc) - new /obj/item/reagent_containers/food/snacks/egg(src.loc) + new /obj/item/reagent_containers/food/snacks/ingredient/egg(src.loc) delete_on_roundstart = 1 /obj/landmark/costume/gladiator/Initialize(mapload) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index bf90d6cc3e5a..95174cccae85 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -156,8 +156,8 @@ ///Volume of interface sounds. var/clickvol = 40 var/obj/item/circuitboard/circuit = null - ///If false, SSmachines. If true, SSfastprocess. - var/speed_process = FALSE + ///If PROCESS_ON_SSMACHINES, SSmachines. If PROCESS_ON_SSFASTPROCESS, SSfastprocess. if PROCESS_ON_SSPROCESSING, ssprocessing (1nce a second) + var/speed_process = PROCESS_ON_SSMACHINES var/interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE @@ -172,20 +172,24 @@ circuit = new circuit(src) default_apply_parts() - if(!speed_process) + if(speed_process == PROCESS_ON_SSMACHINES) START_MACHINE_PROCESSING(src) - else + else if (speed_process == PROCESS_ON_SSFASTPROCESS) START_PROCESSING(SSfastprocess, src) + else if (speed_process == PROCESS_ON_SSPROCESSING) + START_PROCESSING(SSprocessing, src) if(!mapload) // area handles this power_change() /obj/machinery/Destroy() GLOB.machines.Remove(src) - if(!speed_process) + if(speed_process == PROCESS_ON_SSMACHINES) STOP_MACHINE_PROCESSING(src) - else + else if (speed_process == PROCESS_ON_SSFASTPROCESS) STOP_PROCESSING(SSfastprocess, src) + else if (speed_process == PROCESS_ON_SSPROCESSING) + STOP_PROCESSING(SSprocessing, src) if(component_parts) for(var/atom/A in component_parts) if(A.loc == src) // If the components are inside the machine, delete them. diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 6e870364fb62..cc7221b50026 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -68,8 +68,8 @@ BIOGEN_REAGENT("50 milk", "milk", 50, 95), BIOGEN_REAGENT("10 Cream", "cream", 10, 30), BIOGEN_REAGENT("50 Cream", "cream", 50, 120), - BIOGEN_ITEM("Slab of meat", /obj/item/reagent_containers/food/snacks/meat, 1, 50), - BIOGEN_ITEM("5 slabs of meat", /obj/item/reagent_containers/food/snacks/meat, 5, 250), + BIOGEN_ITEM("Slab of meat", /obj/item/reagent_containers/food/snacks/ingredient/meat, 1, 50), + BIOGEN_ITEM("5 slabs of meat", /obj/item/reagent_containers/food/snacks/ingredient/meat, 5, 250), ) item_list["Cooking Ingredients"] = list( BIOGEN_REAGENT("10 Universal Enzyme", "enzyme", 10, 30), @@ -274,12 +274,12 @@ to_chat(user, SPAN_NOTICE("\The [src] is currently processing.")) else if(istype(O, /obj/item/storage/bag)) var/i = 0 - for(var/obj/item/reagent_containers/food/snacks/grown/G in contents) + for(var/obj/item/reagent_containers/food/snacks/ingredient/grown/G in contents) i++ if(i >= 10) to_chat(user, SPAN_NOTICE("\The [src] is already full! Activate it.")) else - for(var/obj/item/reagent_containers/food/snacks/grown/G in O.contents) + for(var/obj/item/reagent_containers/food/snacks/ingredient/grown/G in O.contents) G.loc = src i++ if(i >= 10) @@ -289,11 +289,11 @@ to_chat(user, SPAN_NOTICE("You empty \the [O] into \the [src].")) - else if(!istype(O, /obj/item/reagent_containers/food/snacks/grown)) + else if(!istype(O, /obj/item/reagent_containers/food/snacks/ingredient/grown)) to_chat(user, SPAN_NOTICE("You cannot put this in \the [src].")) else var/i = 0 - for(var/obj/item/reagent_containers/food/snacks/grown/G in contents) + for(var/obj/item/reagent_containers/food/snacks/ingredient/grown/G in contents) i++ if(i >= 10) to_chat(user, SPAN_NOTICE("\The [src] is full! Activate it.")) @@ -312,7 +312,7 @@ to_chat(usr, SPAN_NOTICE("The biogenerator is in the process of working.")) return var/S = 0 - for(var/obj/item/reagent_containers/food/snacks/grown/I in contents) + for(var/obj/item/reagent_containers/food/snacks/ingredient/grown/I in contents) S += 5 if(I.reagents.get_reagent_amount("nutriment") < 0.1) points += 1 diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 023687111b6c..168e2cf6407f 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -237,10 +237,12 @@ // log_combat(usr, target, "attached_victim", src, "containing: ([container.get_reagent_log_string()])") add_fingerprint(usr) attached_victim = target - if(!speed_process) + if(speed_process == PROCESS_ON_SSMACHINES) START_MACHINE_PROCESSING(src) - else + else if (speed_process == PROCESS_ON_SSFASTPROCESS) START_PROCESSING(SSfastprocess, src) + else if (speed_process == PROCESS_ON_SSPROCESSING) + START_PROCESSING(SSprocessing, src) update_appearance() //! Plumbing Signal diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index 146b9bc2367d..f73b6e639a96 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -9,7 +9,7 @@ /obj/machinery/seed_extractor/attackby(obj/item/O, mob/user) // Fruits and vegetables. - if(istype(O, /obj/item/reagent_containers/food/snacks/grown) || istype(O, /obj/item/grown)) + if(istype(O, /obj/item/reagent_containers/food/snacks/ingredient/grown) || istype(O, /obj/item/grown)) . = CLICKCHAIN_DO_NOT_PROPAGATE if(!user.attempt_insert_item_for_installation(O, src)) return @@ -19,7 +19,7 @@ var/obj/item/grown/F = O new_seed_type = SSplants.seeds[F.plantname] else - var/obj/item/reagent_containers/food/snacks/grown/F = O + var/obj/item/reagent_containers/food/snacks/ingredient/grown/F = O new_seed_type = SSplants.seeds[F.plantname] if(new_seed_type) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 9d2abe72bc2a..6479af5ddefe 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1297,6 +1297,9 @@ product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." icon_state = "dinnerware" products = list( + /obj/item/food_serving = 24, + /obj/item/food_serving/plate = 24, + /obj/item/food_serving/woodbowl = 12, /obj/item/tray = 8, /obj/item/material/kitchen/utensil/fork = 6, /obj/item/material/knife/plastic = 6, diff --git a/code/game/objects/items/contraband.dm b/code/game/objects/items/contraband.dm index 97f760894863..3f9fd5876535 100644 --- a/code/game/objects/items/contraband.dm +++ b/code/game/objects/items/contraband.dm @@ -118,9 +118,9 @@ /obj/item/pen/reagent/paralysis, /obj/item/pickaxe/diamonddrill, /obj/item/reagent_containers/food/drinks/bottle/pwine, - /obj/item/reagent_containers/food/snacks/carpmeat, + /obj/item/reagent_containers/food/snacks/ingredient/carp, /obj/item/reagent_containers/food/snacks/clownstears, - /obj/item/reagent_containers/food/snacks/xenomeat, + /obj/item/reagent_containers/food/snacks/ingredient/xenomeat, /obj/item/reagent_containers/glass/beaker/neurotoxin, /obj/item/hardsuit/combat, /obj/item/shield/energy, diff --git a/code/game/objects/items/scanners/plant.dm b/code/game/objects/items/scanners/plant.dm index a06add08026f..852e5589897b 100644 --- a/code/game/objects/items/scanners/plant.dm +++ b/code/game/objects/items/scanners/plant.dm @@ -55,9 +55,9 @@ var/datum/reagents/grown_reagents if(istype(target,/obj/structure/table)) return ..() - else if(istype(target,/obj/item/reagent_containers/food/snacks/grown)) + else if(istype(target,/obj/item/reagent_containers/food/snacks/ingredient/grown)) - var/obj/item/reagent_containers/food/snacks/grown/G = target + var/obj/item/reagent_containers/food/snacks/ingredient/grown/G = target grown_seed = SSplants.seeds[G.plantname] grown_reagents = G.reagents diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 473bed1fbe86..5246c533ce26 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -210,7 +210,8 @@ max_combined_volume = WEIGHT_VOLUME_NORMAL * 25 max_single_weight_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_SMALL - insertion_whitelist = list(/obj/item/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/grown) + insertion_whitelist = list(/obj/item/reagent_containers/food/snacks/ingredient/grown,/obj/item/seeds,/obj/item/grown) + /obj/item/storage/bag/plants/large name = "large plant bag" @@ -339,4 +340,4 @@ w_class = WEIGHT_CLASS_SMALL insertion_whitelist = list(/obj/item/reagent_containers/food/snacks,/obj/item/reagent_containers/food/condiment, /obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/glass/bottle,/obj/item/coin,/obj/item/spacecash, - /obj/item/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/grown,/obj/item/reagent_containers/pill) + /obj/item/reagent_containers/food/snacks/ingredient/grown,/obj/item/seeds,/obj/item/grown,/obj/item/reagent_containers/pill) diff --git a/code/game/objects/items/storage/misc_legacy/fancy.dm b/code/game/objects/items/storage/misc_legacy/fancy.dm index b9c2e70b3ced..9910578c0204 100644 --- a/code/game/objects/items/storage/misc_legacy/fancy.dm +++ b/code/game/objects/items/storage/misc_legacy/fancy.dm @@ -53,10 +53,10 @@ max_items = 12 max_combined_volume = 12 * WEIGHT_VOLUME_SMALL insertion_whitelist = list( - /obj/item/reagent_containers/food/snacks/egg, + /obj/item/reagent_containers/food/snacks/ingredient/egg, /obj/item/reagent_containers/food/snacks/boiledegg ) - starts_with = list(/obj/item/reagent_containers/food/snacks/egg = 12) + starts_with = list(/obj/item/reagent_containers/food/snacks/ingredient/egg = 12) /* * Candle Boxes diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 74171bd6d817..630efaabb373 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -460,7 +460,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM ..() if (istype(W, /obj/item/reagent_containers/food/snacks)) - var/obj/item/reagent_containers/food/snacks/grown/G = W + var/obj/item/reagent_containers/food/snacks/ingredient/grown/G = W if (!G.dry) to_chat(user, "[G] must be dried before you stuff it into [src].") return @@ -535,7 +535,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/rollingpaper/attackby(obj/item/W as obj, mob/user as mob) if (istype(W, /obj/item/reagent_containers/food/snacks)) - var/obj/item/reagent_containers/food/snacks/grown/G = W + var/obj/item/reagent_containers/food/snacks/ingredient/grown/G = W if (!G.dry) to_chat(user, "[G] must be dried before you roll it into [src].") return @@ -558,7 +558,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/rollingblunt/attackby(obj/item/W as obj, mob/user as mob) if (istype(W, /obj/item/reagent_containers/food/snacks)) - var/obj/item/reagent_containers/food/snacks/grown/G = W + var/obj/item/reagent_containers/food/snacks/ingredient/grown/G = W if (!G.dry) to_chat(user, "[G] must be dried before you roll it into [src].") return diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 89b33c219147..90e9ae46cb9f 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -115,8 +115,8 @@ /obj/item/toy/prize/seraph, /obj/item/toy/spinningtoy, /obj/item/toy/sword, - /obj/item/reagent_containers/food/snacks/grown/ambrosiadeus, - /obj/item/reagent_containers/food/snacks/grown/ambrosiavulgaris, + /obj/item/reagent_containers/food/snacks/ingredient/grown/ambrosiadeus, + /obj/item/reagent_containers/food/snacks/ingredient/grown/ambrosiavulgaris, /obj/item/paicard, /obj/item/instrument/violin, /obj/item/storage/belt/utility/full, diff --git a/code/game/objects/random/mapping.dm b/code/game/objects/random/mapping.dm index 02803fa76d91..9b901916cb51 100644 --- a/code/game/objects/random/mapping.dm +++ b/code/game/objects/random/mapping.dm @@ -151,7 +151,7 @@ /obj/item/clothing/mask/smokable/pipe, /obj/item/reagent_containers/food/drinks/bottle/rum, /obj/item/reagent_containers/food/drinks/bottle/whiskey, - /obj/item/reagent_containers/food/snacks/grown/ambrosiadeus, + /obj/item/reagent_containers/food/snacks/ingredient/grown/ambrosiadeus, /obj/item/flame/lighter/zippo, /obj/structure/closet/crate/hydroponics ), diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index f4aad4afb1de..21200eae3481 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -331,15 +331,15 @@ icon_state = "meat" /obj/random/meat/item_to_spawn() - return pick(prob(60);/obj/item/reagent_containers/food/snacks/meat, - prob(20);/obj/item/reagent_containers/food/snacks/xenomeat/spidermeat, - prob(10);/obj/item/reagent_containers/food/snacks/carpmeat, + return pick(prob(60);/obj/item/reagent_containers/food/snacks/ingredient/meat, + prob(20);/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat, + prob(10);/obj/item/reagent_containers/food/snacks/ingredient/carp, prob(5);/obj/item/reagent_containers/food/snacks/bearmeat, - prob(1);/obj/item/reagent_containers/food/snacks/meat/syntiflesh, - prob(1);/obj/item/reagent_containers/food/snacks/meat/human, - prob(1);/obj/item/reagent_containers/food/snacks/meat/monkey, - prob(1);/obj/item/reagent_containers/food/snacks/meat/corgi, - prob(1);/obj/item/reagent_containers/food/snacks/xenomeat) + prob(1);/obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh, + prob(1);/obj/item/reagent_containers/food/snacks/ingredient/meat/human, + prob(1);/obj/item/reagent_containers/food/snacks/ingredient/meat/monkey, + prob(1);/obj/item/reagent_containers/food/snacks/ingredient/meat/corgi, + prob(1);/obj/item/reagent_containers/food/snacks/ingredient/xenomeat) /obj/random/meat/no_sapient name = "random meat" @@ -348,13 +348,13 @@ icon_state = "meat" /obj/random/meat/no_sapient/item_to_spawn() - return pick(prob(60);/obj/item/reagent_containers/food/snacks/meat, - prob(20);/obj/item/reagent_containers/food/snacks/xenomeat/spidermeat, - prob(10);/obj/item/reagent_containers/food/snacks/carpmeat, + return pick(prob(60);/obj/item/reagent_containers/food/snacks/ingredient/meat, + prob(20);/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat, + prob(10);/obj/item/reagent_containers/food/snacks/ingredient/carp, prob(5);/obj/item/reagent_containers/food/snacks/bearmeat, - prob(1);/obj/item/reagent_containers/food/snacks/meat/syntiflesh, - prob(1);/obj/item/reagent_containers/food/snacks/meat/monkey, - prob(1);/obj/item/reagent_containers/food/snacks/meat/corgi) + prob(1);/obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh, + prob(1);/obj/item/reagent_containers/food/snacks/ingredient/meat/monkey, + prob(1);/obj/item/reagent_containers/food/snacks/ingredient/meat/corgi) /obj/random/material //Random materials for building stuff name = "random material" diff --git a/code/game/objects/structures/ashlander.dm b/code/game/objects/structures/ashlander.dm index 54349c216dec..735497b8a594 100644 --- a/code/game/objects/structures/ashlander.dm +++ b/code/game/objects/structures/ashlander.dm @@ -327,56 +327,6 @@ update_icon() return TRUE -//Ashies gotta eat. -/obj/machinery/appliance/cooker/grill/spit - name = "cooking spit" - desc = "Primitive structures such as these have been used to cook raw meat for as long as the benefits of such a practice have been known." - icon = 'icons/obj/lavaland.dmi' - icon_state = "spitgrill_off" - food_color = "#630905" - on_icon = "spitgrill_on" - off_icon = "spitgrill_off" - max_contents = 1 - container_type = /obj/item/reagent_containers/cooking_container/grill/spit - use_power = USE_POWER_OFF - var/lit = 0 - -/obj/machinery/appliance/cooker/grill/spit/attempt_toggle_power(mob/user) - if (!isliving(user)) - return - - if (!user.IsAdvancedToolUser()) - to_chat(user, "You lack the dexterity to do that!") - return - - if (user.stat || user.restrained() || user.incapacitated()) - return - - if (!Adjacent(user) && !issilicon(user)) - to_chat(user, "You can't reach [src] from here.") - return - - if (!lit) //It's not lit. - machine_stat &= ~POWEROFF - lit = 1 - user.visible_message("[user] ignites the flame beneath the [src].", "You ignite the flame under the [src].") - - else //Its on, turn it off. - lit = 0 - user.visible_message("[user] douses the flame of the [src].", "You douse the flame.") - - playsound(src, 'sound/weapons/gun_flamethrower2.ogg', 40, 1) - update_icon() - -/obj/machinery/appliance/cooker/grill/spit/update_icon() - . = ..() - if(lit) - set_light(3, 2, "#FF9933") - icon_state = "[on_icon]" - else - set_light(0) - icon_state = "[off_icon]" - /obj/structure/ashlander/statue name = "religious statue" desc = "This statue depicts the Mother, one of the Buried Ones. It has been carved from one giant piece of elderstone. It seems to glow faintly, and the distant ring of the chiming stone fills the air around it. The Mother can be seen standing proudly, one arm outstretched. Floating above her open hand somehow is a small, polished sphere of pure elderstone." diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index a4d652be4679..1cd5f2ed4fde 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -240,7 +240,15 @@ if(!consume_fuel(DEFAULTPICK(contents, null))) extinguish() return - if(!grill) + if(grill) + for(var/obj/item/I in get_turf(src)) + if(istype(I, /obj/item/reagent_containers/glass/food_holder)) + var/obj/item/reagent_containers/glass/food_holder/FH = I + FH.tick_heat(2 SECONDS, HEAT_MID, METHOD_GRILL) + if(istype(I, /obj/item/reagent_containers/food/snacks/ingredient)) + var/obj/item/reagent_containers/food/snacks/ingredient/cooking_thingy = I + cooking_thingy.process_cooked(2 SECONDS, HEAT_MID, METHOD_GRILL) + else burn() if(burning) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 596f10bf90e9..8646263c4ef8 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -13,7 +13,7 @@ /obj/structure/closet/secure_closet/freezer/meat name = "meat fridge" starts_with = list( - /obj/item/reagent_containers/food/snacks/meat/monkey = 10) + /obj/item/reagent_containers/food/snacks/ingredient/meat/monkey = 10) /obj/structure/closet/secure_closet/freezer/fridge diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index ecc3dffbb52f..3ae14807c209 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -40,7 +40,7 @@ else return 0 else if(istype(victim, /mob/living/carbon/alien)) - meat_type = /obj/item/reagent_containers/food/snacks/xenomeat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/xenomeat icon_state = "spikebloodygreen" else return 0 diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm index 8f87d062a4d2..30f3db4fae4d 100644 --- a/code/game/objects/structures/loot_piles.dm +++ b/code/game/objects/structures/loot_piles.dm @@ -250,7 +250,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh /obj/item/trash/tray, /obj/item/trash/unajerky, /obj/item/trash/waffles, - /obj/item/reagent_containers/food/snacks/xenomeat/spidermeat, + /obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat, /obj/item/reagent_containers/food/snacks/mysterysoup, /obj/item/reagent_containers/food/snacks/hotdog, /obj/item/pizzabox, diff --git a/code/modules/awaymissions/loot_vr.dm b/code/modules/awaymissions/loot_vr.dm index a4d5543b0e6a..072182298464 100644 --- a/code/modules/awaymissions/loot_vr.dm +++ b/code/modules/awaymissions/loot_vr.dm @@ -270,7 +270,7 @@ /obj/item/reagent_containers/food/snacks/candiedapple, \ /obj/item/reagent_containers/food/snacks/chocolatebar, \ /obj/item/reagent_containers/food/snacks/cookie, \ - /obj/item/reagent_containers/food/snacks/meatball, \ + /obj/item/reagent_containers/food/snacks/ingredient/meatball, \ /obj/item/reagent_containers/food/snacks/plump_pie, \ /obj/item/reagent_containers/food/snacks/liquidfood) for(var/i=0,iYou hide [W] in \the [src].") - update() - return - else if(istype(W,/obj/item/reagent_containers/food/snacks)) - if(src.contents.len > sandwich_limit) - to_chat(user, "If you put anything else on \the [src] it's going to collapse.") - return - if(!user.attempt_insert_item_for_installation(W, src)) - return - to_chat(user, "You layer [W] over \the [src].") - var/obj/item/reagent_containers/F = W - F.reagents.trans_to_obj(src, F.reagents.total_volume) - ingredients += W - update() - return - ..() - -/obj/item/reagent_containers/food/snacks/csandwich/proc/update() - var/fullname = "" //We need to build this from the contents of the var. - var/i = 0 - - cut_overlays() - var/list/overlays_to_add = list() - - for(var/obj/item/reagent_containers/food/snacks/O in ingredients) - - i++ - if(i == 1) - fullname += "[O.name]" - else if(i == ingredients.len) - fullname += " and [O.name]" - else - fullname += ", [O.name]" - - var/image/I = new(src.icon, "sandwich_filling") - I.color = O.filling_color - I.pixel_x = pick(list(-1,0,1)) - I.pixel_y = (i*2)+1 - overlays_to_add += (I) - - var/image/T = new(src.icon, "sandwich_top") - T.pixel_x = pick(list(-1,0,1)) - T.pixel_y = (ingredients.len * 2)+1 - overlays_to_add += T - - name = lowertext("[fullname] sandwich") - if(length(name) > 80) - name = "[pick(list("absurd","colossal","enormous","ridiculous"))] sandwich" - set_weight_class(CEILING(clamp((ingredients.len/2),2,4), 1)) - - add_overlay(overlays_to_add) - -/obj/item/reagent_containers/food/snacks/csandwich/Destroy() - for(var/obj/item/O in ingredients) - qdel(O) - return ..() - -/obj/item/reagent_containers/food/snacks/csandwich/examine(mob/user, dist) - . = ..() - var/obj/item/O = pick(contents) - . += "You think you can see [O.name] in there." - -/obj/item/reagent_containers/food/snacks/csandwich/attempt_feed(mob/living/M, mob/living/user) - var/obj/item/shard - for(var/obj/item/O in contents) - if(istype(O,/obj/item/material/shard)) - shard = O - break - - var/mob/living/H - if(istype(M,/mob/living)) - H = M - - if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable. - to_chat(H, "You lacerate your mouth on a [shard.name] in the sandwich!") - H.adjustBruteLoss(5) //TODO: Target head if human. //This TODO has been here for 4 years. - return ..() diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index ccfdd4d9bed1..b3596777b1e6 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -1,5 +1,5 @@ //Food items that are eaten normally and don't leave anything behind. -/obj/item/reagent_containers/food/snacks +/obj/item/reagent_containers/food/snacks/ name = "snack" desc = "yummy" icon = 'icons/obj/food.dmi' @@ -16,13 +16,10 @@ var/survivalfood = FALSE var/nutriment_amt = 0 var/list/nutriment_desc = list("food" = 1) - var/datum/reagent/nutriment/coating/coating = null var/sealed = FALSE var/custom_open_sound var/open_message = "You peel open the can! It looks ready to eat!" var/opened_icon = 0 - var/icon/flat_icon = null //Used to cache a flat icon generated from dipping in batter. This is used again to make the cooked-batter-overlay - var/do_coating_prefix = 1 //If 0, we wont do "battered thing" or similar prefixes. Mainly for recipes that include batter but have a special name var/cooked_icon = null //Used for foods that are "cooked" without being made into a specific recipe or combination. //Generally applied during modification cooking with oven/fryer //Used to stop deepfried meat from looking like slightly tanned raw meat, and make it actually look cooked @@ -41,14 +38,25 @@ M.visible_message("[M] finishes eating \the [src].","You finish eating \the [src].") M.temporarily_remove_from_inventory(src, INV_OP_FORCE | INV_OP_SHOULD_NOT_INTERCEPT | INV_OP_SILENT) if(trash) - if(ispath(trash,/obj/item)) - var/obj/item/TrashItem = new trash(M) - if(!M.put_in_hands(TrashItem)) - TrashItem.forceMove(M.drop_location()) - else if(istype(trash,/obj/item)) - M.put_in_hands(trash) + var/obj/item/TrashItem = generate_trash(src) + if(!M.put_in_hands(TrashItem)) + TrashItem.forceMove(M.drop_location()) qdel(src) + +/obj/item/reagent_containers/food/snacks/proc/generate_trash(atom/location) + if(trash) + if(ispath(trash, /obj/item)) + . = new trash(location) + trash = null + return + else if(isitem(trash)) + var/obj/item/trash_item = trash + trash_item.forceMove(location) + . = trash + trash = null + return + /obj/item/reagent_containers/food/snacks/attack_self(mob/user) . = ..() if(.) @@ -165,8 +173,6 @@ /obj/item/reagent_containers/food/snacks/examine(mob/user, dist) . = ..() - if (coating) // BEGIN CITADEL CHANGE - . += "It's coated in [coating.name]!" if (bitecount==0) return else if (bitecount==1) @@ -210,7 +216,27 @@ qdel(src) return - if (is_sliceable()) + if(slices_num && slice_path && slices_num > 0) + if(W.is_sharp()) + var/slices_lost = 0 + if(W.w_class > 3) + user.visible_message("[user] crudely slices [src] with [W]!", "You crudely slice [src] with your [W]!") + slices_lost = rand(1, min(1, round(slices_num/2))) + else + user.visible_message("[user] slices [src]!", "You slice [src]!") + var/reagents_per_slice = (reagents.total_volume / slices_num) + for(var/i=1 to (slices_num-slices_lost)) + var/obj/slice = new slice_path (loc) + reagents.trans_to_obj(slice, reagents_per_slice) + qdel(src) + return + + if(istype(W,/obj/item/material/kitchen/rollingpin)) + try_flatten(user) + return + + +/* //these are used to allow hiding edge items in food that is not on a table/tray var/can_slice_here = isturf(loc) && ((locate(/obj/structure/table) in loc) || (locate(/obj/machinery/optable) in loc) || (locate(/obj/item/tray) in loc)) var/hide_item = !has_edge(W) || !can_slice_here @@ -227,28 +253,20 @@ to_chat(user, "You slip \the [W] inside \the [src].") add_fingerprint(user) return +*/ +//no more hiding shit in food. i dont care nobody fucking used this anyways +//i will readd it if there is enough complaining. but also make it better. - if (W.is_sharp()) - if (!can_slice_here) - to_chat(user, "You cannot slice \the [src] here! You need a table or at least a tray to do it.") - return - - var/slices_lost = 0 - if (W.w_class > 3) - user.visible_message("\The [user] crudely slices \the [src] with [W]!", "You crudely slice \the [src] with your [W]!") - slices_lost = rand(1,min(1,round(slices_num/2))) - else - user.visible_message("\The [user] slices \the [src]!", "You slice \the [src]!") +/obj/item/reagent_containers/food/snacks/proc/try_flatten(mob/user) + return - var/reagents_per_slice = reagents.total_volume/slices_num - for(var/i=1 to (slices_num-slices_lost)) - var/obj/slice = new slice_path (loc) - reagents.trans_to_obj(slice, reagents_per_slice) - qdel(src) - return -/obj/item/reagent_containers/food/snacks/proc/is_sliceable() - return (slices_num && slice_path && slices_num > 0) +/obj/item/reagent_containers/food/snacks/proc/initialize_slice(obj/item/reagent_containers/food/snacks/slice, reagents_per_slice) + reagents.trans_to_obj(slice, reagents_per_slice) + if(name != initial(name)) + slice.name = "slice of [name]" + if(desc != initial(desc)) + slice.desc = "[desc]" /obj/item/reagent_containers/food/snacks/Destroy() if(contents) @@ -272,6 +290,17 @@ qdel(src) On_Consume(user) +/obj/item/reagent_containers/food/snacks/proc/update_snack_overlays(obj/item/reagent_containers/food/snacks/S) + cut_overlays() + var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling") + if(S.filling_color == "#FFFFFF") + filling.color = pick("#FF0000","#0000FF","#008000","#FFFF00") + else + filling.color = S.filling_color + + add_overlay(filling) + + ////////////////////////////////////////////////// ////////////////////////////////////////////Snacks ////////////////////////////////////////////////// @@ -676,75 +705,6 @@ src.name = "Frosted Jelly Donut" reagents.add_reagent("sprinkles", 2) -/obj/item/reagent_containers/food/snacks/egg - name = "egg" - desc = "An egg!" - icon_state = "egg" - filling_color = "#FDFFD1" - volume = 10 - -/obj/item/reagent_containers/food/snacks/egg/Initialize(mapload) - . = ..() - reagents.add_reagent("egg", 3) - -/obj/item/reagent_containers/food/snacks/egg/afterattack(atom/target, mob/user, clickchain_flags, list/params) - if(istype(target,/obj/machinery/microwave)) - return ..() - if(!((clickchain_flags & CLICKCHAIN_HAS_PROXIMITY) && target.is_open_container())) - return - to_chat(user, "You crack \the [src] into \the [target].") - reagents.trans_to(target, reagents.total_volume) - qdel(src) - -/obj/item/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) - . = ..() - new/obj/effect/debris/cleanable/egg_smudge(src.loc) - src.reagents.splash(hit_atom, reagents.total_volume) - src.visible_message("[src.name] has been squashed.","You hear a smack.") - qdel(src) - -/obj/item/reagent_containers/food/snacks/egg/attackby(obj/item/W as obj, mob/user as mob) - if(istype( W, /obj/item/pen/crayon )) - var/obj/item/pen/crayon/C = W - var/clr = C.crayon_color_name - - if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) - to_chat(usr, "The egg refuses to take on this color!") - return - - to_chat(usr, "You color \the [src] [clr]") - icon_state = "egg-[clr]" - else - . = ..() - -/obj/item/reagent_containers/food/snacks/egg/randomized/Initialize(mapload) - . = ..() - var/randeggicon = pick("egg-blue","egg-green","egg-orange","egg-purple","egg-red","egg-yellow","egg-rainbow") - icon_state = (randeggicon) - -/obj/item/reagent_containers/food/snacks/egg/blue - icon_state = "egg-blue" - -/obj/item/reagent_containers/food/snacks/egg/green - icon_state = "egg-green" - -/obj/item/reagent_containers/food/snacks/egg/mime - icon_state = "egg-mime" - -/obj/item/reagent_containers/food/snacks/egg/orange - icon_state = "egg-orange" - -/obj/item/reagent_containers/food/snacks/egg/purple - icon_state = "egg-purple" - -/obj/item/reagent_containers/food/snacks/egg/rainbow - icon_state = "egg-rainbow" - -/obj/item/reagent_containers/food/snacks/egg/red - icon_state = "egg-red" - -/obj/item/reagent_containers/food/snacks/egg/yellow - icon_state = "egg-yellow" /obj/item/reagent_containers/food/snacks/friedegg // Buff 3 >> 6 name = "Fried egg" @@ -783,17 +743,6 @@ reagents.add_reagent("toxin", rand(1,3)) src.bitesize = 3 -/obj/item/reagent_containers/food/snacks/tofu // Buff 3 >> 6 - name = "Tofu" - icon_state = "tofu" - desc = "We all love tofu." - filling_color = "#FFFEE0" - nutriment_amt = 6 - nutriment_desc = list("tofu" = 3, "goeyness" = 3) - -/obj/item/reagent_containers/food/snacks/tofu/Initialize(mapload) - . = ..() - src.bitesize = 3 /obj/item/reagent_containers/food/snacks/tofurkey name = "Tofurkey" @@ -803,11 +752,6 @@ nutriment_amt = 12 nutriment_desc = list("turkey" = 3, "tofu" = 5, "goeyness" = 4) -/obj/item/reagent_containers/food/snacks/tofurkey/Initialize(mapload) - . = ..() - reagents.add_reagent("stoxin", 3) - bitesize = 3 - /obj/item/reagent_containers/food/snacks/stuffing // Buff 3 >> 5 name = "Stuffing" desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!" @@ -820,45 +764,6 @@ . = ..() bitesize = 2 // Was 1 -/obj/item/reagent_containers/food/snacks/carpmeat - name = "fillet" - desc = "A fillet of carp meat" - icon_state = "fishfillet" - filling_color = "#FFDEFE" - center_of_mass = list("x"=17, "y"=13) - - var/toxin_type = "carpotoxin" - var/toxin_amount = 3 - -/obj/item/reagent_containers/food/snacks/carpmeat/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent(toxin_type, toxin_amount) - src.bitesize = 6 - -/obj/item/reagent_containers/food/snacks/carpmeat/sif - desc = "A fillet of sivian fish meat." - filling_color = "#2c2cff" - color = "#2c2cff" - toxin_type = "neurotoxic_protein" - toxin_amount = 2 - -/obj/item/reagent_containers/food/snacks/carpmeat/fish // Removed toxin and added a bit more oomph - desc = "A fillet of fish meat." - toxin_amount = 0 - toxin_type = null - nutriment_amt = 2 - -/obj/item/reagent_containers/food/snacks/carpmeat/fish/murkfish - desc = "A fillet of murkfish meat." - filling_color = "#4d331a" - color = "#4d331a" - -/obj/item/reagent_containers/food/snacks/carpmeat/fish/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 4) - bitesize = 3 - /obj/item/reagent_containers/food/snacks/fishfingers name = "Fish Fingers" desc = "A finger of fish." @@ -918,52 +823,30 @@ reagents.add_reagent("protein", 4) bitesize = 3 -/obj/item/reagent_containers/food/snacks/xenomeat // Buff 6 >> 10 +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat // Buff 6 >> 10 name = "xenomeat" desc = "A slab of green meat. Smells like acid." icon_state = "xenomeat" filling_color = "#43DE18" -/obj/item/reagent_containers/food/snacks/xenomeat/Initialize(mapload) +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/Initialize(mapload) . = ..() reagents.add_reagent("protein", 10) reagents.add_reagent("pacid",6) src.bitesize = 6 -/obj/item/reagent_containers/food/snacks/xenomeat/spidermeat // Substitute for recipes requiring xeno meat. +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat // Substitute for recipes requiring xeno meat. name = "spider meat" desc = "A slab of green meat." icon_state = "xenomeat" filling_color = "#43DE18" -/obj/item/reagent_containers/food/snacks/xenomeat/spidermeat/Initialize(mapload) +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat/Initialize(mapload) . = ..() reagents.add_reagent("spidertoxin",6) reagents.remove_reagent("pacid",6) src.bitesize = 6 -/obj/item/reagent_containers/food/snacks/meatball // Buff 3 >> 4 - name = "meatball" - desc = "A great meal all round." - icon_state = "meatball" - filling_color = "#DB0000" - -/obj/item/reagent_containers/food/snacks/meatball/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 4) - bitesize = 2 - -/obj/item/reagent_containers/food/snacks/sausage // Buff 6 >> 9 - name = "Sausage" - desc = "A piece of mixed, long meat." - icon_state = "sausage" - filling_color = "#DB0000" - -/obj/item/reagent_containers/food/snacks/sausage/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 9) - bitesize = 3 - /obj/item/reagent_containers/food/snacks/donkpocket name = "Donk-pocket" desc = "The food of choice for the seasoned traitor." @@ -1551,15 +1434,15 @@ . = ..() bitesize = 2 -/obj/item/reagent_containers/food/snacks/spagetti // Buff 1 >> 2 +/obj/item/reagent_containers/food/snacks/ingredient/spaghetti // Buff 1 >> 2 name = "Spaghetti" desc = "A bundle of raw spaghetti." - icon_state = "spagetti" + icon_state = "spaghetti" filling_color = "#EDDD00" nutriment_amt = 2 nutriment_desc = list("noodles" = 2) -/obj/item/reagent_containers/food/snacks/spagetti/Initialize(mapload) +/obj/item/reagent_containers/food/snacks/ingredient/spaghetti/Initialize(mapload) . = ..() bitesize = 2 @@ -2219,16 +2102,16 @@ . = ..() bitesize = 2 -/obj/item/reagent_containers/food/snacks/boiledspagetti // Buff 2 >> 6 +/obj/item/reagent_containers/food/snacks/boiledspaghetti // Buff 2 >> 6 name = "Boiled Spaghetti" desc = "A plain dish of noodles, this sucks." - icon_state = "spagettiboiled" + icon_state = "spaghettiboiled" trash = /obj/item/trash/plate filling_color = "#FCEE81" nutriment_amt = 6 nutriment_desc = list("noodles" = 2) -/obj/item/reagent_containers/food/snacks/boiledspagetti/Initialize(mapload) +/obj/item/reagent_containers/food/snacks/boiledspaghetti/Initialize(mapload) . = ..() bitesize = 2 @@ -2272,16 +2155,16 @@ reagents.add_reagent("tomatojuice", 10) bitesize = 4 -/obj/item/reagent_containers/food/snacks/meatballspagetti // Buff 8 >> 14 +/obj/item/reagent_containers/food/snacks/meatballspaghetti // Buff 8 >> 14 name = "Spaghetti & Meatballs" desc = "Now thats a nic'e meatball!" - icon_state = "meatballspagetti" + icon_state = "meatballspaghetti" trash = /obj/item/trash/plate filling_color = "#DE4545" nutriment_amt = 6 nutriment_desc = list("noodles" = 4) -/obj/item/reagent_containers/food/snacks/meatballspagetti/Initialize(mapload) +/obj/item/reagent_containers/food/snacks/meatballspaghetti/Initialize(mapload) . = ..() reagents.add_reagent("protein", 8) bitesize = 2 @@ -2912,50 +2795,6 @@ /obj/item/reagent_containers/food/snacks/slice/chocolatecake/filled filled = TRUE -/obj/item/reagent_containers/food/snacks/sliceable/cheesewheel - name = "Cheese wheel" - desc = "A big wheel of delcious Cheddar." - icon_state = "cheesewheel" - slice_path = /obj/item/reagent_containers/food/snacks/cheesewedge - slices_num = 5 - filling_color = "#FFF700" - nutriment_desc = list("cheese" = 10) - nutriment_amt = 10 - -/obj/item/reagent_containers/food/snacks/sliceable/cheesewheel/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 10) - bitesize = 2 - -/obj/item/reagent_containers/food/snacks/cheesewedge - name = "Cheese wedge" - desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far." - icon_state = "cheesewedge" - filling_color = "#FFF700" - bitesize = 2 - -/obj/item/reagent_containers/food/snacks/sliceable/bluecheesewheel - name = "Blue Cheese wheel" - desc = "A big wheel of moldy blue cheese." - icon_state = "bluecheesewheel" - slice_path = /obj/item/reagent_containers/food/snacks/bluecheesewedge - slices_num = 5 - filling_color = "#f1f0c8" - nutriment_desc = list("sour cheese" = 10) - nutriment_amt = 10 - -/obj/item/reagent_containers/food/snacks/sliceable/bluecheesewheel/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 10) - bitesize = 2 - -/obj/item/reagent_containers/food/snacks/bluecheesewedge - name = "Blue Cheese wedge" - desc = "A wedge of moldy blue cheese. The cheese wheel it was cut from can't have gone far." - icon_state = "bluecheesewedge" - filling_color = "#f1f0c8" - bitesize = 2 - /obj/item/reagent_containers/food/snacks/sliceable/birthdaycake name = "Birthday Cake" desc = "Happy Birthday..." @@ -3435,70 +3274,9 @@ /////////////////////////////////////////// // new old food stuff from bs12 /////////////////////////////////////////// -/obj/item/reagent_containers/food/snacks/dough - name = "dough" - desc = "A piece of dough." - icon = 'icons/obj/food_ingredients.dmi' - icon_state = "dough" - bitesize = 2 - nutriment_amt = 3 - nutriment_desc = list("uncooked dough" = 3) - -/obj/item/reagent_containers/food/snacks/dough/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 1) - -// Dough + rolling pin = flat dough -/obj/item/reagent_containers/food/snacks/dough/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W,/obj/item/material/kitchen/rollingpin)) - new /obj/item/reagent_containers/food/snacks/sliceable/flatdough(src) - to_chat(user, "You flatten the dough.") - qdel(src) - else - . = ..() - -// slicable into 3xdoughslices -/obj/item/reagent_containers/food/snacks/sliceable/flatdough - name = "flat dough" - desc = "A flattened dough." - icon = 'icons/obj/food_ingredients.dmi' - icon_state = "flat dough" - slice_path = /obj/item/reagent_containers/food/snacks/doughslice - slices_num = 3 - -/obj/item/reagent_containers/food/snacks/sliceable/flatdough/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 1) - reagents.add_reagent("nutriment", 3) - -/obj/item/reagent_containers/food/snacks/doughslice - name = "dough slice" - desc = "A building block of an impressive dish." - icon = 'icons/obj/food_ingredients.dmi' - icon_state = "doughslice" - slice_path = /obj/item/reagent_containers/food/snacks/spagetti - slices_num = 1 - bitesize = 2 - nutriment_amt = 1 - nutriment_desc = list("uncooked dough" = 1) - -/obj/item/reagent_containers/food/snacks/doughslice/Initialize(mapload) - . = ..() - -/obj/item/reagent_containers/food/snacks/bun - name = "bun" - desc = "A base for any self-respecting burger." - icon = 'icons/obj/food_ingredients.dmi' - icon_state = "bun" - bitesize = 2 - nutriment_amt = 4 - nutriment_desc = list("bun" = 4) - -/obj/item/reagent_containers/food/snacks/bun/Initialize(mapload) - . = ..() /* BEGIN CITADEL CHANGE - Moved to /code/modules/food/food/snacks.dm for Aurora kitchen port -/obj/item/reagent_containers/food/snacks/bun/attackby(obj/item/W as obj, mob/user as mob) +/obj/item/reagent_containers/food/snacks/ingredient/bun/attackby(obj/item/W as obj, mob/user as mob) // Bun + meatball = burger if(istype(W,/obj/item/reagent_containers/food/snacks/meatball)) new /obj/item/reagent_containers/food/snacks/monkeyburger(src) @@ -3514,35 +3292,13 @@ qdel(src) // Bun + sausage = hotdog - else if(istype(W,/obj/item/reagent_containers/food/snacks/sausage)) + else if(istype(W,/obj/item/reagent_containers/food/snacks/ingredient/sausage)) new /obj/item/reagent_containers/food/snacks/hotdog(src) to_chat(user, "You make a hotdog.") qdel(W) qdel(src) END CITADEL CHANGE */ -// Burger + cheese wedge = cheeseburger -/obj/item/reagent_containers/food/snacks/monkeyburger/attackby(obj/item/reagent_containers/food/snacks/cheesewedge/W as obj, mob/user as mob) - if(istype(W))// && !istype(src,/obj/item/reagent_containers/food/snacks/cheesewedge)) - new /obj/item/reagent_containers/food/snacks/cheeseburger(src) - to_chat(user, "You make a cheeseburger.") - qdel(W) - qdel(src) - return - else - . = ..() - -// Human Burger + cheese wedge = cheeseburger -/obj/item/reagent_containers/food/snacks/human/burger/attackby(obj/item/reagent_containers/food/snacks/cheesewedge/W as obj, mob/user as mob) - if(istype(W)) - new /obj/item/reagent_containers/food/snacks/cheeseburger(src) - to_chat(user, "You make a cheeseburger.") - qdel(W) - qdel(src) - return - else - . = ..() - /obj/item/reagent_containers/food/snacks/bunbun // Name fix name = "Improper Bun Bun" desc = "A small bread monkey fashioned from two burger buns." @@ -3565,47 +3321,6 @@ END CITADEL CHANGE */ . = ..() reagents.add_reagent("protein", 3) -/obj/item/reagent_containers/food/snacks/rawcutlet - name = "raw cutlet" - desc = "A thin piece of raw meat." - icon = 'icons/obj/food_ingredients.dmi' - icon_state = "rawcutlet" - bitesize = 1 - -/obj/item/reagent_containers/food/snacks/rawcutlet/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 1) - -/obj/item/reagent_containers/food/snacks/cutlet - name = "cutlet" - desc = "A tasty meat slice." - icon = 'icons/obj/food_ingredients.dmi' - icon_state = "cutlet" - bitesize = 2 - -/obj/item/reagent_containers/food/snacks/cutlet/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 2) - -/obj/item/reagent_containers/food/snacks/rawmeatball - name = "raw meatball" - desc = "A raw meatball." - icon = 'icons/obj/food_ingredients.dmi' - icon_state = "rawmeatball" - bitesize = 2 - -/obj/item/reagent_containers/food/snacks/rawmeatball/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 2) - -/obj/item/reagent_containers/food/snacks/hotdog - name = "hotdog" - desc = "Unrelated to dogs, maybe." - icon_state = "hotdog" - bitesize = 2 - -/obj/item/reagent_containers/food/snacks/hotdog/Initialize(mapload) - . = ..() reagents.add_reagent("protein", 6) /obj/item/reagent_containers/food/snacks/flatbread @@ -3617,30 +3332,6 @@ END CITADEL CHANGE */ nutriment_amt = 3 nutriment_desc = list("bread" = 3) -/obj/item/reagent_containers/food/snacks/flatbread/Initialize(mapload) - . = ..() - -// potato + knife = raw sticks -/obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/W, mob/user) - if(seed && seed.kitchen_tag && seed.kitchen_tag == "potato" && istype(W,/obj/item/material/knife)) - new /obj/item/reagent_containers/food/snacks/rawsticks(get_turf(src)) - to_chat(user, "You cut the potato.") - qdel(src) - else - . = ..() - -/obj/item/reagent_containers/food/snacks/rawsticks - name = "raw potato sticks" - desc = "Raw fries, not very tasty." - icon = 'icons/obj/food_ingredients.dmi' - icon_state = "rawsticks" - bitesize = 2 - nutriment_amt = 3 - nutriment_desc = list("raw potato" = 3) - -/obj/item/reagent_containers/food/snacks/rawsticks/Initialize(mapload) - . = ..() - /obj/item/reagent_containers/food/snacks/liquid // Buff back to 30 from 20 name = "\improper LiquidFood Ration" desc = "A prepackaged grey slurry of all the essential nutrients for a spacefarer on the go. Should this be crunchy? A fat straw integrated into the tip of the pouch seems designed to pierce it when pulled up." @@ -3686,7 +3377,7 @@ END CITADEL CHANGE */ reagents.add_reagent("enzyme", 1) reagents.add_reagent("iron", 3) -/obj/item/reagent_containers/food/snacks/meatcube +/obj/item/reagent_containers/food/snacks/meatcube //lol name = "cubed meat" desc = "Fried, salted lean meat compressed into a cube. Not very appetizing." icon_state = "meatcube" @@ -3851,17 +3542,15 @@ END CITADEL CHANGE */ reagents.add_reagent("protein", 5) bitesize = 2 -/obj/item/reagent_containers/food/snacks/tortilla - name = "tortilla" - desc = "The base for all your burritos." - icon_state = "tortilla" - nutriment_amt = 1 - nutriment_desc = list("bread" = 1) +/obj/item/reagent_containers/food/snacks/hotdog + name = "hotdog" + desc = "Unrelated to dogs, maybe." + icon_state = "hotdog" + bitesize = 2 -/obj/item/reagent_containers/food/snacks/tortilla/Initialize(mapload) +/obj/item/reagent_containers/food/snacks/hotdog/Initialize(mapload) . = ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 + reagents.add_reagent("protein", 6) /obj/item/reagent_containers/food/snacks/meatburrito name = "carne asada burrito" @@ -3962,83 +3651,9 @@ END CITADEL CHANGE */ . = ..() bitesize = 3 -//Code for dipping food in batter -/obj/item/reagent_containers/food/snacks/afterattack(atom/target, mob/user, clickchain_flags, list/params) - if(target.is_open_container() && target.reagents && !(istype(target, /obj/item/reagent_containers/food))) - for (var/r in target.reagents.reagent_list) - - var/datum/reagent/R = r - if (istype(R, /datum/reagent/nutriment/coating)) - if (apply_coating(R, user)) - return 1 - - return ..() - -//This proc handles drawing coatings out of a container when this food is dipped into it -/obj/item/reagent_containers/food/snacks/proc/apply_coating(var/datum/reagent/nutriment/coating/C, var/mob/user) - if (coating) - to_chat(user, "The [src] is already coated in [coating.name]!") - return 0 - - //Calculate the reagents of the coating needed - var/req = 0 - for (var/r in reagents.reagent_list) - var/datum/reagent/R = r - if (istype(R, /datum/reagent/nutriment)) - req += R.volume * 0.2 - else - req += R.volume * 0.1 - - req += w_class*0.5 - - if (!req) - //the food has no reagents left, its probably getting deleted soon - return 0 - - if (C.volume < req) - to_chat(user, SPAN_WARNING( "There's not enough [C.name] to coat the [src]!")) - return 0 - - var/id = C.id - - //First make sure there's space for our batter - if (reagents.available_volume() < req+5) - var/extra = req+5 - reagents.available_volume() - reagents.maximum_volume += extra - - //Suck the coating out of the holder - C.holder.trans_to_holder(reagents, req) - - //We're done with C now, repurpose the var to hold a reference to our local instance of it - C = reagents.get_reagent(id) - if (!C) - return - - coating = C - //Now we have to do the witchcraft with masking images - //var/icon/I = new /icon(icon, icon_state) - - if (!flat_icon) - flat_icon = get_flat_icon(src) - var/icon/I = flat_icon - color = "#FFFFFF" //Some fruits use the color var. Reset this so it doesnt tint the batter - I.Blend(new /icon('icons/obj/food_custom.dmi', rgb(255,255,255)),ICON_ADD) - I.Blend(new /icon('icons/obj/food_custom.dmi', coating.icon_raw),ICON_MULTIPLY) - - var/image/coating_image = image(I) - coating_image.alpha = 200 - coating_image.blend_mode = BLEND_OVERLAY - coating_image.tag = "coating" - add_overlay(coating_image) - - if (user) - user.visible_message(SPAN_NOTICE("[user] dips \the [src] into \the [coating.name]"), SPAN_NOTICE("You dip \the [src] into \the [coating.name]")) - - return 1 - - //Called by cooking machines. This is mainly intended to set properties on the food that differ between raw/cooked /obj/item/reagent_containers/food/snacks/proc/cook() +/* if (coating) var/list/temp = overlays.Copy() for (var/i in temp) @@ -4065,7 +3680,7 @@ END CITADEL CHANGE */ if (do_coating_prefix == 1) name = "[coating.coated_adj] [name]" - +*/ for (var/r in reagents.reagent_list) var/datum/reagent/R = r if (istype(R, /datum/reagent/nutriment/coating)) @@ -4117,7 +3732,7 @@ END CITADEL CHANGE */ /mob/living/simple_animal/lizard kitchen_tag = "lizard" -/obj/item/reagent_containers/food/snacks/sliceable/cheesewheel +/obj/item/reagent_containers/food/snacks/ingredient/cheesewheel slices_num = 8 /obj/item/reagent_containers/food/snacks/sausage/battered @@ -4125,7 +3740,7 @@ END CITADEL CHANGE */ desc = "A piece of mixed, long meat, battered and then deepfried." icon_state = "batteredsausage" filling_color = "#DB0000" - do_coating_prefix = 0 + /obj/item/reagent_containers/food/snacks/sausage/battered/Initialize(mapload) . = ..() @@ -4139,7 +3754,7 @@ END CITADEL CHANGE */ desc = "A battered, deep-fried chilli pepper." icon_state = "popper" filling_color = "#00AA00" - do_coating_prefix = 0 + nutriment_amt = 2 nutriment_desc = list("chilli pepper" = 2) bitesize = 1 @@ -4175,7 +3790,7 @@ END CITADEL CHANGE */ icon_state = "katsu" trash = /obj/item/trash/plate filling_color = "#E9ADFF" - do_coating_prefix = 0 + /obj/item/reagent_containers/food/snacks/chickenkatsu/Initialize(mapload) . = ..() @@ -4193,19 +3808,6 @@ END CITADEL CHANGE */ reagents.add_reagent("cooking_oil", 1.2)//This is mainly for the benefit of adminspawning bitesize = 2 -/obj/item/reagent_containers/food/snacks/microchips - name = "micro chips" - desc = "Soft and rubbery, should have fried them. Good for smaller crewmembers, maybe?" - icon_state = "microchips" - trash = /obj/item/trash/plate - filling_color = "#EDDD00" - nutriment_amt = 4 - nutriment_desc = list("soggy fries" = 4) - -/obj/item/reagent_containers/food/snacks/microchips/Initialize(mapload) - . = ..() - bitesize = 2 - /obj/item/reagent_containers/food/snacks/ovenchips name = "oven chips" desc = "Dark and crispy, but a bit dry." @@ -4239,7 +3841,6 @@ END CITADEL CHANGE */ /obj/item/reagent_containers/food/snacks/sliceable/pizza/crunch/Initialize(mapload) . = ..() reagents.add_reagent("batter", 6.5) - coating = reagents.get_reagent("batter") reagents.add_reagent("cooking_oil", 4) bitesize = 2 @@ -4255,7 +3856,7 @@ END CITADEL CHANGE */ desc = "Funnel cakes rule!" icon_state = "funnelcake" filling_color = "#Ef1479" - do_coating_prefix = 0 + /obj/item/reagent_containers/food/snacks/funnelcake/Initialize(mapload) . = ..() @@ -4292,52 +3893,6 @@ END CITADEL CHANGE */ reagents.add_reagent("triglyceride", 20) reagents.add_reagent("sodiumchloride",1) -/obj/item/reagent_containers/food/snacks/rawcutlet/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W,/obj/item/material/knife)) - new /obj/item/reagent_containers/food/snacks/rawbacon(src) - new /obj/item/reagent_containers/food/snacks/rawbacon(src) - to_chat(user, "You slice the cutlet into thin strips of bacon.") - qdel(src) - else - . = ..() - -/obj/item/reagent_containers/food/snacks/rawbacon - name = "raw bacon" - desc = "A very thin piece of raw meat, cut from beef." - icon = 'icons/obj/food_ingredients.dmi' - icon_state = "rawbacon" - bitesize = 1 - -/obj/item/reagent_containers/food/snacks/rawbacon/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 0.33) - -/obj/item/reagent_containers/food/snacks/bacon - name = "bacon" - desc = "A tasty meat slice. You don't see any pigs on this station, do you?" - icon = 'icons/obj/food_ingredients.dmi' - icon_state = "bacon" - bitesize = 2 - -/obj/item/reagent_containers/food/snacks/bacon/microwave - name = "microwaved bacon" - desc = "A tasty meat slice. You don't see any pigs on this station, do you?" - icon = 'icons/obj/food_ingredients.dmi' - icon_state = "bacon" - bitesize = 2 - -/obj/item/reagent_containers/food/snacks/bacon/oven - name = "oven-cooked bacon" - desc = "A tasty meat slice. You don't see any pigs on this station, do you?" - icon = 'icons/obj/food_ingredients.dmi' - icon_state = "bacon" - bitesize = 2 - -/obj/item/reagent_containers/food/snacks/bacon/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 0.33) - reagents.add_reagent("triglyceride", 1) - /obj/item/reagent_containers/food/snacks/bacon_stick name = "eggpop" desc = "A bacon wrapped boiled egg, conviently skewered on a wooden stick." @@ -4656,7 +4211,7 @@ END CITADEL CHANGE */ reagents.add_reagent("honey", 3) // Moved /bun/attackby() from /code/modules/food/food/snacks.dm -/obj/item/reagent_containers/food/snacks/bun/attackby(obj/item/W as obj, mob/user as mob) +/obj/item/reagent_containers/food/snacks/ingredient/bun/attackby(obj/item/W as obj, mob/user as mob) //i honestly should probably refactor this whole thing but idgaf if(istype(W,/obj/item/storage)) . = ..() //if you want to bag a ton of buns idk i don't play chef @@ -4664,21 +4219,21 @@ END CITADEL CHANGE */ var/obj/item/reagent_containers/food/snacks/result = null // Bun + meatball = burger - if(istype(W,/obj/item/reagent_containers/food/snacks/meatball)) + if(istype(W,/obj/item/reagent_containers/food/snacks/ingredient/meatball)) result = new /obj/item/reagent_containers/food/snacks/monkeyburger(src) to_chat(user, "You make a burger.") qdel(W) qdel(src) // Bun + cutlet = hamburger - else if(istype(W,/obj/item/reagent_containers/food/snacks/cutlet)) + else if(istype(W,/obj/item/reagent_containers/food/snacks/ingredient/cutlet)) result = new /obj/item/reagent_containers/food/snacks/monkeyburger(src) to_chat(user, "You make a burger.") qdel(W) qdel(src) // Bun + sausage = hotdog - else if(istype(W,/obj/item/reagent_containers/food/snacks/sausage)) + else if(istype(W,/obj/item/reagent_containers/food/snacks/ingredient/sausage)) result = new /obj/item/reagent_containers/food/snacks/hotdog(src) to_chat(user, "You make a hotdog.") qdel(W) @@ -4712,16 +4267,6 @@ END CITADEL CHANGE */ user.drop_item_to_ground(src, INV_OP_FORCE) user.put_in_hands(result) - -// Chip update. -/obj/item/reagent_containers/food/snacks/tortilla - name = "tortilla" - desc = "A thin, flour-based tortilla that can be used in a variety of dishes, or can be served as is." - icon_state = "tortilla" - bitesize = 3 - nutriment_desc = list("tortilla" = 1) - nutriment_amt = 6 - //chips /obj/item/reagent_containers/food/snacks/chip name = "chip" @@ -5202,7 +4747,7 @@ END CITADEL CHANGE */ . = ..() bitesize = 2 -/obj/item/reagent_containers/food/snacks/chickenfillet +/obj/item/reagent_containers/food/snacks/chickenfilletsandwich name = "chicken fillet sandwich" desc = "Fried chicken, in sandwich format. Beauty is simplicity." icon_state = "chickenfillet" @@ -5916,18 +5461,6 @@ END CITADEL CHANGE */ reagents.add_reagent("protein", 4) bitesize = 2 -/obj/item/reagent_containers/food/snacks/meat/grubmeat - name = "grubmeat" - desc = "A slab of grub meat, it gives a gentle shock if you touch it" - icon_state = "grubmeat" - center_of_mass = list("x"=16, "y"=10) - -/obj/item/reagent_containers/food/snacks/meat/grubmeat/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 1) - reagents.add_reagent("shockchem", 6) - bitesize = 6 - /obj/item/reagent_containers/food/snacks/bugball name = "bugball" desc = "A hard chitin, dont chip a tooth!" @@ -6254,7 +5787,7 @@ END CITADEL CHANGE */ /obj/item/reagent_containers/food/snacks/diggerstew name = "digger stew" - desc = "A thick, hearty Stew, usually cooked in large portions for hungry Tyrmalin miners." + desc = "A thick, hearty stew, usually cooked in large portions for hungry Tyrmalin miners." icon_state = "diggerstew" trash = /obj/item/trash/bowl filling_color = "#9E673A" @@ -6271,7 +5804,7 @@ END CITADEL CHANGE */ /obj/item/reagent_containers/food/snacks/diggerstew_pot name = "pot of digger stew" - desc = "A thick, hearty Stew, usually cooked in large portions for hungry Tyrmalin miners. The larger pot means more veggies!" + desc = "A thick, hearty stew, usually cooked in large portions for hungry Tyrmalin miners. The larger pot means more veggies!" icon_state = "diggerstew_pot" filling_color = "#9E673A" nutriment_amt = 10 @@ -6566,21 +6099,9 @@ END CITADEL CHANGE */ reagents.add_reagent("nutriment", 5) bitesize = 2 -/obj/item/reagent_containers/food/snacks/ham - name = "ham" - desc = "A hearty chunk of brined pork." - icon_state = "ham" - nutriment_amt = 8 - nutriment_desc = list("meat" = 5, "salt" = 3) - -/obj/item/reagent_containers/food/snacks/ham/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 8) - bitesize = 2 - /obj/item/reagent_containers/food/snacks/rumham name = "rum ham" - desc = "EATING your booze? That...is genius!" + desc = "EATING your booze? That... is genius!" icon_state = "rumham" nutriment_amt = 6 nutriment_desc = list("meat" = 3, "salt" = 3, "rum" = 6) diff --git a/code/modules/food/food/snacks/meat.dm b/code/modules/food/food/snacks/meat.dm deleted file mode 100644 index 059265d0d923..000000000000 --- a/code/modules/food/food/snacks/meat.dm +++ /dev/null @@ -1,87 +0,0 @@ -/obj/item/reagent_containers/food/snacks/meat - name = "meat" - desc = "A slab of meat." - icon_state = "meat" - filling_color = "#FF1C1C" - center_of_mass = list("x"=16, "y"=14) - -/obj/item/reagent_containers/food/snacks/meat/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("triglyceride", 2) - src.bitesize = 1.5 - -/obj/item/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/reagent_containers/food/snacks/meat/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W,/obj/item/material/knife)) - new /obj/item/reagent_containers/food/snacks/rawcutlet(src) - new /obj/item/reagent_containers/food/snacks/rawcutlet(src) - new /obj/item/reagent_containers/food/snacks/rawcutlet(src) - to_chat(user, "You cut the meat into thin strips.") - qdel(src) - else - ..() - -/obj/item/reagent_containers/food/snacks/meat/syntiflesh - name = "synthetic meat" - desc = "A synthetic slab of flesh." - -// Seperate definitions because some food likes to know if it's human. -// TODO: rewrite kitchen code to check a var on the meat item so we can remove -// all these sybtypes. -/obj/item/reagent_containers/food/snacks/meat/human - name = "suspicious meat" - desc = "Tastes vaguely like pork." - -/obj/item/reagent_containers/food/snacks/meat/monkey - //same as plain meat - -/obj/item/reagent_containers/food/snacks/meat/corgi - name = "Corgi meat" - desc = "Tastes like... well, you know." - -/obj/item/reagent_containers/food/snacks/meat/chicken - icon = 'icons/obj/food.dmi' - icon_state = "chickenbreast" - cooked_icon = "chickenbreast_cooked" - filling_color = "#BBBBAA" - -/obj/item/reagent_containers/food/snacks/meat/chicken/Initialize(mapload) - ..() - reagents.remove_reagent("triglyceride", INFINITY) - //Chicken is low fat. Less total calories than other meats - -/obj/item/reagent_containers/food/snacks/meat/chicken/penguin - name = "meat" - desc = "Tastes like chicken? Or fish? Fishy chicken? Strange." - icon = 'icons/obj/food.dmi' - icon_state = "penguinmeat" - cooked_icon = "chickenbreast_cooked" - filling_color = "#BBBBAA" - -/obj/item/reagent_containers/food/snacks/meat/chicken/teshari - name = "meat" - desc = "Tastes like a really fast chicken. Who'd have guessed?" - -/obj/item/reagent_containers/food/snacks/meat/vox - name = "Vox meat" - desc = "Tough and sinewy. Don't eat it raw." - icon = 'icons/obj/food.dmi' - icon_state = "voxmeat" - cooked_icon = "voxmeat_cooked" - -/obj/item/reagent_containers/food/snacks/meat/vox/Initialize(mapload) - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("triglyceride", 2) - reagents.add_reagent("phoron", 3) - src.bitesize = 1.5 diff --git a/code/modules/food/food/z_custom_food_vr.dm b/code/modules/food/food/z_custom_food_vr.dm index 3d7bcafb5f99..5c8f048a804e 100644 --- a/code/modules/food/food/z_custom_food_vr.dm +++ b/code/modules/food/food/z_custom_food_vr.dm @@ -1,266 +1,3 @@ -// Customizable Foods ////////////////////////////////////////// -var/global/deepFriedEverything = 0 -var/global/deepFriedNutriment = 0 -var/global/foodNesting = 0 -var/global/recursiveFood = 0 -var/global/ingredientLimit = 20 - -/obj/item/reagent_containers/food/snacks/customizable - icon = 'icons/obj/food_custom.dmi' - trash = /obj/item/trash/plate - bitesize = 2 - - var/ingMax = 100 - var/list/ingredients = list() - var/stackIngredients = 0 - var/fullyCustom = 0 - var/addTop = 0 - var/image/topping - var/image/filling - -/obj/item/reagent_containers/food/snacks/customizable/Initialize(mapload, ingredient) - . = ..() - topping = image(icon,,"[initial(icon_state)]_top") - filling = image(icon,,"[initial(icon_state)]_filling") - src.reagents.add_reagent("nutriment",3) - src.updateName() - -/obj/item/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user) - if(istype(I,/obj/item/reagent_containers/food/snacks)) - if((contents.len >= ingMax) || (contents.len >= ingredientLimit)) - to_chat(user, "That's already looking pretty stuffed.") - return - - var/obj/item/reagent_containers/food/snacks/S = I - if(istype(S,/obj/item/reagent_containers/food/snacks/customizable)) - var/obj/item/reagent_containers/food/snacks/customizable/SC = S - if(fullyCustom && SC.fullyCustom) - to_chat(user, "You slap yourself on the back of the head for thinking that stacking plates is an interesting dish.") - return - if(!recursiveFood && istype(I, /obj/item/reagent_containers/food/snacks/customizable)) - //to_chat(user, "[pick("As uniquely original as that idea is, you can't figure out how to perform it.","That would be a straining topological exercise.","This world just isn't ready for your cooking genius.","It's possible that you may have a problem.","It won't fit.","You don't think that would taste very good.","Quit goofin' around.")]") - to_chat(user, "As uniquely original as that idea is, you can't figure out how to perform it.") - return - /*if(!user.drop_item()) - to_chat(user, "\The [I] is stuck to your hands!") - return*/ - if(!user.attempt_insert_item_for_installation(I, src)) - return - - if(S.reagents) - S.reagents.trans_to(src,S.reagents.total_volume) - - ingredients += S - - if(addTop) - cut_overlay(topping) //thank you Comic - if(!fullyCustom && !stackIngredients && overlays.len) - cut_overlay(filling) //we can't directly modify the overlay, so we have to remove it and then add it again - var/newcolor = S.filling_color != "#FFFFFF" ? S.filling_color : AverageColor(get_flat_icon(S, S.dir, 0), 1, 1) - filling.color = BlendRGB(filling.color, newcolor, 1/ingredients.len) - add_overlay(filling) - else - add_overlay(generateFilling(S)) - if(addTop) - drawTopping() - - updateName() - to_chat(user, "You add the [I.name] to the [src.name].") - else - . = ..() - return - -/obj/item/reagent_containers/food/snacks/customizable/proc/generateFilling(obj/item/reagent_containers/food/snacks/S, params) - var/image/I - if(fullyCustom) - var/icon/C = get_flat_icon(S, S.dir, 0) - I = image(C) - I.pixel_y = 12 * empty_Y_space(C) - else - I = filling - if(istype(S) && S.filling_color != "#FFFFFF") - I.color = S.filling_color - else - I.color = AverageColor(get_flat_icon(S, S.dir, 0), 1, 1) - if(stackIngredients) - I.pixel_y = ingredients.len * 2 - else - cut_overlays() - - if(fullyCustom || stackIngredients) - var/clicked_x = text2num(params2list(params)["icon-x"]) - if (isnull(clicked_x)) - I.pixel_x = 0 - else if (clicked_x < 9) - I.pixel_x = -2 //this looks pretty shitty - else if (clicked_x < 14) - I.pixel_x = -1 //but hey - else if (clicked_x < 19) - I.pixel_x = 0 //it works - else if (clicked_x < 25) - I.pixel_x = 1 - else - I.pixel_x = 2 - return I - -/obj/item/reagent_containers/food/snacks/customizable/proc/updateName() - var/i = 1 - var/new_name - for(var/obj/item/S in ingredients) - if(i == 1) - new_name += "[S.name]" - else if(i == src.ingredients.len) - new_name += " and [S.name]" - else - new_name += ", [S.name]" - i++ - new_name = "[new_name] [initial(name)]" - if(length(new_name) >= 150) - name = "something yummy" - else - name = new_name - return new_name - -/obj/item/reagent_containers/food/snacks/customizable/Destroy() - QDEL_LIST_NULL(ingredients) - return ..() - -/obj/item/reagent_containers/food/snacks/customizable/proc/drawTopping() - var/image/I = topping - I.pixel_y = (ingredients.len+1)*2 - add_overlay(I) - - -// Sandwiches ////////////////////////////////////////////////// - -/obj/item/reagent_containers/food/snacks/customizable/sandwich - name = "sandwich" - desc = "A timeless classic." - icon_state = "c_sandwich" - stackIngredients = 1 - addTop = 0 - -/obj/item/reagent_containers/food/snacks/customizable/sandwich/attackby(obj/item/I,mob/user) - if(istype(I,/obj/item/reagent_containers/food/snacks/slice/bread) && !addTop) - I.reagents.trans_to(src,I.reagents.total_volume) - qdel(I) - addTop = 1 - src.drawTopping() - else - ..() - -/obj/item/reagent_containers/food/snacks/customizable/burger - name = "burger" - desc = "The apex of space culinary achievement." - icon_state = "c_burger" - stackIngredients = 1 - addTop = 1 - -// Misc Subtypes /////////////////////////////////////////////// - -/obj/item/reagent_containers/food/snacks/customizable/fullycustom - name = "on a plate" - desc = "A unique dish." - icon_state = "fullycustom" - fullyCustom = 1 //how the fuck do you forget to add this? - ingMax = 1 - -/obj/item/reagent_containers/food/snacks/customizable/soup - name = "soup" - desc = "A bowl with liquid and... stuff in it." - icon_state = "soup" - trash = /obj/item/trash/bowl - -/obj/item/reagent_containers/food/snacks/customizable/pizza - name = "pan pizza" - desc = "A personalized pan pizza meant for only one person." - icon_state = "personal_pizza" - -/obj/item/reagent_containers/food/snacks/customizable/pasta - name = "spaghetti" - desc = "Noodles. With stuff. Delicious." - icon_state = "pasta_bot" - -// Various Snacks ////////////////////////////////////////////// - -/obj/item/reagent_containers/food/snacks/slice/bread/attackby(obj/item/I,mob/user,params) - if(istype(I,/obj/item/reagent_containers/food/snacks)) - if(!recursiveFood && istype(I, /obj/item/reagent_containers/food/snacks/customizable)) - to_chat(user, "Sorry, no recursive food.") - return - var/obj/F = new/obj/item/reagent_containers/food/snacks/customizable/sandwich(get_turf(src),I) //boy ain't this a mouthful - F.attackby(I, user) - qdel(src) - else - return ..() - -/obj/item/reagent_containers/food/snacks/bun/attackby(obj/item/I, mob/user) - // Bun + meatball = burger - if(istype(I,/obj/item/reagent_containers/food/snacks/meatball)) - new /obj/item/reagent_containers/food/snacks/monkeyburger(src) - to_chat(user, "You make a burger.") - qdel(I) - qdel(src) - - // Bun + cutlet = hamburger - else if(istype(I, /obj/item/reagent_containers/food/snacks/cutlet)) - new /obj/item/reagent_containers/food/snacks/monkeyburger(src) - to_chat(user, "You make a burger.") - qdel(I) - qdel(src) - - // Bun + sausage = hotdog - else if(istype(I, /obj/item/reagent_containers/food/snacks/sausage)) - new /obj/item/reagent_containers/food/snacks/hotdog(src) - to_chat(user, "You make a hotdog.") - qdel(I) - qdel(src) - - if(istype(I,/obj/item/reagent_containers/food/snacks)) - if(!recursiveFood && istype(I, /obj/item/reagent_containers/food/snacks/customizable)) - to_chat(user, "Sorry, no recursive food.") - return - var/obj/F = new/obj/item/reagent_containers/food/snacks/customizable/burger(get_turf(src),I) - F.attackby(I, user) - qdel(src) - else - return ..() - -/obj/item/reagent_containers/food/snacks/sliceable/flatdough/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/reagent_containers/food/snacks)) - if(!recursiveFood && istype(I, /obj/item/reagent_containers/food/snacks/customizable)) - to_chat(user, "Sorry, no recursive food.") - return - var/obj/F = new/obj/item/reagent_containers/food/snacks/customizable/pizza(get_turf(src),I) - F.attackby(I, user) - qdel(src) - else - return ..() - -/obj/item/reagent_containers/food/snacks/spagetti/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/reagent_containers/food/snacks)) - if(!recursiveFood && istype(I, /obj/item/reagent_containers/food/snacks/customizable)) - to_chat(user, "Sorry, no recursive food.") - return - var/obj/F = new/obj/item/reagent_containers/food/snacks/customizable/pasta(get_turf(src),I) - F.attackby(I, user) - qdel(src) - else - return ..() - -// Custom Meals //////////////////////////////////////////////// -/* -/obj/item/trash/plate/attackby(obj/item/I, mob/user) - if(istype(I,/obj/item/reagent_containers/food/snacks)) - if(istype(I,/obj/item/reagent_containers/food/snacks/customizable/fullycustom)) //no platestacking even with recursive food, for now - to_chat(user, "That's already got a plate!") - return - var/obj/F = new/obj/item/reagent_containers/food/snacks/customizable/fullycustom(get_turf(src),I) - F.attackby(I, user) - qdel(src) - else - return ..() -*/ /obj/item/trash/bowl name = "bowl" @@ -268,13 +5,3 @@ var/global/ingredientLimit = 20 icon = 'icons/obj/food_custom.dmi' icon_state = "soup" -/obj/item/trash/bowl/attackby(obj/item/I, mob/user) - if(istype(I,/obj/item/reagent_containers/food/snacks)) - if(!recursiveFood && istype(I, /obj/item/reagent_containers/food/snacks/customizable)) - to_chat(user, "Sorry, no recursive food.") - return - var/obj/F = new/obj/item/reagent_containers/food/snacks/customizable/soup(get_turf(src),I) - F.attackby(I, user) - qdel(src) - else - return ..() diff --git a/code/modules/food/food_2/_cooker.dm b/code/modules/food/food_2/_cooker.dm new file mode 100644 index 000000000000..ad879461114b --- /dev/null +++ b/code/modules/food/food_2/_cooker.dm @@ -0,0 +1,284 @@ +// Base type for cooking machines +// Contributes to a food's cooking timer. That's basically it. +/obj/machinery/cooking + name = "stove" + desc = "A stove, for cooking food." + icon = 'icons/obj/food_ingredients/cooking_machines.dmi' + icon_state = "stove" + + density = 1 + anchored = 1 + default_unanchor = 5 SECONDS + + use_power = 0 + 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 + + speed_process = PROCESS_ON_SSPROCESSING + + + var/cooker_type = METHOD_STOVE + var/cooking_power = 0 + + var/max_contents = 4 // Maximum number of things this appliance can simultaneously cook + var/list/food_containers //what food (/obj/item/reagent_containers/glass/food_holder = 1, /reagent_containers/snacks/ingredient = 2) we are cooking, and their positions inside the thing + var/list/visible_position_xy = list(list(-7, 6), list(7, 6),list(-7, -3), list(7, -3))//for mapping a pixel_x, pixel_y to abstract ''position + var/food_scale_amount = 0.5 //this is a variable, so you can do funny with it! + + +/obj/machinery/cooking/examine(mob/user, dist) + . = ..() + . += SPAN_NOTICE("It currently contains [LAZYLEN(food_containers)] items:") + for(var/obj/item/examine_item in food_containers) + if(!istype(examine_item, /obj/item/reagent_containers/food/snacks/ingredient)) + . += "[icon2html(thing = examine_item, target = user)][examine_item]." + continue + + var/obj/item/reagent_containers/food/snacks/ingredient/examine_ingredient = examine_item + var/cooked_span = "userdanger" + switch(examine_ingredient.cookstage) + if(RAW) + cooked_span = "rose" + if(COOKED) + cooked_span = "boldnicegreen" + if(OVERCOOKED) + cooked_span = "yellow" + if(BURNT) + cooked_span = "tajaran_signlang" + . += "[icon2html(thing = examine_ingredient, target = user)][examine_ingredient.name], which looks [examine_ingredient.cookstage2text()] and has been cooked for about [examine_ingredient.accumulated_time_cooked / 10] seconds." + + switch(cooking_power) + if(0) + . += "[src] is off." + if(HEAT_LOW) + . += "[src] is set to low heat." + if(HEAT_MID) + . += "[src] is set to medium heat." + if(HEAT_HIGH) + . += "[src] is set to high heat." + + +/obj/machinery/cooking/Initialize(mapload, newdir) + . = ..() + food_containers = list() + component_parts = list() + component_parts += /obj/item/circuitboard/machine/cooker + component_parts += /obj/item/stock_parts/capacitor + component_parts += /obj/item/stock_parts/scanning_module + component_parts += /obj/item/stock_parts/matter_bin + +/obj/machinery/cooking/RefreshParts() + ..() + var/scan_rating = 0 + var/cap_rating = 0 + + for(var/obj/item/stock_parts/P in src.component_parts) + if(istype(P, /obj/item/stock_parts/scanning_module)) + scan_rating += P.rating + else if(istype(P, /obj/item/stock_parts/capacitor)) + cap_rating += P.rating + + active_power_usage = initial(active_power_usage) - ((scan_rating + cap_rating) * 5) + +/obj/machinery/cooking/process(delta_time) + if(cooking_power > 0) + for(var/I in food_containers) + if(istype(I, /obj/item/reagent_containers/glass/food_holder)) + var/obj/item/reagent_containers/glass/food_holder/FH = I + FH.tick_heat(1 SECONDS, cooking_power, cooker_type) + else if(istype(I, /obj/item/reagent_containers/food/snacks/ingredient)) + var/obj/item/reagent_containers/food/snacks/ingredient/cooking_thingy = I + cooking_thingy.process_cooked(1 SECONDS, cooking_power, cooker_type) + +/obj/item/circuitboard/machine/cooker + name = "kitchen appliance circuitry" + desc = "The circuitboard for many kitchen appliances. Not of much use." + origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) + req_components = list( + /obj/item/stock_parts/capacitor = 1, + /obj/item/stock_parts/scanning_module = 1, + /obj/item/stock_parts/matter_bin = 1) + + +/obj/machinery/cooking/attackby(obj/item/I, mob/user) + if(machine_stat & (BROKEN)) + to_chat(user, "\The [src] is not working.") + return + + if(default_deconstruction_screwdriver(user, I)) + return + if(default_part_replacement(user, I)) + return + if(default_deconstruction_crowbar(user, I)) + return + + if(food_containers.len >= max_contents) + return //no inserties if full + if(istype(I, /obj/item/reagent_containers/glass/food_holder) || istype(I, /obj/item/reagent_containers/food/snacks/ingredient)) + //From here we can start cooking food + insert_item(I, user) + +/obj/machinery/cooking/update_icon() + var/fire_color = null + cut_overlays() + switch(cooking_power) + if(HEAT_LOW) + fire_color = COLOR_RED + if(HEAT_MID) + fire_color = COLOR_YELLOW + if(HEAT_HIGH) + fire_color = COLOR_CYAN + for(var/I in food_containers) + var/mutable_appearance/cooktop_overlay + var/mutable_appearance/fire_overlay + if(istype(I, /obj/item/reagent_containers/glass/food_holder)) + var/obj/item/reagent_containers/glass/food_holder/FH = I + + cooktop_overlay = mutable_appearance(icon, "[FH.cooker_overlay]") + var/mutable_appearance/filling_overlay = mutable_appearance(icon, "filling_overlay") + + var/px = visible_position_xy[food_containers[I]][1] //get 'location' from food containers, get pixel_x (first item of list) from visible_position_xy + var/py = visible_position_xy[food_containers[I]][2] + cooktop_overlay.pixel_x = px + cooktop_overlay.pixel_y = py + filling_overlay.pixel_x = px + filling_overlay.pixel_y = py + filling_overlay.color = FH.tally_color() + + switch(FH.cooker_overlay) + if("skillet") + filling_overlay.pixel_y -= 3 + if(px > 0) //if px is positive + cooktop_overlay.icon_state = "[FH.cooker_overlay]_flip" + if("pan") + filling_overlay.pixel_y -= 2 + if(px > 0) //if px is positive + cooktop_overlay.icon_state = "[FH.cooker_overlay]_flip" + + if(fire_color) + fire_overlay = mutable_appearance(icon, "stove_flame") + fire_overlay.pixel_x = px + fire_overlay.pixel_y = py + fire_overlay.color = fire_color + add_overlay(fire_overlay) + + add_overlay(cooktop_overlay) + add_overlay(filling_overlay) + + + else if(istype(I, /obj/item/reagent_containers/food/snacks/ingredient)) + var/obj/item/reagent_containers/food/snacks/ingredient/cooking_thingy = I + + cooktop_overlay = mutable_appearance(cooking_thingy.icon, cooking_thingy.icon_state) + cooktop_overlay.appearance_flags |= PIXEL_SCALE //so we dont look ugly! + cooktop_overlay.underlays |= cooking_thingy.underlays + cooktop_overlay.overlays |= cooking_thingy.overlays + cooktop_overlay.transform *= food_scale_amount + + var/px = visible_position_xy[food_containers[I]][1] //get 'location' from food containers, get pixel_x (first item of list) from visible_position_xy + var/py = visible_position_xy[food_containers[I]][2] + cooktop_overlay.pixel_x = px + cooktop_overlay.pixel_y = py + + if(fire_color) + fire_overlay = mutable_appearance(icon, "[icon_state]_flame") + fire_overlay.pixel_x = px + fire_overlay.pixel_y = py + fire_overlay.color = fire_color + add_overlay(fire_overlay) + add_overlay(cooktop_overlay) + + +/obj/machinery/cooking/proc/insert_item(obj/item/I, mob/user) + if(!user.attempt_insert_item_for_installation(I, src)) + return + var/list/used_list = list() + for(var/i in 1 to max_contents) + used_list += i + for(var/t in food_containers) + used_list -= food_containers[t] + food_containers[I] = pick(used_list) //random position :D + user.visible_message("[user] puts [I] into [src].", "You put [I] into [src].") + update_icon() + +/obj/machinery/cooking/attack_hand(mob/user, list/params) + if(!isliving(user)) + return ..() + if(eject_item(user)) + return + else + return ..() //if there's nothing to remove, we act as normal + +/obj/machinery/cooking/proc/eject_item(mob/user) + if(!LAZYLEN(contents)) + return + var/list/removables = list() + var/counter = 0 + for(var/obj/item/reagent_containers/food/snacks/ingredient/I in food_containers) + if(counter) + removables["[I.name] ([counter]) \[[I.cookstage2text()]\]"] = I + else + removables["[I.name] \[[I.cookstage2text()]\]"] = I + counter++ + counter = 0 + for(var/obj/item/reagent_containers/glass/food_holder/FH in food_containers) + if(counter) + removables["[FH.name] ([counter])"] = FH + else + removables[FH.name] = FH + counter++ + var/remove_item = removables[1] + if(LAZYLEN(food_containers ) > 1) + remove_item = input(user, "What to remove?", "Remove from cooker", null) as null|anything in removables + if(remove_item) + food_containers -= removables[remove_item] + user.put_in_hands_or_drop(removables[remove_item]) + update_icon() + return TRUE + return FALSE + +/obj/machinery/cooking/proc/has_space() + if (food_containers.len >= max_contents) + return FALSE + return TRUE + + +/obj/machinery/cooking/AltClick(mob/user) + + var/temp_setting = input(user, "Select a temperature setting.", "Temperature Control", null) as null | anything in list("off", "low", "medium", "high") + + switch(temp_setting) + if("off") + machine_stat |= POWEROFF + use_power = FALSE + user.visible_message("[user] turns [src] off.", "You turn off [src].") + cooking_power = 0 + if("low") + if(machine_stat & POWEROFF) + machine_stat &= ~POWEROFF + use_power = TRUE + user.visible_message("[user] turns [src] on.", "You turn on [src].") + user.visible_message("[user] turns [src] to low power.", "You turn [src] to low power.") + cooking_power = HEAT_LOW + if("medium") + if(machine_stat & POWEROFF) + machine_stat &= ~POWEROFF + use_power = TRUE + user.visible_message("[user] turns [src] on.", "You turn on [src].") + user.visible_message("[user] turns [src] to low power.", "You turn [src] to medium power.") + cooking_power = HEAT_MID + if("high") + if(machine_stat & POWEROFF) + machine_stat &= ~POWEROFF + use_power = TRUE + user.visible_message("[user] turns [src] on.", "You turn on [src].") + user.visible_message("[user] turns [src] to low power.", "You turn [src] to high power.") + cooking_power = HEAT_HIGH + + + playsound(src, 'sound/machines/click.ogg', 40, 1) + update_icon() + + + + diff --git a/code/modules/food/food_2/_foodholder.dm b/code/modules/food/food_2/_foodholder.dm new file mode 100644 index 000000000000..ae3985077e84 --- /dev/null +++ b/code/modules/food/food_2/_foodholder.dm @@ -0,0 +1,253 @@ +/obj/item/reagent_containers/glass/food_holder + name = "cooking pot" + desc = "A cooking pot, for making various types of dishes." + icon = 'icons/obj/food_ingredients/cooking_container.dmi' + icon_state = "pot" + atom_flags = OPENCONTAINER + + var/food_name_override + + var/last_cooking_method + + var/cooker_overlay = "pot" + +/obj/item/reagent_containers/glass/food_holder/Initialize(mapload) + . = ..() + reagents.reagents_holder_flags |= TRANSPARENT + +/obj/item/reagent_containers/glass/food_holder/examine(mob/user, dist) + . = ..() + . += SPAN_NOTICE("Alt-click to remove an ingredient from this.") + . += SPAN_NOTICE("Control-click in grab intent to retrieve a serving.") + . += SPAN_NOTICE("It contains:") + for(var/obj/item/examine_item in contents) + if(!istype(examine_item, /obj/item/reagent_containers/food/snacks/ingredient)) + . += "[icon2html(thing = examine_item, target = user)][examine_item]." + continue + + var/obj/item/reagent_containers/food/snacks/ingredient/examine_ingredient = examine_item + var/cooked_span = "userdanger" + switch(examine_ingredient.cookstage) + if(RAW) + cooked_span = "rose" + if(COOKED) + cooked_span = "boldnicegreen" + if(OVERCOOKED) + cooked_span = "yellow" + if(BURNT) + cooked_span = "tajaran_signlang" + . += "[icon2html(thing = examine_ingredient, target = user)][examine_ingredient.food_weight]g of [examine_ingredient.name], which looks [examine_ingredient.cookstage2text()] and has been cooked for about [examine_ingredient.accumulated_time_cooked / 10] seconds." + +/obj/item/reagent_containers/glass/food_holder/update_icon() + cut_overlays() + var/mutable_appearance/filling_overlay = mutable_appearance(icon, "[icon_state]_filling_overlay") + if(LAZYLEN(contents) || reagents.total_volume) + filling_overlay.color = tally_color() + add_overlay(filling_overlay) + + + +/obj/item/reagent_containers/glass/proc/tally_color() + var/newcolor + var/overlay_color + + for(var/obj/item/reagent_containers/food/snacks/ingredient/color_tally in contents) + if(color_tally.filling_color == "#FFFFFF") + newcolor = AverageColor(get_flat_icon(color_tally, color_tally.dir, 0)) + else + newcolor = color_tally.filling_color + + if(!overlay_color) + overlay_color = newcolor + else + overlay_color = BlendRGB(overlay_color, newcolor, 1/contents.len) + + if(!overlay_color) + overlay_color = reagents.get_color() + overlay_color = BlendRGB(overlay_color, reagents.get_color(), 0.6) + return overlay_color + +/obj/item/reagent_containers/glass/food_holder/proc/tick_heat(var/time_cooked, var/heat_level, var/cook_method) + last_cooking_method = cook_method + for(var/obj/item/reagent_containers/food/snacks/ingredient/cooking_ingredient in contents) + cooking_ingredient.process_cooked(time_cooked, heat_level, cook_method) //handles all the cooking stuff actually + + +/obj/item/reagent_containers/glass/food_holder/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/reagent_containers/food/snacks/ingredient)) + for(var/obj/item/reagent_containers/food/snacks/ingredient/compare_ingredient in contents) + if(compare_ingredient.type == I.type) + try_merge(I, compare_ingredient, user) + update_icon() + if(!user.attempt_insert_item_for_installation(I, src)) + user.visible_message("[user] puts [I] into [src].", "You put [I] into [src].") + update_icon() + return + return + else if(istype(I, /obj/item/reagent_containers/food/snacks)) + if(!user.attempt_insert_item_for_installation(I, src)) + user.visible_message("[user] puts [I] into [src].", "You put [I] into [src].") + update_icon() + return + return + else if(istype(I, /obj/item/food_serving)) + generate_serving(I, user) + update_icon() + return ..() + +/obj/item/reagent_containers/glass/food_holder/CtrlClick(mob/user) + if(user.a_intent == INTENT_GRAB) + generate_serving(null, user) + return + else + food_name_override = input(user, "What would you like to name the finished dishes?", "Name dishes from container", null) as null|text + +/obj/item/reagent_containers/glass/food_holder/AltClick(mob/living/user) + var/list/removables = list() + var/counter = 0 + for(var/obj/item/removeding in contents) + if(!istype(removeding, /obj/item/reagent_containers/food/snacks/ingredient)) + user.put_in_hands_or_drop(removeding) + continue + var/obj/item/reagent_containers/food/snacks/ingredient/I = removeding + if(counter) + removables["[I.name] ([counter]) \[[I.cookstage2text()]\]"] = I + else + removables["[I.name] \[[I.cookstage2text()]\]"] = I + counter++ + if(!LAZYLEN(removables)) + return + var/remove_item = removables[1] + if(LAZYLEN(removables) > 1) + remove_item = input(user, "What to remove?", "Remove from container", null) as null|anything in removables + if(remove_item) + user.put_in_hands_or_drop(removables[remove_item]) + update_icon() + return TRUE + return FALSE + +/obj/item/reagent_containers/glass/food_holder/proc/try_merge(obj/item/reagent_containers/food/snacks/ingredient/I, obj/item/reagent_containers/food/snacks/ingredient/compare_ingredient, mob/user) + if(I.type != compare_ingredient.type) + return + if(I.check_merge(compare_ingredient, user)) + if(user.attempt_insert_item_for_installation(I, src)) + compare_ingredient.merge_ingredient(I) + + +/obj/item/reagent_containers/glass/food_holder/proc/generate_serving(var/obj/item/food_serving/FS, mob/user) + var/obj/item/reagent_containers/food/snacks/food_serving/generated_serving = new /obj/item/reagent_containers/food/snacks/food_serving(null) + var/list/tally_flavours = list() + var/list/fancy_overlay_to_add = list() + var/food_color + var/serving_thing_name = "handful" + var/foodname = generate_food_name() + + var/fs_icon = FS ? FS.icon : 'icons/obj/food_ingredients/custom_food.dmi' + var/fs_iconstate = FS ? FS.icon_state : "handful" + + var/ingredient_count = 0 + + for(var/x in contents) + if(istype(x, /obj/item/reagent_containers/food/snacks/ingredient)) + ingredient_count += 1 + + + for(var/obj/item/reagent_containers/food/snacks/ingredient/tally_ingredient in contents) + var/ing_ratio = (1/ingredient_count) + tally_flavours[tally_ingredient.cookstage_information[tally_ingredient.cookstage][COOKINFO_TASTE]] = WEIGHT_TASTE_DIVISION(tally_ingredient.food_weight) //the more it is the stronger it'll taste + var/total_volume_transferred = WEIGHT_TASTE_DIVISION(ing_ratio * tally_ingredient.food_weight) + tally_ingredient.reagents.trans_to_holder(generated_serving.reagents, total_volume_transferred, tally_ingredient.cookstage_information[tally_ingredient.cookstage][COOKINFO_NUTRIMULT]) + + + var/ingredient_fillcolor = tally_ingredient.filling_color != "#FFFFFF" ? tally_ingredient.filling_color : AverageColor(get_flat_icon(tally_ingredient, tally_ingredient.dir, 0), 1, 1) + if(tally_ingredient.finished_overlay) + var/mutable_appearance/filling_overlay = mutable_appearance(fs_icon, "[fs_iconstate]_filling_[tally_ingredient.finished_overlay]") + filling_overlay.color = ingredient_fillcolor + fancy_overlay_to_add += filling_overlay + if(food_color) + food_color = BlendRGB(food_color, ingredient_fillcolor, 0.5) + else + food_color = ingredient_fillcolor + + var/mutable_appearance/mixed_stuff_overlay = mutable_appearance(fs_icon, "[fs_iconstate]_filling") + mixed_stuff_overlay.color = food_color + fancy_overlay_to_add += mixed_stuff_overlay + + tally_ingredient.consume_weight(ing_ratio * tally_ingredient.food_weight) + + for(var/obj/item/reagent_containers/food/snacks/tally_snack in contents) + if(istype(tally_snack, /obj/item/reagent_containers/food/snacks/ingredient)) + continue + tally_snack.reagents.trans_to_holder(generated_serving.reagents, tally_snack.reagents.total_volume, tally_snack.nutriment_desc) + + var/ingredient_fillcolor = tally_snack.filling_color != "#FFFFFF" ? tally_snack.filling_color : AverageColor(get_flat_icon(tally_snack, tally_snack.dir, 0), 1, 1) + if(food_color) + food_color = BlendRGB(food_color, ingredient_fillcolor, 0.5) + else + food_color = ingredient_fillcolor + + var/mutable_appearance/mixed_stuff_overlay = mutable_appearance(fs_icon, "[fs_iconstate]_filling") + mixed_stuff_overlay.color = food_color + fancy_overlay_to_add += mixed_stuff_overlay + qdel(tally_snack) + + if(FS) + serving_thing_name = FS.serving_type + generated_serving.trash = FS + FS.forceMove(generated_serving) + + generated_serving.name = "[serving_thing_name] of " + generated_serving.name += foodname + generated_serving.desc = ("That's a" + generated_serving.name + ". It looks tasty. Potentially.") + generated_serving.icon = fs_icon + generated_serving.icon_state = fs_iconstate + generated_serving.add_overlay(fancy_overlay_to_add) + user.put_in_hands_or_drop(generated_serving) + + +/obj/item/reagent_containers/glass/food_holder/proc/generate_food_name() + if(food_name_override) + return food_name_override + var/list/ingredients_names = list() + for(var/obj/item/I in contents) + ingredients_names |= I.name + ingredients_names = english_list(ingredients_names) + if(reagents.total_volume >= (reagents.maximum_volume / 2)) //greater than 50%) + return "[ingredients_names] soup" + if(reagents.total_volume >= (reagents.maximum_volume / 4)) //greater than 25%) + return "[ingredients_names] stew" + return "[ingredients_names] melange" + + + +/obj/item/reagent_containers/glass/food_holder/proc/check_recipe_completion(var/cook_method = METHOD_MICROWAVE) + var/datum/cooking_recipe/our_recipe = select_recipe(GLOB.cooking_recipes, src, available_method = cook_method) + if (!our_recipe) + return + our_recipe.make_food(src) + + +//visalalize recipe + +/obj/item/reagent_containers/glass/food_holder/verb/visualize_recipe() + set name = "Visualize Recipe" + set desc = "Predicts the output for a given container of food cooked in a specific method." + set category = "Object" + set src in range(0) + + + var/cook_method = input(usr, "What cooking method?", "Select cooking method", null) as null|anything in list(METHOD_OVEN,METHOD_GRILL,METHOD_STOVE,METHOD_DEEPFRY,METHOD_MICROWAVE,METHOD_BLOWTORCH,METHOD_ENERGETIC_ANOMALY) + if(!cook_method) + return + var/datum/cooking_recipe/our_recipe = select_recipe(GLOB.cooking_recipes, src, available_method = cook_method) + if (!our_recipe) + to_chat(usr, "The contents of [name] wouldn't make anything special when cooked that way.") + return + + var/list/reagent_result_pretty = list() + for(var/id in our_recipe.result_reagents) + reagent_result_pretty += "[our_recipe.result_reagents[id]]u of [initial((SSchemistry.fetch_reagent(id)).name)]" + to_chat(usr, "You can see the contents of [name] would make [isnull(initial(initial(our_recipe.result).name)) ? "no item" : initial(initial(our_recipe.result).name)][reagent_result_pretty.len ? " as well as [english_list(reagent_result_pretty)]." : "."]") + + + diff --git a/code/modules/food/food_2/_ingredient.dm b/code/modules/food/food_2/_ingredient.dm new file mode 100644 index 000000000000..cb6edf52644a --- /dev/null +++ b/code/modules/food/food_2/_ingredient.dm @@ -0,0 +1,286 @@ +/obj/item/reagent_containers/food/snacks/ingredient + name = "generic ingredient" + desc = "This is a generic ingredient. It's so perfectly generic you're having a hard time even looking at it." + icon_state = "meat" + nutriment_amt = 5 + //cookstage_information is a list of lists + //it contains a bunch of information about: how long it takes, what nutrition multiplier the ingredient has, what taste the ingredient has at various cook stages (raw, cooked, overcooked, burnt) + //an example one would be list(list(0, 0.5, "raw meat"), list(10 SECONDS, 1.2, "cooked meat"), list(16 SECONDS, 0.9, "rubbery and chewy meat"), list(20 SECONDS, 0.1, "charcoal")) + //these are defines, so to get the taste of a raw slab of meat you would do cookstage_information[RAW][COOKINFO_TASTE] + var/list/cookstage_information = list(list(0, 0.5, "raw genericness"), list(10 SECONDS, 1.2, "cooked genericness"), list(16 SECONDS, 0.9, "rubbery genericness"), list(20 SECONDS, 0.1, "gneric sharcoal")) + //how much cooking time (effective) have we accumulated + var/accumulated_time_cooked + //what stage we're in + var/cookstage = RAW + + //How much effective cook time is added per actual unit of cook time on the setting + //E.g 1 SECOND on low heat > 1 * 0.5 seconds effective cook time + // 1 second on high heat > 1 * 2 seconds effective cook time + var/cooktime_mult_low = 0.5 + var/cooktime_mult_mid = 1 + var/cooktime_mult_high = 2 + + + //are we allowed to stack and split? + var/can_stack = TRUE + + //how much food is here, in grams + var/food_weight = 100 + var/finished_overlay //what overlay we use for the finished item, if null we dont do anything special + + var/additional_overlay_weight_threshold = WEIGHT_TASTE_DIVISOR //for every additional_overlay_weight_threshold of weight we gain a overlay + var/max_weight = 1000 //max amount of weight we can put in a single item + + + var/name_on_cook //the name we change into once we're cooked + //should be everything for now + +/obj/item/reagent_containers/food/snacks/ingredient/Initialize(mapload) + . = ..() + var/datum/reagent/nutriment/our_nutrient = reagents.get_reagent("nutriment") + our_nutrient.data = list() + our_nutrient.data[cookstage_information[RAW][COOKINFO_TASTE]] = WEIGHT_TASTE_DIVISION(food_weight) + +/obj/item/reagent_containers/food/snacks/ingredient/examine(mob/user, dist) + . = ..() + if(can_stack) + . += SPAN_NOTICE("Alt-click to split off some of [name].") + . += cooking_information(TRUE) + +/obj/item/reagent_containers/food/snacks/ingredient/update_icon() + cut_overlays() + var/overlay_amount = FLOOR(food_weight/additional_overlay_weight_threshold, 1) + to_chat(world, "recalculated food, overlay amount = [overlay_amount]")//REMOVE THIS LINE + if((overlay_amount > 1) && can_stack) + for(var/i = 0, i<=overlay_amount, i++) + var/mutable_appearance/stuff_overlay = mutable_appearance(icon, icon_state) + stuff_overlay.color = color + stuff_overlay.pixel_x = pick(rand(-12,-6), rand(6,12)) + stuff_overlay.pixel_y = pick(rand(-12,-6), rand(6,12)) + to_chat(world, "adding overlay [i]")//REMOVE THIS LINE + add_overlay(stuff_overlay) + +/obj/item/reagent_containers/food/snacks/ingredient/attackby(obj/item/I, mob/user) + if(I.type != type) + return ..() + if(check_merge(I, user)) + to_chat(user, SPAN_NOTICE("You combine [I] into [src].")) + merge_ingredient(I) + + +/obj/item/reagent_containers/food/snacks/ingredient/proc/check_merge(obj/item/reagent_containers/food/snacks/ingredient/add_ingredient, mob/user) + if(!can_stack) + return FALSE + if((((accumulated_time_cooked - INGREDIENT_COOKTIME_MAX_SEPERATION) < add_ingredient.accumulated_time_cooked) && (add_ingredient.accumulated_time_cooked < (accumulated_time_cooked + INGREDIENT_COOKTIME_MAX_SEPERATION))) && (add_ingredient.cookstage = cookstage)) + if((add_ingredient.food_weight + food_weight) < max_weight) + return TRUE + to_chat(user, SPAN_NOTICE("There's too much to combine!")) + return FALSE + else + to_chat(user, SPAN_NOTICE("You can't mix raw and cooked ingredients.")) + return FALSE + +/obj/item/reagent_containers/food/snacks/ingredient/afterattack(atom/target, mob/user, clickchain_flags, list/params) + if(istype(target, /obj/singularity/energy_ball)) //snowflaked for sing/tesla + var/obj/singularity/energy_ball/tesla_ball = target + user.visible_message("\The [user] holds up [src] to \the [tesla_ball]!",\ + "You hold up [src] to \the [tesla_ball]!",\ + "Everything suddenly goes quiet.") + while(do_after(user, 1 SECOND)) + var/cooktime = 0 SECOND + switch(tesla_ball.orbiting_balls.len) + if(-INFINITY to 0) + cooktime += 1 SECOND + if(1 to 2) + cooktime += 2 SECOND + if(3 to 5) + cooktime += 4 SECOND + if(5 to 7) + cooktime += 8 SECOND + if(7 to INFINITY) + cooktime += 10 SECOND + process_cooked(cooktime, HEAT_HIGH, METHOD_ENERGETIC_ANOMALY) + + else if(istype(target, /obj/singularity)) + var/obj/singularity/mr_singulo = target + user.visible_message("\The [user] holds up [src] to \the [mr_singulo]...") + while(do_after(user, 1 SECOND)) + process_cooked(1, HEAT_LOW, METHOD_ENERGETIC_ANOMALY) //it's hawking radiation what do you expect + return + + + +/obj/item/reagent_containers/food/snacks/ingredient/AltClick(mob/user) + if(!isliving(user)) + return ..() + if(food_weight < 1) + to_chat(user, SPAN_WARNING("There's not enough of [src] to split off!")) + return + var/amount = input("How much to split?", "Split ingredient") as null|num + amount = round(amount) //0.6 >> 1 + if(amount && amount < food_weight) + var/final_ratio = amount/food_weight + food_weight -= amount + update_icon() + var/obj/item/reagent_containers/food/snacks/ingredient/split_ingredient = new type(src) + split_ingredient.cookstage = cookstage + split_ingredient.accumulated_time_cooked = accumulated_time_cooked + split_ingredient.reagents.clear_reagents() //so we aren't making it taste raw on init + split_ingredient.reagents.trans_to_holder(reagents, reagents.total_volume * final_ratio, 1, TRUE) + split_ingredient.food_weight = amount + split_ingredient.update_icon() + user.put_in_hands_or_drop(split_ingredient) + to_chat(user, SPAN_NOTICE("You split off [src].")) + else + to_chat(user, SPAN_WARNING("There's not enough of [src]!")) + +/obj/item/reagent_containers/food/snacks/ingredient/initialize_slice(obj/item/reagent_containers/food/snacks/slice, reagents_per_slice) + reagents.trans_to_obj(slice, reagents_per_slice) + if(name != initial(name)) + slice.name = "slice of [name]" + if(desc != initial(desc)) + slice.desc = "[desc]" + var/obj/item/reagent_containers/food/snacks/ingredient/slice_ingredient = slice + slice_ingredient.cookstage = cookstage + slice_ingredient.accumulated_time_cooked = min(slice_ingredient.cookstage_information[cookstage][COOKINFO_TIME], accumulated_time_cooked) + + +/obj/item/reagent_containers/food/snacks/ingredient/welder_act(obj/item/I, datum/event_args/actor/clickchain/e_args, flags, hint) + while(use_welder(I, e_args, flags, 1 SECONDS, 0.25, TOOL_USAGE_INADVISABLE | TOOL_USAGE_COOKING)) + e_args.visible_feedback( + target = src, + range = MESSAGE_RANGE_CONSTRUCTION, + visible = SPAN_NOTICE("[e_args.performer] starts heating [src] with [I]."), + audible = SPAN_WARNING("You hear the sound of a welding torch being used on something organic."), + otherwise_self = SPAN_NOTICE("You cook [src] with [I]."), + ) + process_cooked(1 SECOND, pick(HEAT_HIGH, HEAT_MID), METHOD_BLOWTORCH) + + +/obj/item/reagent_containers/food/snacks/ingredient/proc/process_cooked(var/time_cooked, var/heat_level, var/cook_method) + switch(heat_level) + if(HEAT_LOW) + accumulated_time_cooked += cooktime_mult_low * time_cooked + if(HEAT_MID) + accumulated_time_cooked += cooktime_mult_mid * time_cooked + if(HEAT_HIGH) + accumulated_time_cooked += cooktime_mult_high * time_cooked + if(cookstage >= BURNT) + return //we dont need to do anything if we're burnt + var/next_cookstage = cookstage + 1 + + if(accumulated_time_cooked >= cookstage_information[next_cookstage][COOKINFO_TIME]) + cookstage = next_cookstage + var/datum/reagent/nutriment/our_nutrient = reagents.get_reagent("nutriment") + if(our_nutrient) + our_nutrient.data = list() + our_nutrient.data[cookstage_information[cookstage][COOKINFO_TASTE]] = WEIGHT_TASTE_DIVISION(food_weight) + if(istype(loc, /obj/item/reagent_containers/glass/food_holder)) + var/obj/item/reagent_containers/glass/food_holder/FH = loc + FH.check_recipe_completion(cook_method) + if((cookstage == COOKED) && name_on_cook) + name = name_on_cook + on_cooked(cookstage, cook_method) + +/obj/item/reagent_containers/food/snacks/ingredient/proc/on_cooked(var/reached_stage, var/cook_method) + return //we dont do anything special + +/obj/item/reagent_containers/food/snacks/ingredient/proc/cooking_information(var/detailed = FALSE) + var/info = "" + var/cooked_span = "userdanger" + var/cooked_info = "unfathomable" + if(detailed) + info += "It's usable as an ingredient in cooking. \n" + info += "It takes [cookstage_information[COOKED][COOKINFO_TIME] / 10] second[cookstage_information[COOKED][COOKINFO_TIME] > 10 ? "s" : ""] to cook fully. \n" + info += "If cooked for longer than [cookstage_information[OVERCOOKED][COOKINFO_TIME] / 10] second[cookstage_information[OVERCOOKED][COOKINFO_TIME] > 10 ? "s" : ""], it will become overcooked.\n" + info += "If cooked for longer than [cookstage_information[BURNT][COOKINFO_TIME] / 10] second[cookstage_information[BURNT][COOKINFO_TIME] > 10 ? "s" : ""], it will burn.\n" + switch(cookstage) + if(RAW) + cooked_span = "rose" + cooked_info = "raw." + if(COOKED) + cooked_span = "boldnicegreen" + cooked_info = "perfectly cooked!" + if(OVERCOOKED) + cooked_span = "yellow" + cooked_info = "a little overcooked." + if(BURNT) + cooked_span = "tajaran_signlang" + cooked_info = "thorougly burnt." + info += "It looks [cooked_info] \n" + info += "It's been cooked for about [accumulated_time_cooked / 10] seconds. \n" //do we want this on final? trait that lets you see exact cooking time and people without it see general? cooking goggles that let you analyze it?? + if(can_stack) + info += "There's about [food_weight]g of food here." + return info + +/obj/item/reagent_containers/food/snacks/ingredient/proc/cookstage2text() + switch(cookstage) + if(RAW) + return "raw" + if(COOKED) + return "cooked" + if(OVERCOOKED) + return "overcooked" + if(BURNT) + return "burnt" + +/obj/item/reagent_containers/food/snacks/ingredient/proc/merge_ingredient(obj/item/reagent_containers/food/snacks/ingredient/I) + I.reagents.trans_to_holder(reagents, I.reagents.total_volume, 1, TRUE) + accumulated_time_cooked = (accumulated_time_cooked + I.accumulated_time_cooked) / 2 + food_weight += I.food_weight + update_icon() + qdel(I) + +/obj/item/reagent_containers/food/snacks/ingredient/proc/consume_weight(var/remove_amount = 100) + food_weight -= remove_amount + update_icon() + if(food_weight <= 0) + qdel(src) + +/obj/item/reagent_containers/food/snacks/ingredient/plant //for testing, delete before merge + name = "plant based generic ingredient" + desc = "This is a generic ingredient. It's so perfectly generic you're having a hard time even looking at it." + icon_state = "loadedbakedpotato" + //cookstage_information is a list of lists + //it contains a bunch of information about: how long it takes, what nutrition multiplier the ingredient has, what taste the ingredient has at various cook stages (raw, cooked, overcooked, burnt) + //an example one would be list(list(0, 0.5, "raw meat"), list(10 SECONDS, 1.2, "cooked meat"), list(16 SECONDS, 0.9, "rubbery and chewy meat"), list(20 SECONDS, 0.1, "charcoal")) + //these are defines, so to get the taste of a raw slab of meat you would do cookstage_information[RAW][COOKINFO_TASTE] + cookstage_information = list(list(0, 0.5, "raw vegetable"), list(4 SECONDS, 1.2, "cooked vegetable"), list(16 SECONDS, 0.9, "mushy vegetable"), list(20 SECONDS, 0.1, "charcoal vegetable")) + //how much cooking time (effective) have we accumulated + +/obj/item/reagent_containers/food/snacks/ingredient/transformable + name = "transforming generic ingredient" + var/list/transform_list = list(METHOD_STOVE = /obj/item/reagent_containers/food/snacks/ingredient) //example + var/obj/item/reagent_containers/food/snacks/fallback_create = /obj/item/reagent_containers/food/snacks/ingredient + + +/obj/item/reagent_containers/food/snacks/ingredient/transformable/on_cooked(reached_stage, cook_method) + if(reached_stage == COOKED) + var/obj/item/reagent_containers/food/snacks/create_item + var/make_item + if(cook_method in transform_list) + make_item = transform_list[cook_method] + else + make_item = fallback_create + create_item = new make_item(loc) + reagents.del_reagent("nutriment") //remove nutrient so we dont get weird tastes + create_item.reagents.trans_to_holder(reagents, reagents.total_volume, 1, TRUE) + if(istype(create_item, /obj/item/reagent_containers/food/snacks/ingredient)) + var/obj/item/reagent_containers/food/snacks/ingredient/create_ingredient = create_item + create_ingredient.accumulated_time_cooked = accumulated_time_cooked + create_ingredient.cookstage = cookstage + create_ingredient.food_weight = food_weight + var/datum/reagent/nutriment/our_nutrient = create_ingredient.reagents.get_reagent("nutriment") + our_nutrient.data = list() + our_nutrient.data[create_ingredient.cookstage_information[cookstage][COOKINFO_TASTE]] = WEIGHT_TASTE_DIVISION(food_weight) + if(istype(loc, /obj/machinery/cooking)) + var/obj/machinery/cooking/CK = loc + CK.insert_item(create_ingredient) + + qdel(src) + return + + +/obj/item/reagent_containers/food/snacks/ingredient/slice + slice_path = null //not further sliceable + bitesize = 2 //smol diff --git a/code/modules/food/food_2/cookers/fryer.dm b/code/modules/food/food_2/cookers/fryer.dm new file mode 100644 index 000000000000..9800726827db --- /dev/null +++ b/code/modules/food/food_2/cookers/fryer.dm @@ -0,0 +1,67 @@ +/obj/machinery/cooking/fryer + name = "deep fryer" + desc = "A deep fryer. Oil goes in, food goes in, delicious food comes out." + icon_state = "fryer_off" + + cooker_type = METHOD_DEEPFRY + + max_contents = 2 // Maximum number of things this appliance can simultaneously cook + visible_position_xy = list(list(-7, 0), list(7, 0))//for mapping a pixel_x, pixel_y to abstract ''position + + +/obj/machinery/cooking/fryer/attackby(obj/item/I, mob/user) + if(machine_stat & (BROKEN)) + to_chat(user, "\The [src] is not working.") + return + + if(default_deconstruction_screwdriver(user, I)) + return + if(default_part_replacement(user, I)) + return + if(default_deconstruction_crowbar(user, I)) + return + + if(istype(I, /obj/item/reagent_containers/glass/food_holder/fryer_basket)) //only accept baskets + if(food_containers.len >= max_contents) + return //no inserties if full + //From here we can start cooking food + insert_item(I, user) + else + ..() + +/obj/machinery/cooking/fryer/update_icon() + if(cooking_power) + icon_state = "fryer_on" + else + icon_state = "fryer_off" + cut_overlays() + for(var/I in food_containers) + var/mutable_appearance/cooktop_overlay + if(istype(I, /obj/item/reagent_containers/glass/food_holder)) + + cooktop_overlay = mutable_appearance(icon, "basket") + + var/px = visible_position_xy[food_containers[I]][1] //get 'location' from food containers, get pixel_x (first item of list) from visible_position_xy + var/py = visible_position_xy[food_containers[I]][2] + cooktop_overlay.pixel_x = px + cooktop_overlay.pixel_y = py + + add_overlay(cooktop_overlay) + + + + else if(istype(I, /obj/item/reagent_containers/food/snacks/ingredient)) //if somehow a non-basket gets in here + var/obj/item/reagent_containers/food/snacks/ingredient/cooking_thingy = I + + cooktop_overlay = mutable_appearance(cooking_thingy.icon, cooking_thingy.icon_state) + cooktop_overlay.appearance_flags |= PIXEL_SCALE //so we dont look ugly! + cooktop_overlay.underlays |= cooking_thingy.underlays + cooktop_overlay.overlays |= cooking_thingy.overlays + cooktop_overlay.transform *= food_scale_amount + + var/px = visible_position_xy[food_containers[I]][1] //get 'location' from food containers, get pixel_x (first item of list) from visible_position_xy + var/py = visible_position_xy[food_containers[I]][2] + cooktop_overlay.pixel_x = px + cooktop_overlay.pixel_y = py + + add_overlay(cooktop_overlay) diff --git a/code/modules/food/food_2/cookers/grill.dm b/code/modules/food/food_2/cookers/grill.dm new file mode 100644 index 000000000000..ec8f605264f1 --- /dev/null +++ b/code/modules/food/food_2/cookers/grill.dm @@ -0,0 +1,61 @@ +//grill time! +/obj/machinery/cooking/grill + name = "grill" + desc = "A high-power electric grill." + icon_state = "grill_off" + + cooker_type = METHOD_GRILL + + max_contents = 2 + visible_position_xy = list(list(-5, 0), list(5, 0)) + + +/obj/machinery/cooking/grill/Initialize(mapload, newdir) + . = ..() + add_overlay("grill") + + +/obj/machinery/cooking/grill/update_icon() + if(cooking_power) + icon_state = "grill_on" + else + icon_state = "grill_off" + cut_overlays() + add_overlay("grill") + + for(var/I in food_containers) + var/mutable_appearance/cooktop_overlay + if(istype(I, /obj/item/reagent_containers/glass/food_holder)) + var/obj/item/reagent_containers/glass/food_holder/FH = I + cooktop_overlay = mutable_appearance(icon, "[FH.cooker_overlay]") + + var/px = visible_position_xy[food_containers[I]][1] + var/py = visible_position_xy[food_containers[I]][2] + cooktop_overlay.pixel_x = px + cooktop_overlay.pixel_y = (py - 2) //2 down + + if(px > 0) + switch(FH.cooker_overlay) + if("skillet") + cooktop_overlay = mutable_appearance(icon, "[FH.cooker_overlay]_flip") + if("pan") + cooktop_overlay = mutable_appearance(icon, "[FH.cooker_overlay]_flip") + + add_overlay(cooktop_overlay) + + + + else if(istype(I, /obj/item/reagent_containers/food/snacks/ingredient)) + var/obj/item/reagent_containers/food/snacks/ingredient/cooking_thingy = I + + cooktop_overlay = mutable_appearance(cooking_thingy.icon, cooking_thingy.icon_state) + cooktop_overlay.appearance_flags |= PIXEL_SCALE //so we dont look ugly! + cooktop_overlay.underlays |= cooking_thingy.underlays + cooktop_overlay.overlays |= cooking_thingy.overlays + cooktop_overlay.transform *= food_scale_amount //the designated space on the grill is 8x8, so 1/4 (1/2?) size + var/px = visible_position_xy[food_containers[I]][1] + var/py = visible_position_xy[food_containers[I]][2] + cooktop_overlay.pixel_x = px + cooktop_overlay.pixel_y = py + + add_overlay(cooktop_overlay) diff --git a/code/modules/food/food_2/cookers/oven.dm b/code/modules/food/food_2/cookers/oven.dm new file mode 100644 index 000000000000..bec88505ae91 --- /dev/null +++ b/code/modules/food/food_2/cookers/oven.dm @@ -0,0 +1,60 @@ +/obj/machinery/cooking/oven + name = "oven" + desc = "A NanoTrasen Commercial Catering NTCC-35 combi-oven. This one is a smaller model with only three shelves." + icon_state = "oven_off" + + cooker_type = METHOD_OVEN + + max_contents = 3 + visible_position_xy = list(list(0, 0), list(0, 4), list(0,8)) + + +/obj/machinery/cooking/oven/Initialize(mapload, newdir) + ..() + if(prob(0.1)) + desc = "Why do they call it oven when you of in the cold food of out hot eat the food?" + +/obj/machinery/cooking/oven/update_icon() + cut_overlays() + add_overlay("ovenpanel_[cooking_power]") + + for(var/I in food_containers) + var/mutable_appearance/cooktop_overlay + if(istype(I, /obj/item/reagent_containers/glass/food_holder)) + var/obj/item/reagent_containers/glass/food_holder/FH = I + + cooktop_overlay = mutable_appearance(icon, "oven_item") + var/mutable_appearance/filling_overlay = mutable_appearance(icon, "oven_filling") + + var/px = visible_position_xy[food_containers[I]][1] //get 'location' from food containers, get pixel_x (first item of list) from visible_position_xy + var/py = visible_position_xy[food_containers[I]][2] + cooktop_overlay.pixel_x = px + cooktop_overlay.pixel_y = py + filling_overlay.pixel_x = px + filling_overlay.pixel_y = py + filling_overlay.color = FH.tally_color() + + add_overlay(cooktop_overlay) + if(LAZYLEN(FH.contents)) + add_overlay(filling_overlay) + + + else if(istype(I, /obj/item/reagent_containers/food/snacks/ingredient)) + var/obj/item/reagent_containers/food/snacks/ingredient/cooking_thingy = I + + cooktop_overlay = mutable_appearance(icon, "oven_food") + + var/px = visible_position_xy[food_containers[I]][1] //get 'location' from food containers, get pixel_x (first item of list) from visible_position_xy + var/py = visible_position_xy[food_containers[I]][2] + cooktop_overlay.pixel_x = px + cooktop_overlay.pixel_y = py + cooktop_overlay.color = AverageColor(get_flat_icon(cooking_thingy, cooking_thingy.dir, 0)) + + add_overlay(cooktop_overlay) + + if(cooking_power) + icon_state = "oven_on" + add_overlay("ovendoor_closed") + else + icon_state = "oven_off" + add_overlay("ovendoor_open") diff --git a/code/modules/food/food_2/culinary_construct.dm b/code/modules/food/food_2/culinary_construct.dm new file mode 100644 index 000000000000..b690fb9aeff7 --- /dev/null +++ b/code/modules/food/food_2/culinary_construct.dm @@ -0,0 +1,318 @@ +#define INGREDIENTS_FILL 1 +#define INGREDIENTS_SCATTER 2 +#define INGREDIENTS_STACK 3 +#define INGREDIENTS_STACKPLUSTOP 4 +#define INGREDIENTS_LINE 5 +#define INGREDIENTS_FILLSPECIAL 6 + + +//************************************************************** +// +// Customizable Food +// +//************************************************************** + + +/obj/item/reagent_containers/food/snacks/customizable + w_class = WEIGHT_CLASS_SMALL + icon = 'icons/obj/food_ingredients/custom_food.dmi' + var/ingMax = 32 + var/list/ingredients = list() + var/ingredients_placement = INGREDIENTS_FILL + var/customname = "custom" + +/obj/item/reagent_containers/food/snacks/customizable/examine(mob/user) + . = ..() + var/ingredients_listed = "" + for(var/obj/item/reagent_containers/food/snacks/ING in ingredients) + ingredients_listed += "[ING.name], " + var/size = "standard" + if(ingredients.len<2) + size = "small" + if(ingredients.len>5) + size = "big" + if(ingredients.len>8) + size = "huge" + if(ingredients.len>16) + size = "monster" + . += "It contains [ingredients.len?"[ingredients_listed]":"no ingredient, "]making a [size]-sized [initial(name)]." + +/obj/item/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user, params) + if(!istype(I, /obj/item/reagent_containers/food/snacks/customizable) && istype(I, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/S = I + if(I.w_class > WEIGHT_CLASS_SMALL) + to_chat(user, "The ingredient is too big for [src]!") + else if((ingredients.len >= ingMax) || (reagents.total_volume >= volume)) + to_chat(user, "You can't add more ingredients to [src]!") + else if(istype(I, /obj/item/reagent_containers/food/snacks/slice/custompizza) || istype(I, /obj/item/reagent_containers/food/snacks/slice/customcake)) + to_chat(user, "Adding [I.name] to [src] would make a mess.") + else + if(!user.transfer_item_to_loc(I, src)) + return + if(S.trash) + S.generate_trash(get_turf(user)) + ingredients += S + mix_filling_color(S) + S.reagents.trans_to_obj(src,min(S.reagents.total_volume, 15)) //limit of 15, we don't want our custom food to be completely filled by just one ingredient with large reagent volume. + update_snack_overlays(S) + to_chat(user, "You add the [I.name] to the [name].") + update_name(S) + else + . = ..() + + +/obj/item/reagent_containers/food/snacks/customizable/update_name(obj/item/reagent_containers/food/snacks/S) + for(var/obj/item/I in ingredients) + if(!istype(S, I.type)) + customname = "custom" + break + if(ingredients.len == 1) //first ingredient + customname = S.name + name = "[customname] [initial(name)]" + +/obj/item/reagent_containers/food/snacks/customizable/proc/initialize_custom_food(obj/item/BASE, obj/item/I, mob/user) + if(istype(BASE, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/RC = BASE + RC.reagents.trans_to_obj(src,RC.reagents.total_volume) + for(var/obj/O in BASE.contents) + contents += O + if(I && user) + attackby(I, user) + qdel(BASE) + +/obj/item/reagent_containers/food/snacks/customizable/proc/mix_filling_color(obj/item/reagent_containers/food/snacks/S) + if(ingredients.len == 1) + filling_color = S.filling_color + else + var/list/rgbcolor = list(0,0,0,0) + var/customcolor = GetColors(filling_color) + var/ingcolor = GetColors(S.filling_color) + rgbcolor[1] = (customcolor[1]+ingcolor[1])/2 + rgbcolor[2] = (customcolor[2]+ingcolor[2])/2 + rgbcolor[3] = (customcolor[3]+ingcolor[3])/2 + rgbcolor[4] = (customcolor[4]+ingcolor[4])/2 + filling_color = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3], rgbcolor[4]) + +/obj/item/reagent_containers/food/snacks/customizable/update_snack_overlays(obj/item/reagent_containers/food/snacks/S) + var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling") + if(S.filling_color == "#FFFFFF") + filling.color = S.filling_color != "#FFFFFF" ? S.filling_color : AverageColor(get_flat_icon(S, S.dir, 0), 1, 1) + else + filling.color = S.filling_color + + switch(ingredients_placement) + if(INGREDIENTS_SCATTER) + filling.pixel_x = rand(-1,1) + filling.pixel_y = rand(-1,1) + if(INGREDIENTS_STACK) + filling.pixel_x = rand(-1,1) + filling.pixel_y = 2 * ingredients.len - 1 + if(INGREDIENTS_STACKPLUSTOP) + filling.pixel_x = rand(-1,1) + filling.pixel_y = 2 * ingredients.len - 1 + if(overlays && overlays.len >= ingredients.len) //remove the old top if it exists + overlays -= overlays[ingredients.len] + var/mutable_appearance/TOP = mutable_appearance(icon, "[icon_state]_top") + TOP.pixel_y = 2 * ingredients.len + 3 + add_overlay(filling) + add_overlay(TOP) + return + if(INGREDIENTS_FILL) + cut_overlays() + filling.color = filling_color + if(INGREDIENTS_FILLSPECIAL) + if(ingredients.len == 1) + filling.color = filling_color + else + var/mutable_appearance/alt_filling = mutable_appearance(icon, "[initial(icon_state)]_filling_[pick(2,3)]") + filling.color = filling_color + add_overlay(alt_filling) + return + if(INGREDIENTS_LINE) + filling.pixel_x = filling.pixel_y = rand(-8,3) + + add_overlay(filling) + + +/obj/item/reagent_containers/food/snacks/customizable/initialize_slice(obj/item/reagent_containers/food/snacks/slice, reagents_per_slice) + ..() + slice.filling_color = filling_color + slice.update_snack_overlays(src) + + +/obj/item/reagent_containers/food/snacks/customizable/Destroy() + for(. in ingredients) + qdel(.) + return ..() + + + + + +///////////////////////////////////////////////////////////////////////////// +////////////// Customizable Food Types ///////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +/obj/item/reagent_containers/food/snacks/customizable/burger + name = "burger" + desc = "A timeless classic." + ingredients_placement = INGREDIENTS_STACKPLUSTOP + icon_state = "custburg" + + + +/obj/item/reagent_containers/food/snacks/customizable/bread + name = "bread" + ingMax = 6 + slice_path = /obj/item/reagent_containers/food/snacks/slice/bread/custom + slices_num = 5 + icon_state = "tofubread" + + +/obj/item/reagent_containers/food/snacks/slice/bread/custom + name = "bread slice" + icon_state = "tofubreadslice" + filling_color = "#FFFFFF" + +/obj/item/reagent_containers/food/snacks/customizable/burrito + name = "burrito" + ingMax = 6 + icon_state = "custburrito" + ingredients_placement = INGREDIENTS_FILLSPECIAL + +//todo:custom taco +//look inside culinary construct . dm +//custom tacos already done +/obj/item/reagent_containers/food/snacks/customizable/taco + name = "taco" + ingMax = 6 + icon_state = "custtaco" + ingredients_placement = INGREDIENTS_FILLSPECIAL + + +/obj/item/reagent_containers/food/snacks/customizable/cake + name = "cake" + ingMax = 6 + slice_path = /obj/item/reagent_containers/food/snacks/slice/customcake + slices_num = 5 + icon_state = "plaincake" + +/obj/item/reagent_containers/food/snacks/slice/customcake + name = "cake slice" + icon_state = "plaincake_slice" + filling_color = "#FFFFFF" + + + +/obj/item/reagent_containers/food/snacks/customizable/kebab + name = "kebab" + desc = "Delicious food on a stick." + ingredients_placement = INGREDIENTS_LINE + trash = /obj/item/stack/rods + ingMax = 6 + icon_state = "rod" + +/obj/item/reagent_containers/food/snacks/customizable/pizza + name = "pizza" + desc = "It's pizza time!" + ingredients_placement = INGREDIENTS_SCATTER + ingMax = 8 + slice_path = /obj/item/reagent_containers/food/snacks/slice/custompizza + slices_num = 6 + icon_state = "pizzamargherita" + +/obj/item/reagent_containers/food/snacks/slice/custompizza + name = "pizza slice" + icon_state = "pizzamargheritaslice" + filling_color = "#FFFFFF" + + + +/obj/item/reagent_containers/food/snacks/customizable/sandwich + name = "bread" + desc = "A timeless classic." + ingredients_placement = INGREDIENTS_STACK + icon_state = "breadslice" + var/finished = 0 + + +/obj/item/reagent_containers/food/snacks/customizable/sandwich/initialize_custom_food(obj/item/reagent_containers/BASE, obj/item/I, mob/user) + icon_state = BASE.icon_state + ..() + +/obj/item/reagent_containers/food/snacks/customizable/sandwich/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/reagent_containers/food/snacks/slice/bread)) //we're finishing the custom food. + var/obj/item/reagent_containers/food/snacks/slice/bread/BS = I + if(finished) + return + to_chat(user, "You finish the [src.name].") + finished = 1 + name = "[customname] sandwich" + BS.reagents.trans_to_obj(src, BS.reagents.total_volume) + ingMax = ingredients.len //can't add more ingredients after that + var/mutable_appearance/TOP = mutable_appearance(icon, "[BS.icon_state]") + TOP.pixel_y = 2 * ingredients.len + 3 + add_overlay(TOP) + if(istype(BS, /obj/item/reagent_containers/food/snacks/slice/bread/custom)) + var/mutable_appearance/filling = new(icon, "[initial(BS.icon_state)]_filling") + filling.color = BS.filling_color + filling.pixel_y = 2 * ingredients.len + 3 + add_overlay(filling) + qdel(BS) + return + else + ..() + + + + +// Bowl //////////////////////////////////////////////// +/* +/obj/item/reagent_containers/glass/bowl + name = "bowl" + desc = "A simple bowl, used for soups and salads." + icon = 'icons/obj/food/soupsalad.dmi' + icon_state = "bowl" + reagent_flags = OPENCONTAINER + custom_materials = list(/datum/material/glass = 500) + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/reagent_containers/glass/bowl/attackby(obj/item/I,mob/user, params) + if(istype(I, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/S = I + if(I.w_class > WEIGHT_CLASS_SMALL) + to_chat(user, "The ingredient is too big for [src]!") + else if(contents.len >= 20) + to_chat(user, "You can't add more ingredients to [src]!") + else + if(reagents.has_reagent(/datum/reagent/water, 10)) //are we starting a soup or a salad? + var/obj/item/reagent_containers/food/snacks/customizable/A = new/obj/item/reagent_containers/food/snacks/customizable/soup(get_turf(src)) + A.initialize_custom_food(src, S, user) + else + var/obj/item/reagent_containers/food/snacks/customizable/A = new/obj/item/reagent_containers/food/snacks/customizable/salad(get_turf(src)) + A.initialize_custom_food(src, S, user) + else + . = ..() + return + +/obj/item/reagent_containers/glass/bowl/on_reagent_change(changetype) + ..() + update_icon() + + +/obj/item/reagent_containers/glass/bowl/update_icon_state() + if(!reagents || !reagents.total_volume) + icon_state = "bowl" + +/obj/item/reagent_containers/glass/bowl/update_overlays() + . = ..() + if(reagents && reagents.total_volume) + var/mutable_appearance/filling = mutable_appearance('icons/obj/food/soupsalad.dmi', "fullbowl") + filling.color = mix_color_from_reagents(reagents.reagent_list) + . += filling +*/ +#undef INGREDIENTS_FILL +#undef INGREDIENTS_SCATTER +#undef INGREDIENTS_STACK +#undef INGREDIENTS_STACKPLUSTOP +#undef INGREDIENTS_LINE diff --git a/code/modules/food/food_2/foodholders.dm b/code/modules/food/food_2/foodholders.dm new file mode 100644 index 000000000000..87318f639ce7 --- /dev/null +++ b/code/modules/food/food_2/foodholders.dm @@ -0,0 +1,32 @@ +/obj/item/reagent_containers/glass/food_holder/fryer_basket + name = "deep fryer basket" + desc = "A fryer basket. It holds things, to be fried." + icon_state = "basket" + cooker_overlay = "basket" + + +/obj/item/reagent_containers/glass/food_holder/pot + name = "cooking pot" + desc = "A deep pot for cooking. Warning: may contain soup." + icon_state = "pot" + cooker_overlay = "pot" + volume = 240 + +/obj/item/reagent_containers/glass/food_holder/pan + name = "saucepan" + desc = "A pan for sauces." + icon_state = "pan" + cooker_overlay = "pan" + volume = 90 + +/obj/item/reagent_containers/glass/food_holder/skillet + name = "skillet" + desc = "The most weaponizable of all cooking implements. Other than knives." + icon_state = "skillet" + cooker_overlay = "skillet" + +/obj/item/reagent_containers/glass/food_holder/oventray + name = "oven tray" + desc = "Big and flat." + icon_state = "ovendish" + cooker_overlay = "ovendish" diff --git a/code/modules/food/food_2/ingredients/dough_bread.dm b/code/modules/food/food_2/ingredients/dough_bread.dm new file mode 100644 index 000000000000..b99632af4db0 --- /dev/null +++ b/code/modules/food/food_2/ingredients/dough_bread.dm @@ -0,0 +1,216 @@ +/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough + name = "dough" + desc = "A piece of dough." + icon = 'icons/obj/food_ingredients.dmi' + cookstage_information = list(list(0, 0.5, "raw dough"), list(60 SECONDS, 1, "bread"), list(80 SECONDS, 0.9, "weird dough"), list(100 SECONDS, 0.1, "weird dough")) //overcooked and burnt wont ever appear + icon_state = "dough" + nutriment_amt = 3 + transform_list = list(METHOD_OVEN = /obj/item/reagent_containers/food/snacks/ingredient/bread, METHOD_DEEPFRY = /obj/item/reagent_containers/food/snacks/ingredient/frieddoughball) //example + fallback_create = /obj/item/reagent_containers/food/snacks/ingredient/bread/damper + var/obj/item/reagent_containers/food/snacks/ingredient/flatten_type = /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat + + +/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/try_flatten(mob/user) + if(flatten_type) + var/make_item = flatten_type + var/obj/item/reagent_containers/food/snacks/ingredient/flatten_output = new make_item(loc) + to_chat(user, SPAN_NOTICE("You flatten [src].")) + flatten_output.cookstage = cookstage + flatten_output.accumulated_time_cooked = accumulated_time_cooked + qdel(src) + return + +/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat + name = "flat dough" + desc = "A flattened piece of dough." + icon_state = "flat dough" + cookstage_information = list(list(0, 0.5, "raw dough"), list(40 SECONDS, 1, "bread"), list(60 SECONDS, 0.9, "weird dough"), list(100 SECONDS, 0.1, "weird dough")) + slice_path = /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice + slices_num = 3 + nutriment_amt = 3 + transform_list = list(METHOD_OVEN = /obj/item/reagent_containers/food/snacks/ingredient/flatbread) + fallback_create = /obj/item/reagent_containers/food/snacks/ingredient/flatbread + flatten_type = null + +/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice + name = "dough slice" + desc = "A building block of an impressive dish." + icon_state = "doughslice" + cookstage_information = list(list(0, 0.5, "raw dough"), list(30 SECONDS, 1, "bread"), list(80 SECONDS, 0.9, "weird dough"), list(100 SECONDS, 0.1, "weird dough")) //only thing that matters here is cooktime + slice_path = /obj/item/reagent_containers/food/snacks/ingredient/spaghetti + nutriment_amt = 1 + slices_num = 1 + bitesize = 2 + transform_list = null + fallback_create = /obj/item/reagent_containers/food/snacks/ingredient/bun + flatten_type = /obj/item/reagent_containers/food/snacks/ingredient/tortilla/flour + +/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/corn + name = "masa" + desc = "A piece of dough made from corn flour. Used for making tortillas and cornbread." + cookstage_information = list(list(0, 0.5, "raw corn dough"), list(60 SECONDS, 1, "cornbread"), list(80 SECONDS, 0.9, "weird dough"), list(100 SECONDS, 0.1, "weird dough")) + icon_state = "masa" + transform_list = list(METHOD_OVEN = /obj/item/reagent_containers/food/snacks/ingredient/cornbread, METHOD_DEEPFRY = /obj/item/reagent_containers/food/snacks/ingredient/hushpuppy) + fallback_create = /obj/item/reagent_containers/food/snacks/ingredient/bread/pone + flatten_type = /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat/corn + +/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat/corn + name = "flat masa" + desc = "A piece of dough made from corn flour. Used for making tortillas and cornbread." + cookstage_information = list(list(0, 0.5, "raw corn dough"), list(60 SECONDS, 1, "cornbread"), list(80 SECONDS, 0.9, "weird dough"), list(100 SECONDS, 0.1, "weird dough")) + icon_state = "flatmasa" + transform_list = null + fallback_create = /obj/item/reagent_containers/food/snacks/ingredient/bread/pone + slice_path = /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice/corn + slices_num = 6 + +/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice/corn + name = "masa slice" + desc = "A building block of an impressive dish." + icon_state = "masaslice" + cookstage_information = list(list(0, 0.5, "raw corn dough"), list(30 SECONDS, 1, "cornbread"), list(45 SECONDS, 0.9, "weird dough"), list(60 SECONDS, 0.1, "weird dough")) + transform_list = null + fallback_create = /obj/item/reagent_containers/food/snacks/ingredient/cornmuffin + slice_path = null + flatten_type = /obj/item/reagent_containers/food/snacks/ingredient/tortilla + +/obj/item/reagent_containers/food/snacks/ingredient/bread + name = "bread" + cookstage_information = list(list(0, 1, "fresh white bread"), list(60 SECONDS, 1, "fresh white bread"), list(120 SECONDS, 0.8, "toast"), list(140 SECONDS, 0.1, "pure carbon")) + desc = "Some plain white bread." + icon_state = "bread" + slice_path = /obj/item/reagent_containers/food/snacks/ingredient/slice/bread + slices_num = 5 + filling_color = "#FFE396" + +/obj/item/reagent_containers/food/snacks/ingredient/slice/bread + name = "slice of bread" + cookstage_information = list(list(0, 1, "fresh white bread"), list(60 SECONDS, 1, "fresh white bread"), list(70 SECONDS, 0.8, "toast"), list(80 SECONDS, 0.1, "crispy pure carbon")) + desc = "A slice of bread." + icon_state = "breadslice" + filling_color = "#D27332" + +/obj/item/reagent_containers/food/snacks/ingredient/slice/bread/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/customizable/sandwich/S = new(get_turf(src)) + S.attackby(I, user) + qdel(src) + ..() + +/obj/item/reagent_containers/food/snacks/ingredient/damper + name = "damper" + cookstage_information = list(list(0, 1, "fresh bread"), list(40 SECONDS, 1, "toast"), list(120 SECONDS, 0.8, "burnt toast"), list(300 SECONDS, 0.1, "a lump of charcoal")) //damper is very forgiving cooktime-wise + desc = "Some plain damper. The most basic kind of bread." + icon_state = "bread" + filling_color = "#ffda96" + + +/obj/item/reagent_containers/food/snacks/ingredient/cornbread + name = "cornbread" + cookstage_information = list(list(0, 1, "fresh cornbread"), list(60 SECONDS, 1, "fresh cornbread"), list(80 SECONDS, 0.8, "cornbread toast"), list(120 SECONDS, 0.1, "pure carbon")) + icon_state = "A loaf of cornbread." + icon_state = "cornbread" + slice_path = /obj/item/reagent_containers/food/snacks/ingredient/slice/cornbread + slices_num = 5 + filling_color = "#c7d232" + +/obj/item/reagent_containers/food/snacks/ingredient/slice/cornbread + name = "slice of cornbread" + cookstage_information = list(list(0, 1, "fresh cornbread"), list(60 SECONDS, 1, "corn toast"), list(70 SECONDS, 0.8, "burnt corn toast"), list(80 SECONDS, 0.1, "crispy pure carbon")) + desc = "A slice of cornbread." + icon_state = "cornbreadslice" + filling_color = "#c7d232" + +/obj/item/reagent_containers/food/snacks/ingredient/tortilla + name = "tortilla" + cookstage_information = list(list(0, 1, "raw masa"), list(10 SECONDS, 1, "light, fluffy tortilla"), list(20 SECONDS, 0.8, "crispy tortilla"), list(25 SECONDS, 0.1, "flat carbon")) + desc = "A plain tortilla, made from masa." + icon = 'icons/obj/food_ingredients.dmi' + icon_state = "tortilla" + filling_color = "#FFE396" + + +/obj/item/reagent_containers/food/snacks/ingredient/tortilla/attackby(obj/item/I, mob/user) + if(istype(I,/obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/customizable/taco/S = new(get_turf(src)) + S.attackby(I, user) + qdel(src) + else + return ..() + +/obj/item/reagent_containers/food/snacks/ingredient/tortilla/flour + name = "flour tortilla" + cookstage_information = list(list(0, 1, "raw dough"), list(10 SECONDS, 1, "light, fluffy tortilla"), list(20 SECONDS, 0.8, "crispy tortilla"), list(25 SECONDS, 0.1, "flat carbon")) + desc = "A plain tortilla, made from flour." + icon_state = "flourtortilla" + +/obj/item/reagent_containers/food/snacks/ingredient/tortilla/flour/attackby(obj/item/I, mob/user) + if(istype(I,/obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/customizable/burrito/S = new(get_turf(src)) + S.attackby(I, user) + qdel(src) + else + return ..() + +/obj/item/reagent_containers/food/snacks/ingredient/cornmuffin + name = "cornbread muffin" + cookstage_information = list(list(0, 1, "fresh cornbread"), list(10 SECONDS, 1, "corn toast"), list(20 SECONDS, 0.8, "burnt corn toast"), list(25 SECONDS, 0.1, "crispy pure carbon")) + desc = "A muffin that's also cornbread." + icon_state = "muffin" + filling_color = "#c7d232" + +/obj/item/reagent_containers/food/snacks/ingredient/flatbread + name = "flatbread" + cookstage_information = list(list(0, 1, "flat bread"), list(40 SECONDS, 1, "flat bread"), list(50 SECONDS, 0.8, "flat toast"), list(100 SECONDS, 0.1, "flat carbon")) + desc = "A flat piece of bread. A crucial part of a pizza base." + icon = 'icons/obj/food_ingredients.dmi' + icon_state = "flatbread" + filling_color = "#c7d232" + + +/obj/item/reagent_containers/food/snacks/ingredient/frieddoughball + name = "fried doughball" + desc = "A fried ball of dough. What do you plan to do with this? It probably could've been a croquette or something, but not anymore." + cookstage_information = list(list(0, 1, "raw dough"), list(40 SECONDS, 1, "deep-fried dough"), list(50 SECONDS, 0.8, "toasted deep-fried dough"), list(100 SECONDS, 0.1, "a ball of burnt bread")) + icon_state = "frieddoughball" + +/obj/item/reagent_containers/food/snacks/ingredient/hushpuppy + name = "hush puppy" + desc = "A fried ball of corn dough. A versatile side dish." + cookstage_information = list(list(0, 1, "raw corndough"), list(40 SECONDS, 1, "deep-fried dough"), list(50 SECONDS, 0.8, "toasted deep-fried dough"), list(100 SECONDS, 0.1, "a ball of burnt bread")) + icon_state = "frieddoughball" + +/obj/item/reagent_containers/food/snacks/ingredient/bun + name = "bun" + desc = "A plain bun." + cookstage_information = list(list(0, 1, "fresh bun"), list(10 SECONDS, 1, "toasted bun"), list(20 SECONDS, 0.8, "burnt toast"), list(25 SECONDS, 0.1, "carbonized burger bun")) + icon = 'icons/obj/food_ingredients.dmi' + icon_state = "bun" + + +/obj/item/reagent_containers/food/snacks/ingredient/bun/attackby(obj/item/I, mob/user) + if(istype(I,/obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/customizable/burger/S = new(get_turf(src)) + S.attackby(I, user) + qdel(src) + else + return ..() + +/obj/item/reagent_containers/food/snacks/ingredient/bread/pone + name = "corn pone" + desc = "A simple unleavened bread made from corn flour." + cookstage_information = list(list(0, 1, "dense, heavy cornbread"), list(20 SECONDS, 1, "toasted, heavy cornbread"), list(40 SECONDS, 0.8, "burnt corn toast"), list(100 SECONDS, 0.1, "pure carbon")) + icon_state = "cornpone" + +/obj/item/reagent_containers/food/snacks/ingredient/bread/damper + name = "damper" + desc = "A simple unleavened bread made from wheat flour. Typically cooked in the coals of a fire, but any cooking method will do in a pinch." + cookstage_information = list(list(0, 1, "dense bread"), list(80 SECONDS, 1, "dense toast"), list(120 SECONDS, 0.8, "burnt dense toast"), list(140 SECONDS, 0.1, "heavy carbon")) + icon_state = "damper" + +/obj/item/reagent_containers/food/snacks/ingredient/spaghetti + name = "raw spaghetti" + desc = "Raw, handmade spaghetti noodles." + cookstage_information = list(list(0, 1, "raw dough"), list(20 SECONDS, 1, "cooked dough stick"), list(30 SECONDS, 0.8, "burnt dough sticks"), list(50 SECONDS, 0.1, "pure carbon")) + icon = 'icons/obj/food_ingredients.dmi' + icon_state = "spaghetti" diff --git a/code/modules/food/food_2/ingredients/meat.dm b/code/modules/food/food_2/ingredients/meat.dm new file mode 100644 index 000000000000..5d5a9097f38c --- /dev/null +++ b/code/modules/food/food_2/ingredients/meat.dm @@ -0,0 +1,279 @@ +/obj/item/reagent_containers/food/snacks/ingredient/meat + name = "meat" + desc = "A slab of meat." + icon = 'icons/obj/food.dmi' + icon_state = "meat" + filling_color = "#FF1C1C" + center_of_mass = list("x"=16, "y"=14) + cookstage_information = list(list(0, 0.5, "raw meat"), list(45 SECONDS, 1.2, "cooked meat"), list(60 SECONDS, 0.9, "rubbery meat"), list(75 SECONDS, 0.1, "a lump of char with some rubbery parts")) + slice_path = /obj/item/reagent_containers/food/snacks/ingredient/cutlet + slices_num = 3 + +/obj/item/reagent_containers/food/snacks/ingredient/meat/Initialize(mapload) + . = ..() + reagents.add_reagent("protein", 6) + reagents.add_reagent("triglyceride", 2) + src.bitesize = 1.5 + +/obj/item/reagent_containers/food/snacks/ingredient/meat/on_cooked(reached_stage, cook_method) + if(reached_stage == COOKED && !isnull(cooked_icon)) + icon_state = cooked_icon + + +/obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh + name = "synthetic meat" + desc = "A synthetic slab of flesh." + +/obj/item/reagent_containers/food/snacks/ingredient/bearmeat // Buff 12 >> 17 + name = "bear meat" + desc = "A very manly slab of meat." + icon_state = "bearmeat" + filling_color = "#DB0000" + +/obj/item/reagent_containers/food/snacks/ingredient/horsemeat + name = "horse meat" + desc = "No no, I said it came from something fast." + +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat // Buff 6 >> 10 + name = "xenomeat" + desc = "A slab of green meat. Smells like acid." + cookstage_information = list(list(0, 0.5, "raw, tough and acidic meat"), list(45 SECONDS, 1.2, "tough meat"), list(60 SECONDS, 0.9, "rubbery and sour meat"), list(75 SECONDS, 0.1, "a hunk of plastic boiled in acid")) + icon_state = "xenomeat" + filling_color = "#43DE18" + +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/Initialize(mapload) + . = ..() + reagents.add_reagent("protein", 10) + reagents.add_reagent("pacid",6) + src.bitesize = 6 + +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat // Substitute for recipes requiring xeno meat. + name = "spider meat" + desc = "A slab of green meat." + cookstage_information = list(list(0, 0.5, "raw, squishy and bitter meat"), list(45 SECONDS, 1.2, "squishy, bitter meat"), list(60 SECONDS, 0.9, "vulcanized rubbermeat and sourness"), list(75 SECONDS, 0.1, "vulcanized rubber seasoned with flies killed by a bug-zapper")) + icon_state = "xenomeat" + filling_color = "#43DE18" + +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat/Initialize(mapload) + . = ..() + reagents.add_reagent("spidertoxin",6) + reagents.remove_reagent("pacid",6) + src.bitesize = 6 + +// Seperate definitions because some food likes to know if it's human. +// TODO: rewrite kitchen code to check a var on the meat item so we can remove +// all these sybtypes. +/obj/item/reagent_containers/food/snacks/ingredient/meat/human + name = "porcine(?) meat" + desc = "Tastes vaguely like pork." + +/obj/item/reagent_containers/food/snacks/ingredient/meat/monkey + //same as plain meat + +/obj/item/reagent_containers/food/snacks/ingredient/meat/corgi + name = "corgi meat" + desc = "Tastes like... well, you know." + +/obj/item/reagent_containers/food/snacks/ingredient/meat/chicken + cookstage_information = list(list(0, 0.5, "raw chicken"), list(45 SECONDS, 1.2, "cooked chicken"), list(60 SECONDS, 0.9, "rubbery chicken"), list(75 SECONDS, 0.1, "a lump of char with some rubbery parts")) + icon = 'icons/obj/food.dmi' + icon_state = "chickenbreast" + cooked_icon = "chickenbreast_cooked" + filling_color = "#BBBBAA" + +/obj/item/reagent_containers/food/snacks/ingredient/meat/chicken/Initialize(mapload) + ..() + reagents.remove_reagent("triglyceride", INFINITY) + //Chicken is low fat. Less total calories than other meats + +/obj/item/reagent_containers/food/snacks/ingredient/meat/chicken/penguin + name = "meat" + desc = "Tastes like chicken? Or fish? Fishy chicken? Strange." + icon = 'icons/obj/food.dmi' + icon_state = "penguinmeat" + cooked_icon = "chickenbreast_cooked" + filling_color = "#BBBBAA" + +/obj/item/reagent_containers/food/snacks/ingredient/meat/chicken/teshari + name = "meat" + desc = "Tastes like a really fast chicken. Who'd have guessed?" + +/obj/item/reagent_containers/food/snacks/ingredient/meat/vox + name = "vox meat" + desc = "Tough and sinewy. Don't eat it raw." + cookstage_information = list(list(0, 0.5, "impossibly tough, spicy meat with hints of phoron"), list(2 MINUTES, 1.2, "tough, spicy meat with hints of phoron"), list(4 MINUTES , 0.9, "rubbery meat with hints of phoron"), list(10 MINUTES, 0.1, "phoron-enriched charcoal")) + icon = 'icons/obj/food.dmi' + icon_state = "voxmeat" + cooked_icon = "voxmeat_cooked" + +/obj/item/reagent_containers/food/snacks/ingredient/meat/vox/Initialize(mapload) + . = ..() + reagents.add_reagent("protein", 6) + reagents.add_reagent("triglyceride", 2) + reagents.add_reagent("phoron", 3) + src.bitesize = 1.5 + +/obj/item/reagent_containers/food/snacks/ingredient/meat/grubmeat + name = "grubmeat" + desc = "A slab of grub meat, it gives a gentle shock if you touch it" + cookstage_information = list(list(0, 0.5, "raw, disturbingly juicy insect-flesh"), list(45 SECONDS, 1.2, "cooked, slimy insect meat"), list(60 SECONDS, 0.9, "rubbery, slimy and thoroughly overcooked insect meat"), list(75 SECONDS, 0.1, "a lump of char with some rubbery parts")) + icon_state = "grubmeat" + center_of_mass = list("x"=16, "y"=10) + +/obj/item/reagent_containers/food/snacks/ingredient/meat/grubmeat/Initialize(mapload) + . = ..() + reagents.add_reagent("protein", 1) + reagents.add_reagent("shockchem", 6) + bitesize = 6 + + +/obj/item/reagent_containers/food/snacks/ingredient/cutlet + name = "raw cutlet" + desc = "A thin piece of meat." + cookstage_information = list(list(0, 0.5, "raw meat"), list(30 SECONDS, 1.2, "cooked meat"), list(45 SECONDS, 0.9, "rubbery meat"), list(60 SECONDS, 0.1, "a lump of char with some rubbery parts")) + icon = 'icons/obj/food_ingredients.dmi' + icon_state = "rawcutlet" + bitesize = 1 + name_on_cook = "cutlet" + +/obj/item/reagent_containers/food/snacks/ingredient/cutlet/on_cooked(reached_stage, cook_method) + if(reached_stage == COOKED) + icon_state = "cutlet" + reagents.add_reagent("protein", 2) + +/obj/item/reagent_containers/food/snacks/ingredient/meatball + name = "raw meatball" + desc = "A meatball." + icon = 'icons/obj/food_ingredients.dmi' + cookstage_information = list(list(0, 0.5, "raw meatball"), list(30 SECONDS, 1.2, "meatball"), list(45 SECONDS, 0.9, "rubbery meat"), list(60 SECONDS, 0.1, "a sphere of char with some rubbery parts")) + icon_state = "rawmeatball" + bitesize = 2 + name_on_cook = "meatball" + +/obj/item/reagent_containers/food/snacks/ingredient/meatball/on_cooked(reached_stage, cook_method) + if(reached_stage == COOKED) + icon_state = "meatball" + reagents.add_reagent("protein", 2) + +/obj/item/reagent_containers/food/snacks/ingredient/sausage // Buff 6 >> 9 + name = "sausage" + desc = "A piece of mixed, long meat." + cookstage_information = list(list(0, 0.5, "raw meat and sausage casing"), list(30 SECONDS, 1.2, "hotdog"), list(45 SECONDS, 0.9, "rubbery hotdog"), list(60 SECONDS, 0.1, "squishy, ovecooked sausage casing and charred meat")) + icon_state = "sausage" + filling_color = "#DB0000" + + +/obj/item/reagent_containers/food/snacks/ingredient/sausage/Initialize(mapload) + . = ..() + reagents.add_reagent("protein", 9) + bitesize = 3 + + +/obj/item/reagent_containers/food/snacks/ingredient/bacon + name = "raw bacon" + desc = "A very thin piece of raw meat." + cookstage_information = list(list(0, 0.5, "raw bacon"), list(25 SECONDS, 1.2, "bacon"), list(35 SECONDS, 0.9, "rubbery, tough bacon"), list(45 SECONDS, 0.1, "bacon, burnt to unpalatability")) + icon = 'icons/obj/food_ingredients.dmi' + icon_state = "rawbacon" + bitesize = 1 + name_on_cook = "bacon" + +/obj/item/reagent_containers/food/snacks/ingredient/bacon/on_cooked(reached_stage, cook_method) + if(reached_stage == COOKED) + desc = "Mmmmm, bacon." + icon_state = "bacon" + reagents.add_reagent("protein", 0.6) + +//please don't get distracted by this half-price gammon +/obj/item/reagent_containers/food/snacks/ingredient/ham + name = "ham" + desc = "A hearty chunk of cured pork leg." + cookstage_information = list(list(0, 0.5, "raw gammon"), list(90 SECONDS, 1.2, "ham"), list(110 SECONDS, 0.9, "rubbery, tough ham"), list(150 SECONDS, 0.1, "ruined roast")) + icon_state = "ham" + nutriment_amt = 8 + nutriment_desc = list("meat" = 5, "salt" = 3) + +/obj/item/reagent_containers/food/snacks/ingredient/ham/Initialize(mapload) + . = ..() + reagents.add_reagent("protein", 8) + bitesize = 2 + + +//seafoods +/obj/item/reagent_containers/food/snacks/ingredient/lobster + name = "raw lobster" + desc = "A shifty lobster. You can try eating it, but its shell is extremely tough." + cookstage_information = list(list(0, 0.5, "raw lobster"), list(40 SECONDS, 1.2, "perfectly cooked lobster"), list(50 SECONDS, 0.9, "squishy, rubbery lobster"), list(90 SECONDS, 0.1, "a sea-dwelling crustacean that's been cooked for a week")) + icon_state = "lobster_raw" + nutriment_amt = 5 +//cuttlefish is common in sushi raw, and hence has a higher raw nutrimult +/obj/item/reagent_containers/food/snacks/ingredient/cuttlefish + name = "raw cuttlefish" + desc = "It's an adorable squid! you can't possible be thinking about eating this, right? Right?" + cookstage_information = list(list(0, 0.8, "firm, raw cuttlefish"), list(40 SECONDS, 1.2, "slightly sweet, tender and creamy cuttlefish meat"), list(60 SECONDS, 0.9, "squishy, rubbery cuttlefish"), list(90 SECONDS, 0.1, "a negligent and sad waste of perfectly good meat, overcooked to inedibility")) + icon_state = "cuttlefish_raw" + nutriment_amt = 5 + +//shrimp is very easy to overcook. ask me how i know +/obj/item/reagent_containers/food/snacks/ingredient/shrimp + name = "raw shrimp" + desc = "An old-Earth sea creature. Formerly a luxury item, shrimp are commonly farmed as an easy source of protein." + cookstage_information = list(list(0, 0.3, "raw shrimp"), list(30 SECONDS, 1.2, "light and sweet shrimp"), list(35 SECONDS, 0.9, "squishy, rubbery shrimp"), list(60 SECONDS, 0.1, "a sea-dwelling crustacean that's been cooked for a week")) + icon_state = "shrimp_raw" + nutriment_amt = 5 + + +/obj/item/reagent_containers/food/snacks/ingredient/carp + name = "fillet" + desc = "A fillet of carp meat." + cookstage_information = list(list(0, 0.8, "fresh, raw carp"), list(40 SECONDS, 1.2, "perfectly cooked space carp"), list(50 SECONDS, 0.9, "squishy, rubbery and overcooked carp"), list(90 SECONDS, 0.1, "carp scorched thoroughly by the heat of one sun over a very long period of time")) + icon_state = "fishfillet" + filling_color = "#FFDEFE" + center_of_mass = list("x"=17, "y"=13) + + var/toxin_type = "carpotoxin" + var/toxin_amount = 3 + +/obj/item/reagent_containers/food/snacks/ingredient/carp/Initialize(mapload) + . = ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent(toxin_type, toxin_amount) + src.bitesize = 6 + +/obj/item/reagent_containers/food/snacks/ingredient/carp/sif + cookstage_information = list(list(0, 0.8, "fresh, raw fish-flesh"), list(40 SECONDS, 1.2, "perfectly cooked fish"), list(50 SECONDS, 0.9, "squishy, rubbery and overcooked fish"), list(90 SECONDS, 0.1, "charred, overcooked fish")) + desc = "A fillet of sivian fish meat." + filling_color = "#2c2cff" + color = "#2c2cff" + toxin_type = "neurotoxic_protein" + toxin_amount = 2 + +/obj/item/reagent_containers/food/snacks/ingredient/carp/fish // Removed toxin and added a bit more oomph + cookstage_information = list(list(0, 0.8, "fresh, raw fish-flesh"), list(40 SECONDS, 1.2, "perfectly cooked fish"), list(50 SECONDS, 0.9, "squishy, rubbery and overcooked fish"), list(90 SECONDS, 0.1, "charred, overcooked fish")) + desc = "A fillet of fish meat." + toxin_amount = 0 + toxin_type = null + nutriment_amt = 4 + +/obj/item/reagent_containers/food/snacks/ingredient/carp/fish/murkfish + desc = "A fillet of murkfish meat." + filling_color = "#4d331a" + color = "#4d331a" + + +//non-vegan plant-based meats +/obj/item/reagent_containers/food/snacks/ingredient/hugemushroomslice // Buff 3 >> 5 + name = "huge mushroom slice" + desc = "A slice from a huge mushroom." + cookstage_information = list(list(0, 0.8, "heavy, nutty mushroom with hints of sweetness and bitterness"), list(40 SECONDS, 1.2, "tender, nutty mushroom, cooked to perfection"), list(50 SECONDS, 0.9, "rubbery, bitter and overcooked mushroom"), list(90 SECONDS, 0.1, "a slab of living mushroom cooked until it contains absolutely zero life whatsoever")) + icon_state = "hugemushroomslice" + filling_color = "#E0D7C5" + nutriment_amt = 5 + +/obj/item/reagent_containers/food/snacks/ingredient/tomatomeat + name = "tomato slice" + desc = "A slice from a huge tomato." + cookstage_information = list(list(0, 1, "juicy, fresh tomato with hints of salt and metal"), list(20 SECONDS, 1.2, "fresh, lightly-cooked tomato"), list(30 SECONDS, 0.9, "mushy overcooked tomato"), list(90 SECONDS, 0.1, "sad, burnt tomato")) + icon_state = "tomatomeat" + filling_color = "#DB0000" + nutriment_amt = 3 diff --git a/code/modules/food/food_2/ingredients/misc.dm b/code/modules/food/food_2/ingredients/misc.dm new file mode 100644 index 000000000000..543480207348 --- /dev/null +++ b/code/modules/food/food_2/ingredients/misc.dm @@ -0,0 +1,137 @@ +/obj/item/reagent_containers/food/snacks/ingredient/egg + name = "egg" + desc = "An egg!" + cookstage_information = list(list(0, 0.5, "raw egg and shell"), list(20 SECONDS, 1.2, "cooked egg"), list(40 SECONDS, 0.7, "overcooked egg"), list(90 SECONDS, 0.1, "sad, burnt egg")) + icon_state = "egg" + filling_color = "#fdffd1" + volume = 10 + can_stack = TRUE + food_weight = 100 + +/obj/item/reagent_containers/food/snacks/ingredient/egg/Initialize(mapload) + . = ..() + reagents.add_reagent("egg", 3) + +/obj/item/reagent_containers/food/snacks/ingredient/egg/afterattack(atom/target, mob/user, clickchain_flags, list/params) + if(istype(target,/obj/machinery/microwave)) + return ..() + if(!((clickchain_flags & CLICKCHAIN_HAS_PROXIMITY) && target.is_open_container()) || (user.a_intent != INTENT_HARM)) + return + to_chat(user, "You crack \the [src] into \the [target].") + reagents.trans_to(target, reagents.total_volume) + qdel(src) + +/obj/item/reagent_containers/food/snacks/ingredient/egg/throw_impact(atom/hit_atom) + . = ..() + new/obj/effect/debris/cleanable/egg_smudge(src.loc) + src.reagents.splash(hit_atom, reagents.total_volume) + src.visible_message("[src.name] has been squashed.","You hear a smack.") + qdel(src) + +/obj/item/reagent_containers/food/snacks/ingredient/egg/attackby(obj/item/W as obj, mob/user as mob) + if(istype( W, /obj/item/pen/crayon )) + var/obj/item/pen/crayon/C = W + var/clr = C.crayon_color_name + + if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) + to_chat(usr, "The egg refuses to take on this color!") + return + + to_chat(usr, "You color \the [src] [clr]") + icon_state = "egg-[clr]" + else + . = ..() + +/obj/item/reagent_containers/food/snacks/ingredient/egg/randomized/Initialize(mapload) + . = ..() + var/randeggicon = pick("egg-blue","egg-green","egg-orange","egg-purple","egg-red","egg-yellow","egg-rainbow") + icon_state = (randeggicon) + +/obj/item/reagent_containers/food/snacks/ingredient/egg/blue + icon_state = "egg-blue" + +/obj/item/reagent_containers/food/snacks/ingredient/egg/green + icon_state = "egg-green" + +/obj/item/reagent_containers/food/snacks/ingredient/egg/mime + icon_state = "egg-mime" + +/obj/item/reagent_containers/food/snacks/ingredient/egg/orange + icon_state = "egg-orange" + +/obj/item/reagent_containers/food/snacks/ingredient/egg/purple + icon_state = "egg-purple" + +/obj/item/reagent_containers/food/snacks/ingredient/egg/rainbow + icon_state = "egg-rainbow" + +/obj/item/reagent_containers/food/snacks/ingredient/egg/red + icon_state = "egg-red" + +/obj/item/reagent_containers/food/snacks/ingredient/egg/yellow + icon_state = "egg-yellow" + + +/obj/item/reagent_containers/food/snacks/ingredient/tofu + name = "Tofu" + desc = "We all love tofu." + cookstage_information = list(list(0, 0.7, "fresh raw tofu"), list(20 SECONDS, 1.2, "cooked tofu"), list(40 SECONDS, 0.7, "overcooked tofu"), list(90 SECONDS, 0.1, "burnt tofu")) + filling_color = "#FFFEE0" + icon_state = "tofu" + nutriment_amt = 6 + nutriment_desc = list("tofu" = 3, "goeyness" = 3) + +/obj/item/reagent_containers/food/snacks/ingredient/tofu/Initialize(mapload) + . = ..() + src.bitesize = 3 + + +/obj/item/reagent_containers/food/snacks/ingredient/cheesewheel + name = "cheese wheel" + desc = "A big wheel of delcious space cheese." + icon_state = "cheesewheel" + slice_path = /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge + cookstage_information = list(list(0, 1, "cheese"), list(20 SECONDS, 1.2, "cheese"), list(40 SECONDS, 0.7, "cheese"), list(90 SECONDS, 0.1, "burnt cheese")) + slices_num = 10 + filling_color = "#FFF700" + nutriment_amt = 10 + can_stack = FALSE + food_weight = 1000 + +/obj/item/reagent_containers/food/snacks/ingredient/cheesewheel/Initialize(mapload) + . = ..() + reagents.add_reagent("protein", 10) + bitesize = 2 + +/obj/item/reagent_containers/food/snacks/ingredient/cheesewedge + name = "cheese wedge" + desc = "A wedge of delicious space cheese. The wheel it was cut from can't have gone far." + cookstage_information = list(list(0, 1, "cheese"), list(20 SECONDS, 1.2, "cheese"), list(40 SECONDS, 0.7, "cheese"), list(90 SECONDS, 0.1, "burnt cheese")) + icon_state = "cheesewedge" + filling_color = "#FFF700" + bitesize = 2 + +/obj/item/reagent_containers/food/snacks/ingredient/bluecheesewheel + name = "blue cheese wheel" + desc = "A big wheel of mold-infused blue cheese." + cookstage_information = list(list(0, 1, "tangy, creamy cheese with sharp notes of butyric acid"), list(20 SECONDS, 1.2, "tangy, creamy cheese with sharp notes of butyric acid"), list(40 SECONDS, 0.7, "tangy, creamy cheese with sharp notes of butyric acid"), list(90 SECONDS, 0.1, "burnt cheese")) + icon_state = "bluecheesewheel" + slice_path = /obj/item/reagent_containers/food/snacks/ingredient/bluecheesewedge + slices_num = 10 + filling_color = "#f1f0c8" + nutriment_amt = 10 + can_stack = FALSE + food_weight = 1000 + +/obj/item/reagent_containers/food/snacks/ingredient/bluecheesewheel/Initialize(mapload) + . = ..() + reagents.add_reagent("protein", 10) + bitesize = 2 + +/obj/item/reagent_containers/food/snacks/ingredient/bluecheesewedge + name = "blue cheese wedge" + desc = "A wedge of mold-infused blue cheese. The wheel it was cut from can't have gone far." + cookstage_information = list(list(0, 1, "tangy, creamy cheese with sharp notes of butyric acid"), list(20 SECONDS, 1.2, "tangy, creamy cheese with sharp notes of butyric acid"), list(40 SECONDS, 0.7, "tangy, creamy cheese with sharp notes of butyric acid"), list(90 SECONDS, 0.1, "burnt cheese")) + icon_state = "bluecheesewedge" + filling_color = "#f1f0c8" + bitesize = 2 diff --git a/code/modules/food/food_2/ingredients/veggies.dm b/code/modules/food/food_2/ingredients/veggies.dm new file mode 100644 index 000000000000..d87c099faf61 --- /dev/null +++ b/code/modules/food/food_2/ingredients/veggies.dm @@ -0,0 +1,8 @@ +/obj/item/reagent_containers/food/snacks/ingredient/rawsticks + name = "raw potato sticks" + desc = "Raw potato sticks." + cookstage_information = list(list(0, 0.5, "raw potato"), list(10 SECONDS, 1.2, "cooked potato"), list(16 SECONDS, 0.9, "rubbery potato"), list(20 SECONDS, 0.1, "burnt potato")) +//#warn todo: mapping +//#warn todo: icon stacking +//#warn todo improve spaghetti? +//#warn todo: show ingred diff --git a/code/modules/food/food_2/reagent_into_fooditem.dm b/code/modules/food/food_2/reagent_into_fooditem.dm new file mode 100644 index 000000000000..8ad1dfb5353c --- /dev/null +++ b/code/modules/food/food_2/reagent_into_fooditem.dm @@ -0,0 +1 @@ +//TODO diff --git a/code/modules/food/food_2/serving.dm b/code/modules/food/food_2/serving.dm new file mode 100644 index 000000000000..f1a696e1d7d8 --- /dev/null +++ b/code/modules/food/food_2/serving.dm @@ -0,0 +1,43 @@ + + +/obj/item/food_serving + name = "bowl" + desc = "A bowl, for serving food." + icon = 'icons/obj/food_ingredients/custom_food.dmi' + icon_state = "bowl" + var/serving_type = "bowl" + var/trash_type + + var/dirty = FALSE //are we dirty + + +/obj/item/food_serving/woodbowl + name = "wooden bowl" + desc = "A rustic wooden bowl, for serving food." + icon_state = "woodbowl" + serving_type = "wood bowl" + +/obj/item/food_serving/plate + name = "plate" + desc = "A plate, for serving food." + icon_state = "plate" + serving_type = "plate" + + +/obj/item/reagent_containers/food/snacks/food_serving + name = "generic serving of food" + desc = "How did I get here?" + icon = 'icons/obj/food_ingredients/custom_food.dmi' + icon_state = "handful" + /* + var/bitesize = 1 + var/bitecount = 0 + var/trash = null + var/dried_type = null + var/survivalfood = FALSE + var/nutriment_amt = 0 + var/list/nutriment_desc = list("food" = 1) + var/datum/reagent/nutriment/coating/coating = null + var/icon/flat_icon = null //Used to cache a flat icon generated from dipping in batter. This is used again to make the cooked-batter-overlay + var/do_coating_prefix = 1 //If 0, we wont do "battered thing" or similar prefixes. Mainly for recipes that include batter but have a special name + */ diff --git a/code/modules/food/machinery/appliance/_appliance.dm b/code/modules/food/machinery/appliance/_appliance.dm index 33790c874314..15128ce9bb0e 100644 --- a/code/modules/food/machinery/appliance/_appliance.dm +++ b/code/modules/food/machinery/appliance/_appliance.dm @@ -1,5 +1,5 @@ // 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/reagent_containers/food/snacks var/tmp/list/cooked @@ -39,7 +39,7 @@ // 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/list/datum/cooking_recipe/available_recipes var/container_type = null @@ -48,7 +48,7 @@ /obj/machinery/appliance/Initialize(mapload, newdir) . = ..() component_parts = list() - component_parts += /obj/item/circuitboard/cooking + component_parts += /obj/item/circuitboard/appliance component_parts += /obj/item/stock_parts/capacitor component_parts += /obj/item/stock_parts/capacitor component_parts += /obj/item/stock_parts/capacitor @@ -61,8 +61,8 @@ if (!available_recipes) available_recipes = new - for (var/type in subtypesof(/datum/recipe)) - var/datum/recipe/test = new type + for (var/type in subtypesof(/datum/cooking_recipe)) + var/datum/cooking_recipe/test = new type if ((appliancetype & test.appliance)) available_recipes += test else @@ -233,7 +233,7 @@ //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) + if (cooking_objs.len >= max_contents) return FALSE return TRUE @@ -385,7 +385,7 @@ 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/datum/cooking_recipe/recipe = null var/atom/C = null if (CI.container) C = CI.container @@ -716,7 +716,7 @@ active_power_usage = initial(active_power_usage) - scan_rating*10 cooking_power = initial(cooking_power) + (scan_rating+cap_rating)/10 -/obj/item/circuitboard/cooking +/obj/item/circuitboard/appliance name = "kitchen appliance circuitry" desc = "The circuitboard for many kitchen appliances. Not of much use." origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) @@ -724,3 +724,4 @@ /obj/item/stock_parts/capacitor = 3, /obj/item/stock_parts/scanning_module = 1, /obj/item/stock_parts/matter_bin = 2) +*/ diff --git a/code/modules/food/machinery/appliance/_cooker.dm b/code/modules/food/machinery/appliance/_cooker.dm deleted file mode 100644 index c3dda054062c..000000000000 --- a/code/modules/food/machinery/appliance/_cooker.dm +++ /dev/null @@ -1,140 +0,0 @@ -/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. - Edit, efficiency is not lowered anymore for being too hot, because why would that slow down cooking? - var/optimal_power = 0.1//cooking power at 100% - - var/loss = 1 //Temp lost per proc when equalising - var/resistance = 81000 //Resistance to heating. combines with active power usage to determine how long heating takes - - var/light_x = 0 - var/light_y = 0 - cooking_power = 0 - -/obj/machinery/appliance/cooker/examine(var/mob/user) - . = ..() - if(.) //no need to duplicate adjacency check - if(!machine_stat) - if(temperature < min_temp) - . += SPAN_WARNING( "\The [src] is still heating up and is too cold to cook anything yet.") - else - . += SPAN_NOTICE("It is running at [round(get_efficiency(), 0.1)]% efficiency!") - . += "Temperature: [round(temperature - T0C, 0.1)]C / [round(optimal_temp - T0C, 0.1)]C" - else - if(machine_stat) - . += SPAN_WARNING( "It is switched off.") - -/obj/machinery/appliance/cooker/list_contents(var/mob/user) - if (cooking_objs.len) - var/string = "Contains...
" - 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)]
" - to_chat(user, string) - else - to_chat(user, SPAN_NOTICE("It is empty.")) - -/obj/machinery/appliance/cooker/proc/get_efficiency() - //RefreshParts() - return (cooking_power / optimal_power) * 100 - -/obj/machinery/appliance/cooker/Initialize(mapload, newdir) - . = ..() - 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 = 0 - - update_icon() // this probably won't cause issues, but Aurora used SSIcons and update_icon() instead - -/obj/machinery/appliance/cooker/update_icon() - cut_overlays() - var/image/light - if (use_power == 2 && !machine_stat) - light = image(icon, "light_on") - else - light = image(icon, "light_off") - light.pixel_x = light_x - light.pixel_y = light_y - add_overlay(light) - -/obj/machinery/appliance/cooker/process(delta_time) - if (!machine_stat) - heat_up() - else - var/turf/T = get_turf(src) - if (temperature > T.temperature) - equalize_temperature() - ..() - -/obj/machinery/appliance/cooker/power_change() - . = ..() - update_icon() // this probably won't cause issues, but Aurora used SSIcons and update_icon() instead - -/obj/machinery/appliance/cooker/proc/update_cooking_power() - var/temp_scale = 0 - if(temperature > min_temp) - - 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) - - if(temperature > optimal_temp) - cooking_power = optimal_power - else - cooking_power = optimal_power * temp_scale - - //RefreshParts() - -/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 += active_power_usage / (resistance/2) - update_cooking_power() - return 1 - else - 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/appliance/cooker/proc/equalize_temperature() - temperature -= loss//Temperature will fall somewhat slowly - update_cooking_power() - -//Cookers do differently, they use containers -/obj/machinery/appliance/cooker/has_space(var/obj/item/I) - if (istype(I, /obj/item/reagent_containers/cooking_container)) - //Containers can go into an empty slot - if (cooking_objs.len < max_contents) - return TRUE - else - //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 FALSE - -/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 diff --git a/code/modules/food/machinery/appliance/_mixer.dm b/code/modules/food/machinery/appliance/_mixer.dm deleted file mode 100644 index 2ac3ae28b444..000000000000 --- a/code/modules/food/machinery/appliance/_mixer.dm +++ /dev/null @@ -1,151 +0,0 @@ -/* -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 - machine_stat = POWEROFF - cooking_power = 0.4 - active_power_usage = 3000 - idle_power_usage = 50 - var/datum/looping_sound/mixer/mixer_loop - -/obj/machinery/appliance/mixer/examine(var/mob/user) - . = ..() - . += "It is currently set to make a [selected_option]." - -/obj/machinery/appliance/mixer/Initialize(mapload, newdir) - . = ..() - cooking_objs += new /datum/cooking_item(new /obj/item/reagent_containers/cooking_container(src)) - cooking = 0 - selected_option = pick(output_options) - - mixer_loop = new(list(src), FALSE) - -/obj/machinery/appliance/mixer/Destroy() - . = ..() - - QDEL_NULL(mixer_loop) - -//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 oview(1) - set name = "Choose output" - set category = "Object" - - if(!can_use_check()) - 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, "You prepare \the [src] to make \a [selected_option].") - 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 FALSE - - if (CI.container.can_fit(I)) - return CI - - return FALSE - - -/obj/machinery/appliance/mixer/can_remove_items(mob/user) - if(machine_stat) - return TRUE - else - to_chat(user, SPAN_WARNING( "You can't remove ingredients while it's turned on! Turn it off first or wait for it to finish.")) - -//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 TRUE - return FALSE - - -/obj/machinery/appliance/mixer/toggle_power() - set src in view() - set name = "Toggle Power" - set category = "Object" - - var/datum/cooking_item/CI = cooking_objs[1] - if (!CI.container.check_contents()) - to_chat(usr, "There's nothing in it! Add ingredients before turning [src] on!") - return - - if (machine_stat & POWEROFF)//Its turned off - machine_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 - machine_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 (!machine_stat) - user << SPAN_WARNING("You can't add items while \the [src] is running. Wait for it to finish or turn the power off to abort.") - return 0 - else - return ..() - -/obj/machinery/appliance/mixer/finish_cooking(var/datum/cooking_item/CI) - ..() - machine_stat |= POWEROFF - playsound(src, 'sound/machines/click.ogg', 40, 1) - use_power = 0 - CI.reset() - update_icon() - -/obj/machinery/appliance/mixer/update_icon() - if (!machine_stat) - icon_state = on_icon - if(mixer_loop) - mixer_loop.start(src) - else - icon_state = off_icon - if(mixer_loop) - mixer_loop.stop(src) - - -/obj/machinery/appliance/mixer/process(delta_time) - if (!machine_stat) - for (var/i in cooking_objs) - do_cooking_tick(i) diff --git a/code/modules/food/machinery/appliance/candy.dm b/code/modules/food/machinery/appliance/candy.dm deleted file mode 100644 index 352d5fdd063f..000000000000 --- a/code/modules/food/machinery/appliance/candy.dm +++ /dev/null @@ -1,43 +0,0 @@ -/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 - var/datum/looping_sound/candymaker/candymaker_loop - cooking_power = 0.6 - - output_options = list( - "Jawbreaker" = /obj/item/reagent_containers/food/snacks/variable/jawbreaker, - "Candy Bar" = /obj/item/reagent_containers/food/snacks/variable/candybar, - "Sucker" = /obj/item/reagent_containers/food/snacks/variable/sucker, - "Jelly" = /obj/item/reagent_containers/food/snacks/variable/jelly - ) - -/obj/machinery/appliance/mixer/candy/Initialize(mapload) - . = ..() - - candymaker_loop = new(list(src), FALSE) - -/obj/machinery/appliance/mixer/candy/Destroy() - . = ..() - - QDEL_NULL(candymaker_loop) - -/obj/machinery/appliance/mixer/candy/update_icon() - . = ..() - - if(!machine_stat) - icon_state = on_icon - if(candymaker_loop) - candymaker_loop.start(src) - else - icon_state = off_icon - if(candymaker_loop) - candymaker_loop.stop(src) - -/obj/machinery/appliance/mixer/candy/change_product_appearance(obj/item/reagent_containers/food/snacks/product) - food_color = get_random_colour(1) - . = ..() diff --git a/code/modules/food/machinery/appliance/cereal.dm b/code/modules/food/machinery/appliance/cereal.dm deleted file mode 100644 index be18c743359e..000000000000 --- a/code/modules/food/machinery/appliance/cereal.dm +++ /dev/null @@ -1,85 +0,0 @@ -/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 - var/datum/looping_sound/cerealmaker/cerealmaker_loop - - output_options = list( - "Cereal" = /obj/item/reagent_containers/food/snacks/variable/cereal - ) - -/obj/machinery/appliance/mixer/cereal/Initialize(mapload) - . = ..() - - cerealmaker_loop = new(list(src), FALSE) - -/obj/machinery/appliance/mixer/cereal/Destroy() - . = ..() - - QDEL_NULL(cerealmaker_loop) - -/* -/obj/machinery/appliance/cereal/change_product_strings(var/obj/item/reagent_containers/food/snacks/product, var/datum/cooking_item/CI) - . = ..() - product.name = "box of [CI.object.name] cereal" - -/obj/machinery/appliance/cereal/change_product_appearance(var/obj/item/reagent_containers/food/snacks/product, var/datum/cooking_item/CI) - 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.add_overlay(CI.object.overlays) - food_image.transform *= 0.7 - - product.add_overlay(food_image) -*/ - -/obj/machinery/appliance/mixer/cereal/update_icon() - . = ..() - - if(!machine_stat) - icon_state = on_icon - if(cerealmaker_loop) - cerealmaker_loop.start(src) - else - icon_state = off_icon - if(cerealmaker_loop) - cerealmaker_loop.stop(src) - -/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/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/reagent_containers/food/snacks/result = ..() - - result.color = result.filling_color - for (var/i in images) - result.add_overlay(images[i]) diff --git a/code/modules/food/machinery/appliance/fryer.dm b/code/modules/food/machinery/appliance/fryer.dm deleted file mode 100644 index 7b44b5965440..000000000000 --- a/code/modules/food/machinery/appliance/fryer.dm +++ /dev/null @@ -1,235 +0,0 @@ -/obj/machinery/appliance/cooker/fryer - name = "deep fryer" - desc = "Deep fried everything." - icon_state = "fryer_off" - can_cook_mobs = 1 - cook_type = "deep fried" - on_icon = "fryer_on" - off_icon = "fryer_off" - food_color = "#FFAD33" - cooked_sound = 'sound/machines/ding.ogg' - appliancetype = FRYER - active_power_usage = 12 KILOWATTS - - optimal_power = 0.35 - - 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 - - resistance = 10000 // Approx. 4-5 minutes to heat up. - - max_contents = 2 - container_type = /obj/item/reagent_containers/cooking_container/fryer - - machine_stat = POWEROFF//Starts turned off - - var/datum/reagents/oil - var/optimal_oil = 9000//90 litres of cooking oil - - -/obj/machinery/appliance/cooker/fryer/examine(var/mob/user) - . = ..() - . += "Oil Level: [oil.total_volume]/[optimal_oil]" - -/obj/machinery/appliance/cooker/fryer/Initialize(mapload) - . = ..() - oil = new(optimal_oil * 1.25, src) - var/variance = rand()*0.15 - //Fryer is always a little below full, but its usually negligible - - if (prob(20)) - //Sometimes the fryer will start with much less than full oil, significantly impacting efficiency until filled - //hm yes 20% of the time we will make fryers start with less this is very fun and interactive - variance = rand()*0.5 - oil.add_reagent("tallow", optimal_oil*(1 - variance)) - -/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/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 (cooking) - icon_state = on_icon - else - icon_state = off_icon - ..() - - -//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) - - -//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("\The [user] starts pushing \the [victim] into \the [src]!") - - - //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) - - if(!victim || !victim.Adjacent(user)) - to_chat(user, "Your victim slipped free!") - 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 - E = H.get_organ(user.zone_sel.selecting) - if(!E || E.species.species_flags & NO_PAIN) - nopain = 2 - else if(E.robotic >= ORGAN_ROBOT) - nopain = 1 - - user.visible_message("\The [user] shoves \the [victim][E ? "'s [E.name]" : ""] into \the [src]!") - 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.inflict_bodypart_damage( - burn = 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.take_targeted_damage( - burn = damage, - body_zone = user.zone_sel.selecting, - ) - - - if(!nopain) - to_chat(victim, "Agony consumes you as searing hot oil scorches your [E ? E.name : "flesh"] horribly!") - victim.emote("scream") - else - to_chat(victim, "Searing hot oil scorches your [E ? E.name : "flesh"]!") - - - user.attack_log += "\[[time_stamp()]\] Has [cook_type] \the [victim] ([victim.ckey]) in \a [src]" - victim.attack_log += "\[[time_stamp()]\] Has been [cook_type] in \a [src] by [user.name] ([user.ckey])" - msg_admin_attack("[key_name_admin(user)] [cook_type] \the [victim] ([victim.ckey]) in \a [src]. (JMP)") - - //Coat the victim in some oil - oil.trans_to(victim, 40) - -/obj/machinery/appliance/cooker/fryer/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/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.available_volume() - 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]."), "You hear something viscous being poured into a metal container.") - return 1 - //If neither of the above returned, then call parent as normal - ..() diff --git a/code/modules/food/machinery/appliance/grill.dm b/code/modules/food/machinery/appliance/grill.dm deleted file mode 100644 index e0af71429d66..000000000000 --- a/code/modules/food/machinery/appliance/grill.dm +++ /dev/null @@ -1,54 +0,0 @@ -/obj/machinery/appliance/cooker/grill - name = "grill" - desc = "Backyard grilling, IN SPACE." - icon_state = "grill_off" - cook_type = "grilled" - food_color = "#A34719" - on_icon = "grill_on" - off_icon = "grill_off" - can_burn_food = TRUE - var/datum/looping_sound/grill/grill_loop - active_power_usage = 4 KILOWATTS - 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. - - machine_stat = POWEROFF // Starts turned off. - - // Grill is faster to heat and setup than the rest. - optimal_temp = 120 + T0C - min_temp = 60 + T0C - resistance = 2 KILOWATTS // Very fast to heat up. - - max_contents = 3 // Arbitrary number, 3 grill 'racks' - container_type = /obj/item/reagent_containers/cooking_container/grill - -/obj/machinery/appliance/cooker/grill/Initialize(mapload) - . = ..() - grill_loop = new(list(src), FALSE) - -/obj/machinery/appliance/cooker/grill/Destroy() - QDEL_NULL(grill_loop) - return ..() - -/obj/machinery/appliance/cooker/grill/update_icon() // TODO: Cooking icon - if(!machine_stat) - icon_state = on_icon - if(cooking == TRUE) - if(grill_loop) - grill_loop.start(src) - else - if(grill_loop) - grill_loop.stop(src) - else - icon_state = off_icon - if(grill_loop) - grill_loop.stop(src) - -/obj/machinery/appliance/cooker/grill/stand - desc = "These static grills are a mainstay of any open air get-together. Modern variants use heating elements instead of charcoal." - icon_state = "standgrill_off" - food_color = "#8b3b13" - on_icon = "standgrill_on" - off_icon = "standgrill_off" - max_contents = 1 diff --git a/code/modules/food/machinery/appliance/oven.dm b/code/modules/food/machinery/appliance/oven.dm deleted file mode 100644 index 3e95c8de1c6f..000000000000 --- a/code/modules/food/machinery/appliance/oven.dm +++ /dev/null @@ -1,161 +0,0 @@ -/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 = 1 - var/datum/looping_sound/oven/oven_loop - active_power_usage = 6 KILOWATTS - //Based on a double deck electric convection oven - - resistance = 3200 - idle_power_usage = 2 KILOWATTS - //uses ~3% power to stay warm - optimal_power = 0.2 - - light_x = 2 - max_contents = 5 - container_type = /obj/item/reagent_containers/cooking_container/oven - - machine_stat = POWEROFF //Starts turned off - - var/open = TRUE - - output_options = list( - "Default" = null, - "Pizza" = /obj/item/reagent_containers/food/snacks/variable/pizza, - "Bread" = /obj/item/reagent_containers/food/snacks/variable/bread, - "Pie" = /obj/item/reagent_containers/food/snacks/variable/pie, - "Cake" = /obj/item/reagent_containers/food/snacks/variable/cake, - "Hot Pocket" = /obj/item/reagent_containers/food/snacks/variable/pocket, - "Kebab" = /obj/item/reagent_containers/food/snacks/variable/kebab, - "Waffles" = /obj/item/reagent_containers/food/snacks/variable/waffles, - "Cookie" = /obj/item/reagent_containers/food/snacks/variable/cookie, - "Donut" = /obj/item/reagent_containers/food/snacks/variable/donut - ) - - var/static/list/radial_menu = list( - "Default" = image(icon = 'icons/mob/radial.dmi', icon_state = "red_x"), - "Pizza"= image(icon = 'icons/obj/food.dmi', icon_state = "pizzamargherita"), - "Bread" = image(icon = 'icons/obj/food.dmi', icon_state = "bread"), - "Pie" = image(icon = 'icons/obj/food.dmi', icon_state = "pie"), - "Cake" = image(icon = 'icons/obj/food.dmi', icon_state = "plaincake"), - "Hot Pocket" = image(icon = 'icons/obj/food.dmi', icon_state = "donkpocket"), - "Kebab" = image(icon = 'icons/obj/food.dmi', icon_state = "kabob"), - "Waffles" = image(icon = 'icons/obj/food.dmi', icon_state = "waffles"), - "Cookie" = image(icon = 'icons/obj/food.dmi', icon_state = "COOKIE!!!"), - "Donut" = image(icon = 'icons/obj/food.dmi', icon_state = "donut1") - ) - -/obj/machinery/appliance/cooker/oven/Initialize(mapload) - . = ..() - - oven_loop = new(list(src), FALSE) - -/obj/machinery/appliance/cooker/oven/Destroy() - QDEL_NULL(oven_loop) - return ..() - -/obj/machinery/appliance/cooker/oven/update_icon() - if (!open) - if (!machine_stat) - icon_state = "ovenclosed_on" - if(oven_loop) - oven_loop.stop(src) - else - icon_state = "ovenclosed_off" - if(oven_loop) - oven_loop.stop(src) - else - icon_state = "ovenopen" - if(oven_loop) - oven_loop.stop(src) - ..() - -/obj/machinery/appliance/cooker/oven/choose_output() - set src in view() - set name = "Choose output" - set category = "Object" - - if(!can_use_check(usr)) - return - - if(output_options.len) - var/choice = show_radial_menu(usr, src, radial_menu, require_near = !issilicon(usr)) - if(!choice) - return - if(choice == "Default") - selected_option = null - to_chat(usr, "You decide not to make anything specific with \the [src].") - else - selected_option = choice - to_chat(usr, "You prepare \the [src] to make \a [selected_option] with the next thing you put in. Try putting several ingredients in a container!") - -/obj/machinery/appliance/cooker/oven/AltClick(var/mob/user) - try_toggle_door(user) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - -/obj/machinery/appliance/cooker/oven/CtrlClick(var/mob/user) - choose_output() - 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(!can_use_check(user, TRUE)) - return - - if (open) - open = FALSE - loss = (active_power_usage / resistance)*0.5 - else - open = TRUE - loss = (active_power_usage / resistance)*4 - //When the oven door is opened, heat is lost MUCH faster - - playsound(src, 'sound/machines/hatch_open.ogg', 20, 1) - update_icon() - -/obj/machinery/appliance/cooker/oven/can_insert(var/obj/item/I, var/mob/user) - if (!open) - to_chat(user, "You can't put anything in while the door is closed!") - return FALSE - - 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, "You can't take anything out while the door is closed!") - return FALSE - - 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 - combination_cook(CI) - return - else - ..() diff --git a/code/modules/food/machinery/gibber.dm b/code/modules/food/machinery/gibber.dm index c48a4a1cfc6b..ab44e1f5259a 100644 --- a/code/modules/food/machinery/gibber.dm +++ b/code/modules/food/machinery/gibber.dm @@ -182,7 +182,7 @@ var/slab_name = occupant.name var/slab_count = 3 - var/slab_type = /obj/item/reagent_containers/food/snacks/meat + var/slab_type = /obj/item/reagent_containers/food/snacks/ingredient/meat var/slab_nutrition = src.occupant.nutrition / 15 // Some mobs have specific meat item types. @@ -203,7 +203,7 @@ slab_nutrition /= slab_count for(var/i=1 to slab_count) - var/obj/item/reagent_containers/food/snacks/meat/new_meat = new slab_type(src, rand(3,8)) + var/obj/item/reagent_containers/food/snacks/ingredient/meat/new_meat = new slab_type(src, rand(3,8)) if(istype(new_meat)) new_meat.name = "[slab_name] [new_meat.name]" new_meat.reagents.add_reagent("nutriment",slab_nutrition) diff --git a/code/modules/food/machinery/microwave.dm b/code/modules/food/machinery/microwave.dm index 3b032bc0548b..856a3c52d785 100644 --- a/code/modules/food/machinery/microwave.dm +++ b/code/modules/food/machinery/microwave.dm @@ -1,6 +1,7 @@ /obj/machinery/microwave name = "Microwave" + desc = "So much more than just a microwave. The Multipurpose Irradiative Cooking/Reconstitution Operation Worker mark 4 Version 3 is capable of only two things: turning a messy pile of raw ingredients into perfectly cooked meals, and heating up donkpockets." icon = 'icons/obj/kitchen.dmi' icon_state = "mw" layer = 2.9 @@ -16,11 +17,11 @@ var/operating = 0 // Is it on? var/dirty = 0 // = {0..100} Does it need cleaning? var/broken = 0 // ={0,1,2} How broken is it??? - var/global/list/datum/recipe/available_recipes // List of the recipes you can use + var/global/list/datum/cooking_recipe/available_recipes // List of the recipes you can use var/global/list/acceptable_items // List of the items you can put in var/global/list/acceptable_reagents // List of the reagents you can put in var/global/max_n_of_items = 20 - var/appliancetype = MICROWAVE + var/appliancetype = METHOD_MICROWAVE // see code/modules/food/recipes_microwave.dm for recipes @@ -34,15 +35,15 @@ reagents.my_atom = src if (!available_recipes) available_recipes = new - for (var/type in (typesof(/datum/recipe)-/datum/recipe)) - var/datum/recipe/test = new type - if ((test.appliance & appliancetype)) + for (var/type in (typesof(/datum/cooking_recipe)-/datum/cooking_recipe)) + var/datum/cooking_recipe/test = new type + if((test.required_method == appliancetype)) available_recipes += test else qdel(test) acceptable_items = new acceptable_reagents = new - for (var/datum/recipe/recipe in available_recipes) + for (var/datum/cooking_recipe/recipe in available_recipes) for (var/item in recipe.items) acceptable_items |= item for (var/reagent in recipe.reagents) @@ -51,7 +52,7 @@ // will also allow anything using the holder item to be microwaved into // impure carbon. ~Z acceptable_items |= /obj/item/holder - acceptable_items |= /obj/item/reagent_containers/food/snacks/grown + acceptable_items |= /obj/item/reagent_containers/food/snacks/ingredient/grown /******************* * Item Adding @@ -184,20 +185,20 @@ var/list/items_measures_p = new for (var/obj/O in contents) var/display_name = O.name - if (istype(O,/obj/item/reagent_containers/food/snacks/egg)) + if (istype(O,/obj/item/reagent_containers/food/snacks/ingredient/egg)) items_measures[display_name] = "egg" items_measures_p[display_name] = "eggs" - if (istype(O,/obj/item/reagent_containers/food/snacks/tofu)) + if (istype(O,/obj/item/reagent_containers/food/snacks/ingredient/tofu)) items_measures[display_name] = "tofu chunk" items_measures_p[display_name] = "tofu chunks" - if (istype(O,/obj/item/reagent_containers/food/snacks/meat)) //any meat + if (istype(O,/obj/item/reagent_containers/food/snacks/ingredient/meat)) //any meat items_measures[display_name] = "slab of meat" items_measures_p[display_name] = "slabs of meat" if (istype(O,/obj/item/reagent_containers/food/snacks/donkpocket)) display_name = "Turnovers" items_measures[display_name] = "turnover" items_measures_p[display_name] = "turnovers" - if (istype(O,/obj/item/reagent_containers/food/snacks/carpmeat)) + if (istype(O,/obj/item/reagent_containers/food/snacks/ingredient/carp)) items_measures[display_name] = "fillet of meat" items_measures_p[display_name] = "fillets of meat" items_counts[display_name]++ @@ -251,7 +252,7 @@ stop() return - var/datum/recipe/recipe = select_recipe(available_recipes,src) + var/datum/cooking_recipe/recipe = select_recipe(available_recipes,src, available_method = METHOD_MICROWAVE) var/obj/cooked if (!recipe) dirty += 1 @@ -297,17 +298,12 @@ 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) + cooked_items.Add(recipe.make_food(src, null)) valid = 0 - recipe = select_recipe(available_recipes,src) + recipe = select_recipe(available_recipes,src, available_method = METHOD_MICROWAVE) if (recipe && recipe.result == result) sleep(2) valid = 1 @@ -316,8 +312,6 @@ 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/reagent_containers/food/snacks/S in cooked_items) @@ -336,7 +330,7 @@ if (machine_stat & (NOPOWER|BROKEN)) return 0 use_power(active_power_usage) - sleep(10) + sleep(1 SECOND) return 1 /obj/machinery/microwave/proc/has_extra_item() diff --git a/code/modules/food/machinery/smartfridge.dm b/code/modules/food/machinery/smartfridge.dm index bfa4a59d7a46..d3a5a5b1bd09 100644 --- a/code/modules/food/machinery/smartfridge.dm +++ b/code/modules/food/machinery/smartfridge.dm @@ -23,7 +23,7 @@ var/scan_id = 1 var/is_secure = 0 var/wrenchable = TRUE - var/list/accepted_types = list(/obj/item/reagent_containers/food/snacks/grown/) + var/list/accepted_types = list(/obj/item/reagent_containers/food/snacks/ingredient/grown/) var/list/blacklisted_types = list() var/datum/wires/smartfridge/wires = null var/icon_contents = "food" @@ -348,7 +348,7 @@ icon_state = "fridge_food" desc = "A climated storage for dishes waiting to be eaten" accepted_types = list(/obj/item/reagent_containers/food/snacks/, /obj/item/reagent_containers/food/condiment/) - blacklisted_types = list(/obj/item/reagent_containers/food/snacks/grown/) + blacklisted_types = list(/obj/item/reagent_containers/food/snacks/ingredient/grown/) /obj/machinery/smartfridge/drying_rack diff --git a/code/modules/food/recipe_dump.dm b/code/modules/food/recipe_dump.dm index c0ac61f26d8a..2660e1e41cba 100644 --- a/code/modules/food/recipe_dump.dm +++ b/code/modules/food/recipe_dump.dm @@ -16,11 +16,11 @@ qdel(CR) //////////////////////// FOOD - var/list/food_recipes = typesof(/datum/recipe) - /datum/recipe + var/list/food_recipes = typesof(/datum/cooking_recipe) - /datum/cooking_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. - var/datum/recipe/R = new Rp() + var/datum/cooking_recipe/R = new Rp() var/obj/res = new R.result() var/icon/result_icon = icon(res.icon,res.icon_state) @@ -32,7 +32,7 @@ "Reagents" = R.reagents, "Fruit" = R.fruit, "Ingredients" = R.items, - "Appliance" = R.appliance, + "Required method" = R.required_method, "Image" = result_icon ) qdel(res) diff --git a/code/modules/food/recipes_fryer.dm b/code/modules/food/recipes_fryer.dm index 7a7923669eb4..dbe0bc2e9c4a 100644 --- a/code/modules/food/recipes_fryer.dm +++ b/code/modules/food/recipes_fryer.dm @@ -1,197 +1,217 @@ -/datum/recipe/fries - appliance = FRYER +/datum/cooking_recipe/fries + required_method = METHOD_DEEPFRY items = list( - /obj/item/reagent_containers/food/snacks/rawsticks + /obj/item/reagent_containers/food/snacks/ingredient/rawsticks = 100 ) result = /obj/item/reagent_containers/food/snacks/fries -/datum/recipe/dishofries - appliance = FRYER - fruit = list("disho" = 1) - coating = /datum/reagent/nutriment/coating/batter +/datum/cooking_recipe/dishofries + required_method = METHOD_DEEPFRY + fruit = list("disho" = 100) + reagents = list("batter" = 5) result = /obj/item/reagent_containers/food/snacks/dishofries -/datum/recipe/jpoppers - appliance = FRYER - fruit = list("chili" = 1) - coating = /datum/reagent/nutriment/coating/batter +/datum/cooking_recipe/jpoppers + required_method = METHOD_DEEPFRY + fruit = list("chili" = 100) + reagents = list("batter" = 5) result = /obj/item/reagent_containers/food/snacks/jalapeno_poppers -/datum/recipe/risottoballs - appliance = FRYER - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) +/datum/cooking_recipe/risottoballs + required_method = METHOD_DEEPFRY + reagents = list("sodiumchloride" = 1, "blackpepper" = 1, "batter" = 5) items = list(/obj/item/reagent_containers/food/snacks/risotto) - coating = /datum/reagent/nutriment/coating/batter reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product result = /obj/item/reagent_containers/food/snacks/risottoballs //Meaty Recipes //==================== -/datum/recipe/cubancarp - appliance = FRYER - fruit = list("chili" = 1) +/datum/cooking_recipe/cubancarp + required_method = METHOD_DEEPFRY + fruit = list("chili" = 50) items = list( - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/carpmeat + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough = 100, + /obj/item/reagent_containers/food/snacks/ingredient/carp = 100 ) result = /obj/item/reagent_containers/food/snacks/cubancarp -/datum/recipe/batteredsausage - appliance = FRYER +/datum/cooking_recipe/batteredsausage + required_method = METHOD_DEEPFRY items = list( - /obj/item/reagent_containers/food/snacks/sausage + /obj/item/reagent_containers/food/snacks/ingredient/sausage = 100 ) result = /obj/item/reagent_containers/food/snacks/sausage/battered - coating = /datum/reagent/nutriment/coating/batter + reagents = list("batter" = 5) -/datum/recipe/katsu - appliance = FRYER +/datum/cooking_recipe/katsu + required_method = METHOD_DEEPFRY items = list( - /obj/item/reagent_containers/food/snacks/meat/chicken + /obj/item/reagent_containers/food/snacks/ingredient/meat/chicken = 100 ) result = /obj/item/reagent_containers/food/snacks/chickenkatsu - coating = /datum/reagent/nutriment/coating/beerbatter + reagents = list("beerbatter" = 5) -/datum/recipe/pizzacrunch_1 - appliance = FRYER +/datum/cooking_recipe/pizzacrunch_1 + required_method = METHOD_DEEPFRY items = list( /obj/item/reagent_containers/food/snacks/sliceable/pizza ) result = /obj/item/reagent_containers/food/snacks/sliceable/pizza/crunch - coating = /datum/reagent/nutriment/coating/batter + reagents = list("batter" = 5) //Alternate pizza crunch recipe for combination pizzas made in oven -/datum/recipe/pizzacrunch_2 - appliance = FRYER +/datum/cooking_recipe/pizzacrunch_2 + required_method = METHOD_DEEPFRY items = list( /obj/item/reagent_containers/food/snacks/variable/pizza ) result = /obj/item/reagent_containers/food/snacks/sliceable/pizza/crunch - coating = /datum/reagent/nutriment/coating/batter + reagents = list("batter" = 5) -/datum/recipe/friedmushroom - appliance = FRYER - fruit = list("plumphelmet" = 1) - coating = /datum/reagent/nutriment/coating/beerbatter +/datum/cooking_recipe/friedmushroom + required_method = METHOD_DEEPFRY + fruit = list("plumphelmet" = 100) + reagents = list("beerbatter" = 5) reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product result = /obj/item/reagent_containers/food/snacks/friedmushroom -/datum/recipe/shrimptempura - appliance = FRYER - reagents = list("sodiumchloride" = 2) +/datum/cooking_recipe/shrimptempura + required_method = METHOD_DEEPFRY + reagents = list("sodiumchloride" = 2, "batter" = 5) items = list( - /obj/item/reagent_containers/food/snacks/shrimp + /obj/item/reagent_containers/food/snacks/ingredient/shrimp = 100 ) - coating = /datum/reagent/nutriment/coating/batter result = /obj/item/reagent_containers/food/snacks/shrimptempura //Sweet Recipes. //================== -/datum/recipe/jellydonut - appliance = FRYER - reagents = list("berryjuice" = 10, "sugar" = 10) +/datum/cooking_recipe/jellydonut + required_method = METHOD_DEEPFRY + reagents = list("berryjuice" = 10, "sugar" = 10, "batter" = 5) items = list( - /obj/item/reagent_containers/food/snacks/doughslice + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice = 20 ) result = /obj/item/reagent_containers/food/snacks/donut/jelly result_quantity = 2 -/datum/recipe/jellydonut/slime - appliance = FRYER - reagents = list("slimejelly" = 10, "sugar" = 10) +/datum/cooking_recipe/jellydonut/slime + required_method = METHOD_DEEPFRY + reagents = list("slimejelly" = 10, "sugar" = 10, "batter" = 5) result = /obj/item/reagent_containers/food/snacks/donut/slimejelly -/datum/recipe/jellydonut/cherry - appliance = FRYER - reagents = list("cherryjelly" = 10, "sugar" = 10) +/datum/cooking_recipe/jellydonut/cherry + required_method = METHOD_DEEPFRY + reagents = list("cherryjelly" = 10, "sugar" = 10, "batter" = 5) result = /obj/item/reagent_containers/food/snacks/donut/cherryjelly -/datum/recipe/donut - appliance = FRYER - reagents = list("sugar" = 10) +/datum/cooking_recipe/donut + required_method = METHOD_DEEPFRY + reagents = list("sugar" = 10, "batter" = 5) items = list( - /obj/item/reagent_containers/food/snacks/doughslice + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice = 20 ) result = /obj/item/reagent_containers/food/snacks/donut/normal result_quantity = 2 -/datum/recipe/chaosdonut - appliance = FRYER - reagents = list("frostoil" = 10, "capsaicin" = 10, "sugar" = 10) +/datum/cooking_recipe/chaosdonut + required_method = METHOD_DEEPFRY + reagents = list("frostoil" = 10, "capsaicin" = 10, "sugar" = 10, "batter" = 5) reagent_mix = RECIPE_REAGENT_REPLACE //This creates its own reagents items = list( - /obj/item/reagent_containers/food/snacks/doughslice + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice = 40 ) result = /obj/item/reagent_containers/food/snacks/donut/chaos result_quantity = 2 -/datum/recipe/funnelcake - appliance = FRYER +/datum/cooking_recipe/funnelcake + required_method = METHOD_DEEPFRY reagents = list("sugar" = 5, "batter" = 10) result = /obj/item/reagent_containers/food/snacks/funnelcake -/datum/recipe/pisanggoreng - appliance = FRYER - fruit = list("banana" = 2) +/datum/cooking_recipe/pisanggoreng + required_method = METHOD_DEEPFRY + fruit = list("banana" = 200) + reagents = list("batter" = 5) reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product result = /obj/item/reagent_containers/food/snacks/pisanggoreng - coating = /datum/reagent/nutriment/coating/batter -/datum/recipe/corn_dog - appliance = FRYER + +/datum/cooking_recipe/corn_dog + required_method = METHOD_DEEPFRY items = list( - /obj/item/reagent_containers/food/snacks/sausage + /obj/item/reagent_containers/food/snacks/ingredient/sausage = 100 ) - fruit = list("corn" = 1) - coating = /datum/reagent/nutriment/coating/batter + fruit = list("corn" = 100) + reagents = list("batter" = 5) result = /obj/item/reagent_containers/food/snacks/corn_dog -/datum/recipe/sweet_and_sour - appliance = FRYER +/datum/cooking_recipe/sweet_and_sour + required_method = METHOD_DEEPFRY items = list( - /obj/item/reagent_containers/food/snacks/bacon, - /obj/item/reagent_containers/food/snacks/cutlet + /obj/item/reagent_containers/food/snacks/ingredient/bacon = 100, + /obj/item/reagent_containers/food/snacks/ingredient/cutlet = 100 ) reagents = list("soysauce" = 5, "batter" = 10) result = /obj/item/reagent_containers/food/snacks/sweet_and_sour -/datum/recipe/generalschicken - appliance = FRYER +/datum/cooking_recipe/generalschicken + required_method = METHOD_DEEPFRY reagents = list("capsaicin" = 2, "sugar" = 2, "batter" = 10) items = list( - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat + /obj/item/reagent_containers/food/snacks/ingredient/meat = 200 ) result = /obj/item/reagent_containers/food/snacks/generalschicken -/datum/recipe/chickenwings - appliance = FRYER +/datum/cooking_recipe/chickenwings + required_method = METHOD_DEEPFRY reagents = list("capsaicin" = 5, "batter" = 10) items = list( - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat + /obj/item/reagent_containers/food/snacks/ingredient/meat = 400 ) result = /obj/item/storage/box/wings //This is kinda like the donut box. -/datum/recipe/schnitzel - appliance = FRYER +/datum/cooking_recipe/schnitzel + required_method = METHOD_DEEPFRY reagents = list("sodiumchloride" = 1, "blackpepper" = 1, "batter" = 10) - fruit = list("onion" = 1) + fruit = list("onion" = 20) items = list( - /obj/item/reagent_containers/food/snacks/cutlet, - /obj/item/reagent_containers/food/snacks/cutlet + /obj/item/reagent_containers/food/snacks/ingredient/cutlet = 200 ) result = /obj/item/reagent_containers/food/snacks/schnitzel -/datum/recipe/churro - appliance = FRYER +/datum/cooking_recipe/churro + required_method = METHOD_DEEPFRY reagents = list("sugar" = 5, "batter" = 10) items = list( - /obj/item/reagent_containers/food/snacks/dough + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough = 100 ) result = /obj/item/reagent_containers/food/snacks/churro + +/datum/cooking_recipe/nugget + required_method = METHOD_DEEPFRY + reagents = list("flour" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/meat/chicken = 10 + ) + reagent_mix = RECIPE_REAGENT_REPLACE + result = /obj/item/reagent_containers/food/snacks/nugget + +/datum/cooking_recipe/onionrings + required_method = METHOD_DEEPFRY + fruit = list("onion" = 100) + reagents = list("batter" = 5) + result = /obj/item/reagent_containers/food/snacks/onionrings + +//Goblin Food Goblin Food +/datum/cooking_recipe/cavenuggets + required_method = METHOD_DEEPFRY + fruit = list("mushroom" = 100) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/meatball = 100, + /obj/item/reagent_containers/food/snacks/ingredient/meat/grubmeat = 100, + /obj/item/reagent_containers/food/snacks/spreads/butter + ) + result = /obj/item/reagent_containers/food/snacks/cavenuggets diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index d1fd26870910..ffe90e722f59 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -1,1448 +1,609 @@ - -// see code/datums/recipe.dm - -/datum/recipe/friedegg - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/egg - ) - result = /obj/item/reagent_containers/food/snacks/friedegg - -/datum/recipe/boiledegg - reagents = list("water" = 5) - reagent_mix = RECIPE_REAGENT_REPLACE +/* commented recipes will be annihilated once 100% sure that culinary_construct is a complete replacement for them +/datum/cooking_recipe/humanburger items = list( - /obj/item/reagent_containers/food/snacks/egg - ) - result = /obj/item/reagent_containers/food/snacks/boiledegg - -/datum/recipe/humanburger - items = list( - /obj/item/reagent_containers/food/snacks/meat/human, - /obj/item/reagent_containers/food/snacks/bun + /obj/item/reagent_containers/food/snacks/ingredient/meat/human = 100, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100 ) result = /obj/item/reagent_containers/food/snacks/human/burger -/datum/recipe/plainburger +/datum/cooking_recipe/plainburger items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/meat //do not place this recipe before /datum/recipe/humanburger + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, + /obj/item/reagent_containers/food/snacks/ingredient/meat = 100 //do not place this recipe before /datum/cooking_recipe/humanburger ) result = /obj/item/reagent_containers/food/snacks/monkeyburger -/datum/recipe/syntiburger +/datum/cooking_recipe/syntiburger items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/meat/syntiflesh + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, + /obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh = 100 ) result = /obj/item/reagent_containers/food/snacks/monkeyburger -/datum/recipe/brainburger +/datum/cooking_recipe/brainburger items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/organ/internal/brain ) result = /obj/item/reagent_containers/food/snacks/brainburger -/datum/recipe/roburger +/datum/cooking_recipe/roburger items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/robot_parts/head ) result = /obj/item/reagent_containers/food/snacks/roburger -/datum/recipe/xenoburger +/datum/cooking_recipe/xenoburger items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/xenomeat + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, + /obj/item/reagent_containers/food/snacks/ingredient/xenomeat = 100 ) result = /obj/item/reagent_containers/food/snacks/xenoburger -/datum/recipe/fishburger +/datum/cooking_recipe/fishburger items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/carpmeat + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, + /obj/item/reagent_containers/food/snacks/ingredient/carp = 100 ) result = /obj/item/reagent_containers/food/snacks/fishburger -/datum/recipe/tofuburger +/datum/cooking_recipe/tofuburger items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/tofu + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, + /obj/item/reagent_containers/food/snacks/ingredient/tofu = 100 ) result = /obj/item/reagent_containers/food/snacks/tofuburger -/datum/recipe/ghostburger +/datum/cooking_recipe/ghostburger items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/ectoplasm //where do you even find this stuff ) result = /obj/item/reagent_containers/food/snacks/ghostburger -/datum/recipe/clownburger +/datum/cooking_recipe/clownburger items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/clothing/mask/gas/clown_hat ) result = /obj/item/reagent_containers/food/snacks/clownburger -/datum/recipe/mimeburger +/datum/cooking_recipe/mimeburger items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/clothing/head/beret ) result = /obj/item/reagent_containers/food/snacks/mimeburger -/datum/recipe/mouseburger +/datum/cooking_recipe/mouseburger items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/holder/mouse ) result = /obj/item/reagent_containers/food/snacks/mouseburger -/datum/recipe/lizardburger +/datum/cooking_recipe/lizardburger items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/holder/micro ) result = /obj/item/reagent_containers/food/snacks/lizardburger -/datum/recipe/hotdog - items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/sausage - ) - result = /obj/item/reagent_containers/food/snacks/hotdog - -/datum/recipe/waffles - reagents = list("sugar" = 10) - items = list( - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough - ) - result = /obj/item/reagent_containers/food/snacks/waffles - -/datum/recipe/donkpocket - items = list( - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/meatball - ) - result = /obj/item/reagent_containers/food/snacks/donkpocket //SPECIAL - -/datum/recipe/donkpocket/proc/warm_up(obj/item/reagent_containers/food/snacks/donkpocket/being_cooked) - being_cooked.heat() - -/datum/recipe/donkpocket/make_food(obj/container) - . = ..(container) - for (var/obj/item/reagent_containers/food/snacks/donkpocket/D in .) - if (!D.warm) - warm_up(D) - -/datum/recipe/donkpocket/warm - reagents = list() //This is necessary since this is a child object of the above recipe and we don't want donk pockets to need flour - items = list( - /obj/item/reagent_containers/food/snacks/donkpocket - ) - result = /obj/item/reagent_containers/food/snacks/donkpocket //SPECIAL - - - -/datum/recipe/omelette - items = list( - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - reagents = list("egg" = 6) - reagent_mix = RECIPE_REAGENT_REPLACE - result = /obj/item/reagent_containers/food/snacks/omelette - -/datum/recipe/muffin - reagents = list("milk" = 5, "sugar" = 5) - reagent_mix = RECIPE_REAGENT_REPLACE - items = list( - /obj/item/reagent_containers/food/snacks/dough - ) - result = /obj/item/reagent_containers/food/snacks/muffin - -/datum/recipe/eggplantparm - fruit = list("eggplant" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/reagent_containers/food/snacks/eggplantparm - -/datum/recipe/soylenviridians - fruit = list("soybeans" = 1) - reagents = list("flour" = 10) - reagent_mix = RECIPE_REAGENT_REPLACE - result = /obj/item/reagent_containers/food/snacks/soylenviridians - -/datum/recipe/soylentgreen - reagents = list("flour" = 10) - reagent_mix = RECIPE_REAGENT_REPLACE - items = list( - /obj/item/reagent_containers/food/snacks/meat/human, - /obj/item/reagent_containers/food/snacks/meat/human - ) - result = /obj/item/reagent_containers/food/snacks/soylentgreen - -/datum/recipe/berryclafoutis - fruit = list("berries" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough - ) - result = /obj/item/reagent_containers/food/snacks/berryclafoutis - -/datum/recipe/wingfangchu - reagents = list("soysauce" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/xenomeat - ) - result = /obj/item/reagent_containers/food/snacks/wingfangchu - -/datum/recipe/humankabob +/datum/cooking_recipe/humankabob items = list( /obj/item/stack/rods, - /obj/item/reagent_containers/food/snacks/meat/human, - /obj/item/reagent_containers/food/snacks/meat/human + /obj/item/reagent_containers/food/snacks/ingredient/meat/human = 200 ) result = /obj/item/reagent_containers/food/snacks/human/kabob -/datum/recipe/monkeykabob - items = list( - /obj/item/stack/rods, - /obj/item/reagent_containers/food/snacks/meat/monkey, - /obj/item/reagent_containers/food/snacks/meat/monkey - ) - result = /obj/item/reagent_containers/food/snacks/monkeykabob - -/datum/recipe/meatkabob +/datum/cooking_recipe/monkeykabob items = list( /obj/item/stack/rods, - /obj/item/reagent_containers/food/snacks/meatsteak, - /obj/item/reagent_containers/food/snacks/meatsteak - ) - result = /obj/item/reagent_containers/food/snacks/meatkabob - -/datum/recipe/syntikabob - items = list( - /obj/item/stack/rods, - /obj/item/reagent_containers/food/snacks/meat/syntiflesh, - /obj/item/reagent_containers/food/snacks/meat/syntiflesh - ) - result = /obj/item/reagent_containers/food/snacks/monkeykabob - -/datum/recipe/tofukabob - items = list( - /obj/item/stack/rods, - /obj/item/reagent_containers/food/snacks/tofu, - /obj/item/reagent_containers/food/snacks/tofu - ) - result = /obj/item/reagent_containers/food/snacks/tofukabob - - - -/datum/recipe/loadedbakedpotato - fruit = list("potato" = 1) - items = list(/obj/item/reagent_containers/food/snacks/cheesewedge) - result = /obj/item/reagent_containers/food/snacks/loadedbakedpotato - -/datum/recipe/microchips - appliance = MICROWAVE - items = list( - /obj/item/reagent_containers/food/snacks/rawsticks - ) - result = /obj/item/reagent_containers/food/snacks/microchips - -/datum/recipe/cheesyfries - items = list( - /obj/item/reagent_containers/food/snacks/fries, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/reagent_containers/food/snacks/cheesyfries - - - -/datum/recipe/popcorn - fruit = list("corn" = 1) - result = /obj/item/reagent_containers/food/snacks/popcorn - - - -/datum/recipe/meatsteak - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) - items = list(/obj/item/reagent_containers/food/snacks/meat) - result = /obj/item/reagent_containers/food/snacks/meatsteak - -/datum/recipe/syntisteak - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) - items = list(/obj/item/reagent_containers/food/snacks/meat/syntiflesh) - result = /obj/item/reagent_containers/food/snacks/meatsteak - - - -/datum/recipe/spacylibertyduff - reagents = list("water" = 5, "vodka" = 5, "psilocybin" = 5) - result = /obj/item/reagent_containers/food/snacks/spacylibertyduff - -/datum/recipe/amanitajelly - reagents = list("water" = 5, "vodka" = 5, "amatoxin" = 5) - result = /obj/item/reagent_containers/food/snacks/amanitajelly - -/datum/recipe/amanitajelly/make_food(obj/container) - . = ..(container) - for (var/obj/item/reagent_containers/food/snacks/amanitajelly/being_cooked in .) - being_cooked.reagents.del_reagent("amatoxin") - -/datum/recipe/meatballsoup - fruit = list("carrot" = 1, "potato" = 1) - reagents = list("water" = 10) - items = list(/obj/item/reagent_containers/food/snacks/meatball) - result = /obj/item/reagent_containers/food/snacks/meatballsoup - -/datum/recipe/vegetablesoup - fruit = list("carrot" = 1, "potato" = 1, "corn" = 1, "eggplant" = 1) - reagents = list("water" = 10) - result = /obj/item/reagent_containers/food/snacks/vegetablesoup - -/datum/recipe/nettlesoup - fruit = list("nettle" = 1, "potato" = 1, ) - reagents = list("water" = 10, "egg" = 3) - result = /obj/item/reagent_containers/food/snacks/nettlesoup - -/datum/recipe/wishsoup - reagents = list("water" = 20) - result= /obj/item/reagent_containers/food/snacks/wishsoup - -/datum/recipe/hotchili - fruit = list("chili" = 1, "tomato" = 1) - items = list(/obj/item/reagent_containers/food/snacks/meat) - result = /obj/item/reagent_containers/food/snacks/hotchili - -/datum/recipe/coldchili - fruit = list("icechili" = 1, "tomato" = 1) - items = list(/obj/item/reagent_containers/food/snacks/meat) - result = /obj/item/reagent_containers/food/snacks/coldchili - - - -/datum/recipe/spellburger - items = list( - /obj/item/reagent_containers/food/snacks/monkeyburger, - /obj/item/clothing/head/wizard - ) - result = /obj/item/reagent_containers/food/snacks/spellburger - -/datum/recipe/bigbiteburger - items = list( - /obj/item/reagent_containers/food/snacks/monkeyburger, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat - ) - reagents = list("egg" = 3) - reagent_mix = RECIPE_REAGENT_REPLACE - result = /obj/item/reagent_containers/food/snacks/bigbiteburger - -/datum/recipe/fishandchips - items = list( - /obj/item/reagent_containers/food/snacks/fries, - /obj/item/reagent_containers/food/snacks/carpmeat - ) - result = /obj/item/reagent_containers/food/snacks/fishandchips - -/datum/recipe/sandwich - items = list( - /obj/item/reagent_containers/food/snacks/meatsteak, - /obj/item/reagent_containers/food/snacks/slice/bread, - /obj/item/reagent_containers/food/snacks/slice/bread, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/reagent_containers/food/snacks/sandwich - -/datum/recipe/toastedsandwich - items = list( - /obj/item/reagent_containers/food/snacks/sandwich - ) - result = /obj/item/reagent_containers/food/snacks/toastedsandwich - -/datum/recipe/grilledcheese - items = list( - /obj/item/reagent_containers/food/snacks/slice/bread, - /obj/item/reagent_containers/food/snacks/slice/bread, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/reagent_containers/food/snacks/grilledcheese - -/datum/recipe/tomatosoup - fruit = list("tomato" = 2) - reagents = list("water" = 10) - result = /obj/item/reagent_containers/food/snacks/tomatosoup - -/datum/recipe/rofflewaffles - reagents = list("psilocybin" = 5, "sugar" = 10) - items = list( - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough - ) - result = /obj/item/reagent_containers/food/snacks/rofflewaffles - -/datum/recipe/stew - fruit = list("potato" = 1, "tomato" = 1, "carrot" = 1, "eggplant" = 1, "mushroom" = 1) - reagents = list("water" = 10) - items = list(/obj/item/reagent_containers/food/snacks/meat) - result = /obj/item/reagent_containers/food/snacks/stew - -/datum/recipe/dishostew - fruit = list("disho" = 3, "mushroom" = 2, "chili" = 1) - reagents = list("water" = 10) - result = /obj/item/reagent_containers/food/snacks/dishostew - -/datum/recipe/slimetoast - reagents = list("slimejelly" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/slice/bread - ) - result = /obj/item/reagent_containers/food/snacks/jelliedtoast/slime - -/datum/recipe/jelliedtoast - reagents = list("cherryjelly" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/slice/bread - ) - result = /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry - -/datum/recipe/milosoup - reagents = list("water" = 10) - items = list( - /obj/item/reagent_containers/food/snacks/soydope, - /obj/item/reagent_containers/food/snacks/soydope, - /obj/item/reagent_containers/food/snacks/tofu, - /obj/item/reagent_containers/food/snacks/tofu - ) - result = /obj/item/reagent_containers/food/snacks/milosoup - -/datum/recipe/stewedsoymeat - fruit = list("carrot" = 1, "tomato" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/soydope, - /obj/item/reagent_containers/food/snacks/soydope - ) - result = /obj/item/reagent_containers/food/snacks/stewedsoymeat - -/*/datum/recipe/spagetti We have the processor now - items = list( - /obj/item/reagent_containers/food/snacks/doughslice - ) - result= /obj/item/reagent_containers/food/snacks/spagetti*/ - -/datum/recipe/boiledspagetti - reagents = list("water" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/spagetti - ) - result = /obj/item/reagent_containers/food/snacks/boiledspagetti - -/datum/recipe/boiledrice - reagents = list("water" = 5, "rice" = 10) - result = /obj/item/reagent_containers/food/snacks/boiledrice - -/datum/recipe/ricepudding - reagents = list("milk" = 5, "rice" = 10) - result = /obj/item/reagent_containers/food/snacks/ricepudding - -/datum/recipe/pastatomato - fruit = list("tomato" = 2) - reagents = list("water" = 5) - items = list(/obj/item/reagent_containers/food/snacks/spagetti) - result = /obj/item/reagent_containers/food/snacks/pastatomato - -/datum/recipe/meatballspagetti - reagents = list("water" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/spagetti, - /obj/item/reagent_containers/food/snacks/meatball, - /obj/item/reagent_containers/food/snacks/meatball - ) - result = /obj/item/reagent_containers/food/snacks/meatballspagetti - -/datum/recipe/spesslaw - reagents = list("water" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/spagetti, - /obj/item/reagent_containers/food/snacks/meatball, - /obj/item/reagent_containers/food/snacks/meatball, - /obj/item/reagent_containers/food/snacks/meatball, - /obj/item/reagent_containers/food/snacks/meatball - ) - result = /obj/item/reagent_containers/food/snacks/spesslaw - -/datum/recipe/superbiteburger - fruit = list("tomato" = 1) - reagents = list("sodiumchloride" = 5, "blackpepper" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/bigbiteburger, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/boiledegg - ) - result = /obj/item/reagent_containers/food/snacks/superbiteburger - -/datum/recipe/candiedapple - fruit = list("apple" = 1) - reagents = list("water" = 5, "sugar" = 5) - result = /obj/item/reagent_containers/food/snacks/candiedapple - -/datum/recipe/applepie - fruit = list("apple" = 1) - items = list(/obj/item/reagent_containers/food/snacks/sliceable/flatdough) - result = /obj/item/reagent_containers/food/snacks/applepie - -/datum/recipe/slimeburger - reagents = list("slimejelly" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/bun - ) - result = /obj/item/reagent_containers/food/snacks/jellyburger/slime - -/datum/recipe/jellyburger - reagents = list("cherryjelly" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/bun - ) - result = /obj/item/reagent_containers/food/snacks/jellyburger/cherry - -/datum/recipe/twobread - reagents = list("wine" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/slice/bread, - /obj/item/reagent_containers/food/snacks/slice/bread - ) - result = /obj/item/reagent_containers/food/snacks/twobread - -/datum/recipe/slimesandwich - reagents = list("slimejelly" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/slice/bread, - /obj/item/reagent_containers/food/snacks/slice/bread - ) - result = /obj/item/reagent_containers/food/snacks/jellysandwich/slime - -/datum/recipe/cherrysandwich - reagents = list("cherryjelly" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/slice/bread, - /obj/item/reagent_containers/food/snacks/slice/bread - ) - result = /obj/item/reagent_containers/food/snacks/jellysandwich/cherry - -/datum/recipe/bloodsoup - reagents = list("blood" = 30) - result = /obj/item/reagent_containers/food/snacks/bloodsoup - -/datum/recipe/slimesoup - reagents = list("water" = 10, "slimejelly" = 5) - items = list() - result = /obj/item/reagent_containers/food/snacks/slimesoup - -/datum/recipe/boiledslimeextract - reagents = list("water" = 5) - items = list( - /obj/item/slime_extract - ) - result = /obj/item/reagent_containers/food/snacks/boiledslimecore - -/datum/recipe/chocolateegg - items = list( - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/chocolatebar - ) - result = /obj/item/reagent_containers/food/snacks/chocolateegg - -/datum/recipe/sausage - items = list( - /obj/item/reagent_containers/food/snacks/meatball, - /obj/item/reagent_containers/food/snacks/cutlet - ) - result = /obj/item/reagent_containers/food/snacks/sausage - result_quantity = 2 - -/datum/recipe/fishfingers - reagents = list("flour" = 10,"egg" = 3) - items = list( - /obj/item/reagent_containers/food/snacks/carpmeat - ) - result = /obj/item/reagent_containers/food/snacks/fishfingers - reagent_mix = RECIPE_REAGENT_REPLACE - -/datum/recipe/mysterysoup - reagents = list("water" = 10, "egg" = 3) - items = list( - /obj/item/reagent_containers/food/snacks/badrecipe, - /obj/item/reagent_containers/food/snacks/tofu, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - reagent_mix = RECIPE_REAGENT_REPLACE - result = /obj/item/reagent_containers/food/snacks/mysterysoup - - - -/datum/recipe/plumphelmetbiscuit - fruit = list("plumphelmet" = 1) - reagents = list("water" = 5, "flour" = 5) - result = /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit - -/datum/recipe/mushroomsoup - fruit = list("mushroom" = 1) - reagents = list("water" = 5, "milk" = 5) - reagent_mix = RECIPE_REAGENT_REPLACE - result = /obj/item/reagent_containers/food/snacks/mushroomsoup - -/datum/recipe/chawanmushi - fruit = list("mushroom" = 1) - reagents = list("water" = 5, "soysauce" = 5, "egg" = 6) - reagent_mix = RECIPE_REAGENT_REPLACE - result = /obj/item/reagent_containers/food/snacks/chawanmushi - -/datum/recipe/beetsoup - fruit = list("whitebeet" = 1, "cabbage" = 1) - reagents = list("water" = 10) - result = /obj/item/reagent_containers/food/snacks/beetsoup - -/datum/recipe/dishosoup - fruit = list("disho" = 1) - reagents = list("water" = 10) - result = /obj/item/reagent_containers/food/snacks/dishosoup - -/datum/recipe/tossedsalad - fruit = list("cabbage" = 2, "tomato" = 1, "carrot" = 1, "apple" = 1) - result = /obj/item/reagent_containers/food/snacks/tossedsalad - -/datum/recipe/aesirsalad - fruit = list("goldapple" = 1, "ambrosiadeus" = 1) - result = /obj/item/reagent_containers/food/snacks/aesirsalad - -/datum/recipe/validsalad - fruit = list("potato" = 1, "ambrosia" = 3) - items = list(/obj/item/reagent_containers/food/snacks/meatball) - result = /obj/item/reagent_containers/food/snacks/validsalad - -/datum/recipe/validsalad/make_food(obj/container) - . = ..(container) - for (var/obj/item/reagent_containers/food/snacks/validsalad/being_cooked in .) - being_cooked.reagents.del_reagent("toxin") - - -/datum/recipe/stuffing - reagents = list("water" = 5, "sodiumchloride" = 1, "blackpepper" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/sliceable/bread - ) - result = /obj/item/reagent_containers/food/snacks/stuffing - -/datum/recipe/tofurkey - items = list( - /obj/item/reagent_containers/food/snacks/tofu, - /obj/item/reagent_containers/food/snacks/tofu, - /obj/item/reagent_containers/food/snacks/stuffing - ) - result = /obj/item/reagent_containers/food/snacks/tofurkey - -/datum/recipe/mashedpotato - items = list( - /obj/item/reagent_containers/food/snacks/spreads/butter // to prevent conflicts with yellow curry - ) - fruit = list("potato" = 1) - result = /obj/item/reagent_containers/food/snacks/mashedpotato - -/datum/recipe/icecreamsandwich - reagents = list("milk" = 5, "ice" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/ice_cream, - ) - result = /obj/item/reagent_containers/food/snacks/icecreamsandwich - -// Fuck Science! -/datum/recipe/ruinedvirusdish - items = list( - /obj/item/virusdish - ) - result = /obj/item/ruinedvirusdish - -////////////////////////////////////////// -// bs12 food port stuff -////////////////////////////////////////// - -/datum/recipe/taco - items = list( - /obj/item/reagent_containers/food/snacks/doughslice, - /obj/item/reagent_containers/food/snacks/cutlet, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/reagent_containers/food/snacks/taco - - -/datum/recipe/meatball - items = list( - /obj/item/reagent_containers/food/snacks/rawmeatball - ) - result = /obj/item/reagent_containers/food/snacks/meatball - -/datum/recipe/cutlet - items = list( - /obj/item/reagent_containers/food/snacks/rawcutlet - ) - result = /obj/item/reagent_containers/food/snacks/cutlet - -/datum/recipe/mint - reagents = list("sugar" = 5, "frostoil" = 5) - result = /obj/item/reagent_containers/food/snacks/mint - - -///////////////////////////////////////////////////////////// -//Synnono Meme Foods -// -//Most recipes replace reagents with RECIPE_REAGENT_REPLACE -//to simplify the end product and balance the amount of reagents -//in some foods. Many require the space spice reagent/condiment -//to reduce the risk of future recipe conflicts. -///////////////////////////////////////////////////////////// - - -/datum/recipe/redcurry - reagents = list("cream" = 5, "spacespice" = 2, "rice" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/cutlet, - /obj/item/reagent_containers/food/snacks/cutlet - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/reagent_containers/food/snacks/redcurry - -/datum/recipe/greencurry - reagents = list("cream" = 5, "spacespice" = 2, "rice" = 5) - fruit = list("chili" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/tofu, - /obj/item/reagent_containers/food/snacks/tofu - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/reagent_containers/food/snacks/greencurry - -/datum/recipe/yellowcurry - reagents = list("cream" = 5, "spacespice" = 2, "rice" = 5) - fruit = list("peanut" = 2, "potato" = 1) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/reagent_containers/food/snacks/yellowcurry - -/datum/recipe/bearburger - items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/bearmeat - ) - result = /obj/item/reagent_containers/food/snacks/bearburger - -/datum/recipe/bearchili - fruit = list("chili" = 1, "tomato" = 1) - items = list(/obj/item/reagent_containers/food/snacks/bearmeat) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/reagent_containers/food/snacks/bearchili - -/datum/recipe/bearstew - fruit = list("potato" = 1, "tomato" = 1, "carrot" = 1, "eggplant" = 1, "mushroom" = 1) - reagents = list("water" = 10) - items = list(/obj/item/reagent_containers/food/snacks/bearmeat) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/reagent_containers/food/snacks/bearstew - -/datum/recipe/bibimbap - fruit = list("carrot" = 1, "cabbage" = 1, "mushroom" = 1) - reagents = list("rice" = 5, "spacespice" = 2) - items = list( - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/cutlet - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/reagent_containers/food/snacks/bibimbap - -/datum/recipe/friedrice - reagents = list("water" = 5, "rice" = 10, "soysauce" = 5) - fruit = list("carrot" = 1, "cabbage" = 1) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/reagent_containers/food/snacks/friedrice - -/datum/recipe/lomein - reagents = list("water" = 5, "soysauce" = 5) - fruit = list("carrot" = 1, "cabbage" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/spagetti - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/reagent_containers/food/snacks/lomein - -/datum/recipe/chickenfillet //Also just combinable, like burgers and hot dogs. - items = list( - /obj/item/reagent_containers/food/snacks/chickenkatsu, - /obj/item/reagent_containers/food/snacks/bun - ) - result = /obj/item/reagent_containers/food/snacks/chickenfillet - -/datum/recipe/chilicheesefries - items = list( - /obj/item/reagent_containers/food/snacks/fries, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/hotchili - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/reagent_containers/food/snacks/chilicheesefries - -/datum/recipe/meatbun - reagents = list("spacespice" = 1, "water" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/doughslice, - /obj/item/reagent_containers/food/snacks/rawcutlet - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Water used up in cooking - result = /obj/item/reagent_containers/food/snacks/meatbun - -/datum/recipe/custardbun - reagents = list("spacespice" = 1, "water" = 5, "egg" = 3) - items = list( - /obj/item/reagent_containers/food/snacks/doughslice - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Water, egg used up in cooking - result = /obj/item/reagent_containers/food/snacks/custardbun - -/datum/recipe/chickenmomo - reagents = list("spacespice" = 2, "water" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/doughslice, - /obj/item/reagent_containers/food/snacks/doughslice, - /obj/item/reagent_containers/food/snacks/doughslice, - /obj/item/reagent_containers/food/snacks/meat/chicken - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/reagent_containers/food/snacks/chickenmomo - -/datum/recipe/veggiemomo - reagents = list("spacespice" = 2, "water" = 5) - fruit = list("carrot" = 1, "cabbage" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/doughslice, - /obj/item/reagent_containers/food/snacks/doughslice, - /obj/item/reagent_containers/food/snacks/doughslice - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Get that water outta here - result = /obj/item/reagent_containers/food/snacks/veggiemomo - -/datum/recipe/risotto - reagents = list("wine" = 5, "rice" = 10, "spacespice" = 1) - fruit = list("mushroom" = 1) - reagent_mix = RECIPE_REAGENT_REPLACE //Get that rice and wine outta here - result = /obj/item/reagent_containers/food/snacks/risotto - -/datum/recipe/poachedegg - reagents = list("spacespice" = 1, "sodiumchloride" = 1, "blackpepper" = 1, "water" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/egg - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Get that water outta here - result = /obj/item/reagent_containers/food/snacks/poachedegg - -/datum/recipe/honeytoast - reagents = list("honey" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/slice/bread - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/reagent_containers/food/snacks/honeytoast - - -/datum/recipe/donerkebab - fruit = list("tomato" = 1, "cabbage" = 1) - reagents = list("sodiumchloride" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/meatsteak, - /obj/item/reagent_containers/food/snacks/sliceable/flatdough - ) - result = /obj/item/reagent_containers/food/snacks/donerkebab - - -/datum/recipe/sashimi - reagents = list("soysauce" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/carpmeat - ) - result = /obj/item/reagent_containers/food/snacks/sashimi - - -/datum/recipe/nugget - reagents = list("flour" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/meat/chicken - ) - reagent_mix = RECIPE_REAGENT_REPLACE - result = /obj/item/reagent_containers/food/snacks/nugget - -// Chip update -/datum/recipe/tortila - reagents = list("flour" = 5,"water" = 5) - result = /obj/item/reagent_containers/food/snacks/tortilla - reagent_mix = RECIPE_REAGENT_REPLACE //no gross flour or water - -/datum/recipe/taconew - items = list( - /obj/item/reagent_containers/food/snacks/tortilla, - /obj/item/reagent_containers/food/snacks/cutlet, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/reagent_containers/food/snacks/taco - -/datum/recipe/chips - reagents = list("sodiumchloride" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/tortilla - ) - result = /obj/item/reagent_containers/food/snacks/chipplate - -/datum/recipe/nachos - items = list( - /obj/item/reagent_containers/food/snacks/chipplate, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/reagent_containers/food/snacks/chipplate/nachos - -/datum/recipe/salsa - fruit = list("chili" = 1, "tomato" = 1, "lime" = 1) - reagents = list("spacespice" = 1, "blackpepper" = 1,"sodiumchloride" = 1) - result = /obj/item/reagent_containers/food/snacks/dip/salsa - reagent_mix = RECIPE_REAGENT_REPLACE //Ingredients are mixed together. - -/datum/recipe/guac - fruit = list("chili" = 1, "lime" = 1) - reagents = list("spacespice" = 1, "blackpepper" = 1,"sodiumchloride" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/tofu - ) - result = /obj/item/reagent_containers/food/snacks/dip/guac - reagent_mix = RECIPE_REAGENT_REPLACE //Ingredients are mixed together. - -/datum/recipe/cheesesauce - fruit = list("chili" = 1, "tomato" = 1) - reagents = list("spacespice" = 1, "blackpepper" = 1,"sodiumchloride" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/ingredient/meat/monkey = 200 ) - result = /obj/item/reagent_containers/food/snacks/dip - reagent_mix = RECIPE_REAGENT_REPLACE //Ingredients are mixed together. + result = /obj/item/reagent_containers/food/snacks/monkeykabob -/datum/recipe/burrito +/datum/cooking_recipe/meatkabob items = list( - /obj/item/reagent_containers/food/snacks/tortilla, - /obj/item/reagent_containers/food/snacks/meatball, - /obj/item/reagent_containers/food/snacks/meatball + /obj/item/stack/rods, + /obj/item/reagent_containers/food/snacks/ingredient/meat = 2 ) - reagents = list("spacespice" = 1) - result = /obj/item/reagent_containers/food/snacks/burrito + result = /obj/item/reagent_containers/food/snacks/meatkabob -/datum/recipe/burrito_vegan +/datum/cooking_recipe/syntikabob items = list( - /obj/item/reagent_containers/food/snacks/tortilla, - /obj/item/reagent_containers/food/snacks/tofu + /obj/item/stack/rods, + /obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh = 2 ) - result = /obj/item/reagent_containers/food/snacks/burrito_vegan + result = /obj/item/reagent_containers/food/snacks/monkeykabob -/datum/recipe/burrito_spicy - fruit = list("chili" = 2) +/datum/cooking_recipe/tofukabob items = list( - /obj/item/reagent_containers/food/snacks/burrito + /obj/item/stack/rods, + /obj/item/reagent_containers/food/snacks/ingredient/tofu, + /obj/item/reagent_containers/food/snacks/ingredient/tofu ) - result = /obj/item/reagent_containers/food/snacks/burrito_spicy + result = /obj/item/reagent_containers/food/snacks/tofukabob -/datum/recipe/burrito_cheese + + +/datum/cooking_recipe/spellburger items = list( - /obj/item/reagent_containers/food/snacks/burrito, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/monkeyburger, + /obj/item/clothing/head/wizard ) - result = /obj/item/reagent_containers/food/snacks/burrito_cheese + result = /obj/item/reagent_containers/food/snacks/spellburger -/datum/recipe/burrito_cheese_spicy - fruit = list("chili" = 2) +/datum/cooking_recipe/bigbiteburger items = list( - /obj/item/reagent_containers/food/snacks/burrito, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/monkeyburger, + /obj/item/reagent_containers/food/snacks/ingredient/meat = 3 ) - result = /obj/item/reagent_containers/food/snacks/burrito_cheese_spicy + reagents = list("egg" = 3) + reagent_mix = RECIPE_REAGENT_REPLACE + result = /obj/item/reagent_containers/food/snacks/bigbiteburger -/datum/recipe/burrito_hell - fruit = list("chili" = 10) +/datum/cooking_recipe/sandwich items = list( - /obj/item/reagent_containers/food/snacks/burrito_spicy + /obj/item/reagent_containers/food/snacks/meatsteak, + /obj/item/reagent_containers/food/snacks/ingredient/slice/bread = 2, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge ) - result = /obj/item/reagent_containers/food/snacks/burrito_hell - reagent_mix = RECIPE_REAGENT_REPLACE //Already hot sauce + result = /obj/item/reagent_containers/food/snacks/sandwich -/datum/recipe/breakfast_wrap +/datum/cooking_recipe/toastedsandwich items = list( - /obj/item/reagent_containers/food/snacks/bacon, - /obj/item/reagent_containers/food/snacks/tortilla, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/egg + /obj/item/reagent_containers/food/snacks/sandwich ) - result = /obj/item/reagent_containers/food/snacks/breakfast_wrap + result = /obj/item/reagent_containers/food/snacks/toastedsandwich -/datum/recipe/burrito_mystery +/datum/cooking_recipe/grilledcheese items = list( - /obj/item/reagent_containers/food/snacks/burrito, - /obj/item/reagent_containers/food/snacks/mysterysoup + /obj/item/reagent_containers/food/snacks/ingredient/slice/bread, + /obj/item/reagent_containers/food/snacks/ingredient/slice/bread, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge ) - result = /obj/item/reagent_containers/food/snacks/burrito_mystery + result = /obj/item/reagent_containers/food/snacks/grilledcheese -//Ligger food, and also bacon. -/datum/recipe/bacon +/datum/cooking_recipe/superbiteburger + fruit = list("tomato" = 1) + reagents = list("sodiumchloride" = 5, "blackpepper" = 5) items = list( - /obj/item/reagent_containers/food/snacks/rawbacon + /obj/item/reagent_containers/food/snacks/bigbiteburger, + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough, + /obj/item/reagent_containers/food/snacks/ingredient/meat, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge, + /obj/item/reagent_containers/food/snacks/boiledegg ) - result = /obj/item/reagent_containers/food/snacks/bacon + result = /obj/item/reagent_containers/food/snacks/superbiteburger -/datum/recipe/chilied_eggs +/datum/cooking_recipe/slimeburger + reagents = list("slimejelly" = 5) items = list( - /obj/item/reagent_containers/food/snacks/hotchili, - /obj/item/reagent_containers/food/snacks/boiledegg, - /obj/item/reagent_containers/food/snacks/boiledegg, - /obj/item/reagent_containers/food/snacks/boiledegg + /obj/item/reagent_containers/food/snacks/ingredient/bun ) - result = /obj/item/reagent_containers/food/snacks/chilied_eggs + result = /obj/item/reagent_containers/food/snacks/jellyburger/slime -/datum/recipe/red_sun_special +/datum/cooking_recipe/jellyburger + reagents = list("cherryjelly" = 5) items = list( - /obj/item/reagent_containers/food/snacks/sausage, - /obj/item/reagent_containers/food/snacks/cheesewedge - + /obj/item/reagent_containers/food/snacks/ingredient/bun ) - result = /obj/item/reagent_containers/food/snacks/red_sun_special + result = /obj/item/reagent_containers/food/snacks/jellyburger/cherry -/datum/recipe/hatchling_suprise +/datum/cooking_recipe/slimesandwich + reagents = list("slimejelly" = 5) items = list( - /obj/item/reagent_containers/food/snacks/poachedegg, - /obj/item/reagent_containers/food/snacks/bacon, - /obj/item/reagent_containers/food/snacks/bacon, - /obj/item/reagent_containers/food/snacks/bacon - + /obj/item/reagent_containers/food/snacks/ingredient/slice/bread = 2 ) - result = /obj/item/reagent_containers/food/snacks/hatchling_suprise + result = /obj/item/reagent_containers/food/snacks/jellysandwich/slime -/datum/recipe/riztizkzi_sea +/datum/cooking_recipe/cherrysandwich + reagents = list("cherryjelly" = 5) items = list( - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/egg + /obj/item/reagent_containers/food/snacks/ingredient/slice/bread = 2 ) - reagents = list("blood" = 15) - result = /obj/item/reagent_containers/food/snacks/riztizkzi_sea + result = /obj/item/reagent_containers/food/snacks/jellysandwich/cherry -/datum/recipe/father_breakfast +/datum/cooking_recipe/bearburger items = list( - /obj/item/reagent_containers/food/snacks/sausage, - /obj/item/reagent_containers/food/snacks/omelette, - /obj/item/reagent_containers/food/snacks/meatsteak + /obj/item/reagent_containers/food/snacks/ingredient/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bearmeat ) - result = /obj/item/reagent_containers/food/snacks/father_breakfast + result = /obj/item/reagent_containers/food/snacks/bearburger -/datum/recipe/stuffed_meatball +/datum/cooking_recipe/chickenfilletsandwich //Also just combinable, like burgers and hot dogs. items = list( - /obj/item/reagent_containers/food/snacks/meatball, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/chickenkatsu, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100 ) - fruit = list("cabbage" = 1) - result = /obj/item/reagent_containers/food/snacks/stuffed_meatball + result = /obj/item/reagent_containers/food/snacks/chickenfilletsandwich -/datum/recipe/egg_pancake +/datum/cooking_recipe/taconew items = list( - /obj/item/reagent_containers/food/snacks/meatball, - /obj/item/reagent_containers/food/snacks/meatball, - /obj/item/reagent_containers/food/snacks/meatball, - /obj/item/reagent_containers/food/snacks/omelette + /obj/item/reagent_containers/food/snacks/ingredient/tortilla, + /obj/item/reagent_containers/food/snacks/ingredient/cutlet, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge ) - result = /obj/item/reagent_containers/food/snacks/egg_pancake + result = /obj/item/reagent_containers/food/snacks/taco -/datum/recipe/grilled_carp +/datum/cooking_recipe/breakfast_wrap items = list( - /obj/item/reagent_containers/food/snacks/carpmeat, - /obj/item/reagent_containers/food/snacks/carpmeat, - /obj/item/reagent_containers/food/snacks/carpmeat, - /obj/item/reagent_containers/food/snacks/carpmeat, - /obj/item/reagent_containers/food/snacks/carpmeat, - /obj/item/reagent_containers/food/snacks/carpmeat + /obj/item/reagent_containers/food/snacks/ingredient/bacon, + /obj/item/reagent_containers/food/snacks/ingredient/tortilla, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge, + /obj/item/reagent_containers/food/snacks/ingredient/egg ) - reagents = list("spacespice" = 1) - fruit = list("cabbage" = 1, "lime" = 1) - result = /obj/item/reagent_containers/food/snacks/sliceable/grilled_carp + result = /obj/item/reagent_containers/food/snacks/breakfast_wrap -/datum/recipe/bacon_stick +/datum/cooking_recipe/burrito_mystery items = list( - /obj/item/reagent_containers/food/snacks/bacon, - /obj/item/reagent_containers/food/snacks/boiledegg + /obj/item/reagent_containers/food/snacks/burrito, + /obj/item/reagent_containers/food/snacks/mysterysoup ) - result = /obj/item/reagent_containers/food/snacks/bacon_stick + result = /obj/item/reagent_containers/food/snacks/burrito_mystery -/datum/recipe/cheese_cracker +/datum/cooking_recipe/cheese_cracker items = list( /obj/item/reagent_containers/food/snacks/spreads/butter, - /obj/item/reagent_containers/food/snacks/slice/bread, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/ingredient/slice/bread, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge ) reagents = list("spacespice" = 1) result = /obj/item/reagent_containers/food/snacks/cheese_cracker result_quantity = 4 -/datum/recipe/bacon_and_eggs - items = list( - /obj/item/reagent_containers/food/snacks/bacon, - /obj/item/reagent_containers/food/snacks/friedegg - ) - result = /obj/item/reagent_containers/food/snacks/bacon_and_eggs - -/datum/recipe/baconburger +/datum/cooking_recipe/baconburger items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/bacon, - /obj/item/reagent_containers/food/snacks/bacon + /obj/item/reagent_containers/food/snacks/ingredient/bun, + /obj/item/reagent_containers/food/snacks/ingredient/meat, + /obj/item/reagent_containers/food/snacks/ingredient/bacon = 2 ) result = /obj/item/reagent_containers/food/snacks/burger/bacon -/datum/recipe/ntmuffin +/datum/cooking_recipe/ntmuffin items = list( /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit, - /obj/item/reagent_containers/food/snacks/sausage, + /obj/item/reagent_containers/food/snacks/ingredient/sausage, /obj/item/reagent_containers/food/snacks/friedegg, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge ) result = /obj/item/reagent_containers/food/snacks/nt_muffin -/datum/recipe/fish_taco +/datum/cooking_recipe/fish_taco fruit = list("chili" = 1, "lemon" = 1) items = list( - /obj/item/reagent_containers/food/snacks/carpmeat, - /obj/item/reagent_containers/food/snacks/tortilla + /obj/item/reagent_containers/food/snacks/ingredient/carp, + /obj/item/reagent_containers/food/snacks/ingredient/tortilla ) result = /obj/item/reagent_containers/food/snacks/fish_taco -/datum/recipe/blt +/datum/cooking_recipe/blt fruit = list("tomato" = 1, "cabbage" = 1) items = list( - /obj/item/reagent_containers/food/snacks/slice/bread, - /obj/item/reagent_containers/food/snacks/slice/bread, - /obj/item/reagent_containers/food/snacks/bacon, - /obj/item/reagent_containers/food/snacks/bacon + /obj/item/reagent_containers/food/snacks/ingredient/slice/bread = 2, + /obj/item/reagent_containers/food/snacks/ingredient/bacon = 2 ) result = /obj/item/reagent_containers/food/snacks/blt -/datum/recipe/onionrings - fruit = list("onion" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/doughslice - ) - result = /obj/item/reagent_containers/food/snacks/onionrings - -/datum/recipe/berrymuffin - reagents = list("milk" = 5, "sugar" = 5) - reagent_mix = RECIPE_REAGENT_REPLACE - items = list( - /obj/item/reagent_containers/food/snacks/dough - ) - fruit = list("berries" = 1) - result = /obj/item/reagent_containers/food/snacks/muffin - -/datum/recipe/onionsoup - fruit = list("onion" = 1) - reagents = list("water" = 10) - result = /obj/item/reagent_containers/food/snacks/soup/onion - -/datum/recipe/porkbowl - reagents = list("water" = 5, "rice" = 10) - reagent_mix = RECIPE_REAGENT_REPLACE - items = list( - /obj/item/reagent_containers/food/snacks/bacon - ) - result = /obj/item/reagent_containers/food/snacks/porkbowl - -//BEGIN CITADEL CHANGES +//sushi in the microwave -/datum/recipe/sushi_gen +/datum/cooking_recipe/sushi_gen fruit = list("cabbage" = 1) reagents = list("rice" = 20) items = list( - /obj/item/reagent_containers/food/snacks/carpmeat + /obj/item/reagent_containers/food/snacks/ingredient/carp ) result = /obj/item/reagent_containers/food/snacks/sliceable/sushi -/datum/recipe/sushi // Changed to take fish and not steak meat OMEGALUL +/datum/cooking_recipe/sushi // Changed to take fish and not steak meat OMEGALUL fruit = list("cabbage" = 1) reagents = list("rice" = 20) items = list( - /obj/item/reagent_containers/food/snacks/carpmeat/fish + /obj/item/reagent_containers/food/snacks/ingredient/carp/fish ) result = /obj/item/reagent_containers/food/snacks/sliceable/sushi -/datum/recipe/sushi_sif +/datum/cooking_recipe/sushi_sif fruit = list("cabbage" = 1) reagents = list("rice" = 20) items = list( - /obj/item/reagent_containers/food/snacks/carpmeat/fish + /obj/item/reagent_containers/food/snacks/ingredient/carp/fish ) result = /obj/item/reagent_containers/food/snacks/sliceable/sushi -/datum/recipe/sushi/crab +/datum/cooking_recipe/sushi/crab fruit = list("cabbage" = 1) reagents = list("rice" = 20) items = list( - /obj/item/reagent_containers/food/snacks/meat/crab, - /obj/item/reagent_containers/food/snacks/meat/crab + /obj/item/reagent_containers/food/snacks/ingredient/meat/crab ) result = /obj/item/reagent_containers/food/snacks/sliceable/sushi/crab -/datum/recipe/sushi/horse +/datum/cooking_recipe/sushi/horse fruit = list("cabbage" = 1) reagents = list("rice" = 20) items = list( - /obj/item/reagent_containers/food/snacks/horsemeat, /obj/item/reagent_containers/food/snacks/horsemeat ) result = /obj/item/reagent_containers/food/snacks/sliceable/sushi/horse -/datum/recipe/sushi/mystery +/datum/cooking_recipe/sushi/mystery fruit = list("cabbage" = 1) reagents = list("rice" = 20) items = list( - /obj/item/reagent_containers/food/snacks/meat/human, - /obj/item/reagent_containers/food/snacks/meat/human + /obj/item/reagent_containers/food/snacks/ingredient/meat/human ) result = /obj/item/reagent_containers/food/snacks/sliceable/sushi/mystery -/datum/recipe/goulash - fruit = list("tomato" = 1) +/datum/cooking_recipe/crayonburger_red items = list( - /obj/item/reagent_containers/food/snacks/cutlet, - /obj/item/reagent_containers/food/snacks/spagetti + /obj/item/reagent_containers/food/snacks/ingredient/bun, + /obj/item/reagent_containers/food/snacks/ingredient/meat, + /obj/item/pen/crayon/red ) - result = /obj/item/reagent_containers/food/snacks/goulash + result = /obj/item/reagent_containers/food/snacks/crayonburger_red -/datum/recipe/donerkebab - fruit = list("tomato" = 1, "cabbage" = 1) - reagents = list("sodiumchloride" = 1) +/datum/cooking_recipe/crayonburger_org items = list( - /obj/item/reagent_containers/food/snacks/meatsteak, - /obj/item/reagent_containers/food/snacks/sliceable/flatdough + /obj/item/reagent_containers/food/snacks/ingredient/bun, + /obj/item/reagent_containers/food/snacks/ingredient/meat, + /obj/item/pen/crayon/orange ) - result = /obj/item/reagent_containers/food/snacks/donerkebab + result = /obj/item/reagent_containers/food/snacks/crayonburger_org -/datum/recipe/roastbeef - fruit = list("carrot" = 2, "potato" = 2) +/datum/cooking_recipe/crayonburger_yel items = list( - /obj/item/reagent_containers/food/snacks/meat + /obj/item/reagent_containers/food/snacks/ingredient/bun, + /obj/item/reagent_containers/food/snacks/ingredient/meat, + /obj/item/pen/crayon/yellow ) - result = /obj/item/reagent_containers/food/snacks/roastbeef + result = /obj/item/reagent_containers/food/snacks/crayonburger_yel -/datum/recipe/reishicup - reagents = list("psilocybin" = 3, "sugar" = 3) +/datum/cooking_recipe/crayonburger_grn items = list( - /obj/item/reagent_containers/food/snacks/chocolatebar + /obj/item/reagent_containers/food/snacks/ingredient/bun, + /obj/item/reagent_containers/food/snacks/ingredient/meat, + /obj/item/pen/crayon/green ) - result = /obj/item/reagent_containers/food/snacks/reishicup + result = /obj/item/reagent_containers/food/snacks/crayonburger_grn -/datum/recipe/hotandsoursoup - fruit = list("cabbage" = 1, "mushroom" = 1) - reagents = list("sodiumchloride" = 2, "blackpepper" = 2, "water" = 10) +/datum/cooking_recipe/crayonburger_blu items = list( - /obj/item/reagent_containers/food/snacks/tofu + /obj/item/reagent_containers/food/snacks/ingredient/bun, + /obj/item/reagent_containers/food/snacks/ingredient/meat, + /obj/item/pen/crayon/blue ) - result = /obj/item/reagent_containers/food/snacks/hotandsoursoup + result = /obj/item/reagent_containers/food/snacks/crayonburger_blu -/datum/recipe/kitsuneudon - reagents = list("egg" = 3) +/datum/cooking_recipe/crayonburger_prp items = list( - /obj/item/reagent_containers/food/snacks/spagetti, - /obj/item/reagent_containers/food/snacks/tofu + /obj/item/reagent_containers/food/snacks/ingredient/bun, + /obj/item/reagent_containers/food/snacks/ingredient/meat, + /obj/item/pen/crayon/purple ) - result = /obj/item/reagent_containers/food/snacks/kitsuneudon + result = /obj/item/reagent_containers/food/snacks/crayonburger_prp -/datum/recipe/pillbugball - reagents = list(MAT_CARBON = 5) +/datum/cooking_recipe/crayonburger_rbw items = list( - /obj/item/reagent_containers/food/snacks/meat/grubmeat + /obj/item/reagent_containers/food/snacks/ingredient/bun, + /obj/item/reagent_containers/food/snacks/ingredient/meat, + /obj/item/pen/crayon/rainbow ) - result = /obj/item/reagent_containers/food/snacks/bugball + result = /obj/item/reagent_containers/food/snacks/crayonburger_rbw -/datum/recipe/mammi - fruit = list("orange" = 1) - reagents = list("water" = 10, "flour" = 10, "milk" = 5, "sodiumchloride" = 1) - result = /obj/item/reagent_containers/food/snacks/mammi +*/ +/datum/cooking_recipe/hotdog + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, + /obj/item/reagent_containers/food/snacks/ingredient/sausage = 100 + ) + result = /obj/item/reagent_containers/food/snacks/hotdog -/datum/recipe/makaroni - reagents = list("flour" = 15, "milk" = 5) +/datum/cooking_recipe/donkpocket items = list( - /obj/item/reagent_containers/food/snacks/meat/grubmeat, - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough = 100, + /obj/item/reagent_containers/food/snacks/ingredient/meatball = 100 ) - result = /obj/item/reagent_containers/food/snacks/makaroni + result = /obj/item/reagent_containers/food/snacks/donkpocket //SPECIAL + +/datum/cooking_recipe/donkpocket/proc/warm_up(obj/item/reagent_containers/food/snacks/donkpocket/being_cooked) + being_cooked.heat() + +/datum/cooking_recipe/donkpocket/make_food(obj/container) + . = ..(container) + for (var/obj/item/reagent_containers/food/snacks/donkpocket/D in .) + if (!D.warm) + warm_up(D) -/datum/recipe/crayonburger_red +/datum/cooking_recipe/donkpocket/warm + reagents = list() //This is necessary since this is a child object of the above recipe and we don't want donk pockets to need flour items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/pen/crayon/red + /obj/item/reagent_containers/food/snacks/donkpocket ) - result = /obj/item/reagent_containers/food/snacks/crayonburger_red + result = /obj/item/reagent_containers/food/snacks/donkpocket //SPECIAL + +/datum/cooking_recipe/soylenviridians + fruit = list("soybeans" = 100) + reagents = list("flour" = 10) + reagent_mix = RECIPE_REAGENT_REPLACE + result = /obj/item/reagent_containers/food/snacks/soylenviridians -/datum/recipe/crayonburger_org +/datum/cooking_recipe/soylentgreen + reagents = list("flour" = 10) + reagent_mix = RECIPE_REAGENT_REPLACE items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/pen/crayon/orange + /obj/item/reagent_containers/food/snacks/ingredient/meat/human = 200 ) - result = /obj/item/reagent_containers/food/snacks/crayonburger_org + result = /obj/item/reagent_containers/food/snacks/soylentgreen -/datum/recipe/crayonburger_yel +/datum/cooking_recipe/wingfangchu //what the fuck IS wing fang chu? + reagents = list("soysauce" = 5) items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/pen/crayon/yellow + /obj/item/reagent_containers/food/snacks/ingredient/xenomeat = 100 ) - result = /obj/item/reagent_containers/food/snacks/crayonburger_yel + result = /obj/item/reagent_containers/food/snacks/wingfangchu -/datum/recipe/crayonburger_grn + +/datum/cooking_recipe/cheesyfries items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/pen/crayon/green + /obj/item/reagent_containers/food/snacks/fries, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 50 ) - result = /obj/item/reagent_containers/food/snacks/crayonburger_grn + result = /obj/item/reagent_containers/food/snacks/cheesyfries + -/datum/recipe/crayonburger_blu +/datum/cooking_recipe/spacylibertyduff + reagents = list("water" = 5, "vodka" = 5, "psilocybin" = 5) + result = /obj/item/reagent_containers/food/snacks/spacylibertyduff + +/datum/cooking_recipe/amanitajelly + reagents = list("water" = 5, "vodka" = 5, "amatoxin" = 5) + result = /obj/item/reagent_containers/food/snacks/amanitajelly + +/datum/cooking_recipe/amanitajelly/make_food(obj/container) + . = ..(container) + for (var/obj/item/reagent_containers/food/snacks/amanitajelly/being_cooked in .) + being_cooked.reagents.del_reagent("amatoxin") + +/datum/cooking_recipe/fishandchips items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/pen/crayon/blue + /obj/item/reagent_containers/food/snacks/fries, + /obj/item/reagent_containers/food/snacks/ingredient/carp = 100 ) - result = /obj/item/reagent_containers/food/snacks/crayonburger_blu + result = /obj/item/reagent_containers/food/snacks/fishandchips -/datum/recipe/crayonburger_prp +/datum/cooking_recipe/rofflewaffles + reagents = list("psilocybin" = 5, "sugar" = 10) items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/pen/crayon/purple + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough = 200 ) - result = /obj/item/reagent_containers/food/snacks/crayonburger_prp + result = /obj/item/reagent_containers/food/snacks/rofflewaffles -/datum/recipe/crayonburger_rbw +/*/datum/cooking_recipe/spaghetti We have the processor now items = list( - /obj/item/reagent_containers/food/snacks/bun, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/pen/crayon/rainbow + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice ) - result = /obj/item/reagent_containers/food/snacks/crayonburger_rbw + result= /obj/item/reagent_containers/food/snacks/ingredient/spaghetti*/ -/datum/recipe/rkibble - reagents = list("milk" = 5, "tallow" = 10) +/datum/cooking_recipe/twobread + reagents = list("wine" = 5) items = list( - /obj/item/robot_parts/head, - /obj/item/stack/rods + /obj/item/reagent_containers/food/snacks/ingredient/slice/bread = 200 ) - result = /obj/item/trash/rkibble + result = /obj/item/reagent_containers/food/snacks/twobread -//Goblin Food Goblin Food -/datum/recipe/cavenuggets - fruit = list("mushroom" = 1) +/datum/cooking_recipe/boiledslimeextract + reagents = list("water" = 5) items = list( - /obj/item/reagent_containers/food/snacks/meatball, - /obj/item/reagent_containers/food/snacks/meat/grubmeat, - /obj/item/reagent_containers/food/snacks/spreads/butter + /obj/item/slime_extract ) - result = /obj/item/reagent_containers/food/snacks/cavenuggets + result = /obj/item/reagent_containers/food/snacks/boiledslimecore -/datum/recipe/diggerstew - fruit = list("carrot" = 1, "mushroom" = 1) - reagents = list("spacespice" = 2, "water" = 10) +/datum/cooking_recipe/chocolateegg items = list( - /obj/item/reagent_containers/food/snacks/bait/worm, - /obj/item/reagent_containers/food/snacks/bait/worm, - /obj/item/reagent_containers/food/snacks/bait/worm + /obj/item/reagent_containers/food/snacks/ingredient/egg = 100, + /obj/item/reagent_containers/food/snacks/chocolatebar ) - result = /obj/item/reagent_containers/food/snacks/diggerstew + result = /obj/item/reagent_containers/food/snacks/chocolateegg + + + -/datum/recipe/diggerstew_pot - fruit = list("carrot" = 1, "potato" = 1, "mushroom" = 1) - reagents = list("spacespice" = 2, "water" = 10) + + + +/datum/cooking_recipe/icecreamsandwich + reagents = list("milk" = 5, "ice" = 5) items = list( - /obj/item/reagent_containers/food/snacks/bait/worm, - /obj/item/reagent_containers/food/snacks/bait/worm, - /obj/item/reagent_containers/food/snacks/bait/worm + /obj/item/reagent_containers/food/snacks/ice_cream, ) - result = /obj/item/reagent_containers/food/snacks/diggerstew_pot + result = /obj/item/reagent_containers/food/snacks/icecreamsandwich -/datum/recipe/full_goss - fruit = list("carrot" = 1, "mushroom" = 1) +// Fuck Science! +/datum/cooking_recipe/ruinedvirusdish items = list( - /obj/item/reagent_containers/food/snacks/friedegg, - /obj/item/reagent_containers/food/snacks/meat/grubmeat + /obj/item/virusdish + ) + result = /obj/item/ruinedvirusdish + +////////////////////////////////////////// +// bs12 food port stuff +////////////////////////////////////////// + +/datum/cooking_recipe/mint + reagents = list("sugar" = 5, "frostoil" = 5) + result = /obj/item/reagent_containers/food/snacks/mint + +//sashimi in da microwave +/datum/cooking_recipe/sashimi + reagents = list("soysauce" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/carp = 100 + ) + result = /obj/item/reagent_containers/food/snacks/sashimi + +/datum/cooking_recipe/bacon_and_eggs + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/bacon = 100, + /obj/item/reagent_containers/food/snacks/friedegg ) - result = /obj/item/reagent_containers/food/snacks/full_goss + result = /obj/item/reagent_containers/food/snacks/bacon_and_eggs + + + +//BEGIN CITADEL CHANGES + -/datum/recipe/greenham - reagents = list("spacespice" = 2, "water" = 10) +/datum/cooking_recipe/reishicup + reagents = list("psilocybin" = 3, "sugar" = 3) items = list( - /obj/item/reagent_containers/food/snacks/meat/grubmeat, - /obj/item/reagent_containers/food/snacks/bait/worm + /obj/item/reagent_containers/food/snacks/chocolatebar ) - result = /obj/item/reagent_containers/food/snacks/greenham + result = /obj/item/reagent_containers/food/snacks/reishicup + -/datum/recipe/greenhamandeggs - reagents = list("spacespice" = 2, "water" = 10) +/datum/cooking_recipe/rkibble + reagents = list("milk" = 5, "tallow" = 10) items = list( - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/meat/grubmeat, - /obj/item/reagent_containers/food/snacks/bait/worm + /obj/item/robot_parts/head, + /obj/item/stack/rods ) - result = /obj/item/reagent_containers/food/snacks/greenham + result = /obj/item/trash/rkibble -/datum/recipe/roach_burger +/datum/cooking_recipe/roach_burger items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/holder/roach ) result = /obj/item/reagent_containers/food/snacks/roach_burger -/datum/recipe/roach_burger/armored +/datum/cooking_recipe/roach_burger/armored items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/holder/panzer ) result = /obj/item/reagent_containers/food/snacks/roach_burger/armored -/datum/recipe/roach_burger/pale +/datum/cooking_recipe/roach_burger/pale items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/holder/jager ) result = /obj/item/reagent_containers/food/snacks/roach_burger/pale -/datum/recipe/roach_burger/purple +/datum/cooking_recipe/roach_burger/purple items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/holder/seuche ) result = /obj/item/reagent_containers/food/snacks/roach_burger/purple -/datum/recipe/roach_burger/big +/datum/cooking_recipe/roach_burger/big items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/holder/roach, /obj/item/holder/roach, /obj/item/holder/jager, @@ -1450,75 +611,34 @@ ) result = /obj/item/reagent_containers/food/snacks/roach_burger/big -/datum/recipe/roach_burger/reich +/datum/cooking_recipe/roach_burger/reich items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/holder/fuhrer ) result = /obj/item/reagent_containers/food/snacks/roach_burger/reich -/datum/recipe/fruitsalad - fruit = list("apple" = 1, "berries" = 1, "banana" = 1, "cherries" = 1) +/datum/cooking_recipe/fruitsalad + fruit = list("apple" = 100, "berries" = 100, "banana" = 100, "cherries" = 100) reagents = list("milk" = 10, "cream" = 5) result = /obj/item/reagent_containers/food/snacks/fruitsalad -/datum/recipe/mushroompasta - fruit = list("mushroom" = 1) - items = list(/obj/item/reagent_containers/food/snacks/spagetti) - reagents = list("water" = 5) - result = /obj/item/reagent_containers/food/snacks/mushroompasta - -/datum/recipe/carbonara - items = list( - /obj/item/reagent_containers/food/snacks/spagetti, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/meat - ) - reagents = list("water" = 5, "sodiumchloride" = 1, "blackpepper" = 1) - result = /obj/item/reagent_containers/food/snacks/carbonara - -/datum/recipe/bloodsausage - items = list( - /obj/item/reagent_containers/food/snacks/sausage - ) - reagents = list("blood" = 15) - result = /obj/item/reagent_containers/food/snacks/bloodsausage - -/datum/recipe/weisswurst - fruit = list("onion" = 1, "lemon" = 1) - items = list(/obj/item/reagent_containers/food/snacks/sausage) - reagents = list("water" = 15, "sodiumchloride" = 1) - result = /obj/item/reagent_containers/food/snacks/weisswurst -/datum/recipe/sauerkraut - fruit = list("cabbage" = 1) +/datum/cooking_recipe/sauerkraut + fruit = list("cabbage" = 100) reagents = list("brine" = 5) result = /obj/item/reagent_containers/food/snacks/sauerkraut -/datum/recipe/kimchi - fruit = list("cabbage" = 1, "whitebeet" = 1) +/datum/cooking_recipe/kimchi + fruit = list("cabbage" = 100, "whitebeet" = 100) reagents = list("brine" = 5, "blackpepper" = 2) result = /obj/item/reagent_containers/food/snacks/kimchi -/datum/recipe/chickensatay - fruit = list("peanut" = 1, "lime" = 1) - items = list( - /obj/item/stack/rods, - /obj/item/reagent_containers/food/snacks/meat/chicken, - /obj/item/reagent_containers/food/snacks/yellowcurry - ) - reagents = list("water" = 5, "milk" = 5, "soysauce" = 5, "sodiumchloride" = 1, "sugar" = 1) - result = /obj/item/reagent_containers/food/snacks/chickensatay -/datum/recipe/frenchonionsoup - fruit = list("onion" = 1) - items = list(/obj/item/reagent_containers/food/snacks/cheesewedge) - reagents = list("water" = 10, "sodiumchloride" = 1, "sugar" = 1) - result = /obj/item/reagent_containers/food/snacks/frenchonionsoup -/datum/recipe/bananasplit - fruit = list("banana" = 1, "cherries" = 1) + +/datum/cooking_recipe/bananasplit + fruit = list("banana" = 100, "cherries" = 20) reagents = list("milk" = 5, "ice" = 5) items = list( /obj/item/reagent_containers/food/snacks/chocolatebar, @@ -1527,113 +647,32 @@ ) result = /obj/item/reagent_containers/food/snacks/bananasplit -/datum/recipe/wormburger +/datum/cooking_recipe/wormburger items = list( - /obj/item/reagent_containers/food/snacks/bun, + /obj/item/reagent_containers/food/snacks/ingredient/bun = 100, /obj/item/reagent_containers/food/snacks/bait/worm, /obj/item/reagent_containers/food/snacks/bait/worm, - /obj/item/reagent_containers/food/snacks/meat + /obj/item/reagent_containers/food/snacks/ingredient/meat = 20 ) result = /obj/item/reagent_containers/food/snacks/wormburger -/datum/recipe/spider_wingfangchu - reagents = list("soysauce" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/xenomeat/spidermeat - ) - result = /obj/item/reagent_containers/food/snacks/spider_wingfangchu - -/datum/recipe/steamedspider - reagents = list("water" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/spreads/butter, - /obj/item/reagent_containers/food/snacks/xenomeat/spidermeat - ) - result = /obj/item/reagent_containers/food/snacks/steamedspider - -/datum/recipe/saplingsdelight - items = list( - /obj/item/reagent_containers/food/snacks/bait/worm, - /obj/item/reagent_containers/food/snacks/bait/worm, - /obj/item/reagent_containers/food/snacks/bait/worm, - /obj/item/reagent_containers/food/snacks/badrecipe - ) - result = /obj/item/reagent_containers/food/snacks/saplingsdelight - -/datum/recipe/lobster - fruit = list("lemon" = 1, "cabbage" = 1) - reagents = list("water" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/lobster, - /obj/item/reagent_containers/food/snacks/spreads/butter - ) - result = /obj/item/reagent_containers/food/snacks/lobstercooked - -/datum/recipe/shrimp - reagents = list("water" = 2, "sodiumchloride" = 2) - items = list( - /obj/item/reagent_containers/food/snacks/shrimp, - /obj/item/reagent_containers/food/snacks/spreads/butter - ) - result = /obj/item/reagent_containers/food/snacks/shrimpcooked - -/datum/recipe/shrimpcocktail - fruit = list("tomato" = 2, "chili" = 2, "lemon" = 2) - reagents = list("water" = 5, "sodiumchloride" = 5, "pepper" = 5) +/datum/cooking_recipe/shrimpcocktail + fruit = list("tomato" = 20, "chili" = 20, "lemon" = 5) + reagents = list("water" = 5, "sodiumchloride" = 5, "blackpepper" = 5) items = list( - /obj/item/reagent_containers/food/snacks/shrimp, - /obj/item/reagent_containers/food/snacks/shrimp, - /obj/item/reagent_containers/food/snacks/shrimp, - /obj/item/reagent_containers/food/snacks/shrimp, - /obj/item/reagent_containers/food/snacks/shrimp, + /obj/item/reagent_containers/food/snacks/ingredient/shrimp = 100 //shrimp glockenspiel ) result = /obj/item/reagent_containers/food/snacks/shrimpcocktail -/datum/recipe/shrimpfriedrice - fruit = list("corn" = 1, "carrot" = 1, "peas" = 1) - reagents = list("water" = 5, "sodiumchloride" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/shrimp, - /obj/item/reagent_containers/food/snacks/shrimp, - /obj/item/reagent_containers/food/snacks/boiledrice - ) - result = /obj/item/reagent_containers/food/snacks/shrimpfriedrice -/datum/recipe/bowl_peas - fruit = list("peas" = 4) - reagents = list("water" = 5, "sodiumchloride" = 1) - items = list( - /obj/item/reagent_containers/food/snacks/spreads/butter - ) - result = /obj/item/reagent_containers/food/snacks/bowl_peas -/datum/recipe/puddi - reagents = list("milk" = 10, "sugar" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/chocolatebar - ) - result = /obj/item/reagent_containers/food/snacks/puddi -/datum/recipe/puddi_happy - reagents = list("milk" = 10, "sugar" = 5, "honey" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/chocolatebar - ) - result = /obj/item/reagent_containers/food/snacks/puddi/happy -/datum/recipe/puddi_angry - fruit = list("chili" = 2) - reagents = list("milk" = 10, "sugar" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/egg, - /obj/item/reagent_containers/food/snacks/chocolatebar - ) - result = /obj/item/reagent_containers/food/snacks/puddi/angry + +//all recipes that require holders are now microwave-only. NOT sorry at all. +/datum/cooking_recipe/dionaroast + fruit = list("apple" = 1) + reagents = list("pacid" = 5) //It dissolves the carapace. Still poisonous, though. + items = list(/obj/item/holder/diona) + result = /obj/item/reagent_containers/food/snacks/dionaroast + //No eating polyacid diff --git a/code/modules/food/recipes_oven.dm b/code/modules/food/recipes_oven.dm index 6f0dd3a7ac4d..62c90fec45f0 100644 --- a/code/modules/food/recipes_oven.dm +++ b/code/modules/food/recipes_oven.dm @@ -1,278 +1,144 @@ -/datum/recipe/ovenchips - appliance = OVEN +/datum/cooking_recipe/ovenchips + required_method = METHOD_OVEN items = list( - /obj/item/reagent_containers/food/snacks/rawsticks + /obj/item/reagent_containers/food/snacks/ingredient/rawsticks = 100 ) result = /obj/item/reagent_containers/food/snacks/ovenchips -/datum/recipe/ribplate //Putting this here for not seeing a roast section. - appliance = OVEN +/datum/cooking_recipe/ribplate + required_method = METHOD_OVEN reagents = list("honey" = 5, "spacespice" = 2, "blackpepper" = 1) - items = list(/obj/item/reagent_containers/food/snacks/meat) - reagent_mix = RECIPE_REAGENT_REPLACE + items = list(/obj/item/reagent_containers/food/snacks/ingredient/meat = 200) + result = /obj/item/reagent_containers/food/snacks/ribplate -/datum/recipe/ribplate_bear //Putting this here for not seeing a roast section. - appliance = OVEN +/datum/cooking_recipe/ribplate_bear + required_method = METHOD_OVEN reagents = list("honey" = 5, "spacespice" = 2, "blackpepper" = 1) - items = list(/obj/item/reagent_containers/food/snacks/bearmeat) - reagent_mix = RECIPE_REAGENT_REPLACE + items = list(/obj/item/reagent_containers/food/snacks/ingredient/bearmeat = 200) + result = /obj/item/reagent_containers/food/snacks/ribplate_bear -/datum/recipe/teshariroast - appliance = OVEN - fruit = list("lemon" = 1) +/datum/cooking_recipe/teshariroast + required_method = METHOD_OVEN + fruit = list("lemon" = 20) reagents = list("sodiumchloride" = 1, "blackpepper" = 1) - items = list(/obj/item/reagent_containers/food/snacks/meat/chicken/teshari) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/meat/chicken/teshari = 100) result = /obj/item/reagent_containers/food/snacks/teshariroast - reagent_mix = RECIPE_REAGENT_REPLACE - -/datum/recipe/dionaroast - appliance = OVEN - fruit = list("apple" = 1) - reagents = list("pacid" = 5) //It dissolves the carapace. Still poisonous, though. - items = list(/obj/item/holder/diona) - result = /obj/item/reagent_containers/food/snacks/dionaroast - reagent_mix = RECIPE_REAGENT_REPLACE //No eating polyacid -//Predesigned breads -/datum/recipe/bread - appliance = OVEN - items = list( - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough - ) - reagents = list("sodiumchloride" = 1) - result = /obj/item/reagent_containers/food/snacks/sliceable/bread -/datum/recipe/baguette - appliance = OVEN +/datum/cooking_recipe/baguette + required_method = METHOD_OVEN reagents = list("sodiumchloride" = 1, "blackpepper" = 1) items = list( - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough = 200 ) result = /obj/item/reagent_containers/food/snacks/baguette - -/datum/recipe/tofubread - appliance = OVEN - items = list( - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/tofu, - /obj/item/reagent_containers/food/snacks/tofu, - /obj/item/reagent_containers/food/snacks/tofu, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/reagent_containers/food/snacks/sliceable/tofubread - - -/datum/recipe/creamcheesebread - appliance = OVEN - items = list( - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/reagent_containers/food/snacks/sliceable/creamcheesebread - -/datum/recipe/flatbread - appliance = OVEN - items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough - ) - result = /obj/item/reagent_containers/food/snacks/flatbread - -/datum/recipe/meatbread - appliance = OVEN - items = list( - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/reagent_containers/food/snacks/sliceable/meatbread - -/datum/recipe/syntibread - appliance = OVEN - items = list( - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/meat/syntiflesh, - /obj/item/reagent_containers/food/snacks/meat/syntiflesh, - /obj/item/reagent_containers/food/snacks/meat/syntiflesh, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/reagent_containers/food/snacks/sliceable/meatbread - -/datum/recipe/xenomeatbread - appliance = OVEN - items = list( - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/xenomeat, - /obj/item/reagent_containers/food/snacks/xenomeat, - /obj/item/reagent_containers/food/snacks/xenomeat, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/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/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough - ) - result = /obj/item/reagent_containers/food/snacks/sliceable/bananabread - -/datum/recipe/spidermeatbread - appliance = OVEN - items = list( - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/dough, - /obj/item/reagent_containers/food/snacks/xenomeat/spidermeat, - /obj/item/reagent_containers/food/snacks/xenomeat/spidermeat, - /obj/item/reagent_containers/food/snacks/xenomeat/spidermeat, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/reagent_containers/food/snacks/sliceable/spidermeatbread - - -/datum/recipe/bun - appliance = OVEN - items = list( - /obj/item/reagent_containers/food/snacks/dough - ) - result = /obj/item/reagent_containers/food/snacks/bun - //Predesigned pies //======================= -/datum/recipe/meatpie - appliance = OVEN +/datum/cooking_recipe/meatpie + required_method = METHOD_OVEN items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/meat + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 100, + /obj/item/reagent_containers/food/snacks/ingredient/meat = 100 ) result = /obj/item/reagent_containers/food/snacks/meatpie -/datum/recipe/tofupie - appliance = OVEN +/datum/cooking_recipe/tofupie + required_method = METHOD_OVEN items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/tofu + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 100, + /obj/item/reagent_containers/food/snacks/ingredient/tofu = 100 ) result = /obj/item/reagent_containers/food/snacks/tofupie -/datum/recipe/xemeatpie - appliance = OVEN +/datum/cooking_recipe/xemeatpie + required_method = METHOD_OVEN items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/xenomeat + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 100, + /obj/item/reagent_containers/food/snacks/ingredient/xenomeat = 100 ) result = /obj/item/reagent_containers/food/snacks/xemeatpie -/datum/recipe/pie - appliance = OVEN - fruit = list("banana" = 1) +/datum/cooking_recipe/pie + required_method = METHOD_OVEN + fruit = list("banana" = 100) reagents = list("sugar" = 5) - items = list(/obj/item/reagent_containers/food/snacks/sliceable/flatdough) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 100) result = /obj/item/reagent_containers/food/snacks/pie -/datum/recipe/cherrypie - appliance = OVEN - fruit = list("cherries" = 1) +/datum/cooking_recipe/cherrypie + required_method = METHOD_OVEN + fruit = list("cherries" = 100) reagents = list("sugar" = 10) items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 100 ) result = /obj/item/reagent_containers/food/snacks/cherrypie -/datum/recipe/amanita_pie - appliance = OVEN +/datum/cooking_recipe/amanita_pie + required_method = METHOD_OVEN reagents = list("amatoxin" = 5) - items = list(/obj/item/reagent_containers/food/snacks/sliceable/flatdough) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 100) result = /obj/item/reagent_containers/food/snacks/amanita_pie -/datum/recipe/plump_pie - appliance = OVEN - fruit = list("plumphelmet" = 1) - items = list(/obj/item/reagent_containers/food/snacks/sliceable/flatdough) +/datum/cooking_recipe/plump_pie + required_method = METHOD_OVEN + fruit = list("plumphelmet" = 100) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 100) result = /obj/item/reagent_containers/food/snacks/plump_pie -/datum/recipe/pumpkinpie - appliance = OVEN - fruit = list("pumpkin" = 1) +/datum/cooking_recipe/pumpkinpie + required_method = METHOD_OVEN + fruit = list("pumpkin" = 100) reagents = list("milk" = 5, "sugar" = 5, "egg" = 3, "flour" = 10) result = /obj/item/reagent_containers/food/snacks/sliceable/pumpkinpie - reagent_mix = RECIPE_REAGENT_REPLACE //We dont want raw egg in the result + //We dont want raw egg in the result -/datum/recipe/appletart - appliance = OVEN - fruit = list("goldapple" = 1) +/datum/cooking_recipe/appletart + required_method = METHOD_OVEN + fruit = list("goldapple" = 100) reagents = list("sugar" = 5, "milk" = 5, "flour" = 10, "egg" = 3) result = /obj/item/reagent_containers/food/snacks/appletart - reagent_mix = RECIPE_REAGENT_REPLACE -/datum/recipe/keylimepie - appliance = OVEN - fruit = list("lime" = 2) + +/datum/cooking_recipe/keylimepie + required_method = METHOD_OVEN + fruit = list("lime" = 200) reagents = list("milk" = 5, "sugar" = 5, "egg" = 3, "flour" = 10) result = /obj/item/reagent_containers/food/snacks/sliceable/keylimepie - reagent_mix = RECIPE_REAGENT_REPLACE //No raw egg in finished product, protein after cooking causes magic meatballs otherwise + //No raw egg in finished product, protein after cooking causes magic meatballs otherwise -/datum/recipe/quiche - appliance = OVEN +/datum/cooking_recipe/quiche + required_method = METHOD_OVEN reagents = list("milk" = 5, "egg" = 9, "flour" = 10) - items = list(/obj/item/reagent_containers/food/snacks/cheesewedge) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100) result = /obj/item/reagent_containers/food/snacks/sliceable/quiche - reagent_mix = RECIPE_REAGENT_REPLACE //No raw egg in finished product, protein after cooking causes magic meatballs otherwise + //No raw egg in finished product, protein after cooking causes magic meatballs otherwise //Baked sweets: //--------------- -/datum/recipe/cookie - appliance = OVEN +/datum/cooking_recipe/cookie + required_method = METHOD_OVEN reagents = list("milk" = 10, "sugar" = 10) items = list( - /obj/item/reagent_containers/food/snacks/dough, + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough = 100, /obj/item/reagent_containers/food/snacks/chocolatebar ) result = /obj/item/reagent_containers/food/snacks/cookie result_quantity = 4 - reagent_mix = RECIPE_REAGENT_REPLACE -/datum/recipe/fortunecookie - appliance = OVEN + +/datum/cooking_recipe/fortunecookie + required_method = METHOD_OVEN reagents = list("sugar" = 5) items = list( - /obj/item/reagent_containers/food/snacks/doughslice, + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice = 20, /obj/item/paper ) result = /obj/item/reagent_containers/food/snacks/fortunecookie @@ -316,131 +182,130 @@ return 0 return . */ -/datum/recipe/pretzel - appliance = OVEN - items = list(/obj/item/reagent_containers/food/snacks/dough) +/datum/cooking_recipe/pretzel + required_method = METHOD_OVEN + items = list(/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough = 100) reagents = list("water" = 5, "sodiumchloride" = 2) result = /obj/item/reagent_containers/food/snacks/pretzel result_quantity = 2 -/datum/recipe/poppypretzel - appliance = OVEN - fruit = list("poppy" = 1) - items = list(/obj/item/reagent_containers/food/snacks/dough) +/datum/cooking_recipe/poppypretzel + required_method = METHOD_OVEN + fruit = list("poppy" = 20) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough = 100) result = /obj/item/reagent_containers/food/snacks/poppypretzel result_quantity = 2 -/datum/recipe/cracker - appliance = OVEN +/datum/cooking_recipe/cracker + required_method = METHOD_OVEN reagents = list("sodiumchloride" = 1) items = list( - /obj/item/reagent_containers/food/snacks/doughslice + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice = 100 ) result = /obj/item/reagent_containers/food/snacks/cracker -/datum/recipe/brownies - appliance = OVEN +/datum/cooking_recipe/brownies + required_method = METHOD_OVEN reagents = list("browniemix" = 10, "egg" = 3) - reagent_mix = RECIPE_REAGENT_REPLACE //No egg or mix in final recipe + //No egg or mix in final recipe result = /obj/item/reagent_containers/food/snacks/sliceable/brownies -/datum/recipe/cosmicbrownies - appliance = OVEN +/datum/cooking_recipe/cosmicbrownies + required_method = METHOD_OVEN reagents = list("browniemix" = 10, "egg" = 3) - fruit = list("ambrosia" = 1) - reagent_mix = RECIPE_REAGENT_REPLACE //No egg or mix in final recipe + fruit = list("ambrosia" = 10) + //No egg or mix in final recipe result = /obj/item/reagent_containers/food/snacks/sliceable/cosmicbrownies - +/datum/cooking_recipe/muffin + required_method = METHOD_OVEN + reagents = list("milk" = 5, "sugar" = 5) + reagent_mix = RECIPE_REAGENT_REPLACE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough = 100 + ) + result = /obj/item/reagent_containers/food/snacks/muffin //Pizzas //========================= -/datum/recipe/pizzamargherita - appliance = OVEN - fruit = list("tomato" = 1) +/datum/cooking_recipe/pizzamargherita + required_method = METHOD_OVEN + fruit = list("tomato" = 100) items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 200, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 200 ) result = /obj/item/reagent_containers/food/snacks/sliceable/pizza/margherita -/datum/recipe/meatpizza - appliance = OVEN - fruit = list("tomato" = 1) +/datum/cooking_recipe/meatpizza + required_method = METHOD_OVEN + fruit = list("tomato" = 100) items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 200, + /obj/item/reagent_containers/food/snacks/ingredient/meat = 100, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100 ) result = /obj/item/reagent_containers/food/snacks/sliceable/pizza/meatpizza -/datum/recipe/syntipizza - appliance = OVEN - fruit = list("tomato" = 1) +/datum/cooking_recipe/syntipizza + required_method = METHOD_OVEN + fruit = list("tomato" = 100) items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/meat/syntiflesh, - /obj/item/reagent_containers/food/snacks/meat/syntiflesh, - /obj/item/reagent_containers/food/snacks/meat/syntiflesh, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 200, + /obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh = 100, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100 ) result = /obj/item/reagent_containers/food/snacks/sliceable/pizza/meatpizza -/datum/recipe/mushroompizza - appliance = OVEN - fruit = list("mushroom" = 5, "tomato" = 1) +/datum/cooking_recipe/mushroompizza + required_method = METHOD_OVEN + fruit = list("mushroom" = 50, "tomato" = 100) items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 200, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100 ) - reagent_mix = RECIPE_REAGENT_REPLACE //No vomit taste in finished product from chanterelles + //No vomit taste in finished product from chanterelles result = /obj/item/reagent_containers/food/snacks/sliceable/pizza/mushroompizza -/datum/recipe/vegetablepizza - appliance = OVEN - fruit = list("eggplant" = 1, "carrot" = 1, "corn" = 1, "tomato" = 1) +/datum/cooking_recipe/vegetablepizza + required_method = METHOD_OVEN + fruit = list("eggplant" = 25, "carrot" = 25, "corn" = 25, "tomato" = 100) items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 200, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100 ) result = /obj/item/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza -/datum/recipe/pineapplepizza - appliance = OVEN - fruit = list("tomato" = 1) +/datum/cooking_recipe/pineapplepizza + required_method = METHOD_OVEN + fruit = list("tomato" = 100) items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/pineapple_ring, - /obj/item/reagent_containers/food/snacks/pineapple_ring + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 200, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100, + /obj/item/reagent_containers/food/snacks/pineapple_ring = 2 ) result = /obj/item/reagent_containers/food/snacks/sliceable/pizza/pineapple //Spicy //================ -/datum/recipe/enchiladas - appliance = OVEN - fruit = list("chili" = 2, "corn" = 1) - items = list(/obj/item/reagent_containers/food/snacks/cutlet) +/datum/cooking_recipe/enchiladas + required_method = METHOD_OVEN + fruit = list("chili" = 10, "corn" = 100) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/cutlet = 100) result = /obj/item/reagent_containers/food/snacks/enchiladas -/datum/recipe/monkeysdelight - appliance = OVEN - fruit = list("banana" = 1) +/datum/cooking_recipe/monkeysdelight + required_method = METHOD_OVEN + fruit = list("banana" = 100) reagents = list("sodiumchloride" = 1, "blackpepper" = 1, "flour" = 10) items = list( /obj/item/reagent_containers/food/snacks/monkeycube ) result = /obj/item/reagent_containers/food/snacks/monkeysdelight - reagent_mix = RECIPE_REAGENT_REPLACE + @@ -448,189 +313,342 @@ // Cakes. //============ -/datum/recipe/cake - appliance = OVEN +/datum/cooking_recipe/cake + required_method = METHOD_OVEN reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9) result = /obj/item/reagent_containers/food/snacks/sliceable/plaincake - reagent_mix = RECIPE_REAGENT_REPLACE -/datum/recipe/cake/carrot - appliance = OVEN - fruit = list("carrot" = 3) + +/datum/cooking_recipe/cake/carrot + required_method = METHOD_OVEN + fruit = list("carrot" = 300) result = /obj/item/reagent_containers/food/snacks/sliceable/carrotcake -/datum/recipe/cake/cheese - appliance = OVEN +/datum/cooking_recipe/cake/cheese + required_method = METHOD_OVEN items = list( - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 200, ) result = /obj/item/reagent_containers/food/snacks/sliceable/cheesecake -/datum/recipe/cake/orange - appliance = OVEN - fruit = list("orange" = 1) +/datum/cooking_recipe/cake/orange + required_method = METHOD_OVEN + fruit = list("orange" = 100) reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "orangejuice" = 3, "sugar" = 5) result = /obj/item/reagent_containers/food/snacks/sliceable/orangecake -/datum/recipe/cake/lime - appliance = OVEN - fruit = list("lime" = 1) +/datum/cooking_recipe/cake/lime + required_method = METHOD_OVEN + fruit = list("lime" = 100) reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "limejuice" = 3, "sugar" = 5) result = /obj/item/reagent_containers/food/snacks/sliceable/limecake -/datum/recipe/cake/lemon - appliance = OVEN - fruit = list("lemon" = 1) +/datum/cooking_recipe/cake/lemon + required_method = METHOD_OVEN + fruit = list("lemon" = 100) reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "lemonjuice" = 3, "sugar" = 5) result = /obj/item/reagent_containers/food/snacks/sliceable/lemoncake -/datum/recipe/cake/chocolate - appliance = OVEN +/datum/cooking_recipe/cake/chocolate + required_method = METHOD_OVEN items = list(/obj/item/reagent_containers/food/snacks/chocolatebar) reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "coco" = 4, "sugar" = 5) result = /obj/item/reagent_containers/food/snacks/sliceable/chocolatecake -/datum/recipe/cake/birthday - appliance = OVEN +/datum/cooking_recipe/cake/birthday + required_method = METHOD_OVEN items = list(/obj/item/clothing/head/cakehat) result = /obj/item/reagent_containers/food/snacks/sliceable/birthdaycake -/datum/recipe/cake/apple - appliance = OVEN - fruit = list("apple" = 2) +/datum/cooking_recipe/cake/apple + required_method = METHOD_OVEN + fruit = list("apple" = 100) result = /obj/item/reagent_containers/food/snacks/sliceable/applecake -/datum/recipe/cake/brain - appliance = OVEN +/datum/cooking_recipe/cake/brain + required_method = METHOD_OVEN items = list(/obj/item/organ/internal/brain) result = /obj/item/reagent_containers/food/snacks/sliceable/braincake -/datum/recipe/honeycake - appliance = OVEN +/datum/cooking_recipe/honeycake + required_method = METHOD_OVEN reagents = list("milk" = 5, "flour" = 10, "egg" = 6, "honey" = 5) result = /obj/item/reagent_containers/food/snacks/honeycake -/datum/recipe/pancakes - appliance = OVEN - fruit = list("berries" = 2) +/datum/cooking_recipe/berryclafoutis + fruit = list("berries" = 20) items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/sliceable/flatdough + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 100 ) - result = /obj/item/reagent_containers/food/snacks/pancakes + result = /obj/item/reagent_containers/food/snacks/berryclafoutis -/datum/recipe/lasagna - appliance = OVEN - fruit = list("tomato" = 2, "eggplant" = 1) +/datum/cooking_recipe/lasagna + required_method = METHOD_OVEN + fruit = list("tomato" = 200) items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/cutlet, - /obj/item/reagent_containers/food/snacks/cutlet + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 200, + /obj/item/reagent_containers/food/snacks/ingredient/cutlet = 200 ) result = /obj/item/reagent_containers/food/snacks/lasagna - reagent_mix = RECIPE_REAGENT_REPLACE -/datum/recipe/honeybun - appliance = OVEN +/datum/cooking_recipe/honeybun + required_method = METHOD_OVEN items = list( - /obj/item/reagent_containers/food/snacks/dough + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough = 100 ) reagents = list("honey" = 5) result = /obj/item/reagent_containers/food/snacks/honeybun -/datum/recipe/enchiladas_new - appliance = OVEN - fruit = list("chili" = 2) +/datum/cooking_recipe/enchiladas_new + required_method = METHOD_OVEN + fruit = list("chili" = 20) items = list( - /obj/item/reagent_containers/food/snacks/cutlet, - /obj/item/reagent_containers/food/snacks/tortilla + /obj/item/reagent_containers/food/snacks/ingredient/cutlet = 100, + /obj/item/reagent_containers/food/snacks/ingredient/tortilla = 100 ) result = /obj/item/reagent_containers/food/snacks/enchiladas -//Bacon -/datum/recipe/bacon_oven - appliance = OVEN +/datum/cooking_recipe/meat_pocket + required_method = METHOD_OVEN items = list( - /obj/item/reagent_containers/food/snacks/rawbacon, - /obj/item/reagent_containers/food/snacks/rawbacon, - /obj/item/reagent_containers/food/snacks/rawbacon, - /obj/item/reagent_containers/food/snacks/rawbacon, - /obj/item/reagent_containers/food/snacks/rawbacon, - /obj/item/reagent_containers/food/snacks/rawbacon, - /obj/item/reagent_containers/food/snacks/spreads - ) - result = /obj/item/reagent_containers/food/snacks/bacon/oven - result_quantity = 6 - -/datum/recipe/meat_pocket - appliance = OVEN - items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/meatball, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 100, + /obj/item/reagent_containers/food/snacks/ingredient/meatball = 100, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100 ) result = /obj/item/reagent_containers/food/snacks/meat_pocket - result_quantity = 2 + result_quantity = 4 -/datum/recipe/bacon_flatbread - appliance = OVEN - fruit = list("tomato" = 2) +/datum/cooking_recipe/bacon_flatbread + required_method = METHOD_OVEN + fruit = list("tomato" = 100) items = list( - /obj/item/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/reagent_containers/food/snacks/cheesewedge, - /obj/item/reagent_containers/food/snacks/bacon, - /obj/item/reagent_containers/food/snacks/bacon, - /obj/item/reagent_containers/food/snacks/bacon, - /obj/item/reagent_containers/food/snacks/bacon + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 100, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100, + /obj/item/reagent_containers/food/snacks/ingredient/bacon = 200 ) result = /obj/item/reagent_containers/food/snacks/bacon_flatbread -/datum/recipe/truffle - appliance = OVEN +/datum/cooking_recipe/truffle + required_method = METHOD_OVEN reagents = list("sugar" = 5, "cream" = 5) items = list( /obj/item/reagent_containers/food/snacks/chocolatebar ) - reagent_mix = RECIPE_REAGENT_REPLACE + result = /obj/item/reagent_containers/food/snacks/truffle result_quantity = 4 -/datum/recipe/croissant - appliance = OVEN +/datum/cooking_recipe/eggplantparm + required_method = METHOD_OVEN + fruit = list("eggplant" = 400) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 200 + ) + result = /obj/item/reagent_containers/food/snacks/eggplantparm + +/datum/cooking_recipe/croissant + required_method = METHOD_OVEN reagents = list("sodiumchloride" = 1, "water" = 5, "milk" = 5) - reagent_mix = RECIPE_REAGENT_REPLACE - items = list(/obj/item/reagent_containers/food/snacks/dough) + + items = list(/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice = 100) result = /obj/item/reagent_containers/food/snacks/croissant -/datum/recipe/macncheese - appliance = OVEN +/* todo: fix +/datum/cooking_recipe/macncheese + required_method = METHOD_OVEN reagents = list("milk" = 5) - reagent_mix = RECIPE_REAGENT_REPLACE items = list( - /obj/item/reagent_containers/food/snacks/spagetti, - /obj/item/reagent_containers/food/snacks/cheesewedge + /obj/item/reagent_containers/food/snacks/ingredient/spaghetti = 100, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100 ) result = /obj/item/reagent_containers/food/snacks/macncheese +*/ -/datum/recipe/ham - appliance = OVEN +/datum/cooking_recipe/ham + required_method = METHOD_OVEN reagents = list("brine" = 15) - reagent_mix = RECIPE_REAGENT_REPLACE items = list( - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat, - /obj/item/reagent_containers/food/snacks/meat + /obj/item/reagent_containers/food/snacks/ingredient/meat = 300, ) - result = /obj/item/reagent_containers/food/snacks/ham + result = /obj/item/reagent_containers/food/snacks/ingredient/ham -/datum/recipe/rumham - appliance = OVEN +/datum/cooking_recipe/rumham + required_method = METHOD_OVEN reagents = list("rum" = 10) - fruit = list("cherries" = 1, "spineapple" = 1) - reagent_mix = RECIPE_REAGENT_REPLACE + fruit = list("cherries" = 20, "spineapple" = 20) + items = list( - /obj/item/reagent_containers/food/snacks/ham + /obj/item/reagent_containers/food/snacks/ingredient/ham = 300 ) result = /obj/item/reagent_containers/food/snacks/rumham + +/datum/cooking_recipe/loadedbakedpotato + required_method = METHOD_OVEN + fruit = list("potato" = 100) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 20) + result = /obj/item/reagent_containers/food/snacks/loadedbakedpotato + +/datum/cooking_recipe/donerkebab + required_method = METHOD_OVEN + fruit = list("tomato" = 100, "cabbage" = 100) + reagents = list("sodiumchloride" = 1) + items = list( + /obj/item/reagent_containers/food/snacks/meatsteak = 100, + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 100 + ) + result = /obj/item/reagent_containers/food/snacks/donerkebab + +/datum/cooking_recipe/fishfingers + required_method = METHOD_OVEN + reagents = list("flour" = 10,"egg" = 3) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/carp = 100 + ) + result = /obj/item/reagent_containers/food/snacks/fishfingers + reagent_mix = RECIPE_REAGENT_REPLACE + + +/datum/cooking_recipe/tofurkey + required_method = METHOD_OVEN + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/tofu = 800, + /obj/item/reagent_containers/food/snacks/stuffing + ) + result = /obj/item/reagent_containers/food/snacks/tofurkey + +/datum/cooking_recipe/chilicheesefries + required_method = METHOD_OVEN + items = list( + /obj/item/reagent_containers/food/snacks/fries, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100, + /obj/item/reagent_containers/food/snacks/hotchili //lol. + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/reagent_containers/food/snacks/chilicheesefries + +/datum/cooking_recipe/meatbun + required_method = METHOD_OVEN + reagents = list("sodiumchloride" = 1, "water" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice = 100, + /obj/item/reagent_containers/food/snacks/ingredient/cutlet = 50 + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Water used up in cooking + result = /obj/item/reagent_containers/food/snacks/meatbun + +/datum/cooking_recipe/custardbun + required_method = METHOD_OVEN + reagents = list("spacespice" = 1, "water" = 5, "egg" = 3) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice = 100 + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Water, egg used up in cooking + result = /obj/item/reagent_containers/food/snacks/custardbun + +/datum/cooking_recipe/chips + required_method = METHOD_OVEN + reagents = list("sodiumchloride" = 1) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/tortilla + ) + result = /obj/item/reagent_containers/food/snacks/chipplate + +/datum/cooking_recipe/nachos + required_method = METHOD_OVEN + items = list( + /obj/item/reagent_containers/food/snacks/chipplate, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100 + ) + result = /obj/item/reagent_containers/food/snacks/chipplate/nachos + +/datum/cooking_recipe/roastbeef + required_method = METHOD_OVEN + fruit = list("carrot" = 100, "potato" = 100) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/meat = 100 + ) + result = /obj/item/reagent_containers/food/snacks/roastbeef + +/datum/cooking_recipe/pillbugball + required_method = METHOD_OVEN + reagents = list(MAT_CARBON = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/meat/grubmeat = 100 + ) + result = /obj/item/reagent_containers/food/snacks/bugball + +/datum/cooking_recipe/mammi + required_method = METHOD_OVEN + fruit = list("orange" = 20) + reagents = list("water" = 10, "flour" = 10, "milk" = 5, "sodiumchloride" = 1) + result = /obj/item/reagent_containers/food/snacks/mammi + +/datum/cooking_recipe/makaroni + required_method = METHOD_OVEN + reagents = list("flour" = 15, "milk" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/meat/grubmeat = 100, + /obj/item/reagent_containers/food/snacks/ingredient/egg = 100, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 200 + ) + result = /obj/item/reagent_containers/food/snacks/makaroni + +/datum/cooking_recipe/greenham + required_method = METHOD_OVEN + reagents = list("spacespice" = 2, "water" = 10) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/meat/grubmeat = 100, + /obj/item/reagent_containers/food/snacks/bait/worm + ) + result = /obj/item/reagent_containers/food/snacks/greenham + +/datum/cooking_recipe/greenhamandeggs + required_method = METHOD_OVEN + reagents = list("spacespice" = 2, "water" = 10) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/egg = 200, + /obj/item/reagent_containers/food/snacks/ingredient/meat/grubmeat = 100, + /obj/item/reagent_containers/food/snacks/bait/worm + ) + result = /obj/item/reagent_containers/food/snacks/greenham + +/datum/cooking_recipe/puddi + required_method = METHOD_OVEN + reagents = list("milk" = 10, "sugar" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/egg = 300, + /obj/item/reagent_containers/food/snacks/chocolatebar + ) + result = /obj/item/reagent_containers/food/snacks/puddi + +/datum/cooking_recipe/puddi_happy + required_method = METHOD_OVEN + reagents = list("milk" = 10, "sugar" = 5, "honey" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/egg = 300, + /obj/item/reagent_containers/food/snacks/chocolatebar + ) + result = /obj/item/reagent_containers/food/snacks/puddi/happy + +/datum/cooking_recipe/puddi_angry + required_method = METHOD_OVEN + fruit = list("chili" = 200) + reagents = list("milk" = 10, "sugar" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/egg = 300, + /obj/item/reagent_containers/food/snacks/chocolatebar + ) + result = /obj/item/reagent_containers/food/snacks/puddi/angry + + +/datum/cooking_recipe/applepie + required_method = METHOD_OVEN + fruit = list("apple" = 100) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 100) + result = /obj/item/reagent_containers/food/snacks/applepie + +/datum/cooking_recipe/plumphelmetbiscuit + required_method = METHOD_OVEN + fruit = list("plumphelmet" = 20) + reagents = list("water" = 5, "flour" = 5) + result = /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit diff --git a/code/modules/food/recipes_stove.dm b/code/modules/food/recipes_stove.dm new file mode 100644 index 000000000000..97dc703794ea --- /dev/null +++ b/code/modules/food/recipes_stove.dm @@ -0,0 +1,682 @@ +/datum/cooking_recipe/stuffing + required_method = METHOD_STOVE + reagents = list("water" = 5, "sodiumchloride" = 1, "blackpepper" = 1) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/bread = 100 + ) + result = /obj/item/reagent_containers/food/snacks/stuffing + +/* potential recipes to obliterate +custom foods handle soups pretty well, so +/datum/cooking_recipe/meatballsoup + fruit = list("carrot" = 100, "potato" = 100) + reagents = list("water" = 10) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/meatball) + result = /obj/item/reagent_containers/food/snacks/meatballsoup + +/datum/cooking_recipe/vegetablesoup + fruit = list("carrot" = 1, "potato" = 1, "corn" = 1, "eggplant" = 1) + reagents = list("water" = 10) + result = /obj/item/reagent_containers/food/snacks/vegetablesoup + +/datum/cooking_recipe/nettlesoup + fruit = list("nettle" = 1, "potato" = 1, ) + reagents = list("water" = 10, "egg" = 3) + result = /obj/item/reagent_containers/food/snacks/nettlesoup + +/datum/cooking_recipe/wishsoup + reagents = list("water" = 20) + result= /obj/item/reagent_containers/food/snacks/wishsoup + +/datum/cooking_recipe/hotchili + fruit = list("chili" = 1, "tomato" = 1) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/meat) + result = /obj/item/reagent_containers/food/snacks/hotchili + +/datum/cooking_recipe/coldchili + fruit = list("icechili" = 1, "tomato" = 1) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/meat) + result = /obj/item/reagent_containers/food/snacks/coldchili + +/datum/cooking_recipe/tomatosoup + fruit = list("tomato" = 2) + reagents = list("water" = 10) + result = /obj/item/reagent_containers/food/snacks/tomatosoup + +/datum/cooking_recipe/stew + fruit = list("potato" = 1, "tomato" = 1, "carrot" = 1, "eggplant" = 1, "mushroom" = 1) + reagents = list("water" = 10) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/meat) + result = /obj/item/reagent_containers/food/snacks/stew + +/datum/cooking_recipe/dishostew + fruit = list("disho" = 3, "mushroom" = 2, "chili" = 1) + reagents = list("water" = 10) + result = /obj/item/reagent_containers/food/snacks/dishostew + +/datum/cooking_recipe/milosoup + reagents = list("water" = 10) + items = list( + /obj/item/reagent_containers/food/snacks/soydope, + /obj/item/reagent_containers/food/snacks/soydope, //what the fuck is a soy dope + /obj/item/reagent_containers/food/snacks/ingredient/tofu, //it's soy, man. and that's pretty dope. + /obj/item/reagent_containers/food/snacks/ingredient/tofu //(it's refined soy protein isolate that's blended into a viscous, proteinaceous slurry) + ) + result = /obj/item/reagent_containers/food/snacks/milosoup + + +/datum/cooking_recipe/bloodsoup + reagents = list("blood" = 30) + result = /obj/item/reagent_containers/food/snacks/bloodsoup + +/datum/cooking_recipe/slimesoup + reagents = list("water" = 10, "slimejelly" = 5) + items = list() + result = /obj/item/reagent_containers/food/snacks/slimesoup + + + +/datum/cooking_recipe/mysterysoup + reagents = list("water" = 10, "egg" = 3) + items = list( + /obj/item/reagent_containers/food/snacks/badrecipe, + /obj/item/reagent_containers/food/snacks/ingredient/tofu, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge + ) + reagent_mix = RECIPE_REAGENT_REPLACE + result = /obj/item/reagent_containers/food/snacks/mysterysoup + +/datum/cooking_recipe/mushroomsoup + fruit = list("mushroom" = 1) + reagents = list("water" = 5, "milk" = 5) + reagent_mix = RECIPE_REAGENT_REPLACE + result = /obj/item/reagent_containers/food/snacks/mushroomsoup + +/datum/cooking_recipe/beetsoup + fruit = list("whitebeet" = 1, "cabbage" = 1) + reagents = list("water" = 10) + result = /obj/item/reagent_containers/food/snacks/beetsoup + +/datum/cooking_recipe/dishosoup + fruit = list("disho" = 1) + reagents = list("water" = 10) + result = /obj/item/reagent_containers/food/snacks/dishosoup + +/datum/cooking_recipe/tossedsalad + fruit = list("cabbage" = 2, "tomato" = 1, "carrot" = 1, "apple" = 1) + result = /obj/item/reagent_containers/food/snacks/tossedsalad + +/datum/cooking_recipe/aesirsalad + fruit = list("goldapple" = 1, "ambrosiadeus" = 1) + result = /obj/item/reagent_containers/food/snacks/aesirsalad + +/datum/cooking_recipe/validsalad + fruit = list("potato" = 1, "ambrosia" = 3) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/meatball) + result = /obj/item/reagent_containers/food/snacks/validsalad + +/datum/cooking_recipe/validsalad/make_food(obj/container) + . = ..(container) + for (var/obj/item/reagent_containers/food/snacks/validsalad/being_cooked in .) + being_cooked.reagents.del_reagent("toxin") + +/datum/cooking_recipe/bearchili + fruit = list("chili" = 1, "tomato" = 1) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/bearmeat) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/reagent_containers/food/snacks/bearchili + +/datum/cooking_recipe/bearstew + fruit = list("potato" = 1, "tomato" = 1, "carrot" = 1, "eggplant" = 1, "mushroom" = 1) + reagents = list("water" = 10) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/bearmeat) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/reagent_containers/food/snacks/bearstew + +/datum/cooking_recipe/onionsoup + fruit = list("onion" = 1) + reagents = list("water" = 10) + result = /obj/item/reagent_containers/food/snacks/soup/onion + */ + +/datum/cooking_recipe/boiledspaghetti + required_method = METHOD_STOVE + reagents = list("water" = 30) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/spaghetti = 100 + ) + result = /obj/item/reagent_containers/food/snacks/boiledspaghetti //ingredient this?? + +/datum/cooking_recipe/veggiestock + required_method = METHOD_STOVE + reagents = list("water" = 60, "sodiumchloride" = 5) + fruit = list("carrot" = 100, "onion" = 100) + result = null + result_reagents = list("vegbroth" = 60) + +/datum/cooking_recipe/chickenstock + required_method = METHOD_STOVE + reagents = list("water" = 60, "sodiumchloride" = 10) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/meat/chicken = 100 + ) + result = null + result_reagents = list("chickenbroth" = 60) + +/datum/cooking_recipe/meatstock + required_method = METHOD_STOVE + reagents = list("water" = 60, "sodiumchloride" = 10) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/meat = 100 + ) + result = null + result_reagents = list("meatbroth" = 60) + +/datum/cooking_recipe/fishstock + required_method = METHOD_STOVE + reagents = list("water" = 60, "sodiumchloride" = 10) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/carp = 100 + ) + result = null + result_reagents = list("fishbroth" = 60) + + +//temporary recipes until we get reagent temperature +//so you can crack an egg in a skillet and then fry it +/datum/cooking_recipe/friedegg + required_method = METHOD_STOVE + reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/egg = 100 + ) + result = /obj/item/reagent_containers/food/snacks/friedegg + +/datum/cooking_recipe/boiledegg + required_method = METHOD_STOVE + reagents = list("water" = 15) + reagent_mix = RECIPE_REAGENT_REPLACE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/egg = 100 + ) + result = /obj/item/reagent_containers/food/snacks/boiledegg + +/datum/cooking_recipe/pancakes + required_method = METHOD_STOVE + fruit = list("berries" = 20) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/flat = 200 + ) + result = /obj/item/reagent_containers/food/snacks/pancakes + + +/datum/cooking_recipe/waffles + reagents = list("sugar" = 10) + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough = 200 + ) + result = /obj/item/reagent_containers/food/snacks/waffles + +/datum/cooking_recipe/omelette + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100, + ) + reagents = list("egg" = 6) + reagent_mix = RECIPE_REAGENT_REPLACE + result = /obj/item/reagent_containers/food/snacks/omelette + +/datum/cooking_recipe/popcorn + required_method = METHOD_STOVE + fruit = list("corn" = 100) + reagents = list("cooking_oil" = 5) + result = /obj/item/reagent_containers/food/snacks/popcorn + +/datum/cooking_recipe/meatsteak + required_method = METHOD_STOVE + items = list(/obj/item/reagent_containers/food/snacks/ingredient/meat = 100) + result = /obj/item/reagent_containers/food/snacks/meatsteak + +/datum/cooking_recipe/syntisteak + required_method = METHOD_STOVE + items = list(/obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh = 100) + result = /obj/item/reagent_containers/food/snacks/meatsteak + +/datum/cooking_recipe/stewedsoymeat + required_method = METHOD_STOVE + reagents = list("vegbroth" = 20) + items = list( + /obj/item/reagent_containers/food/snacks/soydope = 200 + ) + result = /obj/item/reagent_containers/food/snacks/stewedsoymeat + +/datum/cooking_recipe/pastatomato + required_method = METHOD_STOVE + fruit = list("tomato" = 40) + reagents = list("water" = 5) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/spaghetti = 100) + result = /obj/item/reagent_containers/food/snacks/pastatomato + +/datum/cooking_recipe/meatballspaghetti + required_method = METHOD_STOVE + reagents = list("water" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/spaghetti = 100, + /obj/item/reagent_containers/food/snacks/ingredient/meatball = 100 + ) + result = /obj/item/reagent_containers/food/snacks/meatballspaghetti + +/datum/cooking_recipe/spesslaw + required_method = METHOD_STOVE + reagents = list("water" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/spaghetti = 100, + /obj/item/reagent_containers/food/snacks/ingredient/meatball = 400 + ) + result = /obj/item/reagent_containers/food/snacks/spesslaw + +/datum/cooking_recipe/mashedpotato + required_method = METHOD_STOVE + reagents = list("milk" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/spreads/butter // to prevent conflicts with yellow curry + ) + fruit = list("potato" = 100) + result = /obj/item/reagent_containers/food/snacks/mashedpotato + + + +///////////////////////////////////////////////////////////// +//Synnono Meme Foods +// +//Most recipes replace reagents with RECIPE_REAGENT_REPLACE +//to simplify the end product and balance the amount of reagents +//in some foods. Many require the space spice reagent/condiment +//to reduce the risk of future recipe conflicts. +///////////////////////////////////////////////////////////// + + +/datum/cooking_recipe/redcurry + required_method = METHOD_STOVE + reagents = list("cream" = 5, "spacespice" = 2, "rice" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/cutlet = 200 + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/reagent_containers/food/snacks/redcurry + +/datum/cooking_recipe/greencurry + required_method = METHOD_STOVE + reagents = list("cream" = 5, "spacespice" = 2, "rice" = 5) + fruit = list("chili" = 10) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/tofu = 200 + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/reagent_containers/food/snacks/greencurry + +/datum/cooking_recipe/yellowcurry + required_method = METHOD_STOVE + reagents = list("cream" = 5, "spacespice" = 2, "rice" = 5) + fruit = list("peanut" = 20, "potato" = 300) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/reagent_containers/food/snacks/yellowcurry + + + + + +/datum/cooking_recipe/bibimbap + required_method = METHOD_STOVE + fruit = list("carrot" = 100, "cabbage" = 100, "mushroom" = 100) + reagents = list("rice" = 5, "spacespice" = 2) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/egg = 100, + /obj/item/reagent_containers/food/snacks/ingredient/cutlet = 100 + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/reagent_containers/food/snacks/bibimbap + +/datum/cooking_recipe/friedrice + required_method = METHOD_STOVE + reagents = list("water" = 5, "rice" = 10, "soysauce" = 5) + fruit = list("carrot" = 100, "cabbage" = 100) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/reagent_containers/food/snacks/friedrice + +/datum/cooking_recipe/lomein + required_method = METHOD_STOVE + reagents = list("water" = 5, "soysauce" = 5) + fruit = list("carrot" = 100, "cabbage" = 100) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/spaghetti = 100 + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/reagent_containers/food/snacks/lomein + +/datum/cooking_recipe/chickenmomo + required_method = METHOD_STOVE + reagents = list("spacespice" = 2, "water" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice = 300, + /obj/item/reagent_containers/food/snacks/ingredient/meat/chicken = 100 + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/reagent_containers/food/snacks/chickenmomo + +/datum/cooking_recipe/veggiemomo + required_method = METHOD_STOVE + reagents = list("spacespice" = 2, "water" = 5) + fruit = list("carrot" = 100, "cabbage" = 100) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/slice = 300 + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Get that water outta here + result = /obj/item/reagent_containers/food/snacks/veggiemomo + +/datum/cooking_recipe/risotto + required_method = METHOD_STOVE + reagents = list("wine" = 5, "rice" = 10, "spacespice" = 1) + fruit = list("mushroom" = 100) + reagent_mix = RECIPE_REAGENT_REPLACE + result = /obj/item/reagent_containers/food/snacks/risotto + +/datum/cooking_recipe/poachedegg + required_method = METHOD_STOVE + reagents = list("spacespice" = 1, "sodiumchloride" = 1, "blackpepper" = 1, "water" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/egg = 100 + ) + reagent_mix = RECIPE_REAGENT_REPLACE + result = /obj/item/reagent_containers/food/snacks/poachedegg + +/datum/cooking_recipe/honeytoast + required_method = METHOD_STOVE + reagents = list("honey" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/slice/bread = 100 + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/reagent_containers/food/snacks/honeytoast + +/datum/cooking_recipe/cheesesauce + required_method = METHOD_STOVE + fruit = list("chili" = 20, "tomato" = 20) + reagents = list("spacespice" = 1, "blackpepper" = 1,"sodiumchloride" = 1) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 20 + ) + result = /obj/item/reagent_containers/food/snacks/dip + reagent_mix = RECIPE_REAGENT_REPLACE //Ingredients are mixed together. + +/datum/cooking_recipe/salsa + required_method = METHOD_STOVE + fruit = list("chili" = 1, "tomato" = 1, "lime" = 1) + reagents = list("spacespice" = 1, "blackpepper" = 1,"sodiumchloride" = 1) + result = /obj/item/reagent_containers/food/snacks/dip/salsa + reagent_mix = RECIPE_REAGENT_REPLACE //Ingredients are mixed together. + +/datum/cooking_recipe/guac //guac on da stove + required_method = METHOD_STOVE + fruit = list("chili" = 10, "lime" = 10) + reagents = list("spacespice" = 1, "blackpepper" = 1,"sodiumchloride" = 1) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/tofu = 20 + ) + result = /obj/item/reagent_containers/food/snacks/dip/guac + reagent_mix = RECIPE_REAGENT_REPLACE //Ingredients are mixed together. + +/datum/cooking_recipe/chilied_eggs + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/hotchili, + /obj/item/reagent_containers/food/snacks/boiledegg = 3 + ) + result = /obj/item/reagent_containers/food/snacks/chilied_eggs + +/datum/cooking_recipe/red_sun_special + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/sausage = 100, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100 + + ) + result = /obj/item/reagent_containers/food/snacks/red_sun_special + +/datum/cooking_recipe/hatchling_suprise + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/poachedegg, + /obj/item/reagent_containers/food/snacks/ingredient/bacon = 300 + + ) + result = /obj/item/reagent_containers/food/snacks/hatchling_suprise + +/datum/cooking_recipe/riztizkzi_sea + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/egg = 300 + ) + reagents = list("blood" = 15) + result = /obj/item/reagent_containers/food/snacks/riztizkzi_sea + +/datum/cooking_recipe/father_breakfast + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/sausage = 100, + /obj/item/reagent_containers/food/snacks/omelette, + /obj/item/reagent_containers/food/snacks/meatsteak + ) + result = /obj/item/reagent_containers/food/snacks/father_breakfast + +/datum/cooking_recipe/stuffed_meatball + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/meatball = 20, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100 + ) + fruit = list("cabbage" = 100) + result = /obj/item/reagent_containers/food/snacks/stuffed_meatball + +/datum/cooking_recipe/egg_pancake + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/meatball = 300, + /obj/item/reagent_containers/food/snacks/omelette + ) + result = /obj/item/reagent_containers/food/snacks/egg_pancake + +/datum/cooking_recipe/grilled_carp + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/carp = 600 + ) + reagents = list("spacespice" = 1) + fruit = list("lime" = 20) + result = /obj/item/reagent_containers/food/snacks/sliceable/grilled_carp + +/datum/cooking_recipe/bacon_stick + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/bacon = 100, + /obj/item/reagent_containers/food/snacks/boiledegg + ) + result = /obj/item/reagent_containers/food/snacks/bacon_stick + +/datum/cooking_recipe/porkbowl + required_method = METHOD_STOVE + reagents = list("water" = 5, "rice" = 10) + reagent_mix = RECIPE_REAGENT_REPLACE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/bacon = 100 + ) + result = /obj/item/reagent_containers/food/snacks/porkbowl + +/datum/cooking_recipe/goulash + required_method = METHOD_STOVE + fruit = list("tomato" = 100) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/cutlet = 100, + /obj/item/reagent_containers/food/snacks/ingredient/spaghetti = 100 + ) + result = /obj/item/reagent_containers/food/snacks/goulash + +/datum/cooking_recipe/hotandsoursoup + required_method = METHOD_STOVE + fruit = list("cabbage" = 50, "mushroom" = 50) + reagents = list("sodiumchloride" = 2, "blackpepper" = 2, "water" = 10) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/tofu = 100 + ) + result = /obj/item/reagent_containers/food/snacks/hotandsoursoup + +/datum/cooking_recipe/kitsuneudon + required_method = METHOD_STOVE + reagents = list("egg" = 3) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/spaghetti = 100, + /obj/item/reagent_containers/food/snacks/ingredient/tofu = 100 + ) + result = /obj/item/reagent_containers/food/snacks/kitsuneudon + +/datum/cooking_recipe/diggerstew + required_method = METHOD_STOVE + fruit = list("carrot" = 100, "mushroom" = 100) + reagents = list("spacespice" = 2, "water" = 10) + items = list( + /obj/item/reagent_containers/food/snacks/bait/worm, + /obj/item/reagent_containers/food/snacks/bait/worm, + /obj/item/reagent_containers/food/snacks/bait/worm + ) + result = /obj/item/reagent_containers/food/snacks/diggerstew + +/datum/cooking_recipe/diggerstew_pot + required_method = METHOD_STOVE + fruit = list("carrot" = 300, "potato" = 300, "mushroom" = 200) + reagents = list("spacespice" = 2, "water" = 10) + items = list( + /obj/item/reagent_containers/food/snacks/bait/worm, + /obj/item/reagent_containers/food/snacks/bait/worm, + /obj/item/reagent_containers/food/snacks/bait/worm + ) + result = /obj/item/reagent_containers/food/snacks/diggerstew_pot + +/datum/cooking_recipe/full_goss + required_method = METHOD_STOVE + fruit = list("carrot" = 100, "mushroom" = 100) + items = list( + /obj/item/reagent_containers/food/snacks/friedegg, + /obj/item/reagent_containers/food/snacks/ingredient/meat/grubmeat = 100 + ) + result = /obj/item/reagent_containers/food/snacks/full_goss + +/datum/cooking_recipe/chickensatay + required_method = METHOD_STOVE + fruit = list("peanut" = 10, "lime" = 10) + reagents = list("water" = 5, "milk" = 5, "soysauce" = 5, "sodiumchloride" = 1, "sugar" = 1) + items = list( + /obj/item/stack/rods, + /obj/item/reagent_containers/food/snacks/ingredient/meat/chicken = 100, + ) + result = /obj/item/reagent_containers/food/snacks/chickensatay + +/datum/cooking_recipe/spider_wingfangchu + required_method = METHOD_STOVE + reagents = list("soysauce" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat = 100 + ) + result = /obj/item/reagent_containers/food/snacks/spider_wingfangchu + + +/datum/cooking_recipe/mushroompasta + required_method = METHOD_STOVE + fruit = list("mushroom" = 100) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/spaghetti = 100) + reagents = list("water" = 5) + result = /obj/item/reagent_containers/food/snacks/mushroompasta + +/datum/cooking_recipe/carbonara + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/spaghetti = 100, + /obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100, + /obj/item/reagent_containers/food/snacks/ingredient/egg = 100, + /obj/item/reagent_containers/food/snacks/ingredient/meat = 100 + ) + reagents = list("water" = 5, "sodiumchloride" = 1, "blackpepper" = 1) + result = /obj/item/reagent_containers/food/snacks/carbonara + +/datum/cooking_recipe/bloodsausage + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/sausage = 100 + ) + reagents = list("blood" = 15) + result = /obj/item/reagent_containers/food/snacks/bloodsausage + +/datum/cooking_recipe/weisswurst + required_method = METHOD_STOVE + fruit = list("onion" = 20, "lemon" = 20) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/sausage = 100) + reagents = list("water" = 15, "sodiumchloride" = 1) + result = /obj/item/reagent_containers/food/snacks/weisswurst + +/datum/cooking_recipe/shrimpfriedrice + required_method = METHOD_STOVE + fruit = list("corn" = 100, "carrot" = 100, "peas" = 100) + reagents = list("water" = 5, "sodiumchloride" = 5) + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/shrimp = 100, + /obj/item/reagent_containers/food/snacks/boiledrice + ) + result = /obj/item/reagent_containers/food/snacks/shrimpfriedrice + +/datum/cooking_recipe/bowl_peas + required_method = METHOD_STOVE + fruit = list("peas" = 400) //fuck it, almost half a kilo of peas. have fun + reagents = list("water" = 5, "sodiumchloride" = 1) + items = list( + /obj/item/reagent_containers/food/snacks/spreads/butter + ) + result = /obj/item/reagent_containers/food/snacks/bowl_peas + +/datum/cooking_recipe/boiledrice + required_method = METHOD_STOVE + reagents = list("water" = 5, "rice" = 10) + result = /obj/item/reagent_containers/food/snacks/boiledrice + +/datum/cooking_recipe/ricepudding + required_method = METHOD_STOVE + reagents = list("milk" = 5, "rice" = 10) + result = /obj/item/reagent_containers/food/snacks/ricepudding + +/datum/cooking_recipe/candiedapple + required_method = METHOD_STOVE + fruit = list("apple" = 100) + reagents = list("water" = 5, "sugar" = 5) + result = /obj/item/reagent_containers/food/snacks/candiedapple + +/datum/cooking_recipe/sausage + required_method = METHOD_STOVE + items = list( + /obj/item/reagent_containers/food/snacks/ingredient/meatball = 100, + /obj/item/reagent_containers/food/snacks/ingredient/cutlet = 100 + ) + result = /obj/item/reagent_containers/food/snacks/ingredient/sausage + result_quantity = 2 + +/datum/cooking_recipe/chawanmushi + required_method = METHOD_STOVE + fruit = list("mushroom" = 100) + reagents = list("water" = 5, "soysauce" = 5, "egg" = 6) + reagent_mix = RECIPE_REAGENT_REPLACE + result = /obj/item/reagent_containers/food/snacks/chawanmushi + +/datum/cooking_recipe/frenchonionsoup + required_method = METHOD_STOVE + fruit = list("onion" = 100) + items = list(/obj/item/reagent_containers/food/snacks/ingredient/cheesewedge = 100) + reagents = list("water" = 10, "sodiumchloride" = 1, "sugar" = 1) + result = /obj/item/reagent_containers/food/snacks/frenchonionsoup diff --git a/code/modules/ghostroles/roles/ashlander.dm b/code/modules/ghostroles/roles/ashlander.dm index b228bc81ce00..5ed0f6408991 100644 --- a/code/modules/ghostroles/roles/ashlander.dm +++ b/code/modules/ghostroles/roles/ashlander.dm @@ -81,7 +81,7 @@ /datum/crafting_recipe/primalretractor, /datum/crafting_recipe/primalhemostat, /datum/crafting_recipe/primalcautery, /datum/crafting_recipe/primalscalpel, /datum/crafting_recipe/primalsaw, /datum/crafting_recipe/primalsetter, /datum/crafting_recipe/bone_crowbar, /datum/crafting_recipe/bone_screwdriver, /datum/crafting_recipe/bone_wrench, /datum/crafting_recipe/bone_wirecutters, /datum/crafting_recipe/bone_welder, /datum/crafting_recipe/munition_box, /datum/crafting_recipe/powder_horn, /datum/crafting_recipe/bonesword, /datum/crafting_recipe/bonesword_elder, - /datum/crafting_recipe/saddle_shank, /datum/crafting_recipe/bonepickaxe, /datum/crafting_recipe/alchemy_station, /datum/crafting_recipe/calcinator, /datum/crafting_recipe/cooking_spit, + /datum/crafting_recipe/saddle_shank, /datum/crafting_recipe/bonepickaxe, /datum/crafting_recipe/alchemy_station, /datum/crafting_recipe/calcinator, /datum/crafting_recipe/stone_dropper, /datum/crafting_recipe/goliath_gloves, /datum/crafting_recipe/stone_mortar, /datum/crafting_recipe/bone_arrow, /datum/crafting_recipe/hard_bone_arrow, /datum/crafting_recipe/goliath_mining_satchel, /datum/crafting_recipe/ashlander_armor, /datum/crafting_recipe/ashlander_helmet, /datum/crafting_recipe/ashlander_tunic, /datum/crafting_recipe/ashlander_tunic_fem, /datum/crafting_recipe/tying_post, /datum/crafting_recipe/goliath_curtain, /datum/crafting_recipe/goliath_plant_bag, /datum/crafting_recipe/goliath_halfcloak, diff --git a/code/modules/guidebook/guidebook.dm b/code/modules/guidebook/guidebook.dm index 6aa92d6e6f1f..42a2112ca711 100644 --- a/code/modules/guidebook/guidebook.dm +++ b/code/modules/guidebook/guidebook.dm @@ -25,7 +25,7 @@ GLOBAL_DATUM_INIT(guidebook, /datum/guidebook, new) return ..() /** - * @params + * @param * * user - person viewing * * sections - list of section instances, ids, or paths */ @@ -68,3 +68,11 @@ GLOBAL_DATUM_INIT(guidebook, /datum/guidebook, new) set category = "OOC" GLOB.guidebook.ui_interact(src) + +/client/verb/access_guidebook_food() + set name = "Access Recipe Guidebook" + set category = "OOC" + + var/list/accessing_section = list() + accessing_section.Add(new /datum/prototype/guidebook_section/recipes) + GLOB.guidebook.open(src.mob, accessing_section) diff --git a/code/modules/guidebook/sections/recipes.dm b/code/modules/guidebook/sections/recipes.dm new file mode 100644 index 000000000000..aa31724a36e4 --- /dev/null +++ b/code/modules/guidebook/sections/recipes.dm @@ -0,0 +1,9 @@ +/datum/prototype/guidebook_section/recipes + title = "Cooking Recipes" + id = "recipes" + tgui_module = "TGUIGuidebookCookingRecipes" + +/datum/prototype/guidebook_section/recipes/section_data() + . = ..() + init_cooking_recipes_glob() + .["recipes"] = GLOB.cooking_recipes_tgui_guidebook_data diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 190209349338..813d37fde1c8 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -1,5 +1,5 @@ //Grown foods. -/obj/item/reagent_containers/food/snacks/grown +/obj/item/reagent_containers/food/snacks/ingredient/grown name = "fruit" icon = 'icons/obj/hydroponics_products.dmi' @@ -14,7 +14,7 @@ var/datum/seed/seed var/potency = -1 -/obj/item/reagent_containers/food/snacks/grown/Initialize(mapload, planttype) +/obj/item/reagent_containers/food/snacks/ingredient/grown/Initialize(mapload, planttype, make_chems = TRUE) . = ..() if(!dried_type) dried_type = type @@ -43,25 +43,33 @@ potency = seed.get_trait(TRAIT_POTENCY) - for(var/rid in seed.chems) - var/list/reagent_data = seed.chems[rid] - if(reagent_data && reagent_data.len) - var/rtotal = reagent_data[1] - var/list/data = list() - if(reagent_data.len > 1 && potency > 0) - rtotal += round(potency/reagent_data[2]) - if(rid == "nutriment") - data[seed.seed_name] = max(1,rtotal) - - reagents.add_reagent(rid,max(1,rtotal),data) + if(make_chems) + for(var/rid in seed.chems) + var/list/reagent_data = seed.chems[rid] + if(reagent_data && reagent_data.len) + var/rtotal = reagent_data[1] + var/list/data = list() + if(reagent_data.len > 1 && potency > 0) + rtotal += round(potency/reagent_data[2]) + if(rid == "nutriment") + data[seed.seed_name] = max(1,rtotal) + + reagents.add_reagent(rid,max(1,rtotal),data) + update_desc() if(reagents.total_volume > 0) bitesize = 1+round(reagents.total_volume / 2, 1) if(seed.get_trait(TRAIT_STINGS)) damage_force = 1 catalogue_data = seed.catalog_data_grown + if(islist(seed.food_info)) + cookstage_information = seed.food_info + else //no csi, you become generic plant + cookstage_information = list(list(0, 1, "bland plant matter"), list(30 SECONDS, 1, "cooked plant matter"), list(40 SECONDS, 1, "wilting plamt matter"), list(60 SECONDS, 1, "a bland planty sludge")) + -/obj/item/reagent_containers/food/snacks/grown/update_desc() + +/obj/item/reagent_containers/food/snacks/ingredient/grown/update_desc() . = ..() if(!seed) return @@ -122,7 +130,7 @@ SSplants.product_descs["[seed.uid]"] = desc desc += ". Delicious! Probably." -/obj/item/reagent_containers/food/snacks/grown/update_icon() +/obj/item/reagent_containers/food/snacks/ingredient/grown/update_icon() if(!seed || !SSplants || !SSplants.plant_icon_cache) return cut_overlays() @@ -142,7 +150,7 @@ SSplants.plant_icon_cache[icon_key] = plant_icon add_overlay(plant_icon) -/obj/item/reagent_containers/food/snacks/grown/Crossed(var/mob/living/M) +/obj/item/reagent_containers/food/snacks/ingredient/grown/Crossed(var/mob/living/M) . = ..() if(M.is_incorporeal()) return @@ -165,11 +173,11 @@ qdel(src) return -/obj/item/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom) +/obj/item/reagent_containers/food/snacks/ingredient/grown/throw_impact(atom/hit_atom) if(seed) seed.thrown_at(src,hit_atom) ..() -/obj/item/reagent_containers/food/snacks/grown/attackby(var/obj/item/W, var/mob/living/user) +/obj/item/reagent_containers/food/snacks/ingredient/grown/attackby(var/obj/item/W, var/mob/living/user) if(seed) if(seed.get_trait(TRAIT_PRODUCES_POWER) && istype(W, /obj/item/stack/cable_coil)) @@ -210,7 +218,7 @@ return else if(!isnull(seed.chems["potato"])) to_chat(user, "You slice \the [src] into sticks.") - new /obj/item/reagent_containers/food/snacks/rawsticks(get_turf(src)) + new /obj/item/reagent_containers/food/snacks/ingredient/rawsticks(get_turf(src)) qdel(src) return else if(!isnull(seed.chems["carrotjuice"])) @@ -240,7 +248,7 @@ return ..() -/obj/item/reagent_containers/food/snacks/grown/melee_mob_hit(mob/target, mob/user, clickchain_flags, list/params, mult, target_zone, intent) +/obj/item/reagent_containers/food/snacks/ingredient/grown/melee_mob_hit(mob/target, mob/user, clickchain_flags, list/params, mult, target_zone, intent) . = ..() var/mob/living/L = target if(!istype(L)) @@ -258,7 +266,7 @@ to_chat(user, "\The [src] has fallen to bits.") qdel(src) -/obj/item/reagent_containers/food/snacks/grown/attack_self(mob/user) +/obj/item/reagent_containers/food/snacks/ingredient/grown/attack_self(mob/user) . = ..() if(.) return @@ -310,7 +318,7 @@ return */ -/obj/item/reagent_containers/food/snacks/grown/pickup(mob/user, flags, atom/oldLoc) +/obj/item/reagent_containers/food/snacks/ingredient/grown/pickup(mob/user, flags, atom/oldLoc) ..() if(!seed) return @@ -326,11 +334,43 @@ seed.do_sting(H,src,affected) // Predefined types for placing on the map. +/obj/item/reagent_containers/food/snacks/ingredient/grown/AltClick(mob/user) + if(!isliving(user)) + return ..() + if(food_weight < 1) + to_chat(user, SPAN_WARNING("There's not enough of [src] to split off!")) + return + var/amount = input("How much to split?", "Split ingredient") as null|num + amount = round(amount) //0.6 >> 1 + if(amount && amount < food_weight) + var/final_ratio = amount/food_weight + food_weight -= amount + update_icon() + var/obj/item/reagent_containers/food/snacks/ingredient/grown/split_ingredient = new /obj/item/reagent_containers/food/snacks/ingredient/grown(src, seed.name, FALSE) //dont make chems, we will fill it with chems + split_ingredient.cookstage = cookstage + split_ingredient.accumulated_time_cooked = accumulated_time_cooked + split_ingredient.reagents.clear_reagents() //so we aren't making it taste raw on init + split_ingredient.reagents.trans_to_holder(reagents, reagents.total_volume * final_ratio, 1, TRUE) + split_ingredient.food_weight = amount + split_ingredient.update_icon() + split_ingredient.update_desc() + user.put_in_hands_or_drop(split_ingredient) + to_chat(user, SPAN_NOTICE("You split off [src].")) + else + to_chat(user, SPAN_WARNING("There's not enough serves in the [src]!")) + +/obj/item/reagent_containers/food/snacks/ingredient/grown/check_merge(obj/item/reagent_containers/food/snacks/ingredient/add_ingredient, mob/user) + var/obj/item/reagent_containers/food/snacks/ingredient/grown/grown_add = add_ingredient + if(grown_add.plantname != src.plantname) + to_chat(user, SPAN_NOTICE("You can't mix different types of growns.")) + return FALSE + return ..() + -/obj/item/reagent_containers/food/snacks/grown/mushroom/libertycap +/obj/item/reagent_containers/food/snacks/ingredient/grown/mushroom/libertycap plantname = "libertycap" -/obj/item/reagent_containers/food/snacks/grown/ambrosiavulgaris +/obj/item/reagent_containers/food/snacks/ingredient/grown/ambrosiavulgaris plantname = "ambrosia" /obj/item/reagent_containers/food/snacks/fruit_slice @@ -368,3 +408,5 @@ var/list/fruit_icon_cache = list() overlays_to_add += fruit_icon_cache["slice-[rind_colour]"] add_overlay(overlays_to_add) + + diff --git a/code/modules/hydroponics/grown_predefined.dm b/code/modules/hydroponics/grown_predefined.dm index 196f72c6678f..95920a4742eb 100644 --- a/code/modules/hydroponics/grown_predefined.dm +++ b/code/modules/hydroponics/grown_predefined.dm @@ -1,5 +1,5 @@ -/obj/item/reagent_containers/food/snacks/grown/ambrosiavulgaris +/obj/item/reagent_containers/food/snacks/ingredient/grown/ambrosiavulgaris plantname = "ambrosia" -/obj/item/reagent_containers/food/snacks/grown/ambrosiadeus +/obj/item/reagent_containers/food/snacks/ingredient/grown/ambrosiadeus plantname = "ambrosiadeus" diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 67aac64879b0..f218260dd0bd 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -18,6 +18,7 @@ var/list/chems // Chemicals that plant produces in products/injects into victim. var/list/consume_gasses // The plant will absorb these gasses during its life. var/list/exude_gasses // The plant will exude these gasses during its life. + var/list/food_info // Used for plants that are grown and edible to get their data for newcooking. see cookstage_information on /obj/item/reagent_containers/food/snacks/ingredient to understand the format var/kitchen_tag // Used by the reagent grinder. var/trash_type // Garbage item produced when eaten. var/splat_type = /obj/effect/debris/cleanable/fruit_smudge // Graffiti decal. @@ -717,7 +718,7 @@ else if(has_item_product) product = new has_item_product(get_turf(user)) else - product = new /obj/item/reagent_containers/food/snacks/grown(get_turf(user),name) + product = new /obj/item/reagent_containers/food/snacks/ingredient/grown(get_turf(user),name) if(get_trait(TRAIT_PRODUCT_COLOUR)) if(!istype(product, /mob)) product.color = get_trait(TRAIT_PRODUCT_COLOUR) diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index 227313e13da3..5da2df2a1f50 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -6,6 +6,7 @@ kitchen_tag = "chili" chems = list("capsaicin" = list(3,5), "nutriment" = list(1,25)) mutants = list("icechili") + food_info = list(list(0, 1, "chili"), list(15 SECONDS, 1.2, "cooked chili peppers"), list(32 SECONDS, 1, "mushy chili peppers"), list(40 SECONDS, 0.9, "burnt chili peppers")) /datum/seed/chili/New() ..() @@ -27,6 +28,7 @@ kitchen_tag = "icechili" mutants = null chems = list("frostoil" = list(3,5), "nutriment" = list(1,50)) + food_info = list(list(0, 1, "ice pepper"), list(30 SECONDS, 1.2, "cooked ice peppers"), list(60 SECONDS, 1, "melting ice peppers"), list(75 SECONDS, 0.9, "burnt ice peppers")) /datum/seed/chili/ice/New() ..() @@ -42,6 +44,7 @@ kitchen_tag = "berries" mutants = list("glowberries","poisonberries") chems = list("nutriment" = list(1,10), "berryjuice" = list(10,10)) + food_info = list(list(0, 1, "fresh berries"), list(20 SECONDS, 1.2, "stewed berries"), list(30 SECONDS, 1, "overcooked berry mush"), list(40 SECONDS, 0.9, "carbon with a hint of berry")) /datum/seed/berry/New() ..() @@ -63,6 +66,7 @@ display_name = "glowberry bush" mutants = null chems = list("nutriment" = list(1,10), MAT_URANIUM = list(3,5)) + food_info = list(list(0, 1, "glowberries"), list(20 SECONDS, 1.2, "stewed glowberries"), list(30 SECONDS, 1, "overcooked glowing mush"), list(40 SECONDS, 0.9, "radioactive charcoal")) /datum/seed/berry/glow/New() ..() @@ -83,6 +87,7 @@ display_name = "poison berry bush" mutants = list("deathberries") chems = list("nutriment" = list(1), "toxin" = list(3,5), "poisonberryjuice" = list(10,5)) + food_info = list(list(0, 1, "spicy berries"), list(20 SECONDS, 1.2, "stewed spicy berries"), list(30 SECONDS, 1, "overcooked spicy-sweet mush"), list(40 SECONDS, 0.9, "spicy charcoal")) /datum/seed/berry/poison/New() ..() @@ -96,6 +101,7 @@ display_name = "death berry bush" mutants = null chems = list("nutriment" = list(1), "toxin" = list(3,3), "lexorin" = list(1,5)) + food_info = list(list(0, 1, "death and berries"), list(20 SECONDS, 1.2, "death and stewed berries"), list(30 SECONDS, 1, "overcooked deadly mush"), list(40 SECONDS, 0.9, "deadly charcoal")) /datum/seed/berry/poison/death/New() ..() @@ -112,6 +118,8 @@ mutants = list("deathnettle") chems = list("nutriment" = list(1,50), "sacid" = list(0,1)) kitchen_tag = "nettle" + food_info = list(list(0, 1, "peppery spinach"), list(15 SECONDS, 1.2, "cooked peppery spinach"), list(25 SECONDS, 1, "wilting, mushy spinach"), list(30 SECONDS, 0.9, "unpalatable wilted spinach")) + /datum/seed/nettle/New() ..() @@ -132,6 +140,7 @@ kitchen_tag = "deathnettle" mutants = null chems = list("nutriment" = list(1,50), "pacid" = list(0,1)) + food_info = list(list(0, 1, "extra-spicy spinach"), list(30 SECONDS, 1.2, "cooked extra-spicy spinach"), list(60 SECONDS, 1, "extra-spicy mushy spinach"), list(90 SECONDS, 0.9, "extra-spicy wilted spinach")) /datum/seed/nettle/death/New() ..() @@ -148,6 +157,7 @@ mutants = list("bluetomato","bloodtomato") chems = list("nutriment" = list(1,10), "tomatojuice" = list(10,10)) kitchen_tag = "tomato" + food_info = list(list(0, 1, "ripe tomato"), list(10 SECONDS, 1.2, "soft cooked tomato"), list(25 SECONDS, 1, "overcooked tomato"), list(30 SECONDS, 0.9, "dry, overcooked tomato")) /datum/seed/tomato/New() ..() @@ -171,6 +181,7 @@ mutants = list("killer") chems = list("nutriment" = list(1,10), "blood" = list(1,5)) splat_type = /obj/effect/debris/cleanable/blood/splatter + food_info = list(list(0, 1, "metallic tomato"), list(15 SECONDS, 1.2, "soft, metallic cooked tomato"), list(25 SECONDS, 1, "rusty tomato"), list(30 SECONDS, 0.9, "burnt, coagulated blood")) /datum/seed/tomato/blood/New() ..() @@ -184,6 +195,8 @@ mutants = null can_self_harvest = 1 has_mob_product = /mob/living/simple_mob/hostile/tomato + food_info = list(list(0, 1, "ripe tomato"), list(10 SECONDS, 1.2, "soft cooked tomato"), list(25 SECONDS, 1, "overcooked tomato"), list(30 SECONDS, 0.9, "dry, overcooked tomato")) + /datum/seed/tomato/killer/New() ..() @@ -196,6 +209,7 @@ display_name = "blue tomato plant" mutants = list("bluespacetomato") chems = list("nutriment" = list(1,20), "lube" = list(1,5)) + food_info = list(list(0, 1, "ripe tomato"), list(10 SECONDS, 1.2, "soft cooked tomato"), list(25 SECONDS, 1, "overcooked tomato"), list(30 SECONDS, 0.9, "dry, overcooked tomato")) /datum/seed/tomato/blue/New() ..() @@ -208,6 +222,7 @@ display_name = "bluespace tomato plant" mutants = null chems = list("nutriment" = list(1,20), "singulo" = list(10,5)) + food_info = list(list(0, 1, "ripe teleportomato"), list(10 SECONDS, 1.2, "soft cooked tomato"), list(25 SECONDS, 1, "overcooked tomato"), list(30 SECONDS, 0.9, "dry, overcooked tomato")) /datum/seed/tomato/blue/teleport/New() ..() @@ -224,10 +239,10 @@ kitchen_tag = "eggplant" mutants = list("egg-plant") chems = list("nutriment" = list(1,10)) + food_info = list(list(0, 1, "raw eggplant"), list(20 SECONDS, 1.2, "tender, juicy eggplant"), list(30 SECONDS, 1, "mushy eggplant"), list(45 SECONDS, 0.9, "crusty, overcooked eggplant")) /datum/seed/eggplant/New() ..() - set_trait(TRAIT_HARVEST_REPEAT,1) set_trait(TRAIT_MATURATION,6) set_trait(TRAIT_PRODUCTION,6) set_trait(TRAIT_YIELD,2) @@ -246,7 +261,8 @@ kitchen_tag = "egg-plant" mutants = null chems = list("nutriment" = list(1,5), "egg" = list(3,12)) - has_item_product = /obj/item/reagent_containers/food/snacks/egg/purple + has_item_product = /obj/item/reagent_containers/food/snacks/ingredient/egg/purple + food_info = list(list(0, 1, "raw egg"), list(15 SECONDS, 1.2, "cooked egg"), list(25 SECONDS, 1, "overcooked egg"), list(30 SECONDS, 0.9, "burnt egg")) //Apples/varieties. /datum/seed/apple @@ -256,6 +272,7 @@ kitchen_tag = "apple" mutants = list("poisonapple","goldapple") chems = list("nutriment" = list(1,10),"applejuice" = list(10,20)) + food_info = list(list(0, 1, "crispy, fresh apple"), list(10 SECONDS, 1.2, "tender, sweet apple"), list(30 SECONDS, 1, "mushy and weird apple"), list(45 SECONDS, 0.9, "unpleasantly warm baby food")) /datum/seed/apple/New() ..() @@ -274,6 +291,7 @@ name = "poisonapple" mutants = null chems = list("cyanide" = list(1,5)) + food_info = list(list(0, 1, "crispy, fresh apple"), list(10 SECONDS, 1.2, "tender, sweet apple"), list(30 SECONDS, 1, "mushy and weird apple"), list(45 SECONDS, 0.9, "unpleasantly warm baby food")) /datum/seed/apple/gold name = "goldapple" @@ -282,6 +300,7 @@ kitchen_tag = "goldapple" mutants = null chems = list("nutriment" = list(1,10), MAT_GOLD = list(1,5)) + food_info = list(list(0, 1, "tangy, fresh apple"), list(10 SECONDS, 1.2, "tender, tangy apple"), list(30 SECONDS, 1, "mushy and sour apple"), list(45 SECONDS, 0.9, "unpleasantly bitter baby food")) /datum/seed/apple/gold/New() ..() @@ -299,6 +318,7 @@ kitchen_tag = "ambrosia" mutants = list("ambrosiadeus") chems = list("nutriment" = list(1), "space_drugs" = list(1,8), "kelotane" = list(1,8,1), "bicaridine" = list(1,10,1), "toxin" = list(1,10)) + food_info = list(list(0, 1, "leafy, bitter spinach"), list(30 SECONDS, 1.2, "cooked bitter spinach"), list(35 SECONDS, 1, "mushy bitter spinach"), list(60 SECONDS, 0.9, "bitterness and wilted spinach")) /datum/seed/ambrosia/New() ..() @@ -319,6 +339,7 @@ kitchen_tag = "ambrosiadeus" mutants = list("ambrosiagaia") chems = list("nutriment" = list(1), "bicaridine" = list(1,8), "synaptizine" = list(1,8,1), "hyperzine" = list(1,10,1), "space_drugs" = list(1,10)) + food_info = list(list(0, 1, "leafy, extra-bitter spinach"), list(30 SECONDS, 1.2, "cooked, extra-bitter spinach"), list(35 SECONDS, 1, "mushy bitter spinach"), list(60 SECONDS, 0.9, "bitterness and wilted spinach")) /datum/seed/ambrosia/deus/New() ..() @@ -357,6 +378,7 @@ chems = list("nutriment" = list(1,25)) splat_type = /obj/effect/plant kitchen_tag = "mushroom" + food_info = list(list(0, 1, "earthy, fruity mushroom"), list(25 SECONDS, 1.2, "tender, fruity mushroom"), list(40 SECONDS, 1, "mushy mushroom"), list(45 SECONDS, 0.9, "an unpleasantly rubbery mass")) /datum/seed/mushroom/New() ..() @@ -395,6 +417,7 @@ mutants = list("walkingmushroom","towercap") chems = list("nutriment" = list(2,10)) kitchen_tag = "plumphelmet" + food_info = list(list(0, 1, "bland, tough mushroom"), list(25 SECONDS, 1.2, "bland cooked mushroom"), list(40 SECONDS, 1, "bland, squishy mushroom"), list(45 SECONDS, 0.9, "an unpleasantly firm mass")) /datum/seed/mushroom/plump/New() ..() @@ -497,6 +520,7 @@ display_name = "glowshrooms" mutants = null chems = list("radium" = list(1,20)) + food_info = list(list(0, 1, "spicy, fruity mushroom"), list(14 SECONDS, 1.2, "tender, spicy and fruity mushroom"), list(18 SECONDS, 1, "tough, spicy mushroom"), list(22 SECONDS, 0.9, "an unpleasantly rubbery mass")) //glowshrooms are hard to cook but have a unique flavour /datum/seed/mushroom/glowshroom/New() ..() @@ -517,6 +541,7 @@ display_name = "plastellium" mutants = null chems = list("plasticide" = list(1,10)) + food_info = list(list(0, 1, "plasticky mushroom"), list(60 SECONDS, 1.2, "warm plastic"), list(120 SECONDS, 1, "burning plastic"), list(180 SECONDS, 0.9, "plastic and toxic chemicals")) /datum/seed/mushroom/plastic/New() ..() @@ -536,6 +561,7 @@ display_name = "harebells" kitchen_tag = "harebell" chems = list("nutriment" = list(1,20)) + food_info = list(list(0, 1, "slightly sweet leaves and petals"), list(10 SECONDS, 1.2, "slightly sweet leaves and petals"), list(20 SECONDS, 1, "wilting leaves and petals"), list(25 SECONDS, 0.9, "a dead plant")) /datum/seed/flower/New() ..() @@ -554,6 +580,7 @@ display_name = "poppies" kitchen_tag = "poppy" chems = list("nutriment" = list(1,20), "bicaridine" = list(1,10)) + food_info = list(list(0, 1, "slightly sweet almonds"), list(15 SECONDS, 1.2, "sweet, nutty almond"), list(20 SECONDS, 1, "over-roasted almond"), list(25 SECONDS, 0.9, "carbonized seeds")) //poppy is good to eat :D /datum/seed/flower/poppy/New() ..() @@ -573,6 +600,7 @@ seed_name = "sunflower" display_name = "sunflowers" kitchen_tag = "sunflower" + food_info = list(list(0, 1, "bright with a hint of floral bitterness"), list(20 SECONDS, 1.2, "mild nuttiness"), list(25 SECONDS, 1, "over-roasted nuts"), list(40 SECONDS, 0.9, "burnt sunflower and sadness")) /datum/seed/flower/sunflower/New() ..() @@ -646,6 +674,7 @@ kitchen_tag = "grapes" mutants = list("greengrapes") chems = list("nutriment" = list(1,10), "sugar" = list(1,5), "grapejuice" = list(10,10)) + food_info = list(list(0, 1, "fresh, sweet grapes"), list(10 SECONDS, 1.2, "tender, stewed grape"), list(15 SECONDS, 1, "grape mush"), list(20 SECONDS, 0.9, "unpalatable grapey mush")) /datum/seed/grapes/New() ..() @@ -667,6 +696,7 @@ display_name = "green grapevines" mutants = null chems = list("nutriment" = list(1,10), "kelotane" = list(3,5), "grapejuice" = list(10,10)) + food_info = list(list(0, 1, "fresh, sweet-sour grapes"), list(10 SECONDS, 1.2, "tender, stewed grape"), list(15 SECONDS, 1, "grape mush"), list(20 SECONDS, 0.9, "unpalatable grapey mush")) /datum/seed/grapes/green/New() ..() @@ -679,6 +709,7 @@ display_name = "lettuce" kitchen_tag = "cabbage" chems = list("nutriment" = list(1,15)) + food_info = list(list(0, 1, "leafy greens"), list(15 SECONDS, 1.2, "tender, cooked salad leaves"), list(20 SECONDS, 1, "mushy, unpleasant salad leaves"), list(25 SECONDS, 0.9, "sad dead lettuce")) /datum/seed/lettuce/New() ..() @@ -701,6 +732,7 @@ display_name = "glacial lettuce" kitchen_tag = "icelettuce" chems = list("nutriment" = list(1,5), "paracetamol" = list(0,2)) + food_info = list(list(0, 1, "crunchy, fresh greens"), list(20 SECONDS, 1.2, "tender, cooked salad leaves"), list(22 SECONDS, 1, "mushy, unpleasant salad leaves"), list(30 SECONDS, 0.9, "sad dead lettuce")) /datum/seed/lettuce/ice/New() ..() @@ -717,6 +749,7 @@ kitchen_tag = "wabback" mutants = list("blackwabback","wildwabback") has_item_product = /obj/item/stack/material/cloth + food_info = list(list(0, 1, "bland plant matter"), list(20 SECONDS, 1.2, "mealy, cooked plant matter"), list(22 SECONDS, 1, "mushy, unpleasant plant matter"), list(30 SECONDS, 0.9, "sad dead plant")) /datum/seed/wabback/New() ..() @@ -769,6 +802,7 @@ display_name = "peanut vines" kitchen_tag = "peanut" chems = list("nutriment" = list(1,10), "peanutoil" = list(1,3)) + food_info = list(list(0, 1, "fresh peanuts"), list(30 SECONDS, 1.2, "toasted peanuts"), list(60 SECONDS, 1, "roasted peanuts"), list(80 SECONDS, 0.9, "peanuts that have been through a coffee roaster")) /datum/seed/peanuts/New() ..() @@ -788,6 +822,7 @@ display_name = "vanilla" kitchen_tag = "vanilla" chems = list("nutriment" = list(1,10), "vanilla" = list(0,3), "sugar" = list(0, 1)) + food_info = list(list(0, 1, "vanilla pods"), list(15 SECONDS, 1.2, "toasted vanilla pods"), list(25 SECONDS, 1, "roasted vanilla pods"), list(60 SECONDS, 0.9, "vanilla and death")) /datum/seed/vanilla/New() ..() @@ -808,6 +843,7 @@ display_name = "cabbages" kitchen_tag = "cabbage" chems = list("nutriment" = list(1,10)) + food_info = list(list(0, 1, "cabbage leaves"), list(15 SECONDS, 1.2, "tender, cooked cabbage"), list(20 SECONDS, 1, "mushy, unpleasant cabbage leaves"), list(25 SECONDS, 0.9, "cabbage cooked very thoroughly in the heat from a signal flare")) /datum/seed/cabbage/New() ..() @@ -830,9 +866,10 @@ display_name = "banana tree" kitchen_tag = "banana" chems = list("banana" = list(10,10)) + food_info = list(list(0, 1, "banana"), list(15 SECONDS, 1.2, "cooked banana"), list(32 SECONDS, 1, "warm, mushy banana"), list(40 SECONDS, 0.9, "bitter carbonized sludge")) trash_type = /obj/item/bananapeel -/datum/seed/banana/New() +/datum/seed/banana/New() //this banana for you ..() set_trait(TRAIT_HARVEST_REPEAT,1) set_trait(TRAIT_MATURATION,6) @@ -851,8 +888,9 @@ seed_name = "corn" display_name = "ears of corn" kitchen_tag = "corn" - chems = list("nutriment" = list(1,10), "cornoil" = list(1,10)) + chems = list("nutriment" = list(1,10), "cornoil" = list(1,10), "cornflour" = list(15,15)) trash_type = /obj/item/corncob + food_info = list(list(0, 1, "sweet corn"), list(10 SECONDS, 1.2, "toasted sweetcorn"), list(20 SECONDS, 1.1, "grilled sweetcorn"), list(40 SECONDS, 0.9, "burnt no-longer-sweet corn")) /datum/seed/corn/New() ..() @@ -874,6 +912,7 @@ display_name = "potatoes" kitchen_tag = "potato" chems = list("nutriment" = list(1,10), "potatojuice" = list(10,10)) + food_info = list(list(0, 1, "raw potato"), list(35 SECONDS, 1.2, "cooked potato and starchy goodness"), list(85 SECONDS, 1.1, "starchy okayness"), list(110 SECONDS, 0.7, "starchy badness")) /datum/seed/potato/New() ..() @@ -893,6 +932,7 @@ display_name = "onions" kitchen_tag = "onion" chems = list("nutriment" = list(1,10)) + food_info = list(list(0, 1, "sharp onion"), list(20 SECONDS, 1.2, "sweet, caramelized onion"), list(30 SECONDS, 0.9, "slightly bitter caramelized onion"), list(40 SECONDS, 0.7, "bitter, mushy onion")) /datum/seed/onion/New() ..() @@ -911,6 +951,7 @@ display_name = "soybeans" kitchen_tag = "soybeans" chems = list("nutriment" = list(1,20), "soymilk" = list(10,20)) + food_info = list(list(0, 1, "fresh, grassy soybeans"), list(15 SECONDS, 1.2, "sweet and grassy soybeans with nutty undertones"), list(25 SECONDS, 1, "slightly bitter soybean and grass"), list(40 SECONDS, 0.7, "burnt grass flavoured baby food")) /datum/seed/soybean/New() ..() @@ -929,6 +970,7 @@ display_name = "wheat stalks" kitchen_tag = "wheat" chems = list("nutriment" = list(1,25), "flour" = list(15,15)) + food_info = list(list(0, 1, "plain wheat"), list(30 SECONDS, 1.2, "toasted wheat"), list(35 SECONDS, 1, "roasted wheat"), list(60 SECONDS, 0.7, "burnt wheat")) /datum/seed/wheat/New() ..() @@ -949,6 +991,7 @@ display_name = "rice stalks" kitchen_tag = "rice" chems = list("nutriment" = list(1,25), "rice" = list(10,15)) + food_info = list(list(0, 0.2, "hard, raw rice"), list(30 SECONDS, 1.2, "light, fluffy rice"), list(45 SECONDS, 1, "mushy, overcooked rice"), list(60 SECONDS, 0.7, "crispy mush and burnt rice")) /datum/seed/rice/New() ..() @@ -969,6 +1012,7 @@ display_name = "carrots" kitchen_tag = "carrot" chems = list("nutriment" = list(1,20), "imidazoline" = list(3,5), "carrotjuice" = list(10,20)) + food_info = list(list(0, 1, "fresh, sweet carrot"), list(30 SECONDS, 1.2, "tender, cooked carrot"), list(45 SECONDS, 1.1, "firm roast carrot"), list(60 SECONDS, 0.7, "carrot mush flecked with carbon")) /datum/seed/carrots/New() ..() @@ -987,6 +1031,7 @@ display_name = "taro root" kitchen_tag = "taro" chems = list("nutriment" = list(1,20), "taropowder" = list(10,20)) + food_info = list(list(0, 1, "sweet potato with hints of nuttiness"), list(30 SECONDS, 1.2, "tender sweet potato with hints of vanilla and nuttiness"), list(45 SECONDS, 1, "mushy sweet potato with hints of nuttiness"), list(60 SECONDS, 0.7, "mushy overcooked potato with hints of burnt nuttiness")) /datum/seed/taro/New() ..() @@ -1005,6 +1050,7 @@ display_name = "palm tree" kitchen_tag = "coconut" chems = list("nutriment" = list(1,20), "coconutwater" = list(10,20), "coconutmilk" = list(10,20)) + food_info = list(list(0, 1, "slightly sweet coconut flesh"), list(10 SECONDS, 1.2, "tender, slightly-sweet coconut flesh"), list(25 SECONDS, 1.2, "toasted coconut"), list(40 SECONDS, 0.7, "a wad of burning rubber infused with a hint of coconut")) /datum/seed/coconut/New() ..() @@ -1019,6 +1065,7 @@ set_trait(TRAIT_IDEAL_HEAT, 298) set_trait(TRAIT_IDEAL_LIGHT, 7) set_trait(TRAIT_WATER_CONSUMPTION, 6) + /datum/seed/weeds name = "weeds" seed_name = "weed" @@ -1042,6 +1089,7 @@ display_name = "white-beets" kitchen_tag = "whitebeet" chems = list("nutriment" = list(0,20), "sugar" = list(1,5)) + food_info = list(list(0, 1, "mild, neutral and firm beet"), list(30 SECONDS, 1.2, "tender, slightly-sweet white beet"), list(45 SECONDS, 1, "soft, slightly-sweet white beet"), list(40 SECONDS, 0.7, "squishy, rubbery and bland mush")) /datum/seed/whitebeets/New() ..() @@ -1061,6 +1109,7 @@ display_name = "sugarcanes" kitchen_tag = "sugarcanes" chems = list("sugar" = list(4,5)) + food_info = list(list(0, 1, "earthy, fresh sugarcane"), list(20 SECONDS, 1.2, "lightly-roasted sugarcane and sweetness"), list(30 SECONDS, 1, "slightly-burnt sugarcane"), list(45 SECONDS, 0.7, "tough, inedible plant matter mixed with bitterness and sweetness")) /datum/seed/sugarcane/New() ..() @@ -1081,6 +1130,7 @@ display_name = "rhubarb" kitchen_tag = "rhubarb" chems = list("nutriment" = list(1,15)) + food_info = list(list(0, 1, "crunchy and lip-puckeringly tart rhubarb"), list(35 SECONDS, 1.2, "soft, tender and very tart rhubarb"), list(55 SECONDS, 0.9, "mushy and sour rhubarb"), list(110 SECONDS, 0.7, "extremely sour baby food")) /datum/seed/rhubarb/New() ..() @@ -1099,6 +1149,7 @@ display_name = "celery" kitchen_tag = "celery" chems = list("nutriment" = list(5,20)) + food_info = list(list(0, 1, "crunchy and fresh celery"), list(10 SECONDS, 1, "soft, tender celery"), list(20 SECONDS, 1, "mushy celery"), list(30 SECONDS, 0.7, "bland green mush that might've been a plant at some point")) /datum/seed/celery/New() ..() @@ -1117,6 +1168,7 @@ display_name = "spineapple" kitchen_tag = "spineapple" chems = list("nutriment" = list(3,5), "enzyme" = list(3,5), "pineapplejuice" = list(15, 20)) + food_info = list(list(0, 1, "fresh pineapple"), list(15 SECONDS, 1.2, "sweet cooked pineapple with a hint of sourness"), list(20 SECONDS, 1, "mushy cooked pineapple"), list(30 SECONDS, 0.7, "a pineapple-flavoured sludgey mass")) /datum/seed/spineapple/New() ..() @@ -1140,6 +1192,7 @@ display_name = "loose peas" kitchen_tag = "peas" chems = list("nutriment" = list(1,10)) + food_info = list(list(0, 1, "fresh, sweet peas"), list(20 SECONDS, 1.2, "tender, cooked peas"), list(30 SECONDS, 0.9, "overcooked peas"), list(50 SECONDS, 0.7, "firm little balls of sadness")) /datum/seed/peas/New() ..() @@ -1161,6 +1214,7 @@ display_name = "durian" kitchen_tag = "durian" chems = list("nutriment" = list(1,5), "durianpaste" = list(1, 20)) + food_info = list(list(0, 1, "fresh custard-like fruit flavoured heavily with almond, with occasional notes of sherry"), list(20 SECONDS, 1.2, "a rich almond custard with notes of caramelized onion, sherry and cream cheese"), list(30 SECONDS, 0.9, "durian mush"), list(50 SECONDS, 0.7, "durian-flavoured dead mush")) /datum/seed/durian/New() ..() @@ -1182,6 +1236,7 @@ display_name = "watermelon vine" kitchen_tag = "watermelon" chems = list("nutriment" = list(1,6), "watermelonjuice" = list(10,6)) + food_info = list(list(0, 1, "fresh, crispy and sweet watermelon"), list(15 SECONDS, 1.2, "tender, cooked watermelon"), list(25 SECONDS, 0.9, "rubbery-mushy watermelon"), list(30 SECONDS, 0.7, "rubbery-mushy watermelon lacking any sort of flavour")) /datum/seed/watermelon/New() ..() @@ -1206,6 +1261,7 @@ display_name = "pumpkin vine" kitchen_tag = "pumpkin" chems = list("nutriment" = list(1,6)) + food_info = list(list(0, 1, "fresh, firm pumpkin"), list(25 SECONDS, 1.2, "tender, sweet and slightly nutty pumpkin"), list(35 SECONDS, 0.9, "mushy, sad pumpkin"), list(30 SECONDS, 0.7, "a bitter, dead mush with notes of sweetness")) /datum/seed/pumpkin/New() ..() @@ -1226,6 +1282,7 @@ display_name = "lime trees" kitchen_tag = "lime" chems = list("nutriment" = list(1,20), "limejuice" = list(10,20)) + food_info = list(list(0, 1, "sweet, fresh lime"), list(30 SECONDS, 1.2, "tender stewed limes, still sweet and slightly sour"), list(40 SECONDS, 1, "stewed limes with little to no sweetness remaining"), list(60 SECONDS, 0.7, "what might have been a lime, once, before its incineration")) /datum/seed/citrus/New() ..() @@ -1246,6 +1303,7 @@ display_name = "lemon trees" kitchen_tag = "lemon" chems = list("nutriment" = list(1,20), "lemonjuice" = list(10,20)) + food_info = list(list(0, 1, "fresh, sour lemon"), list(30 SECONDS, 1.2, "tender stewed lemon, still sour with sweet hints"), list(40 SECONDS, 1, "stewed, mildly sour lemon"), list(60 SECONDS, 0.7, "a lemon desecrated through a chef's neglect and carelessness")) /datum/seed/citrus/lemon/New() ..() @@ -1261,6 +1319,7 @@ display_name = "orange trees" kitchen_tag = "orange" chems = list("nutriment" = list(1,20), "orangejuice" = list(10,20)) + food_info = list(list(0, 1, "fresh, tasty orange"), list(30 SECONDS, 1.2, "tender stewed orange, mostly sweet"), list(40 SECONDS, 1, "stewed, mildly orange-y orange"), list(60 SECONDS, 0.7, "overcooked orange sludge")) /datum/seed/citrus/orange/New() ..() @@ -1274,6 +1333,7 @@ kitchen_tag = "grass" mutants = "carpet" chems = list("nutriment" = list(1,20)) + food_info = list(list(0, 1, "grass"), list(30 SECONDS, 1, "tender grass"), list(40 SECONDS, 0.9, "cooked grass"), list(60 SECONDS, 0.7, "overcooked grass")) /datum/seed/grass/New() ..() @@ -1295,6 +1355,7 @@ kitchen_tag = "carpet" mutants = null chems = list("liquidcarpet" = list(5,10)) + food_info = list(list(0, 1, "carpet"), list(30 SECONDS, 1, "carpet that's been heated on the stove"), list(40 SECONDS, 0.9, "oven-roasted carpety goodness"), list(60 SECONDS, 0.7, "carpet that's been blowtorched")) /datum/seed/grass/carpet/New() ..() @@ -1310,6 +1371,7 @@ display_name = "cacao tree" kitchen_tag = "cocoa" chems = list("nutriment" = list(1,10), "coco" = list(4,5)) + food_info = list(list(0, 1, "bitter cocoa pods"), list(25 SECONDS, 1, "tender, not-as-bitter cocoa pods"), list(40 SECONDS, 1.1, "roasted cocoa beans"), list(60 SECONDS, 0.7, "a mix of burnt cocoa beans in cocoapod sludge, flecked with specks of burnt plant matter")) /datum/seed/cocoa/New() ..() @@ -1331,6 +1393,7 @@ display_name = "cherry tree" kitchen_tag = "cherries" chems = list("nutriment" = list(1,15), "sugar" = list(1,15), "cherryjelly" = list(10,15)) + food_info = list(list(0, 1, "fresh, tasty cherries"), list(25 SECONDS, 1.2, "stewed cherries"), list(35 SECONDS, 1, "cherry sludge"), list(60 SECONDS, 0.7, "overcooked cherry sludge")) /datum/seed/cherries/New() ..() @@ -1351,6 +1414,7 @@ display_name = "tobacco" kitchen_tag = "tobacco" chems = list("nicotine" = list(5,10)) + food_info = list(list(0, 1, "fresh tobacco"), list(30 SECONDS, 1, "wilting tobacco"), list(40 SECONDS, 1, "drying tobacco"), list(60 SECONDS, 1, "dried tobacco")) /datum/seed/tobacco/New() ..() @@ -1370,6 +1434,7 @@ display_name = "kudzu vines" kitchen_tag = "kudzu" chems = list("nutriment" = list(1,50), "anti_toxin" = list(1,25)) + food_info = list(list(0, 1, "slightly bland spinach"), list(30 SECONDS, 1.2, "cooked, slightly bland spinach"), list(40 SECONDS, 1, "wilting bland spinach"), list(60 SECONDS, 1, "a bland spinachy sludge")) /datum/seed/kudzu/New() ..() diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 75aa5e52051a..6b853ad0a67a 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -527,7 +527,7 @@ attack_hand(user) var/obj/item/storage/bag/plants/S = O - for (var/obj/item/reagent_containers/food/snacks/grown/G in locate(user.x,user.y,user.z)) + for (var/obj/item/reagent_containers/food/snacks/ingredient/grown/G in locate(user.x,user.y,user.z)) S.obj_storage.try_insert(G, new /datum/event_args/actor(user), TRUE, TRUE, TRUE) S.obj_storage.ui_queue_refresh() diff --git a/code/modules/loot/packs/hydroponics.dm b/code/modules/loot/packs/hydroponics.dm index 10c2a244f97a..b890d98b6023 100644 --- a/code/modules/loot/packs/hydroponics.dm +++ b/code/modules/loot/packs/hydroponics.dm @@ -7,7 +7,7 @@ /obj/machinery/portable_atmospherics/hydroponics = 3, /obj/item/reagent_containers/food/drinks/bottle/rum = 2, /obj/item/reagent_containers/food/drinks/bottle/whiskey = 2, - /obj/item/reagent_containers/food/snacks/grown/ambrosiadeus = 5, + /obj/item/reagent_containers/food/snacks/ingredient/grown/ambrosiadeus = 5, /obj/item/flame/lighter/zippo = 1, /obj/item/seeds/ambrosiadeusseed = 3, ) diff --git a/code/modules/maps/overmap/space/debrisfield.dm b/code/modules/maps/overmap/space/debrisfield.dm index 0cc48e009998..2f4b7bed6080 100644 --- a/code/modules/maps/overmap/space/debrisfield.dm +++ b/code/modules/maps/overmap/space/debrisfield.dm @@ -11,7 +11,7 @@ in_space = 1 initial_generic_waypoints = list("triumph_excursion_debrisfield") -////Holy shit spagetti pain. TODO fix this debrifield/debrifield_vr bullshit - Bloop/// +////Holy shit spaghetti pain. TODO fix this debrifield/debrifield_vr bullshit - Bloop/// /obj/overmap/entity/visitable/sector/debrisfield_vr diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index c155b3546067..0c897a89189d 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -141,7 +141,7 @@ density = TRUE anchored = TRUE light_range = 3 - speed_process = TRUE + speed_process = PROCESS_ON_SSFASTPROCESS var/tick = 0 var/obj/machinery/mineral/input = null var/obj/machinery/mineral/output = null diff --git a/code/modules/mining/machine_unloading.dm b/code/modules/mining/machine_unloading.dm index 59dea20d6b2b..f62467556996 100644 --- a/code/modules/mining/machine_unloading.dm +++ b/code/modules/mining/machine_unloading.dm @@ -6,7 +6,7 @@ icon_state = "unloader" density = 1 anchored = 1.0 - speed_process = TRUE + speed_process = PROCESS_ON_SSFASTPROCESS var/obj/machinery/mineral/input = null var/obj/machinery/mineral/output = null diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 10cfdb456d18..7978602abf88 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -111,7 +111,7 @@ else if(istype(W,/obj/item/material/shard)) if(glass) glass.add_charge(1000) - else if(istype(W,/obj/item/reagent_containers/food/snacks/grown)) + else if(istype(W,/obj/item/reagent_containers/food/snacks/ingredient/grown)) if(wood) wood.add_charge(4000) else if(istype(W,/obj/item/pipe)) diff --git a/code/modules/mob/living/simple_animal/animals/mouse.dm b/code/modules/mob/living/simple_animal/animals/mouse.dm index 97956773ef97..ae925903072e 100644 --- a/code/modules/mob/living/simple_animal/animals/mouse.dm +++ b/code/modules/mob/living/simple_animal/animals/mouse.dm @@ -42,7 +42,7 @@ emote_see = list("runs in a circle", "shakes", "scritches at something") holder_type = /obj/item/holder/mouse - meat_type = /obj/item/reagent_containers/food/snacks/meat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat var/body_color //brown, gray and white, leave blank for random diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm b/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm index 41f032608cd3..69df2cb67bf9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm @@ -1,6 +1,6 @@ /mob/living/simple_mob/animal mob_class = MOB_CLASS_ANIMAL - meat_type = /obj/item/reagent_containers/food/snacks/meat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat bone_type = /obj/item/stack/material/bone hide_type = /obj/item/stack/animalhide exotic_type = /obj/item/stack/sinew diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm index 1410f5a238a1..538c768fd1e8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm @@ -59,7 +59,7 @@ GLOBAL_VAR_INIT(chicken_count, 0) // How mant chickens DO we have? say_list_type = /datum/say_list/chicken meat_amount = 2 - meat_type = /obj/item/reagent_containers/food/snacks/meat/chicken + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/chicken bone_amount = 1 var/eggsleft = 0 @@ -81,8 +81,8 @@ GLOBAL_VAR_INIT(chicken_count, 0) // How mant chickens DO we have? return ..() /mob/living/simple_mob/animal/passive/chicken/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, /obj/item/reagent_containers/food/snacks/grown)) //feedin' dem chickens - var/obj/item/reagent_containers/food/snacks/grown/G = O + if(istype(O, /obj/item/reagent_containers/food/snacks/ingredient/grown)) //feedin' dem chickens + var/obj/item/reagent_containers/food/snacks/ingredient/grown/G = O if(G.seed && G.seed.kitchen_tag == "wheat") if(!stat && eggsleft < 8) if(!user.attempt_consume_item_for_construction(O)) @@ -103,16 +103,16 @@ GLOBAL_VAR_INIT(chicken_count, 0) // How mant chickens DO we have? if((stat != DEAD) && prob(3) && eggsleft > 0) visible_message("[src] [pick("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")]") eggsleft-- - var/obj/item/reagent_containers/food/snacks/egg/E = new(get_turf(src)) + var/obj/item/reagent_containers/food/snacks/ingredient/egg/E = new(get_turf(src)) E.pixel_x = rand(-6,6) E.pixel_y = rand(-6,6) if(GLOB.chicken_count < GLOB.MAX_CHICKENS && prob(10)) START_PROCESSING(SSobj, E) -/obj/item/reagent_containers/food/snacks/egg/var/amount_grown = 0 +/obj/item/reagent_containers/food/snacks/ingredient/egg/var/amount_grown = 0 // This only starts normally if there are less than MAX_CHICKENS chickens -/obj/item/reagent_containers/food/snacks/egg/process(delta_time) +/obj/item/reagent_containers/food/snacks/ingredient/egg/process(delta_time) if(isturf(loc)) amount_grown += rand(1,2) if(amount_grown >= 100) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/lythios.dm b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/lythios.dm index e11c87c9625d..4f41cb7566fa 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/lythios.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/lythios.dm @@ -199,7 +199,7 @@ movement_cooldown = 8 meat_amount = 3 - meat_type = /obj/item/reagent_containers/food/snacks/meat/grubmeat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/grubmeat response_help = "pokes" response_disarm = "pushes" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm index ecf24ffe0e56..5802feb0f5dd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm @@ -98,7 +98,7 @@ speak_emote = list("chitters") meat_amount = 3 - meat_type = /obj/item/reagent_containers/food/snacks/xenomeat/spidermeat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat say_list_type = /datum/say_list/spider diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm index d4188d3fbd5b..f93c0a9c78b7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm @@ -26,7 +26,7 @@ friendly = "pinches" meat_amount = 1 - meat_type = /obj/item/reagent_containers/food/snacks/meat/crab + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/crab say_list_type = /datum/say_list/crab @@ -62,7 +62,7 @@ // Meat! -/obj/item/reagent_containers/food/snacks/meat/crab +/obj/item/reagent_containers/food/snacks/ingredient/meat/crab name = "meat" desc = "A chunk of meat." icon_state = "crustacean-meat" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm index e6c26cb9f8bb..01460e7c8172 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm @@ -22,7 +22,7 @@ holder_type = /obj/item/holder/fish meat_amount = 2 - meat_type = /obj/item/reagent_containers/food/snacks/carpmeat/fish + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/carp/fish bone_amount = 1 // By default they can be in any water turf. Subtypes might restrict to deep/shallow etc @@ -166,7 +166,7 @@ catalogue_data = list(/datum/category_item/catalogue/fauna/javelin) - meat_type = /obj/item/reagent_containers/food/snacks/carpmeat/fish + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/carp/fish /datum/category_item/catalogue/fauna/icebass name = "Sivian Fauna - Glitter Bass" @@ -193,7 +193,7 @@ catalogue_data = list(/datum/category_item/catalogue/fauna/icebass) - meat_type = /obj/item/reagent_containers/food/snacks/carpmeat/fish + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/carp/fish var/max_red = 150 var/min_red = 50 @@ -279,7 +279,7 @@ var/image/head_image - meat_type = /obj/item/reagent_containers/food/snacks/carpmeat/fish + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/carp/fish /mob/living/simple_mob/animal/passive/fish/rockfish/Initialize(mapload) . = ..() @@ -323,7 +323,7 @@ has_eye_glow = TRUE - meat_type = /obj/item/reagent_containers/food/snacks/carpmeat/fish + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/carp/fish /datum/category_item/catalogue/fauna/murkin name = "Sivian Fauna - Murkfish" @@ -350,4 +350,4 @@ catalogue_data = list(/datum/category_item/catalogue/fauna/murkin) - meat_type = /obj/item/reagent_containers/food/snacks/carpmeat/fish/murkfish + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/carp/fish/murkfish diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/penguin.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/penguin.dm index 9ede70611ce5..5a34feb26acd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/penguin.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/penguin.dm @@ -33,7 +33,7 @@ has_langs = list("Bird") meat_amount = 2 - meat_type = /obj/item/reagent_containers/food/snacks/meat/chicken/penguin + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/chicken/penguin bone_amount = 1 /mob/living/simple_mob/animal/passive/penguin/tux diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm index fe00122ced4d..9e37a105d950 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm @@ -32,7 +32,7 @@ say_list_type = /datum/say_list/dog meat_amount = 3 - meat_type = /obj/item/reagent_containers/food/snacks/meat/corgi + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/corgi bone_amount = 2 hide_amount = 5 hide_type = /obj/item/stack/animalhide/corgi @@ -79,7 +79,7 @@ -/obj/item/reagent_containers/food/snacks/meat/corgi +/obj/item/reagent_containers/food/snacks/ingredient/meat/corgi name = "corgi meat" desc = "Tastes like... well, you know..." diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm index e1f93cd8db91..5020dedb4b84 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm @@ -35,7 +35,7 @@ maxbodytemp = 323 //Above 50 Degrees Celcius meat_amount = 1 - meat_type = /obj/item/reagent_containers/food/snacks/meat/fox + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/fox bone_amount = 1 hide_amount = 3 @@ -196,7 +196,7 @@ setDir(get_dir(src, friend)) say("Yap!") */ -/obj/item/reagent_containers/food/snacks/meat/fox +/obj/item/reagent_containers/food/snacks/ingredient/meat/fox name = "Fox meat" desc = "The fox doesn't say a goddamn thing, now." diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm index e93f2c03a905..0bec84a5ccb8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm @@ -67,7 +67,7 @@ melee_attack_delay = 1 SECOND meat_amount = 3 - meat_type = /obj/item/reagent_containers/food/snacks/meat/crab + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/crab response_help = "pets" response_disarm = "gently pushes aside" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm index 2f0e05c86079..b18f2403a3c3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm @@ -68,7 +68,7 @@ attack_sound = 'sound/weapons/bladeslice.ogg' meat_amount = 3 - meat_type = /obj/item/reagent_containers/food/snacks/xenomeat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/xenomeat hide_amount = 2 hide_type = /obj/item/stack/xenochitin diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/carp.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/carp.dm index 9491c34fbf42..4ab60d3362e8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/carp.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/carp.dm @@ -53,7 +53,7 @@ attacktext = list("bitten") meat_amount = 3 - meat_type = /obj/item/reagent_containers/food/snacks/carpmeat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/carp bone_amount = 3 ai_holder_type = /datum/ai_holder/simple_mob/melee diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm index d7e485790e0c..799a2799f438 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm @@ -35,7 +35,7 @@ mob_class = MOB_CLASS_ABERRATION // It's a monster. meat_amount = 2 - meat_type = /obj/item/reagent_containers/food/snacks/meat/worm + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/worm var/mob/living/simple_mob/animal/space/space_worm/previous //next/previous segments, correspondingly var/mob/living/simple_mob/animal/space/space_worm/next //head is the nextest segment @@ -412,21 +412,21 @@ // Worm meat. -/obj/item/reagent_containers/food/snacks/meat/worm +/obj/item/reagent_containers/food/snacks/ingredient/meat/worm name = "meat" desc = "A chunk of pulsating meat." icon_state = "wormmeat" filling_color = "#551A8B" center_of_mass = list("x"=16, "y"=14) -/obj/item/reagent_containers/food/snacks/meat/worm/Initialize(mapload) +/obj/item/reagent_containers/food/snacks/ingredient/meat/worm/Initialize(mapload) . = ..() reagents.add_reagent("protein", 6) reagents.add_reagent("phoron", 3) reagents.add_reagent("myelamine", 3) src.bitesize = 3 -/obj/item/reagent_containers/food/snacks/meat/worm/attackby(obj/item/W as obj, mob/user as mob) +/obj/item/reagent_containers/food/snacks/ingredient/meat/worm/attackby(obj/item/W as obj, mob/user as mob) if(istype(W,/obj/item/material/knife)) var/to_spawn = pickweight(/obj/random/junk = 30, /obj/random/trash = 30, diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm index e17dcaf7b3c3..71dd2ca3d356 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm @@ -36,7 +36,7 @@ ai_holder_type = null meat_amount = 4 - meat_type = /obj/item/reagent_containers/food/snacks/meat/human + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/human bone_amount = 2 hide_amount = 2 exotic_amount = 2 diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm index 0c9de10a8f24..8dfd62b33be7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm @@ -37,7 +37,7 @@ ai_holder_type = /datum/ai_holder/simple_mob/horror meat_amount = 4 - meat_type = /obj/item/reagent_containers/food/snacks/meat/human + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/human bone_amount = 2 hide_amount = 2 exotic_amount = 2 diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm index 773333b8b652..03cec302cfe3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm @@ -37,7 +37,7 @@ ai_holder_type = /datum/ai_holder/simple_mob/horror meat_amount = 5 - meat_type = /obj/item/reagent_containers/food/snacks/meat/human + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/human bone_amount = 10 hide_amount = 5 diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm index 8f428e3fcb8f..19adbaba93b8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm @@ -37,7 +37,7 @@ ai_holder_type = /datum/ai_holder/simple_mob/horror meat_amount = 3 - meat_type = /obj/item/reagent_containers/food/snacks/meat/human + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/human bone_amount = 1 hide_amount = 10 hide_type = /obj/item/stack/material/cloth diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm b/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm index 6d5693e88840..69f09f78f29f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm @@ -31,7 +31,7 @@ icon = 'icons/mob/horror_show/GHPS.dmi' icon_gib = "generic_gib" taser_kill = 0 - meat_type = /obj/item/reagent_containers/food/snacks/meat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat bone_type = /obj/item/stack/material/bone hide_type = /obj/item/stack/hairlesshide exotic_type = /obj/item/stack/sinew diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm b/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm index e8955531b575..cf40980170d6 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm @@ -37,7 +37,7 @@ ai_holder_type = /datum/ai_holder/simple_mob/horror meat_amount = 2 - meat_type = /obj/item/reagent_containers/food/snacks/meat/human + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/human bone_amount = 3 /mob/living/simple_mob/horror/BigTim/Initialize(mapload) diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror/cyber_horror.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror/cyber_horror.dm index 2383f9206cf1..2384bb9b5a6c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror/cyber_horror.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror/cyber_horror.dm @@ -209,7 +209,7 @@ ai_holder_type = /datum/ai_holder/simple_mob/melee meat_amount = 2 - meat_type = /obj/item/reagent_containers/food/snacks/meat/vox + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/vox bone_amount = 2 bone_type = /obj/item/stack/material/bone diff --git a/code/modules/mob/living/simple_mob/subtypes/plant/tree.dm b/code/modules/mob/living/simple_mob/subtypes/plant/tree.dm index d9bfb0a66cec..86e5ac8aed55 100644 --- a/code/modules/mob/living/simple_mob/subtypes/plant/tree.dm +++ b/code/modules/mob/living/simple_mob/subtypes/plant/tree.dm @@ -34,7 +34,7 @@ attack_sound = 'sound/weapons/bite.ogg' meat_amount = 1 - meat_type = /obj/item/reagent_containers/food/snacks/xenomeat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/xenomeat pixel_x = -16 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm index 4a00f2ecc2c9..0f0f1c0e0a94 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm @@ -45,7 +45,7 @@ GLOBAL_LIST_EMPTY(solargrubs) movement_cooldown = 8 meat_amount = 3 - meat_type = /obj/item/reagent_containers/food/snacks/meat/grubmeat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/grubmeat response_help = "pokes" response_disarm = "pushes" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm index c1feb67dee32..ea6518b90f69 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm @@ -17,7 +17,7 @@ var/global/list/grub_machine_overlays = list() legacy_melee_damage_upper = 1 meat_amount = 2 - meat_type = /obj/item/reagent_containers/food/snacks/meat/grubmeat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/grubmeat faction = "grubs" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solarmoth_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solarmoth_ch.dm index 357c04e667b9..d519b3f0791a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solarmoth_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solarmoth_ch.dm @@ -40,7 +40,7 @@ movement_cooldown = 5 meat_amount = 4 - meat_type = /obj/item/reagent_containers/food/snacks/meat/grubmeat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/grubmeat response_help = "pokes" response_disarm = "pushes" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm index 796d736e8448..e59067af4fff 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm @@ -1,7 +1,7 @@ /mob/living/simple_mob/vore mob_class = MOB_CLASS_ANIMAL mob_bump_flag = 0 - meat_type = /obj/item/reagent_containers/food/snacks/meat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat bone_type = /obj/item/stack/material/bone hide_type = /obj/item/stack/animalhide exotic_type = /obj/item/stack/sinew diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 07dcf906ae5e..89bffe9915e4 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -135,7 +135,7 @@ if(owner.meat_type) meat_type = owner.meat_type else - meat_type = /obj/item/reagent_containers/food/snacks/meat + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat handle_organ_mod_special() @@ -701,7 +701,7 @@ var/obj/item/newmeat = new meat_type(newtarget) - if(istype(newmeat, /obj/item/reagent_containers/food/snacks/meat)) + if(istype(newmeat, /obj/item/reagent_containers/food/snacks/ingredient/meat)) newmeat.name = "[src.name] [newmeat.name]" // "liver meat" "heart meat", etc. qdel(src) diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm index b9436c253a5a..fef52163e341 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm @@ -262,7 +262,7 @@ if(istype(container, /obj/machinery/particle_smasher)) var/obj/machinery/particle_smasher/machine = container for(var/obj/O in machine.storage) - if(istype(O,/obj/item/reagent_containers/food/snacks/grown)) + if(istype(O,/obj/item/reagent_containers/food/snacks/ingredient/grown)) continue // Fruit is handled in check_fruit(). var/found = 0 for(var/i = 1; i < checklist.len+1; i++) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 0b12ef9396ea..271778026e4e 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -88,6 +88,13 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) /obj/singularity/attack_ai() //To prevent ais from gibbing themselves when they click on one. return +/obj/singularity/attackby(obj/item/W, mob/living/user) + if(QDELETED(W)) + return + + visible_message("\The [src] sucks up [W] from [user]'s hands!/span>") + consume(W) + /obj/singularity/proc/admin_investigate_setup() last_warning = world.time var/count = locate(/obj/machinery/containment_field) in orange(30, src) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index a952df51bce6..3a8facf0108a 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -468,6 +468,34 @@ if(QDELETED(W)) return + if(istype(W, /obj/item/reagent_containers/food/snacks/ingredient) && prob(95)) + var/obj/item/reagent_containers/food/snacks/ingredient/superfood = W + user.visible_message("\The [user] holds up [W] to \the [src] as the noise in the room dulls...",\ + "You hold up [W] to \the [src] when everything suddenly goes quiet.",\ + "Everything suddenly goes quiet.") + while(do_after(user, 1 SECOND)) + var/cooktime = 1 SECOND + if(power > 115) + cooktime += 1 SECOND + if(power > 300) + cooktime += 3 SECOND + superfood.process_cooked(1 SECOND, HEAT_HIGH, METHOD_ENERGETIC_ANOMALY) + return //we dont eat it if we cook it + + if(istype(W, /obj/item/reagent_containers/glass/food_holder) && prob(95)) + var/obj/item/reagent_containers/glass/food_holder/superpot = W + user.visible_message("\The [user] holds up [superpot] to \the [src] as the noise in the room dulls...",\ + "You hold up [superpot] to \the [src] when everything suddenly goes quiet.",\ + "Everything suddenly goes quiet.") + while(do_after(user, 1 SECOND)) + var/cooktime = 1 SECOND + if(power > 115) + cooktime += 1 SECOND + if(power > 300) + cooktime += 3 SECOND + superpot.tick_heat(cooktime, HEAT_HIGH, METHOD_ENERGETIC_ANOMALY) + + user.visible_message("\The [user] touches \a [W] to \the [src] as a silence fills the room...",\ "You touch \the [W] to \the [src] when everything suddenly goes silent.\"\n\The [W] flashes into dust as you flinch away from \the [src].",\ "Everything suddenly goes silent.") diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index c1e0d1bcf17b..1885801f7a85 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -76,6 +76,18 @@ if(orbiting_balls.len) . += "The amount of orbiting mini-balls is [orbiting_balls.len]." + +/obj/singularity/energy_ball/attackby(obj/item/W, mob/living/user) + if(QDELETED(W)) + return + + user.visible_message("\The [user] touches \a [W] to \the [src]!/span>",\ + "You touch \the [W] to \the [src]!\"\n\The [W] flashes into dust as you flinch away from \the [src].",\ + "A loud electrical noise fills the room.") + qdel(src) + new /obj/effect/debris/cleanable/ash(get_turf(user)) + + /obj/singularity/energy_ball/proc/move_the_basket_ball(move_amount, time) //we face the last thing we zapped, so this lets us favor that direction a bit var/move_bias = dir diff --git a/code/modules/reagents/Food-Recipes.dm b/code/modules/reagents/Food-Recipes.dm index 3dc91e0cfbce..196c62b58003 100644 --- a/code/modules/reagents/Food-Recipes.dm +++ b/code/modules/reagents/Food-Recipes.dm @@ -14,7 +14,7 @@ /datum/chemical_reaction/food/tofu/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/reagent_containers/food/snacks/tofu(location) + new /obj/item/reagent_containers/food/snacks/ingredient/tofu(location) return /datum/chemical_reaction/food/soysauce @@ -84,7 +84,7 @@ /datum/chemical_reaction/food/cheesewheel/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/reagent_containers/food/snacks/sliceable/cheesewheel(location) + new /obj/item/reagent_containers/food/snacks/ingredient/cheesewheel(location) return /datum/chemical_reaction/food/bluecheesewheel @@ -97,7 +97,7 @@ /datum/chemical_reaction/food/bluecheesewheel/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/reagent_containers/food/snacks/sliceable/bluecheesewheel(location) + new /obj/item/reagent_containers/food/snacks/ingredient/bluecheesewheel(location) return /datum/chemical_reaction/food/meatball @@ -110,21 +110,35 @@ /datum/chemical_reaction/food/meatball/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/reagent_containers/food/snacks/meatball(location) + new /obj/item/reagent_containers/food/snacks/ingredient/meatball(location) return /datum/chemical_reaction/food/dough name = "Dough" id = "dough" result = null - required_reagents = list("egg" = 3, "flour" = 10) - inhibitors = list("water" = 1, "beer" = 1) //To prevent it messing with batter recipes + required_reagents = list("water" = 5, "flour" = 10) + inhibitors = list("egg" = 1, "beer" = 1) //To prevent it messing with batter recipes result_amount = 1 /datum/chemical_reaction/food/dough/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/reagent_containers/food/snacks/dough(location) + new /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough(location) + return + +/datum/chemical_reaction/food/masa + name = "Masa" + id = "masa" + result = null + required_reagents = list("water" = 5, "cornflour" = 10) + inhibitors = list("egg" = 1, "beer" = 1) //To prevent it messing with batter recipes + result_amount = 1 + +/datum/chemical_reaction/food/masa/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/reagent_containers/food/snacks/ingredient/transformable/dough/corn(location) return @@ -138,7 +152,7 @@ /datum/chemical_reaction/food/syntiflesh/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/reagent_containers/food/snacks/meat/syntiflesh(location) + new /obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh(location) return /datum/chemical_reaction/hot_ramen diff --git a/code/modules/reagents/chemistry/reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/chemistry/reagents/Chemistry-Reagents-Food-Drinks.dm index 2a855375787d..7feed99a505c 100644 --- a/code/modules/reagents/chemistry/reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/chemistry/reagents/Chemistry-Reagents-Food-Drinks.dm @@ -135,6 +135,35 @@ M.afflict_sleeping(20 * 20) M.drowsyness = max(M.drowsyness, 60) + +/datum/reagent/nutriment/vegetablebroth + name = "vegetable broth" + id = "vegbroth" + description = "A thin broth, made from vegetables." + taste_description = "vegetables and salt" + nutriment_factor = 0.4 + +/datum/reagent/nutriment/meatbroth + name = "meat broth" + id = "meatbroth" + description = "A thin broth, made from some sort of meat." + taste_description = "meat and salt" + nutriment_factor = 0.6 + +/datum/reagent/nutriment/chickenbroth + name = "chicken broth" + id = "chickenbroth" + description = "A thin broth, made from chicken." + taste_description = "chicken and salt" + nutriment_factor = 0.5 + +/datum/reagent/nutriment/fishbroth + name = "fish broth" + id = "fishbroth" + description = "A thin broth, made from some sort of fish." + taste_description = "fish and salt" + nutriment_factor = 0.6 + /datum/reagent/nutriment/mayo name = "mayonnaise" id = "mayo" @@ -156,6 +185,19 @@ if(!istype(T, /turf/space)) new /obj/effect/debris/cleanable/flour(T) +/datum/reagent/nutriment/cornflour + name = "corn flour" + id = "cornflour" + description = "With the advent of modern autonixtamalizing maize varieties, even YOU can make masa by just grinding down fresh corn." + taste_description = "chalky corn" + reagent_state = REAGENT_SOLID + nutriment_factor = 1 + color = "#FFFFFF" + +/datum/reagent/nutriment/flour/touch_turf(turf/simulated/T) + if(!istype(T, /turf/space)) + new /obj/effect/debris/cleanable/flour(T) + /datum/reagent/nutriment/flour/vitapaste name = "NutriFlour" id = "nutriflour" @@ -1245,7 +1287,7 @@ taste_description = "tropical, somewhat buttery water" color = "#fafafa70" nutrition=1 - + glass_name = "Coconut Water" glass_desc = "A fresh clear liquid found within coconuts." @@ -4555,6 +4597,12 @@ ..() M.add_chemical_effect(CE_ALCOHOL, 0.02) //Very slightly alcoholic +/datum/reagent/nutriment/cokebatter + name = "cola batter" + id = "colabatter" + nutriment_factor = 30 //this shit got calories for days son + taste_description = "space cola" + //========================= //Fats //========================= diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index fb9373ecc1ae..0970823903fb 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -14,7 +14,7 @@ layer = ABOVE_TURF_LAYER anchored = 1 circuit = /obj/item/circuitboard/conveyor - speed_process = TRUE + speed_process = PROCESS_ON_SSFASTPROCESS /// What we set things to glide size to when they are being moved by us var/conveyor_glide_size = 8 diff --git a/code/modules/species/outsider/vox.dm b/code/modules/species/outsider/vox.dm index 3a5938eabc55..406251f4fea0 100644 --- a/code/modules/species/outsider/vox.dm +++ b/code/modules/species/outsider/vox.dm @@ -63,7 +63,7 @@ blood_color = "#9066BD" flesh_color = "#a3a593" base_color = "#2e3302" - meat_type = /obj/item/reagent_containers/food/snacks/meat/vox + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/vox reagent_tag = IS_VOX diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index f49084ac8169..ae2cc4c434dd 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -444,7 +444,7 @@ //? on death drops /// The color of the species flesh. var/flesh_color = "#FFC896" - var/meat_type = /obj/item/reagent_containers/food/snacks/meat/human + var/meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/human var/bone_type = /obj/item/stack/material/bone var/hide_type = /obj/item/stack/animalhide/human var/exotic_type = /obj/item/stack/sinew diff --git a/code/modules/species/station/monkey.dm b/code/modules/species/station/monkey.dm index 7c198c538089..d75f69e80629 100644 --- a/code/modules/species/station/monkey.dm +++ b/code/modules/species/station/monkey.dm @@ -29,7 +29,7 @@ unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws) inherent_verbs = list(/mob/living/proc/ventcrawl) hud_type = /datum/hud_data/monkey - meat_type = /obj/item/reagent_containers/food/snacks/meat/monkey + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/monkey //rarity_value = 0.1 total_health = 75 diff --git a/code/modules/species/station/standard/teshari.dm b/code/modules/species/station/standard/teshari.dm index 2ba15cae12be..025e962dcc6d 100644 --- a/code/modules/species/station/standard/teshari.dm +++ b/code/modules/species/station/standard/teshari.dm @@ -55,7 +55,7 @@ base_color = "#001144" reagent_tag = IS_TESHARI - meat_type = /obj/item/reagent_containers/food/snacks/meat/chicken/teshari + meat_type = /obj/item/reagent_containers/food/snacks/ingredient/meat/chicken/teshari move_trail = /obj/effect/debris/cleanable/blood/tracks/paw slowdown = -0.5 diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm index 055629a3d26e..4b679207a430 100644 --- a/code/modules/vore/fluffstuff/custom_items.dm +++ b/code/modules/vore/fluffstuff/custom_items.dm @@ -490,7 +490,7 @@ //Egg item //------------- -/obj/item/reagent_containers/food/snacks/egg/roiz +/obj/item/reagent_containers/food/snacks/ingredient/egg/roiz name = "lizard egg" desc = "It's a large lizard egg." icon = 'icons/vore/custom_items_vr.dmi' @@ -498,12 +498,12 @@ filling_color = "#FDFFD1" volume = 12 -/obj/item/reagent_containers/food/snacks/egg/roiz/Initialize(mapload) +/obj/item/reagent_containers/food/snacks/ingredient/egg/roiz/Initialize(mapload) . = ..() reagents.add_reagent("egg", 9) bitesize = 2 -/obj/item/reagent_containers/food/snacks/egg/roiz/attackby(obj/item/W as obj, mob/user as mob) +/obj/item/reagent_containers/food/snacks/ingredient/egg/roiz/attackby(obj/item/W as obj, mob/user as mob) if(istype( W, /obj/item/pen/crayon )) var/obj/item/pen/crayon/C = W var/clr = C.crayon_color_name @@ -1223,7 +1223,7 @@ to_chat(src, "[pick(rimplant.empty_message)]") return - new /obj/item/reagent_containers/food/snacks/egg/roiz/evian(get_turf(src)) //Roiz/evian so it gets all the functionality + new /obj/item/reagent_containers/food/snacks/ingredient/egg/roiz/evian(get_turf(src)) //Roiz/evian so it gets all the functionality var/index = rand(0,3) @@ -1241,13 +1241,13 @@ rimplant.reagents.remove_any(rimplant.transfer_amount) -/obj/item/reagent_containers/food/snacks/egg/roiz/evian +/obj/item/reagent_containers/food/snacks/ingredient/egg/roiz/evian name = "dragon egg" desc = "A quite large dragon egg!" icon_state = "egg_roiz_yellow" -/obj/item/reagent_containers/food/snacks/egg/roiz/evian/attackby(obj/item/W as obj, mob/user as mob) +/obj/item/reagent_containers/food/snacks/ingredient/egg/roiz/evian/attackby(obj/item/W as obj, mob/user as mob) if(istype( W, /obj/item/pen/crayon)) //No coloring these ones! return else diff --git a/html/changelog.html b/html/changelog.html new file mode 100644 index 000000000000..19cae1f39693 --- /dev/null +++ b/html/changelog.html @@ -0,0 +1,81 @@ + + + + Citadel Changelog + + + + + + + +
+ + + + +
+
Space Station 13
+ +

+ Code licensed under AGPLv3. Content licensed under CC BY-SA 3.0.

+
+ +
Citadel Credit List + + + + +
+ Current Project Maintainers:Enzo, Kevinz, and Zandario
+ Currently Active GitHub contributor list: -Click Here-
+ Main Testers: Anyone who has submitted a bug to the issue tracker.
+ Thanks to: Baystation 12, /tg/ station, /vg/station, GoonStation devs, and the original SpaceStation developers.
Also a thanks to anybody who has contributed who is not listed here. Ask to be added here via discord or github.
+
Have a bug to report?
Visit our Issue Tracker.
+
+ + +
+
+ +
Baystation 12 Credit List + + + + +
+ Current BS12 Project Maintainers: -Click Here-
+ Currently Active GitHub BS12 contributor list: -Click Here-
+ Code: Abi79, Aryn, Cael_Aislinn, Ccomp5950, Chinsky, cib, CompactNinja, DopeGhoti, Erthilo, Hawk_v3, Head, Ispil, JoeyJo0, Lexusjjss, Melonstorm, Miniature, Mloc, NerdyBoy1104, PsiOmegaDelta, SkyMarshal, Snapshot, Spectre, Strumpetplaya, Sunfall, Tastyfish, Uristqwerty
+ Sprites: Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, JoeyJo0, Miniature, Searif, Xenone, faux
+ Sounds: Aryn
+ Main Testers: Anyone who has submitted a bug to the issue tracker.
+
+ +GoonStation 13 Development Team +
+ Coders: Stuntwaffle, Showtime, Pantaloons, Nannek, Keelin, Exadv1, hobnob, Justicefries, 0staf, sniperchance, AngriestIBM, BrianOBlivion
+ Spriters: Supernorn, Haruhi, Stuntwaffle, Pantaloons, Rho, SynthOrange, I Said No
+
+
+

Creative Commons License
Except where otherwise noted, Goon Station 13 is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License.
Rights are currently extended to SomethingAwful Goons only.

+

Some icons by Yusuke Kamiyamane. All rights reserved. Licensed under a Creative Commons Attribution 3.0 License.

+
+ + diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml new file mode 100644 index 000000000000..1b6810cad65e --- /dev/null +++ b/html/changelogs/.all_changelog.yml @@ -0,0 +1,6175 @@ +DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. +--- +2013-01-07: + Cael_Aislinn: + - tgs: Updated server to tgstation r5200 (November 26th, 2012), see https://code.google.com/p/tgstation13/source/list + for tg's changelog. + Chinsky: + - rscadd: 'Implants: Explosvie implant, exploding when victim hears the codephrase + you set.' + - rscadd: 'Implants: Compressed Matter implat, scan item (making it disappear), + inject yourself and recall that item on will!' + - rscadd: Implant removal surgery, with !!FUN!! results if you mess up it. + - rscadd: Coats now have pockets again. + - rscadd: Bash people on tabetops. an windows, or with stools. Grab people to bash + them on tables or windows (better grab for better hit on windows). Drag stool + sprite on you to pick it up, click on it in hand to make it usual stool again. + - rscadd: Surgical caps, and new sprites for bloodbags and fixovein. + - rscadd: Now some surgery steps will bloody your hands, Full-body blood coat in + case youy mess up spectacualry. + - rscadd: Ported some crates (Art, Surgery, Sterile equiplemnt). + - tweak: Changed contraband crates. Posters moved to Art Crate, cigs and lipstick + ot party crate. Now contraband crate has illegal booze and illicit drugs. + - bugfix: Finally got evac party lights + - bugfix: Now disfigurment,now it WILL happen when damage is bad enough. + - experiment: Now if you speak in depressurized area (less than 10 kPa) only people + next to you can hear you. Radios still work though. +2013-01-13: + Chinsky: + - tweak: If you get enough (6) blood drips on one tile, it'll turn into a blood + puddle. Should make bleeding out more visible. + - tweak: Security belt now able to hold taser, baton and tape roll. + - tweak: Added alternative security uniform to Security wardrobes. + - rscadd: 'Ported Urist cult runes. Down with the crayon drawings! Example: http://dl.dropbox.com/u/26846767/images/SS13/255_symbols.PNG' + - bugfix: Engineering tape now require engineer OR atmos access instead of both. + - rscadd: Implants now will react to EMP, possibly in !!FUN!! ways + GauHelldragon: + - rscadd: Servicebots now have RoboTray and Printing Pen. Robotray can be used to + pick up and drop food/drinks. Printing pen can alternate between writing mode + and rename paper mode by clicking it. + - rscadd: Farmbots. A new type of robot that weeds, waters and fertilizes. Use robot + arm on water tank. Then use plant analyzer, mini-hoe, bucket and finally proximity + sensor. + - rscadd: Chefs can clang their serving trays with a rolling pin. Just like a riot + shield! +2013-01-21: + Cael_Aislinn: + - bugfix: Satchels and ore boxes can now hold strange rocks. + - rscadd: Closets and crates can now be built out of 5 and 10 plasteel respectively. + - rscadd: Observers can become mice once more. +2013-01-23: + Cael_Aislinn: + - tgs: Updated server to tgstation r5200 (November 26th, 2012), see https://code.google.com/p/tgstation13/source/list + for tg's changelog. +2013-01-31: + CIB: + - bugfix: Chilis and cold chilis no longer kill in small amounts + - bugfix: Chloral now again needs around 5 units to start killing somebody +2013-02-13: + Erthilo: + - bugfix: Fixed SSD (logged-out) players not staying asleep. + - bugfix: Fixed set-pose verb and mice emotes having extra periods. + - bugfix: Fixed virus crate not appearing and breaking supply shuttle. + - bugfix: Fixed newcaster photos not being censored. +2013-02-14: + CIB: + - rscadd: Medical side-effects(patients are going to come back for secondary treatment) + - rscadd: NT loyalty setting(affects command reports and gives antags hints who + might collaborate with them) + - tweak: Simple animal balance fixes(They're slower now) + CaelAislinn: + - rscadd: Re-added old ion storm laws, re-added grid check event. + - rscadd: Added Rogue Drone and Vermin Infestation random events. + - rscadd: Added/fixed space vines random event. + - tweak: Updates to the virus events. + - tweak: Spider infestation and alien infestation events turned off by default. + - tweak: Soghun, taj and skrell all have unique language text colours. + - tweak: Moderators will no longer be listed in adminwho, instead use modwho. + Gamerofthegame: + - rscadd: Miscellaneous mapfixes. +2013-02-18: + Cael Aislinn: + - rscadd: Security bots will now target hostile mobs, and vice versa. + - tweak: Carp should actually emigrate now, instead of just immigrating then squatting + around the outer hull. + - tweak: Admins and moderators have been split up into separate 'who' verbs (adminwho + and modwho respectively). +2013-02-20: + Chinsky: + - rscadd: 'Added new surgery: putting items inside people. After you use retractor + to keep incision open, just click with any item to put it inside. But be wary, + if you try to fit something too big, you might rip the veins. To remove items, + use implant removal surgery.' + - rscadd: Crowbar can be used as alternative to retractor. + - rscadd: Can now unload guns by clicking them in hand. + - tweak: Fixed distance calculation in bullet missing chance computation, it was + always assuming 1 or 0 tiles. Now distace REALLY matters when you shoot. + - rscadd: To add more FUN to previous thing, bullets missed to not disappear but + keep going until they hit something else. + - bugfix: Compressed Matter and Explosive implants spawn properly now. + - tweak: 'Tweaks to medical effects: removed itch caused by bandages. Chemical effects + now have non-100 chance of appearing, the stronger medicine, the more probality + it''ll have side effects.' +2013-02-22: + Chinsky: + - tweak: Change to body cavity surgery. Can only put items in chest, groind and + head. Max size for item - 3 (chest), 2 (groin), 1 (head). For chest surgery + ribs should be bent open, (lung surgery until second scalpel step). Surgery + step needs preparation step, with drill. After that you can place item inside, + or seal it with cautery to do other step instead. +2013-02-23: + Cael Aislinn: + - wip: RUST machinery components should now be researchable (with high requirements) + and orderable through QM (with high cost). + - wip: Shield machinery should now be researchable (with high requirements) and + orderable through QM (with high cost). This one is reportedly buggy. + - tweak: Rogue vending machines should revert back to normal at the end of the event. + - rscadd: New Unathi hair styles. +2013-02-25: + Cael Aislinn: + - rscadd: As well as building hull shield generators, normal shield gens can now + be built (see http://baystation12.net/forums/viewtopic.php?f=1&t;=6993). + - rscadd: 'New random events: multiple new system wide-events have been have been + added to the newscaster feeds, some not quite as respectable as others.' + - rscadd: 'New random event: some lucky winners will win the TC Daily Grand Slam + Lotto, while others may be the target of malicious hackers.' +2013-02-27: + Gamerofthegame: + - rscadd: Added the (base gear) ERT preset for the debug command. + - rscadd: Map fixes, Virology hole fixed. Atmospheric fixes for mining and, to a + less extent, the science outpost. (No, not cycling airlocks) + - rscadd: Fiddled with the ERT set up location on Centcom. Radmins will now have + a even easier time equiping a team of any real pratical size, especially coupled + with the above debug command. +2013-03-05: + CIB: + - rscadd: Added internal organs. They're currently all located in the chest. Use + advanced scanner to detect damage. Use the same surgery as for ruptured lungs + to fix them. + Cael Aislinn: + - soundadd: Set roundstart music to randomly choose between space.ogg and traitor.ogg + (see http://baystation12.net/forums/viewtopic.php?f=5&t;=6972) + - experiment: All RUST components except for TEGs (which generate the power) are + now obtainable ingame, bored engineers should get hold of them and setup an + experimental reactor for testing purposes. +2013-03-06: + Cael Aislinn: + - rscadd: Type 1 thermoelectric generators and the associated binary circulators + are now moveable (wrench to secure/unsecure) and orderable via Quartermaster. + - wip: code/maps/rust_test.dmm contains an example setup for a functional RUST reactor. + Maximum output is in the range of 12 to 20MW (12 to 20 million watts). + - bugfix: Removed double announcement for gridchecks, reduced duration of gridchecks. + RavingManiac: + - rscadd: You can now stab people with syringes using the "harm" intent. This destroys + the syringe and transfers a random percentage of its contents into the target. + Armor has a 50% chance of blocking the syringe. +2013-03-09: + Cael Aislinn: + - rscadd: "Beekeeping is now possible. Construct an apiary of out wood and embed\ + \ it into a hydroponics tray, then get a queen bee and bottle of BeezEez from\ + \ cargo bay. \n\t\tHives produce honey and honeycomb, but be wary if the bees\ + \ start swarming." +2013-03-11: + CIB: + - rscadd: Cloning now requires you to put slabs of meat into the cloning pod to + replenish biomass. + Cael Aislinn: + - wip: The xenoarchaeology update is here. This includes a major content overhaul + and a bunch of new features for xenoarchaeology. + - tweak: Digsites (strange rock deposits) are now much more nuanced and interesting, + and a huge number of minor (non-artifact) finds have been added. + - rscadd: Excavation is now a complex process that involves digging into the rock + to the right depth. + - rscadd: Chemical analysis is required for safe excavation of the digsites, in + order to determine how best to extract the finds. + - bugfix: Anomalous artifacts have been overhauled and many longstanding bugs with + existing effects have been fixed - the anomaly utiliser should now work much + more often. + - rscadd: Numerous new artifact effects have been added and some new artifact types + can be dug up from the asteroid. + - rscadd: New tools and equipment have been added, including normal and spaceworthy + versions of the anomaly suits, excavation tools and other neat gadgets. + - rscadd: Five books have been written by subject matter experts from around the + galaxy to help the crew of the Exodus come to grips with this exacting new science + (over 3000 words of tutorials!). + Chinsky: + - rscadd: Sec HUDs now can see short versions of sec records.on examine. Med HUDs + do same for medical records, and can set medical status of patient. + - rscadd: Damage to the head can now cause brain damage. +2013-03-14: + Spamcat: + - rscadd: Figured I should make one of these. Syringestabbing now produces a broken + syringe complete with fingerprints of attacker and blood of a victim, so dispose + your evidence carefully. Maximum transfer amount per stab is lowered to 10. +2013-03-15: + Cael_Aislinn: + - rscadd: Mapped a compact research base on the mining asteroid, with multiple labs + and testing rooms. It's reachable through a new (old) shuttle dock that leaves + from the research wing on the main station. +2013-03-26: + Spamcat: + - bugfix: Chemmaster now puts pills in pill bottles (if one is inserted). + - tweak: Stabbing someone with a syringe now deals 3 damage instead of 7 because + 7 is like, a crowbar punch. + - bugfix: Lizards can now join mid-round again. + - rscadd: Chemicals in bloodstream will transfer with blood now, so don't get drunk + before your blood donation. Viruses and antibodies transfer through blood too. + - bugfix: Virology is working again. +2013-03-27: + Asanadas: + - tweak: The Null Rod has recovered its de-culting ability, for balance reasons. + Metagaming with it is a big no-no! + - rscadd: Holy Water as a liquid is able to de-cult. Less effective, but less bloody. + May be changed over the course of time for balance. +2013-04-04: + SkyMarshal: + - bugfix: Fixed ZAS + - bugfix: Fixed Fire + Spamcat: + - bugfix: Blood type is now saved in character creation menu, no need to edit it + manually every round. +2013-04-09: + SkyMarshal: + - bugfix: Fire Issues (Firedoors, Flamethrowers, Incendiary Grenades) fixed. + - bugfix: Fixed a bad line of code that was preventing autoignition of flammable + gas mixes. + - bugfix: Volatile fuel is burned up after a point. + - rscdel: Partial-tile firedoors removed. This is due to ZAS breaking when interacting + with them. +2013-04-11: + SkyMarshal: + - experiment: Fire has been reworked. + - experiment: In-game variable editor is both readded and expanded with fire controlling + capability. +2013-04-17: + SkyMarshal: + - experiment: ZAS is now more deadly, as per decision by administrative team. May + be tweaked, but currently AIRFLOW is the biggest griefer. + - experiment: World startup optimized, many functions now delayed until a player + joins the server. (Reduces server boot time significantly) + - tweak: Zones will now equalize air more rapidly. + - bugfix: ZAS now respects active magboots when airflow occurs. + - bugfix: Airflow will no longer throw you into doors and open them. + - bugfix: Race condition in zone construction has been fixed, so zones connect properly + at round start. + - bugfix: Plasma effects readded. + - bugfix: Fixed runtime involving away mission. +2013-04-24: + Jediluke69: + - rscadd: Added 5 new drinks (Kira Special, Lemonade, Brown Star, Milkshakes, Rewriter) + - tweak: Nanopaste now heals about half of what it used to + - tweak: Ballistic crates should now come with shotguns loaded with actual shells + no more beanbags + - bugfix: Iced tea no longer makes a glass of .what? + NerdyBoy1104: + - rscadd: 'New Botany additions: Rice and Plastellium. New sheet material: Plastic.' + - rscadd: Plastellium is refined into plastic by first grinding the produce to get + plasticide. 20 plasticide + 10 polytrinic acid makes 10 sheets of plastic which + can be used to make crates, forks, spoons, knives, ashtrays or plastic bags + from. + - rscadd: Rice seeds grows into rice stalks that you grind to get rice. 10 Rice + + 5 Water makes boiled rice, 10 rice + 5 milk makes rice pudding, 10 rice + + 5 universal enzyme (in beaker) makes Sake. + faux: + - imageadd: Mixed Wardrobe Closet now has colored shoes and plaid skirts. + - imageadd: Dress uniforms added to the Captain, RD, and HoP wardrobe closets. A + uniform jacket has also been added to the Captain's closet. HoS' hat has been + re-added to their closet. I do not love the CMO and CE enough to give them anything. + - imageadd: Atheletic closet now has five different swimsuits *for the ladies* in + them. If you are a guy, be prepared to be yelled at if you run around like a + moron in one of these. Same goes for ladies who run around in shorts with their + titties swaying in the space winds. + - imageadd: A set of dispatcher uniforms will spawn in the security closet. These + are for playtesting the dispatcher role. + - imageadd: New suit spawns in the laundry room. It's for geezer's only. You're + welcome, Book. + - imageadd: Nurse outfit variant, orderly uniform, and first responder jacket will + now spawn in the medical wardrobe closet. + - imageadd: 'A white wedding dress will spawn in the chaplain''s closet. There are + also several dresses currently only adminspawnable. Admins: Look either under + "bride" or "dress." The bride one leads to the colored wedding dresses, and + there are some other kinds of dresses under dress.' + - tweak: No more luchador masks or boxing gloves or boxing ring. You guys have a + swimming pool now, dip in and enjoy it. + - tweak: he meeting hall has been replaced with an awkwardly placed security office + meant for prisoner processing. + - tweak: Added a couple more welding goggles to engineering since you guys liked + those a lot. + - imageadd: Flasks spawn behind the bar. Only three. Don't fight over them. I don't + know how to add them to the bar vending machine otherwise I would have done + that instead. Detective, you have your own flask in your office, it's underneath + the cigarettes on your desk. + - tweak: Added two canes to the medical storage, for people who have leg injuries + and can't walk good and stuff. I do not want to see doctors pretending to be + House. These are for patients. Do not make me delete this addition and declare + you guys not being able to have nice things. + - tweak: Secondary entance to EVA now directly leads into the medbay hardsuit section. + Sorry for any inconviences this will cause. The CMO can now fetch the hardsuits + whenever they want. + - tweak: Secondary security hardsuit has been added to the armory. Security members + please stop stealing engineer's hardsuits when you guys want to pair up for + space travel. + - tweak: Firelocks have been moved around in the main hallways to form really ghetto + versions of airlocks. + - tweak: Violin spawns in theatre storage now. I didn't put the piano there though, + that was someone else. + - tweak: Psych office in medbay has been made better looking. +2013-05-14: + Cael_Aislinn: + - experiment: Depth scanners can now be used to determine what material archaeological + deposits are made of, meaning lab analysis is no longer required. + - tweak: Some useability issues with xenoarchaeology tools have been resolved, and + the transit pods cycle automatically now. +2013-05-15: + Spamcat: + - rscadd: Added telescopic batons + to HoS's and captain's lockers. These are quite robust and easily concealable. +2013-05-21: + SkyMarshal: + - experiment: ZAS will now speed air movement into/out of a zone when unsimulated + tiles (e.g. space) are involved, in relation to the number of tiles. + - experiment: Portable Canisters will now automatically connect to any portable + connecter beneath them on map load. + - bugfix: Bug involving mis-mapped disposal junction fixed + - bugfix: Air alarms now work for atmos techs (whoops!) + - bugfix: The Master Controller now properly stops atmos when it runtimes. + - bugfix: Backpacks can no longer be contaminated + - tweak: ZAS no longer logs air statistics. + - tweak: ZAS now rebuilds as soon as it detects a semi-complex change in geometry. (It + was doing this already, but in a convoluted way which was actually less efficient) + - tweak: General code cleanup/commenting of ZAS + - tweak: Jungle now initializes after the random Z-level loads and atmos initializes. +2013-05-25: + Erthilo: + - bugfix: Fixes alien races appearing an unknown when speaking their language. + - bugfix: Fixes alien races losing their language when cloned. + - bugfix: Fixes UI getting randomly reset when trying to change it in Genetics Scanners. +2013-05-26: + Chinsky: + - rscadd: Tentacles! Now clone damage will make you horribly malformed like examine + text says. + Meyar: + - rscadd: The syndicate shuttle now has a cycling airlock during Nuke rounds. + - rscadd: Restored the ability for the syndicate Agent ID to change the name on + the card (reforge it) more than once. + - rscadd: ERT Radio now functional again. + - rscadd: 'Research blast doors now actually lock down the entirety of station-side + Research. ' + - rscadd: 'Added lock down buttons to the wardens office. ' + - rscadd: 'The randomized barsign has made a return. ' + - rscadd: Syndicate Agent ID's external airlock access restored. + VitrescentTortoise: + - rscadd: Added a third option for not getting any job preferences. It allows you + to return to the lobby instead of joining. +2013-05-28: + Erthilo: + - bugfix: Fixes everyone being able to understand alien languages. HERE IS YOUR + TOWER OF BABEL + VitrescentTortoise: + - bugfix: Wizard's forcewall now works. +2013-05-30: + Segrain: + - bugfix: Meteor showers actually spawn meteors now. + - tweak: Engineering tape fits into toolbelt and can be placed on doors. + - rscadd: Pill bottles can hold paper. + Spamcat: + - tweak: Pill bottle capacity increased to 14 items. + - bugfix: Fixed Lamarr (it now spawns properly) + proliberate: + - rscadd: Station time is now displayed in the status tab for new players and AIs. +2013-05-31: + Segrain: + - bugfix: Portable canisters now properly connect to ports beneath them on map load. + - bugfix: Fixed unfastening gas meters. +2013-06-01: + Chinsky: + - rscadd: Bloody footprints! Now stepping in the puddle will dirty your shoes/feet + and make you leave bloody footprints for a bit. + - rscadd: Blood now dries up after some time. Puddles take ~30 minutes, small things + 5 minutes. + - bugfix: Untreated wounds now heal. No more toe stubs spamming you with pain messages + for the rest of the shift. + - experiment: On the other side, everything is healed slowly. Maximum you cna squeeze + out of first aid is 0.5 health per tick per organ. Lying down makes it faster + too, by 1.5x factor. + - rscadd: Lids! Click beaker/bottle in hand to put them on/off. Prevent spilling + - rscadd: Added 'hailer' to security lockers. If used in hand, says "Halt! Security!". + For those who can't run and type. +2013-06-05: + Chinsky: + - rscadd: Load bearing equipment - webbings and vests for engineers and sec. Attach + to jumpsuit, use 'Look in storage' verb (object tab) to open. + Segrain: + - rscadd: Exosuits now can open firelocks by walking into them. +2013-06-06: + Asanadas: + - rscadd: Added a whimsical suit to the head of personnel's secret clothing locker. + Meyar: + - bugfix: Disposal's mail routing fixed. Missing pipes replaced. + - bugfix: 'Chemistry is once again a part of the disposals delivery circuit. ' + - bugfix: Added missing sorting junctions to Security and HoS office. + - bugfix: Fixed a duplicate sorting junction. +2013-06-09: + Segrain: + - bugfix: Emagged supply console can order SpecOp crates again. +2013-06-11: + Meyar: + - bugfix: Fixes a security door with a firedoor ontop of it. + - bugfix: Fixed a typo relating to the admin Select Equipment Verb. (It's RESPONSE + team not RESCUE team) + - rscadd: ERT are now automated, from their spawn to their shuttle. Admin intervention + no longer required! (Getting to the mechs still requires admin permission generally) + - rscadd: Added flashlights to compensate for the weakened PDA lights + - tweak: 'ERT Uniforms updated to be in line with Centcom uniforms. No more turtlenecks, + no sir. ' +2013-06-12: + Zuhayr: + - rscadd: Added pneumatic cannon and harpoons. + - experiment: Added embedded projectiles. Bullets and thrown weapons may stick in + targets. Throwing them by hand won't make them stick, firing them from a cannon + might. Implant removal surgery will get rid of shrapnel and stuck items. +2013-06-13: + Kilakk: + - rscadd: Added the Xenobiologist job. Has access to the research hallway and to + xenobiology. + - rscdel: Removed Xenobiology access from Scientists. + - rscdel: Removed the Xenobiologist alternate title from Scientists. + - rscadd: Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer. + - tweak: Changed the Research Outpost doors to use "Xenoarchaeology" access. +2013-06-18: + Segrain: + - bugfix: Fixed some bugs in windoor construction. + - tweak: Secure windoors are made with rods again. + - rscadd: Windoors drop their electronics when broken. Emagged windoors can have + theirs removed by crowbar. + - rscadd: Airlock electronics can be configured to make door open for any single + access on it instead of all of them. + - rscadd: Cyborgs can preview their icons before choosing. +2013-06-21: + Jupotter: + - bugfix: Fix the robotiscist preview in the char setupe screen +2013-06-22: + Cael_Aislinn: + - tweak: The xenoarchaeology depth scanner will now tell you what energy field is + required to safely extract a find. + - tweak: Excavation picks will now dig faster, and xenoarchaeology as a whole should + be easier to do. +2013-06-23: + Segrain: + - rscadd: Airlocks of various models can be constructed again. + faux: + - experiment: There has been a complete medbay renovation spearheaded by Vetinarix. + http://baystation12.net/forums/viewtopic.php?f=20&t;=7847 <-- Please + put any commentary good or bad, here. + - tweak: Some maintenance doors within RnD and Medbay have had their accesses changed. + Maintenance doors in the joint areas (leading to the research shuttle, virology, + and xenobiology) are now zero access. Which means anyone in those joints can + enter the maintenance tunnels. This was done to add additional evacuation locations + during radiation storms. Additional maintenance doors were added to the tunnels + in these areas to prevent docs and scientists from running about. + - tweak: Starboard emergency storage isn't gone now, it's simply located in the + escape wing. + - experiment: An engineering training room has been added to engineering. This location + was previously where surgery was located. If you are new to engineering or need + to brush up on your skills, please use this area for testing. +2013-06-26: + Segrain: + - bugfix: Autopsy scanner properly displays time of wound infliction and death. + - bugfix: Autopsy scanner properly displays wounds by projectile weapons. + Whitellama: + - bugfix: One-antag rounds (like wizard/ninja) no longer end automatically upon + death + - wip: Space ninja has been implemented as a voteable gamemode + - rscadd: Space ninja spawn landmarks have been implemented (but not yet placed + on the map), still spawn at carps-pawns instead. (The code will warn you about + this and ask you to report it, it's a known issue.) + - rscadd: Five new space ninja directives have been added, old directives have been + reworded to be less harsh + - wip: Space ninjas have been given their own list as antagonists, and are no longer + bundled up with traitors + - bugfix: Space ninjas with a "steal a functional AI" objective will now succeed + by downloading one into their suits + - tweak: Space ninja suits' exploding on death has been nerfed, so as not to cause + breaches + - rscadd: A few space ninja titles/names have been added and removed to be slightly + more believable + - bugfix: The antagonist selector no longer chooses jobbanned players when it runs + out of willing options +2013-06-27: + Segrain: + - bugfix: ID cards properly setup bloodtype, DNA and fingerprints again. +2013-06-28: + Segrain: + - rscadd: AIs are now able to examine what they see. +2013-07-03: + Segrain: + - rscadd: Security and medical cyborgs can use their HUDs to access records. +2013-07-05: + Spamcat: + - rscadd: Pulse! Humans now have hearbeat rate, which can be measured by right-clicking + someone - Check pulse or by health analyzer. Medical machinery also has heartbeat + monitors. Certain meds and conditions can influence it. +2013-07-06: + Chinsky: + - rscadd: Humans now can be infected with more than one virus at once. + - rscadd: All analyzed viruses are put into virus DB. You can view it and edit their + name and description on medical record consoles. + - tweak: 'Only known viruses (ones in DB) will be detected by the machinery and + HUDs. ' + - rscadd: Viruses cause fever, body temperature rising the more stage is. + - bugfix: Humans' body temperature does not drift towards room one unless there's + big difference in them. + - tweak: Virus incubators now can transmit viuses from dishes to blood sample. + - rscadd: New machine - centrifuge. It can isolate antibodies or viruses (spawning + virus dish) from a blood sample in vials. Accepts vials only. + - rscadd: Fancy vial boxes in virology, one of them is locked by ID with MD access. + - tweak: Engineered viruses are now ariborne too. +2013-07-11: + Chinsky: + - rscadd: Gun delays. All guns now have delays between shots. Most have less than + second, lasercannons and pulse rifles have around 2 seconds delay. Automatics + have zero, click-speed. +2013-07-26: + Kilakk: + - bugfix: Brig cell timers will no longer start counting down automatically. + - tweak: Separated the actual countdown timer from the timer controls. Pressing + "Set" while the timer is counting down will reset the countdown timer to the + time selected. +2013-07-28: + Segrain: + - rscadd: Camera console circuits can be adjusted for different networks. + - rscadd: Nuclear operatives and ERT members have built-in cameras in their helmets. + Activate helmet to initialize it. +2013-07-30: + Erthilo: + - bugfix: EFTPOS and ATM machines should now connect to databases. + - bugfix: Gravitational Catapults can now be removed from mechs. + - bugfix: Ghost manifest rune paper naming now works correctly. + - bugfix: Fix for newscaster special characters. Still not recommended. + Kilakk: + - rscadd: Added colored department radio channels. +2013-08-01: + Asanadas: + - tweak: The Null Rod has recovered its de-culting ability, for balance reasons. + Metagaming with it is a big no-no! + - rscadd: Holy Water as a liquid is able to de-cult. Less effective, but less bloody. + May be changed over the course of time for balance. + CIB: + - bugfix: Chilis and cold chilis no longer kill in small amounts + - bugfix: Chloral now again needs around 5 units to start killing somebody + Cael Aislinn: + - rscadd: Security bots will now target hostile mobs, and vice versa. + - tweak: Carp should actually emigrate now, instead of just immigrating then squatting + around the outer hull. + - tweak: Admins and moderators have been split up into separate 'who' verbs (adminwho + and modwho respectively). + CaelAislinn: + - rscadd: Re-added old ion storm laws, re-added grid check event. + - rscadd: Added Rogue Drone and Vermin Infestation random events. + - rscadd: Added/fixed space vines random event. + - tweak: Updates to the virus events. + - tweak: Spider infestation and alien infestation events turned off by default. + - tweak: Soghun, taj and skrell all have unique language text colours. + - tweak: Moderators will no longer be listed in adminwho, instead use modwho. + Cael_Aislinn: + - tgs: Updated server to tgstation r5200 (November 26th, 2012), see https://code.google.com/p/tgstation13/source/list + for tg's changelog. + Chinsky: + - rscadd: 'Old new medical features:' + - rscadd: Autoinjectors! They come preloaded with 5u of inapro, can be used instantly, + and are one-use. You can replace chems inside using a syringe. Box of them is + added to Medicine closet and medical supplies crate. + - rscadd: Splints! Target broken liimb and click on person to apply. Can be taken + off in inventory menu, like handcuffs. Splinted limbs have less negative effects. + - rscadd: Advanced medikit! Red and mean, all doctors spawn with one. Contains better + stuff - advanced versions of bandaids and aloe heal 12 damage on the first use. + - tweak: Wounds with damage above 50 won't heal by themselves even if bandaged/salved. + Would have to seek advanced medical attention for those. + Erthilo: + - bugfix: Fixed SSD (logged-out) players not staying asleep. + - bugfix: Fixed set-pose verb and mice emotes having extra periods. + - bugfix: Fixed virus crate not appearing and breaking supply shuttle. + - bugfix: Fixed newcaster photos not being censored. + Gamerofthegame: + - rscadd: Miscellaneous mapfixes. + GauHelldragon: + - rscadd: Servicebots now have RoboTray and Printing Pen. Robotray can be used to + pick up and drop food/drinks. Printing pen can alternate between writing mode + and rename paper mode by clicking it. + - rscadd: Farmbots. A new type of robot that weeds, waters and fertilizes. Use robot + arm on water tank. Then use plant analyzer, mini-hoe, bucket and finally proximity + sensor. + - rscadd: Chefs can clang their serving trays with a rolling pin. Just like a riot + shield! + Jediluke69: + - rscadd: Added 5 new drinks (Kira Special, Lemonade, Brown Star, Milkshakes, Rewriter) + - tweak: Nanopaste now heals about half of what it used to + - tweak: Ballistic crates should now come with shotguns loaded with actual shells + no more beanbags + - bugfix: Iced tea no longer makes a glass of .what? + Jupotter: + - bugfix: Fix the robotiscist preview in the char setupe screen + Kilakk: + - rscadd: Added the Xenobiologist job. Has access to the research hallway and to + xenobiology. + - rscdel: Removed Xenobiology access from Scientists. + - rscdel: Removed the Xenobiologist alternate title from Scientists. + - rscadd: Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer. + - tweak: Changed the Research Outpost doors to use "Xenoarchaeology" access. + Meyar: + - rscadd: The syndicate shuttle now has a cycling airlock during Nuke rounds. + - rscadd: Restored the ability for the syndicate Agent ID to change the name on + the card (reforge it) more than once. + - rscadd: ERT Radio now functional again. + - rscadd: 'Research blast doors now actually lock down the entirety of station-side + Research. ' + - rscadd: 'Added lock down buttons to the wardens office. ' + - rscadd: 'The randomized barsign has made a return. ' + - rscadd: Syndicate Agent ID's external airlock access restored. + NerdyBoy1104: + - rscadd: 'New Botany additions: Rice and Plastellium. New sheet material: Plastic.' + - rscadd: Plastellium is refined into plastic by first grinding the produce to get + plasticide. 20 plasticide + 10 polytrinic acid makes 10 sheets of plastic which + can be used to make crates, forks, spoons, knives, ashtrays or plastic bags + from. + - rscadd: Rice seeds grows into rice stalks that you grind to get rice. 10 Rice + + 5 Water makes boiled rice, 10 rice + 5 milk makes rice pudding, 10 rice + + 5 universal enzyme (in beaker) makes Sake. + RavingManiac: + - rscadd: You can now stab people with syringes using the "harm" intent. This destroys + the syringe and transfers a random percentage of its contents into the target. + Armor has a 50% chance of blocking the syringe. + Segrain: + - bugfix: Meteor showers actually spawn meteors now. + - tweak: Engineering tape fits into toolbelt and can be placed on doors. + - rscadd: Pill bottles can hold paper. + SkyMarshal: + - bugfix: Fixed ZAS + - bugfix: Fixed Fire + Spamcat: + - rscadd: Figured I should make one of these. Syringestabbing now produces a broken + syringe complete with fingerprints of attacker and blood of a victim, so dispose + your evidence carefully. Maximum transfer amount per stab is lowered to 10. + VitrescentTortoise: + - rscadd: Added a third option for not getting any job preferences. It allows you + to return to the lobby instead of joining. + Whitellama: + - bugfix: One-antag rounds (like wizard/ninja) no longer end automatically upon + death + - wip: Space ninja has been implemented as a voteable gamemode + - rscadd: Space ninja spawn landmarks have been implemented (but not yet placed + on the map), still spawn at carps-pawns instead. (The code will warn you about + this and ask you to report it, it's a known issue.) + - rscadd: Five new space ninja directives have been added, old directives have been + reworded to be less harsh + - wip: Space ninjas have been given their own list as antagonists, and are no longer + bundled up with traitors + - bugfix: Space ninjas with a "steal a functional AI" objective will now succeed + by downloading one into their suits + - tweak: Space ninja suits' exploding on death has been nerfed, so as not to cause + breaches + - rscadd: A few space ninja titles/names have been added and removed to be slightly + more believable + - bugfix: The antagonist selector no longer chooses jobbanned players when it runs + out of willing options + Zuhayr: + - rscadd: Added pneumatic cannon and harpoons. + - experiment: Added embedded projectiles. Bullets and thrown weapons may stick in + targets. Throwing them by hand won't make them stick, firing them from a cannon + might. Implant removal surgery will get rid of shrapnel and stuck items. + faux: + - imageadd: Mixed Wardrobe Closet now has colored shoes and plaid skirts. + - imageadd: Dress uniforms added to the Captain, RD, and HoP wardrobe closets. A + uniform jacket has also been added to the Captain's closet. HoS' hat has been + re-added to their closet. I do not love the CMO and CE enough to give them anything. + - imageadd: Atheletic closet now has five different swimsuits *for the ladies* in + them. If you are a guy, be prepared to be yelled at if you run around like a + moron in one of these. Same goes for ladies who run around in shorts with their + titties swaying in the space winds. + - imageadd: A set of dispatcher uniforms will spawn in the security closet. These + are for playtesting the dispatcher role. + - imageadd: New suit spawns in the laundry room. It's for geezer's only. You're + welcome, Book. + - imageadd: Nurse outfit variant, orderly uniform, and first responder jacket will + now spawn in the medical wardrobe closet. + - imageadd: 'A white wedding dress will spawn in the chaplain''s closet. There are + also several dresses currently only adminspawnable. Admins: Look either under + "bride" or "dress." The bride one leads to the colored wedding dresses, and + there are some other kinds of dresses under dress.' + - tweak: No more luchador masks or boxing gloves or boxing ring. You guys have a + swimming pool now, dip in and enjoy it. + - tweak: he meeting hall has been replaced with an awkwardly placed security office + meant for prisoner processing. + - tweak: Added a couple more welding goggles to engineering since you guys liked + those a lot. + - imageadd: Flasks spawn behind the bar. Only three. Don't fight over them. I don't + know how to add them to the bar vending machine otherwise I would have done + that instead. Detective, you have your own flask in your office, it's underneath + the cigarettes on your desk. + - tweak: Added two canes to the medical storage, for people who have leg injuries + and can't walk good and stuff. I do not want to see doctors pretending to be + House. These are for patients. Do not make me delete this addition and declare + you guys not being able to have nice things. + - tweak: Secondary entance to EVA now directly leads into the medbay hardsuit section. + Sorry for any inconviences this will cause. The CMO can now fetch the hardsuits + whenever they want. + - tweak: Secondary security hardsuit has been added to the armory. Security members + please stop stealing engineer's hardsuits when you guys want to pair up for + space travel. + - tweak: Firelocks have been moved around in the main hallways to form really ghetto + versions of airlocks. + - tweak: Violin spawns in theatre storage now. I didn't put the piano there though, + that was someone else. + - tweak: Psych office in medbay has been made better looking. + proliberate: + - rscadd: Station time is now displayed in the status tab for new players and AIs. +2013-08-04: + Chinsky: + - rscadd: Health HUD indicator replaced with Pain indicator. Now health indicator + shows pain level instead of actual vitals level. Some types of damage contribute + more to pain, some less, usually feeling worse than they really are. +2013-08-08: + Erthilo: + - bugfix: Raise Dead rune now properly heals and revives dead corpse. + - bugfix: Admin-only rejuvenate verb now heals all organs, limbs, and diseases. + - bugfix: Cyborg sprites now correctly reset with reset boards. This means cyborg + appearances can now be changed without admin intervention. +2013-09-18: + Kilakk: + - rscadd: Fax machines! The Captain and IA agents can use the fax machine to send + properly formatted messages to Central Command. + - imageadd: Gave the fax machine a fancy animated sprite. Thanks Cajoes! +2013-09-24: + Snapshot: + - rscdel: Removed hidden vote counts. + - rscdel: Removed hiding of vote results. + - rscdel: Removed OOC muting during votes. + - rscadd: Crew transfers are no longer callable during Red and Delta alert. + - wip: Started work on Auto transfer framework. +2013-10-06: + Chinsky: + - rscadd: Return of dreaded side effects. They now manifest well after their cause + disappears, so curing them should be possible without them reappearing immediately. + They also lost last stage damaging effects. +2013-10-29: + Cael_Aislinn: + - rscadd: Xenoarchaeology's chemical analysis and six analysis machines are gone, + replaced by a single one which can be beaten in a minigame. + - rscadd: Sneaky traitors will find new challenges to overcome at the research outpost, + but may also find new opportunities (transit tubes can now be traversed). + - rscadd: Finding active alien machinery should now be made significantly easier + with the Alden-Saraspova counter. +2013-11-01: + Various: + - rscadd: Autovoting, Get off the station when your 15 hour workweek is done, thanks + unions! + - rscadd: Some beach props that Chinsky finds useless. + - wip: Updated NanoUI + - rscadd: Dialysis while in sleepers - removes reagents from mobs, like the chemist, + toss him in there! + - tweak: Pipe Dispensers can now be ordered by Cargo + - rscadd: Fancy G-G-G-G-Ghosts! +2013-11-23: + Ccomp5950: + - bugfix: Players are now no longer able to commit suicide with a lasertag gun, + and will feel silly for doing so. + - bugfix: Ghosts hit with the cult book shall now actually become visible. + - bugfix: The powercells spawned with Exosuits will now properly be named to not + confuse bearded roboticists. + - bugfix: Blindfolded players will now no longer require eye surgery to repair their + sight, removing the blindfold will be sufficient. + - rscadd: Atmospheric Technicians will now have access to Exterior airlocks. +2013-11-24: + Yinadele: + - experiment: Supermatter engine added! Please treat your new engine gently, and + report any strangeness! + - tweak: Rebalanced events so people don't explode into appendicitis or have their + organs constantly explode. + - rscadd: Vending machines have had bottled water, iced tea, and grape soda added. + - rscadd: Head reattachment surgery added! Sew heads back on proper rather than + monkey madness. + - rscadd: Pain crit rebalanced - Added aim variance depending on pain levels, nerfed + blackscreen severely. + - rscadd: 'Cyborg alt titles: Robot, and Android added! These will make you spawn + as a posibrained robot. Please enjoy!' + - bugfix: Fixed the sprite on the modified welding goggles, added a pair to the + CE's office where they'll be used. + - bugfix: Fixed atmos computers- They are once again responsive! + - tweak: Added in functionality proper for explosive implants- You can now set their + level of detonation, and their effects are more responsively concrete depending + on setting. + - rscadd: Hemostats re-added to autolathe! + - rscadd: Added two manuals on atmosia and EVA, by MagmaRam! Found in engineering + and the engineering bookcase. + - bugfix: Fixed areas in medbay to have fully functional APC sectors. + - rscadd: Girders are now lasable. + - experiment: Please wait warmly, new features planned for next merge! +2013-12-01: + 'Various Developers banged their keyboards together:': + - rscadd: New Engine, the supermatter, figure out what a cooling loop is, or don't + and blow up engineering! + - rscadd: Each department will have it's own fax, make a copy of your butt and fax + it to the admins! + - rscadd: Booze and soda dispensers, they are like chemmasters, only with booze + and soda! + - rscadd: Bluespace and Cryostasis beakers, how do they work? Fuggin bluespace + how do they work? + - rscadd: You can now shove things into vending machines, impress your friends on + how things magically disappear out of your hands into the machine! + - rscadd: Robots and Androids (And gynoids too!) can now use custom job titles + - bugfix: Various bugfixes +2013-12-18: + RavingManiac: + - rscadd: Mousetraps can now be "hidden" through the right-click menu. This makes + them go under tables, clutter and the like. The filthy rodents will never see + it coming! + - tweak: Monkeys will no longer move randomly while being pulled. +2014-01-01: + Various: + - rscadd: AntagHUD and MedicalHUD for ghosts, see who the baddies are, check for + new configuration options. + - rscadd: Ghosts will now have bold text if they are in the same room as the person + making conversations easier to follow. + - rscadd: New hairstyles! Now you can use something other then hotpink floor length + braid. + - wip: DNA rework, tell us how you were cloned and became albino! + - rscadd: Dirty floors, so now you know exactly how lazy the janitors are! + - rscadd: A new UI system, feel free to color it yourself, don't set it to completely + clear or you will have a bad time. + - rscadd: Cryogenic storage, for all your SSD needs. + - rscadd: New hardsuits for those syndicate tajaran +2014-02-01: + Various: + - rscadd: NanoUI for PDA + - rscadd: Write in blood while a ghost in cult rounds with enough cultists + - rscadd: Cookies, absurd sandwiches, and even cookable dioanae nymphs! + - rscadd: A bunch of new guns and other weapons + - rscadd: Species specific blood +2014-02-19: + Aryn: + - experiment: New air model. Nothing should change to a great degree, but temperature + flow might be affected due to closed connections not sticking around. +2014-03-01: + Various: + - rscadd: Paint Mixing, red and blue makes purple! + - rscadd: New posters to tell you to respect those darned cat people + - rscadd: NanoUI for APC's, Canisters, Tank Transfer Valves and the heaters / coolers + - tweak: PDA bombs are now less annoying, and won't always blow up / cause internal + bleeding + - tweak: Blob made less deadly + - rscadd: Objectiveless Antags now a configuration option, choose your own adventure! + - wip: Engineering redesign, now with better monitoring of the explodium supermatter! + - rscadd: Security EOD + - rscadd: New playable race, IPC's, go beep boop boop all over the station! + - rscadd: Gamemode autovoting, now players don't have to call for gamemode votes, + it's automatic! +2014-03-05: + RavingManiac: + - rscadd: Smartfridges added to the bar, chemistry and virology. No more clutter! + - rscadd: A certain musical instrument has returned to the bar. + - rscadd: There is now a ten second delay between ingesting a pill/donut/milkshake + and regretting it. +2014-03-10: + Chinsky: + - rscadd: Viruses now affect certain range of species, different for each virus + - tweak: Spaceacilline now prevents infection, and has a small chance to cure viruses + at Stage 1. It does not give them antibodies though, so they can get sick again! + - tweak: Biosuits and spacesuits now offer more protection against viruses. Full + biosuit competely prevents airborne infection, when coupled with gloves they + both protect quite well from contact ones + - rscadd: Sneezing now spreads viruses in front of mob. Sometimes he gets a warning + beforehand though +2014-03-30: + RavingManiac: + - rscadd: Inflatable walls and doors added. Useful for sealing off hull breaches, + but easily punctured by sharp objects and Tajarans. +2014-04-06: + RavingManiac: + - tweak: Tape recorders and station-bounced radios now work inside containers and + closets. +2014-04-11: + Jarcolr: + - rscadd: You can now flip coins like a D2 + - tweak: Miscellaneous cargo crates got a tiny buff, Standard Costume crate is now + Costume Crate + - tweak: Grammar patch,telekinesis/amputated arm exploit fixes,more in the future + - tweak: Grille kicking now does less damage + - tweak: TELESCOPIC baton no longer knocks anybody down,still got a lot of force + though + - tweak: Other small-ish changes and fixes that aren't worth mentioning +2014-04-25: + Various: + - rscadd: Overhauled saycode, you can now use languages over the radio. + - rscadd: Chamelon items beyond just the suit. + - rscadd: NanoUI Virology + - rscadd: 3D Sounds + - rscadd: AI Channel color for when they want to be all sneaky + - rscadd: New inflatable walls and airlocks for your breach sealing pleasure. + - rscadd: Carbon Copy papers, so you can subject everyone to your authority and + paperwork, but mainly paperwork + - rscadd: Undershirts and rolling down jumpsuits + - rscadd: Insta-hit tasers, can be shot through glass as well. + - rscadd: Changeling balances, an emphasis put more on stealth. + - rscdel: Genetics disabled + - rscdel: Telescience removed, might be added again when we come up with a less + math headache enducing version of it. + - bugfix: Bugfixes galore! +2014-04-29: + HarpyEagle: + - rscadd: Webbing vest storage can now be accessed by clicking on the item in inventory + - rscadd: Holsters can be accessed by clicking on them in inventory + - rscadd: Webbings and other suit attachments are now visible on the icon in inventory + - tweak: Removing jumpsuits now requires drag and drop to prevent accidental undressing + - rscadd: Added an action icon for magboots that can be used to toggle them similar + to flashlights + - rscadd: Fuel tanks now spill fuel when wrenched open +2014-05-03: + Cael_Aislinn: + - rscadd: "Coming out of nowhere the past few months, the Garland Corporation has\ + \ made headlines with a new prehistoric theme park delighting travellers with\ + \ species thought extinct. Now available for research stations everywhere is\ + \ the technology that made it all possible! Features include:
\n\t\t\t-\ + \ 13 discoverable prehistoric species to clone from fossils (including 5 brand\ + \ new ones).
\n\t\t\t- 11 discoverable prehistoric plants to clone from fossils\ + \ (including 9 brand new ones).
\n\t\t\t- New minigame that involves correctly\ + \ ordering the genomes inside each genetic sequence to unlock an animal/plant.
\n\ + \t\t\t- Some prehistoric animals and plants may seem strangely familiar... while\ + \ others may bring more than the erstwhile scientist bargains for.
\n




" +2014-05-06: + Hubble: + - rscadd: Clip papers together by hitting a paper with a paper or photo + - imageadd: Adds icons for copied stamps +2014-05-16: + HarpyEagle: + - rscadd: Silicon mob types (AI, cyborgs, PAI) can now speak certain species languages + depending on type and module + - rscadd: Languages can now be whispered when using the language code with either + the whisper verb or the whisper speech code +2014-05-23: + Hubble: + - rscadd: Personal lockers are now resettable + - rscadd: Take off people's accessories or change their sensors in the drag and + drop-interface + - rscadd: Merge paper bundles by hitting one with another + - tweak: Line breaks in Security, Medical and Employment Records + - tweak: Record printouts will have names on it + - tweak: Set other people's internals in belt and suit storage slots + - bugfix: No longer changing suit sensors while cuffed + - bugfix: No longer emptying other people's pockets when they are not full yet +2014-05-28: + Chinsky: + - rscadd: Adds few new paperBBcode tags, to make up for HTML removal. + - rscadd: '[logo] tag draws NT logo image (one from wiki).' + - rscadd: '[table] [/table] tags mark borders of tables. [grid] [/grid] are borderless + tables, useful of making layouts. Inside tables following tags are used: [row] + marks beginning of new table row, [cell] - beginning of new table cell.' +2014-05-31: + Jarcolr: + - rscadd: 21 New cargo crates, go check them out! + - rscadd: Peanuts have now been added, food items are now being developed. + - rscadd: 2 new cargo groups, Miscellaneous and Supply. + - rscadd: Sugarcane seeds can now be gotten from the seed dispenser. + - rscadd: 5 new satchels when selecting "satchel" for RD, scientist, botanist, virologist, + geneticist (disabled) and chemist. + - rscadd: Clicking on a player with a paper/book when you have the eyes selected + shows them the book/paper forcefully. +2014-06-03: + Hubblenaut: + - rscadd: Added wheelchairs + - tweak: Replaced stool in Medical Examination with wheelchair + - tweak: Using a fire-extinguisher to propel you on a chair can have consequences + (drive into walls and people, do it!) +2014-06-13: + HarpyEagle: + - rscadd: Added docking ports for shuttles + - rscadd: Shuttle airlocks will automatically open and close, preventing people + from being sucked into space by because someone on another z-level called a + shuttle + - rscadd: Some docking ports can also double as airlocks + - rscadd: Docking ports can be overriden to prevent any automatic action. Shuttles + will wait for players to open/close doors manually + - rscadd: Shuttles can be forced launched, which will make them not wait for airlocks + to be properly closed +2014-06-15: + HarpyEagle: + - bugfix: Fixed wound autohealing regardless of damage amount. The appropriate wound + will now be assigned correctly based on damage amount and type + - bugfix: Fixed several other bugs related wounds that resulted in damage magically + disappearing + - bugfix: Fixed various sharp objects not being counted as sharp, bullets in particular + - bugfix: Fixed armour providing more protection from bullets than it was supposed + to +2014-06-19: + Chinsky: + - rscadd: Adds guest terminals on the map. These wall terminals let anyone issue + temporary IDs. Only access that issuer has can be granted, and maximum time + pass can be issued for is 20 minutes. All operations are logged in terminals. +2014-06-20: + Cael_Aislinn: + - rscadd: 'New discoverable items added to xenoarchaeology, and new features for + some existing ones. Artifact harvesters can now harvest the secondary effect + of artifacts as well as the primary one.
+ +
' + - tweak: 'Artifact utilisers should be much nicer/easier to use now.
+ +
  • Alden-Saraspova counters and talking items should work properly + now.
    + +
  • + +
    ' +2014-07-01: + Various: + - experiment: Hardsuit breaching. + - experiment: Rewritten fire. + - experiment: Supermatter now glows and sucks things into it as it approaches criticality. + - rscadd: Station Vox (Vox pariahs) are now available. + - rscadd: Wheelchairs. + - rscadd: Cargo Trains. + - rscadd: Hardsuit cycler machinery. + - rscadd: Rewritten lighting (coloured lights!) + - rscadd: New Mining machinery and rewritten smelting. + - rscadd: Rewritten autolathe + - rscadd: Mutiny mode. + - rscadd: NanoUI airlock and docking controllers. + - rscadd: Completely rewritten shuttle code. + - rscadd: 'Derelict Z-level replacement: construction site.' + - rscadd: Computer3 laptops. + - rscadd: Constructable SMES units. + - rscadd: Omni-directional atmos machinery. + - rscadd: Climbable tables and crates. + - rscadd: Xenoflora added to Science. + - rscadd: Utensils can be used to eat food. + - rscadd: Decks of cards are now around the station. + - rscadd: Service robots can speak languages. + - wip: Xenoarch updates and fixes. + - tweak: Rewritten species-specific gear icon handling. + - tweak: Cats and borers can be picked up. + - tweak: Botanist renamed to Gardener. + - tweak: Hydroponics merged with the Kitchen. + - tweak: Latejoin spawn points (Arrivals, Cryostorage, Gateway). + - rscadd: Escape pods only launch automatically during emergency evacuations + - rscadd: Escape pods can be made to launch during regular crew transfers using + the control panel inside the pod, or by emagging the panel outside the pod + - rscadd: When swiped or emagged, the crew transfer shuttle can be delayed in addition + to being launched early +2014-07-06: + HarpyEagle: + - rscadd: Re-enabled and rewrote the wound infection system + - rscadd: Infections can be prevented by properly bandaging and salving wounds + - rscadd: Infections are cured by spaceacillin +2014-07-20: + PsiOmegaDelta: + - rscadd: AI can now store up to five camera locations and return to them when desired. + - rscadd: AI can now alt+left click turfs in camera view to list and interact with + the objects. + - rscadd: AI can now ctrl+click turret controls to enable/disable turrets. + - rscadd: AI can now alt+click turret controls to toggle stun/lethal mode. + - rscadd: AI can now select which channel to state laws on. +2014-07-26: + Whitellama: + - rscadd: Added dynamic flavour text. + - bugfix: Fixed bug with suit fibers and fingerprints. +2014-07-31: + HarpyEagle: + - tweak: Stun batons now work like tasers and deal agony instead of stun + - rscadd: Being hit in the hands with a stun weapon will cause whatever is being + held to be dropped + - tweak: Handcuffs now require an aggressive grab to be used +2014-08-02: + Whitellama: + - bugfix: Arcane tomes can now be stored on bookshelves. + - bugfix: Dionaea players no longer crash on death, and now become nymphs properly. +2014-08-05: + HarpyEagle: + - tweak: Atmos Rewrite. Many atmos devices now use power according to their load + and gas physics + - rscadd: Pressure regulator device. Replaces the passive gate and can regulate + input or output pressure + - rscadd: Gas heaters and gas coolers are now constructable and can be upgraded + with parts from research + - bugfix: Fixes recharger and cell charger power draw. Rechargers draw 15 kW, wall + chargers draw 25 kW, and heavy-duty cell chargers draw 40 kW. Cyborg charging + stations draw 75 kW. + - bugfix: Laptops, and various other machines, now draw more reasonable amounts + of power + - bugfix: Machines will periodically update their powered status if moved from a + powered to an unpowered area and vice versa +2014-08-27: + Whitellama: + - bugfix: Made destination taggers more intuitive so you know when you've tagged + something + - rscadd: Ported package label and tag sprites + - rscadd: Ported using a pen on a package to give it a title, or to write a note + - rscadd: Donut boxes and egg boxes can be constructed out of cardboard +2014-08-31: + Whitellama: + - bugfix: Matches and candles can be used to burn papers, too. + - bugfix: Observers have a bit more time (20 seconds, instead of 7.5) before the + Diona join prompt disappears. +2014-09-05: + RavingManiac: + - experiment: 'NewPipe implemented: Supply and scrubber pipes can be run in parallel + without connecting to each other.' + - rscadd: Supply pipes will only connect to supply pipes, vents and Universal Pipe + Adapters(UPAs). + - rscadd: Scrubber pipes will only connect to scrubber pipes, scrubbers and UPAs. + - rscadd: UPAs will connect to regular, scrubber and supply pipes. +2014-09-20: + HarpyEagle: + - bugfix: Fixes evidence bags and boxes eating each other. Evidence bags now store + items by dragging the bag onto the item to be stored. +2014-09-28: + Gamerofthegame: + - rscadd: Hoverpods fully supported, currently orderable from cargo. Two slots, + three cargo, space flight and a working mech for all other intents and purposes. + - rscadd: Added the Rigged laser and Passenger Compartment equipment. The rigged + laser is a weapon for working exosuits - just a ordinary laser, but with triple + the cool down and rather power inefficient. The passenger compartment allows + other people to board and hitch a ride on the mech - such as in fire rescue + or for space flight. + Zuhayr: + - rscadd: Organs can now be removed and transplanted. + - tweak: Brain surgery is now the same as chest surgery regarding the steps leading + up to it. + - tweak: Appendix and kidney now share the groin and removing the first will prevent + appendicitis. + - tweak: Lots of backend surgery/organ stuff, see the PR if you need to know. +2014-10-01: + RavingManiac: + - rscadd: Zooming with the sniper rifle now adds a view offset in the direction + you are facing. + - rscadd: Added binoculars - functionally similar to sniper scope. Adminspawn-only + for now. + - rscadd: Bottles from chemistry now, like beakers, use chemical overlays instead + of fixed sprites. + - rscadd: Being in space while not magbooted to something will cause your sprite + to bob up and down. + Zuhayr: + - rscadd: Added species organ checks to several areas (phoron burn, welder burn, + appendicitis, vox cortical stacks, flashes). + - rscadd: Added VV option to add or remove organs. + - rscadd: Added simple bioprinter (adminspawn). + - rscadd: Added smashing/slashing behavior from xenos to some unarmed attacks. + - rscadd: Added some new state icons for diona nymphs. + - rscadd: Added borer husk functionality (cortical borers can turn dead humans into + zombies). + - rscadd: Added tackle verb. + - rscadd: Added NO_SLIP. + - rscadd: Added species-specific orans to Dionaea, new Xenomorphs and vox. + - rscadd: Added colour and species to blood data. + - rscadd: Added lethal consequences to missing your heart. + - rscdel: Removed robot_talk_understand and alien_talk_understand. + - rscdel: Removed attack_alien() and several flavours of is_alien() procs. + - rscdel: Removed /mob/living/carbon/alien/humanoid. + - rscdel: Removed alien_hud(). + - rscdel: Removed IS_SLOW, NEEDS_LIGHT and RAD_ABSORB. + - rscdel: Renamed is_larva() to is_alien(). + - tweak: Refactored a ton of files, either condensing or expanding them, or moving + them to new directories. + - tweak: Refactored some attack vars from simple_animal to mob/living level. + - tweak: Refactored internal organs to /mob/living/carbon level. + - tweak: Refactored rad and light absorbtion to organ level. + - tweak: Refactored brains to /obj/item/organ/brain. + - tweak: Refactored a lot of blood splattering to use blood_splatter() proc. + - tweak: Refactored broadcast languages (changeling and alien hiveminds, drone and + binary chat) to actual languages. + - tweak: Refactored xenomorph abilities to work for humans. + - tweak: Refactored xenomorphs into human species. + - tweak: Rewrote larva_hud() and human_hud(). The latter now takes data from the + species datum. + - tweak: Rewrote diona nymphs as descendents of /mob/living/carbon/alien. + - tweak: Rewrote xenolarva as descendents of /mob/living/carbon/alien. + - tweak: Rewrote /mob/living/carbon/alien. + - tweak: Moved alcohol and toxin processing to the liver. + - tweak: Moved drone light proc to robot level, added integrated_light_power and + local_transmit vars to robots. + - tweak: Moved human brainloss onto the brain organ. + - tweak: Shuffled around and collapsed several redundant procs down to carbon level + (hide, ventcrawl, Bump). + - tweak: Fixed species swaps from NO_BLOOD to those with blood killing the subject + instantly. +2014-11-01: + PsiOmegaDelta: + - bugfix: Adds the last missing step to deconstruct fire alarms. Apply wirecutters. + - rscadd: There's a "new" mining outpost nearby the Research outpost. + - rscadd: Manifest ghosts now have spookier names. + - rscadd: Adds a gas monitor computer for the toxin mixing chamber. + - rscadd: AI can now change the display of individual AI status screens. + - rscadd: More ion laws.. + - rscadd: All turrets have been replaced with portable variants. Potential targets + can be configured on a per turret basis. + - bugfix: Improved crew monitor map positioning. + - rscadd: Can now order plastic, body-, and statis bags from cargo + - rscadd: PDAs now receive newscasts. + - rscadd: (De)constructable emergency shutters. + - rscadd: Borgs can now select to simply state their laws or select a radio channel, + same as the AI. +2014-11-04: + TwistedAkai: + - rscadd: Almost any window which has been fully unsecured can now be dismantled + with a wrench. +2014-11-08: + PsiOmegaDelta: + - rscadd: Service personnel now have their own frequency to communicate over. Use + "say :v". + - rscadd: The AI can now has proper quick access to its private channel. Use "say + :o". + - rscadd: Newscasters supports photo captions. Simply pen one on the attached photo. + - rscadd: Once made visible by a cultist ghosts can toggle visiblity at will. + - rscadd: Detonating cyborgs using the cyborg monitor console now notifies the master + AI, if any. + - rscadd: More machinery, such as APCs, air alarms, etc., now support attaching + signalers to the wires. + - tweak: Random event overhaul. Admins may wish check the verb "Event Manager Panel". +2014-11-22: + Zuhayr: + - rscadd: Added the /obj/item/weapon/rig class - back-mounted deployable hardsuits. + - rscadd: Replaced existing hardsuits with 'voidsuits', functionally identical. + - rscdel: Removed the mounted device and helmet/boot procs from voidsuits. + - tweak: Refactored a shit-ton of ninja code into the new rig class. + - wip: This is more than likely going to take a lot of balancing to get into a good + place. +2015-01-09: + Zuhayr: + - tweak: Voice changers no longer use ID cards. They have Toggle and Set Voice verbs + on the actual mask object now. + - rscadd: Readded moonwalking. Alt-dir to face new dir, or Face-Direction verb to + face current dir. +2015-02-04: + RavingManiac: + - rscadd: Holodeck is now bigger and better, with toggleable gravity and a new courtroom + setting + TwistedAkai: + - bugfix: Purple Combs should now be visible and have their proper icon +2015-02-12: + Daranz: + - rscadd: Vending machines now use NanoUI and accept cash. The vendor account can + now be suspended to disable all sales in all machines on station. +2015-02-16: + RavingManiac: + - rscadd: Say hello to the new Thermoelectric Supermatter Engine. Read the operating + manual to get started. +2015-02-18: + PsiOmegaDelta: + - rscadd: Synths now have timestamped radio and chat messages. + - rscadd: New and updated uplink items. + - rscadd: Multiple AIs can now share the same holopad. + - rscadd: The AI now has built-in consoles, accessible from the subsystem tab. +2015-02-24: + Zuhayr: + - experiment: Major changes to the kitchen and hydroponics mechanics. Review the + detailed changelog here, +2015-04-07: + RavingManiac: + - tweak: You can now pay vending machines and EFTPOS scanners without removing your + ID from your PDA or wallet. Clicking on the vending machine with your ID/PDA/wallet/cash + also brings up the menu now instead of attacking the vending machine. +2015-04-18: + PsiOmegaDelta: + - rscadd: Added a changelog editing system that should cause fewer conflicts and + more accurate timestamps. +2015-04-23: + Dennok: + - rscadd: Added an automatic pipelayer. + - rscadd: Added an automatic cablelayer. + PsiOmegaDelta: + - bugfix: Shower curtains no longer lose their default color upon being washed. + - bugfix: Emergency shutters can again be examined, and from the proper distance. + - bugfix: The virus event will now only infect mobs on the station, currently controlled + by player that has been active in the last 5 minutes. + - bugfix: Laptops now use the proper proc for checking camera status. + - rscadd: Makes it possible to eject PDA cartridges using a verb. + - rscadd: Makes it possible to shake tables with one's bare hands to stop climbers. + - bugfix: Added a mass driver door in disposals to prevent trash from floating out + into space before proper ejection. + - rscadd: Rig/Hardsuit module tab - Less informative than the NanoUI hardsuit interface + but allows quicker access to the various rig modules. + - rscadd: Silicons with the medical augmentation sensors enabled now also see alive/dead + status if sensors are set accordingly. + - rscadd: Emergency shutters opened by silicons are now treated as having been forced + open by a crowbar. + - rscadd: An active AI chassis can now be pushed, just as an empty chassis can be. + - rscadd: The AI can now use the crew monitor console to track crew members with + full sensors enabled. + - rscadd: The AI now has a shortcut to track people holding up messages to cameras. + - rscadd: The AI now has a shortcut to track people sending PDA messages. + - rscadd: Multiple AIs can now share the same holopad. + - rscadd: Admin ghosts can now transfer other ghosts into mobs by drag-clicking. + - rscadd: Ghosts can now toggle seeing darkness and other ghosts separately. + - rscadd: Moving while dead now auto-ghosts you. + - rscadd: 'Two new random events: Space dust and gravitation failure.' + - rscadd: Upgraded wizard spell interface and new spells. + - rscadd: More uplink items. + - rscadd: Uplink items now have rudimentary descriptions. + Yoshax: + - tweak: Adjusts fruits and other stuff to have a minmum of 10 units of juice and + stuff. +2015-04-24: + Dennok: + - bugfix: Fixes overmap ship speed calculations. + - rscadd: Adds overmap ship rotation. + - rscadd: Added a floorlayer. +2015-04-28: + Jarcolr: + - rscadd: Added 9 new bar sign designs/sprites. + Kelenius: + - rscadd: 'Good news to the roboticists! The long waited firmware update for the + bots has arrived. You can expect the following changes:' + - rscadd: Medbots have improved the disease detection algorithms. + - rscadd: Floorbot firmware has been bugtested. In particular, they will no longer + get stuck near the windows, hopelessly trying to fix the floor under the glass. + - rscadd: Floorbots have also received an internal low-power metal synthesizer. + They will use it to make their own tiles. Slowly. + - rscadd: Following the complains from humanitarian organizations regarding securitron + brutality, stength of their stunners has been toned down. They will also politely + demand that you get on the floor before arresting you. Except for the taser-mounted + guys, they will still tase you down. + - rscadd: Other minor fixes. + - rscdel: 'The lasertag bots are now forbidden to build and use following the incident + #1526672. Please don''t let it happen again.' + - rscadd: The farmbot design has been finished! Made from a watertank, robot arm, + plant analyzer, bucket, minihoe and a proximity sensor, these small (not really) + bots will be a useful companion to any gardener and/or xenobotanist. + - tweak: 'Spider learning alert: they have learned to recognize the bots and will + mercilessly attack them.' + - rscadd: An experimental CPU upgrade would theoretically allow any of the bots + to function with the same intelligence capacity as the maintenance drones. We + still have no idea what causes it to boot up. Science! + - rscadd: 'INCOMING TRANSMISSION: Greetings to agents, pirates, operatives, and + anyone who otherwise uses our equipment. Following the NT update of bot firmware, + we have updated the cryptographic sequencer''s hacking routines as well. The + medbots you emag will not poison you anymore, the clanbots won''t clean after + themselves immediately, and floorbots... wear a space suit. Oh, and it works + on the new farmbots, too.' + PsiOmegaDelta: + - rscadd: Beware. Airlocks can now crush more things than just mobs. + - rscadd: AIs now have a personal atmospherics control subsystem. + - rscadd: Some borg modules now have additional subsystems. + - tweak: Improves borg module handling. + - tweak: Secure airlocks now buzz when access is denied. + - tweak: The mental health office door now requires psychiatrist access, and the + related button now opens/closes the door instead of bolting. + - soundadd: Restores an old soundtrack 'Thunderdome.ogg'. + - rscadd: Some holodeck programs now have custom ambience tracks. + RavingManiac: + - rscadd: The phoron research lab has been renovated to include a heat-exchange + system, a gas mixer/filter and a waste gas disposal pump. + - tweak: Candles now burn for about 30 mintutes. + Yoshax: + - tweak: Adds items to the orderable antag surgical kit so its actually useful for + surgery. + - tweak: Adjusts custom loadout costs to be more standardised and balances. Purely + cosmetic items, shoes, hats, and all things that do not provide a straight advtange + (sterile mask, or pAI, protection from viruses and possible door hacking or + records access, respectively), each cost 1 point, items that provide an advantage + like those just mentioned, or provide armor or storage cost 2 points. + - rscadd: Adds practice rounds, both .45 for Sec and Detective's guns, also 9mm + top mounted for the Saber, and for the Bulldog. + - rscadd: Adds the .45 and 9mm practice rounds to the armory. + - rscadd: Adds all the practice rounds to the autolathe. + - tweak: Adds r_walls to the back of the firing range, leaves the sides normal. + - bugfix: Fixes HoS' office door to not be CMO locked. +2015-04-29: + Daranz: + - rscadd: Paper bundles can now have papers inserted at arbitrary points. This can + be done by clicking the previous/next page links with a sheet of paper in hand. + HarpyEagle: + - rscadd: 'Added new fire modes to various guns: c20r, STS-35, WT-550, Z8, L6 SAW, + and double barreled shotgun. The firing modes work the same way as the egun; + click on the weapon with it in your active hand to cycle between modes. Unloading + these weapons now requires that you click on them with an empty hand.' + PsiOmegaDelta: + - rscadd: Portable atmospheric pumps and scrubbers now use NanoUI. + - rscadd: Two new events which will cause damage to APCs or cameras when triggered. +2015-04-30: + Yoshax: + - rscadd: Adds more items to custom loadout, including a number of dressy suits + and some other things. +2015-05-02: + HarpyEagle: + - bugfix: Neck-grabbing someone now stuns them properly. + PsiOmegaDelta: + - tweak: The spider infestation event now makes an announcement much sooner. + - rscadd: Admins can now toggle OOC/LOOC separately. + - tweak: Mice are now numbered to aid admins. + Yoshax: + - rscadd: Adds an option and verb to the AI to send emergency messages to Central, + functions same as comms console option. + - tweak: Changes comms console to only have one level of ID require, meaning all + heads of staff have what was captain access, allowing them to change alert, + send emergency messages and make announcements. + - rscadd: Adds an emergency bluespace relay machine which is mapped into teletcomms, + this machine takes emergency messages and sends them to central, if one does + not exist on any Z, you cannot send any emergency messages. + - rscadd: Adds an emergency bluespace relay assembly kit orderable from cargo for + when the ones on telecomms are destroyed. Assembly is required. + - rscadd: Adds the emergency bluespace relay circuitboard to be researchable and + printable in R&D, with sufficient tech levels. +2015-05-05: + PsiOmegaDelta: + - tweak: Grilles no longer return too many rods when destroyed (using means other + than wirecutters). + RavingManiac: + - tweak: Intent menu now appears while zooming with a sniper rifle. +2015-05-06: + PsiOmegaDelta: + - rscadd: Examining a pen or crayon now lists the available special commands in + the examine tab. +2015-05-07: + HarpyEagle: + - rscadd: Breaking out of lockers now has sound and animation. + PsiOmegaDelta: + - bugfix: The cloning computer can again successfully locate nearby cloning vats + and DNA scanners at round start. + - rscadd: Security equipment now treats individuals with CentCom ids with the greatest + respect. + - maptweak: Adds stretches of power cable around the construction outpost, ensuring + one does not have to climb over machines to being laying cables. + RavingManiac: + - rscadd: Muzzle-flash lighting effect for guns + - rscadd: Energy guns now display shots remaining on examine +2015-05-09: + Yoshax: + - rscadd: Maps in the top mounted 9mm practice rounds, .45 practice rounds, and + practice shotgun shells into the armory. +2015-05-10: + GinjaNinja32: + - rscadd: Acting jobs on the manifest will now sort with their non-acting counterparts. + All assignments beginning with the word 'acting', 'temporary', or 'interim' + will do this. + Yoshax: + - tweak: Removes sleepy chems from being cloned, adds a consistent period of 30 + tick sleep. +2015-05-11: + Mloc: + - experiment: Rewritten lighting system. + - rscadd: Better coloured lights. + - rscadd: Animated transitions. + PsiOmegaDelta: + - bugfix: As an observer, using antagHUD should now always restrict you from respawning + without admin intervention. + Techhead: + - rscadd: Voidsuits can have tanks inserted into the storage slot. + - rscadd: Voidsuits display helpful information on their contents on examine. + - rscadd: Magboots can be equipped over other shoes. Except other magboots. +2015-05-12: + Dennok: + - imageadd: New buildmode icons made by BartNixon. + HarpyEagle: + - rscadd: Masks and helmets that cover the face block feeding food, drinks, and + pills. + MrSnapwalk: + - imageadd: Added seven new AI core displays. + - tweak: Changed the pAI sprite and added several new expressions. + PsiOmegaDelta: + - rscadd: The space vine event now comes with a station announcement. +2015-05-14: + PsiOmegaDelta: + - maptweak: Should now be more evident that the brig disposal chute sends its goods + to the common brig area. + - bugfix: Cells now drain when using more charge than what is available. + - tweak: The rig stealth module now requires as much power to run as the energy + blade module. + Techhead: + - rscadd: Vox will spawn with emergency nitrogen tanks in their survival boxes. + - rscadd: Diona will spawn with an emergency flare instead of a survival box. + - rscdel: Engineers no longer spawn with extended-capacity oxygen tanks. + - bugfix: Vox spawning without backpacks will have their nitrogen tank equipped + to their back. + - tweak: The Bartender's spare beanbag shells have been moved into bar backroom + with the shotgun. + - bugfix: Portable air pumps now fill based on external/airtank pressure when pumping + in. +2015-05-16: + GinjaNinja32: + - rscadd: Rewrote tables. To construct a table, use steel to make a table frame, + then plate the frame with a material such as steel, gold, wood, etc. Hold a + stack in your hand and drag it to the table to reinforce it. To deconstruct + a table, use a screwdriver to remove the reinforcements (if present), then a + wrench to remove the plating, and a wrench again to dismantle the frame. Use + a welder to repair any damage. Use a carpet tile on a table to add felt, and + a crowbar to remove it. + HarpyEagle: + - rscadd: Adds tail animations for tajaran and unathi. Animations are controlled + using emotes. +2015-05-17: + PsiOmegaDelta: + - bugfix: Teleporter artifacts should no longer teleport mobs inside objects. +2015-05-18: + Hubblenaut: + - rscadd: Adds a light for available backup power on airlocks. + Kelenius: + - tweak: 'There has been a big update to the reagent system. A full-ish changelog + can be found here: http://pastebin.com/imHXTRHz. In particular:' + - tweak: Reagents now differentiate between being ingested (food, pills, smoke), + injected (syringes, IV drips), and put on the skin (sprays, beaker splashing). + - tweak: Injecting food and drinks will cause bad effects. + - tweak: Healing reagents, generally speaking, have stronger effects when injected. + - tweak: Toxins now work slower and deal more damage. Seek medical help! + - tweak: Alcohol robustness has been lowered. + - tweak: Acid will no longer melt large numbers of items at once. + - tweak: Synaptizine is no longer hilariously deadly. + Loganbacca: + - tweak: Changed MULE destination selection to be list based. + PsiOmegaDelta: + - tweak: Destroying a camera by brute force now has a chance to break the wiring + within. + - rscadd: Turf are now processed. This, for example, causes radioactive walls to + regularly irradiate nearby mobs. + - bugfix: Welders should now always update their icon and inhand states properly. +2015-05-22: + Ccomp5950: + - bugfix: Beepsky no longer kills goats. + - tweak: Goats will move towards vines that are 4 spaces away now instead of 1 + - bugfix: Goats will eat the spawning plants for vines as well as the vines themselves. + Chinsky: + - rscadd: Ghetto diagnosis. Grab patient, aim at bodypart you want to check, click + on them with help intent. This will tell you about their wounds, fractures and + other oddities (toxins/oxygen) for that bodypart. + - rscadd: Fractures are visible on very damaged limbs. Dislocations are always visible. + Surgery incisions now visible too. + - rscadd: Stethoscopes actually make sense now. They care for heart/lungs status + when reporting pulse and respiration now. + HarpyEagle: + - rscadd: Re-implemented fuel fires. Tweaked fire behaviour overall. + Yoshax: + - tweak: Bear traps now do damage when stood on, enough to break bones! Bear traps + can now affect any limb of a person who is on the ground, including head! Bear + traps are no longer legcuffs and instead embed in the limb they attack. + - tweak: Bear traps now take several seconds to deploy and cannot be picked up when + armed, they must be disarmed by clicking on them. They also cannot be moved + then they are deployed. + Zuhayr: + - rscadd: Massive material refactor. Walls, beds, chairs, stools, tables, ashtrays, + knives, baseball bats, axes, simple doors, barricades, so on. + - rscadd: Tables are now built via steel then another sheet on the resulting frame. + They can then be reinforced by dragging a stack of sheets onto the table. + - rscadd: Walls are built with steel for girders, then right-click the girder and + select the reinforce verb while holding a stack, then click the girders with + a final sheet. + - rscadd: Various things can be built with various sheet types. Experiment! Just + keep in mind that uranium is now radioactive and phoron is now flammable. +2015-05-26: + Atlantis: + - rscadd: NanoUI for Robotics Control Console + - rscadd: NanoUI for Supermatter Crystal - AI/Robot only, purely informational + Chinsky: + - rscadd: Meat limbs now can be attached. Use limb on missing area, then hemostat + to finalize it. + - rscadd: Limbs from other races can be now attached. They'll cause rejection, but + it can be kept at bay with spaceacilline to some point. Species special attack + is carried over too, i.e. you can clawn people if you sew a cathand to yourself. + - rscadd: Limbs that are left in open will rot in ~7 minutes. Use freezers or cryobags + to stop it. You can still attach them, but you wish you couldn't. + PsiOmegaDelta: + - tweak: Both the pulse taker and target must now remain still for the duration + of the check or it will fail. + RavingManiac: + - rscadd: Tape recorders now record hearable emotes and action messages (e.g. gunshots). + - bugfix: You can now see actions from inside mechs and closets. + Techhead: + - rscadd: Removed gaseous reagents from the chemistry system and replaced with real-world + organic chemistry precursors. + - rscadd: Hydrogen has been replaced with hydrazine, a highly toxic, flammable liquid. + - rscadd: Oxygen has been replaced with acetone, a mildly toxic liquid. Ethanol's + ink-sovlent capabilities have been copied to it. + - rscadd: Chlorine has been replaced with hydrochloric acid. It is a stronger acid + than sulphuric but less toxic. + - tweak: Nitrogen has been replaced with ammonia. Ammonia now acts as a Dexalin-equivalent + for Vox. + - tweak: Flourine has also been replaced with hydrazine in its one recipe. Flourosurficant + has been renamed azosurficant. + - tweak: Being splashed with liquid Phoron will burn eyes and contaminate clothes + like being exposed to Phoron gas. + Zuhayr: + - rscadd: Added a ghost requisition system for posibrains and living plants. + - rscadd: Added attack_ghost() to hydro trays and posibrains to allow ghosts to + enter them. + - rscadd: Prosthetic limbs are now only repairable with welders/cable coils if they + have suffered below 30 combined damage. + - rscadd: 'Surgery steps that cause no pain and have no failure wounding have been + added: screwdriver for ''incision'', crowbar to open, multitool to ''decouple'' + a prosthetic organ. Hemostat is still used to take an organ out.' + - rscadd: Using a welder or a cable coil as a surgical tool after opening a maintenance + hatch will repair damage beyond the 30 damage cap. In other words, severe damage + to robolimbs requires expert repair from someone else. + - rscdel: Eye and brain surgery were removed; they predate the current organ system + and are redundant. + - rscadd: IPC are now simply full prosthetic bodies using a specific manufacturer + (Morpheus Cyberkinetics). + - rscadd: IPC can 'recharge' in a cyborg station to regain nutriment. They no longer + interface with APCs. + - rscadd: NO_BLOOD flag now bypasses ingested and blood reagent processing. + - rscadd: NO_SCAN now bypasses mutagen reagent effects. + - rscadd: Cyborg analyzers now show damage to prosthetic limbs and organs on humans. + - tweak: Prosthetic EMP damage was reduced. + - tweak: Several organ files were split up/moved around. +2015-05-27: + PsiOmegaDelta: + - tweak: The inactive check process now respects client holder status and can be + configured how long clients may remain inactive before being kicked. + Zuhayr: + - rscadd: Unfolded pAIs can now be scooped up and worn as hats. + - tweak: Scoop-up behavior is now standardized to selecting help intent and dragging + their icon onto yours. +2015-05-30: + Atlantis: + - rscadd: Malfunction Overhaul - Whole gamemode was completely reworked from scratch. + Most old abilities have been removed and quite a lot of new abilities was added. + AI also has to hack APCs to unlock higher tier abilities faster, instead of + having access to them from the round start. Most forced things, such as, shuttle + recalling were removed and are instead controlled by the AI. Code is fully modular + allowing for future modifications. + HarpyEagle: + - bugfix: Fixes Engineer ERT gloves not being insulated. + - tweak: IV stands are no longer bullet shields. They also allow mice, drones, pAIs + et al to pass though. + Kelenius: + - tweak: AI now hears LOOC both around its eye and its core, and speaks in LOOC + around its eye. Keep in mind that you won't hear and won't be heard if there + is a wall between your eye and the target. + PsiOmegaDelta: + - rscadd: You can now review the server revision date and hash by using the 'Show + Server Revision' verb in the OOC category. +2015-06-02: + Techhead: + - rscadd: Re-adds extended capacity emergency oxygen tanks to relevant jobs. +2015-06-04: + PsiOmegaDelta: + - rscadd: AI eyes can now be found in the observer follow list. + - rscadd: Synths can now review all law modules that can be found on the station + from their law manager. + - rscadd: Synths can state these laws if desired, however this is strongly discouraged + unless subverted/malfunctioning. + - bugfix: Astral projecting mobs, such as wizards or cultists, may no longer respawn + as something else while their body lives. + Techhead: + - rscadd: Prison break event has been expanded to include Virology or Xenobiology + - rscadd: Prison break event will warn Enginering and the AI beforehand so they + can take preventive measures. + - bugfix: Disabling area power will now prevent doors from opening during the event +2015-06-05: + PsiOmegaDelta: + - bugfix: Split stacks no longer lose their coloring. + - tweak: Can no longer merge cables of different colors. + - tweak: Blobs and simple mobs now attack all external organs instead of a subset. + The overall damage remains the same but the number of fractures caused will, + in general, be fewer. + - rscadd: Spider nurses now have a chance of injecting their victims with spider + eggs which eventually hatch. If the limb is removed from the host, the host + dies, or the spiderling has matured sufficiently it will crawl out into freedom. + Medical scanners will pick upp eggs and spiderlings as foreign bodies. + Yoshax: + - tweak: Makes hyposprays start empty instead of filled with Tricord. + - tweak: Makes the special wizard projectile staffs, Animate, Change, Focus and + any future ones only usable by wizards. Also makes it so only wizards can use + spellbooks and teleportation scrolls. +2015-06-08: + PsiOmegaDelta: + - rscadd: The AI chassis now glows, with the color depending on the currently selected + display. +2015-06-09: + PsiOmegaDelta: + - rscadd: Ports /tg/'s meteor event. Meteors now appear to be more accurate, come + in a greater variety, and may drop ores on their final destruction. +2015-06-16: + Chinsky: + - rscadd: 'Updated penlights to be more of use in diagnostics, they now show following + conditions:' + - rscadd: Eye damage + - rscadd: Blurry eyes (overall slower reaction) + - rscadd: Brain damage (one eye reacts slower) + - rscadd: Opiates use (pinpoint pupils) + - rscadd: Drugs use (dilated pupils) + PsiOmegaDelta: + - rscadd: Observers can now follow both the AI and its eye upon speech. + - rscadd: Observers can now follow both observers and their body, if they ever had + one, upon speech. + - rscadd: Observers can now follow hivemind speakers if the speaker is not using + an alias or antagHUD is enabled. + - rscadd: Turret controls now glow, with the color depending on the current mode. + Techhead: + - rscadd: Converted Request Console interface into NanoUI. +2015-06-19: + HarpyEagle: + - bugfix: Prevents being on fire from merely warming mobs up slightly in some cases. + Mob fires also burn hotter. + - rscadd: Matches can now be used to light things adjacent to you when thrown. + - tweak: Made the effects of having a damaged robotic leg more prominent. + - bugfix: Robot limbs no longer cause pain messages. A reminder that you can still + check their status with 'Help Intent' -> 'Click Self'. + - tweak: Knifing damage scales with weapon force and throat protection. Helmets + only provide throat protection if they are air tight. Trying to cut someone's + throat with wirecutters and/or while wearing an armoured sealed helmet will + require several attempts before the victim passes out. + - tweak: Knifing switches on harm intent, in case you just wanted to beat on the + victim for some reason. + - bugfix: Prevents knifing bots or silicons. +2015-06-22: + PsiOmegaDelta: + - tweak: The traitor uplink no longer displays all items in a long list, instead + has categories which when accessed shows the relevant items. +2015-06-24: + HarpyEagle: + - bugfix: Fixed Tajaran name generation producing names without a space between + first and last. + - wip: Adds docking to the mercenary shuttle. Works similarly to other shuttles, + except docking and undocking is manually initiated and not automatic. A system + to approve or deny dock requests still to be implemented. + - rscadd: Toolboxes can now hold larger items, such as stacks of metal or power + cells, at the cost of having less space for other things. + - tweak: Gloves/shoes can now be worn even if you have one hand/foot missing. The + other one still has to be present, of course. The items still drop when you + first lose the hand/foot. + - tweak: Budget insulated gloves are somewhat less useless. On average, they will + stop half the damage from getting shocked, and the worst case insulation is + not as bad as it used to be. Budget gloves that are as good as regular insulated + gloves are still as rare as they were before though. + - tweak: PTR bullets are now hitscan, to make them somewhat better for actual sniping. + - maptweak: The telecoms server room now has an actual cycling airlock into it. + - tweak: Non-vital body parts will no longer take further damage above a certain + amount, and will inflict paincrit effects instead. On most humaniods the head, + chest, and groin are vital. + - rscadd: 'Engineers now spawn with industrial workboots (credit: ChessPiece/Bishop).' + - bugfix: Damaged robotic legs now more likely to have an effect. + - bugfix: Fixed bug preventing internal organs from taking damage in some cases. + - maptweak: New flavours of tables around the station. Engineering starts with more + plastic. + - bugfix: Fixed worn items not appearing in some cases. Most notably crossbows and + certain guns when worn on the back. As a side effect, laundry machines no longer + transform items. + - bugfix: Crit oxyloss now runs in game time instead of real time. So if lag is + slowing your movement the same slowdown applies to the dying person you're trying + to reach. + - rscadd: Breathmasks can now be adjusted by clicking on them in your hand, in addition + to the verb. + - rscadd: Wearing a space helmet or similar face-covering gear now prevents eating + and force-feeding food, drink, and pills. + - rscadd: Phoron in air ignites above it's flashpoint temperature and a certain + (very small) minimum concentration. Environments that have oxygen and are hot + enough, and have phoron but not enough concentration to burn will produce flareouts, + which are mostly a visual effect. + - rscadd: Adds animation when making unarmed attacks or attacking with melee weapons, + to help make it clearer who is attacking. + - soundadd: Opening an unpowered door now has an appropriate sound. + - rscadd: Ingesting diseased blood may contract the disease. +2015-06-26: {} +2015-06-30: + PsiOmegaDelta: + - maptweak: Non-general areas on Crescent are now protected by blast doors to enforce + area restrictions. Admins can operate these from the central checkpoint. +2015-07-04: + PsiOmegaDelta: + - tweak: Portable turrets now only blocks movement while deployed. + - tweak: Portable turrets are no longer invincible while undeployed, however they + have increased damage resistance in this state. + - bugfix: Crescent portable turrets should no longer act up during attempts to (un)wrench + and alter their settings. +2015-07-06: + GinjaNinja32: + - rscadd: '''Provisional'' is now also a valid temporary position prefix for manifest + sorting.' +2015-07-10: + Zuhayr: + - rscadd: Ninja now spawns on a little pod on Z2 and can teleport to the main level. +2015-07-11: + HarpyEagle: + - imageadd: Added inhand sprites for flashes, flashbangs, emp and other grenades. + Loganbacca: + - bugfix: Turrets no longer burn holes through the AI. + - tweak: Projectiles now have a chance of hitting mobs riding cargo trains. + - bugfix: Fixed visual bugs with projectile effects. +2015-07-14: + HarpyEagle: + - bugfix: Fixes wrong information being reported when analyzing locked abandoned + crates with a multitool. + PsiOmegaDelta: + - tweak: Ninjas can no longer teleport unto turfs that contain solid objects. + - tweak: Wizards can no longer etheral jaunt unto turfs that contain solid objects. +2015-07-27: + Kelenius: + - tweak: Borg shaker now works similarly to hypospray. It generates reagents that + can be poured into glasses. + - bugfix: Therefore, they can no longer duplicate rare reagents such as phoron. +2015-07-29: + Karolis2011: + - rscadd: Made tagger and sorting pipes dispensible. + - bugfix: Unwelding and welding sorting/tagger pipes, no longer delete data about + them. +2015-07-31: + HarpyEagle: + - bugfix: Fixed projectiles being able to hit people in body parts that they don't + have. This will also mean that the less limbs someone has the less effective + they will be as a body shield. +2015-08-11: + PsiOmegaDelta: + - experiment: 0.1.19 is live. + - tweak: Crew monitors now update every 5th second instead of every other. Reduces + lag and gives antags a larger window of opportunity to disable suit sensors + if they have to harm someone. +2015-08-13: + GinjaNinja32: + - rscadd: Changed language selection to allow multiple language selections, changed + humans/unathi/tajarans/skrell to not automatically gain their racial language, + instead adding it to the selectable languages for that species. Old slots will + warn when loaded that the languages may not be what you expect. + Orelbon: + - rscadd: Changed the HoP's suit to more bibrant colors and hopefully you will like + it. +2015-08-14: + HarpyEagle: + - spellcheck: Renames many guns to follow a consistent naming style. Updated and + changed gun description text to be more lore-friendly. + - rscadd: Throwing a booze bottle at something nearby while on harm intent causes + it to smash, splashing it's contents over whatever it hits. + - rscadd: Rags can now be wrung out over a container or the floor, emptying it's + contents into the container or splashing them on the floor. + - rscadd: Rags can now be soaked using the large water and fuel tanks instead of + just beakers. + - rscadd: Rags soaked in welding fuel can be lit on fire. + - rscadd: Rags can now be stuffed into booze bottles. When the bottle smashes, the + stuffed rag is dropped onto the ground. + - bugfix: Fixed eggs having a ridiculously large chemical volume. + - rscadd: T-Ray scanner effects are now only visible to the person holding the scanner. + - rscadd: Traitors can now purchase the C-20r and the STS-35 for telecrystals. + PsiOmegaDelta: + - tweak: The amount you start with in your station account is now affected by species, + rank, and NT's stance towards you. + TheWelp: + - rscadd: Bookcases are now movable/buildable/destroyable. + - rscadd: Paper can now be crumpled by using in-hand while on hurt intent. + - rscadd: Library Computer External Archive is now sortable. + Zuhayr: + - rscadd: Click a hat on a drone with help intent to equip it. Drag the drone onto + yourself with grab intent to remove it. +2015-08-15: + Kelenius: + - rscadd: Bees have been updated and are totally worth checking out (beekeeping + crate at cargo). + - rscdel: Sleeper consoles removed. All interaction is now done by clicking on the + sleeper itself. + - tweak: To put people into sleeper, you now have to click-drag people to it. Grabs + no longer work. To exit the sleeper, move. + - tweak: Sleeper now uses a NanoUI. +2015-08-16: + HarpyEagle: + - tweak: The unathi breacher is now only wearable by unathi. +2015-08-17: + PsiOmegaDelta: + - rscadd: Station time and duration now available in the Status tab. +2015-08-24: + HarpyEagle: + - tweak: Girders are now reinforced by using a screwdriver on the girder before + applying the material sheets. Use a screwdriver again instead to cancel reinforcing. + - bugfix: Mechanical traps no longer spawn in the janitor's locker. + - rscadd: Mechanical traps can now be printed with a hacked autolathe. + - rscadd: Adds armour penetration mechanic for projectiles and melee weapons. + - rscadd: Laser carbines, LWAP, and shotgun now have a small amount of armour penetration, + ballistic rifles (not SMGs) have moderate amounts, laser cannon has high armour + penetration, and the PTR mostly ignores body armour. + - tweak: 'Shotgun slugs and Z8/STS damage has been lowered slightly to accomodate + for their higher penetration. In general ballistics deal less damage but have + higher penetration than comparable laser weapons. Notable exception: X-Ray lasers + have had their damage lowered slightly but gain very high armour penetration.' + - rscadd: Energy swords now have very high armour penetration. Ninja blades do less + damage but ignore armour completely. + Kelenius: + - experiment: Click cooldowns have been removed on pretty much everything that isn't + an attack. + PsiOmegaDelta: + - rscadd: Adds the option to set the icon size to 48x48, found under the Icons menu, + along with 32x32, 64x64, and stretch to fit. + - tweak: Active AI cores now provides coverage on the AI camera network. Does not + utilize actual cameras, thus will not show up on security consoles. + - rscadd: The Dinnerware vending machine now offer both utensil knives and spoons + without first having to hack them. + - rscadd: Synths now have id cards with access levels which is checked when operating + most station equipment. + - rscadd: Station synthetics still have full station access but can no longer interact + with syndicate equipment, and syndicate borgs now start with only syndicate + access. + - rscadd: Syndicate borgs can copy the access from other cards by utilizing their + own id card module, similar to how syndicate ids work. + - rscadd: When examined up close id cards now offer a more detailed view. + - rscadd: Agent ids now offer much greater customization, allowing changing name, + age, DNA, toggling of AI tracking termination (using the electronic warfware + option), and more. + - rscadd: As AI tracking can now be enabled/disabled at will AI players should not + feel the need to hesitate before informing relevant crew members when camera + tracking is explicitly terminated. + - rscadd: Uplink menu now more organized and with new categories. + - rscadd: Now possible to cause falsified ion storm announcements. + - rscadd: Now possible to cause falsified radiation storm announcements, with expected + maintenance access changes. + - rscadd: Now possible for mercenaries to create falsified Central Command Update + messages. + - rscadd: Now possible for mercenaries to create falsified crew arrival messages + and records. + RavingManiac: + - tweak: Sound environments tweaked to feel more claustrophobic + - rscadd: Being drugged, hallucinating, dizzy, or in low-pressure or vacuum will + alter sounds you hear + - rscadd: Sound environment in holodeck will change to reflect the loaded program + Vivalas: + - rscadd: A new uplink item has been added! A briefcase full 'o thalla can now be + bought by traitors for bribes and such! + Zuhayr: + - rscadd: Pariahs are now a subspecies of Vox with less atmos/cold protection, a + useless brain, and lower health. + - rscadd: Leap now only gives a passive grab and has a shorter range. It also stuns + Pariahs longer than it does their target. + - tweak: Rewrote tiling. White floors, dark floors and freezer floors now have associated + tiles. + - tweak: Changed how decals work in the mapper. floor_decal is now used instead + of an icon in floors.dmi. + - tweak: The floor painter has been rewritten to use decals. Click it in-hand to + set direction and decal. + - tweak: Floor lights are now built from the autholathe, secured with a screwdriver, + activated by clicking them with an empty hand, and repaired with a welding torch. + - rscadd: Unathi now have minor slowdown and 20% brute resist. + - rscadd: Tajarans now have lower bonus speed and a flat 15% malus to brute and + burn. + - rscadd: Vox can now eat monkeys and small animals. + - rscadd: Tajarans can now eat small animals. + - rscadd: Unarmed attack damage has been lowered across the board. +2015-09-02: + Atlantis: + - rscadd: Converted phoron glass to borosilicate glass, adjusted heat resistances + accordingly, got rid of copypaste fire code. Fire resistance is now handled + by variables so completely fireproof windows are possible with varedit. + - rscadd: Windows take fire damage when heat exceeds 100C regular windows, 750C + reinforced regular, 2000C borosilicate and 4000C reinforced borosilicate. For + comparsions, reinforced walls begin taking damage around 6000. + Hubblenaut: + - rscadd: Adds glass bottles for Cola, Space Up and Space Mountain Wind to Booze-O-Mat. + - tweak: Some bar drink recipes have been amended to easily sum to 30 units for + drinking glasses. + - tweak: Vendors now have a product receptor for accepting goods. Opening the maintenance + painel is no longer required. + - tweak: Wrenching a vending machine is no longer a silent action. + - tweak: 'Stepup: Item placement on 4x4 grids seemed to work great. Now we''ll try + 8x8.' + Kelenius: + - tweak: Mechfab can now be upgraded using RPED, and now uses NanoUI. + Matthew951: + - rscadd: Added Vincent Volaju's hair. + - rscadd: Added Vincent Volaju's beard. + Zuhayr: + - rscadd: Added the ability for AIs in hardsuits to control suit modules and movement + with a dead or unconcious wearer. + - rscadd: Added ballistic supply drop pods. + - rscadd: Added diona gestalt random map template. + - tweak: Swapped the singularity beacon out for a hacked supply beacon. +2015-09-05: + Chinsky: + - rscadd: Made capguns into proper guns code-wise. It means you can now take people + hostage with them, stick in your mouth, and all other things you can do with + real guns but probably shouldn't. + - rscadd: Russian roulette! Fun for whole sec team! Unload some shells from revolver, + spin the cylinder(verb) and you're good to go! + HarpyEagle: + - rscadd: Shields no longer block attacks from directly behind the player. + - rscadd: Riot shields no longer stop bullets or beams (except for beanbags and + rubber bullets), however they are now more effective at blocking melee attacks + and thrown objects. + - rscadd: Energy shields block melee attacks as effectively as riot shields do. + Their ability to block projectiles is largely unchanged. + - tweak: Melee weapons now only block melee attacks. + - experiment: Two handed weapons have a small chance of blocking melee attacks when + wielded in two hands. + - rscadd: Sound and visual effects when blocking attacks with an energy shield or + energy sword. + - bugfix: Fixed dead or unconscious people blocking stuff with shields. + PsiOmegaDelta: + - tweak: Cargo now sorts under its own department on station manifests. + - rscdel: Manual radio frequency changes can no longer go outside the standard frequency + span. + - rscadd: Users with sufficient access can instead select pre-defined channels outside + this span, such as department channels, when using intercoms. +2015-09-07: + GinjaNinja32: + - rscadd: Added an auto-hiss system for those who would prefer the game do their + sss or rrr for them. Activate via Toggle Auto-Hiss in the OOC tab. + - rscadd: Auto-hiss system in 'basic' mode will extend 's' for Unathi and 'r' for + Tajara. 'Full' mode adds 'x' to 'ks' for Unathi, and is identical to 'basic' + mode for Tajara. + PsiOmegaDelta: + - tweak: 'Changed the language prefix keys to the following: , # -' + - rscadd: Language prefix keys can be changed in the Character Setup. Changes are + currently not global, but per character. +2015-09-08: + Soadreqm: + - tweak: Increased changeling starting genetic points to 25. + Zuhayr: + - bugfix: Auto-traitor should now be fixed. + - bugfix: The Secret game mode should now be fixed. +2015-09-11: + HarpyEagle: + - tweak: Made flares brighter. + - rscadd: Coffee is now poisonous to tajaran, much like how animal protein is poisonous + to skrell. +2015-09-26: + PsiOmegaDelta: + - tweak: Meteor events now select a map edge to arrive from, with a probability + for each individual wave to come from either neighboring edge. Meteors will + never arrive from opposite the starting edge. +2015-10-27: + HarpyEagle: + - bugfix: When affected by pepperspray, eye protection now prevents blindness and + face protection now prevents stun, instead of face protection doing both. +2015-11-22: + neersighted: + - bugfix: Laptop Vendors now accept ID Containers (PDA, Wallet, etc). + - bugfix: Personal Lockers now accept ID Containers (PDA, Wallet, etc). +2015-12-06: + Datraen: + - tweak: Changes standard and specific plant traits, more diverse plants. + HarpyEagle: + - tweak: Fabricated power cells start uncharged. + Hubblenaut: + - bugfix: Welding a broken camera will use the correct icon. + - tweak: Camera assemblies remember their tag and network from previous usage. + - rscadd: Light replacers can be refilled by clicking on a storage item. + - tweak: Light replacers now hold up to 32 light bulbs. + - tweak: Light replacers can be obtained through janitorial supply crates. + - tweak: A sheet of glass fills the light replacer by 16 bulbs. + - bugfix: Material stacks now properly merge upon creation. + - bugfix: Messages for adding to existing stack appear again. + - tweak: Mobs on help intent will not push others that aren't. + - rscadd: Adds tape for atmospherics. + - tweak: Tape graphics and algorithm changes. Looks a lot more appealing now. + - tweak: Starting and ending tape on the same turf will connect it to all surrounding + walls/windows. + - tweak: Lifting a part of the tape will lift an entire tape section. + - tweak: Mobs on help intent do stop for tape. + - bugfix: Crumpled tape does not affect tape breaking behavior anymore. + - bugfix: Fixes vending machines not adding stored goods when maintenance panel + is closed. + - tweak: Doors do only buzz once on failed closing attempt. + MagmaRam: + - bugfix: Fixed cloners killing fresh clones instantly with brain damage. + - bugfix: Fixed a bug where disposals pipes would show up above floors despite being + installed under them. + Neerti: + - rscadd: Adds NanoUI for communicators, the ability for communicators to call other + communicators on the station, the ability for station-bound people to call ghosts, + and for ghosts to toggle their visibility to communicators on or off in character + preferences (defaults to off). Communicators can now also support more than + one call at the same time, for both ghosts and normal communicators. + - rscadd: Adds new machine to telecomms, the Exonet node. It is very basic in terms + of functionality, but certain services can be selectively disabled from it, + such as newscaster updates, communicators, or external PDA messages. Adds methods + for building and deconstructing Exonet nodes. + - experiment: Adds framework for a fake-networking system called EPv2 that communicators + will now use, and perhaps other machines will in the future, for good or for + evil. + - rscdel: Changeling Spacearmor reduced in protective ability. + - rscdel: Cryogenic String and Delayed Toxic Sting now have a three minute cooldown + upon stinging someone. + - rscdel: Cryotoxin, the chemical used in Cryogenic String, is 25% less potent now. + - rscdel: The rune to summon Narsie has been changed. Narsie is no longer summoned, + but Hell still comes. + - rscdel: Spooky mobs spawned from spooky portals as a result of Hell coming have + had their speed, health, and damage reduced. + - rscdel: Manifested humans no longer count for summoning Hell. + - experiment: Changes how armor calculations work. All the armor values remain + the same, but the 'two dice rolls' system has been replaced with a mix of reliable + damage reduction and a bit of RNG to keep things interesting. The intention + is to make weaker armor more relevent and stronger armor less overpowered. + - tweak: When you are hit, it uses the armor protection as a base amount to protect + you from, then it does a roll between +25% and -25% of that base protection, + and adds it to the base protection. The result of that is how much damage is + reduced from the attack. For example, if you are hit by an energy sword in + the chest while wearing armor that has 50 melee protection, the base protection + is 50, then RNG can make the final protection be between 37.5 and 62.5 percent. + The damage you'd take could range from 11.25 to 18.75, instead of 0, 15, or + 30. Remember that some weapons can penetrate armor. + - rscadd: Added personal communicators, a device that enables someone to talk to + someone else at vast distances. You can talk to people who are far from the + station, so long as telecommunications remains operational. + - rscadd: To use, become a ghost, then use the appropiate verb and pick a communicator + to call. Then you wait until someone picks up. Once that occurs, you will + be placed inside the communicator. The voice you use is your currently loaded + character. Languages are supported as well. + - tweak: Round-end is now three minutes instead of one, and counts down, to allow + for some more post-round roleplay. If the station blows up for whatever reason, + the old one minute restart is retained. + PsiOmegaDelta: + - rscdel: Manual radio frequency changes can no longer go outside the standard frequency + span. + - rscadd: Users with sufficient access can instead select pre-defined channels outside + this span, such as department channels, when using intercoms. + Zuhayr: + - tweak: Aiming has been rewritten, keep an eye out for weird behavior. + - rscdel: Removed the detective scanner and associated machinery. + - rscadd: Added a microscope, machine forensic scanner, etc. from Aurora forensics. +2015-12-16: + HarpyEagle: + - bugfix: Fixed a couple of bugs causing phoron gas fires to burn cooler and slower + than they were supposed to. + - bugfix: Merc bombs are now appropriately explosive again. Same goes for bombs + made by toxins. + Hubblenaut: + - bugfix: Airlock backup power test light properly offline when backup power down. + - bugfix: Empty flavor texts no longer draw an empty line on examination. + - bugfix: Material stacks now properly merge upon creation. + - bugfix: Messages for adding to existing stack appear again. + TheWelp: + - rscdel: Removed higher Secret player requirements. +2016-02-11: + Datraen: + - rscadd: Moderators can now see and use AOOC. + - bugfix: Other synthetics given EAL. + - bugfix: Trays now drop items when placed on table, dropped. + - bugfix: Objects can now be yanked out of synthetics. + - tweak: Respawn time moved down from 30 minutes to 15 minutes. + - rscadd: Telecrystal item added for trading telecrystals between traitors and mercenaries. + - rscadd: Telecrystal item now has tech values. + EmperorJon: + - tweak: Traitor synths can no longer be locked down from the robotics console. + Attempting to lock them down (or release the lockdown) notifies the synth of + the attempt and updates the console's UI as normal. + Neerti: + - rscadd: Suit cooling units can now be attached to voidsuits. Note that coolers + and air tanks are mutually exclusive. + - bugfix: EMP no longer hits twice on humans. + - tweak: EMP drains powercells using the cell's current charge, and not the cell's + maximum potential charge, to ensure two blasts do not completely disable a synthetic. + - tweak: EMP hitting a prosthetic limb or organ will now do less damage. + - tweak: EMP hitting a cyborg will no longer outright stun them. Instead, they + gain the 'confused' status for a few moments, making movement difficult. In + addition, their HUD gets staticy, and their modules are forced to be retracted. + - rscadd: Stasis bags will protect the occupant from the outside enviroment's atmosphere. + - rscadd: Stasis bags can be hit with a health analyzer to analyze the occupant. + Zuhayr: + - rscadd: Drones can now pull a variety of things (such as scrubbers). This came + with a pulling refactor so please report any strangeness with pulling in general. + - rscadd: Drones (and any mob that can be picked up) can be bashed against airlocks + and such to use their internal access, so long as the person using them does + not have an ID card equipped. + - rscadd: Added foam weapons to cargo for LARP shenanigans. + - rscadd: Added the ability to equip grenades to the mask slot, and to prime them + by clicking someone with harm intent targeting the mouth. + - rscadd: Removed the species restrictions on transplanted internal organs. Have + fun. + - rscadd: Added 'full body' prosthetic options to character generation. + - rscadd: Removed IPC. No tears were shed. + - rscadd: 'RE: borgs, Renamed ''robot'' type to ''drone'' and ''android'' type to + ''robot'' for clarity with new ''android'' human mobs.' + - rscadd: Rejuvenate will now reapply robolimb/autopsy data. + - rscadd: Lots of backend work relating to the above. If you're a coder go look + at the PR or ask Zuhayr for details. + - rscdel: Removed brute and burn resist from robolimbs, removed sever vulnerability + from robolimbs. + - rscadd: Added a config option for visible human death messages. + - rscadd: pAIs and small mobs can now bump open doors. + - rscadd: Added functionality for two-handed guns; these guns will give an accuracy + penalty if fired without an empty offhand. + - rscadd: Unified two-handed melee weapons with the above; while the offhand is + empty, the weapon will count as wielded. +2016-03-11: + Datraen: + - rscadd: Adds ckeys, player panel to the antagonists panel. + - tweak: Fragmentation grenades are no longer launchable. + - tweak: Adds amount of telecrystals to the set telecrystal verb. + - rscadd: Added a verb to just add to telecrystals. + Kelenius: + - rscadd: Drying rack now has a new sprite. + - rscadd: Beekeeping materials and a honey extractor have been added to hydroponics. + - tweak: There is now a ten-second delay for carding the AI. + Zuhayr: + - rscadd: Small species now take smaller bites/gulps from food and drink. + - rscadd: Small species are now effected by alchol and toxins twice as much. + - rscadd: blood_volume is now a species-level var and Teshari have lowered blood + volume. + - rscadd: Hunger is a species var and Teshari get hungry faster. + - rscadd: Small mobs have a reduced climb delay. + - rscadd: Teshari gain more nutrition from meat. +2016-03-16: + Datraen: + - bugfix: Harmbaton no longer causes halloss while inactive. + Kelenius: + - bugfix: Potassium and nitroglycerin explosive grenades now work. +2016-03-29: + Datraen: + - rscadd: 'Added Three New Mixed Gamemodes: Lizard, Changeling + Wizard; Intrigue, + Traitors + Ninja; Visitors, Ninja + Wizard.' + - tweak: Created a variable for latespawning antagonist templates, for customization + of autospawning antagonists in mixed game modes. + - bugfix: Fixes the buckled check limiting whether or not someone can interact while + sitting. + - bugfix: Resisting while buckled and cuffed will process the hand and leg cuffs + before unbuckling. + - tweak: Removed JSON encoding of the PDA Manifest list. + - bugfix: Microwaves no longer try cooking their components while cooking. + - bugfix: Adds a check to prison breaks that makes sure the APC is on before continuing. + - bugfix: Artifacts will no longer spawn on floor turfs. + - bugfix: Stops traitorborgs from being able to hack other borgs. + - bugfix: Stops traitorAIs from being able to hack unlinked borgs. + Yoshax: + - tweak: Player preferences has been overhauled. Please update your preferences, + found at "Character Setup" > "Global" > "Preferences", as they have been reset. +2016-04-04: + Kelenius: + - bugfix: Monkeys can ventcrawl once again. + Yoshax: + - rscadd: Tasks that take time to perform now have a progress bar. + - rscadd: Visibility of progress bars can be toggled in preferences. Default is + on. +2016-04-07: + Datraen: + - bugfix: If a slice of an item is spawned independently, it will get generic settings. + Kelenius: + - tweak: Changelings will now change appearance and species together when transforming. + - tweak: Changelings no longer have gender honorifics in lingchat. + - rscadd: Absorbing the DNA from any source will allow you to use its name, species, + and languages. + - bugfix: DNA extract sting won't produce a strange message if there's no target. + - tweak: Cultists no longer need to research words. +2016-04-17: + Datraen: + - rscadd: Manually ports /tg/station's dark click code https://github.com/tgstation/-tg-station/pull/10272 + by Razharas. + - bugfix: Teshari smocks now spawn as smocks, and not aqua jumpsuits. + - bugfix: Checks to see if new a two-handed weapon can be wielded when dropped. + EmperorJon: + - bugfix: Robotics Console now correctly shows the operational/lockdown state and + button based off if it thinks the synthetic is locked down or not. + - bugfix: Autotraitor synths now behave the same as Traitor synths - they are not + locked down. + Kelenius: + - rscadd: Solars now start wired. + Neerti: + - rscadd: Ports Bay's volume-based inventory system. It works off by weight classes + instead of just slots, allowing you to hold more light items than you could + previously. + - rscadd: Bulky items can now go in your backpack, however it will require twice + the space of a normal sized item. + - rscdel: Spacesuits, RIGs, and sniper rifles made heavier. +2016-05-05: + Datraen: + - rscadd: Added three mixed modes, 'Mercenaries & Wizard', 'Mercenaries & Renegades', + and 'Traitors & Renegades'. + Hubblenaut: + - tweak: Hydroponics vendor and biogenerator offer full bottles of fertilizer. Prices + and amount available adjusted to accomodate. + Kelenius: + - tweak: Move delay after clicking has been removed. + PsiOmegaDelta: + - rscadd: Can now prefill the loadout flask and vacuum-flask with a relevant liquid + of your choice. + Yoshax: + - tweak: 'Splits gender into biological gender and gender identity. Biological gender + modifies the sprite (for between male and female) and gender identity determines + what pronouns show up when examined or suchlike. Both are displayed in medical + records and such. ' + - tweak: Smoke grenades can now have their smoke color set by using a multitool + on them. +2016-05-12: + Yoshax: + - tweak: Doubles the maximum length of records and names to 6144 & 52, respectively. + Also increases book length to 12288. (All numbers are in characters.) + - bugfix: Makes various services in the antag uplink purchasable once again. This + includes the fake crew arrival. + - bugifx: Neckgrabs will no longer force people to the ground. In addition, weakened + people can no longer resist. + - rscadd: All vending machines now have a small chance of vending an additional + item. + - tweak: Smoke from smoke bombs now lasts approximately 3 times as long and spawns + some more smoke to make a heavier cloud. + - bugfix: Smoke from smoke bombs now properly does a small amount of oxygen loss + damage. This damage is per cloud of smoke. +2016-05-13: + HarpyEagle: + - tweak: Shotgun flare illumination now lasts longer, around 3-4 minutes. + - bugfix: Fixed attack animation playing when using flashes even if the flash was + not actually used due to being broken or recharging. + - bugfix: Fixed lightswitches layering over darkness. Now only the light layers + above shadow. Lightswitch illumination is now much more subtle. + Yoshax: + - bugfix: Processing strata floor can now be pried up with a crowbar. + - bugfix: Blue carpet can now also be removed with a crowbar, and has had it's ability + to burn and have corners restored. + - rscadd: Changelings will now store and apply the flavor text of their victims + when they absorb and transform into them. + - rscadd: Gives Diona a starting funds wage the same as Tajaran and Unathi. + - bugfix: Brain damage no longer prevent implant removal surgery. +2016-05-16: + Yoshax: + - rscadd: Uplinks now have a discounted item every 15 minutes. This is per uplink, + and random, the discount is also random, but weighted as such that a low discount + such as 10% off, or 20% off has a higher chance of happening than a high discount + such as 90% of. An item will never cost less than 1. + - tweak: Mercenaries now spawn with their own, personal uplinks. + - bugfix: Faked announcements are now once again purchasable from the uplink, and + actually work. + - rscadd: Adds several new items to the uplink including tactical knives, metal + foam grenades, ambrosia seeds and much more. +2016-05-17: + SilveryFerret: + - rscadd: Changes the Death Alarms from announcing over Common channel, to announcing + only over Medical and Security channels. + Yoshax: + - rscadd: Added shotglasses. These can contain 10 units. They have their whole contents + swalloed in one gulp. They can be produced in the autolathe or found in the + booze vending machine in the bar. +2016-05-25: + Serithi: + - rscadd: Adds in lavender. + Yoshax: + - tweak: Cables of any color can now be merged. + - tweak: More and different colors are now available to be used by cable. + - tweak: Adjusting your suit sensors now displays a message to other people in range + that you did so. In addition, seeing someone else adjust someone's suit sensors + no longer informs you to what level. + - rscadd: Added towels to the loadout. These can be worn on the head, belt or outwear + slots. You can also whip people with them for a special message and sound! In + addition, using them in-hand will produce an emote where your towel yourself + off. +2016-05-27: + Yoshax: + - rscadd: Added a new preference that allows you to disable fake nanoui styling + on relevant windows. However, if it is your first time loading with this new + preference you will need to save your character slot, as there is a problem + with satanisiation and it believes the preference is set to disable the nanoui + styling. +2016-05-29: + Datraen: + - rscdel: Injecting people with mutationtoxin no longer mutates them into slime + people. + - rscdel: Removes amutationtoxin. + - rscdel: Removes slime core recipies. + - rscadd: Adds slime monkey cubes, which are created by injecting monkey cubes with + mutationtoxin and activating like a posibrain. + - wip: Maps for Xenobio2 research labs/stations. + Zuhayr: + - tweak: 'Backend change: allowed accessories to be placed on any clothing item + with the appropriate variables set.' +2016-05-30: + EmperorJon: + - rscadd: Ports Baystation's setup screen changes, thanks to PsiOmegaDelta. + - rscadd: Includes character preview with toggleable equipment, visible loadout + items, ghost character sprites, and custom colour underwear. Your underwear + will have reset, so you'll need to set it back. +2016-06-07: + Datraen: + - rscadd: Adds a trait tool for Xenobio2. It was supposed to be in the initial implementation, + but fell through the cracks, sorry! + - bugfix: Fixed the xenobio smartfridge not displaying it's starting core amount. + - bugfix: Fixed an inverted check with slimes. + EmperorJon: + - tweak: Increased loadout points from 10 back to 15. We've added so many things + like lunchboxes and communicators that everyone just takes by default, so a + few more points will be nice. + JerTheAce: + - rscadd: Adds a variety of new guns. Some of these guns and and their ammunition + are purchasable through antag uplink, cargo, or can be spawned during Renegade + or Heist modes. + - rscadd: Adds ammunition clips for reloading magazines and some guns (such as bolt-actions). + - rscadd: All magazines and ammunitions can now be produced with the autolathe. + - maptweak: New bullpup SMG is available in armory area on CentCom level. + - tweak: Revolvers now use 6 shots. Finally. + - tweak: Most guns that didn't use magazines before for some reason (such as the + Uzi) now use magazines. + - tweak: All casings now update icons if they have been spent. + - tweak: Corrects Pulse Rifle charge cost consistency. + - tweak: Corrects and improves a number of icons for guns, including a couple of + energy guns, and adds fallback icons so they do not turn invisible when held + or strapped to your back. + - tweak: Made the icons for some guns look differently depending on what magazine + is loaded into them. + - tweak: Made antag uplink menu for guns and ammo more informative. + - tweak: Machinegun magazines no longer fit in pockets. + - spellcheck: Made names and descriptions for all projectile guns and ammo consistent + while removing grammar and spelling errors. + - bugfix: Autolathe no longer exploitable for ammo by repeatedly recycling empty + magazines. + - bugfix: Guns now check a list of compatible magazines. + - bugfix: Ranged mobs no longer drop usable .357 casings. + - soundadd: Added a variety of new gun sound effects, and swapped out the old default + gun sound. +2016-06-08: + Yoshax: + - maptweak: There is now more soap on the map. The chef also gets a dropper. + - tweak: Changes in gravity now stun for much longer. + - tweak: Bullets now have a better chance of penetrating objects such as filing + cabinets, consoles, fax machines, etc. This applies to all bullets. + - maptweak: The research outpost toxins department now has reinforced phoron windows. + - bugfix: Spears now do their correct damage instead of doing around half. +2016-06-14: + Arokha: + - rscadd: Adds video-calls on communicators for existing calls + - rscadd: Adds a 'decline' to incoming communicator calls + - rscadd: New wallets that let you color them how you want + - bugfix: Fixes communicators being able to hear speech + - bugfix: Fixes deadcalls to communicators + - bugfix: Fixed dropping head/foot/glove items on limb loss + - bugfix: Suit coolers inside mecha now work + - bugfix: Fixed printing '1' to world over and over + - bugfix: Made mech tracking beacon constructable again + - tweak: Change how emotes and LOOC propogate to nearby people + - tweak: Rewrote how get_mobs_and_objs_in_view_fast works + - tweak: Can now see through the red external airlock doors + Datraen: + - tweak: Adds a chance for slimes to get mutation toxin for creation of prometheans + (40%). + - bugfix: Simple animals outside of the hostile subtype won't follow you as a zombie. + - bugfix: Xeno hostility is more apparent now. + - bugfix: Slime cores can no longer create twice as many slimes through an exploit. + GinjaNinja32: + - rscadd: Rewrote drinking glasses. There are now eight types of glass, and drink + appearance is based on color and the type of glass you put it in. + - rscadd: There are now 'glass extras' you can add to drinks. Straws, drink sticks, + and fruit slices (yes, all of them) all work. You can add up to two extras per + glass. Add extras by clicking the glass with the extra, remove by clicking the + glass with an empty hand while it's in your other hand. + - rscadd: Adding 'fizzy' things (soda water, cola, etc) or ice to a drink will make + it be fizzy or have ice floating in it. + Yoshax: + - tweak: Everything produced in Robotics is now 25% cheaper to produce. +2016-06-15: + Yoshax: + - tweak: The categories for items in the cargo ordering console have been reworked. + Items shoulw now be in more sensible categories. If you cannot find something, + try the sensible category. +2016-06-21: + HarpyEagle: + - bugfix: Fixes disarm-attack dislocation chances being so low that you were very + likely to break the targeted limb before it would dislocate. + - bugfix: It is now possible to disarm-attack with stunbatons like with other melee + weapons. Note that this means that using a stunbaton on disarm intent will hurt + people. + - rscadd: Trying to move while being grabbed will now automatically resist. + - tweak: Small mobs are no longer able to pin larger mobs. + - tweak: Resisting a smaller mob's grab is more likely to be successful. + - bugfix: Fixed being able to climb onto a larger mob while restrained, weakened, + unconscious, or dead. + JerTheAce: + - rscadd: CentCom Fax, Admin Prayer, and CentCom emergency messages now prompt admins + with a pleasing sound effect. + - tweak: Fax machines now sound like fax machines and not polaroid cameras. +2016-06-27: + Sin4: + - rscadd: Added NanoUI for Advanced Body Scanners, Arcade, Atmospherics Control + Computer, Chemmaster, Cloning Console, Fax Machines, Guestpass Console, Holodeck + Computer, Laptop Vendors, Operating Computer, and Photocopiers. + - bugfix: Fixes chemmaster not putting pills in pill bottles. +2016-07-01: + Aztectornado: + - tweak: Clicking a stack of sheets (Metal, phoron...) in your other hand now asks + how many you want to split off the stack, courtesy of Baycode + Datraen: + - rscadd: Antagonistic factions can now be set and viewed on the uplink. Visibilities + can be set for these as well, to help identify sympathizers/potential aids, + or to hide the information from those outside of your faction. + Yosh: + - tweaks: Increases max records and book length to ridiculous levels. + Yoshax: + - tweak: The PTR Sniper is now more accurate when scoped, but less accurate when + unscoped. In addition it now has more recoil. + - tweak: The Laser Cannon no longer holds multiple shots. It holds charge for one + shot at a time. This is because the beams it fires now do 90 damage with 100 + armor penetration. Furthermore, it is now considerably more accurate. Lastly, + to counteract it only holding one shot at a time, it now autorecharges, which + takes 60 seconds. + Zuhayr: + - rscadd: Ports/adapted several kitchen machines from Apollo Station. +2016-07-08: + EmperorJon: + - rscadd: Adds admin functionality to call a trader ship event with the Beruang + in the same manner as ERT dispatches. + - rscadd: Adds a Trader 'antagonist' as they use the antagonist framework. Not considered + an actual antagonist, like the ERT. + - maptweak: Alters Beruang base to provide some clothing for Traders plus a locked-down + area for admins to spawn cargo. + - maptweak: Alters Beruang access to a new Trader-ID-only access requirement. + Neerti: + - maptweak: Restructred the AI core massively, and the upload slightly. + - rscadd: Adds a new material type, called Durasteel, which is made from plasteel + and diamonds. It's incredibly tough and also reflective. The inner walls of + the AI core contain this new material to protect it. + - rscadd: New turret subtype just for the AI core, that is more durable, has a chance + to shrug off EMP, and fires xray lasers. They even turn green. + - tweak: Turrets now wait to go back down in their covers upon losing sight of a + target. + - tweak: Emitters now have health, and can be damaged by projectiles. They will + explode on death. + - tweak: Critical APCs (the type found in the engine and AI core) are now more resistant + to EMP. Equipment and Enviroment stays on during an EMP, and less of the cell + is drained. + Sin4: + - rscadd: Added benches. + - rscadd: Added floor lamps. + - rscadd: Added water-cooler cup dispenser. + Yoshax: + - rscadd: Adds recipes for four new non-alcoholic cocktails. Shirley Temples, Roy + Rogers, Arnold Palmers and Collins Mixes. + - rscadd: Adds five new Tajaran hairstyles ported from Aurora. +2016-07-10: + Anewbe: + - bugfix: Changelings will no longer remain stunned or suchlike when attempting + to regenerate. + Cirra/: + - rscadd: Added a chemistry gripper for Crisis borgs. + GinjaNinja32: + - rscadd: Adds 3x & 4x upscaling options for players with very large monitors. + HarpyEagle: + - tweak: Runtime can now become friends with anyone, regardless of their initial + job. + Neerti: + - rscadd: Mining can now be done with explosives. The effectiveness depends on + the spot chosen to explode, so using an ore scanner is advised. + PsiOmegaDelta: + - rscadd: MedHUD overlays now have more stages, both for 'normal' and critical stages + of injury, for improved quick-diagnosis. + Redstryker: + - bugfix: Communicators will no longer show up on camera networks by default. + - rscadd: Adds a selection of flannels to the loadout. These can have their sleeves + rolled up, their buttons buttoned up, be tucked in and any combination of those. + Techhead: + - rscadd: 'New Random Event: Solar Storms. Similar to a radiation storm, but anywhere + inside the station is safe. Also boosts solar panel output significantly for + the duration.' + Yoshax: + - rscadd: Ports an Advanced Who verb that allows normal players to see what players + are in game, and which aren't. + Zuhayr: + - tweak: Modifies the health HUD element to display limb damage individually. It + will reflect your species, prosthetics, loss of limbs, as well as being on fire. +2016-07-13: + Anewbe: + - rscdel: Removed detonating borgs via Robotics Console + Yoshax: + - tweak: Emagging a cargo supply console will now properly hack it and will also + remove the access requirement. + - bugfix: Languages selected during character setup will once again be properly + added to mobs. + xDarkSapphire: + - rscadd: 'Adds a new hairstyle: Spiky Ponytail.' +2016-07-22: + Anewbe: + - rscdel: Removes assault carbine from uplink. + - tweak: Speeds up the toxin reagents + EmperorJon: + - bugfix: Having between 20 and 100 nutrition and over 45 toxin damage will no longer + cause you to gag ad-infinitum and die. It now respects vomit time restraints. + - tweak: Gagging now occurs only when the mob has no nutrition at all. It no longer + causes three toxin damage, only weakens as before. + - tweak: Vomiting and/or gagging from toxins now occurs regardless of nutrition, + not only 20+. + Neerti: + - rscadd: Adds ability for ghosts to send and receive text messages via communicator. + Yoshax: + - tweak: Drop pod contents have been adjusted. In general, you will get something + more useful and the less useful contents have been made more interesting. There + is a total of 12 drop pod content lists and 7/12 are useful, 4/12 are useless, + 1/12 is potentially useful. + - tweak: Stun Revolvers will no longer be able to spawn from random energy weapon + spawns. In addition, some of the other random item spawns have new items and + adjusted probablities. + - rscdel: Tajaran are no longer negatively affected by coffee. + - tweak: Bucklecuffing as it has been known for the longest time is no longer a + thing. When you resist when cuffed and buckled to something, you will now resist + out of the handcuffs first, allowing you to simply unbuckle yourself once done. +2016-07-25: + PsiOmegaDelta: + - bugfix: Robot upgrades produced in robotics to be applied to Cyborgs can now once + again actually be applied. + Rymdmannen: + - rscadd: Added department specific rubber stamps for cargo and warden. + - maptweak: Replaced 'small rubber stamp' with corresponding new ones in cargo area + and warden's office. + - spellcheck: Renamed ''quartermaster's stamp'' to ''quartermaster's rubber stamp''. + Superbee29: + - rscadd: Ghosts can now see the power in a cable when examining it. + Yoshax: + - tweak: Flashes no longer provide an instant stun. Flashes now confuse and blind + the affected person for five seconds and in addition makes their eyes blurry + for ten seconds. + - tweak: The empty box supply crate has been replaced with a shipping crate. Which + contains what you need to send stuff places! + - maptweak: The chef now gets a destination tagger and packaging paper to send people + food. + - bugfix: Drinking glasses now have a material cost in the autolathe. + - tweak: When emagged security bots such as the Securitron and ED-209 will now move + and pursue faster. + - bufix: Securty bots such as mentioned above will now be properly emagged. + - tweak: The cost of items in the antag uplink have been tweaked. Some are cheaper, + some are more expensive. In addition, you can now buy singular grenades isntead + of boxes. Buying a box has a discount over the singular. + - bugfix: Repairing burn damage on FBPs will now once again properly work. + - bugfix: Undislocating limbs will now once again properly work. + - rscadd: The phoron assembly crate in cargo has been renamed to a Phoron research + crate and now contains more supplies including tank transfer valves. + - tweak: The cooldown between discount offers in the antag uplink is now 10 minutes + versus the previous 15 minutes. + - tweak: The ordering of the items in the autolathe will now be somewhat diferrent + due to a code overhaul. It is now in alphabetic order. + - tweak: Security robots such as the Securitron or ED-209 are now more hardy and + can take more damage before dying. + - tweak: The silenced pistol no longer has any recoil and can be fired faster with + less delay in between shots. +2016-07-31: + Anewbe: + - rscadd: Sprays now respect shields. + Yoshax: + - bugfix: Certain items such as pills and suchlike will once again be usable on + someone who is on a surgical table/table. +2016-08-05: + Anewbe: + - rscadd: Changeling Self-Respiration is now a toggle. By default they breathe normally, + but if they use the power they no longer require oxygen, or experience the effects + of inhaled gasses. + - tweak: Heat based damage has been increased. This includes fire. + Hubblenaut: + - rscadd: Windoor assemblies can now be named with a pen. + - rscadd: Windoor and airlock assemblies now show their custom name during construction + phase. + - tweak: Windoors can now be made out of two sheets of glass or reinforced glass, + for normal and secure windoors respectively. + - tweak: Windoors now automatically close after construction. + - tweak: Adjusts the algorism for how windoors and windows are placed on construction + (when there are already windows co on the same turf). + - bugfix: Windoors will now drop exactly the materials they were made of. + - bugfix: Prying a broken circuit out of a windoor will no longer cause duplicates + to drop. + - bugfix: Airlocks no longer spark after spawn and several other icon update issues + were fixed. + - bugfix: Fixes reinforced walls not being constructable with one sheet left in + stack. + - bugfix: Windows that were busted out of their frame by force are now correctly + rotatable. + - bugfix: Lots of spellchecking and code cleanup in windoor and airlock code. + - rscdel: Killed innocent kittens. + Sin4: + - bugfix: Advanced Body Scanners are now deconstructable + - bugfix: You can now add coolant to the Radiocarbon Spectrometers + - tweak: Frame code revamped and cleaned up. + - rscadd: R&D server circuitboards can be swapped between core and robotics types + using a screwdriver. + Yoshax: + - bugfix: Wounds will now once again bleed. + - bugfix: Xeno loadout items will now properly be reloaded into a slot when the + server restarts. + - rscadd: A new item has been added to the uplink. Package bombs. These come in + two variants, small and big, which cost 20 TC and 40 TC respectively. These + come in a box with an explosive, a disguised detonator and a screwdriver. The + use the detonator you muse apply the screwdriver to configure it into detonator + mode. This must be done when it is closed. +2016-08-07: + HarpyEagle: + - rscadd: Severe enough burn damage now causes one-time blood loss due to blistering + and body fluid cook-off. + Sin4: + - bugfix: Fixed ERT icon not showing up properly for sechuds. + - tweak: Fixed instances of the game mode's config_tag being displayed instead of + the game mode name. + Yoshax: + - rscadd: Attacking yourself, or anyone else with a stack of five or more telecrystals + will teleport the attacked person to a random, safe (not in space) location + within 14 metres. + - tweak: All telecrystals ammounts have been multiplied by 10. This means the base + amount is now 120, and an emag for example costs 30, vs the previous 12 and + 3, respectively. + - tweak: You can once again use telecrystals on an emag to add more uses to it. + You get 1 use per every 2 telecrystals. + - tweak: Instead of only being able to remove 1 telecrystal from your uplink, you + can now remove 1, 5, 10, 25, 50. +2016-08-08: + Kelenius: + - rscadd: Xenoarcheology code has been partially redone. + - tweak: Pick set will now sort the picks inside it. + - tweak: Removed useless random numbers from GPS coordinates in various places. + I'm sure we have not lost the arcane knowledge of rounding 500 years into the + future. + - tweak: Picks renamed to show their excavation depths. + - tweak: Suspension generator's power use lowered. + - tweak: Suspension generator's different field types removed. By the way, remember + that they can suspend any item and even mobs. + - tweak: Archeology belts and pick sets can now hold small pickaxes. Pick sets still + only have 7 slots. Brushes fit on your ears. + - tweak: Empty rock drop rate reduced. + - tweak: Empty rock renamed from 'rock' to 'small rock' so you can tell if you are + clicking on a turf or an item when hovering over it. + - tweak: Empty boulder spawn rate reduced. + - tweak: Tape measuring is a bit faster. + - tweak: Scanner now shows the lowest and the highest depth of the find (highest + is depth + clearance) for easier calculations. Ideally, you need to hit exactly + the lowest spot. Less ideally, hit anywhere between higest and lowest. Hit below + lowest and you have a chance to break the find. + - tweak: You can now use a brush to clear strange rocks. Welder uses less fuel for + that than before. + - tweak: Anomaly analyser's report made a bit easier to read. + - tweak: Anomaly locater will now also locate normal finds. + - bugfix: Gas masks will now correctly spawn as archeological finds. + - bugfix: Digsites will now properly contain several (4-12) turfs in a 5x5 radius. + Be careful when digging near your finds. + - bugfix: Suspension generator will now correctly turn off (qdel issue). + - bugfix: Archeology overlays won't disappear when the icon is updated (e.g. when + mining next to it). + - bugfix: Archeology overlays won't overlap each other and will properly disappear + when you mine out a find. + - bugfix: Some spawning oddities were fixed. + - bugfix: Checks for whether you get a strange rock or a clean item were fixed (previously + it always gave you clean item where it should have been rolling a random number). + - bugfix: Can no longer get rid of any item by putting it into evidence bag and + bag into core sampler. + - bugfix: Can no longer irreversibly fold pick set into cardboard. + - bugfix: CO2 generator effect now has a type. + - bugfix: Phoron generator effect will now always generate phoron, not sometimes + phoron and sometimes oxygen. + Sin4: + - tweak: Scheduler ported from Baystation's port of Paradise's scheduler. + Yoshax: + - tweak: Some items such as commonly found tools are now slightly more effective + when wielded as weapons. This change has been made because many of them were + too low, and low because of mostly holdovers from other servers where things + such as grey tide are big concerns. +2016-08-13: + Yoshax: + - bugfix: The ERT camera monitor on the shuttle will now connect to the right network. + - bugfix: The 'choose sprite' verb as a ghost will no longer prematurely clear you + sprite and will now return your sprite to what it was previous when you press + 'no'. However, it will not allow you to get back the sprite of your actual character + because those are horrible snowflakes. + - bugfix: The Atmos Substation is now a proper substation with a breaker box and + all! + - bugfix: Diona Nymphs now get a popup window on evolution to allow them to input + a name. + - bugfix: Changeling revive will now close any surgical incisions. +2016-08-15: + Anewbe: + - tweak: Changed some words to match current Tajaran lore. + Hubblenaut: + - rscadd: Adds a verb for toggling whether to show specific pieces of underwear. + - tweak: Changes medical belt sprite. Mostly white now so they go nicely with all + medical uniforms. + Yoshax: + - bugfix: Dirt accumulation on tiles will now work again. + - bugfix: The change appearance window provided to antagoniss such as mercenaries, + heisters or suchlike (including traders!) will now properly allow people to + select species they are whitelisted for. +2016-08-29: + Haswell: + - rscadd: Modules installed within a hardsuit will now be listed when examining + the hardsuit control module while being held or worn, if the maintenance panel + is open. + Hubblenaut: + - bugfix: Bottles will now actually sell for their set prices. + - tweak: Chief Medical Officer and Medical Doctors now spawn with a health analyzer + instead of a penlight. + Sin4: + - bugfix: Camera Console swaps to active camera upon clicking on. + - bugfix: Hugs gender correctly. + - bugfix: Prometheans gender correctly and have a gender identity. + - bugfix: Meatspike no longer takes you prisoner upon placing something on it. + - rscadd: Lighting someone on fire now tells the admins. + - bugfix: Wiping something down with a damp rag no longer wets the floor. + - bugfix: Captains gloves now appear when put on. + - bugfix: Fixes Station Administrator Spawn point and access/restrictions. + - tweak: Renamed items from captain to station administrator. + Yoshax: + - bugfix: IDs can now actually be put onto your ears. + - bugfix: Lungs will now once again rupture when you are in an area where you cannot + breathe. This has a relatively small chance to happen. +2016-08-30: + Anewbe: + - tweak: Arm and leg guards are now slightly less slowing. + - tweak: Mining RIG is now faster + - tweak: Tweaks security voidsuit armor values. + - rscadd: Hardsuits (RIGs) now have an inbuilt suit cooling system, toggled via + HUD button. This only works when the hardsuit is fully deployed, and drains + charge from its power cell. + Neerti: + - rscadd: Emitters can be examined to see if they are damaged. They can also be + repaired by applying metal sheets to them. + - tweak: Emitters now only explode on death if they are on a powered wire with significant + power flowing through it. + - bugfix: Emitters don't explode in one hit, or by tasers or non-damaging projectiles + anymore. +2016-09-01: + Alberyk: + - rscadd: Added more horns and horns related facial options for Unathi. + Anewbe: + - tweak: Hyperzine metabolizes twice as quickly. + - rscadd: Changeling space suits now have magboots. + - rscadd: Armblade now has suicide_act text. + Techhead: + - rscadd: Medical splints can now also be applied to hands and feet (in addition + to arms and legs). + - rscadd: For those that miss the old functionality, ghetto splints have been added. + These can be crafted with a roll of tape and a metal rod and can only splint + arms and legs. + Yosh: + - rscadd: The secure briefcase is now available in the loadout for anyone who wishes + to use it. + - bugfix: Leaving a space area and entering a non-space area will no longer leave + your sprite floating. + - rscadd: Ponchos can now be attached to your uniform as an accessory. In addition + they can also be attached to suits! + - bugfix: Changeling regenerative stasis will now properly regrow limbs. + - bugfix: Changeling regenerative stasis will no longer runtime and refuse to work + when you have a missing limb. + - tweak: The shuttle during revolution will no longer take forever and a day to + arrive and such. +2016-09-02: + Yosh: + - rscadd: DNA Lockable guns have been finished. Any gun can be made into a DNA Lockable + gun by inserting a DNA Chip Lock. These are not currently available, and are + adminspawn only. Please refer to your nearest staffmember/developer to begin + discussion for future implementations of this feature. + - rscadd: A new hairstyle has been added named poofy2. + Yoshax: + - tweak: Autotraitor now needs 0 players to start in secret. + - tweak: Diona are now slightly faster! +2016-09-03: + Yosh: + - tweak: Projectile flash rounds will now do the same as a flash when it hits the + target. As such, it will blind, confuse and blur the eyes of thw target. Pistol + and machine gun rounds last the same length as a flash, shotgun rounds last + longer. + - tweak: Changeling recursive enhancement is now a toggleable passive ability, instead + of a one-time use active ability. + - rscadd: You can now vomit by using the vomit emote. + Yoshax: + - bugfix: Changeling armor and space armor can now be cast off regardless of your + stored chemicals. +2016-09-16: + Anewbe: + - tweak: Explosive implants should no longer gib the target if the setting is Localized + Limb. + - rscadd: Lasercannon has 4 shots and fires slightly faster. + - tweak: Lasercannon shots are slightly weaker to compensate for increased sustain. + - tweak: Changes Unathi sprites slightly. + - tweak: The advanced egun, laser carbine, and lasercannon now take up a bit more + space in bags. + - tweak: Prosthetic limbs and extremities no longer increase body temperature. + - tweak: Ninja and Technomancer now require 5 players to start in either secret + or voted. + - tweak: Split skirts into 'skirts', which are just a skirt, and 'skirt outfits', + which cover the upper body. Check your loadouts, they should remain otherwise + unchanged. + - rscdel: Splints are no longer reusable. + - tweak: Water is now more effective at dousing burning people. + - rscdel: Ninjas now vanish in a cloud of smoke, rather than exploding. + Chinsky: + - rscadd: Added a hawaii shirt to loadout accessories. Can be attached to clothing + like suit jackets etc. Can also be found in mixed wardrobes. + Yoshax: + - tweak: People bleed faster and more. + - bugfix: Splints are once again reusable and have been improved behind the scenes. + - bugfix: Removing splints will now correctly give you the splint used to splint + the organ. +2016-09-19: + Anewbe: + - rscadd: Blood Drain now heals internal damage, including broken bones and internal + bleeding. + - rscadd: Adds the Command Secretary job. + - rscadd: CE hardsuit now has proper magboots and insulated gauntlets. + - bugfix: Powersinks should actually explode again, after a while. + MagmaRam: + - rscadd: Lasers and energy projectiles in general now glow in the dark. + - tweak: Robotic and prosthetic limbs can now be used in creation of simple robots, + rather than just the robotic (lawed-chasis) limbs. + Zuhayr: + - rscadd: Added /vg/ direct-action ventcrawling. You will now crawl through the + actual pipe network, a step at a time. Have fun. +2016-10-02: + Anewbe: + - tweak: Pain from burn damage is now equal to that of brute damage. + - bugfix: Removed the exploit by which you could gain cargo points by ordering plastic + crates. + - rscadd: Upped cargo point gain by 50%. + - rscdel: Parapen in SpecOps crate replaced with a 4th smoke grenade. + HarpyEagle: + - rscadd: Adds applying pressure to body parts to reduce bleeding. With desired + body part selected, help-intent click yourself or get an aggressive grab, then + help-intent attack with the grab item. Each person should only be able to apply + pressure to one body part on one person at a time, so choose wisely. Applying + pressure will get blood on your hands. + Yoshax: + - rscadd: Armbands can now be attached to things that go in the outer suit slot. + - rscadd: Shanking has been added. You can shank someone by getting an aggressive + grab on them, targetting their chest and attacking them with a sharp item. This + has a special attack that has greatly increased chance to do internal damage, + also does bonus damage for weapons that are both sharp and have edge. + Zuhayr: + - rscadd: Added /vg/ direct-action ventcrawling. You will now crawl through the + actual pipe network, a step at a time. Have fun. +2016-10-05: + Redstryker: + - rscadd: Added four sounds that are randomly played when bones break. Also allows + the Technomancer to play the bone break sound. + - rscadd: Adds a black variety of the Security Voidsuit called the 'Crowd Control' + voidsuit. It can be obtained from a Suit Cycler with Security clearence. + - bugfix: Codes in icon state for the Press Vest. + - rscadd: Added a child of the Medical armband with a red cross on it. It is available + on the loadout. +2016-10-06: + Anewbe: + - rscadd: Energy weapons and stunbatons now use special device power cells, these + can still be recharged. + - rscadd: Energy weapons can be unloaded and reloaded by clicking them with an empty + hand or a device cell, respectively. The process of loading a cell takes a few + moments. + - rscadd: Stunbatons no longer require a screwdriver to switch cells. + - tweak: Tweaked the order in which stunbatons check for power, they should now + visibly power off when their cell hits 0, instead of one hit after. + - rscadd: Security lockers (HoS, Warden, and Officer) now have an extra device cell + in them. + - rscadd: Protolathe can print device cells. + - rscadd: Adds start_recharge() proc to energy weapons. When called, this should + cause the affected weapon to begin self-charging. + - rscdel: Weapons that self-recharge won't do so for a short period after firing. + - tweak: On weapons that can fire both lethally and non-lethally, lasers drain twice + as much power as tasers. + - tweak: Laser cannon, LWAP, and self_recharging weapons cannot switch cells. + - tweak: Map has been changed to include more rechargers. Merc and ERT bases include + extra device cells. + Neerti: + - tweak: Cleaned up the work in progress event system. + - rscadd: Added framework for a new grid check for the new event system. + Spades Neil: + - tweak: Replaced Station Administrator with Facility Director, based on feedback + literally from NASA. + Yoshax: + - bugfix: You can now only fit one pizza per box, and pizzas will no longer vanish + to pizza gnomes. + - rscadd: Energy swords will now produce a small light. The light is determined + by the color of the blade. + - bugfix: Simple mobs such as slimes, or carp, will now ignore intent requirements + for passing applied tape. + - bugfix: Long records will no longer be devoured by long-record-goblins when attempting + to edit them using a console in-round. + - bugfix: AIs with special roles will now get access to the fancy law manager. +2016-10-08: + Anewbe: + - bugfix: Unloading an energy weapon should now correctly show what was unloaded. + - tweak: Borg stun baton is back to the old cost, for balance reasons. + Redstryker: + - rscadd: '''Overseer'' added as an alt title to Facility Director alt titles list.' + Spades Neil: + - rscadd: Adds the ability to hack Jukeboxes. + Yoshax: + - rscadd: Flashlights now take powercells. + - rscadd: Flashlights now have multiple brightness levels, including low, medium + and high. +2016-10-10: + Anewbe: + - tweak: The base device cell has been shrunk, for use in non-weapon devices. + - rscadd: Adds another class of device cell, for use in weapons. + - rscadd: Belts can now hold device cells. + - rscadd: Cryopods (including the portal and elevator) no longer consume ammo or + device cells. + - bugfix: Low Yield EMP grenades now have the proper EMP radii. + Redstryker: + - bugfix: Allows promotion to Facility Director on the ID console. +2016-10-24: + Anewbe: + - tweak: The color selectable beret should now be more vibrantly colored. + - rscadd: Bullet armor has a higher chance of preventing an embed. + - tweak: The actual system by which embed works has been changed. The overall effect + should be negligible. + - tweak: Flashlights use device cells. Time of use should be roughly unchanged. + - rscadd: Device cells have a chance to spawn where normal cells do. + - rscadd: Internal Affairs Agent HUD icon added. + - tweak: Command, QM, and Bridge Secretary icons are now blue. + - tweak: Research department icons are now purple. + - tweak: Supply department icons are now brown. + - tweak: Chemist icon is now white and red, like the rest of medical. + - tweak: Using a roll of tape on a person requires the same level of grip as handcuffs. + - tweak: The disclocation chance when using disarm intent with a weapon has had + its' formula changed, meaning the threshold for always disclocatiing is now + higher, and no longer 15 force. Meaning weapons will dislocate limbs less often + and will also do less damage. + MagmaRam: + - tweak: Rates of blood loss now depend on the type of wound inflicted and where + the wound is inflicted, as well as the damage. + Neerti: + - tweak: Changes how the grid check event works. A new machine called the grid + checker exists in engineering, near the engineering substation. The actual + event now involves a power spike originating from the engine, which the grid + checker will activate upon sensing it, and causing a blackout. Engineering + can restore power faster if they hack the grid checker correctly. A piece of + paper left in the substation has more details. + - rscadd: Adds new 'spell power' mechanic, currently tied to technomancer cores. + Certain cores will augment various characteristics of spells, such as damage, + radius, etc Base spell power is 100% (internally 1.0) and some cores may raise + or lower it. + - rscadd: Adds new 'info' tab for Technomancers that hopefully tells new them what + they need to know. + - tweak: Round-end now shows every spell each technomancer has, as well as their + core type. + - tweak: Ability HUD buttons can be re-ordered by clickdragging one button onto + another. + - bugfix: Recycling core now actually works. + - rscadd: Adds two new cores. The Safety Core, which reduces instability by 70%, + however it hass less energy, lower recharge rate and lower spell power. Also + the Overcharged Core which uses more energy, caused more instability, but has + far higher spell potency. + - rscadd: Adds a new Spyglass item, that functions exactly like a pair of binoculars. + This is for Techomancers. + - tweak: Technomancer Resurrect now has a deadline of 30 minutes until a dead person + can't be revived, instead of 10 minutes. + - tweak: Technomancer Radiance is now three times as strong. Also Radiance with + a Scepter prevents the caster and allies from being afflicted. + PapaDrow: + - rscadd: Striped undergarments now exist. + Redstryker: + - rscadd: Added a blue variant of the Medical voidsuit called the 'Emergency Medical + Response Voidsuit' that can be obtained from the suit cycler. +2016-10-25: + Anewbe: + - tweak: The effects from empty-handed disarming now have a cooldown. + - rscdel: HoS and Detective equipment is less protective. +2016-11-13: + Anewbe: + - rscadd: Adds a list to prevent certain jobs from being certain roundstart antags, + rather than outright preventing them. + - bugfix: Surplus crates won't make more surplus crates. + - tweak: Random buys from uplinks will no longer buy anything out of the Badassery + tab. + - bugfix: Loincloth now has an on-mob sprite. + - rscadd: Ported Bay's tape recorders (which actually work). + Broseph Stylin: + - rscadd: Added HUD aviators to the loadout. They're restricted to security, and + can toggle between HUD and flash protection modes, but won't offer both at once. + MagmaRam: + - rscadd: Holsters can be concealed by some suit-slot items, others conceal all + accessories. + - bugfix: Fixed certain suit-slot items not hiding jumpsuits properly. + RedStryker: + - rscadd: Adds a Guy Fawkes mask. + Yoshax: + - rscadd: Clipboards can now be made out of wood. +2016-11-17: + Anewbe: + - tweak: Slowdown in armor sets moved to chest and legs, rather than arms and legs. + - rscadd: Bullets and lasers will now show up on Autopsy Reports. + - bugfix: Fixed all ERT calls being silent, regardless of selected option. + - rscadd: Flashlights can now fit in rechargers. + - rscadd: 'Added flashlights, maglights, and the secHUD sunglasses (Sec only) to + the loadout. ' + TheGreyWolf: + - rscadd: Added Sign language, which can be selected from character setup. +2016-11-18: + Anewbe: + - rscadd: Added .45 and tommygun AP ammo to the uplink. + - tweak: CPR can be performed on corpses, doesn't actually help them. + Datraen: + - tweak: Makes cameras faster, removing a large chunk of bloat relating to taking + pictures. Specifically for taking pictures of angry cheetos. + MagmaRam: + - bugfix: Slimes will now properly process chems that have zero effect on them (that + is, they'll get rid of them instead of clogging up their metabolism forever). + Nerezza: + - rscadd: Added Lemon Juice to soda dispensers across the station. Reagent cartridge + refills can be ordered via cargo. + - rscadd: Added Lemon Juice and Milk Cartons to the bar's Booze-o-Mat. You can now + order milkshakes and not get shot (maybe). + Yoshax: + - experiment: Being unable to breathe and having oxyloss will now cause brain damage + that scales with the amount of oxyloss you have. Without oxygen, the brain takes + damage and will EVENTUALLY die (but you would most likely die of actual oxyloss + before that point.) +2016-11-20: + Datraen: + - tweak: Global announcer now has access to engineering channel. + - tweak: Supermatter now uses the global announcer. + Nerezza: + - bugfix: Digital FBP/Cyborg brains no longer drop brains. + - rscadd: Digital FBP/Cyborg brains are tagged with their designation now. + - bugfix: All cyborgs can now unbuckle people from beds/chairs. Just attack the + structure with no module selected. + - rscadd: Added the current station date to the Status tab. Ported from Baystation. + Yoshax: + - rscadd: Adds the ability for Hydroponics Trays to enter cryogenic stasis. You + can do this by using a multitool on one. Wheh in stasis the plant will be frozen + in time, it will neither grow nor die. Now you can have a life! +2016-11-21: + Anewbe: + - tweak: Drawing blood with a syringe now takes a moment. + - rscadd: Communicators no longer have a loadout cost. + - rscdel: Having more than 50 tox will now cause liver damage, rather than 60. + - rscadd: Adds Stimm, a homemade hyperzine made of sugar and welding fuel. + - rscdel: Hyperzine is now toxic. + Nerezza: + - tweak: Space suits now hide jumpsuits, so excessively bulky jumpsuits no longer + peek through. + - bugfix: Teshari wearing webbing now have the correct sprite overlay. More accessories + need sprites, however. + - wip: Teshari sprites no longer show the majority of suit accessories, anyone who + wants to pitch in to fix this are invited to do so! + - rscadd: Windoors can now be disassembled. Apply crowbar when open. + - rscadd: Engiborgs and drons can name door and windoor assemblines now. Click an + adjacent assembly with no modules active. + - bugfix: Windoors now know how to name themselves. In addition, unnamed windoors + now spawn with their default name instead of null. + RedStryker: + - rscadd: Added a colorable hairflower to the loadout. + - rscadd: Added a taqiyah to the loadout that can be colored with the color datum. + - tweak: Fixed the sprite for the red Security Hat backwards sprite so that the + 'N' on it is no longer backwards. + Yoshax: + - tweak: All robots now get crowbars, flashes and fire extinguishers. + - tweak: IV Drips are no longer dense, meaning they can be walked through like chairs. + - tweak: Robots can now use the toggle lock verb on crates and lockers. + - rscadd: There is now an experimental welding tool, it regenerates its fuel on + its own! One is given to the Chief Engineer, produced in Research, or found + in Syndicate toolboxes. +2016-12-01: + Anewbe: + - bugfix: Adult Diona should be able to name themselves properly now. Tweaked from + a Baystation PR by FTangSteve. + - rscdel: Lightning spells and bioelectrogenesis will no longer stun outright. + - rscadd: FBPs should no longer get mutations from radiation. + - bugfix: Observe warning should properly show how long you have before you can + join. + - rscadd: Adds a Toggle Shoe Layer verb to shoes, that let them be worn over the + uniform (ie tucking your pants into your shoes). + - bugfix: Shoes now properly check if they can hold knives or not. + - bugfix: Sign language can now be used while muzzled. + Datraen: + - tweak: Skrell are now more resistant to various chemicals, more susceptible to + pepperspray. + ForFoxSake: + - bugfix: Fixed a possible href exploit allowing any living player to speak any + language. + - bugfix: Organic beings can no longer speak Encoded Audio Language, although they + can still understand it just fine. + - tweak: Positronic brains can now speak Encoded Audio Language. + - tweak: Station manufactured Full Body Prosthetics can now speak Encoded Audio + Language. + MagmaRam: + - tweak: Corpses will now process a select few chemicals, meaning you can now add + blood into people who bled out before defibbing them. + - bugfix: Defibrilators fixed again. + - bugfix: R&D machines will now accept stacks of metal and glass from Cargo orders + properly. + N3X15: + - bugfix: Electrical storms no longer affect only cargo. If you're not cargo, your + lights are no longer safe. + Nerezza: + - rscadd: APCs now have a new EMP behavior. Regular APCs shut off for a few minutes, + critical APCs (engine and AI) shut off for 30ish seconds. Medbay will now not + be permanently disabled by EMPs if no engineers are available to fix their APCs. + - rscadd: Bay's timed reboot interface for APCs has been ported for EMPed APCs. + - tweak: APCs affected by grid checks say so on their nanoUI now. + - tweak: APCs damaged by the apc_damage random event are now effectively emagged + APCs. Anyone can operate their interface. + - tweak: Emagged APCs can now be repaired by removing their power cell and using + a multitool to 'reboot' them manually. + - bugfix: Nin and twiz no longer **** up APCs if they drain the battery completely. + - tweak: Nin and twiz drain power from the wire an APC is connected to first, then + drain from the power cell to fill the drain's 'quota'. Because the amount of + power given from the power net is random, this means the battery will still + drain but this also means you don't need to crowbar tiles in a room if the APC + is empty. + - bugfix: Bluescreened APC wire panels now visibly open like they should. + - tweak: Bashing APCs open was only effective under certain circumstances, but would + spam everyone anyway. This has been changed to only spam the user and to be + more indicative of when you can bash the cover off. + - spellcheck: Full grammar pass on APCs. + - rscadd: Hazard shutters animate slightly and play a sound so players can more + readily identify where shutters are being pried. + - bugfix: Two people can't pry the same shutter simultaneously anymore. + - bugfix: Fixed a bug causing shutters to immediately pry open when people didn't + want the shutter open. + - rscadd: Inflatables can be deflated using ctrl-click. + - rscadd: Inflatables can be deployed on adjacent tiles by clicking them. + - bugfix: Bumping into closed inflatable doors will no longer freeze them for a + few moments. + Yoshax: + - maptweak: All Heads of Staff now get multi-color pens in their office. + - tweak: Doors that do not have an access requirement can now be opened when handcuffed. +2016-12-17: + Anewbe: + - bugfix: EVA rig now has insulated gauntlets. + - rscadd: Adds another slot to select languages, if desired. + - rscadd: The base device cell is now selectable in the loadout. + ForFoxSake: + - tweak: Digital Valve pipes can now be made and moved. + - tweak: Air Vents can now have their direction changed. + - maptweak: Atmospherics is now a little less cluttered. + MagmaRam: + - rscadd: Added a nice implant that allows humans to speak EAL. + N3X15: + - rscadd: Added a changelog editing system that should cause fewer conflicts and + more accurate timestamps. + - rscdel: Killed innocent kittens. +2016-12-30: + Anewbe: + - rscadd: Changed run/walk speed to be based only on a config file. + - tweak: Walking should be faster now. + - tweak: Removed shoeless slowdown. + Atermonera: + - bugfix: Science grippers can install and remove borg components + - bugfix: Exosuit grippers can install exosuit equipment + - bugfix: Sheetloaders can load materials into protolathes and circuit imprinters. + - tweak: Protolathes and circuit imprinters input materials like autolathes, taking + as much of the fed stack as it can. + MagmaRam: + - tweak: Beakers can now have longer labels. + - rscadd: Adds defibrilator crate for cargo. + - tweak: Changed how certain stacks spawn behind the scenes. Should fix a few esoteric + bugs without impacting anything else. + Neerti: + - bugfix: Subtracting, multiplying, and dividing with arithmetic circuits should + actually occur now. + - rscadd: Added new arithmetic circuits; sign, round, and exponent. +2017-01-03: + Anewbe: + - bugfix: Farmbots should be buildable again. + - rscadd: FBPs with vital (head/torso/groin) damage will now show up on the crew + monitor as being damaged. + - bugfix: Flashes should now properly affect accuracy in hand-to-hand. + - bugfix: Taj should no longer be poisoned by any sort of coffee. Looks like we + missed a spot last time. + - rscadd: Recording tapes can now hold 30 minutes of chat. + - rscadd: Tape recorders and their tapes now fit in security and detective belts. + - rscadd: Lasers can now ignite thermite on walls. + - bugfix: Device cells now fit in wall rechargers. +2017-01-12: + Anewbe: + - rscadd: Ported over a bunch of hairstyles and underclothes from Baystation. + - tweak: Nurse spiders inject eggs less frequently. + - rscadd: Nurse spiders give a warning to the victim when they implant eggs. + Neerti: + - rscadd: Hand-held flashes and flash rounds will now stun upon repeated applications, + similar to stun batons. +2017-01-23: + Anewbe: + - rscadd: Can now just click ones boots to draw a holstered knife. + - rscadd: More boots can hold knives now. + - rscadd: Added an action button for breath masks, making it easier to toggle them. + - rscadd: Space Carp have a chance of sticking around after their event completes. + - tweak: Robotic limbs will no longer show up on the health scanners. + - rscadd: Medics and Security can open firedoors. Do so at your own risk. + - rscadd: Chaplain hoodie now has pockets and an actual hood. + - tweak: Winter coat hoods have the same armor values as their coats. + - rscadd: Characters will now spawn in at a random level of hunger. + - rscadd: Assisted and Prosthetic organs now have sprites. + - rscadd: Surgical tools will not attack while on help intent, this should prevent + people getting accidentally stabbed in surgery. + - rscadd: Tajaran now process reagents slightly faster. + - rscdel: Taj are now allergic to coffee again, per loremaster request. + - tweak: Taj now get drunk faster. + - tweak: Hyperzine is now more toxic to Taj. + - rscadd: Readded the Vox for admin/antag use and testing. They breathe Phoron now, + rather than Nitrogen. + - bugfix: The Xenotaser should work properly. + FTangSteve: + - wip: RootSpeak is now split into a local and a global variant. For now the global + acts as a hivemind. + Hubblenaut: + - tweak: Can now click on turfs with trash bags and similar to quick-gather everything + on it. No longer pixelhunting for cigarettes and bullets. + - bugfix: Buckets and other reagent holders will no longer simply be put into the + janitorial cart's trash bag. + PsiOmegaDelta: + - tweak: The round start and auto-antag spawners can now check if players have played + long enough to be eligable for selection. + Techhead: + - rscadd: 'Added a new random event: Shipping Error - A random crate is mistakenly + shipped to the station.' +2017-01-28: + Anewbe: + - rscadd: Added Medical and Meson aviators. + - rscadd: Medical and Meson aviators are now in the loadout, department locked. + - rscadd: Meson Scanners have been added to the loadout, department locked. + - rscadd: Medical hardsuit has a toggleable sprint. + - bugfix: Carbon and Hematite should show up in asteroid walls. + - rscadd: Readded the random crates from mining. + - rscadd: Digging through an artifact sometimes doesn't destroy the artifact. + - bugfix: Space and cracked sand should no longer stop mining drills. + - rscadd: Diona can regenerate organs and limbs. + PsiOmegaDelta: + - rscadd: Resetting a character slot now requires confirmation. + Zuhayr: + - rscadd: Added a reset slot button to chargen. +2017-02-24: + Anewbe: + - rscadd: Fake command reports now make the paper show up. + - bugfix: Mining cameras should work now. + MagmaRam: + - tweak: There is now a short delay before being able to fire when using hostage-taking + mode, and a short delay between shots. This should make hostage mode useful + for taking hostages and ambushes, rather than as an aimbot in actual firefights. + - bugfix: Sandwiches at max size can be eaten with a fork. + Yosh: + - rscadd: Some vending machines now log the items they've vended and had stocked, + storing the name of the user, the time and the item. These can be found by using + the new verb for vending machines, or from the right click menu. + Zuhayr: + - rscadd: Adminhelps now have a TAKE button that allow an admin to claim it, and + inform the adminhelper that someone is on the case. +2017-03-22: + Anewbe: + - tweak: Oxyloss now shows up as cyan in scanners. + Arokha: + - tweak: Having less than 30% blood (as a result of literally having that little + blood, or a broken heart) causes 75 oxyloss per tick rather than 300 toxins + and instant death, to allow for heart transplants. + - bugfix: Infections now spread and process properly between external organs. + - rscadd: Infections now have appropriate symptoms that indicate to a player that + they have one. + - rscadd: Infections are now diagnosable more accurately in a medscanner, or visually + for high level infections or dead limbs. + Atermonera: + - bugfix: EAL, Sign language, and emotes will no longer use autohiss + - rscadd: Surgeon Borgs now have a proper medical hud module +2017-03-28: + Anewbe: + - spellcheck: Disregard the last changelog on the spelling of HI, the correct spelling + is Hephaestus. My bad. + - rscadd: Added a changelog editing system that should cause fewer conflicts and + more accurate timestamps. + - rscadd: Added Myelamine, a blood clotting chemical. This is available to antags, + and can be ordered from cargo or mixed. + - rscadd: Added Osteodaxon, a bone fixing medicine. This is available to antags, + and can be mixed. + - rscadd: Added Carthatoline, a stronger anti-toxin. + - rscadd: Added Spidertoxin, which comes from spiders (duh), and is used in making + Myelamine. + - rscadd: Death Alarms can now be ordered from cargo. + - rscdel: Dexalin Plus is half as strong (still pretty strong, though). + - rscadd: Ninja, Merc, and ERT-M Hardsuits can now inject myelamine. + - tweak: Inaprovaline now decreases the effects of bloodloss, and lessens brain + damage taken from OxyLoss. + - tweak: Prosthetic organs now take randomised damage when emp'd, this should roughly + average out to the old values. + - tweak: The effects of heart damage have been tweaked, should be slightly easier + to survive now. + - tweak: Some of the stronger chems have side effects, like confusion or blurry + vision. These should be fairly minor, and we may be tweaking them in the future. + - tweak: The suiciding var now wears off, making it possible to save suicide victims + if quick action is taken. + - tweak: Death Alarms now announce on General comms again. + - rscadd: Borgs can climb tables. + - tweak: Skrell can now be up to 130 years old. + - tweak: Skrell are more vulnerable to flashes, due to their large eyes. + - tweak: Tajaran no longer have appendicies. + - tweak: Tajaran are more vulnerable to flashes. + - tweak: Unathi have less brute resist, but some burn resist. + - tweak: Unathi gender is now unclear to non-Unathi. +2017-03-30: + Anewbe: + - tweak: Italics in chat are now trigged with | , rather than / . + - rscadd: Energy weapons, flashlights, stunbatons, and welders can now be moved + from hand to hand by click+dragging. + - rscadd: Flashlights can now be placed in wall rechargers. + - rscadd: Adds jumper cables, that act a bit like a defib for FBPs. + - bugfix: Bicaridine and Myelamine should now properly repair internal bleeding. + - rscadd: Overdoses are now more dangerous. + - rscadd: Chloral Hydrate overdoses are now even more dangerous. + Arokha: + - rscadd: Adds body markings and tattoos. + MagmaRam: + - bugfix: Borgs and assorted robits can now use grinders in chemistry and the kitchen. +2017-03-31: + Anewbe: + - rscadd: Added a number of crates to cargo. + - rscadd: Added the electric welder as a hidden autolathe recipe. + - rscadd: Added a few colored (in sprite, not in color) flashlights, to the loadout. + Sprites c/o Schnayy. + - rscadd: Maps in a pair of jumper cable kits. Use these to revive FBPs. +2017-04-08: + Anewbe: + - rscadd: Aprons now have pockets. + - bugfix: Automute shouldn't trigger if you don't type anything. + - rscadd: Adds the Chief of Security alt title for the HoS. + - rscadd: Wooden circlets can now be worn on the head. + - tweak: Package bombs now beep when activated, and have a delay before exploding. + - tweak: Package bombs are more expensive. + - tweak: Robolimbs can take a bit more damage before they start malfunctioning. + - tweak: Shrieking now decloaks changelings. + - rscadd: Drying yourself off with a towel should actually dry you off a bit now. + Arokha: + - tweak: Simple animals resist out of buckles and lockers + - tweak: Simple animals with retaliate but not hostile assist each other better + if they also have cooperative + - tweak: E-nets now are resist-out-of (or clickable) by the one inside or outside, + rather than having HP, and can be dragged around + Atermonera: + - rscadd: FBPs can now have numbers in their name. The first character cannot be + a number. + - rscadd: Common simple animals now have their own language, and as such are no + longer understandable by humans. + - bugfix: Translators can't understand the same languages that recorders can't, + including the new animal languages. + Leshana: + - rscadd: Upgrades the automatic pipe layer to modernize its code and make it constructable! + Constructs and deconstruts like other machines now. Circuits are buildable in + the autolathe. Uses steel to make pipes. + Magmaram: + - bugfix: Splints will now show up in examine text on hands and feet as well as + arms and legs. + Sin4: + - bugfix: Fixed back icons for Z8 Carbine, C20r, fireaxe, spear, and baseball bat. + - rscadd: If observing before roundstart, you may respawn. +2017-04-12: + Anewbe: + - rscadd: Material weapons now go dull instead of shattering. Certain weapons, like + spears, will still shatter. + - rscadd: Dull weapons do less damage, but can be sharpened with a whetstone. + - rscadd: Whetstones can be crafted using plasteel. + Belsima: + - tweak: Replaces cypherkey sprites with improved ones. + Sin4: + - bugfix: You can no longer ascend a table by walking from a flipped table to a + non-flipped one. +2017-04-16: + Anewbe: + - rscadd: Bartenders now spawn with their shotgun permit. Click on it in hand to + name it. + - experiment: Lessens the bloodloss from severe burn damage. + - rscadd: Hardhats now give some ear protection. + - rscdel: Hardhats can no longer fit in pockets. + LorenLuke: + - rscadd: Allows removal of PDA ID with alt-click. + Yosh: + - tweak: Scrubbers now scrub Phoron by default. + - tweak: Scrubbers now have the first dangerzone at anything more than 0 Phoron. + - bugfix: No longer will you attack Alarms with your ID when trying to unlock them. +2017-04-19: + Anewbe: + - rscadd: Unathi ribcages now reach down to their lower torso. + - rscadd: Unathi no longer have appendices or kidneys, the function of the kidneys + is now a function of their liver. + - rscadd: Unathi are more slightly more difficult to damage. + - rscadd: Unathi now process medicine 15% slower. Additionally, it's harder for + them to get drunk. + - rscadd: Unathi age range is now 32 to 260. + - rscadd: Unathi are not as slowed by heavy items. + Atermonera: + - bugfix: Translators no longer try to translate null languages. + LorenLuke: + - rscadd: Allows Blast doors to be attacked and broken like regular airlocks. + - tweak: Changelings can bank up to a maximum of 3 respecs at one time. + - tweak: Changelings begin with 2 respecs. + - tweak: Firing a silenced weapon gives a message in text to the user. + MagmaRam: + - rscadd: Added instructions on how to use the changelog updating scripts. + - tweak: Updated in-game EVA manual. + Neerti: + - rscadd: Adds makeshift armor for the head and chest regions. How protective they + are depends on the material used to craft it. The helmet is made by using wirecutters + on a bucket, then using a stack of material. The chestpiece is made by crafting + two armor plate, using wires on one of them, then hiting one with the other. + Yoshax: + - bugfix: Water such as the pool will no longer apply fire stacks when you enter, + meaning you will no longer be flammable from swimming. +2017-04-25: + Anewbe: + - rscadd: Cultist armor now has better protection from strange energies. + - rscadd: Adds the ion pistol to the uplink. + - tweak: The ion pistol can now be holstered. + - bugfix: Sprites on the smoking pipes should be fixed. + Atermonera: + - rscadd: Brain type (Organic, cyborg, posi, or drone) is now displayed in all records. + Belsima: + - tweak: Changes relaymove() code in bodybags. + - bugfix: Above tweak used to allow exiting bodybag while in closed morgue tray. + Leshana: + - rscadd: Implements footstep sound system and adds sounds to various floor types + including plating, tiles, wood, and carpet. + LorenLuke: + - bugfix: Allows people who are bucked to give/receive items. + - tweak: Can click-drag people onto chairs/beds from 1 tile away to buckle them. + - tweak: Allows you to place tape masks/restraints back on the roll (roll is still + infinite). + - bugfix: Fixes ventcrawling for spiderbots/implants/etc. + Neerti: + - rscadd: Drones will now spawn with an EIO-mandated ID card alongside their NT + ID. + - tweak: Fabricate Clothing for Changelings costs one point instead of two, and + is fabricated twice as fast. + - tweak: Dead changelings can no longer hear deadchat or freely ghost. + - tweak: Shrieks now share a 10 second cooldown. + - tweak: Lings cannot transform or shriek inside containers such as closets and + pipes. + - tweak: Regen. Stasis timer adjusted to be between 2 to 4 minutes. + - tweak: Visible Camo. should end if the user is stunned. + - rscadd: Visible Camo. now blocks AI tracking when active. + - rscdel: Recursive Visible Camo. no longer gives true invis. + - rscadd: Recursive Visible Camo. will allow the changeling to run while cloaked + instead. + - rscadd: Ling chemical meter on HUD now has a blinking exclaimation mark if below + 20 chemicals, to warn that they cannot revive if they should die while still + below 20. + Yoshax: + - tweak: Tape color is different now. Security tape is red rather than yellow, Engineering + tape remains yellow and Atmos tape is a lighter cyan rather than blue. +2017-05-05: + Anewbe: + - rscadd: Adds a cup for dice games, in the loadout. + - rscadd: Thermals now let you see in the dark. + Arokha: + - rscadd: Sleepers now have a 'stasis' level setting, that will ignore varying numbers + of life() ticks on the patient. + - tweak: Stasis bags and Ody sleepers now use a fixed level of this new stasis system + (ignore 2/3 life ticks). + - tweak: You can escape from being asleep in a sleeper, similar to escaping from + a cryotube. + - rscadd: You can now use grabs on sleepers to insert patients, same as scanners. + Datraen: + - bugfix: Xenobiological traits are made unique on each mutate, avoiding mutating + other mobs with same trait data. + Leshana: + - bugfix: Resetting a fire alert will no longer open firedoors if atmos alert is + in effect and vice versa + LorenLuke: + - Bugfix: Unfucks the screen bug on roundstart changelings. + - bugfix: Changeling now display 'alive' status on Medhuds properly. + - tweak: Refactors changeling ranged stings not passing over tables. Can now pass + over tables, any machinery (except doors), machine frames, and past closet subtypes. + - bugfix: You can now view an active video call by using the communicator in hand. + - tweak: Guns on harm intent in aim mode will target, rather than shoot pointblank + on first click. + - bugfix: You can now put handcuffs on yourself. +2017-05-09: + Anewbe: + - rscadd: Ports but does not enable Bay's MultiZAS. + Leshana: + - tweak: Optimized (but still not enabled) multi-z ZAS + - rscadd: Multi-Z explosion transfer coefficient is now configurable + N3X15: + - tweak: Flashlights on the high setting are no longer Beacons of Gondor. + Neerti: + - tweak: Tesla armor now retaliates against ranged attacks if within 3 tiles, and + recharges in 15 seconds, from 20. + - tweak: Technomancer Instability fades away slower. + - tweak: Fire and frost auras made more potent. + - rscadd: Gambit can now give rare spells unobtainable by other means, based on + spell power. + - tweak: Mend Wounds and Mend Burns combined into Mend Life. Mend Metal and Mend + Wires combined into Mend Synthetic. + - rscadd: Adds Lesser Chain Lightning, a more spammable version, but weaker. + - rscadd: Adds Destabilize, which makes an area glow with instability for 20 seconds. + - rscadd: Adds Ionic Bolt, which ruins the lives of synthetics. + - tweak: Oxygenate made cheaper. + SiegDerMaus: + - rscadd: Adds one new haircut, a chin-length bob. + Yosh: + - rscadd: Ports a bunch of hair from Bay. Knock yourself out. +2017-08-20: + Anewbe: + - tweak: The names of 5.56 and 7.62 ammo have been swapped, as have the guns that + use them. The magazines should look the same, and the guns will do the same + damage they used to do. + Atermonera: + - bugfix: Borgs can now raise an evil army of slimes + Belsima: + - rscadd: Added a lot of new lore-friendly drinks. + - spellcheck: Adjusted the descriptions of some drinks. + - rscadd: Added fingerless gloves to the loadout. + - imageadd: Added several new robot icons. + - imageadd: Added animations to some robots. + - bugfix: Fixed Usagi's eyes not turning off when dead. + - rscadd: Added several new pAI sprites. + - rscadd: Added a load of sweaters to the accessories tab of the loadout. + - rscadd: Added a new swimsuit to the pool. + Cirra: + - rscadd: Added a unified radiation system. Radiation is lessened by obstacles, + and distance. + - rscadd: Added a geiger counter for measuring radiation levels, which can be found + in certain vending machines and radiation closets. + Leshana: + - tweak: During the gravity failure event, you can now buckle yourself to a chair + to prevent falling when gravity returns. + - rscadd: Added an admin verb to debug the map datum. + - rscadd: Added nanomap capability to the Power Monitoring Computer + - rscadd: Added nanomap capability to the Atmos Control Computer + - tweak: Expanded nanomap on Camera Console to all station z-levels by default. + - tweak: Crew Monitoring nanomap will support crew monitors built on other station + map z levels. + - imageadd: Updated z1 nanomap for Northern Star + - imageadd: Generated z5 nanomap for Northern Star + - tweak: Optimized the unified radiation system. Made the radiation cutoff level + configurable. + - bugfix: Standing still won't save you from radiation storms. + - bugfix: Bedsheets can be put into washing machines again. + LorenLuke: + - imageadd: Ghosts can now choose from a number of animal sprites. + - experiment: Gives IECs some TLC (see below). + - rscadd: Adds 'Separator' circuit, allowing the player to now divide strings. + - rscadd: Adds 'grenade' circuit, allowing the player to detonate a stored grenade + in an assembly. + - rscadd: Adds 'device' electronic assembly, allowing an 'assembly'-type (signaler/igniter) + circuit to be used to interact with others. + - tweak: Modifies some storage and complexity constants. + - tweak: Adds 'size' variable for manual setting. + - tweak: No longer requires screwdriver to remove components. + - tweak: Enables multitool to wire/debug circuits with lesser functionality (can + disable via variable). + - tweak: IECs no longer drown the player in windows, each assembly always uses only + one window. + - tweak: Added functionality to UI to help with user experience of above point. + - rscadd: Adds 'on set' output pulses to multiplexer and memory circuits. + - bugfix: Fixes multiplexer and memory circuits not pushing data to attached circuits. + - bugfix: Number to string converts null inputs as '0' due to engine limitations + (at least they work). + - bugfix: Gun manipulator circuit now functions properly (and can read '0' value + inputs). + - wip: Phase 1/2 for wiring rework. + MagmaRam: + - tweak: Nerfed health regeneration, especially on bruises. + Nalarac: + - tweak: Modifies the illegal equipment module for borgs to scrambled equipment + module that only activates the special items and doesn't actually emag the borg + - bugfix: Mining cyborg diamond drill is now obtainable in a more sensible manner + - tweak: Click dragging has been added to the cryogenics tubes, cloning pod, and + all methods of cryostorage + - tweak: Some quality of life changes for research, crisis, surgeon, and service + cyborgs + - bugfix: Jumper cables readded + - tweak: Construction cyborgs merged back with engineering cyborgs + PrismaticGynoid: + - tweak: Replaces intelliCards with intelliCores. + - rscadd: Wheelchairs can now be collapsed like rollerbeds for ease of storage and + movement. Too big to put in backpacks though. + - rscadd: Wheelchairs are now available in a color-customizable form via the loadout, + under utility. Now you can ride in style, and keep your feet too. + - bugfix: Wheelchair users can now enter the gateway and residential elevator without + being forced to leave behind their mobility aid. + Sarmie: + - bugfix: Dionaea have remembered how to regrow their limbs properly. +2017-08-26: + Belsima: + - imageadd: Replaced APC sprites with better shaded ones. + - tweak: Adjusted some atmos sprites for visibility. + - soundadd: Added cough and sneeze noises for Teshari. + - tweak: Turning on flashlights and locking lockers both make a click sound. + - imageadd: Replaced soda cans with new soda cans. + - rscadd: Added a tiedye shirt. + MagmaRam: + - bugfix: Tesla relays no longer draw power when their attached power cell is full. +2017-09-24: + Belsima: + - imageadd: Replaced air tank sprites. + - imageadd: Added new xeno weed, egg, and resin sprites. + - imageadd: Added two new bar sign sprites. + - imageadd: Replaced blast door sprites. + - spellcheck: Microwave is no longer a proper noun. + - rscadd: Added croissants to the available recipes. + - imageadd: Added new status displays for the AI. + - spellcheck: Made spelling of corporations and planets more consistent. + - rscadd: Added more planets to character setup. + - imageadd: Added a bunch of new hairstyles. + - imageadd: Added a new holographic hud. + - maptweak: Added a grinder and enzyme to the abandoned bar, for illicit operations. + - imageadd: Replaced solar panel sprites. + - imageadd: Replaced shield generator sprites with ones from the Eris. + - rscadd: Added Qerr-quem and Talum-quem, a pair of Skrellian drugs. + - soundadd: Added a variety of sounds for opening cans, explosions, sparks, falling + down, mechs, and bullet casings. + - soundadd: Added a new death sound for mice. + - imageadd: Vox have been entirely resprited. + - rscadd: Added wood buckets, craftable with hydropnoics. + - soundadd: Added sounds for chopping wood. + - bugfix: Fixed a bug that would make default Zippo lighters invisible. + Chaoko99: + - rscadd: Nitrous Oxide is now an oxidizer. + - rscdel: 'Removed all instances of Volatile Fuel ever being simulated. To devs: + It still exists. Please, for the love of god, only use it with assume_gas.' + Cyantime: + - tweak: Tabling now requires a completed aggressive grab. + Nalarac: + - tweak: Removes the module restraint for the cyborg jetpack upgrade + - rscadd: Added the hand drill and jaws of life to the protolathe + - tweak: Syndicate toolbox now comes with power tools + Neerti: + - wip: Adds the Lost Drone, which can be found on the Surface of the future map. + - rscadd: You can now modify an unslaved borg's laws by hitting it with a law module, + after a significant delay. + - rscadd: Adds several new lawsets. Currently there are no lawboards for these. + - rscadd: Adds new 'shocker' baton, for the Lost Drone. + - tweak: Combat borg shields are now easier to use, only requiring that they sit + on one of your hands and not your active hand. The shield is also more energy + efficent. + PrismaticGynoid: + - tweak: You now keep your languages when removed from/transplanted into a body. + - tweak: AIs and borgs load languages from preferences when spawning. + - bugfix: Fixed sign language being usable while lacking both hands. + - rscdel: Brains are no longer able to hear binary (robot talk). + - rscadd: Adds the ability for research to print drone brains. + - tweak: Makes all MMIs, posibrains, and drone brains radio-enabled. Anyone holding + the brain can also disable the radio for antag purposes. + SpadesNeil: + - tweak: Windows can no longer be damaged by very weak attacks. + Woodrat: + - tweak: Ported floor types and floor sprites (Techfloors) from Vorestation (who + ported them from Eris). Brought our floortypes in line with how Vorestation + has theirs set up. + - bugfix: Missing Techfloor floor tile sprites added. + - wip: Floor sprites from Vorestation not yet ported. To be done once we go to the + new map. + - maptweak: Added catwalks and railings to SC station. Fixed first Z-level. + - rscadd: Added the ability to make catwalks and railings as ported from vore. + - tweak: Cable heavy duty file tweaks to remove red overlay color from them. + - tweak: Added in a color icon for centcomm beach areas. + - maptweak: Fixed issues with SC centcomm z that prevented it from loading. + - maptweak: Rework of xenobio/xenoflora outpost on SC planetside main map. + - rscadd: Added Wilderness z-level for SC, teleportation transition to it may be + bugged. + - rscadd: Cable ender file added. Allows power transfer between z-levels. + - tweak: Southern cross files for areas and defines in relation to z-level work. +2017-11-06: + Atermonera: + - bugfix: AI's can speak local rootspeak. + - rscadd: Implements Virtual Reality. + Woodrat: + - rscadd: Added 'see down' in open spaces from Vore. + - rscadd: Added talking and visible messages upward through open space from Vore. + - rscadd: Added a Syndicate ID with all access (admin spawn only). + - tweak: Port of 'Syndicate id cards now listen for owner destruction' from Bay. +2017-11-29: + Anewbe: + - rscadd: FBPs are now affected by Radiation, it gives them ToxLoss. Wear your PPE. + - rscadd: FBPs can have ToxLoss decreased by going into a charger. + - rscadd: It is now possible to move FBPs and robots into chargers, via click+drag + or grabs. + Atermonera: + - bugfix: AI verbs are no longer hidden on the tabs. + - bugfix: Incapacitated mobs can no longer open your inventory and steal your gubbins. + MoondancerPony: + - bugfix: Fixed a mislabeled pulse pin on the microphone. + - bugfix: Fixed an issue with reference pins and multiplexers, and reference pins + in general. + PrismaticGynoid: + - tweak: Adjusts the amount of camera locations the AI can store from 10 to 30. +2018-01-12: + Atermonera: + - rscadd: Communicators now have a weather app. + - rscadd: Mobs in VR can switch between translucent and opaque forms. + Leshana: + - tweak: Examining construction frames shows which circuit board (if any) is installed. + - tweak: Convert the machinery controller to a StonedMC subsystem + MrStonedOne: + - rscadd: Added admin verb 'Display del() Log' displaying garabage collector statistics. + PrismaticGynoid: + - rscadd: Adds the ability to 'crawl' to an adjacent turf by click-dragging yourself + to it, after a delay. This can be used to move while unable to stand. You can + also do this with other movable objects, if you really wanted to. + - tweak: Conscious mobs lying on the ground can now buckle themselves to chairs/beds. + This includes people missing legs. +2018-01-25: + Anewbe: + - rscadd: Southern Cross Map is now live + Arokha: + - tweak: Remove borg hud items as they have normal huds as their sensor augs now, + and can see records with them. + Atermonera: + - rscadd: Communicators have a flashlight under the settings menu, functions as + the PDA one + - rscadd: Station-bound synthetics now have gps units + Cerebulon: + - rscadd: Added 19 food recipes from /tg/station + Leshana: + - soundadd: Sounds of Tesla engine lighting bolts + - imageadd: Sprites for grounding rod and Tesla coil + - imageadd: Sprites for lighting bolts + - rscadd: The Tesla Engine, Tesla Coils, and Grounding Rods + - rscadd: Wiki search URL is now configurable in config.txt + - rscadd: Breaker boxes can be constructed in game. + - bugfix: Construction of heat exchange pipes, vents, and scrubbers now works properly + again. + - tweak: Fix singularity energy balance so it is stable under normal operation. + - bugfix: Fix emitter beams and PA effects from being grav pulled or consumed. + - rscadd: Added the operating manual book for the Tesla Engine. + Mechoid: + - rscadd: Brains can be set to be a source of genetic information. + - rscadd: Promethean cores can be inserted into a cloning scanner to be cloned. + This gives them a worse modifier upon completion. + - rscadd: Promethean cores can now have chemicals added or removed from them. Base + for future slime cloner. + - rscadd: Species-based cloning sicknesses possible. + - spellcheck: Cyboernetic - > Cybernetic + Neerti: + - rscadd: Adds boats that can be ridden by multiple people, which use oars. Can + be crafted with large amounts of wooden planks. + - rscadd: Adds autopilot functionality to Southern Cross Shuttle One and Shuttle + Two. + - rscadd: Adds ability to rename certain shuttles on the Southern Cross. + - rscadd: Areas about to be occupied by a shuttle will display a visual warning, + of a bunch of circles growing over five seconds. + SunnyDaff: + - rscadd: Added new food items. + - rscadd: Added Cider. + - rscadd: Added Apple Juice to bar vending machine. + - bugfix: Fixed Vodka recipe. + - bugfix: Fixed Apple and Carrot cake recipes + - tweak: Changed Cake recipes to not include fruit juice + ZeroBits: + - rscadd: Added the ability to have multiple loadouts per character. + battlefieldCommander: + - rscadd: Adds a communicator watch, a variant of the communicator you can wear + on your wrist. + - rscadd: Replaces the communicator in the loadout with a communicator selection. + Choose either the traditional communicator, or the new commwatch. +2018-02-07: + Anewbe: + - tweak: Lessens the bomb, bio, and rad protection on the Explorer Suit. + - tweak: Replaces the Hunting Rifle cabinets with a Phase Pistol cabinet. Same general + purpose, shoot animals, kill animals. Shoot people, get laughed at. + - tweak: Gloves are generally less protective from shocks. + - tweak: Budget Insulated Gloves will almost always be better than any other non-insulated + glove. + - tweak: Hyposprays and autoinjectors now have a delay on use when the target is + conscious and not in Help Intent. + - bugfix: You need a parachute to survive atmospheric reentry. Closets, mechs, and + other impromptu parachutes will not longer prevent splatting. + Atermonera: + - tweak: ID computer can set command secretary and IAA access + - tweak: Command secretary has keycard auth. access + Cerebulon: + - rscadd: Added toggleable 'Open' sign to bar hallway so you can tell if it's open + without walking inside. + Mechoid: + - rscadd: Adds material girders. + - tweak: Girder decon time is now partially dependant on material. Stronger girders + take slightly longer. + - tweak: Wall girders are now under the integrity-based construction listing. Material-Name + Wall Girder. + - rscadd: Explosive-resistant girders in walls have a chance to survive as an unanchored + girder, if their wall is destroyed. + - rscadd: Radioactive girders affect the completed wall's radioactivity. + SunnyDaff: + - rscadd: Added new food items. + - rscadd: Added Onions. + - tweak: Changed Apple and Lemon Sprite +2018-02-10: + Atermonera: + - tweak: Ethylredoxrazine actively removes alcohol from the stomach and bloodstream + - tweak: GPS units won't report the exact location of other GPS units, just range + and approximate direction + - tweak: POI gps units won't give any information about the POI, merely its location + - rscadd: Adds EMP mines. + Cerebulon: + - rscadd: Adds antibiotic resistance chance to viruses, capped at 90% without admin + edits. + - rscadd: Adds adminspawned non-transmittable viruses + - rscadd: Adds several new disease symptoms + - tweak: Vomit is now a disease vector + - tweak: Viruses have a lower chance of curing themselves without medical intervention + - bugfix: Virus food no longer infinitely generates in incubator beakers + - bugfix: Xenomorphs and supernatural begins can no longer catch the flu + Hubblenaut: + - tweak: If a cycling airlock is already near the target pressure, pressing the + buttons will toggle the doors instead of making it reenter the cycle process. + Leshana and mustafakalash: + - rscadd: A new 'planetary' mode for airlocks which makes them purge the chamber + contents to the exterior atmosphere before filling with clean air, and vice + versa. + MistyLuminescence: + - tweak: Mines are now very, /very/ dangerous to step on (so don't do that). You + can disarm them with a multitool and wirecutters - ping is good, beep is bad + - or by shooting or exploding them from a distance. Be careful! + Woodrat: + - rscadd: Shaft Miner, Search & Rescue, Explorer can now select webbing vests and + pouches from the loadout. + - bugfix: Allow utility uniforms to roll up their sleeves. + - rscadd: Shuttle upgraded with enviroment sensors and shuttle doors that can be + detected from the shuttle console. + - rscadd: secure gun cabinets in the hangar control rooms. Locked to armory, explorer, + and pilot access. + - maptweak: Redesign of medical surgery rooms, replacement of the closets with wall + closets. + - bugfix: Multiple map bugfixes including distro and scrubber lines to deck 3. +2018-02-17: + Anewbe: + - rscadd: Added a random mine spawner, for use in PoIs. Replaces mines in PoIs with + the random spawner. + - rscadd: Mines now give a visible message when they go off. + - tweak: Land mines on the ground can no longer be told apart from one another, + to prevent gaming the system. + - bugfix: Hovering mobs (viscerators, drones, Poly, carp) no longer set off land + mines. + - tweak: Arming a land mine now takes concentration. If you move, it will boom. + - tweak: RINGS AND CERTAIN GLOVES INCREASE PUNCHING DAMAGE. + - tweak: BRASS KNUCKLES HAVE BEEN TURNED INTO GLOVES AND REBALANCED. THEY DO LESS + DAMAGE PER HIT BECAUSE IT'S HARD TO DISARM A PAIR OF GLOVES. + - rscadd: Cyborg Chargers now decrease radiation on FBPs. + - tweak: Falling one floor now does a lot less damage, on average. + - bugfix: Falling one floor in a Mech no longer hurts the occupant. + PrismaticGynoid: + - rscadd: A lot more machines can now be moved with a wrench, mostly kitchen, hydroponics, + and virology machines. + - tweak: Changed department ponchos to be open to any job, just like department + jackets. + Schnayy: + - rscadd: Adds bouquets. Can be ordered via 'gift crate' in cargo. + - rscadd: Adds fake bouquets for the cheap. Can currently be won from arcade machines. + - rscadd: Adds chocolate heart-shaped boxes. Can be ordered via 'gift crate' in + cargo. + - rscadd: Adds gift cards with four cover variations. Function like paper. Can be + ordered via 'gift crate' in cargo. + battlefieldCommander: + - rscadd: Added packed snow brick material. Craft it using snow piles. + - recadd: Added snow girders and igloo walls. Craft them using snow bricks. + - rscadd: Added various snowmen. Craft them using snow piles. Punch 'em to destroy. +2018-02-21: + Anewbe: + - rscadd: Headsets for jobs that spend a lot of time planetside can now function + as local radios when comms are down. + - rscadd: Most headsets now have on-mob sprites. + - rscadd: Added a Planetside Gun Permit item, specifying permission to possess a + firearm on the planet's surface. Explorers should spawn with these by default, + and a further two can be found in their gun locker. + - rscadd: Prometheans now react to water. Being soaked will stop their regen and + deal minor toxin damage. Drinking or being injected with water will deal slightly + more toxin damage. + - bugfix: Suit Coolers now properly cool FBPs in slightly burning rooms. If it gets + too hot for your suit, you're still dead. + Leshana: + - rscadd: Makes electrochromatic glass buildable and programmable in game. Use + cable and multitool. + Woodrat: + - rscadd: Additions of 6 new POIs for the cave area. +2018-02-22: + Anewbe: + - rscadd: Added Warden and HoS helmets. + - tweak: Clothing items must be click+dragged to be unequipped. A lot of them already + had this, but the system is now standardized. + - tweak: Accessories now apply slowdown to what they're attached to. + - tweak: Certain items, notably Technomancer spells, no longer show up when you + examine the mob wearing them. + - tweak: Flashbangs confuse, instead of stunning. + Atermonera: + - tweak: GPS units are generally more useful, providing both coordinate locations + and, so long as you're on the same Z level, direction with x-y component distances, + to 1m accuracy + - rscadd: Added a halogen counter tool, functions as the PDA function. + - tweak: Analyzers can now analyze gas containers, in addition to providing atmosphere + readouts, as the PDA gas scanner function. + - rscadd: Added umbrellas. + battlefieldCommander: + - rscadd: Added fireplaces which operate similarly to bonfires. + - bugfix: Fixed an oversight that allowed for an in-between state in bonfires where + the fire would mysteriously go out after adding wood. + - rscadd: Added blue sifwood floor tiles. + - bugfix: Fixed blue carpet, now known as teal carpet + - rscadd: Added the ability to dig up tree stumps with a shovel. +2018-02-25: + Anewbe: + - tweak: Splinted bodyparts act broken 30% of the time. + - tweak: Splinted legs still slow you down like broken ones. + Leshana: + - rscadd: Added a client preference setting for wether Hotkeys Mode should be enabled + or disabled by default. + - bugfix: CTRL+NUMPAD8 while playing a robot won't runtime anymore. + - tweak: Grounding rods act intuitively, only having an expanded lighting catch + area when anchored. + Nerezza: + - bugfix: Fixes not being able to install the different carpet colors. Finally. + - bugfix: Removes certain unusable duplicate stacks of tiles from the code. + Schnayy: + - rscadd: Added Gilthari Luxury Champagne. Drink responsibly. + - rscadd: Added a singular AlliCo Baubles and Confectionaries vending machine in + the locker rooms. Dispenses a variety of gifts. + - rscdel: Removed hot drinks vendor from locker room. +2018-02-28: + Atermonera: + - rscadd: Adds umbrellas to the loadout, for 3 points. Colorable! + Nerezza: + - bugfix: Using tape (police/medical/engineering) on a hazard shutter now tapes + the hazard shutter instead of trying to open the hazard shutter. + - rscadd: Added /tg/-style floor tile swapping. Equip crowbar/screwdriver in offhand + and click the floor tiles you want to directly swap with a stack of new floor + tiles (like teal carpet). + Woodrat: + - maptweak: Heavy rework of the wilderness, minor adjustments to mining and outpost + z-levels. To get to the wilderness you now have to travel through the mine z-level + to do so, follow the green flagged path. Through the mine. + - tweak: Shuttles can now land at a site near the enterance to the wilderness. Removal + of the mine shuttle landing pad to move to the wilderness. + - rscadd: New addition of warning sign, thanks to Schnayy. + battlefieldCommander: + - rscadd: Added craftable joints. Dry something (ideally ambrosia) on the drying + rack and apply it to a rolling paper to create a joint you can smoke. + - rscadd: Added a box of rolling papers to the cigarette vending machine. +2018-03-05: + Anewbe: + - rscdel: Removes Command Liaison, Bridge Secretary, Hydroponicist, Prospector, + Sanitation Technician, Professor, and Historian alt-titles. + - rscdel: Removed universal translators from the loadout. + - rscadd: RnD can print earpiece translators. + Mechoid: + - rscadd: Add a surgical operation for repairing the brainstem of a decapitated + individual. + - rscadd: Add a permanent modifier for frankensteining individuals. + Nerezza: + - rscadd: Package bomb detonators can be re-bound by hitting the new package bomb + with them. + PrismaticGynoid: + - bugfix: The succumb verb will now work on species that can't take oxyloss damage. +2018-03-15: + Anewbe: + - tweak: Pills and ingested reagents actually process at half speed, rather than + just ignoring half of the reagents. + - rscdel: Robotic limbs now need internal repair at 30 composite damage, rather + than 30 of burn or brute. + - tweak: Syringes now inject their entire payload with one click, but in 5 unit + increments. There is a delay in between each of these. + - rscadd: Assisted robotic organs (internals, eyes) are less vulnerable to EMP. + - rscdel: Lifelike robotic organs (currently VeyMed) are more vulnerable to EMP. + Cerebulon: + - rscadd: Added Akhani language for Tajaran. + - spellcheck: Fixed incorrect singular form of Tajaran in several places. + MisterLayne: + - rscadd: Added a version of the ED-209 called the ED-CLN. It is a more efficient + Cleanbot. + - bugfix: Reinforced snowballs can now actually be made in a reasonable time limit. + Nerezza: + - tweak: Broken APCs can be bashed open with slightly smaller objects now. This + means wrenches are acceptable, no need to hunt down a fire extinguisher. + - rscdel: EVA rigsuit/hardsuit no longer holds toolboxes in suit storage since those + have been a volume inventory for some time now. RIP ghetto satchel. + - rsctweak: CE's rigsuit/hardsuit no longer holds pickaxes and ore satchels, but + can now hold inflateables. + - bugfix: Retracting rigsuit/hardsuit helmets with no valid mask equipped now disables + internals. + - bugfix: Offline rigsuits/hardsuits are no longer considered valid air supplies + by the internals button. Before, your internals would instantly shut off before + you could get a breath out of the rigsuit. Now, the internals button will look + for a different tank instead. + - rscadd: Tajaran now get to keep their tails when they wear the EVA, RD, or Industrial + rigsuits/hardsuits. Unathi sprites to come soon! + - bugfix: Sifwood floor tiles now correctly use their double-stacked icon instead + of disappearing. + Woodrat: + - rscadd: Added in a weapons crate for explorers that has bolt action rifles. + - rscadd: Weapon powercells can be ordered from cargo (security access crate). + - tweak: Automatic weapons crate split into two crates now. One for SMGs one for + the rifle. Minor adjustments to other munitions and security supply packs as + well. + - rscadd: The automatic weapons ammo crate has also been split. + - tweak: Names of the crates for the munitions and security catogory supply packs + have been adjusted slightly. In certain places contents also adjusted. + - bugfix: Holoplant now comes in a crate. +2018-04-01: + Anewbe: + - tweak: Medical Doctors and EMTs spawn with white medkits. + Cameron653: + - rscadd: Adds a xenoarch excavation tool, craftable in R&D. Allows depth selection + of 1-30 + - rscadd: Adds a xenoarch multitool, craftable in R&D. Has xenoarch counter, measure + tool, and depth scanner all in one. + Heroman3003: + - bugfix: Attaching exosuit equipment with a gripper correctly removes it from the + gripper. + - bugfix: Engineering gripper can no longer duplicate frame parts. + MistyLuminescence: + - tweak: Wallets can now hold a wider variety of objects. + Woodrat: + - rscadd: Added two 44 cal revolvers. + - rscadd: Added 44 cal speedloader for revolvers. + - rscadd: Added 44 cal rubber rounds. + - bugfix: Fixed the icon_state for 'structure/plushie/carp' and the random first + aid kit spawner. + - rscadd: Added a random chance tool spawn for power tools (most of the time it + should still just be regular tools). + - tweak: Adjusted the spawn rate of medkits, combat medkits should be more rare. + - tweak: Cash split into its own loot item. + - tweak: Plushies split into large and small plushies. + - rscadd: All the extra plushie spawns added to the random plushie spawn. + - tweak: Eightball and conch shell added to toy spawns. + - rscadd: Added spawn points for the large plushies, cash, and the power tools to + the station. + battlefieldCommander: + - rscadd: Added permanent markers, an alternative to crayons. + - tweak: The chemistry recipe for paint now uses marker ink instead of crayon dust. + - rscdel: Removed crayon boxes from the map. They can still be ordered from cargo + in case you need a snack. +2018-04-19: + Anewbe: + - rscdel: AOOC is no longer available to traitors, renegades, and thugs. + Woodrat: + - bugfix: Flashers in brig cells should work now, extra floor flash in communal + brig to deal with crims. + - bugfix: Improper access, SMES rooms. + - bugfix: Trader start point is no longer dark. + - rscadd: Medical Vendor Plus has more advanced burn and trauma kits. + - tweak: Cell 1 and 2 in the brig can now be accessed by detectives. + - tweak: Additional r-walls next to the engine room to help with rads. + - tweak: Floor decals in a couple areas. + - tweak: RD office now has its telescreen back. + lorwp: + - bugfix: Pilot headsets can now fallback to shortwave radio +2018-04-28: + Anewbe: + - tweak: Communicator visibility (the thing that lets people see your communicator + when you're a ghost) is now saved to character slots, rather than globally. + - tweak: Jobs that are set to Never on your preferences are hidden by default on + the Late Join selection menu. There is a button to reveal them. + Arokha: + - bugfix: Nerve reattaching surgery now works correctly. (Hemostat on limb) + - bugfix: Limbs dropped by people have appropriate flags. + Atermonera: + - tweak: Human examine code has received a major refactor. If you encounter unusual + behaviour that seems wrong, please report it. + Cerebulon: + - bugfix: Pumpkins are no longer green ovals. They now grow on actual vines. + schnayy: + - bugfix: Space carp plushies now load sprites and are all selectable from loadout. + - tweak: Adds several newer plushies to the gift vendor as well as adjusting cost + of gift vendor's contents. +2018-05-01: + Mechoid: + - tweak: Skrell can be affected by flashbangs from a range of 8 tiles without protection. + - tweak: Promethean regen consumes additional nutrition. + - tweak: Many healing chemicals are less effective on Prometheans due to the natural + regeneration. + - tweak: Lots of other Promethean tweaks. No seriously, I'm not putting the list + here. + PrismaticGynoid: + - rscadd: Adds new skrell sprites to hardsuit helmets that were missing them. +2018-05-24: + Anewbe: + - bugfix: Moving items out of one's active hand cancels any zoom-in they may be + providing. + - tweak: Meteor events should be a lot less brutal. + Arokha: + - rscadd: Added a 'Client FPS' setting in the Global tab of character setup for + adjusting the FPS to your preference. + - rscadd: Added a 'fake SSAO' toggle to Global in character setup, ported from /tg/. + Looks like drop shadows on (almost) everything. + Atermonera: + - bugfix: Laptops no longer consume IDs indefinitely. + Mechoid: + - rsctweak: Promethean limbs store more damage. + - rsctweak: Promethean limbs, in addition to normal severing rules, have a higher + chance to be splattered or ashed once they reach maximum damage. + - rscadd: Limbs can now spread their damage to neighbors with the spread_dam var, + when reaching max damage. + PrismaticGynoid: + - rscadd: Added laser pointers. Available in your loadout, and printed and upgraded + by R&D. + lorwp: + - tweak: Search and Rescue can now add certain medical restricted items to their + loadouts +2018-06-08: + Anewbe: + - tweak: Merc mobs in PoIs no longer drop gear. This is to help us balance the PoIs + that contain them, and by extension every other PoI. + - tweak: Merc mobs have been shuffled around in their PoIs. At some point, this + may actually be randomized, but for now, expect slightly different placements. + - rscadd: Adds a laser rifle and ion rifle version of the Merc mob, for variety. + - tweak: PoI turrets are lethal again, and will likely shoot crawlers. + - rscadd: Certain mobs, namely robots and mercs, now have some amount of armor. + - rscadd: Ranged mercs will now knife people when cornered, rather than punch them + really hard. + Mechoid: + - rscadd: Added some background things for Events. + - bugfix: Ion rifles hit the correct 3x3 instead of 5x5 + - rscadd: Seed Storage Vendors are now hackable. Can choose from various lists of + concerning plants. +2018-06-21: + Anewbe: + - rscadd: Added a biomass reagent, made from protein, sugar, and phoron. + - tweak: Cloners and bioprinters now use the biomass reagent. Both can be refilled + or have their capacity increased by replacing the bottles they spawn with. + - experiment: Mapped in a bioprinter, for further testing. + - rscadd: Adds the ability to make robolimb brands more or less vulnerable to brute + or burn. + - rscdel: Makes VeyMed limbs more vulnerable to brute and burn. + Mechoid: + - rscadd: Allow AIs to create and take control of mindless drones from fabricators. +2018-07-12: + Anewbe: + - bugfix: Technomancer Apportation now properly checks for range and scepter, again. +2018-07-14: + Anewbe: + - tweak: Certain languages now require assistance for a species to speak, but not + understand, much like EAL. + - tweak: Alai can only be `spoken` by Taj and Teshari. + - rscadd: Adds a voicebox/larynx organ. Its only purpose at the moment is to assist + in speaking certain langauges. + - tweak: Language implants, like the EAL implant, now affect the voicebox organ, + instead of being a freefloating implant. + - rscadd: Adds a language implant for Common Skrellian. + Atermonera: + - rscadd: Steel sheets can be used to construct Roofing Tiles + - rscadd: Roofing tiles can be used on tiles under open spaces or space tiles in + multiZ maps to place a lattice and plating on the space above + - rscadd: Roofing tiles can be used on outdoor turfs to make them indoors + - rscadd: Both functions work together on multiZ maps with outdoor turfs, only one + roofing tile is used per tile roofed. + Mechoid: + - rscadd: Adds a new surgical procedure for fixing brute and burn on limbs. +2018-08-01: + KasparoVv: + - rscadd: You can now change the order of your body markings at character creation. + Shift markings up or down layers at will to design the character you've always + wanted, more easily than ever before. + Mechoid: + - rscadd: Added the Gigaphone. Currently unused. + Mewchild: + - rscadd: Ports several AI core sprites from ages and places past + PrismaticGynoid: + - rscadd: Adds four types of colorblindness to the traits in the setup menu. + - tweak: pAIs can now be picked up while unfolded, and can display more than 9 emotions. +2018-08-08: + Atermonera: + - rscadd: The supply controller has been refactored and shifted to nanoUI. + - rscadd: The ordering and control consoles are now generally upgraded in terms + of information and options. + Mechoid: + - rsctweak: Hallucinations are no longer only Pun Pun. + Neerti: + - soundadd: Adds new ambience sounds for various areas, especially on the surface + of Sif. + - sounddel: Removes low and high-pitched droning from available ambience. Consider + trying ambience again if you had turned it off to avoid those. +2018-08-28: + Mechoid: + - rscadd: Mechs now have multiple equipment slot types, and more slots in total + for greater customization. + - rscadd: A large number of Mech weapon modules and their jury rigged versions. +2018-09-22: + Mechoid: + - rscadd: Adds two vehicles to Robotics and Cargo, the Quad and Spacebike. + Poojawa: + - rscadd: Ported /vg/ instrument code, improved the UI of instruments. + - rscadd: Added a client side pref that mutes instruments being played for you. + Woodrat: + - rscadd: Adds two rig suits. Military Rig suit from Bay and PMC rigsuit + - rscadd: Adds four exploration and pilot voidsuits (alternate sprites by Naidh) + - rscadd: Adds exploration and pilot voidsuits +2019-02-14: + Buffalowing: + - rscadd: Revived the changelog system. If your derelict changelog was not added, + press F in the chat. + - tweak: Improved simple mob interactions + - tweak: Added consequences for spamming *awoo and *nya + Chaoko99: + - rscadd: Prometheans can now wear underwear. + Hubblenaut: + - tweak: If a cycling airlock is already near the target pressure, pressing the + buttons will toggle the doors instead of making it reenter the cycle process. + KasparoVv: + - rscadd: You can now change the order of your body markings at character creation + with the push of a button. Shift markings up or down layers at will to design + the character you've always wanted, more easily than ever before. + KasparoVy: + - rscadd: Hiding mobs are now revealed when grabbed, buckled and/or killed. + - rscadd: You cannot hide if you grab something, are grabbed yourself or are buckled. + - rscadd: Adds some fluff messages for when hiding mobs are revealed. + LBnesquik: + - rscadd: Remplaced the plant clippers with a reskinned pair of hedgetrimmers. + Lbnesquik: + - rscadd: 'General biogenerator improvements:' + - rscadd: Added feedback noise to the processing. + - rscadd: Allow for cream dispensing. + - rscadd: Allow for plant bag creation. + - rscadd: Allow for 5 units of meat to be dispensed at once. + - rscadd: Allow for 5 units of liquids to be dispensed at once totalling 50u. + - rscadd: Add and allow the creation of larger plant bags for easier ferrying of + plants.. + - rscadd: Add a description to the machine itself. + - bugfix: Fix a typo. + Leshana: + - rscadd: Enables round-to-round persistence of a few aspects of characters. More + accurately, it automates updating your character setup. None of this code does + anything you could not already do manually on the Character Setup screen, it + simply does it automatically for you. ALL of these changes are optional, toggled + on the VORE tab of character setup. + - rscadd: Your late-join spawn location is determined by which cryo/elevator/etc + you used to leave last time. Departing thru the elevators will set your spawn + location to elevators etc. + - rscadd: Your weight is saved (also any extra or deficient nutrition is resolved + into weight gain/loss) + - rscadd: Your limbs settings are updated based on your status at end of round (whether + limbs are normal, missing, robotic, etc) + - rscadd: Your markings are saved so they will be the same as when they were at + end of round. + - tweak: Replaced hard coded numbers for weight gain with constant defines. + - rscadd: Added admin verbs for debugging the scheduled process controllers. + Leshana and mustafakalash: + - rscadd: A new 'planetary' mode for airlocks which makes them purge the chamber + contents to the exterior atmosphere before filling with clean air, and vice + versa. + Mechoid: + - rscadd: Added a RIG customization kit. + - tweak: RIGs now use a var called suit_state to determine the basis for their component + icons, rather than the rig's icon state. + - rscadd: Added the Gigaphone. Currently unused in any PoIs or elsewhere. + - rscadd: Adds a new surgical procedure for fixing brute and burn on limbs. + - tweak: Prometheans are no longer murdered by blood, and instead process it like + a weak nutrient. Will slow the regeneration of toxins due to water content. + Mewchild: + - rscadd: Ports several AI core sprites from ages and places past + Neerti: + - rscadd: RCDs can now build grilles and windows, with a new mode. They can also + finish walls when used on girders on floor/wall mode. + - rscadd: Adds various new RCDs that are not obtainable at the moment. + PrismaticGynoid: + - tweak: pAIs can now be picked up while unfolded, and can display more than 9 emotions. + Woodrat: + - rscadd: Xenoflora and Xenobio Addition to station, first deck. + - bugfix: Minor bugfixes including mislabeled lockers in robotics and floor decals. + chaoko99: + - rscadd: "Added mapmerge PY to the \tools directory of the Vorestation repository." +2019-03-25: + buffalowing: + - tweak: Spamming emotes will now automatically kick the spammer. +2019-04-01: + Atermonera: + - bugfix: Stairs have been straightened and now connect to both the heavens and + hells, formerly just the hells. + Buffalowing: + - bugfix: Fixed books so they don't display broken wiki URLs + Mechoid: + - bugfix: Slimes now respect slime colors as their faction when dealing with other + slimes. + Novacat: + - tweak: All emergency tanks now spawn at full capacity. +2019-04-06: + Buffalowing: + - bugfix: Fixed an issue that prevented Terminus from being spoken. + - bugfix: Fixed an issue that caused silicate to make windows entirely transparent. + - bugfix: Synthetics now have a power cell meter instead of hunger icons. + - tweak: Sythetics can now walk in space for a brief amount of time without dying + immediately. + - tweak: Synthetics are no longer affected by pressure. Because they are synthetic. + - rscadd: Synthetics are now vulnerable to EMP blasts, and will react similarly + to regular silicons. + - bugfix: Fixed an issue that caused Synthetic eyes to be damaged by phoron. + - bugfix: Fixed universal translators displaying gibberish. + - bugfix: Fixed a bug that caused APC frames to generate infinite metal. +2019-04-11: + Buffalowing: + - rscadd: Slime people are now more defined in the codebase. + - rscadd: Added a new title screen. + - bugfix: Slime people will no longer suffer from a bug that permanently wounds + them via removing large embedded objects. + - tweak: Slime people will now instead be gravely wounded by objects that would've + otherwise embedded into them. +2019-04-19: + Buffalowing: + - rscadd: Human based bodies are no longer male only; women will have more feminine + shapes than men, etc. +2019-04-21: + Buffalowing: + - tweak: Lizards and solargrubs can now be held and interacted with similar to mice. + - tweak: Neck surgery is now slightly less deadly. + - bugfix: .45 pistols can now be stored in jackets that are capable of holding energy + guns. +2019-05-02: + Buffalowing: + - bugfix: Vehicles like cargo trolleys can no longer float on open space turfs. + - bugfix: Aliens will no longer rapid fire spit at you. + - bugfix: People should stop being struck by lightning simply from being near windows. + - bugfix: Thunder sounds are now ambient sounds, and thus, can be turned on or off + based on your preferences. + - tweak: Cyborgs now spawn with a super cell, as opposed to having to waste time + getting it swapped every. Single. Round. +2020-01-02: + Anonymous: + - rscadd: Depending on intent, robots are now can be petted or punched (without + damage). Grab intent should preform default actions. + - tweak: Species with "can_shred" tag will now have to be on harm intent to deal + damage to borgs. + BonniePandora: + - tweak: '"Say" and "Whisper" now have a cancel button on their pop-up box. "Me" + and "Subtle" also have this, in addition to being a multiline text box now instead + of the old single line one.' + Buffalowing: + - wip: Various changes to service hounds, with the potential to roll out similar + changes to others. + - rscadd: Service hound's rapid-service-fabricator now has more variety of options. + - rscadd: Cyborg Drink Synthesizer now has space spice. + - rscadd: Service hound now has a 'dog bag' to store various things that were in + their perview but could not. + - rscadd: Service gripper can now grip more related items, including all reagent_containers + for simplicity. + - bugfix: Fixed Service hounds tongue being dry at the start of the round. + - tweak: Various grammar fixes. + Cerebulon: + - rscadd: Added teshari hardsuit sprites. + DiscordWizard: + - rscadd: Updated wings_vr.dmi to have the new wings + - code_imp: Updated sprite_accessories_vr.dmi to show the new wings + - rscadd: Added trashcan ability to xenochimera + - balance: Lowered xenochimera timer for reconstituting related to available nutrition + - code_imp: Deleted cooldown code + ForFoxSake: + - tweak: Modified the telsa engine submap to be faster to set up. + - rscadd: Added the Rapid Piping Device! + - tweak: Made digital T-valves and air injectors deconstructable. + - tweak: Changed security's air injectors to require armoury access to deconstruct. + (Remote control remains as it was.) + Hatterhat: + - tweak: Hardsuit pieces (gauntlets, boots, chestpiece, helmet) now have PHORONGUARD. + - code_imp: PHORONGUARD is supposed to be a flag and not an item_flag. Adjustments + made. Probably. + - rscadd: Advanced ore scanners; scan in a 5x5 area, work in 1 second, gives numbers + of ores in the scanned area. + - rscadd: Ore scanners and advanced ore scanners are printable from R&D now. Advanced + scanners can be obtained from the mining vendor, too. + - tweak: 'Ore is no longer affected (read: deleted) by explosions.' + - rscadd: Medihounds now get a large beaker, instead of a standard beaker. + - bugfix: Sandstone can now be used for making plant plots. + - rscadd: Science utility uniforms now exist. + - tweak: Explorer uniforms now have purple markings, instead of cyan. + - rscadd: Shovels are now capable of hitting rockwalls for mining! This does not + work very well. + - rscadd: Some tools dig sand up faster than others. + - code_imp: Shovels are now pickaxe subtypes. + - rscadd: Miners now get magboots. They're not required, but you might as well have + them anyway. + - tweak: There is now a toggle magboots verb for voidsuits - right-click on your + voidsuit or access the objects tab to use it. + - tweak: Fultons should now fulton people and things equally as well, now. Probably. + - bugfix: You can set people on fire with a welding tool now. + - rscadd: Ore scanners can now have their range switched around with an alt-click! + - tweak: Ore boxes no longer explode and drop all their contents on ex_act(), meaning + that they probably shouldn't crash servers when they get broken. I hope. + - tweak: Wearing equipment with negative slowdown values (i.e. alien enhancement + vests) will no longer be useless if you've taken an equipment-slowdown-affecting + trait such as Major Hardy. + - rscadd: SMES coil variants (capacitance/transmission) are now in Cargo at 25 points + apiece! + - rscadd: DIY Carpotoxin/Spidertoxin crates in the Hydroponics tab; these have carp + and spiders for hunting purposes. + - tweak: Standard SMES coils are now 20 points. + - tweak: TEGs and circulators now all come in one crate, priced accordingly. + - balance: Fission engine parts are now 50 points for the starter kit and 30 points + for the expansion kit. + - balance: Heavy plate carrier equipment is now 65 points, but comes as a full set + of 3. + - balance: Plate carrier components are now equal in armor to their non-modular + equivalents. + - code_imp: Demodularized modular_citadel's supplypacks, moved to _vr where applicable. + - tweak: Fuzzy handcuffs, like the ones you kinky bastards use, are now 3 seconds + to break out of instead of 120. Who thought this through? Clearly, someone didn't. + - tweak: Fuzzy legcuffs take 3 seconds to break out of instead of 30. Yikes, bro. + - code_imp: Disabling the GENERATE_MAP setting in config.txt now prevents submaps + from generating. This prevents the use of shuttles, but also makes the whole + map initialize really, really fast. + - rscadd: Sharpening kits! Hit a whetstone with material sheets to make it, then + add sheets and apply a suitable weapon. + Heroman3003: + - rscadd: Allows voidsuits to have parts attached and removed while held in hand + (but still not when worn). + - tweak: Tape rolls can now be used on tiles with directional windows as long as + they don't directly obstruct them. + Mewchild: + - tweak: Makes Phoron Scrubbers work much faster, adds air heating to them as well + Nethaufer: + - rscadd: Cable coils to be printable from the autolathe in a single wire or 5 wire + increments up to 30. + - rscadd: Analyzer to engihound + - bugfix: Made it so that there's only one option to print cables because the other + options were buggy. + chaoko99: + - rscadd: Ore bags will automatically pick up items when held, belted, or pocketed, + and automatically deposit ore in boxes if one is being pulled. + deathride58: + - bugfix: Added a sanity check to the add() proc in zone datums, which should hopefully + fix the issue where unsimulated turfs get added to ZAS zones and cause runtimes + that make travis fail + kevinz000: + - code_imp: BYOND 513 support added. + yourdoom9898: + - bugfix: fixed the chirp emote saying a human mob's name twice +2020-01-04: + Buffalowing: + - rscadd: Added more immersive weather messages to replace the old 'Rain falls on + you' types. More yet may come. + - tweak: Significantly increased delay between weather update messages to prevent + clutter. + - rscdel: Removed damage from hail altogether as it only served to increase lag + and spam the victim. + - rscadd: Added the ability to rename/redescribe doors and APCs (anything that uses + the wires interface) via multitool. + - spellcheck: Fixed misc grammar mistakes in weather changes. Thanks to @KillianKirilenko + for pointing them out. + - experiment: Compiled changelog. + ForFoxSake: + - tweak: Tweaked the RPD to be more readily usable. + Hatterhat: + - bugfix: stasis bags dont kill you and bodybags are less shitty to use + - tweak: cell chargers and rechargers can now be upgraded + - rscadd: cell chargers can now be constructed but cell charger kits still exist + so *shrug + KillianKirilenko: + - rscadd: Added a couple of new space chatter events, and added a lot of new destinations. + - rscdel: Removed wrong-frequency event, it was super-rare anyway. Might readd later. + - tweak: Various other space chatter event adjustments such as most TSCs being lawful, + space con->flight con, protocol observance, etc. + - rscdel: Removed a pair of old boots. + - rscadd: You can now fly the excursion shuttle down to the surface and back to + orbit again. + - rscadd: adds a slew of new GPS units, new sprites are a mix of Polaris variants + (med/sec/generic) and kitbashed by me. + - bugfix: 'fixed a lack of gps units in lockers (now available from; mining, research/rd, + security/hos, medical/cmo, eng/ce/atm, hop/cd. original sources: explo/sar/PF/xenoarch)' + - bugfix: fixed mining capsule shelter computers not broadcasting by default, and + not having their own tag (they will now show as "SHELTER") + - bugfix: fixed a tile in the treatment center being assigned to the 'space' area + - rscdel: Removed the unused small cruiser/"houseboat". + - bugfix: Fixed "map testing power source" warnings during init. + - tweak: changed color of toxins damage on all crew monitors + Tename: + - rscadd: A bet bird for the tender + - rscadd: New Gambling room + - rscadd: New bar design + - bugfix: Missing cameras outside surface 3 + - balance: you cant build binary keys whenever you want + - tweak: Changes the doorbell sound. + - tweak: Reduces ATV trailer cost from 250 to 50 + - tweak: Reduces bike cost from cargo from 350 to 200 + - balance: Increase bike speed + - bugfix: Lack of hiders in the bar backroom + - bugfix: Lack of Guest pass terminal + - bugfix: Some weird looking windows + - bugfix: Observer spawn + The Community: + - rscadd: Diversified dreaming! + Trilbyspaceclone: + - rscadd: new upgrades to sleepers/chargers - ported + nik707: + - rscadd: Added a new lounge and areas to go with it + yourdoom9898: + - rscadd: Added new tracking implant crate +2020-09-29: + CharlesWedge: + - rscadd: Pirates with Knives, Pirates with Machetes, Pirates with Zip-Guns, Pirates + with Sawn Offs, Pirates with Zip-Las, Armored versions of all the above. + - rscadd: First Mates with, rifles, retro lasers, quad barreled shotguns and energy + swords of course. + - rscadd: The Pirate Captain and the Pirate Ripley piloted by a loyal Bosun + - rscadd: Expanded Say_list for pirates + - tweak: Pirates now use merc AI making them a bit more competent and allowing them + to use say_list. + - balance: Unarmored Pirates move a bit faster than they did. I mean they are only + getting shot at. Armored Pirate remain at their slow speed. + - imageadd: New Sprites for the pirate gang and their new mecha. + Enzo-Leon: + - balance: Armory Stock + - bugfix: Airlock siphon BS + Greenjoe12345: + - rscadd: The ability to add a custom name/description to loadout items was added. + - rscadd: the white cane got a new sprite, new variation, and also a crutch was + added, and a new eyepatch + - imageadd: Teshari got a sprite for the white blindfold + - code_imp: where 'gear_tweaks = list(gear_tweak_free_color_choice)' was used before + for color selection in the loadout, now 'gear_tweaks += gear_tweak_free_color_choice' + will need to be used, otherwise the item will not be able to be given a custom + name or description + - admin: A jobban option was added for disabling a specific person's access to the + custom loadout name/desc feature + Hatterhat: + - rscadd: Rumors around the sector have mentioned something about experimental high-velocity + 10mm cartridges being field-tested by operatives and elite mercenaries alike. + Be on guard for so-called "suppressors". + - rscadd: Stingbangs! Like flashbangs, except they also fire rubbershot pellets. + Adminspawn only. + - bugfix: Threat sounds from mercenary simplemobs now play properly. + - bugfix: Vox pirates with swords can now block things, which they somehow couldn't + do before. + KasparoVy: + - bugfix: You can now speak Sagaru with ,T. Why there wasn't a language key at all + before is a mystery. + - bugfix: RIG-wearing Teshari will no longer have Human-sized boots. + - imageadd: Adds EVA RIG sprites for Sergals, Akula, Nevreans & Nagas. + - rscadd: Tajaran hairstyles can now be selected by Vulpkanin, Sergals & Zorren + (allowed species copied from Vulpkanin hair) + - bugfix: Updates taur clip-masking to correct logical issues and improve performance + - bugfix: Accessories attached to Taurized suits will be centered properly now + - bugfix: Fixes a bug causing accessories to inherit the colour of what they're + attached to + - rscadd: Adds support for secondary wing colour (spriters go wild) + - tweak: Merged a bunch of _vr files into the regular files, file bugreport if anything + is busted + - imageadd: Ports all taurclothes from Virgo, namely aprons & old poncho + - imageadd: Adds a few Nevrean tails + - imageadd: Adds Vulp Alt. face, Vulp Short Nose, Talons, Claws, Tajaran Nose Alt., + Equine Snout & Equine Nose markings + - imageadd: Adds Donkey, Vulp Short + dual-colour & Vulp Jackal ear styles + - imageadd: Adds Ward-Takahashi cybernetic tail with dual-colour support + - imageadd: Adds darkened Teshari hair sprites ported to Virgo from Arkstation. + More flexible colouration. + LetterN: + - code_imp: cleaned up /busyspace/ + Max-023: + - rscadd: Adds the helmsman alt title + - tweak: 'Tweaks the amount of command secs that can be had delete: Deletes herobrine' + - tweak: Amount of parameds + RealDonaldTrump: + - tweak: Remodels the civilian shuttle + - bugfix: Pilot helmets can once again be linked to shuttle jump consoles. + RobotAlice: + - rscadd: Steel sheet recipe to make dance poles (1 sheet) + - rscadd: Added construction/deconstruction functionality to dance poles + - tweak: Fancy bluetext instructions for moving/removing dance poles + - bugfix: Makes buns and dough enter foodbags normally + Zandario: + - rscadd: Automatic Changelogs + - rscadd: github workflows + - rscdel: Old records that are no longer needed + - tweak: Changelog systems + - tweak: Updated Changelog Header + - imageadd: New Modern Logo + - imagedel: Old Outdated Logos + corin9090: + - rscadd: Ported ram horns from main + lolman360: + - rscadd: protean blobs can be worn as jumpsuits, id now. also tiny size. they also + share the sec rig's allowed contents list. + silicons: + - admin: toggle-respawn renamed to toggle-return-to-menu + - tweak: tram station now requires drag-drop to leave instead of bump. behavior + for other people shoving you in is unchanged. +2020-09-30: + VailTheWolf: + - rscadd: Borgi Sprites and Modules + - rscadd: Otie Borg Sprites and Modules + Zandario: + - bugfix: fixes some missed arguments caught by new Travis + - refactor: Travis Updated and Rewritten. + lolman360: + - balance: R&D guns no longer start with firing pins. +2020-10-01: + KasparoVy: + - bugfix: The regular eyepatch's strap won't cover your good eye when facing south. +2020-10-02: + CharlesWedge: + - rscadd: '2 New Grunt Mercs: The Rifleman and the Officer Carrying a Garand and + a Desert Eagle Respectively' + - rscadd: '5 New Space Mercs carrying: Combat Shotguns, Automatic Shotguns, FALs, + L6 SAWs, and Tommy Lasers.' + - balance: Base speed of grunt mercs raised to 2 so the ones with E-swords may actually + reach their target before they are swissed by explo. + - bugfix: Ranged Space Mercs Finally have Armor in line with their Hardsuit. They + also properly use the C-20R their sprite shows they carry. + - imageadd: New.dmi for the mercs, so they are easy to find and add onto them (Why + were **all** our mobs in animal.dmi anyway) + RobotAlice: + - bugfix: can no longer slide between beds/chairs with clickdrag while buckled + ThatOneTeshari: + - bugfix: BL3 Phoenix sprite now visible. +2020-10-03: + Enzo-Leon: + - rscadd: airlocks & a few other adjustments to map. + RealDonaldTrump: + - rscadd: Gives the CE his paperwork stamp back + ThatOneTeshari: + - rscadd: Removes the floral somatoray's pin requirement to be usable on station. + - tweak: Removes pin requirement from Phase weapons. + - tweak: Removes pin requirement from Temperature guns. +2020-10-05: + Kraseo: + - rscadd: Dogborg plushies. +2020-10-06: + RealDonaldTrump: + - rscadd: Adds a new area for the Library Private Study + - bugfix: Optical Meson Scanner aviators can now be chosen again in the loadout + - tweak: Gives borg hypos the same chems as the sleepers. + RobotAlice: + - bugfix: autopsy scanner now works on help intent + - tweak: autopsy scanner no longer used for external repair surgery + - tweak: health analyzer now the right tool for external repair surgery +2020-10-07: + drofoljaelisglis: + - bugfix: Fixed the white/default ribbon sprite not showing up. + - bugfix: Fixed a missing pixel on the butterfly hairpin object sprite. + - code_imp: Merged some _vr files. +2020-10-08: + RealDonaldTrump: + - rscadd: Ports the turtlenecks for the CMO, RD and HoS from the Main server +2020-10-13: + GrayRachnid: + - rscadd: Added the Chief Surgeon fluff title for the CMO + - rscdel: Removed the Surgeon General fluff Title from the CMO due to its misuse. + KasparoVy: + - bugfix: Character preview will now show all loadout accessories (within usual + logic) in the order you selected them. + - bugfix: All loadout accessories will be equipped to your character when you spawn + (within usual logic) in the order you selected them. + - rscadd: Added buttons to go forward or backward hair & facial hair styles. + - rscadd: Added a button to move a marking to a specific place in the order. + - tweak: Markings are now properly aligned. + - refactor: Ports Para's colour_square and improves customization colour previews. + silicons: + - rscdel: Fun has been removed from Poly. +2020-10-14: + KasparoVy: + - imageadd: Adds missing colourable apron sprites for humanoids & Teshari. + - rscadd: Adds a left arm heart tattoo. + - tweak: The right arm heart tattoo is renamed and actually applies to the arm instead + of the chest now. + VailTheWolf: + - rscadd: Bullet Lighter and sounds for all Zippos + - soundadd: Zippoopen.oog + - soundadd: Zippoclose.oog + - imageadd: '"Bulletlighter" into zippo.dmi' + Zandario: + - bugfix: Lighting Runtimes + - bugfix: Many other Runtimes, I recommend checking the PRs linked above. + drofoljaelisglis: + - rscadd: Added an "Event Rewards" category to the loadout. + - tweak: Donator Items now cost 0 loadout points. +2020-10-15: + Zandario: + - config: Puts Maps.txt into use +2020-10-16: + Zandario: + - bugfix: Fixes some Linter Errors. Suprise! +2020-10-20: + Enzo-Leon: + - tweak: Adjusted forward stairwell layout +2020-10-27: + CharlesWedge: + - rscadd: Added 2 new types of mimics + - imageadd: Sprites for the new mimics plus updated sprites for existing mimics. + - code_imp: Mimics updates so they may make use of their monstrous sprites, in addition + to the crate sprites. Active mimics are now unmistakably mimics visually. + ForFoxSake: + - balance: Increased melting point of fissile materials. + - rscadd: Added modular fission monitor program. +2020-10-30: + AvaricePleonexia: + - bugfix: fixed simple_dress. Had some funky pixels. + Zandario: + - rscadd: doopytoots's donator reward +2020-10-31: + Enzo-Leon: + - rscadd: Engineering floor re-work + - rscadd: Reactor change + - rscadd: engine changes. +2020-11-03: + Hatterhat: + - rscadd: The mining supply vendor now spits out scabbards to go along with their + machetes. + - tweak: Belter goes faster. + - balance: Ore yields for phoron, diamond, verdantite, marble, and lead are up. + Ore spread rates have been slightly increased. + Zandario: + - rscadd: Airlock Helpers + - imageadd: tweaked some of the icons from the port + - imageadd: directional sprites for airlock components, like buttons, sensors, etc. +2020-11-08: + VailTheWolf: + - rscadd: Sniper Hunter ammo + - bugfix: Makes Phase energy balls behave against appropriate mob types + lolman360: + - rscadd: Proteans are also fully functional rigsuits now. + - bugfix: proteans and being picked up, mostly +2020-11-09: + Hatterhat: + - tweak: Bear traps now have an activation proc, instead of relying on manual placement. +2020-11-11: + Mouseofthecake: + - rscadd: Adds soulcatchers to NIFs by default. + silicons: + - bugfix: brainmobs can understand AIs without a snowflake MMI check. + - bugfix: soulcatcher emotes now format properly for the person emoting + - bugfix: soulcatcher AR projections now support text formatting + - tweak: soulcatchers now use distance rather than view/linetrace check, less cpu + usage. range bumped to 7. + - tweak: soulcatcher AR projections now use their eyeobj perspective rather than + host perspective +2020-11-15: + king5327: + - bugfix: The path for the pathfinder sprite stacks is fixed to allow the icon to + actually show up. +2020-11-18: + Hatterhat: + - tweak: A fair bit of feedback messages from your ore satchel or hitting rocks + has been removed. Except the bit that pops up when you hit an anomaly-bearing + rock. That's still there. Use your eyes. + - tweak: Digging-capable mining tools (cyborg jackhammer, advanced drill, diamond + drill, etc) now use their digspeeds instead of the default 40 digspeed when + digging up sand. + - tweak: Sand tiles now yield a flat 5 sand. All the time. Forever. + - balance: Exosuit drills are faster. Theoretically. + - balance: Small M41A hollow-point and armor-piercing magazines have been moved + to the protolathe. + Mouseofthecake: + - bugfix: maybe fixed soulcatchers for starting NIFs +2020-11-19: + Hatterhat: + - balance: Items with negative slowdown now work nicely for people of any hardiness. + This is a re-implementation of something lost in the hardsync. + lolman360: + - bugfix: fix ai rig movement +2020-11-20: + realbuffalowing: + - bugfix: fixes chameleon items + - bugfix: fixes service borg bags + - bugfix: fixes service borg booze dispenser +2020-11-21: + KasparoVy: + - tweak: Make Protogen markings more suitable for colouration. + - imageadd: Add a marking that lets you colour the light & dark parts of your synth + independently. + VailTheWolf: + - rscadd: Added new dress to loadout + - imageadd: '"pentagram" in uniform.dmi and uniforms.dmi' +2020-11-23: + Hatterhat: + - rscadd: Admin-spawn only HF machete for throwing at things (while off) and stabbing + things (while on). + buffyuwu: + - bugfix: fixed floorlights + zeroisthebiggay: + - bugfix: demisock sprite pixel +2020-11-26: + buffyuwu: + - bugfix: fixes simple_mob ai so that it doesn't freeze when you ghost from it + - bugfix: fixes cult sound volume + - bugfix: fixes engineering tape +2020-11-27: + GrayRachnid: + - balance: Reduced teshari speed but gave them a health buff to improve gameplay. +2020-12-01: + Lorilili (Port from Aurora): + - rscadd: Added knee-high and thigh-high jackboots. + - imageadd: Replaced laceup and leather shoes with oxford shoes. + - imageadd: Replaced standard shoe and high-top sprites with newer ones. + silicons: + - balance: berserk modifier used by saviks reduces slowdown by 0.75 instead of 1 + - balance: teshari have been given a bit less damage vulnerability and item slowdown + mod. +2020-12-02: + Hatterhat: + - bugfix: Null rods and equivalents now actually do the bonus damage they're intended + to do against demonic creatures and aberrations. + - rscadd: Jagged spikes, which are good for jamming into people's ribs and then + being guilty of a crime because that's assault with a deadly stick, are now + printable from an autolathe. You can't keep your grip on them for long, though. + - rscadd: Disruptor blades, which are intended to deal bonus damage to animals and + aberrations, are in the code, but unobtainable. + SiliconMain: + - tweak: Engineering winter coats can now hold the RCD and RPD in exosuit slot + TheKnightofAura: + - rscadd: Astral wind. A somewhat simple new drink mixed from three service-Borg + accessible reagents + silicons: + - balance: clothing vendors are way cheaper now, go wild. +2020-12-04: + buffyuwu: + - bugfix: fixes curtains so they dont vanish underneath the window + - bugfix: fixes plushie code typo +2020-12-05: + GrayRachnid: + - tweak: altered job titles to make them more setting and common sense compliant. + - code_imp: removed all non-modular files that edited jobs and put everything in + their non-modular counterparts. +2020-12-07: + VailTheWolf: + - rscadd: Gunbox with two "new" rifles. + - rscadd: Exploration Vendor selection for Gunbox +2020-12-08: + Hatterhat: + - rscadd: Hardsuit wearers can step into cyborg chargers to recharge their suit. + - tweak: The material processor can now be toggled to and from a slower processing + speed. + VailTheWolf: + - rscadd: New P90 sprites + - rscadd: Explorer pinned H90K + silicons: + - rscadd: colormates are now capable of evil +2020-12-10: + Kraseo: + - rscadd: Gradients on hairstyles. +2020-12-11: + Enzo-Leon: + - rscadd: New secondary explosion sound that will "shake" the station/ship with + a creaking sound effect + - soundadd: New sound files for explosions and ship creaking + TheLordME: + - rscadd: Chemical Patches work as a single use bruisepack. Applying thier Chemical + and bandaging a single wound. + - bugfix: Chemical Patches can no longer be placed on surgical sites. + - bugfix: Chemical Patches now correctly check for robotic limbs. +2020-12-14: + buffyuwu: + - rscadd: expands vampirism mechanics +2020-12-17: + TheLordME: + - rscadd: Added Recipe for Bicaridaze, Dermalaze, Inaprovalaze and Tricorladaze. + All four are healing chems for chemical patches. They are mixed by adding Sterilizine + and foaming agent to they similar sounding parents. Before they were only obtainable + via distiller. + - bugfix: Fixes ventcrawl-ejection on dieagonal movement + silicons: + - balance: protean rigs are slightly less godawful + - rscadd: now introducing nanotrasen SMART CHARGE - no longer will expedition ships + be shut down by 50 powergamers rolling protean and erping in the rechargers. + - tweak: cyborg chargers now waste less power while idle +2020-12-18: + Hatterhat: + - bugfix: Destructive analyzers now return material to their lathes properly. + - tweak: RPEDs now drop lowest part tier when used inhand. + - tweak: RPEDs can be clickdragged onto destructive analyzers to recycle lowest + part tier. + - tweak: Protolathes and autolathes are now less awful to look at. +2020-12-29: + UrsaMajora: + - rscadd: cloakglowing and cloakglowingdark icons + - rscadd: cloakglowing and cloakglowingdark accessory items + - rscadd: Civilian Cloak - Glowing Light and Civilian Cloak - Glowing Dark as loadout + selections +2021-01-12: + Enzo-Leon: + - rscadd: Added more maintenance areas & loot to the Deck 3 area. + - tweak: Exploration Medbay gutted of chem supplies + - tweak: FM starting gear nerfed of RIGs & Overpowered chems. + - tweak: EMT gear gutted of RIGs and reduced starting gear. Machete kept due to + job line having them run into actual danger to help. + TheLordME: + - bugfix: Teshari explorer can now refit their suits in exploration. + - bugfix: Refitted suits no longer suggest they have their paintjobs armor and resistances + and instead show their true values on examination. +2021-01-15: + rpilcrow: + - rscadd: Two new markings, 'Short Snout' and 'Third Eye', one new pair of ears, + 'Bunny Ears 2', and alt of 'Short Hair 2' with darker fringe. + - tweak: Ahoge is brighter now. +2021-01-17: + nevimer: + - rscadd: Teshari Quartermaster cloak is set properly in xeno loadout file. +2021-01-18: + Enzo-Leon: + - tweak: Re-enabled syringes giving infections if re-used + - balance: Adjusted Germ Levels to prep for Virology rework +2021-01-22: + ThatOneTeshari: + - rscadd: Added "status_indicators.dmi" + - rscadd: Added "status_indicators.dm + - code_imp: changed code in 36 files. + - admin: changed code on paralyze to work with the new dm/dmi + TheLordME: + - code_imp: Reagent code is more readable than before. +2021-01-24: + Enzo-Leon: + - rscadd: Added missing disposal pipe + - tweak: Revamped Bar & Kitchen area + TheLordME: + - bugfix: Operation Cap are now displayed on character. +2021-01-25: + ThatOneTeshari: + - rscadd: Rig and Mech UI + - rscadd: Clickable buttons for Mechs, aka Mech UI + rpilcrow: + - rscadd: 6 hairstyles, 2 markings, and 1 pair of ears +2021-01-26: + ThatOneTeshari: + - bugfix: Fixes the 'stuck' Sleeping indicator after surgery. +2021-01-29: + Enzo-Leon: + - rscadd: new proc call for APCs + - balance: Adjusted event weights + - bugfix: Desert planet lights & weather fixed. + - code_imp: Updated APC code to add the flicker_lights proc call + Jaybirdnerd: + - rscadd: Added Large Cardboard Box/ported cardboard box *(kinda)* from Main. + drofoljaelisglis: + - tweak: Changed the Frontier Phaser, Holdout Phaser, and Personal Defense Weapon's + firing sounds. + - soundadd: New weapon sounds, including one (currently) unused one. +2021-01-30: + Jaybirdnerd: + - rscadd: Added Personalized Gameboy + ThatOneTeshari: + - rscadd: Pickup/drop sounds for a lot of items + - rscadd: 230 sound files + - code_imp: Grill updates + - soundadd: New Security Alert for Red + Delta + - soundadd: New Ambience per-area + - soundadd: New SM sounds + - soundadd: New Scanner/Cloner/Resleever Sounds + - soundadd: Knuckle-cracking *crack emote + - soundadd: New Sounds for Oven/Grill/Candy/Cereal/Mixer Machines + - soundadd: New Sound for Pre-Game Lobby (ping) + - soundadd: New sounds for Pickup Sounds and Drop Sounds. +2021-02-01: + buffyuwu: + - bugfix: fixes FBP/synths temperature values + - rscadd: adds local narrate verb +2021-02-04: + drofoljaelisglis: + - tweak: Changed a small amount of tracks, some are new lobby tracks, others have + been retired from the lobby, others have been shifted to the emag-only tracklist + on the jukebox (very few). Changed a handful of genres around. + - soundadd: Added over 100 new songs to the jukebox. Adds three new genres to the + jukebox. +2021-02-07: + Jaybirdnerd: + - rscadd: Added 35+ new songs to the jukebox. +2021-02-08: + buffyuwu: + - rscadd: adds autocorrect +2021-02-11: + silicons: + - rscdel: oxygen damage removed from neckgrabs, now only strangling does it + - bugfix: dice no longer double rolls on throw +2021-02-12: + TheLordME: + - bugfix: Vendor Phoron Bores only need phoron and a powercell. +2021-02-13: + lolman360: + - balance: you can no longer kick robots in the nuts +2021-02-16: + Ghostcoffeee: + - rscadd: Added Protean unarmed verbs + - rscadd: Added Protean blob resistances/weaknesses + - tweak: Made Proteans not need to blob to reform single limbs + - balance: Made Proteans not die instantly to ions, and not blob instantly to lasers + - tweak: Other tweaks, that in my mind make sense for the hyper-advanced nanoblobs +2021-02-17: + lolman360: + - soundadd: tgui console sounds + - code_imp: tgui + tguichat + - refactor: examining +2021-02-18: + Ghostcoffeee: + - bugfix: Fixes the weird looking misplacement for a few hairs + TheLordME: + - imageadd: Added sprite for Vox wearing the CE hardsuit + silicons: + - rscadd: wooden circlets and flower crowns have been added to the loadout + - tweak: protean hunger rates fixed + - bugfix: toxin_mod --> toxins_mod + zeroisthebiggay: + - rscadd: tritail kitsune tail ported straight from vore station +2021-02-20: + Ghostcoffeee: + - rscadd: Added Protean unarmed verbs + - rscadd: Added Protean blob resistances/weaknesses + - tweak: Made Proteans not need to blob to reform single limbs + - balance: Made Proteans not die instantly to ions, and not blob instantly to lasers + - tweak: Other tweaks, that in my mind make sense for the hyper-advanced nanoblobs + TheLordME: + - rscadd: Added Bicarilaze, Kelotalaze, Tricoralaze, Inaprovalaze, Sterilaze and + Cleansalaze. + - rscadd: Added Neurolaze, a potent painkiller that doesnt slowdown the patient, + but makes them Jitter + - rscdel: Removed old touch chems + lolman360: + - bugfix: dark mode radio channels are a bit easier to see + - bugfix: emotes are no longer in tguichat unsorted tab + - bugfix: materials on examine are no longer caps always + - bugfix: crew monitor console map view + - bugfix: human examine spacing (hopefully) + - tweak: kpas now pressure dependent, 60 kpa +2021-02-21: + Enzo-Leon: + - rscadd: tiny-fans for pools + - tweak: Adjustments to Bar, Cafe, and Pool + silicons: + - rscadd: event prefs +2021-02-23: + Delams-The-SM: + - rscadd: Added 2 new horns to ear Species Customization + TheLordME: + - bugfix: Tablets now spawn with their proper Battery modules. + - code_imp: Removed code that was no longer needed/Breaking stuff + lolman360: + - bugfix: emote slanting + - bugfix: protean blobs climbing up onto people while they're nto adjacent +2021-02-25: + silicons: + - rscadd: matrix recolors are now possible in loadout +2021-02-26: + rpilcrow: + - bugfix: Masks no longer block your ability to use swab kits on hands. + - tweak: Slightly altered swab kit text +2021-02-27: + nik707: + - rscadd: cool looking shells + - rscadd: bad humor + rpilcrow: + - bugfix: Drink glasses no longer fill chem/condimasters when being put into them. +2021-02-28: + nik707: + - bugfix: fixes ar hud glasses to be simultaneously prescription glasses + - bugfix: fixed missing mapmerge +2021-03-01: + nik707: + - bugfix: fixed missing mapmerge +2021-03-02: + Enzo-Leon: + - balance: decay slashed. + - rscadd: new ATC options + - tweak: ATC timings & weights + - bugfix: Rat migration no longer is broken + - code_imp: air_traffic & organizations files were updated with the new fleet information. + More NT ships were added, homeage to the NSB Adephagia added as a station destination + for NT vessels to travel off to. + drofoljaelisglis: + - bugfix: Fixed the invisible sprite on the toe-less/digitigrade jackboot variants. + - imageadd: Adjusted the sprite on the knee-length and thigh-length jackboots (normal + and toe-less/digitigrade versions) to make them more visually distinct from + the regular jackboot sprites. Now they should align with the location they're + supposed to reach to. +2021-03-03: + TheLordME: + - bugfix: Cyborgs get announced again + drofoljaelisglis: + - bugfix: Fixed communicators not displaying any stories in the newsfeed app. + nik707: + - rscadd: IAmCrystalClear donator reward + - tweak: requirements for command bodysuit +2021-03-04: + buffyuwu: + - bugfix: items in the character setup preview no longer remain across different + slot previews +2021-03-05: + buffyuwu: + - bugfix: you can now switch briefcases between hands + rpilcrow: + - bugfix: Fixed hud thermometer sticking at maximum +2021-03-06: + CrystalClearCC: + - tweak: Sex on the beach has a working recipe now. (New thematic tastes too.) + - tweak: Virgin sex on the beach has a new recipe. (With new taste!) + - rscadd: Both sex on the beach variants have a new sprite. + FreeStylaLT: + - rscdel: Abundant lights on Triumph + nik707: + - rscadd: VI's briefpack + - bugfix: fixed the secure briefcase inhand sprite +2021-03-07: + drofoljaelisglis: + - rscadd: New clothing items have been added. + - tweak: Many departmental loadout items that accidentally excluded certain roles + of the department have been fixed, and in some cases items that were not role-restricted + were given proper restrictions. The same is true for species-restricted items. + Some items have had role-restriction removed, as well. + - tweak: All items that were once named with the prefix "Civilian" have had the + prefix removed (This isn't a Military RP server, and there is no need to explicitly + specify it is "Civilian" if any role regardless of department can select it), + and role-restricted items were given their own category in the loadout. The + exception to this is species-restricted items, which still have their respective + department items kept in Xenowear. + - tweak: Naming consistency has been improved in the loadout. + - bugfix: Simon Pants and Simon Jacket now have visible object sprites. + - bugfix: Vox Pressure Suits now all have object sprites separate from the mob sprites. + - bugfix: Loadout behavior is now less buggy. + - bugfix: Many cases of repeated declaration in the loadout have been fixed. + - bugfix: Broken Teshari loadout options have been fixed. The sprites for some of + these items are still broken, but not all. Fixing all of them is beyond the + scope of this update, however. + - bugfix: Miscellaneous clothing sprites have been fixed, from object to mob sprite. + - imageadd: Gives the Vox Pressure Suits as well as Simon Pants & Simon Jacket object + sprites. + - imagedel: Many duplicate sprites were removed. + - spellcheck: The teshari's "chief engineer cloak" is now named appropriately, and + is no longer the "cheif engineer cloak". + - code_imp: 'Much of the code associated with the loadout has been touched, and + in some cases, rewritten entirely. Role-restricted items have been given their + own file, and now use an inheritance system that eliminates the need to constantly + re-declare restrictions for items that have more than one role that can take + it (ex: Departmental items). Xenowear/Species-Restricted items have been re-written + from the ground up to follow the same more sensible inheritance structure. The + latter case is an especially significant improvement, as before there were issues + with category placement, selectability, and in general was reported to be very + buggy.' +2021-03-08: + buffyuwu: + - bugfix: machetes are now as functional as any other holsterable weapon +2021-03-11: + nik707: + - bugfix: the dreaded square +2021-03-12: + nik707: + - bugfix: SKUB +2021-03-13: + nik707: + - bugfix: loadout meson eyepatch + - rscdel: 'deleted player_panel tweak: changed player_panel_new to player_panel' +2021-03-15: + Kraseo: + - imageadd: Adds all the sprites needed for protean RIGs to be worn on any species + that can. +2021-03-16: + CharlesWedge: + - bugfix: Added a Else Clause to Vox's delight. It now slightly heals Toxin damage + and no longer is toxic to them. + nik707: + - rscadd: Adds like 13 new wings +2021-03-18: + Kraseo: + - bugfix: Bioprinters are actually worth upgrading now. + nik707: + - rscadd: J9 Janihound + - bugfix: someone is dumb +2021-03-23: + CrystalClearCC: + - bugfix: dark rimmed glasses has a icon sprite now, yay + Enzo-Leon: + - rscadd: Surgery Maintenance area + - rscadd: Atmos for missing area + - rscdel: Mimics removed on all decks. + - balance: Hostile mob spawn + Kraseo: + - rscadd: Fox tail sprite, with wagging animation. + - rscadd: Slime hat to loadout. +2021-03-25: + CharlesWedge: + - rscadd: '3 New Floor Mimics, Probability Versions of the Airlock Mimic tweaked: + Airlock Mimic Code in general, to be more convincing.' + - bugfix: Closet Mimics have a proper name and description. + - imageadd: new.dmi for mimics + Enzo-Leon: + - rscadd: 'Transition effect tweak: Adjusted tiling in a few areas on the main maps.' + - refactor: updated mapping paths to current CitRP pathing + silicons: + - admin: Global-Narrate is back. Local-Narrate is now a thing, instead of being + combined with Narration. +2021-03-28: + Enzo-Leon: + - rscadd: Reactor Map Start Rotation + - rscadd: RUS-T / Fission / SuperMatter added + Hatterhat: + - rscadd: Mining-module equipped stationbound synthetics now get a disruptor blade + when given a scrambled module. What's a disruptor blade? Who knows. + silicons: + - balance: supermatter no longer hallucinates synthetics. +2021-04-01: + Kraseo: + - bugfix: Cleansalaze mixes as intended. +2021-04-02: + nik707: + - rscadd: bone machine broke +2021-04-06: + FreeStylaLT: + - bugfix: Missing core ejection button from Bridge +2021-04-11: + silicons: + - rscadd: air injectors are now OP. +2021-04-13: + FreeStylaLT: + - rscadd: Messages when examining things. + - rscadd: Preference to not see messages when examining things. +2021-04-14: + MalricB: + - soundadd: added a bunch of sounds + buffyuwu: + - bugfix: unsquishes minitest (dev) + - rscadd: adds laugh sounds from main + - rscadd: adds a *nyaha emote separately + - bugfix: adds emote spam protection for commonly spammed emotes +2021-04-15: + TheLordME: + - spellcheck: Fixed a typo in the squeakish desription. + - bugfix: Pan-Slavic is no longer the language of a non existant fraction. + - code_imp: Language Prefixes differate between upper and lower case + - code_imp: Language 'verbs' can be lists now. + - refactor: Language Flags are bit shift style now. + - refactor: Two language related _vr-files merged into their respective Parents. +2021-04-17: + Kraseo: + - imageadd: Better area icons. + Mount0: + - rscadd: Added an Uno clone that appears in loadouts, the Bits N Bobs vending machine, + and two spots on the Triumph. + Trilbyspaceclone: + - bugfix: Corrects robotics labcoat open sprites to be seeable. + buffyuwu: + - rscadd: toggle pain messages + nik707: + - rscdel: 'removes several sif fish types tweak: tweaks time on fishing tweak: tweaks + droprates for fish' + timothyteakettle: + - rscadd: adds taur loafing +2021-04-21: + Ghostcoffeee: + - rscadd: Added floppy elf ears + Mount0: + - rscadd: ashtrays to the bar + - rscadd: soda dispenser in the kitchen's walk-in fridge + - rscadd: cyborg charger in the empty room across from the janitor closet/elevator + on deck 2 + - rscadd: a second wall charger in the armory + - rscadd: a couple of fire closets in the sec hallways + - rscadd: a door into the IAA where it borders maint + - rscadd: request console to the CE's office + - bugfix: bottom right blood locker in the ETC not having any blood + nevimer: + - rscadd: New RUS-T sprites. + - rscadd: 'New field sprites, dynamic transparency scaled from heat. tweak: Stability + is tweaked slightly. tweak: The field can be much larger now. tweak: Size can + be scaled much larger, in theory.' + - code_imp: The logic behind the scaling of the sprites is ported from Scav Station. +2021-04-25: + Auris456852: + - bugfix: R-UST's hot loop now is set in the right direction and the wiring works. + - bugfix: 'No more duplicate borosilicate engine windows. tweak: Every engine submap + now has radiator window shutters. tweak: Removes the rogue button in the middle + of the R-UST pipes.' + nevimer: + - bugfix: RUS-T manual in game now is accurate. +2021-04-26: + buffyuwu: + - rscadd: ports main's age gate system + silicons: + - rscadd: protokinetic daggers, for 1200 points + - balance: explorer pins now work on lavaland/anywhere off station + - balance: inversion beams get dampened by antimagic +2021-04-30: + FreeStylaLT: + - rscadd: Safety features around the pool + nik707: + - rscdel: 'Constable Alt Titles tweak: Gaoler > Jailer' +2021-05-03: + CrystalClearCC: + - bugfix: changed pulsar emissions away from world-detroying pulsar emissions. +2021-05-04: + nik707: + - rscadd: Mirror Implant + - rscdel: 'Comments out a lot of transcore code tweak: NIFs are not given upon resleeving + tweak: Body scanners can initiate manual mirror backups' +2021-05-05: + buffyuwu: + - rscadd: You can now pretend to be drunk, stutter, or twitch in the IC tab +2021-05-07: + nevimer: + - balance: Guide tells you the safest way to start the engine possible +2021-05-10: + nevimer: + - rscadd: Burn chamber engine submap. +2021-05-11: + nik707: + - rscadd: Mirror tool for borgs + - bugfix: 'fixed a bug that would allow infinite mirror production tweak: tweaks + spawn in text when resleeving' + - rscadd: further sanity checks to the mirror tool for more easy usage +2021-05-16: + silicons: + - rscadd: every winter coat from main is now here +2021-05-17: + nevimer: + - bugfix: Machines no longer say they're off upon inspect when they're on. + - rscadd: Moles measurement to pipes and cannisters + - rscadd: Ghosts can inspect pipes +2021-05-18: + Ghostcoffeee: + - rscadd: 'Added non-blob regen tweak: Increased blob regen, so that there''s some + incentive to use it over the normal tweak: Changed Protean limb health from + 10 hp/limb to the standard 80 hp/limb' + - balance: Changes to a few resistances and other values + Knouli: + - rscadd: Miko Garb custom sprite + - code_imp: New .dms for event rewards, separate from donator sprites +2021-05-21: + CharlesWedge: + - rscadd: Pirate Boarding Event, Pirates will invade the ship in area I determined + to be "High-Value" and begin wrecking things + - rscadd: 'Pirate Ships labelled as "Unflagged Vessels" now spawn across the overmap + in small groups. tweak: Changed the Pistoler''s projectile to 12g slug, more + in line with the zip gun they are using.' + - balance: Pirate Reloads greatly decreased so they don't spam high damage bullets + and lasers in your face. + - imageadd: One Sprite for pirate ships +2021-05-23: + Kraseo: + - rscadd: Black-eyed shadekin. + nevimer: + - rscadd: 'IP reputation checking tweak: return to menu is now respawn.' + - config: 'new things to config: IP rep' + - admin: IP rep admin verb +2021-05-24: + nevimer: + - bugfix: TTS Devices are now usable in while sitting in chairs and from pockets. +2021-05-29: + nevimer: + - rscadd: long-range analyzer to RnD for engineering. +2021-06-03: + silicons: + - balance: Kinetic daggers have been slightly nerfed. +2021-06-07: + yourdoom9898: + - rscdel: Commented out the brand intelligence event +2021-06-09: + yourdoom9898: + - rscdel: Comments out Brand Intelligence. Again. +2021-06-14: + MalricB: + - rscadd: new songs + nevimer: + - code_imp: nanoui sync +2021-06-16: + TheLordME: + - rscadd: Off-Duty Command + - code_imp: Allow_jobhup is no longer double negated + - bugfix: Species that shouldnt slip, no longer, infact slip + - bugfix: Diona cant get flashed, like they should. +2021-06-18: + drofoljaelisglis: + - rscadd: Added a new swimsuit. +2021-06-30: + TheLordME: + - rscadd: Adds eggs to the Bio-Generator. + drofoljaelisglis: + - rscadd: Added 27 new emotes. +2021-07-01: + TheLordME: + - bugfix: Off-duty command no longer starts with command headsets. + nik707: + - rscdel: no more stunsword in sec armory + - rscdel: 'Removed nutrition based examine texts tweak: Tweaked max nutrition, and + drain to compensate' +2021-07-03: + Captain277: + - rscadd: Adds Vulkan Brassworks Incorporated, a civilian-level Clock Cult subsidiary + that produces clockwork limbs. + - imageadd: Adds a recolored .dmi based on Eggnerd prosthetics as the basis for + the Vulkan limbs. May be retouched later. + - balance: Rebalanced one-handed firing penalties for rifles, post Baymiss nerf. + MitztheKat: + - rscadd: Added orange ale. A slightly cursed but overwhelmingly fizzy combination + of orange juice and ginger ale. + - spellcheck: A local service cyborg blasted some typos from existence. + - bugfix: you can now make peanut butter milkshakes again. + - bugfix: you now correctly taste shirley temples. + TheLordME: + - bugfix: Diona are no longer killed by plant-b-gone + - bugfix: '*chuckle no longer plays the laugh emote' +2021-07-06: + Kraseo: + - bugfix: Synthetics no longer carry over every single character save. +2021-07-07: + drofoljaelisglis: + - rscadd: Added "80s (Alternative)" Hairstyle +2021-07-13: + MonaraMir: + - bugfix: Fixed the missing oxygen and phoron pressure tanks on the fuel depot. + - rscadd: Added a vault to store loot, and use randomly generated loot for trading. + - rscadd: 'Added inducers to engineering and weapon storage, a few super power cells + and materials to the workroom, some more weapons and power cells to weapon storage, + and a spyglass to the captain''s quarters. tweak: Shuffled stuff around in the + Talon''s bar and captain''s quarters.' + - bugfix: Fixed oversights with Talon's vendor access, Talon's vendors being invisible, + and missing magboots/shortrange radios from Talon crew's lockers. + TheLordME: + - bugfix: Species that shouldnt slip, no longer, infact slip + - bugfix: Diona cant get flashed, like they should. + - bugfix: You shouldnt drop through catwalks anymore + - rscadd: Off-Duty Command + - code_imp: Allow_jobhup is no longer double negated + buffyuwu: + - bugfix: fixes gas analyzers duplicating output + - bugfix: fixes sushi being ruined when using sif meat + nevimer: + - bugfix: tether builds +2021-07-18: + nik707: + - bugfix: 'synthetics now spawn with mirrors as intended tweak: Mirrors can now + properly be removed through surgery without bricking the mobs respawning tweak: + it is now impossible to install a mirror into a body with no attached client. + Use the resleeving console.' + - rscadd: 'Added a new SMES subtype for the rust tweak: Moved engine smes to their + related submaps' + - balance: rebalanced the engine SMES to standard levels + silicons: + - balance: diagonal moves now take sqrt(2) instead of x2 time to do + - balance: R&D console is no longer hard access locked other than for the lock toggle + itself and syncing. + - balance: cyborg chargers charge synths/FBPs 2x fast (cyborgs unchanged) + - balance: protean healing has been normalized + - bugfix: protean blobs now have the same resistances as their human form + - balance: proteans take the same amount of emp damage as all other synths, but + their blobforms are no longer invulnerable to emp. they gain a slight resistance + in that state, though. + - balance: synthetic emp to sev 3 emps reduced by avg ~20% +2021-07-19: + Linzolle: + - bugfix: fishing indoors should work again + nik707: + - rscdel: A few wrong/inappropriate alt titles + silicons: + - bugfix: Singularity shouldn't break containment anymore + - rscadd: BoHs now detonate on being thrown into a singularity. +2021-07-22: + Linzolle: + - bugfix: sensor console no longer prints out blank paper + - bugfix: mining drills unload into boxes properly now +2021-07-23: + Captain277: + - rscdel: Reassigns technology applied to KHI. + - rscadd: Adds spawn points to Talon ship. + - rscdel: Removed Nebula Gas spawn option. + Zandario: + - rscadd: Teshari no longer go into pancake death (aka they can glide and survive + in normal conditions) + - rscadd: Teshari now generate a first and last name by default, which makes sense + for a insanely social species + - imageadd: Teshari Medal Sprites +2021-07-24: + Captain277: + - rscdel: 'Removes vestigial departments. tweak: Multiple layout changes to several + mapped areas, as described in detail above.' +2021-07-25: + Linzolle: + - bugfix: 'day/night cycle and weather effects now work again tweak: virgo 3b''s + day/night cycle now takes 6 hours instead of 3 hours tweak: open turfs are now + affected by lighting' +2021-07-26: + CharlesWedge: + - bugfix: UD Secondary entrance, in solars region. +2021-07-27: + Captain277: + - rscadd: Added the Roomba cleanbot variant and the Maid Roomba cleanbot variant. + - imageadd: Added the icons for the relevant bots from /vg/station. + CharlesWedge: + - bugfix: lever actions now accept proper ".357" and ".44" rather then nonexistent + "357" and "44" + Zandario: + - rscadd: Smell System from upstream + - bugfix: Some of the formatting of the VORE Panel has been adjusted for consistency + zydras: + - rscadd: Added waiting seats, storage space and food vendors to the exploration + hangar + - rscadd: Added a micro-medical bay to the Exploration shuttle + - rscadd: 'Moved Noodle from its old religious home to the Pilot''s Office tweak: + Entirely remodelled the Exploration shuttle to improve the layout tweak: Moved + the Pilot''s Office around and expanded it to improve its look' + - balance: Added one additional engine to the Exploration shuttle + - balance: Added a storage section to the hangar to hold surplus canisters and crates +2021-07-28: + Captain277: + - rscadd: 'Data Knife and Vox plushie tweak: Surgical tables are now constructible.' + Zandario: + - rscadd: Xenobotanist Job + - rscadd: Lots of other Job Names + - rscdel: Xenobotanist alt_title for Xenobio + - bugfix: Moreso readding values we SHOULD'VE had but were missed in someone's port + or something +2021-07-29: + faaaay: + - rscadd: AR-V goggles, eyewear given to the Pathfinder (and available for survey + points) with a built-in health scanner and zoom function. + - code_imp: Added the wornslot var to zoom(), allowing for worn items to have zoom + functionality. +2021-07-31: + Captain277: + - rscadd: Restores Acid and Blood turfs. + MalricB: + - rscadd: lion tail in sprites_accessories_vr.dm + - imageadd: added liontail, liontail_markings, liontail_w, liontail_markings_w to icons/mob/human_races/sprite_accessories/tails.dmi + and code/modules/vore/appearance/sprite_accessories_vr.dm + Zandario: + - rscadd: Fit-Viewport + - rscadd: Other View stuff for future projects + - code_imp: Changed some code... Obviously. +2021-08-03: + TheLordME: + - bugfix: Neomorphs get the resistances and weaknesses lore suggests + - refactor: Xenomorph Hybrids are now correctly named Neomorphs + zydras: + - rscadd: added trees and foliage to the department to help make the exploration + look unique + - rscadd: added a cyborg recharger to the department's crew lounge + - rscadd: added a few piece of fluff/lore papers in the pathfinder office + - rscadd: added a water cooler instead of a coffee dispenser to the crew lounge. + Go ask the barista for one, you coffee addict. + - rscdel: removed the chem analyzer from the crew lounge + - bugfix: fixed the wirings of the department being connected to an external line, + despite the department SMES +2021-08-05: + TheLordME: + - code_imp: improved AI clickcode + - bugfix: AIs can now interact with tgui machinery +2021-08-07: + silicons: + - rscadd: 'xenobio qol: alt click processor to auto intake, unwrenchable, etc.' +2021-08-09: + CharlesWedge: + - rscadd: 'New Virgo 4 Desert Z-Level, 3 New POIs tweak: Former Desert World POIs + are reworked for use with dynamic lighting. V-4 Beach/Cave: Have been slightly + edited to connect to the new desert location. Also V-4 Beach Solars are now + actual solars rather then assemblies, they are also now fenced. tweak: External + Plating and external Tiles are now considered Outdoors for purposes of planet + lighting.' + - code_imp: All the code related to making a new linked Z level loaded +2021-08-10: + Captain277: + - rscadd: Adds three sets of tan lines. + CharlesWedge: + - bugfix: positively actually makes the shield generators behave less stupidly. + Saisni: + - rscadd: Added new drinks with recipes and metaglass sets + - rscdel: Removed duplicate recipe + - imageadd: added some icons for drinks + - spellcheck: fixed a few typos in drink names and recipes ![SomeDrinks](https://user-images.githubusercontent.com/71731828/127749862-16fe8798-14e2-469e-af08-8b3c4bc7bf18.png) + [Bartending Fix.txt](https://github.com/Citadel-Station-13/Citadel-Station-13-RP/files/6911717/Bartending.Fix.txt) + Zandario: + - rscadd: Alt-Click support for Storage + - rscadd: Alt-Click and Ctrl-Click to some vehicles +2021-08-16: + CharlesWedge: + - bugfix: Fixed, Weather Datum for V-4 Desert. Roach Vermin Event Should now actually + occur. + FreeStylaLT: + - bugfix: Xenochimera bioadapts now cancel properly + Zandario: + - code_imp: Touched up the Bitflags and Bitmasks to bring them more in line with + main for future ports +2021-08-19: + Captain277: + - rscadd: Adding an outfit. Eventually. + - rscadd: Extends Midpoint. + - rscadd: Squirt guns. + Jaybirdnerd: + - bugfix: CMO's locker was missing the Job Role Cloak and the Advanced Medical Hand + Scanner. +2021-08-28: + Delams-The-SM: + - rscadd: Added new markings and tail for jackals + yourdoom9898: + - bugfix: fixed Bulk Stolen Supply Crate +2021-08-30: + Captain277: + - rscadd: 'Second Tint Control buttons to bar booths. tweak: Adjusted access on + Xenobot containment.' +2021-09-06: + zeroisthebiggay: + - rscadd: sevensune tail from hyperstation +2021-09-12: + Captain277: + - rscadd: 'Re-adds the listed items: Bible selection and High Class swimsuit. Adds + trash spawners that drops Glukoz to levels 1, 2, and 3. Adds maid headbands + to costume vendors. Adds TGMC style craftable med lollipops. Adds a wheelchair + to Robotics so I can stop wheeling patients around in chairs. tweak: Tweaks + the Ronin Coat storage. Tweaks the Level 1 cafe based on user submission. Tweaks + Level 1 gas masks to the full face clear versions.' + - rscadd: Mantis thorax and arms. + - rscadd: Bandages as a bra option. +2021-09-17: + Captain277: + - rscadd: Keycard scanners to HoP/Cap's room. + - rscadd: Reporter gear to Librarian Alt. + - bugfix: Skateboard faults/duping. + - bugfix: Lizard tail coloration. + - bugfix: Typo correction in flight suit and construction void. + - rscdel: Removes all Virgo screens. + Ghostcoffeee: + - bugfix: Windows can now melt. +2021-09-19: + Ghostcoffeee: + - rscadd: Added flora construction, deconstruction and names + TheLordME: + - balance: Neomorphs are now immune to phoron contamination. + - bugfix: Wearing gloves prevents you from taking toxin damage when picking up contaminated + Items. +2021-09-20: + Captain277: + - bugfix: Vermin Infestation now functions. + - balance: Rebalances loadout costs for implants. + - rscdel: 'Removes MULE Bots from orderable supply list. tweak: tweaked a few things' + - bugfix: Fixes icon for the Security gun box. + - rscadd: Adds Bee race to the game. Adds vampire race. Formalizes Angel and Demon + races. + Solaris-Shade: + - bugfix: fixed the direction the fire cabinet by the sauna opens towards. +2021-09-21: + Solaris-Shade: + - rscadd: Adds four hats to the armory. + - rscadd: Adds two phase rifles to the armory. +2021-09-22: + Captain277: + - rscadd: 'Adds or ticks multiple overmaps related files. tweak: Edits multiple + files to match dependencies.' + TheKnightofAura: + - rscadd: greebles + - rscadd: intercoms + - rscadd: camera. + TheLordME: + - admin: All names can now contain numbers and a few other specieal characters. +2021-09-23: + TheLordME: + - bugfix: Off-Duty command no longer spawns with a command headset. +2021-09-24: + Captain277: + - rscadd: New Armory layout for QOL. + - balance: Swaps specialized armor sets out for plate carrier patterns of equivalent + design. + - rscadd: 'Glowsticks to vendor/Sec lockers. tweak: Tweaks Gaiters' + - bugfix: Fixes the Traveller's Hat. +2021-09-28: + AnalWerewolf: + - rscadd: Head of Security Protosuit to his office + yourdoom9898: + - rscadd: Tallow, a new oil subtype + - balance: Changed fryer oil to tallow from corn oil +2021-09-29: + Captain277: + - rscadd: Adds the ability to wear mouse plushes on your head, and also adds white + and grey versions. + - rscadd: Adds Catalogue blurbs for any empty mobs. + - rscdel: Removes all mentions of SolGov in code. + TheLordME: + - bugfix: Research doesnt need copper anymore. + rpilcrow: + - bugfix: Fixed 'sticky limb' bug in the character creation preview. Prosthetic/Amputated + limb states won't end up stuck. +2021-10-12: + Captain277: + - bugfix: Reticks spirit_board.dm. + KillianKirilenko: + - rscadd: Added the ability to set custom say/whisper/shout/ask 'verbs' on a persistent, + per-character basis. + Saisni: + - rscadd: Added sprites for two new tails and markings + - spellcheck: Removed "(Shadekin)" notes on tails since they already stated they + are for shadekin + - code_imp: Added code for shadekin tails in the Tail menu in Character setup +2021-10-13: + Knouli: + - bugfix: Unknown sectors now have visible icon + MalricB: + - rscadd: bunch of new songs +2021-10-15: + KillianKirilenko: + - rscadd: You can now close open doors and firedoors by clicking on their floor + tile. + Knouli: + - bugfix: Garbage disposals can be access and now has a functional conveyor + - bugfix: Portable Air-Pump distribution system now functions as expected + - rscadd: 'Mr. Wiggleblob has a bed - all rejoice tweak: Dinnerware vendor access + rights tweak: APCs, Air Alarms, and Firedoors replaced with Talon equivalents + tweak: Security aft maintenance airlock replaced with glass airlock' + - rscadd: Autolok suit storage closet in cryogenics + - rscadd: 'Four parachutes in EVA tweak: Firedoors for tech room and lifeboat tweak: + Firealarms replaced with hidden_alarms equivalent' + - rscadd: adds copy of captain's jumpsuit, backpack, satchel, and duffel for talon + captain + - rscadd: puts these copies in job outfit and talon captain's locker + TheLordME: + - config: Adds the ability for VSC to launch the dreamdaemon to test local changes + - rscadd: Adds the ability to climb on portable atmos devices like canisters, or + portable scrubber. + UrsaMajora: + - code_imp: It was literally just missing one line. Excuse me. It had an extra word + where it didn't belong. + - code_imp: Makes the shields depend on the variable powered, not density, so it + doesn't swap density about. +2021-10-16: + Captain277: + - rscadd: Honk pet to Clown post. + - rscadd: Nothing as Silencium grind result. + - rscadd: New Resin door sprites, ported from TGMC. + - rscadd: 'Bananium and Silencium doors. tweak: Slims Seifuku skirts. tweak: CLUWNE + wreckage icon pathing. tweak: POI Hard corners' + - rscadd: Adds Reticent and Reticence "Mime" mecha, as well as custom weapons and + simplemob variants. + - bugfix: Clown Op rifle spawn and grenade charges. + - rscadd: Taser. + Saisni: + - bugfix: Fixed Lunarmoths not chilling the room + - code_imp: Added code for Lunarmoths to chill the room. + UrsaMajora: + - rscadd: The Possessed mob + - rscadd: 'sound effect: Breathing' + - imageadd: The Possessed icons, which are just RIGs mashed into one icon. + - rscadd: The things the Possessed can say, over in say_list. +2021-10-19: + Captain277: + - rscadd: Adds the Laconic outfit. + - rscadd: Adds the Bounty Hunter Skinsuit. + KillianKirilenko: + - bugfix: adjusted bar layout to properly isolate the booths from each other + - bugfix: stopped it from raining inside the maint/eng tram + UrsaMajora: + - code_imp: Added a check here and a state change there to the Xenomorph egg and + facehugger. + zeroisthebiggay: + - bugfix: we are NOT eris we are not NeoTheology +2021-10-21: + Mount0: + - rscadd: meat-kabobs that use meat steaks + - bugfix: chocolate truffles + - bugfix: 5 sugar producing a fortune cookie + UrsaMajora: + - code_imp: Forced the update position of the shield on the mob's movement. +2021-10-22: + KillianKirilenko: + - bugfix: moved refurb/event suits file to a more logical location, and renamed + the talon voidsuits file for consistency + UrsaMajora: + - code_imp: Causes hostiles to spawn on the Talon when the Talon enters the areas. + - bugfix: Grow, eggs. Grow. +2021-10-23: + UrsaMajora: + - bugfix: CI integration check shouldn't fail randomly. + yeayea130: + - rscadd: Added electric RCD to engineering hound module + - rscadd: Added plasma cutter mining tool to engineering hound module + - rscdel: Removed pickaxe module from Engineering hound. +2021-10-24: + Captain277: + - rscdel: Comments out Myrmidon. + - rscadd: Adds mecha components to mechfab. + - rscadd: Roman, Imperial, and Knight/Crusader replica sets to seasonal costume + loadout. + - rscadd: Chainsword. + - bugfix: Berserker and Roman Lorica icon pathing. +2021-10-25: + KillianKirilenko: + - rscadd: added x/y scaling neutral traits + - refactor: refactored character preview for greater efficiency + - refactor: Replaced old char directory with a tgui-powered one. + Mount0: + - rscadd: a grand total of 15 new drinks + TheLordME: + - rscadd: Adds CtrlClick inflate/deflate for inflatables + nik707: + - bugfix: fixed some missing functions of borg mirror tool + - rscadd: '*bcough' + yeayea130: + - rscadd: Added three modules to the medical hound equipment lineup, enforcing some + parity between the medical modules. +2021-10-27: + KillianKirilenko: + - rscadd: added hardwood material, orderable via cargo + - bugfix: things made out of alien wood will no longer yield regular wood when disassembled + - bugfix: the fiftyspawner for alien logs no longer overrides the one for regular + logs +2021-10-29: + CharlesWedge: + - bugfix: Fixes the Rustic Grille Sprite + nik707: + - bugfix: fixed explosive engine manuals +2021-10-30: + Captain277: + - rscadd: Creates in-depth trap design system. + - rscadd: Honk sound effect to bananium floors. + - rscadd: Missing icons for plasteel and durasteel floor tile stacks. + - rscadd: Shotgun to CLUWNE equipment. + HoneyApples: + - bugfix: .45 Pistol from sec now accepts practice magazines + nik707: + - bugfix: The self-deleting mirror is a thing of the past. + - imageadd: added new mirror sprites +2021-11-07: + TheLordME: + - rscadd: Added Spritechanger as admin spawn + - imageadd: Added TGMC Xenomorphsprites +2021-11-09: + zeroisthebiggay: + - rscadd: h*ir +2021-11-10: + Captain277: + - rscadd: Adds V3b Wood and Sifwood variants. + KillianKirilenko: + - rscadd: Added atmospheric retention field generators, which can be built after + science has done some research. + TheLordME: + - rscadd: Adds the stripper gun, same effect as the cell, just as a normal gun + - refactor: Sizegun and stripper gun file moved to the other gun files + yourdoom9898: + - bugfix: Roaches no longer come back from the dead by becoming swole +2021-11-19: + Jaybirdnerd: + - rscadd: Added five more drinks to the Robust Softdrink vendor. + - bugfix: Alphabetized Robust Softdrinks vendor. + - soundadd: A total of one sound for a specific drink included in this. + - imageadd: Five icons for the new drinks added. +2021-11-26: + Quiteanything: + - bugfix: Moths no longer look like they're missing their antennae with facing in + a certain direction. +2021-12-20: + Solaris-Shade: + - rscdel: Removed two pipes from the SME Engine Submap. +2021-12-21: + silicons: + - rscadd: size prefs +2021-12-22: + Quiteanything: + - rscadd: Added new "Moth Eyes" marking +2021-12-23: + TheLordME: + - rscadd: HE pipes now interact with lava turfs to gain temperature + - code_imp: Adds easy way to add more turf to HE-pipe interactions + - admin: Adds variables to make turf interactions more or less efficent +2021-12-27: + nevimer: + - bugfix: shadekins now get their verbs +2021-12-31: + silicons: + - balance: Fission reactors are good for exploding again, even if they're a bad + power source. +2022-01-05: + FreeStylaLT: + - rscadd: 'Xenochimera gets 5 alternate languages now. tweak: Xenochimera max age + set to 200.' +2022-01-06: + FreeStylaLT: + - bugfix: Large bins can now be wrenched + - rscadd: a portable version of the secure briefcase, replacing the current one + in loadout. + zeroisthebiggay: + - rscadd: amongus + - rscdel: unamongus + - soundadd: two ported synthetic sounds +2022-01-07: + TheLordME: + - bugfix: Turf HE-pipe interactions now work properly +2022-01-09: + TheLordME: + - rscadd: Added catwalk construction on lava + silicons: + - bugfix: masquarade clothing now works with chameleon kits. +2022-01-13: + FreeStylaLT: + - rscadd: 2 more extra languages to Proteans +2022-01-16: + ktoma36: + - rscdel: 'Hooligan crab spawners (fishing loot spawners) tweak: Nerfs station drone + variant, gives them a new name' + - bugfix: Wires +2022-01-19: + TheLordME: + - rscadd: 'Adds larger Suit Storage units that can hold up to 10 (ten) suits at + once tweak: Suit storages have tgui now' + - bugfix: Fixes the issue of suitstorages not haveing tgui + - code_imp: Prefilled suitstorages to make mapping them in easier + - refactor: Suit cyclers and suit storage are now in their own files + lolman360: + - rscadd: Disho! Cool new plant! Varieties with topical healing chemicals. + - rscadd: catalog support for growns +2022-01-24: + TheLordME: + - bugfix: 'fixed #2708' +2022-01-26: + MediHound: + - rscadd: Boop module can now scan tanks + - rscadd: Boop module can now boop people and simplemobs +2022-01-27: + Funkeronipasta: + - rscadd: '*flip emote' + - rscadd: '*dwoop emote' + - rscadd: A random space in the dm that literally does nothing. + MediHound: + - rscadd: Enables Borgs to install NIFs and Implants + - rscadd: Enables Borgs to pick up Implants with the Medical Gripper + TheLordME: + - rscadd: Added a new Xenohybrid dome + - bugfix: Fixes Integration failures + - code_imp: Macro list access to prevent invalid index access in reader.dm + - rscadd: Added a varaity of gases +2022-01-29: + CharlesWedge: + - rscadd: R-CON Substations for Sec, Bridge, and Cargo. + - rscadd: 'a minor maint room on deck 1 near the Starboard Nacelle, just for additional + flavor. tweak: Security Maint, Cargo Maint, Bridge Maint to Accomodate the new + R-CONs. tweak: Some of Sec Maint''s various drone closets have been given flavor, + a secret room is not accessible by hidden wall. tweak: Psyche has been made + less depressingly dull. Now features more toys, a greater selection of books, + furniture and vendors so patients actually have something to eat.' + - bugfix: Sec Maint Now has proper Emergency Shutters and Air Alarms. (Before it + was possible to open doors into vented rooms due ot the lack of air alarm.) + - bugfix: Shield Diffusers are gone, from the Garden. They also now use proper pond + turfs which will yield fish when someone actually fixes the fishing list for + them. + - bugfix: thanks to the power of passive vents, the trash pit will no longer over + pressurize. + - bugfix: Power now properly transfers between decks at shift start. + TheLordME: + - bugfix: Fixes neomorphs being no longer lore compliant + - config: Neomorphs are named back to xenomorph hybrids + - admin: Breaks Xenohybrid whitelist +2022-01-30: + Captain277: + - bugfix: Fixes gendered icobase enforcement. +2022-02-06: + Captain277: + - rscadd: Adds MUTE trait. + - rscdel: 'Removes miming variable. tweak: Hexadecimal refactor.' + - rscadd: Adds the ability to extract firing pins from guns. + - rscadd: Adds new button up shirt accessory. + - bugfix: Fixes power cables. +2022-02-10: + Captain277: + - rscadd: Adds disruptor cuffs. + - rscadd: Adds Chiming Dress. + silicons: + - rscadd: moth robots + - rscadd: '*honk *buzz2 *warn *chime' +2022-02-13: + Ghostcoffeee: + - bugfix: Made lifelike limbs give the organic speechbubble +2022-02-14: + Captain277: + - rscadd: Adds Main Crafting + FreeStylaLT: + - rscadd: Voice mimicry, thermal vision, no breathe and some other spells to Xenochimera + - rscadd: Wound infection to Xenochimera (and ability to be added to other species) + TheLordME: + - bugfix: 'fixes #3724' + - rscadd: Adds up to 6 linebreaks per emote, works both for subtle and me. + - code_imp: sanatize() proc now allows up to 6 linebreaks per message before removeing + them all. + yourdoom9898: + - rscadd: 'Mining headset to QM locker tweak: Replaced QM cargo headset with a mining + headset' +2022-02-16: + TheLordME: + - rscadd: Adds the weaver abilities from vore. + - bugfix: fixed borgs being unable to use dice +2022-02-17: + Captain277: + - rscadd: Adds new vectors for forgotten materials. +2022-02-18: + TheLordME: + - rscadd: Added Adherent space squids + - bugfix: Fixes us not having adherent + silicons: + - rscdel: Xenobotanist and Xenobiologist have been demoted to Scientist alt titles. +2022-02-19: + ktoma36: + - rscadd: More areas, new job role for nebulous gas, and such + - bugfix: Wonky wire, people should be able to land now + - code_imp: Touched up on some code for job roles, didnt go full out and make nebulous + its own job class like talon (I looked into preference code and it causes me + fear) +2022-02-20: + Captain277: + - bugfix: BYOND file ordering. + TheLordME: + - bugfix: fixed 16 warnings generated after an update +2022-02-23: + ktoma36: + - rscdel: Talon +2022-02-25: + Captain277: + - rscadd: Adds the Courser Scouting Vessel. + - rscadd: 'Adds an airlock to Lavaland''s engine. tweak: Tweaks the Ghost Sheet + to be a head item, not a suit. tweak: Nerfs the Sec Armory substantially. tweak: + Nerfs the Pathfinder''s round-start ballistic.' + - rscadd: 'Adds the 5.7 pistol add; Adds the 5.7x28mm ammunition type tweak: The + H90K now fires 5.7x28mm' + - bugfix: Fixes Copper oregen so it actually shows up. + TheLordME: + - rscadd: Added a couple texts specificly for/from our playerbase + - rscdel: Removed some texts that I didnt find funny + - bugfix: fixed that champagne doesnt interact with shuttle consoles +2022-02-26: + TheLordME: + - bugfix: portable scrubbers can now scrubb the new gases out. + - bugfix: 'Fixed idiots touching the forbidden Horse Cock tweak: Mining and solars + space suits now actually use suit storages.' + - bugfix: The endcard now shows how many people left the station. + - bugfix: Fixed the Phoronlock Stationary scrubber cooling gas instantly + yeayea130: + - rscadd: Added the combat shield generator from the combat borg to the science + borg/dogborg's illegal module listing. + - rscdel: Removed the hand teleporter from the science borg/dogborg's illegal module + listing. + - imageadd: Added a bunch of shield overlays for the science borg types, except + the coffin. +2022-02-27: + Zandario: + - imageadd: a couple new sprites for the last few lockers to not be updated. + - refactor: squashed modular_citadel +2022-02-28: + CrystalClearCC: + - bugfix: shrodinger shuttle removal/transfer shuttle tells us when it arrives at + ship. +2022-03-01: + TheLordME: + - balance: Reworks the burnchamber and gives it a minimalistic guide. +2022-03-04: + Captain277: + - bugfix: Fixes Explo locker icon state. + CharlesWedge: + - bugfix: Class H, Gaia Worlds, Frozen Planet, and LAvaland, now have weather and + Day/Night Cycles. Dynamic Lighting now enabled to take advantage of day night + cycles. + MalricB: + - rscadd: 18 songs to jukebox config +2022-03-07: + Ghostcoffeee: + - rscadd: Added wooden panels made from 1 plank + Zandario: + - bugfix: Re-cleaning Teshari Sprites +2022-03-09: + Captain277: + - rscadd: Adds a new Z-level map and some related items for an upcoming event. + CharlesWedge: + - bugfix: Exploration Worlds should have dynamic lighting now. +2022-03-11: + Captain277: + - bugfix: Fixes autoinjector bug. + - bugfix: Fixes Class D atmos. +2022-03-13: + Fuckeronipasta: + - code_imp: Connected pleated skirts to role-restricted and uniform loadout tabs. + These can now be used. + - code_imp: 'Connected department jumpjeans to the role-restricted loadout tab. + These can now be used. tweak: Made it so that the feminine black jumpsuit is + an actual jumpsuit, rather than jumpshorts. tweak: Adjusted the sprite for the + virgin killer sweater in ties. Sprite now fits on the body correctly. tweak: + Gave a large amount of what seem to be tg-ported pleated skirts sprite fixes/adjustments. + You can now see your hands. tweak: Fixed the Western Suit so that it can now + be worn/seen. Yee-haw. tweak: Cleaned up the arm sprites in r_human_vr that + was giving human sprites the ''ass dot''.' + - spellcheck: Corrected some descriptions/spacing that I found odd throughout the + loadout pages I was working on. Definitely didn't find everything, but I got + some of it. + Ghostcoffeee: + - bugfix: Fixes some drinks defaulting to Ethanol when put into metamorphic glasses + TheLordME: + - bugfix: Fixed solar space suits not being able to be refitted +2022-03-14: + Captain277: + - rscadd: Adds latex swimsuit. + - rscadd: Adds mimics. + - rscdel: Removes all corrupt maint drone spawns. + - rscadd: Adds a Community Theater. + TheLordME: + - rscadd: Added resin structure building to hybrids + - rscadd: Added weed planting to hybrids + - rscadd: Hybrids now have a phoron organ for xenomorph abilities. + - rscadd: Hybrids can now trade nutrition for a faster healing rate. +2022-03-15: + Captain277: + - rscadd: 'Adds more coins. tweak: Updates the Mint.' + - rscadd: Adds a coin bank machine. + - rscadd: Adds the RIG backpack. + Fuckeronipasta: + - rscadd: Female gendered sprites for many outfits. + - rscadd: Some outfits not connected to the loadout (with the gendered variation + as well). + - rscadd: Dropdown selections for the baggy turtlenecks, female scrubs, branded + jumpsuits, and futuristic jumpsuits. + - spellcheck: Some more misspellings/bad grammar I found while working. + Ghostcoffeee: + - rscadd: Gave solarmoffs the ability to drain synths +2022-03-17: + Captain277: + - rscadd: Adds the Vainglorious hoodie. + - rscadd: Adds colored and neon light packs. +2022-03-18: + Ghostcoffeee: + - bugfix: Fixed the pleated skirt not showing up + TheKnightofAura: + - rscadd: my new donator item, complete with better code + - rscadd: the code my donator item works off of, pending some balance discussion. + - rscdel: my old donator item + - bugfix: sillycon's silly + TheLordME: + - bugfix: Fixed Lizard infestions being the laughing stock of the server. + - bugfix: Fixed Maintdrones not indicating that they have been abandond when the + player inside ghosts. +2022-03-19: + Captain277: + - bugfix: CI breaking errors. + - bugfix: Fixes bad Class D shuttle landmarks. + - bugfix: 'Fixes bad Class H paths. tweak: Rearranges poorly nested map datums.' + - rscadd: 'New Dungeon POI. tweak: Changes Gaia and Mining to Class M and G.' +2022-03-21: + Captain277: + - balance: Removes a significant portion of Exploration's round-start medical gear. + - rscdel: Removes graviton goggles from R&D printer. + - bugfix: Brass alloying fixed. +2022-03-23: + Captain277: + - rscadd: Adds new premium cigarette brand. + - rscadd: Adds new drink. + Zandario: + - rscadd: TGUI Wires + - rscadd: Bay's Point Defense Batteries + - rscadd: Bay's Advanced Shield Generators + - soundadd: Grabbed some sound files we didn't have which will be used it further + ports + - rscadd: Added SSnightshift + - refactor: Converted time_in_ticks to time_in_ds diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 2b5694d2fbc9..4a26c442d308 100644 Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ diff --git a/icons/obj/food_ingredients.dmi b/icons/obj/food_ingredients.dmi index 30c4a19e8fbf..a9f0648c1f0b 100644 Binary files a/icons/obj/food_ingredients.dmi and b/icons/obj/food_ingredients.dmi differ diff --git a/icons/obj/food_ingredients/cooking_container.dmi b/icons/obj/food_ingredients/cooking_container.dmi new file mode 100644 index 000000000000..d07c7e7d0510 Binary files /dev/null and b/icons/obj/food_ingredients/cooking_container.dmi differ diff --git a/icons/obj/food_ingredients/cooking_machines.dmi b/icons/obj/food_ingredients/cooking_machines.dmi new file mode 100644 index 000000000000..f211f73e0d92 Binary files /dev/null and b/icons/obj/food_ingredients/cooking_machines.dmi differ diff --git a/icons/obj/food_ingredients/custom_food.dmi b/icons/obj/food_ingredients/custom_food.dmi new file mode 100644 index 000000000000..236452ae7fed Binary files /dev/null and b/icons/obj/food_ingredients/custom_food.dmi differ diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 4c85829a2a97..6204c5c01fe1 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -140,6 +140,7 @@ h1.alert, h2.alert {color: #000000;} .grey {color: #838383;} .nicegreen {color: #14a833;} .boldnicegreen {color: #14a833; font-weight: bold;} +.yellow {color: #fff144} .cult {color: #973e3b;} .cultlarge {color: #973e3b; font-weight: bold; font-size: 3;} diff --git a/maps/away_missions/140x140/carpfarm.dmm b/maps/away_missions/140x140/carpfarm.dmm index df75f4dd3f61..39df07e372a3 100644 --- a/maps/away_missions/140x140/carpfarm.dmm +++ b/maps/away_missions/140x140/carpfarm.dmm @@ -578,7 +578,7 @@ /turf/simulated/floor/tiled, /area/awaymission/carpfarm/base) "bT" = ( -/obj/item/reagent_containers/food/snacks/carpmeat, +/obj/item/reagent_containers/food/snacks/ingredient/carp, /obj/effect/floor_decal/corner/white/diagonal, /obj/structure/table/glass, /turf/simulated/floor/tiled, diff --git a/maps/away_missions/140x140/snow_outpost.dmm b/maps/away_missions/140x140/snow_outpost.dmm index 9eb53929a4d0..fdd623b375af 100644 --- a/maps/away_missions/140x140/snow_outpost.dmm +++ b/maps/away_missions/140x140/snow_outpost.dmm @@ -1784,7 +1784,7 @@ /area/awaymission/snow_outpost/outside) "gg" = ( /obj/item/ammo_casing/a45, -/obj/item/reagent_containers/food/snacks/xenomeat/spidermeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat, /turf/simulated/floor/snow/snow2, /area/awaymission/snow_outpost/outside) "gh" = ( @@ -1825,7 +1825,7 @@ }, /area/awaymission/snow_outpost/outside) "go" = ( -/obj/item/reagent_containers/food/snacks/xenomeat/spidermeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat, /turf/simulated/floor/snow/snow2, /area/awaymission/snow_outpost/outside) "gp" = ( diff --git a/maps/away_missions/140x140/zoo.dmm b/maps/away_missions/140x140/zoo.dmm index c18ec430314f..58620733d8de 100644 --- a/maps/away_missions/140x140/zoo.dmm +++ b/maps/away_missions/140x140/zoo.dmm @@ -155,8 +155,8 @@ /area/awaymission/zoo/pirateship) "ax" = ( /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -164,7 +164,7 @@ /area/awaymission/zoo/pirateship) "ay" = ( /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -479,11 +479,11 @@ /obj/structure/table/reinforced, /obj/item/material/knife/butch, /obj/item/reagent_containers/food/drinks/bottle/small/beer, -/obj/item/reagent_containers/food/snacks/xenomeat, -/obj/item/reagent_containers/food/snacks/xenomeat, -/obj/item/reagent_containers/food/snacks/xenomeat, -/obj/item/reagent_containers/food/snacks/xenomeat, -/obj/item/reagent_containers/food/snacks/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, /obj/effect/floor_decal/corner/blue/diagonal, /turf/simulated/floor/tiled/white, /area/awaymission/zoo/pirateship) @@ -734,18 +734,18 @@ /obj/structure/closet/secure_closet/freezer/meat{ opened = 1 }, -/obj/item/reagent_containers/food/snacks/xenomeat, -/obj/item/reagent_containers/food/snacks/xenomeat, -/obj/item/reagent_containers/food/snacks/xenomeat, -/obj/item/reagent_containers/food/snacks/xenomeat, -/obj/item/reagent_containers/food/snacks/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, /turf/simulated/floor/tiled/white, /area/awaymission/zoo/pirateship) "cr" = ( /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, /turf/simulated/floor/tiled/white, /area/awaymission/zoo/pirateship) "cs" = ( @@ -910,7 +910,7 @@ /turf/simulated/floor/tiled, /area/awaymission/zoo/pirateship) "cP" = ( -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/tiled/freezer, /area/awaymission/zoo/pirateship) "cQ" = ( @@ -1210,7 +1210,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/item/reagent_containers/food/snacks/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, /turf/simulated/floor/plating, /area/awaymission/zoo/pirateship) "dI" = ( @@ -1323,7 +1323,7 @@ /area/awaymission/zoo/pirateship) "dY" = ( /obj/effect/debris/cleanable/dirt, -/obj/item/reagent_containers/food/snacks/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, /turf/simulated/floor/plating, /area/awaymission/zoo/pirateship) "dZ" = ( @@ -1439,7 +1439,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/reagent_containers/food/snacks/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, /turf/simulated/floor/plating, /area/awaymission/zoo/pirateship) "ep" = ( @@ -1548,7 +1548,7 @@ base_state = "right"; icon_state = "right" }, -/obj/item/reagent_containers/food/snacks/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, /turf/simulated/floor/plating, /area/awaymission/zoo/pirateship) "eD" = ( @@ -1558,7 +1558,7 @@ /turf/simulated/floor/plating, /area/awaymission/zoo/pirateship) "eE" = ( -/obj/item/reagent_containers/food/snacks/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, /turf/simulated/floor/plating, /area/awaymission/zoo/pirateship) "eF" = ( @@ -1866,7 +1866,7 @@ /area/awaymission/zoo/pirateship) "fA" = ( /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/tiled/freezer, /area/awaymission/zoo/pirateship) "fB" = ( diff --git a/maps/away_missions/archive/blackmarketpackers.dmm b/maps/away_missions/archive/blackmarketpackers.dmm index dcd9d3d2f1d1..2755d9acc9c4 100644 --- a/maps/away_missions/archive/blackmarketpackers.dmm +++ b/maps/away_missions/archive/blackmarketpackers.dmm @@ -180,8 +180,8 @@ "aQ" = ( /obj/structure/closet/crate/freezer, /obj/item/organ/internal/appendix, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/plating{ dir = 1 }, @@ -190,7 +190,7 @@ /obj/structure/closet/crate/freezer, /obj/item/organ/internal/brain, /obj/item/organ/internal/appendix, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/plating{ dir = 1 }, @@ -574,7 +574,7 @@ /area/awaymission/BMPship1) "ct" = ( /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /obj/item/reagent_containers/food/snacks/hugemushroomslice, /obj/item/organ/internal/appendix, /turf/simulated/floor/tiled/dark, @@ -658,7 +658,7 @@ "cL" = ( /obj/structure/table/standard, /obj/item/material/knife/butch, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor, /area/awaymission/BMPship2) "cM" = ( @@ -816,8 +816,8 @@ /area/awaymission/BMPship1) "dD" = ( /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/tiled/dark, /area/awaymission/BMPship1) "dE" = ( @@ -903,7 +903,7 @@ /turf/simulated/floor/tiled/dark, /area/awaymission/BMPship2) "dW" = ( -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /obj/structure/cable{ icon_state = "1-2" }, @@ -1697,7 +1697,7 @@ /area/awaymission/BMPship2) "gU" = ( /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/tiled/dark, /area/awaymission/BMPship1) "gV" = ( diff --git a/maps/away_missions/archive/spacebattle.dmm b/maps/away_missions/archive/spacebattle.dmm index f30e70a32413..892631d8d665 100644 --- a/maps/away_missions/archive/spacebattle.dmm +++ b/maps/away_missions/archive/spacebattle.dmm @@ -464,7 +464,7 @@ /area/awaymission/spacebattle/cruiser) "cE" = ( /obj/structure/table/reinforced, -/obj/item/reagent_containers/food/snacks/sausage, +/obj/item/reagent_containers/food/snacks/ingredient/sausage, /turf/simulated/floor, /area/awaymission/spacebattle/cruiser) "cF" = ( diff --git a/maps/away_missions/archive/wildwest.dmm b/maps/away_missions/archive/wildwest.dmm index aeac094dc42a..9b00d82386d0 100644 --- a/maps/away_missions/archive/wildwest.dmm +++ b/maps/away_missions/archive/wildwest.dmm @@ -327,11 +327,11 @@ /area/awaymission/wwmines) "bN" = ( /obj/structure/closet/secure_closet/freezer/meat, -/obj/item/reagent_containers/food/snacks/meat/syntiflesh, -/obj/item/reagent_containers/food/snacks/meat/syntiflesh, -/obj/item/reagent_containers/food/snacks/meat/syntiflesh, -/obj/item/reagent_containers/food/snacks/meat/syntiflesh, -/obj/item/reagent_containers/food/snacks/meat/syntiflesh, +/obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh, +/obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh, +/obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh, +/obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh, +/obj/item/reagent_containers/food/snacks/ingredient/meat/syntiflesh, /turf/simulated/floor{ dir = 5 }, diff --git a/maps/away_missions/archive/zresearchlabs.dmm b/maps/away_missions/archive/zresearchlabs.dmm index 3a7a99ef376b..abc90c9464a9 100644 --- a/maps/away_missions/archive/zresearchlabs.dmm +++ b/maps/away_missions/archive/zresearchlabs.dmm @@ -4372,9 +4372,9 @@ /area/awaymission/labs/cargo) "mw" = ( /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor, /area/awaymission/labs/cargo) "mx" = ( diff --git a/maps/minitest/levels/sector1.dmm b/maps/minitest/levels/sector1.dmm index 17b7fa4cd696..882f347f42f1 100644 --- a/maps/minitest/levels/sector1.dmm +++ b/maps/minitest/levels/sector1.dmm @@ -577,7 +577,7 @@ /turf/simulated/floor/tiled, /area/awaymission) "bP" = ( -/obj/item/reagent_containers/food/snacks/carpmeat, +/obj/item/reagent_containers/food/snacks/ingredient/carp, /obj/effect/floor_decal/corner/white/diagonal, /obj/structure/table/glass, /turf/simulated/floor/tiled, diff --git a/maps/minitest/levels/sector2.dmm b/maps/minitest/levels/sector2.dmm index 2dfda8944cfd..7ac00a2b2dc2 100644 --- a/maps/minitest/levels/sector2.dmm +++ b/maps/minitest/levels/sector2.dmm @@ -198,11 +198,11 @@ /area/awaymission/wwmines) "aM" = ( /obj/structure/closet/secure_closet/freezer/fridge, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /obj/item/reagent_containers/food/snacks/fruitsalad, /turf/simulated/floor/wood, /area/awaymission/wwmines) diff --git a/maps/rift/levels/rift-06-surface3.dmm b/maps/rift/levels/rift-06-surface3.dmm index b84524a8c394..a32f2e349843 100644 --- a/maps/rift/levels/rift-06-surface3.dmm +++ b/maps/rift/levels/rift-06-surface3.dmm @@ -3194,12 +3194,29 @@ /turf/simulated/floor/plating, /area/exploration) "ajM" = ( -/obj/machinery/appliance/cooker/oven, -/obj/effect/floor_decal/corner/grey{ - dir = 5 +/obj/structure/table/marble, +/obj/item/reagent_containers/food/condiment/small/saltshaker{ + pixel_x = -3 }, -/obj/effect/floor_decal/corner/grey{ - dir = 10 +/obj/item/reagent_containers/food/condiment/small/saltshaker{ + pixel_x = -9 + }, +/obj/item/reagent_containers/food/condiment/small/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/food/condiment/small/peppermill{ + pixel_x = 9 + }, +/obj/item/reagent_containers/food/condiment/spacespice{ + pixel_x = -8; + pixel_y = 13 + }, +/obj/item/reagent_containers/food/condiment/hotsauce{ + pixel_y = 16 + }, +/obj/item/reagent_containers/food/condiment/coldsauce{ + pixel_x = 8; + pixel_y = 16 }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/kitchen) @@ -3395,40 +3412,14 @@ /turf/simulated/floor/tiled/dark, /area/bridge/bridge_hallway) "ake" = ( -/obj/structure/table/marble, -/obj/item/reagent_containers/food/condiment/small/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/food/condiment/small/saltshaker{ - pixel_x = -9 - }, -/obj/item/reagent_containers/food/condiment/small/peppermill{ - pixel_x = 3 - }, -/obj/item/reagent_containers/food/condiment/small/peppermill{ - pixel_x = 9 - }, -/obj/item/reagent_containers/food/condiment/spacespice{ - pixel_x = -8; - pixel_y = 13 - }, -/obj/item/reagent_containers/food/condiment/enzyme{ - layer = 5; - pixel_y = 16 - }, -/obj/item/reagent_containers/food/condiment/soysauce{ - pixel_x = 8; - pixel_y = 16 - }, -/obj/effect/floor_decal/corner/grey{ - dir = 10 - }, -/obj/effect/floor_decal/corner/grey{ - dir = 5 - }, /obj/structure/noticeboard{ pixel_y = 29 }, +/obj/effect/floor_decal/corner/grey/diagonal, +/obj/machinery/cooking/oven, +/obj/item/reagent_containers/glass/food_holder/oventray, +/obj/item/reagent_containers/glass/food_holder/oventray, +/obj/item/reagent_containers/glass/food_holder/oventray, /turf/simulated/floor/tiled/white, /area/crew_quarters/kitchen) "akg" = ( @@ -3560,16 +3551,13 @@ /turf/simulated/floor/tiled/steel, /area/rift/stairwell/primary/surfacethree) "akB" = ( -/obj/machinery/appliance/cooker/fryer, -/obj/effect/floor_decal/corner/grey{ - dir = 5 - }, -/obj/effect/floor_decal/corner/grey{ - dir = 10 - }, /obj/machinery/fire_alarm/west_mount{ pixel_x = -24 }, +/obj/structure/table/marble, +/obj/machinery/chemical_dispenser/catering/bar_soft{ + pixel_y = 4 + }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/kitchen) "akC" = ( @@ -3680,14 +3668,6 @@ }, /turf/simulated/floor/tiled/dark, /area/bridge/bridge_hallway) -"akT" = ( -/obj/machinery/appliance/cooker/grill{ - anchored = 0; - pixel_x = -3; - pixel_y = 3 - }, -/turf/simulated/floor/plating, -/area/maintenance/bar/lower) "akU" = ( /obj/machinery/power/apc/west_mount, /obj/effect/floor_decal/borderfloor{ @@ -3744,14 +3724,6 @@ }, /turf/simulated/floor/tiled/techmaint, /area/shuttle/excursion/cargo) -"alc" = ( -/obj/machinery/appliance/cooker/oven{ - anchored = 0; - pixel_x = -1; - pixel_y = 1 - }, -/turf/simulated/floor/plating, -/area/maintenance/bar/lower) "alf" = ( /obj/effect/floor_decal/borderfloorblack{ dir = 4 @@ -3797,13 +3769,33 @@ /turf/simulated/floor/tiled/steel, /area/exploration/excursion_dock) "alj" = ( -/obj/machinery/appliance/mixer/candy{ - anchored = 0; - pixel_x = 2; - pixel_y = -2 +/obj/structure/table/marble, +/obj/item/reagent_containers/food/condiment/small/saltshaker{ + pixel_x = -3 }, -/turf/simulated/floor/plating, -/area/maintenance/bar/lower) +/obj/item/reagent_containers/food/condiment/small/saltshaker{ + pixel_x = -9 + }, +/obj/item/reagent_containers/food/condiment/small/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/food/condiment/small/peppermill{ + pixel_x = 9 + }, +/obj/item/reagent_containers/food/condiment/spacespice{ + pixel_x = -8; + pixel_y = 13 + }, +/obj/item/reagent_containers/food/condiment/enzyme{ + layer = 5; + pixel_y = 16 + }, +/obj/item/reagent_containers/food/condiment/soysauce{ + pixel_x = 8; + pixel_y = 16 + }, +/turf/simulated/floor/tiled/dark, +/area/crew_quarters/kitchen) "alk" = ( /turf/simulated/wall/prepainted/engineering, /area/maintenance/substation/exploration) @@ -5080,6 +5072,12 @@ dir = 10 }, /obj/machinery/light, +/obj/item/reagent_containers/glass/food_holder/pot, +/obj/item/reagent_containers/glass/food_holder/pot, +/obj/item/reagent_containers/glass/food_holder/pan, +/obj/item/reagent_containers/glass/food_holder/pan, +/obj/item/reagent_containers/glass/food_holder/skillet, +/obj/item/reagent_containers/glass/food_holder/skillet, /turf/simulated/floor/tiled/white, /area/crew_quarters/kitchen) "aoQ" = ( @@ -6053,14 +6051,6 @@ }, /turf/simulated/floor/tiled/steel_grid, /area/exploration/medic_prep) -"arp" = ( -/obj/machinery/appliance/mixer/cereal{ - anchored = 0; - pixel_x = 1; - pixel_y = -1 - }, -/turf/simulated/floor/plating, -/area/maintenance/bar/lower) "arr" = ( /obj/structure/closet/emcloset, /obj/effect/floor_decal/industrial/outline/grey, @@ -6712,16 +6702,12 @@ /turf/simulated/floor/tiled/dark, /area/bridge/bridge_hallway) "atj" = ( -/obj/machinery/appliance/cooker/grill, -/obj/effect/floor_decal/corner/grey{ - dir = 5 - }, -/obj/effect/floor_decal/corner/grey{ - dir = 10 - }, /obj/machinery/fire_alarm/west_mount{ pixel_x = -24 }, +/obj/machinery/vending/dinnerware{ + dir = 1 + }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/kitchen) "atk" = ( @@ -8632,6 +8618,12 @@ /obj/effect/floor_decal/corner/grey{ dir = 10 }, +/obj/item/reagent_containers/glass/food_holder/pot, +/obj/item/reagent_containers/glass/food_holder/pot, +/obj/item/reagent_containers/glass/food_holder/pan, +/obj/item/reagent_containers/glass/food_holder/pan, +/obj/item/reagent_containers/glass/food_holder/skillet, +/obj/item/reagent_containers/glass/food_holder/skillet, /turf/simulated/floor/tiled/white, /area/crew_quarters/kitchen) "aya" = ( @@ -9297,10 +9289,8 @@ /obj/effect/floor_decal/corner/grey{ dir = 5 }, -/obj/machinery/vending/dinnerware{ - dir = 1 - }, /obj/machinery/camera/network/civilian, +/obj/machinery/cooking/grill, /turf/simulated/floor/tiled/white, /area/crew_quarters/kitchen) "azT" = ( @@ -9840,36 +9830,8 @@ /turf/simulated/floor/plating, /area/maintenance/commandmaint) "aBM" = ( -/obj/structure/table/marble, -/obj/item/reagent_containers/food/condiment/small/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/food/condiment/small/saltshaker{ - pixel_x = -9 - }, -/obj/item/reagent_containers/food/condiment/small/peppermill{ - pixel_x = 3 - }, -/obj/item/reagent_containers/food/condiment/small/peppermill{ - pixel_x = 9 - }, -/obj/item/reagent_containers/food/condiment/spacespice{ - pixel_x = -8; - pixel_y = 13 - }, -/obj/item/reagent_containers/food/condiment/hotsauce{ - pixel_y = 16 - }, -/obj/item/reagent_containers/food/condiment/coldsauce{ - pixel_x = 8; - pixel_y = 16 - }, -/obj/effect/floor_decal/corner/grey{ - dir = 10 - }, -/obj/effect/floor_decal/corner/grey{ - dir = 5 - }, +/obj/effect/floor_decal/corner/grey/diagonal, +/obj/machinery/cooking, /turf/simulated/floor/tiled/white, /area/crew_quarters/kitchen) "aBO" = ( @@ -11153,10 +11115,9 @@ /area/exploration/pathfinder_office) "aFF" = ( /obj/effect/floor_decal/corner/grey/diagonal, -/obj/structure/table/marble, -/obj/machinery/chemical_dispenser/catering/bar_soft{ - pixel_y = 4 - }, +/obj/machinery/cooking/fryer, +/obj/item/reagent_containers/glass/food_holder/fryer_basket, +/obj/item/reagent_containers/glass/food_holder/fryer_basket, /turf/simulated/floor/tiled/white, /area/crew_quarters/kitchen) "aFG" = ( @@ -16001,7 +15962,6 @@ /area/rift/surfacebase/outside/outside3) "aTa" = ( /obj/effect/floor_decal/corner/grey/diagonal, -/obj/machinery/appliance/mixer/cereal, /obj/structure/table/reinforced, /turf/simulated/floor/tiled/white, /area/crew_quarters/kitchen) @@ -17748,12 +17708,6 @@ }, /turf/simulated/floor/tiled/steel, /area/exploration/excursion_dock) -"aYm" = ( -/obj/effect/floor_decal/corner/grey/diagonal, -/obj/machinery/appliance/mixer/candy, -/obj/structure/table/reinforced, -/turf/simulated/floor/tiled/white, -/area/crew_quarters/kitchen) "aYn" = ( /obj/effect/floor_decal/industrial/halfstair{ dir = 4 @@ -38314,7 +38268,7 @@ aAj jsv lbu akB -ajM +alj ajM atj lbu @@ -39867,7 +39821,7 @@ age exk aBM axO -aYm +aTa eGU axZ qSL @@ -40263,7 +40217,7 @@ aiR aGy arr cnu -arp +aUi cnu cnu acH @@ -40458,7 +40412,7 @@ aGy atT aks avH -alj +aUi cnu adx aBl @@ -40651,7 +40605,7 @@ aAn aGy aUi cnu -akT +aUi alr cnu adx @@ -40845,7 +40799,7 @@ aGy aGy aUi cnu -alc +aUi cnu cnu adx diff --git a/maps/rift/levels/rift-11-orbital.dmm b/maps/rift/levels/rift-11-orbital.dmm index 745b3cce20e9..4890b61ac9c4 100644 --- a/maps/rift/levels/rift-11-orbital.dmm +++ b/maps/rift/levels/rift-11-orbital.dmm @@ -4717,7 +4717,7 @@ /area/centcom/simulated/restaurant) "oo" = ( /obj/structure/table/woodentable, -/obj/item/reagent_containers/food/snacks/meatballspagetti, +/obj/item/reagent_containers/food/snacks/meatballspaghetti, /turf/simulated/floor/wood, /area/centcom/simulated/restaurant) "op" = ( diff --git a/maps/sectors/lavaland_192/levels/lavaland_192_east.dmm b/maps/sectors/lavaland_192/levels/lavaland_192_east.dmm index 86544389ea67..f6d06fe6407e 100644 --- a/maps/sectors/lavaland_192/levels/lavaland_192_east.dmm +++ b/maps/sectors/lavaland_192/levels/lavaland_192_east.dmm @@ -239,6 +239,7 @@ /area/lavaland/east/ashlander_village) "KA" = ( /obj/machinery/appliance/cooker/grill/spit, +#warn did you know warns can go in dmms. replace spits!! /turf/simulated/floor/outdoors/dirt/lavaland, /area/lavaland/east/ashlander_village) "LQ" = ( diff --git a/maps/sectors/miaphus_192/levels/miaphus_192_beach.dmm b/maps/sectors/miaphus_192/levels/miaphus_192_beach.dmm index b4ee05195d45..bff71062ccef 100644 --- a/maps/sectors/miaphus_192/levels/miaphus_192_beach.dmm +++ b/maps/sectors/miaphus_192/levels/miaphus_192_beach.dmm @@ -2989,10 +2989,10 @@ /area/tether_away/beach/resort/canteen) "xb" = ( /obj/structure/table/marble, -/obj/item/reagent_containers/food/snacks/carpmeat/fish, -/obj/item/reagent_containers/food/snacks/carpmeat/fish, -/obj/item/reagent_containers/food/snacks/carpmeat/fish, -/obj/item/reagent_containers/food/snacks/carpmeat/fish, +/obj/item/reagent_containers/food/snacks/ingredient/carp/fish, +/obj/item/reagent_containers/food/snacks/ingredient/carp/fish, +/obj/item/reagent_containers/food/snacks/ingredient/carp/fish, +/obj/item/reagent_containers/food/snacks/ingredient/carp/fish, /turf/simulated/floor/wood, /area/tether_away/beach/resort/fishing) "xe" = ( diff --git a/maps/sectors/tradeport_140/levels/tradeport_140.dmm b/maps/sectors/tradeport_140/levels/tradeport_140.dmm index 487df665ba8e..7dbaffbf20c2 100644 --- a/maps/sectors/tradeport_140/levels/tradeport_140.dmm +++ b/maps/sectors/tradeport_140/levels/tradeport_140.dmm @@ -10448,9 +10448,9 @@ /obj/random/meat/no_sapient, /obj/random/meat/no_sapient, /obj/structure/window/reinforced, -/obj/item/reagent_containers/food/snacks/xenomeat, -/obj/item/reagent_containers/food/snacks/xenomeat, -/obj/item/reagent_containers/food/snacks/meat/worm, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/meat/worm, /obj/item/reagent_containers/food/snacks/bearmeat, /obj/item/reagent_containers/food/snacks/bearmeat, /turf/simulated/floor/tiled/dark, diff --git a/maps/sectors/tradeport_192/levels/tradeport_192.dmm b/maps/sectors/tradeport_192/levels/tradeport_192.dmm index 579a4ac3a25c..aa89587c22ef 100644 --- a/maps/sectors/tradeport_192/levels/tradeport_192.dmm +++ b/maps/sectors/tradeport_192/levels/tradeport_192.dmm @@ -2135,9 +2135,9 @@ /obj/random/meat/no_sapient, /obj/random/meat/no_sapient, /obj/structure/window/reinforced, -/obj/item/reagent_containers/food/snacks/xenomeat, -/obj/item/reagent_containers/food/snacks/xenomeat, -/obj/item/reagent_containers/food/snacks/meat/worm, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat, +/obj/item/reagent_containers/food/snacks/ingredient/meat/worm, /obj/item/reagent_containers/food/snacks/bearmeat, /obj/item/reagent_containers/food/snacks/bearmeat, /turf/simulated/floor/tiled/dark, diff --git a/maps/submaps/level_specific/debrisfield/foodstand.dmm b/maps/submaps/level_specific/debrisfield/foodstand.dmm index c7405efb8776..1b3984a167da 100644 --- a/maps/submaps/level_specific/debrisfield/foodstand.dmm +++ b/maps/submaps/level_specific/debrisfield/foodstand.dmm @@ -13,16 +13,16 @@ /area/space/debrisfield/foodstand) "e" = ( /obj/structure/closet/secure_closet/freezer/meat, -/obj/item/reagent_containers/food/snacks/carpmeat, -/obj/item/reagent_containers/food/snacks/carpmeat, -/obj/item/reagent_containers/food/snacks/carpmeat, -/obj/item/reagent_containers/food/snacks/carpmeat, -/obj/item/reagent_containers/food/snacks/carpmeat, -/obj/item/reagent_containers/food/snacks/carpmeat, -/obj/item/reagent_containers/food/snacks/carpmeat, -/obj/item/reagent_containers/food/snacks/carpmeat, -/obj/item/reagent_containers/food/snacks/carpmeat, -/obj/item/reagent_containers/food/snacks/carpmeat, +/obj/item/reagent_containers/food/snacks/ingredient/carp, +/obj/item/reagent_containers/food/snacks/ingredient/carp, +/obj/item/reagent_containers/food/snacks/ingredient/carp, +/obj/item/reagent_containers/food/snacks/ingredient/carp, +/obj/item/reagent_containers/food/snacks/ingredient/carp, +/obj/item/reagent_containers/food/snacks/ingredient/carp, +/obj/item/reagent_containers/food/snacks/ingredient/carp, +/obj/item/reagent_containers/food/snacks/ingredient/carp, +/obj/item/reagent_containers/food/snacks/ingredient/carp, +/obj/item/reagent_containers/food/snacks/ingredient/carp, /turf/simulated/floor/airless, /area/space/debrisfield/foodstand) "f" = ( diff --git a/maps/submaps/level_specific/debrisfield_vr/foodstand.dmm b/maps/submaps/level_specific/debrisfield_vr/foodstand.dmm index 1a16718548f6..d8e1ed78f120 100644 --- a/maps/submaps/level_specific/debrisfield_vr/foodstand.dmm +++ b/maps/submaps/level_specific/debrisfield_vr/foodstand.dmm @@ -13,9 +13,9 @@ /area/submap/debrisfield_vr/foodstand) "e" = ( /obj/structure/closet/secure_closet/freezer/meat, -/obj/item/reagent_containers/food/snacks/carpmeat, -/obj/item/reagent_containers/food/snacks/carpmeat, -/obj/item/reagent_containers/food/snacks/carpmeat, +/obj/item/reagent_containers/food/snacks/ingredient/carp, +/obj/item/reagent_containers/food/snacks/ingredient/carp, +/obj/item/reagent_containers/food/snacks/ingredient/carp, /turf/simulated/floor/wood, /area/submap/debrisfield_vr/foodstand) "f" = ( diff --git a/maps/submaps/level_specific/virgo2/Manor1.dmm b/maps/submaps/level_specific/virgo2/Manor1.dmm index 8d2b6ea95758..a61bb21c84ce 100644 --- a/maps/submaps/level_specific/virgo2/Manor1.dmm +++ b/maps/submaps/level_specific/virgo2/Manor1.dmm @@ -407,8 +407,8 @@ /area/submap/virgo2/Manor1) "bG" = ( /obj/structure/closet/secure_closet/freezer/fridge, -/obj/item/reagent_containers/food/snacks/sausage, -/obj/item/reagent_containers/food/snacks/sausage, +/obj/item/reagent_containers/food/snacks/ingredient/sausage, +/obj/item/reagent_containers/food/snacks/ingredient/sausage, /turf/simulated/floor/holofloor/wood, /area/submap/virgo2/Manor1) "bH" = ( diff --git a/maps/submaps/level_specific/virgo2/butchershack.dmm b/maps/submaps/level_specific/virgo2/butchershack.dmm index da23eb86e017..e185aaba62dd 100644 --- a/maps/submaps/level_specific/virgo2/butchershack.dmm +++ b/maps/submaps/level_specific/virgo2/butchershack.dmm @@ -82,7 +82,7 @@ /obj/item/reagent_containers/food/snacks/cutlet, /obj/item/reagent_containers/food/snacks/cutlet, /obj/item/reagent_containers/food/snacks/cutlet, -/obj/item/reagent_containers/food/snacks/sausage, +/obj/item/reagent_containers/food/snacks/ingredient/sausage, /turf/simulated/floor/tiled, /area/submap/virgo2/ButcherShack) "s" = ( diff --git a/maps/submaps/plains/Boathouse.dmm b/maps/submaps/plains/Boathouse.dmm index 816ba0ba3457..586e128b0fa5 100644 --- a/maps/submaps/plains/Boathouse.dmm +++ b/maps/submaps/plains/Boathouse.dmm @@ -164,11 +164,11 @@ /area/submap/Boathouse) "aM" = ( /obj/structure/closet/secure_closet/freezer/fridge, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /obj/item/reagent_containers/food/snacks/fruitsalad, /turf/simulated/floor/wood, /area/submap/Boathouse) diff --git a/maps/submaps/plains/Boathouse_vr.dmm b/maps/submaps/plains/Boathouse_vr.dmm index 33579d6dcae3..8ad07c86dd33 100644 --- a/maps/submaps/plains/Boathouse_vr.dmm +++ b/maps/submaps/plains/Boathouse_vr.dmm @@ -183,11 +183,11 @@ /area/submap/Boathouse) "aN" = ( /obj/structure/closet/secure_closet/freezer/fridge, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /obj/item/reagent_containers/food/snacks/fruitsalad, /turf/simulated/floor/wood, /area/submap/Boathouse) diff --git a/maps/submaps/plains/Diner.dmm b/maps/submaps/plains/Diner.dmm index d37293b6c91e..a733bf46a8d8 100644 --- a/maps/submaps/plains/Diner.dmm +++ b/maps/submaps/plains/Diner.dmm @@ -180,13 +180,13 @@ /area/submap/Diner) "aI" = ( /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/tiled/freezer, /area/submap/Diner) "aJ" = ( @@ -226,14 +226,14 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/tiled/freezer, /area/submap/Diner) "aO" = ( diff --git a/maps/submaps/plains/Diner_vr.dmm b/maps/submaps/plains/Diner_vr.dmm index 67d63b084b69..5f05c66acd76 100644 --- a/maps/submaps/plains/Diner_vr.dmm +++ b/maps/submaps/plains/Diner_vr.dmm @@ -180,13 +180,13 @@ /area/submap/Diner) "aI" = ( /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/tiled/freezer, /area/submap/Diner) "aJ" = ( @@ -226,14 +226,14 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/tiled/freezer, /area/submap/Diner) "aO" = ( diff --git a/maps/submaps/plains/Shakden.dmm b/maps/submaps/plains/Shakden.dmm index 19a47e0ef650..2914e628a137 100644 --- a/maps/submaps/plains/Shakden.dmm +++ b/maps/submaps/plains/Shakden.dmm @@ -20,11 +20,11 @@ }, /area/submap/Shakden) "f" = ( -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/outdoors/dirt{ outdoors = 0 }, @@ -36,9 +36,9 @@ }, /area/submap/Shakden) "h" = ( -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/outdoors/dirt{ outdoors = 0 }, @@ -48,16 +48,16 @@ /turf/simulated/floor/outdoors/dirt, /area/submap/Shakden) "j" = ( -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/outdoors/dirt{ outdoors = 0 }, /area/submap/Shakden) "k" = ( -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /obj/item/material/knife/hook, /turf/simulated/floor/outdoors/dirt{ outdoors = 0 diff --git a/maps/submaps/plains/Shakden_vr.dmm b/maps/submaps/plains/Shakden_vr.dmm index 246461862a81..e8314e249e86 100644 --- a/maps/submaps/plains/Shakden_vr.dmm +++ b/maps/submaps/plains/Shakden_vr.dmm @@ -20,19 +20,19 @@ }, /area/submap/Shakden) "f" = ( -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/outdoors/dirt{ outdoors = 0 }, /area/submap/Shakden) "g" = ( -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/outdoors/dirt{ outdoors = 0 }, @@ -47,16 +47,16 @@ /turf/simulated/floor/outdoors/dirt, /area/submap/Shakden) "j" = ( -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/outdoors/dirt{ outdoors = 0 }, /area/submap/Shakden) "k" = ( -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /obj/item/material/knife/hook, /turf/simulated/floor/outdoors/dirt{ outdoors = 0 diff --git a/maps/submaps/plains/Smol3.dmm b/maps/submaps/plains/Smol3.dmm index 43a9f5973d56..c124e386061f 100644 --- a/maps/submaps/plains/Smol3.dmm +++ b/maps/submaps/plains/Smol3.dmm @@ -17,13 +17,13 @@ /area/submap/Smol3) "f" = ( /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, -/obj/item/reagent_containers/food/snacks/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, +/obj/item/reagent_containers/food/snacks/ingredient/meat, /turf/simulated/floor/outdoors/dirt, /area/submap/Smol3) "g" = ( diff --git a/maps/submaps/wilderness/CaveS.dmm b/maps/submaps/wilderness/CaveS.dmm index 1df22e1266a5..0b308e66c037 100644 --- a/maps/submaps/wilderness/CaveS.dmm +++ b/maps/submaps/wilderness/CaveS.dmm @@ -14,7 +14,7 @@ /area/submap/CaveS) "e" = ( /obj/item/ammo_casing/a45, -/obj/item/reagent_containers/food/snacks/xenomeat/spidermeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat, /turf/template_noop, /area/submap/CaveS) "f" = ( @@ -49,7 +49,7 @@ }, /area/submap/CaveS) "l" = ( -/obj/item/reagent_containers/food/snacks/xenomeat/spidermeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat, /turf/template_noop, /area/submap/CaveS) "m" = ( diff --git a/maps/submaps/wilderness/MHR.dmm b/maps/submaps/wilderness/MHR.dmm index aa0b92374c6c..4ffb47de5e06 100644 --- a/maps/submaps/wilderness/MHR.dmm +++ b/maps/submaps/wilderness/MHR.dmm @@ -56,7 +56,7 @@ }, /area/submap/MHR) "m" = ( -/obj/item/reagent_containers/food/snacks/xenomeat/spidermeat, +/obj/item/reagent_containers/food/snacks/ingredient/xenomeat/spidermeat, /turf/simulated/floor/outdoors/dirt{ outdoors = 0 }, diff --git a/maps/submaps/wilderness/Manor1.dmm b/maps/submaps/wilderness/Manor1.dmm index 6c9574664403..3fd79285ff81 100644 --- a/maps/submaps/wilderness/Manor1.dmm +++ b/maps/submaps/wilderness/Manor1.dmm @@ -417,8 +417,8 @@ /area/submap/Manor1) "bG" = ( /obj/structure/closet/secure_closet/freezer/fridge, -/obj/item/reagent_containers/food/snacks/sausage, -/obj/item/reagent_containers/food/snacks/sausage, +/obj/item/reagent_containers/food/snacks/ingredient/sausage, +/obj/item/reagent_containers/food/snacks/ingredient/sausage, /turf/simulated/floor/holofloor/wood, /area/submap/Manor1) "bH" = ( diff --git a/maps/submaps/wilderness/butchershack.dmm b/maps/submaps/wilderness/butchershack.dmm index e575b757441a..22297e01132a 100644 --- a/maps/submaps/wilderness/butchershack.dmm +++ b/maps/submaps/wilderness/butchershack.dmm @@ -89,7 +89,7 @@ /obj/item/reagent_containers/food/snacks/cutlet, /obj/item/reagent_containers/food/snacks/cutlet, /obj/item/reagent_containers/food/snacks/cutlet, -/obj/item/reagent_containers/food/snacks/sausage, +/obj/item/reagent_containers/food/snacks/ingredient/sausage, /turf/simulated/floor/wood/sif, /area/submap/ButcherShack) "s" = ( diff --git a/maps/templates/admin/dhael_centcom.dmm b/maps/templates/admin/dhael_centcom.dmm index e7cc4bbbc509..9d0e6bf2b05b 100644 --- a/maps/templates/admin/dhael_centcom.dmm +++ b/maps/templates/admin/dhael_centcom.dmm @@ -12743,7 +12743,7 @@ /area/centcom/security) "Pm" = ( /obj/structure/table/woodentable, -/obj/item/reagent_containers/food/snacks/meatballspagetti, +/obj/item/reagent_containers/food/snacks/meatballspaghetti, /turf/unsimulated/floor/wood, /area/centcom/restaurant) "Pp" = ( diff --git a/maps/templates/admin/kk_mercship.dmm b/maps/templates/admin/kk_mercship.dmm index 1a4d79112a8b..d487be00e91b 100644 --- a/maps/templates/admin/kk_mercship.dmm +++ b/maps/templates/admin/kk_mercship.dmm @@ -1736,12 +1736,12 @@ /obj/effect/floor_decal/techfloor{ dir = 5 }, -/obj/item/reagent_containers/food/snacks/meat/chicken, -/obj/item/reagent_containers/food/snacks/meat/chicken, -/obj/item/reagent_containers/food/snacks/meat/chicken, -/obj/item/reagent_containers/food/snacks/meat/chicken, -/obj/item/reagent_containers/food/snacks/meat/chicken, -/obj/item/reagent_containers/food/snacks/meat/chicken, +/obj/item/reagent_containers/food/snacks/ingredient/meat/chicken, +/obj/item/reagent_containers/food/snacks/ingredient/meat/chicken, +/obj/item/reagent_containers/food/snacks/ingredient/meat/chicken, +/obj/item/reagent_containers/food/snacks/ingredient/meat/chicken, +/obj/item/reagent_containers/food/snacks/ingredient/meat/chicken, +/obj/item/reagent_containers/food/snacks/ingredient/meat/chicken, /turf/simulated/floor/tiled/dark, /area/ship/manta/recreation) "iB" = ( diff --git a/maps/templates/admin/wizard.dmm b/maps/templates/admin/wizard.dmm index 32cc58385e23..0b4b31eda92f 100644 --- a/maps/templates/admin/wizard.dmm +++ b/maps/templates/admin/wizard.dmm @@ -320,7 +320,7 @@ }, /area/wizard_station) "aN" = ( -/obj/item/reagent_containers/food/snacks/cheesewedge, +/obj/item/reagent_containers/food/snacks/ingredient/cheesewedge, /turf/unsimulated/floor{ icon_state = "dark" }, diff --git a/maps/templates/shuttles/overmaps/generic/curashuttle.dmm b/maps/templates/shuttles/overmaps/generic/curashuttle.dmm index ad04dfc27d62..4ce9c4a5387b 100644 --- a/maps/templates/shuttles/overmaps/generic/curashuttle.dmm +++ b/maps/templates/shuttles/overmaps/generic/curashuttle.dmm @@ -687,7 +687,7 @@ "bu" = ( /obj/structure/table/darkglass, /obj/machinery/atmospherics/pipe/vent, -/obj/item/reagent_containers/food/snacks/bun, +/obj/item/reagent_containers/food/snacks/ingredient/bun, /obj/item/reagent_containers/food/snacks/applepie, /obj/item/reagent_containers/food/snacks/carrotfries, /obj/item/storage/box/monkeycubes/sobakacubes, diff --git a/maps/tether/levels/misc.dmm b/maps/tether/levels/misc.dmm index 8a2a8e112c1b..4ba3bf1dd996 100644 --- a/maps/tether/levels/misc.dmm +++ b/maps/tether/levels/misc.dmm @@ -448,7 +448,7 @@ /area/space) "eG" = ( /obj/structure/table/woodentable, -/obj/item/reagent_containers/food/snacks/meatballspagetti, +/obj/item/reagent_containers/food/snacks/meatballspaghetti, /turf/simulated/floor/wood, /area/centcom/simulated/restaurant) "eL" = ( diff --git a/maps/triumph/levels/flagship.dmm b/maps/triumph/levels/flagship.dmm index 487e4c446f3d..484f0e0a6b0e 100644 --- a/maps/triumph/levels/flagship.dmm +++ b/maps/triumph/levels/flagship.dmm @@ -14011,7 +14011,7 @@ /area/centcom/evac) "SY" = ( /obj/structure/table/woodentable, -/obj/item/reagent_containers/food/snacks/meatballspagetti, +/obj/item/reagent_containers/food/snacks/meatballspaghetti, /turf/unsimulated/floor/wood, /area/centcom/restaurant) "SZ" = ( diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss index 721d46b13abf..6bc2c7f21103 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss @@ -630,10 +630,19 @@ blockquote.blue { color: #059223; } +.boldnicegreen { + color: #059223; + font-weight: bold; +} + blockquote.nicegreen { border-color: #059223; } +.yellow { + color: #fff144 +} + .helpful { color: #368f31; } diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss index e4c6392f4049..6bbba56ba935 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss @@ -667,10 +667,19 @@ blockquote.blue { color: #14a833; } +.boldnicegreen { + color: #059223; + font-weight: bold; +} + blockquote.nicegreen { border-color: #14a833; } +.yellow { + color: #fff144 +} + .helpful { color: #368f31; } diff --git a/tgui/packages/tgui/interfaces/modules/TGUIGuidebookCookingRecipes.tsx b/tgui/packages/tgui/interfaces/modules/TGUIGuidebookCookingRecipes.tsx new file mode 100644 index 000000000000..c91c2e76652d --- /dev/null +++ b/tgui/packages/tgui/interfaces/modules/TGUIGuidebookCookingRecipes.tsx @@ -0,0 +1,110 @@ +/** + * Food recipe guidebook section. + * + * + * @file + * @license MIT + */ + +import { InfernoNode } from "inferno"; +import { logger } from "../../logging"; +import { useLocalState, useModule } from "../../backend"; +import { Input, Section, Stack, Tabs } from "../../components"; +import { Modular } from "../../layouts/Modular"; +import { TGUIGuidebookSectionData } from "./TGUIGuidebook"; + +export interface TGUIGuidebookCookingRecipeData extends TGUIGuidebookSectionData { + // list of recipes + readonly recipes: TGUIGuidebookCookingRecipe[]; +} + +enum CookingRecipeGuidebookFlags { + Unlisted = (1 << 0), + Hidden = (1 << 1), +} + +interface TGUIGuidebookCookingRecipe { + // recipe flags: currently untyped because there are none + // flags: number; + // reaction guidebook flags + // guidebookFlags: CookingRecipeGuidebookFlags; + // result name string + result: string; + // result reagent names + result_reagents: string; + // result amount + result_amount: number; + // required item names + req_items: string; + // required grown names + req_growns: string; + // required reagent names + req_reagents: string; + // required cooking method + req_method: string; +} + +export const TGUIGuidebookCookingRecipes = (props, context) => { + let { data } = useModule(context); + const [activeTab, setActiveTab] = useLocalState(context, 'activeRecipesTab', null); + const [searchText, setSearchText] = useLocalState(context, 'activeRecipesSearch', null); + + let rendered: InfernoNode | null = null; + let categorizedRecipes: Record = {}; + + switch (activeTab) { + case 'recipeTab': + Object.values(data.recipes).filter( + (recipe) => !searchText || recipe.result.includes(searchText)).forEach( + (recipe) => { + (categorizedRecipes[recipe.req_method] = categorizedRecipes[recipe.req_method] || []).push(recipe); + }); + rendered = ( + + {Object.entries(categorizedRecipes).sort(([cat1, a1], [cat2, a2]) => cat1.localeCompare(cat2)).map( + ([cat, catRecipes]) => ( + +
    + + {catRecipes.sort((r1, r2) => r1.result.localeCompare(r2.result)).map((recipe) => ( + + {recipe.result} {recipe.req_items} {recipe.req_growns} {recipe.req_reagents} + + ))} + +
    +
    + ) + )} +
    + ); + break; + } + + return ( + + + + + + + setActiveTab("recipeTab")}> + Recipes + + + + + Search setSearchText(value)} /> + + + + +
    + {rendered} +
    +
    +
    +
    + ); +};